oslo_i18n学习小结

背景

代码均为开源代码

基于yoga版本,需要对openstack某服务做翻译,了解到oslo_i18n有翻译功能,配置oslo_i18n来给组件进行翻译

用法

用法

每个服务自己会带一个i18n.py的文件,如果要对日志进行翻译,从i18n导入_,代码如下

from oslo_log import logfrom ceilometer.i18n import _
text = "hello, world"LOG = log.getLogger(__name__)# not translate
LOG.info(text)
# translate
LOG.info(_(text))

官网oslo.i18n – Oslo Internationalization Utilities — oslo.i18n 3.12.1.dev4 documentation (openstack.org)

从pike版本后就不支持log翻译了,这个文档是ocata版本

定制修改

直接改po文件即可,改完po文件生成mo文件即可

配置

pike版本以后不支持log翻译了,使用翻译前需要配置

环境变量

参考如下官网配置How to Use oslo.i18n in Your Application or Library — oslo.i18n 3.12.1.dev4 documentation (openstack.org)

总的来说大概需要配两个环境变量,一个是你要翻译的目标语言类型,值可以是zh_CN, en_US等;一个是localedir,这个目录下存放的是mo和po文件,目录结构如下

po与mo文件配置

代码仓默认在各个语言的路径下只存在.po文件,如果要翻译需要先根据po文件生成mo文件,有了mo文件,才能翻译,通过命令msgfmt ceilometer.po -o ceilometer.mo生成.mo文件,mo文件需要在刚配置的环境变量localedir目录下,不然翻译的时候找不到mo文件就翻译不了

msgfmt ceilometer.po -o ceilometer.mo

msgfmt在debian需要先安装gettext:apt install gettext,不然msgfmt命令找不到报错

其他配置

rootwrap

生成mo目标文件的目录权限不够的话可以考虑配rootwrap

代码流程

oslo_i18n.TranslatorFactory

从服务.i18n导入_并使用,_实际是_translators.primary函数,_translator实际是oslo_i18n.TranslatorFactory的实例

_translator初始化需要传入domain参数,domain就是服务的名字,比如nova, neutron等,最后寻找.mo翻译文件的文件名就是domain.mo,可选参数localedir,即用来在localedir下寻找mo文件,不传入localedir参数的话会从环境变量寻找名为DOMAIN_LOCALEDIR变量的值,如果没配这个变量则为None,后续会处理这个None

oslo_i18n.TranslatorFactory.primary

primary流程如下,实际调用了gettext模块去翻译

注意到这个oslo_i18n._lazy.USE_LAZY,为全局bool类型,如果代码里用了oslo_i18n.enable_lazy()这样的函数会设置USE_LAZY为True,就会走到oslo_i18n._message.Message(msg, domain=domain)里,这个在yoga版本不会翻译成你的目标语言,即使配置了环境变量和mo文件

gettext.translation

先寻找mo文件,如果没找到则根据fallback返回,fallback若为False,则没找到mo时抛异常,fallback为True,则没找到mo文件时返回一个空NullTranslations,会对语言的翻译什么也不做

找到mo文件的话,会根据mo文件内容生成一个GNUTranslations对象返回

gettext.find

find作用是寻找mo文件,find会根据domain,localedir,language寻找mo文件

domain:mo文件的名字,即目标文件名为domain.mo

localedir:在localedir下寻找domain.mo,如果之前没配DOMAIN_LOCALEDIR会导致这里localedir为空,此时会用_default_localedir,值为/usr/share/locale

language:目标语言,即会在localedir的哪个language目录下寻找domain.mo,也需要配置环境变量指定用哪个语言,如果没配默认是英文,最后可能返回一个空列表,配置的话,可以参考下图的四个环境变量选一个进行配置

报错与问题

配置了mo仍不翻译

发现primary会判断是否USE_LAZY,如果是会走到oslo_i18n._message.Message,这个东西新版本看着不会翻译,可以通过禁用oslo_i18n.enable_lazy跳过此处

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逆变-TI视频课笔记

目录 1、全桥逆变 1.1、全桥逆变SPWM仿真 2、半桥逆变 2.1、本课小结 3、多重逆变(间接的“交-直-交-直”变流) 3.1、多电平逆变的目的 3.2、单逆变桥 3 电平控制时序 3.3、大功率设备的功率因数 3.4、本课小结 视频链接:文字…

Zed 编辑器发布了原生 Linux 版本

由 Rust 编写、GPU 加速的 Zed 文本编辑器终于提供了正式的 Linux 原生版本!在过去的几个月里,Zed 的 Linux 支持取得了长足的进步,现在已经进入了更正式的阶段。 今天,这款由前 Atom 开发人员创建的现代开源代码编辑器现在在 Li…

vue vite+three在线编辑模型导入导出

文章目录 序一、1.0.0版本1.新增2.编辑3.导出4.导入 二、2.0.0版本1. 修复模型垂直方向放置时 模型会重合4. 修复了导出导入功能 现在是1:1导出导入5. 新增一个地面 视角看不到地下 设置了禁止编辑地面 地面设置为圆形6. 新增功能 可选择基本圆形 方形 圆柱形等模型以及可放置自…

网络 闲聊

闲谈 闲话 网络安全——>网络空间安全 网络空间:一个由信息基础设备组成互相依赖的网络 继:海、陆、空、天、的第五大空间 信息安全的一个发展: 通信保密阶段---计算机安全---信息系统安全---网络空间安全 棱镜门事件 棱镜计划&…

Java中的Set系列集合超详解

Set List是有序集合的根接口,Set是无序集合的根接口,无序也就意味着元素不重复。更严格地说,Set集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。   使用Set存储的特点与List相反:元素…

腾讯云如何设置二级域名?

什么是二级域名? 例如我已申请的域名为: test.com //顶级域名 现在我开发的应用要部署到二级域名: blog.test.com 1、打开腾讯云控制台的我的域名,然后点击解析 2、在我的解析页面点击添加记录,然后需注意红色方框处…

生物素标记的柚皮苷探针;Biotin-Naringin

生物素标记的柚皮苷探针(Biotin-Naringin)是一种结合了生物素(Biotin)和柚皮苷(Naringin)特性的化合物,它在有机合成及药物化学技术领域具有重要意义。以下是对该探针的详细解析: 一…

秋招Java后端开发冲刺——Mybatis

一、基本知识 1. 介绍 MyBatis 是 Apache 的一个开源项目,它封装了 JDBC,使开发者只需要关注 SQL 语句本身,而不需要再进行繁琐的 JDBC 编码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO(Plain …

Everything搜索无法搜索到桌面的文件(无法检索C盘 或 特定路径的文件)

现象描述 在Everything搜索框中输入桌面已存在的文件或随便已知位置的文件,无法找到。 搜索时检索结果中明显缺少部分磁盘位置的,例如无法检索C盘,任意关键字搜索时结果中没有位于C盘的,无论怎样都搜不到C盘文件。 解决方法 在…

图像识别和目标检测在超市电子秤上的应用

目录 前言深度学习的目标检测图像识别技术视觉秤的优势其他应用场景中的技术应用未来展望 前言 随着科技的不断发展,电子秤在生鲜超市中的应用也在不断升级。传统的电子秤需要打秤人员手动输入秤码,这不仅耗时费力,还需要大量的培训以记住各…

工业大数据是什么?应用工业大数据时面临哪些挑战?

在当今快速发展的工业领域,大数据已成为推动企业转型升级的核心动力。工业大数据,以其独特的价值和潜力,正逐渐改变着传统的生产、管理和决策模式。然而,伴随着大数据的快速发展,一系列挑战也随之浮现。本文将深入探讨…

算法日常练习

对于这个题&#xff0c;如何处理同一个方向的问题&#xff0c;且对于同一组的如果间隔太大如何实现离散化 #include<bits/stdc.h> using namespace std;#define int long long typedef long long ll; map<pair<int,int>,vector<pair<ll,ll>>> mp…

关于机械键盘的购买,该怎么选择?

一.关于轴体的选择。 1.青轴&#xff1a;青轴是机械键盘最有段落感的轴&#xff0c;声音比较大&#xff0c;以吵死人别人著称。有人将其比喻为Cherry的春天&#xff0c;爽快清脆的段落感如春天般舒畅。适合在宿舍、咖啡厅&#xff0c;图书馆使用。&#xff08;我装的 &#xf…

linux源码安装mysql8.0的小白教程

1.下载8.x版本的mysql MySQL :: Download MySQL Community Server (Archived Versions) 2.安装linux 我安装的是Rocky Linux8.6 3.设置ip地址,方便远程连接 使用nmcli或者nmtui设置或修改ip地址 4.使用远程连接工具MobaXterm操作: (1)将mysql8版本的压缩包上传到mybaxterm…

一图看懂 | 蓝卓油气行业解决方案

我国是全球最大的能源消费国&#xff0c;保障国家能源安全是我国能源发展的首要任务&#xff0c;油气作为我国能源体系的重要组成部分&#xff0c;是支撑我国工业和经济社会发展的基础和“压舱石&#xff0c;也是必须筑牢的能源安全底线。 蓝卓根据油气田行业发展趋势&#xf…

前端实现一键复制功能

1、下载插件 npm i vue-clipboard32.0.0 2、在需要复制的文件中引入插件并使用&#xff1a; JS: import useClipboard from "vue-clipboard3"; const { toClipboard } useClipboard(); HTML: <el-tooltip content"复制内容" placement"top&…

自然语言处理基本概念

自然语言处理基本概念 所有学习循环神经网络的人都是看这一篇博客长大的&#xff1a; https://colah.github.io/posts/2015-08-Understanding-LSTMs/ import jieba import torch from torch import nns1 "我吃饭了&#xff01;" s2 "今天天气很好&#xff01…

电脑录屏软件哪个效果最好 怎么一边录屏一边直播 电脑录屏软件好用免费推荐

随着科技的发展&#xff0c;电脑的更新迭代也越来越快&#xff0c;各项功能的进步与完善使得人们的工作和生活越来越离不开电脑&#xff0c;其中录屏功能就很好的体现了网络的便利&#xff0c;人们可以将在电脑画面的变化通过录屏功能记录下来&#xff0c;以便后续学习和回顾。…

python-小理与他的画(赛氪OJ)

[题目描述] 小理是个画家&#xff0c;他希望有一天他的画能让心仪的她看到。 只是后来她有了他&#xff0c;他却只有他的画&#xff0c;他望着他的画&#xff0c;默默的发呆。 可惜做题的你&#xff0c;画不出他画的她&#xff0c;所以&#xff0c;我们只好画点简单的画&#x…

centos9+mysql8.0下mycat1.6部署

#创作灵感# 整理一下mysql代理技术&#xff0c;这个当时是和mysql集群部署一个项目的&#xff0c;一并整理出来供参考。 1、环境准备 此处使用的为M-M-SS双主双从结构集群&#xff0c;集群部署方法放在我的上一篇文章中 防火墙可以使用firewall-cmd放行&#xff0c;演示环境…