在 Web 开发中配置多语言支持,不少开发者都遇到过这个场景:代码里明明写了 _('Hello'),页面死活不翻译,也不知道是哪里断了。其实这不是函数写错了,而是整个翻译的链条在某个环节悄悄断了。今天就来聊聊,gettext 在 Python 框架里不生效的那些坑,以及怎么优雅地绕过去。

gettext 为什么在 Flask/Django 里总不生效

说穿了,问题不在于 gettext 本身,而在于翻译上下文没被正确激活,或者 .mo 文件的路径、语言环境没对上。翻译链路上任何一环脱节,结果都一样——页面不翻译。

提取字符串时 xgettext 找不到 _() 或 ngettext()

这个问题其实挺常见的,默认 xgettext 只识别 C 风格的 gettext("..."),而 Python 项目里普遍用短别名 _(),不显式声明就提取不到。

多语言切换后日期/数字格式还是英文

这是个容易混淆的点。gettext 只管字符串翻译,不管区域格式。比如 2024-06-12 不会自动变成 2024年6月12日。这是 locale 模块的职责,但和 gettext 的 locale 压根不是一套机制。

部署时 .mo 文件找不到或加载失败

本地跑通不等于线上能用。部署时的问题集中在路径、权限、编码这三件事上。

最麻烦的其实是语言码匹配逻辑。浏览器发 Accept-Language: zh-CN,zh;q=0.9,你的代码却只查 zh_Hans,中间差了标准化这一步。Babel 的 Locale.parse()match_languages() 是绕不开的胶水。

本文转载于:https://www.php.cn/faq/2311513.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。