  1996ǯ9 Locales mini-HOWTO
  Peeter Joot, joot@ecf.toronto.edu 
    <kazm@ca2.so-net.or.jp> 
  v1.3, 6 June 1996.

  ΥɥȤǤϡLinux ޥ locale Ѥ뤿ˡ
  Ĥޤ [ locale ϡ֥פȤ֥פȤɽ
  뤳ȤޤɤǤְ㤤ǤϤʤΤǤǤ
  locale ȱѸΤޤޤɽޤ]

  1.  Ϥ

  ϡ䤬 localedef 򥤥󥹥ȡ뤷locale 򥳥ѥ뤷ƻ
  ߤ뤿ˤʤФʤʤäȤƤǤϤڤ
  ߤȤƤäƤߤޤ餯ȻȤ˶̣ͤ⤤
  Ǥ礦ꤹСʬ򤷤 locale ǡNLS ѤǤ륢
  ץꥱȤ褦ˤʤǤ礦Ф餯 locale ݡ
  ȤɸۤΰȤʤꡢ mini-HOWTO ΤۤȤɤ̵ѤĹʪȤʤ
  Ǥ礦[ Ǥ Linux Υ饤֥ܸΰ locale
  򥵥ݡȤƤʤ褦Ǥ餳ΥɥȤɤͤ
  ȤäơξϤäΩʤǤ礦]

  2.  Ȥꤢ "locale" ȤϲǤ礦

  locale ϡץ˥ϡɥǥ󥰤٤Ǥʤʸ
  ͭΤĤΤΤäޤ

  ʬΥԥ塼ʣ locale 󥹥ȡ뤵Ƥʤ顢
  Ķѿˤä locale θץΤդޤǤޤ
  ǥեȤ locale  C 뤤 POSIX ǡ libc ˥ϡɥ
  ǥ󥰤Ƥޤ

     LANG
         locale ꤷޤ¾ LC_xxxx ȤĶѿˤ
        ƾ񤭤ޤ

     LC_COLLATE
        ¤٤()ν֤Ǥ

     LC_CTYPE
        ʸʸʸʤɡ touppertolower
        islowerisdigit Τ褦ʴؿѤޤ [man 3
        isalpha ȤΤȡ]

     LC_MONETARY
        Ԥǲʾñ̤եޥåȤΤɬפʾޤߤ
        ζڤʸڤʸ̲ߵ̣
        Τ䤽ΰ֤ޤ

     LC_NUMERIC
        Ԥ顢ڤʸǤ

     LC_TIME
        դꤹˡǤû̷û̷Ǥη
        Τ褦ʤΤǤ

     LC_MESSAGES
        ä˸ȤϤޤ

     LC_ALL
         locale ꤷ¾ LC_xxxx Ķѿ˾񤭤ޤ

  Ĥ¾ locale 򼨤ޤ¾ˤ⤿󤢤ޤ

     en_CA
        English Canadian.

     en_US
        US English.

     de_DE
        Germany's German.

     fr_FR
        France's French.

  [:ܸط ja,ja_JP,ja_JP.eucJP,ja_JP.SJIS,ja_JP.JIS7 ]

  ʤץ񤤤ƤơŪѤ뤳Ȥ˾ʤ顢
  locale Ȥ٤ǤΤäȤ礭ͳϡï⤬ʤƱʸ
  åȤ䥳ɥڡȤȤƤ櫓ǤϤʤȤȤǤ

  ץǰʲΤ褦ʤȤ򤷤ʤ褦ˡ

         /* check for alphabetic characters */
         if ( (( c >= 'a') && ( c <= 'z' )) ||
              (( c >= 'A') && ( c <= 'Z' )) ) { ... }

  ⤷ʥץ񤯤ʤ顢Υץϡ/user/file/... 
  ASCII ǡASCII ʳΤʤˤΤǤʤȤꤷƤꡢ桼
  locale ΥɥڡºŤƤޤ㤨СɥĸĶǤ
  a-饦ȤΤ褦ʸǻϤޤޤˡisalpha() Τ褦
  locale ¸ؿѤ٤Ǥ⤷ץबϤä US-ASCII
  ե٥åȤȤȤ׵ᤷƤ⡢isalpha() ؿѤ
  ޤξϡsetlocale(LC_CTYPE,"C") ¹ԤLANG
  LC_CTYPELC_ALL Ķѿ "C" ꤷʤФʤޤ

  locale Ȥͻ̤ץޤ ASCII ١ C ץ
  񤯤ȤˤƤ⤷ʤβ꤬Ǥʤʤޤ

  ȤСʸΥɰ֤ꤹ뤳ȤϤǤޤ'A' Υɰ
   0x41 ǤϤʤ 0xC1  charmap ե뤳Ȥ򲿤Τ
  ߤ뤳ȤϤǤޤ󡣤ϼºݤ˥ᥤե졼Ѥ IBM 
  ɥڡ 37 ǡ'A' Υɰ֥ޥåԥ󥰤ǤԤϡ US-
  ASCIIiso8859-x ʤɤѤƤޤ

  Ūʹͤϡۤʤۤ͡ʤäۤʤ¤٤
  ۤʤ륳ɥڡѤۤʤ˽Ǥ뤳ȤǤlocale 
  locale ˰¸ץϤºŤ˱򤹤褦
  ˰տޤƤޤΤ˳̤ϤϤޤ󤷡ץ
  񤯤ȤˤäȵʬѤǤ褤ΤǤ

  3.  Ρ

  o  ʬΥޥ locale ꤹ뤿ˤϡĤΤΤ򥢥åץ
     졼ɤɬפޤftp.tu-clausthal.de:/pub/linux/SLT/nls 
     locale  localedef  a.out Ǥ(nlsutils-0.5.tar.gzȤ̾)
     褦ǤǡELF ƥäƤʤELF ߤʤ
     顢ȤȤǤޤ֤ɤ¾ΤȤ nlsutils
     ѥåΥԡǤ礦Ϥ򸫤ĤƤޤ
      [ ˤϤʤ褦Ǥdebian ѥåˤ .deb η
     äƤ褦Ǥ ]  locale  localedef Υɥ
     ǤʹȤޤ󤬡б libc 򥤥󥹥ȡ뤷ʤ
     ФʤʤȤϹθˤƤƲǤ餳 HOWTO 
     ʬ 䤬 libc ȤΥեߥ꡼򥢥åץ졼ɤ뤿ˤʤ
     ʤʤäȤεϿǤޤ󡣤⤷ʤ libc 򥤥
     ȡ뤹ʤ顢䤬褦 ELF ƥ餻locale 򥻥
     ȥåפȤ ELF ˰ܹԤɬפޤ

  o  䤬ԤʤäƥܹԤƤϡa.out  ELF ؤΰܹԤǤ٤
     ȤƱǤELF ˰ܹԤƤʤLinux κƥ󥹥ȡ ELF
     ˰ܹԤƤʤ顢sunsite Υߥ顼ǿ ELF HOWTO äƤ
     ƤϤФ餷ɤǡlibcld.soʤɤ ELF 
     ƥؤΰܹԤ򥤥󥹥ȡ뤹뤿Υ󥹤Ǥ⤢ޤ

  o  򥤥󥹥ȡ뤹ˤƤ⡢Ŭʥ꡼ΡȤ README ʤɤ
     եɤǤ⤷ǻ䤬񤤤Ȥ򤷤ꡢ
     (ǤʤȤꤦ)䤬ǽ񤤤Ȥ¹Ԥ뤳ȤǤ
     Υƥ򤰤㤰ˤƤޤäƤ⡢ɤդʤǲ
      [ ơǤԤդʤǤ ]

  o   libc  ld.so Υ󥹥ȡְ㤨ȡ֡ȤǤʤ
     ƥˤƤޤȤޤ֡ɥǥĤäƤ٤
     ǡäƤޤȼ֤ΤĤʤפʥǡɬХåå
     Ƥ褦ˡ

  4.  ɬפʤ

  ΤΤ򤤤ʾ꤫ɤɬפޤ
   locale ե٤ƤΤΤ sunsite.unc.edu
  tsx-11.mit.eduʤ٤ʤ餳ΥȤΥߥ顼뤳ȤǤ
   [ Ǥ sunsite.sut.ac.jp,ftp.sra.co.jp ʤɡ locale 
  ʳǤ ftp.kuis.kyoto-u.ac.jp Ȥޤɤʤ kernel 
  2.0.x ˤƤޤäƤäȿ饤֥Ȥäۤ褤Ǥ
  linux-2.0.x/Documentation/Changes 򻲾ȤΤȡ ]

  o  locale  charmap Υ --- localedef Ȥäƥѥ뤹
     Ǥ

  o  libc-5.2.18.bin.tar.gz --- c  math 饤֥Ф ELF ͭ
     ֥Ǥ

  o  libc-5.2.18.tar.gz --- ELF ͭ饤֥ΥɤǤ
     localedef ѥ뤹Τˤ줬ɬפǤ

  o  make-3.74.tar.gz --- dirent ΥХ뤿ΥѥåΤ
     ˥ѥ뤹ɬפޤ

  o  release.libc-5.2.18 --- Υ꡼ΡȤˤ make 
     Υѥåޤ

  o  ld.so-1.7.12+ --- ʥߥå󥫤Ǥ

  o  ELF gcc-2.7.2+ --- ѥɬפǤ

  o  ELF kernel 1.1.92+, or ELF kernel 1.3.40+ --- ѥɬפ
     

  o  binutils 2.6.0.2+ --- ѥɬפǤ

  locale ΥǤ륵ȤϤ֤󤿤󤢤ޤ䤬Τä
  ϰϤǤϼΥȤ locale  charmap ΥǤޤ

  dkuug.dk:/i18n/WG15-collection/locales
  <ftp://dkuug.dk/i18n/WG15-collection/locales>
  dkuug.dk:/i18n/WG15-collection/charmaps
  <ftp://dkuug.dk/i18n/WG15-collection/charmaps>

  -- [ ܸ locale  XFree86 ˤäƤޤ ] --

  5.  ƤΤΤ򥤥󥹥ȡ뤹

  Ƥ򥤥󥹥ȡ뤹뤿ΤΤǤϤǤˤԤʤ
  󥹥ȡ뤷 ELF ƥ(ѥ顢ͥʤ...)äƤ
  

        1. ޤbinutils ѥå򥤥󥹥ȡ뤷ޤ

             tar xzf binutils-2.6.0.2.bin.tar.gz -C /

        2. ˥ʥߥå󥫤򥤥󥹥ȡ뤷ޤ

             tar zxf ld.so-1.7.12.tar.gz -C /usr/src
             cd /usr/src/ld.so-1.7.12
             sh instldso.sh

        3.  libc Хʥ򥤥󥹥ȡ뤷ޤܤ
           libc-5.2.18 Υ꡼ΡȤ򻲾ȤƤ

             rm -f /usr/lib/libc.so /usr/lib/libm.so
             rm -f /usr/include/iolibio.h /usr/include/iostdio.h
             rm -f /usr/include/ld_so_config.h /usr/include/localeinfo.h
             rm -rf /usr/include/netinet /usr/include/net /usr/include/pthread
             tar -xzf libc-5.2.18.bin.tar.gz -C /

        4. ͭ饤֥ǧ뤿 ldconfig ¹Ԥɬ
           פޤ

             ldconfig -v

        5. libc ˤ make 䤤ĤΥץХޤ
           ϼΤ褦 make ƹۤ󥹥ȡ뤷ޤ [ 
            libc ǻȤ make-3.74 ΥХʥ⤢ޤ ]

             tar zxf make-3.74.tar.gz -C /usr/src
             cd /usr/src/make-3.74
             patch < /whereever_you_put_it/release.libc-5.2.18
             configure --prefix=/usr
             sh build.sh
             ../make install
             cd ..
             rm -rf make-3.74

        6.  localedef 򥳥ѥ롢󥹥ȡǤޤ

             mkdir /usr/src/libc
             tar zxf libc-5.2.18.tar.gz -C /usr/src/libc
             cd /usr/src/libc
             cd include
             ln -s /usr/src/linux/include/asm .
             ln -s /usr/src/linux/include/linux .
             cd ../libc
              ../configure

             # ϤΣ make ɬפʤȤɤϼޤ
             # 󤬡ΤˤäƤǤ

             make clean ; make depend
             cd locale
             make programs
             mv localedef /usr/local/bin
             mv locale /usr/local/bin

        7. localedef 򸫤ĤȤ charmap ֤Ʋ
            charmap.tar Ȥ dkuug.dk ftp Ȥ
           Ǥ롢 charmap  locale Ѥޤ

             tar xf charmaps.tar -C /tmp
             mkdir /usr/share/nls
             mkdir /usr/share/nls/charmap
             mkdir /usr/share/locale
             mv /tmp/charmaps/* /usr/share/nls/charmap
             rm -rf /tmp/charmaps
             tar xf locales.tar -C /usr/share # ʤȤ֤Ƥ
             #
             # locale ΤĤ `copy' Ȥ¾
             # locale ˰¸ޤϰʲΥޥɤ뤿
             # makefile  grepcutsed Ȥäƺޤ
             # /usr/share/locale ǥ쥯ȥˤƤ locale 
             # Ȥޤ
             #
             localedef -ci locales/en_DK -f ISO_8859-1:1987 en_DK
             localedef -ci locales/sv_SE -f ISO_8859-1:1987 sv_SE
             localedef -ci locales/fi_FI -f ISO_8859-1:1987 fi_FI
             localedef -ci locales/sv_FI -f ISO_8859-1:1987 sv_FI
             localedef -ci locales/ro_RO -f ISO_8859-1:1987 ro_RO
             localedef -ci locales/pt_PT -f ISO_8859-1:1987 pt_PT
             localedef -ci locales/no_NO -f ISO_8859-1:1987 no_NO
             localedef -ci locales/nl_NL -f ISO_8859-1:1987 nl_NL
             localedef -ci locales/fr_BE -f ISO_8859-1:1987 fr_BE
             localedef -ci locales/nl_BE -f ISO_8859-1:1987 nl_BE
             localedef -ci locales/da_DK -f ISO_8859-1:1987 da_DK
             localedef -ci locales/kl_GL -f ISO_8859-1:1987 kl_GL
             localedef -ci locales/it_IT -f ISO_8859-1:1987 it_IT
             localedef -ci locales/is_IS -f ISO_8859-1:1987 is_IS
             localedef -ci locales/fr_LU -f ISO_8859-1:1987 fr_LU
             localedef -ci locales/fr_FR -f ISO_8859-1:1987 fr_FR
             localedef -ci locales/de_DE -f ISO_8859-1:1987 de_DE
             localedef -ci locales/de_CH -f ISO_8859-1:1987 de_CH
             localedef -ci locales/fr_CH -f ISO_8859-1:1987 fr_CH
             localedef -ci locales/en_CA -f ISO_8859-1:1987 en_CA
             localedef -ci locales/fr_CA -f ISO_8859-1:1987 fr_CA
             localedef -ci locales/fo_FO -f ISO_8859-1:1987 fo_FO
             localedef -ci locales/et_EE -f ISO_8859-1:1987 et_EE
             localedef -ci locales/es_ES -f ISO_8859-1:1987 es_ES
             localedef -ci locales/en_US -f ISO_8859-1:1987 en_US
             localedef -ci locales/en_GB -f ISO_8859-1:1987 en_GB
             localedef -ci locales/en_IE -f ISO_8859-1:1987 en_IE
             localedef -ci locales/de_LU -f ISO_8859-1:1987 de_LU
             localedef -ci locales/de_BE -f ISO_8859-1:1987 de_BE
             localedef -ci locales/de_AT -f ISO_8859-1:1987 de_AT
             localedef -ci locales/sl_SI -f ISO_8859-2:1987 sl_SI
             localedef -ci locales/ru_RU -f ISO_8859-5:1988 ru_RU
             localedef -ci locales/pl_PL -f ISO_8859-2:1987 pl_PL
             localedef -ci locales/lv_LV -f BALTIC lv_LV
             localedef -ci locales/lt_LT -f BALTIC lt_LT
             localedef -ci locales/iw_IL -f ISO_8859-8:1988 iw_IL
             localedef -ci locales/hu_HU -f ISO_8859-2:1987 hu_HU
             localedef -ci locales/hr_HR -f ISO_8859-4:1988 hr_HR
             localedef -ci locales/gr_GR -f ISO_8859-7:1987 gr_GR

  6.  ɤ

  ٤ƺѤС줿 locale ȤȤǤǤ礦ʲñ
  ץǤ

         /* test.c : a simple test to see if the locales can be loaded, and
          * used */
         #include <locale.h>
         #include <stdio.h>
         #include <time.h>

         main(){
                 time_t t;
                 struct tm * _t;
                 char buf[256];

                 time(&t);
                 _t = gmtime(&t);

                 setlocale(LC_TIME,"");
                 strftime(buf,256,"%c",_t);

                 printf("%s\n",buf);
         }

  ߤ locale Ķѿ꤬ɤʤäƤ뤫 locale ץȤ
  Ƹ뤳ȤǤޤ

         $ # compile the simple test program above, and run it with
         $ # some different locale settings
         $ gcc -s -o Test test.c
         $ # see what the current locale is :
         $ locale
         LANG=POSIX
         LC_COLLATE="POSIX"
         LC_CTYPE="POSIX"
         LC_MONETARY="POSIX"
         LC_NUMERIC="POSIX"
         LC_TIME="POSIX"
         LC_MESSAGES="POSIX"
         LC_ALL=
         $ # Ho, hum... we're using the boring C locale
         $ # let's change to English Canadian:
         $ export LC_TIME=en_CA
         $ Test
         Sat 23 Mar 1996 07:51:49 PM
         $ # let's try French Canadian:
         $ export LC_TIME=fr_CA
         $ Test
         sam 23 mar 1996 19:55:27

  7.  catopen ΥХ

  locale 򥤥󥹥ȡ뤹ȡLinux libc  catopen ޥɤˤХ
  (ͤ)ޤåȤץ
  ɥĸ쥫ꡢ /home/peeter/catalogs/de_DE ˤ
  Ȥޤ礦

  ʲΤȤ de_DE locale 򥤥󥹥ȡ뤷ʤǹԤʤäƤߤƤ

          export LC_MESSAGES=de_DE
          export NLSPATH=/home/peeter/catalogs/%L/%N.cat:$NLSPATH

  ɥĸΥåץǤcatgets Υǥե
  ȤΥåȤޤ

   catopen åƥ뤿 setlocale 
  ¹ԤĶѿꤵƤƤ setlocale ԤͳǤ
   catopen  NLSPATH Ƥ "%L"  "C" ƥå
  ɤ褦Ȥޤ

  locale 򥤥󥹥ȡ뤷ʤƤåѤ뤳ȤϤǤ
  ޤʲΤ褦 NLSPATH  "%L" ʬϤäꤹɬפ
  Ǥ礦

         export NLSPATH=/home/peeter/catalogs/de_DE/%N.cat:$NLSPATH

   locale ƥĶѿƤŪ򤯤Ƥޤ
  ޤ

  8.  Q & A

  Υ FAQ Ĺ뤫⤷ޤ󤬡ϤޤǤϤ
  ޤ

  8.1.  msgcat μ

   LINUX Υ桼ǡʲΥƥȥץ񤭤ޤ

         --------------------------------------------------------------------
         #include <stdio.h>
         #include <locale.h>
         #include <features.h>
         #include <nl_types.h>

         main(int argc, char ** argv)
         {
                 nl_catd catd;

                 setlocale(LC_MESSAGES, "");
                 catd = catopen("msg", MCLoadBySet);
                 fprintf(stderr,catgets(catd, 1, 1, "locale message fail\n"));
                 catclose(catd);
         }
         --------------------------------------------------------------------
         $ msg.m
         $set 1

         1 locale message pass\n
         --------------------------------------------------------------------

  ⤷ catopen("/etc/locale/msg.cat",MCLoadBySet); Τ褦 catopen 
  ХѥȤС̤ޤΤ褦ˤ
  catopen  -1 ֤ޤ(Ԥޤ)

  8.2.  msgcat 

  μˤĤƤΥ󤬤ˤʤäƤޤ⤦
  դäƤޤ

  å򥫥֤ΤŬڤʾϤ󤢤ޤ(å
  ξꤹ) NLSPATH ĶѿŪꤵƤ
  Ƥ⡢libc ǼΤ褦Ƥޤ

         $ strings /lib/libc.so.5.2.18 | grep locale | grep %L
         /etc/locale/%L/%N.cat:/usr/lib/locale/%L/%N.cat:/usr
         /lib/locale/%N/%L:/usr/share/locale/%L/%N.cat:/usr/
         local/share/locale/%L/%N.cat

  줬Ǥ鼡ΤΣĤäƤߤƤ

         $ export LC_MESSAGES=en_CA
         $ export LC_ALL=en_CA
         $ export LANG=en_CA

  åΤɤ줫˥ԡƤʤ顢嵭 NLSPATH
  Ȼꤵ줿Ķǡcatopen("msg", MCLoadBySet); ϤޤưǤ
  

         /etc/locale/en_CA/msg.cat
         /usr/lib/locale/en_CA/msg.cat
         /usr/lib/locale/msg/en_CA
         /usr/share/locale/en_CA/msg.cat
         /usr/local/share/locale/en_CA/msg.cat

  ⤷ en_CA locale 󥹥ȡ뤵ƤʤСsetlocale 
  Ԥ뤿ˤޤcatopen 롼 (en_CAǤϤʤ) "C" 
  "%L" Ǥ礦

  9.  եʡ

  ʾǤ勞ФΥɤʤνȤʤäߤȻפޤ
  locale ¸Υץ񤯤ˡʤõȤǤ
  Ϥ餯󤢤Ǥ礦libc  info ڡ˾󤬤Ĥ
  ޤman ڡϤĤǤ⸫뤳ȤǤޤäWWWڡ
  Сξ򸫤Ĥ뤳ȤǤǤ礦ݲץ
  ߥ󥰤Фɤ󸻤򸫤Ĥ顢Τ餻Ф
  򤳤 HOWTO ȿǤ뤳ȤǤޤ

