Compare commits

..

No commits in common. "e8921795d3ef097d471bdd05e021f3f6e752907e" and "aa774cbce96a981512611de8879ad8470f2a3237" have entirely different histories.

29 changed files with 340 additions and 525 deletions

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Tiramisu\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-04 15:43+0200\n"
"POT-Creation-Date: 2025-09-19 22:03+0200\n"
"PO-Revision-Date: \n"
"Last-Translator: Emmanuel Garette <egarette@cadoles.com>\n"
"Language-Team: Tiramisu's team <egarette@cadoles.com>\n"
@ -34,7 +34,7 @@ msgstr "Ne peut avoir de warnings durant une validation"
msgid "Commands:"
msgstr "Commandes :"
#: tiramisu/api.py:118 tiramisu/api.py:1963
#: tiramisu/api.py:118 tiramisu/api.py:1955
msgid "please specify a valid sub function ({0}.{1})"
msgstr "veuillez spécifier une sous fonction valide ({0}.{1})"
@ -42,7 +42,7 @@ msgstr "veuillez spécifier une sous fonction valide ({0}.{1})"
msgid "please do not specify index ({0}.{1})"
msgstr "veuillez ne pas spécifier d'index ({0}.{1})"
#: tiramisu/api.py:211 tiramisu/api.py:948
#: tiramisu/api.py:211 tiramisu/api.py:940
msgid "please specify index with a follower option ({0}.{1})"
msgstr "veuillez spécifier un index avec une option suiveuse ({0}.{1})"
@ -50,15 +50,7 @@ msgstr "veuillez spécifier un index avec une option suiveuse ({0}.{1})"
msgid "please specify a valid sub function ({0}.{1}): {2}"
msgstr "veuillez spécifier une sous fonction valide ({0}.{1}): {2}"
#: tiramisu/api.py:447
msgid "optiondescription"
msgstr "option description"
#: tiramisu/api.py:452
msgid "symlink"
msgstr "lien symbolique"
#: tiramisu/api.py:533
#: tiramisu/api.py:525
msgid ""
"the option {0} is not a dynamic option, cannot get identifiers with "
"only_self parameter to True"
@ -66,15 +58,15 @@ msgstr ""
"l'option {0} n'est pas une option dynamique, ne peut retrouver l'identifiant "
"avec le paramètre only_self à True"
#: tiramisu/api.py:621
#: tiramisu/api.py:613
msgid "cannot get option from a follower symlink without index"
msgstr "ne peut avoir d'option pour une symlink suiveuse sans index"
#: tiramisu/api.py:699
#: tiramisu/api.py:691
msgid "cannot add this property: \"{0}\""
msgstr "ne peut pas ajouter cette propriété : \"{0}\""
#: tiramisu/api.py:726
#: tiramisu/api.py:718
msgid ""
"cannot remove option's property \"{0}\", use permissive instead in option "
"\"{1}\""
@ -82,11 +74,11 @@ msgstr ""
"ne supprimer la propriété \"{0}\" de l'option, utiliser plutôt permissive "
"dans l'option \"{1}\""
#: tiramisu/api.py:730
#: tiramisu/api.py:722
msgid "cannot find \"{0}\" in option \"{1}\""
msgstr "ne peut trouver \"{0}\" dans l'option \"{1}\""
#: tiramisu/api.py:735
#: tiramisu/api.py:727
msgid ""
"cannot remove option's property \"{0}\", use permissive instead in option "
"\"{1}\" at index \"{2}\""
@ -94,35 +86,35 @@ msgstr ""
"ne peut supprimer la propriété \"{0}\" de l'option, utilisez plutôt "
"permissive dans l'option \"{1}\" a l'index \"{2}\""
#: tiramisu/api.py:739
#: tiramisu/api.py:731
msgid "cannot find \"{0}\" in option \"{1}\" at index \"{2}\""
msgstr "ne peut trouver \"{0}\" dans l'option \"{1}\" à l'index \"{2}\""
#: tiramisu/api.py:783
#: tiramisu/api.py:775
msgid "cannot find \"{0}\""
msgstr "ne peut trouver \"{0}\""
#: tiramisu/api.py:965
#: tiramisu/api.py:957
msgid "only multi value has defaultmulti"
msgstr "seule les valeurs multiple a l'attribut defaultmulti"
#: tiramisu/api.py:1129
#: tiramisu/api.py:1121
msgid "please specify a valid sub function ({0}.{1}) for {2}"
msgstr "veuillez spécifier une sous fonction valide ({0}.{1}) pour {2}"
#: tiramisu/api.py:1528
#: tiramisu/api.py:1520
msgid "properties must be a frozenset"
msgstr "une propriété doit être de type frozenset"
#: tiramisu/api.py:1532 tiramisu/api.py:1559
#: tiramisu/api.py:1524 tiramisu/api.py:1551
msgid "unknown when {} (must be in append or remove)"
msgstr "value {} inconsistent (doit être append ou remove)"
#: tiramisu/api.py:1545 tiramisu/api.py:1569 tiramisu/config.py:1712
#: tiramisu/api.py:1537 tiramisu/api.py:1561 tiramisu/config.py:1691
msgid "unknown type {}"
msgstr "type inconnu {}"
#: tiramisu/api.py:1935
#: tiramisu/api.py:1927
msgid "do not use unrestraint, nowarnings or forcepermissive together"
msgstr ""
"il ne faut pas utiliser unrestraint, nowarnings ou forcepermissive ensemble"
@ -246,51 +238,50 @@ msgstr ""
msgid "unexpected error \"{1}\" in function \"{2}\" for option {0}"
msgstr "erreur inattendue \"{1}\" dans la fonction \"{2}\" pour l'option {0}"
#: tiramisu/config.py:392 tiramisu/config.py:414 tiramisu/config.py:745
#: tiramisu/config.py:754
msgid "option name \"{0}\" is not unique in {1}"
msgstr "le nom de l'option \"{0}\" n'est pas unique dans {1}"
#: tiramisu/config.py:391 tiramisu/config.py:413
msgid "option name {0} is not unique in {1}"
msgstr "le nom de l'option {0} n'est pas unique dans {1}"
#: tiramisu/config.py:639
#: tiramisu/config.py:638
msgid "there is no option description for this config (may be GroupConfig)"
msgstr ""
"il n'y a pas d'option description trouvé pour cette config (peut être un "
"GroupConfig)"
#: tiramisu/config.py:1010 tiramisu/option/optiondescription.py:74
#: tiramisu/config.py:989 tiramisu/option/optiondescription.py:74
msgid "option description seems to be part of an other config"
msgstr "l'option description semble faire parti d'une autre config"
#: tiramisu/config.py:1172
#: tiramisu/config.py:1151
msgid "parent of {0} not already exists"
msgstr "le parent de {0} n'existe plus"
#: tiramisu/config.py:1219
#: tiramisu/config.py:1198
msgid "cannot set leadership object has root optiondescription"
msgstr "ne peut assigner un objet leadership comme optiondescription racine"
#: tiramisu/config.py:1222
#: tiramisu/config.py:1201
msgid "cannot set dynoptiondescription object has root optiondescription"
msgstr ""
"ne peut assigner un objet dynoptiondescription comme optiondescription racine"
#: tiramisu/config.py:1269
#: tiramisu/config.py:1248
msgid "child must be a Config, GroupConfig, MixConfig or MetaConfig"
msgstr "l'enfant doit être une Config, GroupConfig, MixConfig ou MetaConfig"
#: tiramisu/config.py:1278
#: tiramisu/config.py:1257
msgid "config name must be uniq in groupconfig for \"{0}\""
msgstr "le nom d'un config doit être unique dans un groupconfig pour \"{0}\""
#: tiramisu/config.py:1487
#: tiramisu/config.py:1466
msgid "unknown config \"{}\""
msgstr "config \"{}\" inconnue"
#: tiramisu/config.py:1512
#: tiramisu/config.py:1491
msgid "child must be a Config, MixConfig or MetaConfig"
msgstr "l'enfant doit être une Config, MixConfig ou MetaConfig"
#: tiramisu/config.py:1547
#: tiramisu/config.py:1526
msgid ""
"force_default, force_default_if_same or force_dont_change_value cannot be "
"set with only_config"
@ -298,43 +289,43 @@ msgstr ""
"force_default, force_default_if_same ou force_dont_change_value ne peuvent "
"pas être spécifié avec only_config"
#: tiramisu/config.py:1557
#: tiramisu/config.py:1536
msgid "force_default and force_dont_change_value cannot be set together"
msgstr ""
"force_default et force_dont_change_value ne peuvent pas être mis ensemble"
#: tiramisu/config.py:1708
#: tiramisu/config.py:1687
msgid "config name must be uniq in groupconfig for {0}"
msgstr "le nom de la config doit être unique dans un groupconfig pour {0}"
#: tiramisu/config.py:1753
#: tiramisu/config.py:1732
msgid "config added has no name, the name is mandatory"
msgstr "la config ajoutée n'a pas de nom, le nom est obligatoire"
#: tiramisu/config.py:1758
#: tiramisu/config.py:1737
msgid "config name \"{0}\" is not uniq in groupconfig \"{1}\""
msgstr ""
"le nom d'un config \"{0}\" n'est pas unique dans le groupconfig \"{1}\""
#: tiramisu/config.py:1776 tiramisu/config.py:1782
#: tiramisu/config.py:1755 tiramisu/config.py:1761
msgid "cannot find the config {0}"
msgstr "ne peut pas trouver la config {0}"
#: tiramisu/config.py:1808
#: tiramisu/config.py:1787
msgid "MetaConfig with optiondescription must have string has child, not {}"
msgstr ""
"MetaConfig avec une optiondescription doit avoir un nom comme enfant, pas {}"
#: tiramisu/config.py:1820
#: tiramisu/config.py:1799
msgid "child must be a Config or MetaConfig"
msgstr "enfant doit être une une Config ou une MetaConfig"
#: tiramisu/config.py:1825
#: tiramisu/config.py:1804
msgid "all config in metaconfig must have the same optiondescription"
msgstr ""
"toutes les configs d'une metaconfig doivent avoir la même optiondescription"
#: tiramisu/config.py:1842
#: tiramisu/config.py:1821
msgid "metaconfig must have the same optiondescription"
msgstr "metaconfig doivent avoir la même optiondescription"
@ -479,19 +470,11 @@ msgid "attention, \"{0}\" could be an invalid {1} for {2} at index \"{3}\""
msgstr ""
"attention, \"{0}\" peut être un {1} invalide pour {2} à l'index \"{3}\""
#: tiramisu/error.py:370
msgid "{2} has an invalid {1}"
msgstr "{2} a un {1} invalide"
#: tiramisu/error.py:372
msgid "{2} at index \"{3}\" has an invalid {1}"
msgstr "{2} à l'index a un invalide {1}"
#: tiramisu/error.py:375 tiramisu/error.py:386
#: tiramisu/error.py:368 tiramisu/error.py:379
msgid "\"{0}\" is an invalid {1} for {2}"
msgstr "\"{0}\" est une valeur invalide pour l'option {2} de type {1}"
#: tiramisu/error.py:377
#: tiramisu/error.py:370
msgid "\"{0}\" is an invalid {1} for {2} at index \"{3}\""
msgstr "\"{0}\" est un {1} invalide pour {2} à l'index \"{3}\""
@ -580,79 +563,63 @@ msgstr ""
"type {0} invalide pour des propriétés pour {1}, doit être des caractères ou "
"un objet Calculation"
#: tiramisu/option/baseoption.py:254
#: tiramisu/option/baseoption.py:253
msgid "information's item for {0} not found: \"{1}\""
msgstr "item pour {0} dans les informations non trouvée: \"{1}\""
#: tiramisu/option/baseoption.py:272
#: tiramisu/option/baseoption.py:271
msgid "'{0}' ({1}) object attribute '{2}' is read-only"
msgstr "l'attribut {2} de l'objet '{0}' ({1}) est en lecture seule"
#: tiramisu/option/baseoption.py:313
#: tiramisu/option/baseoption.py:312
msgid "\"{}\" ({}) object attribute \"{}\" is read-only"
msgstr "\"{}\" ({}) l'attribut de l'objet \"{}\" est en lecture seule"
#: tiramisu/option/baseoption.py:325
#: tiramisu/option/baseoption.py:324
msgid "{0} not part of any Config"
msgstr "{0} ne fait pas parti d'une Config"
#: tiramisu/option/booloption.py:33
msgid "boolean"
msgstr "booléen"
#: tiramisu/option/broadcastoption.py:41
msgid "invalid string"
msgstr "invalide caractère"
#: tiramisu/option/broadcastoption.py:34
msgid "broadcast address"
msgstr "adresse de broadcast"
#: tiramisu/option/choiceoption.py:41
msgid "choice"
msgstr "choix"
#: tiramisu/option/choiceoption.py:53
#: tiramisu/option/choiceoption.py:52
msgid "values must be a tuple or a calculation for {0}"
msgstr "les valeurs doivent être un tuple ou une fonction pour {0}"
#: tiramisu/option/choiceoption.py:76
#: tiramisu/option/choiceoption.py:75
msgid "the calculated values \"{0}\" for \"{1}\" is not a list"
msgstr "les valeurs calculées \"{0}\" pour \"{1}\" n'est pas une liste"
#: tiramisu/option/choiceoption.py:107
#: tiramisu/option/choiceoption.py:106
msgid "only \"{0}\" is allowed"
msgstr "seul \"{0}\" est autorisé"
#: tiramisu/option/choiceoption.py:109
#: tiramisu/option/choiceoption.py:108
msgid "only {0} are allowed"
msgstr "seul {0} sont autorisées"
#: tiramisu/option/dateoption.py:34
msgid "date"
msgstr "date"
#: tiramisu/option/domainnameoption.py:46
msgid "domain name"
msgstr "nom de domaine"
#: tiramisu/option/domainnameoption.py:68
#: tiramisu/option/domainnameoption.py:67
msgid "unknown type {0} for hostname"
msgstr "type_ inconnu {0} pour le nom d'hôte"
#: tiramisu/option/domainnameoption.py:71
#: tiramisu/option/domainnameoption.py:70
msgid "allow_ip must be a boolean"
msgstr "allow_ip doit être un booléen"
#: tiramisu/option/domainnameoption.py:73
#: tiramisu/option/domainnameoption.py:72
msgid "allow_cidr_network must be a boolean"
msgstr "allow_cidr_network doit être un booléen"
#: tiramisu/option/domainnameoption.py:75
#: tiramisu/option/domainnameoption.py:74
msgid "allow_without_dot must be a boolean"
msgstr "allow_without_dot doit être un booléen"
#: tiramisu/option/domainnameoption.py:77
#: tiramisu/option/domainnameoption.py:76
msgid "allow_startswith_dot must be a boolean"
msgstr "allow_startswith_dot doit être un booléen"
#: tiramisu/option/domainnameoption.py:88
#: tiramisu/option/domainnameoption.py:87
msgid ""
"must start with lowercase characters followed by lowercase characters, "
"number, \"-\" and \".\" characters are allowed"
@ -660,7 +627,7 @@ msgstr ""
"doit démarrer par un caractère en minuscule suivi par des caractères en "
"minuscule, des nombres, \"-\" et \".\" sont autorisés"
#: tiramisu/option/domainnameoption.py:91
#: tiramisu/option/domainnameoption.py:90
msgid ""
"must start with lowercase characters followed by lowercase characters, "
"number, \"-\" and \".\" characters are recommanded"
@ -668,7 +635,7 @@ msgstr ""
"doit démarrer par un caractère en minuscule suivi par des caractères en "
"minuscule, des nombres, \"-\" et \".\" sont recommandés"
#: tiramisu/option/domainnameoption.py:96
#: tiramisu/option/domainnameoption.py:95
msgid ""
"must start with lowercase characters followed by lowercase characters, "
"number and \"-\" characters are allowed"
@ -676,7 +643,7 @@ msgstr ""
"doit démarrer par un caractère en minuscule suivi par des caractères en "
"minuscule, des nombres et \"-\" sont autorisés"
#: tiramisu/option/domainnameoption.py:99
#: tiramisu/option/domainnameoption.py:98
msgid ""
"must start with lowercase characters followed by lowercase characters, "
"number and \"-\" characters are recommanded"
@ -684,54 +651,54 @@ msgstr ""
"doit démarrer par un caractère en minuscule suivi par des caractères en "
"minuscule, des nombres et\"-\" sont recommandés"
#: tiramisu/option/domainnameoption.py:102
#: tiramisu/option/domainnameoption.py:103
#: tiramisu/option/domainnameoption.py:104
msgid "could be a IP, otherwise {}"
msgstr "peut être une IP, autrement {}"
#: tiramisu/option/domainnameoption.py:149
#: tiramisu/option/domainnameoption.py:148
msgid "invalid length (min 1)"
msgstr "longueur invalide (min 1)"
#: tiramisu/option/domainnameoption.py:152
#: tiramisu/option/domainnameoption.py:151
msgid "invalid length (max {0})"
msgstr "longueur invalide (max {0})"
#: tiramisu/option/domainnameoption.py:158
#: tiramisu/option/domainnameoption.py:157
msgid "must have dot"
msgstr "doit avoir un point"
#: tiramisu/option/domainnameoption.py:160
#: tiramisu/option/domainnameoption.py:159
msgid "invalid length (max 255)"
msgstr "longueur invalide (max 255)"
#: tiramisu/option/domainnameoption.py:180
#: tiramisu/option/domainnameoption.py:179
msgid "DNS resolution failed"
msgstr "la résolution DNS a échoué"
#: tiramisu/option/domainnameoption.py:183
#: tiramisu/option/domainnameoption.py:182
msgid "error resolving DNS: {1}"
msgstr "erreur de résolution DNS : {1}"
#: tiramisu/option/domainnameoption.py:190
#: tiramisu/option/domainnameoption.py:189
msgid "must not be an IP"
msgstr "ne doit pas être une IP"
#: tiramisu/option/domainnameoption.py:213
#: tiramisu/option/domainnameoption.py:212
msgid "some characters are uppercase"
msgstr "des caractères sont en majuscule"
#: tiramisu/option/dynoptiondescription.py:138
#: tiramisu/option/dynoptiondescription.py:130
msgid "DynOptionDescription identifiers for option {0}, is not a list ({1})"
msgstr ""
"les identifiants de la DynOptionDescription pour l'option {0}, n'est pas une "
"liste ({1})"
#: tiramisu/option/dynoptiondescription.py:150
#: tiramisu/option/dynoptiondescription.py:142
msgid "invalid identifier \"{}\" for option {}"
msgstr "identifiant \"{}\" invalide pour l'option \"{}\""
#: tiramisu/option/dynoptiondescription.py:162
#: tiramisu/option/dynoptiondescription.py:154
msgid ""
"DynOptionDescription \"{0}\" identifiers return a list with same values "
"\"{1}\""
@ -739,92 +706,72 @@ msgstr ""
"Les identifiants de la DynOptionDescription \"{0}\" retourne une liste avec "
"des valeurs identiques \"{1}\""
#: tiramisu/option/emailoption.py:37
msgid "email address"
msgstr "adresse mail"
#: tiramisu/option/filenameoption.py:35
msgid "file name"
msgstr "nom de fichier"
#: tiramisu/option/filenameoption.py:48
#: tiramisu/option/filenameoption.py:47
msgid "types parameter must be a list, not \"{0}\" for \"{1}\""
msgstr ""
"le paramètre types doit être une liste, au lieu de \"{0}\" pour \"{1}\""
#: tiramisu/option/filenameoption.py:68
#: tiramisu/option/filenameoption.py:67
msgid "must starts with \"/\""
msgstr "doit débuter par \"/\""
#: tiramisu/option/filenameoption.py:79
#: tiramisu/option/filenameoption.py:78
msgid "directory"
msgstr "répertoire"
#: tiramisu/option/filenameoption.py:79
#: tiramisu/option/filenameoption.py:78
msgid "file"
msgstr "fichier"
#: tiramisu/option/filenameoption.py:83
#: tiramisu/option/filenameoption.py:82
msgid "cannot find this {0}"
msgstr "ce {0} est introuvable"
#: tiramisu/option/floatoption.py:33
msgid "float"
msgstr "nombre flottant"
#: tiramisu/option/intoption.py:32
msgid "integer"
msgstr "nombre"
#: tiramisu/option/intoption.py:51
#: tiramisu/option/intoption.py:46
msgid "which is not an integer"
msgstr "qui n'est pas un chiffre"
#: tiramisu/option/intoption.py:57
#: tiramisu/option/intoption.py:52
msgid "value should be equal or greater than \"{0}\""
msgstr "la valeur devrait être supérieur ou égal à {0}"
#: tiramisu/option/intoption.py:59
#: tiramisu/option/intoption.py:54
msgid "value must be equal or greater than \"{0}\""
msgstr "valeur doit être supérieur ou égal à {0}"
#: tiramisu/option/intoption.py:64
#: tiramisu/option/intoption.py:59
msgid "value should be less than \"{0}\""
msgstr "valeur devrait être inférieur à \"{0}\""
#: tiramisu/option/intoption.py:66
#: tiramisu/option/intoption.py:61
msgid "value must be less than \"{0}\""
msgstr "valeur doit être inférieur à \"{0}\""
#: tiramisu/option/ipoption.py:34
msgid "IP"
msgstr "IP"
#: tiramisu/option/ipoption.py:61
#: tiramisu/option/ipoption.py:57
msgid "it's in fact a network address"
msgstr "c'est un faite une adresse réseau"
#: tiramisu/option/ipoption.py:63
#: tiramisu/option/ipoption.py:59
msgid "it's in fact a broacast address"
msgstr "c'est en faite une adresse de broadcast"
#: tiramisu/option/ipoption.py:75
#: tiramisu/option/ipoption.py:71
msgid "CIDR address must have a \"/\""
msgstr "une adresse CIDR doit avoir un \"/\""
#: tiramisu/option/ipoption.py:84
#: tiramisu/option/ipoption.py:80
msgid "shouldn't be reserved IP"
msgstr "ne devrait pas être une IP réservée"
#: tiramisu/option/ipoption.py:86
#: tiramisu/option/ipoption.py:82
msgid "mustn't be reserved IP"
msgstr "ne doit pas être une IP réservée"
#: tiramisu/option/ipoption.py:90
#: tiramisu/option/ipoption.py:86
msgid "should be private IP"
msgstr "devrait être une IP privée"
#: tiramisu/option/ipoption.py:92
#: tiramisu/option/ipoption.py:88
msgid "must be private IP"
msgstr "doit être une IP privée"
@ -855,56 +802,44 @@ msgstr ""
"valeur par défaut non autorisée pour l'option suiveuse {0} dans l'option "
"leadership {1}"
#: tiramisu/option/macoption.py:35
msgid "mac address"
msgstr "adresse MAC"
#: tiramisu/option/networkoption.py:45
msgid "must use CIDR notation"
msgstr "doit utiliser la notation CIDR"
#: tiramisu/option/netmaskoption.py:33
msgid "netmask address"
msgstr "adresse netmask"
#: tiramisu/option/networkoption.py:34
msgid "network address"
msgstr "adresse réseau"
#: tiramisu/option/networkoption.py:41
msgid "it's not a network address"
msgstr "ce n'est pas une adresse réseau"
#: tiramisu/option/networkoption.py:46
#: tiramisu/option/networkoption.py:60
msgid "shouldn't be reserved network"
msgstr "ne devrait pas être une IP réservée"
#: tiramisu/option/networkoption.py:48
#: tiramisu/option/networkoption.py:62
msgid "mustn't be reserved network"
msgstr "ne doit pas être une IP réservée"
#: tiramisu/option/option.py:75
#: tiramisu/option/option.py:73
msgid "default_multi is set whereas multi is False in option: {0}"
msgstr ""
"default_multi est spécifié alors que multi est à False pour l'option : {0}"
#: tiramisu/option/option.py:95
#: tiramisu/option/option.py:93
msgid "invalid multi type \"{}\" for \"{}\""
msgstr "type multiple \"{}\" invalide pour \"{}\""
#: tiramisu/option/option.py:114
#: tiramisu/option/option.py:112
msgid "validators must be a list of Calculation for \"{0}\""
msgstr "validators doit être une liste de Calculation pour \"{0}\""
#: tiramisu/option/option.py:119
#: tiramisu/option/option.py:117
msgid "validators must be a Calculation for \"{0}\""
msgstr "validators doit être un Calculation pour \"{0}\""
#: tiramisu/option/option.py:143
#: tiramisu/option/option.py:141
msgid "invalid default_multi value \"{0}\" for option {1}"
msgstr "la valeur default_multi est invalide {0} pour l'option {1}"
#: tiramisu/option/option.py:151
#: tiramisu/option/option.py:149
msgid "invalid default_multi value \"{0}\" for option {1}, {2}"
msgstr "la valeur default_multi est invalide \"{0}\" pour l'option {1}, {2}"
#: tiramisu/option/option.py:164
#: tiramisu/option/option.py:162
msgid ""
"invalid default_multi value \"{0}\" for option {1}, must be a list for a "
"submulti"
@ -912,19 +847,19 @@ msgstr ""
"valeur invalide pour default_multi \"{0}\" pour l'option {1}, doit être une "
"liste pour une submulti"
#: tiramisu/option/option.py:298
#: tiramisu/option/option.py:294
msgid "the value \"{}\" is not unique"
msgstr "la valeur \"{}\" n'est pas unique"
#: tiramisu/option/option.py:361
#: tiramisu/option/option.py:357
msgid "which must not be a list"
msgstr "qui ne doit pas être une liste"
#: tiramisu/option/option.py:416 tiramisu/option/option.py:454
#: tiramisu/option/option.py:412 tiramisu/option/option.py:450
msgid "which must be a list"
msgstr "qui doit être une liste"
#: tiramisu/option/option.py:444
#: tiramisu/option/option.py:440
msgid "which \"{}\" must be a list of list"
msgstr "lequel \"{}\" doit être une liste de liste"
@ -950,92 +885,76 @@ msgstr "les enfants d'une optiondescription \"{}\" doivent être une liste"
msgid "the option name \"{0}\" is duplicate in \"{1}\""
msgstr "le nom de l'option \"{0}\" est dupliqué dans \"{1}\""
#: tiramisu/option/optiondescription.py:408
#: tiramisu/option/optiondescription.py:411
msgid "cannot change group_type if already set (old {0}, new {1})"
msgstr "ne peut changer group_type si déjà spécifié (ancien {0}, nouveau {1})"
#: tiramisu/option/optiondescription.py:413
#: tiramisu/option/optiondescription.py:416
msgid "group_type: {0} not allowed"
msgstr "group_type : {0} non autorisé"
#: tiramisu/option/passwordoption.py:34
msgid "password"
msgstr "mot de passe"
#: tiramisu/option/passwordoption.py:51
#: tiramisu/option/passwordoption.py:49
msgid "at least {0} characters are required"
msgstr "au moins {0} caractères sont requis"
#: tiramisu/option/passwordoption.py:54
#: tiramisu/option/passwordoption.py:52
msgid "maximum {0} characters required"
msgstr "un maximum de {0} caractères sont autorisés"
#: tiramisu/option/passwordoption.py:59
#: tiramisu/option/passwordoption.py:57
msgid "must not have the characters {0}"
msgstr "ne doit pas contenir les caractères {0}"
#: tiramisu/option/permissionsoption.py:40
msgid "unix file permissions"
msgstr "permissions de fichier Unix"
#: tiramisu/option/permissionsoption.py:53
#: tiramisu/option/permissionsoption.py:52
msgid "only 3 or 4 octal digits are allowed"
msgstr "seulement 3 ou 4 chiffres octal sont autorisées"
#: tiramisu/option/permissionsoption.py:64
#: tiramisu/option/permissionsoption.py:63
msgid "user"
msgstr "nom d'utilisateur"
#: tiramisu/option/permissionsoption.py:65
#: tiramisu/option/permissionsoption.py:67
#: tiramisu/option/permissionsoption.py:64
#: tiramisu/option/permissionsoption.py:66
msgid "group"
msgstr "groupe"
#: tiramisu/option/permissionsoption.py:68
#: tiramisu/option/permissionsoption.py:67
msgid "other"
msgstr "autre"
#: tiramisu/option/permissionsoption.py:69
#: tiramisu/option/permissionsoption.py:68
msgid "{0} has more right than {1}"
msgstr "{0} a plus de droit que {1}"
#: tiramisu/option/permissionsoption.py:72
#: tiramisu/option/permissionsoption.py:71
msgid "too weak"
msgstr "trop simple"
#: tiramisu/option/portoption.py:40
msgid "port"
msgstr "port"
#: tiramisu/option/portoption.py:78
#: tiramisu/option/portoption.py:77
msgid "inconsistency in allowed range"
msgstr "inconsistence dans la plage autorisée"
#: tiramisu/option/portoption.py:83
#: tiramisu/option/portoption.py:82
msgid "max value is empty"
msgstr "la valeur maximum est vide"
#: tiramisu/option/portoption.py:96
#: tiramisu/option/portoption.py:95
msgid "range must have two values only"
msgstr "un rang doit avoir deux valeurs seulement"
#: tiramisu/option/portoption.py:99
#: tiramisu/option/portoption.py:98
msgid "first port in range must be smaller than the second one"
msgstr "le premier port d'un rang doit être plus petit que le second"
#: tiramisu/option/portoption.py:125
#: tiramisu/option/portoption.py:124
msgid "should be between {0} and {1}"
msgstr "devrait être une nombre entre {0} et {1}"
#: tiramisu/option/portoption.py:127
#: tiramisu/option/portoption.py:126
msgid "must be between {0} and {1}"
msgstr "doit être une nombre entre {0} et {1}"
#: tiramisu/option/stroption.py:34
msgid "string"
msgstr "texte"
#: tiramisu/option/stroption.py:42
#: tiramisu/option/stroption.py:41
msgid "which is not a string"
msgstr "qui n'est pas une chaîne de caractères"
@ -1046,34 +965,22 @@ msgstr ""
"symlink mal formé, le second paramètre doit être une option pour \"{0}\", "
"not {1}"
#: tiramisu/option/urloption.py:40
msgid "URL"
msgstr "URL"
#: tiramisu/option/urloption.py:93
#: tiramisu/option/urloption.py:92
msgid "must start with http:// or https://"
msgstr "doit débuter par http:// ou https://"
#: tiramisu/option/urloption.py:118
#: tiramisu/option/urloption.py:117
msgid "the port \"{0}\" is invalid: {1}"
msgstr "le port \"{0}\" est invalide : {1}"
#: tiramisu/option/urloption.py:125
#: tiramisu/option/urloption.py:124
msgid "the domain \"{0}\" is invalid: {1}"
msgstr "le domaine \"{0}\" est invalide : {1}"
#: tiramisu/option/urloption.py:129
#: tiramisu/option/urloption.py:128
msgid "must ends with a valid resource name"
msgstr "doit finir par un nom de ressource valide"
#: tiramisu/option/usernameoption.py:36
msgid "unix username"
msgstr "nom d'utilisateur Unix"
#: tiramisu/option/usernameoption.py:44
msgid "unix groupname"
msgstr "nom de groupe Unix"
#: tiramisu/setting.py:258
msgid "can't rebind {0}"
msgstr "ne peut redéfinir ({0})"
@ -1146,12 +1053,6 @@ msgstr ""
msgid "information's item not found \"{}\""
msgstr "l'information de l'objet ne sont pas trouvé \"{}\""
#~ msgid "invalid string"
#~ msgstr "invalide caractère"
#~ msgid "must use CIDR notation"
#~ msgstr "doit utiliser la notation CIDR"
#~ msgid "no option found in config with these criteria"
#~ msgstr "aucune option trouvée dans la config avec ces critères"
@ -1334,14 +1235,26 @@ msgstr "l'information de l'objet ne sont pas trouvé \"{}\""
#~ "requirements malformé pour l'option : {0} l'exigence doit avoir les clefs "
#~ "option, expected et action"
#~ msgid "boolean"
#~ msgstr "booléen"
#~ msgid "invalid broadcast consistency, a network and a netmask are needed"
#~ msgstr ""
#~ "adresse de broadcast inconsistante, un réseau et un masque sont "
#~ "nécessaires."
#~ msgid "choice"
#~ msgstr "choix"
#~ msgid "values is not a function, so values_params must be None"
#~ msgstr "values n'est pas une fonction, donc values_params doit être None"
#~ msgid "date"
#~ msgstr "date"
#~ msgid "domain name"
#~ msgstr "nom de domaine"
#~ msgid "only lowercase, number and - are characters are allowed"
#~ msgstr ""
#~ "seuls les caractères en minuscule, les nombres et \"-\" sont autorisés"
@ -1353,6 +1266,18 @@ msgstr "l'information de l'objet ne sont pas trouvé \"{}\""
#~ msgid "callback is mandatory for the dynoptiondescription \"{}\""
#~ msgstr "un callback est obligatoire pour le dynoptiondescription \"{}\""
#~ msgid "email address"
#~ msgstr "adresse mail"
#~ msgid "float"
#~ msgstr "nombre flottant"
#~ msgid "integer"
#~ msgstr "nombre"
#~ msgid "IP"
#~ msgstr "IP"
#~ msgid "IP not in network \"{0}\" (\"{1}\")"
#~ msgstr "l'IP n'est pas dans le réseau \"{0}\" (\"{1}\")"
@ -1392,6 +1317,9 @@ msgstr "l'information de l'objet ne sont pas trouvé \"{}\""
#~ "requirement mal formé pour l'option \"{0}\" ne doit pas être dans une "
#~ "suiveuse pour \"{1}\""
#~ msgid "netmask address"
#~ msgstr "adresse netmask"
#~ msgid "network_netmask needs a network and a netmask"
#~ msgstr "network_netmask nécessite un réseau et un masque de réseau"
@ -1510,9 +1438,21 @@ msgstr "l'information de l'objet ne sont pas trouvé \"{}\""
#~ msgid "consistency with option {0} which is not in Config"
#~ msgstr "consistency avec l'option {0} qui n'est pas dans une Config"
#~ msgid "password"
#~ msgstr "mot de passe"
#~ msgid "port"
#~ msgstr "port"
#~ msgid "string"
#~ msgstr "texte"
#~ msgid "unknown option \"{0}\" in syndynoptiondescription \"{1}\""
#~ msgstr "l'option \"{0}\" inconnue dans la syndynoptiondescription \"{1}\""
#~ msgid "URL"
#~ msgstr "URL"
#~ msgid "port must be an between 0 and 65536"
#~ msgstr "port doit être entre 0 et 65536"

View file

@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2025-10-04 15:46+0200\n"
"POT-Creation-Date: 2025-09-19 22:05+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -35,7 +35,7 @@ msgstr ""
msgid "Commands:"
msgstr ""
#: tiramisu/api.py:118 tiramisu/api.py:1963
#: tiramisu/api.py:118 tiramisu/api.py:1955
msgid "please specify a valid sub function ({0}.{1})"
msgstr ""
@ -43,7 +43,7 @@ msgstr ""
msgid "please do not specify index ({0}.{1})"
msgstr ""
#: tiramisu/api.py:211 tiramisu/api.py:948
#: tiramisu/api.py:211 tiramisu/api.py:940
msgid "please specify index with a follower option ({0}.{1})"
msgstr ""
@ -51,67 +51,59 @@ msgstr ""
msgid "please specify a valid sub function ({0}.{1}): {2}"
msgstr ""
#: tiramisu/api.py:447
msgid "optiondescription"
msgstr ""
#: tiramisu/api.py:452
msgid "symlink"
msgstr ""
#: tiramisu/api.py:533
#: tiramisu/api.py:525
msgid "the option {0} is not a dynamic option, cannot get identifiers with only_self parameter to True"
msgstr ""
#: tiramisu/api.py:621
#: tiramisu/api.py:613
msgid "cannot get option from a follower symlink without index"
msgstr ""
#: tiramisu/api.py:699
#: tiramisu/api.py:691
msgid "cannot add this property: \"{0}\""
msgstr ""
#: tiramisu/api.py:726
#: tiramisu/api.py:718
msgid "cannot remove option's property \"{0}\", use permissive instead in option \"{1}\""
msgstr ""
#: tiramisu/api.py:730
#: tiramisu/api.py:722
msgid "cannot find \"{0}\" in option \"{1}\""
msgstr ""
#: tiramisu/api.py:735
#: tiramisu/api.py:727
msgid "cannot remove option's property \"{0}\", use permissive instead in option \"{1}\" at index \"{2}\""
msgstr ""
#: tiramisu/api.py:739
#: tiramisu/api.py:731
msgid "cannot find \"{0}\" in option \"{1}\" at index \"{2}\""
msgstr ""
#: tiramisu/api.py:783
#: tiramisu/api.py:775
msgid "cannot find \"{0}\""
msgstr ""
#: tiramisu/api.py:965
#: tiramisu/api.py:957
msgid "only multi value has defaultmulti"
msgstr ""
#: tiramisu/api.py:1129
#: tiramisu/api.py:1121
msgid "please specify a valid sub function ({0}.{1}) for {2}"
msgstr ""
#: tiramisu/api.py:1528
#: tiramisu/api.py:1520
msgid "properties must be a frozenset"
msgstr ""
#: tiramisu/api.py:1532 tiramisu/api.py:1559
#: tiramisu/api.py:1524 tiramisu/api.py:1551
msgid "unknown when {} (must be in append or remove)"
msgstr ""
#: tiramisu/api.py:1545 tiramisu/api.py:1569 tiramisu/config.py:1712
#: tiramisu/api.py:1537 tiramisu/api.py:1561 tiramisu/config.py:1691
msgid "unknown type {}"
msgstr ""
#: tiramisu/api.py:1935
#: tiramisu/api.py:1927
msgid "do not use unrestraint, nowarnings or forcepermissive together"
msgstr ""
@ -215,84 +207,83 @@ msgstr ""
msgid "unexpected error \"{1}\" in function \"{2}\" for option {0}"
msgstr ""
#: tiramisu/config.py:392 tiramisu/config.py:414 tiramisu/config.py:745
#: tiramisu/config.py:754
msgid "option name \"{0}\" is not unique in {1}"
#: tiramisu/config.py:391 tiramisu/config.py:413
msgid "option name {0} is not unique in {1}"
msgstr ""
#: tiramisu/config.py:639
#: tiramisu/config.py:638
msgid "there is no option description for this config (may be GroupConfig)"
msgstr ""
#: tiramisu/config.py:1010 tiramisu/option/optiondescription.py:74
#: tiramisu/config.py:989 tiramisu/option/optiondescription.py:74
msgid "option description seems to be part of an other config"
msgstr ""
#: tiramisu/config.py:1172
#: tiramisu/config.py:1151
msgid "parent of {0} not already exists"
msgstr ""
#: tiramisu/config.py:1219
#: tiramisu/config.py:1198
msgid "cannot set leadership object has root optiondescription"
msgstr ""
#: tiramisu/config.py:1222
#: tiramisu/config.py:1201
msgid "cannot set dynoptiondescription object has root optiondescription"
msgstr ""
#: tiramisu/config.py:1269
#: tiramisu/config.py:1248
msgid "child must be a Config, GroupConfig, MixConfig or MetaConfig"
msgstr ""
#: tiramisu/config.py:1278
#: tiramisu/config.py:1257
msgid "config name must be uniq in groupconfig for \"{0}\""
msgstr ""
#: tiramisu/config.py:1487
#: tiramisu/config.py:1466
msgid "unknown config \"{}\""
msgstr ""
#: tiramisu/config.py:1512
#: tiramisu/config.py:1491
msgid "child must be a Config, MixConfig or MetaConfig"
msgstr ""
#: tiramisu/config.py:1547
#: tiramisu/config.py:1526
msgid "force_default, force_default_if_same or force_dont_change_value cannot be set with only_config"
msgstr ""
#: tiramisu/config.py:1557
#: tiramisu/config.py:1536
msgid "force_default and force_dont_change_value cannot be set together"
msgstr ""
#: tiramisu/config.py:1708
#: tiramisu/config.py:1687
msgid "config name must be uniq in groupconfig for {0}"
msgstr ""
#: tiramisu/config.py:1753
#: tiramisu/config.py:1732
msgid "config added has no name, the name is mandatory"
msgstr ""
#: tiramisu/config.py:1758
#: tiramisu/config.py:1737
msgid "config name \"{0}\" is not uniq in groupconfig \"{1}\""
msgstr ""
#: tiramisu/config.py:1776 tiramisu/config.py:1782
#: tiramisu/config.py:1755 tiramisu/config.py:1761
msgid "cannot find the config {0}"
msgstr ""
#: tiramisu/config.py:1808
#: tiramisu/config.py:1787
msgid "MetaConfig with optiondescription must have string has child, not {}"
msgstr ""
#: tiramisu/config.py:1820
#: tiramisu/config.py:1799
msgid "child must be a Config or MetaConfig"
msgstr ""
#: tiramisu/config.py:1825
#: tiramisu/config.py:1804
msgid "all config in metaconfig must have the same optiondescription"
msgstr ""
#: tiramisu/config.py:1842
#: tiramisu/config.py:1821
msgid "metaconfig must have the same optiondescription"
msgstr ""
@ -416,19 +407,11 @@ msgstr ""
msgid "attention, \"{0}\" could be an invalid {1} for {2} at index \"{3}\""
msgstr ""
#: tiramisu/error.py:370
msgid "{2} has an invalid {1}"
msgstr ""
#: tiramisu/error.py:372
msgid "{2} at index \"{3}\" has an invalid {1}"
msgstr ""
#: tiramisu/error.py:375 tiramisu/error.py:386
#: tiramisu/error.py:368 tiramisu/error.py:379
msgid "\"{0}\" is an invalid {1} for {2}"
msgstr ""
#: tiramisu/error.py:377
#: tiramisu/error.py:370
msgid "\"{0}\" is an invalid {1} for {2} at index \"{3}\""
msgstr ""
@ -500,228 +483,192 @@ msgstr ""
msgid "invalid property type {0} for {1}, must be a string or a Calculation"
msgstr ""
#: tiramisu/option/baseoption.py:254
#: tiramisu/option/baseoption.py:253
msgid "information's item for {0} not found: \"{1}\""
msgstr ""
#: tiramisu/option/baseoption.py:272
#: tiramisu/option/baseoption.py:271
msgid "'{0}' ({1}) object attribute '{2}' is read-only"
msgstr ""
#: tiramisu/option/baseoption.py:313
#: tiramisu/option/baseoption.py:312
msgid "\"{}\" ({}) object attribute \"{}\" is read-only"
msgstr ""
#: tiramisu/option/baseoption.py:325
#: tiramisu/option/baseoption.py:324
msgid "{0} not part of any Config"
msgstr ""
#: tiramisu/option/booloption.py:33
msgid "boolean"
#: tiramisu/option/broadcastoption.py:41
msgid "invalid string"
msgstr ""
#: tiramisu/option/broadcastoption.py:34
msgid "broadcast address"
msgstr ""
#: tiramisu/option/choiceoption.py:41
msgid "choice"
msgstr ""
#: tiramisu/option/choiceoption.py:53
#: tiramisu/option/choiceoption.py:52
msgid "values must be a tuple or a calculation for {0}"
msgstr ""
#: tiramisu/option/choiceoption.py:76
#: tiramisu/option/choiceoption.py:75
msgid "the calculated values \"{0}\" for \"{1}\" is not a list"
msgstr ""
#: tiramisu/option/choiceoption.py:107
#: tiramisu/option/choiceoption.py:106
msgid "only \"{0}\" is allowed"
msgstr ""
#: tiramisu/option/choiceoption.py:109
#: tiramisu/option/choiceoption.py:108
msgid "only {0} are allowed"
msgstr ""
#: tiramisu/option/dateoption.py:34
msgid "date"
msgstr ""
#: tiramisu/option/domainnameoption.py:46
msgid "domain name"
msgstr ""
#: tiramisu/option/domainnameoption.py:68
#: tiramisu/option/domainnameoption.py:67
msgid "unknown type {0} for hostname"
msgstr ""
#: tiramisu/option/domainnameoption.py:71
#: tiramisu/option/domainnameoption.py:70
msgid "allow_ip must be a boolean"
msgstr ""
#: tiramisu/option/domainnameoption.py:73
#: tiramisu/option/domainnameoption.py:72
msgid "allow_cidr_network must be a boolean"
msgstr ""
#: tiramisu/option/domainnameoption.py:75
#: tiramisu/option/domainnameoption.py:74
msgid "allow_without_dot must be a boolean"
msgstr ""
#: tiramisu/option/domainnameoption.py:77
#: tiramisu/option/domainnameoption.py:76
msgid "allow_startswith_dot must be a boolean"
msgstr ""
#: tiramisu/option/domainnameoption.py:88
#: tiramisu/option/domainnameoption.py:87
msgid "must start with lowercase characters followed by lowercase characters, number, \"-\" and \".\" characters are allowed"
msgstr ""
#: tiramisu/option/domainnameoption.py:91
#: tiramisu/option/domainnameoption.py:90
msgid "must start with lowercase characters followed by lowercase characters, number, \"-\" and \".\" characters are recommanded"
msgstr ""
#: tiramisu/option/domainnameoption.py:96
#: tiramisu/option/domainnameoption.py:95
msgid "must start with lowercase characters followed by lowercase characters, number and \"-\" characters are allowed"
msgstr ""
#: tiramisu/option/domainnameoption.py:99
#: tiramisu/option/domainnameoption.py:98
msgid "must start with lowercase characters followed by lowercase characters, number and \"-\" characters are recommanded"
msgstr ""
#: tiramisu/option/domainnameoption.py:102
#: tiramisu/option/domainnameoption.py:103
#: tiramisu/option/domainnameoption.py:104
msgid "could be a IP, otherwise {}"
msgstr ""
#: tiramisu/option/domainnameoption.py:149
#: tiramisu/option/domainnameoption.py:148
msgid "invalid length (min 1)"
msgstr ""
#: tiramisu/option/domainnameoption.py:152
#: tiramisu/option/domainnameoption.py:151
msgid "invalid length (max {0})"
msgstr ""
#: tiramisu/option/domainnameoption.py:158
#: tiramisu/option/domainnameoption.py:157
msgid "must have dot"
msgstr ""
#: tiramisu/option/domainnameoption.py:160
#: tiramisu/option/domainnameoption.py:159
msgid "invalid length (max 255)"
msgstr ""
#: tiramisu/option/domainnameoption.py:180
#: tiramisu/option/domainnameoption.py:179
msgid "DNS resolution failed"
msgstr ""
#: tiramisu/option/domainnameoption.py:183
#: tiramisu/option/domainnameoption.py:182
msgid "error resolving DNS: {1}"
msgstr ""
#: tiramisu/option/domainnameoption.py:190
#: tiramisu/option/domainnameoption.py:189
msgid "must not be an IP"
msgstr ""
#: tiramisu/option/domainnameoption.py:213
#: tiramisu/option/domainnameoption.py:212
msgid "some characters are uppercase"
msgstr ""
#: tiramisu/option/dynoptiondescription.py:138
#: tiramisu/option/dynoptiondescription.py:130
msgid "DynOptionDescription identifiers for option {0}, is not a list ({1})"
msgstr ""
#: tiramisu/option/dynoptiondescription.py:150
#: tiramisu/option/dynoptiondescription.py:142
msgid "invalid identifier \"{}\" for option {}"
msgstr ""
#: tiramisu/option/dynoptiondescription.py:162
#: tiramisu/option/dynoptiondescription.py:154
msgid "DynOptionDescription \"{0}\" identifiers return a list with same values \"{1}\""
msgstr ""
#: tiramisu/option/emailoption.py:37
msgid "email address"
msgstr ""
#: tiramisu/option/filenameoption.py:35
msgid "file name"
msgstr ""
#: tiramisu/option/filenameoption.py:48
#: tiramisu/option/filenameoption.py:47
msgid "types parameter must be a list, not \"{0}\" for \"{1}\""
msgstr ""
#: tiramisu/option/filenameoption.py:68
#: tiramisu/option/filenameoption.py:67
msgid "must starts with \"/\""
msgstr ""
#: tiramisu/option/filenameoption.py:79
#: tiramisu/option/filenameoption.py:78
msgid "directory"
msgstr ""
#: tiramisu/option/filenameoption.py:79
#: tiramisu/option/filenameoption.py:78
msgid "file"
msgstr ""
#: tiramisu/option/filenameoption.py:83
#: tiramisu/option/filenameoption.py:82
msgid "cannot find this {0}"
msgstr ""
#: tiramisu/option/floatoption.py:33
msgid "float"
msgstr ""
#: tiramisu/option/intoption.py:32
msgid "integer"
msgstr ""
#: tiramisu/option/intoption.py:51
#: tiramisu/option/intoption.py:46
msgid "which is not an integer"
msgstr ""
#: tiramisu/option/intoption.py:57
#: tiramisu/option/intoption.py:52
msgid "value should be equal or greater than \"{0}\""
msgstr ""
#: tiramisu/option/intoption.py:59
#: tiramisu/option/intoption.py:54
msgid "value must be equal or greater than \"{0}\""
msgstr ""
#: tiramisu/option/intoption.py:64
#: tiramisu/option/intoption.py:59
msgid "value should be less than \"{0}\""
msgstr ""
#: tiramisu/option/intoption.py:66
#: tiramisu/option/intoption.py:61
msgid "value must be less than \"{0}\""
msgstr ""
#: tiramisu/option/ipoption.py:34
msgid "IP"
msgstr ""
#: tiramisu/option/ipoption.py:61
#: tiramisu/option/ipoption.py:57
msgid "it's in fact a network address"
msgstr ""
#: tiramisu/option/ipoption.py:63
#: tiramisu/option/ipoption.py:59
msgid "it's in fact a broacast address"
msgstr ""
#: tiramisu/option/ipoption.py:75
#: tiramisu/option/ipoption.py:71
msgid "CIDR address must have a \"/\""
msgstr ""
#: tiramisu/option/ipoption.py:84
#: tiramisu/option/ipoption.py:80
msgid "shouldn't be reserved IP"
msgstr ""
#: tiramisu/option/ipoption.py:86
#: tiramisu/option/ipoption.py:82
msgid "mustn't be reserved IP"
msgstr ""
#: tiramisu/option/ipoption.py:90
#: tiramisu/option/ipoption.py:86
msgid "should be private IP"
msgstr ""
#: tiramisu/option/ipoption.py:92
#: tiramisu/option/ipoption.py:88
msgid "must be private IP"
msgstr ""
@ -745,71 +692,59 @@ msgstr ""
msgid "not allowed default value for follower option {0} in leadership {1}"
msgstr ""
#: tiramisu/option/macoption.py:35
msgid "mac address"
#: tiramisu/option/networkoption.py:45
msgid "must use CIDR notation"
msgstr ""
#: tiramisu/option/netmaskoption.py:33
msgid "netmask address"
msgstr ""
#: tiramisu/option/networkoption.py:34
msgid "network address"
msgstr ""
#: tiramisu/option/networkoption.py:41
msgid "it's not a network address"
msgstr ""
#: tiramisu/option/networkoption.py:46
#: tiramisu/option/networkoption.py:60
msgid "shouldn't be reserved network"
msgstr ""
#: tiramisu/option/networkoption.py:48
#: tiramisu/option/networkoption.py:62
msgid "mustn't be reserved network"
msgstr ""
#: tiramisu/option/option.py:75
#: tiramisu/option/option.py:73
msgid "default_multi is set whereas multi is False in option: {0}"
msgstr ""
#: tiramisu/option/option.py:95
#: tiramisu/option/option.py:93
msgid "invalid multi type \"{}\" for \"{}\""
msgstr ""
#: tiramisu/option/option.py:114
#: tiramisu/option/option.py:112
msgid "validators must be a list of Calculation for \"{0}\""
msgstr ""
#: tiramisu/option/option.py:119
#: tiramisu/option/option.py:117
msgid "validators must be a Calculation for \"{0}\""
msgstr ""
#: tiramisu/option/option.py:143
#: tiramisu/option/option.py:141
msgid "invalid default_multi value \"{0}\" for option {1}"
msgstr ""
#: tiramisu/option/option.py:151
#: tiramisu/option/option.py:149
msgid "invalid default_multi value \"{0}\" for option {1}, {2}"
msgstr ""
#: tiramisu/option/option.py:164
#: tiramisu/option/option.py:162
msgid "invalid default_multi value \"{0}\" for option {1}, must be a list for a submulti"
msgstr ""
#: tiramisu/option/option.py:298
#: tiramisu/option/option.py:294
msgid "the value \"{}\" is not unique"
msgstr ""
#: tiramisu/option/option.py:361
#: tiramisu/option/option.py:357
msgid "which must not be a list"
msgstr ""
#: tiramisu/option/option.py:416 tiramisu/option/option.py:454
#: tiramisu/option/option.py:412 tiramisu/option/option.py:450
msgid "which must be a list"
msgstr ""
#: tiramisu/option/option.py:444
#: tiramisu/option/option.py:440
msgid "which \"{}\" must be a list of list"
msgstr ""
@ -835,92 +770,76 @@ msgstr ""
msgid "the option name \"{0}\" is duplicate in \"{1}\""
msgstr ""
#: tiramisu/option/optiondescription.py:408
#: tiramisu/option/optiondescription.py:411
msgid "cannot change group_type if already set (old {0}, new {1})"
msgstr ""
#: tiramisu/option/optiondescription.py:413
#: tiramisu/option/optiondescription.py:416
msgid "group_type: {0} not allowed"
msgstr ""
#: tiramisu/option/passwordoption.py:34
msgid "password"
msgstr ""
#: tiramisu/option/passwordoption.py:51
#: tiramisu/option/passwordoption.py:49
msgid "at least {0} characters are required"
msgstr ""
#: tiramisu/option/passwordoption.py:54
#: tiramisu/option/passwordoption.py:52
msgid "maximum {0} characters required"
msgstr ""
#: tiramisu/option/passwordoption.py:59
#: tiramisu/option/passwordoption.py:57
msgid "must not have the characters {0}"
msgstr ""
#: tiramisu/option/permissionsoption.py:40
msgid "unix file permissions"
msgstr ""
#: tiramisu/option/permissionsoption.py:53
#: tiramisu/option/permissionsoption.py:52
msgid "only 3 or 4 octal digits are allowed"
msgstr ""
#: tiramisu/option/permissionsoption.py:64
#: tiramisu/option/permissionsoption.py:63
msgid "user"
msgstr ""
#: tiramisu/option/permissionsoption.py:65
#: tiramisu/option/permissionsoption.py:67
#: tiramisu/option/permissionsoption.py:64
#: tiramisu/option/permissionsoption.py:66
msgid "group"
msgstr ""
#: tiramisu/option/permissionsoption.py:68
#: tiramisu/option/permissionsoption.py:67
msgid "other"
msgstr ""
#: tiramisu/option/permissionsoption.py:69
#: tiramisu/option/permissionsoption.py:68
msgid "{0} has more right than {1}"
msgstr ""
#: tiramisu/option/permissionsoption.py:72
#: tiramisu/option/permissionsoption.py:71
msgid "too weak"
msgstr ""
#: tiramisu/option/portoption.py:40
msgid "port"
msgstr ""
#: tiramisu/option/portoption.py:78
#: tiramisu/option/portoption.py:77
msgid "inconsistency in allowed range"
msgstr ""
#: tiramisu/option/portoption.py:83
#: tiramisu/option/portoption.py:82
msgid "max value is empty"
msgstr ""
#: tiramisu/option/portoption.py:96
#: tiramisu/option/portoption.py:95
msgid "range must have two values only"
msgstr ""
#: tiramisu/option/portoption.py:99
#: tiramisu/option/portoption.py:98
msgid "first port in range must be smaller than the second one"
msgstr ""
#: tiramisu/option/portoption.py:125
#: tiramisu/option/portoption.py:124
msgid "should be between {0} and {1}"
msgstr ""
#: tiramisu/option/portoption.py:127
#: tiramisu/option/portoption.py:126
msgid "must be between {0} and {1}"
msgstr ""
#: tiramisu/option/stroption.py:34
msgid "string"
msgstr ""
#: tiramisu/option/stroption.py:42
#: tiramisu/option/stroption.py:41
msgid "which is not a string"
msgstr ""
@ -928,34 +847,22 @@ msgstr ""
msgid "malformed symlink second parameters must be an option for \"{0}\", not {1}"
msgstr ""
#: tiramisu/option/urloption.py:40
msgid "URL"
msgstr ""
#: tiramisu/option/urloption.py:93
#: tiramisu/option/urloption.py:92
msgid "must start with http:// or https://"
msgstr ""
#: tiramisu/option/urloption.py:118
#: tiramisu/option/urloption.py:117
msgid "the port \"{0}\" is invalid: {1}"
msgstr ""
#: tiramisu/option/urloption.py:125
#: tiramisu/option/urloption.py:124
msgid "the domain \"{0}\" is invalid: {1}"
msgstr ""
#: tiramisu/option/urloption.py:129
#: tiramisu/option/urloption.py:128
msgid "must ends with a valid resource name"
msgstr ""
#: tiramisu/option/usernameoption.py:36
msgid "unix username"
msgstr ""
#: tiramisu/option/usernameoption.py:44
msgid "unix groupname"
msgstr ""
#: tiramisu/setting.py:258
msgid "can't rebind {0}"
msgstr ""

View file

@ -4,7 +4,7 @@ requires = ["flit_core >=3.8.0,<4"]
[project]
name = "tiramisu"
version = "5.2.0a13"
version = "5.2.0a12"
authors = [{name = "Emmanuel Garette", email = "gnunux@gnunux.info"}]
readme = "README.md"
description = "an options controller tool"

View file

@ -21,7 +21,6 @@ def test_ip(config_type):
cfg.option('a').value.set('192.168.1.0')
cfg.option('a').value.set('88.88.88.88')
cfg.option('a').value.set('0.0.0.0')
cfg.option('a').value.set('2001:db8::1')
if config_type != 'tiramisu-api':
# FIXME
with pytest.raises(ValueError):
@ -149,7 +148,8 @@ def test_network_cidr(config_type):
cfg.option('a').value.set('192.168.1.1')
with pytest.raises(ValueError):
cfg.option('a').value.set('192.168.1.1/24')
cfg.option('a').value.set('2001:db00::0/24')
with pytest.raises(ValueError):
cfg.option('a').value.set('2001:db00::0/24')
# assert not list_sessions()
@ -197,7 +197,8 @@ def test_broadcast(config_type):
cfg.option('a').value.set(1)
with pytest.raises(ValueError):
cfg.option('a').value.set(2)
cfg.option('a').value.set('2001:db8::1')
with pytest.raises(ValueError):
cfg.option('a').value.set('2001:db8::1')
cfg.option('a').value.set('0.0.0.0')
cfg.option('a').value.set('255.255.255.0')
# assert not list_sessions()

View file

@ -22,16 +22,7 @@ def test_forcepermissive_and_unrestraint(config_type):
cfg_ori.property.read_write()
cfg = get_config(cfg_ori, config_type)
with pytest.raises(ConfigError):
cfg_ori.unrestraint.forcepermissive
def test_unrestraint_and_unrestraint(config_type):
od1 = make_description()
cfg_ori = Config(od1)
cfg_ori.property.read_write()
cfg_ori.property.read_write()
cfg = get_config(cfg_ori, config_type)
cfg_ori.unrestraint.unrestraint
cfg_ori.forcepermissive.add('disabled')
def test_permissive(config_type):

View file

@ -1 +1 @@
__version__ = "5.2.0a13"
__version__ = "5.2.0a12"

View file

@ -439,22 +439,14 @@ class _TiramisuOptionOptionDescription:
return options
@option_type(["option", "optiondescription", "symlink", "with_or_without_index"])
def type(self, only_self=False, translation=False):
def type(self, only_self=False):
"""Get de option type"""
option = self._subconfig.option
if option.impl_is_optiondescription():
if translation:
type_ = _("optiondescription")
else:
type_ = "optiondescription"
elif only_self and option.impl_is_symlinkoption():
if translation:
type_ = _("symlink")
else:
type_ = "symlink"
else:
type_ = option.get_type(translation=translation)
return type_
return "optiondescription"
if only_self and option.impl_is_symlinkoption():
return "symlink"
return option.get_type()
@option_type(["option", "symlink", "with_or_without_index"])
def extra(self, extra):
@ -1931,8 +1923,6 @@ class TiramisuAPI(TiramisuHelp):
def __getattr__(self, subfunc: str) -> Any:
if subfunc in ["forcepermissive", "unrestraint", "nowarnings"]:
if subfunc == "unrestraint" and self._config_bag.is_unrestraint:
return self
if self._orig_config_bags:
msg = _(
"do not use unrestraint, nowarnings or forcepermissive together"

View file

@ -364,17 +364,10 @@ class ValueOptionError(_CommonError, ValueError):
def __init__(self, **kwargs):
if ValueOptionError.tmpl is None:
opt = kwargs.get('opt')
if opt and opt._do_not_display_value_in_error:
if kwargs.get("index") is None:
self.tmpl = _('{2} has an invalid {1}')
else:
self.tmpl = _('{2} at index "{3}" has an invalid {1}')
if kwargs.get("index") is None:
self.tmpl = _('"{0}" is an invalid {1} for {2}')
else:
if kwargs.get("index") is None:
self.tmpl = _('"{0}" is an invalid {1} for {2}')
else:
self.tmpl = _('"{0}" is an invalid {1} for {2} at index "{3}"')
self.tmpl = _('"{0}" is an invalid {1} for {2} at index "{3}"')
super().__init__(**kwargs)

View file

@ -30,7 +30,6 @@ class BoolOption(Option):
__slots__ = tuple()
_type = "boolean"
_t_type = _("boolean")
def validate(
self,

View file

@ -23,22 +23,27 @@
from ipaddress import ip_address
from ..i18n import _
from .stroption import StrOption
from .option import Option
class BroadcastOption(StrOption):
class BroadcastOption(Option):
"""represents the choice of a broadcast"""
__slots__ = tuple()
_type = "broadcast address"
_t_type = _("broadcast address")
def validate(
self,
value: str,
) -> None:
"""validate"""
super().validate(value)
if not isinstance(value, str):
raise ValueError(_("invalid string"))
if value.count(".") != 3:
raise ValueError()
for val in value.split("."):
if val.startswith("0") and len(val) > 1:
raise ValueError()
try:
ip_address(value)
except ValueError as err:

View file

@ -38,7 +38,6 @@ class ChoiceOption(Option):
__slots__ = tuple()
_type = "choice"
_t_type = _("choice")
def __init__(self, name, doc, values, *args, **kwargs):
"""

View file

@ -31,7 +31,6 @@ class DateOption(StrOption):
__slots__ = tuple()
_type = "date"
_t_type = _("date")
def validate(self, value: str) -> None:
super().validate(value)

View file

@ -43,7 +43,6 @@ class DomainnameOption(StrOption):
__slots__ = tuple()
_type = "domain name"
_t_type = _("domain name")
def __init__(
self,

View file

@ -34,4 +34,3 @@ class EmailOption(RegexpOption):
r"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$"
)
_type = "email address"
_t_type = _("email address")

View file

@ -32,7 +32,6 @@ class FilenameOption(StrOption):
__slots__ = tuple()
_type = "file name"
_t_type = _("file name")
def __init__(
self,

View file

@ -30,7 +30,6 @@ class FloatOption(Option):
__slots__ = tuple()
_type = "float"
_t_type = _("float")
def validate(self, value: float) -> None:
if not isinstance(value, float):

View file

@ -29,7 +29,6 @@ class IntOption(Option):
"represents a choice of an integer"
__slots__ = tuple()
_type = "integer"
_t_type = _("integer")
def __init__(self, *args, min_number=None, max_number=None, min_integer=None, max_integer=None, **kwargs):
extra = {}

View file

@ -31,7 +31,6 @@ class IPOption(StrOption):
__slots__ = tuple()
_type = "IP"
_t_type = _("IP")
def __init__(
self,
@ -54,9 +53,6 @@ class IPOption(StrOption):
ip_obj = ip_interface(value)
except ValueError as err:
raise ValueError() from err
self._second_level_cidr(ip_obj)
def _second_level_cidr(self, ip_obj):
if ip_obj.ip == ip_obj.network.network_address:
raise ValueError(_("it's in fact a network address"))
if ip_obj.ip == ip_obj.network.broadcast_address:

View file

@ -32,4 +32,3 @@ class MACOption(RegexpOption):
__slots__ = tuple()
_regexp = re.compile(r"^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$")
_type = "mac address"
_t_type = _("mac address")

View file

@ -30,7 +30,6 @@ class NetmaskOption(StrOption):
__slots__ = tuple()
_type = "netmask address"
_t_type = _("netmask address")
def validate(self, value: str) -> None:
super().validate(value)

View file

@ -23,22 +23,36 @@
from ipaddress import ip_network
from ..i18n import _
from .ipoption import IPOption
from .stroption import StrOption
class NetworkOption(IPOption):
class NetworkOption(StrOption):
"represents the choice of a network"
__slots__ = tuple()
_type = "network address"
_t_type = _("network address")
def __init__(self, *args, cidr=False, **kwargs):
super().__init__(*args, cidr=cidr, **kwargs)
extra = {"cidr": cidr}
super().__init__(*args, extra=extra, **kwargs)
def _second_level_cidr(self, ip_obj):
if ip_obj.ip != ip_obj.network.network_address:
raise ValueError(_("it's not a network address"))
def validate(self, value: str) -> None:
super().validate(value)
if value.count(".") != 3:
raise ValueError()
cidr = self.impl_get_extra("cidr")
if cidr:
if "/" not in value:
raise ValueError(_("must use CIDR notation"))
value_ = value.split("/")[0]
else:
value_ = value
for val in value_.split("."):
if val.startswith("0") and len(val) > 1:
raise ValueError()
try:
ip_network(value)
except ValueError as err:
raise ValueError() from err
def second_level_validation(self, value: str, warnings_only: bool) -> None:
if ip_network(value).network_address.is_reserved:

View file

@ -53,8 +53,6 @@ class Option(BaseOption):
"_choice_values_params",
)
_type = None
_t_type = None
_do_not_display_value_in_error = False
def __init__(
self,
@ -215,10 +213,8 @@ class Option(BaseOption):
"""is a dynsymlinkoption?"""
return False
def get_type(self, translation=True) -> str:
def get_type(self) -> str:
"""get the type of option"""
if translation:
return self._t_type
return self._type
def impl_getdefault(self) -> Any:

View file

@ -31,8 +31,6 @@ class PasswordOption(StrOption):
__slots__ = tuple()
_type = "password"
_t_type = _("password")
_do_not_display_value_in_error = True
def __init__(self, *args, min_len=None, max_len=None, forbidden_char=[], **kwargs):
extra = {}

View file

@ -37,7 +37,6 @@ class PermissionsOption(IntOption):
__slots__ = tuple()
perm_re = re.compile(r"^[0-7]{3,4}$")
_type = "unix file permissions"
_t_type = _("unix file permissions")
def __init__(
self,

View file

@ -37,7 +37,6 @@ class PortOption(StrOption):
__slots__ = tuple()
_type = "port"
_t_type = _("port")
def __init__(
self,

View file

@ -31,7 +31,6 @@ class StrOption(Option):
__slots__ = tuple()
_type = "string"
_t_type = _("string")
def validate(
self,

View file

@ -37,7 +37,6 @@ class URLOption(StrOption):
__slots__ = tuple()
path_re = re.compile(r"^[A-Za-z0-9\-\._~:/\?#\[\]@!%\$&\'\(\)\*\+,;=]+$")
_type = "URL"
_t_type = _("URL")
def __init__(
self,

View file

@ -33,7 +33,6 @@ class UsernameOption(RegexpOption):
# regexp build with 'man 8 adduser' informations
_regexp = re.compile(r"^[a-z_][a-z0-9_-]{0,30}[$a-z0-9_-]{0,1}$")
_type = "unix username"
_t_type = _("unix username")
class GroupnameOption(UsernameOption):
@ -41,4 +40,3 @@ class GroupnameOption(UsernameOption):
__slots__ = tuple()
_type = "unix groupname"
_t_type = _("unix groupname")