Skip to content

Commit

Permalink
Allow all available locales for template lookups.
Browse files Browse the repository at this point in the history
Following the discussion here:
https://github.com/rails/rails/pull/44174/files#r785160819

Background: The `i18n` gem is relatively lax when it comes
to naming locales. It does not enforce any standard. Thus
it is possible to have e.g. per tenant locales (think
`en_tenant1`, `en_tenant2` etc.). This also worked for
translated templates up until rails 6.1.

Rails 7 changed the template lookup and enforced a naming
scheme for locales. This poses a problem for legacy apps
that use non-standard locale names.

This commit changes the way locale names are detected in
template file names. In addition to the previously used
regexp it also allows all known locales from
`I18n.available_locales`.

This makes it backwards compatible to rails 7.0
behavior while also allowing non-standard locale names.
Thanks to jvillarejo for the great idea.

Also introduce the usage of `Regexp.union`, a wonderful
suggestion by casperisfine.
  • Loading branch information
oneiros committed May 30, 2022
1 parent 4027298 commit 12c1289
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 3 deletions.
8 changes: 5 additions & 3 deletions actionview/lib/action_view/template/resolver.rb
Expand Up @@ -17,9 +17,11 @@ class PathParser # :nodoc:
ParsedPath = Struct.new(:path, :details)

def build_path_regex
handlers = Template::Handlers.extensions.map { |x| Regexp.escape(x) }.join("|")
formats = Template::Types.symbols.map { |x| Regexp.escape(x) }.join("|")
locales = "[a-z]{2}(?:[-_][A-Z]{2})?"
handlers = Regexp.union(Template::Handlers.extensions.map(&:to_s))
formats = Regexp.union(Template::Types.symbols.map(&:to_s))
available_locales = I18n.available_locales.map(&:to_s)
regular_locales = [/[a-z]{2}(?:[-_][A-Z]{2})?/]
locales = Regexp.union(available_locales + regular_locales)
variants = "[^.]*"

%r{
Expand Down
12 changes: 12 additions & 0 deletions actionview/test/template/resolver_shared_tests.rb
Expand Up @@ -242,4 +242,16 @@ def test_finds_template_with_lowdash_format

assert_equal "Texto simple!", es_ar[0].source
end

def test_finds_template_with_arbitrarily_formatted_locale
I18n.backend.store_translations(:en_customer1, { hello: "hello" })
with_file "test/hello_world.en_customer1.text.erb", "Good day, world."

templates = context.find_all("hello_world", "test", false, [], locale: [:en_customer1])

assert_equal 1, templates.size
assert_equal "Good day, world.", templates[0].source
ensure
I18n.reload!
end
end

0 comments on commit 12c1289

Please sign in to comment.