오픈소스 번역 기여하기
그놈 3.30 번역 모임
류창우 <cwryu@debian.org>
그놈 화면
이렇게 우리말이 나오는 오픈소스는
● 물론 누군가 번역한 사람이 있습니다. 아마도 한국인.
● 오늘날 오픈소스는 전세계 모두가 같이 만들어서 같이 씁니다. 특히 번역은 각
언어의 네이티브들의 도움을 받습니다.
● AI가 완전히 대신할 날은 쉽게 안 옵니다. :-)
오픈소스 번역?
● "메시지 번역" - UI에 표시되는 글 번역
● 도움말 번역
● 문서 번역, 웹사이트 번역
메시지 번역 특징
● 1회성 작업이 아닙니다.
● 짧아도 2-3년, 길게 10년 넘게 유지되는 SW가 많습니다.
● SW가 여러번 개정되면서 번역도 업데이트해야 합니다.
● 사용자가 많이 접합니다.
비공식 "한글 패치"가 아닙니다
번역 작업을 어떻게 모을 것인가
● 현대적인 SW는 보통 번역할 문자열이 분리되어 있고 추가할 수 있습니다 ("번
역 리소스")
● 케바케: 여러가지 파일 포맷
● 온라인 번역: translatewiki, transifex, weblate, pootle
● 파일을 메일로 전달하기도 하고 github PR로 하기도 하고..
● GNOME은 그 중간쯤입니다. 번역은 파일로 편집하지만 소스코드를 다루지는
않습니다.
● 오픈소스에서 가장 많이 쓰이는 번역 파일인 GNU Gettext 포맷을 여기서 다룹
니다.
주요 번역 방식 소개: 온라인
● https://translatewiki.net - 주로 위키미디어 관련 (mediawiki, openstreetmap)
● https://www.transifex.com/ - 여러 오픈소스, 회사가 운영하므로 꺼리기도 함
● weblate (서버 설치) - https://hosted.weblate.org/
● pootle (서버 설치) - https://translations.documentfoundation.org/ 등
주요 번역 방식 소개: The Translation Project
● https://translationproject.org/
● 처음에 GNU Translation Project로 시작해서 주로 GNU 프로그램들 메시지
● 번역 파일 다운로드 & 자동처리되는 메일로 제출
주요 번역 방식 소개: GNOME
● https://l10n.gnome.org “Damned Lies”
● 마크 트와인, "There are three kinds of lies: lies, damned lies, and statistics."
○ 세상에는 세 가지 종류의 거짓말이 있다. 거짓말, 빌어먹을 거짓말, 그리고 통계.
● 번역 "통계" 사이트 - 지금은 번역 제출 기능도 탑재
● 웹으로 번역 파일 다운로드
● 편집은 로컬에서
● 웹에서 제출
● 1990 Sun Microsystems에서 최초 개발한 방식을 GNU Gettext에서 사용, 지금
은 GNU Gettext 확장된 버전이 사실상 대세
● 대부분 (아마도 모든) 프로그래밍 언어에서 지원
● 영문 문자열을 key로 (msgid) 번역 문자열을 (msgstr) 찾아내는 방식.
○ 개발자 입장에서 도입 장벽이 낮음
○ 번역자 입장에서 점진적으로 작업해 나갈 수 있음
● 계속 업데이트되는 긴 문서를 번역할 때도 중간 포맷으로 사용
○ po4a, poxml 같은 변환도구 사용
GNU Gettext
Gettext 파일: PO와 MO
● Portable Object, Machine Object라는 어려워보이는 이름의 파일 포맷인데..
● .po 파일은 사람이 편집할 수 있는 텍스트 파일입니다.
○ 영문 문자열(msgid)과 번역된 문자열(msgstr)이 들어 있습니다.
● .mo 파일은 .po 파일을 변환한 설치용 파일입니다.
○ 바이너리 형식 해시테이블.
별로 알 필요 없는 내부 구조 (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!"
안녕하세요, 여러분!$
일반적인 작업 과정
● 앱 개발자가 소스코드에서 영문 스트링을 추출해 영문 스트링만 들어 있는 PO
파일을 (.pot) 만듭니다. (xgettext)
● 새로 번역하는 경우 번역자가 이 .pot 파일을 .po 파일로 만들어서 편집합니다.
● 기존 번역이 있는 경우 .pot 파일과 기존 .po 파일을 비교해 추가된/바뀐 문자열
을 포함한 새 .po 파일을 만듭니다. (msgmerge)
● 번역자는 .po 파일에 번역을 추가/업데이트해 제출
일반적인 작업 과정 (새로 번역 / 업데이트)
hello.c
ko.po
(new)
hello.pot
ko.po
(merged)
ko.po
(old)
ko.po
(updated)
그래서 PO 파일을 기여하려면..
● 배포하는 .pot (번역이 없으면) 또는 .po (있으나 업데이트해야 하면) 파일을 찾
습니다. 또는 파일을 만드는 방법이 안내되어 있을 수도 있습니다.
● 폭풍 번역 & 제출
PO 파일 편집하기
● 텍스트 파일이기는 하지만 이스케이프 등 형식에 맞춰 써야 하므로 일반 텍스
트 편집기로는 어렵습니다. 전용 편집 프로그램 또는 모드/플러그인이 필수적.
● POEdit
● Emacs po-mode, VIM po.vim
헤더 엔트리
● 관리를 위한 정보 및 중요 메타데이터가 들어 있습니다.
● 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"
엔트리
● 전용 에디터를 쓰면 알 일이 없겠지만…
● 번역자는 번역 문자열 및 코멘트만 추가할 수 있습니다.
# 모니터 이름, Primary-Secondary
#: ../panels/display/cc-display-panel.c:578
#: ../panels/display/cc-display-panel.c:2429
msgid "Primary"
msgstr "주요"
엔트리 (계속)
● 문맥 문자열(msgctx)이 들어 있을 수도 있습니다.
#: ../shell/cc-window.c:872
msgctxt "category"
msgid "Hardware"
msgstr "하드웨어"
고급: 복수형
● 개수에 따라 명사와 동사가 달라지는 경우. 영어는 단수/복수만 있지만 동유럽
언어도 보통 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일 전"
고급: 포맷 문자열
● 해당 프로그래밍 언어의 지식이 필요한데, 번역하면서 익숙해지면 됩니다.
● 포맷 문자열에 어순을 바꿀 수 있는 기능이 있을 수도 있습니다.
#, c-format
msgid "%d of %d"
msgstr "%2$d개 중 %1$d"
번역이 끝나면..
● msgfmt -v 명령으로 확인합니다.
● 전용 에디터에는 내장되어 있음.
$ msgfmt --statistics -c -v -o /dev/null ko.po
ko.po: 번역된 메시지 1497개.
$
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: 검색어가 중복되어 있습니다
$

오픈소스 번역 기여하기 v3

  • 1.
    오픈소스 번역 기여하기 그놈3.30 번역 모임 류창우 <cwryu@debian.org>
  • 2.
  • 3.
    이렇게 우리말이 나오는오픈소스는 ● 물론 누군가 번역한 사람이 있습니다. 아마도 한국인. ● 오늘날 오픈소스는 전세계 모두가 같이 만들어서 같이 씁니다. 특히 번역은 각 언어의 네이티브들의 도움을 받습니다. ● AI가 완전히 대신할 날은 쉽게 안 옵니다. :-)
  • 4.
    오픈소스 번역? ● "메시지번역" - UI에 표시되는 글 번역 ● 도움말 번역 ● 문서 번역, 웹사이트 번역
  • 5.
    메시지 번역 특징 ●1회성 작업이 아닙니다. ● 짧아도 2-3년, 길게 10년 넘게 유지되는 SW가 많습니다. ● SW가 여러번 개정되면서 번역도 업데이트해야 합니다. ● 사용자가 많이 접합니다.
  • 6.
  • 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/ 등
  • 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 SunMicrosystems에서 최초 개발한 방식을 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: 검색어가 중복되어 있습니다 $

Editor's Notes

  • #7 보더랜드2 공식 한국어 번역 추가되기 전에 돌았던 "한글패치" 화면