Komunikaty błędów w języku polskim - Ruby on Rails

Cześć, mam problem z przetłumaczeniem angielskich komunikatów o błędach na język polski. Jestem w fazie nauki RoR, tworzę swoją pierwszą stronę i podczas tworzenia formularza rejestracji gdzie wprowadziłem już ograniczenia dotyczące minimalnej ilości znaków dotyczące hasła, pustej nazwy użytkownika itp. pokazują się komunikaty że podane pola nie mogą być puste, jednak po angielsku. Próbowałem szukać po plikach żeby to zmienić, tak samo przeszukiwałem internety i wszystkie znalezione sposoby nie chcą za bardzo działać. Poniżej wrzucam kod:

user.rb

class User < ActiveRecord::Base
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+-.]+@[a-z\d-.]+.[a-z]+\z/i
validates :email, length: { maximum: 255 }, presence: true,
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
has_secure_password
validates :password, length: { minimum: 6 }

end

_error_messages.html.erb

<% if @user.errors.any? %>



Proszę wypełnić wymagane pola.


    <% @user.errors.full_messages.each do |msg| %>
  • <%= msg %>

  • <% end %>


<% end %>

new.html.erb

<% provide(:title, ‘Rejestracja’) %>

Zarejestruj się

<%= form_for(@user) do |f| %> <%= render 'shared/error_messages' %>
        <%= f.label :name, "Nazwa użytkownika" %>
        <%= f.text_field :name, class: 'form-control' %>
    
        <%= f.label :email, "E-mail" %>
        <%= f.email_field :email, class: 'form-control' %>
    
        <%= f.label :password, "Hasło" %>
        <%= f.password_field :password, class: 'form-control' %>
    
        <%= f.label :password_confirmation, "Powtórz hasło" %>
        <%= f.password_field :password_confirmation, class: 'form-control' %>
    
        <%= f.submit "Utwórz konto", class: "btn btn-primary" %>
    <% end %>
</div>

Teraz to co chce zmienić, to te komunikaty:

Z góry wielkie dzięki za pomoc.

Tak się tego nie robi.

Tworzysz formularze i używasz w nich tylko nazw kolumn. np.:
<%= f.label :name %>

Tworzysz pliki w katalogu /config/locales/
moja_app.en.yml
moja_app.pl.yml

Które mają w sobie takie coś:

   en:
      activerecord:
        models:
          user: 'User'
        attributes:
          user:
            name: 'Name'
            email: 'Email'
            password: 'Password'

i w pliku "pl’

pl:
  activerecord:
    models:
      user: 'Użytkownik'
    attributes:
      user:
        name: 'Nazwa'
        email: 'Email'
        password: 'Hasło'

tworzysz też pliki z tłumaczeniami:

pl:
  errors:
    format: ! '%{attribute} %{message}'
    messages:
      accepted: musi zostać zaakceptowane
      blank: nie może być puste
      confirmation: nie zgadza się z potwierdzeniem

I w pliku application.rb dodajesz wpis:
config.i18n.default_locale = :pl

Teraz, po restarcie aplikacji na wszystkich formularzach Railsy przetłumaczą kolumny (f.label …)
na nazwy polskie, a ewentualne komunikaty o błędach będą tłumaczone na język polski.

…Wszystko jest BARDZO DOBRZE opisane:
http://guides.rubyonrails.org/i18n.html

Uwaga!
w tych plikach “.yml” są wcięcia, ale nie chce mi coś tutaj tego dobrze sformatować.
Pliki z tłumaczeniami możesz ściągnąć z netu

1 Like

jeśli masz zainstalowany i18n to masz już wszystkie pliki z tłumaczeniem w tym gemie (Plik z tłumaczeniem)

Wystarczy dobrze skonfigurować gem np. w config/application.rb dodajesz te 2 linijki:

config.i18n.available_locales = [:pl]
config.i18n.default_locale = :pl

I gotowe :slight_smile:

Jeśli chcesz się faktycznie nauczyć czegoś, to napisz sobie sam takie pliki jak wyżej kolega radzi.

1 Like

Dzięki wielkie za odpowiedź. Generalnie uczę się z książki Michaela Hartla, tak w książce opisywał tworzenie tych błędów. Tak czy siak, zastosowałem się do Waszych porad i ładnie zaskoczyło jedynie mam problem jeszcze z tym, że nie chce mi się zmienić Name na Nazwa użytkownika, tak samo Password i Password confirmation. Pojawiają się komunikaty w połowie spolszczone, np:

Name nie może być puste
Email nie może być puste
Email jest nieprawidłowe
Password nie może być puste
Password jest za krótkie (przynajmniej 6 znaków)

Próbowałem nawet zmieniać nazwę activerecord na activemodel ale nic nie dało. Macie jakieś pomysły?

Czyli nie tłumaczy nazw kolumn.
Zobacz, czy na pewno masz prawidłowo opisany model i jego atrybuty:

pl:
  activerecord:
    models:
      user: 'Użytkownik'
    attributes:
      user:
        name: 'Nazwa'
        email: 'Email'
        password: 'Hasło'

W pliku:

en.yml

en: activerecord: models: user: 'User' attributes: user: name: 'Name' email: 'Email' password: 'Password' password_confirmation: 'Password confirmation'

pl.yml

pl: activerecord: models: user: 'Użytkownik' attributes: user: name: 'Nazwa użytkownika' email: 'Adres e-mail' password: 'Hasło' password_confirmation: 'Potwierdź hasło'

Do pliku application.rb dodałem:

config.i18n.default_locale = :pl

Nie wiem, czy masz tam prawidłowe wcięcia. Pliki “yml” są dość “wrażliwe” pod tym względem.

Kurde, też myślałem że może faktycznie wina leży we wcięciach, ale wpisałem ten kod na nowo, wcięcia zrobiłem na dwie spacje różnicy. Może w jakimś innym pliku jest kod skopany, który w jakiś sposób uniemożliwia przetłumaczenie kolumn. Możliwe?

Dobra, jednak wcięcia, źle po prostu podłączyłem polskie i18n do tego kodu powyżej i dlatego nie chciało tłumaczyć.

BTW, żeby nie zakładać drugiego tematu, macie jakieś sposoby żeby poprawnie pojawiały się te komunikaty? Chodzi mi o odmiany, np. jak zrobić żeby był komunikat

Adres e-mail nie może być pusty

a zaraz później

Hasło nie może być pustE

?

Dodałem gema od grk z tego posta, ale za wiele nie pomogło.

Możesz definiować własne translacje błędów na poszczególne atrybuty jak i jeden główny na cały model. Spróbuj tego:

pl:
  activerecord:
    errors:
      models:
        user:
          blank: "nie może być puste"
          attributes:
            email:
              blank: "nie może być pusty"