【问题标题】:{% trans "string" %} not working on templates but {% trans variable %} does{% trans "string" %} 不适用于模板,但 {% trans variable %} 可以
【发布时间】:2012-08-24 00:29:03
【问题描述】:

我对 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" %} 字符串。

发生了什么事?

感谢您的帮助!!!!

【问题讨论】:

    标签: django internationalization django-templates


    【解决方案1】:

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

    【讨论】:

    • 模糊提示节省了我的时间。
    【解决方案2】:

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

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

    阅读django's official documentation on LOCALE_PATHS了解更多信息。

    【讨论】:

      【解决方案3】:

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

      1. 翻译代码只在应用启动时执行一次。那么你 需要重新加载 uwsgi 才能加载新版本。
      2. 从不使用 Po 文件。 gettext.py 仅使用“mo”文件。(在我的笔记本电脑中)。 所以你必须在更改后编译消息。
      3. 语言代码中的“-”将转换为区域设置中的“_” 小路。例如“zh-CN”将转换为“zh_CN”。这就是为什么 找不到翻译文件。我认为如果它会更好 只需使用两个字符作为语言代码。和案件 在 Linux 系统中应考虑敏感。

      【讨论】:

      • 对我来说是 en_ca vs en-ca
      • 我也是这样
      【解决方案4】:

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

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

      如何使用blocktrans:

      {% blocktrans %} your string {% endblocktrans %}
      

      【讨论】:

      • {% blocktrans %}String{% endblocktrans %} 还有 {% trans "String" %}
      • 当我改变我的语言时,它会翻译 .po 文件中的变量,使用 ./manage.py 和 {% trans myVariable %} 生成,所以我认为语言选择器工作正常。
      • carro 是变量或简单字符串
      • 这是一个字符串,我放了任何字符串,它就是不翻译
      • 我试过我的系统老板,它工作正常我不知道你错过了什么
      【解决方案5】:

      我也有类似的问题。我在this link under another similar question中详细解释过。

      简单地说,我的问题已经通过使用以下代码重新加载服务器解决了:

      sudo /etc/init.d/uwsgi reload
      

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

      【讨论】:

        猜你喜欢
        • 2014-01-18
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-18
        • 2017-07-30
        • 2012-07-25
        相关资源
        最近更新 更多