Go to the first, previous, next, last section, table of contents.


기존의 PO 파일 갱신하기

msgmerge 프로그램 실행하기

번역된 항목

msgstr 필드가 번역문으로 채워져 있으면서, 퍼지로 표시되지 않은 (see section 퍼지 항목) PO 파일 항목을 번역된 항목이라고 한다. 번역된 항목만이 GNU msgfmt으로 컴파일될 것이고, 국제화된 프로그램에서 사용될 수 있다. 그 외의 항목 타입은 모두 컴파일에서 제외된다; 메세지 번역은 이들 항목에 대해서는 일어나지 않을 것이다.

몇몇 명령어는 번역된 항목의 처리에 더 관련 있는 명령어이다.

t
다음의 번역된 항목을 찾는다.
M-t
이전의 번역된 항목을 찾는다.

t(po-next-translated-entry)와 M-t(po-previous-transted-entry) 명령은 번역된 항목들이 선택된 상태로 앞으로, 그리고 뒤로 움직인다. 번역된 항목이 없는 경우, 찾기 명령은 계속되어, t의 경우 다시 버퍼의 맨 끝에서부터 찾고, M-t의 경우 다시 버퍼의 맨 처음에서부터 찾는다.

번역된 항목는 보통 번역자가 그 메세지를 편집하고 나서 생긴다, section 번역문 수정. 하지만, po-auto-fuzzy-on-edit 변수의 값이 nil이 아니면, 처음 새로 번역된 항목는 퍼지 항목이 되고, 나중에 공식적으로 진짜 번역된 항목이 되려면 퍼지를 먼저 없애야 한다.

퍼지 항목

각 PO 파일 항목는 어떤 속성들을 갖고 있을 수 있고, 이 속성들 하나하나는 그 항목 번역과 관련해 특별한 이름의 주석문을 사용해서 표시된다. 그 한 가지 속성중의 하나는 fuzzy라는 이름이고, 이 속성을 가진 항목을 퍼지 번역문이라고 한다. 간단히 퍼지 항목라고 한다.

퍼지 항목는 비록 다른 목적으로는 번역된 항목으로 간주될지 몰라도, 보통의 경우 번역자가 다시 손봐야 하는 항목이다. 이 항목는 msgmerge 프로그램이 새로운 PO 틀 파일에 따라 옛날에 번역된 PO 파일을 갱신할 경우에 생긴다. msgmergemsgid가 옛날의 msgid에서 아주 약간 변경되었다고 가정하고, 새로운 항목에 해당하는 옛날 번역문이라고 생각되는 짝을 찾는다. 원 문자열(msgid 문자열)에서 약간만 수정된 경우에는 대부분의 경우 번역된 문자열도 약간만 수정하면 되고, 이 수정작업은 번역자가 직접 해야 한다. 이런 이유로, msgmerge는 어떤 항목을 퍼지로 표시할 수 있다.

또, 번역자는 직접 편의를 위해 어떤 항목을 퍼지로 표시하기로 결정할 수도 있다. 그 항목을 나중에 더 살펴봐야 할 경우가 이런 경우이다. 이런 경우를 위해 몇 명령어는 퍼지 항목 처리와 특히 관련되어 있다.

f
다음의 퍼지 항목을 찾는다.
M-f
이전의 퍼지 항목을 찾는다.
TAB
현재 항목에서 퍼지 속성을 지운다.

f(po-next-fuzzy) 명령어와 M-f(po-previous-fuzzy) 명령어는 퍼지 항목이 선택된 상태로 앞으로, 그리고 뒤로 움직인다. 퍼지 항목이 없는 경우, 찾기 명령은 계속되어, f의 경우 다시 버퍼의 맨 끝에서부터 찾고, M-f의 경우 다시 버퍼의 맨 처음에서부터 찾는다.

TAB(po-unfuzzy) 명령은 어떤 항목에 주어진 퍼지 속성을 없앤다. 보통 그 항목는 번역된 상태일 것이다. 그리고, 만약 po-auto-select-on-unfuzzy 변수의 값이 nil이 아니면, TAB 명령은 자동으로 작업할 또 다른 항목을 찾아 이동할 것이다. po-auto-select-on-unfuzzy의 초기값은 nil이다.

po-auto-fuzzy-on-edit의 초기 값은 nil이다. 하지만, 만약 po-auto-fuzzy-on-edit의 값이 t인 경우에, RET 명령으로 편집된 모든 항목는 퍼지로 표시되어, 나중에 또 다시 점검해야 한다. 이 경우에, 기본적인 아이디어는 변역자가 어떤 항목을 수정하면 그 항목을 (이미 퍼지가 아니라면) 퍼지로 만드는 것이다. 만약 번역자가 그 번역문에 만족한다면, 그때 TAB을 눌러서 퍼지 속성을 제거한 다음에 작업할 또 다른 항목으로 간다. 번역문에 만족하지 못할 경우는 SPC를 써서 또 다른 항목을 찾아가고, 앞의 항목는 퍼지로 남겨둔다.

번역자가 DEL(po-fade-out-entry) 명령을 퍼지로 표시된 항목에 쓰면, 나중에 이 항목에 작업하려고 돌아올때 찾아오기 쉽게 된다.

q 명령으로 PO 파일 버퍼 작업을 끝낼 때가 되면, 퍼지 문자열이 아직 남아있는 경우에 정말로 끝낼 것인지 번역자에게 물어본다.

번역되지 않은 항목

xgettext가 맨 처음에 PO 파일을 만들때, 달리 지정하지 않는다면 원래 문자열로 msgid 필드를 초기화하고, msgstr을 비워둔다. 이렇게 번역문이 비어있는 항목을 번역되지 않은 항목라고 한다. 나중에 프로그래머가 프로그램 내에서 어떤 문자열을 약간 수정할 경우에, 이 변화는 새롭게 수정된 문자열에 대한 번역되지 않은 항목이 PO 파일에 새로 생긴다.

항목 사이를 이동하는 명령들은 번역된 항목과 같은 식으로 번역되지 않은 항목들을 알아낼 수 있다. 번역되지 않은 항목들은 `msgstr ""'로 끝난다는 사실에서 번역되지 않았다는 것을 쉽게 알 수 있다.

번역자가 할 일은 (당연하게도) 번역되지 않은 항목을 찾아서 그에 대한 번역문을 편집하는 것이다. 그리고 이 동작을 번역되지 않은 항목이 하나도 남아있지 않을 때까지 반복한다. 몇 개의 명령어는 번역되지 않은 항목을 처리하는 것과 특히 관련이 있다.

u
다음의 번역되지 않은 항목을 찾는다.
M-u
이전의 번역되지 않은 항목을 찾는다.
k
현재 항목을 번역되지 않은 항목으로 바꾼다.

u(po-next-untranslated-entry) 명령어와 M-u(po-previous-untranslated-entry) 명령어는 번역되지 않은 항목이 선택된 상태로 앞으로, 그리고 뒤로 움지긴다. 번역되지 않은 항목이 없는 경우, 찾기 명령은 계속되어, u의 경우 다시 버퍼의 맨 끝에서부터 찾고, M-u의 경우 다시 버퍼의 맨 처음에서부터 찾는다.

k(po-kill-msgstr) 명령을 쓰면 어떤 항목의 번역문을 비워버려서 번역되지 않은 항목으로 만든다. See section 번역문 수정.

또, q 명령으로 PO 파일 버퍼 작업을 끝낼 때가 되면, 번역되지 않은 문자열이 아직 남아있는 경우에 정말로 끝낼 것인지 번역자에게 질문을 한다.

없어진 항목

없어진 PO 파일 항목이란, 주석으로 처리된 항목을 말한다. 이 주석은 보통 msgmerge에서 더 이상 패키지에서 사용되지 않는 번역문을 발견했을 때 만들어진다.

항목 사이를 이동하는 명령들은, 없어진 항목들도 번역된 항목과 같은 식으로 취급한다. 설령 항목에 msgid 혹은 msgstr이 들어 있더라도, 항목 내의 모든 줄이 #로 시작한다면 없어진 항목이라는 걸 쉽게 알 수 있다.

이 없어진 번역문을 지우거나, 다시 원래 번역되지 않은 문자열로 다시 초기화하는 명령도 있다. 킬 링(kill ring)을 사용하는 명령어들을 이용해 전에 저장된 글을 번역문에 넣을 수도 있다. 사용자는 대화적으로 번역문을 편집할 수도 있다. 이러한 명령어들은 모두 없어진 항목들을 위한 명령이고, 이런 작업 이후에도 그 항목을 없어진 항목으로 남겨둔다.

또, 몇 명령어는 없어진 항목을 처리하는 것과 특히 관련이 있다.

o
다음의 없어진 항목을 찾는다.
M-o
이전의 없어진 항목을 찾는다.
DEL
어떤 항목을 없어진 항목으로 만들거나, 없어진 항목을 지운다.

o(po-next-obsolete-entry) 명령어와 M-o(po-previous-obsolete-entry) 명령어는 없어진 항목이 선택된 상태로 앞으로, 그리고 뒤로 움직인다. 없어진 항목이 없는 경우에도 찾기 명령은 계속되어, o의 경우 다시 버퍼의 맨 끝에서부터 찾고, M-o의 경우 다시 버퍼의 맨 처음에서부터 찾는다.

PO 모드에서는 없어진 항목의 주석을 지우거나, 보통의 유효한 항목으로 만드는 방법이 없다. 왜냐하면 이렇게 할 경우 프로그램 소스코드에 표시되지 않은 문자열에 전혀 대응되지 않은 원 문자열이 들어가도록 되기 때문이다. 이는 엉터리 msgid 값을 절대 만들지 않겠다는 생각에서 나왔다.

하지만, 유효한 항목을 주석처리해서, 없어진 항목으로 만드는 것은 가능하다. GNU gettext 유틸리티는 번역문이 없어진데 대해서 원래의 번역되지 않은 문자열을 그대로 사용하는 방법으로 대처할 것이다. DEL(po-fade-out-entry) 명령은 현재 항목을 제거하는 데 한단계 한단계 가깝게 해 준다. 만약 항목이 번역된 항목인 경우, 이 명령은 일단 이 항목을 퍼지로 만든다. 만약 이미 퍼지일 경우에, 그 항목을 주석 처리할 것이다. 만약 이미 없어진 (주석 처리된) 항목일 경우, PO 파일에서 완전히 삭제한다. 어떤 지워진 번역문을 또 다른 PO 파일 항목(보통 번역되지 않은 항목)로 재활용하기도 쉽다. See section 번역문 수정.

앞으로 PO 모드 개발에서 밤을 새어 가면서 해결할 아주 재미있는 문제가 있다. 아이디어는 어떤 새로운 문자열이 등장했을 때, 없어진 항목들 중에서 가장 후보가 될만한 후보를 알아낼 정도로 PO 모드를 똑똑하게 만드는 것이다. 나는 이 문제가 알고리즘적으로 매우 어려운 문제일거라고 생각하는데, 그것은 비슷한 문자열을 훌륭하면서도 빠르게 판단하는 방법을 개발해야 하기 때문이다. 지금 현재로서는, PO 모드는 번역자에게 모든 결정을 맡긴다. 이와 같이 없어진 항목중에서 적당한 번역문을 찾아낼 수 있게 된다면, PO 모드는 번역자의 작업을 돕는 매우 편리한 도구가 될 것이다.

번역문 수정

PO 모드에서는 버퍼내용을 수정할 때 보통 사용하는 이맥스 명령으로는 PO 파일을 직접 편집하지 못한다. 이렇게 하면 타이핑 실수가 있을 수 없기 때문에, 파일 포맷을 유지하면서 문자열의 따옴표를 제대로 만들 수 있다. 그러한 실수는 아주 쉽게 일어난다. 또 다른 종류의 오류가 아직도 가능한데, V 명령으로 알아낼 수 있다. 그 외의 애러의 경우는, 번역자 자신의 판단력과, 같은 모국어를 쓰는 패키지의 사용자가 보낸 번역관련 버그 보고에 의지하는 수 밖에는 없다.

번역문을 처음 만들거나, 기계적으로 찾아내거나 사용자가 보고한 오류를 고치려고 할 때, 번역문을 수정하는 목적으로 다음 명령을 자주 쓴다.

RET
대화적으로 번역문을 편집한다.
LFD
번역문을 원래, 번역되지 않은 문자열로 다시 초기화한다.
k
번역문을 킬 링(kill ring)에 저장하고 지운다.
w
번역문을 지우지 않은 채, 킬 링(kill ring)에 저장한다.
y
현재 번역문을 킬 링(kill ring)에서 새로 가져온 번역문으로 바꾼다.

RET(po-edit-msgstr) 명령은 새로운 이맥스 윈도우를 열고, 그 윈도우에서 새로운 번역문을 편집하거나, 기존의 번역문을 수정한다. 이 새 윈도우는 현재 PO 파일 항목에서 가져온 번역문이 들어 있게 되고, 모든 따옴표가 제거된 상태로, 이맥스의 명령어를 이용해서 수정할 수 있는 상태가 된다. 번역자가 번역을 마치면, C-c C-c를 이용해 편집창을 닫고, 그 결과가 따옴표가 자동으로 붙여진다. 혹은 C-c C-k를 사용해 번역을 취소할 수 있다. 자세한 정보는 See section 서브에디트에 대하여 자세히.

LFD 명령(po-msgid-to-msgstr)은 번역문을 원문으로 초기화한다. 이 명령어는 앞의 번역을 모두 무시하고, 원문의 번역을 새로 하려고 할 때 쓴다.

번역되지 않은 항목을 편집할 때 언제나 LFD 명령이 자동으로 실행되도록 조정할 수 있다. po-auto-edit-with-msgid의 값을 t로 하면, 번역문이 없는 경우에 자동으로 원 문자열과 같도록 초기화될 것이다. po-auto-edit-with-msgid의 기본값은 nil이다.

사실 번역문을 빈 문자열에서부터 새로 시작하는 것이 좋을지, 원 문자열을 복사한 다음에 시작하는 것이 좋을지는 취향 혹은 습관의 문제이다. 어떤 경우에는, 원 언어와 번역문을 쓸 언어가 너무 달라서 처음부터 시작하는 편이 좋을 수도 있다. 또 한편, 원 언어와 번역문을 쓸 언어가 비슷해서, 이미 원 문자열에 쓰여진 단어를 다시 쓰는 건 낭비일 수도 있다. 또 번역자가 원 문자열이 바로 눈앞에 있는 편을 좋아할 수도 있다. 즉, 원래 문자열을 지워나가는 편집 작업이 더 필요하지만 조금씩 조금씩 원래 글을 번역문으로 대체해 나가는 작업을 더 좋아할 수도 있다.

k(po-kill-msgstr) 명령은 단순히 번역문을 없애버려서 해당 항목을 번역되지 않은 항목으로 만든다. 이렇게 하면 전에 있던 번역문은 킬 링(kill ring)이라고 알려져 있는 특별한 장소로 옮겨진다. w(po-kill-ring-save-msgstr) 명령 역시 번역문을 그대로 kill ring으로 복사하는 효과가 있지만, 항목는 그대로 두고 번역문을 지우지 않는다. 두 명령 모두 모든 버퍼들 사이에 공유되는 이맥스의 kill ring을 사용하고, 이 킬 링(kill ring)은 이맥스를 좋아하는 사람들에게는 이미 잘 알려져 있다.

킬 링(kill ring)은 여러 개의 번역문을 저장할 수 있기 때문에, 번역자는 kw를 여러번 쓸 수 있다. 킬 링(kill ring)에서부터 나오는 문자열은 나중에 여러 가지 이맥스 버퍼 내에서 쓰여질 수 있다. 특히, 킬 링(kill ring)은 번역문을 한개의 PO 파일 버퍼내의 다른 항목으로 옮기는 데 사용되거나, 혹은 여러 개의 버퍼를 사용중일 때 PO 파일들 사이에서도 사용될 수 있다.

PO 모드가 아닌 버퍼들 사이의 자료교환을 위해서, k 명령으로 킬 링(kill ring)에 들어간 번역문은 저장되기 전에 완전히 따옴표가 제거된다: 외부의 따옴표는 제거되고, 여러줄의 문자열은 연결되고, 백슬래쉬로 시작하는 이스케이프 연속은 거기에 해당하는 각 문자로 바뀐다. 없어진 항목에 대해서는 좀 다르게, 저장되기 전에 번역문의 주석이 없어진다.

y(po-yank-msgstr) 명령은 현재 항목의 번역문을 킬 링에서 나온 문자열로 완전히 교체한다. 이맥스의 용어를 따라서, 우리는 이 교체 문자열을 PO 파일 버퍼에 당겨넣어진다(yanked)고 표현한다. See section `Yanking' in The Emacs Editor. 첫번째로 y를 쓸 때, 번역문은 가장 최근에 킬 링(kill ring)에 들어가게 된 값으로 바뀌게 된다. 만약 중간에 다른 키를 누르지 않고 y가 즉시로 다시 한번 타이프된다면, 방금 들어간 번역문은 사라지고 킬 링(kill ring)에서 두번째로 최근의 문자열로 교체될 것이다. y를 한번에 여러번 반복하면, 번역자는 정말로 원하는 문자열을 찾을 때까지 킬 링(kill ring)에 번역된 문자열들을 죽 둘러볼 수 있다.

문자열이 PO 파일 항목으로 당겨져 들어갈 때, 그 문자열은 PO 파일 형식에 맞도록 완벽하게 자동으로 따옴표가 씌워질 것이다. 그리고, 만약 해당 항목이 없어진 항목일 경우, PO 모드는 자동으로 주석문 안에 문자열을 삽입한다. 역시, 번역자는 (물론) 번역문이 프로그램이 사용하기에 적합한지를 제외하고는 따옴표를 어떻게 씌우느냐는 문제로 부담을 가질 필요가 없다.

k 혹은 w는 킬 링(kill ring)에 문자열을 밀어넣는 유일한 명령어는 아니다. 번역문을 바꾸는 (또는 번역자 주석을 바꾸고) 거의 모든 PO 모드 명령어는 자동으로 옛날 문자열을 킬 링(kill ring)에 저장한다. 이 규칙의 큰 예외는 당겨넣기(yanking) 명령어들 뿐이다.

지우고 당겨넣는 동작을 좀더 잘 설명하기 위해, 실제 자주 발생하는 상황에 대해 예를 들어본다. 프로그래머가 프로그램 내의 어떤 문자열을 조금 바꿨을 때, 그 변화는 나중에 PO 파일의 번역되지 않은 항목이 생기도록 만든다. 그리고 원래 있던 문자열은 없어진 항목으로 변한다. 대부분의 경우, 번역자는 없어진 항목에서부터 번역문을 가져와서 더 작업함으로써 시간을 줄이려고 할 것이다. 일단 그 번역되지 않은 항목의 msgstr 필드를 아까 가져온 번역문으로 초기화하는 것이다. 일단 이렇게 하면, 방금 없어진 항목는 더이상 필요가 없으므로, 안전하게 지울 수 있다.

번역자가 번역되지 않은 항목을 찾고 번역문이 약간 다른 항목이 어딘가 있을 것이라고 의심이 가면, 즉각 m을 사용해 현재 항목 위치를 표시해 두고, o를 써서 대응되는 번역문을 찾기를 바라면서 없어진 항목들을 추적하기 시작한다. 일단 찾고자 하는 항목을 찾으면, DEL 명령으로 그 없어진 항목을 지운다. 이때 DEL 명령은 그 번역문을 지우므로, 그 번역문은 킬 링(kill ring)에 들어간다. 그 다음에 r을 사용해 원래 번역되지 않은 항목으로 돌아간 다음, y로 저장된 번역문을 msgstr 필드로 당겨넣는다. 그다음에 번역자는 RET을 써서 번역문을 더 다듬은 다음, 또다시 um을 사용해서 다음 번역되지 않은 문자열을 향해 떠난다.

어떤 키 연속이 계속 반복해서 타이프되는 경우, 이 키 연속을 미리 기억해 놓고 필요할 때 반복하는 이맥스의 키 매크로 기능에 익숙해지면 더 편리할 것이다. See section `Keyboard Macros' in The Emacs Editor.

주석문 수정하기

심각하게 작업중인 어떠한 번역도 많은 언어 문제와 관련되어, 어떤 결정을 내릴지, 그리고 그 결정사항을 어떻게 문서화할지 등과 같은 어려움이 생긴다. 이걸 문서화하면 PO 파일 내에 번역자 주석문의 형태로 저장되고, 번역자는 자유롭게 주석문을 만들고, 지우고, 수정할 수 있다. 이 주석문은 오랜 시간 후에 이 PO 파일에 다시 돌아왔을 때 도움이 될 것이다.

맨 처음의 `#' 다음에 빈칸이 없는 주석문, 예를 들어 `#.' 혹은 `#:'로 시작하는 주석문들은 번역자 주석문이 아니고, 도다른 gettext 도구에 의해 만들어진 것이다. 그러므로 아래에 설명된 명령어들은 이렇게 시스템이 첨가한 주석문을 바꾸지 않는다. 이 명령어들은 번역자가 수정할 주석문에만 사용할 수 있다. See section PO 파일의 형식.

다음 명령어는 번역문을 수정하는 명령어와 어느정도 비슷하기 때문에, 번역문 수정 명령어와 비슷한 사용법이 여기에도 적용된다. See section 번역문 수정.

#
대화적으로 번역자 주석을 편집한다.
K
킬 링(kill ring)에 번역자 주석문을 저장하고, 지운다.
W
킬 링(kill ring)에 번역자 주석문을 저장하고, 지우지 않는다.
Y
번역자 주석문을 킬 링(kill ring)에서 가져온 문자열로 교체한다.

이 명령어들은 번역문을 고치는 PO 모드 명령어들과 하나씩 대응되고, 번역문이 아니라 번역자 주석문에 해당한다는 것만 제외하고는 같은 방법으로 동작한다. 그러므로, 이미 자세한 내용은 설명되었기 때문에, 아래에는 간단히만 설명한다. See section 번역문 수정.

#(po-edit-comment) 명령은 현재 PO 파일 항목의 번역자 주석문을 담고 있는 새로운 이맥스 창을 연다. 이런 주석문이 없는 경우, 번역자가 주석을 새로 추가하려는 것으로 가정하고, 비어있는 스크린을 보게 될 것이다. 주석표시 (#)와 그 다음에 오는 공백은 편집 전에 자동으로 제거되고, 편집이 끝나면 다시 첨가된다. 없어진 항목에 속해 있는 번역자 주석문을 위해, 주석처리 없애기 및 다시 주석처리하기 작업은 두번에 걸쳐 이루어진다. 일단 편집 창에 들어선 다음, C-c C-c 키로 주석문 편집을 끝낼 수 있다. 자세한 것은 See section 서브에디트에 대하여 자세히.

po-subedit-mode-hook에 함수가 들어 있으면, 편집창에 문자열을 삽입된 후에 이 함수들이 실행된다.

K(po-kill-comment) 명령은 모든 번역자 주석문을 없애고, 그주석문을 킬 링(kill ring)에 저장한다. W(po-kill-ring-save-comment) 명령은 번역자 주석문을 kill ring에 저장하지만 그 주석문은 그대로 남겨둔다. Y(po-yank-comment) 명령은 번역자 주석문을 킬 링(kill ring)의 맨 앞에서 가져온 문자열로 완전히 바꾼다. 이 명령이 반복되면 주석문은 계속해서 킬 링(kill ring)을 따라 가져온 문자열로 하나씩 삽입되고 없어지고 또다른 문자열로 교체되는 것을 반복한다.

킬 링(kill ring)에서 모든 문자열은 같은 성질을 가진다. 번역 문자열과 번역자 주석문 문자열 사이에 차이는 없다. 예를 들어, 번역자가 막 번역문 편집을 끝내고, 왜 전의 번역문이 좋지 않은지에 대해 번역자 주석문을 만들어서 무슨 문제가 있었는지 기록하려 한다고 가정하자. 주석문 내에서 그 문제를 기록할 것이고, 번역자는 번역자 주석문에 앞의 번역문을 인용할 수 있다. 이렇게, 번역자는 번역자 주석문을 킬 링(kill ring)의 맨 앞에 있는 이전의 번역문으로 초기화할 수 있다. 편집작업은 이미 전의 번역문을 킬 링(kill ring)에 밀어넣었을 것이므로, 번역자는 간단히 # 다음에 M-w를 누르면 전의 번역문을 그대로 번역자 주석문에 쓸 수 있고, 이제 좀 더 설명하는 글을 쓸 준비가 된 것이다.

또 한편으로, 이미 번역자 주석문이 있고, 이 주석문을 완전히 교체하는 대신에 그 뒤에 또다른 주석을 추가하고 싶다고 가정하자. 이 경우에, 주석문을 직접 #로 편집한다. 편집 윈도우 내에서 보통 이맥스 명령어인 C-y(yank)와 M-y(yank-pop)을 써서 원하는 이전 번역문을 붙여 넣을 수 있다.

서브에디트에 대하여 자세히

PO 서브에디트 마이너 모드는 좀 더 자세히 설명할 만한 가치가 있다. 이 모드에서는 보통의 이맥스 편집 명령어 이외에 몇 가지 명령어를 더 사용할 수 있다.

C-c C-c
편집을 끝낸다.
C-c C-k
편집을 취소한다.
C-c C-a
보조 PO 파일을 참고한다.

윈도우의 내용은 주어진 메세지의 번역문이거나, 번역자 주석문이다. 번역자는 이 윈도우를 번역자 마음대로 고칠 수 있다. 편집이 끝나면, C-c C-c(po-subedit-exit) 명령으로 번역문 편집을 PO 파일에 기존의 번역문 대신에 반영한다. PO 파일이 보이지 않거나 버퍼를 전환했을 지라도 마찬가지이다.

번역자가 편집중인 번역문이나 주석문이 RET이나 # 명령을 내리기 전의 것에 비해 못 마땅하다면, C-c C-k(po-subedit-abort) 명령으로 편집하던 것을 없애고, 원래의 번역문이나 주석문을 유지할 수 있다. 또 다른 방법은 C-c C-c 명령으로 끝낸 다음, U를 타이프해서 전에 편집한 상태로 되돌리는 것이다.

C-c C-a 명령은 현재 번역문을 편집하면서 다른 언어로 된 번역문을 살펴보는 데 쓰인다. 하지만 이 기능은 번역자가 여러 언어에 능통하고, 물론 그만큼 잘 되어 있는 보조 PO 파일을 사용할 수 있는 경우에만 쓸 수 있다 (see section 보조 파일 참조하기).

po-subedit-mode-hook에 들어 있는 함수들이 있다면, 문자열이 편집 버퍼에 들어간 다음에 실행된다.

번역문을 편집하는 동안, 번역자는 RET(줄바꿈)이 들어가지 말아야 할 문자열 끝에 줄바꿈을 잘못 입력하지 않도록, 혹은 줄바꿈이 들어가야 할 곳에 줄바꿈을 없애지 않도록 주의해야 한다. 이 문자열은 편집 버퍼에서는 보이지 않기 때문에, 쉽게 실수할 여지가 있다. 번역자를 위해 RET 명령은 편집할 문자열의 맨 끝에 < 문자를 집어 넣는다. 하지만 이 <는 편집할 문자열의 일부가 아니다. 편집 윈도우에서 C-c C-c로 나갈 때, PO 모드는 자동으로 그러한 <를 제거하고 그 뒤에 있는 공백을 제거한다. 번역자가 맨 끝의 < 뒤에 어떤 문자든 추가했다면, <는 그 기능을 잃고 편집할 문자열의 일부가 되어 버린다. 번역자가 맨 끝의 <를 지워버렸다면, 편집할 문자열은 있는 그대로 취급되어, 뒤에 들어 있는 모든 줄바꿈 문자들이 보이지 않더라도 모두 번역문으로 취급된다. 또, 번역한 문자열이 진짜 <로 끝나야 하는 경우에, 맨 끝의 <는 지워지지 않을 것이다; 즉 문자열은 편집 윈도우에서 한 번에 <가 두 개 연속해서 있는 것처럼 보여야 한다.

번역문(혹은 주석문)을 편집할 때, 번역자는 커서를 PO 파일 버퍼의 여기저기로 이동하거나 다른 항목으로 이동하면서 원하는 대로 볼 수 있다. 만약 번역자가 편집을 일시 중단하고 PO 파일 버퍼로 돌아간다면, 다른 항목을 수정해 나갈 수도 있다. 각 항목은 각각이 서브에디트 버퍼를 가진 것처럼 편집될 것이다. 같은 항목의 번역문 주석문을 동시에 편집할 수도 있고, 다른 PO 파일의 항목을 동시에 편집할 수도 있다. 이미 편집중인 항목에서 RET을 누르면 바로 그 편집창에서 편집을 계속하게 된다. 번역자는 많은 이맥스 윈도우에서 작업하는 것을 좋아할 것이다!

일시 중단된 서브에디트 창은 언제 어떻게 시작되었든 간에 어떤 순서로든지 완료되거나 취소될 수 있다. 많은 서브에디트창이 일시 중단되고 번역자가 해당 PO 파일을 (q 명령으로) 중단하려고 한다면, 서브에디트 창은 자동으로 하나씩 재시작될 것이고, 번역자는 각각을 어떻게 할 지 결정할 수 있다.

C 소스 내용

PO 모드는 GNU gettext 유틸리티를 통해 만들어진 PO 파일에 사용될 때 특히 강력하다. 왜냐하면 이 유틸리티들은 특별한 주석문을 PO 파일에 삽입하기 때문이다. 이중에는 PO 파일의 각 항목이 프로그램 소스의 어느 부분에 번역되지 않은 문자열이 위치하는지 알려주는 주석문도 있다.

번역자가 번역되지 않은 항목을 만나면, 원 문자열이 무슨 뜻인지 알 수 없거나, 너무 간결하거나 암호같거나, 혹은 애매한 경우가 있다. 문자열을 어떻게 번역할지 결정하기 전에, 이 문자열이 무슨 뜻이고 어떤 번역문이 정확히 맞을지 알아야 제대로 번역할 수 있다. 대부분의 경우, 이러한 문제가 발생하면 판단을 내릴 유일한 방법은 그 문자열이 쓰여진 프로그램 소스를 직접 보고 프로그래머가 거기에 썼을지 모르는 주변의 주석문을 찾는 것이다. 그리고 어떤 종류든지 도움이 될 만한 단서를 찾아본다.

다음 명령어는 번역자가 어떤 PO 파일 항목에 대한 프로그램 소스 내용을 찾는데 사용된다.

s
프로그램 소스 내용을 다시 표시하거나, 표시할 소스의 위치들을 차례로 빙빙 돌면서 표시한다.
M-s
메뉴로 선택한 프로그램 소스 내용을 표시한다.
S
소스 파일을 찾을 경로에 디렉토리를 하나 추가한다.
M-S
소스 파일을 찾을 경로에 디렉토리를 하나 지운다.

s(po-cycle-reference)와 M-s(po-select-source-reference) 명령은 두 명령 모두 또다른 윈도우를 열어서 소스 프로그램 파일을 표시해 주고, 번역할 문자열이 실제로 사용된 위치로 커서를 미리 이동시켜놓고 표시한다. 이렇게 함으로써, 이 명령은 해당 문자열에 대한 소스 프로그램의 내용을 알려주게 된다. 하지만 그 항목에 소스 내용 참조링크가 없는 경우, 혹은 프로그램 소스를 찾을 경로중에서 모든 참조링크를 찾을 수 없는 경우에, 이 명령은 이 상황을 오류로 취급한다.

설령 s(혹은 M-s)가 새로운 윈도우를 열 경우에도, 커서는 PO 파일 윈도우에 있다. 정말로 번역자가 프로그램 소스 파일로 커서를 옮기고 싶으면 O 명령과 같은 명령을 이용해 직접 커서를 옮겨야 한다.

s가 첫번째로 타이프될 때, 혹은 전에 s 명령을 사용해 소스를 본 항목과는 다른 새로운 PO 파일 항목에서 타이프될 경우에, 이 명령은 이 항목의 가장 첫번째 소스 내용을 (있다면) 보여준다. 현재 PO 파일 항목에 대해 이미 어떤 소스 내용이 최근에 표시되었을 때, 번역자가 다른 소스 내용을 돌아다니고 싶다면 s를 다시 타이프하면 최근에 표시된 내용을 (별도의 윈도우에) 갱신할 것이다. 특히, 만약 번역자가 소스 파일의 내용에서 커서를 빼내고 싶은 경우에, 이 명령은 커서를 다시 그 문맥상으로 돌려놓을 것이다. PO 모드는 해당 항목에 대해 모든 소스 내용을 돌아가면서 반복하다가 마지막 소스내용을 보여주고 난 후 다시 첫번째 소스내용으로 돌아간다.

M-s 명령은 다르게 동작한다. 참조링크 사이를 반복하는 대신에, 번역자가 여러 가지 참조링크중에 어떤 한 개의 링크를 선택하도록 하고, 선택된 링크를 표시해 준다. 이 명령은 완성(completion) 기능과 함께 사용되면 아주 좋다. 즉, 번역자가 M-s 바로 다음에 질문에 대한 답으로 TAB을 타이프하면, 번역자는 모든 가능한 참조링크에 대한 메뉴를 보고, 가능한 답이 무엇인지 확인할 수 있다. 이 명령은 한개의 번역할 문자열에 대해서 아주 많은 소스내용이 붙어 있을 경우에만 쓸모가 있다.

프로그램 소스 파일은 보통 PO 파일이 있는 위치에 대해 상대적으로 위치한다. 이 시도가 실패할 경우에, 바로 윗 디렉토리에 대한 상대 위치에서 파일을 찾으려는 시도를 한다. 앞의 두 경우는 대부분의 PO 파일에 대해 제대로 동작한다. 하지만, PO 파일의 위치가 이동되었거나, 정상적인 위치가 아닌 곳에서 편집되었을 수도 있다. 이럴 경우에, 번역자는 진짜 PO 파일이 정상적으로 있어야 할 디렉토리를 PO 모드에 알려줘야 한다. 여러 개의 디렉토리를 지정할 수 있고, 이 디렉토리들은 프로그램 소스의 찾기 경로라고 하는 것을 구성한다. S(po-consider-source-path)명령은 대화적으로 찾기 경로의 앞에 한개의 새로운 디렉토리를 추가하는 데 사용된다. 그리고 M-S(po-ignore-source-path) 명령은 더이상 찾기 경로에 놓고 싶지 않은 디렉토리를 (완성(completion)과 함께) 선택하는 데 사용된다.

보조 파일 참조하기

PO 모드에는 여러 개의 언어에 능숙한 유식한 번역자의 경우, 알고 있는 또 다른 언어에 있는 번역문을 참조할 수 있는 기능이 있다. PO 모드는 이 또 다른 언어의 번역문을 번역자 자신의 작업에 참고자료로 제공해 준다. 게다가 PO 모드를 이용하면 여러 개 언어에 대한 번역문을 쉽게 만들 수 있다 (이런 식으로 작업하기를 좋아하는 번역자를 위해).

보조 PO 파일은 번역자가 작업중인 같은 패키지를 위한, 하지만 또 다른 고유어를 위해 작성된 PO 파일을 말한다. 보조 PO 파일을 선언하고 처리하는 명령어가 있고, 항목에 대해 참고자료를 보여주는 기능도 개발중이다.

다음과 같은 보조 파일 명령어가 PO 파일에 있다.

a
같은 항목에 대한 또다른 번역문을 보조 파일에서 찾는다.
M-a
어떤 보조 파일을 지정해서 그 파일로 이동한다.
A
이 PO 파일을 보조 파일로 만든다.
M-A
PO 파일을 보조 파일 리스트에서 지운다.

A(po-consider-as-auxiliary) 명령은 현재 PO 파일에 대해 보조 파일들의 리스트를 첨가한다. M-A(po-ignore-source-path) 명령은 이 리스트를 지운다.

a(po-cycle-auxiliary) 명령은 모든 보조 PO 파일을 죽 돌아보면서, 또다른 언어의 번역된 항목의 msgid 필드가 현재 항목과 같은 항목을 찾는다. 그런 항목을 찾으면 화면상에서 현재 PO 파일의 위치를 차지한다 (그 윈도우가 위에 나타난다). 이렇게 하기 전에, 현재 PO 파일이 아직 보조파일이 아니라면, 하나의 보조 파일로 등록한다. 즉, 이 새로 표시된 PO 파일에서 a 명령은 계속해서 또 다른 PO 파일을 찾을 것이고, a를 반복하면 마침내 맨 처음 PO 파일로 돌아오게 된다.

M-a(po-select-auxiliary) 명령은 번역자가 특정 보조 파일을 선택하도록 질문을 한다. 완성(completion)을 이용해 답할 수 있고, 그 다음에 선택된 PO 파일로 이동한다. 이 명령은 선택된 파일이 현재 항목과 똑같은 msgid 필드가 있는지를 체크하고, 있으면 그 항목이 현재 항목이 된다. 그렇지 않으면 선택된 파일의 커서는 움직이지 않는다.

이 기능을 완전히 사용하려면, 보조 PO 파일은 표준화되어, msgid 필드가 정확히 같은 방법으로 쓰여져야 한다. msgid 필드를 같은 문자열에 대해 여러 가지 방법으로 작성할 수도 있다지만, 다르게 쓰면 PO 모드의 보조 파일 명령이 제대로 동작하지 않을 것이다. 하지만 동일한 msgid 필드가 다르게 쓰여지는 일은 보통 일어나지 않을 것이다. 대부분의 PO 파일들은 같은 GNU gettext 도구에 이해 msgid 필드가 만들어졌을 것이기 때문이다.

하지만, PO 파일은 맨 처음에 소스 파일에 표시된 문자열에서 만들어지는 게 아니라 PO 모드 자체에 의해 만들어지고, 다른 방법으로 표준화된다. 즉 최종 PO 파일은 `M-x normalize' 명령으로 만들어진다. PO 모드와 다른 GNU gettext 도구들 사이의 이러한 불일치가 완전히 없어지면, 번역자는 표준화 문제에 대해 신경을 쓰지 않아도 될 것이다.

번역 요약문 사용하기

요약문은 아직 구현되지 않았다.

새롭게 만들어진 이 PO 모드의 기능은 번역자가 이미 번역된 번역문들을 요약해서 관리할 수 있는 기능이다. 요약문은 여러 개의 패키지에서 자주 등장하는 번역문들로 구성된 특수 목적의 PO 파일이다. 번역자는 자기 요약문에 번역항목을 추가하고, 요약문에 들어 있는 번역문에서부터 나중에 번역이 안 된 항목들을 초기화하고, 이미 번역된 항목들을 갱신하는 명령을 쓸 수 있다. 하지만, 이 작업을 위해서는, 요약문도 표준화되어야 한다. See section 항목의 문자열 표준화.


Go to the first, previous, next, last section, table of contents.