diff --git a/app/controllers/extra_locales_controller.rb b/app/controllers/extra_locales_controller.rb index d6819d8ae23..7aad6b4138b 100644 --- a/app/controllers/extra_locales_controller.rb +++ b/app/controllers/extra_locales_controller.rb @@ -4,27 +4,30 @@ class ExtraLocalesController < ApplicationController skip_before_filter :check_xhr, :preload_json def show - locale_str = I18n.locale.to_s - translations = JsLocaleHelper.translations_for(locale_str) - bundle = params[:bundle] raise Discourse::InvalidAccess.new unless bundle =~ /^[a-z]+$/ - for_key = translations[locale_str]["#{bundle}_js"] + locale_str = I18n.locale.to_s + translations = JsLocaleHelper.translations_for(locale_str) + for_key = translations[locale_str]["#{bundle}_js"] - if for_key.present? - js = <<-JS + if plugin_for_key = JsLocaleHelper.plugin_translations(locale_str)["#{bundle}_js"] + for_key.deep_merge!(plugin_for_key) + end + + js = + if for_key.present? + <<~JS (function() { if (window.I18n) { window.I18n.extras = window.I18n.extras || []; window.I18n.extras.push(#{for_key.to_json}); } })(); - JS - else - js = "" - end - + JS + else + "" + end render text: js, content_type: "application/javascript" end diff --git a/lib/js_locale_helper.rb b/lib/js_locale_helper.rb index 02216d94eb8..b44c07b7add 100644 --- a/lib/js_locale_helper.rb +++ b/lib/js_locale_helper.rb @@ -1,5 +1,19 @@ module JsLocaleHelper + def self.plugin_translations(locale_str) + @plugin_translations ||= HashWithIndifferentAccess.new + + @plugin_translations[locale_str] ||= begin + translations = {} + + Dir["#{Rails.root}/plugins/*/config/locales/client.#{locale_str}.yml"].each do |file| + translations.deep_merge! YAML::load(File.open(file))[locale_str] + end + + translations + end + end + def self.load_translations(locale, opts=nil) opts ||= {} @@ -11,14 +25,9 @@ module JsLocaleHelper # load default translations translations = YAML::load(File.open("#{Rails.root}/config/locales/client.#{locale_str}.yml")) - # load plugins translations - plugin_translations = {} - Dir["#{Rails.root}/plugins/*/config/locales/client.#{locale_str}.yml"].each do |file| - plugin_translations.deep_merge! YAML::load(File.open(file)) - end # merge translations (plugin translations overwrite default translations) - translations[locale_str]['js'].deep_merge!(plugin_translations[locale_str]['js']) if translations[locale_str] && plugin_translations[locale_str] && plugin_translations[locale_str]['js'] + translations[locale_str]['js'].deep_merge!(plugin_translations(locale_str)['js']) if translations[locale_str] && plugin_translations(locale_str) && plugin_translations(locale_str)['js'] translations end @@ -71,17 +80,16 @@ module JsLocaleHelper site_locale = SiteSetting.default_locale.to_sym - if Rails.env.development? - translations = load_translations(locale_sym, force: true) - else - if locale_sym == :en - translations = load_translations(locale_sym) + translations = + if Rails.env.development? + load_translations(locale_sym, force: true) + elsif locale_sym == :en + load_translations(locale_sym) elsif locale_sym == site_locale || site_locale == :en - translations = load_translations_merged(locale_sym, :en) + load_translations_merged(locale_sym, :en) else - translations = load_translations_merged(locale_sym, site_locale, :en) + load_translations_merged(locale_sym, site_locale, :en) end - end I18n.locale = current_locale diff --git a/spec/components/js_locale_helper_spec.rb b/spec/components/js_locale_helper_spec.rb index 125474f93d6..a5ce82ed92a 100644 --- a/spec/components/js_locale_helper_spec.rb +++ b/spec/components/js_locale_helper_spec.rb @@ -18,6 +18,7 @@ describe JsLocaleHelper do JsLocaleHelper.extend StubLoadTranslations after do + I18n.locale = :en JsLocaleHelper.clear_cache! end diff --git a/spec/controllers/extra_locales_controller_spec.rb b/spec/controllers/extra_locales_controller_spec.rb index c7453aca56f..3c64d738646 100644 --- a/spec/controllers/extra_locales_controller_spec.rb +++ b/spec/controllers/extra_locales_controller_spec.rb @@ -18,6 +18,26 @@ describe ExtraLocalesController do get :show, bundle: '-invalid..character!!' expect(response).to_not be_success end + + it "should include plugin translations" do + JsLocaleHelper.expects(:plugin_translations).with("en").returns({ + "admin_js" => { + "admin" => { + "site_settings" => { + "categories" => { + "github_badges" => "Github Badges" + } + } + } + } + }).at_least_once + + get :show, bundle: "admin" + + expect(response).to be_success + expect(response.body.include?("github_badges")).to eq(true) + end + end end diff --git a/spec/models/badge_spec.rb b/spec/models/badge_spec.rb index 3ee6bf8ce08..8a39087fe62 100644 --- a/spec/models/badge_spec.rb +++ b/spec/models/badge_spec.rb @@ -18,9 +18,13 @@ describe Badge do badge = Badge.find_by_name("Basic User") name_english = badge.name - I18n.locale = 'fr' + begin + I18n.locale = 'fr' - expect(badge.display_name).not_to eq(name_english) + expect(badge.display_name).not_to eq(name_english) + ensure + I18n.locale = :en + end end it 'handles changes on badge description and long description correctly for system badges' do