跟着学习(新版):https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiii-i18n-and-l10n
回顾上一章:https://blog.youkuaiyun.com/weixin_41263513/article/details/85108042
本章内容
- Flask-Babel
- 标记要翻译的文本
- 提取要翻译的文本
- 生成语言目录
- 更新翻译
- 翻译日期和时间
- 命令行增强功能
这一章怎么说呢,可能你们不一定会感兴趣,因为我自己看的时候也是不怎么感兴趣的,不过也要适当了解,内容不算难,说不定以后会用上呢!
Flask-Babel
有一个flask扩展能使得翻译变得非常容易,其扩展名为Flask-Babel,别忘了每遇到一个新扩展都要pip install flask-babel
Flask-Babel的初始化就跟其他扩展一样
文件:app/–init–.py
# ...
from flask_babel import Babel
app = Flask(__name__)
# ...
babel = Babel(app)
作为本章的一部分,原作者将会把应用程序翻译成西班牙语,因为我喜欢看动漫蛤蛤。 为了跟踪支持的语言列表,我将添加一个配置变量
文件:/config.py
class Config(object):
# ...
LANGUAGES = ['en', 'es']
我正在为此应用程序使用双字母语言代码,但如果您需要更具体,还可以添加国家/地区代码。 例如,您可以使用en-US,en-GB和en-CA来支持美国,英国和加拿大英语作为不同的语言
Babel实例提供了localeselector装饰器。 为每个请求调用装饰函数,以选择用于该请求的语言翻译
文件:/app/–init–.py
from flask import request
# ...
@babel.localeselector
def get_locale():
return request.accept_languages.best_match(app.config['LANGUAGES'])
这里我使用Flask的请求对象属性accept_languages。此对象提供了一个高级接口,用于处理客户端随请求发送的Accept-Language标头。此标头将客户端语言和区域设置首选项指定为加权列表。可以在浏览器的首选项页面中配置此标题的内容,默认情况下通常从计算机操作系统中的语言设置导入。大多数人甚至不知道存在这样的设置,但这很有用,因为用户可以提供首选语言列表,每个语言都有权重。如果你很好奇,这是一个复杂的Accept-Languages标题的例子:
Accept-Language:da,en-gb; q = 0.8,en; q = 0.7
这表示丹麦语(da)是首选语言(默认权重= 1.0),其次是英国英语(en-GB),权重为0.8,最后一个选项是通用英语(en),权重为0.7。
要选择最佳语言,您需要将客户端请求的语言列表与应用程序支持的语言进行比较,并使用客户端提供的权重,找到最佳语言。执行此操作的逻辑有点复杂,但它全部封装在best_match()方法中,该方法将应用程序提供的语言列表作为参数并返回最佳选择。
标记要翻译的文本
标记文本后,Flask-Babel将扫描所有文件并使用gettext工具将这些文本提取到单独的翻译文件中。 不幸的是,这是一项繁琐的工作,需要进行翻译才能实现。
这一章将展示此标记的一些示例
文本被标记为翻译的方式是将它们包装在一个函数调用中,该函数调用作为约定被称为_(),这只是一个下划线。 最简单的情况是文字字符串出现在源代码中的情况。 以下是一个示例的flash()语句:
from flask_babel import _
# ...
flash(_('Your post is now live!'))
这个想法是_()函数用基本语言包装文本(在本例中很明显看到是英语)。 此函数将使用由localeselector函数修饰的函数选择的最佳语言来查找给定客户端的正确翻译。 然后_()函数返回已翻译的文本,这种情况下,它将成为flash()的参数。
不幸的是,并非所有案例都那么简单,例如应用程序中的其他flash()调用:
flash('User {} not found.'