adding proper evaluation of plural form - uses LGPL licensed code of jsgettext

This commit is contained in:
Thomas Müller 2013-08-03 23:31:49 +02:00
parent b229381dda
commit d97e3c3571
1 changed files with 62 additions and 17 deletions

View File

@ -24,6 +24,55 @@ if (oc_debug !== true || typeof console === "undefined" || typeof console.log ==
}
}
function initL10N(app) {
if (!( t.cache[app] )) {
$.ajax(OC.filePath('core', 'ajax', 'translations.php'), {
async: false,//todo a proper solution for this without sync ajax calls
data: {'app': app},
type: 'POST',
success: function (jsondata) {
t.cache[app] = jsondata.data;
t.plural_form = jsondata.plural_form;
}
});
// Bad answer ...
if (!( t.cache[app] )) {
t.cache[app] = [];
}
}
if (typeof t.plural_function == 'undefined') {
t.plural_function = function (n) {
var p = (n != 1) ? 1 : 0;
return { 'nplural' : 2, 'plural' : p };
};
/**
* code below has been taken from jsgettext - which is LGPL licensed
* https://developer.berlios.de/projects/jsgettext/
* http://cvs.berlios.de/cgi-bin/viewcvs.cgi/jsgettext/jsgettext/lib/Gettext.js
*/
var pf_re = new RegExp('^(\\s*nplurals\\s*=\\s*[0-9]+\\s*;\\s*plural\\s*=\\s*(?:\\s|[-\\?\\|&=!<>+*/%:;a-zA-Z0-9_\(\)])+)', 'm');
if (pf_re.test(t.plural_form)) {
//ex english: "Plural-Forms: nplurals=2; plural=(n != 1);\n"
//pf = "nplurals=2; plural=(n != 1);";
//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)
//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)";
var pf = t.plural_form;
if (! /;\s*$/.test(pf)) pf = pf.concat(';');
/* We used to use eval, but it seems IE has issues with it.
* We now use "new Function", though it carries a slightly
* bigger performance hit.
var code = 'function (n) { var plural; var nplurals; '+pf+' return { "nplural" : nplurals, "plural" : (plural === true ? 1 : plural ? plural : 0) }; };';
Gettext._locale_data[domain].head.plural_func = eval("("+code+")");
*/
var code = 'var plural; var nplurals; '+pf+' return { "nplural" : nplurals, "plural" : (plural === true ? 1 : plural ? plural : 0) };';
t.plural_function = new Function("n", code);
} else {
console.log("Syntax error in language file. Plural-Forms header is invalid ["+plural_forms+"]");
}
}
}
/**
* translate a string
* @param app the id of the app for which to translate the string
@ -33,21 +82,7 @@ if (oc_debug !== true || typeof console === "undefined" || typeof console.log ==
* @return string
*/
function t(app, text, vars, count){
if( !( t.cache[app] )) {
$.ajax(OC.filePath('core','ajax','translations.php'),{
async:false,//todo a proper sollution for this without sync ajax calls
data:{'app': app},
type:'POST',
success:function(jsondata){
t.cache[app] = jsondata.data;
}
});
// Bad answer ...
if( !( t.cache[app] )){
t.cache[app] = [];
}
}
initL10N(app);
var _build = function (text, vars, count) {
return text.replace(/%n/g, count).replace(/{([^{}]*)}/g,
function (a, b) {
@ -67,7 +102,7 @@ function t(app, text, vars, count){
return translation;
}
}
t.cache={};
t.cache = {};
/**
* translate a string
@ -78,7 +113,17 @@ t.cache={};
* @param vars (optional) FIXME
* @return string
*/
function n(app, text_singular, text_plural, count, vars){
function n(app, text_singular, text_plural, count, vars) {
initL10N(app);
var identifier = '_' + text_singular + '__' + text_plural + '_';
if( typeof( t.cache[app][identifier] ) !== 'undefined' ){
var translation = t.cache[app][identifier];
if ($.isArray(translation)) {
var plural = t.plural_function(count);
return t(app, translation[plural.plural], vars, count);
}
}
if(count === 1) {
return t(app, text_singular, vars, count);
}