标记文本以在 Python 源代码中执行翻译
好吧,坏消息来了。 支持多语言的常规流程是在源代码中标记所有需要翻译的文本。 文本标记后,Flask-Babel 将扫描所有文件,并使用 gettext 工具将这些文本提取到单独的翻译文件中。 不幸的是,这是一个繁琐的任务,并且是启用翻译的必要条件。
我将在这里向你展示标记操作的几个示例,你也可以从 下载包 获取本章完整的更改集,当然,也可以直接查看 GitHub 的页面。
为翻译而标记文本的方式是将它们封装在一个函数调用中,该函数调用为 _()
,仅仅是一个下划线。最简单的情况是源代码中出现的字符串。下面是一个 flask()
语句的例子:
from flask_babel import _
# ...
flash(_('Your post is now live!'))
_()
函数用于原始语言文本(在这种情况下是英文)的封装。 该函数将使用由 localeselector
装饰器装饰的选择函数,来为给定客户端查找正确的翻译语言。 _()
函数随后返回翻译后的文本,在本处,翻译后的文本将成为 flash()
的参数。
但是不可能每个情况都这么简单,试想如下的另一个 flash()
调用:
flash('User {} not found.'.format(username))
该文本具有一个安插在静态文本中间的动态组件。 _()
函数的语法支持这种类型的文本,但它基于旧版本的字符串替换语法:
flash(_('User %(username)s not found.', username=username))
还有更难处理的情况。 有些字符串文字并非是在发生请求时分配的,比如在应用启动时。因此在评估这些文本时,无法知道要使用哪种语言。 一个例子是与表单字段相关的标签,处理这些文本的唯一解决方案是找到一种方法来延迟对字符串的评估,直到它被使用,比如有实际上的请求发生了。 Flask-Babel 提供了一个称为 lazy_gettext()
的 _()
函数的 延迟评估 的版本:
from flask_babel import lazy_gettext as _l
class LoginForm(FlaskForm):
username = StringField(_l('Username'), validators=[DataRequired()])
# ...
在这里,我正在导入的这个翻译函数被重命名为 _l()
,以使其看起来与原始的 _()
相似。 这个新函数将文本包装在一个特殊的对象中,这个对象会在稍后的字符串使用时触发翻译。
Flask-Login 插件只要将用户重定向到登录页面,就会闪现消息。 此消息为英文,来自插件本身。 为了确保这个消息也能被翻译,我将重写默认消息,并用 _l()
函数进行延迟处理:
login = LoginManager(app)
login.login_view = 'login'
login.login_message = _l('Please log in to access this page.')
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论