Rails I18n псевдоним нескольких файлов

Мне было интересно, возможно ли иметь несколько файлов локали, возможно, организованных в каталогах и по-прежнему использовать псевдонимы YAML, например:

в общем файле:

# config/locales/common/en.yml
en:
  first_name: &first_name "First name"
  last_name: &last_name "Last name"

и в более конкретном файле:

# config/locales/models/user/en.yml
en:
  helpers:
    label:
      user:
        first_name: *first_name
        last_name: *last_name

Это поможет свести к минимуму переводы и изменения в переводах. в моей конфигурации rails я установил загрузку всех файлов локали в подкаталогах. Эта настройка не работает для меня, я получаю ошибку неправильного псевдонима при загрузке страницы.

Я попытался создать сценарий инициализации, который компилирует все en.yml в один и просто использует этот один файл, и псевдоним работает и все такое, но я не могу слить ключи. Например, если у меня есть другие «помощники» в каком-то другом файле, он просто использует то, что было указано последним (на самом деле, «en» тоже продолжает переопределяться) вместо объединения ключей.

Или есть лучший образец для всего этого? Большое спасибо!


person janechii    schedule 31.01.2011    source источник


Ответы (3)



Насколько я понимаю, вы хотите либо иметь несколько файлов .yml с якорями и псевдонимами, либо иметь один файл с функцией слияния ключей.

К сожалению, обе вещи невозможны из-за того, как работает Rails.

Техническая информация:

Есть два основных шага, которые выполняются бэкэндом I18n Rails с использованием двух отдельных систем:

  1. Каждый .yml файл загружается отдельно с помощью библиотеки YAML. Именно здесь разрешаются якоря и псевдонимы и создается хэш Ruby. На этом шаге не допускаются повторяющиеся узлы, т. е. каждый узел переопределяет предыдущий узел с тем же именем и родителем.
  2. Полученные хэши Ruby затем объединяются (глубоко). На этом этапе разрешены дубликаты из разных файлов, но псевдонимы больше не доступны.

Вот почему якоря и псевдонимы не могут охватывать несколько файлов. С другой стороны, вы получаете удобную функцию слияния, которая не поддерживается YAML.

Другими словами: объединив все в гигантский файл, вы потенциально получите функцию «глобального псевдонима», но потеряете функцию слияния/дублирования ключей. Вы можете иметь одно или другое, но не оба. С точки зрения ремонтопригодности многофайловый подход определенно более приятен.


PS: Конечно, дублирование, о котором вы упоминаете, меня тоже немного смущает, но лучше сосредоточиться на СУХИХ ключах и хорошей структуре ключей, чем на СУХИХ переводах.

Это связано с тем, что переводы часто меняются со временем: то, что было одинаковым на ранних стадиях вашего приложения, может немного отличаться после того, как ваше приложение эволюционировало. Возможно, где-то это должно быть "Имя", а где-то "Введите, пожалуйста, ваше имя".

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

Итак, мой личный совет: придерживайтесь метода, предложенного Rails (т. е. нескольких файлов), и игнорируйте неизбежное дублирование.

person Daniel Rikowski    schedule 15.10.2013

Попробуйте заменить в application.rb значение параметра *config.i18n.load_path* по умолчанию на это:

config.i18n.load_path += Dir[Rails.root.join('config/locales/**/*.yml').to_s]

Меня устраивает.

person Skydan    schedule 26.12.2011
comment
Skydan, спасибо за участие! к сожалению, это не сработало для меня. Обратите внимание, что я использую псевдоним YAML. Без псевдонимов все будет работать нормально, как вы сказали. Спустя год после первоначального вопроса я до сих пор не нашел идеального решения. Я просто повторял переводы. - person janechii; 17.01.2012