33
votes

When I submit a form with an error in it, it returns an error message. How can I translate these error messages with i18n? I already have translation for all the other texts in my views, so I know how l18n works in Rails. I now get this:

2 errors prohibited this user from being saved:

Email translation missing: nl.activerecord.errors.models.user.attributes.email.blank
Email translation missing: nl.activerecord.errors.models.user.attributes.email.blank

I want to translate both the title and the errors.

3

3 Answers

43
votes

The translation for the title would be:

nl:
  activerecord:
    errors:
      template:
        header:
          one:   "1 error prohibited this %{model} from being saved"
          other: "%{count} errors prohibited this %{model} from being saved"
        body:    "There were problems with the following fields:"

For translating the error messages, Rails will use the following order of translations:

activerecord.errors.models.user.attributes.name.blank
activerecord.errors.models.user.blank
activerecord.errors.messages.blank
errors.attributes.name.blank
errors.messages.blank

So you could add:

nl:
  activerecord:
    errors:
      models:
        user:
          attributes:
            email:
              blank: "foo blank in nl bar baz"

It's documented in the Rails Internationalization (I18n) API Guide, which might give you some more insight.

27
votes

Just use the Dutch translations file that you can find here. It contains translations for most (if not all) ActiveRecord validation messages.

Copy the file to config/locales/ in your project.

Alternate method

If you want to benefit from updated translations, add the following to your Gemfile instead of copying the translation files by hand:

gem 'rails-i18n'
14
votes

The rails I18n guide covers this pretty well.

You can put the following in config/locales/nl.yml to translate the attributes:

nl:
  activerecord:
    models:
      user: "User"
    attributes:
      email: "Email"

For the error messages, ActiveRecord will look them up in the following namespaces:

activerecord.errors.models.[model_name].attributes.[attribute_name]
activerecord.errors.models.[model_name]
activerecord.errors.messages
errors.attributes.[attribute_name]
errors.messages

model, attribute and value are interpolated and available in your translations, for example:

nl:
  errors:
    messages:
      blank: "Please fill the %{model}'s %{attribute}"