Django国际化不起作用。

7
我正在尝试为我的项目激活不同的语言,目前包括英语和西班牙语。
我将描述我所遵循的所有步骤:
首先,我要定位到我想要翻译的目录。或者更准确地说,{% trans %} 标签所在的位置:
$ cd media/templates/landing/
$ mkdir locale
$ django-admin.py makemessages --locale=en

最后一个命令创建了目录/文件/locale/en/LC_MESSAGES/django.po。
我打开django.po,然后开始填写所有英语语言的msgstr字段。msgid标签是用西班牙语编写的。我遵循长消息的大小写提示。在填写完这个文件之后,我执行了以下操作:
$ django-admin.py compilemessages

这个过程处理 django.po 并创建 django.mo。
所以我修改了 settings.py。重要的行:
TEMPLATE_CONTEXT_PROCESSORS = (
    'ism.context_processor.user_vars',
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.contrib.messages.context_processors.messages',
    'django.core.context_processors.request',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'pipeline.middleware.MinifyHTMLMiddleware',
}

TIME_ZONE = 'Atlantic/Canary'

LANGUAGE_CODE = 'es'

USE_I18N = True

_ = lambda s: s

LANGUAGES = (
    ('es', _('Espanol')),
    ('en', _('English')),
)

USE_L10N = True

USE_TZ = True

最后,我在URLS.py中添加了这行代码:
(r'^i18n/', include('django.conf.urls.i18n')),

我重新启动了我的开发服务器,将Firefox浏览器配置为首选英语作为主要语言,但它并没有起作用。所有的文字仍然显示为西班牙语而不是英语。
我确保Firefox已经配置成英语,因为在Django视图函数(渲染.html文件)中,我使用request.LANGUAGE_CODE打印,它会输出“en”。
我做错了什么?

你执行了 django-admin.py makemessages --locale=es 吗? - Mohammad Efazati
用户如何在英语和西班牙语之间切换? - Mohammad Efazati
@Efazati 我的项目主要语言是 ES 而不是 EN。因此,我理解我必须运行 django-admin.py makemessages --locale=en,对吗?这样创建的 django.po 文件中的 msgid 字段将是西班牙语,我必须完成英语的 msgstr 字段。 - Rubén Jiménez
用户如何将语言更改为英语?有没有URL或其他什么东西? - Mohammad Efazati
你应该用你编辑的内容回答自己,这样你就可以接受自己的答案作为有效的答案。感谢分享! - Puigcerber
显示剩余2条评论
2个回答

3
首先,我将自己放置在要翻译的目录中。或者更确切地说,就是所有{% trans %}标签所在的位置: $ cd media/templates/landing/ $ mkdir locale $ django-admin.py makemessages --locale=en
这不是您应该进行翻译的方式。
您需要为要翻译成的语言创建消息文件,而不是要翻译的基本语言。在这种情况下,即英语。
此外,命令需要从项目目录而不是模板目录运行。
因此,您的命令应该是: $ django-admin.py makemessages --locale=es
您应该从项目的根目录运行它,而不是模板目录。您也不需要创建locale目录,该命令会为您创建该目录。
接下来,您需要将西班牙语翻译添加到文件中。该文件将具有英文标签。这告诉Django加载英文版本的西班牙语等效内容。
一旦完成,您需要编译消息文件(同样是从根目录开始)。

$ django-admin.py compilemessages

现在翻译已经准备好了,您需要告诉 Django 您想要哪种语言。由于您正在使用内置的视图来切换语言,因此您需要使用所需的语言调用该视图。

文档中提供了一个模板,您可以使用:

<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>

从这个表单中选择语言,以便Django知道要加载哪些翻译。

您还应该阅读Django如何发现语言偏好,以供您的视图和模板使用。


1
我猜你误解了。我在项目中的本地语言是西班牙语(ES),所以我想要从西班牙语翻译成英语。如果您访问此链接(http://www.djangobook.com/en/1.0/chapter18/),您可以看到他们的示例,告诉我们如何使用`django-admin.py make messages -l de`,其中DE是他们想要翻译的语言。现在,我试图从我的项目根目录完成整个过程。理论上,LocaleMiddleware必须自动检测用户浏览器的语言进行翻译,而无需进行任何先前的选择。但它没有。 - Rubén Jiménez

3

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