diff --git a/app/models/locale_site_setting.rb b/app/models/locale_site_setting.rb index 8cf30de532b..b1e983abe82 100644 --- a/app/models/locale_site_setting.rb +++ b/app/models/locale_site_setting.rb @@ -20,5 +20,4 @@ class LocaleSiteSetting < EnumSiteSetting end end - private_class_method :supported_locales end diff --git a/lib/freedom_patches/translate_accelerator.rb b/lib/freedom_patches/translate_accelerator.rb index e878e3374e9..3a53e5875c3 100644 --- a/lib/freedom_patches/translate_accelerator.rb +++ b/lib/freedom_patches/translate_accelerator.rb @@ -1,4 +1,35 @@ +# This patch performs 2 functions +# +# 1. It caches all translations which drastically improves +# translation performance in an LRU cache +# +# 2. It patches I18n so it only loads the translations it needs +# on demand +# +# This patch depends on the convention that locale yml files must be named [locale_name].yml + module I18n + module Backend + + class Simple + def available_locales + # in case you are wondering this is: + # Dir.glob( File.join(Rails.root, 'config', 'locales', 'client.*.yml') ) + # .map {|x| x.split('.')[-2]}.sort + LocaleSiteSetting.supported_locales.map(&:to_sym) + end + end + + module Base + # force explicit loading + def load_translations(*filenames) + unless filenames.empty? + filenames.flatten.each { |filename| load_file(filename) } + end + end + + end + end # this accelerates translation a tiny bit (halves the time it takes) class << self alias_method :translate_no_cache, :translate @@ -6,16 +37,35 @@ module I18n LRU_CACHE_SIZE = 2000 def reload! + @loaded_locales = [] @cache = nil reload_no_cache! end + LOAD_MUTEX = Mutex.new + def load_locale(locale) + LOAD_MUTEX.synchronize do + return if @loaded_locales.include?(config.locale) + + if @loaded_locales.empty? + # load all rb files + I18n.backend.load_translations(I18n.load_path.grep(/\.rb$/)) + end + + # load it + I18n.backend.load_translations(I18n.load_path.grep Regexp.new("\\.#{locale}\\.yml$")) + + @loaded_locales << locale + end + end + def translate(*args) @cache ||= LruRedux::ThreadSafeCache.new(LRU_CACHE_SIZE) found = true k = [args, config.locale, config.backend.object_id] t = @cache.fetch(k) { found = false } unless found + load_locale(config.locale) unless @loaded_locales.include?(config.locale) begin t = translate_no_cache(*args) rescue MissingInterpolationArgument