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