Gettext with html replacement

I’m searching for a way to have html in my translations. I’m using Gettext in Phoenix, and I’m translating ids , 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?

Have you tried using Phoenix.HTML.raw/1?

1 Like

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.

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

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>
  • Score: <b>%{score}</b> where score is 10

score is like <b>10</b>

  1. You are more flexible to change markup as you wish.
  2. Translators are not going to be confused by HTML.
1 Like