Chaque bibliothèque d’internationalisation finit par vous poser la même question : combien de versions de cette phrase la langue a-t-elle besoin ? Pour l’anglais, la réponse est deux, et il est tentant de généraliser à partir de là. C’est de cette généralisation que viennent les bugs de pluriel.
Ceci est un guide de référence. Le tableau ci-dessous liste les catégories de pluriel pour les 163 langues définies dans Unicode CLDR version 48 — les mêmes données que WebTranslateIt utilise pour décider combien de champs de traduction afficher pour un segment au pluriel. Avant le tableau, les deux idées dont vous avez besoin pour bien le lire.
Les catégories de pluriel sont des noms pour des ensembles de nombres
CLDR ne définit pas « le singulier » et « le pluriel ». Il définit jusqu’à six catégories — zero, one, two, few, many, other — et chaque langue décide quels nombres tombent dans quelle catégorie. Les noms sont des étiquettes, pas des quantités.
Concrètement :
| Langue | La catégorie one couvre |
La catégorie other couvre |
|---|---|---|
| Anglais | 1 | 0, 2, 3, … et toutes les décimales |
| Français | 0 et 1 | 2, 3, … |
| Russe | 1, 21, 31, 41, 51 … (mais pas 11) | les décimales, plus ce que few et many ne prennent pas |
Donc if count == 1 est faux en français, parce que le français dit « 0 jour » et « 1 jour » partagent une forme. Et c’est encore plus faux en russe, où 21 prend la même forme que 1, et où 11 ne la prend pas.
La règle à retenir : ne faites jamais correspondre vous-même une catégorie à un nombre. Demandez aux règles CLDR la catégorie, puis cherchez la chaîne pour cette catégorie. Toute bibliothèque i18n mature fait cela pour vous, ce qui est exactement pourquoi vous devriez lui confier le nombre plutôt que de faire le branchement dans le code applicatif.
La seule exception à connaître, c’est que les catégories couvrent aussi les décimales, et souvent différemment. Le tchèque place 1.5 dans many et l’entier 5 dans other — le fait même d’être décimal change la forme.
other est toujours requis, tout le reste ne l’est pas
Chaque langue définit other. La plupart ne définissent rien d’autre. Un fichier de traduction pour une langue doit contenir exactement les catégories que CLDR liste pour elle : un fichier polonais avec seulement one/other manque deux formes, et un fichier japonais avec one/other a une forme de trop, ce qui est inoffensif mais révèle que le fichier a été généré à partir d’un modèle anglais sans consulter les règles.
C’est aussi pourquoi la même chaîne source produit un nombre différent de champs de saisie selon la langue. Deux champs anglais deviennent quatre champs polonais et six champs arabes. Ce n’est pas l’outil qui est maladroit ; c’est la langue.
Cardinal contre ordinal
Tout ce qui précède décrit les pluriels cardinaux — un fichier, deux fichiers, cinq fichiers. CLDR définit séparément des règles ordinales pour premier, deuxième, troisième, qui ont leurs propres catégories et leurs propres ensembles par langue. L’anglais en est l’illustration la plus claire : les cardinaux ont besoin de deux formes, les ordinaux de quatre (1st, 2nd, 3rd, 4th). Si vous formatez des positions, des rangs ou des dates en ordinal, vous avez besoin des règles ordinales, et de selectordinal dans ICU MessageFormat plutôt que de plural. Le tableau de ce guide couvre les cardinaux.
Comment les règles s’écrivent selon le framework
Les catégories sont universelles ; la notation ne l’est pas.
| Framework | Notation | Exemple |
|---|---|---|
GNU gettext (.po) |
un nombre nplurals plus une expression C sélectionnant un index |
`nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 \ |
| Rails / Ruby I18n (YAML) | clés imbriquées nommées d’après les catégories | pl: { messages: { one: …, few: …, many: …, other: … } } |
| ICU MessageFormat | {count, plural, one {…} other {…}} |
fonctionne dans ICU4J, ICU4C, FormatJS, messageformat.js |
.stringsdict iOS |
plist XML avec NSStringPluralRuleType et une clé par catégorie |
<key>few</key><string>%d wiadomości</string> |
strings.xml Android |
<plurals> avec <item quantity="few"> |
les quantités sont les noms de catégories CLDR |
| i18next | suffixes de clé _one, _few, _many, _other (v4+) |
item_few, item_many |
ResourceBundle Java |
aucune prise en charge native — utilisez MessageFormat d’ICU |
Notez le piège dans gettext : son expression plural= renvoie un index, pas un nom de catégorie. L’index 0 est la forme vers laquelle l’expression le fait correspondre, ce qui est conventionnellement mais pas nécessairement la forme one. Quand vous convertissez un fichier .po vers un format basé sur des catégories, vous devez évaluer l’expression plutôt que supposer que la position 0 signifie one.
Règles de pluriel par langue
CLDR v48, catégories de pluriel cardinales, 163 langues. Les nombres indiqués sont les valeurs qui sélectionnent chaque catégorie — une lecture compacte des règles sous-jacentes plutôt que les règles elles-mêmes.
| Langue | Code | Formes | Catégories, et les nombres qui les sélectionnent |
|---|---|---|---|
| Acholi | ach |
1 | other 0-999, 1.2… |
| Afrikaans | af |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Akan | ak |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Albanais | sq |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Amharique | am |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Arabe | ar |
6 | zero 0 · one 1 · two 2 · few 3-10, 103-110, 203-210… · many 11-99, 111-199, 211-299… · other 100-102, 200-202, 300-302… 0.2, 1.07, 2.94, 3.81, 11.68, 100.55… |
| Aragonais | an |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Arménien | hy, hye |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Assamais | as |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Asturien | ast |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Azéri | az |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Baloutchi | bal |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Bambara | bm |
1 | other 0-999, 1.2… |
| Basque | eu |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Biélorusse | be |
4 | one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94… |
| Bemba | bem |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Bengali | bn |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Bihari | bh |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Bosnien | bs |
4 | one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94… |
| Breton | br |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Bulgare | bg |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Birman | my |
1 | other 0-999, 1.2… |
| Catalan | ca |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Khmer central | km |
1 | other 0-999, 1.2… |
| Cherokee | chr |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Chinois | zh |
1 | other 0-999, 1.2… |
| Tchouvache | cv |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Cornique | kw |
6 | zero 0 · one 1 · two 2, 22, 42, 62, 82, 102… · few 3, 23, 43, 63, 83… · many 4, 24, 44, 64, 84… · other 5-21, 25-41, 45-61… |
| Turc de Crimée | crh |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Croate | hr |
4 | one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94… |
| Tchèque | cs |
4 | one 1 · few 2-4 · many 0.0-1.5, 10.0, 100.0… (decimals) · other 0, 5-20, 25-30… |
| Danois | da |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Néerlandais | nl |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Dzongkha | dz |
1 | other 0-999, 1.2… |
| Anglais | en |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Espéranto | eo |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Estonien | et |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Féroïen | fo |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Filipino | fil |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Finnois | fi |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Français | fr |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Frioulan | fur |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Peul | ff |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Gaélique écossais | gd |
4 | one 1, 11 · two 2, 12 · few 3-10, 13-19 · other 0, 20-99, 100, 1000…, 0.5, 1.7… |
| Galicien | gl |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Géorgien | ka |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Allemand | de |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Grec | el |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Gujarati | gu |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| guw | guw |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Hakha chin | cnh |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Haoussa | ha |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Hébreu | he |
3 | one 1 · two 2 · other 0, 3-999…, 0.5, 1.0, 2.5… |
| Hindi | hi |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Hongrois | hu |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| hyw | hyw |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Islandais | is |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Ido | io |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Igbo | ig |
1 | other 0-999, 1.2… |
| Sami d’Inari | smn |
3 | one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94… |
| Indonésien | id |
1 | other 0-999, 1.2… |
| Irlandais | ga |
3 | one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94… |
| Italien | it |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| iw | iw |
3 | one 1 · two 2 · other 0, 3-999…, 0.5, 1.0, 2.5… |
| Japonais | ja |
1 | other 0-999, 1.2… |
| Javanais | jv |
1 | other 0-999, 1.2… |
| Kabyle | kab |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Kannada | kn |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Kazakh | kk |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| kde | kde |
1 | other 0-999, 1.2… |
| kea | kea |
1 | other 0-999, 1.2… |
| Kinyarwanda | rw |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Kirghize | ky |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Konkani | kok |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Coréen | ko |
1 | other 0-999, 1.2… |
| ksh | ksh |
3 | zero 0 · one 1 · other 2-999…, 0.5, 1.2… |
| Kurde | ku |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Letton | lv |
3 | zero 0 · one 1, 21, 31, 41, 51, 61, … · other 2-20, 22-30, 32-40… 0.2, 1.07, 2.94… |
| lij | lij |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Limbourgeois | li |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Lingala | ln |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Lituanien | lt |
3 | one 1, 21, 31, 41, 51, 61 · few 2-9, 22-29, 32-39… · other 0, 10-20, 30, 40, 50…, 1.2, 2.07, 10.94… |
| lkt | lkt |
1 | other 0-999, 1.2… |
| lld | lld |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Bas allemand | nds |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Sami de Lule | smj |
3 | one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94… |
| Luxembourgeois | lb |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Macédonien | mk |
2 | one 1, 21, 31, 41, 51, 61… · other 0, 2-20, 22-30, 32-40…, 1.2, 2.07… |
| Maithili | mai |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Malgache | mg |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Malais | ms |
1 | other 0-999, 1.2… |
| Malayalam | ml |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Maltais | mt |
4 | one 1 · few 0, 2-10, 102-110, 202-210… · many 11-19, 111-119, 211-219… · other 20-101, 120-201, 220-301…, 1.2, 2.07, 11.94, 20.81… |
| Mannois | gv |
5 | one 1, 11, 21, 31… · two 2, 12, 22, 32… · few 0, 20, 40, 60, 80, 100… · many 0.5, 1.2, 2.7… (decimals) · other 3-10, 13-19, 23-29… |
| Maori | mi |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Marathi | mr |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Mongol | mn |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| N’ko | nqo |
1 | other 0-999, 1.2… |
| Langues nahuatl | nah |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Népalais | ne |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| no | no |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Sami du Nord | se |
3 | one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94… |
| Norvégien Bokmål | nb |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Norvégien Nynorsk | nn |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Occitan (après 1500) | oc |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Oriya | or |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Oromo | om |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Pendjabi | pa |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Papiamento | pap |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Pedi | nso |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Persan | fa |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Polonais | pl |
4 | one 1 · few 2-4, 22-24, 32-34… · many 0, 5-21, 25-31, 35-41 · other 1.2, 2.07, 5.94… |
| Portugais | pt |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Pachto | ps |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Roumain | ro |
3 | one 1 · few 0, 2-19, 101-119, 201-219… · other 20-100, 120-200, 220-300…, 1.2, 2.07, 20.94… |
| Romanche | rm |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Russe | ru |
4 | one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94… |
| Langues sames (autres) | smi |
3 | one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94… |
| Sango | sg |
1 | other 0-999, 1.2… |
| Santali | sat |
3 | one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94… |
| Sarde | sc |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Serbe | sr |
4 | one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94… |
| Serbo-croate | sh |
4 | one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94… |
| ses | ses |
1 | other 0-999, 1.2… |
| shi | shi |
3 | one 0, 1 · few 2-10 · other 11-999…, 0.5, 1.2… |
| Sicilien | scn |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Cingalais | si |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Sami skolt | sms |
3 | one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94… |
| Slovaque | sk |
4 | one 1 · few 2-4 · many 0.0-1.5, 10.0, 100.0… (decimals) · other 0, 5-20, 25-30… |
| Slovène | sl |
4 | one 1, 101, 201, 301, 401, 501… · two 2, 102, 202, 302, 402, 502… · few 3, 4, 103, 104, 203, 204… · other 0, 5-100, 105-200, 205-300…, 1.2, 2.07, 3.94, 5.81… |
| Somali | so |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Sami du Sud | sma |
3 | one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94… |
| Espagnol | es |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Soundanais | su |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Swahili | sw |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Suédois | sv |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Suisse allemand | gsw |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Syriaque | syr |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Tagalog | tl |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Tamoul | ta |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Télougou | te |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Thaï | th |
1 | other 0-999, 1.2… |
| Tibétain | bo |
1 | other 0-999, 1.2… |
| Tigrigna | ti |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Tonguien (îles Tonga) | to |
1 | other 0-999, 1.2… |
| Turc | tr |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Turkmène | tk |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| tzm | tzm |
2 | one 0, 1, 11-99 · other 2-10, 100-999… |
| Ouïghour | ug |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Ukrainien | uk |
4 | one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94… |
| Ourdou | ur |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Ouzbek | uz |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| vec | vec |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Vietnamien | vi |
1 | other 0-999, 1.2… |
| Wallon | wa |
2 | one 0, 1 · other 2-999…, 1.2, 2.07, … |
| Gallois | cy |
6 | zero 0 · one 1 · two 2 · few 3 · many 6 · other 4, 5, 7-999…, 0.2, 1.07… |
| Frison occidental | fy |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Wolof | wo |
1 | other 0-999, 1.2… |
| Xhosa | xh |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Yakoute | sah |
1 | other 0-999, 1.2… |
| Yiddish | yi |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
| Yoruba | yo |
1 | other 0-999, 1.2… |
| Zoulou | zu |
2 | one 1 · other 0, 2-999…, 1.2, 2.07… |
La répartition, en un coup d’œil
| Formes | Langues | Membres notables |
|---|---|---|
| 1 | 25 | Chinois, japonais, coréen, vietnamien, thaï, indonésien, malais, birman |
| 2 | 106 | Anglais, allemand, espagnol, italien, néerlandais, portugais, turc, grec, hébreu‡ |
| 3 | 15 | Russe, tchèque, ukrainien, serbe, croate, lituanien, letton, polonais‡ |
| 4 | 13 | Polonais, slovène, maltais, gaélique, breton |
| 5 | 1 | Mannois |
| 6 | 3 | Arabe, gallois, cornique |
‡ CLDR révise ces chiffres au fil du temps ; lisez le tableau ci-dessus plutôt que ce résumé quand cela compte.
Deux enseignements pour la planification. D’abord, les langues à forme unique ne sont pas une erreur d’arrondi — un quart des plus grands marchés linguistiques du monde se trouve dans cette colonne, et pour eux, toute mécanique de pluriel que vous construisez est un coût pur. Ensuite, la longue traîne à quatre, cinq et six formes est là où vivent les bugs, parce que c’est la partie de la matrice que personne dans une équipe anglophone ne peut vérifier d’un simple coup d’œil.
Les règles changent, et les règles obsolètes sont silencieuses
CLDR est publié à peu près chaque année et les règles de pluriel sont bel et bien révisées. Une langue qui avait trois catégories dans une version peut en avoir quatre dans la suivante, ou les plages de nombres derrière une catégorie peuvent changer. Rien dans votre application ne l’annoncera. Le fichier continue de s’analyser normalement, la catégorie manquante ne s’affiche simplement jamais, et la langue retombe silencieusement en repli.
WebTranslateIt suit la version CLDR derrière les règles de chaque projet et affiche un badge « Règles de pluriel obsolètes ? » sur la page Langues et statistiques quand les règles stockées d’un projet divergent de la version courante, avec une option en un clic pour adopter les nouveaux réglages par défaut ou ignorer l’avertissement si la divergence est volontaire. Si vous maintenez les règles de pluriel à la main, mettez plutôt un rappel dans votre calendrier à chaque version de CLDR — le mode d’échec est trop silencieux pour être repéré autrement.
Une courte liste de contrôle
- Passez le nombre à votre bibliothèque i18n. Ne branchez jamais sur
== 1dans le code applicatif. - Générez les fichiers de traduction à partir des catégories CLDR de chaque langue cible, pas de la forme de la langue source.
- Validez que chaque segment au pluriel a bien toutes les catégories requises par la langue, avant la mise en production.
- N’oubliez pas que les décimales sélectionnent aussi des catégories, et souvent différentes de celles des entiers voisins.
- Revérifiez vos règles après chaque version de CLDR.
Frequently asked questions
- Combien de formes de pluriel chaque langue a-t-elle ?
- Cela va de une à six. Le chinois, le japonais, le coréen, le vietnamien, le thaï et une vingtaine d’autres langues ont une seule forme. L’anglais, l’allemand, l’espagnol et la majeure partie de l’Europe en ont deux. Le russe, le polonais, le tchèque et les langues slaves en général en ont trois ou quatre. L’arabe et le gallois en ont six. Le tableau complet de ce guide liste les 163 langues définies par CLDR.
- La catégorie CLDR one signifie-t-elle toujours le nombre 1 ?
- Non, et c’est l’erreur la plus fréquente dans la gestion des pluriels. En français, one couvre à la fois 0 et 1. En russe, one couvre 1, 21, 31, 41 et tout autre nombre se terminant par 1, sauf ceux se terminant par 11. Les catégories sont des noms pour des ensembles de nombres, et chaque langue définit ses propres ensembles.
- Quelles sont les six catégories de pluriel CLDR ?
- zero, one, two, few, many et other. Chaque langue utilise other comme catégorie fourre-tout ; les cinq autres ne sont utilisées que par les langues qui en ont besoin. Une langue n’utilise jamais une catégorie que ses règles ne définissent pas, donc un fichier de traduction doit contenir exactement les catégories que CLDR liste pour cette langue.
- Que se passe-t-il si une traduction manque une forme de pluriel ?
- À l’exécution, la recherche de cette catégorie échoue et vous obtenez soit une chaîne de repli dans la mauvaise langue, soit une clé visible, soit un plantage, selon le framework. C’est pourquoi il vaut mieux valider l’exhaustivité des pluriels avant que le fichier ne parte en production, plutôt que de la découvrir via un rapport de bug dans une langue que personne dans l’équipe ne lit.
Keep reading
-
ICU MessageFormat : un guide pratique
La syntaxe des pluriels, de la sélection par genre, du formatage des nombres et des dates dans une seule chaîne de message — avec les règles d’échappement et les erreurs que font systématiquement les traducteurs.
-
en-GB vs en_GB : trait d’union ou underscore dans les codes de locale ?
La norme dit trait d’union, la moitié de votre chaîne d’outils dit underscore. Voici le format attendu par chaque écosystème, pourquoi cette scission existe, et comment passer de l’un à l’autre sans rien casser.
-
Personnaliser les règles de pluriel dans WebTranslateIt (documentation)
Modifiez les règles de pluriel d’une langue par projet, et repérez quand vos règles ont pris du retard sur une version de CLDR.
Translate your app without the spreadsheet round-trip
WebTranslateIt reads the file formats and placeholder syntax described on this page, validates them as translators work, and syncs the results straight back into your repository.