我正在开发一个 Flask 项目,并使用 Flask-Babel 4.0 来支持多语言。尽管我已经按照文档设置了所有内容并且没有错误,但翻译不起作用 - 每个页面都默认为英语。我已经生成了 .mo 文件,并且 get_locale() 似乎正在根据 URL 段获取正确的区域设置。
这是我的设置的简化版本:
# Babel configuration in Flask
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
app.config['BABEL_TRANSLATION_DIRECTORIES'] = './translations'
def get_locale():
default_language = 'en'
supported_languages = ['en', 'zh', 'es', 'fr']
segments = request.path.split('/')
if segments and segments[1] in supported_languages:
g.locale = segments[1]
return segments[1]
g.locale = default_language
return 'en'
babel = Babel(app)
babel.init_app(app, locale_selector=get_locale)
@main.route('/')
@main.route('/<lang_code>/')
def index(lang_code='en'):
# Query some data, omitted for brevity
return render_template('index.html')
HTML 模板的开头是这样的:
<!DOCTYPE html>
<html lang="{{ get_locale() }}">
<head>
<!-- Head contents -->
</head>
<body>
{{ _('Generate') }}
</body>
</html>
到目前为止我检查过的内容:
.mo 文件存在于正确的目录中并且看起来是正确的。 get_locale() 函数从 URL 段中检索正确的区域设置。 尽管进行了这些配置,每个页面仍然仅显示英文内容。 Flask-Babel 设置或 Flask 处理这些配置的方式中是否有我遗漏的东西?
任何建议或见解将不胜感激!
您的设置看起来基本正确,但在模板中如何使用
get_locale()
函数可能存在一个小问题。您应该使用 babel.locale_selector
为每个请求显式设置区域设置,而不是直接在 HTML 模板中调用该函数。
以下是修改设置的方法:
from flask import Flask, render_template, request, g
from flask_babel import Babel, gettext
app = Flask(__name__)
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
app.config['BABEL_TRANSLATION_DIRECTORIES'] = './translations'
def get_locale():
default_language = 'en'
supported_languages = ['en', 'zh', 'es', 'fr']
segments = request.path.split('/')
if segments and segments[1] in supported_languages:
return segments[1]
return default_language
babel = Babel(app)
babel.init_app(app)
@babel.localeselector
def locale_selector():
return get_locale()
@app.route('/')
@app.route('/<lang_code>/')
def index(lang_code=None):
# Query some data, omitted for brevity
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
在 HTML 模板中,您可以简单地使用
gettext
函数来标记可翻译字符串:
<!DOCTYPE html>
<html lang="{{ g.locale }}">
<head>
<!-- Head contents -->
</head>
<body>
{{ gettext('Generate') }}
</body>
</html>
确保您的翻译已在
./translations
目录中正确设置,并且文件名应采用 messages.<locale>.po
和 messages.<locale>.mo
格式。另外,请确保每种语言的翻译正确编译到 .mo
文件中。
通过这些修改,您的 Flask-Babel 设置应该可以正常工作,并且您应该看到基于所选语言环境的翻译。如果您仍然遇到问题,请仔细检查您的翻译和文件路径,以确保所有内容都设置正确。