I’m searching for a way to have html in my translations. I’m using Gettext in Phoenix, and I’m translating id
s , like the following example:
<%= gettext("score.current", score: @score) %>
Where score.current
is translated in different languages, like in English: Your score is %{score} points
.
Now I want the translated text to look like You score is <b>%{score}</b> points
. What is a nice way of doing it. My own thoughts:
Explode translation into fragments: <%= gettext("score.current") %><b><%= @score %></b><%= gettext("points") %>
Inject score as html into translation: <%= gettext("score.current", score: make_bold(@score)) %>
Please don’t tell me that I can remove points
from end of sentence, this is just an example.
Thanks in advance!
PS. This thread is seeking the same thing as me, but he is using the sentence itself as message id. I don’t event know what is best practice. Should I switch to full sentence as translation id?
NobbZ
February 28, 2020, 4:39pm
2
Have you tried using Phoenix.HTML.raw/1
?
1 Like
egze
February 28, 2020, 5:00pm
3
I suggest you try to keep html out of translations.
How about something like this:
<%= gettext("score.current", score_html: "<b>#{score}</b>") %>
The GetText key would be: You score is %{score_html} points.
Maybe you’ll need to combine it with HTML.raw
.
1 Like
What do you mean by that? Use it where?
I didn’t ask how to escape HTML in EEx. I wanted to know what is the best practice.
Thanks. That’s what I thought is a good way too. Clean.
However I will wait for other replies too, before choosing a solution.
hauleth
February 28, 2020, 7:35pm
6
BTW Gettext approach is that the text to be matched is the in English that should be shown, so in this case it should be:
<%= raw gettext("Your score is <b>%{score}</b> points", score: @score) %>
1 Like
egze
February 28, 2020, 9:36pm
7
That’s true, this is much better than score.current
. I’d still keep the html out though.
So best practice is to use full sentence in English. Good to know, since Gettext docs don’t mention this (in a way it shouldn’t).
I am still confused as to whether put html in text, or inject it to text, like
Score: %{score}
where score
is like <b>10</b>
or
Score: <b>%{score}</b>
where score
is 10