对于Django国际化首先要看官方文档,然后参考admin中国际化的设计,再结合本文档即可大事告成!
Django admin位置:python3.6/site-packages/django/contrib/admin/locale
MIDDLEWARE_CLASSES = (
...
'django.middleware.locale.LocaleMiddleware', # 请注意注意, 需要放在'django.contrib.sessions.middleware.SessionMiddleware'和 'CacheMiddleware' 的后面。
)
LANGUAGE_CODE = 'zh-Hans' # 要问Django语言有哪些,请到这个目录下面找(python/site-packages/django/conf/locale/)
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGES = ( # 系统支持的语言种类,Django LocaleMiddleware 根据请求信息会自动选择
('en', ('English')),
('zh-Hans',_('中文简体')),
('zh-Hant',_('中文繁體')),
)
#翻译文件所在目录,需要手工创建
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
这里主要简绍 标准翻译 复数,在Python 代码中
from django.utils.translation import ugettext as _
def my_view(request):
output = _("Welcome to my site.")
return HttpResponse(output)
def my_view(request, m, d):
output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
return HttpResponse(output)
在生成翻译的文件.po文件中将出现:(生成方法详见–> 三、生成需要翻译的文件(.po))
#: hello/views.py:10
msgid "Welcome to my site."
msgstr "欢迎访问"
#: hello/views.py:36
#, python-format
msgid "Today is %(month)d"
msgstr "今天是 %(month)d 月"
函数django.utils.translation.ungettext() 用于指定多元化的消息。
ungettext 接收三个参数:单数形式的翻译字符串、复数形式的翻译字符串和对象的个数。
这个函数用于当你的Django 应用所要本地化的语言中,复数形式 比英语中的要复杂时(‘object’ 表示单数,‘objects’ 表示所有count 不等于一的情形,无论具体的值是多少)。
from django.utils.translation import ungettext
from django.http import HttpResponse
def hello_world(request, count):
page = ungettext(
'there is %(count)d object',
'there are %(count)d objects',
count) % {
'count': count,
}
return HttpResponse(page)
这个例子中对象的数字作为count变量传递给翻译语言
注意: 在使用 ungettext()的时候, 确保你你使用在每一个占位符中使用同一个名称。 在上面的例子中, 你可以注意到我们是怎么在两种翻译中使用count这个变量的。
在生成翻译的文件.po文件中将出现:(生成方法详见–> 三、生成需要翻译的文件(.po))
#: hello/views.py:59
#, python-format
msgid "There is %(count)d object available."
msgid_plural "There are %(count)d objects available."
msgstr[0] "(单个)这是 %(count)d 对象 "
msgstr[1] "(多个)这是 %(count)d 对象"
manage.py同级目录下完成
每个.po文件首先包含一小部分元数据,例如翻译维护者的联系信息,但文件的大部分是翻译对照:被翻译字符串和特定语言的实际翻译文本之间的简单映射。
例如,有一个像下面这样的待翻译字符串:
_(“Welcome to my site.”)
在.po文件中将包含一条下面样子的条目:
#: path/to/python/module.py:23
msgid "Welcome to my site."
msgstr ""
这三行内容各自代表下面的意思:
第一行通过注释表达该条要翻译的字符串在视图或模版中的位置;
msgid:要翻译的字符串。不要修改它。
msgstr:翻译后的文本。一开始它是空的,需要翻译人员逐条填写。
这是一个文本文件,需要专业的翻译人员将所有的msgstr空白‘填写’齐全。如果你的项目比较大,这可能是个磨人的事。
# 运行下面命令,Django将自动搜索所有的.po文件,将它们都翻译成.mo文件。
django-admin compilemessages
一旦你准备好翻译,或者你只是想使用Django 自带的翻译,你需要为你的应用启用翻译。
在这些功能背后,Django拥有一个灵活的模型来确定在安装和使用应用程序的过程中选择使用的语言。
要设定一个安装阶段的语种偏好,请设定LANGUAGE_CODE。如果其他翻译器没有找到一个译文,Django将使用这个语种作为缺省的翻译最终尝试。
如果你想要的是用你的母语运行Django,你只需设置LANGUAGE_CODE并确保相应的message files及其编译版本(.mo)。
如果你想让每个用户指定首选语言,那么你还要 使用 LocaleMiddleware. LocaleMiddleware 会打开基于请求数据的语言选择。 它为每个人用户的内容进行个性化。
要使用LocaleMiddleware,请将’django.middleware.locale.LocaleMiddleware’添加到您的MIDDLEWARE设置中。 因为中间件顺序很重要,请遵循以下准则:
例如,您的MIDDLEWARE可能如下所示:
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
]
LocaleMiddleware尝试通过以下算法确定用户的语言首选项:
笔记:
LANGUAGES = [
('de', _('German')),
('en', _('English')),
]
此示例将可用于自动选择的语言限制为德语和英语(以及任何子语言,如de-ch或en-us)。
from django.utils.translation import ugettext_lazy as _
LANGUAGES = [
('de', _('German')),
('en', _('English')),
]
一旦LocaleMiddleware确定用户的首选项,它使每个HttpRequest的此首选项可用作request.LANGUAGE_CODE。 随意在您的视图代码中读取此值。 这里有一个简单的例子:
from django.http import HttpResponse
def hello_world(request, count):
if request.LANGUAGE_CODE == 'de-at':
return HttpResponse("You prefer to read Austrian German.")
else:
return HttpResponse("You prefer to read another language.")
请注意,使用静态(无中间件)转换,语言在settings.LANGUAGE_CODE中,而在动态(中间件)转换时,它位于request.LANGUAGE_CODE中。
在运行时,Django构建一个内存中的文字 - 翻译目录。 为了实现这一点,它通过遵循该算法关于其检查不同文件路径以加载编译的message files(.mo)和优先级的顺序来寻找翻译多个翻译为同一个字面量:
在所有情况下,包含翻译的目录的名称应使用locale name符号命名。 例如。 pt_BR,de,es_AR等。
这样,您可以编写包含自己的翻译的应用程序,并且可以覆盖项目中的基本翻译。 或者,您可以从几个应用程序构建一个大项目,并将所有翻译成一个大的通用消息文件,特定于您正在撰写的项目。 这是你的选择。
所有消息文件存储库的结构都是相同的。 他们是:
要创建邮件文件,请使用django-admin makemessages工具。 And you use django-admin compilemessages to produce the binary .mo files that are used by gettext.
您还可以运行django-admin compilemessages --settings=path.to.settings您的LOCALE_PATHS设置中的所有目录。