2010-01-05 4 views
35

현재 프로젝트에서 Gettext를 사용하고 있습니다 .po 파일은 버전 제어하에 멋지게 보관됩니다 ( ).버전 제어하에 Gettext .po 파일

PO 파일에는 물론 번역이 포함되어 있지만 그 외에도 에는 정확한 파일에 대한 정보와 번역 가능한 문자열이있는 줄 번호가 포함되어 있습니다.

PO 파일을 업데이트 할 때마다 메타 데이터가 실제 변환보다 훨씬 많이 변경된다는 문제가 있습니다. 이것은 나중에 버전 제어에서 실제로보기가 어렵습니다. 실제로는 이 변경되었습니다. 파일 이름과 행의 변경 사항이 무수히 나타났습니다. 번호는 입니다. 그와 마찬가지로 : 물론

- #: somefile.js:43 
- #: somefile.js:45 
- #: somefile.js:118 
+ #: somefile.js:203 
+ #: somefile.js:215 
    msgid "Translate me please" 
    msgstr "Tõlgi mind palun" 

- #: somefile.js:23 
- #: somefile.js:135 
+ #: otherfile.js:23 
+ #: otherfile.js:135 
    msgid "Note" 
    msgstr "Märkus" 

- #: andThatFile.js:18 
    #: orThisFile.js:131 
- msgid "Before I was like this" 
- msgstr "Selline olin ma enne" 
+ msgid "I happen to be changed" 
+ msgstr "Paistab, et mind muudeti" 

, 간단한 수정 만에서 xgettext 출력 파일 이름/LINENUMBER 의견의 생성을 해제하는 것입니다. 하지만 실제로는 파일 이름을 번역 할 때 매우 유용한 힌트라고 생각합니다.

필자는 자신의 PO 파일의 diff가 마음에 들지 않는 유일한 사람이 될 수는 없습니다. 제안 사항?

+0

또한 변경 사항을 두 가지 변경 사항으로 나눌 수 있습니다. 하나는 메타 데이터를 업데이트하는 것이고 다른 하나는 업데이트를 변경하는 것입니다. 번역. 그런 다음 메타 데이터 변경 사항을 무시할 수 있습니다. –

답변

25

grep 필터를 적용하여 보인 diff에서 주석 메타 데이터를 제거하는 것이 간단합니다. 당신은 버전 컨트롤은 diff 유틸리티의 출력에이 작업을 수행 할 수 있습니다 :

myVersionControl diff REV1 REV2 filea | grep -v '^..#' 

또는 당신은 가능성이 발생합니다 비교를하게하기 전에 다음을 무시하도록 버전 컨트롤은 diff 유틸리티를 지시 할 수 있습니다 보다 안정적이고 예쁘게 출력 : 난 당신이 무엇을 사용 버전 제어 시스템 모른다

하지만 (예를 들어) 자식은 을 diff를하고 (덕분에 특정 파일 형식에 대한 주석 행을 제거하는 전처리 입력에 당신을 수 있습니다 VonC) man gitattributes을보고 을 검색하십시오. 바이너리 파일의 텍스트 diff를 수행하십시오.. 다음은 샘플 스크립트의 몸이 할 것이다 /usr/local/bin/strippocomments로 저장할 수 있다는 :

grep -v '^#:' $1 
그런 다음 저장소에있는 파일 .git/info/attributes에 다음을 추가하여, 전처리 포 파일이 스크립트를 사용하여 자식을 말할 수

:

[diff "podiff"] 
    textconv = /usr/local/bin/strippocomments 

하는 자식은 diff를 사용하여 다음을 포함하지 않아야

*.po diff=podiff 

및 저장소에있는 파일 .git/config#:으로 시작하는 모든 행.

이 방법을 사용하여 git diff에서 생성 된 diff는 패치에 사용되어서는 안되지만 git format-patch은 여전히 ​​기본 diff를 사용하므로 전자 메일 용으로 생성 된 패치는 여전히 괜찮습니다.

+0

내 자식 --ignore-matching-lines 옵션을 지원하지 않는 것 같습니다. 버전 1.6.5.2 사용 –

+0

grep을 사용하여 diff를 필터링하면 실제로 더 깨끗한 결과물을 생성합니다. 어떻게 나 혼자 생각하지 않았어? 물론 이것은 콘솔 인터페이스보다 diff를 볼 때 도움이되지는 않지만 실제로 문제의 대부분을 해결합니다. –

+0

좋아요, 나는 과거에 실제로 해보고 싶었던 많은 것들이 실제로했기 때문에 그것이 작동 할 것이라고 찔렀습니다! 그러나 git diff는 매우 유연하며 아마도 그렇게 할 수 있습니다. –

7

GNU gettext 패키지에는 PO 파일을 사용하여 다양한 작업을 수행 할 수있는 유용한 유틸리티가 많이 있습니다. 두 개의 PO 파일을 비교하는 msgcmp, 공통/고유 메시지를 선택하는 msgcomm, 기존 PO 파일을 선택/필터/변환하는 msgattrib이 있습니다. diff 파일에서 실제로 필요한 것에 따라 msgattrib 또는 msgcomm 중 하나를 사용해야합니다.

파일/줄에 대한 의견이없는 두 개의 PO 파일을 비교할 필요가 있다면 grep 및 temp 디렉토리에 간단한 스크립트를 작성하여 기존 및 새로운 PO 파일로 충분할 것입니다.

7
당신은 mypodiff 당신이

을 WNT WA 줄을 필터링 할 수있는 diff 도구를 호출하는 스크립트를 포 파일에 대한 특별한 사랑하는

[diff "mypodiff"] 
    command = mypodiff 
*.po diff=mypodiff 

를 지정처럼 custom diff a .gitattribute file에서 제공하는 다른 옵션을 볼 수 있었다

+0

감사합니다. 조금 까다로운 부분은 외부 diff 명령에 대한 인수 순서가 정확합니다. –

+0

BTW, 명령'git-show'와'git-log' (그리고 아마도 다른 것들)을 실행할 때'--ext-diff' 옵션을 항상 켜 놓는 방법이 있습니다. 외부 diff 명령은'git-diff'를 사용할 때 .po 파일에 적용되지만 그 명령을 거의 사용하지 않습니다. 다른 것들은'--ext-diff' 옵션을 추가해야합니다. –

+0

나는 'git alias'가 당신을 도울 수 있다고 말할 것입니다. 별명을 정의하여 해당 명령에 관련 옵션을 추가 할 수 있습니다. – VonC

19

gitattributes/textconv 접근 방식은 올바른 방법입니다. 전처리를 수행하는 도구와 관련하여 더 나은 솔루션을 제공하고자합니다. .gitattributes에서

:

*.po diff=po 

.gitconfig에서 : gettext 패키지에서

[diff "po"] 
    textconv=msgcat --no-location --no-wrap --sort-output 

msgcat가 유용한 도구입니다. 그것은 당신이 가지고 놀 수있는 많은 옵션이 있습니다. --no-location 옵션은 특히 행 번호 차이를 필터링하려는 것입니다. xgettext 및/또는 msgmerge 및/또는 편집자가 문자열을 성가신 방법으로 계속 포맷하는 경우 다른 옵션이 유용 할 수 있습니다. 이 경우 해당 도구에 동일한 옵션을 전달하고 편집기를 다시 구성하는 것이 좋습니다.

+2

'.gitattributes'와'.gitignore'와는 달리 소스 트리의'.gitconfig' *는 Git에서 파싱되지 않는다는 것을 알아 두십시오. '~/.gitconfig' 또는'.git/config' 중 하나를 사용해야합니다. – ulidtko

관련 문제