Gettext

gettext是GNU国际化与本地化（i18n）函数库。它常被用于编写多语言程序。

开发
程序源代码需要进行修改以响应GNU gettext请求。多数编程语言均已通过字符封装的方式实现了对其的支持。为了减少输入量和-{zh-hans:代码;zh-tw:程式碼;}-量，此功能通常以标记别名“_”的形式使用，所以例如以下C语言-{zh-hans:代码;zh-tw:程式碼;}-：
printf(gettext("My name is %s.\n"), my_name);
应当写作：
printf(_("My name is %s.\n"), my_name);

gettext使用其中的字符串寻找对应的其他语言翻译，若没有可用翻译则-{zh-hans:返回;zh-tw:傳回;}-原始内容。

除C语言外，GNU gettext还支持C++、Objective-C、Pascal/Object Pascal、sh脚本、bash脚本、Python、GNU CLISP，Emacs Lisp、ibrep、GNU Smalltalk、Java、GNU awk、wxWidgets（-{zh-hans:通过;zh-tw:透過;}-wxLocale-{zh-hans:类;zh-tw:類別;}-）、YCP（YaST2语言）、Tcl、Perl、PHP、Pike、Ruby以及R。用法均与在C语言上类似。

xgettext程序从源代码生成.pot文件，作为源代码中需翻译内容的模板。一个典型的.pot文件条目应当是这样的：
#: src/name.c:36
msgid "My name is %s.\n"
msgstr ""

註解被直接放置在字符串前，用于帮助翻译者理解原文的內容：
/// TRANSLATORS: Please leave %s as it is, because it is needed by the program.
/// Thank you for contributing to this project.
printf(_("My name is %s.\n"), my_name);
本例中的註解是以 ///开头的，其作用是用于xgettext程序生成.pot模板文件。

xgettext --add-comments=///

在.pot文件中的注释应为以下形式：
#. TRANSLATORS: Please leave %s as it is, because it is needed by the program.
#. Thank you for contributing to this project. 
#: src/name.c:36
msgid "My name is %s.\n"
msgstr ""

翻译
翻譯者需要處理的-{對象}-是.po文件，它是由msginit程序从.pot模板文件生成的。例如使用msginit初始化法语翻译文件时，我们运行以下命令：

 msginit --locale=fr --input=name.pot

这将会使用指定的name.pot在当前目录创建一个fr.po，其中的一个条目应该是以下形式的：
#: src/name.c:36
msgid "My name is %s.\n"
msgstr ""
翻译者需要手工或使用类似Poedit、gtranslator、OmegaT或Emacs等工具的相应模式编辑该文件。翻译完成后，文件应为如下的样子：
#: src/name.c:36
msgid "My name is %s.\n"
msgstr "Je m'appelle %s.\n"
最后.po文件需要使用msgfmt编译为.mo文件以用作发布。

執行
使用Unix类型操作系统的用户只需设置环境变量中的LC_MESSAGES(但是ubuntu linux 是用LANG)，程序将自动从相应的.mo文件中读取语言信息。

参考

另见

 国际化和本地化
 翻译工具

外部链接
 Gettext主页
 使用gettext本地化PHP网站  - 解些和示例。
 Gettext Commons - Java gettext工具集 
 Autotools教程
 gted - GetText EDitor和工具集成
 Gorm PO文件编辑器 
 Windows 下的对应函数为 LoadString，直接读取适合当前 locale/lcid 设置的资源字符串 

Category:GNU计划软件
Category:翻译