9

我对 Django 很陌生,我正在使用 i18n 开发一个项目,问题是我已经 .manage.py makemessages / compilemessages 在我的模板文件上翻译了一些变量,但是当我使用时,我对所有语言都 {% trans "my string" %} 得到了相同的结果。"my string"

我究竟做错了什么?这是views.pyidioma.html的代码


视图.py:

#这里有一些代码...

def idioma(request):
    output = _("Mensaje en espanol")
    return render_to_response( 'idioma/idioma.html', { 'idioma' : output }, context_instance = RequestContext(request) )


成语.html

{% load i18n %}

< form action="/i18n/setlang/" method="post">

        {% csrf_token %}

        < input name="next" type="hidden" value="{{ redirect_to }}" />

        < select name="language" >

        {% get_language_info_list for LANGUAGES as languages %}

        {% for language in languages %}

            < option value="{{ language.code }}">
                {{ language.name_local }} ({{ language.code }})
            < /option>
        {% endfor %}

        </select>

        < input type="submit" value="Go" />

    < /form>

    La cadena es: {% trans idioma  %}

    {% trans "carro" %}


应用程序从 locale/path/to/language/ 中的 .po 和 .mo 文件转换 idioma 变量

但它不会翻译 {% trans "carro" %} 字符串。

这是怎么回事?

谢谢你的帮助!!!!

4

5 回答 5

19

您是否手动翻译了 .po 中的字符串?

makemessages只需将“carro”添加到 .po 中,在 .po 文件中生成类似的内容

#: idioma.html:45
msgid "carro"
msgstr ""

然后你必须编辑 .po手动添加该字符串的翻译,以这种方式:

#: idioma.html:45
msgid "carro"
msgstr "car"

然后,当您完成所有 .po 字符串的翻译后,您可以运行compilemessages:它会编译您的翻译。

注意:永远记得寻找,fuzzy翻译。如果您的 .po 中有类似的内容

#: idioma.html:45
#, fuzzy
msgid "carro"
msgstr "car"

这意味着 django 出于某种原因试图自行翻译字符串(这通常发生在您已经在一段不再使用的代码中使用该字符串时)

您必须检查翻译并删除该#, fuzzy行:任何标记为的#, fuzzy翻译都不会在您的页面中翻译。

于 2012-08-31T22:51:52.803 回答
13

我遇到了类似的问题,并且能够通过LOCALE_PATHS在我的设置文件中进行设置来解决它。LOCALE_PATHS是 django 查找 .mo 和 .po 文件的目录路径元组。这是一个例子:

# settings.py
LOCALE_PATHS = (
    '/path/to/your/project/locale',
)

阅读django 的官方文档以LOCALE_PATHS获取更多信息。

于 2013-06-05T18:39:00.933 回答
2

我整晚跟踪代码,发现了一些线索。主要在 trans_real.py 和 gettext.py 中。您可以在“翻译”函数中放置一个断点。

  1. 翻译代码仅在应用启动时执行一次。所以你需要重新加载uwsgi来加载新版本。
  2. po文件从不使用。gettext.py 仅使用“mo”文件。(在我的笔记本电脑中)。所以你必须在更改后编译消息。
  3. 语言代码中的“-”将转换为语言环境路径中的“_”。例如“zh-CN”将转换为“zh_CN”。这就是找不到翻译文件的原因。我认为如果只使用两个字符作为语言代码会更好。在Linux系统中要考虑区分大小写。
于 2016-10-11T12:47:12.897 回答
1

在某些情况下{% trans "your string " %}不起作用。

我建议您使用blocktrans字符串而不是 trans。

如何使用块传输:

{% blocktrans %} your string {% endblocktrans %}
于 2012-08-24T06:12:01.077 回答
0

我有同样的问题。我在另一个类似问题下的这个链接中详细解释了它。

简而言之,我的问题已通过使用以下代码重新加载服务器来解决:

sudo /etc/init.d/uwsgi reload

现在,每次我更改短语并编译语言文件后,我也会重新加载服务器以查看更改。我希望这能解决一些人的问题。

于 2016-07-23T21:30:12.857 回答