【问题标题】:Internationalization with {% trans %} block使用 {% trans %} 块进行国际化
【发布时间】:2012-04-23 13:33:46
【问题描述】:

我正在尝试做一个简单的例子来理解 Django 国际化。

根据我在 djangoproject 文档中阅读的内容,最简单的方法是使用 {% trans %} 块包装您要从模板翻译的内容。

根据我的理解和预期,在我的情况下,自动为字符串执行翻译:

{% for x in found_bills %}
    <tr>
        <td>{% trans x.name %}
    </td>
    </tr>
{% endfor %}

对于 x.name 中的字符串(它是一天的名称,英文,即“sunday”)将被翻译并返回到以翻译形式显示的模板。

我是否误解了它的工作方式?

更新:

错误:在 _argparse.py 上运行 xgettext 时发生错误 ./build/ipython/IPython/external/argparse/_argparse.py:1113:警告:带有未命名参数的“msgid”格式字符串无法正确本地化: 翻译器无法重新排序参数。 请考虑使用带有命名参数的格式字符串, 以及参数的映射而不是元组。

第二次更新:

模板中的HTML代码是上面的代码,下面的代码是视图中的代码。

bills.py:

def bills(request):
    bills = ps_bill.objects.all()
    return render_to_response('bills.html',"bills":bills,},context_instance=RequestContext(request))

【问题讨论】:

标签: python django internationalization web


【解决方案1】:

国际化和本地化很复杂,reading the documentation 无可替代。但这里是必要步骤的一个非常粗略的概述:

  1. 您需要标记所有需要翻译的字符串。在模板中,{% trans "text" %} 用于简单情况,{% blocktrans %} text {% endblocktrans %} 用于复杂情况。在源代码中,您使用the ugettext function(或其变体之一)包装字符串。在 Django 1.4 中,还可以localize URL patterns

  2. 运行 the makemessages administration command 为您要翻译的每种语言创建一个消息文件。

  3. 将消息翻译成您的目标语言。您可以在您的文本编辑器中执行此操作,但您可能希望在此步骤中使用计算机辅助翻译工具来提供帮助:see Wikipedia 获取使用 GNU 消息文件的部分工具列表(.po 扩展名)。如果您有翻译人员,请与他们交谈并了解他们喜欢使用什么软件。

  4. 运行the compilemessages administration command编译消息文件。

  5. 打开 Django 的language preference detection middleware。如果您的网站有注册用户,请为他们提供语言偏好设置。对于未登录的用户,提供一种切换语言的方法(通过 URL 或通过语言偏好 cookie。)

哦,阅读文档。

【讨论】:

  • 如果应该由makemessages 命令创建的.po 文件不存在,我该怎么办?是否有 .po 文件的模板?
  • 您应该弄清楚为什么.po 文件丢失了。也许makemessages 找不到任何消息?当你传递 -v 2 参数时它会说什么?
  • 我读到makemessages 命令隐式搜索.html 文件中的翻译块。我的模板在我的根文件夹中的 templates 文件夹中。我开始在我设置语言环境的应用程序文件夹中运行该命令,但没有创建 .po 文件。然后我向上移动并在根文件夹中运行makemessages 命令,但随后我收到一些与我的虚拟环境创建的某个build 文件夹相关的错误。所以,这是我现在的问题,我想我必须解决这个问题才能让一切正常工作。
  • 您可能会发现--ignore 选项对makemessages 很有用。
  • django-admin.py makemessages -l en --ignore build/ 仍然抛出错误。
【解决方案2】:

请通读the doctrans 标签只是标记要翻译的字符串,正如文档所说:

一旦应用程序的字符串文字被标记以供以后使用 翻译,翻译本身需要写(或 获得)....第一步是创建一个消息po。申请一个新的 语言...然后您有责任更改 po 文件(通过将特定语言的翻译放入其中)...最后您需要使用工具来运行所有可用的 .po 文件和 创建 .mo 文件...(之后)您的翻译就可以使用了。

【讨论】:

  • 好的,谢谢。一旦我这样做,结果证明有效,我会将您的答案标记为正确的。
【解决方案3】:

有点晚了,但总比没有好。我遇到了同样的错误,实际上我在名为 env/ 的 virtualenv 中安装了 Ipython。由于我想翻译我的项目,而不是 env/ 下的包,我的解决方案是执行以下操作:

django-admin.py makemessages -l LL --ignore=env/* (EDITED)

其中 LL 是您为翻译提供的名称。

希望有人发现它有用,因为这个错误可能令人沮丧,它是 IPython 包源中的格式错误的字符串。

干杯!

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2018-02-05
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多