Django国际化和本地化
把django的这篇文档看了一遍,基本弄懂了,讲的也挺详细的 https://docs.djangoproject.com/en/1.6/topics/i18n/
首先是国际化和本地化概念:
1,国际化
这是程序员做的工作,在代码中,模板中,做好相应的准备
1.1代码中
使用, ugettext或者ugettext_lazy
from django.utils.translation import ugettext as _
在代码中对需要进行翻译的字符串,通常是英文,使用这个函数
如
result.error = _(u'Invalid Captcha')
然后这个字符串就会被翻译为我们需要的语言, 翻译后的结果还是一个普通的字符串,没什么区别
只是在这里, _(u'Invalid Captcha') 已经不是原来的字符串了,这个函数返回了一个对象. Trans()类对象,具体去看django.utils.translation模块源代码吧
1.2模板中
要注意,代码中翻译的字符串,可能是用来填充模板的,也可能是比如Ajax接口的返回结果.
如果我们要直接翻译模板中的字符串,那么使用django template的这两个tags : trans 和 blocktrans
比如
<title>{% trans 'This is the title' %}</title>
那blocktrans用于, 混合了字符串和变量的翻译.
[注意]在模板中使用了 trans 或 blocktrans时
要在开头加
{% load i18n %}
不然会报错
2, 本地化
本地化是翻译做的工作,把原语言的目标翻译写出来
那首先我们要使用一个工具,在app的根目录或整个工程的根目录,运行
django-admin.py makemessages -l zh_CN
会生成如下的一个文件目录
locale/
├── zh_CN
│ └── LC_MESSAGES
│ ├── django.mo
│ └── django.po
zh_CN指简体中文, 每种语言都有自己的目录,在django中,每个语言都有自己的LANGUAGE_CODE
这时候打开django.po, 内容格式如下
#: views.py:169
msgid "Invalid CAPTCHA"
msgstr "" #: templates/login.html: 15
msgid "This is the title"
msgstr ""
把msgstr填上我们的翻译
然后运行另一个命令
django-admin.py compilemessages
就生成了编译好的django.mo,是个二进制文件,然后就OK了,最终出现的页面就是我们要的中文了
如果我们在代码或模板中增加或删除了相关的国际化代码,需要从新运行
makemessages 和 compilemessages
如果只是改了django.po中的翻译,当然只需 compile 就行了.
重启服务
完成以上之后,需要重启一下django服务
和国际化有关的setting
1,USE_I18N = True/False
有关的代码是这样的,在django.utils.translation的__init__.py中
class Trans(object);
def __getattr__(self, real_name):
from django.conf import settings
if settings.USE_I18N:
from django.utils.translation import trans_real as trans
else:
from django.utils.translation import trans_null as trans
setattr(self, real_name, getattr(trans, real_name))
return getattr(trans, real_name)
而trans_null其实就没做什么事
2,LANGUAGE_CODE
比如中文是
LANGUAGE_CODE = 'zh_cn'
.po 文件中的 fuzzy str translation
有时候, 用makemessages生成的.po文件中有些msgid会被标记为 fuzzy
比如
#: models.py:35
#, fuzzy
msgid "hdapp_leader"
msgstr "领队"
这是因为对于 "hdapp_leader", msgmerge工具认为这个和之前的一个msgid很相似,这个翻译可能不靠谱,于是标记fuzzy; msgfmt就会把这个msgid给略过,也就是这个翻译不会生效,当然如果我们确认是对的, 就手动删掉那行fuzzy,重新compilemessages就好.
------------
下一篇
探讨ugettext和ugettext_lazy的区别
blocktrans
Django国际化和本地化的更多相关文章
- Django 国际化和本地化
所谓的国际化,是指使用不同语言的用户在访问同一个网站页面时能够看到符合其自身语言的文本页面. 国际化的基本原理是: 浏览器通过LANGUAGE_CODE在HTTP请求头中告诉网站后台服务器用户所需要的 ...
- django框架项目 国际化和本地化的实现方法
转自 https://blog.csdn.net/scissors0707/article/details/79042458 Django国际化 所谓的国际化,是指使用不同语言的用户在访问同一个网站页 ...
- 第六章:Django 综合篇 - 18:国际化和本地化
所谓的国际化,是指使用不同语言的用户在访问同一个网站页面时能够看到符合其自身语言的文本页面. 国际化的基本原理是: 浏览器通过LANGUAGE_CODE在HTTP请求头中告诉网站后台服务器用户所需要的 ...
- Orchard 源码探索(Localization)之国际化与本地化
本地化与国际化 基本上相关代码都在在Orchard.Framework.Localization中. T("english")是如何调用到WebViewPage.cs中的Local ...
- .NET:国际化和本地化
.NET:国际化和本地化 背景 国际化(i18n)和本地化(l10n)是高端程序的必备技术,可惜从业五年从没有尝试过,下一步准备做一个多用户的博客系统,想支持多语言,今天就学习了一下,写出来,希望大家 ...
- IOS软件国际化(本地化Localizable)
IOS软件国际化(本地化Localizable) iPhone是支持语言最多的手机,它支持各国语言及中国少数名族如蒙古等语言,这也是好多少数名族都用苹果的原因.在这一点上我们自主品牌还是要多学习学习. ...
- Spring MVC 的国际化和本地化
国际化: i18n 本地化: l10n java.util.Locale 类表示一个语言区域.一个 Locale 对象包含 3 个主要元件:language.country.variant java. ...
- iOS: 设置App的国际化和本地化
原文链接:http://www.cocoachina.com/appstore/20160310/15632.html 前言 App的名字设置方式有很多种,如果在App打包上线时不做修改,最终App的 ...
- 【转】iOS 设置APP的名称(浅述APP版本国际化与本地化)
原文网址:http://www.jianshu.com/p/a3a70f0398c4 前言 App的名字设置方式有很多种,如果在App打包上线时不做修改,最终App的名字就是Xcode在建立工程时的名 ...
随机推荐
- 2018牛客网暑期ACM多校训练营(第二场) A - run - [DP]
题目链接:https://www.nowcoder.com/acm/contest/140/A 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K ...
- Kettle 4.2源码分析第四讲--KettleJob机制与Database插件简介(含讲解PPT)
1. Job机制 一个job项代表ETL控制流中的一项逻辑任务.Job项将会顺序执行,每个job项会产生一个结果,能作为别的分支上job项的条件. 图 1 job项示例 1.1. Job类图简介 图 ...
- HDU - 5651 xiaoxin juju needs help 逆元模板
http://acm.hdu.edu.cn/showproblem.php?pid=5651 题意:生成回文串.输出所有回文串的可能数. 题解:mod除法会损失高位,用逆元来代替除法,模板如下 ac代 ...
- Oracle管理监控之oracle客户端链接服务器配置文档
开始菜单--Oracle - OraClient10g_home1--配置和移植工具--Net Configuration Assistant 打开窗口如下: 选择 本地Net服务名配置 点 下一步 ...
- 洛谷P3953 逛公园 [noip2017] 图论+dp
正解:图论(最短路)+dp(记忆化搜索) 解题报告: 这题真的是个好东西! 做了这题我才发现我的dij一直是错的...但是我以前用dij做的题居然都A了?什么玄学事件啊...我哭了TT 不过其实感觉还 ...
- less语言特性(一) —— 变量
近两年移动市场不断扩大,HTML5也逐渐升温,为了使我们前端工作更有效率,各种框架层出不穷,本章将介绍LESSCSS框架.LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS ...
- SRM 619
easy: 假设每堆石头不全为1,那么每次我们总能取一堆石头分给另外两堆,堆数-1.而且新的局面肯定有一堆的个数大于1. 于是,假设每堆石头数都为1 -> lose.否则的话推断堆数奇偶就可以 ...
- hibernate中cascade和inverse
原文:http://blog.sina.com.cn/s/blog_7b9edd020100racc.html 这两个属性都用于一多对或者多对多的关系中. 而inverse特别是用于双向关系,在单向关 ...
- 包管理 ----- Linux操作系统rpm包安装方式步骤
Linux操作系统rpm包安装方式步骤 2016年08月04日 07:00:26 阅读数:17140 转自 : http://os.51cto.com/art/201003/186467.htm 特别 ...
- VMware coding Challenge:Date of Weekday
这道题再次证明了这种细节的题目,画个图容易搞清楚 import java.util.Scanner; public class Solution2 { static int DateOfWeekday ...