[software development] gettext 翻译介绍和简单使用
Tofloor
poster avatar
yanjuner
Super Moderator
2023-10-26 00:27
Author

基础知识介绍

poedit 介绍

Poedit是一个流行的跨平台的翻译编辑器,用于编辑.po文件。它提供了一个直观的界面和丰富的功能,使得翻译人员能够轻松地编辑和管理软件本地化的翻译。

gettext 介绍

Gettext工具集:Gettext提供了一组命令行工具,用于管理和处理翻译相关的任务。其中包括以下工具:
xgettext:用于从源代码中提取文本字符串,并生成.pot文件(模板文件)。
msginit:用于创建新的.po文件,并提供基本的翻译环境。
msgmerge:用于合并更新的.pot文件到现有的.po文件中,保留已有的翻译。
msgfmt:用于将.po文件编译成二进制的.mo文件,供程序在运行时加载。

.pot 文件

.pot文件(Portable Object Template):.pot文件是一种模板文件,用于创建.po文件。它包含了源语言的文本,但没有目标语言的翻译。开发人员通常使用.pot文件作为基础,提取应用程序中的所有文本字符串,并将其转化为.pot文件。然后,翻译人员可以使用.pot文件创建对应的.po文件,并进行翻译工作。

.po文件

.po文件是一种文本文件,包含源语言(通常是英语)和对应的目标语言翻译。每个翻译条目都包括一个独特的标识符、源文本和目标文本。.po文件是可编辑的,可以使用文本编辑器或专门的翻译工具进行修改。

.mo文件

.mo文件是一种二进制文件,是.po文件的编译版本。它包含了.po文件中的翻译条目的二进制表示。软件在运行时通常使用.mo文件来加载正确的翻译文本。.mo文件是机器可读的,因此在运行时能够提高翻译的效率和性能。

环境准备

软件安装

sudo apt install gettext
sudo apt install poedit 

示例程序

// myapp.c

#include 
#include 
#include 

#define _(str)  gettext(str)
#define TEXT_DOMAIN "myapp"

int main() {
    setlocale(LC_ALL, ""); //设置语言环境,第二个参数为空表示继承系统环境
    bindtextdomain(TEXT_DOMAIN, "locale"); //绑定的翻译文件所属的软件包,和翻译文件路径
    textdomain(TEXT_DOMAIN); //使用的翻译文件所属的软件包

    puts(_("hello"));
    return 0;
}

编译

gcc myapp.c -o myapp

生成pot文件

xgettext -a myapp.c -o myapp.pot

注意删除多余的翻译行

生成po 文件

msginit -l zh_CN -i myapp.pot -o zh_CN.po

翻译 po 文件,可使用poedit

生成mo 文件

msgfmt zh_CN.po -o zh_CN.mo

安装

mkdir -p locale/zh_CN/LC_MESSAGES
cp zh_CN.mo locale/zh_CN/LC_MESSAGES/myapp.mo

运行

./myapp

翻译问题排查

  1. 翻译文件路径是否正确
  2. 翻译内容是否正确查看方式,将mo转化为po文件,使用poedit 打开pot 文件查看
    msgunfmt example.mo -o example.po
    
  3. 查看程序语言相关环境变量是否正常在初始化函数前打印
Reply Favorite View the author
All Replies
Ziggy
deepin
2023-10-26 00:50
#1

poedit有GUI,翻译起来比较接近词典或者Qt套件的,还不错

Reply View the author
深圳市耀影科技有限公司
deepin
2024-03-26 13:11
#2
Ziggy

poedit有GUI,翻译起来比较接近词典或者Qt套件的,还不错

命令行都 安装不上, GUI 更没看到
图片.png

Reply View the author
y***[email protected]
deepin
2024-06-10 09:49
#3

编译都成功了,也翻译了po -->mo, 如下:

yc@yc-ubuntu-HP-EliteBook-840-G3:~/temp$ ls -lta
total 23500
-rwxrwxr-x 1 yc yc 17480 Jun 9 21:15 myapp
drwxrwxrwx 7 root root 4096 Jun 9 21:15 .
-rw-rw-r-- 1 yc yc 387 Jun 9 21:06 test.po
drwxrwxr-x 3 yc yc 4096 Jun 9 21:04 locale
-rw-rw-r-- 1 yc yc 396 Jun 9 21:04 zh_CN.mo
-rw-rw-r-- 1 yc yc 655 Jun 9 21:04 zh_CN.po
-rw-rw-r-- 1 yc yc 713 Jun 9 20:38 myapp.pot
-rwxr--r-- 1 yc yc 298 Jun 9 20:38 myapp.c

po 文件:

yc@yc-ubuntu-HP-EliteBook-840-G3:~/temp$ cat ./zh_CN.po

Chinese translations for PACKAGE package.

Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER

This file is distributed under the same license as the PACKAGE package.

yc , 2024.

#: myapp.c:11
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-06-09 20:38-0400\n"
"PO-Revision-Date: 2024-06-09 20:41-0400\n"
"Last-Translator: yc \n"
"Language-Team: Chinese (simplified) \n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: myapp.c:15
msgid "hello"
msgstr "您好!"

但是,最后执行的时候,翻译的中文出不了啊,什么问题?

yc@yc-ubuntu-HP-EliteBook-840-G3:~/temp$ ./myapp
hello

Reply View the author