2017-09-06 8 views
1

자동으로 (documented으로) 고유 명사와 관련하여 번역을 돕기 위해 주석을 추가하는 것이 가능하다 xgettext 도구를 사용하여.특정 문맥을 proper_name에 --keyword로 지정하는 방법은 무엇입니까?

--keyword='proper_name:1,"This is a proper name. See the gettext manual, section Names."' 

이 같은 .pot 파일에 압축을 적절한 이름 결과 :

문서는 명령 줄에 다음을 추가하는 제안

#. This is a proper name. See the gettext manual, section Names. 
#: ../Foo.cpp:18 
msgid "Bob" 
msgstr "" 

이의 문제; 해당 문자열에 대해 특정 컨텍스트가 정의되지 않았기 때문입니다. 여기에 이상적으로 적합한 이름이 추출 될 것입니다 방법 :

# Hoping that 0 would be the function name 'proper_name'. 
--keyword='proper_name:0c,1,"This is a proper name. See the gettext manual, section Names."' 

# Hoping that -1 would be the function name 'proper_name'. 
--keyword='proper_name:-1c,1,"This is a proper name. See the gettext manual, section Names."' 

# Hoping that the string would be used as the context. 
--keyword='proper_name:"Proper Name"c,1,"This is a proper name. See the gettext manual, section Names."' 

# Hoping that the string would be used as the context. 
--keyword='proper_name:c"Proper Name",1,"This is a proper name. See the gettext manual, section Names."' 

이 모두에 사용되는 특정 msgctxt을 강제하는 방법입니다 :

#. This is a proper name. See the gettext manual, section Names. 
#: ../Foo.cpp:18 
msgctxt "Proper Name" 
msgid "Bob" 
msgstr "" 

나는 다음하지만 성공을 시도했습니다 키워드로 추출한 문자열 (위의 예에서 proper_name과 같은)? 나는 아마도 사용하는 것으로 간주 그대로

xgettext와이를 달성 할 수있는 옵션이없는 경우 다음

--keyword='proper_name:1,"<PROPERNAME>"' 

과 결과 :

#. <PROPERNAME> 
#: ../Foo.cpp:18 
msgid "Bob" 
msgstr "" 

문제는 다음이된다; 자동으로 다음에 결과 .pot 파일이 모든 항목을 번역하는 방법 :

#. This is a proper name. See the gettext manual, section Names. 
#: ../Foo.cpp:18 
msgctxt "Proper Name" 
msgid "Bob" 
msgstr "" 

답변

1

당신이 메시지 컨텍스트를 추출 할 경우, 인수 목록의 일부가되고있다. 그리고 "Nc"의 수치 부분은 양의 정수 여야합니다. 0, -1로 시도한 모든 것이 효과가 없습니다. 미안합니다.

함수의 시그니처는 다음과 같이해야합니다

#define PROPER_NAME "Proper Name" 
const char *proper_name(const char *ctx, const char *name); 

을 그리고 다음과 같이 호출 :

모든 코드를 통해 PROPER_NAME를 반복하지만 얻을 수있는 유일한 방법
proper_name(PROPER_NAME, "Bob"); 

메시지 컨텍스트에 추가합니다.

아마도 기능 요청을 제출 하시겠습니까?

는 소스 코드를 변경하지 않고 동일한을 달성 해킹 있습니다. POTFILES-proper-names

복사 파일 POTFILESPOTFILES.in에 선 ./proper_names.pot을 추가 : 나는 당신이 C 표준 Makefile을 사용하고 (하지만 당신은 다른 언어로 같은 작업을 수행 할 수 있습니다) 있다고 가정합니다.

은 그럼 당신은 proper_names.pot을 만들 수 있습니다

xgettext --files-from=POTFILES-proper-names \ 
     --keyword='' \ 
     --keyword='proper_names:1:"Your comment ..."' \ 
     --output=proper_names.pox 

이 이제 "proper_names()"로 표시했습니다 된 항목이 포함됩니다. 이제 컨텍스트를 추가하십시오.

msg-add-content proper_names.pox "Proper Name" >proper_names.pot 
rm proper_names.pot 

불행히도 "msg-add-content"라는 프로그램이 없습니다. 엄청난 양의 파서 중 하나를 꺼내 쓰고, 직접 쓰십시오.

이제 평소와 같이 PACKAGE.pot을 업데이트하십시오. "proper_names.pox"는 주 xgettext 실행을위한 입력 파일이기 때문에 컨텍스트가 추가 된 추출 된 고유 이름이 모두 팟 파일에 추가되며 해당 컨텍스트가 사용됩니다. .POT 파일에 모든 항목에 메시지 컨텍스트를 추가하기위한 다른 스크립트의 짧은

이 하나를 사용

당신은 그것을 위해 펄 라이브러리 "로케일 :: PO"를 설치해야
#! /usr/bin/env perl 

use strict; 

use Locale::PO; 

die "usage: $0 POFILE CONTEXT" unless @ARGV == 2; 

my ($input, $context) = @ARGV; 

my $entries = Locale::PO->load_file_asarray($input) or die "$input: failure"; 
foreach my $entry (@$entries) { 
    $entry->msgctxt($context) unless '""' eq $entry->msgid; 
    print $entry->dump; 
} 

, "sudo cpan install Locale :: PO"를 사용하거나 공급 업체가 가질 수있는 사전 빌드 된 버전을 사용하십시오.