Allow all available locales for template lookups.
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.
This commit is contained in:
parent
40272988ce
commit
12c12899df
@ -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{
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user