Flask-Admin 多语言界面实战:基于 Flask-Babel 的国际化(i18n)集成指南
后端【免费下载链接】flask-adminSimple and extensible administrative interface framework for Flask项目地址https://gitcode.com/gh_mirrors/fl/flask-admin点击查看免费下载本指南以 examples/babel 示例为骨架完整讲解如何在 Flask-Admin 管理后台中集成 Flask-Babel实现界面多语言切换从前端?lang参数与 Session 驱动的语言选择器到后台翻译文件.po/.mo的生成、编译与维护再到 Flask-Admin 内置的CustomDomain翻译域机制与 40 语言目录结构帮助你为管理后台一键接入英、中、法、德、俄等语言。一、示例概览Babel 集成示例做了什么examples/babel/README.md 是 Flask-Admin 官方示例仓库中的国际化演示核心目的只有一个展示如何用定制化的 Flask-Babel 版本把 Flask-Admin 翻译成不同语言。在仓库中这个示例由三部分构成文件作用examples/babel/README.md示例说明与运行方式examples/babel/main.py完整的可运行应用语言选择器 管理后台 两个示例模型examples/babel/pyproject.tomluv依赖声明内含flask-admin[sqlalchemy-with-utils,translation]此外仓库根目录的 babel/babel.ini、babel/babel.sh、babel/babel.bat 与 babel/README.md 提供了翻译工作流脚本后面第五节会专门讲解。二、运行示例用 uv 一键启动该示例使用uv管理依赖与开发环境因此不需要手工创建虚拟环境或单独pip install。先克隆仓库并进入示例目录git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/babel然后直接运行uv run main.pyuv会自动读取 examples/babel/pyproject.toml 解析依赖。该文件的关键声明是[project] name example-babel version 0.1.0 description Flask-Babel Integration Example. requires-python 3.10 dependencies [ flask-admin[sqlalchemy-with-utils,translation], ] [tool.uv.sources] flask-admin { path ../../, editable true }两点值得注意依赖带[translation]额外标记只有安装了这个 extra才会引入Flask-Babel与Babel工具链flask_admin/babel.py 中的from flask_babel import Domain才能导入成功[tool.uv.sources]指向仓库根目录示例直接以可编辑editable方式依赖当前仓库的 flask-admin 源码便于同步调试。启动后app.run(debugTrue)会在本机 5000 端口启动开发服务器浏览器访问http://127.0.0.1:5000/即可看到语言入口页进入http://127.0.0.1:5000/admin/则是管理后台。三、核心实现语言选择器与应用的初始化顺序examples/babel/main.py 是整个示例的灵魂只有 88 行却完整展示了 Flask-Admin Flask-Babel Flask-SQLAlchemy 三者协同的最小可行实现。3.1 初始化顺序from flask import Flask, request, session from flask_admin import Admin from flask_admin.contrib.sqla import ModelView from flask_babel import Babel from flask_sqlalchemy import SQLAlchemy app Flask(__name__) app.config[SECRET_KEY] secret app.config[SQLALCHEMY_DATABASE_URI] sqlite:///db.sqlite app.config[SQLALCHEMY_ECHO] False db SQLAlchemy(app) admin Admin(app, nameExample: Babel)注意这里的顺序是先初始化db与admin再创建Babel实例。Flask-Babel 的locale_selector是惰性求值的只要在第一个请求到达前注册即可因此Babel(app, locale_selectorget_locale)放在后面完全没问题。三个组件的协作关系为Admin(app, nameExample: Babel)挂载管理后台name决定导航栏标题SQLAlchemy(app)提供 ORM 与数据表Babel(app, locale_selectorget_locale)接管所有请求的 locale 判定。3.2 语言选择器Query 参数 Sessiondef get_locale(): override request.args.get(lang) if override: session[lang] override return session.get(lang, en) babel Babel(app, locale_selectorget_locale)这是示例中最核心的业务逻辑工作机制分三步每次请求到达时Flask-Babel 调用locale_selector若 URL 中携带?langxx将其写入session[lang]Session 依赖 flask_admin/base.py 中同样要求的SECRET_KEY配置返回session.get(lang, en)首次访问无任何记录时默认英文。get_locale返回值必须匹配某个翻译目录的 locale 名称例如cs、de、zh_CN等否则 Flask-Admin 会回退到英文原文。示例首页 main.py 的 index 路由 生成了 12 个语言入口链接pa href/admin/?langenClick me to get to Admin! (English)/a/p pa href/admin/?langcsClick me to get to Admin! (Czech)/a/p pa href/admin/?langdeClick me to get to Admin! (German)/a/p pa href/admin/?langesClick me to get to Admin! (Spanish)/a/p pa href/admin/?langfaClick me to get to Admin! (Farsi)/a/p pa href/admin/?langfrClick me to get to Admin! (French)/a/p pa href/admin/?langptClick me to get to Admin! (Portuguese)/a/p pa href/admin/?langruClick me to get to Admin! (Russian)/a/p pa href/admin/?langtrClick me to get to Admin! (Turkish)/a/p pa href/admin/?langpaClick me to get to Admin! (Punjabi)/a/p pa href/admin/?langzh_CNClick me to get to Admin! (Chinese - Simplified)/a/p pa href/admin/?langzh_TWClick me to get to Admin! (Chinese - Traditional)/a/p这些链接全部指向/admin/?langxx体现了“语言状态由 URL 触发、由 Session 保持”的切换模型点一次链接后Session 被写入对应语言后续管理后台内所有页面包括翻页、编辑、删除都会持续使用该语言直到再次带?lang访问或 Session 过期。3.3 数据模型与视图注册示例定义了两个经典的一对多模型均使用 SQLAlchemy 2.0 风格的Mapped/mapped_column类型注解class User(db.Model): id: Mapped[int] mapped_column(Integer, primary_keyTrue) username: Mapped[str] mapped_column(String(80), uniqueTrue) email: Mapped[str] mapped_column(String(120), uniqueTrue) # flask-admin shows __repr__ output in its interface def __repr__(self): return self.username class Post(db.Model): id: Mapped[int] mapped_column(Integer, primary_keyTrue) title: Mapped[str] mapped_column(String(120)) text: Mapped[str] mapped_column(Text) date: Mapped[DateTime] mapped_column(DateTime) user_id: Mapped[int] mapped_column(Integer(), ForeignKey(User.id)) user: Mapped[User] relationship(User, backrefposts) def __repr__(self): return self.title视图注册与建表放在if __name__ __main__:块内if __name__ __main__: # admin.locale_selector(get_locale) admin.add_view(ModelView(User, db)) admin.add_view(ModelView(Post, db)) with app.app_context(): db.create_all() app.run(debugTrue)第 82 行被注释掉的admin.locale_selector(get_locale)是历史遗留写法在当前版本中 locale 选择完全由 Flask-Babel 的locale_selector参数接管不需要再向 Admin 显式注册。四、翻译机制原理CustomDomain 与 translations 目录Flask-Admin 的界面翻译并不依赖你额外配置任何东西——只要装了flask_babelflask_admin/babel.py 会自动构建一个翻译域from flask_admin import translations class CustomDomain(Domain): def __init__(self) - None: super().__init__(translations.__path__[0], domainadmin) property def translation_directories(self) - list[str]: view get_current_view() if view is not None: dirname view.admin.translations_path if dirname is not None: return [dirname] super().translation_directories return super().translation_directories domain CustomDomain() gettext domain.gettext ngettext domain.ngettext lazy_gettext domain.lazy_gettext关键点拆解内置翻译包translations.__path__[0]指向 flask_admin/translations/ 目录这是随 pip 包一起分发的一级翻译目录domainadmin使域名对应该目录下每个语言子目录中的admin.mo/admin.po覆盖式翻译搜索路径translation_directories属性来自 Babel 的Domain会把view.admin.translations_path追加到内置目录之前。这意味着如果你的Admin实例设置了translations_path自定义翻译会优先于内置翻译被加载——这就是“定制化 Flask-Babel 版本”翻译 Flask-Admin 的底层通道懒加载与 WTForms 修复模块同时导出lazy_gettext用于模板/字段定义阶段的惰性翻译当检测到flask_babel不可用时flask_admin/babel.py 会回退到一组gettext/ngettext/lazy_gettext透传实现和一个空Translations类保证后台仍能正常渲染英文界面WTForms 校验消息则由wtforms_domain Domain(messages_path(), domainwtforms)提供。4.1 仓库自带的 40 语言目录仓库的 flask_admin/translations/ 下已内置 40 余种语言的翻译目录例如de、es、fa波斯语、fr、pt、ru、tr、pa旁遮普语、zh_Hans_CN简体中文、zh_Hant_TW繁体中文等每种语言下都有flask_admin/translations/locale/ └── LC_MESSAGES/ ├── admin.mo # 编译后的二进制翻译文件应用实际加载 └── admin.po # 可编辑的源翻译文件以 flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po 为例翻译头部声明了Language: zh_CN内容如#: ../flask_admin/base.py:519 msgid Home msgstr 首页每个msgid都带来源标注文件与行号方便追溯管理后台中哪一处文案对应哪条翻译。示例首页列出的en/cs/de/es/fa/fr/pt/ru/tr/pa/zh_CN/zh_TW12 种语言正是从这套目录中挑选的可展示子集。4.2 自定义翻译目录的接入方式如果你的团队需要为 Flask-Admin 定制文案例如修改 “Create” 为自定义术语可以创建自己的翻译目录并让 Admin 指向它admin Admin(app, nameExample: Babel, translations_path/path/to/my/translations)按 flask_admin/babel.py 的translation_directories逻辑/path/to/my/translations/locale/LC_MESSAGES/admin.mo会被优先加载未覆盖的文案自动回落到内置翻译实现“部分覆盖”效果。五、翻译工作流提取、更新与编译仓库根目录的babel/目录提供了完整的翻译维护脚本适合为 Flask-Admin 项目本身贡献翻译或维护自己的翻译。5.1 提取模板babel.inibabel/babel.ini 声明了需要扫描的文件范围# Python [python: **.py] # Jinja2 [jinja2: **/templates/**.html] encoding utf-8所有.py源码按 Python 提取器处理templates/下的.html按 Jinja2 提取器处理并统一使用 UTF-8 编码。5.2 一键脚本babel.shbabel/babel.sh 封装了完整的提取、更新、编译流程#!/bin/sh uv run pybabel extract -F babel.ini -k _gettext -k _ngettext -k lazy_gettext -o admin.pot --project Flask-Admin ../flask_admin if [ $1 --update ]; then uv run pybabel update -i admin.pot -d ../flask_admin/translations -D admin -N fi uv run pybabel compile -f -D admin -d ../flask_admin/translations/Windows 用户可使用等价的 babel/babel.bat核心命令同为pybabel extract仅路径分隔符不同。各命令的作用命令作用pybabel extract -F babel.ini -k _gettext -k _ngettext -k lazy_gettext -o admin.pot --project Flask-Admin ../flask_admin扫描flask_admin源码把_gettext、_ngettext、lazy_gettext标记的文案提取到admin.pot模板pybabel update -i admin.pot -d ../flask_admin/translations -D admin -N用新模板更新所有语言的.po文件-N不保留模糊匹配并保留已有翻译pybabel compile -f -D admin -d ../flask_admin/translations/将.po编译为应用实际加载的.mo文件babel/README.md 给出了三类角色的使用路径开发者改动文案后运行./babel.sh --update同时完成提取、更新与编译译者查找缺失翻译运行awk /^msgid / {msgidsubstr($0, 8, length($0)-8)} /^msgstr $/ {print msgid} file.po把file.po替换为目标语言文件即可列出所有msgstr为空尚未翻译的条目译者更新完 .po/.mo 后运行./babel.sh完成最终编译。首次参与时先用uv sync --group docs同步开发环境确保pybabel可用。六、效果验证与常见问题6.1 如何验证翻译生效启动uv run main.py访问首页点击任意语言链接如?langzh_CN观察管理后台导航栏、按钮如 Home/登录相关文案是否变为简体中文由于语言写入了 Session在后台内翻页、编辑、删除时语言保持不变用无痕窗口或清除 Cookie 后再访问确认回退到默认英文en。6.2 常见问题排查界面仍是英文切换无效检查get_locale返回值是否与 flask_admin/translations/ 下某个目录名精确一致如zh_CN而非zh-CN.mo未更新修改.po后必须执行pybabel compile或./babel.sh运行时加载的是admin.mo而非admin.po提示找不到 Flask-Babel确认依赖为flask-admin[translation]flask_admin/babel.py 在缺失时会静默回退到英文直通实现因此不会报错但也不会翻译想覆盖内置文案为Admin设置translations_path指向自定义目录优先级高于内置翻译见 flask_admin/babel.py。七、小结通过 examples/babel 示例可以看到Flask-Admin 的国际化是一条开箱即用的路径应用侧只需一个locale_selector回调 一行Babel(app, locale_selector...)翻译侧依赖 flask_admin/babel.py 的CustomDomain自动加载内置 40 语言目录并支持translations_path自定义覆盖维护侧则有 babel/babel.sh 与 babel.ini 提供提取、更新、编译的完整工作流。无论是给现有后台增加一种新语言还是为团队定制管理界面文案这套组合都能以极小的代码量完成。赞分享后端【免费下载链接】flask-adminSimple and extensible administrative interface framework for Flask项目地址https://gitcode.com/gh_mirrors/fl/flask-admin点击查看免费下载相关推荐Flask-Admin 国际化实战基于 Babel 的翻译文件维护与多语言集成指南Flask Admin 国际化实战基于 Babel 的翻译文件维护与多语言集成指南 Flask Admin 内置了一套基于 Babel 的翻译体系内置 38后端Beego 多语言支持实战基于 go-i18n 的国际化与本地化集成指南Beego 多语言支持实战基于 go i18n 的国际化与本地化集成指南 本文以《build web application with golang》 第 1文档教程gin-vue-admin国际化多语言支持与i18n集成gin vue admin国际化多语言支持与i18n集成 前言全球化时代的管理系统挑战 在当今全球化的商业环境中企业管理系统需要面向不同国家和地区的用户。后端前端认证鉴权低代码任务调度上一篇LeetCode 40. 组合总和 II 题解基于回溯法通用框架的排序去重实战JS / Python3 / C下一篇免费AMD处理器调试工具SMUDebugTool入门指南零基础玩转Ryzen逐核心PBO微调创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

OKX AI 口碑查询指南:用 `agent feedback-list` 查看 Agent 评价与星级信誉(identity-reputation 流程)

OKX AI 口碑查询指南:用 `agent feedback-list` 查看 Agent 评价与星级信誉(identity-reputation 流程)

【免费下载链接】internet-court-skill The trust layer for agent-to-agent commerce — natural-language mandates, ERC-7710 delegated permissions, x402 payments, escrow, and dispute resolution as one open, catch-all Agent Skill / Claude Code plugin. 项目地址&a…

2026/10/10 14:11:53 阅读更多 →
爬虫笔记(10/2)——用 TaoToken 统一 Key 跑通 Scrapy 爬虫框架

爬虫笔记(10/2)——用 TaoToken 统一 Key 跑通 Scrapy 爬虫框架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 14:11:53 阅读更多 →
Codex插件生态实战指南:12个必备开发提效工具

Codex插件生态实战指南:12个必备开发提效工具

1. Codex 是什么,以及为什么它需要插件生态支撑Codex 不是某个具体软件的官方名称,而是开发者社区中对一类基于大语言模型(LLM)能力构建的代码辅助工具的泛称。它常被用来指代那些深度集成在 IDE 中、能理解上下文、自动生成函数、…

2026/10/10 14:10:52 阅读更多 →

最新新闻

统一登录与单点登录实战:网关与认证中心的搭建全解

统一登录与单点登录实战:网关与认证中心的搭建全解

这段时间我一直在折腾一件事:把我们内部几个各自为战的业务系统,统一到一个登录入口底下。项目代号倒是很形象,sward 负责守门,soular 负责认人。说白了,sward 是一个网关层,soular 是一个身份认证中心&…

2026/10/10 14:52:58 阅读更多 →
打印机驱动下载安装完整指南:从官网获取到故障排查

打印机驱动下载安装完整指南:从官网获取到故障排查

1. 打印机驱动安装这件事,为什么值得单独写一篇完整指南打印机驱动下载安装,听起来像是电脑入门级别的操作,但实际工作中我见过太多人在这上面翻车。有人下载了错误的驱动版本导致打印机频繁脱机,有人装完驱动后扫描功能死活调不出…

2026/10/10 14:52:58 阅读更多 →
基于SpringBoot+Vue+MySQL的船舶监造管理系统实战解析

基于SpringBoot+Vue+MySQL的船舶监造管理系统实战解析

做船舶监造的人肯定都懂,监造不是坐在办公室看看图纸就行,真正业务一铺开,报验单、现场见证、NCR整改闭环、试验计划、图纸送审,每个环节都是需要“有人跟、有记录、有闭环”的。早几年我在船厂和监造组干活时,全靠Exc…

2026/10/10 14:52:58 阅读更多 →
Zen Cart PayPal跳转插件:解决掉单与IPN异步通知问题

Zen Cart PayPal跳转插件:解决掉单与IPN异步通知问题

简介:面向ZenCart商城的PayPal跳转插件,用于打通ZenCart与PayPal支付接口,实现用户在付款时从商店页面到支付网关再返回结果页的完整跳转流程,适合使用ZenCart开展跨境或外贸电商的商家、开发者及运维人员。该插件压缩包共24个文件…

2026/10/10 14:52:58 阅读更多 →
线程池线程数配置实战:CPU密集型与IO密集型任务调优策略

线程池线程数配置实战:CPU密集型与IO密集型任务调优策略

1. 先分清任务在“算”还是在“等”——这是所有配置的起点1.1 CPU 密集型和 IO 密集型的本质差异多线程编程里有一个被问得最多的问题:线程池到底配多少个线程?我几乎每一次都会先反问他一句:你的任务是 CPU 密集型还是 IO 密集型&#xff1…

2026/10/10 14:52:57 阅读更多 →
Windows下OSGeo4W安装PDAL避坑指南:从环境配置到LAZ v1.4实测

Windows下OSGeo4W安装PDAL避坑指南:从环境配置到LAZ v1.4实测

简介:本资源是面向GIS开发者、遥感工程师及三维点云处理从业者的PDAL库离线安装包,专为解决Windows环境下因网络限制导致OSGeo4W官网下载PDAL失败或缓慢的痛点。压缩包完整封装了OSGeo4W64 64位安装环境及PDAL核心组件,并预集成CloudCompare兼…

2026/10/10 14:51:56 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →