13

I have an i18n problem in django:

This works fine :

{% trans cat.name %}  

cat.name will be translated

But this doesn't work:

{% blocktrans with cat.name|slugify as cat_slug %}{{ cat_slug }}{% endblocktrans %}  

cat.name is not translated

If I change the filter :

{% blocktrans with cat.name|capfirst as cat_slug %}{{ cat_slug }}{% endblocktrans %}  

I can see that the filter is working, but there is no translation...

Harley Holcombe
  • 175,848
  • 15
  • 70
  • 63
Julien
  • 703
  • 1
  • 10
  • 17

5 Answers5

27

I'm only just getting started with Django internationalization, but I think you're misunderstanding how the {% blocktrans %} tag handles placeholders.

The point of blocktrans is to allow the text around the placeholders to be translated. It won't translate anything inside {{...}}.

If you look at the generated .po file, you'll see that the following template code:

{% blocktrans %}This is my variable: {{variable}}{% endblocktrans %}

Will get converted into something like the following:

msgid:"This is my variable: %s"

I don't think you can translate a variable within a blocktrans tag. You can probably do constant strings with {% blocktrans with _("string") as x %}{{x}}{% endblocktrans %} but I can't think why you'd want to.

You'll have to do what you want in your view or model code I think.

Tom
  • 42,844
  • 35
  • 95
  • 101
9

This works:

{% filter slugify %}{% trans cat.name %}{% endfilter %}
Jonas G. Drange
  • 8,749
  • 2
  • 27
  • 38
Julien
  • 703
  • 1
  • 10
  • 17
5

As Tom pointed out blocktrans will preserve what you put inside the with statement instead of translating it. What you need to do is use the with before the translation. In your example, it would look like this:

{% with cat_slug=cat.name|slugify %}
    {% trans cat_slug %}
{% endwith %}

P.S. I know I'm answering a 6yr old question, but I've run across this exact situation a couple times now and haven't seen a SO question/answer that handles it.

Matt Wilson
  • 51
  • 1
  • 2
2
{% blocktrans with cat.name as cat_slug %}{{ cat_slug|capfirst }}{% endblocktrans %}

?

EDIT: you were right the doc says the filter as to be placed in the blocktrans

CoolBeans
  • 20,654
  • 10
  • 86
  • 101
akh
  • 21
  • 1
  • it seems that the var is not translated {% blocktrans with cat.name as cat_slug %}{{ cat_slug }}{% endblocktrans %} this also is not translated ... – Julien Nov 28 '09 at 21:57
1
{% blocktrans with cat_slug=cat.name|capfirst %}{{ cat_slug }}{% endblocktrans %}  
Flimm
  • 136,138
  • 45
  • 251
  • 267