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 "你好,世界!"
相关推荐
MX_935925 分钟前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
程序员泠零澪回家种桔子1 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
源代码•宸2 小时前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资
晚霞的不甘3 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
喵叔哟3 小时前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
Charlie_lll4 小时前
力扣解题-移动零
后端·算法·leetcode
打工的小王4 小时前
Spring Boot(三)Spring Boot整合SpringMVC
java·spring boot·后端
80530单词突击赢6 小时前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
爬山算法6 小时前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
WeiXiao_Hyy6 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端