3. 우리말이 나오는 오픈소스는
● 물론 누군가 번역한 사람이 있습니다. 아마도 한국인.
● 오늘날 오픈소스는 전세계 모두가 같이 만들어서 같이 씁니다. 특히 번역은 각
언어의 네이티브들의 도움을 받습니다.
● AI가 완전히 대신할 날은 쉽게 안 옵니다. :P
4. 주요 번역 방식 소개: 온라인
● https://translatewiki.net - 주로 위키미디어 관련 (mediawiki, openstreetmap)
● https://www.transifex.com/
● https://weblate.org/
● 각자 pootle 사용 - https://translations.documentfoundation.org/ 등
5. 주요 번역 방식 소개: GNOME
● https://l10n.gnome.org “Damned Lies”
● 세상에는 세 가지 종류의 거짓말이 있다. 거짓말, 빌어먹을 거짓말, 그리고 통
계.
● 번역 "통계" 사이트 - 지금은 번역 제출 기능도 탑재
● PO 다운로드 & 웹에서 제출
6. 주요 번역 방식 소개: The Translation Project
● https://translationproject.org/
● 처음에 GNU Translation Project로 시작. 주로 GNU 프로그램들
● PO 다운로드 & 자동처리되는 메일로 제출
7. 번역 “리소스”
● 진리의 케바케: 여러가지 파일 포맷
● 온라인 번역: translatewiki, transifex, weblate, pootle
● 리소스 파일을 메일로 전달하기도 하고 github PR로 하기도 하고 다 다릅니다.
● GNOME: https://l10n.gnome.org
● 오픈소스에서 가장 많이 쓰이는 GNU Gettext 포맷을 여기서 다룹니다.
8. ● 1990 Sun에서 최초 개발한 방식을 GNU Gettext에서 사용, 지금은 GNU
Gettext 확장된 버전이 사실상 대세
● 대부분 (아마도 모든) 프로그래밍 언어에서 지원
● 영문 문자열을 key로 (msgid) 번역 문자열을 (msgstr) 찾아내는 방식.
● 개발자 입장에서 도입 장벽이 낮음
● 번역자 입장에서 점진적으로 작업해 나갈 수 있음
● 계속 업데이트되는 긴 문서를 번역할 때도 중간 포맷으로 괜찮음
GNU Gettext
9. Gettext 파일: PO와 MO
● .po 파일은 사람이 편집할 수 있는 텍스트 파일입니다.
● 영문 문자열(msgid)과 번역된 문자열(msgstr)이 들어 있습니다.
● .mo 파일은 .po 파일에서 컴파일한 바이너리 형식 해시테이블입니다.
● 앱에서는 .mo 파일에서 번역 문자열을 찾아봅니다.
10. 별로 알 필요 없는 내부 구조
/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!
$ LANG=ko_KR.UTF-8 hello
안녕하세요, 여러분!
$ env LANG=ko_KR.UTF-8 TEXTDOMAINDIR=/usr/share/locale gettext
hello "Hello, world!"
안녕하세요, 여러분!$
12. 일반적인 작업 과정
● 앱 개발자/관리자가 소스코드에서 영문 스트링을 추출해 영문 스트링만 들어
있는 PO 파일을 (.pot) 만듭니다.
● 새로 번역하는 경우 번역자가 이 .pot 파일을 .po 파일로 만들어서 편집합니다.
● 기존 번역이 있는 경우 msgmerge 프로그램을 사용해 .pot 파일과 기존 .po 파
일에서 추가된/바뀐 문자열을 포함한 새 .po 파일을 만듭니다.
● 번역자는 .po 파일에 번역을 추가/업데이트해 제출
13. 그래서 PO 파일을 기여하려면..
● 배포하는 .pot (번역이 없으면) 또는 .po (있으나 업데이트해야 하면) 파일을 찾
습니다. 또는 파일을 만드는 방법이 안내되어 있을 수도 있습니다.
● 폭풍 번역 & 제출
14. PO 편집 시작
● 형식에 맞춰 써야 합니다. 전용 편집 프로그램 또는 모드/플러그인이 필수적
● POEdit, Emacs po-mode, VIM po.vim
15. 헤더 엔트리
● 관리를 위한 정보 및 중요 메타데이터가 들어 있습니다.
● 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"
16. 엔트리
● 전용 에디터를 쓰면 알 일이 없겠지만…
● 번역자는 번역 문자열 및 코멘트만 추가할 수 있습니다.
# 모니터 이름, Primary-Secondary
#: ../panels/display/cc-display-panel.c:578
#: ../panels/display/cc-display-panel.c:2429
msgid "Primary"
msgstr "주요"
17. 엔트리 (계속)
● 문맥 문자열(msgctx)이 들어 있을 수도 있습니다.
#: ../shell/cc-window.c:872
msgctxt "category"
msgid "Hardware"
msgstr "하드웨어"
18. 고급: 복수형
한국어는 복수형 구별을 하지 않습니다.
msgid "%i day ago"
msgid_plural "%i days ago"
msgstr[0] " %i일 전"
19. 고급: 포맷 문자열
● 해당 프로그래밍 언어의 지식이 필요한데, 번역하면서 익숙해지면 됨.
#, c-format
msgid "%d of %d"
msgstr "%2$d개 중 %1$d"
20. 번역이 끝나면..
● msgfmt -v 명령으로 확인합니다.
● 전용 에디터에는 내장되어 있음.
$ msgfmt --statistics -c -v -o /dev/null ko.po
ko.po: 번역된 메시지 1497개.
$
21. 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: 검색어가 중복되어 있습니다
$