blob: ecd1982eb080791ea6440ed268e22c168dfff663 [file] [log] [blame]
/**
* @class eli18n
* Javascript applications localization
*
* @param Object o - class options. Object. {textdomain : 'имя_группы_сообщений', messages : {textdomain1 : {}[, textdomain2 : {}]...}}
*
* Usage:
*
* var msgs = { Hello : 'Превэд', 'Hello %user' : 'Превед %user' };
* //load messages and set default textdomain
* var translator = new eli18n( {textdomain : 'test', messages : {test : msgs}} )
* window.console.log(translator.translate('Hello'));
* window.console.log(translator.format('Hello %user', {user : 'David Blain'}))
* // create new textdomain
* translator.load({test2 : {'Goodbye' : 'Ja, deva mata!'} })
* // and use it, without changing default one
* window.console.log(translator.translate('Goodbye', 'test2'));
*
* @author: Dmitry (dio) Levashov dio@std42.ru
* license: BSD license
**/
function eli18n(o) {
/**
* Get/set default textdomain
*
* @param String d new textdomain name
* @return String default textdomain
**/
this.textdomain = function(d) {
return this.messages[d] ? this._domain = d : this._domain;
}
o && o.messages && this.load(o.messages);
o && o.textdomain && this.textdomain(o.textdomain);
}
eli18n.prototype = new function() {
/**
* @var Object messages (key - messages in English or message handler, value - message in selected language)
**/
this.messages = {};
/**
* @var String default textdomain
**/
this._domain = '';
/**
* Load new messages
*
* @param Object msgs - messages (key - textdomain name, value - messages Object)
* @return Object this
**/
this.load = function(msgs) {
if (typeof(msgs) == 'object') {
for (var d in msgs) {
var _msgs = msgs[d];
if (typeof(_msgs) == 'object') {
if (!this.messages[d]) {
this.messages[d] = {};
}
for (var k in _msgs) {
if (typeof(_msgs[k]) == 'string') {
this.messages[d][k] = _msgs[k];
}
}
}
}
}
return this;
}
/**
* Return translated message, if message exists in required or default textdomain, otherwise returns original message
*
* @param String msg - message
* @param String d - textdomain. If empty, default textdomain will be used
* @return String translated message
**/
this.translate = function(msg, d) {
var d = d && this.messages[d] ? d : this._domain;
return this.messages[d] && this.messages[d][msg] ? this.messages[d][msg] : msg;
}
/**
* Translate message and replace placeholders (%placeholder)
*
* @param String msg - message
* @param Object replacement for placeholders (keys - placeholders name without leading %, values - replacements)
* @param String d - textdomain. If empty, default textdomain will be used
* @return String translated message
**/
this.format = function(msg, data, d) {
msg = this.translate(msg, d);
if (typeof(data) == 'object') {
for (var i in data) {
msg = msg.replace('%'+i, this.translate(data[i], d));
}
}
return msg;
}
}