GETTEXT Howto
½ÂÀ±
ÀÌ
INZEN
sylee (at) inzen.com
$Date $
$Revision : $
2002
Copyright
ÀÌ ¹®¼´Â GNU Free
Documentation License ¹öÀü 1.1 ȤÀº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´Ü¿¡¼
¹ßÇàÇÑ ÀÌÈÄ ÆÇÀÇ ±ÔÁ¤¿¡ µû¸£¸ç ÀúÀ۱ǿ¡ ´ëÇÑ º» »çÇ×ÀÌ ¸í½ÃµÇ´Â ÇÑ
¾î¶°ÇÑ Á¤º¸ ¸Åü¿¡ ÀÇÇÑ º»¹®ÀÇ ÀüÀ糪 ¹ßÃéµµ ¹«»óÀ¸·Î Çã¿ëµË´Ï´Ù.
2.0
2002³â 11¿ù 5ÀÏ
sylee
¹öÁ¯ 2.0
gettext ¼Ò°³¿Í °£´ÜÇÑ »ç¿ë¹ý
gettext ¼Ò°³
»ç¿ëÀÚÀÇ locale ¿¡ µû¶ó ƯÁ¤ message output ¿¡ ´ëÇÑ ´Ù±¹¾î 󸮸¦ ÇÒ ¼ö ÀÖ´Â gettext ¿¡ ´ëÇØ »ìÆìº»´Ù.
À̸¦ À§ÇØ ¸ÕÀú ¸Þ¼¼Áö°¡ ó¸®µÉ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â ¹ýÀ» shell script, C code ¿¡¼ »ìÆìº¸°í,
±× ÈÄ¿¡ º¯È¯µÉ ¸Þ¼¼Áö¸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» »ìÆìº»´Ù.
shell script ¿¡¼ÀÇ gettext »ç¿ë
shell ¿¡¼ÀÇ »ç¿ë¹ýÀ» »ìÆì º»´Ù.
¿¹Á¦ ÇÁ·Î±×·¥À¸·Î Hello ¶ó´Â shell script ¸¦ ÀÛ¼ºÇÑ´Ù.
´Ü¼øÈ÷ Hello ¿Í World! ¶ó°í Ãâ·ÂÇÏ°Ô µÇ¾î ÀÖ´Ù.
À̸¦ locale ¿¡ µû¶ó Ãâ·ÂÇϱâ À§ÇØ gettext ·Î µÑ·¯½Î¼ echo ½Ã۰í ÀÖ´Ù.
shell script ¿¡¼ Ưº°È÷ ´Ù¸¥ ºÎºÐÀº ¼Ò½ºÃ¹ ºÎºÐ¿¡ TEXTDOMAINDIR °ú TEXTDOMAIN À»
Àüü ȯ°æº¯¼ö·Î export ½ÃŲ´Ù´Â °ÍÀÌ´Ù.
#! /bin/sh
# Hello
TEXTDOMAINDIR=/usr/local/share/locale
TEXTDOMAIN=Hello
export TEXTDOMAINDIR
export TEXTDOMAIN
echo "$(gettext -s "Hello")"
echo "$(gettext -s "World!")"
C code ¿¡¼ÀÇ gettext »ç¿ë
C code ¿¡¼ÀÇ »ç¿ë¹ýÀ» »ìÆìº»´Ù.
¿¹Á¦ ÇÁ·Î±×·¥À¸·Î Hello.c ¶ó´Â C code ¸¦ ÀÛ¼ºÇÑ´Ù.
ÀÌ ÇÁ·Î±×·¥Àº Greeting, Hello, World ¶ó°í Ãâ·ÂÀ» Çϴµ¥ °¢°¢ÀÇ message µéÀ»
gettext ¸¦ ÀÌ¿ëÇÏ¿© »ç¿ëÀÚ locale ¿¡ µû¶ó Ãâ·ÂÅä·Ï ÇÑ´Ù.
#include <libintl.h>
#include <locale.h>
#include <stdio.h>
int
main(void)
{
/* ÇöÀç È£½ºÆ®ÀÇ locale À» »ç¿ëÇÑ´Ù. */
setlocale(LC_ALL,"");
/* Hello ÀÇ message table À» /usr/local/share/locale ¾Æ·¡¿¡¼ ãµµ·Ï ÇÑ´Ù. */
bindtextdomain("Hello", "/usr/local/share/locale");
textdomain("Hello");
printf("original message : %s\n", "Greeting");
printf("gettext trans : %s\n", gettext("Greeting"));
printf("original message : %s\n", "Hello");
printf("gettext trans : %s\n", gettext("Hello"));
printf("original message : %s\n", "World!");
printf("gettext trans : %s\n", gettext("World!"));
return 0;
}
string À» gettext ·Î µÑ·¯½Î°Ô µÇ¸é µÑ·¯½ÎÀÎ message °¡ ÇØ´ç locale¿¡ ÇØ´çÇÏ´Â
message table À» ÂüÁ¶ÇÏ¿© Ãâ·ÂÇÏ°Ô µÈ´Ù. ¿©±â¼ ÂüÁ¶ÇÒ message table À» ÇÁ·Î±×·¥¿¡ ¿¬°á½Ã۱â À§Çؼ
bindtextdomain À» »ç¿ëÇÏ¿´´Ù. À§ ¿¹Á¦¿¡¼´Â À§ Äڵ带 Hello ¶ó´Â À̸§À¸·Î ºôµåÇϰí, ÀÌÀÇ message table Àº
/usr/local/share/locale ¾Æ·¡¿¡¼ textdomain ¿¡¼ ÁöÁ¤ÇÑ Hello ÇÁ·Î±×·¥ÀÇ message table À» ÂüÁ¶Çϵµ·Ï
ÇѰÍÀÌ´Ù.
¸¸¾à ÇØ´çÇÏ´Â message table ÀÌ ¾ø°Å³ª Á¤ÀÇµÈ °ªÀÌ ¾øÀ» °æ¿ì¿¡´Â º¯È¯ ¾øÀÌ ¿ø·¡ message°¡ Ãâ·ÂµÈ´Ù.
gettext message table ÀÛ¼º¹ý
gettext ¸¦ ÅëÇØ º¯È¯µÉ message µéÀ» ´ã´Â message table À» ÀÛ¼ºÇÏ´Â ¿ä·ÉÀ» »ìÆìº»´Ù.
gettext´Â Á¤ÇØÁø message ¸¦ ¹Ì¸® Á¤ÇØÁø message ·Î ¹Ù²Ù¾î ÁÖ´Â ¿ªÇÒÀ» ÇÒ »ÓÀÌ´Ù.
µû¶ó¼ ¿øº» message ¿Í À̰ÍÀÌ ¾î¶² message ·Î º¯È¯µÉ Áö¸¦ ³ªÅ¸³»¾î ÁÖ´Â table ÀÌ ÇÊ¿äÇÏ´Ù.
ÀÌÀÇ ÃʾÈÀÌ µÇ´Â °ÍÀÌ *.po ¿¡ ÇØ´çÇÏ´Â ÆÄÀÏÀÌ´Ù.
ÀÌ ÃʾÈÀ» Á÷Á¢ ÀÛ¼ºÇÒ ¼öµµ ÀÖÁö¸¸ xgettext ¶ó´Â ÇÁ·Î±×·¥ÀÌ ±× ÃʾÈÀ» ¸¸µé¾î ÁØ´Ù.
# shell script
xgettext Hello
# C code
xgettext Hello.c
xgettext ¸¦ »ç¿ëÇÏ°í ³ª¸é messages.po ¶ó´Â ÆÄÀÏÀÌ »ý¼ºµÈ´Ù.
ÀÌ´Â GNU version ÀÇ gettext ÀÎÁö ¾Æ´ÑÁö¿¡ µû¶ó ¾à°£ ´Ù¸£Áö¸¸ »À´ë´Â ºñ½ÁÇÏ´Ù.
ÀÌ po ÆÄÀÏÀº º¸ÅëÀÇ text ÆÄÀÏÀ̰í, msgid ¿Í msgstr ÀÇ Â¦À¸·Î ÀÌ·ç¾îÁ® ÀÖÀ¸¸ç,
msgid °¡ À§ ¿¹Á¦ ÇÁ·Î±×·¥ ¼Ó¿¡¼ gettext ·Î µÑ·¯½ÎÀÎ message µéÀÌ´Ù.
±×¸®°í msgstr ÀÌ º¯È¯µÉ ¸Þ¼¼Áö¸¦ ´ã°Ô µÈ´Ù.
xgettext ¸¦ ÇÏ°í ³ª¸é msgid µéÀÌ ¸ðµÎ ÃßÃâµÇ¸ç, »ç¿ëÀÚ´Â ´ÜÁö msgstr ºÎºÐÀÇ ºó°÷¸¸ ä¿öÁÖ¸é µÈ´Ù.
´ÙÀ½°ú °°ÀÌ Ã¤¿öº¸ÀÚ.
¾Õ ÀýÀÇ ÇÁ·Î±×·¥µé¿¡¼ Hello ¿Í World! ¸¦ gettext °¡ º¯È¯Çϱâ À§Çؼ´Â ¾Æ±î »ý¼ºµÈ po ÆÄÀÏÀÇ msgstrºÎºÐÀ» ¾Æ·¡Ã³·³
¼öÁ¤ÇÏ¸é µÈ´Ù.
msgid "Hello"
msgstr "Çï·Î"
msgid "World!"
msgstr "¿ùµå!"
ÀÌÁ¦ ÀÌ·¸°Ô ÀÛ¼ºµÈ ÆÄÀÏÀ» msgfmt ¶ó´Â ÇÁ·Î±×·¥À» ÀÌ¿ëÇÏ¿© gettext °¡ ÀÌÇØÇÒ ¼ö ÀÖ´Â ÆÄÀÏÀÎ moÆÄÀÏ·Î º¯È¯ÇÑ´Ù.
ÀÌ moÆÄÀÏÀº binary Çü½ÄÀÇ ÆÄÀÏÀÌ´Ù.
msgfmt -o Hello.mo messages.po
Ãâ·Â ÆÄÀÏ À̸§À» Hello.mo ¶ó ÇÑ ÀÌÀ¯´Â »ý¼ºµÉ mo ÆÄÀÏÀÇ À̸§À» ÇÁ·Î±×·¥ÀÇ À̸§°ú °°ÀÌ Çϱâ À§ÇؼÀÌ´Ù.
ÀÌÁ¦ À̸¦ /usr/local/share/locale/ko/LC_MESSAGE/ ¾Æ·¡¿¡ ³Ö¾î µÎ¸é µÈ´Ù.
Çѱ¹¾î·Î locale ÀÌ ¼³Á¤µÇ¾î ÀÖ´Ù¸é ...locale/ko/ ¾Æ·¡¸¦ ÂüÁ¶ÇÏ°Ô µÈ´Ù.
¸¸¾à ÇÁ¶û½º¾î·Î message translation À» ÇϰíÀÚ ÇÒ °æ¿ì¿¡´Â ÇØ´ç .po ÆÄÀÏÀÇ msgstr À» ºÒ¾î·Î ÀÛ¼ºÇÑ´Ù.
±×¸®°í À̸¦ msgfmt ·Î Hello.mo ·Î ¸¸µç ÈÄ ¸¸µé¾îÁø mo ÆÄÀÏÀ» /usr/local/share/locale/fr/LC_MESSAGE/ ¾Æ·¡¿¡ ³Ö¾î µÎ¸é µÈ´Ù.
½Ã½ºÅÛ ·ÎÄÉÀÏ¿¡ µû¶ó ¿µ¾î, Çѱ¹¾î, ȤÀº ºÒ¾î message °¡ Ãâ·ÂµÈ´Ù.
Non GNU vs GNU
GNU version ÀÇ gettext ÀÎÁö ¾Æ´ÑÁö¿¡ µû¶ó Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù°í ¾ð±ÞÇß´Ù.
½ÇÁ¦·Î´Â ÀÌ Â÷ÀÌ ¶§¹®¿¡ message º¯È¯ÀÌ ¾È µÇ±âµµ ÇÑ´Ù.
±× Â÷ÀÌÁ¡Àº messages.po ÆÄÀÏÀÇ format ¿¡ ÀÖ´Ù.
non GNU version ÀÇ gettext ¸¦ »ç¿ëÇÏ°Ô µÉ ¶§¸é ¾Õ Àý¿¡¼ ÀÛ¼ºÇÑ °Íó·³ msgid, msgstr ÀÇ ½ÖÀ¸·Îµµ ÃæºÐÇÏ´Ù.
±×·¸Áö¸¸ GNU version ÀÇ gettext ¿¡¼´Â À§ ó·³ ÇØ¼´Â ¿øÇÏ´Â °á°ú¸¦ ¾òÀ» ¼ö ¾ø´Ù.
xgettext ·Î ¸¸µé¾îÁø messages.po ¸¦ º¸ÀÚ
non GNU messages.po
domain "messages"
# File:Hello.c, line:22, textdomain("Hello");
msgid "Greeting"
msgstr
msgid "Hello"
msgstr
msgid "World!"
msgstr
GNU messages.po
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2002-11-13 15:09+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: Hello.c:26
msgid "Greeting"
msgstr ""
#: Hello.c:29
msgid "Hello"
msgstr ""
#: Hello.c:32
msgid "World!"
msgstr ""
GNU messages.po ¿¡¼´Â »ç¿ëÀÚ°¡ ¼öÁ¤ÇØ ÁÖ¾î¾ß ÇÒ »çÇ×µéÀÌ ¸î °¡Áö ´õ ÀÖ´Ù.
±âº» Á¤º¸ À̿ܿ¡ CHARSET À» ÁöÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù. Çѱ¹¾îÀÏ °æ¿ì´Â euc-KR ·Î ÁöÁ¤ÇØ ÁÖ¾î¾ß ¾ÈÀüÇÏ´Ù.
GNU ÀÌ³Ä ¾Æ´Ï³Ä¿¡ µû¶ó ÀÛ¼º¹ýÀº ±×´ÙÁö ´Ù¸£Áö ¾Ê´Ù. Áß¿äÇÑ °ÍÀº ºôµå ¹æ¹ýÀÌ´Ù.
GNU gettext ¸¦ »ç¿ëÇÑ´Ù¸é xgettext, msgfmt µµ GNU version À» »ç¿ëÇÏ¿©¾ß ÇÑ´Ù.
non GNU gettext ¸¦ »ç¿ëÇÑ´Ù¸é ¿ª½Ã xgettext, msgfmt µµ gettext ¿Í °°Àº °ÍÀ» »ç¿ëÇÏ¿©¾ß ÇÑ´Ù.
±×¸®°í C code ÀÏ °æ¿ì¿¡´Â ºôµåÇÒ ¶§ ¸µÅ©µÉ ¶óÀ̺귯¸®¸¦ Á÷Á¢ ¸í½ÃÇØ ÁÖ´Â °ÍÀÌ ¾ÈÀüÇÏ´Ù.
(GNU À϶§´Â GNU ¶óÀ̺귯¸®, non GNU ¶óÀ̺귯¸®ÀÏ ¶§´Â ÇØ´ç ¶óÀ̺귯¸®)
# example
shell> gcc Hello.c -o Hello -lintl
½ÇÇà°á°ú
ÀÌÁ¦ Hello ¶ó´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¶§ ½ÇÇàµÇ°í Àִ ȯ°æÀÇ locale¿¡ µû¶ó xgettext, msgfmt ¿¡ ÀÇÇØ ¸¸µé¾îÁø,
Hello.mo ¸¦ ÂüÁ¶ÇÒ °ÍÀÎÁö ȤÀº ±×³É ¸Þ¼¼Áö¸¦ Ãâ·ÂÇÒ °ÍÀÎÁö¸¦ °áÁ¤ÇÏ°Ô µÈ´Ù.
¼³Á¤Çß´ø message °¡ Ãâ·ÂµÇ°Ô µÈ´Ù. C program ÀÇ ½ÇÇà ¿¹ÀÌ´Ù.
original message : Greeting
gettext trans : Greeting
original message : Hello
gettext trans : Çï·Î
original message : World!
gettext trans : ¿ùµå!
Greeting Àº message table ¿¡ Á¸ÀçÇÏÁö ¾ÊÀ¸¹Ç·Î ±×³É Greeting ÀÌ ÂïÈ÷°Ô µÈ´Ù. ³ª¸ÓÁö
message µéÀº message table ¿¡ Á¤ÀÇµÈ msgstr °ªÀ» ÂüÁ¶ÇÏ¿© Ãâ·ÂÇϰí ÀÖ´Ù.
Miscellaneous
ȯ°æº¯¼ö Áß LC_MESSAGES °¡ C ·Î Á¤ÀǵǾîÀÖ´Ù¸é ¸Þ¼¼Áö ÀüȯÀÌ ÀÌ·ç¾îÁöÁö ¾Ê´Â´Ù.
À̸¦ º¯È¯ÇϰíÀÚ ÇÏ´Â locale ·Î ¹Ù²Ù¾î ÁÖ´Â °ÍÀÌ ÁÁ´Ù. setlocale(LC_MESSAGES, "ko_KR");
non GNU ÀÏ ¶§ÀÇ *.po ´Â msgid, msgstr ÀÇ ½ÖÀ¸·Î¸¸ Á÷Á¢ ÀÛ¼ºÇÏ¿©µµ µÈ´Ù.
GNU gettext ¸¦ »ç¿ëÇÒ ¶§¿¡´Â ÈçÈ÷ gettext(String) À» _(String) À¸·Î define ÇØ¼ »ç¿ëÇÑ´Ù.
À̶§¿¡´Â xgettext -k_ test.c·Î poÆÄÀÏÀ» »ý¼ºÇÏ¸é µÈ´Ù.