实时语言切换
问题:
如何实现实时语言切换?
解法:
- 首先你必须阅读?模板语言中的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:', lang session['lang'] = lang return render.index()if __name__ == "__main__": app.run()
模板文件: templates/index.
$_('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()的?另一个方案。