2009-06-16 153 views
15

我正在寻找一个完整的i18n gettext() hello world示例。我已经根据G. Mohanty的A tutorial on Native Language Support using GNU gettext开始了一个脚本。我正在使用Linux和G ++。完整的C++ i18n gettext()“hello world”示例

代码:

cat >hellogt.cxx <<EOF 
// hellogt.cxx 
#include <libintl.h> 
#include <locale.h> 
#include <iostream> 
#include <cstdlib> 
int main(){ 
    char* cwd = getenv("PWD"); 
    std::cout << "getenv(PWD): " << (cwd?cwd:"NULL") << std::endl; 
    char* l = getenv("LANG"); 
    std::cout << "getenv(LANG): " << (l?l:"NULL") << std::endl; 
    char* s = setlocale(LC_ALL, ""); 
    std::cout << "setlocale(): " << (s?s:"NULL") << std::endl; 
    std::cout << "bindtextdomain(): " << bindtextdomain("hellogt", cwd) << std::endl; 
    std::cout << "textdomain(): " << textdomain("hellogt") << std::endl; 
    std::cout << gettext("hello, world!") << std::endl; 
} 
EOF 
g++ -ohellogt hellogt.cxx 
xgettext -d hellogt -o hellogt.pot hellogt.cxx 
msginit --no-translator -l es_MX -o hellogt_spanish.po -i hellogt.pot 
sed --in-place hellogt_spanish.po --expression='/#: /,$ s/""/"hola mundo"/' 
sed --in-place hellogt_spanish.po --expression='s/PACKAGE VERSION/hellogt 1.0/' 
mkdir -p ./es_MX/LC_MESSAGES 
msgfmt -c -v -o ./es_MX/LC_MESSAGES/hellogt.mo hellogt_spanish.po 
export LANG=es_MX 
ls -l $PWD/es_MX/LC_MESSAGES/hellogt.mo 
./hellogt 
strace -e trace=open ./hellogt 

程序编译,文字提取,西班牙语文件被创建,修改和二进制创建的,但hellogt仍显示英文。跟踪显示没有在当前工作目录中查找es_MX的任何证据,也没有任何对LC_MESSAGES目录的引用。

回答

11
cat >hellogt.cxx <<EOF 
// hellogt.cxx 
#include <libintl.h> 
#include <locale.h> 
#include <iostream> 
int main(){ 
    setlocale(LC_ALL, ""); 
    bindtextdomain("hellogt", "."); 
    textdomain("hellogt"); 
    std::cout << gettext("hello, world!") << std::endl; 
} 
EOF 
g++ -o hellogt hellogt.cxx 
xgettext --package-name hellogt --package-version 1.2 --default-domain hellogt --output hellogt.pot hellogt.cxx 
msginit --no-translator --locale es_MX --output-file hellogt_spanish.po --input hellogt.pot 
sed --in-place hellogt_spanish.po --expression='/"hello, world!"/,/#:/s/""/"hola mundo"/' 
mkdir --parents ./es_MX.utf8/LC_MESSAGES 
msgfmt --check --verbose --output-file ./es_MX.utf8/LC_MESSAGES/hellogt.mo hellogt_spanish.po 
LANGUAGE=es_MX.utf8 ./hellogt 

这里是由上面创建的文件的描述:

hellogt.cxx   C++ source file 
hellogt    Executable image 
hellogt.pot   Extracted text from C++ source file (portable object template) 
hellogt_spanish.po Modified text for Spanish with translations added (using sed) 
es_MX.utf8/ 
LC_MESSAGES/ 
    hellogt.mo  Binary translated text for Spanish used at run-time 
13

您的问题是hellogt.mo位于错误的位置 - 您的程序实际上并未打开它。您可以通过使用strace告诉这个跟踪open系统调用:

strace -e trace=open ./hellogt 
... 
open("/tmp/.//es_MX/LC_MESSAGES/hellogt.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/tmp/.//es/LC_MESSAGES/hellogt.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 

可以影响地方的gettext查找与LOCPATH环境变量的消息目录,但如果你将它移动到的gettext试图从你的例子加载工作原理:

mkdir -p es/LC_MESSAGES 
cp hellogt.mo es/LC_MESSAGES 
./hellogt 
hola mundo 
+0

谢谢。跟踪有助于确定我的代码没有按照我的预期查看这些文件。 – 2009-06-23 15:39:28