FastAPI 实现国际化(i18n)和多语言支持的完整方案

一、整体思路

实现多语言支持的核心流程其实很简单:

  1. 识别用户语言 ------ 从 Accept-Language header 或 URL 参数中获取;
  2. 加载对应语言的翻译文件 (.po / .mo);
  3. 在代码中动态翻译文本。

简单来说,就是让接口返回不同语言的内容。

二、安装依赖

我们主要用到 Babel 来提取和编译翻译文件:

复制代码
pip install Babel

三、项目结构

建议的目录结构如下:

bash 复制代码
app/
 ├─ main.py
 ├─ i18n/
 │   ├─ locales/
 │   │   ├─ en/LC_MESSAGES/messages.po
 │   │   └─ zh_CN/LC_MESSAGES/messages.po
 │   └─ babel.cfg

babel.cfg 文件内容如下:

ini 复制代码
[python: **.py]
encoding = utf-8

四、编写中间件自动切换语言

我们可以编写一个中间件,在请求到来时自动根据 Accept-Language 选择语言环境:

python 复制代码
from fastapi import FastAPI, Request
from starlette.middleware.base import BaseHTTPMiddleware
import gettext

class I18nMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next):
        lang = request.headers.get("Accept-Language", "en").split(",")[0]
        try:
            translation = gettext.translation(
                domain="messages",
                localedir="app/i18n/locales",
                languages=[lang],
            )
            translation.install()
            request.state._ = translation.gettext
        except FileNotFoundError:
            gettext.install("messages", localedir="app/i18n/locales")
            request.state._ = gettext.gettext
        return await call_next(request)

app = FastAPI()
app.add_middleware(I18nMiddleware)

@app.get("/")
async def read_root(request: Request):
    _ = request.state._
    return {"message": _("Hello, world!")}

上面的中间件会自动根据请求头里的语言加载对应翻译文件,比如:

arduino 复制代码
curl -H "Accept-Language: zh_CN" http://127.0.0.1:8000/

就会返回中文翻译。


五、提取和编译翻译文件

接下来生成翻译模板并创建不同语言的 .po 文件。

bash 复制代码
# 提取字符串
pybabel extract -F app/i18n/babel.cfg -o app/i18n/messages.pot app

# 初始化中文翻译
pybabel init -i app/i18n/messages.pot -d app/i18n/locales -l zh_CN

# 编辑 po 文件后编译
pybabel compile -d app/i18n/locales

编辑 messages.po 时,只需要翻译字符串,例如:

arduino 复制代码
msgid "Hello, world!"
msgstr "你好,世界!"
相关推荐
特立独行的猫A6 小时前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python
码事漫谈9 小时前
我花了一周时间,看AI公司怎么"管"AI,结果越看越后背发凉
后端
爱学习的程序媛11 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
GISer_Jing11 小时前
Agent核心内容
后端·ai·langchain
budingxiaomoli13 小时前
Spring统一功能处理
java·后端·spring
某鹏13 小时前
网关选型:Go、Java、Graal 谁都不能完胜
后端
用户02478365309714 小时前
从屎山到防线:14 行状态迁移表,给任务系统装上防瞎跳闸门
后端
CQU_JIAKE14 小时前
11.13[体系结构】指标,五级流水线,八级流水线,虚实地址思考
后端
panbook16 小时前
从0到1实现一个分布式时序数据库(三):主从复制、故障检测与切换
后端
上线再说16 小时前
图片从 8.2MB 压到 296KB:我把小程序图片链路的账单拆了一遍
后端