使用Flask应用工厂模式时Flask-Babel无法翻译文本
Flask工厂模式下Flask-Babel翻译失效的解决方案
我在Flask应用工厂模式中使用Flask-Babel时遇到问题:非工厂模式下翻译正常工作,但切换到工厂模式后,gettext或_函数无法翻译文本。我已经硬编码了默认语言,且无报错信息,代码结构如下:
我的代码结构
application/__init__.py
from flask import Flask from flask_babel import Babel, gettext from application.webapp import server_bp babel = Babel() def create_app(config_filename=None): app = Flask(__name__) babel.init_app(app, "de") app.register_blueprint(server_bp) return app
application/webapp.py
from flask import Blueprint from flask_babel import gettext server_bp = Blueprint("main", __name__) @server_bp.route("/") def hello_world(): return gettext("Title of Dash App")
wsgi.py
from application import create_app app = create_app() if __name__ == "__main__": app.run(host="0.0.0.0", port=5004)
问题原因与解决步骤
1. 修正翻译文件路径配置
工厂模式下,Flask应用的root_path为application包的目录,Flask-Babel默认会在app.root_path/translations下查找翻译文件。如果你的translations目录和application平级(项目根目录下),需要手动指定路径:
修改create_app函数,添加翻译目录配置:
def create_app(config_filename=None): app = Flask(__name__) # 根据实际路径调整,比如translations在项目根目录则用"../translations" app.config['BABEL_TRANSLATION_DIRECTORIES'] = '../translations' # 明确指定默认语言,避免参数位置歧义 babel.init_app(app, default_locale="de") app.register_blueprint(server_bp) return app
2. 确保gettext关联正确的babel实例
在蓝图中,直接导入flask_babel.gettext可能因上下文绑定问题失效,改为导入我们在__init__.py中创建的babel实例的gettext:
修改webapp.py:
from flask import Blueprint from application import babel server_bp = Blueprint("main", __name__) @server_bp.route("/") def hello_world(): return babel.gettext("Title of Dash App")
3. 验证翻译文件已编译
确保你已执行编译命令生成.mo文件:
pybabel compile -d translations
完成以上步骤后,重启应用即可看到翻译生效。
内容的提问来源于stack exchange,提问作者Tom Simpson
相关产品推荐
相关产品推荐

