Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

An attempt to load only necessary locales on the fly #2169

Merged
merged 2 commits into from Oct 26, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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