From 5c9c102245515f3853744049fcb92e94e575ae91 Mon Sep 17 00:00:00 2001
From: Emmanuel Garette <egarette@silique.fr>
Date: Sat, 29 Mar 2025 14:37:45 +0100
Subject: [PATCH] fix: doc for param

---
 locale/fr/LC_MESSAGES/rougail_output_doc.po   |  94 +++++++++---------
 locale/rougail_output_doc.pot                 |  80 ++++++++-------
 src/rougail/output_doc/doc.py                 |   4 +-
 .../fr/LC_MESSAGES/rougail_output_doc.mo      | Bin 5890 -> 6111 bytes
 src/rougail/output_doc/utils.py               |  11 +-
 tests/test_load.py                            |   2 +-
 6 files changed, 101 insertions(+), 90 deletions(-)

diff --git a/locale/fr/LC_MESSAGES/rougail_output_doc.po b/locale/fr/LC_MESSAGES/rougail_output_doc.po
index 30032b9..4948e18 100644
--- a/locale/fr/LC_MESSAGES/rougail_output_doc.po
+++ b/locale/fr/LC_MESSAGES/rougail_output_doc.po
@@ -5,8 +5,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
-"POT-Creation-Date: 2025-03-02 13:36+0100\n"
-"PO-Revision-Date: 2025-03-02 13:37+0100\n"
+"POT-Creation-Date: 2025-03-29 10:48+0100\n"
+"PO-Revision-Date: 2025-03-29 12:15+0100\n"
 "Last-Translator: \n"
 "Language-Team: \n"
 "Language: fr\n"
@@ -16,27 +16,27 @@ msgstr ""
 "Generated-By: pygettext.py 1.5\n"
 "X-Generator: Poedit 3.5\n"
 
-#: src/rougail/output_doc/annotator.py:288
+#: src/rougail/output_doc/annotator.py:294
 msgid "when the variable \"{0}\" hasn't the value \"{1}\""
 msgstr "lorsque la variable \"{0}\" n'a pas la valeur \"{1}\""
 
-#: src/rougail/output_doc/annotator.py:294
+#: src/rougail/output_doc/annotator.py:300
 msgid "when the variable \"{0}\" has the value \"{1}\""
 msgstr "lorsque la variable \"{0}\" a la valeur \"{1}\""
 
-#: src/rougail/output_doc/annotator.py:310
+#: src/rougail/output_doc/annotator.py:316
 msgid "the value of the information \"{0}\" of the variable \"{1}\""
 msgstr "la valeur de l'information \"{0}\" de la variable \"{1}\""
 
-#: src/rougail/output_doc/annotator.py:313
+#: src/rougail/output_doc/annotator.py:319
 msgid "the value of the global information \"{0}\""
 msgstr "la valeur de l'information globale \"{0}\""
 
-#: src/rougail/output_doc/annotator.py:320
+#: src/rougail/output_doc/annotator.py:326
 msgid "when the identifier is \"{0}\""
 msgstr "lorsque l'identifiant est \"{0}\""
 
-#: src/rougail/output_doc/annotator.py:322
+#: src/rougail/output_doc/annotator.py:328
 msgid "when the identifier is not \"{0}\""
 msgstr "lorsque l'identifiant n'est pas \"{0}\""
 
@@ -52,35 +52,35 @@ msgstr "Configuration de rougail-doc"
 msgid "Starting title level"
 msgstr "Niveau de titre de départ"
 
-#: src/rougail/output_doc/config.py:86
+#: src/rougail/output_doc/config.py:87
 msgid "Generate example"
 msgstr "Génération de l'exemple"
 
-#: src/rougail/output_doc/config.py:87
+#: src/rougail/output_doc/config.py:88
 msgid "Generate documentation"
 msgstr "Générer de la documentation"
 
-#: src/rougail/output_doc/config.py:91
+#: src/rougail/output_doc/config.py:93
 msgid "Do not add families in documentation"
 msgstr "Ne pas ajouter les familles dans la documentation"
 
-#: src/rougail/output_doc/config.py:92
+#: src/rougail/output_doc/config.py:94
 msgid "Add families in documentation"
 msgstr "Ajouter les familles dans la documentation"
 
-#: src/rougail/output_doc/config.py:95
+#: src/rougail/output_doc/config.py:98
 msgid "Disable documentation for variables with those modes"
 msgstr "Désactiver la documentation des variables avec ces modes"
 
-#: src/rougail/output_doc/config.py:103
+#: src/rougail/output_doc/config.py:106
 msgid "disabled when there is no mode available"
 msgstr "désactiver lorsqu'il n'y a pas de mode valable"
 
-#: src/rougail/output_doc/config.py:109
+#: src/rougail/output_doc/config.py:112
 msgid "verify if disable modes already exists"
 msgstr "vérifier le mode existe déjà"
 
-#: src/rougail/output_doc/config.py:111
+#: src/rougail/output_doc/config.py:115
 msgid "Generate document in format"
 msgstr "Générer le document au format"
 
@@ -120,19 +120,19 @@ msgstr "multiple"
 msgid "No attribute \"description\" for \"{0}\" in {1}"
 msgstr "Aucun attribut \"description\" pour \"{0}\" dans {1}"
 
-#: src/rougail/output_doc/doc.py:461
+#: src/rougail/output_doc/doc.py:463
 msgid "(default)"
 msgstr "(défaut)"
 
-#: src/rougail/output_doc/doc.py:468
+#: src/rougail/output_doc/doc.py:470
 msgid "text based with regular expressions \"{0}\""
 msgstr "texte avec expression rationnelle \"{0}\""
 
-#: src/rougail/output_doc/doc.py:556
+#: src/rougail/output_doc/doc.py:558
 msgid "depends on a calculation"
 msgstr "dépend d'un calcul"
 
-#: src/rougail/output_doc/doc.py:557
+#: src/rougail/output_doc/doc.py:559
 msgid "\"{0}\" is a calculation for {1} but has no description in {2}"
 msgstr "\"{0}\" est un calcul pour {1} mais n'a pas de description dans {2}"
 
@@ -144,15 +144,15 @@ msgstr "la valeur de la variable \"{0}\""
 msgid "the value of an undocumented variable"
 msgstr "la valeur d'une variable non documentée"
 
-#: src/rougail/output_doc/doc.py:598
+#: src/rougail/output_doc/doc.py:597
 msgid "the values of undocumented variables"
 msgstr "les valeurs de variables non documentées"
 
-#: src/rougail/output_doc/doc.py:605
+#: src/rougail/output_doc/doc.py:604
 msgid "the value of the identifier"
 msgstr "la valeur de l'identifiant"
 
-#: src/rougail/output_doc/doc.py:609
+#: src/rougail/output_doc/doc.py:608
 msgid "the value of the {0}"
 msgstr "la valeur de l'{0}"
 
@@ -166,7 +166,7 @@ msgstr "Exemple avec toutes les variables modifiable"
 
 #: src/rougail/output_doc/utils.py:41
 msgid "the domain name can starts by a dot"
-msgstr "le nom de domaine peut commencé par un point"
+msgstr "le nom de domaine peut commencer par un point"
 
 #: src/rougail/output_doc/utils.py:42
 msgid "the domain name can be a hostname"
@@ -225,66 +225,70 @@ msgid "port 0 is allowed"
 msgstr "le port 0 est autorisé"
 
 #: src/rougail/output_doc/utils.py:79
-msgid "ports 1 to 1023 are allowed"
-msgstr "les ports entre 1 et 1023 sont autorisés"
+msgid "well-known ports (1 to 1023) are allowed"
+msgstr "les ports connus (de 1 à 1023) sont autorisés"
 
 #: src/rougail/output_doc/utils.py:80
-msgid "ports 1024 to 49151 are allowed"
-msgstr "les ports entre 1024 et 49151 sont autorisés"
+msgid "registred ports (1024 to 49151) are allowed"
+msgstr "les ports enregistrés (de 1024 à 49151) sont autorisés"
 
 #: src/rougail/output_doc/utils.py:81
-msgid "ports greater than 49152 are allowed"
-msgstr "les ports supérieurs à 49152 sont autorisés"
+msgid "private ports (greater than 49152) are allowed"
+msgstr "les ports privés (supérieurs à 49152) sont autorisés"
 
 #: src/rougail/output_doc/utils.py:86
-msgid "minimum length for the secret"
-msgstr "longueur minimum pour un secret"
+msgid "minimum length for the secret is {0} characters"
+msgstr "longueur minimum pour le secret est de {0} caractères"
 
 #: src/rougail/output_doc/utils.py:87
-msgid "maximum length for the secret"
-msgstr "longueur maximal pour un secret"
+msgid "maximum length for the secret is {0} characters"
+msgstr "longueur maximal pour le secret est de {0} caractères"
 
-#: src/rougail/output_doc/utils.py:232
+#: src/rougail/output_doc/utils.py:88
+msgid "forbidden characters are {0}"
+msgstr "caractères interdits sont {0}"
+
+#: src/rougail/output_doc/utils.py:233
 msgid "Variables for \"{0}\""
 msgstr "Variables pour \"{0}\""
 
-#: src/rougail/output_doc/utils.py:248
+#: src/rougail/output_doc/utils.py:249
 msgid "Identifiers"
 msgstr "Identifiants"
 
-#: src/rougail/output_doc/utils.py:313
+#: src/rougail/output_doc/utils.py:314
 msgid "Validator"
 msgstr "Validateur"
 
-#: src/rougail/output_doc/utils.py:315
+#: src/rougail/output_doc/utils.py:316
 msgid "Validators"
 msgstr "Validateurs"
 
-#: src/rougail/output_doc/utils.py:317
+#: src/rougail/output_doc/utils.py:318
 msgid "Choices"
 msgstr "Choix"
 
-#: src/rougail/output_doc/utils.py:319
+#: src/rougail/output_doc/utils.py:320
 msgid "Default"
 msgstr "Défaut"
 
-#: src/rougail/output_doc/utils.py:323
+#: src/rougail/output_doc/utils.py:324
 msgid "Example"
 msgstr "Exemple"
 
-#: src/rougail/output_doc/utils.py:325
+#: src/rougail/output_doc/utils.py:326
 msgid "Examples"
 msgstr "Exemples"
 
-#: src/rougail/output_doc/utils.py:365
+#: src/rougail/output_doc/utils.py:366
 msgid "Description"
 msgstr "Description"
 
-#: src/rougail/output_doc/utils.py:365
+#: src/rougail/output_doc/utils.py:366
 msgid "Variable"
 msgstr "Variable"
 
-#: src/rougail/output_doc/utils.py:386
+#: src/rougail/output_doc/utils.py:387
 msgid "{0}: {1}"
 msgstr "{0} : {1}"
 
diff --git a/locale/rougail_output_doc.pot b/locale/rougail_output_doc.pot
index abe655f..da2faf1 100644
--- a/locale/rougail_output_doc.pot
+++ b/locale/rougail_output_doc.pot
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2025-03-02 13:37+0100\n"
+"POT-Creation-Date: 2025-03-29 10:48+0100\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"
@@ -15,27 +15,27 @@ msgstr ""
 "Generated-By: pygettext.py 1.5\n"
 
 
-#: src/rougail/output_doc/annotator.py:288
+#: src/rougail/output_doc/annotator.py:294
 msgid "when the variable \"{0}\" hasn't the value \"{1}\""
 msgstr ""
 
-#: src/rougail/output_doc/annotator.py:294
+#: src/rougail/output_doc/annotator.py:300
 msgid "when the variable \"{0}\" has the value \"{1}\""
 msgstr ""
 
-#: src/rougail/output_doc/annotator.py:310
+#: src/rougail/output_doc/annotator.py:316
 msgid "the value of the information \"{0}\" of the variable \"{1}\""
 msgstr ""
 
-#: src/rougail/output_doc/annotator.py:313
+#: src/rougail/output_doc/annotator.py:319
 msgid "the value of the global information \"{0}\""
 msgstr ""
 
-#: src/rougail/output_doc/annotator.py:320
+#: src/rougail/output_doc/annotator.py:326
 msgid "when the identifier is \"{0}\""
 msgstr ""
 
-#: src/rougail/output_doc/annotator.py:322
+#: src/rougail/output_doc/annotator.py:328
 msgid "when the identifier is not \"{0}\""
 msgstr ""
 
@@ -51,35 +51,35 @@ msgstr ""
 msgid "Starting title level"
 msgstr ""
 
-#: src/rougail/output_doc/config.py:86
+#: src/rougail/output_doc/config.py:87
 msgid "Generate example"
 msgstr ""
 
-#: src/rougail/output_doc/config.py:87
+#: src/rougail/output_doc/config.py:88
 msgid "Generate documentation"
 msgstr ""
 
-#: src/rougail/output_doc/config.py:91
+#: src/rougail/output_doc/config.py:93
 msgid "Do not add families in documentation"
 msgstr ""
 
-#: src/rougail/output_doc/config.py:92
+#: src/rougail/output_doc/config.py:94
 msgid "Add families in documentation"
 msgstr ""
 
-#: src/rougail/output_doc/config.py:95
+#: src/rougail/output_doc/config.py:98
 msgid "Disable documentation for variables with those modes"
 msgstr ""
 
-#: src/rougail/output_doc/config.py:103
+#: src/rougail/output_doc/config.py:106
 msgid "disabled when there is no mode available"
 msgstr ""
 
-#: src/rougail/output_doc/config.py:109
+#: src/rougail/output_doc/config.py:112
 msgid "verify if disable modes already exists"
 msgstr ""
 
-#: src/rougail/output_doc/config.py:111
+#: src/rougail/output_doc/config.py:115
 msgid "Generate document in format"
 msgstr ""
 
@@ -119,19 +119,19 @@ msgstr ""
 msgid "No attribute \"description\" for \"{0}\" in {1}"
 msgstr ""
 
-#: src/rougail/output_doc/doc.py:461
+#: src/rougail/output_doc/doc.py:463
 msgid "(default)"
 msgstr ""
 
-#: src/rougail/output_doc/doc.py:468
+#: src/rougail/output_doc/doc.py:470
 msgid "text based with regular expressions \"{0}\""
 msgstr ""
 
-#: src/rougail/output_doc/doc.py:556
+#: src/rougail/output_doc/doc.py:558
 msgid "depends on a calculation"
 msgstr ""
 
-#: src/rougail/output_doc/doc.py:557
+#: src/rougail/output_doc/doc.py:559
 msgid "\"{0}\" is a calculation for {1} but has no description in {2}"
 msgstr ""
 
@@ -143,15 +143,15 @@ msgstr ""
 msgid "the value of an undocumented variable"
 msgstr ""
 
-#: src/rougail/output_doc/doc.py:598
+#: src/rougail/output_doc/doc.py:597
 msgid "the values of undocumented variables"
 msgstr ""
 
-#: src/rougail/output_doc/doc.py:605
+#: src/rougail/output_doc/doc.py:604
 msgid "the value of the identifier"
 msgstr ""
 
-#: src/rougail/output_doc/doc.py:609
+#: src/rougail/output_doc/doc.py:608
 msgid "the value of the {0}"
 msgstr ""
 
@@ -224,66 +224,70 @@ msgid "port 0 is allowed"
 msgstr ""
 
 #: src/rougail/output_doc/utils.py:79
-msgid "ports 1 to 1023 are allowed"
+msgid "well-known ports (1 to 1023) are allowed"
 msgstr ""
 
 #: src/rougail/output_doc/utils.py:80
-msgid "ports 1024 to 49151 are allowed"
+msgid "registred ports (1024 to 49151) are allowed"
 msgstr ""
 
 #: src/rougail/output_doc/utils.py:81
-msgid "ports greater than 49152 are allowed"
+msgid "private ports (greater than 49152) are allowed"
 msgstr ""
 
 #: src/rougail/output_doc/utils.py:86
-msgid "minimum length for the secret"
+msgid "minimum length for the secret is {0} characters"
 msgstr ""
 
 #: src/rougail/output_doc/utils.py:87
-msgid "maximum length for the secret"
+msgid "maximum length for the secret is {0} characters"
 msgstr ""
 
-#: src/rougail/output_doc/utils.py:232
+#: src/rougail/output_doc/utils.py:88
+msgid "forbidden characters are {0}"
+msgstr ""
+
+#: src/rougail/output_doc/utils.py:233
 msgid "Variables for \"{0}\""
 msgstr ""
 
-#: src/rougail/output_doc/utils.py:248
+#: src/rougail/output_doc/utils.py:249
 msgid "Identifiers"
 msgstr ""
 
-#: src/rougail/output_doc/utils.py:313
+#: src/rougail/output_doc/utils.py:314
 msgid "Validator"
 msgstr ""
 
-#: src/rougail/output_doc/utils.py:315
+#: src/rougail/output_doc/utils.py:316
 msgid "Validators"
 msgstr ""
 
-#: src/rougail/output_doc/utils.py:317
+#: src/rougail/output_doc/utils.py:318
 msgid "Choices"
 msgstr ""
 
-#: src/rougail/output_doc/utils.py:319
+#: src/rougail/output_doc/utils.py:320
 msgid "Default"
 msgstr ""
 
-#: src/rougail/output_doc/utils.py:323
+#: src/rougail/output_doc/utils.py:324
 msgid "Example"
 msgstr ""
 
-#: src/rougail/output_doc/utils.py:325
+#: src/rougail/output_doc/utils.py:326
 msgid "Examples"
 msgstr ""
 
-#: src/rougail/output_doc/utils.py:365
+#: src/rougail/output_doc/utils.py:366
 msgid "Description"
 msgstr ""
 
-#: src/rougail/output_doc/utils.py:365
+#: src/rougail/output_doc/utils.py:366
 msgid "Variable"
 msgstr ""
 
-#: src/rougail/output_doc/utils.py:386
+#: src/rougail/output_doc/utils.py:387
 msgid "{0}: {1}"
 msgstr ""
 
diff --git a/src/rougail/output_doc/doc.py b/src/rougail/output_doc/doc.py
index 262796e..7c30388 100644
--- a/src/rougail/output_doc/doc.py
+++ b/src/rougail/output_doc/doc.py
@@ -21,7 +21,7 @@ from typing import Optional
 from itertools import chain
 
 from tiramisu import Calculation, undefined, groups
-from tiramisu.error import ConfigError
+from tiramisu.error import ConfigError, display_list
 from rougail.error import display_xmlfiles
 from rougail.object_model import PROPERTY_ATTRIBUTE
 
@@ -438,6 +438,8 @@ class RougailOutputDoc(Examples):
             if value is None:
                 value = option.impl_get_extra(param)
             if value is not None and value is not False:
+                if isinstance(value, (list, set)):
+                    value = display_list(value, add_quote=True)
                 informations.setdefault("validators", []).append(msg.format(value))
         # get validation information from annotator
         for name in variable.information.list():
diff --git a/src/rougail/output_doc/locale/fr/LC_MESSAGES/rougail_output_doc.mo b/src/rougail/output_doc/locale/fr/LC_MESSAGES/rougail_output_doc.mo
index f983755b8bcbecf822debdb5908c88f1c02677c5..e39101347ef172c6e32b10ef00eaf5fb2e2dd86c 100644
GIT binary patch
delta 1875
zcmajfUuYav6vy$Kbk{bU#<sgns)?y1Nt(no$!`9%O|7wMwDdtl2~rfnY_rpJ>}EF3
z%$ka(OBKZjLE9nVLyHj+Tclcy^g;1K0}3su75k#KDn*KrB3Kc8sQCTuj-`U&W$%3E
z&d%I>&Y8RWT+a`^rHjefoT2Tc-$uW`+L$ap8{?pMlQG+%3Tto}n{gK|$Gvzfy3zP0
ztY!Qv4&YI2#dFd3e_$Kqzp%%cl4)g@6<ip@CVUJV@BpsHS5OPgqbB|kyYMqyi@#w9
zE@u)ZG-*_zk7EKI<YNL3DV)VRJdA5u-@MLAJr_Q}Tks6>F_$=W;1X`ddS+FH9z=pS
zQ>cXk4!w9V@?F&P7jX?<MkVwoD!|o5r3CK5b*yjpbJB^=;~jVswa}N?jZ4^qjij#!
zhj9>}z($-$1^!XwH>eU{LCu?5S*h&ZxP|c}csm}!l1lhKCwfPpqcU5<4R{q*fkx`3
zfJV{6aqPlFsEkgcGQNP<@Mj#sOE*_4)V9i)I~n(493Mr^H@=Gc^ZLvz7YNq8fJ1l~
zGk6yD{WaW(aW=#z>_aW+pfd4LoAL;1ube_Ha0bc2T*fs1j;dH2@1-BNuc7{$FyI1J
zHt(PUIgMK2Q&fe{BFUH^QJeHvT!*#E%BE^TJ+~QqaTIr;kL&R?Dv|T3`@To5`%5W0
zvDlhga5rk=aa3jpQ19$DRAtVg_DC&JwPQDS;lrpsatJl?TiA^kqH%&9elOz@wD3h#
zrAlu{C!b&k7ru*(HB?H~je}g@h05e060<pm+FYkld*)kIz(1iXP(>CRXHc8*Ayl9<
zn87!ZA4I~O=cI}Y?ctNL-YOHm5lfYJGFF)^y576qohG@9eq&Q5h}SHm>-CJ#)s%>u
z0=|#Fjjo{8v|;t%rfR5ZqpPyom`a4C!v6SBonD{XCLO}3<4sj9;at3BP(Ktky%n|1
z^nSWF_$ZzK&+@MkuD7m*EAg>qO?wO89w(QxU29@r*2_)=w&z<}&$gaPhr>1Lq~-XW
z&ff5C=+><NugfpjG>3^q!voWv^Heslt?7an_*TcHXEXAwU|-g?28J?&eVyg`v-x~s
z#?Befo^<@cvvdDEkV*FqSV5tDZ>Do0mH4>2-OlH`_q&A|_xeq`gFE~GHCgz@%CA@S
z4e`a+fh`Ni>yE~nl+xmH&-N|HC5)UyOn$))l;8H`#@%__^6d%F4lLUbteo;D*>WYy
zkC}YIoh;f#&zf>vXR0_w1PuP~v2ZTAA>5I&S}RphO%_j34Zk?Oc*1j-&$kxmqk4p2
zC7YY0I+X7sjB*vCJ2IWzQNOS!b+x*OL@HBG6kNB+jJj7-Rf<tgEn5r<p5rrBIM(pq
E-whWeEdT%j

delta 1635
zcmZwHZD<rn9LMoVa%Wxj5|g_mYK)m;YvV&Mxx2(9Hk6tuf{0SuCR9*3bunU+i+2|l
z6fTy61X{GLTF`<Iv=9Z+5U5~5l$6pJg&-D+U@MCFN+c?x2tIs&cZ>MK;buQOv%53@
z`OhS`8^4X_{;voeHI&uV`P5a##w4*Xz=bjuG^PU|p@Y$B#?)dPet_LL7dQLuy*QKh
zFgD}&_z_<7pWnxiX+OlMF*y@ql<9PIVGXXsD(uDCm_to)7&Y)YT#CP81n*)!K0^jH
zmcbP02AqN4AV0H>OBnkxga<If{N@lhm2~`qbMP|qGdH-@<1Ji)K}IEL^EqmQHC&X5
zFMLy|?|#5?Jce4(DAwU0s7%~LEzlvlYUVeVo5k3MAL16&R(yvIcp4YtBx>bPum$T#
z$2|NR75Jd<2r9*AP~-lE3gj`iVd<<wKx;6k6mI86k?lvV@H8&MQB)w4Xz>9q#Sr;Z
zs@qX3?!}k53s+*Qw2+}OTtfSI<oKBTsPP^kyJeg*@=s8vyo|xH7Gv0hdSL{Y;g7f+
zub?J;ic0A#)D|q@py-TrpeE=>Vl^3T!eLaV#xQ|@qsBAk<ezMsRyIt5bfP9$kIGCB
z60GS%rEnis<4>r=bOH6<1UBL%cH(Q)0y--S&)1>??)Ke{n&()K8x438wO5z00q<ZG
z%a}zUeug?5oADDIMs39?>TLXjTG4aV_l-oa_9k3~N6_L;RHk0|<{}*ZdOD)MJ*ZR-
zV+)?Z1$Z5a$xNXFEvYJ;l?GIR&Awlu4qp}(;Bk!MpXlIoEJ76m@eT$S7cKF|0^!_h
zdX!5`Rnf-jRDP-kMWd-G4Fq9IsM;G9&8W1fC|WI9Cs+}yD3t+fml~9g0{K&^6Hf-b
zu3&p;rQg3C+q{urO_A|_4K8d^idD37l~!tks>7-M=AUN%PY~Xg_VJg&FH5|BCmJyQ
zI|jT1&OGlwr?w}R&Sq@PW>YrS6i?V>+O^5PzSJIfn;9%TYl=7PadUgDCH9`@+tY3`
z>!xkCH#v}hDXy2iDaVfQoN=+(ONOevjiJlao8mT>SdnNQpI`cO!27qN-WeLO8Fy>i
z&3bj=>UUb*;YF2&x!r**@x-i~%}3{54cC_EdlVC$`IzXfiDZTbC(fpKxI^iToj6s9
Ug9nw~{;(Y{i##dz;??Kh03j>Kxc~qF

diff --git a/src/rougail/output_doc/utils.py b/src/rougail/output_doc/utils.py
index 65d2e73..2242936 100644
--- a/src/rougail/output_doc/utils.py
+++ b/src/rougail/output_doc/utils.py
@@ -76,15 +76,16 @@ DocTypes = {
             "allow_range": _("can be range of port"),
             "allow_protocol": _("can have the protocol"),
             "allow_zero": _("port 0 is allowed"),
-            "allow_wellknown": _("ports 1 to 1023 are allowed"),
-            "allow_registred": _("ports 1024 to 49151 are allowed"),
-            "allow_private": _("ports greater than 49152 are allowed"),
+            "allow_wellknown": _("well-known ports (1 to 1023) are allowed"),
+            "allow_registred": _("registred ports (1024 to 49151) are allowed"),
+            "allow_private": _("private ports (greater than 49152) are allowed"),
         },
     },
     "secret": {
         "params": {
-            "min_len": _("minimum length for the secret"),
-            "max_len": _("maximum length for the secret"),
+            "min_len": _("minimum length for the secret is {0} characters"),
+            "max_len": _("maximum length for the secret is {0} characters"),
+            "forbidden_char": _("forbidden characters are {0}"),
         },
     },
 }
diff --git a/tests/test_load.py b/tests/test_load.py
index d3f3576..4337f1d 100644
--- a/tests/test_load.py
+++ b/tests/test_load.py
@@ -14,7 +14,7 @@ excludes = [
 ]
 
 test_ok = get_structures_list(excludes)
-# test_ok = [Path('../rougail-tests/structures/60_6family_dynamic_sub_dynamic_empty2')]
+# test_ok = [Path('../rougail-tests/structures/60_9family_dynamic_calc_both')]
 
 
 os.environ['COLUMNS'] = '80'