Fix Occitan's locale data plural function (#2957)
* Fix the pluralRuleFunction of the locale data. * Added more descriptions about how to write it.
This commit is contained in:
		
							parent
							
								
									2db53526c9
								
							
						
					
					
						commit
						7ac092513c
					
				@ -8,7 +8,7 @@ The locale data should support [Locale Data APIs](https://github.com/yahoo/react
 | 
				
			|||||||
of the react-intl library.
 | 
					of the react-intl library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It is recommended to start your custom locale data from this sample English
 | 
					It is recommended to start your custom locale data from this sample English
 | 
				
			||||||
locale data:
 | 
					locale data ([*](#plural-rules)):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```javascript
 | 
					```javascript
 | 
				
			||||||
/*eslint eqeqeq: "off"*/
 | 
					/*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";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
				
			|||||||
@ -3,13 +3,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export default [{
 | 
					export default [{
 | 
				
			||||||
  locale: "oc",
 | 
					  locale: "oc",
 | 
				
			||||||
  pluralRuleFunction: function(e, a) {
 | 
					  pluralRuleFunction: function (e, a) {
 | 
				
			||||||
    var n = String(e).split("."),
 | 
					    return a ? 1 == e ? "one" : "other" : e >= 0 && e < 2 ? "one" : "other";
 | 
				
			||||||
      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 ? "un" : 2 == t && 12 != r ? "dos" : 3 == t && 13 != r ? "pauc" : "autre" : 1 == e && l ? "un" : "autre"
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  fields: {
 | 
					  fields: {
 | 
				
			||||||
    year: {
 | 
					    year: {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user