如何让fastapi-babel实现法语外其他语言的网页翻译?
问题:fastapi-babel仅法语翻译生效,其他语言(波斯语fa/日语ja)无法生效
已按照fastapi-babel官方文档完成配置,英语转法语的翻译正常,但波斯语(fa)、日语(ja)的.po文件已创建并编译,翻译却无法生效。
相关代码:
from fastapi_babel import _ from fastapi_babel.middleware import InternationalizationMiddleware as I18nMiddleware from fastapi_babel import Babel from fastapi_babel import BabelConfigs configs = BabelConfigs( ROOT_DIR=__file__, BABEL_DEFAULT_LOCALE="en", BABEL_TRANSLATION_DIRECTORY="lang", ) logger.info(f"configs: {configs.__dict__}") babel = Babel(configs) babel.install_jinja(templates) app.add_middleware(I18nMiddleware, babel=babel) @app.get("/items/{id}", response_class=HTMLResponse) async def read_item(request: Request, id: str): babel.locale = "en" logger.info(_("Hello World")) babel.locale = "fa" logger.info(_("Hello World")) babel.locale = "ja" logger.info(_("Hello World")) return templates.TemplateResponse('item.html', {'request': request, 'id': id})
执行后日志输出:
INFO: Hello World INFO: Bonjour le monde INFO: Hello World
解决方案
1. 检查翻译文件的路径与命名规范
- 必须遵循标准目录结构:
lang/fa/LC_MESSAGES/messages.po、lang/ja/LC_MESSAGES/messages.po,编译后的.mo文件需和.po同目录、同名。 - 语言代码目录需为小写(如
fa、ja),LC_MESSAGES目录名必须全大写。
2. 验证.po文件内容格式
- 确保目标词条存在正确的翻译映射,比如波斯语文件中需有:
日语文件中需有:msgid "Hello World" msgstr "سلام دنیا"msgid "Hello World" msgstr "こんにちは世界" - 检查.po文件头部的
Content-Type字段,需设置charset=UTF-8,避免编码问题导致翻译失效。
3. 确认.mo文件编译正确
- 使用
msgfmt工具编译.po文件,命令示例:msgfmt lang/fa/LC_MESSAGES/messages.po -o lang/fa/LC_MESSAGES/messages.mo msgfmt lang/ja/LC_MESSAGES/messages.po -o lang/ja/LC_MESSAGES/messages.mo - 编译后检查
.mo文件是否生成,且文件大小不为0。
4. 修复代码中的语言切换方式
直接赋值babel.locale可能绕过内部加载逻辑,建议使用官方提供的方法切换语言:
# 替换原赋值语句 babel.set_locale("fa") logger.info(_("Hello World")) babel.set_locale("ja") logger.info(_("Hello World"))
5. 修正翻译目录的绝对路径
ROOT_DIR=__file__可能导致路径计算错误,建议手动指定绝对路径:
import os configs = BabelConfigs( ROOT_DIR=os.path.dirname(os.path.abspath(__file__)), BABEL_DEFAULT_LOCALE="en", BABEL_TRANSLATION_DIRECTORY=os.path.join(os.path.dirname(os.path.abspath(__file__)), "lang"), )
内容的提问来源于stack exchange,提问作者Nori
相关产品推荐
相关产品推荐

