django翻译模板中的变量内容

tho*_*lin 31 django translation internationalization

我正在使用{%trans%}模板标记.Django文档说:

{%trans%}模板标记转换为常量字符串(用单引号或双引号括起来)或变量内容:

{%trans"这是标题." %} {%trans myvar%}

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

我发现不可能{%trans myvar%},因为myvar在运行makemessages命令后根本不会出现在django.po文件中.

我用错了吗?有人可以帮我这个吗?

小智 28

blocktrans在这种情况下,您可以使用模板标记:

{% blocktrans %} This is the title: {{ myvar }} {% endblocktrans %}
Run Code Online (Sandbox Code Playgroud)

  • 我可能错了。但你可能必须这样写,对吗?: {% bolcktrans myvar=myvar %} (2认同)

Dav*_*han 21

{% trans myvar %}只是工作.因此,请检查您的PO文件,以确保其值为myvarPO ms.

<title>{% trans myvar %}</title>
Run Code Online (Sandbox Code Playgroud)

例如,如果myvar包含,"Some Publisher"您可以在PO文件中编写以下内容:

msgid "Some Publisher"
msgstr "???? ???????"
Run Code Online (Sandbox Code Playgroud)

还要确保你已经跑了:

python manage.py compilemessages
Run Code Online (Sandbox Code Playgroud)


Gab*_*aru 8

Django无法猜测该变量中的内容,因此您必须通过添加english(msgid)和localized(msgstr)字符串来自行翻译.

  • 或者使用{%trans"content"%}创建另一个包含变量的所有可能值的虚拟模板文件.这样,makemessages会自动将它们添加到您的django.po文件中.不是最优雅的解决方案,但它有效. (2认同)
  • 在这种情况下不应该使用 `noop` 吗?从文档中,`noop` 在 po 文件中创建了一个翻译字符串,该字符串不会直接在站点的任何地方使用。这样,您无需避免运行`makemessages`。 (2认同)

kir*_*ril 5

我在这里的经验是,变量转换不能单独在模板中工作。但是,当知道变量的内容时(我的意思是它们不是自由文本,而是您在数据库中设置的一组选择),我找到了一个合适的解决方案。

您需要在视图或过滤器标签中强制翻译

总结一下:

  1. blocktrans在模板中使用
  2. 强制转换变量
    • 您可以在已经标记为可以转置的上下文中设置变量
    • 或使用过滤器翻译它们
  3. .po文件中生成翻译

故事是这样的:

views.py

def my_view(request):
    return render(request, 'i18n_test.html', {'salutation':"Hola"})
Run Code Online (Sandbox Code Playgroud)

templates / i18n_test.html

...
{% blocktrans %}{{ salutation }}{% endblocktrans %}
...
Run Code Online (Sandbox Code Playgroud)

当我渲染模板时,无论当前语言是什么,它总是显示Hola

为了强制翻译,我们需要使用ugettext。

def my_view(request):
    return render(request, 'i18n_test.html', {'salutation':ugettext("Hola")})
Run Code Online (Sandbox Code Playgroud)

但是,并非总是可以访问该视图。所以我更喜欢使用这样的过滤器。

templatetags / i18n_extras.py

@register.filter(name='translate')
def translate(text):
  try:    
    return ugettext(text)
Run Code Online (Sandbox Code Playgroud)

模板变成

...
{% blocktrans s=salutation|translate %}{{ s }}{% endblocktrans %}
...
Run Code Online (Sandbox Code Playgroud)

并根据当前语言生成Hola,Hello,Ciao,Salut

缺点(如docs中所指出)是makemessages不会自动包含这些翻译,因此我们需要手动包含它们。在django.po文件中:

语言环境/en/django.po

...
msgid "Hola"
msgstr "Hello"
...
Run Code Online (Sandbox Code Playgroud)