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 %}
Dav*_*han 21
{% trans myvar %}只是工作.因此,请检查您的PO文件,以确保其值为myvarPO ms.
<title>{% trans myvar %}</title>
例如,如果myvar包含,"Some Publisher"您可以在PO文件中编写以下内容:   
msgid "Some Publisher"
msgstr "???? ???????"
还要确保你已经跑了:
python manage.py compilemessages
Django无法猜测该变量中的内容,因此您必须通过添加english(msgid)和localized(msgstr)字符串来自行翻译.
我在这里的经验是,变量转换不能单独在模板中工作。但是,当知道变量的内容时(我的意思是它们不是自由文本,而是您在数据库中设置的一组选择),我找到了一个合适的解决方案。
您需要在视图或过滤器标签中强制翻译。
总结一下:
blocktrans在模板中使用.po文件中生成翻译故事是这样的:
views.py
def my_view(request):
    return render(request, 'i18n_test.html', {'salutation':"Hola"})
templates / 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"
...
| 归档时间: | 
 | 
| 查看次数: | 20909 次 | 
| 最近记录: |