使用pydantic-i18n将fastapi的接口返回消息翻译成中文

article/2025/7/2 14:59:12

使用fastapi时,发现接口报错的结果是英文的,自己的英语水平不太行,就想能不能翻译成中文,发现果然有办法。

先看结果:

实现方法:

参考链接pydantic-i18n · PyPI

首先执行如下代码获取原有的英文翻译字典

from pydantic_i18n import PydanticI18nprint(PydanticI18n.get_pydantic_messages())

之后找个大模型帮忙翻译一下:

pydantic的版本不一样所以这个不能直接用我的代码,必须自己翻译一遍

首先新建一个tr.py文件

# @file    : tr
# @time    : 2025/5/30
# @author  : yongpeng.yao
# @desc    :import re
from typing import Dict, Patternfrom fastapi import Request
from fastapi.exceptions import RequestValidationError
from pydantic_i18n import PydanticI18n
from starlette.responses import JSONResponse
from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY__all__ = ["get_locale", "validation_exception_handler"]DEFAULT_LOCALE = "zh_CN"translations = {"en_US": {"Field required": "field required",},"zh_CN": {"Object has no attribute '{}'": "对象没有属性 '{}'","Invalid JSON: {}": "无效的JSON数据: {}","JSON input should be string, bytes or bytearray": "JSON输入应为字符串、字节或字节数组","Cannot check `{}` when validating from json, use a JsonOrPython validator instead": "从json验证时无法检查`{}`,请改用JsonOrPython验证器","Recursion error - cyclic reference detected": "递归错误-检测到循环引用","Field required": "字段必填","Field is frozen": "字段已被冻结","Instance is frozen": "实例已被冻结","Extra inputs are not permitted": "不允许额外的输入","Keys should be strings": "键名应为字符串","Error extracting attribute: {}": "提取属性时出错: {}","Input should be a valid dictionary or instance of {}": "输入应为有效的字典或{}的实例","Input should be a valid dictionary or object to extract fields from": "输入应为有效的字典或可提取字段的对象","Input should be a dictionary or an instance of {}": "输入应为字典或{}的实例","Input should be an instance of {}": "输入应为{}的实例","Input should be None": "输入应为None","Input should be greater than {}": "输入应大于{}","Input should be greater than or equal to {}": "输入应大于等于{}","Input should be less than {}": "输入应小于{}","Input should be less than or equal to {}": "输入应小于等于{}","Input should be a multiple of {}": "输入应为{}的倍数","Input should be a finite number": "输入应为有限数字","Input should be iterable": "输入应为可迭代对象","Error iterating over object, error: {}": "迭代对象时出错: {}","Input should be a valid string": "输入应为有效的字符串","Input should be a string, not an instance of a subclass of str": "输入应为字符串,而不是str子类的实例","Input should be a valid string, unable to parse raw data as a unicode string": "输入应为有效的字符串,无法将原始数据解析为unicode字符串","String should have at least {}": "字符串长度至少为{}","String should have at most {}": "字符串长度最多为{}","String should match pattern '{}'": "字符串应匹配模式'{}'","Input should be {}": "输入应为{}","Input should be a valid dictionary": "输入应为有效的字典","Input should be a valid mapping, error: {}": "输入应为有效的映射,错误: {}","Input should be a valid list": "输入应为有效的列表","Input should be a valid tuple": "输入应为有效的元组","Input should be a valid set": "输入应为有效的集合","Set items should be hashable": "集合元素应为可哈希对象","Input should be a valid boolean": "输入应为有效的布尔值","Input should be a valid boolean, unable to interpret input": "输入应为有效的布尔值,无法解析输入","Input should be a valid integer": "输入应为有效的整数","Input should be a valid integer, unable to parse string as an integer": "输入应为有效的整数,无法将字符串解析为整数","Unable to parse input string as an integer, exceeded maximum size": "无法将输入字符串解析为整数,超过最大长度限制","Input should be a valid integer, got a number with a fractional part": "输入应为有效的整数,但包含小数部分","Input should be a valid number": "输入应为有效的数字","Input should be a valid number, unable to parse string as a number": "输入应为有效的数字,无法将字符串解析为数字","Input should be a valid bytes": "输入应为有效的字节","Data should have at least {}": "数据长度至少为{}","Data should have at most {}": "数据长度最多为{}","Data should be valid {}": "数据应为有效的{}","Value error, {}": "数值错误, {}","Assertion failed, {}": "断言失败, {}","Input should be a valid date": "输入应为有效的日期","Input should be a valid date in the format YYYY-MM-DD, {}": "输入应为YYYY-MM-DD格式的有效日期, {}","Input should be a valid date or datetime, {}": "输入应为有效的日期或时间, {}","Datetimes provided to dates should have zero time - e.g. be exact dates": "提供给日期的日期时间应没有时间部分(即精确日期)","Date should be in the past": "日期应为过去时间","Date should be in the future": "日期应为未来时间","Input should be a valid time": "输入应为有效的时间","Input should be in a valid time format, {}": "输入应为有效的时间格式, {}","Input should be a valid datetime": "输入应为有效的日期时间","Input should be a valid datetime, {}": "输入应为有效的日期时间, {}","Invalid datetime object, got {}": "无效的日期时间对象, 得到{}","Input should be a valid datetime or date, {}": "输入应为有效的日期时间或日期, {}","Input should be in the past": "输入应为过去时间","Input should be in the future": "输入应为未来时间","Input should not have timezone info": "输入不应包含时区信息","Input should have timezone info": "输入应包含时区信息","Timezone offset of {}": "时区偏移量为{}","Input should be a valid timedelta": "输入应为有效的时间差","Input should be a valid timedelta, {}": "输入应为有效的时间差, {}","Input should be a valid frozenset": "输入应为有效的不可变集合","Input should be a subclass of {}": "输入应为{}的子类","Input should be callable": "输入应为可调用对象","Input tag '{}": "输入标签'{}","Unable to extract tag using discriminator {}": "无法使用鉴别器{}提取标签","Arguments must be a tuple, list or a dictionary": "参数应为元组、列表或字典","Missing required argument": "缺少必需参数","Unexpected keyword argument": "意外的关键字参数","Missing required keyword only argument": "缺少必需的关键字参数","Unexpected positional argument": "意外的位置参数","Missing required positional only argument": "缺少必需的位置参数","Got multiple values for argument": "参数有多个值","URL input should be a string or URL": "URL输入应为字符串或URL对象","Input should be a valid URL, {}": "输入应为有效的URL, {}","Input violated strict URL syntax rules, {}": "输入违反了严格的URL语法规则, {}","URL should have at most {}": "URL长度最多为{}","URL scheme should be {}": "URL协议应为{}","UUID input should be a string, bytes or UUID object": "UUID输入应为字符串、字节或UUID对象","Input should be a valid UUID, {}": "输入应为有效的UUID, {}","UUID version {} expected": "应为版本{}的UUID","Decimal input should be an integer, float, string or Decimal object": "Decimal输入应为整数、浮点数、字符串或Decimal对象","Input should be a valid decimal": "输入应为有效的十进制数","Decimal input should have no more than {} in total": "Decimal输入总位数不应超过{}","Decimal input should have no more than {}": "Decimal输入小数位数不应超过{}","Decimal input should have no more than {} before the decimal point": "Decimal输入小数点前位数不应超过{}","Input should be a valid python complex object, a number, or a valid complex string following the rules at https://docs.python.org/3/library/functions.html#complex": "输入应为有效的python复数对象、数字或符合https://docs.python.org/3/library/functions.html#complex规则的复数字符串","Input should be a valid complex string following the rules at https://docs.python.org/3/library/functions.html#complex": "输入应为符合https://docs.python.org/3/library/functions.html#complex规则的复数字符串"},
}class MyPydanticI18n(PydanticI18n):def _init_pattern(self) -> Pattern[str]:keys = [key for key in self.source.get_translations(self.default_locale) if '{}' in key]keys = sorted(keys, key=len, reverse=True)return re.compile("|".join("({})".format(re.escape(i).replace(r"\{\}", "(.+)")) for i in keys))def _translate(self, message: str, locale: str) -> str:if locale not in self.locales:raise ValueError(f"Locale '{locale}' wasn't found.")if message in self.source.get_translations(locale):return self.source.gettext(message, locale)return super()._translate(message, locale)tr = MyPydanticI18n(translations, default_locale=DEFAULT_LOCALE)def get_locale(locale: str = DEFAULT_LOCALE) -> str:return localeasync def validation_exception_handler(request: Request, exc: RequestValidationError
) -> JSONResponse:current_locale = request.query_params.get("locale", DEFAULT_LOCALE)return JSONResponse(status_code=HTTP_422_UNPROCESSABLE_ENTITY,content={"detail": tr.translate(exc.errors(), current_locale)},)http_status_codes: Dict[int, str] = {# 客户端错误 (4xx)400: "错误请求(服务器无法理解的请求)",401: "未授权(需要身份验证)",402: "需要支付(保留用于未来支付系统)",403: "禁止访问(服务器拒绝执行请求)",404: "未找到(资源不存在)",405: "方法不允许(禁用请求中指定的方法)",406: "不可接受(无法生成客户端可接受的内容)",407: "需要代理认证(类似401但需代理认证)",408: "请求超时(服务器等待请求超时)",409: "冲突(请求与资源当前状态冲突)",410: "已删除(资源已永久删除)",411: "需要长度(请求需要Content-Length头)",412: "前置条件失败(请求头中条件不满足)",413: "请求实体过大(请求体超过服务器限制)",414: "URI过长(请求URI超过服务器限制)",415: "不支持的媒体类型(服务器无法处理请求格式)",416: "范围无效(请求范围无法满足)",417: "预期失败(无法满足Expect请求头)",418: "我是茶壶(愚人节玩笑代码)",421: "错误定向请求(请求被定向到无法响应的服务器)",422: "无法处理的实体(请求格式正确但语义错误)",423: "已锁定(WebDAV:资源被锁定)",424: "依赖失败(WebDAV:因前序请求失败导致当前失败)",425: "过早请求(服务器不愿处理可能重播的请求)",426: "需要升级(客户端应切换协议)",428: "需要前置条件(请求必须包含条件头)",429: "请求过多(客户端发送过多请求)",431: "请求头字段过大(请求头超出服务器限制)",451: "因法律原因不可用(服务器因法律要求无法提供资源)",# 服务器错误 (5xx)500: "服务器内部错误(服务器遇到意外错误)",501: "未实现(服务器不支持请求的功能)",502: "错误网关(网关或代理从上游服务器收到无效响应)",503: "服务不可用(服务器暂时过载或维护)",504: "网关超时(网关或代理等待上游服务器响应超时)",505: "HTTP版本不支持(服务器不支持请求的HTTP版本)",506: "变种也可协商(服务器存在内部配置错误)",507: "存储空间不足(WebDAV:无法存储完成请求所需内容)",508: "检测到循环(WebDAV:操作导致无限循环)",510: "未扩展(请求需要扩展但服务器不支持)",511: "需要网络认证(客户端需要认证才能访问网络)"
}

之后在main.py中使用

#!/usr/bin/evn python
# -*- coding: utf-8 -*-
from typing import Optionalfrom fastapi import Depends, FastAPI, Request
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from pydantic import BaseModel
from starlette.exceptions import HTTPException as SLHTTPExceptionimport trapp = FastAPI(dependencies=[Depends(tr.get_locale)])app.add_exception_handler(RequestValidationError, tr.validation_exception_handler)@app.exception_handler(SLHTTPException)
async def http_exception_handler(request: Request, exc: SLHTTPException):# 翻译错误消息translated_detail = tr.http_status_codes.get(exc.status_code, exc.detail)return JSONResponse(status_code=exc.status_code,content={"http_code": exc.status_code,"message": translated_detail,},)class Item(BaseModel):user_id: inttoken: strtimestamp: strarticle_id: Optional[str] = None@app.post("/action/")
def callback(item: Item):return {'user_id': item.user_id,'article_id': item.article_id,'token': item.token,'timestamp': item.timestamp}if __name__ == "__main__":import uvicornimport osapp_model_name = os.path.basename(__file__).replace(".py", "")print(app_model_name)uvicorn.run(f"{app_model_name}:app", host='127.0.0.1')

完成!

2025-05-30 14:13增加http状态码翻译


http://www.hkcw.cn/article/FeDriVkoQr.shtml

相关文章

说一说SAP系统从Non-Unicode到Unicode的演化

当前的 SAP 系统基本上都是 Unicode 系统。然而,在 SAP 的发展过程中,最初并不是 Unicode 系统,而是 Non-Unicode 系统。 1. 什么是 Non-Unicode 和 Unicode? Non-Unicode 系统: 在 Non-Unicode 系统中,字符…

特朗普马斯克发表“分手感言” 称赞成就与未来合作

5月30日,美国总统特朗普与美国企业家、政府效率部负责人埃隆马斯克在白宫召开新闻发布会。会上,特朗普对马斯克领导的“政府效率部”所取得的成绩表示赞赏,称该部门聘请了计算机领域的杰出人才。特朗普还提到,政府将致力于推动“政府效率部”削减政府开支政策的永久化。他指…

特朗普称将把进口钢铁关税提高至50% 加强行业保护

当地时间5月30日,美国总统特朗普宣布将进口钢铁的关税从25%提高至50%。美国白宫当天在社交媒体上发布公告,表示此举是为了进一步保护美国钢铁行业免受外国和不公平竞争的影响,并指出新的关税政策将从下周开始实施。特朗普曾于2月10日签署行政命令,对所有进口至美国的钢铁和…

警方:跳进兵马俑坑男子有精神疾病 警情通报发布

5月31日凌晨3点15分,新浪微博账号@平安临潼发布了一则警情通报。责任编辑:zhangxiaohua

5月全国各地经济社会发展观察 高质量发展新图景绘就

5月,万物繁茂。消费新动能持续涌动、夏粮生产力保丰收、就业岗位挖潜扩容、城市更新提升民生福祉……一派充满生机的高质量发展新图景在神州大地不断绘就。临近端午小长假,北京的宋女士这几天正忙着订火车票和酒店,准备利用假期去河南游玩。她说:“想去看石窟、吃水席,还要…

白皮精读:70页 2025 基于数据空间的金融数据可信流通研究报告【附全文阅读】

该报告聚焦金融数据可信流通,基于数据空间理念,分析全球及我国金融数据流通现状与挑战,提出包含典型场景、关键角色、流通模式及技术方案的可信流通框架,并通过中信银行、工银金租等多个实践案例验证其可行性。报告指出当前面临法…

【解决办法】Git报错error: src refspec main does not match any.

在命令行中使用 Git 进行 git push -u origin main 操作时遇到报错error: src refspec main does not match any。另一个错误信息是:error: failed to push some refs to https://github.com/xxx/xxx.git.这是在一个新设备操作时遇到的问题,之前没有注意…

聊聊在大模型推理强化学习中熵机制上的探索

原文首发:https://mp.weixin.qq.com/s/M-KqQWVI-Z7kYXvgD4WeHw 在RL训练LLM的过程中,普遍存在模型entropy迅速下降/性能迅速饱和的现象。这导致模型过度自信,进而削弱其探索能力,最终限制了性能的进一步提升。 我们通过广泛的实验…

基于地理特征金字塔的层次化AI定位方案:从人脑推理到卫星图谱的跨尺度匹配

基于地理特征金字塔的层次化AI定位方案:从人脑推理到卫星图谱的跨尺度匹配 一、仿生推理框架:从人脑定位逻辑到AI层次化建模 1.1 人类视觉定位的认知机制 神经科学研究表明,人类定位遵循"三级推理链": 宏观特征锚定&…

马哈蒂尔:中国不会轻易被美国击败,或将成世界第一强国

马来西亚前总理马哈蒂尔5月30日在东京出席“日经新闻”主办的“亚洲的未来”年度论坛时发表讲话,表示中国不会轻易被美国击败,并且看起来将成为世界第一强国。他认为,鉴于美国日趋保守的政策取向,美国将无法阻止中国的发展势头。马哈蒂尔批评了特朗普的关税政策,称其让美国…

汽车价格战再起 20多万的车14万卖 真降价还是假套路?

近期,汽车市场出现了一系列低价促销活动,如吉利帝豪标价2.99万元、奇瑞瑞虎3x售价3.49万元以及比亚迪海豹直降5.3万元。这些价格吸引了大量关注,但背后隐藏着一些套路。比亚迪于5月23日推出“限时一口价”促销活动后,吉利、奇瑞和凯迪拉克等品牌迅速跟进。然而,记者在走访…

原县委书记花上千万建10个厕所被查 豪华公厕引争议

刚摘掉深度贫困县帽子的通榆县,时任县委书记李德明就斥资上千万元建造了10个豪华水冲公厕。日前,吉林省纪委监委公开通报了4起形式主义、官僚主义典型问题,其中提到李德明搞劳民伤财的“形象工程”。2023年,他升任省农业农村厅厅长,直至2025年1月主动投案。李德明主政的通…

UHF RFID无源标签的芯片供电原理

作为无源物联网技术中最基础的一环,UHF RFID无源标签已经被广泛用于商超零售、物流仓储、图书档案、防伪溯源等量非常大的应用领域,仅2021年度,全球出货量就超过200亿。在实际应用中UHF RFID无源标签的芯片是究竟依靠什么来供电的呢? UHF RFID无源标签供电特点 1.借助无线…

C++?多态!!!

一、引言 众所周知,C有三大特性,它们分别是封装、继承和多态,在之前的文章中已经详细介绍过封装和继承了,今天我们将一起学习多态相关的知识,如果还想了解封装、继承相关的知识,可以跳转到以下链接&#xf…

耿爽回应美方抹黑:完全不可接受 反对无端指责和政治操弄

中国常驻联合国副代表耿爽在安理会审议向乌克兰提供武器问题时发言指出,战场上武器数量不断增加只会加剧对抗、延长战火。自俄乌冲突爆发以来,中方一直呼吁冲突当事方尽快停火止战。遗憾的是,乌克兰危机仍在持续,平民伤亡人数不断增加,令人深感痛心和忧虑。在当前俄乌双方…

Assert failed in file queue.c, line 753

实在程序运行的时候出现的,根据提示找到相关的位置, 说明要操作的信号量还没被初始化(注册) ,在抛信号量之前要使用sys_sem_new初始化一下。 如果出现这个问题,那么检查一下是不是忘了初始化。

著名物理学家汪承灏逝世 享年87岁贡献卓著

著名物理学家、中国科学院院士汪承灏研究员因病医治无效,于2025年5月29日在北京逝世,享年87岁。他曾担任政协北京市第十届委员会常务委员、中国科学院大学荣誉讲席教授及中国科学院声学研究所学术委员会原主任,并培养了众多博士生。汪承灏在功率超声、晶体声学、声表面波器件…

特朗普:特斯拉将在美国生产整车 必须在美国生产整车

5月30日,美国总统特朗普表示,美国汽车制造商必须在美国生产整车和所有零部件,而不是在国外生产。他提到,之前汽车制造商在加拿大、墨西哥、欧洲生产零部件,这让他感到困扰。特朗普强调,在接下来的一年里,这些汽车制造商需要在美国完成整车的生产。尽管特朗普有此要求,但…

马斯克:吃了儿子一拳,意外淤青引发猜测

5月30日,马斯克出现在白宫椭圆形办公室与美国总统特朗普的告别会上,眼角淤青引起外界猜测。马斯克解释说,这是他的儿子玩耍时打在他脸上的结果。他提到当时和儿子开玩笑,让儿子朝他脸上打一拳,没想到五岁的孩子也能造成这样的伤害。马斯克表示当时没觉得怎么样,但之后就出…

儿童节演出服穿完就退?商家出奇招 贴纸防退货

去年“六一”儿童节,商家投诉表演服被大量退货的事件频登热搜。今年临近“六一”,不少商家在社交平台上分享了防范技巧。从事童装生意10年的山东菏泽商家周女士就是其中之一。她发现退货的衣物损毁污染严重。为了避免再次遭受类似损失,周女士在每件儿童表演服上都贴上了醒目…