문제

나는 이미 작성한 프로그램을 현지화하고 싶습니다. 전혀 가능하지 않습니다.

나는 getText ()를보고 그것을 많이 좋아했지만 이와 같은 문자열을 어떻게 번역 할 것인지는 불분명합니다.

const char *Colors[] = {
 { "Red" },
 { "Blue" },
 { "Yellow" },
 ....
};

그 어느 것입니다 매우 내 프로그램에서 일반적으로 .. 여기에서 "빨간색"을 getText ( "Red")로 바꾸는 것은 분명히 작동하지 않습니다.

그래서 나는 outputfunction (getText (colors [id]))와 같은 일을 할 것이라고 생각했지만 어떻게 현지화 할 문자열 목록을 얻을 수 있습니까? 나는 어떤 프로그램이라도 통계적으로 국소화 된 목록에서 "빨간색", "파란색", "노란색"을 얻을 수있을 정도로 똑똑하다고 의심합니다.

기본적으로 서버이기 때문에 다시 컴파일하지 않고 언어를 변경할 수있는 능력이 필요하지 않습니다 (중요한 문제 나 성가심없이 모든 지원되는 언어에 대해 컴파일 할 수 있습니다). C ++ 0X의 ConstexPR에 대해 생각했습니다. 배열/등으로 작동하며 컴파일 시간에 현지화 할 문자열 목록을 쉽게 얻을 수 있습니다. 컴파일러가 아직 구현되지 않은 것은 너무 나쁩니다.

모든 문자열을 ID로 변경하는 것은 옵션이 아닙니다. 왜냐하면 내 입력에 대한 엄청난 양의 작업이 필요하기 때문에 특히 새 문자열마다 새 ID를 만드는 것이 지옥처럼 성가 시게 될 것입니다. 위와 같은 모든 배열을 다른 배열로 변환하는 것도 동일하게 적용됩니다.

그래서 어떤 아이디어가 있습니까? :/

도움이 되었습니까?

해결책 2

getText () 및 XGetText와 함께 많은 놀이를 한 후에 나는 나 자신을 찾았다 고 생각합니다 (죄송하지만 당신의 접근 방식이 마음에 들지 않았습니다. 그런 수백 개의 배열이 있어야하며 모든 것을 가져와야합니다. Main (), 그것은 많은 외부와 많은 추가 작업 :/)입니다.

어쨌든, 이것은 이론적으로 수행 될 수 있다고 생각하는 방법입니다 (실제로 번역하려고 시도하지는 않았지만 왜 작동하지 않는지 모르겠습니다)

두 #정의 :

#define _ gettext
#define __(x) x

그런 다음 _를 사용하여 실제로 번역하고 __을 사용하여 문자열을 "번역 할"으로 표시합니다.

const char *Colors[] = {
 { __("Red") },
 { __("Blue") },
 { __("Yellow") },
 ....
};

void PrintColor(int id) {
    cout << _("The color is: ") << _(Colors[id]);
}

그런 다음 달리기 :

xgettext -k_ -k__ *.cpp

다음 .PO 파일을 얻습니다.

#: test.cpp:2
msgid "Red"
msgstr ""

#: test.cpp:3
msgid "Blue"
msgstr ""

#: test.cpp:4
msgid "Yellow"
msgstr ""

#: test.cpp:9
msgid "The color is: "
msgstr ""

따라서 __ (또는 다른 이름, 실제로는 중요하지 않음)를 "더미 함수"로 사용하여 xgetText 문자열을 번역해야한다는 것을 알고 _는 실제로 getText ()를 호출해야합니다.

문자열로 _를 호출하면 문자열이 변형 될 예정인 변수로 표시됩니다. 변수, 배열로 호출하면 XGetText에 의해 무시되는 것처럼 보입니다.

엄청난! 이제 내가해야 할 일은 5 조 파일을 거쳐 원숭이 인 것처럼 밑줄을 추가하는 것입니다.

다른 팁

귀하의 구체적인 예를 위해서는 다음과 같은 것을 시도 할 수 있습니다.

// presumably globals
const char *Colors_en[] = {
 { "Red" },
 { "Blue" },
 { "Yellow" },
 ....
};
const char *Colors[] = {0};

// in main()
gettextarray(Colors_en, Colors, sizeof(Colors_en) / sizeof(char*));

GetTextArray는 각 입력에서 getText를 호출하고 출력을 씁니다. STD :: Transform에 대한 호출로 구현 될 수 있다고 생각합니다. 그리고 약간의 템플릿 속임수로 크기 매개 변수를 피할 수 있습니다.

또 다른 옵션은 색상 문자열을 사용하려는 지점에서 getText를 호출하는 것입니다 (표시되거나 디스플레이를 위해 문자열에 추가). 이는 더 많은 코드를 변경하는 것을 의미하지만 Main ()가 사용할 수있는 모든 작업을 수행하기 전에 프로그램의 모든 문자열 세트를 번역 할 필요는 없습니다.

메인에서 작업을하고 싶지 않다면 문자열을 사용하는 코드에서 다음과 같은 작업을 수행 할 수 있습니다.

if (Colors[0] == 0)
  gettextarray(Colors_en, Colors, sizeof(Colors_en) / sizeof(char*));

또는 앱이 멀티 스레드 인 경우 고려하십시오 pthread_once 또는 사용하는 스레드 API의 등가.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top