77 lines
2.4 KiB
JavaScript
77 lines
2.4 KiB
JavaScript
/*jshint multistr:true */
|
|
|
|
// todo probably some kind of mixin would be better
|
|
//usage: (zamienic na extension)
|
|
// my.View - Backbone.View.extend({});
|
|
//_.extend(my.View, Backbone.I18nView);
|
|
|
|
Backbone.I18nView = Backbone.View.extend({
|
|
defaultLocale: 'en',
|
|
locale: 'en',
|
|
initializeI18n: function(locale) {
|
|
this.locale = locale;
|
|
// TODO implement cache
|
|
//memoizeFormatConstructor(Intl.NumberFormat).getNumberFormat();
|
|
},
|
|
|
|
formatMessage(key, values) {
|
|
this.cachedMsg.format(key, values);
|
|
},
|
|
|
|
// TODO how to use it from outside? an singleton instance of I18n? use case: pass translated strings into view initializer
|
|
t: function(key, values = {}, defaultMessage = null) {
|
|
// get the message from current locale
|
|
var msg = recline.View.translations[this.locale][key];
|
|
|
|
// fallback to key or default message if no translation is defined
|
|
if (msg == null) {
|
|
if (this.locale != this.defaultLocale) {
|
|
console.warn("Missing locale for " + this.locale + "." + key);
|
|
}
|
|
msg = defaultMessage;
|
|
}
|
|
if (msg == null) { msg = key; } // TODO w domyślnym locale automatycznie usuwaj podkreślenia
|
|
|
|
// TODO i18n documentation
|
|
|
|
try {
|
|
var mf = new IntlMessageFormat(msg, 'pl');
|
|
var formatted = mf.format(values);
|
|
|
|
return formatted;
|
|
} catch (e) {
|
|
var err = "Got error while formatting \"" + msg + "\": " + e.message;
|
|
if (e.name == 'SyntaxError' && e.found == '{') {
|
|
err += '. Probably you should change double brackets around variables (Mustache style) to single brackets (Intl style).';
|
|
}
|
|
console.error(err);
|
|
|
|
return msg;
|
|
}
|
|
},
|
|
|
|
MustacheFormatter: function() {
|
|
var formatter = new Proxy(this, {
|
|
get(view, name) {
|
|
return function() {
|
|
var f = function (text, render) {
|
|
var trans = view.t(name, this, text);
|
|
return render(trans);
|
|
}
|
|
f.toString = function() {
|
|
return view.t(name);
|
|
}
|
|
return f;
|
|
};
|
|
},
|
|
has(target, prop) {
|
|
return true;
|
|
}
|
|
});
|
|
|
|
return {
|
|
't': formatter,
|
|
};
|
|
},
|
|
});
|