- 实时语言切换
- 问题:
- 解法:
实时语言切换
问题:
如何实现实时语言切换?
解法:
- 首先你必须阅读 模板语言中的i18n支持, 然后尝试下面的代码。文件: code.py
import osimport sysimport gettextimport web# File location directory.rootdir = os.path.abspath(os.path.dirname(__file__))# i18n directory.localedir = rootdir + '/i18n'# Object used to store all translations.allTranslations = web.storage()def get_translations(lang='en_US'):# Init translation.if allTranslations.has_key(lang):translation = allTranslations[lang]elif lang is None:translation = gettext.NullTranslations()else:try:translation = gettext.translation('messages',localedir,languages=[lang],)except IOError:translation = gettext.NullTranslations()return translationdef load_translations(lang):"""Return the translations for the locale."""lang = str(lang)translation = allTranslations.get(lang)if translation is None:translation = get_translations(lang)allTranslations[lang] = translation# Delete unused translations.for lk in allTranslations.keys():if lk != lang:del allTranslations[lk]return translationdef custom_gettext(string):"""Translate a given string to the language of the application."""translation = load_translations(session.get('lang'))if translation is None:return unicode(string)return translation.ugettext(string)urls = ('/', 'index')render = web.template.render('templates/',globals={'_': custom_gettext,})app = web.application(urls, globals())# Init session.session = web.session.Session(app,web.session.DiskStore('sessions'),initializer={'lang': 'en_US',})class index:def GET(self):i = web.input()lang = i.get('lang', 'en_US')# Debug.print >> sys.stderr, 'Language:', langsession['lang'] = langreturn render.index()if __name__ == "__main__": app.run()
模板文件: templates/index.html.
$_('Hello')
不要忘记生成必要的po&mo语言文件。参考: 模板语言中的i18n支持
现在运行code.py:
$ python code.pyhttp://0.0.0.0:8080/
然后用你喜欢的浏览器访问下面的地址,检查语言是否改变:
http://your_server:8080/http://your_server:8080/?lang=en_UShttp://your_server:8080/?lang=zh_CN
你必须:
- 确保语言文件(en_US、zh_CN等)可以动态改变。
确保custom_gettext()调用越省资源越好。参考:
这里有使用app.app_processor()的 另一个方案。
