Откат локали от страны к языку без необходимости определять каждый по отдельности

Я локализую приложение с рельсами I18n по умолчанию с globalize3 в качестве серверной части.

Можно ли установить локаль с кодом страны (например, :fr-CA) для возврата к определенному языку (:fr) перед автоматическим переходом на резерв по умолчанию? Я знаю, что можно установить каждую локаль/страну вручную с помощью

config.i18n.fallbacks = {'fr-CA' => 'fr'}

Но было бы неплохо не добавлять каждый запасной вариант вручную и сделать это поведение автоматическим.


person Ian Armit    schedule 13.11.2012    source источник
comment
В любом современном Rails (скажем, 6) локали для конкретной страны всегда возвращаются к общеязыковым локали, если резервные варианты включены. Вручную делать нечего.   -  person Christopher Oezbek    schedule 18.03.2021


Ответы (1)


Чтобы добиться именно этого, у меня есть инициализатор с

I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)

См. исходный код для получения дополнительной информации.

Изменить:

Это напомнило мне, что существует раздражающая ошибка в ActionView LookupContext, которая мешает этому работать для локализованные представления (правда работает для файлов локалей). Я вижу, что до сих пор не исправили. По сути, если у вас есть какие-либо локализованные представления (например, страницы справки, которые не подходят для хранения в файлах локали из-за их длины), то локаль fr-CA не вернется к представлению под названием help. fr.html.erb. Вы должны либо назвать файл help.fr-CA.html.erb или, что я и сделал, исправив LookupContext другим инициализатором, примерно так:

module ActionView
  class LookupContext
    # Override locale= to also set the I18n.locale. If the current I18n.config object responds
    # to original_config, it means that it's has a copy of the original I18n configuration and it's
    # acting as proxy, which we need to skip.
    def locale=(value)
      if value
        config = I18n.config.respond_to?(:original_config) ? I18n.config.original_config : I18n.config
        config.locale = value[0,2] # only use first part of the locale in lookups
      end
      super(@skip_default_locale ? I18n.locale : default_locale)
    end
  end
end

Еще одно редактирование: обратите внимание, что исправление довольно грубое и ломает полный поиск локали, переходя сразу к языку. Если вам нужно также иметь полностью совпадающие представления (язык-РЕГИОН), вам нужно улучшить мой код!

person Ola Tuvesson    schedule 14.11.2012
comment
Спасибо. У меня нет локализованных представлений, поэтому мне нужен был только инициализатор. - person Ian Armit; 14.11.2012