datahub/src/i18n/view.i18n.js
krzysztofmadejski 5976edd377 #459
2016-11-06 13:46:56 +01:00

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,
};
},
});