7. 번역 작업을 어떻게 모을 것인가
● 현대적인 SW는 보통 번역할 문자열이 분리되어 있고 추가할 수 있습니다 ("번
역 리소스")
● 케바케: 여러가지 파일 포맷
● 온라인 번역: translatewiki, transifex, weblate, pootle
● 파일을 메일로 전달하기도 하고 github PR로 하기도 하고..
● GNOME은 그 중간쯤입니다. 번역은 파일로 편집하지만 소스코드를 다루지는
않습니다.
● 오픈소스에서 가장 많이 쓰이는 번역 파일인 GNU Gettext 포맷을 여기서 다룹
니다.
8. 주요 번역 방식 소개: 온라인
● https://translatewiki.net - 주로 위키미디어 관련 (mediawiki, openstreetmap)
● https://www.transifex.com/ - 여러 오픈소스, 회사가 운영하므로 꺼리기도 함
● weblate (서버 설치) - https://hosted.weblate.org/
● pootle (서버 설치) - https://translations.documentfoundation.org/ 등
9.
10. 주요 번역 방식 소개: The Translation Project
● https://translationproject.org/
● 처음에 GNU Translation Project로 시작해서 주로 GNU 프로그램들 메시지
● 번역 파일 다운로드 & 자동처리되는 메일로 제출
11. 주요 번역 방식 소개: GNOME
● https://l10n.gnome.org “Damned Lies”
● 마크 트와인, "There are three kinds of lies: lies, damned lies, and statistics."
○ 세상에는 세 가지 종류의 거짓말이 있다. 거짓말, 빌어먹을 거짓말, 그리고 통계.
● 번역 "통계" 사이트 - 지금은 번역 제출 기능도 탑재
● 웹으로 번역 파일 다운로드
● 편집은 로컬에서
● 웹에서 제출
12. ● 1990 Sun Microsystems에서 최초 개발한 방식을 GNU Gettext에서 사용, 지금
은 GNU Gettext 확장된 버전이 사실상 대세
● 대부분 (아마도 모든) 프로그래밍 언어에서 지원
● 영문 문자열을 key로 (msgid) 번역 문자열을 (msgstr) 찾아내는 방식.
○ 개발자 입장에서 도입 장벽이 낮음
○ 번역자 입장에서 점진적으로 작업해 나갈 수 있음
● 계속 업데이트되는 긴 문서를 번역할 때도 중간 포맷으로 사용
○ po4a, poxml 같은 변환도구 사용
GNU Gettext
13. Gettext 파일: PO와 MO
● Portable Object, Machine Object라는 어려워보이는 이름의 파일 포맷인데..
● .po 파일은 사람이 편집할 수 있는 텍스트 파일입니다.
○ 영문 문자열(msgid)과 번역된 문자열(msgstr)이 들어 있습니다.
● .mo 파일은 .po 파일을 변환한 설치용 파일입니다.
○ 바이너리 형식 해시테이블.
14. 별로 알 필요 없는 내부 구조 (localedir, locale,
domain) /usr/share/locale/ko/LC_MESSAGES/hello.mo
setlocale(LC_MESSAGES, "");
bindtextdomain("hello", "/usr/share/locale");
textdomain("hello");
...
greeting_msg = _("Hello, world!");
$ LANG=C hello
Hello, world!
$ env LANG=ko_KR.UTF-8 hello
안녕하세요, 여러분!
$ env LANG=ko_KR.UTF-8 TEXTDOMAINDIR=/usr/share/locale gettext
hello "Hello, world!"
안녕하세요, 여러분!$
15. 일반적인 작업 과정
● 앱 개발자가 소스코드에서 영문 스트링을 추출해 영문 스트링만 들어 있는 PO
파일을 (.pot) 만듭니다. (xgettext)
● 새로 번역하는 경우 번역자가 이 .pot 파일을 .po 파일로 만들어서 편집합니다.
● 기존 번역이 있는 경우 .pot 파일과 기존 .po 파일을 비교해 추가된/바뀐 문자열
을 포함한 새 .po 파일을 만듭니다. (msgmerge)
● 번역자는 .po 파일에 번역을 추가/업데이트해 제출
16. 일반적인 작업 과정 (새로 번역 / 업데이트)
hello.c
ko.po
(new)
hello.pot
ko.po
(merged)
ko.po
(old)
ko.po
(updated)
17. 그래서 PO 파일을 기여하려면..
● 배포하는 .pot (번역이 없으면) 또는 .po (있으나 업데이트해야 하면) 파일을 찾
습니다. 또는 파일을 만드는 방법이 안내되어 있을 수도 있습니다.
● 폭풍 번역 & 제출
18. PO 파일 편집하기
● 텍스트 파일이기는 하지만 이스케이프 등 형식에 맞춰 써야 하므로 일반 텍스
트 편집기로는 어렵습니다. 전용 편집 프로그램 또는 모드/플러그인이 필수적.
● POEdit
● Emacs po-mode, VIM po.vim
19. 헤더 엔트리
● 관리를 위한 정보 및 중요 메타데이터가 들어 있습니다.
● Content-Type 및 Plural-Forms 중요
msgid ""
msgstr ""
"Project-Id-Version: gnome-control-centern"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"control-center&keywords=I18N+L10N&component=generaln"
"POT-Creation-Date: 2016-08-30 15:17+0000n"
"PO-Revision-Date: 2016-09-03 20:05+0900n"
"Last-Translator: Changwoo Ryu <cwryu@debian.org>n"
"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>n"
"Language: kon"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=UTF-8n"
"Content-Transfer-Encoding: 8bitn"
"Plural-Forms: nplurals=1; plural=0;n"
20. 엔트리
● 전용 에디터를 쓰면 알 일이 없겠지만…
● 번역자는 번역 문자열 및 코멘트만 추가할 수 있습니다.
# 모니터 이름, Primary-Secondary
#: ../panels/display/cc-display-panel.c:578
#: ../panels/display/cc-display-panel.c:2429
msgid "Primary"
msgstr "주요"
21. 엔트리 (계속)
● 문맥 문자열(msgctx)이 들어 있을 수도 있습니다.
#: ../shell/cc-window.c:872
msgctxt "category"
msgid "Hardware"
msgstr "하드웨어"
22. 고급: 복수형
● 개수에 따라 명사와 동사가 달라지는 경우. 영어는 단수/복수만 있지만 동유럽
언어도 보통 3가지, 아랍어는 6가지나 됩니다.
○ https://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
● 한국어는 복수형 구별을 하지 않고 1가지만 씁니다.
msgid "%i day ago"
msgid_plural "%i days ago"
msgstr[0] " %i일 전"
23. 고급: 포맷 문자열
● 해당 프로그래밍 언어의 지식이 필요한데, 번역하면서 익숙해지면 됩니다.
● 포맷 문자열에 어순을 바꿀 수 있는 기능이 있을 수도 있습니다.
#, c-format
msgid "%d of %d"
msgstr "%2$d개 중 %1$d"
24. 번역이 끝나면..
● msgfmt -v 명령으로 확인합니다.
● 전용 에디터에는 내장되어 있음.
$ msgfmt --statistics -c -v -o /dev/null ko.po
ko.po: 번역된 메시지 1497개.
$
25. ko-po-check
● https://github.com/changwoo/ko-po-check/
● 추가로 한국어 번역을 확인하는 프로그램
● 자주 틀리는 관례, 용어, XML 포맷 실수 등등..
● 잡아낸 게 모두 문제라는 뜻은 아니고, 모든 걸 잡아내지도 못합니다. :)
$ ko-po-check ko.po
ko.po:1775: 바로 가기: "link"은(는) "링크"(이)라고 번역하길 제안합니다
ko.po:4654: 인쇄 작업 보기(_J): "Show ..." 형태는 "... 보이기(표시)" 형태와 같이 번역합니
다
ko.po:5583: Mouse: 검색어가 중복되어 있습니다
$