Валидационные сообщения на русском в Rails 3

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

Файлы локализации лежат в config/locales. Как может выглядеть для русского языка можно посмотреть тут github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ru.yml

Если мы скопируем этот файл к себе в проект и пропишем в config/application.rb по-умолчанию русский язык:

config.i18n.default_locale = :ru

То мы будем получать сообщения вида:

Name не может быть пустым
Phone не может быть пустым


Но Name и Phone тоже хотелось бы видеть на русском. Для этого создадим в config/locale папку models с файликом ru.yml:

ru:
  activerecord:
    models:
      user: Пользователь
    attributes:
      profile:
        name: "Отображаемое имя"
        phone: Телефон


Таким образом мы задали русские названия для модели и ее свойств. Для того чтобы Рельсы подхватили файл в application.rb добавим строку:

config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]

И теперь наше сообщение об ошибке будет таким:

Отображаемое имя не может быть пустым

Собственные сообщения об ошибках


Если вас по каким-то причинам не устраивают встроенные сообщения об ошибках, то можно добавить свои:

#encoding: utf-8
#первая строчка «волшебный коммент»
class User < ActiveRecord::Base
  validates :name, :presence => {:message => 'Хей! Здесь должно быть твое имя!'}
  validates_length_of :phone,
    :minimum   => 7,
    :maximum   => 10,
    :too_short => "должен содержать не менее %{count} символов",
    :too_long  => "должен содержать не менее %{count} символов"
end


Типы валидационных сообщений можно посмотреть тут: guides.rubyonrails.org/i18n.html#error-message-interpolation

Вот собственно и все основы локализации валидационных сообщений в RoR.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 16

    +1
    >«должен содержать не менее %{count} символов»

    Это ведь в самой модели пишется, а значит английский вариант будет недоступен? Как сделать, чтобы в зависимости от пользовательской локали выводились разные сообщения? Сходу не нашёл, а скоро понадобится.
      0
      попробуй в модели писать сразу на англ.
      а перевод соответственно в yml-файле
        +1
        Я делал следующим образом.
        В представлении (ну или в модели, как угодно):
        <%= t( 'activerecord.errors.template.header', :count => @transaction.errors.count ) %>


        В ru.yml:
         activerecord:
            errors:
              template:
                header:
                  one:   "Cохранение не удалось из-за %{count} ошибки"
                  other: "Cохранение не удалось из-за %{count} ошибок"
        

          +1
          Вам надо смотреть API интернализации
          +10
          ну тема, как вы сами заметили, даже неприлично простая
            0
            Да, но не очевидная. Когда первый раз с этим сталкиваешься сначала попадаешь на gem russian Но там нет понимания стоит ли его использовать для 3.1. Немного полазив по нему понимаешь, что скорее всего не стоит.

            На русский yml случайно наткнулся, мог бы и не заметить. Так что пусть будет)
              +1
              А какие проблемы с russian? я его во всех проектах использую вместе с r18n-rails. А вообще для себя сделал правилом вообще весь текст загонять в файлы переводов, даже если не планирую использовать несколько языков.
                0
                Меня смутило, что нигде явно не заявляется поддержка версии 3, только в одном из коммитов:
                March 25, 2010 0.2.6: minimal support of Rails 3.0b / i18n 0.3.x

                Хотя, конечно, может зря я отказался от его использования.
                  +1
                  зря, он вполне рабочий. единственное что если пользуете версию не с гитхаба с rubygems.org — придется сменить yaml-парсер на Syck. либо указывайте github-репозиторий в гемфайле.
                    0
                    В геме russian на данный момент нет необходимости. Все его фичи бэкпортированы или имплеменчены в i18n.
                +1
                Но это ещё и плюс в сторону того, чтобы поизучать Rails новичкам. Я одно время именно из за этой штуки бросил ковырять то, что Rails наскаффолдил — так и не смогу побороть «Name не может быть пустым».

                Особенно меня зацепило в раилскастах: «А сейчас мы будем защищаться от XSS атак. Готовы? Начнём. Ну в общем, ничего делать не надо, оно само всё делает что надо.».
                  +1
                  Ну в этом же вся идея RoR — сконцентрироваться на бизнес-задачах, а в рутине положиться на фреймворк
                0
                Можно еще через кастом-валидаторы делать:

                validate :name_validator
                
                def name_validator
                  errors.add(:name,:name_required) if self.name.blank?
                end
                

                А в локализации писать здесь:
                  activerecord:
                    errors:
                      models:
                        message:
                          attributes:
                            name:
                              name_required: "Введите Ваше ФИО"
                
                  0
                  Благодарю за совет
                  +5
                  Писать сообщения об ошибках прямо в моделе – не очень хорошо.
                  Пишите все в yml файлах локализаций, даже если у вас и преполагается использовать только один язык.
                    0
                    Рассказали бы про названия моделей в нестед формах при ошибках валидации, те
                    gallery has_many :images
                    image belongs_to :gallery
                    accepts_nested_attributes_for images
                    Когда в нестед форме галереи всплывает ошибка у картинки, image называется как image.
                    Как с этим бороться?

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое