Chciałbym i18n napisać następujący tekst:
Jesteś już zarejestrowany? Zaloguj sie!
Zwróć uwagę, że w tekście znajduje się link. W tym przykładzie wskazuje na Google - w rzeczywistości będzie wskazywać na moją aplikację log_in_path
.
Znalazłem dwa sposoby, aby to zrobić, ale żaden z nich nie wygląda „dobrze”.
Pierwszy sposób, jaki znam, obejmuje posiadanie tego mojego en.yml
:
log_in_message: "Already signed up? <a href='{{url}}'>Log in!</a>"
I moim zdaniem:
<p> <%= t('log_in_message', :url => login_path) %> </p>
To działa , ale założenie <a href=...</a>
części en.yml
nie wygląda dla mnie zbyt czysto.
Inną opcją, jaką znam, jest użycie zlokalizowanych widoków - login.en.html.erb
i login.es.html.erb
.
To również nie wydaje się właściwe, ponieważ jedyną inną linią byłaby wspomniana wyżej; reszta widoku (~ 30 linii) zostanie powtórzona dla wszystkich widoków. Nie byłoby bardzo SUCHE.
Myślę, że mógłbym użyć „zlokalizowanych części składowych”, ale to wydaje się zbyt trudne; Myślę, że wolę pierwszą opcję niż tyle małych plików widoku.
Więc moje pytanie brzmi: czy istnieje „właściwy” sposób na wdrożenie tego?
Odpowiedzi:
en.yml
login.html.erb
źródło
%{href}
w ciągu tłumaczenia YAML. Ponadto, ponieważ dane wyjściowe są automatycznie chronione, musisz określićraw
lub.html_safe
jawnie lub dodać sufiks do klucza tłumaczenia z_html
, tak jak in,login_message_html
a ucieczka zostanie automatycznie pominięta.t('string')
jest identyczny zt("string")
. To ta sama rzecz.t('some.key', link: link_to()).html_safe
Oddzielenie tekstu i linku w pliku locale.yml działa przez chwilę, ale przy dłuższym tekście są one trudne do przetłumaczenia i utrzymania, ponieważ link znajduje się w oddzielnym elemencie tłumaczenia (jak w odpowiedzi Simones). Jeśli zaczniesz mieć wiele ciągów / tłumaczeń z linkami, możesz je trochę bardziej wysuszyć.
Zrobiłem jeden pomocnik w moim application_helper.rb:
W moim en.yml:
A w moich poglądach:
W ten sposób łatwiej jest tłumaczyć wiadomości, ponieważ również tekst odsyłacza jest jasno zdefiniowany w plikach locale.yml.
źródło
This is a %{link:link to Google}
. Pozwala na posiadanie wielu linków w jednym ciągu, obsługuje XSS i umożliwia zagnieżdżone tłumaczenia. Zajrzyj na github.com/iGEL/i18n_linkflash
wiadomości w Railsach 3+, zrób to w ten sposóbview_context.it(key, ...)
Wziąłem roztwór Hollis i zrobiłem z niego klejnot
it
. Spójrzmy na przykład:I wtedy
Aby uzyskać więcej informacji, zobacz https://github.com/iGEL/it .
źródło
W en.yml
W de.yml
w new.html.erb [założono]
źródło
Bardzo dziękuję, Holli, za podzielenie się tym podejściem. Dla mnie działa jak urok. Zagłosowałbym na ciebie, gdybym mógł, ale to jest mój pierwszy post, więc brakuje mi odpowiedniej reputacji ... Jako dodatkowy element układanki: Problem, który zdałem sobie z twoim podejściem, polega na tym, że nadal nie działa od wewnątrz kontroler. Zrobiłem kilka badań i połączyłem twoje podejście z podejściem Glenna na rubypond .
Oto co wymyśliłem:
Wyświetl pomocnika, np. Application_helper.rb
W kontrolerze:
W pliku locale.yml:
W widoku:
Mam nadzieję, że dzięki temu postowi zyskam reputację, dzięki której zagłosuję na Ciebie, Holli :) Wszelkie uwagi są mile widziane.
źródło
Mieliśmy:
lub bardziej wyraźnie:
następnie w ApplicationController.rb tylko
Biorąc pod uwagę klucz w
en.yml
pliku, taki jakmoże być używany w ERB jako
powinien generować
źródło
Chciałem trochę więcej elastyczności niż tylko dodawanie linków do wiadomości flash z plików YAML (na przykład nazwa zalogowanego użytkownika itp.), Więc zamiast tego chciałem użyć notacji ERB w ciągu.
Ponieważ używam
bootstrap_flash
, zmodyfikowałem kod pomocnika w następujący sposób, aby zdekodować ciągi ERB przed wyświetleniem:Następnie można użyć ciągów takich jak poniżej (używając devise):
Może to nie działać we wszystkich sytuacjach i może istnieć argument, że definicje kodu i ciągów znaków nie powinny być mieszane (szczególnie z punktu widzenia DRY), ale wydaje mi się, że działa to dobrze. Kod powinien być przystosowany do wielu innych sytuacji, z których ważne są następujące:
źródło
Myślę, że prostym sposobem na to jest po prostu wykonanie:
źródło
Dlaczego nie skorzystać z pierwszego sposobu, ale jak go podzielić
I wtedy
źródło