Skip to content

Commit

Permalink
Now supporting plural strings, lots of other changes.
Browse files Browse the repository at this point in the history
  • Loading branch information
jefftrudeau committed Mar 30, 2013
1 parent e6c85d6 commit f255e50
Showing 1 changed file with 35 additions and 20 deletions.
55 changes: 35 additions & 20 deletions i18n.js
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@
*/ */
var i18n = { var i18n = {


// translations context: 'default'
strings: {}
, debug: false

, strings: {}


// simple AJAX request used to load resources
, ajax: function (uri) { , ajax: function (uri) {
var a = [ var a = [
'XMLHttpRequest' 'XMLHttpRequest'
Expand All @@ -24,50 +26,63 @@ var i18n = {
try { try {
if (!o) return ''; if (!o) return '';
o.open('GET', uri, false); o.open('GET', uri, false);
//o.setRequestHeader('User-Agent', navigator.userAgent);
o.send(null); o.send(null);
return o.responseText; return o.responseText;
} }
catch (e) {} catch (e) { if (i18n.debug) console.log(e.message); }
} }


// setup library , init: function (uri, context, debug) {
, init: function (uri) { if (context) i18n.context = context;
i18n.load_translations(uri); i18n.debug = debug;
i18n.load(uri);
} }


// load translations from a .po file matching user's locale , load: function (uri) {
, load_translations: function (uri) { var ctxt = 'default', id = '', id_plural = ''
var key = ''
, dict = i18n.ajax(uri+'/'+i18n.locale()+'.po').split(/\n|\r|\r\n/); , dict = i18n.ajax(uri+'/'+i18n.locale()+'.po').split(/\n|\r|\r\n/);
for (var i in dict) { for (var i in dict) {
if (!dict[i] || !dict[i].indexOf || dict[i].indexOf('#') == 0) if (!dict[i] || !dict[i].indexOf || dict[i].indexOf('#') == 0)
continue; continue;
if (dict[i].indexOf('msgid') == 0) if (dict[i] == '') {
key = dict[i].replace(/msgid\s"(.*)"/, '$1'); ctxt = 'default'; id = ''; id_plural = '';
}
else if (dict[i].indexOf('msgctxt') == 0)
ctxt = dict[i].replace(/msgctxt\s"(.*)"/, '$1');
else if (dict[i].indexOf('msgid_plural') == 0)
id_plural = dict[i].replace(/msgid_plural\s"(.*)"/, '$1');
else if (dict[i].indexOf('msgid') == 0)
id = dict[i].replace(/msgid\s"(.*)"/, '$1');
else if (dict[i].indexOf('msgstr[1]') == 0)
i18n.set(ctxt, id_plural, dict[i].replace(/msgstr.*"(.*)"/, '$1'));
else if (dict[i].indexOf('msgstr') == 0) else if (dict[i].indexOf('msgstr') == 0)
i18n.strings[key] = dict[i].replace(/msgstr\s"(.*)"/, '$1'); i18n.set(ctxt, id, dict[i].replace(/msgstr.*"(.*)"/, '$1'));
} }
if (i18n.debug) console.log(i18n.strings);
} }


// determine user's locale
, locale: function () { , locale: function () {
if (navigator) if (navigator)
for (var key in ['language', 'browserLanguage', 'systemLanguage', 'userLanguage']) for (var key in ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'])
if (navigator[key]) return navigator[key]; if (navigator[key]) return navigator[key];
return 'en-US'; return 'en-US';
} }


// translate a string , set: function (ctxt, key, value) {
if (ctxt && typeof(i18n.strings[ctxt]) == 'undefined')
i18n.strings[ctxt] = {};
if (key && value)
i18n.strings[ctxt][key] = value;
}

, translate: function (string, values) { , translate: function (string, values) {
var result = i18n.strings[string] || string;
try { try {
return result.replace(/{(\d+)}/g, function(match, index) { return i18n.strings[i18n.context][string].replace(/{(\d+)}/g, function(match, index) {
return typeof(values[index] != 'undefined') ? values[index] : match; return typeof(values[index] != 'undefined') ? values[index] : match;
}); });
} }
catch (e) {} catch (e) { if (i18n.debug) console.log(e.message); }
return result; return string;
} }


}; };
Expand Down

0 comments on commit f255e50

Please sign in to comment.