From 118b784a5d5e9a8146e63b89ec1e30accc9dbabd Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Thu, 4 Apr 2024 16:11:06 +0200 Subject: [PATCH] API: allow to execute LSobject's custom actions --- doc/src/api/index.md | 31 ++++- doc/src/conf/LSobject/customActions.md | 22 ++++ src/includes/addons/LSaddons.showTechInfo.php | 11 ++ src/includes/class/class.LSsession.php | 3 + src/includes/routes.php | 105 ++++++++++++++++- src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo | Bin 96167 -> 96326 bytes src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po | 111 +++++++++--------- src/lang/ldapsaisie.pot | 108 +++++++++-------- 8 files changed, 284 insertions(+), 107 deletions(-) diff --git a/doc/src/api/index.md b/doc/src/api/index.md index dc557119..1eeffbd4 100644 --- a/doc/src/api/index.md +++ b/doc/src/api/index.md @@ -398,6 +398,35 @@ HTTP 404 sera générée. } ``` +- `/api/1.0/object/[object type]/[dn]/customAction/[customAction]` + + Cette méthode permet d'exécuter une [action personnalisée](../conf/LSobject/customActions.md) sur + un objet dans l'annuaire. Le nom de l'action ainsi que le type de l'objet et son DN sont précisés + dans l'URL et doivent être encodés en conséquence. + + **Exemple :** + + ``` + # curl -u username:secret 'https://ldapsaisie/api/1.0/object/LSpeople/uid=foo.bar,ou=people,o=ls/customAction/action?pretty' + { + "dn": "uid=foo.bar,ou=people,o=ls", + "type": "LSpeople", + "name": "Foo Bar", + "success": true, + "messages": [ + "L'action personnalis\u00e9e action a \u00e9t\u00e9 correctement ex\u00e9cut\u00e9e sur Foo Bar.", + ] + } + ``` + + !!! note + + Par défaut, une action personnalisée ne retourne qu'un booléen permettant de savoir si + l'action a correctement été exécutée ou non. En outre, dans un contexte d'appel via l'API, il + est possible de retourner des informations via un tableau associatif dont le contenu sera + fusionné avec les données retournées par la requête. Pour plus d'informations à ce sujet, + consultez la [documentation sur l'écriture d'une fonction implémentant une customAction](../conf/LSobject/customActions.md#ecriture-dune-fonction-implementant-une-customaction). + - `/api/1.0/object/[object type]/import` Cette méthode permet d'importer des objets d'un type en particulier à partir de données d'import @@ -634,7 +663,7 @@ HTTP 404 sera générée. **Exemple :** ``` - # curl -u username:secret 'https://ldapsaisie/api/api/1.0/search?pattern=LdapSaisie&pretty' + # curl -u username:secret 'https://ldapsaisie/api/1.0/search?pattern=LdapSaisie&pretty' { "success": true, "objects": { diff --git a/doc/src/conf/LSobject/customActions.md b/doc/src/conf/LSobject/customActions.md index 7834e69c..3f7bc7e2 100644 --- a/doc/src/conf/LSobject/customActions.md +++ b/doc/src/conf/LSobject/customActions.md @@ -17,6 +17,10 @@ $GLOBALS['LSobjects']['[nom du type d'LSobject]']['customActions'] = array ( 'noConfirmation' => '[booléen]', 'redirectToObjectList' => '[booléen]', 'noRedirect' => '[booléen]', + 'accessMethods' => array( + 'web', + 'api', + ), 'rights' => array( 'LSprofile1', 'LSprofile2', @@ -87,6 +91,13 @@ $GLOBALS['LSobjects']['[nom du type d'LSobject]']['customActions'] = array ( [LSprofiles](../global/ldap/LSprofile.md#profils-dutilisateurs) ayant le droit d'exécuter cette action. +- `accessMethods` + + Tableau permetant de restreindre les moyens d'accès possibles à cette action. Par défaut, tous les + moyens d'accès possibles sont autorisés. Valeurs possibles : `web` pour les accès via l'interface + web et `api` pour les accès via l'API. + + ## Écriture d'une fonction implémentant une customAction Une fonction implémentant une *customAction* se déclare de la manière suivante : @@ -101,6 +112,9 @@ Une fonction implémentant une *customAction* se déclare de la manière suivant * Valeurs retournées : * - True : Tout s'est bien passé * - False : Une erreur est survenue + * - Cas particulier pour une exécution via l'API : un tableau des données + * à retourner. Exemple : + * ["success" => true, "extra_info1" => "...", "extra_info2" => "..."] */ function maFonction ($object) { @@ -114,6 +128,14 @@ Cette fonction doit prendre pour seul paramètre, le [LSobject](index.md#configu lequel l'action personnalisée doit être exécutée et doit retourner soit `True` si tout s'est bien passé, soit `False` en cas de problème. +Une *customAction* pourra également être appelé via l'API. Dans ce cas, il est possible de +retourner un tableau associatif et non un simple booléen. Le résultat retourné sera alors +fusionné avec les données retournées par la requête. Ce tableau devra contenir à minima la clé +`success` qui indiquera via un booléen si l'exécution est un succès ou non. Il est possible de +détecter si la méthode est appelée via l'API en appelant la méthode +`LSsession :: get('api_mode')`. Vous pouvez prendre exemple sur le code de la méthode +`showTechInfo()` fournie par le LSaddon [showTechInfo](../LSaddon/LSaddon_showTechInfo.md). + !!! note Ces fonctions sont le plus couramment définies au sein d' diff --git a/src/includes/addons/LSaddons.showTechInfo.php b/src/includes/addons/LSaddons.showTechInfo.php index 5361176a..144d16e9 100644 --- a/src/includes/addons/LSaddons.showTechInfo.php +++ b/src/includes/addons/LSaddons.showTechInfo.php @@ -110,6 +110,17 @@ function showTechInfo($object) { // Sort other internal attributes by name ksort($internal_attrs); + // Handle API mode + if (LSsession :: get('api_mode')) { + return [ + "object_classes" => $object_classes, + "structural_object_class" => $structural_object_class, + "special_internal_attributes" => $special_internal_attributes, + "other_internal_attrs" => $internal_attrs, + "success" => true, + ]; + } + LStemplate :: assign('pagetitle', getFData(_('%{name}: Technical information'), $object -> getDisplayName())); $LSview_actions=array(); diff --git a/src/includes/class/class.LSsession.php b/src/includes/class/class.LSsession.php index e29abfea..3ee2c1f1 100644 --- a/src/includes/class/class.LSsession.php +++ b/src/includes/class/class.LSsession.php @@ -3210,6 +3210,9 @@ class LSsession { LSerror :: defineError('LSsession_27', ___("LSsession : You always seem to use %{old} in your custom code: Please upgrade it and use %{new}.
\nContext:\n%{context}
") ); + LSerror :: defineError('LSsession_28', + ___("LSsession : This custom action can not be executed by this way.") + ); } /** diff --git a/src/includes/routes.php b/src/includes/routes.php index 2614197a..f6580405 100644 --- a/src/includes/routes.php +++ b/src/includes/routes.php @@ -1079,7 +1079,13 @@ function handle_LSobject_show($request) { $customActionsConfig = LSconfig :: get('LSobjects.'.$LSobject.'.customActions'); if (is_array($customActionsConfig)) { foreach($customActionsConfig as $name => $config) { - if (LSsession :: canExecuteCustomAction($dn, $LSobject, $name)) { + if ( + LSsession :: canExecuteCustomAction($dn, $LSobject, $name) + && ( + ! LSconfig :: get('accessMethods', [], 'array', $config) + || in_array('web', LSconfig :: get('accessMethods', [], 'array', $config)) + ) + ) { $LSview_actions[] = array ( 'label' => ((isset($config['label']))?__($config['label']):__($name)), 'hideLabel' => ((isset($config['hideLabel']) && $config['hideLabel'])?$config['hideLabel']:False), @@ -1373,6 +1379,15 @@ function handle_LSobject_customAction($request) { $config = LSconfig :: get("LSobjects.$LSobject.customActions.$customAction"); $title = isset($config['label'])?__($config['label']):$customAction; + if ( + LSconfig :: get('accessMethods', [], 'array', $config) + && !in_array('web', LSconfig :: get('accessMethods', [], 'array', $config)) + ) { + LSerror :: addErrorCode('LSsession_28'); + LSsession :: displayTemplate(); + return; + } + // Check customAction function $function = LSconfig :: get('function', null, null, $config); if (!is_callable($function)) { @@ -2191,6 +2206,94 @@ function handle_api_LSobject_remove($request) { } LSurl :: add_handler('#^api/1.0/object/(?P[^/]+)/(?P[^/]+)/remove/?$#', 'handle_api_LSobject_remove', true, false, true); +/* + * Handle API LSobject custom action request + * + * @param LSurlRequest $request The request + * + * @return void +**/ +function handle_api_LSobject_customAction($request) { + $object = get_LSobject_from_API_request($request); + if (!$object) + return; + + $data = array( + 'dn' => $object -> getDn(), + 'type' => $object -> getType(), + 'name' => $object -> getDisplayName(), + 'success' => false, + ); + + $customAction = $request -> customAction; + + if ( !LSsession :: canExecuteCustomAction($data["dn"], $data["type"], $customAction) ) { + LSerror :: addErrorCode('LSsession_11'); + LSsession :: displayAjaxReturn($data); + return; + } + + $config = LSconfig :: get("LSobjects.{$data["type"]}.customActions.$customAction"); + $title = isset($config['label'])?__($config['label']):$customAction; + $objectname = $object -> getDisplayName(); + + if ( + LSconfig :: get('accessMethods', [], 'array', $config) + && !in_array('api', LSconfig :: get('accessMethods', [], 'array', $config)) + ) { + LSerror :: addErrorCode('LSsession_28'); + LSsession :: displayAjaxReturn($data); + return; + } + + // Check customAction function + $function = LSconfig :: get('function', null, null, $config); + if (!is_callable($function)) { + LSerror :: addErrorCode( + 'LSsession_13', + array( + 'customAction' => $title, + 'function' => ($function?format_callable($function):_('undefined')) + ) + ); + LSsession :: displayAjaxReturn($data); + return; + } + + // Run customAction + $result = call_user_func_array($function, array(&$object)); + + // Handle result: if its an array, merge it with returned data + if (is_array($result)) + $data = array_merge($data, $result); + + if ($result && (!is_array($result) || $data["success"])) { + $data["success"] = true; + if (!LSconfig :: get('disableOnSuccessMsg', false, 'bool', $config)) { + $msg_format = LSconfig :: get('onSuccessMsgFormat', null, 'string', $config); + if ($msg_format) { + $msg = getFData(__($msg_format), $objectname); + } else { + $msg = getFData( + _('The custom action %{customAction} have been successfully execute on %{objectname}.'), + array('objectname' => $objectname, 'customAction' => $customAction) + ); + } + LSsession :: addInfo($msg); + } + } + else { + LSerror :: addErrorCode( + 'LSldapObject_31', + array('objectname' => $objectname, 'customAction' => $customAction) + ); + } + LSsession :: displayAjaxReturn($data); +} +LSurl :: add_handler( + '#^api/1.0/object/(?P[^/]+)/(?P[^/]+)/customAction/(?P[^/]+)/?$#', + 'handle_api_LSobject_customAction', true, false, true); + /* * Handle API LSobject relation request * diff --git a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo index b2d8080a540c8c269c00c2fe76102c8ad7bbd110..313ee993519cea0d9dd5cf89818894a33d4bfd33 100644 GIT binary patch delta 14604 zcmYk@2YgNU|HtujW5f(uRzhw>gha>|VuT=e6tRVfm`zYgiQ?8)Ep6Qv)kSL*wQE)t zHL5LY)2bG&(b_GgzpDT1eZQywN6+K&{XM^*?^)mTUFYQLZ{?j52k(|}UGyvdrp0!_ z%d&#;?@E?+yclt`N-fLT)UrY`6suzzdSf;Q;c%>tGq4_hjQN~@9;XnuZDCmx@hhx? z=`GED24aL|xvWWKs*g}hlQxR&BkW96(jKh_CseYbAw4( zgLpBjVmnaBUqw|sytN+4WmzrA1X3^n1F+C`4mKiwA5-x>s)eexF>ynzLp&Z;(WOY; zt?ihO|3e>4BhYobqRt z9Lr;|_Ov4UqMCXedgHfP63<~N{1J=cb#&DvbCZnvxB~6(kFlr|TO-%DIw22ZEyP5; zh*22O(L7lyrV?kODzX55aTzwmt=I)`V-_~=WFF+bPPBh21&=78TdYQ%Evqz6#yU6~ z)ioPYPjCoT!K3KF%UB$Lw)fvajgh-{Tr9&pNEuWY`C$pHi|UdF8MMFpq!k5J&dNsB zd>yI<_F#4V5;d5vVmU0q<7mGhDz1iQFv2d6LshIX>UzylE%OZOxB;jZ9O1HeEI=O$ zmSI)gjC%4TSOKq~F8DjDB_5%k^eL*Z{hl!uin5JIRV)R4u`TNOK3EU)Q0KW8lkp|9 z8Fj-0w%?;#<{n0%PggU2l91N53Xut6?MF3b8AhxIR|qootvWauhoHvJ*Qmbt>uv_^ z7^Ev))>JZ;*)bdSq)Sj2+JJh}9jN)b2g~9G49DxXKAGH5Wh9aYi8=!+*%7ycQOutG1( zYJzPr8K|He#eU3dm+kR3%$%Uh_Xuh@sD!(^<5c~}MK+pa-%)qYe< zTtZD}M_$PBiYqpL2Ndt`K@pnm28X{a0Jpq_9xs)b(1;|IgtVH}H>b!^85uczJwr4f-$4>oe{{S-C6zGKKQ5T$x>boVVX|@ivE^I}$ z&>qwce?*;k6RTq}Mwn(%D5|0{SQ!&h*Xx9uetl70H6)An_dFQ|dZIL z9FLl2?;sCreS}5mJ(z)qQ*a>OvF(zpNz4s#48{(jGWa3t_^LxKs|U`)VR#WoVLHJG zow|+8ZVGA+Hy5~s?6A7=KbnTSQ56Un$?ApkknXl_pcbO^XH5$&Ko&#mBqn1m?%p2z zV;X*ho$#hz-Z)?Tsrn2uI^bK>Gz*}5O|cy|$643{4`C{n9&MVoJvJjAjbXSRS(B`j zs4l2ObDYJlsPiMAvn=XtJ&U@}Ic%z?D?ipuw+^Tqjz(2r19rgM7>|t$%!TriZnZXG zJ@lu&^<=47%|Q#{`^2lBXSKt2?6_93!J9Z9qFG;9OKi_Mx7{ zYl3OYdbZ=RoAx8!ZdH20vgY7KR7Jceny$&j4B};|zW)PTV*g2&6^BbE(f+N-oTMNH zt4ua6(H*0Si%Czp;#XeVIzEqT`*<} z2kHh>rkEX{U_;{Ds1s^WH8;paoiG(!;7L?P0;idI+yZr87WTpgs8N3hsk7B)x*7Ec zP%V}?!*t2pE<1A_)pUt7jnhz1avYz-inI85z-ibIPopXlH`^RnfNJ8+*cF3cGV91F z)bWRGYtc_?*(s>O=vq%keIE3(8O2>tH!Q$*cn$SLv9FjhG6(w-Uq@ZI)m*bqEJZzl zHO~yr&X`KL5!JQ#F$U|uYTmK~ka6v@R*=!)tM-~{s`1!{_)lz&&0c3l;B?H#2eyOf znQ9jjrEe2uOo94-yV@=}s zur2Pz7%a2E%!(AuB%X$~5v{@ft*K;Gun|?m-!Td! z-ZBeQH`I+6VjcVmQ?c}7Gfms0x?~QjrLLl`)AMal6I(B19`RFTJX(40nCsp{S91yy z-&IGjZet&OfJxZpJ<~F?uov+@jK-k%jqNamcpRz)7TVsz@x*CM%!BMgRs1?OMc<|7 zEt|2F+g75W7X=k@6ei<~sL{Uz)pw838>@d{zTd;KBykj~JkE|AqaSe#R7Ja^&Yz0v znw6-oIgT~Z=R=pdQS^sqO@9_c*fAf~0-LZg-mtB;%#;tnhLkVB`gj!M@Chbj%yI@S z4#8IV8#Yq;3gZa$B3|YqqbFF2s^NO zuJ;5>5tmqHTFM8@5C>ueI{rfvQ*r`d|TS%uT~`8up9HsAelsHQtGJaX(hU+o%e8uQk)K zBDN#$jRE)}R>ke87CK?a=P-fzK1N~0I`h%l&2}|nJHFi#-?sIk%?XLrVqCgk^ z11qBMX44WiQBNF+IxY=Wv7V?t9ggaPdA1*-T5vn6EB2tScMx^nS=5bhU`f2cnf8w% z^OypS`p8dA(=@=@#DlRO-m#mw_`)RRxZzPJN3F>tGShm1sBcQ>Zt9n``Wzs;1>=a9Vh=opsTj4>Jjk=CCme%y za6CrfQml=Ku@buOk_jN={i*pADj0)^8>0qa57eN_MXlY-QGI;{)x@_^E%ygj#>c2x zWY46BE9hiq2MDsBa-$%8~7VL`WQ7u;QGqXZIkD6ZZ zV0HY`_9_Mu7vF8BofFjp9WWHfV!Y=6n`G1ihp{SN#7KOEYTB^R&8OD{)QR7q_TNVJ zZPh)d>HDJw*?U+MH`t!USmKA6jCJ;!F_n$ME(+$6(T+8!6Msg{Ywvv~PD1r%Z`7C= zh#KWvQGK`@X-exfR>3Rihkv75vceap>4Q)3TmtR9Yq5om?I<1X5Zy<)?YpAZ+fEtwhP!IGSdf_#Uz+Vs3{%S(M zugsIw#nQxGP&epx3Cpi!gzLov0SMgWa+8Nwd&op~~OIMBIk{cned|amswUHN{56i%?_h z1geX=o;LR>!f@iZF#}zD$vDaQo-u2B90n6Vg8`V2fjABIL~mg`JcByUdDi?**A&$S zFQU3&17_p5*bU>(nZY*`H7yrn4b^conRE(HpdVH{Zreeny_7zz2#l#j## z#NT2^jQQSFbP{TmyKy}(!z$SQg6XO})WTJWrPW3+*gIyRnr1F)ux&;sUOblRPDmcsb-JfZH z^~q)moOlN;R71f0IQLpC;H_T5hHBdLo!{)dhTjC?s zc`3h|Nu*79ahBq-1qwbn% z+rxGus{8|t!6TS}|6n-A-!s#k0EV_`Lx!$YX^PobXl4r*2eJ}}2eqgKL1)U@u5F4Z)bj0VjZR3C1{intSXqpwjF zIElK^FW3R^V@GWE(8Moe7vi&66YKnGW=#iFMMt12HVZYa*ZxWSYsWDP!tf?KvEn21 zb6G47B3_E^u=ry$$~$8P;OyG_hqVva;`2D#%i)=R*HFi07IRoH;Ze-PUd0`rcgI1@B5qK^ z;rX3#9`+&r2~#npq{H*|JP|ecj-k5BRoUC&c|Q-sXDHZ(I>4ut!!u8NU>oB1F$1q+ ze@rUvuv*|77=vd}=XsZLc=|R2dlQdA?f)9@;@{XBZ%ufy7pmryOU!p~t1 z)ckk&J3K#|4Z^YPIEmSq9$+f43iYJdQ8$hZba?)WrayKi-eOy-lBq~vTtN9D%*CwA z4$mOok7|*KDh}&qoPqIaCY&i3Qj@)OZx<5~tNP6+T|m;qr{??qQ~8M^F{1U(4b7 zad{s0CH@Vy1gD2PthewLRG-(b?eI*y`PhxvE5Zz}9;g<12i4>ub+^LTp1=1iMmo$_F4p3JGdK4k7l7c6fe0FTzaX zn>Ywt);ASgj%vZjs4hr!H84*$995%rI2h~3I6Mo@Jk+$R9_#S@YgaB#C;kLAb{fSQ zccA8Tqj+=v9Mp<;2UU?82@cO+JO!vh{0^!ju482CkSUvJ4oE;vw|=M_EWzsNOfpa2 z3^mP`p`Q2{>Ox5k&5fQzJ@J>=5TlaK7|KDdkn2#htVSbGm%FU_WYmLpYY-a)lcSQ9g7M`9uICR9t+X=*C67K?~~K@Hjg&9sv8h=<5@ zr{J09=Ef^2*EX@G!~9^0Ig}qnRU|UatOrZ5 z9&y7~4$n(zF!ogwFCbGA@1v&AV@$*(u;Cxg?cB20K6YCloHF0vfsd*08B|d~syoXvy{MwpPJQx*kw=L7ojDdcr ziZ4Qa;~hn0%%>bNeb3Jph%{&CnEccE_JmFe(&gjPUxRU`&s4C*D+ z5!JObk#)vp?IhENf`3r&<<>n+&6c2=b_43d+p!`Zu;VirLVN|a&=l)w){hj_cSHep z#uKR5bZ9TLLKdK=?*Z(l`QMxyZieK@w5twMJdH7cxezd@Qc{Kbnl5v=IGq64t`kQG;YFYS4X+dg8OF3;k*D zFW=A1j+&^Z?u@$52-KjSjCz3CsITpXsIL43T{_?h8F?1^;DIq<(^_#5D&xJpV?VgDr_S4rKnPllg-JU7$&} zd5KIx4U)5{zAZb*;rVYu(y%e{I&6kFa0u4PF%@|g`w}0=b{IX_wA?sUmrTQ0oQDl? z&tT?%9GSZms1L((O%tZ0;v5XeSy&m@q6XCgRK){^n5ONAYO#^1bzuyuE5@U4{D!^% zeT*hvj-~LVi;NeU3#dN&5p}|Ctcj0N(=B+Y>GMd`*hob+aV}=!9@G<68fMn`HmI?Z zkGjr0+l{Dq%qfgO*Y9>FXt?RyG_1;wiKqh?pvJ@&9FF%f5BrTU7yb&>q_Bpd2>{G0bCs7O1Uzmzv&wAb^E^9Cu_4RhthsI5_!zzpMiS99jNu-2Ik^J z)a>b(Z*DjkwX#jbYWNCjMO}$HZ#QbNe~p2f|EI~QX1`%528=TEH3_E|=MPUiK04M^ z@Dl2VPi?&mOrKZ4`jl5fRkSs7x>bmp{}WI*o{Q?jg;sL-Z zL^O}2w?S8q&^J^C;$Gx4a4-IhJMbUW*4O>Geo)mml>EDW&7L1f?^5tTcXWfwiH+FH zSg|hKhwQf9Y@Zd%zT2cc;vRUK{a?9@8bpMarsO5k9Q#Opj~=kk76tCT4T1tYu=f21;n z#1}{p$ZLDkKIV1uPbph~2XLWwvQ=aM9Fw(JCahf2i(a004{JF)kJ&pbvEx(wVn32! zMXEx46%TXFV^V$cM=0~hh3@P)|4v^Ly-dWHgteKZ?F-6Unyly5w2}DVEr*O2>uq+~ zO7gsFJ%4S)x%b9Z4m{7E;Uv8y3Q5{_xo^c)?%&ZqM{DnNPdUFNbME)#gY13v>^jsZ z{)h6O_Hixj{Tom({_Pz11%8U@q-WgO@hOcSlKaL!vWu-QkV1N$*h#uX-hneoJ{+%Y zxBGN_L~b}GJ1Kd`E)77v$ktJ=jiu!Ow_okN)*5YNIHo3P0%@#${4&b#aU36G)+6%s zNLSq12|rozV$G@>p8}CM|73GEQO9}oh29VoHsXndl zlk}O*I^@~LqyC>T+I}EuRn&Hvvg&sE7w*Kwi0Y5IW>3<$l)l6f2km>FBwyKGlo;eX zO35&ySdQ3??~zLCEaFhoQPMl4zbS7)d1ul`q{F1&NH0*XtpdkHlbVvWW!WA=y@y^S zxyg^l^PKlNF7slYNFdPm7xJ#McH1Ya>;-phQbhRgl)ge~hP~%AoJ#tOBTnKq40BIP z3h^y&AMuV(X1nHIo76n~xLw-azSB_ll%s5w=NR*EGn?GL4J*68<%neas6>v~LH=*j z6!QG3VjU-ClizBenT}D!+SakJt;t$Nl<@^&4Z#s4C;5rknEf|NpAk|~ z-a`70BYG2SJ4^mcQh^Dr!IZBgeN5cdE=wVvz%irjSbRv?d!%5y>^l2vlQK!GDNiC5 zk^hwayrtc1lFK`ubMHtFE76)g)7+Pm!@?_(OD9Ee+?ym9d2M^i|B2U0neMucg6hs^ zk2h%?CEw#b(jJnw*KCvVb9Y{&DAz5{-$M!}`BJ)qqcTVb$iGF(CGm5I^&NhNd^CEt zio_SmpG9r644(gOXqSEapR&o6EhX)ttSx?M_W4-*?F&A^6YlWF5w3ph4!2KjLjFhc z>oF8(klrPK7Spg9$%nLo_%-`V?TEGQvwam$lRB{f2x&U`ZtOp!81<3-@3!B|^E;^t zi*dj{vgJ8J+aO!zN7?yP9K#<)|G(8H*WKRtfjcmzVRYnw&iaGBONeKYKDWEBJ?qLYXN+n7H@!G%_%I%9qb%b}0% pAOEFN$^2aB=-k4E&qO=?%Z<){&Y6?z95g(8_}FdTn>)HC{~yral3V}) delta 14514 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\n" "Language-Team: LdapSaisie \n" @@ -323,7 +323,7 @@ msgstr "Vos modifications ont été enregistrées." #: includes/addons/LSaddons.mail.php:565 #: includes/addons/LSaddons.showSupportInfo.php:78 #: includes/addons/LSaddons.accesslog.php:248 -#: includes/addons/LSaddons.showTechInfo.php:117 +#: includes/addons/LSaddons.showTechInfo.php:128 msgid "Go back" msgstr "Retour" @@ -453,8 +453,8 @@ msgstr "Comparer" #: includes/class/class.LSrelation.php:679 includes/class/class.LSform.php:346 #: includes/class/class.LSformElement_select_object.php:75 #: includes/class/class.LSformElement_select_object.php:91 -#: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1075 -#: includes/routes.php:1219 +#: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1072 +#: includes/routes.php:1222 msgid "Delete" msgstr "Supprimer" @@ -467,8 +467,8 @@ msgstr "Étendue" #: includes/class/class.LSrelation.php:736 #: includes/class/class.LSformElement_select_object.php:74 #: includes/class/class.LSformElement_supannLabeledValue.php:90 -#: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1059 -#: includes/routes.php:1227 includes/routes.php:1313 includes/routes.php:1460 +#: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1056 +#: includes/routes.php:1230 includes/routes.php:1315 includes/routes.php:1470 msgid "Modify" msgstr "Modifier" @@ -476,7 +476,7 @@ msgstr "Modifier" msgid "Modify RDN" msgstr "Modifier le RDN" -#: includes/addons/LSaddons.accesslog.php:35 includes/routes.php:521 +#: includes/addons/LSaddons.accesslog.php:35 includes/routes.php:518 #: templates/default/select.tpl:28 templates/default/global_search.tpl:6 msgid "Search" msgstr "Rechercher" @@ -504,7 +504,7 @@ msgstr "Voir les modifications d'LdapSaisie" #: includes/addons/LSaddons.accesslog.php:243 #: includes/class/class.LSsession.php:1875 includes/routes.php:157 -#: includes/routes.php:478 templates/default/select.tpl:29 +#: includes/routes.php:475 templates/default/select.tpl:29 msgid "Refresh" msgstr "Rafraîchir" @@ -750,7 +750,7 @@ msgstr "Oui" msgid "No" msgstr "Non" -#: includes/addons/LSaddons.showTechInfo.php:113 +#: includes/addons/LSaddons.showTechInfo.php:124 msgid "%{name}: Technical information" msgstr "%{name} : Informations techniques" @@ -962,7 +962,7 @@ msgstr "Confirmez-vous votre choix ?" #: includes/class/class.LSconfirmBox.php:37 #: includes/class/class.LSsmoothbox.php:39 includes/class/class.LSform.php:175 -#: includes/routes.php:645 includes/routes.php:1300 includes/routes.php:1447 +#: includes/routes.php:642 includes/routes.php:1302 includes/routes.php:1457 #: templates/default/recoverpassword.tpl:21 msgid "Validate" msgstr "Valider" @@ -1833,6 +1833,11 @@ msgstr "" "Context:\n" "%{context}" +#: includes/class/class.LSsession.php:3214 +msgid "LSsession : This custom action can not be executed by this way." +msgstr "" +"LSsession : Cette action personnalisée ne peut être exécutée par ce biais." + #: includes/class/class.LSformRule_mimetype.php:53 #: includes/class/class.LSformRule_mimetype.php:57 msgid "Invalid file type (%{type})." @@ -2328,8 +2333,8 @@ msgstr "Attention" msgid "No object." msgstr "Aucun objet." -#: includes/class/class.LSrelation.php:747 includes/routes.php:460 -#: includes/routes.php:1004 +#: includes/class/class.LSrelation.php:747 includes/routes.php:457 +#: includes/routes.php:1001 msgid "New" msgstr "Nouveau" @@ -2565,13 +2570,13 @@ msgstr "" "Une erreur est survenue en soumettant ce formulaire. Merci de ré-essayer ou " "de contacter le support." -#: includes/class/class.LSform.php:327 includes/routes.php:641 +#: includes/class/class.LSform.php:327 includes/routes.php:638 msgid "Do you really want to execute custom action %{title} on this search ?" msgstr "" "Êtes-vous vraiment sûre de vouloir exécuter l'action personnalisée %{title} " "sur cette recherche ?" -#: includes/class/class.LSform.php:333 includes/routes.php:1441 +#: includes/class/class.LSform.php:333 includes/routes.php:1451 msgid "" "Do you really want to execute custom action %{customAction} on " "%{objectname} ?" @@ -2779,8 +2784,8 @@ msgstr "Réinitialiser le choix." msgid "Display RSS stack." msgstr "Afficher la file RSS." -#: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:594 -#: includes/routes.php:1388 +#: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:591 +#: includes/routes.php:1398 includes/routes.php:2256 msgid "undefined" msgstr "non-définie" @@ -2899,39 +2904,39 @@ msgstr "Étape" msgid "Pedagogical element" msgstr "Élement pédagogique" -#: includes/class/class.LSsearch.php:1318 +#: includes/class/class.LSsearch.php:1321 msgid "Actions" msgstr "Actions" -#: includes/class/class.LSsearch.php:1321 +#: includes/class/class.LSsearch.php:1324 #: templates/default/global_search.tpl:16 msgid "This search didn't get any result." msgstr "Cette recherche n'a retournée aucun résultat." -#: includes/class/class.LSsearch.php:1963 +#: includes/class/class.LSsearch.php:1966 msgid "LSsearch : Invalid filter : %{filter}." msgstr "LSsearch : Filtre invalide : %{filter}." -#: includes/class/class.LSsearch.php:1966 +#: includes/class/class.LSsearch.php:1969 msgid "LSsearch : Invalid basedn (%{basedn})." msgstr "LSsearch : Base DN invalide (%{basedn})." -#: includes/class/class.LSsearch.php:1969 +#: includes/class/class.LSsearch.php:1972 msgid "LSsearch : Invalid value for %{param} parameter." msgstr "LSsearch : La valeur du paramètre %{param} est incorrecte." -#: includes/class/class.LSsearch.php:1972 +#: includes/class/class.LSsearch.php:1975 msgid "" "LSsearch : Invalid size limit. Must be an integer greater or equal to 0." msgstr "" "LSsearch : Limite de taille de recherche invalide. Elle doit être un entier " "supérieur ou égal à 0." -#: includes/class/class.LSsearch.php:1975 +#: includes/class/class.LSsearch.php:1978 msgid "LSsearch : Invalid parameter %{param}. Must be an boolean." msgstr "LSsearch : Paramètre %{param} invalide. Il doit être un booléen." -#: includes/class/class.LSsearch.php:1978 +#: includes/class/class.LSsearch.php:1981 msgid "" "LSsearch : Invalid parameter attributes. Must be an string or an array of " "strings." @@ -2939,13 +2944,13 @@ msgstr "" "LSsearch : Paramètre 'attributes' invalide. Il doit être une chaîne de " "caractères ou un tableau de chaînes de caractères." -#: includes/class/class.LSsearch.php:1981 +#: includes/class/class.LSsearch.php:1984 msgid "LSsearch : Can't build attributes list for make filter." msgstr "" "LSsearch : Impossible de construire la liste des attributs pour faire le " "filtre." -#: includes/class/class.LSsearch.php:1984 +#: includes/class/class.LSsearch.php:1987 msgid "" "LSsearch : Error building filter with attribute '%{attr}' and pattern " "'%{pattern}'" @@ -2953,34 +2958,34 @@ msgstr "" "LSsearch : Problème en construisant le filtre avec l'attribut '%{attr}' et " "le mot clé '%{pattern}'" -#: includes/class/class.LSsearch.php:1987 +#: includes/class/class.LSsearch.php:1990 msgid "LSsearch : Error combining filters." msgstr "LSsearch : Problème en combinant les filtres." -#: includes/class/class.LSsearch.php:1990 +#: includes/class/class.LSsearch.php:1993 msgid "LSsearch : Invalid pattern." msgstr "LSsearch : Mot clé invalide." -#: includes/class/class.LSsearch.php:1993 +#: includes/class/class.LSsearch.php:1996 msgid "LSsearch : Invalid attribute %{attr} in parameters." msgstr "LSsearch : Attribut %{attr} incorrect dans les paramètres." -#: includes/class/class.LSsearch.php:1996 +#: includes/class/class.LSsearch.php:1999 msgid "LSsearch : Error during the search." msgstr "LSsearch : Erreur pendant la recherche." -#: includes/class/class.LSsearch.php:1999 +#: includes/class/class.LSsearch.php:2002 msgid "LSsearch : Error sorting the search." msgstr "LSsearch : Erreur pendant le trie de la recherche." -#: includes/class/class.LSsearch.php:2002 +#: includes/class/class.LSsearch.php:2005 msgid "" "LSsearch : The function of the custum information %{name} is not callable." msgstr "" "LSsearch : La fonction de l'information personnalisée %{name} n'est pas " "exécutable." -#: includes/class/class.LSsearch.php:2005 +#: includes/class/class.LSsearch.php:2008 msgid "" "LSsearch : Invalid predefinedFilter for LSobject type %{type} : %{label} " "(filter : %{filter})." @@ -2988,13 +2993,13 @@ msgstr "" "LSsearch : PredefinedFilter invalide pour le type d'LSobject %{type} : " "%{label} (filtre : %{filter})." -#: includes/class/class.LSsearch.php:2008 +#: includes/class/class.LSsearch.php:2011 msgid "LSsearch : Error during execution of the custom action %{customAction}." msgstr "" "LSldapObject : Erreur durant l'exécution de l'action personnalisée " "%{customAction}." -#: includes/class/class.LSsearch.php:2011 +#: includes/class/class.LSsearch.php:2014 msgid "LSsearch : Invalid search pattern." msgstr "LSsearch : Mot clé de recherche invalide." @@ -3312,12 +3317,12 @@ msgstr "" "LSformRule_gpg_pub_key : L'extension PHP GnuPG n'est pas installée, " "impossible de valider la valeur." -#: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1211 -#: includes/routes.php:1305 includes/routes.php:1452 +#: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1214 +#: includes/routes.php:1307 includes/routes.php:1462 msgid "View" msgstr "Voir" -#: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1067 +#: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1064 msgid "Copy" msgstr "Copier" @@ -3347,66 +3352,66 @@ msgstr "Accueil" msgid "You must provide pattern for global search." msgstr "Vous devez fournir un mot clé pour les recherches globales." -#: includes/routes.php:466 includes/routes.php:825 +#: includes/routes.php:463 includes/routes.php:822 msgid "Import" msgstr "Importer" -#: includes/routes.php:471 includes/routes.php:891 +#: includes/routes.php:468 includes/routes.php:888 msgid "Export" msgstr "Exporter" -#: includes/routes.php:483 +#: includes/routes.php:480 msgid "Reset" msgstr "Réinitialiser" -#: includes/routes.php:522 templates/default/select.tpl:31 +#: includes/routes.php:519 templates/default/select.tpl:31 msgid "Approximative search" msgstr "Recherche approximative" -#: includes/routes.php:523 templates/default/select.tpl:32 +#: includes/routes.php:520 templates/default/select.tpl:32 msgid "Recursive search" msgstr "Recherche récursive" -#: includes/routes.php:615 +#: includes/routes.php:612 msgid "" "The custom action %{title} have been successfully execute on this search." msgstr "" "L'action personnalisée %{title} a été correctement exécutée sur cette " "recherche." -#: includes/routes.php:963 +#: includes/routes.php:960 msgid "Data entry form" msgstr "Masque de saisie" -#: includes/routes.php:969 includes/routes.php:1746 +#: includes/routes.php:966 includes/routes.php:1984 msgid "Object has been added." msgstr "L'objet a été ajouté." -#: includes/routes.php:1106 +#: includes/routes.php:1109 msgid "My account" msgstr "Mon compte" -#: includes/routes.php:1169 includes/routes.php:1918 +#: includes/routes.php:1172 includes/routes.php:2156 msgid "The object has been partially modified." msgstr "L'objet a été partiellement modifié." -#: includes/routes.php:1172 includes/routes.php:1921 +#: includes/routes.php:1175 includes/routes.php:2159 msgid "The object has been modified successfully." msgstr "L'objet a bien été modifié." -#: includes/routes.php:1288 includes/routes.php:1961 +#: includes/routes.php:1290 includes/routes.php:2199 msgid "%{objectname} has been successfully deleted." msgstr "%{objectname} a bien été supprimé." -#: includes/routes.php:1297 +#: includes/routes.php:1299 msgid "Deleting : %{objectname}" msgstr "Suppression : %{objectname}" -#: includes/routes.php:1298 +#: includes/routes.php:1300 msgid "Do you really want to delete %{displayName} ?" msgstr "Voulez-vous vraiment supprimer %{displayName} ?" -#: includes/routes.php:1409 +#: includes/routes.php:1419 includes/routes.php:2278 msgid "" "The custom action %{customAction} have been successfully execute on " "%{objectname}." diff --git a/src/lang/ldapsaisie.pot b/src/lang/ldapsaisie.pot index 2d4be0aa..52ad4799 100644 --- a/src/lang/ldapsaisie.pot +++ b/src/lang/ldapsaisie.pot @@ -251,7 +251,7 @@ msgstr "" #: includes/addons/LSaddons.mail.php:565 #: includes/addons/LSaddons.showSupportInfo.php:78 #: includes/addons/LSaddons.accesslog.php:248 -#: includes/addons/LSaddons.showTechInfo.php:117 +#: includes/addons/LSaddons.showTechInfo.php:128 msgid "Go back" msgstr "" @@ -366,8 +366,8 @@ msgstr "" #: includes/class/class.LSrelation.php:679 includes/class/class.LSform.php:346 #: includes/class/class.LSformElement_select_object.php:75 #: includes/class/class.LSformElement_select_object.php:91 -#: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1075 -#: includes/routes.php:1219 +#: includes/class/class.LSsearchEntry.php:237 includes/routes.php:1072 +#: includes/routes.php:1222 msgid "Delete" msgstr "" @@ -380,8 +380,8 @@ msgstr "" #: includes/class/class.LSrelation.php:736 #: includes/class/class.LSformElement_select_object.php:74 #: includes/class/class.LSformElement_supannLabeledValue.php:90 -#: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1059 -#: includes/routes.php:1227 includes/routes.php:1313 includes/routes.php:1460 +#: includes/class/class.LSsearchEntry.php:221 includes/routes.php:1056 +#: includes/routes.php:1230 includes/routes.php:1315 includes/routes.php:1470 msgid "Modify" msgstr "" @@ -389,7 +389,7 @@ msgstr "" msgid "Modify RDN" msgstr "" -#: includes/addons/LSaddons.accesslog.php:35 includes/routes.php:521 +#: includes/addons/LSaddons.accesslog.php:35 includes/routes.php:518 #: templates/default/select.tpl:28 templates/default/global_search.tpl:6 msgid "Search" msgstr "" @@ -417,7 +417,7 @@ msgstr "" #: includes/addons/LSaddons.accesslog.php:243 #: includes/class/class.LSsession.php:1875 includes/routes.php:157 -#: includes/routes.php:478 templates/default/select.tpl:29 +#: includes/routes.php:475 templates/default/select.tpl:29 msgid "Refresh" msgstr "" @@ -633,7 +633,7 @@ msgstr "" msgid "No" msgstr "" -#: includes/addons/LSaddons.showTechInfo.php:113 +#: includes/addons/LSaddons.showTechInfo.php:124 msgid "%{name}: Technical information" msgstr "" @@ -819,7 +819,7 @@ msgstr "" #: includes/class/class.LSconfirmBox.php:37 #: includes/class/class.LSsmoothbox.php:39 includes/class/class.LSform.php:175 -#: includes/routes.php:645 includes/routes.php:1300 includes/routes.php:1447 +#: includes/routes.php:642 includes/routes.php:1302 includes/routes.php:1457 #: templates/default/recoverpassword.tpl:21 msgid "Validate" msgstr "" @@ -1552,6 +1552,10 @@ msgid "" "%{context}" msgstr "" +#: includes/class/class.LSsession.php:3214 +msgid "LSsession : This custom action can not be executed by this way." +msgstr "" + #: includes/class/class.LSformRule_mimetype.php:53 #: includes/class/class.LSformRule_mimetype.php:57 msgid "Invalid file type (%{type})." @@ -1968,8 +1972,8 @@ msgstr "" msgid "No object." msgstr "" -#: includes/class/class.LSrelation.php:747 includes/routes.php:460 -#: includes/routes.php:1004 +#: includes/class/class.LSrelation.php:747 includes/routes.php:457 +#: includes/routes.php:1001 msgid "New" msgstr "" @@ -2166,11 +2170,11 @@ msgid "" "support." msgstr "" -#: includes/class/class.LSform.php:327 includes/routes.php:641 +#: includes/class/class.LSform.php:327 includes/routes.php:638 msgid "Do you really want to execute custom action %{title} on this search ?" msgstr "" -#: includes/class/class.LSform.php:333 includes/routes.php:1441 +#: includes/class/class.LSform.php:333 includes/routes.php:1451 msgid "" "Do you really want to execute custom action %{customAction} on " "%{objectname} ?" @@ -2360,8 +2364,8 @@ msgstr "" msgid "Display RSS stack." msgstr "" -#: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:594 -#: includes/routes.php:1388 +#: includes/class/class.LSattr_ldap_password.php:108 includes/routes.php:591 +#: includes/routes.php:1398 includes/routes.php:2256 msgid "undefined" msgstr "" @@ -2469,88 +2473,88 @@ msgstr "" msgid "Pedagogical element" msgstr "" -#: includes/class/class.LSsearch.php:1318 +#: includes/class/class.LSsearch.php:1321 msgid "Actions" msgstr "" -#: includes/class/class.LSsearch.php:1321 +#: includes/class/class.LSsearch.php:1324 #: templates/default/global_search.tpl:16 msgid "This search didn't get any result." msgstr "" -#: includes/class/class.LSsearch.php:1963 +#: includes/class/class.LSsearch.php:1966 msgid "LSsearch : Invalid filter : %{filter}." msgstr "" -#: includes/class/class.LSsearch.php:1966 +#: includes/class/class.LSsearch.php:1969 msgid "LSsearch : Invalid basedn (%{basedn})." msgstr "" -#: includes/class/class.LSsearch.php:1969 +#: includes/class/class.LSsearch.php:1972 msgid "LSsearch : Invalid value for %{param} parameter." msgstr "" -#: includes/class/class.LSsearch.php:1972 +#: includes/class/class.LSsearch.php:1975 msgid "" "LSsearch : Invalid size limit. Must be an integer greater or equal to 0." msgstr "" -#: includes/class/class.LSsearch.php:1975 +#: includes/class/class.LSsearch.php:1978 msgid "LSsearch : Invalid parameter %{param}. Must be an boolean." msgstr "" -#: includes/class/class.LSsearch.php:1978 +#: includes/class/class.LSsearch.php:1981 msgid "" "LSsearch : Invalid parameter attributes. Must be an string or an array of " "strings." msgstr "" -#: includes/class/class.LSsearch.php:1981 +#: includes/class/class.LSsearch.php:1984 msgid "LSsearch : Can't build attributes list for make filter." msgstr "" -#: includes/class/class.LSsearch.php:1984 +#: includes/class/class.LSsearch.php:1987 msgid "" "LSsearch : Error building filter with attribute '%{attr}' and pattern " "'%{pattern}'" msgstr "" -#: includes/class/class.LSsearch.php:1987 +#: includes/class/class.LSsearch.php:1990 msgid "LSsearch : Error combining filters." msgstr "" -#: includes/class/class.LSsearch.php:1990 +#: includes/class/class.LSsearch.php:1993 msgid "LSsearch : Invalid pattern." msgstr "" -#: includes/class/class.LSsearch.php:1993 +#: includes/class/class.LSsearch.php:1996 msgid "LSsearch : Invalid attribute %{attr} in parameters." msgstr "" -#: includes/class/class.LSsearch.php:1996 +#: includes/class/class.LSsearch.php:1999 msgid "LSsearch : Error during the search." msgstr "" -#: includes/class/class.LSsearch.php:1999 +#: includes/class/class.LSsearch.php:2002 msgid "LSsearch : Error sorting the search." msgstr "" -#: includes/class/class.LSsearch.php:2002 +#: includes/class/class.LSsearch.php:2005 msgid "" "LSsearch : The function of the custum information %{name} is not callable." msgstr "" -#: includes/class/class.LSsearch.php:2005 +#: includes/class/class.LSsearch.php:2008 msgid "" "LSsearch : Invalid predefinedFilter for LSobject type %{type} : %{label} " "(filter : %{filter})." msgstr "" -#: includes/class/class.LSsearch.php:2008 +#: includes/class/class.LSsearch.php:2011 msgid "LSsearch : Error during execution of the custom action %{customAction}." msgstr "" -#: includes/class/class.LSsearch.php:2011 +#: includes/class/class.LSsearch.php:2014 msgid "LSsearch : Invalid search pattern." msgstr "" @@ -2813,12 +2817,12 @@ msgid "" "LSformRule_gpg_pub_key: PHP GnuPG extension is missing, can't validate value." msgstr "" -#: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1211 -#: includes/routes.php:1305 includes/routes.php:1452 +#: includes/class/class.LSsearchEntry.php:213 includes/routes.php:1214 +#: includes/routes.php:1307 includes/routes.php:1462 msgid "View" msgstr "" -#: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1067 +#: includes/class/class.LSsearchEntry.php:229 includes/routes.php:1064 msgid "Copy" msgstr "" @@ -2844,64 +2848,64 @@ msgstr "" msgid "You must provide pattern for global search." msgstr "" -#: includes/routes.php:466 includes/routes.php:825 +#: includes/routes.php:463 includes/routes.php:822 msgid "Import" msgstr "" -#: includes/routes.php:471 includes/routes.php:891 +#: includes/routes.php:468 includes/routes.php:888 msgid "Export" msgstr "" -#: includes/routes.php:483 +#: includes/routes.php:480 msgid "Reset" msgstr "" -#: includes/routes.php:522 templates/default/select.tpl:31 +#: includes/routes.php:519 templates/default/select.tpl:31 msgid "Approximative search" msgstr "" -#: includes/routes.php:523 templates/default/select.tpl:32 +#: includes/routes.php:520 templates/default/select.tpl:32 msgid "Recursive search" msgstr "" -#: includes/routes.php:615 +#: includes/routes.php:612 msgid "" "The custom action %{title} have been successfully execute on this search." msgstr "" -#: includes/routes.php:963 +#: includes/routes.php:960 msgid "Data entry form" msgstr "" -#: includes/routes.php:969 includes/routes.php:1746 +#: includes/routes.php:966 includes/routes.php:1984 msgid "Object has been added." msgstr "" -#: includes/routes.php:1106 +#: includes/routes.php:1109 msgid "My account" msgstr "" -#: includes/routes.php:1169 includes/routes.php:1918 +#: includes/routes.php:1172 includes/routes.php:2156 msgid "The object has been partially modified." msgstr "" -#: includes/routes.php:1172 includes/routes.php:1921 +#: includes/routes.php:1175 includes/routes.php:2159 msgid "The object has been modified successfully." msgstr "" -#: includes/routes.php:1288 includes/routes.php:1961 +#: includes/routes.php:1290 includes/routes.php:2199 msgid "%{objectname} has been successfully deleted." msgstr "" -#: includes/routes.php:1297 +#: includes/routes.php:1299 msgid "Deleting : %{objectname}" msgstr "" -#: includes/routes.php:1298 +#: includes/routes.php:1300 msgid "Do you really want to delete %{displayName} ?" msgstr "" -#: includes/routes.php:1409 +#: includes/routes.php:1419 includes/routes.php:2278 msgid "" "The custom action %{customAction} have been successfully execute on " "%{objectname}."