oslo_i18n学习小结

背景

代码均为开源代码

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

用法

用法

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

from oslo_log import log

from 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跳过此处

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI人工智能作词,为音乐注入未来之力

在当今的音乐世界中,创新的力量不断推动着边界的拓展,而人工智能作词正以其独特的魅力,成为引领音乐走向未来的强大动力。 “妙笔生词智能写歌词软件(veve522)”无疑是这股浪潮中的璀璨明星。它利用先进的人工智能技术…

Spring Security学习笔记(一)Spring Security架构原理

前言:本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本 Spring Security中文文档:https://springdoc.cn/spring-security/index.html 一、什么是Spring Security Spring Security是一个安全控制相关的java框架,它提供了一套全…

某某会员小程序后端性能优化

背景 某某会员小程序后台提供开放平台能力,为三方油站提供会员积分、优惠劵等api。当用户在油站加油,油站收银会调用我们系统为用户发放积分、优惠劵等。用户反馈慢,三方调用发放积分接口性能极低,耗时30s; 接口情况…

在uniapp中如何使用地图

1&#xff0c;技术选择 最好是使用webview html形式加载&#xff0c;避免打包app时的地图加载问题 2&#xff0c;webview使用 使用webview必须按照官方文档,官网地址&#xff1a;https://uniapp.dcloud.net.cn/component/web-view.html <template><view><!…

LabVIEW比例压力控制阀自动测试系统

开发了一套基于LabVIEW编程和PLC控制的比例控制阀自动测试系统。该系统能够实现共轨管稳定的超高压供给&#xff0c;自动完成比例压力控制阀的耐久测试、流量滞环测试及压力-流量测试。该系统操作简便&#xff0c;具有高精度和高可靠性&#xff0c;完全满足企业对自动化测试的需…

80. UE5 RPG 实现UI显示技能冷却进度功能

在上一篇文章里&#xff0c;我们实现了通过GE给技能增加资源消耗和技能冷却功能。UI也能够显示角色能够使用的技能的UI&#xff0c;现在还有一个问题&#xff0c;我们希望在技能释放进去冷却时&#xff0c;技能变成灰色&#xff0c;并在技能冷却完成&#xff0c;技能可以再次使…

Linux安全技术与防火墙

一、安全技术和防火墙 1.1 安全技术 入侵检测系统&#xff1a;特点是不阻断网络访问&#xff0c;主要是提供报警和时候报警&#xff0c;不主动介入。 入侵防御系统&#xff1a;透明模式工作&#xff0c;对数据包、网络监控、服务攻击、木马蠕虫、系统漏洞等等进行准确的分析和…

两个视频怎么剪辑成一个视频?3个方法分享

两个视频怎么剪辑成一个视频&#xff1f;将两个视频剪辑成一个视频&#xff0c;是现代数字内容创作中的高频需求&#xff0c;它不仅简化了素材管理&#xff0c;还能通过创意剪辑提升作品连贯性与表现力。通过精心编排&#xff0c;两个视频片段可以无缝融合&#xff0c;讲述更完…

如何通过兔子和窝窝的故事理解“在机器人学习和研究中的获得成本与维护成本”(节选)

获得成本 掌握一门课程&#xff0c;以最为简单的学校成绩过60为例&#xff0c;需要按要求提交材料&#xff0c;包括作业、报告、实验和考试等&#xff0c;依据学分和考核要求的不同&#xff0c;需要对于花费时间和经历进行完成。 维护成本 考完了&#xff0c;如果被动学习那…

Django 删除单行数据

1&#xff0c;添加模型 from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharField(max_length100)author…

FastAPI 学习之路(四十七)WebSockets(三)登录后才可以聊天

之前我们是通过前端自动生成的token信息&#xff0c;这次我们通过注册登录&#xff0c;保存到本地去实现。首先&#xff0c;我们实现一个登录页面&#xff0c;放在templates目录下。 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

基于PCIe总线架构的2路1GSPS AD、4路1GSPS DA信号处理平台(100%国产化)

板卡概述 PCIE723-165是基于PCIE总线架构的2通道1GSPS采样率14位分辨率、4通道1GSPS采样率16位分辨率信号处理平台&#xff0c;该板卡采用国产16nm FPGA作为实时处理器&#xff0c;支持2路高速采集以及4路高速数据回放&#xff0c;板载2组DDR4 SDRAM大容量数据缓存&#xff0c;…

gradle 和 java 版本对应关系

文章目录 gradle 和 java 版本对应关系原地址 gradle 和 java 版本对应关系 原地址 https://docs.gradle.org/current/userguide/compatibility.html#compatibility

Python进阶 2024/7/10

文件编码概念 文件的读取操作 打开文件 open&#xff08;&#xff09;打开函数 open&#xff08;name&#xff0c;mode,encoding&#xff09; name:打开的目标文件的字符串&#xff0c;可以包含文件所在的具体路径 mode&#xff1a;访问模式&#xff0c;只读&#xff0c;只…

MySQL修改表名:重命名RENAME

RENAME命令 RENAME命令用于修改表的名称&#xff0c;命令格式&#xff1a;rename table 原表名 to 新表名; 例如&#xff1a;将user表改成user_info rename table user to user_info;使用场景 第一个场景重命名 最常用的场景就是使用rename修改表名。 rename table user t…

js页面跳转

最近&#xff0c;自己学习前端时发现有趣的js跳转页面&#xff0c;下面和大家分享小知识。 网上有许多跳转方法&#xff0c;我只选择了一种。如下代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

基于粒子滤波和帧差法的目标跟踪matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 帧差法 4.2 粒子滤波 4.3 粒子滤波与帧差法的结合 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 原重采样方法&#xff1a; 改进重采样方法&#xff1a; 2.算法…

The Web3 社区 Web3 产品经理课程

概述 / 深耕区块链行业 11 年&#xff0c;和很多产品经理都打过交道&#xff1b;遇到过优秀的产品经理&#xff0c;也遇到过比较拉垮的产品经理。多年工作中&#xff0c;曾在某些团队&#xff0c;承载技术兼产品经理的角色&#xff1b;也参与过很多 Web3 外包项目&#xff0c;包…

【原创教程】埃斯顿机器人:弯管机推力解决方式(上)

现的功能及应用的场合 本项目为弯管机设备改造工程,在不破坏设备原有的功能的情况下通过只更换设备原来的永宏PLC,使弯管机能够与埃斯顿机器人进行信号交互,通过机器人对弯管机进行上料、下料动作,即节约了人工成本,又提高了生产效率。 本文所述内容为“弯管机推力”的解决…

从汇编层看64位程序运行——栈帧(Stack Frame)边界

大纲 RBP&#xff0c;RSP栈帧边界总结参考资料 在《从汇编层看64位程序运行——栈帧(Stack Frame)入门》中&#xff0c;我们简单介绍了栈帧的概念&#xff0c;以及它和函数调用之间的关系。如文中所述&#xff0c;栈帧是一种虚拟的概念&#xff0c;它表达了一个执行中的函数的栈…