Gettext
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
gettext는 1990년대 초 썬 마이크로시스템즈에서 처음 작성되었으며, 소프트웨어의 국제화를 위한 시스템이다. GNU gettext는 1995년에 자유 소프트웨어로 출시되었고, 다양한 프로그래밍 언어로 이식되었다. gettext는 소스 코드에서 번역 가능한 문자열을 추출하고, 번역자는 이를 .po 파일을 통해 번역하며, msgfmt 유틸리티를 사용하여 기계가 읽을 수 있는 .mo 파일로 컴파일한다. 실행 시 사용자는 환경 변수를 설정하여 사용할 언어를 지정하며, ngettext 함수를 통해 복수형 처리를 지원한다. C, C++, Python, PHP 등 다양한 언어에서 구현되었으며, .NET, Perl, R, Scala, Node.js 등에서도 사용된다.
더 읽어볼만한 페이지
- 국제화와 지역화 - 언어 현지화
언어 현지화는 특정 지역의 문화, 언어, 법률 등을 고려하여 제품이나 서비스를 적응시키는 포괄적인 과정으로, 세계화 전략의 핵심 단계인 국제화 이후에 수행되며, 다양한 기술과 방법으로 이루어져 시장에서의 성공적인 출시와 성장에 필수적이다. - 국제화와 지역화 - ISO 3166
ISO 3166은 국가, 속령, 특별 지역 및 그 하위 구분에 대한 코드를 정의하는 국제 표준으로, ISO 3166-1, ISO 3166-2, ISO 3166-3으로 구성되어 있으며 ISO 3166/MA에 의해 관리 및 업데이트된다. - GNU 프로젝트 소프트웨어 - GNU 코어 유틸리티
GNU 코어 유틸리티는 유닉스 계열 운영체제에서 파일, 셸, 텍스트 조작을 위한 기본적인 명령어 모음으로, GNU 파일 유틸리티에서 시작하여 3개의 패키지가 통합되어 발전했으며 셸 스크립트 및 시스템 관리에 필수적인 도구를 제공한다. - GNU 프로젝트 소프트웨어 - GNU 허드
GNU 허드는 유닉스 운영 체제를 대체하는 것을 목표로 개발된 GNU 프로젝트의 커널로, 마이크로커널 기반의 서버-클라이언트 아키텍처를 사용하며, 파일 시스템 기능을 확장하는 트랜슬레이터 개념을 제공한다.
| Gettext - [IT 관련 정보]에 관한 문서 | |
|---|---|
| 개요 | |
![]() | |
| 종류 | 국제화 및 지역화 |
| 상세 정보 | |
| 개발자 | 썬 마이크로시스템즈, various |
| 출시일 | 1990년 |
| 안정화 버전 | 0.22.5 |
| 안정화 버전 출시일 | 2024년 2월 21일 |
| 개발 언어 | 해당 없음 |
| 운영체제 | 크로스 플랫폼 |
| 플랫폼 | 해당 없음 |
| 크기 | 해당 없음 |
| 언어 | 해당 없음 |
| 언어 수 | 해당 없음 |
| 라이선스 | 다양한 자유 소프트웨어 라이선스 |
| 웹사이트 | GNU gettext 공식 웹사이트 |
| 기타 | |
| 저장소 | OpenSolaris 및 GNU gettext 기반의 다양한 저장소 |
2. 역사
gettext는 본래 1990년대 초 썬 마이크로시스템즈가 작성하였다. 1995년에 GNU 프로젝트는 이 시스템의 자유 소프트웨어 구현물인 GNU gettext를 공개하였다.[37]
1980년대 후반 POSIX는 메시지 현지화 방법을 제공하지 않아 유니포럼(Uniforum) gettext와 X/Open catgets (XPG-3 § 5) 두 가지 제안이 제기되었다. 그러나 유닉스 및 POSIX 개발자들은 어떤 인터페이스를 사용할지에 대해 합의를 보지 못했고, C 라이브러리를 포함한 많은 glibc가 둘 다 구현했다.[5] 1990년대 초, 썬 마이크로시스템즈가 최초의 gettext를 구현하였다.[1] GNU 프로젝트는 gettext의 메시지를 키로 사용하는 방식이 더 간단하고 친숙하다고 판단했다.[7]
gettext가 POSIX의 일부가 되어야 하는지에 대한 논쟁은 오스틴 그룹에서 여전히 논쟁의 대상이었는데, 이는 이전 경쟁자가 이미 사용되지 않게 된 사실에도 불구하고 진행되었다. 언급된 우려 사항으로는 시스템 설정 로케일(전역 변수로 다중 스레딩 문제의 대상)에 대한 의존성, 와이드 문자열을 포함하는 새로운 C 언어 확장에 대한 지원 등이 있었다.[6]
po의 단순함과 광범위한 편집기 지원은 텍스트 문서에 대한 비 프로그래밍 컨텍스트에서, 또는 po4a (po for anything) 및 Translate Toolkit과 같은 변환기가 이러한 브리지를 제공하면서 다른 현지화 형식 간의 중간 형식으로 채택되기도 했다.[9][10]
2. 1. 초기 역사
1980년대 후반, POSIX는 메시지 현지화 방법을 제공하지 않았다. 이에 유니포럼(Uniforum)의 gettext와 X/Open의 catgets (XPG-3 § 5)라는 두 가지 제안이 제기되었다.[1] 1990년대 초, 썬 마이크로시스템즈가 최초의 gettext를 구현하였다.[1] 그러나 유닉스 및 POSIX 개발자들은 어떤 인터페이스를 사용할지에 대해 합의하지 못했고, C 라이브러리를 포함한 많은 glibc가 두 가지를 모두 구현하였다.[5]GNU 프로젝트는 gettext의 메시지를 키로 사용하는 방식이 더 간단하고 친숙하다고 판단하였다.[7] 1995년, GNU 프로젝트는 자유 소프트웨어 구현인 GNU gettext를 공개하였다.[37] GNU gettext는 이후 여러 프로그래밍 언어로 이식되었다.[8]
3. 동작 방식
`gettext`의 기본 인터페이스는 `gettext(const char*)` 함수인데, 사용자가 보게 될 문자열(주로 영어)을 받는다. 타이핑 시간을 줄이고 코드 복잡성을 낮추기 위해 이 함수는 보통 `_`로 별칭된다.[11]
```c
printf(gettext("내 이름은 %s입니다.\n"), my_name);
printf(_("내 이름은 %s입니다.\n"), my_name); // 같지만 짧음
```
`gettext()`는 주어진 문자열을 번역을 찾는 키로 사용하고, 번역이 없으면 원래 문자열을 반환한다. 이는 프로그램 ID (주로 정수)를 사용하는 POSIX `catgets()`[12], AmigaOS `GetString()`[13], Microsoft Windows `LoadString()`과 대조된다. `gettext`는 다른 의미를 가질 수 있는 텍스트를 처리하기 위해 "컨텍스트" 문자열을 추가로 받는 `cgettext()` 등의 함수도 제공한다.
`xgettext`는 소스에서 번역 가능한 문자열을 추출하여 `.pot` (Portable Object Template) 파일을 생성한다. 번역자에게 힌트를 주기 위해 `///`로 시작하는 주석을 사용할 수 있으며, `TRANSLATORS:`와 같은 접두사를 사용하기도 한다.
```c
/// TRANSLATORS: %s는 환경 설정에 지정된 사용자의 이름을 포함합니다.
printf(_("내 이름은 %s입니다.\n"), my_name);
```
`xgettext -c /` 명령을 실행하면 다음과 같은 `.pot` 파일이 생성된다. (xgettext는 C의 printf 형식 문자열로 인식한다.)
```pot
#. TRANSLATORS: %s는 환경 설정에 지정된 사용자의 이름을 포함합니다.
#, c-format
#: src/name.c:36
msgid "내 이름은 %s입니다.\n"
msgstr ""
```
POSIX 셸 스크립트에서는 `gettext.sh` 라이브러리를 통해 `gettext` 기능을 사용할 수 있다.[14] GNU Bash는 `$"msgid"` 구문을 제공하지만, `gettext()` 함수는 C 라이브러리에 의존한다.[15]
사용자는 유닉스 계열 시스템에서 환경 변수 `LC_MESSAGES`를 설정하여 번역된 문자열을 볼 수 있다. `.mo` 파일이 해당 언어에 대해 존재해야 한다. GNU 변종에서는 `LANGUAGE` 환경 변수를 사용할 수도 있으며, 콜론으로 구분된 여러 언어를 지정하여 폴백을 지원한다.[20]
3. 1. 프로그래밍
대부분의 프로그래밍 언어에서 `gettext` 함수 (또는 별칭 `_`)를 사용하여 번역할 문자열을 감싼다. 예를 들어, C 코드에서 다음과 같이 사용한다.[11]```c
printf(gettext("My name is %s.\n"), my_name);
```
이것은 다음과 같이 더 짧게 쓸 수 있다.
```c
printf(_("My name is %s.\n"), my_name);
```
`gettext()`는 주어진 문자열을 번역을 찾는 데 사용되는 키로 사용하고, 번역이 없으면 원래 문자열을 반환한다. 이는 프로그램 ID (주로 정수)를 사용하는 POSIX `catgets()`[12], AmigaOS `GetString()`[13], Microsoft Windows `LoadString()` 등과는 대조적이다.
`xgettext` 유틸리티는 소스 코드에서 번역 가능한 문자열을 추출하여 `.pot` (Portable Object Template) 파일을 생성한다.[11] 개발자는 번역자에게 힌트를 주기 위해 주석을 추가할 수 있다. (예: `TRANSLATORS:`)
예를 들어, 다음과 같은 C 코드가 있다고 하자.
```c
/// TRANSLATORS: %s는 환경 설정에 지정된 사용자의 이름을 포함합니다.
printf(_("내 이름은 %s입니다.\n"), my_name);
```
`xgettext`를 실행하면 다음과 같은 내용의 `.pot` 파일이 생성된다.
```pot
#. TRANSLATORS: %s는 환경 설정에 지정된 사용자의 이름을 포함합니다.
#, c-format
#: src/name.c:36
msgid "내 이름은 %s입니다.\n"
msgstr ""
```
POSIX 셸 스크립트에서 gettext는 `gettext.sh` 라이브러리를 포함할 수 있다.[14] GNU Bash는 간단한 gettext 기능을 위해 단순화된 구문 `$"msgid"`를 사용할 수 있지만, `gettext()` 함수를 제공하기 위해 C 라이브러리에 의존한다.[15]
C 언어 외에도 gettext는 C++, Objective-C, Bourne Shell, Bash, Python, GNU CLISP, Emacs Lisp, librep, GNU Smalltalk, Java, GNU Awk, Pascal, wxWidgets (WxLocale 클래스에 의한), YCP, Tcl, Perl, PHP, Ruby, Pike, JavaScript 등 다양한 언어에서 구현되어 있다.
3. 2. 번역
번역자는 `msginit` 프로그램을 사용하여 `.pot` 파일을 기반으로 `.po` (Portable Object) 파일을 생성하고 번역을 채운다.[16] 예를 들어, 프랑스어 번역을 초기화하려면 다음과 같은 명령어를 실행한다.[17]```bash
msginit --locale=fr --input=name.pot
```
이 명령어는 `fr.po` 파일을 생성한다. 번역자는 이 파일을 직접 편집하거나, Poedit 같은 전용 도구를 사용하거나, `.po` 파일 편집 모드가 있는 Emacs를 사용하여 번역을 작성한다. 편집된 파일의 예시는 다음과 같다.
```po
#: src/name.c:36
msgid "My name is %s.\n"
msgstr "Je m'appelle %s.\n"
```
번역이 완료되면, `msgfmt` 유틸리티를 사용하여 `.po` 파일을 기계가 읽을 수 있는 `.mo` (Machine Object) 파일로 컴파일한다.[18] GNU gettext는 다른 gettext 구현이 있는 시스템에서 자체 파일 이름 확장자 `.gmo`를 사용할 수 있다.[18] 이제 `.mo` 파일은 소프트웨어 패키지와 함께 배포할 준비가 된다.
GNU `msgfmt`는 프로그래밍 언어에서 사용되는 형식 문자열과 관련된 몇 가지 검사를 수행할 수도 있다. 또한 MO 이외의 언어별 형식으로 출력할 수 있다.[19] X/Open에 해당하는 것은 `gencat`이다.
개발 후기 단계에서 `msgmerge`를 사용하여 이전 번역을 최신 템플릿으로 "업데이트"할 수 있다. 또한 `.mo` 파일을 역 컴파일하는 `msgunfmt`와 일괄 처리를 위한 다른 많은 유틸리티도 있다.
일본어 번역 작업을 예로 들면, 번역자는 먼저 `msginit` 명령을 사용하여 번역 리소스 파일(`.po` 파일)을 초기화한다.
```bash
$ msginit --locale=ja --input=name.pot
```
이 명령어는 `ja.po` 파일을 생성한다. 파일 내부의 내용은 다음과 같다.
```po
#: src/name.c:36
msgid "My name is %s.\n"
msgstr ""
```
번역자는 이 파일을 직접 또는 Poedit 같은 도구를 사용하여 편집한다. 편집 후에는 다음과 같이 번역문이 채워진다.
```po
#: src/name.c:36
msgid "My name is %s.\n"
msgstr "私の名前は %sです。\n"
```
마지막으로, `.po` 파일은 `msgfmt` 명령을 통해 `.mo` 바이너리 파일로 컴파일되어 소프트웨어 패키지의 일부로 배포된다.
3. 3. 실행
사용자는 유닉스 계열 시스템에서 환경 변수 `LC_MESSAGES`를 설정하며, 프로그램은 해당 언어에 대한 `.mo` 파일이 있는 경우 선택된 언어로 문자열을 표시한다.[20]GNU 변종 사용자는 환경 변수 `LANGUAGE`를 사용할 수도 있다. 유닉스 변수와의 주요 차이점은 폴백을 위해 콜론으로 구분된 여러 언어를 지원한다는 것이다.[20] UNIX 계열 시스템의 사용자는 로케일 LANGUAGE를 환경 변수 `LANG`에 설정한다. 여기서 LANGUAGE는 IETF 언어 태그를 기반으로 하는 값이다.[34]
`LANG=LANGUAGE`[34]
예를 들어, 시스템의 인코딩이 `UTF-8`이고 일본(`ja`)의 일본어(`JP`)를 사용하는 사용자의 경우, LANGUAGE는 (IETF 언어 태그의 하이픈을 언더스코어로 대체하여) `ja_JP.UTF-8`이 된다.
`LANG=ja_JP.UTF-8`
시스템은 환경 변수에서 번역 리소스를 검색하고 (.mo 파일에 해당 언어의 리소스가 있다면) 애플리케이션이 해당 언어로 표시되도록 할 수 있다.
4. 복수형 처리
`ngettext` 함수는 명사의 수에 따라 다른 번역을 제공하는 복수형 처리를 지원한다. `gettext`에서와 같이 `N_`로 별칭이 지정되기도 한다.
```C
// 매개변수: 영어 단수형, 영어 복수형, 정수 개수
printf(ngettext("%d translated message", "%d translated messages", n), n);
```
`.po` 파일의 `""` (빈 문자열) 항목 헤더에는 메타데이터가 저장되며, 그 중 하나는 해당 언어의 복수형 규칙이다. 이는 일반적으로 C 스타일의 삼항 연산자를 사용하여 지정된다. 슬로베니아어의 경우 다음과 같다.
```po
msgid ""
msgstr ""
"..."
"Language: sl\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"
```
슬로베니아어는 네 개의 복수형을 가지므로, 최종 `.po` 파일은 다음과 같다.
```po
#: src/msgfmt.c:876
#, c-format
msgid "%d translated message"
msgid_plural "%d translated messages"
msgstr[0] "%d prevedenih sporočil"
msgstr[1] "%d prevedeno sporočilo"
msgstr[2] "%d prevedeni sporočili"
msgstr[3] "%d prevedena sporočila"
```
언어별 복수 규칙은 유니코드 컨소시엄에서 확인할 수 있다.[21] `msginit`은 특정 언어에 대한 파일을 생성할 때 적절한 규칙을 자동으로 채운다.[16]
5. 구현체
C 외에도 gettext는 C++, Objective-C, 본 셸, Bash, 파이썬, GNU CLISP, Emacs Lisp, librep, GNU Smalltalk, Java, GNU Awk, Pascal, wxWidgets (WxLocale 클래스에 의한), YCP, Tcl, Perl, PHP, Ruby, Pike, JavaScript에서 구현된다.[27]
C# (ASP.NET[22][23] 및 WPF[24]용), Perl,[25] PHP,[26] 파이썬,[27] R,[28] 스칼라,[29] 그리고 Node.js[30] 에서도 구현을 가지고 있다. 대부분의 경우 사용 방법은 C 언어의 경우와 같다.
GNU gettext는 Objective-C를 기본적으로 지원하지만, Swift 프로그래밍 언어에 대한 지원은 아직 없다. Cocoa 플랫폼에서 일반적으로 사용되는 gettext 구현은 POLocalizedString이다.[31] Microsoft Outlook for iOS 팀은 gettext와 유사한 API를 갖춘 LocalizedStringsKit 라이브러리도 제공한다.[32]
6. 한국어 지원
GNU gettext는 한국어를 포함한 다양한 언어를 지원한다. 사용자는 로케일 LANGUAGE를 환경 변수 `LANG`에 설정하여 한국어 지원을 받을 수 있다. 여기서 LANGUAGE는 IETF 언어 태그를 기반으로 하는 값이다.[34]
예를 들어, 시스템 인코딩이 UTF-8이고 한국(KR)에서 한국어(ko)를 사용하는 경우, LANGUAGE는 (IETF 언어 태그의 하이픈을 언더스코어로 대체하여) `ko_KR.UTF-8`이 된다.
`LANG=ko_KR.UTF-8`
시스템은 환경 변수에서 번역 리소스를 검색하고, 해당 언어의 리소스가 .mo 파일에 있다면 애플리케이션을 해당 언어로 표시할 수 있다. 많은 오픈 소스 프로젝트에서 gettext를 사용하여 한국어 번역을 제공한다.
7. 비판 및 논쟁 (POSIX 표준 관련)
썬 마이크로시스템즈는 1993년에 최초의 gettext를 구현했다.[1] 유닉스 및 POSIX 개발자들은 어떤 종류의 인터페이스를 사용할지에 대해 실제로 합의하지 못했고 (다른 옵션은 X/Open catgets임), 따라서 C 라이브러리를 포함한 많은 glibc가 둘 다 구현했다.[5] 2019년 8월 기준으로, gettext가 POSIX의 일부가 되어야 하는지에 대한 논쟁은 오스틴 그룹에서 여전히 논쟁의 대상이었는데, 이는 이전 경쟁자가 이미 사용되지 않게 된 사실에도 불구하고 진행되었다. 언급된 우려 사항으로는 시스템 설정 로케일(전역 변수이며 다중 스레딩 문제의 대상임)에 대한 의존성, 와이드 문자열을 포함하는 새로운 C 언어 확장에 대한 지원 부족 등이 있었다.[6]
참조
[1]
웹사이트
About gettext
https://www.gnu.org/[...]
2024-05-09
[2]
웹사이트
History of gettext() et al? - comp.unix.solaris
http://compgroups.ne[...]
2016-04-03
[3]
웹사이트
Bridging the Digital Divide in South Africa {{!}} Linux Journal
https://www.linuxjou[...]
Linux Journal
2002-11-01
[4]
웹사이트
Introduction to Internationalization Programming {{!}} Linux Journal
https://www.linuxjou[...]
Linux Journal
2002-11-01
[5]
웹사이트
Message Translation
https://www.gnu.org/[...]
[6]
웹사이트
0001122: POSIX should include gettext() and friends - Austin Group Defect Tracker
http://austingroupbu[...]
[7]
웹사이트
The Programmer's View
http://ftp.gnu.org/o[...]
1998-04-30
[8]
웹사이트
GNU gettext utilities: List of Programming Languages
https://www.gnu.org/[...]
[9]
웹사이트
po4a
https://po4a.org/ind[...]
[10]
웹사이트
The essential toolkit for localization engineers
https://toolkit.tran[...]
[11]
웹사이트
GNU gettext utilities: How Marks Appear in Sources
https://www.gnu.org/[...]
null
[12]
웹사이트
About catgets
https://www.gnu.org/[...]
2017-10-24
[13]
웹사이트
AmigaOS Manual: Python Modules and Packages - AmigaOS Documentation Wiki
https://wiki.amigaos[...]
2023-07-09
[14]
웹사이트
GNU gettext utilities: sh
https://www.gnu.org/[...]
[15]
웹사이트
GNU gettext utilities: bash
https://www.gnu.org/[...]
[16]
웹사이트
GNU gettext utilities: PO Files
https://www.gnu.org/[...]
2016-04-03
[17]
웹사이트
How to Translate With GetText PO and POT Files
http://www.icanlocal[...]
2016-04-03
[18]
웹사이트
Files Conveying Translations
https://www.gnu.org/[...]
2014-04-22
[19]
웹사이트
msgfmt Invocation
https://www.gnu.org/[...]
[20]
웹사이트
GNU gettext utilities: Locale Environment Variables
https://www.gnu.org/[...]
2016-04-03
[21]
웹사이트
Language Plural Rules
https://unicode.org/[...]
[22]
웹사이트
Google Code Archive - Long-term storage for Google Code Project Hosting
https://code.google.[...]
2016-04-03
[23]
웹사이트
turquoiseowl/i18n: Smart internationalization for ASP.NET
https://github.com/t[...]
2016-04-03
[24]
웹사이트
NGettext.Wpf - Proper internationalization support for WPF (via NGettext)
https://github.com/r[...]
2019-08-16
[25]
웹사이트
libintl-perl - An Internationalization Library for Perl That Aims To Be Compatible With the Uniforum Message Translations System as Implemented For Example in GNU Gettext
https://github.com/g[...]
2017-09-14
[26]
웹사이트
Gettext
https://secure.php.n[...]
2017-10-24
[27]
웹사이트
gettext – Multilingual internationalization services – Python 3.7.0 documentation
https://docs.python.[...]
2018-09-21
[28]
웹사이트
gettext: Translate Text Messages
https://rdrr.io/r/ba[...]
2021-11-13
[29]
웹사이트
makkarpov/scalingua: A simple gettext-like internationalization library for Scala
https://github.com/m[...]
2016-04-28
[30]
웹사이트
DanielBaulig/node-gettext: An adaption of Joshua I. Miller's Javascript Gettext library for node.js
https://github.com/D[...]
2016-04-03
[31]
웹사이트
hulab/POLocalizedString: gettext for iOS/OS X/watchOS/tvOS
https://github.com/h[...]
hulab
2019-09-19
[32]
웹사이트
microsoft/LocalizedStringKit: Generate .strings files directly from your code
https://github.com/m[...]
Microsoft
2020-02-12
[33]
웹사이트
配布物件のPGP署名
https://ftp.gnu.org/[...]
2024-02-23
[34]
문서
Bourneシェルの場合。環境変数の設定方法はシェルにしたがうので、Cシェルならばsetenv LANG LANGUAGEのようになる。
[35]
웹인용
GNU gettext 0.21 released
https://lists.gnu.or[...]
info-gnu
2020-07-27
[36]
웹인용
GNU gettext
http://savannah.gnu.[...]
GNU project [Savannah]
2012-12-26
[37]
웹인용
보관된 사본
http://compgroups.ne[...]
2013-11-03
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com
