You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:50:22