在视图和模板之外使用翻译

2018-04-03  本文已影响18人  大爷的二舅

虽然Django提供了一套丰富的用于视图和模板的国际化工具,但它并未将使用限制在Django特定的代码中。 Django翻译机制可用于将任意文本转换为Django支持的任何语言(当然,只要存在适当的翻译目录)。

您可以加载翻译目录,激活它并将文本翻译为您选择的语言,但请记住切换回原始语言,因为激活翻译目录是基于每个线程完成的,并且这种更改会影响在同一线程中运行的代码。

例如:

from django.utils import translation
def welcome_translated(language):
    cur_language = translation.get_language()
    try:
        translation.activate(language)
        text = translation.ugettext('welcome')
    finally:
        translation.activate(cur_language)
    return text 

使用值'de'调用此函数将为您提供“Willkommen”,无论LANGUAGE_CODE和中间件设置的语言如何。

特别感兴趣的函数是django.utils.translation.get_language(),它返回当前线程中使用的语言,django.utils.translation.activate(),它激活当前线程的翻译目录,以及django.utils.translation。 check_for_language()检查Django是否支持给定的语言。

实施说明
Django的特殊翻译

Django的翻译机制使用Python自带的标准gettext模块。 如果你知道gettext,你可以用Django翻译的方式记下这些特殊的:

Django如何发现语言偏好

准备好翻译之后 - 或者,如果您只是想使用Django附带的翻译版本,则需要为您的应用激活翻译。

在幕后,Django有一个非常灵活的模型来决定应该使用哪种语言 - 安装范围内,针对特定用户,还是两者兼而有之。

要设置安装范围的语言首选项,请设置LANGUAGE_CODE。 Django使用这种语言作为默认翻译 - 如果通过语言环境中间件采用的方法之一找不到更好的匹配翻译,则为最终尝试(见下文)。

如果你只想用你的母语运行Django,你只需要设置LANGUAGE_CODE并确保相应的消息文件及其编译版本(.mo)存在。

如果您想让每个用户指定他们喜欢的语言,那么您还需要使用LocaleMiddleware。 LocaleMiddleware基于来自请求的数据启用语言选择。它为每个用户定制内容。

要使用LocaleMiddleware,请将'django.middleware.locale.LocaleMiddleware'添加到MIDDLEWARE_CLASSES设置中。由于中间件顺序很重要,因此您应遵循以下准则:

注意:

一旦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如何发现翻译

在运行时,Django构建了一个直接转换的内存统一目录。 为了达到这个目的,它通过遵循以下算法来查找翻译:它检查加载编译的消息文件(.mo)的不同文件路径的顺序以及相同文字的多个翻译的优先顺序:

在任何情况下,包含翻译的目录的名称都应该使用区域名称表示法命名。 例如。 de,pt_BR,es_AR等

这样,您可以编写包含自己翻译的应用程序,并且可以在项目中覆盖基本翻译。 或者,您可以从多个应用程序中构建一个大型项目,并将所有翻译放入您正在撰写的项目特定的大型通用消息文件中。 这是你的选择。

所有的消息文件存储库的结构都是一样的。 他们是:

要创建消息文件,可以使用django-admin makemessages工具。 你使用django-admin compilemessages来生成gettext使用的二进制.mo文件。

你也可以运行django-admin compilemessages来让编译器处理LOCALE_PATHS设置中的所有目录。

下一步是什么?
在下一章中,我们将讨论Django中的安全性。

上一篇 下一篇

猜你喜欢

热点阅读