Django 翻译与 LANGUAGE_CODE
LANGUAGE_CODE[1]
LANGUAGE_CODE 是 language code 的字符串。格式与 Accept-Language HTTP header 相同,不区分大小写,比如:zh, es, zh-hans。所有的 language codes 见 http://www.i18nguy.com/unicode/language-identifiers.html 。
Django LANGUAGE_CODE 有两个作用:
- 如果没有设置 locale 中间件,那么这个用于给所有用户提供翻译。适用于只需要一种翻译的情况
- 如果设置了 locale 中间件,那么作为翻译的后备物品,用于没有匹配到语言的情况
LocaleMiddleware 决定用户语言的算法,顺序为 URL 语言前缀、session、cookie、Accept-Language HTTP 头部,最后是 LANGUAGE_CODE[2]。
注意:Django 的 LANGUAGE_CODE 是不区分大小的,但第三方 APP 就不一定了,比如 django-ckeditor 只有在 LANGUAGE_CODE 为 zh-hans 时翻译才会生效,所以它是区分大小写的。
寻找翻译的算法
在运行时,Django 会构建一个在内存中的、统一的文字翻译目录。依次在以下路径中加载信息文件(.mo)以及对同一字符串的翻译优先级如果对统一字符串存在多个翻译:
- LOCALE_PATHS 有最高优先级,在 LOCALE_PATHS 中出现在前面的优先级更高。
- 然后查看 INSTALLED_APPS 中各个 APP 目录下的 locale/,也是在前面的 APP 优先级高
- 最后,
django/conf/locale作为后备
存放翻译文件的目录名为 locale name。在我看来就是将对应的 language code 的 - 替换为 _。比如 language code zh-Hans 的 locale name 为 zh_Hans。这点可以在 Django 自己的翻译中得到验证,比如 env/lib/python3.6/site-packages/django/conf/locale/zh_Hans。
替换虚拟环境中第三方 APP 的翻译
我将第三方 APP 的替代翻译放在 LOCALE_PATHS 中,但只有在 env/ 在和 manage.py 同目录的情况下才能生效。不清楚这样的原因,因为按照上面的算法,LOCALE_PATHS 的优先级是最高的。
目前采用的办法是,fork 该第三方 APP,然后将翻译直接放到第三方 APP 的 locale 中,然后使用 submodule 安装 fork 后的第三方库。
参考
- https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-LANGUAGE_CODE
- https://docs.djangoproject.com/en/2.0/topics/i18n/translation/#how-django-discovers-language-preference
Django 翻译与 LANGUAGE_CODE的更多相关文章
- 《Django By Example》第九章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag 注:哈哈哈,第九章终于来啦 ...
- [python][django学习篇][4]django完成数据库代码翻译:迁移数据库(migration)
上一篇我们已经完成数据库的设计,但是仅仅是python语言,并没有真正创建了数据库表.翻译成数据库语言,真正创建数据库表由django manage.py来实现,这一过程专业术语:迁移数据库 切换到m ...
- 让django完成翻译,迁移数据库模型
声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 上篇我们完成了数据库模型的代码,但是还只 ...
- Python攻关之Django(一)
课程简介: Django流程介绍 Django url Django view Django models Django template Django form Django admin (后台数据 ...
- python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作
django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...
- Django 基础(一)
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能 ...
- django中的filter详解
filter (数据过滤) 我们很少会一次性从数据库中取出所有的数据:通常都只针对一部分数据进行操作. 在Django API中,我们可以使用`` filter()`` 方法对数据进行过滤: > ...
- Python之路,Day14 - It's time for Django
Python之路,Day14 - It's time for Django 本节内容 Django流程介绍 Django url Django view Django models Django ...
- django模型——数据库(二)
模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...
随机推荐
- [svc]salt-jinja模版
实现不同机器的差异化配置 把apache监听的端口统一改为8080 把配置文件files/httpd.conf 文件做成模版 修改lamp.sls改模版变量赋值 执行看结果: ok come on. ...
- action(四)
void ActionDelayTime::onEnter() { ActionsDemo::onEnter(); alignSpritesLeft(); CCActionInterval* move ...
- JACKSON JSON 操作帮助类
一. 引入POM <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-li ...
- layoutSubviews什么时候触发调用
ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size - (void)sizeToFit ——————- - (void)layoutSubview ...
- GDB和WinDbg中调用函数
GDB: 特别简单,直接写调用式子即可,如下图的p word.c_str(),其中word的类型是std::string WinDbg:目前都说是.call命令,说实话我宁愿不用...见: http: ...
- android 批量上传图片
额外还需要NetUtil和服务器端UpLoadPicture package com.example.girdviewtest; import java.util.ArrayList;import j ...
- Linux动态库开发
http://blog.csdn.net/qq_33850438/article/details/52014399 ### 导出符号------------------------------ 默认所 ...
- JSF request参数传递
转载自:http://blog.csdn.net/duankaige/article/details/6711044 1:JSF页面之间传参 方法1: <h:outputLink value=& ...
- C#如何调用其他.config配置文件,就是2个乃至3个以上的config文件
XmlDocument xDoc = new XmlDocument(); try { xDoc.Load(配置文件路径); XmlNode xNode; XmlElement xElem; xNod ...
- 【Hadoop】HA 场景下访问 HDFS JAVA API Client
客户端需要指定ns名称,节点配置,ConfiguredFailoverProxyProvider等信息. 代码示例: package cn.itacst.hadoop.hdfs; import jav ...