Flask-Babel 4.0 不显示翻译,始终默认英文

问题描述 投票:0回答:1

我正在开发一个 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 处理这些配置的方式中是否有我遗漏的东西?

任何建议或见解将不胜感激!

python flask multilingual flask-babel
1个回答
0
投票

您的设置看起来基本正确,但在模板中如何使用

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 设置应该可以正常工作,并且您应该看到基于所选语言环境的翻译。如果您仍然遇到问题,请仔细检查您的翻译和文件路径,以确保所有内容都设置正确。

© www.soinside.com 2019 - 2024. All rights reserved.