Передача переменных в рельсовый файл интернационализации рельсов

Я хочу использовать переменные, объявленные в файле 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, которое мы хотели «пометить» для другого проекта другой командой в организации. Мы хотели использовать один и тот же репозиторий исходного кода для обоих проектов, изменив только название сайта. Учитывая, что в файлах локалей уже есть несколько тысяч записей, и около сотни из них содержат имя сайта, было бы плохой практикой обновлять все шаблоны для передачи имени сайта в качестве переменной. Другие предложения, которые мы нашли в связанных вопросах, также не годятся в нашем случае. Мы хотим, чтобы файлы локали были одинаковыми для обоих проектов, чтобы мы могли избежать возни с исходным кодом и легко управлять файлами локали с помощью сторонней службы локализации.

Поэтому я обратился к реализации драгоценного камня, и он решает нашу конкретную проблему.

Другие вопросы по тегам