2016-07-27 5 views
1

안녕하세요, 저는 C++에서 i18n 용 샘플 코드를 작성하고 있습니다. 나는 link을 참조했다.C++ GNU xgettex 실행을 추적하는 방법은 무엇입니까?

출력 결과 텍스트가 영어로 표시됩니다. 여기에 어떤 문제가 있습니까?

#include "start.hpp" 
#include <iostream> 
#include <locale.h> 
#include "/opt/local/share/gettext/gettext.h" 
using namespace std; 

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

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("hello", cwd) <<   std::endl; 
std::cout << "textdomain(): " << textdomain("hello") << std::endl; 
std::cout << gettext("hello, world!") << std::endl; 

return 0; 

}

은 $> g ++ -o에서 xgettext는 msginit> -o start.pot의 start.cpp에게

$을 시작 -d> start.cpp에게

$를 시작합니다 - 번역자 없음 -l es_MX -o start_es.po -i start.pot

작성된 시작 _es.po.

나는 poedit.app를 사용하여 start_es.po 파일을 열고 텍스트를 번역하고 저장

$>에서 mkdir -p ES/LC_MESSAGES

$> msgfmt에서 -c -v -o ./es/LC_MESSAGES/start.mo start_es.po

번역 된 메시지.

$> 수출 LANG = es_MX

$> ./start를

답변

0

도메인을 바인딩하는 동안 코드에 버그가 있습니다. 나는 다음과 같이 바꿨다.

std::cout << "setlocale(): " << (s ? s : "NULL") << std::endl; 
std::cout << "bindtextdomain(): " << bindtextdomain(“start", cwd)<< std::endl; 
std::cout << "textdomain(): " << textdomain(“start") << std::endl; 

다음의 흔적은 그것을 발견하는 것을 도왔다.

dhcp-140:Debug UserName $ sudo dtruss -f -t open ./start 
getenv(PWD): /Users/UserName/WorkPlace/lang/DerivedData/lang/Build/Products/Debug 
getenv(LANG): NULL 
setlocale(): NULL 
bindtextdomain(): 

/Users/UserName/WorkPlace/lang/DerivedData/lang/Build/Products/Debug 
textdomain(): hello 
hello, world! 
    PID/THRD SYSCALL(args)   = return 
7213/0x16cd1: open(".\0", 0x0, 0x1)  = 3 0 
7213/0x16cd1: open("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0x0, 0x0)  = 3 0 
7213/0x16cd1: open("/opt/local/lib/libintl.8.dylib\0", 0x0, 0x0)  = 3 0 
7213/0x16cd1: open("/opt/local/lib/libiconv.2.dylib\0", 0x0, 0x0)  = 3 0 
7213/0x16cd1: open("/dev/dtracehelper\0", 0x2, 0x7FFF540FDA20)   = 3 0 
7213/0x16cd1: open("/Users/UserName/WorkPlace/lang/DerivedData/lang/Build/Products/Debug/./start\0", 0x0, 0x1FF)  = 3 0 
7213/0x16cd1: open("/Users/UserName/WorkPlace/lang/DerivedData/lang/Build/Products/Debug/en/LC_MESSAGES/hello.mo\0", 0x0, 0x8)   = -1 Err#2