Tłumaczenie nazw atrybutów w błędach

Witam,

mam taki kod wyświetlający błędy

[code] <% @order.errors.each do |attribute, error| %>



  • <%= attribute %>
    <%= error %>

<% end %>[/code]
w modelu mam walidację pół żeby nie były puste i jak składam zamówienie z pustymi polami to wyrzuca błąd z tym, ze nazwy atrybutów nie są tłumaczone, błąd natomiast jest przetłumaczony
W pliku pl.yml mam między innymi

[code]activemodel:
errors:
models:
order:
attributes:
user: “Użytkownik”
payment: “Status płatności”
cost: “Koszt”
name: “Imie”
lastname: “Nazwisko”
phone: “Telefon”

oraz

activerecord:
attributes:
order:
user: “Użytkownik”
payment: “Status płatności”
cost: “Koszt”
name: “Imie”
lastname: “Nazwisko”
phone: “Telefon”

itd…[/code]
czy coś jest nie tak lub gdzieś indziej musze ustawić to tłumaczenie?

Z góry dzięki za pomoc.

1 Like

zerknij do guide: http://guides.rubyonrails.org/i18n.html#error-message-scopes

czy chodzi o to, że muszę ustawić komunikat dla każdego atrybutu ?
activerecord.errors.models.user.attributes.name.blank

W języku polskim stosujemy odmianę wyrazów, nie to co w angielskim.

Możesz ustawić jakieś domyślne tłumaczenia w

errors.messages.blank

a te które będą się nieprawidłowo odmieniąc możesz poprostu zapisać osobno dla każdego atrybutu.

PS. radze ściągnąć domyślną translacje dla języka polskiego: https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/pl.yml

ok. dzięki, ja mam tłumaczenie, dość rozbudowane, mam przetłumaczone modele, atrybuty i wszystko jest ok. tylko właśnie w błędach nazwy atrybutów nie są tłumaczone. Trochę to dziwne jest bo błędy są po polsku a nazwy atrybutów po angielsku. Ja nie chcę zmieniać komunikatów błędów, te co są wystarczają, trochę to bez sensu, że mając przetłumaczone wszystko muszę ustawiać od nowa pełne komunikaty żeby tylko jedno słowo było dodatkowo przetłumaczone. Zielony jestem ale na mój gust powinno być inaczej.

errors: format: "%{attribute} %{message}" attributes: user: "Użytkownik" cost: "Koszt" name: "Imie" lastname: "Nazwisko" phone: "Telefon" address: "Adres" city: "Miasto" messages: accepted: "musi zostać zaakceptowane" blank: "nie może być puste" confirmation: "nie zgadza się z potwierdzeniem" empty: "nie może być puste" equal_to: "musi być równe %{count}" even: "musi być parzyste" exclusion: "jest zarezerwowane" greater_than: "musi być większe od %{count}" greater_than_or_equal_to: "musi być większe lub równe %{count}" inclusion: "nie znajduje się na liście dopuszczalnych wartości" invalid: "jest nieprawidłowe" less_than: "musi być mniejsze od %{count}" less_than_or_equal_to: "musi być mniejsze lub równe %{count}" not_a_number: "nie jest liczbą" not_an_integer: "musi być liczbą całkowitą" odd: "musi być nieparzyste" record_invalid: "Negatywne sprawdzenie poprawności: %{errors}" taken: "zostało już zajęte" too_long: "jest za długie (maksymalnie %{count} znaków)" too_short: "jest za krótkie (przynajmniej %{count} znaków)" wrong_length: "ma nieprawidłową długość (powinna wynosić %{count} znaków)"
patrząc na to format: “%{attribute} %{message}” to wydawało mi się, że jak dodam tutaj attributes to pociągnie stąd nazwy, jednak nie, pytanie skąd są pobierane, bo pewnie tam wystarczy je przetłumaczyć

1 Like

Moim zdaniem masz do wyboru dwie opcje:
a) jeśli w dalszym ciągu chcesz iterować po errors to zamiast atrybutu musisz wypisać Model.human_attribute_name(attribute)
b) iterować po errors.full_messages

@patryk odpowiedź znajduje się w twoim kodzie:

[code=ruby]<% @order.errors.each do |attribute, error| %>



  • <%= attribute %>
    <%= error %>

<% end %>[/code]
attribute to nie nazwa tłumaczone a klucz w hashu. Klucz to oryginalna nazwa attrybutu w modelu (bez żadnych dodatkowych przekształceń).

1 Like