注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

郁夫的博客

我爱你们,只是你们不知道!

 
 
 

日志

 
 
 
 

Django 国际化实现速记 1.3 1.4  

2012-10-25 20:09:02|  分类: Django |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
view部分
标识需要翻译的字符串
View中 导入模块
from django.utils.translation import ugettext as _ 
标识需翻译字符_()
def my_view(request):     output = _("Welcome to my site.")     return HttpResponse(output) 
标识无需翻译的字符, 比如要从数据库中取的字符
django.utils.translation.ugettext_noop()

根据单复数生成不同的翻译
比如英语中一个人要用 is , 两个人要用are

上下文标识翻译
django 1.3后引入
用于有时候一个单词根据上下文有不同含义时, 例如英语中的 May

from django.utils.translation import pgettext month = pgettext("month name", "May") 
month name 为上下文参数, 放在第一位
po文件里将出现的是
sgctxt "month name" msgid "May" msgstr ""
惰性翻译  Lazy translation
django.utils.translation.ugettext_lazy()
主要适用于Model中,对于字段名称的翻译在使用到时再翻译
比如在模板中引用到字段名称的翻译,如不用ugettext_lazy()则其在
模板中不会被翻译.
from django.utils.translation import ugettext_lazy class MyThing(models.Model):     name = models.CharField(help_text=ugettext_lazy('This is the help text')) 
惰性翻译用于普通字符串时
from django.utils.translation import string_concat ... name = ugettext_lazy(u'John Lennon') instrument = ugettext_lazy(u'guitar') result = string_concat(name, ': ', instrument) 
上面的用法只有用到应用中用到result时,字符才会被翻译.
get_language_info()
返回语言的详细信息
>>> from django.utils.translation import get_language_info >>> li = get_language_info('de') >>> print li['name'], li['name_local'], li['bidi'] German Deutsch False 

模板部分
模板中翻译用 trans标签
<title>{% trans "This is the title." %}</title> <title>{% trans myvar %}</title> 
与之对应的是blocktrans 标签, 阻止翻译保持原样
其他标签
每个RequestContext对象可以访问与翻译有关的3个特定变量
LANGUAGES 一个元组,第一个元素是语言代码,第二个是语言名称
LANGUAGE_CODE 现在用户选择的语言,是一个字符串,如 en-us
LANGUAGE_BIDI  现在本地化语言的书写方向,True是从右往左写,False是从左往右写
如果不使用RequestContext扩展的话也可以使用下面的三个标签获得这些值
{% get_current_language as LANGUAGE_CODE %} {% get_available_languages as LANGUAGES %} {% get_current_language_bidi as LANGUAGE_BIDI %} 
需要在{% load i18n %}后使用
_() 在模板标签中也是起作用的,如
{% some_special_tag _("Page not found") value|yesno:_("yes,no") %} 

{% get_language_info %} 标签获得语言信息
django 1.3后引入
{% get_language_info_list %}标签可以获得一个语言列表,例如在语言列表中激活指定语言
例如
{% get_language_info_list for available_languages as langs %} {% for lang in langs %} ... {% endfor %} 
可以取得一个可用的语言列表
访问取得的信息
Language code: {{ lang.code }}<br /> Name of language: {{ lang.name_local }}<br /> Name in English: {{ lang.name }}<br /> Bi-directional: {{ lang.bidi }} 
在javascript中翻译
javascript中的解决方案主要是靠django.views.i18n.javascript_catalog() 视图解决。
设置语言转向的视图
django.views.i18n.set_language() 视图可以将语言转向
可以在urls中添加如下行,激活此视图
(r'^i18n/', include('django.conf.urls.i18n')),
用户模板中可以这样提交语言选择
<form action="/i18n/setlang/" method="post"> {% csrf_token %} <input name="next" type="hidden" value="{{ redirect_to }}" /> <select name="language"> {% get_language_info_list for LANGUAGES as languages %} {% for language in languages %} <option value="{{ language.code }}">{{ language.name_local }} ({{ language.code }})</option> {% endfor %} </select> <input type="submit" value="Go" /> </form> 
至此就完成了应用的国际化过程。
============================================================================================
Django 1.4 中的变化
Django 1.4在 url 模式中会为当前激活的语言自动增加前缀, 如
from django.conf.urls import patterns, include, url from django.conf.urls.i18n import i18n_patterns  urlpatterns = patterns(''     url(r'^sitemap\.xml$', 'sitemap.view', name='sitemap_xml'), )  news_patterns = patterns(''     url(r'^$', 'news.views.index', name='index'),     url(r'^category/(?P<slug>[\w-]+)/$', 'news.views.category', name='category'),     url(r'^(?P<slug>[\w-]+)/$', 'news.views.details', name='detail'), )  urlpatterns += i18n_patterns('',     url(r'^about/$', 'about.view', name='about'),     url(r'^news/$', include(news_patterns, namespace='news')), 
 
urlpatterns += i18n_patterns中的url将会被自动加上前缀
如当前语言是日语ja,则 'about/ '会变成'ja/about/'
在url中增加  (r'^i18n/', include('django.conf.urls.i18n')),
其位置不能位于i18n_patterns中, 我就因为放在i18n_patterns中导致切换语言无反映,
其他和1.3种类似.

  评论这张
 
阅读(981)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017