热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

在Linux下开发多语言软件:HelloGetText!

在Linux下开发多语言软件:HelloGetText!--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
作者联系方式:李先静

开发多语言软件是一件非常困难的事,各个国家的字符集的编码方式、货币符号、日期格式、数字格式、文字表现都各不相同,glibc提供了大量的函数处理这些事情,不再聱述了。这里要做的是,用一个简单的实例说明一下GetText的用法,GetText是一系列的工具和库函数,帮助程序员和翻译人员开发多语言软件的。

GetText并不是一个神秘的东西,若非要在Win32下找一个东东与之对应的话,我想应该是资源文件(.res),它替你把字符串管理起来,在运行可以根据当前的语言,自动加载对应语言的字符串。

这里假设要开发一个叫做foonly的软件包,它仅有一个源文件foonly.c,其功能是在屏幕上打印出”Hello, GetText!”。在没有支持多语言时,foonly.c的内容如下:

#include

int main(int argc, char* argv[])

{

printf("Hello, GetText!\n");

return 0;
}

好了,下面开启我们多语言软件的开发之旅:

创建pot文件,pot是Portable Object Template的首字母缩写,与po对应的是mo,mo是Machine Object的首字母缩写。前者意指原始的字符串文件,一般用于给翻译人员去修改的,后者则是与机器相关的,一般是供程序读取。可以手工创建pot文件,也可以通过xgettext从代码中抽取字符串来产生。这里是用xgettext来产生的:

xgettext -a foonly.c -o foonly.pot

运行该命令后,我们发现,在当前目录下,产生了一个名foonly.pot的文件,打开该文件,可以看到:

# SOME DESCRIPTIVE TITLE.

# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER

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

# FIRST AUTHOR , YEAR.

#

#, fuzzy


msgid ""

msgstr ""

"Project-Id-Version: PACKAGE VERSION\n"

"POT-Creation-Date: 2005-11-07 20:06+0800\n"

"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"

"Last-Translator: FULL NAME \n"

"Language-Team: LANGUAGE \n"

"MIME-Version: 1.0\n"

"Content-Type: text/plain; charset=CHARSET\n"

"Content-Transfer-Encoding: 8bit\n"

#: foonly.c:5


msgid "Hello, GetText!\n"

msgstr ""

根据pot产生不同语言的po文件,这里我们先产生一个简体中文的po文件:

export LANG=zh_CN.gb2312

msginit -l zh_CN.gb2312 -i foonly.pot


运行该命令后,我们发现,在当前目录下,产生了一个名zh_CN.po的文件,打开该文件,可以看到:

# Chinese translations for PACKAGE package.

# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER

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

# root , 2005.

#

msgid ""

msgstr ""

"Project-Id-Version: PACKAGE VERSION\n"

"POT-Creation-Date: 2005-11-07 20:06+0800\n"

"PO-Revision-Date: 2005-11-07 20:09+0800\n"

"Last-Translator: root \n"

"Language-Team: Chinese \n"

"MIME-Version: 1.0\n"

"Content-Type: text/plain; charset=GB2312\n"

"Content-Transfer-Encoding: 8bit\n"

#: foonly.c:5

msgid "Hello, GetText!\n"

msgstr ""

翻译zh_CN.po里对应的字符串为中文:

# Chinese translations for PACKAGE package.

# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER

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

# root , 2005.

#

msgid ""

msgstr ""

"Project-Id-Version: PACKAGE VERSION\n"

"POT-Creation-Date: 2005-11-07 20:06+0800\n"

"PO-Revision-Date: 2005-11-07 20:09+0800\n"

"Last-Translator: root \n"

"Language-Team: Chinese \n"

"MIME-Version: 1.0\n"

"Content-Type: text/plain; charset=GB2312\n"

"Content-Transfer-Encoding: 8bit\n"

#: foonly.c:5


msgid "Hello, GetText!\n"

msgstr "你好,GetText!\n"

根据po文件生成mo文件。

msgfmt zh_CN.po -o zh_CN.mo



运行该命令后,我们发现,在当前目录下,产生了一个名zh_CN.mo的文件。它是二进制的,不能用文本编辑器打开。

安装mo文件到系统中:

cp -f zh_CN.mo /usr/share/locale/zh_CN/LC_MESSAGES/foonly.mo



修改程序。

#include

#include

#include

#define _(String) gettext (String)

#define LOCALEDIR "/usr/share/locale/"

#define PACKAGE "foonly"

int main(int argc, char* argv[])

{

setlocale (LC_ALL, "");

bindtextdomain (PACKAGE, LOCALEDIR);

textdomain (PACKAGE);

printf(_("Hello, GetText!\n"));

return 0;

}

编译并运行:

gcc -g foonly.c -o foonly

./foonly

可以看到屏幕上打印出:

你好, GetText!

现在我们换成英文试一下:

export LANG=es_US

./foonly

可以看到屏幕上打印出:

Hello, GetText!

添加其它语言也很容易,不需要修改程序,只需要像对待中文一样,生成一个mo文件,并安装到系统中对应的目录即可。切换不同的语言仅仅是修改当前的locale就行了。
推荐阅读
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 选择一个合适的编辑器,比如notepad++、VS、eclipse、sublimetext等,选中要集体缩进的代码块,按Tab:集体缩进(向右)按Shift+Tab:集体回缩(向左) ... [详细]
  • 本文介绍了在Java中遍历HashMap的三种常见方法:使用entrySet()、keySet()以及Java 8引入的forEach。每种方法都有其特点和适用场景。 ... [详细]
  • Linux中tput命令怎么用
    这篇文章主要介绍Linux中tput命令怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux常用命令tput命令将通过ter ... [详细]
  • 近期遇到了一个系统中在线文本编辑器上传本地图片时报服务器异常的问题。经过初步调试和排查,最终找到了解决方案。 ... [详细]
  • 本文介绍了如何使用Postman构建和发送HTTP请求,包括四个主要部分:方法(Method)、URL、头部(Headers)和主体(Body)。特别强调了Body部分的重要性,并详细说明了不同类型的请求体。 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • 本文详细介绍了如何使用JavaScript实现面部交换功能,包括基本原理和具体实现步骤。 ... [详细]
  • 本文详细介绍了如何在项目中引入和配置KindEditor网页编辑器,包括脚本引用、初始化编辑器以及文件上传功能的实现。 ... [详细]
  • 使用Java开发简易文本编辑器
    作为一名初学者,虽然之前有使用VB.NET和C#开发文本编辑器的经验,但在尝试用Java实现相同功能时,感觉Java的图形界面组件不如微软的产品(如C#和VB.NET)那么友好。本文将分享我在Java中开发简易文本编辑器的过程,并探讨Java在图形界面方面的优缺点。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • Visual Studio Code (VSCode) 是一款功能强大的源代码编辑器,支持多种编程语言,具备丰富的扩展生态。本文将详细介绍如何在 macOS 上安装、配置并使用 VSCode。 ... [详细]
  • C盘无法格式化的原因及解决方法
    本文探讨了C盘无法格式化的原因,并提供了详细的解决方案,帮助用户顺利进行系统维护。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • XAMPP 遇到 404 错误:无法找到请求的对象
    在使用 XAMPP 时遇到 404 错误,表示请求的对象未找到。通过详细分析发现,该问题可能由以下原因引起:1. `httpd-vhosts.conf` 文件中的配置路径错误;2. `public` 目录下缺少 `.htaccess` 文件。建议检查并修正这些配置,以确保服务器能够正确识别和访问所需的文件路径。 ... [详细]
author-avatar
0o墨滴成殇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有