Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to translate with pluralization in Twig?

How can I translate the current hardcoded text with the key from the language file (messages.en.xliff)?

I tried to use the

{% trans %} translation_key{% endtrans %}

with no success. Symfony returns this error

A message must be a simple text in 'ProjectEventsBundle:Default:show_event.html.twig'

500 Internal Server Error - Twig_Error_Syntax

{% transchoice count %}
{0} The current hardcoded text|{1} is attending|{2} are attending|]2,Inf] and %count% - 2 others are attending
{% endtranschoice %}

Thanks in advance.

like image 821
gperriard Avatar asked Sep 12 '11 07:09

gperriard


3 Answers

This subject is quite old, but I would suggest you to do something like that :

In your messages.LOCALE.yml

you.translaction.key: "{1}1 Comment|]1,Inf]%count% Comments"

In your twig template

{% set count = 2 %}

{% transchoice count with {'%count%': count} %}you.translaction.key{% endtranschoice %}

Cheers,

Simon

like image 117
Simon Avatar answered Nov 13 '22 15:11

Simon


I would use a solution like this:

messages.en.xliff:

<trans-unit id="1">
    <source>some.translation.key</source>
    <target>{0} no.attendee|{1} one attendee|{2} two attendees|{3} three attendees|]3,Inf] many attendees</target>
</trans-unit>

Twig template:

{{ 'some.translation.key'|transchoice(count) }}

If you need to put some arguments, you should pass them as second argument.

Here's the prototype of the filter:

public function transchoice($message, $count, array $arguments = array(), $domain = "messages", $locale = null)
like image 24
Nikola Petkanski Avatar answered Nov 13 '22 15:11

Nikola Petkanski


Found this from Symfony Documentation:

Symfony2 provides specialized Twig tags (trans and transchoice) to help with message translation of static blocks of text:

{% trans %}Hello %name%{% endtrans %}

{% transchoice count %}

{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples

{% endtranschoice %}

The transchoice tag automatically gets the %count% variable from the current context and passes it to the translator. This mechanism only works when you use a placeholder following the %var% pattern.

like image 11
ggirtsou Avatar answered Nov 13 '22 17:11

ggirtsou