Eu gostaria de i18n um texto parecido com este:
Já se inscreveu? Conecte-se!
Observe que há um link no texto. Neste exemplo, ele aponta para o google - na realidade, ele aponta para o meu aplicativo log_in_path
.
Encontrei duas maneiras de fazer isso, mas nenhuma delas parece "certa".
A primeira maneira que conheço envolve ter este meu en.yml
:
log_in_message: "Already signed up? <a href='{{url}}'>Log in!</a>"
E na minha opinião:
<p> <%= t('log_in_message', :url => login_path) %> </p>
Isso funciona , mas ter o <a href=...</a>
papel en.yml
não me parece muito claro.
A outra opção que conheço é usar visualizações localizadas - login.en.html.erb
, e login.es.html.erb
.
Isso também não parece certo, pois a única linha diferente seria a mencionada anteriormente; o resto da visualização (aproximadamente 30 linhas) seria repetido para todas as visualizações. Não seria muito SECO.
Eu acho que poderia usar "parciais localizadas", mas isso parece muito complicado; Acho que prefiro a primeira opção a ter tantos arquivos de visualização minúsculos.
Portanto, minha pergunta é: existe uma maneira "adequada" de implementar isso?
Respostas:
en.yml
login.html.erb
fonte
%{href}
na string de tradução YAML. Além disso, como a saída é escapada automaticamente, você precisa especificarraw
ou.html_safe
explicitamente, ou sufocar sua chave de tradução com_html
, como emlogin_message_html
e o escape será ignorado automaticamente.t('string')
é idêntico at("string")
. Eles são a mesma coisa.t('some.key', link: link_to()).html_safe
Separar texto e link no arquivo locale.yml funciona por um tempo, mas com textos mais longos, eles são difíceis de traduzir e manter, pois o link está em um item de tradução separado (como na resposta de Simones). Se você começar a ter muitas strings / traduções com links, você pode secar um pouco mais.
Fiz um auxiliar em meu application_helper.rb:
Em meu en.yml:
E na minha opinião:
Desta forma, é mais fácil traduzir as mensagens, pois também o texto do link está claramente definido nos arquivos locale.yml.
fonte
This is a %{link:link to Google}
. Ele permite que você tenha vários links em uma única string, cuida do XSS e permite traduções aninhadas. Dê uma olhada em github.com/iGEL/i18n_linkflash
mensagem no Rails 3+ faça assimview_context.it(key, ...)
Peguei a solução de hollis e fiz uma joia
it
sair dela. Vejamos um exemplo:E depois
Para obter mais detalhes, consulte https://github.com/iGEL/it .
fonte
Em en.yml
In de.yml
em new.html.erb [assumido]
fonte
Muito obrigado, holli, por compartilhar essa abordagem. Funciona como um encanto para mim. Você votaria se pudesse, mas esta é minha primeira postagem, então não tenho a reputação adequada ... Como uma peça adicional para o quebra-cabeça: O problema que percebi com sua abordagem é que ainda não funciona por dentro o controlador. Eu fiz algumas pesquisas e combinei sua abordagem com a de Glenn em Rubypond .
Aqui está o que eu descobri:
Ver auxiliar, por exemplo, application_helper.rb
No controlador:
No locale.yml:
Na vista:
Espero que este post me garanta a reputação de votar em você, holli :) Qualquer comentário é bem-vindo.
fonte
Tínhamos o seguinte:
ou mais explicitamente:
então em ApplicationController.rb apenas
Dada uma chave no
en.yml
arquivo comopode ser usado em ERB como
deve gerar
fonte
Eu queria um pouco mais de flexibilidade do que apenas adicionar links a mensagens flash de arquivos YAML (por exemplo, o nome de usuário conectado, etc.), então, em vez disso, queria usar a notação ERB na string.
Como estou usando
bootstrap_flash
, modifiquei o código auxiliar da seguinte maneira para decodificar as strings ERB antes de exibir:Então, é possível usar strings como o seguinte (usando devise):
Isso pode não funcionar para todas as situações e pode haver um argumento de que as definições de código e string não devem ser misturadas (especialmente de uma perspectiva DRY), mas isso parece funcionar bem para mim. O código deve ser adaptável a muitas outras situações, sendo os bits importantes os seguintes:
fonte
Acho que uma maneira simples de fazer isso é simplesmente fazer:
fonte
Por que não usar a primeira maneira, mas dividindo-a como
E depois
fonte