默认情况下 Flask-Babel 会读取 flask.g.lang 自动切换当前请求上下文使用的语言区域。但在很多应用场景下我们需要手工改变当前的区域语言,这种情况下我们就需要增加一个 get_local() 函数:
from flask import g, request @babel.localeselector def get_locale(): # 如果在g对象内有登入的用户对象则从用户对象中读取 locale 区域信息 user = getattr(g, 'user', None) if user is not None: return user.locale # 此方法只需要返会一个区域字符串 return request.accept_languages.best_match(['de', 'fr', 'en']) @babel.timezoneselector def get_timezone(): """此函数与 get_locale 类似,只是向babel提供获取时区的设置""" user = getattr(g, 'user', None) if user is not None: return user.timezone当提供这两个函数之后,在调用 gettext 时 Babel 会自动调用他们。这里是通过装饰器 @babel.localeselector 和 @babel.timezoneselector 实现类似重写的功能,但这个写法代码量会比重写类更少。
小结当然,Babel 提供的API不止本文中的这几个,如果需要更详细地了解可以仔细地阅读 Flask-Babel 的文档。在这里我旨在记录 Babel 的最常规的用法以作备忘同时也分享给更多正在使用Flask的友人们。
posted @