@@ -70,65 +70,14 @@ OC.L10N = {
7070 if ( _ . isUndefined ( this . _bundles [ appName ] ) ) {
7171 this . _bundles [ appName ] = bundle || { } ;
7272
73- if ( _ . isFunction ( pluralForm ) ) {
74- this . _pluralFunctions [ appName ] = pluralForm ;
75- } else {
76- // generate plural function based on form
77- this . _pluralFunctions [ appName ] = this . _generatePluralFunction ( pluralForm ) ;
78- }
73+ // generate plural function based on form
74+ this . _pluralFunctions [ appName ] = this . _getPlural ;
7975 } else {
8076 // Theme overwriting the default language
8177 _ . extend ( self . _bundles [ appName ] , bundle ) ;
8278 }
8379 } ,
8480
85- /**
86- * Generates a plural function based on the given plural form.
87- * If an invalid form has been given, returns a default function.
88- *
89- * @param {String } pluralForm plural form
90- */
91- _generatePluralFunction : function ( pluralForm ) {
92- // default func
93- var func = function ( n ) {
94- var p = ( n !== 1 ) ? 1 : 0 ;
95- return { 'nplural' : 2 , 'plural' : p } ;
96- } ;
97-
98- if ( ! pluralForm ) {
99- console . warn ( 'Missing plural form in language file' ) ;
100- return func ;
101- }
102-
103- /**
104- * code below has been taken from jsgettext - which is LGPL licensed
105- * https://developer.berlios.de/projects/jsgettext/
106- * http://cvs.berlios.de/cgi-bin/viewcvs.cgi/jsgettext/jsgettext/lib/Gettext.js
107- */
108- var pf_re = new RegExp ( '^(\\s*nplurals\\s*=\\s*[0-9]+\\s*;\\s*plural\\s*=\\s*(?:\\s|[-\\?\\|&=!<>+*/%:;a-zA-Z0-9_\\(\\)])+)' , 'm' ) ;
109- if ( pf_re . test ( pluralForm ) ) {
110- //ex english: "Plural-Forms: nplurals=2; plural=(n != 1);\n"
111- //pf = "nplurals=2; plural=(n != 1);";
112- //ex russian: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10< =4 && (n%100<10 or n%100>=20) ? 1 : 2)
113- //pf = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)";
114- var pf = pluralForm ;
115- if ( ! / ; \s * $ / . test ( pf ) ) {
116- pf = pf . concat ( ';' ) ;
117- }
118- /* We used to use eval, but it seems IE has issues with it.
119- * We now use "new Function", though it carries a slightly
120- * bigger performance hit.
121- var code = 'function (n) { var plural; var nplurals; '+pf+' return { "nplural" : nplurals, "plural" : (plural === true ? 1 : plural ? plural : 0) }; };';
122- Gettext._locale_data[domain].head.plural_func = eval("("+code+")");
123- */
124- var code = 'var plural; var nplurals; ' + pf + ' return { "nplural" : nplurals, "plural" : (plural === true ? 1 : plural ? plural : 0) };' ;
125- func = new Function ( "n" , code ) ;
126- } else {
127- console . warn ( 'Invalid plural form in language file: "' + pluralForm + '"' ) ;
128- }
129- return func ;
130- } ,
131-
13281 /**
13382 * Translate a string
13483 * @param {string } app the id of the app for which to translate the string
@@ -198,7 +147,7 @@ OC.L10N = {
198147 var translation = value ;
199148 if ( $ . isArray ( translation ) ) {
200149 var plural = this . _pluralFunctions [ app ] ( count ) ;
201- return this . translate ( app , translation [ plural . plural ] , vars , count , options ) ;
150+ return this . translate ( app , translation [ plural ] , vars , count , options ) ;
202151 }
203152 }
204153
@@ -208,6 +157,167 @@ OC.L10N = {
208157 else {
209158 return this . translate ( app , textPlural , vars , count , options ) ;
210159 }
160+ } ,
161+
162+ /**
163+ * The plural function taken from symfony
164+ *
165+ * @param {number } number
166+ * @returns {number }
167+ * @private
168+ */
169+ _getPlural : function ( number ) {
170+ locale = OC . getLocale ( ) ;
171+ if ( 'pt_BR' === locale ) {
172+ // temporary set a locale for brazilian
173+ locale = 'xbr' ;
174+ }
175+
176+ if ( typeof locale === 'undefined' ) {
177+ return ( 1 == number ) ? 0 : 1 ;
178+ }
179+
180+ if ( locale . length > 3 ) {
181+ locale = locale . substring ( 0 , locale . lastIndexOf ( '_' ) ) ;
182+ }
183+
184+ /*
185+ * The plural rules are derived from code of the Zend Framework (2010-09-25),
186+ * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd).
187+ * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
188+ */
189+ switch ( locale ) {
190+ case 'az' :
191+ case 'bo' :
192+ case 'dz' :
193+ case 'id' :
194+ case 'ja' :
195+ case 'jv' :
196+ case 'ka' :
197+ case 'km' :
198+ case 'kn' :
199+ case 'ko' :
200+ case 'ms' :
201+ case 'th' :
202+ case 'tr' :
203+ case 'vi' :
204+ case 'zh' :
205+ return 0 ;
206+
207+ case 'af' :
208+ case 'bn' :
209+ case 'bg' :
210+ case 'ca' :
211+ case 'da' :
212+ case 'de' :
213+ case 'el' :
214+ case 'en' :
215+ case 'eo' :
216+ case 'es' :
217+ case 'et' :
218+ case 'eu' :
219+ case 'fa' :
220+ case 'fi' :
221+ case 'fo' :
222+ case 'fur' :
223+ case 'fy' :
224+ case 'gl' :
225+ case 'gu' :
226+ case 'ha' :
227+ case 'he' :
228+ case 'hu' :
229+ case 'is' :
230+ case 'it' :
231+ case 'ku' :
232+ case 'lb' :
233+ case 'ml' :
234+ case 'mn' :
235+ case 'mr' :
236+ case 'nah' :
237+ case 'nb' :
238+ case 'ne' :
239+ case 'nl' :
240+ case 'nn' :
241+ case 'no' :
242+ case 'oc' :
243+ case 'om' :
244+ case 'or' :
245+ case 'pa' :
246+ case 'pap' :
247+ case 'ps' :
248+ case 'pt' :
249+ case 'so' :
250+ case 'sq' :
251+ case 'sv' :
252+ case 'sw' :
253+ case 'ta' :
254+ case 'te' :
255+ case 'tk' :
256+ case 'ur' :
257+ case 'zu' :
258+ return ( 1 == number ) ? 0 : 1 ;
259+
260+ case 'am' :
261+ case 'bh' :
262+ case 'fil' :
263+ case 'fr' :
264+ case 'gun' :
265+ case 'hi' :
266+ case 'hy' :
267+ case 'ln' :
268+ case 'mg' :
269+ case 'nso' :
270+ case 'xbr' :
271+ case 'ti' :
272+ case 'wa' :
273+ return ( ( 0 == number ) || ( 1 == number ) ) ? 0 : 1 ;
274+
275+ case 'be' :
276+ case 'bs' :
277+ case 'hr' :
278+ case 'ru' :
279+ case 'sh' :
280+ case 'sr' :
281+ case 'uk' :
282+ return ( ( 1 == number % 10 ) && ( 11 != number % 100 ) ) ? 0 : ( ( ( number % 10 >= 2 ) && ( number % 10 <= 4 ) && ( ( number % 100 < 10 ) || ( number % 100 >= 20 ) ) ) ? 1 : 2 ) ;
283+
284+ case 'cs' :
285+ case 'sk' :
286+ return ( 1 == number ) ? 0 : ( ( ( number >= 2 ) && ( number <= 4 ) ) ? 1 : 2 ) ;
287+
288+ case 'ga' :
289+ return ( 1 == number ) ? 0 : ( ( 2 == number ) ? 1 : 2 ) ;
290+
291+ case 'lt' :
292+ return ( ( 1 == number % 10 ) && ( 11 != number % 100 ) ) ? 0 : ( ( ( number % 10 >= 2 ) && ( ( number % 100 < 10 ) || ( number % 100 >= 20 ) ) ) ? 1 : 2 ) ;
293+
294+ case 'sl' :
295+ return ( 1 == number % 100 ) ? 0 : ( ( 2 == number % 100 ) ? 1 : ( ( ( 3 == number % 100 ) || ( 4 == number % 100 ) ) ? 2 : 3 ) ) ;
296+
297+ case 'mk' :
298+ return ( 1 == number % 10 ) ? 0 : 1 ;
299+
300+ case 'mt' :
301+ return ( 1 == number ) ? 0 : ( ( ( 0 == number ) || ( ( number % 100 > 1 ) && ( number % 100 < 11 ) ) ) ? 1 : ( ( ( number % 100 > 10 ) && ( number % 100 < 20 ) ) ? 2 : 3 ) ) ;
302+
303+ case 'lv' :
304+ return ( 0 == number ) ? 0 : ( ( ( 1 == number % 10 ) && ( 11 != number % 100 ) ) ? 1 : 2 ) ;
305+
306+ case 'pl' :
307+ return ( 1 == number ) ? 0 : ( ( ( number % 10 >= 2 ) && ( number % 10 <= 4 ) && ( ( number % 100 < 12 ) || ( number % 100 > 14 ) ) ) ? 1 : 2 ) ;
308+
309+ case 'cy' :
310+ return ( 1 == number ) ? 0 : ( ( 2 == number ) ? 1 : ( ( ( 8 == number ) || ( 11 == number ) ) ? 2 : 3 ) ) ;
311+
312+ case 'ro' :
313+ return ( 1 == number ) ? 0 : ( ( ( 0 == number ) || ( ( number % 100 > 0 ) && ( number % 100 < 20 ) ) ) ? 1 : 2 ) ;
314+
315+ case 'ar' :
316+ return ( 0 == number ) ? 0 : ( ( 1 == number ) ? 1 : ( ( 2 == number ) ? 2 : ( ( ( number % 100 >= 3 ) && ( number % 100 <= 10 ) ) ? 3 : ( ( ( number % 100 >= 11 ) && ( number % 100 <= 99 ) ) ? 4 : 5 ) ) ) ) ;
317+
318+ default :
319+ return 0 ;
320+ }
211321 }
212322} ;
213323
0 commit comments