web-dev-qa-db-fra.com

django Traduire le contenu variable dans le modèle

J'utilise {% Trans%} Tag. Django DOCS Dites:

La balise de modèle {% TRANS%} traduit soit une chaîne constante (ci-jointe dans des guillemets simples ou doubles) ou une teneur variable:

{% Trans "C'est le titre." %} {% trans myvar%}

https://docs.djangoproject.com/fr/1.3/topics/i18n/internationalization/#trans-template-tag

J'ai trouvé impossible de faire {% Trans myvar%} parce que Myvar ne s'affiche tout simplement pas dans le fichier Django.po après avoir exécuté la commande Makemessages.

Est-ce que je l'utilise mal? Est-ce que certains pourraient m'aider avec ça?

34
thoslin

Vous pouvez utiliser l'étiquette de modèle blocktrans dans ce cas:

{% blocktrans %} This is the title: {{ myvar }} {% endblocktrans %}
28
Jeff Wilcox

{% trans myvar %} fonctionne juste. Vérifiez donc votre fichier PO pour vous assurer que la valeur de myvar est en msgstr.

<title>{% trans myvar %}</title>

Par exemple, si myvar contient "Some Publisher" Vous pouvez écrire ce qui suit dans le fichier PO:

msgid "Some Publisher"
msgstr "কিছু প্রকাশক"

Assurez-vous également que vous avez couru:

python manage.py compilemessages
19
David Dehghan

Django ne peut pas deviner ce qui est dans cette variable, vous devez donc la traduire vous-même en ajoutant les deux anglais (msgid) et les chaînes localisées (msgstr).

8
Gabi Purcaru

Mon expérience ici est que la traduction variable ne fonctionne pas dans les modèles par son propre . Cependant, je suis arrivé à une solution appropriée lorsque le contenu des variables est connu (je veux dire qu'ils ne sont pas de texte libre, mais un ensemble de choix que vous avez définis dans la base de données).

Vous devez forcer la traduction dans la vue ou dans une étiquette de filtre.

Pour résumer:

  1. Utilisez blocktrans dans vos modèles
  2. Forcer les variables à traduire
    • Vous définissez soit des variables dans un contexte déjà marqué pour le TranStalion
    • ou utilisez un filtre pour les traduire
  3. Générer des traductions dans .po déposer

L'histoire est comme ceci:

vues.py

def my_view(request):
    return render(request, 'i18n_test.html', {'salutation':"Hola"})

Templates/I18N_TEST.HTML

...
{% blocktrans %}{{ salutation }}{% endblocktrans %}
...

Et quand je rends le modèle, il montre toujours Hola Quelle que soit la langue actuelle.

Pour forcer la traduction, dans la vue, nous devons utiliser ugetText.

def my_view(request):
    return render(request, 'i18n_test.html', {'salutation':ugettext("Hola")})

Cependant, il n'est pas toujours possible d'accéder à la vue. Donc, je préfère utiliser un filtre comme celui-ci.

templateTags/i18n_extras.py

@register.filter(name='translate')
def translate(text):
  try:    
    return ugettext(text)

Et le modèle devient

...
{% blocktrans s=salutation|translate %}{{ s }}{% endblocktrans %}
...

Et produit Hola, Bonjour, Ciao, Salut Selon la langue actuelle.

L'inconvénient (comme indiqué dans le - Docs ) est que makemessages _ n'inclut pas automatiquement ces traductions. Nous devons donc les inclure manuellement. Dans django.po fichier:

locals/fr/django.po

...
msgid "Hola"
msgstr "Hello"
...
5
kiril

Vous pouvez traduire la variable dans le python code comme ici pour settings.SITE_NAME:

from Django.conf import settings
from Django.utils.translation import ugettext_lazy as _

def processor004(request):
 my_dict = {
    'site_id004': settings.SITE_ID,
    'site_name004': _(settings.SITE_NAME),
    'installed_apps004': settings.INSTALLED_APPS,
    'embedded_widget004': settings.EMBEDDED_WIDGET,
    'base_template004': settings.BASE_TEMPLATE,
}

return my_dict
1
K.Karamazen

C'est une solution élégante complexe qui peut aider si vous traduisez des valeurs des champs modèles: http://django-modeltranslation.readthedocs.org

"ModelTranslation

L'application Modeltranslation est utilisée pour traduire le contenu dynamique des modèles existants Django vers un nombre arbitraire de langues sans avoir à modifier les classes de modèle d'origine. "

0
Kshatra

faire des tags

from Django.utils.translation import ugettext as _

@register.simple_tag
def trans2(tr, *args, **kwargs):
    # print(':', kwargs)
    trans = _(tr)
    trans_str = trans.format(**kwargs)
    return trans_str

dans le modèle:

{% trans2 columns_once.res_data.message with value=columns_once.res_data.recommend%}

à django.po

#: default_content.py:136
msgid "_audit_recommend_speed"
msgstr "Рекомендованная скорость до {value} сек"
0
Koshak01

Pour moi, cela s'est passé quand j'avais le TEMPLATES.DIRS En dehors de mon Django répertoire de projet. La récupération des modèles dans le répertoire de projet a résolu le problème.

0
Philipp Zedler