Python 项目国际化:使用 Babel 实现多语言支持

文章目录

    • 如何使用 Babel 实现 Python 项目国际化
        • 1. 安装 Babel
        • 2. 设置项目目录结构
        • 3. 标记可翻译的文本
        • 4. 提取可翻译的文本生成文件 —— 生成pot文件
          • 4.1 有配置文件方式(使用 `babel.cfg`)
            • 4.1.1. 创建 `babel.cfg` 文件
            • 4.1.2. 提取翻译内容
          • 4.2 无配置文件方式(直接指定文件路径)
        • 5. 后续步骤(通用步骤)
          • 5.1. 初始化翻译文件 —— 生成po文件
          • 5.2. 编辑po文件
          • 5.3. 编译po文件 —— 生成mo文件
          • 5.4. 加载翻译
          • 5.5. 翻译内容更新后的处理的方式
        • 总结

如何使用 Babel 实现 Python 项目国际化

  • 参考文章:
    • Flask-Babel 使用简介(翻译文档)
    • Python Web 开发中的国际化与本地化处理
    • pythonweb国际化: 国际化flask-babel,gettext,msgfmt,msginit
  • 此流程包括两种方式,分别是有配置文件方式无配置文件方式,可以根据项目需求选择其中一种方式。

1. 安装 Babel

无论选择哪种方式,都需要首先安装 Babel:

pip install babel
2. 设置项目目录结构

建议将代码、翻译文件等文件分门别类以便于管理:

my_project/
│
├── src/                     # 源代码目录
│   └── main.py              # 主程序
│
├── locales/                 # 翻译文件目录
│
└── babel.cfg                # Babel 配置文件 (可选)
3. 标记可翻译的文本

在代码中标记需要翻译的文本。例如,在 main.py 中:

from gettext import gettext as _print(_("Hello, world!"))
print(_("This is a translatable message."))

使用 _() 包裹需要翻译的文本内容。


4. 提取可翻译的文本生成文件 —— 生成pot文件
4.1 有配置文件方式(使用 babel.cfg
4.1.1. 创建 babel.cfg 文件

在项目根目录下创建 babel.cfg 文件,用于指定提取翻译文本的路径和文件类型:

[python: src/**.py]  
encoding = utf-8

在 babel.cfg 文件中,[python: src/**.py] 是一个配置选项,告诉 PyBabel 在提取可翻译文本时,扫描 src/ 目录下的所有 Python 文件(包括子目录中的文件)。这里的 **.py 表示递归地匹配 src/ 目录及其子目录下的所有 Python 文件。

同时,encoding = utf-8 是指定文件编码格式为 UTF-8,确保正确读取和处理文件内容,特别是对于包含非 ASCII 字符的文件。这对于处理多语言翻译非常重要,因为 Python 源代码中的字符串可能会包含不同语言的字符。
该配置文件告诉 Babel 将 src 文件夹下的 .py 文件视为翻译文件来源。

4.1.2. 提取翻译内容

运行以下命令提取可翻译文本,生成 .pot 文件:

pybabel extract -F babel.cfg -o locales/messages.pot .

该命令生成 .pot 文件,用于翻译过程的模板。

这会根据 babel.cfg 文件的配置提取 src 目录中的文本并生成 locales/messages.pot 文件。

  • pybabel: Flask-Babel 的命令行工具,用于国际化处理。
  • extract: 提取可翻译的字符串。
  • -F babel.cfg: 指定配置文件 babel.cfg,定义了哪些文件需要扫描和提取翻译。
  • -o locales/messages.pot: 指定输出文件 locales/messages.pot,保存提取的可翻译文本。
  • .: 表示从当前目录开始扫描所有文件。

4.2 无配置文件方式(直接指定文件路径)

如果不想使用 babel.cfg,可以在命令行中直接指定文件路径来提取翻译内容:

pybabel extract -o locales/messages.pot src/
  • pybabel extract: 从源代码中提取可翻译的文本。
  • -o locales/messages.pot: 指定输出文件 locales/messages.pot,该文件将包含提取的所有可翻译字符串。
  • src/: 指定要扫描的目录,这里是 src/ 目录,PyBabel 会从这个目录中提取 Python 文件中的可翻译文本。

这样可以省略 babel.cfg,Babel 会直接扫描 src/ 目录下的 .py 文件来提取可翻译内容。如果是当前目录请使用“.”


5. 后续步骤(通用步骤)

无论使用哪种方式提取文本,后续的步骤都是相同的。

5.1. 初始化翻译文件 —— 生成po文件

生成翻译文件(例如中文 zh_CN),以便翻译文本:

pybabel init -i locales/messages.pot -d locales -l zh_CN
  • -i msg.pot: 使用之前提取的 .pot 文件(messages.pot)作为输入。
  • -d locales: 指定存放翻译文件的目录(locales)。
  • -l zh_CN: 指定目标语言为简体中文 (zh_CN)。

这个命令会根据 messages.pot 文件,在 locales/zh_CN/LC_MESSAGES/ 目录下(执行该命令以后会自动创建)创建一个 .po 文件,供翻译者编辑。

执行后会在 locales/zh_CN/LC_MESSAGES/ 中生成 messages.po 文件。
在这里插入图片描述

5.2. 编辑po文件

messages.po 中,将 msgstr 设为对应的翻译内容:

msgid "Hello, world!"
msgstr "你好,世界!"msgid "This is a translatable message."
msgstr "这是一条可翻译的信息。"
5.3. 编译po文件 —— 生成mo文件

编译 .po 文件生成 .mo 文件:

pybabel compile -d locales

编译后的 .mo 文件会生成在 locales/zh_CN/LC_MESSAGES/ 目录下,供程序使用。

5.4. 加载翻译

在代码中加载翻译内容:

import gettext# 加载翻译
lang = gettext.translation('messages', localedir='locales', languages=['zh_CN'])
lang.install()
_ = lang.gettext  # 使用 _() 调用翻译# _ = lambda s: s 如果不想翻译,想变成原本的内容,则只需添加该行代码# 输出翻译内容
print(_("Hello, world!"))
print(_("This is a translatable message."))
5.5. 翻译内容更新后的处理的方式
  1. 修改源代码
    在源代码中直接修改或添加新的可翻译文本。例如,在 main.py 中:

    print(_("Welcome to the program!"))  # 新增的翻译内容
    print(_("Hello, world!"))
    print(_("This is a translatable message."))  # 已修改的翻译内容
    
  2. 更新 .pot 文件
    运行以下命令从代码中提取所有可翻译文本,并更新 .pot 文件(不覆盖现有翻译):

    pybabel extract -F babel.cfg -o locales/messages.pot .
    

    或者,如果没有 babel.cfg 配置文件,可以直接指定路径:

    pybabel extract -o locales/messages.pot src/
    
  3. 合并更新到 .po 文件 —— 类似于git中的merge
    通过以下命令将 .pot 文件中的改动更新到现有的 .po 文件中:

    pybabel update -i locales/messages.pot -d locales
    

    该命令会将新提取的内容合并到所有现有语言的 .po 文件中,而不会覆盖原有的翻译。如果 .po 文件中已有的内容被修改了,则 Babel 会将旧翻译标记为“模糊”翻译(fuzzy),以便译者手动确认。

  4. 检查并编辑 .po 文件
    打开 locales/zh_CN/LC_MESSAGES/messages.po 文件,查找新增或更新的内容进行翻译。

    • 新增的翻译会有空的 msgstr,需要填写翻译内容。
    • 更新的翻译(模糊翻译)会带有 #, fuzzy 标签,并包含旧的翻译内容。删除 #, fuzzy 标签并更新 msgstr 以确保翻译准确。
    msgid "Welcome to the program!"
    msgstr "欢迎使用本程序!"# 原翻译修改为模糊翻译 (fuzzy)
    #, fuzzy
    msgid "This is a translatable message."
    msgstr "这是一条可翻译的信息。"
    
  5. 重新编译 .mo 文件
    完成 .po 文件的编辑后,重新编译以生成更新后的 .mo 文件:

    pybabel compile -d locales
    
  6. 测试更新的翻译
    运行代码测试新翻译内容,确保在代码中所有修改的翻译内容能够正确加载。

  • 注意事项

  • 模糊翻译:当 Babel 检测到原文发生了修改,但仍有一部分相似时,会将翻译标记为模糊翻译。模糊翻译不会自动加载,需手动检查并确认。

  • 增量更新:更新 .pot 文件和 .po 文件的流程不会影响已经翻译好的内容,仅会添加新的和修改的条目。这样确保了翻译工作的可持续性,不会因为改动覆盖现有的翻译。

  • 这样做可以在翻译内容改动后保持翻译文件的同步,确保应用程序的国际化内容准确、及时更新。


总结
  • 有配置文件方式适合包含多个文件、文件结构复杂的项目。
  • 无配置文件方式适合文件结构简单的小项目或测试项目。

Babel 的国际化配置,包含以下步骤:

  1. 创建 Babel 配置文件并提取文本。
  2. 生成翻译文件,完成翻译。
  3. 编译并加载翻译,确保程序可以显示不同语言的内容。
1、新建babel.cfg:
2、提取翻译文本生成翻译模板
pybabel extract -F babel.cfg -o messages.pot .
3、生成翻译文件
pybabel init -i messages.pot -d translations -l zh_Hans-CN
4、在翻译文件中手动输入翻译结果
5、编译翻译文件
pybabel compile -d translations
生成编译文件messages.mo
6、更新翻译
pybabel update -i messages.pot -d translations

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/7110.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

信号-2-信号捕捉

相关概念:递达 未决 / 阻塞 忽略 阻塞 vs 忽略 阻塞: 如果指定信号信号被阻塞, block期间该信号不能被递达,一直在pending表中。知道block被撤销后, 该信号才能递达,递达后对应pending位置置零。 忽…

正则表达式1 re.match惰性匹配详解案例

点个关注 re.match() re.match() 函数尝试从字符串的开头开始匹配一个模式,如果匹配成功,返回一个匹配成功的对象,否则返回None。大小写区分,内容匹配不到后面的,只能匹配一个,不能有空格(开头匹配&#…

如何针对云计算安全进行等保测评?

等级保护作为我国网络安全法明确的重要制度,已在我国信息系统安全保驾护航中发挥着重要作用。目前,等级保护已经进入了2.0时代,“云、大、物、移、工控”纳入等保监管。 当前,按照传统等级保护技术要求实施的安全策略已经不能适应…

软考:性能测试的几个方面

性能测试的指标: 响应时间,吞吐量,并发用户数,资源利用率等 四个方面: 1、发现缺陷 2、性能调优 3、评估系统能力,不仅需要,还需要。 4、验证稳定性和可靠性

Vue(JavaScript)读取csv表格并求某一列之和(大浮点数处理: decimal.js)

文章目录 想要读这个表格,并且求第二列所有价格的和方法一:通过添加文件输入元素上传csv完整(正确)代码之前的错误部分因为价格是小数,所以下面的代码出错。如果把parseFloat改成parseInt,那么求和没有意义…

搭建兰空图床并配合PicGo实现批量上传

文章目录 服务器安装docker安装数据库部署兰空图床兰空图床配置邮箱验证配合PicGo实现批量上传 最近想试试自己搭建图床,虽然免费的又拍云够用了,但对象存储和图床还是有区别的,用起来有些复杂,所以打算试试兰空图床 服务器 想搭建…

如何对数据库的表字段加密解密处理?

对于表格数据的加密处理,通常涉及到对数据库中存储的数据进行加密,以保护敏感信息。 Java示例(使用AES算法加密数据库表数据) 首先,你需要一个数据库连接,这里假设你使用的是JDBC连接MySQL数据库。以下是…

LLM训练”中的“分布式训练并行技术;分布式训练并行技术

目录 “LLM训练”中的“分布式训练并行技术” 分布式训练并行技术 数据并行 流水线并行:按阶段(stage)进行切分 张量并行 序列并行 多维混合并行 自动并行 MOE并行 重要的分布式AI框架 “LLM训练”中的“分布式训练并行技术” 随着深度学习技术的不断发展,特别是…

TS学习笔记

一、TS运行环境搭建 1、安装 安装命令 npm i -g typescript 第一步:新建index.html和demo.ts 第二步:在index.html引入demo.ts文件 第三步:运行TS的命令 tsc demo.ts 注意:运行命令后,会将ts文件转换成js文件 …

ubuntu 22.04 server 安装 和 初始化 LTS

ubuntu 22.04 server 安装 和 初始化 下载地址 https://releases.ubuntu.com/jammy/ 使用的镜像是 ubuntu-22.04.5-live-server-amd64.iso usb 启动盘制作工具 https://rufus.ie/zh/ rufus-4.6p.exe 需要主板 支持 UEFI 启动 Ubuntu22.04.4-server安装 流程 https://b…

Python接口自动化测试实战

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 接口自动化测试是指通过编写程序来模拟用户的行为,对接口进行自动化测试。Python是一种流行的编程语言,它在接口自动化测试中得到了广泛…

day01 - web开发简介

本课程涉及到的技术: Vue ElementUI/Html Js SpringBoot–Spring SpringMvc MyBatis(Plus) SSM Axios 学习路径: 前端主要: Html5css3JavaScript(JQuery)–>Vue(Node.js也可以学习一 下,服务端js)ElementUi(uni-app) 后端主要…

qt QMessageBox详解

1、概述 QMessageBox是Qt库中的一个类,它用于在图形用户界面(GUI)程序中显示消息框。消息框是一种用于向用户显示信息、警告、错误或询问用户确认的对话框。QMessageBox可以显示文本、图标和按钮,并允许自定义按钮的文本和功能。…

简易版 python调用cuda方法

目标: 手写一些cuda库, 使用python调用这些库 (Linux) 步骤一: 在linux上安装pybind11 方法1: sudo apt-get install python3-pybind11 方法2: git clone https://github.com/pybind/pybind11.git, 如果将其放在项目目录下的话可以不编译 步骤二: 编写CUDA代码 示例: gpu_l…

51单片机学习心得2(基于STC89C52):串口通信(UART)

串口通信(UART) 电平标准 (注意:单片机中常使用TTL电平) 上图中第一种与第二种电平传输信号有效距离只有十几米,距离超出后会传输数据错误;但是第三种电平传输的有效距离可达上千米。 常用通信…

gitlab-runner中搭建nvm、nrm以及优化maven打包

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 gitlab-runner中搭建nvm、nrm以及优化maven打包 git、gitlab-runner如何以gitlab-runner执行nvm、…

一文读懂:AIOps 从自动化运维到智能化运维

今天跟大家聊一聊AIOps(人工智能运维) 为了应对企业面临着日益复杂的运营挑战,AIOps(人工智能运维)作为一种创新的方法应运而生,结合了人工智能和机器学习技术,来提升IT运营的效率和性能。 这…

Java反射

动态代理 java.lang.reflect.Proxy:提供了为对象产生代理的方法&#xff1a; public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) loader&#xff1a;指定用哪个类加载器&#xff0c;去加载生成的代理类。interfa…

废弃物分类分割系统:入门训练营

废弃物分类分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-DCNV2-Dynamic&#xff06;yolov8-seg-C2f-DWR等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Glob…

策划方案思路大公开,让你的创意更有市场!

各位营销界的脑洞大开者们&#xff0c;是不是又在为如何让你的创意在市场上大放异彩而绞尽脑汁&#xff1f; 别担心&#xff0c;今天我就来给你揭秘几个策划方案的新思路&#xff0c;让你的创意不仅有料&#xff0c;还有市场&#xff01; 一、紧跟热点&#xff0c;借势营销 …