Передача переменных в рельсовый файл интернационализации рельсов
Я хочу использовать переменные, объявленные в файле YML прямо здесь. Например, я объявил site_name
и хочу использовать его ниже в description
,
en:
site_name: &site_name "Site Name"
static_pages:
company:
description: *site_name #this works fine
description: "#{*site_name} is an online system" #this doesn't work
Как я могу совместить *site_name
переменная с дополнительным текстом?
3 ответа
Короткий ответ, я считаю, нет, вы не можете выполнять интерполяцию строк в YAML так, как вы хотите использовать псевдоним.
В вашем случае, я бы сделал что-то вроде следующего в моем файле локали:
en:
site_name: "Site Name"
static_pages:
company:
description: ! '%{site_name} is an online system'
и затем вызовите в соответствующем представлении с именем сайта в качестве параметра:
t('.description', site_name: t('site_name'))
что бы получить вас "Site Name is an online system"
,
Однако, если вы отчаянно хотите использовать псевдонимы в своем YAML-файле для объединения строк, следующий совершенно не рекомендуемый код также будет работать, если строка будет двумя элементами массива:
en:
site_name: &site_name "Site Name"
static_pages:
company:
description:
- *site_name
- "is an online system"
и тогда вы бы join
массив в соответствующем представлении, как это:
t('.description').join(" ")
Который также даст вам "Site Name is an online system"
,
Однако, прежде чем вы решите пойти по этому пути, кроме вопроса, на который ссылается @felipeclopes, взгляните на:
- этот ответ Stackru относительно объединения строк i18n (tl;dr Пожалуйста, не ради вашей команды переводчиков).
- Вопросы Stackru здесь и здесь, которые похожи на ваш вопрос.
Вы можете использовать следующий синтаксис, как в примере:
dictionary:
email: &email Email
name: &name Name
password: &password Password
confirmation: &confirmation Confirmation
activerecord:
attributes:
user:
email: *email
name: *name
password: *password
password_confirmation: *confirmation
models:
user: User
users:
fields:
email: *email
name: *name
password: *password
confirmation: *confirmation
sessions:
new:
email: *email
password: *password
Этот пример взят из: Рефакторинг файлов Ruby on Rails i18n YAML с использованием словарей
Опаздывать на вечеринку. Я создал драгоценный камень, который делает именно это. i18n-env-var-поиск
Мой конкретный вариант использования немного уникален. В нашей организации у нас есть существующее приложение rails, которое мы хотели «пометить» для другого проекта другой командой в организации. Мы хотели использовать один и тот же репозиторий исходного кода для обоих проектов, изменив только название сайта. Учитывая, что в файлах локалей уже есть несколько тысяч записей, и около сотни из них содержат имя сайта, было бы плохой практикой обновлять все шаблоны для передачи имени сайта в качестве переменной. Другие предложения, которые мы нашли в связанных вопросах, также не годятся в нашем случае. Мы хотим, чтобы файлы локали были одинаковыми для обоих проектов, чтобы мы могли избежать возни с исходным кодом и легко управлять файлами локали с помощью сторонней службы локализации.
Поэтому я обратился к реализации драгоценного камня, и он решает нашу конкретную проблему.