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 "你好,世界!"
相关推荐
打工仔折腾 AI24 分钟前
把 AI Agent 托管到家里电脑:UU远程端口映射与CLI实测记录
人工智能·后端·python·langchain·电脑·ai agent 实战
vx_Biye_Design28 分钟前
springboot一站式旅游管理平台81037-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·课程设计·express·旅游
嵌入式学习菌37 分钟前
ESP32 ModbusTCP 分片缓存
java·后端·spring
程序员小杰@44 分钟前
Spring Boot 常用注解分类速记
java·spring boot·后端
挖掘狂人1 小时前
Git 从 0 到 1:用一个小项目走完 add / commit / reset / merge / rebase / push
git·后端·github
vx_Biye_Design1 小时前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计
打工仔折腾 AI1 小时前
用UU远程把家里电脑变成AI Agent常驻服务器:CLI、端口映射与代理实测
运维·服务器·人工智能·后端·python·电脑·ai agent 实战
明月_清风1 小时前
AI Agent 进入系统层:现在有哪些开源项目在解决这个问题?
人工智能·后端
弈栈录2 小时前
MySQL 事务、索引与锁:后端开发必须掌握的数据库基础
数据库·后端
明月_清风2 小时前
AI Agent 最大的问题,可能不是智商,而是“权限”
人工智能·后端