|
|
@ -8,7 +8,7 @@ The locale data should support [Locale Data APIs](https://github.com/yahoo/react |
|
|
|
of the react-intl library. |
|
|
|
|
|
|
|
It is recommended to start your custom locale data from this sample English |
|
|
|
locale data: |
|
|
|
locale data ([*](#plural-rules)): |
|
|
|
|
|
|
|
```javascript |
|
|
|
/*eslint eqeqeq: "off"*/ |
|
|
@ -127,3 +127,95 @@ export default [ |
|
|
|
] |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
## Notes |
|
|
|
|
|
|
|
### Plural Rules |
|
|
|
|
|
|
|
The function `pluralRuleFunction()` should return the key to proper string of |
|
|
|
a plural form(s). The purpose of the function is to provide key of translate |
|
|
|
strings of correct plural form according. The different forms are described in |
|
|
|
[CLDR's Plural Rules][cldr-plural-rules], |
|
|
|
|
|
|
|
[cldr-plural-rules]: http://cldr.unicode.org/index/cldr-spec/plural-rules |
|
|
|
|
|
|
|
#### Quick Overview on CLDR Rules |
|
|
|
|
|
|
|
Let's take English as an example. |
|
|
|
|
|
|
|
When you describe a number, you can be either describe it as: |
|
|
|
* Cardinals: 1st, 2nd, 3rd ... 11th, 12th ... 21st, 22nd, 23nd .... |
|
|
|
* Ordinals: 1, 2, 3 ... |
|
|
|
|
|
|
|
In any of these cases, the nouns will reflect the number with singular or plural |
|
|
|
form. For example: |
|
|
|
* in 0 days |
|
|
|
* in 1 day |
|
|
|
* in 2 days |
|
|
|
|
|
|
|
The `pluralRuleFunction` receives 2 parameters: |
|
|
|
* `e`: a string representation of the number. Such as, "`1`", "`2`", "`2.1`". |
|
|
|
* `a`: `true` if this is "cardinal" type of description. `false` for ordinal and other case. |
|
|
|
|
|
|
|
#### How you should write `pluralRuleFunction` |
|
|
|
|
|
|
|
The first rule to write pluralRuleFunction is never translate the output string |
|
|
|
into your language. [Plural Rules][cldr-plural-rules] specified you should use |
|
|
|
these as the return values: |
|
|
|
|
|
|
|
* "`zero`" |
|
|
|
* "`one`" (singular) |
|
|
|
* "`two`" (dual) |
|
|
|
* "`few`" (paucal) |
|
|
|
* "`many`" (also used for fractions if they have a separate class) |
|
|
|
* "`other`" (required—general plural form—also used if the language only has a single form) |
|
|
|
|
|
|
|
Again, we'll use English as the example here. |
|
|
|
|
|
|
|
Let's read the `return` statement in the pluralRuleFunction above: |
|
|
|
```javascript |
|
|
|
return a ? 1 == t && 11 != r ? "one" : 2 == t && 12 != r ? "two" : 3 == t && 13 != r ? "few" : "other" : 1 == e && l ? "one" : "other" |
|
|
|
``` |
|
|
|
|
|
|
|
This nested ternary is hard to read. It basically means: |
|
|
|
```javascript |
|
|
|
// e: the number variable to examine |
|
|
|
// a: "true" if cardinals |
|
|
|
// l: "true" if the variable e has nothin after decimal mark (e.g. "1.0" would be false) |
|
|
|
// o: "true" if the variable e is an integer |
|
|
|
// t: the "ones" of the number. e.g. "3" for number "9123" |
|
|
|
// r: the "ones" and "tens" of the number. e.g. "23" for number "9123" |
|
|
|
if (a == true) { |
|
|
|
if (t == 1 && r != 11) { |
|
|
|
return "one"; // i.e. 1st, 21st, 101st, 121st ... |
|
|
|
} else if (t == 2 && r != 12) { |
|
|
|
return "two"; // i.e. 2nd, 22nd, 102nd, 122nd ... |
|
|
|
} else if (t == 3 && r != 13) { |
|
|
|
return "few"; // i.e. 3rd, 23rd, 103rd, 123rd ... |
|
|
|
} else { |
|
|
|
return "other"; // i.e. 4th, 11th, 12th, 24th ... |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (e == 1 && l) { |
|
|
|
return "one"; // i.e. 1 day |
|
|
|
} else { |
|
|
|
return "other"; // i.e. 0 days, 2 days, 3 days |
|
|
|
} |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
If your language, like French, do not have complicated cardinal rules, you may |
|
|
|
use the French's version of it: |
|
|
|
```javascript |
|
|
|
function (e, a) { |
|
|
|
return a ? 1 == e ? "one" : "other" : e >= 0 && e < 2 ? "one" : "other"; |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
If your language, like Chinese, do not have any pluralization rule at all you |
|
|
|
may use the Chinese's version of it: |
|
|
|
```javascript |
|
|
|
function (e, a) { |
|
|
|
return "other"; |
|
|
|
} |
|
|
|
``` |