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等函 ...
随机推荐
- OS开发UI篇—UIWindow简单介绍
一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控 ...
- 在eclipse上Checkstyle的安装和使用
1. 概述 随着中心的代码规范的建立和实施,项目组对代码规范要求,以及软件工程师们对自身代码的编写规范重要性的认知,“代码规范”已经成为了中心的一个“热词”.然后怎么才能写出有规范的代码,怎么才能养成 ...
- oracle中select clob的返回类型
当select的字段是clob类型的数据时,但是数据长度在2000字节到4000字节时,默认转为long类型. 所以当用insert into select的时候,预期插入的是clob类型,但是报or ...
- java常用操作
1.properties文件中文转换 在cmd中进入到文件所在目录执行(其他操作请见命令帮助):native2ascii -reverse messages_zh_CN.properties b.t ...
- qt 多点触摸
http://www.ptrackapp.com/apclassys-notes/embedded-linux-multitouch/ Embedded Linux Multitouch with Q ...
- 文件模式设置用户ID/设置组ID/sticky bit_转
S_ISUID (04000) set-user-ID (set process effective user ID on execve(2))S_ISGID (02000) set-grou ...
- kafka_2.11-0.10.2.1中的auto.offset.reset
在使用spark连接kafka消费topic时,发现无论怎么设置,也无法从头开始消费. 查看配置得出auto.offset.reset的以下3种设置及含义: earliest 当各分区下有已提交的of ...
- 查看cpu 个数, 内存信息
查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 查看每个物理CPU中core的个数(即核数) ...
- 构造 - SGU 109 Magic of David Copperfield II
Magic of David Copperfield II Problem's Link Mean: 略 analyse: 若i+j为奇数则称(i,j)为奇格,否则称(i+j)为偶格,显然每一次报数后 ...
- 小结:STL
概要: c++的stl是个神奇的东西,需要好好学习. 技巧及注意: lower_bound是第一个大于等于要查找值 upper_bound是第一个大于要查找的值 stl中的容器中的比较几乎全都用< ...