16

我在国际化我的应用程序时遇到了困难,所以我在这里提供一个我的实现失败的最小示例。

考虑以下步骤以在 django 中生成具有国际支持的网站:

转到终端中您最喜欢的文件夹,然后:

django-admin.py startproject mysite
cd mysite/
mkdir locale
python manage.py startapp main
# (1) modify mysite/urls.py
# (2) modify main/views.py
# (3) modify mysite/settings.py
django-admin.py makemessages -l de
# (4) modify locale/de/LC_MESSAGES/django.po
django-admin.py compilemessages -l de
python manage.py runserver

在哪里:

## (1) mysite/urls.py
urlpatterns = patterns('',
url(r'^$', 'main.views.home'),
)

## (2) main/views.py
from django.http import HttpResponse
from django.utils.translation import ugettext as _

def home(request):
    return HttpResponse(_('Hello'))

## (3) mysite/settings.py
LANGUAGE_CODE = 'de'

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + \
     ('django.core.context_processors.i18n',) # ensures all django processors are used.

## (4) locale/de/LC_MESSAGES/django.po
#: main/views.py:6
msgid "Hello"
msgstr "Hallo"

我假设该网站只有一种语言,因此,我没有通过django 文档激活中间件语言环境:

如果您想让每个单独的用户指定他或她喜欢的语言,请使用 LocaleMiddleware。LocaleMiddleware 启用基于请求数据的语言选择。它为每个用户定制内容。

此实现不会产生所需的“Hello”到“Hallo”的翻译。我究竟做错了什么?

4

2 回答 2

27

1º 在 settings.py 中启用国际化:

USE_I18N = True

2º 在设置中,导入:

from django.utils.translation import ugettext_lazy as _

3º在settings.py中设置你要使用的语言:

LANGUAGES = (
    ('en', _('English')),
    ('pt-br', _('Portuguese')),
    ('it', _('Italian')),
    ('fr', _('French')),
    ('es', _('Spanish')),
)

3º也在settings.py中配置LOCALE_PATH:

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'conf/locale'),
)

4º 在您在 LOCALE_PATH 中配置的路径中创建文件夹,例如:

$ cd django_project_folder
$ mkdir conf
$ mkdir conf/locale

5º运行命令:

django-admin.py makemessages -a

它将在 settings.py LANGUAGES 中设置的每种语言的子文件夹中创建一个文件 .po。对文件中的每个句子进行翻译。

ps:遍历当前目录的整个源码树,拉出所有标记为翻译的字符串。

为了测试,在运行之前,把标签

{% trans "Welcome to my project!" %} 

在您的 index.html 中并再次运行命令 makemessages。您将在 de .po 文件中看到一个新字符串:

msgid "Welcome to my Project"
msgstr ""

6º 现在,运行命令:

django-admin compilemessages

它将从 .po 文件中收集所有 msgstr 并将编译到 .mo 文件中

7º 运行项目并测试

8ª Plus:如果您希望在 URL 中显示用户使用的语言,您可以配置您的 url.py 以显示:

urlpatterns += i18n_patterns(
    # your urls here,
)
于 2016-03-22T02:31:44.263 回答
12

Django 以这里解释的这 3 种方式收集翻译: https ://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-translations

LOCALE_PATHS 中列出的目录具有最高优先级,首先出现的目录的优先级高于后面出现的目录。

然后,它会查找并使用 INSTALLED_APPS 中列出的每个已安装应用程序中是否存在区域设置目录。首先出现的优先级高于后来出现的优先级。

最后,django/conf/locale 中的 Django 提供的基本翻译被用作后备。

由于您的翻译文件不在这些地方,您需要LOCALE_PATHS按照此处的说明手动设置它: https ://docs.djangoproject.com/en/dev/ref/settings/#std:setting-LOCALE_PATHS

于 2013-05-27T12:41:07.963 回答