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ÆÄÀÏÀ» »ý¼ºÇÏ¸é µÈ´Ù.