mozilla

Revision 166709 of Localisation et pluriels

  • Raccourci de la révision : Localisation_et_pluriels
  • Titre de la révision : Localisation et pluriels
  • ID de la révision : 166709
  • Créé :
  • Créateur : BenoitL
  • Version actuelle ? Non
  • Commentaire /* Extension de test */
Étiquettes : 

Contenu de la révision

{{template.Fx_minversion_header(3)}} {{template.Traduction_en_cours("Localization and Plurals")}} Vous vous trouvez probablement ici parce que vous localisez un fichier <tt>.properties</tt> et que celui-ci liait vers cette page. Celle-ci a pour objet d'expliquer comment localiser ces chaînes afin que la forme plurielle correcte soit affichée pour l'utilisateur. Par exemple, on aura « 1 page », mais « 2 pages ».

Si vous êtes ici pour rendre votre code (par exemple une extension) localisable avec des formes plurielles, vous pouvez passer directement au paragraphe Développement avec PluralForm, mais vous aurez probablement besoin de définir les chaînes initiales pour votre code de la même manière, il vaudrait donc mieux parcourir également au moins la section Utilisation.

Utilisation

Les termes suivants sont utilisés dans cette page pour que les choses soient les plus claires possibles :

  • règle de pluriel : pour une langue donnée, il existe une règle grammaticale sur la forme des mots selon leur nombre qualificatif. Chaque langue peut avoir ses propres règles.
  • forme plurielle : pour une règle de pluriel particulière, différentes formes d'un mot peuvent exister comme « page » et « pages ». Dans ce cas, on a simplement deux formes, mais d'autre langues peuvent n'en avoir qu'une seule ou beaucoup plus.

Si vous êtes ici pour traiter <tt>pluralRule</tt> dans le fichier <tt>chrome/global/intl.properties</tt>, vous devrez d'abord établir quelle règle de pluriel choisir pour votre localisation. Cette règle de pluriel est utilisée pour déterminer le nombre de formes plurielles nécessaires pour chaque mot qui doit être localisé en tenant compte des pluriels.

Pour tous les autres fichiers properties qui lient vers cette page, vous devrez fournir autant de formes plurielles que nécessaire du mot désiré et les séparer par des points-virgules (;). Si vous ne savez pas combien vous en avez besoin, vérifiez le nombre <tt>pluralRule</tt> dans <tt>chrome/global/intl.properties</tt> et vérifiez l'entrée correspondante dans la liste suivante de règles de pluriel.

Liste de règles de pluriel

Cette section contient une liste de règles de pluriel triées par leur nombre de règle. Chaque entrée indique combien de formes plurielles sont nécessaires pour localiser un mot. Pour chacune d'entre-elles, une liste de familles et de langues correspondantes est fournie afin de vous aider à déterminer s'il s'agit de la règle à choisir pour <tt>pluralRule</tt>. En outre, vous y trouverez une brève description de chaque forme plurielle suivie de quelques exemples de nombres entrant dans cette forme particulière.

Pour une règle de pluriel donnée, l'ordre dans lequel les formes de pluriels sont données est le même que celui dans lequel vous devrez localiser un mot en les séparant par des points-virgules. Par exemple, le français utilise la règle plurielle 2 et la localisation de <tt>pluriels</tt> nécessiterait une chaîne de type « pluriel;pluriels » où le premier mot est la forme au singulier et le second la forme plurielle générique.

Règle de pluriel n°0 (1 forme)

Familles : asiatiques (chinois, japonais, coréen, vietnamien), turques/altaïques (turc)
tout : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, …

Règle de pluriel n°1 (2 formes)

Familles : germaniques (danois, néerlandais, anglais, féroïen, frison, allemand, norvégien, suédois), finno-ougriennes (estonien, finnois, hongrois), isolats (basque), latines/grecques (grec), sémitiques (hébreu), romanes (italien, portugais, espagnol, catalan)
pour 1 : 1
tout le reste : 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, …

Règle de pluriel n°2 (2 formes)

Familles: romanes (français, portugais brésilien)
pour 0 ou 1 : 0, 1
tout le reste: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, …

Règle de pluriel n°3 (3 formes)

Familles : baltes (letton)
pour 0 : 0
se termine par 1, sauf 11: 1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 131, 141, 151, 161, 171, 181, 191, 201, 221, 231, 241, 251, 261, 271, 281, 291, …
tout le reste : 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, …

Règle de pluriel n°4 (3 formes)

Familles : celtiques (gaélique écossais)
pour 1 : 1
pour 2 : 2
tout le reste : 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, …

Règle de pluriel n°5 (3 formes)

Familles : romanes (roumain)
pour 1 : 1
pour 0 ou se terminant par 01-19 : 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, …
tout le reste : 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, …

Règle de pluriel n°6 (3 formes)

Familles : baltes (lituanien)
se termine par 1, sauf 11 : 1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 131, 141, 151, 161, 171, 181, 191, 201, 221, 231, 241, 251, 261, 271, 281, 291, …
se termine par 0 ou par 10-20 : 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, …
tout le reste : 2, 3, 4, 5, 6, 7, 8, 9, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 45, 46, 47, 48, 49, 52, 53, 54, 55, 56, 57, 58, 59, 62, 63, 64, 65, 66, 67, 68, 69, 72, 73, …

Règle de pluriel n°7 (3 formes)

Familles : slaves (croate, serbe, russe, ukrainien)
se termine par 1, sauf 11 : 1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 131, 141, 151, 161, 171, 181, 191, 201, 221, 231, 241, 251, 261, 271, 281, 291, …
se termine par 2-4, sauf 12-14 : 2, 3, 4, 22, 23, 24, 32, 33, 34, 42, 43, 44, 52, 53, 54, 62, 63, 64, 72, 73, 74, 82, 83, 84, 92, 93, 94, 102, 103, 104, 122, 123, 124, 132, 133, 134, 142, 143, 144, 152, 153, 154, 162, 163, 164, 172, 173, 174, 182, 183, …
tout le reste : 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 35, 36, 37, 38, 39, 40, 45, 46, 47, 48, 49, 50, 55, 56, 57, 58, 59, 60, 65, 66, 67, 68, 69, 70, 75, 76, 77, …

Règle de pluriel n°8 (3 formes)

Familles : slaves (slovaque, tchèque)
pour 1 : 1
pour 2-4 : 2, 3, 4
tout le reste : 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, …

Règle de pluriel n°9 (3 formes)

Familles : slaves (polonais)
pour 1 : 1
se termine par 2-4, sauf 12-14 : 2, 3, 4, 22, 23, 24, 32, 33, 34, 42, 43, 44, 52, 53, 54, 62, 63, 64, 72, 73, 74, 82, 83, 84, 92, 93, 94, 102, 103, 104, 122, 123, 124, 132, 133, 134, 142, 143, 144, 152, 153, 154, 162, 163, 164, 172, 173, 174, 182, 183, …
tout le reste : 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 25, 26, 27, 28, 29, 30, 31, 35, 36, 37, 38, 39, 40, 41, 45, 46, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 65, 66, 67, 68, …

Règle de pluriel n°10 (4 formes)

Familles : slaves (slovène, sorabe)
se termine par 01 : 1, 101, 201, …
se termine par 02 : 2, 102, 202, …
se termine par 03-04 : 3, 4, 103, 104, 203, 204, …
tout le reste : 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, …

Règle de pluriel n°11 (5 formes)

Familles : celtiques (gaélique irlandais)
pour 1 : 1
pour 2 : 2
pour 3-6 : 3, 4, 5, 6
pour 7-10 : 7, 8, 9, 10
tout le reste : 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, …

Règle de pluriel n°12 (4 formes)

Familles : sémitiques (arabe)
pour 1 : 1
pour 2 : 2
pour 0 ou 3-10 : 0, 3, 4, 5, 6, 7, 8, 9, 10
tout le reste : 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, …

Règle de pluriel n°13 (4 formes)

Familles : sémitiques (maltais)
pour 1: 1
pour 0 ou se termine par 01-10 : 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, …
se termine par 11-19 : 11, 12, 13, 14, 15, 16, 17, 18, 19, 111, 112, 113, 114, 115, 116, 117, 118, 119, 211, 212, 213, 214, 215, 216, 217, 218, 219, …
tout le reste : 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, …

Règle de pluriel n°14 (3 formes)

Familles : slaves (macédonien)
se termine par 1 : 1, 11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 201, 211, 221, 231, 241, 251, 261, 271, 281, 291, …
se termine par 2 : 2, 12, 22, 32, 42, 52, 62, 72, 82, 92, 102, 112, 122, 132, 142, 152, 162, 172, 182, 192, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, …
tout le reste : 0, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 57, 58, 59, 60, 63, …

Exemples

Suivent quelques exemples pour diverses langues et une brève explication du processus.

Français

Dans certaines régions francophones, le zéro est traité comme un pluriel alors que dans d'autres c'est un singulier. Le seul autre singulier est 1 alors que tout le reste est au pluriel. Choisissez donc la règle de pluriel n°1 ou n°2.

pluralRule=2
seconds=seconde;secondes
minutes=minute;minutes
hours=heure;heures
days=jour;jours

Comme souvent lorsque vous localisez des mots, l'accord en genre peut vous forcer à réarranger les mots de manière à ce que le genre soit toujours identique (seconde est féminin alors que jour est masculin).

Chinois

Un mot ne change pas s'il est précédé d'un nombre, donc tous les nombres utilisent la même forme plurielle. Comme il n'y a qu'une seule forme il s'agit de la règle de pluriel n°0. Pour chaque mot à localiser, il n'y a que ce mot à préciser, sans qu'il soit nécessaire d'ajouter des points-virgules.

pluralRule=0
seconds=秒
minutes=分
hours=時
days=日

Polonais

Il existe une forme de singulier pour 1, une forme plurielle pour 2-4, et une autre pour 5-21. À partir de là, 22 est la même forme que 2. La règle de pluriel n°7 a bien « se termine par 2-4, sauf 12-14 », mais la forme du singulier comprend tout ce qui se termine par 1 à part 11. La règle n°9 est donc préférable puisqu'elle a correctement la forme au singulier pour 1 uniquement.

pluralRule=9
seconds=sekunda;sekundy;sekund
minutes=minuta;minuty;minut
hours=godzina;godziny;godzin
days=dzień;dni;dni

Bien que les deux dernières formes plurielles de « days » soient les mêmes, elles sont toutes deux nécessaires car il doit y avoir trois formes plurielles pour chaque mot.

Sorabe

Quatre formes plurielles existent : nominatif singulier, nominatif double, nominatif pluriel, génitif pluriel. Ceci correspond à la règle de pluriel n°10.

pluralRule=10
seconds=sekunda;sekundźe;sekundy;sekundow
minutes=mjeńšina;mjeńšinje;mjeńšiny;mjeńšin
hours=hodźina;hodźinje;hodźiny;hodźin
days=dźeń;dnjej;dny;dnjow

Extension de test

Pour vous assurer de choisir la bonne règle de pluriel et fournir suffisamment de formes plurielles pour une chaîne, utilisez l'extension pluralForm Checker. Après son installation, elle devrait être accessible depuis le menu Outils.

Pour l'utiliser, remplissez la liste des fichiers properties et des chaînes à vérifier et cliquez sur le bouton. L'extension chargera chaque chaîne et affichera les formes plurielles dans un tableau. La sélection d'une entrée du tableau remplira la boîte inférieure avec des exemples d'utilisation du mot pour certains nombres.

Image:pluralForm-checker.0.3.png

Installation de l'extension pluralForm Checker v0.3

Entrées pour l'extension

Cette liste devrait être maintenue pour contenir tous les mots nécessitant des formes plurielles. Les utilisateurs de l'extension pourront alors copier-coller cette entrée.

chrome://mozapps/locale/downloads/downloads.properties=seconds,minutes,hours,days
chrome://mozapps/locale/downloads/downloads.properties=downloadsTitleFiles,downloadsTitlePercent
chrome://browser/locale/browser.properties=activeDownloads,pausedDownloads

Historique des versions

0.1 : Version initiale avec vérification de pluralRule, chargement de properties en entrée, génération de tableaux, exemple d'affichage en sortie
0.2 : Utilisation de PluralForm.numForms() pour obtenir le nombre de formes au lieu d'essayer de le déterminer localement afin de mieux gérer les futures règles — nécessite une compilation ultérieure à 2007-01-27
0.3 : Génération d'une liste des nombres tombant dans chaque forme plurielle afin de réduire la sortie d'exemples à 3 par forme tout au plus

Developpement avec PluralForm

The functionality for getting the correct plural forms is provided by a JavaScript Module, <tt>PluralForm.jsm</tt>. This module provides a couple methods for localizing to the browser's current locale as well as getting methods to localize to a desired plural rule. The latter ability of specifying a plural rule is useful for extensions because the extension doesn't necessarily have to be localized to the browser's locale.

Chargement de <tt>PluralForm.jsm</tt>

Loading the PluralForm module from JavaScript is simple with Components.utils.import. Just put the following line somewhere that will be evaluated before you want to use PluralForm. At the top of your JavaScript file is fine.

Components.utils.import("resource://gre/modules/PluralForm.jsm");

Les méthodes <tt>get</tt> et <tt>numForms</tt>

These methods make use of the browser's current locale specified by <tt>chrome://global/locale/intl.properties</tt>'s <tt>pluralRule</tt> value.

/**
 * Get the correct plural form of a word based on the number
 *
 * @param aNum
 *        The number to decide which plural form to use
 * @param aWords
 *        A semi-colon (;) separated string of words to pick the plural form
 * @return The appropriate plural form of the word
 */
string pluralForm
get(int aNum, string aWords)
/**
 * Get the number of forms for the current plural rule
 *
 * @return The number of forms
 */
int numForms
numForms()

Here is an example of using these methods:

// Load PluralForm and for this example, assume English
Components.utils.import("resource://gre/modules/PluralForm.jsm");

// PluralForm.get expects a semi-colon separated list of words
let forms = "form;forms";
// We're going to pick the correct plural form based on the following number
let numForms = PluralForm.numForms();

// Display the correct plural form for "forms"
print("This locale has " + numForms + " " + PluralForm.get(numForms, forms) + ".");

The above example works, but is still difficult to localize because we're concatenating strings assuming a particular grammatical structure. The following would be better:

Components.utils.import("resource://gre/modules/PluralForm.jsm");

let forms = "This locale has one form.;This locale has #1 forms.";
let numForms = PluralForm.numForms();

// For English, this would display "This locale has 2 forms."
print(PluralForm.get(numForms, forms).replace("#1", numForms);

Notice in the above example that the code can be written to support placeholders or not use placeholders in some forms of the string. Additionally, the localizer has control over where the placeholder is in relation to the rest of the text.

Of course, the strings to be localized will be placed in a separate file such as yourextension.properties instead of being hardcoded in the JavaScript code file.

The following 3 file snippets show how to use PluralForm with your <tt>.xul</tt>, <tt>.properties</tt>, <tt>.js</tt> files.

<tt>downloads.xul</tt>:

<stringbundleset>
  <stringbundle id="strings" src="chrome://downloads.properties"/>
</stringbundleset>

<tt>downloads.properties</tt>:

# LOCALIZATION NOTE (downloadsTitleFiles): Semi-colon list of plural forms.
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
# #1 number of files
# example: 111 files - Downloads
downloadsTitleFiles=#1 file - Downloads;#1 files - Downloads

# LOCALIZATION NOTE (timePair): #1 time number; #2 time unit
# example: 1 second; 11 seconds
timePair=#1 #2
seconds=second;seconds

<tt>downloads.js</tt>:

Components.utils.import("resource://gre/modules/PluralForm.jsm");
let getStr = function(string) document.getElementById("strings").getString(string);

// Get the correct plural form for the title
let numDownloads = 3;
let title = PluralForm.get(numDownloads, getStr("downloadsTitleFiles"));
// Put in the correct number of downloads
print(title.replace("#1", numDownloads));

// Get the correct plural form of seconds
let timeLeft = 55;
let seconds = PluralForm.get(timeLeft, getStr("seconds"));
// Print the localized string for "55 seconds"
print(getStr("timePair").replace("#1", timeLeft).replace("#2", seconds));

La méthode <tt>makeGetter</tt>

If you're writing an extension, you'll want to use <tt>makeGetter</tt> instead of <tt>PluralForm.get()</tt> or <tt>PluralForm.numForms()</tt> because someone installing the extension on a different locale will be using the strings provided by your default extension locale. For example, your extension localized for English with plural rule #1, which expects 2 plural forms, is installed on a localized version of Firefox with plural rule #4, which expects 3 forms.

/**
 * Create a pair of plural form functions for the given plural rule number.
 *
 * @param aRuleNum
 *        The plural rule number to create functions
 * @return A pair: [function that gets the right plural form,
 *                  function that returns the number of plural forms]
 */ 
[string pluralForm get(int aNum, string aWords), int numForms numForms()]
makeGetter(int aRuleNum)

Here is an example usage of <tt>makeGetter</tt>:

Components.utils.import("resource://gre/modules/PluralForm.jsm");

// Let's get Irish (plural rule #11)
let [get, numForms] = PluralForm.makeGetter(11);

// Make up some values to use with "get"
let dummyText = "form 1;form 2;form 3;form 4;form 5";
let dummyNum = 10;

// In the case of Irish, the value 10 uses plural form #4, so "form 4" is printed
print(get(dummyNum, dummyText));

In this example, the Irish plural rule was hardcoded, but this could be a value specified in the .properties file. So for your extension, specify a pluralRule value in the .properties and call <tt>PluralForm.makeGetter(pluralRuleFromProperties)</tt> making sure to save the 2 returned functions. (You can use destructured assignment in JavaScript 1.7 to keep things clean.) The returned functions act just like <tt>PluralForm.get()</tt> and <tt>PluralForm.numForms()</tt> except for the specified plural rule instead of the default plural rule.

Crédits

Plural Form code first implemented for {{template.Bug(394516)}} - Figure out a remaining-time rounding scheme for minutes -> hours/days
Plural rules and families derived from GNU <tt>gettext</tt> documentation.

{{ wiki.languages( { "en": "en/Localization_and_Plurals", "ja": "ja/Localization_and_Plurals" } ) }}

Source de la révision

<p>{{template.Fx_minversion_header(3)}}
{{template.Traduction_en_cours("Localization and Plurals")}}
Vous vous trouvez probablement ici parce que vous localisez un fichier <tt>.properties</tt> et que celui-ci liait vers cette page. Celle-ci a pour objet d'expliquer comment localiser ces chaînes afin que la forme plurielle correcte soit affichée pour l'utilisateur. Par exemple, on aura « 1 page », mais « 2 pages ».
</p><p>Si vous êtes ici pour rendre votre code (par exemple une extension) localisable avec des formes plurielles, vous pouvez passer directement au paragraphe <a href="#D.C3.A9veloppement_avec_PluralForm">Développement avec PluralForm</a>, mais vous aurez probablement besoin de définir les chaînes initiales pour votre code de la même manière, il vaudrait donc mieux parcourir également au moins la section Utilisation.
</p>
<h3 name="Utilisation"> Utilisation </h3>
<p>Les termes suivants sont utilisés dans cette page pour que les choses soient les plus claires possibles :
</p>
<ul><li> <b>règle de pluriel</b> : pour une langue donnée, il existe une règle grammaticale sur la forme des mots selon leur nombre qualificatif. Chaque langue peut avoir ses propres règles.
</li><li> <b>forme plurielle</b> : pour une règle de pluriel particulière, différentes formes d'un mot peuvent exister comme « page » et « pages ». Dans ce cas, on a simplement deux formes, mais d'autre langues peuvent n'en avoir qu'une seule ou beaucoup plus.
</li></ul>
<p>Si vous êtes ici pour traiter <tt>pluralRule</tt> dans le fichier <tt>chrome/global/intl.properties</tt>, vous devrez d'abord établir quelle <i>règle de pluriel</i> choisir pour votre localisation. Cette règle de pluriel est utilisée pour déterminer le nombre de <i>formes plurielles</i> nécessaires pour chaque mot qui doit être localisé en tenant compte des pluriels.
</p><p>Pour tous les autres fichiers properties qui lient vers cette page, vous devrez fournir autant de formes plurielles que nécessaire du mot désiré et les séparer par des points-virgules (;). Si vous ne savez pas combien vous en avez besoin, vérifiez le nombre <tt>pluralRule</tt> dans <tt>chrome/global/intl.properties</tt> et vérifiez l'entrée correspondante dans la liste suivante de règles de pluriel.
</p>
<h3 name="Liste_de_r.C3.A8gles_de_pluriel"> Liste de règles de pluriel </h3>
<p>Cette section contient une liste de règles de pluriel triées par leur nombre de règle. Chaque entrée indique combien de formes plurielles sont nécessaires pour localiser un mot. Pour chacune d'entre-elles, une liste de familles et de langues correspondantes est fournie afin de vous aider à déterminer s'il s'agit de la règle à choisir pour <tt>pluralRule</tt>. En outre, vous y trouverez une brève description de chaque forme plurielle suivie de quelques exemples de nombres entrant dans cette forme particulière.
</p><p>Pour une règle de pluriel donnée, l'ordre dans lequel les formes de pluriels sont données est le même que celui dans lequel vous devrez localiser un mot en les séparant par des points-virgules. Par exemple, le français utilise la règle plurielle 2 et la localisation de <tt>pluriels</tt> nécessiterait une chaîne de type « pluriel;pluriels » où le premier mot est la forme au singulier et le second la forme plurielle générique.
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B00_.281_forme.29"> Règle de pluriel n°<i><b>0</b></i> (1 forme) </h4>
<p><b>Familles</b> : asiatiques (chinois, japonais, coréen, vietnamien), turques/altaïques (turc)<br>
<b>tout</b> : <small>0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B01_.282_formes.29"> Règle de pluriel n°<i><b>1</b></i> (2 formes) </h4>
<p><b>Familles</b> : germaniques (danois, néerlandais, anglais, féroïen, frison, allemand, norvégien, suédois), finno-ougriennes (estonien, finnois, hongrois), isolats (basque), latines/grecques (grec), sémitiques (hébreu), romanes (italien, portugais, espagnol, catalan)<br>
<b>pour 1</b> : <small>1</small><br>
<b>tout le reste</b> : <small>0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B02_.282_formes.29"> Règle de pluriel n°<i><b>2</b></i> (2 formes) </h4>
<p><b>Familles</b>: romanes (français, portugais brésilien)<br>
<b>pour 0 ou 1</b> : <small>0, 1</small><br>
<b>tout le reste</b>: <small>2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B03_.283_formes.29"> Règle de pluriel n°<i><b>3</b></i> (3 formes) </h4>
<p><b>Familles</b> : baltes (letton)<br>
<b>pour 0</b> : <small>0</small><br>
<b>se termine par 1, sauf 11</b>: <small>1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 131, 141, 151, 161, 171, 181, 191, 201, 221, 231, 241, 251, 261, 271, 281, 291, …</small><br>
<b>tout le reste</b> : <small>2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B04_.283_formes.29"> Règle de pluriel n°<i><b>4</b></i> (3 formes) </h4>
<p><b>Familles</b> : celtiques (gaélique écossais)<br>
<b>pour 1</b> : <small>1</small><br>
<b>pour 2</b> : <small>2</small><br>
<b>tout le reste</b> : <small>0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B05_.283_formes.29"> Règle de pluriel n°<i><b>5</b></i> (3 formes) </h4>
<p><b>Familles</b> : romanes (roumain)<br>
<b>pour 1</b> : <small>1</small><br>
<b>pour 0 ou se terminant par 01-19</b> : <small>0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, …</small><br>
<b>tout le reste</b> : <small>20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B06_.283_formes.29"> Règle de pluriel n°<i><b>6</b></i> (3 formes) </h4>
<p><b>Familles</b> : baltes (lituanien)<br>
<b>se termine par 1, sauf 11</b> : <small>1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 131, 141, 151, 161, 171, 181, 191, 201, 221, 231, 241, 251, 261, 271, 281, 291, …</small><br>
<b>se termine par 0 ou par 10-20</b> : <small>0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, …</small><br>
<b>tout le reste</b> : <small>2, 3, 4, 5, 6, 7, 8, 9, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 45, 46, 47, 48, 49, 52, 53, 54, 55, 56, 57, 58, 59, 62, 63, 64, 65, 66, 67, 68, 69, 72, 73, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B07_.283_formes.29"> Règle de pluriel n°<i><b>7</b></i> (3 formes) </h4>
<p><b>Familles</b> : slaves (croate, serbe, russe, ukrainien)<br>
<b>se termine par 1, sauf 11</b> : <small>1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 131, 141, 151, 161, 171, 181, 191, 201, 221, 231, 241, 251, 261, 271, 281, 291, …</small><br>
<b>se termine par 2-4, sauf 12-14</b> : <small>2, 3, 4, 22, 23, 24, 32, 33, 34, 42, 43, 44, 52, 53, 54, 62, 63, 64, 72, 73, 74, 82, 83, 84, 92, 93, 94, 102, 103, 104, 122, 123, 124, 132, 133, 134, 142, 143, 144, 152, 153, 154, 162, 163, 164, 172, 173, 174, 182, 183, …</small><br>
<b>tout le reste</b> : <small>0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 35, 36, 37, 38, 39, 40, 45, 46, 47, 48, 49, 50, 55, 56, 57, 58, 59, 60, 65, 66, 67, 68, 69, 70, 75, 76, 77, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B08_.283_formes.29"> Règle de pluriel n°<i><b>8</b></i> (3 formes) </h4>
<p><b>Familles</b> : slaves (slovaque, tchèque)<br>
<b>pour 1</b> : <small>1</small><br>
<b>pour 2-4</b> : <small>2, 3, 4</small><br>
<b>tout le reste</b> : <small>0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B09_.283_formes.29"> Règle de pluriel n°<i><b>9</b></i> (3 formes) </h4>
<p><b>Familles</b> : slaves (polonais)<br>
<b>pour 1</b> : <small>1</small><br>
<b>se termine par 2-4, sauf 12-14</b> : <small>2, 3, 4, 22, 23, 24, 32, 33, 34, 42, 43, 44, 52, 53, 54, 62, 63, 64, 72, 73, 74, 82, 83, 84, 92, 93, 94, 102, 103, 104, 122, 123, 124, 132, 133, 134, 142, 143, 144, 152, 153, 154, 162, 163, 164, 172, 173, 174, 182, 183, …</small><br>
<b>tout le reste</b> : <small>0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 25, 26, 27, 28, 29, 30, 31, 35, 36, 37, 38, 39, 40, 41, 45, 46, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 65, 66, 67, 68, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B010_.284_formes.29"> Règle de pluriel n°<i><b>10</b></i> (4 formes) </h4>
<p><b>Familles</b> : slaves (slovène, sorabe)<br>
<b>se termine par 01</b> : <small>1, 101, 201, …</small><br>
<b>se termine par 02</b> : <small>2, 102, 202, …</small><br>
<b>se termine par 03-04</b> : <small>3, 4, 103, 104, 203, 204, …</small><br>
<b>tout le reste</b> : <small>0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B011_.285_formes.29"> Règle de pluriel n°<i><b>11</b></i> (5 formes) </h4>
<p><b>Familles</b> : celtiques (gaélique irlandais)<br>
<b>pour 1</b> : <small>1</small><br>
<b>pour 2</b> : <small>2</small><br>
<b>pour 3-6</b> : <small>3, 4, 5, 6</small><br>
<b>pour 7-10</b> : <small>7, 8, 9, 10</small><br>
<b>tout le reste</b> : <small>0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B012_.284_formes.29"> Règle de pluriel n°<i><b>12</b></i> (4 formes) </h4>
<p><b>Familles</b> : sémitiques (arabe)<br>
<b>pour 1</b> : <small>1</small><br>
<b>pour 2</b> : <small>2</small><br>
<b>pour 0 ou 3-10</b> : <small>0, 3, 4, 5, 6, 7, 8, 9, 10</small><br>
<b>tout le reste</b> : <small>11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B013_.284_formes.29"> Règle de pluriel n°<i><b>13</b></i> (4 formes) </h4>
<p><b>Familles</b> : sémitiques (maltais)<br>
<b>pour 1</b>: <small>1</small><br>
<b>pour 0 ou se termine par 01-10</b> : <small>0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, …</small><br>
<b>se termine par 11-19</b> : <small>11, 12, 13, 14, 15, 16, 17, 18, 19, 111, 112, 113, 114, 115, 116, 117, 118, 119, 211, 212, 213, 214, 215, 216, 217, 218, 219, …</small><br>
<b>tout le reste</b> : <small>20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, …</small><br>
</p>
<h4 name="R.C3.A8gle_de_pluriel_n.C2.B014_.283_formes.29"> Règle de pluriel n°<i><b>14</b></i> (3 formes) </h4>
<p><b>Familles</b> : slaves (macédonien)<br>
<b>se termine par 1</b> : <small>1, 11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 201, 211, 221, 231, 241, 251, 261, 271, 281, 291, …</small><br>
<b>se termine par 2</b> : <small>2, 12, 22, 32, 42, 52, 62, 72, 82, 92, 102, 112, 122, 132, 142, 152, 162, 172, 182, 192, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, …</small><br>
<b>tout le reste</b> : <small>0, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 57, 58, 59, 60, 63, …</small><br>
</p>
<h3 name="Exemples"> Exemples </h3>
<p>Suivent quelques exemples pour diverses langues et une brève explication du processus.
</p>
<h4 name="Fran.C3.A7ais"> Français </h4>
<p>Dans certaines régions francophones, le zéro est traité comme un pluriel alors que dans d'autres c'est un singulier. Le seul autre singulier est 1 alors que tout le reste est au pluriel. Choisissez donc la règle de pluriel n°1 ou n°2.
</p><p><code>
pluralRule=2<br>
seconds=seconde;secondes<br>
minutes=minute;minutes<br>
hours=heure;heures<br>
days=jour;jours
</code>
</p><p>Comme souvent lorsque vous localisez des mots, l'accord en genre peut vous forcer à réarranger les mots de manière à ce que le genre soit toujours identique (<i>seconde</i> est féminin alors que <i>jour</i> est masculin).
</p>
<h4 name="Chinois"> Chinois </h4>
<p>Un mot ne change pas s'il est précédé d'un nombre, donc tous les nombres utilisent la même forme plurielle. Comme il n'y a qu'une seule forme il s'agit de la règle de pluriel n°0. Pour chaque mot à localiser, il n'y a que ce mot à préciser, sans qu'il soit nécessaire d'ajouter des points-virgules.
</p><p><code>
pluralRule=0<br>
seconds=秒<br>
minutes=分<br>
hours=時<br>
days=日
</code>
</p>
<h4 name="Polonais"> Polonais </h4>
<p>Il existe une forme de singulier pour 1, une forme plurielle pour 2-4, et une autre pour 5-21. À partir de là, 22 est la même forme que 2. La règle de pluriel n°7 a bien « se termine par 2-4, sauf 12-14 », mais la forme du singulier comprend tout ce qui se termine par 1 à part 11. La règle n°9 est donc préférable puisqu'elle a correctement la forme au singulier pour 1 uniquement.
</p><p><code>
pluralRule=9<br>
seconds=sekunda;sekundy;sekund<br>
minutes=minuta;minuty;minut<br>
hours=godzina;godziny;godzin<br>
days=dzień;dni;dni
</code>
</p><p>Bien que les deux dernières formes plurielles de « days » soient les mêmes, elles sont toutes deux nécessaires car il doit y avoir trois formes plurielles pour chaque mot.
</p>
<h4 name="Sorabe"> Sorabe </h4>
<p>Quatre formes plurielles existent : nominatif singulier, nominatif double, nominatif pluriel, génitif pluriel. Ceci correspond à la règle de pluriel n°10.
</p><p><code>
pluralRule=10<br>
seconds=sekunda;sekundźe;sekundy;sekundow<br>
minutes=mjeńšina;mjeńšinje;mjeńšiny;mjeńšin<br>
hours=hodźina;hodźinje;hodźiny;hodźin<br>
days=dźeń;dnjej;dny;dnjow
</code>
</p>
<h3 name="Extension_de_test"> Extension de test </h3>
<p>Pour vous assurer de choisir la bonne règle de pluriel et fournir suffisamment de formes plurielles pour une chaîne, utilisez l'extension pluralForm Checker. Après son installation, elle devrait être accessible depuis le menu Outils.
</p><p>Pour l'utiliser, remplissez la liste des fichiers properties et des chaînes à vérifier et cliquez sur le bouton. L'extension chargera chaque chaîne et affichera les formes plurielles dans un tableau. La sélection d'une entrée du tableau remplira la boîte inférieure avec des exemples d'utilisation du mot pour certains nombres.
</p><p><img alt="Image:pluralForm-checker.0.3.png" src="File:fr/Media_Gallery/PluralForm-checker.0.3.png">
</p><p><a class="external" href="http://ed.agadak.net/firefox/pluralForm-checker.xpi">Installation de l'extension pluralForm Checker v0.3</a>
</p>
<h4 name="Entr.C3.A9es_pour_l.27extension"> Entrées pour l'extension </h4>
<p>Cette liste devrait être maintenue pour contenir tous les mots nécessitant des formes plurielles. Les utilisateurs de l'extension pourront alors copier-coller cette entrée.
</p><p><code><small>
chrome://mozapps/locale/downloads/downloads.properties=seconds,minutes,hours,days<br>
chrome://mozapps/locale/downloads/downloads.properties=downloadsTitleFiles,downloadsTitlePercent<br>
chrome://browser/locale/browser.properties=activeDownloads,pausedDownloads
</small></code>
</p>
<h4 name="Historique_des_versions"> Historique des versions </h4>
<p>0.1 : Version initiale avec vérification de pluralRule, chargement de properties en entrée, génération de tableaux, exemple d'affichage en sortie<br>
0.2 : Utilisation de PluralForm.numForms() pour obtenir le nombre de formes au lieu d'essayer de le déterminer localement afin de mieux gérer les futures règles — <b>nécessite une compilation ultérieure à 2007-01-27</b><br>
0.3 : Génération d'une liste des nombres tombant dans chaque forme plurielle afin de réduire la sortie d'exemples à 3 par forme tout au plus
</p>
<h3 name="Developpement_avec_PluralForm"> Developpement avec PluralForm </h3>
<p>The functionality for getting the correct plural forms is provided by a JavaScript Module, <tt>PluralForm.jsm</tt>. This module provides a couple methods for localizing to the browser's current locale as well as getting methods to localize to a desired plural rule. The latter ability of specifying a plural rule is useful for extensions because the extension doesn't necessarily have to be localized to the browser's locale.
</p>
<h4 name="Chargement_de_PluralForm.jsm"> Chargement de <tt>PluralForm.jsm</tt> </h4>
<p>Loading the PluralForm module from JavaScript is simple with <a href="fr/Components.utils.import">Components.utils.import</a>. Just put the following line somewhere that will be evaluated before you want to use PluralForm. At the top of your JavaScript file is fine.
</p>
<pre>Components.utils.import("resource://gre/modules/PluralForm.jsm");</pre>
<h4 name="Les_m.C3.A9thodes_get_et_numForms"> Les méthodes <tt>get</tt> et <tt>numForms</tt> </h4>
<p>These methods make use of the browser's current locale specified by <tt>chrome://global/locale/intl.properties</tt>'s <tt>pluralRule</tt> value.
</p>
<pre>/**
 * Get the correct plural form of a word based on the number
 *
 * @param aNum
 *        The number to decide which plural form to use
 * @param aWords
 *        A semi-colon (;) separated string of words to pick the plural form
 * @return The appropriate plural form of the word
 */
string pluralForm
get(int aNum, string aWords)</pre>
<pre>/**
 * Get the number of forms for the current plural rule
 *
 * @return The number of forms
 */
int numForms
numForms()</pre>
<p>Here is an example of using these methods:
</p>
<pre>// Load PluralForm and for this example, assume English
Components.utils.import("resource://gre/modules/PluralForm.jsm");

// PluralForm.get expects a semi-colon separated list of words
let forms = "form;forms";
// We're going to pick the correct plural form based on the following number
let numForms = PluralForm.numForms();

// Display the correct plural form for "forms"
print("This locale has " + numForms + " " + PluralForm.get(numForms, forms) + ".");
</pre>
<p>The above example works, but is still difficult to localize because we're concatenating strings assuming a particular grammatical structure. The following would be better:
</p>
<pre>Components.utils.import("resource://gre/modules/PluralForm.jsm");

let forms = "This locale has one form.;This locale has #1 forms.";
let numForms = PluralForm.numForms();

// For English, this would display "This locale has 2 forms."
print(PluralForm.get(numForms, forms).replace("#1", numForms);</pre>
<p>Notice in the above example that the code can be written to support placeholders or not use placeholders in some forms of the string. Additionally, the localizer has control over where the placeholder is in relation to the rest of the text.
</p><p>Of course, the strings to be localized will be placed in a separate file such as yourextension.properties instead of being hardcoded in the JavaScript code file.
</p><p>The following 3 file snippets show how to use PluralForm with your <tt>.xul</tt>, <tt>.properties</tt>, <tt>.js</tt> files.
</p><p><tt>downloads.xul</tt>:
</p>
<pre>&lt;stringbundleset&gt;
  &lt;stringbundle id="strings" src="chrome://downloads.properties"/&gt;
&lt;/stringbundleset&gt;</pre>
<p><tt>downloads.properties</tt>:
</p>
<pre># LOCALIZATION NOTE (downloadsTitleFiles): Semi-colon list of plural forms.
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
# #1 number of files
# example: 111 files - Downloads
downloadsTitleFiles=#1 file - Downloads;#1 files - Downloads

# LOCALIZATION NOTE (timePair): #1 time number; #2 time unit
# example: 1 second; 11 seconds
timePair=#1 #2
seconds=second;seconds</pre>
<p><tt>downloads.js</tt>:
</p>
<pre>Components.utils.import("resource://gre/modules/PluralForm.jsm");
let getStr = function(string) document.getElementById("strings").getString(string);

// Get the correct plural form for the title
let numDownloads = 3;
let title = PluralForm.get(numDownloads, getStr("downloadsTitleFiles"));
// Put in the correct number of downloads
print(title.replace("#1", numDownloads));

// Get the correct plural form of seconds
let timeLeft = 55;
let seconds = PluralForm.get(timeLeft, getStr("seconds"));
// Print the localized string for "55 seconds"
print(getStr("timePair").replace("#1", timeLeft).replace("#2", seconds));</pre>
<h4 name="La_m.C3.A9thode_makeGetter"> La méthode <tt>makeGetter</tt> </h4>
<p>If you're writing an extension, you'll want to use <tt>makeGetter</tt> instead of <tt>PluralForm.get()</tt> or <tt>PluralForm.numForms()</tt> because someone installing the extension on a different locale will be using the strings provided by your default extension locale. For example, your extension localized for English with plural rule #1, which expects 2 plural forms, is installed on a localized version of Firefox with plural rule #4, which expects 3 forms.
</p>
<pre>/**
 * Create a pair of plural form functions for the given plural rule number.
 *
 * @param aRuleNum
 *        The plural rule number to create functions
 * @return A pair: [function that gets the right plural form,
 *                  function that returns the number of plural forms]
 */ 
[string pluralForm get(int aNum, string aWords), int numForms numForms()]
makeGetter(int aRuleNum)</pre>
<p>Here is an example usage of <tt>makeGetter</tt>:
</p>
<pre>Components.utils.import("resource://gre/modules/PluralForm.jsm");

// Let's get Irish (plural rule #11)
let [get, numForms] = PluralForm.makeGetter(11);

// Make up some values to use with "get"
let dummyText = "form 1;form 2;form 3;form 4;form 5";
let dummyNum = 10;

// In the case of Irish, the value 10 uses plural form #4, so "form 4" is printed
print(get(dummyNum, dummyText));</pre>
<p>In this example, the Irish plural rule was hardcoded, but this could be a value specified in the .properties file. So for your extension, specify a pluralRule value in the .properties and call <tt>PluralForm.makeGetter(pluralRuleFromProperties)</tt> making sure to save the 2 returned functions. (You can use <a href="fr/New_in_JavaScript_1.7#Destructuring_assignment">destructured assignment</a> in JavaScript 1.7 to keep things clean.) The returned functions act just like <tt>PluralForm.get()</tt> and <tt>PluralForm.numForms()</tt> except for the specified plural rule instead of the default plural rule.
</p>
<h3 name="Cr.C3.A9dits"> Crédits </h3>
<p>Plural Form code first implemented for {{template.Bug(394516)}} - <i>Figure out a remaining-time rounding scheme for minutes -&gt; hours/days</i><br>
Plural rules and families derived from <a class="external" href="http://www.gnu.org/software/gettext/manual/html_node/gettext_150.html#Plural-forms">GNU <tt>gettext</tt> documentation</a>.
</p>
<div class="noinclude">
</div>
{{ wiki.languages( { "en": "en/Localization_and_Plurals", "ja": "ja/Localization_and_Plurals" } ) }}
Revenir à cette révision