LSioFormat: add before/after import triggers feature

This commit is contained in:
Benjamin Renard 2023-05-17 11:38:01 +02:00
parent 89ee2f1ec3
commit fa60f54b15
Signed by: bn8
GPG key ID: 3E2E1CE1907115BC
7 changed files with 369 additions and 106 deletions

View file

@ -43,7 +43,9 @@ création du type d'&LSobject;. En conséquence :
return array([...]); return array([...]);
}, },
[...] [...]
) ),
'before_import' => array('function1', 'function2'),
'after_import' => 'function3',
), ),
[...] [...]
);]]> );]]>
@ -100,6 +102,24 @@ création du type d'&LSobject;. En conséquence :
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term>before_import</term>
<listitem>
<simpara>Chaîne de caractères (ou tableau de chaîne de caractères) correspondant
au nom d'une ou plusieurs fonctions qui seront exécutées avant chaque import.
<link linkend="config-LSobject-ioFormat-triggers">Voir la section concernée</link></simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>after_import</term>
<listitem>
<simpara>Chaîne de caractères (ou tableau de chaîne de caractères) correspondant
au nom d'une ou plusieurs fonctions qui seront exécutées après chaque import.
<link linkend="config-LSobject-ioFormat-triggers">Voir la section concernée</link></simpara>
</listitem>
</varlistentry>
</variablelist> </variablelist>
</para> </para>
@ -187,4 +207,125 @@ création du type d'&LSobject;. En conséquence :
</sect3> </sect3>
<sect3 id="config-LSobject-ioFormat-triggers">
<title>Déclencheurs</title>
<para>Cette section décrit la manière de paramétrer des déclencheurs afin que
&LdapSaisie; exécute durant ses processus, et à des moments bien précis des
traitements d'un &ioFormat;, des fonctions que vous pourrez développer vous
même. De plus, le résultat de l'exécution de vos fonctions pourra influer
sur le déroulement des processus.</para>
<para>Actuellement, les évenements suivant sont gérés :
<informaltable>
<tgroup cols="3"> <!-- on décrit le nombre de colonnes -->
<thead> <!-- on passe au "header" du tableau -->
<row>
<entry>Nom</entry>
<entry>Description</entry>
<entry>Bloquant</entry>
</row>
</thead>
<tbody> <!-- et on remplit les lignes -->
<row>
<entry><literal>before_import</literal></entry>
<entry><simpara>Avant l'import.</simpara></entry>
<entry><simpara>Oui</simpara></entry>
</row>
<row>
<entry><literal>after_import</literal></entry>
<entry><simpara>Après l'import'.</simpara></entry>
<entry><simpara>Non</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<note><simpara>Si un événement est dit <emphasis>bloquant</emphasis>, lors de
l'exécution des actions liées, si une des fonctions retourne <literal>false
</literal>, le processus s'arrêtera.</simpara></note>
</para>
<sect4 id="config-LSobject-ioFormat-triggers-config">
<title>Configuration</title>
<para>La configuration des déclencheurs se fait dans la définition des types
d'&ioFormat;. Par exemple, pour définir les fonctions à exécuter après
l'import des LSobjects de type <emphasis>LSpeople</emphasis> avec son LSioFormat <emphasis>
mycsv</emphasis>, c'est à dire lors de leur évènement <literal>after_import</literal>, il faut
définir la variable suivante :
<programlisting linenumbering="unnumbered"><![CDATA[$GLOBALS['LSobjects']['LSpeople']['ioFormat']['mycsv']['after_import']]]></programlisting>
Cette variable peut contenir soit une chaine de caractères correspondant au
nom de la fonction à exécuter, soit un tableau de chaînes de caractères
correspondant aux noms des fonctions à exécuter. Il est également possible de mettre ici directement
des <ulink url='https://www.php.net/manual/fr/functions.anonymous.php'>fonctions anonymes</ulink>.
</para>
</sect4>
<sect4 id="config-LSobject-ioFormat-triggers-writing">
<title>Ecriture d'une fonction</title>
<para>Une fonction exécutée par un déclencheur d'un ioFormat se déclare de la
manière suivante :
<programlisting linenumbering="unnumbered"><![CDATA[
/*
* Ma fonction à exécuter lors de l'evenement [event]
*
* Paramètres :
* - $ioFormat : Le LSioFormat sur lequel l'évènement survient
* - $data : Les données de contexte de l'évènement
*
* Valeurs retournées :
* - True : Tout s'est bien passé
* - False : Une erreur est survenue ou la fonction souhaite bloquer le
* processus lors d'un évènement bloquant.
*/
function maFonction (&$ioFormat, &$data) {
// Actions
}
]]></programlisting>
Cette fonction doit accepter deux paramètres, le LSioFormat sur lequel l'évènement survient et un
tableau des données contextuelles de l'évènement. Elle doit par ailleurs retourner
<literal>True</literal> si tout s'est bien passé ou <literal>False</literal> en cas de problème.
Dans le cas d'un événement bloquant, si la fonction retourne <literal>False</literal>, le processus
est arrêté.</para>
<para>Les données contextuelles de l'évènement, passées en paramètre, pourront dépendre du contexte
et de l'évènement déclencheur, mais pour les moments, il s'agit toujours d'un tableau telque décrit
ci-dessous :
<programlisting linenumbering="unnumbered"><![CDATA[array(
'input_file' => "[/path/of/import.file]",
'updateIfExists' => [boolean],
'justTry' => [boolean],
'objectsData' => array(
[Données des objets chargés depuis le fichier d'import]
),
'return' => array(
'success' => [boolean],
'LSobject' => "[nom du type d'LSobject]",
'ioFormat' => "[nom du type d'ioFormat]",
'updateIfExists' => [boolean],
'justTry' => [boolean],
'imported' => array([objets importés]),
'updated' => array([objets mis à jour]),
'errors' => array(
array(
'data' => [données de l'objet importé ayant déclenché l'erreur],
'errors' => array (
'globals' => array("Erreur 1", [...]),
'attrs' => array(
'attr1' => array("Erreur 1", [...]),
[...]
),
),
),
[...]
),
),
)]]></programlisting>
<note><simpara>Les clés <literal>objectsData</literal> et <literal>return</literal> sont des références.
En cas de modification, cela influencera respectivement sur les données utilisées pour l'import et
sur le résultat de l'import tel qu'affiché dans l'interface.</simpara></note>
</para>
</sect4>
</sect3>
</sect2> </sect2>

View file

@ -85,6 +85,16 @@ $GLOBALS['LSobjects']['LSpeople'] = array (
return array(strval(LS_SAMBA_INFINITY_TIME)); return array(strval(LS_SAMBA_INFINITY_TIME));
}, },
), ),
'before_import' => function(&$ioFormat, &$data) {
LSsession::addInfo(htmlentities("$ioFormat: Before import test"));
return true;
},
'after_import' => array(
function(&$ioFormat, &$data) {
LSsession::addInfo(htmlentities("$ioFormat: After import test"));
return true;
},
),
), ),
'myfullcsv' => array ( 'myfullcsv' => array (
'label' => 'Complete CSV', 'label' => 'Complete CSV',

View file

@ -231,6 +231,23 @@ class LSio extends LSlog_staticLoggerClass {
// with a minimum of 30 seconds // with a minimum of 30 seconds
set_time_limit((count($objectsData)>30?count($objectsData):30)); set_time_limit((count($objectsData)>30?count($objectsData):30));
// Trigger before_import event
if (
!$ioFormat -> fireEvent(
'before_import',
array(
'input_file' => $input_file,
'updateIfExists' => $updateIfExists,
'justTry' => $justTry,
'objectsData' => &$objectsData,
'return' => &$return,
)
)
) {
LSerror :: addErrorCode('LSio_08');
return $return;
}
// Browse inputed objects // Browse inputed objects
foreach($objectsData as $objData) { foreach($objectsData as $objData) {
$globalErrors = array(); $globalErrors = array();
@ -332,6 +349,22 @@ class LSio extends LSlog_staticLoggerClass {
} }
$return['errors'] = $objectsInError; $return['errors'] = $objectsInError;
$return['success'] = empty($objectsInError); $return['success'] = empty($objectsInError);
// Trigger after_import event
if (
!$ioFormat -> fireEvent(
'after_import',
array(
'input_file' => $input_file,
'updateIfExists' => $updateIfExists,
'justTry' => $justTry,
'objectsData' => &$objectsData,
'return' => &$return,
)
)
)
LSerror :: addErrorCode('LSio_09');
return $return; return $return;
} }
@ -708,6 +741,12 @@ ___("LSio: Fail to load objects's data to export from LDAP directory.")
LSerror :: defineError('LSio_07', LSerror :: defineError('LSio_07',
___("LSio: Fail to export objects's data.") ___("LSio: Fail to export objects's data.")
); );
LSerror :: defineError('LSio_08',
___("LSio: An error occured running before import hooks. Stop the import.")
);
LSerror :: defineError('LSio_09',
___("LSio: An error occured running after import hooks.")
);
// Defined CLI commands functions only on CLI context // Defined CLI commands functions only on CLI context
if (php_sapi_name() != 'cli') if (php_sapi_name() != 'cli')

View file

@ -29,6 +29,18 @@ LSsession :: loadLSclass('LSlog_staticLoggerClass');
*/ */
class LSioFormat extends LSlog_staticLoggerClass { class LSioFormat extends LSlog_staticLoggerClass {
/**
* LSobject type name
* @var string
*/
var $LSobject;
/**
* ioFormat name
* @var string
*/
var $name;
/** /**
* Configuration of the IOformat * Configuration of the IOformat
* (LSobjects.<type>.ioFormat.<name>) * (LSobjects.<type>.ioFormat.<name>)
@ -56,6 +68,8 @@ class LSioFormat extends LSlog_staticLoggerClass {
* @return void * @return void
**/ **/
public function __construct($LSobject, $ioFormat) { public function __construct($LSobject, $ioFormat) {
$this -> LSobject = $LSobject;
$this -> name = $ioFormat;
$conf = LSconfig::get('LSobjects.'.$LSobject.".ioFormat.".$ioFormat); $conf = LSconfig::get('LSobjects.'.$LSobject.".ioFormat.".$ioFormat);
if(is_array($conf)) { if(is_array($conf)) {
$this -> config = $conf; $this -> config = $conf;
@ -165,6 +179,45 @@ class LSioFormat extends LSlog_staticLoggerClass {
return $this -> driver -> exportObjectsData($objects_data, $stream); return $this -> driver -> exportObjectsData($objects_data, $stream);
} }
/**
* Trigger action to run to specified event
*
* @param string $event The event name
* @param string $evenData The event context data (optional, default: null)
*
* @return boolean True on success, False otherwise
*/
public function fireEvent($event, $evenData=null) {
self :: log_debug(strval($this)." -> fireEvent($event)");
$return = true;
if(isset($this -> config[$event])) {
foreach(ensureIsArray($this -> config[$event]) as $func) {
if(is_callable($func)) {
self :: log_debug(strval($this)." -> fireEvent($event): run ".format_callable($func));
if(!call_user_func_array($func, array(&$this, &$evenData))) {
$return = false;
}
}
else {
self :: log_warning(strval($this)." -> fireEvent($event): function '".format_callable($func)."' doesn't exists.");
$return = false;
}
}
}
else
self :: log_trace(strval($this)." -> fireEvent($event): no configured trigger for this event.");
return $return;
}
/**
* Allow conversion of LSioFormat to string
*
* @return string The string representation of the LSioFormat
*/
public function __toString() {
return "<LSioFormat ".$this -> name." on ".$this -> LSobject.">";
}
} }
LSerror :: defineError('LSioFormat_01', LSerror :: defineError('LSioFormat_01',

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: LdapSaisie\n" "Project-Id-Version: LdapSaisie\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: \n" "POT-Creation-Date: \n"
"PO-Revision-Date: 2023-03-28 12:20+0200\n" "PO-Revision-Date: 2023-05-17 11:36+0200\n"
"Last-Translator: Benjamin Renard <brenard@easter-eggs.com>\n" "Last-Translator: Benjamin Renard <brenard@easter-eggs.com>\n"
"Language-Team: LdapSaisie <ldapsaisie-users@lists.labs.libre-entreprise." "Language-Team: LdapSaisie <ldapsaisie-users@lists.labs.libre-entreprise."
"org>\n" "org>\n"
@ -435,7 +435,7 @@ msgid "Show LdapSaisie modifications"
msgstr "Voir les modifications d'LdapSaisie" msgstr "Voir les modifications d'LdapSaisie"
#: includes/addons/LSaddons.accesslog.php:244 #: includes/addons/LSaddons.accesslog.php:244
#: includes/class/class.LSsession.php:1855 includes/routes.php:157 #: includes/class/class.LSsession.php:1870 includes/routes.php:157
#: includes/routes.php:470 templates/default/select.tpl:29 #: includes/routes.php:470 templates/default/select.tpl:29
msgid "Refresh" msgid "Refresh"
msgstr "Rafraîchir" msgstr "Rafraîchir"
@ -752,82 +752,94 @@ msgstr "Valeur invalide"
msgid "LSformRule_%{type}: Parameter %{param} is not found." msgid "LSformRule_%{type}: Parameter %{param} is not found."
msgstr "LSformRule_%{type} : Le paramètre %{param} n'est pas défini." msgstr "LSformRule_%{type} : Le paramètre %{param} n'est pas défini."
#: includes/class/class.LSio.php:244 #: includes/class/class.LSio.php:261
msgid "Failed to set post data on creation form." msgid "Failed to set post data on creation form."
msgstr "Impossible de définir les données dans le formulaire de création." msgstr "Impossible de définir les données dans le formulaire de création."
#: includes/class/class.LSio.php:250 #: includes/class/class.LSio.php:267
msgid "Error validating creation form." msgid "Error validating creation form."
msgstr "Une erreur est survenue en validant le formulaire de création." msgstr "Une erreur est survenue en validant le formulaire de création."
#: includes/class/class.LSio.php:255 #: includes/class/class.LSio.php:272
msgid "Failed to validate object data." msgid "Failed to validate object data."
msgstr "Impossible de valider les données de l'objet." msgstr "Impossible de valider les données de l'objet."
#: includes/class/class.LSio.php:262 #: includes/class/class.LSio.php:279
msgid "Failed to generate DN for this object." msgid "Failed to generate DN for this object."
msgstr "Impossible de générer le DN de cet objet." msgstr "Impossible de générer le DN de cet objet."
#: includes/class/class.LSio.php:276 #: includes/class/class.LSio.php:293
msgid "Error creating object on LDAP server." msgid "Error creating object on LDAP server."
msgstr "Une erreur est survenue en création cet objet dans l'annuaire LDAP." msgstr "Une erreur est survenue en création cet objet dans l'annuaire LDAP."
#: includes/class/class.LSio.php:282 #: includes/class/class.LSio.php:299
msgid "An object already exist on LDAP server with DN %{dn}." msgid "An object already exist on LDAP server with DN %{dn}."
msgstr "Un objet existe déjà dans l'annuaire LDAP avec le DN %{dn}." msgstr "Un objet existe déjà dans l'annuaire LDAP avec le DN %{dn}."
#: includes/class/class.LSio.php:294 #: includes/class/class.LSio.php:311
msgid "" msgid ""
"Failed to load existing object %{dn} from LDAP server. Can't update object." "Failed to load existing object %{dn} from LDAP server. Can't update object."
msgstr "" msgstr ""
"Impossible de charger l'objet existant %{dn} depuis l'annuaire LDAP. " "Impossible de charger l'objet existant %{dn} depuis l'annuaire LDAP. "
"Impossible de mettre à jour cet objet." "Impossible de mettre à jour cet objet."
#: includes/class/class.LSio.php:303 #: includes/class/class.LSio.php:320
msgid "Failed to set post data on update form." msgid "Failed to set post data on update form."
msgstr "Impossible de définir les données dans le formulaire de mise à jour." msgstr "Impossible de définir les données dans le formulaire de mise à jour."
#: includes/class/class.LSio.php:309 #: includes/class/class.LSio.php:326
msgid "Error validating update form." msgid "Error validating update form."
msgstr "Une erreur est survenue en validant le formulaire de mise à jour." msgstr "Une erreur est survenue en validant le formulaire de mise à jour."
#: includes/class/class.LSio.php:319 #: includes/class/class.LSio.php:336
msgid "Error updating object on LDAP server." msgid "Error updating object on LDAP server."
msgstr "" msgstr ""
"Une erreur est survenue en mettant à jour cet objet dans l'annuaire LDAP." "Une erreur est survenue en mettant à jour cet objet dans l'annuaire LDAP."
#: includes/class/class.LSio.php:691 #: includes/class/class.LSio.php:724
msgid "LSio: Post data not found or not completed." msgid "LSio: Post data not found or not completed."
msgstr "LSio : les données transmises sont introuvables ou incomplètes." msgstr "LSio : les données transmises sont introuvables ou incomplètes."
#: includes/class/class.LSio.php:694 #: includes/class/class.LSio.php:727
msgid "LSio: object type invalid." msgid "LSio: object type invalid."
msgstr "LSio : type d'objet invalide." msgstr "LSio : type d'objet invalide."
#: includes/class/class.LSio.php:697 #: includes/class/class.LSio.php:730
msgid "LSio: input/output format %{format} invalid." msgid "LSio: input/output format %{format} invalid."
msgstr "LSio : Le format d'entrée/sortie %{format} est invalide." msgstr "LSio : Le format d'entrée/sortie %{format} est invalide."
#: includes/class/class.LSio.php:700 #: includes/class/class.LSio.php:733
msgid "LSio: Fail to initialize input/output driver." msgid "LSio: Fail to initialize input/output driver."
msgstr "LSio : Impossible d'initialiser le pilote d'entrée/sortie." msgstr "LSio : Impossible d'initialiser le pilote d'entrée/sortie."
#: includes/class/class.LSio.php:703 #: includes/class/class.LSio.php:736
msgid "LSio: Fail to load objects's data from input file." msgid "LSio: Fail to load objects's data from input file."
msgstr "" msgstr ""
"LSio: Impossible de charger les données des objets depuis le fichier " "LSio: Impossible de charger les données des objets depuis le fichier "
"d'import." "d'import."
#: includes/class/class.LSio.php:706 #: includes/class/class.LSio.php:739
msgid "LSio: Fail to load objects's data to export from LDAP directory." msgid "LSio: Fail to load objects's data to export from LDAP directory."
msgstr "" msgstr ""
"LSio: Impossible de charger les données des objets à exporter depuis " "LSio: Impossible de charger les données des objets à exporter depuis "
"l'annuaire LDAP." "l'annuaire LDAP."
#: includes/class/class.LSio.php:709 #: includes/class/class.LSio.php:742
msgid "LSio: Fail to export objects's data." msgid "LSio: Fail to export objects's data."
msgstr "LSio: Impossible d'exporter les données des objets." msgstr "LSio: Impossible d'exporter les données des objets."
#: includes/class/class.LSio.php:745
msgid "LSio: An error occured running before import hooks. Stop the import."
msgstr ""
"LSio : Une erreur est survenue durant l'exécution des déclencheurs d'avant "
"import. Arrêt de l'import."
#: includes/class/class.LSio.php:748
msgid "LSio: An error occured running after import hooks."
msgstr ""
"LSio : Une erreur est survenue durant l'exécution des déclencheurs d'après "
"import."
#: includes/class/class.LSformElement_supannRessourceEtatDate.php:61 #: includes/class/class.LSformElement_supannRessourceEtatDate.php:61
msgid "Start date" msgid "Start date"
msgstr "Date de début" msgstr "Date de début"
@ -1499,40 +1511,40 @@ msgstr ""
msgid "Clear" msgid "Clear"
msgstr "Nettoyer" msgstr "Nettoyer"
#: includes/class/class.LSsession.php:1640 #: includes/class/class.LSsession.php:1655
msgid "Connection" msgid "Connection"
msgstr "Connexion" msgstr "Connexion"
#: includes/class/class.LSsession.php:1660 #: includes/class/class.LSsession.php:1675
msgid "Recovery of your credentials" msgid "Recovery of your credentials"
msgstr "Récupération de votre mot de passe" msgstr "Récupération de votre mot de passe"
#: includes/class/class.LSsession.php:1669 #: includes/class/class.LSsession.php:1684
msgid "Please fill the identifier field to proceed recovery procedure" msgid "Please fill the identifier field to proceed recovery procedure"
msgstr "" msgstr ""
"Merci d'entrer votre identifiant pour poursuivre la procédure de récupération" "Merci d'entrer votre identifiant pour poursuivre la procédure de récupération"
#: includes/class/class.LSsession.php:1674 #: includes/class/class.LSsession.php:1689
msgid "" msgid ""
"An email has been sent to %{mail}. Please follow the instructions on it." "An email has been sent to %{mail}. Please follow the instructions on it."
msgstr "" msgstr ""
"Un e-mail vient de vous être envoyé à l'adresse %{mail}. Merci de suivre les " "Un e-mail vient de vous être envoyé à l'adresse %{mail}. Merci de suivre les "
"indications qu'il contient." "indications qu'il contient."
#: includes/class/class.LSsession.php:1683 #: includes/class/class.LSsession.php:1698
msgid "Your new password has been sent to %{mail}." msgid "Your new password has been sent to %{mail}."
msgstr "Votre nouveau mot de passe vous a été envoyé à l'adresse %{mail}." msgstr "Votre nouveau mot de passe vous a été envoyé à l'adresse %{mail}."
#: includes/class/class.LSsession.php:2945 templates/default/select.tpl:20 #: includes/class/class.LSsession.php:2960 templates/default/select.tpl:20
#: templates/default/recoverpassword.tpl:17 templates/default/login.tpl:16 #: templates/default/recoverpassword.tpl:17 templates/default/login.tpl:16
msgid "Level" msgid "Level"
msgstr "Niveau" msgstr "Niveau"
#: includes/class/class.LSsession.php:3113 #: includes/class/class.LSsession.php:3128
msgid "LSsession : The constant '%{const}' is not defined." msgid "LSsession : The constant '%{const}' is not defined."
msgstr "LSsession : La constante '%{const}' n'est pas définie." msgstr "LSsession : La constante '%{const}' n'est pas définie."
#: includes/class/class.LSsession.php:3116 #: includes/class/class.LSsession.php:3131
msgid "" msgid ""
"LSsession : The addon '%{addon}' support is uncertain. Verify system " "LSsession : The addon '%{addon}' support is uncertain. Verify system "
"compatibility and the add-on configuration." "compatibility and the add-on configuration."
@ -1540,53 +1552,53 @@ msgstr ""
"LSsession : Le support de l'addon '%{addon}' est incertain. Vérifiez la " "LSsession : Le support de l'addon '%{addon}' est incertain. Vérifiez la "
"compatibilité du système et la configuration de l'add-on." "compatibilité du système et la configuration de l'add-on."
#: includes/class/class.LSsession.php:3119 #: includes/class/class.LSsession.php:3134
msgid "" msgid ""
"LSsession : LDAP server's configuration data are invalid. Can't connect." "LSsession : LDAP server's configuration data are invalid. Can't connect."
msgstr "" msgstr ""
"LSsession : Les données de configuration du serveur LDAP sont invalide. " "LSsession : Les données de configuration du serveur LDAP sont invalide. "
"Impossible de s'y connecter." "Impossible de s'y connecter."
#: includes/class/class.LSsession.php:3122 #: includes/class/class.LSsession.php:3137
msgid "LSsession : Failed to load LSobject type '%{type}' : unknon type." msgid "LSsession : Failed to load LSobject type '%{type}' : unknon type."
msgstr "" msgstr ""
"LSsession : Impossible de charger le type d'LSobject '%{type}' : type " "LSsession : Impossible de charger le type d'LSobject '%{type}' : type "
"inconnu." "inconnu."
#: includes/class/class.LSsession.php:3125 #: includes/class/class.LSsession.php:3140
msgid "LSsession : Failed to load LSclass '%{class}'." msgid "LSsession : Failed to load LSclass '%{class}'."
msgstr "LSsession : Impossible de charger la LSclass '%{class}'." msgstr "LSsession : Impossible de charger la LSclass '%{class}'."
#: includes/class/class.LSsession.php:3128 #: includes/class/class.LSsession.php:3143
msgid "LSsession : Login or password incorrect." msgid "LSsession : Login or password incorrect."
msgstr "LSsession : Identifiant ou mot de passe incorrects." msgstr "LSsession : Identifiant ou mot de passe incorrects."
#: includes/class/class.LSsession.php:3131 #: includes/class/class.LSsession.php:3146
msgid "LSsession : Impossible to identify you : Duplication of identities." msgid "LSsession : Impossible to identify you : Duplication of identities."
msgstr "LSsession : Impossible de vous identifier : Duplication d'identité." msgstr "LSsession : Impossible de vous identifier : Duplication d'identité."
#: includes/class/class.LSsession.php:3134 #: includes/class/class.LSsession.php:3149
msgid "LSsession : Can't load class of authentification (%{class})." msgid "LSsession : Can't load class of authentification (%{class})."
msgstr "" msgstr ""
"LSsession : Impossible de charger la classe d'authentification (%{class})." "LSsession : Impossible de charger la classe d'authentification (%{class})."
#: includes/class/class.LSsession.php:3137 #: includes/class/class.LSsession.php:3152
msgid "LSsession : Can't connect to LDAP server." msgid "LSsession : Can't connect to LDAP server."
msgstr "LSsession : Impossible de se connecter au serveur LDAP." msgstr "LSsession : Impossible de se connecter au serveur LDAP."
#: includes/class/class.LSsession.php:3140 #: includes/class/class.LSsession.php:3155
msgid "LSsession : Impossible to authenticate you." msgid "LSsession : Impossible to authenticate you."
msgstr "LSsession : Impossible de vous identifier." msgstr "LSsession : Impossible de vous identifier."
#: includes/class/class.LSsession.php:3143 #: includes/class/class.LSsession.php:3158
msgid "LSsession : Your are not authorized to do this action." msgid "LSsession : Your are not authorized to do this action."
msgstr "LSsession : Vous n'êtes pas autorisé à faire cette action." msgstr "LSsession : Vous n'êtes pas autorisé à faire cette action."
#: includes/class/class.LSsession.php:3146 #: includes/class/class.LSsession.php:3161
msgid "LSsession : Some informations are missing to display this page." msgid "LSsession : Some informations are missing to display this page."
msgstr "LSsession : Des informations sont manquantes pour afficher cette page." msgstr "LSsession : Des informations sont manquantes pour afficher cette page."
#: includes/class/class.LSsession.php:3149 #: includes/class/class.LSsession.php:3164
msgid "" msgid ""
"LSsession : The function '%{function}' of the custom action " "LSsession : The function '%{function}' of the custom action "
"'%{customAction}' does not exists or is not configured." "'%{customAction}' does not exists or is not configured."
@ -1594,24 +1606,24 @@ msgstr ""
"LSsession : La fonction '%{function}' de l'action personnalisée " "LSsession : La fonction '%{function}' de l'action personnalisée "
"'%{customAction}' n'existe pas ou n'est pas configurée." "'%{customAction}' n'existe pas ou n'est pas configurée."
#: includes/class/class.LSsession.php:3152 #: includes/class/class.LSsession.php:3167
msgid "LSsession : Fail to retrieve user's LDAP credentials from LSauth." msgid "LSsession : Fail to retrieve user's LDAP credentials from LSauth."
msgstr "" msgstr ""
"LSsession : Erreur en récupérant les identifiants LDAP de l'utilisateur " "LSsession : Erreur en récupérant les identifiants LDAP de l'utilisateur "
"depuis LSauth." "depuis LSauth."
#: includes/class/class.LSsession.php:3155 #: includes/class/class.LSsession.php:3170
msgid "" msgid ""
"LSsession : Fail to reconnect to LDAP server with user's LDAP credentials." "LSsession : Fail to reconnect to LDAP server with user's LDAP credentials."
msgstr "" msgstr ""
"LSsession : Impossible de se reconnecter au serveur LDAP avec les " "LSsession : Impossible de se reconnecter au serveur LDAP avec les "
"identifiants de l'utilisateur." "identifiants de l'utilisateur."
#: includes/class/class.LSsession.php:3158 #: includes/class/class.LSsession.php:3173
msgid "LSsession : No import/export format define for this object type." msgid "LSsession : No import/export format define for this object type."
msgstr "LSsession : Aucun format d'entrée/sortie défini pour ce type d'objet." msgstr "LSsession : Aucun format d'entrée/sortie défini pour ce type d'objet."
#: includes/class/class.LSsession.php:3161 #: includes/class/class.LSsession.php:3176
msgid "" msgid ""
"LSsession : Error during creation of list of levels. Contact administrators. " "LSsession : Error during creation of list of levels. Contact administrators. "
"(Code : %{code})" "(Code : %{code})"
@ -1619,13 +1631,13 @@ msgstr ""
"LSsession : Erreur durant la création de la liste des niveaux. Contacter les " "LSsession : Erreur durant la création de la liste des niveaux. Contacter les "
"administrateurs. (Code : %{type})" "administrateurs. (Code : %{type})"
#: includes/class/class.LSsession.php:3164 #: includes/class/class.LSsession.php:3179
msgid "LSsession : The password recovery is disabled for this LDAP server." msgid "LSsession : The password recovery is disabled for this LDAP server."
msgstr "" msgstr ""
"LSsession : La récupération de mot de passe est désactivée pour ce serveur " "LSsession : La récupération de mot de passe est désactivée pour ce serveur "
"LDAP." "LDAP."
#: includes/class/class.LSsession.php:3167 #: includes/class/class.LSsession.php:3182
msgid "" msgid ""
"LSsession : Some informations are missing to recover your password. Contact " "LSsession : Some informations are missing to recover your password. Contact "
"administrators." "administrators."
@ -1633,7 +1645,7 @@ msgstr ""
"LSsession : Des informations sont manques pour pouvoir récupérer votre mot " "LSsession : Des informations sont manques pour pouvoir récupérer votre mot "
"de passe. Contacter les administrateurs." "de passe. Contacter les administrateurs."
#: includes/class/class.LSsession.php:3170 #: includes/class/class.LSsession.php:3185
msgid "" msgid ""
"LSsession : Error during password recovery. Contact administrators.(Step : " "LSsession : Error during password recovery. Contact administrators.(Step : "
"%{step})" "%{step})"
@ -1641,7 +1653,7 @@ msgstr ""
"LSsession : Erreur durant la récupération de votre mot de passe. Contacter " "LSsession : Erreur durant la récupération de votre mot de passe. Contacter "
"les administrateurs. (Etape : %{step})" "les administrateurs. (Etape : %{step})"
#: includes/class/class.LSsession.php:3173 #: includes/class/class.LSsession.php:3188
msgid "" msgid ""
"LSsession : The function '%{func}' configured for the view '%{view}' of the " "LSsession : The function '%{func}' configured for the view '%{view}' of the "
"LSaddon '%{addon}' is not declared in the LSaddon file." "LSaddon '%{addon}' is not declared in the LSaddon file."
@ -1649,11 +1661,11 @@ msgstr ""
"LSsession : la fonction '%{func}' configurée pour la vue '%{view}' du " "LSsession : la fonction '%{func}' configurée pour la vue '%{view}' du "
"LSaddon '%{addon}' n'est pas déclaré dans le fichier du LSaddon." "LSaddon '%{addon}' n'est pas déclaré dans le fichier du LSaddon."
#: includes/class/class.LSsession.php:3176 #: includes/class/class.LSsession.php:3191
msgid "LSsession : Failed to load resource file '%{file}'." msgid "LSsession : Failed to load resource file '%{file}'."
msgstr "LSsession : Impossible de charger le fichier de ressource '%{file}'." msgstr "LSsession : Impossible de charger le fichier de ressource '%{file}'."
#: includes/class/class.LSsession.php:3179 #: includes/class/class.LSsession.php:3194
msgid "" msgid ""
"LSsession : The function '%{func}' configured for the view '%{view}' of the " "LSsession : The function '%{func}' configured for the view '%{view}' of the "
"LSaddon '%{addon}' doesn't exist." "LSaddon '%{addon}' doesn't exist."
@ -1661,11 +1673,11 @@ msgstr ""
"LSsession : la fonction '%{func}' configurée pour la vue '%{view}' du " "LSsession : la fonction '%{func}' configurée pour la vue '%{view}' du "
"LSaddon '%{addon}' n'existe pas." "LSaddon '%{addon}' n'existe pas."
#: includes/class/class.LSsession.php:3182 #: includes/class/class.LSsession.php:3197
msgid "LSsession : invalid related object's DN pass in parameter." msgid "LSsession : invalid related object's DN pass in parameter."
msgstr "LSsession : DN d'objet en relation incorrect dans les paramètres." msgstr "LSsession : DN d'objet en relation incorrect dans les paramètres."
#: includes/class/class.LSsession.php:3185 #: includes/class/class.LSsession.php:3200
msgid "" msgid ""
"LSsession : the LSaddon %{addon} keep using old-style addon view URL. Please " "LSsession : the LSaddon %{addon} keep using old-style addon view URL. Please "
"upgrade it." "upgrade it."
@ -1673,7 +1685,7 @@ msgstr ""
"LSsession : le LSaddon %{addon} utilise toujours l'ancien type d'URL de " "LSsession : le LSaddon %{addon} utilise toujours l'ancien type d'URL de "
"vues. Merci de le mettre à jour." "vues. Merci de le mettre à jour."
#: includes/class/class.LSsession.php:3188 #: includes/class/class.LSsession.php:3203
msgid "" msgid ""
"LSsession : You have been redirect from an old-style URL %{url}. Please " "LSsession : You have been redirect from an old-style URL %{url}. Please "
"upgrade this link." "upgrade this link."
@ -1681,7 +1693,7 @@ msgstr ""
"LSsession : Vous avez été redirigé depuis une ancienne URL %{url}. Merci de " "LSsession : Vous avez été redirigé depuis une ancienne URL %{url}. Merci de "
"le mettre à jour ce lien." "le mettre à jour ce lien."
#: includes/class/class.LSsession.php:3191 #: includes/class/class.LSsession.php:3206
msgid "" msgid ""
"LSsession : You always seem to use %{old} in your custom code: Please " "LSsession : You always seem to use %{old} in your custom code: Please "
"upgrade it and use %{new}.<pre>\n" "upgrade it and use %{new}.<pre>\n"
@ -3163,7 +3175,7 @@ msgstr ""
"LSsearchEntry : formaterFunction %{func} invalide utilisé pour " "LSsearchEntry : formaterFunction %{func} invalide utilisé pour "
"l'extraDisplayedColumns %{column}." "l'extraDisplayedColumns %{column}."
#: includes/class/class.LSioFormat.php:171 #: includes/class/class.LSioFormat.php:224
msgid "LSioFormat : IOformat driver %{driver} invalid or unavailable." msgid "LSioFormat : IOformat driver %{driver} invalid or unavailable."
msgstr "" msgstr ""
"LSioFormat : Le pilote d'IOformat %{driver} est invalide ou n'est pas " "LSioFormat : Le pilote d'IOformat %{driver} est invalide ou n'est pas "

View file

@ -359,7 +359,7 @@ msgid "Show LdapSaisie modifications"
msgstr "" msgstr ""
#: includes/addons/LSaddons.accesslog.php:244 #: includes/addons/LSaddons.accesslog.php:244
#: includes/class/class.LSsession.php:1855 includes/routes.php:157 #: includes/class/class.LSsession.php:1870 includes/routes.php:157
#: includes/routes.php:470 templates/default/select.tpl:29 #: includes/routes.php:470 templates/default/select.tpl:29
msgid "Refresh" msgid "Refresh"
msgstr "" msgstr ""
@ -638,75 +638,83 @@ msgstr ""
msgid "LSformRule_%{type}: Parameter %{param} is not found." msgid "LSformRule_%{type}: Parameter %{param} is not found."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:244 #: includes/class/class.LSio.php:261
msgid "Failed to set post data on creation form." msgid "Failed to set post data on creation form."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:250 #: includes/class/class.LSio.php:267
msgid "Error validating creation form." msgid "Error validating creation form."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:255 #: includes/class/class.LSio.php:272
msgid "Failed to validate object data." msgid "Failed to validate object data."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:262 #: includes/class/class.LSio.php:279
msgid "Failed to generate DN for this object." msgid "Failed to generate DN for this object."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:276 #: includes/class/class.LSio.php:293
msgid "Error creating object on LDAP server." msgid "Error creating object on LDAP server."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:282 #: includes/class/class.LSio.php:299
msgid "An object already exist on LDAP server with DN %{dn}." msgid "An object already exist on LDAP server with DN %{dn}."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:294 #: includes/class/class.LSio.php:311
msgid "" msgid ""
"Failed to load existing object %{dn} from LDAP server. Can't update object." "Failed to load existing object %{dn} from LDAP server. Can't update object."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:303 #: includes/class/class.LSio.php:320
msgid "Failed to set post data on update form." msgid "Failed to set post data on update form."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:309 #: includes/class/class.LSio.php:326
msgid "Error validating update form." msgid "Error validating update form."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:319 #: includes/class/class.LSio.php:336
msgid "Error updating object on LDAP server." msgid "Error updating object on LDAP server."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:691 #: includes/class/class.LSio.php:724
msgid "LSio: Post data not found or not completed." msgid "LSio: Post data not found or not completed."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:694 #: includes/class/class.LSio.php:727
msgid "LSio: object type invalid." msgid "LSio: object type invalid."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:697 #: includes/class/class.LSio.php:730
msgid "LSio: input/output format %{format} invalid." msgid "LSio: input/output format %{format} invalid."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:700 #: includes/class/class.LSio.php:733
msgid "LSio: Fail to initialize input/output driver." msgid "LSio: Fail to initialize input/output driver."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:703 #: includes/class/class.LSio.php:736
msgid "LSio: Fail to load objects's data from input file." msgid "LSio: Fail to load objects's data from input file."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:706 #: includes/class/class.LSio.php:739
msgid "LSio: Fail to load objects's data to export from LDAP directory." msgid "LSio: Fail to load objects's data to export from LDAP directory."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:709 #: includes/class/class.LSio.php:742
msgid "LSio: Fail to export objects's data." msgid "LSio: Fail to export objects's data."
msgstr "" msgstr ""
#: includes/class/class.LSio.php:745
msgid "LSio: An error occured running before import hooks. Stop the import."
msgstr ""
#: includes/class/class.LSio.php:748
msgid "LSio: An error occured running after import hooks."
msgstr ""
#: includes/class/class.LSformElement_supannRessourceEtatDate.php:61 #: includes/class/class.LSformElement_supannRessourceEtatDate.php:61
msgid "Start date" msgid "Start date"
msgstr "" msgstr ""
@ -1282,157 +1290,157 @@ msgstr ""
msgid "Clear" msgid "Clear"
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:1640 #: includes/class/class.LSsession.php:1655
msgid "Connection" msgid "Connection"
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:1660 #: includes/class/class.LSsession.php:1675
msgid "Recovery of your credentials" msgid "Recovery of your credentials"
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:1669 #: includes/class/class.LSsession.php:1684
msgid "Please fill the identifier field to proceed recovery procedure" msgid "Please fill the identifier field to proceed recovery procedure"
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:1674 #: includes/class/class.LSsession.php:1689
msgid "" msgid ""
"An email has been sent to %{mail}. Please follow the instructions on it." "An email has been sent to %{mail}. Please follow the instructions on it."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:1683 #: includes/class/class.LSsession.php:1698
msgid "Your new password has been sent to %{mail}." msgid "Your new password has been sent to %{mail}."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:2945 templates/default/select.tpl:20 #: includes/class/class.LSsession.php:2960 templates/default/select.tpl:20
#: templates/default/recoverpassword.tpl:17 templates/default/login.tpl:16 #: templates/default/recoverpassword.tpl:17 templates/default/login.tpl:16
msgid "Level" msgid "Level"
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3113 #: includes/class/class.LSsession.php:3128
msgid "LSsession : The constant '%{const}' is not defined." msgid "LSsession : The constant '%{const}' is not defined."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3116 #: includes/class/class.LSsession.php:3131
msgid "" msgid ""
"LSsession : The addon '%{addon}' support is uncertain. Verify system " "LSsession : The addon '%{addon}' support is uncertain. Verify system "
"compatibility and the add-on configuration." "compatibility and the add-on configuration."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3119 #: includes/class/class.LSsession.php:3134
msgid "" msgid ""
"LSsession : LDAP server's configuration data are invalid. Can't connect." "LSsession : LDAP server's configuration data are invalid. Can't connect."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3122 #: includes/class/class.LSsession.php:3137
msgid "LSsession : Failed to load LSobject type '%{type}' : unknon type." msgid "LSsession : Failed to load LSobject type '%{type}' : unknon type."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3125 #: includes/class/class.LSsession.php:3140
msgid "LSsession : Failed to load LSclass '%{class}'." msgid "LSsession : Failed to load LSclass '%{class}'."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3128 #: includes/class/class.LSsession.php:3143
msgid "LSsession : Login or password incorrect." msgid "LSsession : Login or password incorrect."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3131 #: includes/class/class.LSsession.php:3146
msgid "LSsession : Impossible to identify you : Duplication of identities." msgid "LSsession : Impossible to identify you : Duplication of identities."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3134 #: includes/class/class.LSsession.php:3149
msgid "LSsession : Can't load class of authentification (%{class})." msgid "LSsession : Can't load class of authentification (%{class})."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3137 #: includes/class/class.LSsession.php:3152
msgid "LSsession : Can't connect to LDAP server." msgid "LSsession : Can't connect to LDAP server."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3140 #: includes/class/class.LSsession.php:3155
msgid "LSsession : Impossible to authenticate you." msgid "LSsession : Impossible to authenticate you."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3143 #: includes/class/class.LSsession.php:3158
msgid "LSsession : Your are not authorized to do this action." msgid "LSsession : Your are not authorized to do this action."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3146 #: includes/class/class.LSsession.php:3161
msgid "LSsession : Some informations are missing to display this page." msgid "LSsession : Some informations are missing to display this page."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3149 #: includes/class/class.LSsession.php:3164
msgid "" msgid ""
"LSsession : The function '%{function}' of the custom action " "LSsession : The function '%{function}' of the custom action "
"'%{customAction}' does not exists or is not configured." "'%{customAction}' does not exists or is not configured."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3152 #: includes/class/class.LSsession.php:3167
msgid "LSsession : Fail to retrieve user's LDAP credentials from LSauth." msgid "LSsession : Fail to retrieve user's LDAP credentials from LSauth."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3155 #: includes/class/class.LSsession.php:3170
msgid "" msgid ""
"LSsession : Fail to reconnect to LDAP server with user's LDAP credentials." "LSsession : Fail to reconnect to LDAP server with user's LDAP credentials."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3158 #: includes/class/class.LSsession.php:3173
msgid "LSsession : No import/export format define for this object type." msgid "LSsession : No import/export format define for this object type."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3161 #: includes/class/class.LSsession.php:3176
msgid "" msgid ""
"LSsession : Error during creation of list of levels. Contact administrators. " "LSsession : Error during creation of list of levels. Contact administrators. "
"(Code : %{code})" "(Code : %{code})"
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3164 #: includes/class/class.LSsession.php:3179
msgid "LSsession : The password recovery is disabled for this LDAP server." msgid "LSsession : The password recovery is disabled for this LDAP server."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3167 #: includes/class/class.LSsession.php:3182
msgid "" msgid ""
"LSsession : Some informations are missing to recover your password. Contact " "LSsession : Some informations are missing to recover your password. Contact "
"administrators." "administrators."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3170 #: includes/class/class.LSsession.php:3185
msgid "" msgid ""
"LSsession : Error during password recovery. Contact administrators.(Step : " "LSsession : Error during password recovery. Contact administrators.(Step : "
"%{step})" "%{step})"
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3173 #: includes/class/class.LSsession.php:3188
msgid "" msgid ""
"LSsession : The function '%{func}' configured for the view '%{view}' of the " "LSsession : The function '%{func}' configured for the view '%{view}' of the "
"LSaddon '%{addon}' is not declared in the LSaddon file." "LSaddon '%{addon}' is not declared in the LSaddon file."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3176 #: includes/class/class.LSsession.php:3191
msgid "LSsession : Failed to load resource file '%{file}'." msgid "LSsession : Failed to load resource file '%{file}'."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3179 #: includes/class/class.LSsession.php:3194
msgid "" msgid ""
"LSsession : The function '%{func}' configured for the view '%{view}' of the " "LSsession : The function '%{func}' configured for the view '%{view}' of the "
"LSaddon '%{addon}' doesn't exist." "LSaddon '%{addon}' doesn't exist."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3182 #: includes/class/class.LSsession.php:3197
msgid "LSsession : invalid related object's DN pass in parameter." msgid "LSsession : invalid related object's DN pass in parameter."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3185 #: includes/class/class.LSsession.php:3200
msgid "" msgid ""
"LSsession : the LSaddon %{addon} keep using old-style addon view URL. Please " "LSsession : the LSaddon %{addon} keep using old-style addon view URL. Please "
"upgrade it." "upgrade it."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3188 #: includes/class/class.LSsession.php:3203
msgid "" msgid ""
"LSsession : You have been redirect from an old-style URL %{url}. Please " "LSsession : You have been redirect from an old-style URL %{url}. Please "
"upgrade this link." "upgrade this link."
msgstr "" msgstr ""
#: includes/class/class.LSsession.php:3191 #: includes/class/class.LSsession.php:3206
msgid "" msgid ""
"LSsession : You always seem to use %{old} in your custom code: Please " "LSsession : You always seem to use %{old} in your custom code: Please "
"upgrade it and use %{new}.<pre>\n" "upgrade it and use %{new}.<pre>\n"
@ -2695,7 +2703,7 @@ msgid ""
"%{column}." "%{column}."
msgstr "" msgstr ""
#: includes/class/class.LSioFormat.php:171 #: includes/class/class.LSioFormat.php:224
msgid "LSioFormat : IOformat driver %{driver} invalid or unavailable." msgid "LSioFormat : IOformat driver %{driver} invalid or unavailable."
msgstr "" msgstr ""