W rzeczywistości istnieje alternatywa dla uciążliwego podejścia i18n. Rozwiązanie nosi nazwę Tr8n.
Twój powyższy kod byłby po prostu:
<%= tr("You have {num || kid}", num: 1) %>
Otóż to. Nie ma potrzeby wyodrębniania kluczy z kodu i utrzymywania ich w pakietach zasobów, nie ma potrzeby wdrażania reguł liczby mnogiej dla każdego języka. Tr8n zawiera numeryczne reguły kontekstu dla wszystkich języków. Zawiera również zasady dotyczące płci, reguły listy i przypadki językowe.
Pełna definicja powyższego klucza tłumaczenia faktycznie wyglądałaby tak:
<%= tr("You have {num:number || one: kid, other: kids}", num: 1) %>
Ale ponieważ chcemy zaoszczędzić miejsce i czas, num jest automatycznie odwzorowywany na reguły numeryczne i nie ma potrzeby podawania wszystkich opcji dla wartości reguł. Tr8n jest wyposażony w pluralizery i inflektory, które wykonają pracę za Ciebie w locie.
Tłumaczenie twojego klucza w języku rosyjskim byłoby po prostu:
"У вас есть {num || ребенок, ребенка, детей}"
Nawiasem mówiąc, twoje tłumaczenie byłoby niedokładne w językach, w których obowiązują zasady dotyczące płci. Na przykład w języku hebrajskim należałoby w rzeczywistości określić co najmniej 2 tłumaczenia swojego przykładu, ponieważ „Ty” będzie się różnić w zależności od płci przeglądającego użytkownika. Tr8n radzi sobie z tym bardzo dobrze. Oto transliteracja tłumaczeń hebrajskich:
"Yesh leha yeled ahad" with {context: {viewing_user: male, num: one}}
"Yesh leha {num} yeladim" with {context: {viewing_user: male, num: other}}
"Yesh lah yeled ahad" with {context: {viewing_user: female, num: one}}
"Yesh lah {num} yeladim" with {context: {viewing_user: female, num: other}}
Zatem Twój pojedynczy klucz angielski wymaga w tym przypadku 4 tłumaczeń. Wszystkie tłumaczenia są wykonywane w kontekście - nie musisz przerywać zdania. Tr8n ma mechanizm mapowania jednego klucza do wielu tłumaczeń w oparciu o język i kontekst - wszystko odbywa się w locie.
Ostatnia rzecz. A co by było, gdybyś musiał pogrubić liczenie? Byłoby po prostu:
<%= tr("You have [bold: {num || kid}]", num: 1, bold: "<strong>{$0}</strong>") %>
Na wypadek, gdybyś chciał później przedefiniować „pogrubienie” - byłoby to bardzo proste - nie będziesz musiał przeglądać wszystkich swoich plików YAML i ich zmieniać - po prostu zrób to w jednym miejscu.
Aby dowiedzieć się więcej, zajrzyj tutaj:
https://github.com/tr8n/tr8n_rails_clientsdk
Ujawnienie: Jestem programistą i opiekunem frameworka Tr8n i wszystkich jego bibliotek.
"#{....}"
nie są konieczne w powyższym kodzie.