linux c国际化

一种locale表示一种文化的各种数据的表示或显示方式,一种locale分成多个部分,不同的部分由category表示,每一种category下面定义了很多关键字keyword

locale -a 查看所有支持的locale,

locale 不带参 查看当前locale的各个category

locale -ck LC_TIME 输出LC_TIME这个category下面的所有keyword

改变category的locale,在输出这个category下面的所有keyword,会发现locale不同keyword会有什么变化

LC_TIME=zh_CN.utf8 locale -ck LC_TIME;

LC_TIME=en_US.utf8 locale -ck LC_TIME

改变category的locale,会发现locale不同date命令输出的时间不同了,这就是locale的直观的影响

LC_TIME=zh_CN.utf8 date

LC_TIME=en_US.utf8 date

locale格式 language[_territory][.codeset][@modifier]

language是 ISO 639 语言代码

Chinese    zh
English    en​
Japanese    ja
Korean    ko

 territory是 ISO 3166 国家/地区代码China    CN
Hong Kong    HK
Taiwan     TW
United States of America    US
Japan    JP
Korea    KR

codeset 字符编码 ISO-8859-1 or UTF-8

man 5 locale 查看locale definition file

man 7 locale 查看国际化多语言编程方面的信息支

 

Locale category有哪些

posix定义的

*  LC_CTYPE

*  LC_COLLATE

 *  LC_MESSAGES  影响与语言翻译相关的函数gettext,  ngettext,   rpmatch

 *  LC_MONETARY

 *  LC_NUMERIC

 *  LC_TIME 影响时间输出函数strftime,strptime

非标准

*  LC_ADDRESS 

*  LC_IDENTIFICATION

*  LC_MEASUREMENT

*  LC_NAME

*  LC_PAPER

*  LC_TELEPHONE

LC_ALL 包含以上所有LC_*

编程接口方面

相关头文件#include <locale.h>

setlocale函数设置当前locale

setlocale(LC_ALL,"")初始化LC_MESSAGES根据下面3个环境变量得第一个非空值

LC_ALL, LC_MESSAGES, LANG

linux c编程字符串国际化gettext系得函数

通过查找message目录将指定字符串根据当前locale翻译得到locale相对于得字符串

#include <libintl.h>

char * gettext (const char * msgid);
char * dgettext (const char * domainname, const char * msgid);
char * dcgettext (const char * domainname, const char * msgid,
                         int category);

msgid表示消息目录中的消息,消息目录由.po文件定义,用msgfmt生成.mo并安装到指定目录

xgettext工具

抽取源码中的字符串,生成message目录,然后可以针对每个字符串翻译

xgettext [OPTION] [INPUTFILE]...

[INPUTFILE]... 源码文件

-f, --files-from=FILE 通过FILE指定源码文件列表

-D, --directory=DIRECTORY 通过DIRECTORY指定查找目录

-d, --default-domain=NAME 输出文件为NAME.po,不指定默认为messages.po

-o, --output=FILE 输出文件为FILE,指定 - 输出到标准输出

-p, --output-dir=DIR 指定输出文件所在目录

-j, --join-existing 与存在得输出文件合并,相当于更新

-k, --keyword 不使用默认关键字,查找字符串

-kWORD, --keyword=WORD,用WORD作为额外得关键字

main.c 代码如图

执行命令

xgettext -k_  -o hello.po main.c

生成得hello.pot如图

hello.pot只是一个模板

cp hello.pot hello.po 

然后修改Language: zh_CN

CHARSET为UTF-8 

其它黄色部分改成自己需要得文字

发布应用时

msgfmt -o 特定规则的目录/xxx.mo xxx.po 

把消息目录文件也就是mo文件放到   特定规则的目录

规则是这样的

dirname/locale/category/domainname.mo

dirname由bindtextdomain函数指定,默认值与系统相关,典型值是prefix/share/locale,prefix是包的安装前缀

locale是当前的locale名,对应GNU实现来说一般是没有国家的语言名,ubuntu实现zh_CN 和 zh

category 对与gettext dgettext两个函数来说是LC_MESSAGES,对dcgettext函数来说就是对应参数

domainname gettext由之前调用的textdomain指定,如果未调用textdomain,domainname默认为messages;dgettext 和dcgettext,domainname 传对应参数指定

从ubuntu18.04系统,使用的翻译函数角度

gettext

dirname为系统目录,/usr/share/locale、/usr/share/locale-langpack

locale 由LC_MESSAGES locale指定,它又是由之前调用的setlocale指定,中文环境通常为zh_CN、zh

category 固定LC_MESSAGES

domainname 由之前调用的textdomain指定,如果未调用textdomain,domainname默认为messages,

所以mo查找的顺序是

1、/usr/share/locale/zh_CN/LC_MESSAGES/messages.mo

2、/usr/share/locale/zh/LC_MESSAGES/messages.mo

3、/usr/share/locale-langpack/zh_CN/LC_MESSAGES/messages.mo

4、/usr/share/locale-langpack/zh/LC_MESSAGES/messages.mo

dgettext,指定的路径找不到还会找系统路径

dirname由bindtextdomain函数指定,如果是相对路径,前面还要加上当前工作目录(getcwd获取),

locale 为zh_CN、zh

category 固定LC_MESSAGES串,注意不是LC_MESSAGES的值

domainname dgettext传对应参数指定,参数为NULL,由之前调用的textdomain指定

当dirname为相对路径c/d,工作目录为/a/b,domainname为hello,时mo查找的顺序是

1、/a/b/c/d/zh_CN/LC_MESSAGES/hello.mo

2、/a/b/c/d/zh/LC_MESSAGES/hello.mo

3、/usr/share/locale-langpack/zh_CN/LC_MESSAGES/hello.mo

4、/usr/share/locale-langpack/zh/LC_MESSAGES/hello.mo

dcgettext

基本同上dgettext,除了

1、没有搜索系统路径/usr/share/locale-langpack

2、locale  由dcgettext的参数指定,此参数必须为<locale.h>中的LC_XXX常量

如果指定LC_NAME,那么dgettext查找目录里面的LC_MESSAGES串换成LC_NAME串,mo查找的顺序是

1、/a/b/c/d/zh_CN/LC_NAME/hello.mo

2、/a/b/c/d/zh/LC_NAME/hello.mo

另外对于翻译时存在字符编码转换的需要,LC_CTYPE locale 会用到

mo文件根据调用的翻译函数,复制到响应的查找目录就可以得到

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

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

相关文章

大语言模型怎么写好提示词,看这篇就够了

对于任何输入&#xff0c;大语言模型都会给出相应的输出&#xff0c;这些输入都可以成为提示词&#xff0c;通常&#xff0c;提示词由指令和输入数据组成&#xff0c;指令是任务&#xff0c;输入数据是完成的要求&#xff0c;其中指令应该明确&#xff0c;用词不能模棱两可&…

centos7.9升级rockylinux8.8

前言 查看centos的版本 &#xff0c;我这台服务器是虚拟机,下面都是模拟实验 升级前一定要把服务器上配置文件&#xff0c;数据等进行备份 [rootlocalhost ~]#cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]#uname -a Linux jenkins_ser…

【C++进阶】AVL树的实现

1. AVL的概念 AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性质的⼆叉搜索树&#xff1a;它的左右⼦树都是AV树&#xff0c;且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树&#xff0c;通过控制⾼度差去控制平衡…

SLM201A系列24V, 15mA - 60mA单通道线性恒流LED驱动芯片 灯带灯条解决方案

SLM201A系列型号&#xff1a; SLM201A15aa-7G SLM201A20aa-7G SLM201A25aa-7G SLM201A30aa-7G SLM201A35aa-7G SLM201A40aa-7G SLM201A45aa-7G SLM201A50aa-7G SLM201A55aa-7G SLM201A60aa-7G SLM201A 系列产品是用于产生单通道、高…

基于FPGA的以太网设计(一)

以太网简介 以太网&#xff08;Ethernet&#xff09;是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准&#xff0c;它规定了包括物理层的连线、电子信号和介质访问控制的内容。以太网是目前应用最普遍的局域网技术&#xff0c;取代了其他局域网标准如…

【unity小技巧】Unity6 LTS版本安装和一些修改和新功能使用介绍

文章目录 前言安装新功能变化1、官方推荐使用inputsystem进行输入控制2、修复了InputSystem命名错误导致listen被遮挡的bug3、自带去除unity启动画面logo功能4、unity官方的behavior行为树插件5、linearVelocity代替过时的velocity方法待续 完结 前言 2024/10/17其实unity就已…

gitlab:ssh设置

我用的是window&#xff0c;先打开终端&#xff1a; 1、输入 ssh-skygen 执行 然后输入路径&#xff0c;路径地址就是后面括号内的内容 2、然后直接下一步下一步即可&#xff0c;像上面那样就成了 3、打开公钥&#xff0c;复制 4、打开gitlab&#xff0c;在我的 Edit profil…

JUnit 单元测试(详解)

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

shell脚本宝藏仓库(基础命令、正则表达式、shell基础、变量、逻辑判断、函数、数组)

一、shell概述 1.1 shell是什么 Shell是一种脚本语言 脚本&#xff1a;本质是一个文件&#xff0c;文件里面存放的是特定格式的指令&#xff0c;系统可以使用脚本解析器、翻译或解析指令并执行&#xff08;shell不需要编译&#xff09; Shell既是应用程序又是一种脚本语言&…

C++中类间相互引用与析构函数调用的潜在风险及解决方案

C中类间相互引用与析构函数调用的潜在风险及解决方案 一、前言二、举例说明三、问题分析四、解决方案 一、前言 在C中&#xff0c;当两个类A和B之间存在相互引用&#xff0c;并且在A的析构函数中调用B的成员函数&#xff0c;同时B的成员函数又尝试访问A的对象或调用A的成员函数…

《深度学习》Dlib、OpenCV 轮廓绘制

目录 一、Dlib轮廓绘制 1、什么是轮廓绘制 2、步骤 1&#xff09;导入所需的库和模型 2&#xff09;加载人脸检测器 3&#xff09;读取图像 4&#xff09;人脸检测 5&#xff09;关键点定位 6&#xff09;绘制轮廓线条 7&#xff09;展示结果 二、案例实现 1、完整代码 运…

【华为】静态NAT、动态NAT、NAPT、Easy IP、NAT Server

静态 NAT&#xff1a;将内网主机的私网 IP地址一对一映射到公网 IP 地址。动态 NAT&#xff1a;将内网主机的私有地址转换为公网地址池里面的地址。由于静态NAT严格地一对一进行地址映射&#xff0c;这就导致即便内网主机长时间离线或者不发送数据时&#xff0c;与之对应的公有…

Mac 电脑安装redis

1、首先检查电脑是否安装 brew 命令&#xff1a; #打开Mac自带的终端&#xff0c;输入下面命令 brew --version如下图&#xff0c;可以看到我的 brew 正常的&#xff0c;且对应版本是4.0.17-63-g32f2258 如果你的电脑执行上面命名报错&#xff1a;zsh: command not found: br…

一个很恶心但发顶会很牛的方向!【小样本学习+目标检测】

【小样本学习目标检测】致力于通过有限的标注样本实现高效的目标检测&#xff0c;以应对数据匮乏的挑战。这一领域的研究对于缩小人工智能与人类学习系统之间的差异、增强模型对新类别的适应能力、推动智能识别系统在实际场景中的应用具有重要意义。 为了帮助研究人员深入理解…

【可答疑】基于51单片机的智能衣柜(含仿真、代码、报告、演示视频等)

✨哈喽大家好&#xff0c;这里是每天一杯冰美式oh&#xff0c;985电子本硕&#xff0c;大厂嵌入式在职0.3年&#xff0c;业余时间做做单片机小项目&#xff0c;有需要也可以提供就业指导&#xff08;免费&#xff09;~ &#x1f431;‍&#x1f409;这是51单片机毕业设计100篇…

多进程编辑

使用父子进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;两个进程同时进行 #include <myhead.h> int main(int argc, const char *argv[]) {//用于保存pid号pid_t pid -1;//创建子进程pid fork();//打印一下进程号print…

C语言 | Leetcode C语言题解之第491题非递减子序列

题目&#xff1a; 题解&#xff1a; int** ans; int ansSize; int* temp; int tempSize;void dfs(int cur, int last, int* nums, int numsSize, int** returnColumnSizes) {if (cur numsSize) {if (tempSize > 2) {ans[ansSize] malloc(sizeof(int) * tempSize);memcpy(…

oracle归档日志爆满问题处理

最近客户单位的oracle数据库出了问题&#xff0c;经常出现无法连接,报错提示 ORA-00257: archiver error, Connect internal only, until freed.&#xff0c;手动清除归档日志后可以恢复访问&#xff0c;但是过不了几天依旧会爆满&#xff0c;每日生成的归档日志很大。经过详细…

(K)MP有限状态自动机

模式匹配自动机 什么是有限状态自动机&#xff1f; 定义 n 个不同状态&#xff0c;记为 {1,2…n}&#xff0c;在状态 i 时输入 s&#xff0c;达到状态 j&#xff0c;记为 goto (i,s)j 对于字符串 s 而言&#xff0c;在一个状态 i 下输入一个字符 ch&#xff0c;也会达到一个指…

ssh连接慢的问题或zookeeper远程连接服务超时

问题原因&#xff1a; 在SSH登录过程中&#xff0c;服务器会通过反向DNS查找客户端的主机名&#xff0c;然后与登录的IP地址进行匹配&#xff0c;以验证登录的合法性。如果客户端的IP没有域名或DNS服务器响应缓慢&#xff0c;这可能导致SSH登录过慢。为了解决这个问题&#xf…