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 后的第三方库。

参考

  1. https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-LANGUAGE_CODE
  2. https://docs.djangoproject.com/en/2.0/topics/i18n/translation/#how-django-discovers-language-preference

Django 翻译与 LANGUAGE_CODE的更多相关文章

  1. 《Django By Example》第九章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag 注:哈哈哈,第九章终于来啦 ...

  2. [python][django学习篇][4]django完成数据库代码翻译:迁移数据库(migration)

    上一篇我们已经完成数据库的设计,但是仅仅是python语言,并没有真正创建了数据库表.翻译成数据库语言,真正创建数据库表由django manage.py来实现,这一过程专业术语:迁移数据库 切换到m ...

  3. 让django完成翻译,迁移数据库模型

    声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 上篇我们完成了数据库模型的代码,但是还只 ...

  4. Python攻关之Django(一)

    课程简介: Django流程介绍 Django url Django view Django models Django template Django form Django admin (后台数据 ...

  5. python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作

    django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...

  6. Django 基础(一)

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能 ...

  7. django中的filter详解

    filter (数据过滤) 我们很少会一次性从数据库中取出所有的数据:通常都只针对一部分数据进行操作. 在Django API中,我们可以使用`` filter()`` 方法对数据进行过滤: > ...

  8. Python之路,Day14 - It's time for Django

    Python之路,Day14 - It's time for Django   本节内容 Django流程介绍 Django url Django view Django models Django ...

  9. django模型——数据库(二)

    模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...

随机推荐

  1. OS开发UI篇—UIWindow简单介绍

    一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控 ...

  2. 在eclipse上Checkstyle的安装和使用

    1. 概述 随着中心的代码规范的建立和实施,项目组对代码规范要求,以及软件工程师们对自身代码的编写规范重要性的认知,“代码规范”已经成为了中心的一个“热词”.然后怎么才能写出有规范的代码,怎么才能养成 ...

  3. oracle中select clob的返回类型

    当select的字段是clob类型的数据时,但是数据长度在2000字节到4000字节时,默认转为long类型. 所以当用insert into select的时候,预期插入的是clob类型,但是报or ...

  4. java常用操作

    1.properties文件中文转换 在cmd中进入到文件所在目录执行(其他操作请见命令帮助):native2ascii -reverse  messages_zh_CN.properties b.t ...

  5. qt 多点触摸

    http://www.ptrackapp.com/apclassys-notes/embedded-linux-multitouch/ Embedded Linux Multitouch with Q ...

  6. 文件模式设置用户ID/设置组ID/sticky bit_转

    S_ISUID  (04000)  set-user-ID (set process effective user ID on execve(2))S_ISGID  (02000)  set-grou ...

  7. kafka_2.11-0.10.2.1中的auto.offset.reset

    在使用spark连接kafka消费topic时,发现无论怎么设置,也无法从头开始消费. 查看配置得出auto.offset.reset的以下3种设置及含义: earliest 当各分区下有已提交的of ...

  8. 查看cpu 个数, 内存信息

    查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 查看每个物理CPU中core的个数(即核数) ...

  9. 构造 - SGU 109 Magic of David Copperfield II

    Magic of David Copperfield II Problem's Link Mean: 略 analyse: 若i+j为奇数则称(i,j)为奇格,否则称(i+j)为偶格,显然每一次报数后 ...

  10. 小结:STL

    概要: c++的stl是个神奇的东西,需要好好学习. 技巧及注意: lower_bound是第一个大于等于要查找值 upper_bound是第一个大于要查找的值 stl中的容器中的比较几乎全都用< ...