在你自己的项目中使用翻译
Django使用以下算法寻找翻译:
首先,Django在该视图所在的应用程序文件夹中寻找
locale
目录。 若找到所选语言的翻译,则加载该翻译。第二步,Django在项目目录中寻找
locale
目录。 若找到翻译,则加载该翻译。最后,Django使用
django/conf/locale
目录中的基本翻译。
以这种方式,你可以创建包含独立翻译的应用程序,可以覆盖项目中的基本翻译。 或者,你可以创建一个包含几个应用程序的大项目,并将所有需要的翻译放在一个大的项目信息文件中。 决定权在你手中。
所有的信息文件库都是以同样方式组织的: 它们是:
$APPPATH/locale/<language>/LC_MESSAGES/django.(po|mo)
$PROJECTPATH/locale/<language>/LC_MESSAGES/django.(po|mo)
所有在settings文件中
LOCALE_PATHS
中列出的路径以其列出的顺序搜索<language>/LC_MESSAGES/django.(po|mo)
$PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)
要创建信息文件,也是使用 django-admin.py makemessages.py
工具,和Django信息文件一样。 需要做的就是进入正确的目录—— conf/locale
(在源码树的情况下)或者 locale/
(在应用程序信息或项目信息的情况下)所在的目录下。 同样地,使用 compile-messages.py
生成 gettext
需要使用的二进制 django.mo
文件。
您亦可运行django-admin.py compilemessages —settings=path.to.settings
来使编译器处理所有存在于您 LOCALE_PATHS
设置中的目录。
应用程序信息文件稍微难以发现——因为它们需要 LocaleMiddle
。如果不使用中间件,Django只会处理Django的信息文件和项目的信息文件。
最后,需要考虑一下翻译文件的结构。 若应用程序要发放给其他用户,应用到其它项目中,可能需要使用应用程序相关的翻译。 但是,使用应用程序相关的翻译和项目翻译在使用 make-messages
时会产生古怪的问题。它会遍历当前路径下所有的文件夹,这样可能会把应用消息文件里存在的消息ID重复放入项目消息文件中。
最容易的解决方法就是将不属于项目的应用程序(因此附带着本身的翻译)存储在项目树之外。 这样做的话,项目级的 make-messages
将只会翻译与项目精确相关的,而不包括那些独立发布的应用程序中的字符串。