J'aimerais ajouter un texte qui ressemble à ceci:
Déjà inscrit? S'identifier!
Notez qu'il y a un lien sur le texte. Sur cet exemple, il pointe vers google - en réalité, il pointera vers mon application log_in_path
.
J'ai trouvé deux façons de faire cela, mais aucune n'a l'air "correcte".
La première façon que je connais consiste à avoir ceci mon en.yml
:
log_in_message: "Already signed up? <a href='{{url}}'>Log in!</a>"
Et à mon avis:
<p> <%= t('log_in_message', :url => login_path) %> </p>
Cela fonctionne , mais avoir la <a href=...</a>
pièce sur le en.yml
ne me semble pas très propre.
L'autre option que je connais utilise des vues localisées - login.en.html.erb
, et login.es.html.erb
.
Cela ne semble pas non plus juste puisque la seule ligne différente serait celle mentionnée ci-dessus; le reste de la vue (~ 30 lignes) serait répété pour toutes les vues. Ce ne serait pas très SEC.
Je suppose que je pourrais utiliser des "partiels localisés" mais cela semble trop compliqué; Je pense que je préfère la première option à avoir autant de petits fichiers de vue.
Ma question est donc la suivante: y a-t-il une manière «appropriée» de mettre en œuvre cela?
Réponses:
en.yml
login.html.erb
la source
%{href}
dans la chaîne de traduction YAML. De plus, comme la sortie est automatiquement échappée, vous devez soit spécifier,raw
soit.html_safe
explicitement, soit ajouter un suffixe à votre clé de traduction_html
, car danslogin_message_html
et l'échappement sera ignoré automatiquement.t('string')
est identique àt("string")
. C'est la même chose.t('some.key', link: link_to()).html_safe
La séparation du texte et du lien dans le fichier locale.yml fonctionne pendant un certain temps, mais avec du texte plus long, ils sont difficiles à traduire et à maintenir car le lien se trouve dans un élément de traduction séparé (comme dans la réponse de Simones). Si vous commencez à avoir de nombreuses chaînes / traductions avec des liens, vous pouvez les sécher un peu plus.
J'ai créé une aide dans mon application_helper.rb:
Dans mon en.yml:
Et à mon avis:
De cette façon, il est plus facile de traduire les messages car le texte du lien est également clairement défini dans les fichiers locale.yml.
la source
This is a %{link:link to Google}
. Il vous permet d'avoir plusieurs liens dans une seule chaîne, prend en charge XSS et autorise les traductions imbriquées. Jetez un œil à github.com/iGEL/i18n_linkflash
message dans Rails 3+, faites-le comme ceciview_context.it(key, ...)
J'ai pris une solution de hollis et en ai fait une gemme appelée
it
. Regardons un exemple:Puis
Pour plus de détails, voir https://github.com/iGEL/it .
la source
Dans en.yml
En de.yml
dans new.html.erb [supposé]
la source
Merci beaucoup, holli, d'avoir partagé cette approche. Cela fonctionne comme un charme pour moi. Je vous voterais si je le pouvais, mais c'est mon premier message, donc je n'ai pas la bonne réputation ... En tant que pièce supplémentaire au puzzle: le problème que j'ai réalisé avec votre approche est que cela ne fonctionnera toujours pas de l'intérieur le controlle. J'ai fait quelques recherches et combiné votre approche avec celle de Glenn sur le rubypond .
Voici ce que j'ai trouvé:
View helper, par exemple application_helper.rb
Dans le contrôleur:
Dans le fichier locale.yml:
Dans la vue:
J'espère que ce message me vaut la réputation de vous voter, holli :) Tout commentaire est le bienvenu.
la source
Nous avons eu ce qui suit:
ou plus explicitement:
puis dans ApplicationController.rb juste
Étant donné une clé dans le
en.yml
fichier commepeut être utilisé dans ERB comme
devrait générer
la source
Je voulais un peu plus de flexibilité que simplement ajouter des liens vers des messages flash à partir de fichiers YAML (par exemple le nom d'utilisateur connecté, etc.) donc à la place, je voulais utiliser la notation ERB dans la chaîne.
Au fur et à
bootstrap_flash
mesure que j'utilise, j'ai modifié le code d'aide comme suit pour décoder les chaînes ERB avant de les afficher:Il est alors possible d'utiliser des chaînes comme les suivantes (en utilisant devise):
Cela peut ne pas fonctionner pour toutes les situations et il peut y avoir un argument selon lequel les définitions de code et de chaîne ne doivent pas être mélangées (en particulier du point de vue DRY), mais cela semble bien fonctionner pour moi. Le code doit être adaptable à de nombreuses autres situations, les bits importants étant les suivants:
la source
Je pense qu'un moyen simple de le faire est simplement de faire:
la source
Pourquoi ne pas utiliser la première façon, mais la diviser comme
Puis
la source