Julien
Julien

Reputation: 749

django blocktrans and i18n in templates

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...

Upvotes: 15

Views: 28052

Answers (5)

Flimm
Flimm

Reputation: 150773

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

Upvotes: 2

Matt Wilson
Matt Wilson

Reputation: 51

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.

Upvotes: 5

Julien
Julien

Reputation: 749

This works:

{% filter slugify %}{% trans cat.name %}{% endfilter %}

Upvotes: 9

akh
akh

Reputation: 21

{% 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

Upvotes: 2

Tom
Tom

Reputation: 44553

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.

Upvotes: 29

Related Questions