在模板中{% trans "string" %}无法使用,但是{% trans variable %}可以。

10

我对Django还比较新手,正在处理一个涉及i18n的项目。我的问题是,我在模板文件中使用 .manage.py makemessages/compilemessages 翻译了一些变量,但是当我使用 {% trans "my string" %} 时,所有语言都显示相同的字符串 "my string"

我做错了什么?以下是views.pyidioma.html的代码:


views.py:

#这里有些代码...

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" %}


该应用程序会从locale/path/to/language/文件夹中的.po和.mo文件中翻译idioma变量,但它不会翻译{% trans "carro" %}字符串。发生了什么?谢谢你的帮助!!!

5个回答

21

你是否手动翻译了.po文件中的字符串?

makemessages只是在.po文件中添加了"carro",生成类似下面的.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 的翻译都不会在页面中翻译。


14

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

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

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


2

我整晚追踪了代码并找到了一些线索。主要在trans_real.py和gettext.py中。您可以在“translation”函数中设置断点。

  1. 翻译代码仅在应用程序启动时执行一次。因此,您需要重新加载uwsgi以加载新版本。
  2. Po文件从未被使用。gettext.py仅使用“mo”文件。(在我的笔记本电脑上)。因此,在更改后必须编译消息。
  3. 语言代码中的“-”将转换为locale路径中的“_”。例如,“zh-CN”将转换为“zh_CN”。这就是为什么找不到翻译文件的原因。我认为如果只使用两个字符作为语言代码,并且在Linux系统中考虑大小写敏感性,那么会更好。

1
对我来说,它是en_ca与en-ca之间的区别。 - Kevin Parker
这对我也是如此。 - Original BBQ Sauce

1
在某些情况下,{% trans "your string " %} 无法正常工作。
我建议您使用 blocktrans 来代替 trans 处理字符串。
如何使用 blocktrans:
{% blocktrans %} your string {% endblocktrans %}

字符串和String - Alejandro Nanez
当我更改语言时,它会将从使用"./manage.py"生成的.po文件中的变量进行翻译,使用{% trans myVariable %}。因此,我认为语言选择器正常工作。 - Alejandro Nanez
carro是一个变量或简单字符串。 - user1614526
这是一个字符串,我输入任何字符串它都无法翻译。 - Alejandro Nanez
我在我的系统中尝试了一下,老板,它运行良好。我不知道你错过了什么。 - user1614526

0

我遇到了类似的问题。我在另一个类似问题下的此链接中详细解释了它。

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

sudo /etc/init.d/uwsgi reload

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接