Ответ 1
Схема расположения по умолчанию для локализации представлена здесь:
http://guides.rubyonrails.org/i18n.html#organization-of-locale-files
Мне было интересно, возможно ли иметь несколько файлов локали, возможно, организовано в каталогах и по-прежнему использовать псевдонимы 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 config, я установил его для загрузки всего файла locale в подкаталоги. Эта настройка не работает для меня, я получаю плохую ошибку псевдонима при загрузке страницы.
Я попробовал иметь init script, который компилирует все en.yml в один и просто использует этот один файл, а псевдоним работает и все, но я не могу слить ключи. Например, если у меня есть еще один "помощник" в каком-то другом файле, он просто использует все, что было указано последним (на самом деле, "en" тоже становится переопределенным) вместо слияния ключей.
Или есть лучший образец для всего этого? Большое вам спасибо!
Схема расположения по умолчанию для локализации представлена здесь:
http://guides.rubyonrails.org/i18n.html#organization-of-locale-files
Насколько я понимаю, вы хотите либо иметь несколько файлов .yml с якорями и псевдонимами, либо иметь один файл с функцией объединения ключей.
К сожалению, обе вещи невозможны из-за того, как работает Rails.
Техническая справка:
Существует два основных шага, которые выполняются I18n-сервером Rails с использованием двух отдельных систем:
.yml
загружается отдельно с использованием библиотеки YAML. Это где якоря и псевдонимы разрешаются, и создается хэш Ruby. Дублирующие узлы не допускаются на этом этапе, то есть каждый узел переопределяет предыдущий узел с тем же именем и родителем.Вот почему якоря и псевдонимы не могут занимать несколько файлов. С другой стороны, вы получаете удобную функцию слияния, которая не поддерживается YAML.
Другими словами: объединяя все в гигантский файл, вы потенциально получаете функцию "глобального псевдонима", но теряете функцию слияния/дублирования ключей. Вы можете иметь один или другой, но не оба. С точки зрения удобства обслуживания подход с несколькими файлами определенно более приятен.
PS: Конечно, упомянутое вами дублирование заставляет меня немного съежиться, но лучше сосредоточиться на DRY-ключах и хорошей структуре ключей, чем на DRY-переводах.
Это потому, что переводы часто меняются во времени: то, что было одинаковым на ранних стадиях вашего приложения, может немного отличаться после его развития. Возможно, в некоторых местах это должно быть "Имя", а в других - "Введите ваше имя, пожалуйста".
Я также могу представить, что наличие канонического основного перевода не работает для каждого языка, в отношении грамматики и других контекстов, которые не имеют отношения к английскому языку.
Поэтому мой личный совет: придерживайтесь метода, предложенного Rails (то есть нескольких файлов), и игнорируйте неизбежное дублирование.
Попробуйте заменить значение application.rb по умолчанию параметра * config.i18n.load_path * следующим:
config.i18n.load_path += Dir[Rails.root.join('config/locales/**/*.yml').to_s]
Это работает для меня.