Ich möchte einen Text schreiben, der so aussieht:
Schon angemeldet? Anmeldung!
Beachten Sie, dass der Text einen Link enthält. In diesem Beispiel zeigt es auf Google - in Wirklichkeit zeigt es auf meine App log_in_path
.
Ich habe zwei Möglichkeiten gefunden, aber keine davon sieht "richtig" aus.
Der erste Weg, den ich kenne, besteht darin, Folgendes zu haben en.yml
:
log_in_message: "Already signed up? <a href='{{url}}'>Log in!</a>"
Und aus meiner Sicht:
<p> <%= t('log_in_message', :url => login_path) %> </p>
Das funktioniert , aber das <a href=...</a>
Teil auf dem zu haben, en.yml
sieht für mich nicht sehr sauber aus.
Die andere Option, die ich kenne, ist die Verwendung lokalisierter Ansichten - login.en.html.erb
und login.es.html.erb
.
Dies fühlt sich auch nicht richtig an, da die einzige andere Linie die oben erwähnte wäre; Der Rest der Ansicht (~ 30 Zeilen) wird für alle Ansichten wiederholt. Es wäre nicht sehr trocken.
Ich denke, ich könnte "lokalisierte Teiltöne" verwenden, aber das scheint zu schwerfällig zu sein. Ich glaube, ich bevorzuge die erste Option gegenüber so vielen kleinen Ansichtsdateien.
Meine Frage ist also: Gibt es einen "richtigen" Weg, dies umzusetzen?
Antworten:
en.yml
login.html.erb
quelle
%{href}
in der YAML-Übersetzungszeichenfolge geändert . Da die Ausgabe automatisch maskiert wird, müssen Sie Ihren Übersetzungsschlüssel entweder angebenraw
oder.html_safe
explizit angeben oder mit einem Suffix versehen_html
, da inlogin_message_html
und die Escape-Zeichenfolge automatisch übersprungen wird.t('string')
ist identisch mitt("string")
. Sie sind das gleiche.t('some.key', link: link_to()).html_safe
Das Trennen von Text und Link in der Datei locale.yml funktioniert eine Weile, aber bei längerem Text sind diese schwer zu übersetzen und zu pflegen, da sich der Link in einem separaten Übersetzungselement befindet (wie in der Antwort von Simones). Wenn Sie anfangen, viele Zeichenfolgen / Übersetzungen mit Links zu haben, können Sie diese etwas mehr trocknen.
Ich habe einen Helfer in meiner application_helper.rb erstellt:
In meinem en.yml:
Und meiner Meinung nach:
Auf diese Weise ist es einfacher, Nachrichten zu übersetzen, da auch der Linktext in den locale.yml-Dateien klar definiert ist.
quelle
This is a %{link:link to Google}
. Es ermöglicht Ihnen, mehrere Links in einer einzigen Zeichenfolge zu haben, kümmert sich um XSS und ermöglicht verschachtelte Übersetzungen.flash
Nachricht in Rails 3+ verwenden möchten, machen Sie es soview_context.it(key, ...)
Ich nahm Hollis-Lösung und machte daraus einen Edelstein
it
. Schauen wir uns ein Beispiel an:Und dann
Weitere Informationen finden Sie unter https://github.com/iGEL/it .
quelle
In en.yml
In de.yml
in new.html.erb [angenommen]
quelle
Vielen Dank, Holli, dass Sie diesen Ansatz geteilt haben. Es funktioniert wie ein Zauber für mich. Ich würde dich abstimmen, wenn ich könnte, aber dies ist mein erster Beitrag, daher fehlt mir der richtige Ruf ... Als zusätzliches Teil des Puzzles: Das Problem, das ich bei deinem Ansatz erkannt habe, ist, dass es von innen immer noch nicht funktioniert Der Controller. Ich habe einige Nachforschungen angestellt und Ihren Ansatz mit dem von Glenn am Rubypond kombiniert .
Folgendes habe ich mir ausgedacht:
Helfer anzeigen, z. B. application_helper.rb
In der Steuerung:
In der locale.yml:
In der Ansicht:
Hoffe, dieser Beitrag bringt mir den Ruf ein, dich abzustimmen, holli :) Jedes Feedback ist willkommen.
quelle
Wir hatten folgendes:
oder expliziter:
dann in ApplicationController.rb nur
Gegeben ein Schlüssel in der
en.yml
Datei wiekann in ERB als verwendet werden
sollte erzeugen
quelle
Ich wollte ein bisschen mehr Flexibilität als nur das Hinzufügen von Links zu Flash-Nachrichten aus YAML-Dateien (zum Beispiel dem angemeldeten Benutzernamen usw.), also wollte ich stattdessen die ERB-Notation in der Zeichenfolge verwenden.
Während ich dies verwende
bootstrap_flash
, habe ich den Hilfecode wie folgt geändert, um die ERB-Zeichenfolgen vor der Anzeige zu dekodieren:Es ist dann möglich, Zeichenfolgen wie die folgenden zu verwenden (mit devise):
Dies funktioniert möglicherweise nicht in allen Situationen und es gibt möglicherweise ein Argument dafür, dass Code- und Zeichenfolgendefinitionen nicht gemischt werden sollten (insbesondere aus DRY-Sicht), aber dies scheint für mich gut zu funktionieren. Der Code sollte für viele andere Situationen anpassbar sein, wobei die folgenden wichtigen Bits sind:
quelle
Ich denke, ein einfacher Weg, dies zu tun, besteht darin, einfach Folgendes zu tun:
quelle
Warum nicht den ersten Weg benutzen, sondern ihn wie aufteilen?
Und dann
quelle