  Locales mini-HOWTO
  Peeter Joot, joot@ecf.toronto.edu
  v1.3, 6 June 1996
  cK, kazm@ca2.so-net.or.jp
  v1.3j, 22 October 1996

  ̃hLgł́ALinux }V locale gp邽߂̐ݒ@
  Đ܂B [ 󒍁Flocale ́uP[vƂuJ[vƂ\
  L邱Ƃ܂BǂłԈႢł͂Ȃ̂łAł
  locale Ɖp̂܂܂ŕ\L܂B]

  JF F̓̕éAŏIXV 1996N1022ł̂̂łB
  Ƃ͈قȂꍇ̂ŁAӂB

  1.  ͂߂

  ́A localedef CXg[Alocale RpCĎ
  ݂邽߂ɂȂ΂ȂȂƂĂ邾łB͂y
  ݂ƂĂĂ݂܂A炭ƎƂɋl
  ł傤Bxݒ肷΁AI locale ŁANLS 𗘗płA
  vP[Vg悤ɂȂł傤B΂炭 locale T|[
  g͕Wzz̈ꕔƂȂA mini-HOWTO ̂قƂǂ͖p̒ƂȂ
  ł傤B

  [ 󒍁F_ł Linux ̃Cu͓{̈ locale T|[
  gĂȂ悤łB炱̃hLg̖|ǂސlɂƂāA
  ̏͂ƖɗȂł傤B]

  2.  Ƃ肠 "locale" Ƃ͉ł傤H

  locale ́AvOɃn[hR[fBOׂłȂA╶ɓ
  L̂̂̂B܂B

  ̃Rs[^ɕ locale CXg[ĂȂAL
  ϐɂ locale lvÔӂ܂Ił܂B
  ftHg locale  C 邢 POSIX ŁA libc ̒Ƀn[hR
  [fBOĂ܂B

  LANG
      locale ݒ肵܂A LC_xxxx Ƃϐɂ
     ď㏑܂B

  LC_COLLATE
     ׂ(\[g)̏ԂłB

  LC_CTYPE
     `A啶AȂǁB toupperAtolowerA
     islowerAisdigit ̂悤Ȋ֐ŗp܂B [󒍁Fman 3
     isalpha QƂ̂ƁB]

  LC_MONETARY
     ҂`ŉݕPʂtH[}bĝɕKvȏ܂݂
     B͐̋؂蕶A_؂蕶Aʉ݋LӖ
     ̂₻̈ʒu`܂B

  LC_NUMERIC
     ҂A_؂蕶AWłB

  LC_TIME
     Atw肷@łB͗jAZk`^Zk`ł̌
     ̂悤Ȃ̂łB

  LC_MESSAGES
     ɌƂ͂܂B

  LC_ALL
      locale ݒ肵A LC_xxxx ϐɏ㏑܂B

  ̑ locale ܂Bɂ񂠂܂B

       en_CA
          English Canadian.

       en_US
          US English.

       de_DE
          Germany's German.

       fr_FR
          France's French.

  [:{֌W ja,ja_JP,ja_JP.eucJP,ja_JP.SJIS,ja_JP.JIS7 ]

  ȂvOĂāAۓIɗp邱Ƃ]ނȂA
  locale gׂłB̂Ƃ傫ȗŔANȂƓ
  ZbgR[hy[WgƂĂ킯ł͂ȂƂƂłB

  vO̒ňȉ̂悤ȂƂȂ悤ɁB

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

  ȃvOȂÃvÓA/user/file/... 
  ASCII ŁAASCII ȊÔȂɂ̂łȂƂ肵ĂA[U
  locale ̃R[hy[W`𑸏dĂ܂BႦ΁AhCcł
  a-EEĝ悤ȕŎn܂܂BɁAisalpha() ̂悤
  locale ˑ֐pׂłBvO͂ US-ASCII
  At@xbggƂvĂꍇAisalpha() ֐p
  ܂Ȁꍇ́Asetlocale(LC_CTYPE,"C") sALANGA
  LC_CTYPEALC_ALL ϐ "C" ɐݒ肵Ȃ΂Ȃ܂B

  locale gΔɗZʂAvO} ASCII x[X C vO
  ƂɂĂȂ̉肪łȂȂ܂B

  Ƃ΁ÃR[hʒu肷邱Ƃ͂ł܂B'A' ̃R[hʒu
   0x41 ł͂Ȃ 0xC1 ɒ` charmap t@C邱Ƃ̂
  ~߂邱Ƃ͂ł܂B͎ۂɃCt[ŗp IBM R
  [hy[W 37 ŁA'A' ̃R[hʒu}bsOłBO҂́A US-
  ASCIIAiso8859-x ȂǂŗpĂ܂B

  {IȍĺAقȂlXقȂ錾bAقȂׂz
  AقȂR[hy[WpAقȂ鍑ɏZł邱ƂłBlocale 
  locale ɈˑvO͂𑸏dAɉ悤
  ɈӐ}Ă܂B̂Ɋiʂ̓w͂͂܂񂵁AvO
  ƂɂƋCς邾ł悢̂łB

  3.  m[g

  o  ̃}V locale ݒ肷邽߂ɂ́A̂̂AbvO
     [hKv܂Bftp.tu-clausthal.de:/pub/linux/SLT/nls 
     locale  localedef  a.out ł(nlsutils-0.5.tar.gz ƂO)
     悤łBŁAELF VXeĂȂAELF ~Ȃ
     AgƂł܂BԂǂ̂Ƃ nlsutils
     pbP[W̃Rs[ł傤BA͂Ă܂
      [ 󒍁Fɂ͂Ȃ悤łAdebian pbP[Wɂ .deb ̌`
     œĂ悤ł ] B locale  localedef ̃X^hA
     ł𕷂Ƃ܂񂪁AΉ libc CXg[Ȃ
     ΂ȂȂƂ͍lɂĂĉBł炱 HOWTO ̑啔
       libc Ƃ̃t@~[AbvO[h邽߂ɂȂ
     ȂȂƂ̋L^ł܂BȂ libc CX
     g[ȂA悤 ELF VXe𑖂点Alocale Zb
     gAbvƂ ELF ɈڍsKv܂B

  o  sȂVXeڍs̓éAa.out  ELF ւ̈ڍsłׂ
     ƂƓłBELF ɈڍsĂȂALinux ̍ăCXg[ ELF
     ɈڍsĂȂAsunsite ̃~[ŐV ELF HOWTO Ă
     ĂB͂΂炵KChŁAlibcAld.soAȂǂ ELF VX
     eւ̈ڍsCXg[邽߂̃KC_Xł܂B

  o  CXg[ɂĂAKȃ[Xm[g README Ȃǂ
     t@CǂłBAŎƂA
     (łȂƂ肤)ŏƂs邱Ƃł
     ̃VXeႮɂĂ܂ĂAǂӂ߂Ȃŉ
     B [ 󒍁FāAłΖ|҂ӂ߂ȂłB ]

  o  V libc  ld.so ̃CXg[ԈႦƁAu[głȂVX
     eɂĂ܂Ƃ܂Bu[hfBXNĂׂ
     ŁAĂ܂ƎԂ̂Ȃdvȃf[^͕KobNAbv
     Ă悤ɁB

  4.  KvȂ

  QAR̂̂낢ȏꏊ_E[hKv܂B
   locale \[Xt@CׂĂ̂̂ sunsite.unc.eduA
  tsx-11.mit.eduAȂׂȂ炱̃TCg̃~[瓾邱Ƃł
  B
  [ 󒍁Fł sunsite.sut.ac.jp,ftp.sra.co.jp ȂǁB locale ֌W
  Oł ftp.kuis.kyoto-u.ac.jp g܂BǂȂ kernel  2.0.x
  ɂĂ܂ĂƐVCugق悢ł
  Blinux-2.0.x/Documentation/Changes QƂ̂ƁB ]

  o  locale  charmap ̃\[X --- localedef găRpC
     łB

  o  libc-5.2.18.bin.tar.gz --- c  math Cuɑ΂ ELF L
     CułB

  o  libc-5.2.18.tar.gz --- ELF LCũ\[XR[hłB
     localedef RpĈɂꂪKvłB

  o  make-3.74.tar.gz --- dirent ̃oOC邽߂̃pb`̂
     ߂ɃRpCKv܂B

  o  release.libc-5.2.18 --- ̃[Xm[gɂ make 쐬
     ߂̃pb`܂B

  o  ld.so-1.7.12+ --- _Ci~bNEJłB

  o  ELF gcc-2.7.2+ --- RpCɕKvłB

  o  ELF kernel 1.1.92+, or ELF kernel 1.3.40+ --- RpCɕKv
     B

  o  binutils 2.6.0.2+ --- RpCɕKvłB

  locale ̃\[XłTCg͂Ԃ񂽂񂠂܂Bm
  ͈͂ł͎̃TCg locale  charmap ̃\[Xł܂B

       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>

  -- [ 󒍁F{ locale  XFree86 ɂĂ܂B ] --

  5.  SĂ̂̂CXg[

  ͑SĂCXg[邽߂̂̂łB͂łɂsȂO
  CXg[ ELF VXe(RpCAJ[lȂ...)Ă
  B

  1. ܂Abinutils pbP[WCXg[܂B

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

  2. Ƀ_Ci~bNEJCXg[܂F

  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 oCiCXg[܂Bڂ菇 libc-5.2.18
     ̃[Xm[gQƂĂB

       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. VLCuF邽߂ ldconfig sKv
     ܂B

       ldconfig -v

  5. libc ɂ make ₢̃vO󂷃oO܂B͎
     悤 make č\zACXg[܂F [ 󒍁FV libc
     Ŏg make-3.74 ̃oCi܂ ]

       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. A localedef RpCACXg[ł܂B

  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

  # ͂̂Q make KvȂƂǂ͎M܂
  # 񂪁AŜ߂ɂĂ邾łB

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

  7. localedef Ƃ charmap uĉB
     charmap.tar Ƃ dkuug.dk ftp TCg_E[hłA
     charmap  locale \[Xp܂B

  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 # DȂƂɒuĂ
  #
  # locale \[X̂ `copy' gA͑
  # locale Ɉˑ܂B͈ȉ̃R}h쐬邽߂
  # makefile  grepAcutAsed gč쐬܂B
  # /usr/share/locale fBNgɂSĂ locale Iu
  # WFNg쐬܂B
  #
  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.  Aǂ

  ׂčς߂΁A쐬ꂽ locale gƂłł傤Bȉ͒P
  ȗvOłB

  /* 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 vOg
  Č邱Ƃł܂B

       $ # 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 ̃oOC

  locale CXg[ƁALinux libc  catopen R}hɂoO
  (dlH)C܂BbZ[WEJ^OgvO쐬
  AhCcJ^OA /home/peeter/catalogs/de_DE ɂ
  Ƃ܂傤B

  ȉ̂Ƃ de_DE locale CXg[ȂōsȂĂ݂ĂF

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

  hCc̃bZ[WEJ^OI[vłAcatgets R[̃ftH
  g̃bZ[Wg܂B

   catopen bZ[WEJeS𓾂邽߂ setlocale R[
  sAϐݒ肳ĂĂ setlocale s闝RłB
   catopen  NLSPATH ̑SĂ "%L"  "C" ăbZ[WE
  J^O[h悤Ƃ܂B

  locale CXg[ȂĂbZ[WEJ^Op邱Ƃ͂ł
  ܂Aȉ̂悤 NLSPATH  "%L" ͂Ɛݒ肷Kv
  ł傤F

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

  A locale JeSϐ̑SĂ̖ړIĂ܂
  ܂B

  8.  Q & A

  ̃ZNV FAQ ɐ邩܂񂪁A{͂܂ł͂
  ܂B

  8.1.  msgcat ̎

   LINUX ̃[UŁAȉ̃eXgvO܂F

       --------------------------------------------------------------------
       #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 Ő
  ΃pXg΁Aʂ܂BÂ̗悤ɂ
  catopen  -1 Ԃ܂(s܂)B

  8.2.  msgcat ̓

  ̎ɂĂ͑ÕZNVxɂȂĂ܂A
  tĂ܂B

  bZ[WJ^OɒûɓK؂ȏꏊ͂񂠂܂B(bZ[
  WEJ^Ȍꏊݒ肷) NLSPATH ϐIɐݒ肳Ă
  ĂAlibc ̒Ŏ̂悤ɒ`Ă܂F

       $ 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

  ꂪł玟̂̂PĂ݂ĂF

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

  bZ[WEJ^ÔǂꂩɃRs[ĂȂAL NLSPATH
  Ǝw肳ꂽŁAcatopen("msg", MCLoadBySet); ͂܂ł
  B

       /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

  A en_CA locale CXg[ĂȂ΁A setlocale
  ͎s邽߂ɂ܂Acatopen [` (en_CA ł͂Ȃ) "C"
   "%L" ɑł傤B

  9.  tBi[

  ȏłB킭΂̃KChȂ̏ƂȂė~Ǝv܂B
  locale ˑ̃vO߂ɁAȂTƂł
  ͂炭񂠂ł傤Blibc  info y[Wɏ񂪂
  ܂Aman y[W͂ł邱Ƃł܂B WWW y[
  W΁Ȁ邱Ƃłł傤BۉvO
  ~Oɑ΂ǂ񌹂Am点B΂
   HOWTO ɔf邱Ƃł܂B

