Skip to content

Commit

Permalink
An attempt to load only necessary locales on the fly (#2169)
Browse files Browse the repository at this point in the history
* Defer loading I18n YAML files until actually translating

* Load locale files for available locales only
  • Loading branch information
amatsuda committed Oct 26, 2020
1 parent fd0aafc commit 9ea5a3d
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 3 deletions.
29 changes: 26 additions & 3 deletions lib/faker.rb
Expand Up @@ -8,10 +8,27 @@

Dir.glob(File.join(mydir, 'helpers', '*.rb')).sort.each { |file| require file }

I18n.load_path += Dir[File.join(mydir, 'locales', '**/*.yml')]
I18n.reload! if I18n.backend.initialized?

module Faker
@i18n_loaded = nil

class << self
def load_i18n
return if @i18n_loaded

if I18n.available_locales&.any?
# We expect all locale .yml files to have the locale name in its filename
I18n.load_path += ::Dir[::File.join(__dir__, 'locales', "{#{I18n.available_locales.join(',')}}.yml")]
# Or to be located in a directory with the locale name
I18n.load_path += ::Dir[::File.join(__dir__, 'locales', "{#{I18n.available_locales.join(',')}}/*.yml")]
else
I18n.load_path += ::Dir[::File.join(__dir__, 'locales', '**/*.yml')]
end

I18n.reload! if I18n.backend.initialized?
@i18n_loaded = true
end
end

class Config
@locale = nil
@random = nil
Expand All @@ -21,6 +38,8 @@ class << self
attr_writer :random

def locale
Faker.load_i18n

# Because I18n.locale defaults to :en, if we don't have :en in our available_locales, errors will happen
@locale || (I18n.available_locales.include?(I18n.locale) ? I18n.locale : I18n.available_locales.first)
end
Expand Down Expand Up @@ -150,6 +169,8 @@ def parse(key)
# Call I18n.translate with our configured locale if no
# locale is specified
def translate(*args, **opts)
Faker.load_i18n

opts[:locale] ||= Faker::Config.locale
opts[:raise] = true
I18n.translate(*args, **opts)
Expand All @@ -166,6 +187,8 @@ def translate(*args, **opts)

# Executes block with given locale set.
def with_locale(tmp_locale = nil)
Faker.load_i18n

current_locale = Faker::Config.own_locale
Faker::Config.locale = tmp_locale

Expand Down
15 changes: 15 additions & 0 deletions test/test_locale.rb
Expand Up @@ -78,4 +78,19 @@ def test_regex
def test_available_locales
assert I18n.locale_available?('en-GB')
end

def test_load_i18n
Faker.instance_variable_set :@i18n_loaded, nil
available_locales_was = I18n.available_locales

I18n.available_locales = %i[en ja id]
Faker.load_i18n
I18n.eager_load!

assert Faker.instance_variable_get(:@i18n_loaded)
assert_equal %i[en id ja], I18n.backend.translations.keys.sort
ensure
I18n.available_locales = available_locales_was
Faker.instance_variable_set :@i18n_loaded, nil
end
end

0 comments on commit 9ea5a3d

Please sign in to comment.