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
					
				
			
		
					 2 changed files with 95 additions and 8 deletions
				
			
		|  | @ -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"; | ||||
| } | ||||
| ``` | ||||
|  |  | |||
|  | @ -3,13 +3,8 @@ | |||
| 
 | ||||
| export default [{ | ||||
|   locale: "oc", | ||||
|   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 ? "un" : 2 == t && 12 != r ? "dos" : 3 == t && 13 != r ? "pauc" : "autre" : 1 == e && l ? "un" : "autre" | ||||
|   pluralRuleFunction: function (e, a) { | ||||
|     return a ? 1 == e ? "one" : "other" : e >= 0 && e < 2 ? "one" : "other"; | ||||
|   }, | ||||
|   fields: { | ||||
|     year: { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue