Статьи

Последнее руководство по Rails I18n, которое вам когда-либо понадобится: Часть II

Вот вторая половина руководства Ильи Бодрова для Rails I18n. Вы пропустили первую часть? Прочитайте это здесь !

Переводы ActiveRecord

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

    $ rails g scaffold Post title:string body:text
    $ rails db:migrate

При использовании Rails 3 или 4 последняя команда должна быть

    $ rake db:migrate

Теперь добавьте ссылку для создания нового сообщения:

просмотров / страниц / index.html.erb

    <h1><%= t('.welcome') %></h1>

    <%= link_to t('.new_post'), new_post_path %>

Переводы:

конфиг / локали / en.yml

    en:
      pages:
        index:
          welcome: "Welcome!"
          new_post: 'New post'

конфиг / локали / ru.yml

    ru:
      pages:
        index:
          welcome: 'Добро пожаловать!'
          new_post: 'Добавить запись'

Загрузите сервер и нажмите эту новую ссылку. Вы увидите форму для создания нового сообщения, однако проблема в том, что он не переводится: ярлыки на английском языке, а на кнопке написано «Создать сообщение». Интересно, что слово «Создать» (что означает «Создать») было взято из самоцвета rails-i18n, который, как вы помните, хранит переводы для некоторых распространенных слов. Тем не менее, Rails не знает, как переводить атрибуты модели и ее название.

Чтобы достичь этого, мы должны ввести специальную область:

конфиг / локали / ru.yml

    ru:
      activerecord:
        models:
          post: 'Запись'
        attributes:
          post:
            title: 'Заголовок'
            body: 'Текст'

конфиг / локали / en.yml

    en:
      activerecord:
        models:
          post: 'Post'
        attributes:
          post:
            title: 'Title'
            body: 'Body'

Таким образом, имена моделей находятся в activerecord.modelsпространстве имен, а имена атрибутов — в activerecord.attributes.SINGULAR_MODEL_NAME.

labelВспомогательный метод является достаточно умен , чтобы автоматически перевести название атрибута, следовательно, эта строка кода внутри _form.html.erb парциальное не требует каких — либо изменений:

    <%= f.label :title %>

Теперь предоставим некоторые основные правила проверки для модели:

модели / post.rb

  validates :title, presence: true
  validates :body, presence: true, length: {minimum: 2}

Далее попробуйте отправить пустую форму и обратите внимание, что даже сообщения об ошибках локализованы правильно благодаря rails-i18n gem! Единственная часть страницы осталась непереведенной в заголовке «Новая запись» и ссылке «Назад» — я оставлю их для вас, чтобы позаботиться о них.

Дата и время

Теперь давайте обсудим, как локализовать дату и время в Rails. Прежде чем двигаться дальше, создайте сообщение, используя форму или используя файл seed.rb. Также добавьте новую ссылку на корневую страницу

страницы / index.html.erb

    <%= link_to t('.posts'), posts_path %>

Тогда переведите это

конфиг / локали / en.yml

    en:
      pages:
        index:
          posts: 'Posts'

конфиг / локали / ru.yml

    ru:
      pages:
        index:
          posts: 'Список записей'

и измените представление индекса сообщений, введя новый столбец под названием «Создано в»:

просмотров / сообщений / index.html.erb

    <table>
      <thead>
        <tr>
          <th>Title</th>
          <th>Body</th>
          <th>Created at</th>
          <th colspan="3"></th>
        </tr>
      </thead>

      <tbody>
        <% @posts.each do |post| %>
          <tr>
            <td><%= post.title %></td>
            <td><%= post.body %></td>
            <td><%= post.created_at %></td>
            <td><%= link_to 'Show', post %></td>
            <td><%= link_to 'Edit', edit_post_path(post) %></td>
            <td><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %></td>
          </tr>
        <% end %>
      </tbody>
    </table>

Мы не собираемся переводить все столбцы и заголовки на этой странице — давайте сосредоточимся только на дате создания поста. В настоящее время это выглядит как «2016-08-24 14:37:26 UTC», что не очень удобно для пользователя. Для локализации даты или времени используйте localizeметод (с псевдонимом l).

    l(post.created_at)

Результатом будет «Ср, 24 авг. 2016, 14:37:26 +0000» — это формат времени по умолчанию (длинный), но в rails-i18n gem есть некоторые дополнительные, которые можно использовать «из коробки» — вы можете см. их маски здесь (для дат) и здесь (для времен) . Если вы использовали в Ruby метод STRFTIME прежде, вы заметите , что эти директивы формата ( %Y, %mи другие) являются абсолютно одинаковыми.

Чтобы использовать одно из предопределенных правил форматирования, скажем,

    l(post.created_at, format: :long)

Если вас не устраивают форматы, доступные по умолчанию, вы можете ввести новый для каждого языка:

ru:
  time:
    formats:
      own: '%H:%M:%S, %d %B'

Теперь этот формат можно использовать внутри представления:

    l(post.created_at, format: :own)

Конечно, если по какой-то причине вы не хотите определять новый формат, маску можно передать непосредственно :formatпараметру:

    l(post.created_at, format: '%H:%M:%S, %d %B')

Так же, как tметод, lтакже принимает :localeпараметр:

    l(post.created_at, locale: :en)

Последнее , что уведомления здесь является то , что рельсы-i18n также имеет переводы для distance_of_time_in_words, distance_of_time_in_words_to_nowи time_ago_in_wordsметоды, так что вы можете использовать их , а также:

    time_ago_in_words(post.created_at)

Правила и переменные плюрализации

Разные языки, конечно, имеют абсолютно разные правила плюрализации. Английские слова плюрализуются путем добавления выражения «s» (за исключением некоторых особых случаев), но, например, в русском языке правила плюрализации намного сложнее, поэтому ваша задача — добавить их.

Предположим, мы хотим показать, сколько сообщений было написано для блога. Создайте новую область и добавьте правила плюрализации для английского языка:

локали / en.yml

    en:
      posts:
        index:
          count:
            one: "%{count} post"
            other: "%{count} posts"

Это %{count}переменная часть — мы передадим ей значение при использовании tметода.

Что касается русского языка, все немного сложнее:

локали / en.yml

    ru:
      posts:
       index:
         count:
           zero: "%{count} записей"
           one: "%{count} запись"
           few: "%{count} записи"
           many: "%{count} записей"
           other: "%{count} записи"

Rails автоматически определяет, какой ключ использовать, исходя из предоставленного номера.

Теперь настройте вид:

просмотров / сообщений / index.html.erb

    <%= t('.count', count: @posts.length) %>

Обратите внимание, что существует также файл инициализатора inflections.rb, который можно использовать для хранения правил перегиба для различных случаев.

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

    en:
        apple_price: "Apple costs %{amount} dollars"

Тогда просто скажи:

    t('apple_price', amount: 5)

PhraseApp делает вашу жизнь проще!

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

  • Создайте новую учетную запись, если у вас ее нет, заполните свои данные и создайте новый проект (я назвал его «I18n demo»)
  • Перейдите на панель инструментов — здесь вы можете увидеть сводную информацию о проекте
  • Откройте вкладку Locales и нажмите кнопку Upload File
  • Выберите один из двух файлов локали ( en.yml или ru.yml ). Первый загруженный языковой стандарт будет помечен как стандартный, но его можно изменить позже.
  • Выберите Ruby / Rails YAML из выпадающего списка Формат
  • Выберите UTF-8 для кодировки
  • Вы также можете добавить некоторые теги для удобства
  • Загрузить другой файл переводов

Теперь во вкладке Locales вы увидите два языка, каждый из которых имеет зеленую линию: это означает, что эти локали переведены на 100%. Здесь вы также можете скачать их, отредактировать их настройки и удалить.

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

  • Нажмите кнопку Добавить локаль
  • Введите имя для локали (например, «de»)
  • Выберите «German — de» из выпадающего списка Locale
  • Нажмите Сохранить

Теперь новая локаль присутствует на странице. Обратите внимание, что есть небольшое сообщение «9 непереведенных», означающее, что у вас будут ключи без соответствующего перевода. Нажмите на это сообщение, и вы увидите все ключи, которые мы добавили при создании демонстрационного приложения. Теперь просто нажмите на эти ключи, добавьте перевод для них и нажмите Сохранить (эту кнопку можно изменить на Click & Next). Обратите внимание, что есть даже вкладка «История», в которой указано, кто, когда и как изменил перевод для этого ключа.

Когда вы закончите, вернитесь на вкладку Locales и нажмите кнопку Download рядом с немецким языком. Вы получите YAML-файл, который нужно только скопировать в каталог locales — перевод завершен!

Локализация — это не только перевод, и вы, возможно, не очень хорошо знакомы с языком, который планируете поддерживать. Но это не проблема — вы можете попросить профессионалов помочь вам! Выберите Order Translations в раскрывающемся списке рядом с языковым стандартом, выберите поставщика, предоставьте подробную информацию о своем запросе и нажмите кнопку Рассчитать цену. Оставьте заявку и ваш перевод будет готов в ближайшее время! Здесь вы можете узнать больше о профессиональных переводах и средних ценах.

Заключение

Итак, в этой статье мы обсудили интернационализацию и локализацию в Rails. Мы настроили базовые переводы, представили локализованные представления, переведенные атрибуты и модели ActiveRecord, локализованную дату и время, а также предоставили некоторые правила плюрализации. Надеюсь, теперь вы чувствуете себя более уверенно в использовании I18n с Rails!

Для получения дополнительной информации вы можете обратиться к этому официальному руководству по Rails и прочитать некоторую информацию на странице rails-i18n GitHub . Хранение переводов в файлах YAML — не единственный подход в Rails, поэтому вас может заинтересовать решение под названием Globalize — с его помощью вы можете хранить переводы в базе данных.