FEATURE: Localization fallbacks (client)

This patch sets I18n.defaultLocale in the Discourse.start() script block (it
was formerly always 'en') to SiteSetting.default_locale, and patches
translate() to perform fallback to defaultLocale followed by english.
Additionally, when enable_verbose_localization() is called, no fallbacks will
be performed.

It also memoizes the file loading operations in JsLocaleHelper and strips out
translations from the fallbacks that are also present in a prefered language,
to minimize file size.
This commit is contained in:
Kane York
2015-07-15 08:56:46 -07:00
parent 1851c8d918
commit 728845d008
3 changed files with 90 additions and 18 deletions

View File

@@ -52,6 +52,8 @@ I18n.PLACEHOLDER = /(?:\{\{|%\{)(.*?)(?:\}\}?)/gm;
I18n.fallbackRules = {};
I18n.noFallbacks = false;
I18n.pluralizationRules = {
en: function(n) {
return n === 0 ? ["zero", "none", "other"] : n === 1 ? "one" : "other";
@@ -192,6 +194,15 @@ I18n.interpolate = function(message, options) {
I18n.translate = function(scope, options) {
options = this.prepareOptions(options);
var translation = this.lookup(scope, options);
// Fallback to the default locale
if (!translation && this.currentLocale() !== this.defaultLocale && !this.noFallbacks) {
options.locale = this.defaultLocale;
translation = this.lookup(scope, options);
}
if (!translation && this.currentLocale() !== 'en' && !this.noFallbacks) {
options.locale = 'en';
translation = this.lookup(scope, options);
}
try {
if (typeof translation === "object") {
@@ -513,6 +524,7 @@ I18n.enable_verbose_localization = function(){
var keys = {};
var t = I18n.t;
I18n.noFallbacks = true;
I18n.t = I18n.translate = function(scope, value){
var current = keys[scope];

View File

@@ -33,6 +33,7 @@
Discourse.Environment = '<%= Rails.env %>';
Discourse.SiteSettings = PreloadStore.get('siteSettings');
Discourse.LetterAvatarVersion = '<%= LetterAvatar.version %>';
I18n.defaultLocale = '<%= SiteSetting.default_locale %>';
PreloadStore.get("customEmoji").forEach(function(emoji) {
Discourse.Dialect.registerEmoji(emoji.name, emoji.url);
});