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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
|
---
title: Localización y Plurales
slug: Localización_y_Plurales
tags:
- Internacionalizacion
- Internationalization
- Localización
- Localization
translation_of: Mozilla/Localization/Localization_and_Plurals
---
<p>{{ Fx_minversion_header(3) }} Probablemente estas aquí porque estás localizando un archivo .properties el cual poseía un enlace a esta página. Esta página explica cómo localizar esas cadenas para mostrar la forma plural correcta al usuario. Por ejemplo, "una página" contra "dos páginas".</p>
<p>Si estás aquí para hacer tu código (por ejemplo, una extensión) localizable para formas plurales, puedes ir directo a<a href="#Desarrollar_con_Formas_Plurales">Desarrollar con Formas Plurales</a>, pero probablemente necesitarás localizar las cadenas iniciales de tu código, por lo que será bueno que leas al menos hasta la sección Uso inclusive.</p>
<h2 id="Uso" name="Uso">Uso</h2>
<p>Aquí hay un par de términos usados en esta página para ayudar a mantener la claridad:</p>
<ul>
<li><strong>regla plural</strong>: Para un lenguaje dado, existe una regla gramatical que determina la forma en que cambiarán las palabras, y ello variará según el número que califique a esa palabra. Lenguajes diferentes pueden tener diferentes reglas.</li>
<li><strong>Forma Plural</strong>: Para una regla plural en particular, pueden existir múltiples formas de una palabra, tales como "página" y "páginas". Es este caso hay 2 formas, pero otros lenguajes pueden tener una o más.</li>
</ul>
<p>Si estas aquí por las Reglas Plurales en el archivo chrome/global/intl.properties , necesitarás averiguar qué<em>regla plural</em> elegir para tu localización. Esta regla plurall se usa para determinar cuántas<em>formas plurales</em> se necesitan para cada palabra que necesita ser localizada teniendo en cuenta los plurales.</p>
<p>Para todos los otros archivos de propiedades (properties files) que enlacen a esta página, necesitarás proveer sucifientes formas plurales de la palabra deseada y separarlas con punto y coma (;). Si no sabes cuántas formas plurales necesitas, revisa el número Regla Plural en chrome/global/intl.properties y búsca la entrada correspondiente en la siguiente lista de reglas plurales.</p>
<h2 id="Lista_de_Reglas_Plurales" name="Lista_de_Reglas_Plurales">Lista de Reglas Plurales</h2>
<p>Esta sección contiene una lista de reglas plurales ordenada por su número de regla plural. Cada entrada indica cuántas formas plurales se necesitan cuando se localiza una palabra. Para cada entrada, existe una lista de familias y lenguajes en esas familias para ayudarte a decidir si esa es la regla que deves elegir como Regla Plural. Además, hay una breve descripción de cada forma plural seguida de algunos números de ejemplo que caen dentro de esa forma particular.</p>
<p>Para una regla plural dada, el orden en que las formas plurales son listadas es el mismo orden que necesitas para localizar una palabra, separado por punto y coma. Por ejemplo el inglés usa la regla plural 1, luego localizar plurales requeriría cadenas como "plural;plurales" donde la primer palabra es la forma singulas y la segunda es la forma plural general.</p>
<h3 id="Plural_rule_.230_.281_form.29" name="Plural_rule_.230_.281_form.29">Plural rule #<em><strong>0</strong></em> (1 form)</h3>
<p><strong>Families</strong>: Asian (Chinese, Japanese, Korean, Vietnamese), Turkic/Altaic (Turkish), Thai<br>
<strong>everything</strong>: <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></p>
<h3 id="Plural_rule_.231_.282_forms.29" name="Plural_rule_.231_.282_forms.29">Plural rule #<em><strong>1</strong></em> (2 forms)</h3>
<p><strong>Families</strong>: Germanic (Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish), Finno-Ugric (Estonian, Finnish, Hungarian), Language isolate (Basque), Latin/Greek (Greek), Semitic (Hebrew), Romanic (Italian, Portuguese, Spanish, Catalan)<br>
<strong>is 1</strong>: <small>1</small><br>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.232_.282_forms.29" name="Plural_rule_.232_.282_forms.29">Plural rule #<em><strong>2</strong></em> (2 forms)</h3>
<p><strong>Families</strong>: Romanic (French, Brazilian Portuguese)<br>
<strong>is 0 or 1</strong>: <small>0, 1</small><br>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.233_.283_forms.29" name="Plural_rule_.233_.283_forms.29">Plural rule #<em><strong>3</strong></em> (3 forms)</h3>
<p><strong>Families</strong>: Baltic (Latvian)<br>
<strong>is 0</strong>: <small>0</small><br>
<strong>ends in 1, not 11</strong>: <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>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.234_.283_forms.29" name="Plural_rule_.234_.283_forms.29">Plural rule #<em><strong>4</strong></em> (3 forms)</h3>
<p><strong>Families</strong>: Celtic (Scottish Gaelic)<br>
<strong>is 1</strong>: <small>1</small><br>
<strong>is 2</strong>: <small>2</small><br>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.235_.283_forms.29" name="Plural_rule_.235_.283_forms.29">Plural rule #<em><strong>5</strong></em> (3 forms)</h3>
<p><strong>Families</strong>: Romanic (Romanian)<br>
<strong>is 1</strong>: <small>1</small><br>
<strong>is 0 or ends in 01-19</strong>: <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>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.236_.283_forms.29" name="Plural_rule_.236_.283_forms.29">Plural rule #<em><strong>6</strong></em> (3 forms)</h3>
<p><strong>Families</strong>: Baltic (Lithuanian)<br>
<strong>ends in 1, not 11</strong>: <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>
<strong>ends in 0 or ends in 10-20</strong>: <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>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.237_.283_forms.29" name="Plural_rule_.237_.283_forms.29">Plural rule #<em><strong>7</strong></em> (3 forms)</h3>
<p><strong>Families</strong>: Slavic (Croatian, Serbian, Russian, Ukrainian)<br>
<strong>ends in 1, not 11</strong>: <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>
<strong>ends in 2-4, not 12-14</strong>: <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>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.238_.283_forms.29" name="Plural_rule_.238_.283_forms.29">Plural rule #<em><strong>8</strong></em> (3 forms)</h3>
<p><strong>Families</strong>: Slavic (Slovak, Czech)<br>
<strong>is 1</strong>: <small>1</small><br>
<strong>is 2-4</strong>: <small>2, 3, 4</small><br>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.239_.283_forms.29" name="Plural_rule_.239_.283_forms.29">Plural rule #<em><strong>9</strong></em> (3 forms)</h3>
<p><strong>Families</strong>: Slavic (Polish)<br>
<strong>is 1</strong>: <small>1</small><br>
<strong>ends in 2-4, not 12-14</strong>: <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>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.2310_.284_forms.29" name="Plural_rule_.2310_.284_forms.29">Plural rule #<em><strong>10</strong></em> (4 forms)</h3>
<p><strong>Families</strong>: Slavic (Slovenian, Sorbian)<br>
<strong>ends in 01</strong>: <small>1, 101, 201, …</small><br>
<strong>ends in 02</strong>: <small>2, 102, 202, …</small><br>
<strong>ends in 03-04</strong>: <small>3, 4, 103, 104, 203, 204, …</small><br>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.2311_.285_forms.29" name="Plural_rule_.2311_.285_forms.29">Plural rule #<em><strong>11</strong></em> (5 forms)</h3>
<p><strong>Families</strong>: Celtic (Irish Gaeilge)<br>
<strong>is 1</strong>: <small>1</small><br>
<strong>is 2</strong>: <small>2</small><br>
<strong>is 3-6</strong>: <small>3, 4, 5, 6</small><br>
<strong>is 7-10</strong>: <small>7, 8, 9, 10</small><br>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.2312_.284_forms.29" name="Plural_rule_.2312_.284_forms.29">Plural rule #<em><strong>12</strong></em> (4 forms)</h3>
<p><strong>Families</strong>: Semitic (Arabic)<br>
<strong>is 1</strong>: <small>1</small><br>
<strong>is 2</strong>: <small>2</small><br>
<strong>ends in 03-10</strong>: <small>3, 4, 5, 6, 7, 8, 9, 10, 103, 104, 105, 106, 107, 108, 109, 110, 2</small><small>03, 204, 205, 206, 207, 208, 209, 210, </small><small>…</small><br>
<strong>everything else but is 0 and ends in 00-02, excluding 0-2</strong>: <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>
<strong>ends in 00-02, excluding 0-2</strong>: <small>100, 101, 102, 200, 201, 202, …</small><br>
<strong>is 0</strong>: <small>0</small></p>
<h3 id="Plural_rule_.2313_.284_forms.29" name="Plural_rule_.2313_.284_forms.29">Plural rule #<em><strong>13</strong></em> (4 forms)</h3>
<p><strong>Families</strong>: Semitic (Maltese)<br>
<strong>is 1</strong>: <small>1</small><br>
<strong>is 0 or ends in 01-10</strong>: <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>
<strong>ends in 11-19</strong>: <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>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_.2314_.283_forms.29" name="Plural_rule_.2314_.283_forms.29">Plural rule #<em><strong>14</strong></em> (3 forms)</h3>
<p><strong>Families</strong>: Slavic (Macedonian)<br>
<strong>ends in 1</strong>: <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>
<strong>ends in 2</strong>: <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>
<strong>everything else</strong>: <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></p>
<h3 id="Plural_rule_15_(2_forms)">Plural rule #<em><strong>15</strong></em> (2 forms)</h3>
<p><strong>Families</strong>: Icelandic, Macedonian<br>
<strong>ends in 1, excluding 11</strong>: <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>
<strong>everything else</strong>: <small>0, 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, …</small></p>
<h3 id="Plural_rule_16_(5_forms)">Plural rule #<em><strong>16</strong></em> (5 forms)</h3>
<p><strong>Families</strong>: Celtic (Breton)<br>
<strong>ends in 1, excluding 11, 71, 91</strong>: <small>21, 31, 41, 51, 61, 81, 101, 121, 131, 141, 151, 161, 181, 201, 221, 231, 241, 251, 261, 281, ...</small><br>
<strong>ends in 2, excluding 12, 72, 92</strong>: <small>2, 22, 32, 42, 52, 62, 82, 102, 122, 132, 142, 152, 162, 182, 202, 222, 232, 242, 252, 262, 282, ...</small><br>
<strong>ends in 3, 4 or 9 excluding 13, 14, 19, 73, 74, 79, 93, 94, 99</strong>: <small>3, 4, 9, 23, 24, 29, 33, 34, 39, 43, 44, 49, 53, 54, 59, ...</small><br>
<strong>ends in 1000000</strong>: <small>1000000: 1000000, 2000000, 3000000, 4000000, 5000000, 6000000, 7000000, 8000000, 9000000, 10000000, ...</small><br>
<strong>everything else</strong>: <small>0, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 30, 35, 36, 37, 38, 40, ...</small></p>
<h3 id="Plural_rule_17_(2_forms)">Plural rule #17 (2 forms)</h3>
<p><strong>Families</strong>: Ecuador indigenous languages (Shuar)<br>
<strong>is 0</strong>: <small>0</small><br>
<strong>everything else</strong>: <small>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, 50, 51, …</small></p>
<h3 id="Plural_rule_18_(6_forms)">Plural rule #18 (6 forms)</h3>
<p><strong>Families</strong>: Welsh<br>
<strong>is 0</strong>: <small>0</small><br>
<strong>is 1</strong>: <small>1</small><br>
<strong>is 2</strong>: <small>2</small><br>
<strong>is 3</strong>: <small>3</small><br>
<strong>is 6</strong>: <small>6</small><br>
<strong>everything else</strong>: <small>4, 5, 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></p>
<h3 id="Plural_rule_19_(3_forms)">Plural rule #<em><strong>19</strong></em> (3 forms)</h3>
<p><strong>Families</strong>: Slavic (Bosnian, Croatian, Serbian)<br>
<strong>ends in 1, excluding 11</strong>: <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>
<strong>ends in 2-4, excluding 12-14</strong>: <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>
<strong>everything else</strong>: <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, …, 112, 113, ..., 212, 213, ...</small></p>
<h2 id="Examples" name="Examples">Ejemplos</h2>
<p>Se presentan ejemplos para varios lenguajes y un breve proceso de pensamiento.</p>
<h3 id="French" name="French">Frances</h3>
<p>Some French speaking places treat 0 as plural while others treat it as singular. The only other singular is 1 while everything else is plural. So pick either plural rule #1 or #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>Like many other times when localizing words, gender agreement might force you to rearrange words in a way that the gender is always the same. (seconde vs jour)</p>
<h3 id="Chinese" name="Chinese">Chino</h3>
<p>A word doesn't change if there is a different number in front of it, so all numbers use the same plural form. With just one plural form, it has to be plural rule #0. For each word to localize, it's just like localizing a single word with no semi-colons needed.</p>
<p><code>pluralRule=0<br>
seconds=?<br>
minutes=?<br>
hours=?<br>
days=? </code></p>
<h3 id="Polish" name="Polish">Polaco</h3>
<p>There's a singular form for 1, a plural form for 2-4, and another for 5-21 at which point 22 is the same as 2. Plural rule #7 has a "ends in 2-4, not 12-14" but the singular form includes everything ending in 1 except 11. Plural rule #9 has the correct singular form for only 1.</p>
<p><code>pluralRule=9<br>
seconds=sekunda;sekundy;sekund<br>
minutes=minuta;minuty;minut<br>
hours=godzina;godziny;godzin<br>
days=dzien;dni;dni </code></p>
<p>Even though the last 2 plural forms of "day" are the same, both are still needed because there needs to be 3 plural forms for each word.</p>
<h3 id="Sorbian" name="Sorbian">Sorabo</h3>
<p>There are 4 plural forms: nominative singular, nominative dual, nominative plural, genitive plural. These match up with plural rule #10.</p>
<p><code>pluralRule=10<br>
seconds=sekunda;sekundze;sekundy;sekundow<br>
minutes=mjenšina;mjenšinje;mjenšiny;mjenšin<br>
hours=hodzina;hodzinje;hodziny;hodzin<br>
days=dzen;dnjej;dny;dnjow </code></p>
<h2 id="Testing_Extension" name="Testing_Extension">Testing Extension</h2>
<p>To help make sure you pick the right plural rule and provide enough plural forms for strings, you should use the pluralForm Checker extension. After installing the extension, it should be available from the Tools menu.</p>
<p>To use it, list off the property files and properties that you want to check and click the button. The extension will load each property and display the plural forms in a table. Selecting a table entry will populate the bottom box with sample uses of the word for some numbers.</p>
<p><img alt="Image:pluralForm-checker.0.3.png"></p>
<p><a class="external" href="http://ed.agadak.net/firefox/pluralForm-checker.xpi">Install pluralForm Checker v0.3 extension</a></p>
<h3 id="Extension_input" name="Extension_input">Extension input</h3>
<p>It would be good to keep this list updated with all the words that need plural forms. People using the extension can then copy/paste this input.</p>
<p><code><small><a class="external" rel="freelink">chrome://mozapps/locale/downloads/do...tes,hours,days</a><br>
<a class="external" rel="freelink">chrome://mozapps/locale/downloads/do...dsTitlePercent</a><br>
<a class="external" rel="freelink">chrome://browser/locale/browser.prop...ausedDownloads</a> </small></code></p>
<h3 id="Version_history" name="Version_history">Version history</h3>
<p>0.1: Initial version with pluralRule check, properties input loading, table generation, sample output display<br>
0.2: Use PluralForm.numForms() to get the number of forms instead of figuring out locally to better support future rules - <strong>Requires build from 2007/01/27 or later</strong><br>
0.3: Generate a list of what numbers fall into which plural form to minimize the sample output to at most 3 of each form</p>
<h2 id="Desarrollar_con_Formas_Plurales" name="Desarrollar_con_Formas_Plurales">Desarrollar con Formas Plurales</h2>
<p>The functionality for getting the correct plural forms is provided by a JavaScript Module, PluralForm.jsm. 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>
<h3 id="Loading_PluralForm.jsm" name="Loading_PluralForm.jsm">Loading PluralForm.jsm</h3>
<p>Loading the PluralForm module from JavaScript is simple with <a href="es/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>
<h3 id="Methods:_get_and_numForms" name="Methods:_get_and_numForms">Methods: get and numForms</h3>
<p>These methods make use of the browser's current locale specified by <a class="external" rel="freelink">chrome://global/locale/intl.properties</a>'s pluralRule 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 .xul, .properties, .js files.</p>
<p>downloads.xul:</p>
<pre><stringbundleset>
<stringbundle id="strings" src="chrome://downloads.properties"/>
</stringbundleset></pre>
<p>downloads.properties:</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>downloads.js:</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>
<h3 id="Method:_makeGetter" name="Method:_makeGetter">Method: makeGetter</h3>
<p>If you're writing an extension, you'll want to use makeGetter instead of PluralForm.get() or PluralForm.numForms() 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 makeGetter:</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 PluralForm.makeGetter(pluralRuleFromProperties) making sure to save the 2 returned functions. (You can use <a href="es/New_in_JavaScript_1.7#Destructuring_assignment">destructured assignment</a> in JavaScript 1.7 to keep things clean.) The returned functions act just like PluralForm.get() and PluralForm.numForms() except for the specified plural rule instead of the default plural rule.</p>
<h2 id="Credits" name="Credits">Credits</h2>
<p>Plural Form code first implemented for {{ Bug(394516) }} -<em>Figure out a remaining-time rounding scheme for minutes -> hours/days</em><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 gettext documentation</a>.</p>
|