不同的网站有可能被不同国家地区的人访问,为了让不同的国家或者地区的人有更好的客户体验,对web程序进行国际化设置就很有必要了。
1.Django进行国际化的机制
以下是我的目录树:
我这里创建了一个internationlization的项目,然后在项目下面创建了一个被称为translation的应用程序。我们要进行国际化,首先要通过django.utils.translation包里面的方法定义需要进行国际化的字符串,比如我用的是ugettext_lazy ,通过函数包装并返回可供国际化使用的字符。然后需要在translation目录下面增加一个locale目录,一定要手动创建这个目录不然后面的编译不能通过。
可以在models.py, view.py 甚至再模板处定义翻译字符串,以下是我的models.py的内容。(这里运用了as语句进行了别名定义)
然后在translation目录下运行命令
django-admin makemessages -l zh_CN
生成翻译字典(django.po文件),我上面一句话表示创建一个中文的语言库(zh_CN)。文件内容如下。我的model定义的国际化字符串有 "name" "my thing" "my things" "This is the help text"
现在查看django.po文件
只需要再msgstr中加入对应的翻译内容。保存即可。
最后回到translation目录,运行
django-admin compilemessages
就会在translation/locale/zh_CN/LC_MESSAGES/目录下生成一个*.mo文件,这个是已经编译好的文件,现在测试一下,我的浏览器语言默认为zh_CN的,所以当我进入admin界面后。
之前设置的‘name‘, ‘This is a help text‘等都自动翻译成中文了。这就是国际化的基本流程。
通过用内置函数ugettext_lazy之类的函数定义需要进行国际化的字符串,几乎都在django.utils.translation包里,通过在程序所在的目录下新建locale目录,通过makemessage生成相应的数据字典文件(如django.py),最后通过compilemessage进行编译,生成*.mo文件,会根据浏览器不同的语言设定显示不同的语言,实现程序国际化。
2.模板定制
除了进行model.py view.py 等python源文件进行国际化定制之外还可以通过在模板上进行相应的设置进行国际化设置。比较基本的有两个标签。
从一开始的截图可以知道,我们一般会把模板放在项目根目录下创建的templates然后通过settings.py设置模板路径。进行模板搜索。这里不详细说,对于要进行国际化定制的模板,首先需要在模板最上方加入{% i18n %}表示要加入国际化定制的标签。
然后对需要进行定制的字符串采用{% trans "XXXXX" %} 进行最为基本的定制。另外还可以通过 {% blocktrans %}XXXXXX {% endblocktrans %}标签进行定制,两者之间的不同的地方是,后者可以在定义的字符串中引入变量,作为占位,显示的时候再引入变量的值。
接下来的做法跟前面一样,不过这次需要在项目的根目录下进行相应的操作,1.创建locale 目录,2.po文件生成3编译。
其实有了这一步,可以把之前的在translation目录里面的国际化操作给省去,我测试过,如果之前已经对应用程序进行国际化操作的话,这里生成的po文件将不会包含在之前在应用程序里面定义的字符串。其实可以把之前的locale目录删掉,在这里一步进行所有定制。不过如果考虑到分开维护要好一点,也可以分开进行字典的维护,个人喜好吧。
不过这里有一个问题:
进行了一系列操作之后,在根目录templates文件夹的国际化失败(无法翻译),对应的文件读不到。这个时候需要在settings.py中加入这么一句代码。
表示要加载locale目录然后。。。。。。就可以了。
下面是我根据IBM 的一个文档例子作为测试的结果 链接如下
http://www.ibm.com/developerworks/cn/web/1101_jinjh_djangoi18n/
根据下拉框选择的语言进行翻译。
完。。。