热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

djangolanguage_Django国际化和本地化

我理解的国际化和本地化,是一个Web应用可以使用各种语言和格式提供内容,为全球各地,说着不同语言,写着不同文字的人使用提供便

我理解的国际化和本地化,是一个Web应用可以使用各种语言和格式提供内容,为全球各地,说着不同语言,写着不同文字的人使用提供便利。软件界面是可以被翻译为各国语言,可以据某些条件切换。显示的数字,日期的格式也可以自由选择。国际化英语称为internationalization,因为太长了,所以简写为i18n,因为i和n之间有18个字母。本地化称为localization,同样可以简写为l10n。还有很关键的一个是时区TimeZone,决定了显示的时间。

基本配置

项目下settings.py文件,添加LocaleMiddleware中间件:

MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware',    'django.middleware.common.CommonMiddleware',     ]

  • 它应该位于SessionMiddleware之后,因为 LocaleMiddleware需要依赖session中的数据.它应该在 CommonMiddleware之前,因为 CommonMiddleware需要语言数据去解析请求URL.

  • 如果使用了 CacheMiddleware, 把LocaleMiddleware 放到它后边.

LocaleMiddleware将会使用下边的逻辑确定用户期望使用的语言:

  • 首先, 查看请求URL的前缀,比如/en/about将会使用英语翻译,怎样配置URL前缀,下文有介绍,详见官方文档。

  • 如果失败了(没有发现语言标记),就会去COOKIE中寻找django_language键的信息(这个名称可通过LANGUAGE_COOKIE_NAME 配置)。

  • 又失败了, 就会去查看HTTP请求头中的 Accept-Language 项,django会按优先级逐个查找头信息中期望的语言,直到找到为止.

  • 又失败了, 将会使用全局的LANGUAGE_CODE的配置.

其他一些配置:

from django.utils.translation import gettext_lazy as _LANGUAGE_CODE = 'en-us'TIME_ZONE = 'UTC'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = TrueLOCALE_PATHS = [os.path.join(BASE_DIR, 'mysite/locale')]LANGUAGES = [ ('en', _('English')), ('zh-hans', _('Simplified Chinese')),]

其中USE_I18N,USE_L10N是使能开关。

LOCALE_PATHS很重要,这个路径存放翻译文件,而且它的优先级很高,每个app都有自己的翻译文件,但是对于安装的第三方app修改源码路径的翻译文件不太好,可以在这里进行覆盖。

LANGUAGES直接限定了系统存在的翻译语言种类,这里没有的语言就不会去local路径搜索了,加速系统的运行,这里的_('English')就是自动翻译的标记,所以最上边的import是为它服务的。

在python代码中使用

其实上边的配置文件也是python代码,已经用过了,这里主要指在view中如何使用。

from django.http import HttpResponsefrom django.utils.translation import gettext as _def my_view(request): output = _("Welcome to my site.") return HttpResponse(output)

最终_("Welcome to my site.")会根据会话决定的语言,查找对应的翻译文件,把翻译的内容返回给output变量赋值。更多的技巧见官方文档。关于如何制作翻译文件稍后再说。

在模板文件中使用

模板文件会被模板引擎自动填充扩展成HTML代码,其中有很多文字是需要翻译的,这里使用{% trans %}和{% blocktrans %}。

{% trans "This is the title." %}title>{% trans myvar %}title>{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}

更多使用方法和细节参看官网手册。

在JS中使用

Javascript的情况更复杂些,因为它不是在服务端执行的,要把相关翻译文件和函数传给浏览器,然后才能使用。

在urlpatterns中注册资源链接地址:

from django.views.i18n import JavascriptCatalogurlpatterns = [    path('jsi18n/', JavascriptCatalog.as_view(),name='Javascript-catalog'), ]

在模板中引入资源:

script>

在代码中使用相关函数:

document.write(gettext('this is to be translated'));

或者将上文的JavascriptCatalog类似的JSONCatalog 引入,可以获得一条json格式的翻译文件链接,由其他js库调用。

在URL中使用

在URL中有两个机制,一个是在url中添加语言的前缀,一个是使用翻译。

添加前缀很简单,在注册url时,使用i18n_patterns包装一下:

urlpatterns += i18n_patterns( path('about/', about_views.main, name='about'), path('news/', include(news_patterns, namespace='news')),)

这样在不同的语言配置下,最终链接会变成/en/about,/zh/news格式

第二个是直接在URL中使用翻译:

from django.utils.translation import gettext_lazy as _urlpatterns += i18n_patterns( path(_('about/'), about_views.main, name='about'), path(_('news/'), include(news_patterns, namespace='news')),)

在模板中使用这种链接可以使用{% language %}标记: 

{% language lang_code %} {{ lang_name }}a>{% endlanguage %}

如何制作翻译文件

为什么我们要先写代码再制作翻译文件呢?因为要翻译哪些内容只有写代码时才能确定,并且有工具命令把需要翻译的内容做成列表,然后我们完成列表中内容的翻译就行了。

生成翻译文件:

python3 manage.py makemessages -l zh_Hans(或者django-admin makemessages -l zh_Hans )

在app的翻译路径会出现这个文件locale/zh_Hans/LC_MESSAGES/django.po

假如代码中使用了_("Welcome to my site.")标记,文件中就会有它对应的翻译:

#: path/to/python/module.py:23msgid "Welcome to my site."msgstr "欢迎来到我的网站"

msgstr的内容就是你要翻译的内容,可不会自动生成。

翻译完成之后,进行编译:

python3 manage.py compilemessages(或者django-admin compilemessages)到

这时翻译路径就会出现编译好的locale/zh_Hans/LC_MESSAGES/django.mo文件

这时就可以启动项目查看效果了,这里只是大体上的过程,有很多细节我没有写到,还是那句话详见官网文档。

官网相关链接:https://docs.djangoproject.com/en/3.0/topics/i18n/

0915198e4b68e992dbffced200c7e6c7.png




推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了如何在Mac上使用Pillow库加载不同于默认字体和大小的字体,并提供了一个简单的示例代码。通过该示例,读者可以了解如何在Python中使用Pillow库来写入不同字体的文本。同时,本文也解决了在Mac上使用Pillow库加载字体时可能遇到的问题。读者可以根据本文提供的示例代码,轻松实现在Mac上使用Pillow库加载不同字体的功能。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
author-avatar
殉情放开那只小兔子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有