{%trans“string”%}不在模板上工作,但{%trans变量%}没有

时间:2012-08-24 00:29:03

标签: django internationalization django-templates

我是Django的新手,我正在开发一个i18n项目,事实是我在我的模板文件中使用 .manage.py makemessages / compilemessages 翻译了一些变量,但是当我使用 {% trans "my string" %} 时我对所有语言都有相同的"my string"

我做错了什么?这是 views.py idioma.html

的代码

<小时/> 的 views.py:

#some code here

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

<小时/> 的 idioma.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" %}

<小时/> 该应用程序将idioma变量从locale / path /中的.po和.mo文件转换为/ language /

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

发生了什么事?

感谢您的帮助!!!!

5 个答案:

答案 0 :(得分:13)

您是否手动翻译了.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的翻译都不会在您的网页中翻译。

答案 1 :(得分:11)

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

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

阅读django's official documentation on LOCALE_PATHS了解详情。

答案 2 :(得分:1)

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

因此我建议您使用blocktrans而不是trans for strings

如何使用blocktrans

{% blocktrans %}  your strnig {% endblocktrans %}

答案 3 :(得分:1)

我整夜跟踪代码,发现了一些线索。主要在trans_real.py和gettext.py中。你可以在&#34;翻译&#34;中加入一个断点。功能

  1. 翻译代码仅在应用启动时执行一次。那么你 需要重新加载uwsgi以加载新版本。
  2. 从不使用Po文件。 gettext.py使用&#34; mo&#34;仅限文件。(在我的笔记本电脑中)。 因此,您必须在更改后编译消息。
  3. &#34; - &#34;在语言代码中将转换为&#34; _&#34;在当地 路径。例如&#34; zh-CN&#34;将被转换为&#34; zh_CN&#34;。这就是原因 无法找到翻译文件。我认为如果会更好 只使用两个字符作为语言代码。而且这个案子 在Linux系统中应该考虑敏感。

答案 4 :(得分:0)

我有同样的问题。我在this link under another similar question中详细解释了它。

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

sudo /etc/init.d/uwsgi reload

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