Pytanie Przetłumacz komunikat sprawdzania poprawności atrybutu zagnieżdżonego modelu


Mam atrybut zagnieżdżony, na którym przeprowadzam walidację obecności. Próbuję bez powodzenia zapewnić tłumaczenie nazwy atrybutu, która jest zwracana w pełnym tekście komunikatu o błędzie.

Model jest wywoływany Identity i zawiera atrybut o nazwie identity Model jest zagnieżdżony w innym z użyciem has_many związek.

Typowy komunikat o błędzie jest obecnie zwracany w ten sposób

Identities identity can't be blank

Chcę przetłumaczyć atrybut (domyślnie Identities identity) w coś innego.

mam

en:
  activerecord:
    models:
      identity:
        identity: "whatever"

Jeśli to zrobię, pojawi się błąd

I18n::InvalidPluralizationData (translation data {:identity=>"whatever"} can not be used with :count => 1):

Próbowałem dodać do tego dane dotyczące pluralizacji, zmieniając powyższe

en:
  activerecord:
    models:
      identity:
        identity:
          one: "one"
          other: "other"

Zmienia to błąd na

I18n::InvalidPluralizationData (translation data {:identity=>{:one=>"one", :other=>"other"}} can not be used with :count => 1):

Próbowałem też many zamiast other bez różnicy.

Spędziłem kilka godzin próbując to zrobić, po przeczytaniu innych pytań dotyczących Stack Overflow i innych, bez powodzenia. Jaki jest właściwy sposób pisania tłumaczeń dla nazw atrybutów?


11
2017-08-04 11:13


pochodzenie


Dobre pytanie... - RAJ


Odpowiedzi:


Dodanie niektórych danych wyjściowych do debugowania do human_attribute_name metoda ujawnia, jaka powinna być ścieżka i18n.

Przykład ma user model z a has_many :identities związek. Pożądanym atrybutem jest identity, atrybut Identity model, z którego User Model ma wiele.

Zajrzałem do środka gems/activemodel-4.0.1/lib/active_model, plik translation.rb. The human_attribute_name metoda wyszukuje następującą ścieżkę:

:"activerecord.attributes.user/identities.identity"

Określa również następujące elementy jako domyślne, które są zastępczym tłumaczeniem:

:"activerecord.attributes.user/identities.identity"
:"activerecord.attributes.identities.identity"
:"attributes.identity"
"Identities identity"
"Identity"

dwa ostatnie są ciągami, pierwsze pasują, jeśli żadna ze ścieżek reprezentowanych jako symbole nie pasuje do dostępnych tłumaczeń. Tak więc, w przypadku braku tłumaczeń, wynik będzie ciągiem "Tożsamość tożsamości" (drugi ciąg, "Tożsamość" nigdy nie będzie używany).

Tak więc każda z poniższych ścieżek tłumaczeniowych będzie działać:

activerecord.attributes.user/identities.identity
activerecord.attributes.identities.identity
attributes.identity

Ścieżki są sprawdzane w tej kolejności, a pierwsza do dopasowania jest tą, która będzie używana.


11
2017-08-04 16:34





Spróbuj tego:

en:
  activerecord:
    errors:
      models:
        identity:
          attributes:
            identity:
              blank: 'Your new error message here'

-1
2017-08-04 11:48



To tłumaczy komunikat o błędzie, ale chcę przetłumaczyć nazwę atrybutu. - starfry


Możesz po prostu podać przetłumaczone wartości przed nazwami atrybutów db.

en:
  activerecord:
    attributes:
      identity: # this is model name
        identity: "translated attribute name"

Możesz przeczytać więcej o aktywnym modelu lokalizacja atrybutów


-1
2017-08-04 12:39



Jesteś pewny? dostaję can not load translations from ...: #<Psych::SyntaxError: (...): did not find expected key while parsing a block mapping at line 126 column 13>. Nie sądzę, żeby to było ważne. - starfry
Tak, masz rację, spójrz na zaktualizowaną odpowiedź - RAJ
nie działa dla mnie. Próbowałem w konsoli szyn I18n.t 'activerecord.errors.attributes.identity.identity' i to zwraca oczekiwaną wartość (więc mój yml jest poprawny), ale atrybut nie tłumaczy się w komunikacie o błędzie :( - starfry
activerecord.attributes.identity.identity też nie działa. Po zhackowaniu kodu activemodel, aby zobaczyć, co robi, odkryłem, że wymagany jest yml activerecord.attributes.identities.identity. Przekażę więcej szczegółów w odpowiedzi. - starfry