【问题标题】:Django translations does not workDjango 翻译不起作用
【发布时间】:2015-06-23 15:14:59
【问题描述】:

我正在尝试让 Django 的翻译系统工作,按照教程 here

这是我的两个视图(一个用于直接输出,一个用于模板),一个都不起作用。

def home(request):        
    output = _("hello") # (lazy)
    return HttpResponse(output)

def with_template(request):
    return render(request, 'translation_template.html')

这是第二个视图的模板文件:

{% extends "base_site.html" %}
{% load i18n %}

{% block content %}
<p>{% trans 'hello' %}</p>
{% language 'tr' %}
<p>{% trans 'hello' %}</p>
{% endlanguage %}
{% language 'tr-TR' %}
<p>{% trans 'hello' %}</p>
{% endlanguage %}
{% endblock %}

在我的设置文件中,我添加了以下内容:(如果需要,可以添加之前的部分)

LANGUAGE_CODE = 'en-us'    
# also tried LANGUAGE_CODE = 'tr'  and LANGUAGE_CODE = 'tr-TR'
PROJECT_DIR = os.path.dirname(__file__)

"""
# tried but didn't work
from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.context_processors.auth",
    "django.core.context_processors.i18n",
)
"""
LOCALE_PATHS = ( os.path.join(PROJECT_DIR, 'locale'), )
LANGUAGES = (
    ('tr', _('Turkish')),
    ('en', _('English')),
)

保存这些后,我在终端执行:

python ./manage.py makemessages -l tr

然后将新创建的myproject/locale/tr/LC_MESSAGES/django.po 编辑为:

msgid "hello"
msgstr "merhaba"

然后执行

python ./manage.py compilemessages

并重新启动服务器。终端命令没有显示错误,但是当我加载视图时,没有一个“hello”被翻译。

我在这里做错了什么?

感谢您的帮助!

编辑:

我在 en/../django.po 中发现了一个可疑代码,可能不相关,但也许是。这是文件的开头。模糊(empty->empty)的翻译,会不会是问题?

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""

【问题讨论】:

  • 不到 1 分钟的负分。为什么?
  • 您确定您的浏览器正在请求土耳其语页面吗?尝试在模板中打印当前语言以进行调试:{% get_language_info for LANGUAGE_CODE as current_lang %}{{ current_lang.code }}
  • @halilpazarlama,您是否将django.middleware.locale.LocaleMiddleware 包含在MIDDLEWARE_CLASSES 中?
  • @Anzel 是的。 @Selcuk 上面写着en。我还添加了英文翻译“eng_hello”,但它不适用。
  • @halilpazarlama,尝试将您的浏览器编码/语言环境等更改为土耳其语,看看它是否会相应地选择语言环境

标签: python django localization internationalization language-translation


【解决方案1】:

我解决了我的问题。在我的情况下,问题在于 settings.py 中的 LOCALE_PATHS 定义。

我在视图中测试了它:

from TranslationTest import settings
return HttpResponse(settings.LOCALE_PATHS)

它显示home/myProjects/TranslationTest/TranslationTest/locale,但makemessages 正在生成home/myProjects/TranslationTest/locale 中的文件

所以我改变了我的设置如下:

SITE_ROOT = os.path.dirname(os.path.realpath(__name__))
LOCALE_PATHS = ( os.path.join(SITE_ROOT, 'locale'), )

现在它可以工作了。

但我还是想知道,为什么makemessages 不明白它应该在settings.py 指定的LOCALE_PATHS 中创建文件?

据我了解,它总是在 SITE_ROOT/locale 中生成语言环境文件,所以我们应该始终将 LOCALE_PATHS 设置为此?如果这是默认设置,为什么还要设置它?我希望能提供有关此问题的更多信息。

感谢大家的帮助!

【讨论】:

  • 打印出 settings.LOCALE_PATHS 确实帮助我解决了这个问题。 LOCALE_PATHS 应该包括项目中的所有“语言环境”文件夹。谢谢。
【解决方案2】:

如果您激活了区域设置中间件,就会发生这种情况。通过这样做,我认为您的本地会话取决于您的浏览器区域设置。

如果您注释区域设置中间件,它应该可以按预期工作。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    #'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

【讨论】:

    【解决方案3】:

    请记住您的语言中是否包含国家/地区,例如fa-IR,您必须在设置文件中添加:

    LANGUAGE_CODE = 'fa-IR'
    

    但是当你想调用 makemessages 命令时,你应该将- 更改为_

    makemessages -l fa_IR
    

    【讨论】:

    • 与此相关,来自docsIn all cases the name of the directory containing the translation is expected to be named using locale name notation. E.g. de, pt_BR, es_AR, etc.
    【解决方案4】:

    我只是想提醒一些引起我小问题的事情,那就是我应该更改浏览器的语言(从选项中)。 但是,我完全完成了所有操作,但看不到翻译文本。 顺便说一句,我不想​​使用任何特定的 url 来查看翻译。

    【讨论】:

      【解决方案5】:

      对我来说,在线评论可以正常工作

      USE_I18N = True
      USE_L10N = True
      LANGUAGE_CODE = 'uk'
      LANGUAGES = (
      ('uk', _('Ukrainian')),
      # ('en', _('English')),
      )
      

      项目根目录中没有语言环境文件夹,没有自定义 LOCALE_PATHS

      【讨论】:

        【解决方案6】:

        将本地中间件添加到 django 中间件对我有用'django.middleware.locale.LocaleMiddleware',

        【讨论】:

          【解决方案7】:

          您可能需要阅读此How Django discovers language preference

          TLDR;

          区域设置中间件按以下顺序决定用户语言:

          1. i18n_patterns 根中的函数 URLconf
          2. 如果失败,它会查找由 LANGUAGE_COOKIE_NAME 设置设置的 cookie
          3. 如果失败,它会查看您的浏览器发送的 Accept-Language HTTP 标头
          4. 否则,它将使用全局 LANGUAGE_CODE 设置

          就我而言,我遵循了一个教程,但我不知道为什么我的语言没有改变。

          我已经完成了 locale 文件夹,我已经翻译了两种语言的所有字符串,并且我已经正确设置了 LOCALE_PATH 和其他内容。

          所以为了测试我更改了LANGUAGE_CODE 以显示印地语文本,但我不知道语言优先级的东西。

          我在我的设置中设置了以下内容

          LANGUAGES = (
              ('hi', _('Hindi')),
              ('en', _('English')),
          )
          LANGUAGE_CODE = 'hi'
          

          所以发生的事情是我没有指定语言的 cookie,因此优先级落在了在 http 标头中传递的浏览器默认语言。

          所以它从未出现在我的设置中的 LANGUAGE_CODE 中,request.LANGUAGE_CODE 中的语言设置为 en。

          所以为了解决这个问题,我将 cookie 设置为在我的浏览器之前优先

          from django.conf import settings
          from django.http import HttpResponse
          from django.utils import translation
          user_language = 'hi'
          translation.activate(user_language)
          response = HttpResponse(...)
          response.set_cookie(settings.LANGUAGE_COOKIE_NAME, user_language)
          

          我从这里拿了这个Explicitly setting the active language

          【讨论】:

            【解决方案8】:

            到今天为止,在 Django 3.2 中,这个问题仍然存在。 就我而言,我有以下设置:

            C:.
            ├───documents
            ├───project
            │   ├───apps
            │   │   ├───accounts
            │   │   │   ├───...
            │   │   ├───common
            │   │   │   ├───...
            │   │   └───...
            │   ├───locale
            │   │   └───it
            │   │       └───LC_MESSAGES
            │   └───...
            └───tests
            

            设置文件是这样设置的:

            LANGUAGE_CODE = 'it'
            
            LOCALE_PATHS = [
                os.path.join(Path(__file__).resolve().parent, "locale"),
            ]
            
            LANGUAGES = [
               ('en', _('English')),
               ('it', _('Italian')),
            ]
            

            诀窍在于 LOCALE_PATHS 的定义。 Django-admin 在某种程度上与 Django 环境不同步。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-18
              • 1970-01-01
              • 2018-04-15
              相关资源
              最近更新 更多