NiklasR
NiklasR

Reputation: 523

Referrering to jinja2 variables inside of a string

I am using the jinja2 templating language to create dual language documents. To that end, I have created a macro called select_lang which takes two strings as an argument, the text in the primary language and in the secondary language, and returns it on the format

<text in primary language> / <i><text in secondary language></i>

Sometimes, as input, I want do use a jinja2 variable, and this is where I struggle. Given the following code:

<!DOCTYPE HTML>
{% set bilingual = primary_lang and secondary_lang %}
{% from 'templates/partials/macro_select_lang.j2.html' import select_lang with context %}
<html>
  <body>
    {{ select_lang('Testo in italiano','Text in English') }}<br>
    {{name.upper()}}<br>
    {{ select_lang('Ciao, {{name.upper()}}','Hello, {{name.upper()}}') }}
  </body>
</html>

I get this output:

Testo in italiano / *Text in English*
JANE DOE
Ciao, {{name.upper()}} / Hello, {{name.upper()}}

but the desired outcome would be that {{name.upper()}} was evaluated before being passed on to the select_lang macro.

I have searched the jinja2 documentation, but I can't find any relevant topic.

Note: one might think that this is a silly macro which could be replaced with some simple html-code. This is true in this example, but in the real application it does a whole lot more, so replacing the macro does not solve the problem; I need to evaluate the expression before passing it on.

In a regular programming language, I would have written something like

{{ select_lang('Ciao, ' + {{name.upper()}},'Hello, ' + {{name.upper()}}) }}

but this does not work and I suppose jinja2 does not offer an operator for string concatenation.

Upvotes: 1

Views: 5935

Answers (1)

Daniel da Rocha
Daniel da Rocha

Reputation: 947

It seems you have too many curly braces! Try:

{{ select_lang('Ciao, ' + name.upper(),'Hello, ' + name.upper()) }}

As you are already inside a {{...}} statement...

Upvotes: 2

Related Questions