|
@@ -1,221 +0,0 @@
|
|
|
-# Custom Locale Data
|
|
|
-
|
|
|
-This folder is used to store custom locale data. These custom locale data are
|
|
|
-not yet provided by [Unicode Common Locale Data Repository](http://cldr.unicode.org/development/new-cldr-developers)
|
|
|
-and hence not provided in [react-intl/locale-data/*](https://github.com/yahoo/react-intl).
|
|
|
-
|
|
|
-The locale data should support [Locale Data APIs](https://github.com/yahoo/react-intl/wiki/API#locale-data-apis)
|
|
|
-of the react-intl library.
|
|
|
-
|
|
|
-It is recommended to start your custom locale data from this sample English
|
|
|
-locale data ([*](#plural-rules)):
|
|
|
-
|
|
|
-```javascript
|
|
|
-/*eslint eqeqeq: "off"*/
|
|
|
-/*eslint no-nested-ternary: "off"*/
|
|
|
-
|
|
|
-export default [
|
|
|
- {
|
|
|
- locale: "en",
|
|
|
- pluralRuleFunction: function(e, a) {
|
|
|
- var n = String(e).split("."),
|
|
|
- l = !n[1],
|
|
|
- o = Number(n[0]) == e,
|
|
|
- t = o && n[0].slice(-1),
|
|
|
- r = o && n[0].slice(-2);
|
|
|
- return a ? 1 == t && 11 != r ? "one" : 2 == t && 12 != r ? "two" : 3 == t && 13 != r ? "few" : "other" : 1 == e && l ? "one" : "other"
|
|
|
- },
|
|
|
- fields: {
|
|
|
- year: {
|
|
|
- displayName: "year",
|
|
|
- relative: {
|
|
|
- 0: "this year",
|
|
|
- 1: "next year",
|
|
|
- "-1": "last year"
|
|
|
- },
|
|
|
- relativeTime: {
|
|
|
- future: {
|
|
|
- one: "in {0} year",
|
|
|
- other: "in {0} years"
|
|
|
- },
|
|
|
- past: {
|
|
|
- one: "{0} year ago",
|
|
|
- other: "{0} years ago"
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- month: {
|
|
|
- displayName: "month",
|
|
|
- relative: {
|
|
|
- 0: "this month",
|
|
|
- 1: "next month",
|
|
|
- "-1": "last month"
|
|
|
- },
|
|
|
- relativeTime: {
|
|
|
- future: {
|
|
|
- one: "in {0} month",
|
|
|
- other: "in {0} months"
|
|
|
- },
|
|
|
- past: {
|
|
|
- one: "{0} month ago",
|
|
|
- other: "{0} months ago"
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- day: {
|
|
|
- displayName: "day",
|
|
|
- relative: {
|
|
|
- 0: "today",
|
|
|
- 1: "tomorrow",
|
|
|
- "-1": "yesterday"
|
|
|
- },
|
|
|
- relativeTime: {
|
|
|
- future: {
|
|
|
- one: "in {0} day",
|
|
|
- other: "in {0} days"
|
|
|
- },
|
|
|
- past: {
|
|
|
- one: "{0} day ago",
|
|
|
- other: "{0} days ago"
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- hour: {
|
|
|
- displayName: "hour",
|
|
|
- relativeTime: {
|
|
|
- future: {
|
|
|
- one: "in {0} hour",
|
|
|
- other: "in {0} hours"
|
|
|
- },
|
|
|
- past: {
|
|
|
- one: "{0} hour ago",
|
|
|
- other: "{0} hours ago"
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- minute: {
|
|
|
- displayName: "minute",
|
|
|
- relativeTime: {
|
|
|
- future: {
|
|
|
- one: "in {0} minute",
|
|
|
- other: "in {0} minutes"
|
|
|
- },
|
|
|
- past: {
|
|
|
- one: "{0} minute ago",
|
|
|
- other: "{0} minutes ago"
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- second: {
|
|
|
- displayName: "second",
|
|
|
- relative: {
|
|
|
- 0: "now"
|
|
|
- },
|
|
|
- relativeTime: {
|
|
|
- future: {
|
|
|
- one: "in {0} second",
|
|
|
- other: "in {0} seconds"
|
|
|
- },
|
|
|
- past: {
|
|
|
- one: "{0} second ago",
|
|
|
- other: "{0} seconds ago"
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-]
|
|
|
-
|
|
|
-```
|
|
|
-
|
|
|
-## 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";
|
|
|
-}
|
|
|
-```
|