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


PO 파일과 PO 모드의 기본

프로그래머와 번역자는 GNU gettext의 도구를 이용해 번역 파일을 만들고, 새로 고치고, 사용한다. 이 번역 파일은 텍스트 형식이고, 직접 편집할 수 있는 PO 파일이다. 이 장에서는 PO 파일의 형식에 촛점을 맞추고, 또 PO 모드의 기본적인 사용법을 담고 있다. PO 모드에 대한 설명은 이 안내서의 한 군데에 집중되어 있지 않고, 안내서 전체에 흩어져 있다. 여기서는 PO 모드의 기초만을 알려준다.

GNU gettext의 완벽한 설치

일단 GNU gettext 배포본을 받아서, 압축을 풀고, ./configure하고 컴파일했으면, `make install' 명령을 실행했다면 xgettext, msgfmt, gettext, 그리고 msgmerge가 제 위치에 설치되었을 것이고, 그에 해당하는 메세지도 설치되었을 것이다. 보다 완전히 설치하려면 이맥스 사용자들이 PO 모드를 사용할 수 있도록 만들어야 할 것이다.

PO 모드를 설치할 때, `.emacs' 파일을 다음과 같은 줄이 포함되도록 수정해야 한다.

(setq auto-mode-alist
      (cons '("\\.po[tx]?\\'\\|\\.po\\." . po-mode) auto-mode-alist))
(autoload 'po-mode "po-mode" "Major mode for translators to edit PO files" t)

나중에, 언제라도 `.po', `.pot' 혹은 `.pox' 파일을 편집하게 되거나, `.po.'을 파일이름 중간에 가진 파일이 있을 경우에, 이맥스는 필요한 `po-mode.elc'(혹은 `po-mode.el') 파일을 읽어들여서, 자동으로 해당 버퍼에 PO 모드 명령을 사용할 수 있도록 만든다. PO 모드의 버퍼의 모드 라인(mode line)에는 PO라는 글자가 나타난다. 한 개의 이맥스 세션에서 여러개의 PO 파일을 편집할 수도 있다.

만약 이맥스 버전 20이나 더 높은 버전을 사용하면서 시스템에 적당한 다국어 글꼴을 설치했다면, 언제든지 PO 파일의 코딩 시스템(coding system)을 찾아내도록 할 수 있다. 이렇게 하면 대부분의 경우 (언제나는 그렇지는 않다) 필요한 글꼴을 자동으로 읽고 번역문을 이맥스 스크린에 표시하게 된다. 이렇게 하려면, 다음과 같은 줄을 `.emacs' 파일에 첨가한다:

(autoload 'po-find-file-coding-system "po-mode")

만약에 국제 문자가 나타나야 할 위치에 사각형만 보인다면, 다른 폰트집합을 선택해 보기 바란다 (쉬프트와 첫번째 마우스 버튼을 누른다).

PO 파일의 형식

PO 파일은 많은 항목(entry)들로 구성된다. 각 항목은 번역되지 않은 원래 문자열과 그에 해당하는 번역문을 대응시킨다. 보통 한 개의 PO 파일에 들어 있는 항목들은 모두 한 개의 프로젝트를 위한 것이고, 그 안의 모든 번역문은 하나의 언어를 위한 것이다. 하나의 PO 파일 항목은 다음과 같이 구성되어 있다:

공백
#  번역자-주석문
#. 자동-주석문
#: 참조...
#, 플래그...
msgid 번역되지-않은-문자열
msgstr 번역된-문자열

번역자는 PO 파일의 일반적인 구조를 잘 이해하고 있어야 한다. PO 파일을 사용할 경우에는 PO 모드가 많은 역할을 해 주므로, 번역자는 그 자세한 파일 형식에 관해서는 알 필요가 없다.

항목은 공백으로 시작한다. 보통 GNU gettext 도구로 만들어진 경우에, 각 항목 사이에는 정확히 한개의 빈줄이 들어간다. 그리고 #와 빈칸으로 시작되는 주석문이 있다. 두가지 종류의 주석문이 있다: # 다음에 빈칸이 오는 주석문은 전적으로 번역자가 만들고 관리한다. 그리고 또 한 가지는 # 다음에 빈칸이 아닌 어떤 문자가 오는 경우인데, 이것은 자동으로 GNU gettext 도구에 의해 만들어 진다. 어떤 주석문이든 간에 주석문은 없어도 상관 없다.

항목에는 공백과 주석문 다음에 두 개의 문자열이 있다. 첫번째는 원래 프로그램 소스에 나타나는 번역되지 않은 문자열이고, 다른 하나는 그 문자열의 번역문이다. 원래 문자열은 msgid 다음에 오고, 번역문은 msgstr 다음에 온다. 이 원래 문자열과 번역된 문자열은 PO 파일에서 " 구분자와 \ 이스케이프를 사용해 여러 가지 방법으로 쓰여지지만, PO 모드가 이 문제를 해결해 줄 것이기 때문에 번역자는 이 형식에 신경쓸 필요가 없다.

msgid 다음에 오는 문자열은 자동 주석문과 마찬가지로 GNU gettext 도구들에 의해 만들어지고 관리된다. PO 모드에서는 번역자가 이 문자열을 수정할 수 없다. 할 수 있는 일은 전체 항목을 지우는 것 뿐이다. 한편, msgstr 다음에오는 문자열은 번역자 주석문과 마찬가지로 번역자를 위한 것이고, PO 모드에서 이 문자열을 번역할 때 필요한 모든 것을 제공해 준다.

#,로 시작하는 주석문은 특수한 경우로, 주석문답지 않게 프로그램이 무시하지 않는 주석문이다. 쉼표로 구분된 플래그들은 msgfmt 프로그램이 사용해서 메세지의 상태를 보다 잘 알려주는 데 쓰인다. 현재로는 두가지 플래그가 정의되어 있다:

fuzzy
이 플래그는 msgmerge 프로그램이 만들어 내고, 번역자 자신이 직접 써 넣을 수도 있다. 이것은 msgstr이 (더 이상) 올바른 번역이 아닐지도 모른다는 뜻이다. 더 수정해야 하는지, 혹은 그대로 사용가능한지 판단할 수 있는 건 번역자뿐이다. 번역이 만족스럽다면, 번역자는 이 fuzzy 속성을 지운다. 퍼지 찾기를 한 후에 msgmerge 프로그램은 msgidmsgstr을 연관시킬 때 이 속성을 추가한다. See section 퍼지 항목.
c-format
no-c-format
이 플래그는 사람이 추가해서는 안 된다. xgettext 프로그램만이 이 플래그를 추가한다. 나중에 제시되는 자동화된 PO 파일 처리 시스템에서 xgettext 프로그램이 새로운 틀 파일을 만들 때를 빼고는 수정되어서는 안 되는 플래그이다. c-format 플래그가 주어진 경우 msgfmt은 이 번역문이 올바른지에 대해 더 자세하게 검사한다. See section msgfmt 프로그램 실행하기.

항목은 여러 가지 종류가 사용되는데, 그 중에는 복수형과 관련되어 있다.

공백
#  번역자-주석문
#. 자동-주석문
#: 참조...
#, 플래그...
msgid 번역되지-않은-문자열-단수
msgid_plural 번역되지-않은-문자열-복수
msgstr[0] 번역된-문자열-케이스-1
...
msgstr[N] 번역된-문자열-케이스-n

PO 파일의 마지막 항목 다음에 공백이나 주석문 몇 줄이 더 올 수도 있다. 이 줄은 어떤 항목의 일부도 아니고, 이 줄들에 대해서는 어떤 처리도 하지 않을 것이다. PO 모드 함수인 M-x po-normalize를 사용해, 번역자는 이렇게 필요 없는 줄들을 지울 수 있다. See section 항목의 문자열 표준화.

이 절의 나머지는 PO 모드를 사용하는 사람의 경우 그냥 지나쳐도 되지만, PO 파일의 정확한 형식에 관해 알고 싶은 사람들은 재미있게 읽을 수 있다. 한편, 이맥스에 익숙하지 않은 사람은 계속해서 주의깊게 읽어야 한다.

번역되지-않은-문자열번역된-문자열은 문자열을 위한 C의 문법을 그대로 따른다. C 문법의 문자열은 따옴표로 둘러싸여져 있고, 백슬래쉬로 시작하는 이스케이프 시퀀스가 있을 수 있다. 단, 여러줄의 문자열을 써야 할때, 이스케이프 다음에 줄을 바꾸어 쓰지 않는다. 그 대신에 따옴표를 닫은 다음, 다음 줄에 따옴표를 열어서 문자열을 계속 써 나간다. 예를 들어:

msgid ""
"Here is an example of how one might continue a very long string\n"
"for the common case the string represents multi-line output.\n"

이 예에서, 단어 `Here'H가 단어 `for'f 바로 위에 오도록 정렬하기 위해 첫째 줄에 빈 문자열이 사용되었다. 이 예에서, msgid 키워드 다음에는 세 개의 문자열이 온다. 그 세 개의 문자열은 연속된 한 개의 문자열로 취급된다. 빈 문자열을 연결해도 최종 문자열에는 변화가 없으나, msgid 다음에 같은 줄에 문자열이 오게 하면서, 여러줄의 문자열을 왼쪽에 정렬되도록 하기 위해 우리가 사용하는 방법이고, 우리는 이렇게 배치하는 편이 더 보기 좋다고 생각한다. 빈 문자열은 빠질 수 있지만, `Here'로 시작하는 문자열은 첫번째 줄에 msgid 바로 다음에 와야 한다.(2) 하지만, 줄바꿈 `\n' 다음에 바로 따옴표를 묶어서 다음 문자열을 시작할 필요도 없고, 어떤 문자 다음에서도 다음 문자열을 시작할 수 있다. 우리는 더 깨끗해 보이기 때문에 위와 같이 사용했을 뿐이다.

여러 줄이 있을 때 반드시 따옴표 안에 `\n'으로 표시해야 한다. `\n'은 그 문자열의 일부이고, 그 다음에 따옴표 바깥에 오는 줄바꿈은 PO 파일의 일부로 그 문자열과는 아무 관계가 없다.

문자열의 밖에서 빈줄과 주석은 자유롭게 사용할 수 있다. 주석은 `#'로 시작하고 주석은 그 줄 끝까지 이어진다. 번역자가 쓴 주석은 처음에 `#'를 쓰고 바로 다음에 빈 칸이 와야 한다. 만약 `#' 다음에 빈칸이 오지 않으면, 그 주석은 GNU 도구에 의해 만들어지고, 처리되는 것으로 취급된다. 그리고 그러한 주석문은 PO 파일이 msgmerge로 처리될 때 사라지거나 다른 어떤 것으로 바뀔 것이다.

주요 PO 모드 명령

section GNU gettext의 완벽한 설치에 쓰여진 바와 같이 이맥스를 세팅하면, 이맥스가 PO 파일을 열때 PO 모드가 작동하게 된다. PO 모드는 그 윈도우를 읽기 전용으로 만들고, po-mode-map을 만든다. po-mode-map은 하나의 이맥스 모드이고, 텍스트 모드에서 나온 것이 전혀 아니다. 만약 po-mode-hook에 어떤 함수가 있다면 그 함수들이 실행될 것이다.

PO 모드가 어떤 윈도우에서 작동하면, `PO'라는 글자가 그 윈도우의 모드 라인에 나타난다. 모드 라인은 각 항목을 분류해 그 갯수가 얼마나 되는지를 표시하기도 한다. 예를 들어, `132t+3f+10u+2o'는 PO 모드에 132개의 번역된 항목(see section 번역된 항목, 3개의 퍼지 항목 (see section 퍼지 항목), 10개의 번역되지 않은 항목(see section 번역되지 않은 항목), 그리고 2개의 없어진 항목(see section 없어진 항목)이 들어 있다는 뜻이다. 갯수가 0인 항목은 표시하지 않는다. 그러므로, 이 예에서 모든 퍼지 항목의 퍼지가 취소되고 번역되지 않은 항목이 번역된다면, 최종적으로 이 모드 라인은 `145t'를 표시할 것이다.

주요 PO 명령어는 뒷부분에 나올 또 다른 종류의 명령어들과는 다르다. 이 명령어들은 PO 모드를 종료하거나, 윈도우를 특별히 조작하는 데 쓰인다.

U
PO 파일의 최근 수정사항을 취소(Undo)한다.
Q
작업을 멈추고, PO 파일을 저장한다.
q
작업을 멈춘다. 확인할 것이 있다면 확인 한 후에 멈춘다.
O
잠시 PO 파일 윈도우를 떠난다.
?
h
PO 모드의 도움말을 보여준다.
=
PO 파일의 통계를 보여준다.
V
전체 PO 파일의 포맷이 맞는지 점검한다.

U (po-undo) 명령은 이맥스의 실행 취소(undo) 기능의 인터페이스이다. See section `Undoing Changes' in The Emacs Editor. U가 타이프할 때마다, 번역자가 PO 파일에 가한 수정사항을 계속해서 취소할 수 있다. 실행 취소를 위해, 각 PO 모드 명령은 자동적으로 만들어졌다. 이는 RET 명령에 특히 그러하다: 이 명령을 한번 사용했을 때 수정되는 사항은, 비록 편집과정에서 여러번의 명령이 있었을 지 모르지만, 단번에 실행 취소된다. 편집 윈도우에 있을 때, 그 편집작업에 대해 실행 취소를 하는 일은 드문 게 보통이다.

Q (po-quit) 명령과 q (po-confirm-and-quit) 명령은 해당 PO 파일에 대한 작업이 끝났을 때 사용한다. 전자의 명령어가 후자의 명령어보다 명령어가 더 간단하다. 파일이 수정되었을 경우에, 먼저 디스크에 저장한다. 이 명령들은 두 경우 모두, 맨 먼저 PO 파일에 번역되지 않은 메세지가 남아있는지 확인한다. 만약 남아 있다면, 번역자는 진짜로 이 PO 파일에 대한 작업을 끝낼 것인지 질문을 받게 된다. 이 명령은 이맥스 PO 파일 버퍼를 없애는 더 좋은 방법이다. 버퍼를 없애는 보통 이맥스 명령어 C-x k (kill-buffer)는 그리 깔끔한 방법이 아니다.

O (po-other-window) 명령은 부드럽게 잠시 PO 모드를 떠나는 또 한 가지 방법이다. 이 명령은 커서를 다른 이맥스 윈도우로 옮겨주는 것 뿐이고, 필요할 때 나타난다. 예를 들어, 번역자가 PO 모드를 보고, 또 다른 곳에 있는 소스 내용을 보려고 할때, 번역자는 프로그램 소스에서 고쳐야 할 분명한 버그를 발견할 수도 있다. 이 명령으로 번역자는 성별을 바꿔서 (역자주---원문에서는 앞에서 편의상 번역자를 she, 프로그래머를 he로 표현하기로 정했다는 것을 상기하자) 프로그래머가 된다음, 수정하고 싶은 프로그램이 들어 있는 윈도우에 커서를 가져갈 것이다. 커서를 PO 파일 윈도우의 바깥에 가져간 후에 이맥스에게 다시 PO 파일을 편집하도록 하면, PO 파일이 다시 돌아올 것이다.

h (po-help) 명령은 모든 가능한 PO 모드 명령어를 요약해서 보여준다. 번역자는 PO 모드 동작을 재개하는 또 다른 명령어를 타이프해야 한다. ? 명령어는 h와 동일하다.

= (po-statistics) 명령어는 PO 파일 항목의 전체 수를 계산하고, 현재 항목의 위치 (1부터 센다), 번역되지 않은 항목 수, 없어진 항목 수를 계산하고, 이 수를 표시한다.

V (po-validate) 명령은 현재 PO 파일에 대해 msgfmt`--statistics' 옵션을 붙여 실행한다. 이 명령은 처음에 PO 파일을 디스크에 저장할 지 물어 본다. GNU gettext에 들어 있는 msgfmt 도구는 PO 파일에서 MO 파일을 만드는 일을 하고, PO 모드는 PO 파일의 각 항목뿐만 아니라 PO 파일의 전체 형식까지 검사할 것이다.

msgfmt 프로그램은 이맥스 내에서 비동기적으로 동작하므로, 번역자는 PO 파일이 검사되는 동안에도 즉시로 번역자는 PO 파일을 편집할 수 있다. 오류 출력은 이맥스의 `*compilation*' 버퍼에 모아지고, 또다른 윈도우로 표시된다. 이맥스의 C-x ` (next-error 명령어와 그 외의 보통 컴파일 관련 명령어들을 이용해, 번역자는 빠르게 PO 파일의 잘못된 위치로 커서를 이동할 수 있다. 일단 커서가 오류의 해당 위치 위에 있으면, 번역자는 오류를 수정할 지 결정하게 된다.

항목 이동

PO 파일 윈도우의 커서는 언제나 어떤 한 항목 위에 있다. 예외는 커서가 파일의 마지막 항목 뒤에 있거나, PO 파일에 아무것도 없을 경우이다. 커서가 놓여 있는 항목을 현재 항목라고 부른다. 많은 PO 모드 명령은 현재 항목에 대해 작용하므로, 커서를 이동시키는 것은 단지 PO 파일을 보는 것 이상의 효과가 있다. 커서 이동은 항목에 관련된 명령을 어떤 항목에 가할 것인지 선택하는 일이다.

몇몇 PO 모드 명령은 특수한 방법으로 커서의 위치를 이동시킨다. 이 특별한 이동 명령어들 중 일부는 다음에 설명되어 있고, 나머지는 다음 절에 설명된다.

.
현재 항목을 다시 표시한다.
n
n
현재 항목 다음의 항목을 선택한다.
p
p
현재 항목 앞의 항목을 선택한다.
<
PO 파일의 첫번째 항목을 선택한다.
>
PO 파일의 마지막 항목을 선택한다.
m
현재 항목의 위치를 나중에 사용할 수 있도록 기록한다.
l
이전에 저장된 항목 위치로 돌아간다.
x
이전에 저장된 항목의 위치와 현재 항목의 위치를 바꾼다.

문자 단위 이동, 줄 단위 이동, 문단 단위 이동, 화면이나 페이지 단위 이동, 찾기 명령처럼 커서를 이동하는데 쓰이는 모든 이맥스 명령어는 PO 모드의 현재 항목을 고르는 데 쓰일 수 있다. 그러나, PO 모드에서 현재 항목을 표시하는 또 다른 표준적인 방법이 있고, 커서를 이동하는 보통 이맥스 명령어들에서는 이런 제한이 없다. . (po-current-entry) 명령의 유일한 목적은 현재 항목을 다시 표시하는 것이다. 이 명령어는 PO 모드 이외의 방법에 의해 현재 항목이 바뀌거나, 그 외 다른 이유에 의해 이맥스 스크린이 바뀌었을 경우 사용한다.

PO mode에서 번역자가 작업을 하고 있는 도중에 윈도우를 강제로 배치하는 것이 번역자를 도와주는 일인지, 아니면 어쩌면 방해하는 일인지는 아직 알지 못한다. 우리는 처음에 윈도우가 어떻게 동작해야 하는지에 대해 상당히 정확한 생각을 했지만, 다른 한편으로 이맥스에 익숙한 사람이라면 누구나 컨트롤을 직접 갖고 있는 것을 좋아한다. 아마 고정된 윈도우 배치는 PO 모드의 옵션으로 제공되어 번역자가 취향에 다라 동작 여부를 선택할 수 있을 것이고, 이 기능은 실험적으로 제공될 것이다. 만약 아무도 이 기능을 사용할 필요가 없거나, 혹은 번역하는 데 압박감을 준다면 이런 생각들을 취소해야 할 것이다. 어떻게 할지에 대한 아이디어는 프로그래머가 아니라 번역자에게서 나와야 한다. 경험있는 번역자의 의견이 다른 사람이 어떤 방법으로 번역할지 예상하는 프로그래머의 의견보다 훨씬 가치가 있다.

n (po-next-entry) 명령과 p (po-previous-entry) 명령은 커서를 현재 항목의 뒤 혹은 앞 항목으로 이동한다. 만약 n이 PO 파일의 끝에서 타이프되거나, p가 맨 처음 항목에서 타이프될 경우에는 아무런 이동도 하지 않는다.

< (po-first-entry) 명령과 > (po-last-entry) 명령은 커서를 PO 파일의 맨 처음 혹은 맨 마지막 항목으로 옮긴다. 커서가 PO 파일의 마지막 항목 뒤에 위치해 있을 경우, 대부분의 PO 모드 명령은 `After last entry'라고 말하면서 오류를 낼 것이다. 그러나, <> 명령은 커서가 PO 파일 항목 위에 있지 않을 경우에도 동작한다. 그리고 이 명령으로 PO 파일 항목 위에 있지 않은 상황을 바꿀 수 있다. 하지만 이 명령어라고 할 지라도 완전히 빈 PO 파일에서는 실패한다. 이와 관련된 PO 모드 개발 계획의 하나로, 소스에서부터 빈 PO 파일을 대화적으로 채워나가도록 하려고 한다. See section 번역 가능한 문자열 표시.

번역자는 특정 항목에 번역을 하기 전에, PO 파일의 뒷부분을 미리 봐서 혹시나 뒤에도 있을지 모르는 용어나 문구를 찾아봐야 할지 결정해야 할 것이다. 물론 표준 이맥스 명령을 이용해 현재 커서 위치를 레지스터에 저장하고 그 레지스터를 이용해 다시 돌아오거나, 혹은 위치 링(location ring)을 사용할 수도 있다.

PO 모드에서는 또 한 가지 방법으로, 커서의 위치를 PO 모드 전용 스택에 저장할 수 있다. m (po-push-location) 명령은 현재 항목의 위치를 스택에 기록하는 일만을 하고, 예전에 저장된 항목 위치를 현재 기록할 위치의 아래에 밀어넣는다. r (po-pop-location) 명령은 스택의 맨 위 요소를 없애고, 커서를 그 맨 위 요소에 저장된 위치로 옮긴다. 그 다음에 그 위치는 스택에서 사라지고, 다음 r 명령은 커서를 그 전에 저장된 위치로 옮길 것이다. 이런 식으로 스택에 아무것도 남아있지 않을 때까지 계속된다.

번역자가 이 위치 스택에 들어 있는 위치를 알고 싶은 경우, 즉 스택의 맨 위에 들어 있는 항목을 보고 싶을 경우에는, 나중에 돌아올 생각으로 커서를 다른 어딘가로 이동한 다음 r 바로 다음에 m을 사용하면 된다.

x (po-exchange-location) 명령은 커서를 항목위치가 저장된 스택의 맨 위 요소에 연결된 항목에 이동하는 동시에, 스택의 맨 위 요소를 이동 전의 현재 항목으로 바꾼다. 결과적으로 x 명령을 반복하면 두개의 항목을 계속 왔다갔다하게 된다. 이렇게 하고 싶은 경우에, 처음에 항목에서 m을 사용하고 그 다음 항목에서 x를 이용해 왔다갔다할 수 있다.

항목의 문자열 표준화

PO 파일 항목에 어떤 문자열을 인코딩하는 여러 가지 방법이 있다. 여러줄의 문자열을 어떻게 쪼개는지도 여러 가지 방법이 있을 뿐 아니라, 백슬래쉬로 시작하는 이스케이프 시퀀스(escaped sequence)로 특수 문자를 표현하는 방법도 여러 가지가 있다. 몇 가지 PO 모드의 기능들은 어떤 항목의 msgid 필드에 어떤 문자열이 들어 있다고 가정하고 PO 파일을 scan하는 능력에 의존한다. PO 파일의 내부에 이 인코딩을 쉽게 알아내는 내부 도구가 있다고 해도, 이렇게 알아내는 일을 빠르게 하기는 기술적으로 어렵다. 이 효율성 문제에 대한 해답으로, 우리는 표준화된 문자열 표현을 쓰기로 결정하였다.

PO 파일에 문자열을 표현하는 습관은 현재 토론중이고, PO 모드에서는 표준화된 표현을 실험하고 있다. xgettext와 PO 모드를 동시에 사용하여 동일한 문자열을 동일한 방법으로 표현하도록 일치시키는 것이 좋을 것이다. 그리고 PO 모드에서 필요한 표준화는 GNU gettextxgettext를 사용하기만 하면 자동으로 만족될 것이다. 직접 PO 모드 표준화를 해야 하는 경우는 외부에서 가져온 PO 파일이나, 이 규범 자체가 바뀔 경우에만 필요하다.

그러므로, 적어도 주어진 파일의 문자열을 표준화할 경우에, 다음 PO 모드 명령어를 사용할 수 있다:

M-x po-normalize
항목들을 좀더 비슷한 형태로 만들어서 PO 파일을 정돈한다.

M-x po-normalize(해당되는 키가 없다) 명령은 모든 항목을 검사하고 PO 파일 내의 모든 원 문자열과 번역된 문자열이 통일된 형태로 따옴표를 쓰도록 한다. 또한 마지막 항목 뒤에 있는 부스러기들도 제거한다. 이 명령은 다른 데서 처음 가져온 PO 파일이거나, 우리가 사용할 표준적인 따옴표 형식을 더 낫게 바꿀 때 유용하다. 이 표준 형식은 깨끗한 PO 파일만을 위한 것이 아니라, 다른 PO 모드 명령이 msgid 문자열을 빨리 찾도록 하기 위한 것이기도 하다.

현재 M-x po-normalize는 다른 항목들에 대해서 세 단계를 거친다. 첫번째는 GNU gettext 0.6 이전의 PO 파일을 바꾸는 휴리스틱으로, 0.6 이전에서는 msgidmsgstr 필드에서 여러줄의 문자열을 쓸 때 K&R 스타일의 C 문자열 문법을 사용한다. 이 첫번째 휴리스틱은 없어진 항목이 아니어도 백슬래쉬로 끝나는 주석문에 대해서는 실패할 수도 있다; 이 첫번째 휴리스틱은 이 뒤에 올 단계에 의존하는 데, 뒤의 단계에서 없어진 항목에서 계속되는 줄을 제대로 주석처리한다. 두 번째와 세 번째 단계는 각각 msgidmsgstr을 표준화하는 단계이다. 이들 단계에서는 XView의 msgfmt에서 쓰이는 방식의 연결되는 줄 끝의 백슬래쉬들을 없앤다.

이렇게 직접 표준화하는 명령이 있으면 또다른 곳에서 PO 파일을 가져올 수 있지만, 현재 습관을 향상시키는 것도 쉬워진다. 현재 이렇게 향상되는 점은 대부분 미적인 생각에서 나온 것들이다. 여기에 관해 제안된 사항들은 나중에, 표준화 명령과 다른 GNU gettext 도구가 자동으로 이 원칙을 따르게 될 때 만드는 편이 좋을 것이다. 표준적인 문자열 형식은 아래에 설명되어 있는데, 이맥스에 익숙해 있지 않은 사람과, PO 파일을 절대 멋진 방법을 써서 다듬으려 하지 않는 사람들을 위해 설명하였다.

현재 PO 모드에서, 문자열은 한 줄이거나 여러 줄이다. 문자열은 줄바꿈이 하나라도 포함되어 있으면 여러줄이 되고, 여러줄이 되는 경우는 줄바꿈이 있는 경우뿐이다. 즉 문자열이 `[^\n]\n+[^\n]'에 맞는 경우이다. 즉, 우리는 다음과 같은 문자열을 만날 수도 있다:

msgstr "\n\nHello, world!\n\n\n"

하지만 줄바꿈에 따라 구분하면, 다음과 같이 된다:

msgstr ""
"\n"
"\n"
"Hello,\n"
"world!\n"
"\n"
"\n"

우리는 신중하게 예를 사용해 왔지만, 여기서 명확히 하겠다. 대부분 여러줄이 있더라도 그렇게 못 생기지는 않다. 아마도 다음 제안에 따라 구현할 것이다. 맨 앞에 줄바꿈이 있으면 일단 첫줄을 빈 문자열로 만들고, 연속된 모든 줄바꿈을 빈줄로 만든다 (즉, n > 1인 경우, n-1번째 마지막 줄바꿈까지 하나의 문자열이 된다). 이렇게 해서 위의 예를 다음과 같이 만든다:

msgstr "\n\n"
"Hello,\n"
"world!\n"
"\n\n"

문자열 표준화에 대해 아직 결정되지 않은 작은 사항들이 몇 가지 있는데, 이 의문점들이 해결되면 이 안내서에 문서화할 것이다.


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