本地化:如何创建语言文件
一旦应用程序的字符串文字被标记为以后翻译,翻译本身需要被写入(或获得)。 这是如何工作的。
消息文件
第一步是为新语言创建消息文件。 消息文件是纯文本文件,表示单一语言,其中包含所有可用的翻译字符串以及它们应如何用给定语言表示。 消息文件具有.po文件扩展名。
Django带有一个工具django-admin makemessages,可以自动创建和维护这些文件。
makemessages命令(和稍后讨论的compilemessages)使用GNU gettext工具集中的命令:xgettext,msgfmt,msgmerge和msguniq。
支持的gettext实用程序的最低版本为0.15。
要创建或更新消息文件,请运行以下命令:
django-admin makemessages -l de
...其中de是要创建的消息文件的语言环境名称。 例如,巴西葡萄牙语为pt_BR,奥地利德语为de_AT,印度尼西亚语为id。
脚本应该从两个地方之一运行:
- Django项目的根目录(包含manage.py的项目)。
- 您的某个Django应用程序的根目录。
该脚本运行在您的项目源代码树或应用程序源代码树上,并提取标记为翻译的所有字符串(请参阅how-django-discovers-translations并确保LOCALE_PATHS配置正确)。它在目录locale / LANG / LC_MESSAGES中创建(或更新)一个消息文件。在例子中,该文件将是locale / de / LC_MESSAGES / django.po。
当您从项目的根目录运行makemessages时,提取的字符串将自动分发到正确的消息文件。也就是说,从包含语言环境目录的应用文件中提取的字符串将进入该目录下的消息文件。从没有任何区域设置目录的应用文件中提取的字符串将进入LOCALE_PATHS中列出的目录下的消息文件中,或者如果LOCALE_PATHS为空,则会生成错误。
默认情况下,django-admin makemessages检查每个具有.html或.txt文件扩展名的文件。如果您想覆盖该默认值,请使用--extension或-e选项指定要检查的文件扩展名:
django-admin makemessages -l de -e txt
使用逗号分隔多个扩展名和/或多次使用-e或--extension:
django-admin makemessages -l de -e html,txt -e xml
从JavaScript源代码创建消息文件时,您需要使用特殊的'djangojs'域,而不是-e js。
如果您没有安装gettext实用程序,则makemessages将创建空文件。 如果是这种情况,可以安装gettext实用程序或仅复制英文消息文件(locale / en / LC_MESSAGES / django.po)(如果可用)并将其用作起点; 它只是一个空的翻译文件。
如果您使用Windows并需要安装GNU gettext实用程序以使makemessages有效,请参阅本章稍后部分的“gettext on windows”以获取更多信息。
.po文件的格式很简单。 每个.po文件都包含一小部分元数据,例如翻译维护人员的联系信息,但大部分文件都是消息列表 - 翻译字符串与特定语言的实际翻译文本之间的简单映射。
例如,如果您的Django应用程序包含文本“欢迎来到我的网站”的翻译字符串,如下所示:
_("Welcome to my site.")
...然后django-admin makemessages将创建一个包含以下代码片段的.po文件 - 一条消息:
#: path/to/python/module.py:23
msgid "Welcome to my site."
msgstr ""
快速解释:
-
msgid是翻译字符串,它出现在源文件中。 不要改变它。
-
msgstr是您放置特定于语言的翻译的地方。 它开始是空的,所以你有责任改变它。 确保你保留你的翻译报价。
-
为方便起见,每条消息都以注释行的形式包含前缀为#并位于msgid行上方的文件名和行号,从中收集翻译字符串。
长消息是一种特殊情况。 在那里,msgstr(或者msgid)之后的第一个字符串是一个空字符串。 然后内容本身将被写入接下来的几行,每行一个字符串。 这些字符串是直接连接的。 不要忘记字符串中的尾随空格; 否则,他们将被钉在一起,没有空白!
由于gettext工具在内部工作的方式,并且由于我们希望在Django的核心和应用程序中允许使用非ASCII源字符串,所以您必须使用UTF-8作为PO文件的编码(PO文件创建时的默认值)。 这意味着每个人都将使用相同的编码,这在Django处理PO文件时非常重要。
要重新检查新翻译字符串的所有源代码和模板并更新所有语言的所有消息文件,请运行以下命令:
django-admin makemessages -a
编译消息文件
创建消息文件后 - 每次更改它时 - 都需要将其编译为更有效的格式,供gettext使用。 使用django-admin compilemessages实用程序执行此操作。
此工具运行所有可用的.po文件并创建.mo文件,这是经过优化以供gettext使用的二进制文件。 在运行django-admin makemessages的同一目录中,运行:
django-admin compilemessages
就是这样。 您的翻译已准备就绪,可供使用。
如果您使用Windows并需要安装GNU gettext实用程序,以便django-admin compilemessages可以正常工作,请参阅下面的Windows上的gettext以获取更多信息。
Django仅支持以UTF-8编码且没有任何BOM(字节顺序标记)的.po文件,所以如果您的文本编辑器默认将这些标记添加到文件的开头,那么您将需要重新配置它。
从Javascript源代码创建消息文件
您可以使用django-admin makemessages工具以与其他Django消息文件相同的方式创建和更新消息文件。 唯一的区别是你需要明确指定gettext中的内容
在这种情况下,djangojs域通过提供-d djangojs参数来称为域,如下所示:
django-admin makemessages -d djangojs -l de
这将为德语创建或更新JavaScript的消息文件。 更新消息文件后,只需像使用普通Django消息文件一样运行django-admin compilemessages。
gettext在Windows上
这只需要那些想要提取消息ID或编译消息文件(.po)的人。 翻译工作本身只涉及编辑此类型的现有文件,但如果您想创建自己的消息文件,或者想要测试或编译已更改的消息文件,则需要使用gettext实用程序:
- 从GNOME服务器下载以下zip文件:
- gettext-runtime-X.zip
- gettext-tools-X.zip
(X是版本号;需要版本0.15或更高版本。)
- 将这两个文件中bin \目录的内容解压缩到系统上的同一文件夹(即C:\ Program Files \ gettext-utils)
更新系统路径:- Control Panel > System > Advanced > Environment Variables.
- 在系统变量列表中,单击路径,然后单击编辑。
- 在变量值字段的末尾添加; C:\ Program Files \ gettext-utils \ bin。
只要xgettext --version命令正常工作,您也可以使用您在别处获得的gettext二进制文件。 如果使用命令xgettext --version,不要尝试使用带有gettext包的Django翻译实用程序
在Windows命令提示符下输入会导致出现一个弹出窗口,指出xgettext.exe已生成错误,并将由Windows关闭。
自定义Makemessages命令
如果要将其他参数传递给xgettext,则需要创建自定义的makemessages命令并覆盖其xgettext_options属性:
from django.core.management.commands import makemessages
class Command(makemessages.Command):
xgettext_options = makemessages.Command.xgettext_options + ['--keyword=mytrans']
如果您需要更多的灵活性,您还可以为自定义的makemessages命令添加一个新的参数:
from django.core.management.commands import makemessages
class Command(makemessages.Command):
def add_arguments(self, parser):
super(Command, self).add_arguments(parser)
parser.add_argument('--extra-keyword',
dest='xgettext_keywords',
action='append')
def handle(self, *args, **options):
xgettext_keywords = options.pop('xgettext_keywords')
if xgettext_keywords:
self.xgettext_options = (
makemessages.Command.xgettext_options[:] +
['--keyword=%s' % kwd for kwd in xgettext_keywords]
)
super(Command, self).handle(*args, **options)
显式设置活动语言
您可能想要明确设置当前会话的活动语言。 例如,用户的语言偏好可能是从另一个系统中检索的。 你已经被引入到django.utils.translation.activate()。 这仅适用于当前线程。 要为整个会话保留语言,还要在会话中修改LANGUAGE_SESSION_KEY:
from django.utils import translation
user_language = 'fr'
translation.activate(user_language)
request.session[translation.LANGUAGE_SESSION_KEY] = user_language
您通常会同时使用以下两种方法:django.utils.translation.activate()将更改此线程的语言,并且修改会话会使此首选项在将来的请求中保持不变。
如果您未使用会话,则该语言将保存在名为LANGUAGE_COOKIE_NAME中配置的Cookie中。 例如:
from django.utils import translation
from django import http
from django.conf import settings
user_language = 'fr'
translation.activate(user_language)
response = http.HttpResponse(...)
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, user_language)