commit: 7ac092513c3c298ad80cb80f7bee76ca8ed56235
parent: 2db53526c94e31c1fe2982da5ca097e24333d6c1
Author: Koala Yeung <koalay@gmail.com>
Date: Wed, 10 May 2017 20:44:48 +0800
Fix Occitan's locale data plural function (#2957)
* Fix the pluralRuleFunction of the locale data.
* Added more descriptions about how to write it.
Diffstat:
2 files changed, 95 insertions(+), 8 deletions(-)
diff --git a/app/javascript/mastodon/locales/locale-data/README.md b/app/javascript/mastodon/locales/locale-data/README.md
@@ -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";
+}
+```
diff --git a/app/javascript/mastodon/locales/locale-data/oc.js b/app/javascript/mastodon/locales/locale-data/oc.js
@@ -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: {