我正在使用{%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文件中。
我使用它错了吗?有人可以帮我这个吗?
答案 0 :(得分:28)
在这种情况下,您可以使用blocktrans
模板标记:
{% blocktrans %} This is the title: {{ myvar }} {% endblocktrans %}
答案 1 :(得分:18)
{% trans myvar %}
只是有效。因此,请检查您的PO文件,以确保myvar
的值在PO msgid中。
<title>{% trans myvar %}</title>
例如,如果myvar
包含"Some Publisher"
,您可以在PO文件中写下以下内容:
msgid "Some Publisher"
msgstr "কিছু প্রকাশক"
还要确保你已经跑了:
python manage.py compilemessages
答案 2 :(得分:7)
Django无法猜出该变量中的内容,因此您必须通过添加英语(msgid
)和本地化(msgstr
)字符串来自行翻译。
答案 3 :(得分:5)
我的经验是,变量翻译在模板中不起作用。但是,当变量的内容已知时,我找到了一个合适的解决方案(我的意思是它们不是自由文本,而是您在数据库中设置的一组选项)。
您需要在视图或过滤器标记中强制翻译。
总结一下:
blocktrans
.po
档案故事是这样的:
<强> views.py 强>
def my_view(request):
return render(request, 'i18n_test.html', {'salutation':"Hola"})
<强>模板/ i18n_test.html 强>
...
{% blocktrans %}{{ salutation }}{% endblocktrans %}
...
当我渲染模板时,它总是显示 Hola ,无论当前语言是什么。
要强制翻译,在视图中我们需要使用ugettext。
def my_view(request):
return render(request, 'i18n_test.html', {'salutation':ugettext("Hola")})
但是,并不总是可以访问视图。所以我更喜欢使用这样的过滤器。
<强> templatetags / i18n_extras.py 强>
@register.filter(name='translate')
def translate(text):
try:
return ugettext(text)
模板变为
...
{% blocktrans s=salutation|translate %}{{ s }}{% endblocktrans %}
...
根据当前语言制作 Hola,Hello,Ciao,Salut 。
缺点(如docs所述)是makemessages
不会自动包含这些翻译,因此我们需要手动包含这些翻译。在django.po文件中:
<强>区域设置/ EN / django.po 强>
...
msgid "Hola"
msgstr "Hello"
...
答案 4 :(得分:1)
你可以在python代码中翻译变量,如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
答案 5 :(得分:0)
这是一个复杂优雅的解决方案,如果您要从模型字段中翻译值,这可能有所帮助:http://django-modeltranslation.readthedocs.org
&#34; Modeltranslation
modeltranslation应用程序用于将现有Django模型的动态内容转换为任意数量的语言,而无需更改原始模型类。&#34;
答案 6 :(得分:0)
对我来说,这发生在我的Django项目目录之外的TEMPLATES.DIRS
时。将模板提取到项目目录中解决了这个问题。
答案 7 :(得分:0)
制作自己的标签
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
模板中的:
{% 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} сек"