django的settings中设置中文支持的实现

yipeiwu_com6年前Python基础

今天创建了个django工程,用的是目前django 1.9.6,创建工程后,settings.py中设置中文显示支持(最简单的,例如把admin界面的默认英文改成中文),定义

TIME_ZONE = 'Asia/Shanghai'
LANGUAGE_CODE = 'zh-cn'

当然TIME_ZONE只是指定时区,和中文显示没有关系,这里一并修改了默认值。结果运行项目时报错了,如下:

django IOError: No translation files found for default language zh-cn

即找不到zh-cn对应的本地化文件。一般而言,zh-cn编码对应的本地化文件夹为zh_CN,我去django的安装目录查找zh_CN,结果确实没有找到,在django安装目录的contrib子目录下的一系列子目录的locale文件夹中,没有zh_CN,而有zh_Hans。不知道为什么django的这个版本没有zh_CN文件夹,可能是一个bug吧。网上有人说将zh_Hans目录全部复制一份并命名为zh_CN,就可以解决这个问题,我试了下,再次运行确实可行了,在admin界面显示了中文。至于这种比较山寨的方法有没有隐患,现在还不知道,以后遇到再说吧。

不过话说回来,其实还有正统的方式去生成国际化文件,如下命令:

django-admin.py makemessages -l zh_CN

不过这个需要gettext组件,如果你是在windows上开发,那么你需要自己安装这个组件,

http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/下载gettext-runtime-X.zip以及gettext-tools-X.zip的最新版(注:X为版本号)并解压后,将两个bin目录可以合并后放入系统环境变量中。不过该方法我没有验证,感兴趣的可以试试。

后来我又想,django之前的老版本是有zh_CN的,要说这个一个bug,估计也比较低级,按理不应该的。于是又查,发现貌似zh_Hans可能已经替代zh_CN了。Han表示汉字,s表示Simplified简体,反正我设置为LANGUAGE_CODE = 'zh-hans'也是正常显示中文。

zh-cn will expired in Django1.9, the new format is zh-hans, but drf3.1.0 does not support this type of language.

上面的意思是在django1.9中,zh-cn过期了,可以用zh-hans替代,不过可能有些django的第三方模块还没有跟上这个变化。

总之,仁者见仁智者见智了,其实大可不必如此研究,只是突然对这个比较感兴趣所以多研究了一会。

ps:网上很多地方对于LANGUAGE_CODE = 'zh-cn'有各种不同写法,包括zh_CN,zh-CN等,有的人还说只能用某某写法等,反正我是没看出来区别,我也都试了,都没发现问题。

另外说个题外话,之前一直都不知道settings.py中的USE_I18N和USE_L10N是什么意思,直到看到了下面的一段话:

当 Web 服务搭建好以后,可以接收来自全球不同国家用户访问。这样就要求开发人员调整软件,使之能适用于不同的语言,即国际化和本地化。国际化

-- Internationalization,i 和 n 之间有 18 个字母,简称 I18N,。本地化 -- localization, l 和 n 之间有 10 个字母,简称 L10N。国际化意味着 Web

产品有适用于任何地方的潜力,针对程序开发人员;本地化则是指使一个国际化的程序为了在某个特定地区使用而进行实际翻译的过程,针对翻译人员而言。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

Pytorch 之修改Tensor部分值方式

一:背景引入 对于一张图片,怎样修改局部像素值? 二:利用Tensor方法 比如输入全零tensor,可认为为黑色图片 >>> n=torch.FloatT...

python基于右递归解决八皇后问题的方法

本文实例讲述了python基于右递归解决八皇后问题的方法。分享给大家供大家参考。具体分析如下: 凡是线性回溯都可以归结为右递归的形式,也即是二叉树,因此对于只要求一个解的问题,采用右递归...

彻底理解Python list切片原理

关于list的insert函数 list#insert(ind,value)在ind元素前面插入value 首先对ind进行预处理:如果ind<0,则ind+=len(a),这样...

python 实现将字典dict、列表list中的中文正常显示方法

在代码文件中定义中文时,经常会遇到问题,要么编码错误,要么是无法正常打印显示。 例如,dict_chinese.py: #!/usr/bin/python a={'name': 'f...

Python自定义一个异常类的方法

Python自定义一个异常类的方法

如何实现自定义一个异常 python内置了许多异常类,为编写代码划定红线,才使调试代码时能及时发现错误。那么我们编写一个模块也可以为使用此模块者划定红线,来约束使用者可用哪些数据,这就需...