Next Previous Contents

5. National Language Support

对于国家语言支持 (缩写 NLS) 来说,这是一个大多数 UNIX 系统都具备的功能,以便应用程序能够了解用户的语言设置,并以相应的语言显示其消息。

NLS 被许多 GNU 工具使用,特别是那些在命令行界面 (Command Line Interface - CLI,即众所周知的提示符) 中运行的工具,并且最近也受到图形环境 (例如 KDE) 的支持。 应用程序的通知通过环境变量进行,命令类型为 LANG="el_GR"。 从 1998 年 11 月起,希腊语将配置为 el_GR (基于相应的 ISO 标准),我们希望这种更改将很快在发行版中传递。

西莫斯·泽维特利斯 (Simos 3evitellns) 也做了关于 NLS 的工作,请参阅 Greek-nls-HOWTO 以及 magaz 杂志上的这篇文章:http://magaz.hellug.gr/09/04_nls.html

注意:本章由塔索斯·卡皮奥 (Tasos Kapio) 撰写,当时 NLS 并非总是在 linux 中设置,并且标准非常不稳定 (例如,您可能会发现它说的是 gr_GR,而不是 el_GR)。

5.1 准备工作

首先查看您的系统中有多少个 C 库以及有哪些 C 库。 例如:

 ttyp3:~#ldconfig -v | grep libc.so
 libc.so.4 => libc.so.4.7.2
 libc.so.6 => libc-2.0.4.so
 libc.so.5 => libc.so.5.4.33
存在 5 个类别的 libc,并且它们彼此不兼容,始终在区域设置方面。(目前,大多数人拥有版本 4 和 5)
  1. libc 4 ??? (a.out)
  2. libc 5.0.9-5.3.12
  3. libc 5.4.x
  4. glibc 1.x ??? (对于某些 Linux 架构,如 libc 5)
  5. glibc 2.x.x (libc 6)

5.2 安装希腊语区域设置

您需要区域设置数据 (localedata)、编译器 localedef 和诊断工具 locale。

首先转到您找到 gr_GR 的子目录并运行命令

   >sed -e 's/am_pm "";""/am_pm   "<P*><M*>";"<M*><M*>"/' gr_GR > el_GR
(为了希腊语 PM 和 MM 的可能性以及为了与 X 兼容而更改名称) 并进行检查
          > tail -n 5 el_GR | grep am_pm
          am_pm  "<P*><M*>";"<M*><M*>"
          t_fmt_ampm ""
          END LC_TIME
现在以 root 身份创建以下子目录
   # mkdir -m 755 -p /usr/share/locale/el_GR/LC_MESSAGES
   # mkdir -m 755 -p /usr/share/i18n/charmaps
   # mkdir -m 755 -p /usr/share/i18n/locales
   # ln -sf /usr/share/i18n/charmaps /usr/share/i18n/charmap
将 el_GR、en_DK、ISO-8859-7 (或 ISO_8859-7:1987 或 ISO_8859-7,1987) 安装到正确的位置
# cd (ekei pou eivai ta localedata)
# cp e?_??  /usr/share/i18n/locales
# cd ../charmaps
# cp ISO[-_]8859-7* /usr/share/i18n/charmaps
# cd /usr/share/i18n/charmaps
# ln -s ISO_8859-7,1987 ISO-8859-7
如果您还没有二进制形式的 locale 和 localedef,请编译它们。 这大致是这样完成的
 > cd ~/src
 > gzip -dc libc-x.y.z.tar.gz | tar xvf -
 > cd libc-x.y.z
 > ./configure
 > make clean; make depend
 > cd locale
 > make programs
 > su -f root -c 'install -m 755 locale localedef /usr/bin'
现在您已准备好编译区域设置数据。 以 root 身份
# cd /usr/share
如果您有一个 libc
# localedef -ci locale/el_GR -f i18n/charmap/ISO-8859-7 el_GR
如果您有两个,例如 libc-5.4.33 和 libc-2.0.4
# localedef-2.04   -ci el_GR -f ISO-8859-7 el_GR
# localedef-5.4.33 -ci el_GR -f ISO-8859-7 el
# chmod -cR a+r locale
现在它们应该在 /usr/share/locale/el_GR (和 el) 下
# ls locale/el_GR
LC_COLLATE    LC_CTYPE      LC_MESSAGES/  LC_MONETARY   LC_NUMERIC     LC_TIME

一个测试。 对于 csh 类型的 shell,例如 tcsh

> setenv LANG el_GR
对于 sh 类型的 shell,例如 bash、ksh
> LANG=el_GR ; export LANG
尝试
> locale
LANG=el_GR
LC_CTYPE="el_GR"
LC_NUMERIC="el_GR"
LC_TIME="el_GR"
LC_COLLATE="el_GR"
LC_MONETARY="el_GR"
LC_MESSAGES="el_GR"
LC_ALL=
> locale -c LC_TIME | head
LC_TIME
Kur;Deu;Tri;Tet;Pem;Par;Sab
Kuriakn;Deutera;Tritn;Tetartn;Pemptn;Paraskeun;Sabbato
Iav;Feb;Mar;Apr;Mai;Iouv;Ioul;Aug;Sep;Okt;Noe;Dek 
Iavouarios;Febrouarios;Martios;Aprilios;Maios;Iouvios;Ioulios;Augoustos;Septembrios;Oktwbrios;Noembrios;Dekembrios
PM;MM
%a %d %b %Y %T %Z
%d/%m/%Y
%T
(格式因 libc 而异)

现在您可以尝试一些应用程序 (只要它们是用兼容的 libc 编译的即可)

> unsetenv LESSCHARSET n unset LESSCHARSET
> less kapoio-keimevo-me-ellnvika
> cal
   Augoustos 1997
Ku De Tr Te Pe Pa Sa 
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
在 Netscape 4 (使用 libc 5.4.x x > 4) 中,打开邮件和讨论,您将在日期中看到中间的月份,例如 31/08/1997,以及希腊语的日子。 完毕 :-)

安装各种应用程序的希腊语消息

这里有两个独立的包 gencat 和 gettext

a) gencat 与每个 libc 的源代码 (在 nls/ 下) 或二进制文件一起提供,例如 gencat-x.y.z,并且依赖于它,就像 localedef 一样。 它将国际语言文本 (.m) 类型的文件编译为目录。

b) gettext,独立于 libc,通常存在于 gnu 的镜像中,例如 ftp.kernel.org/pub/mirrors/gnu/gettext-0.10.tar.gz 以及 debian、redhat 中。(要查找最新版本,请转到 http://las.ml.org 搜索 gettext) 几乎所有的 GNU {file,sh,text,net}-utils 包和许多其他包都使用它,例如 (WindowMaker)。 有关信息,请参阅 ftp.kernel.org/pub/mirrors/gnu/ABOUT-NLS,向希腊团队发送消息至 el@li.org,或为了提供帮助,使用单词 "subscribe" 在消息正文中加入列表 el-request@li.org。

目前,据我所知,只有 tcsh 6.07.02 (带有 debian 的补丁) 具有完整的希腊语消息,并且不幸的是,它使用了 gencat。

5.3 安装 tcsh

下载 tcsh >= 6.07.02。 找到 gencat (libc 源代码,来自 redhat,debian 的二进制文件) 在编译 tcsh 之前。 n

编译,安装,测试 tcsh

 >make
 >make catalogs
 >su -f root -c 'make install'
 >su -f root -c 'install -m 644 tcsh.greek.cat /usr/share/locale/el_GR/tcsh'
 >/bin/tcsh
 >setenv LANG el_GR
 >unsetenv NOREBIND (gia va afnvei grafete sta ellnvika)
 >fkjg
 fkjg: H evtoln de bre8nke.
如果它没有输出希腊语消息,那么

如果消息是这样的

 fkjg: ^H ^e^v^t^o^l^n ^d^e ^b^r^e^8^n^k^e.
  1. 检查 /usr/share/locale/el_GR 的权限
     > ls -l /usr/share/locale/el_GR
     total 96
     drwxr-xr-x   3 root     root         1024 Iouv 25 20:40 ./
     drwxr-xr-x  68 root     root         2048 Aug   6 10:41 ../
     -rw-r--r--   1 root     root        29156 Iouv 25 20:36 LC_COLLATE
     -rw-r--r--   1 root     root        10428 Iouv 25 20:36 LC_CTYPE
     drwxr-xr-x   2 root     root         1024 Iouv 25 20:34 LC_MESSAGES/
     -rw-r--r--   1 root     root           95 Iouv 25 20:36 LC_MONETARY
     -rw-r--r--   1 root     root           27 Iouv 25 20:36 LC_NUMERIC
     -rw-r--r--   1 root     root          536 Iouv 25 20:36 LC_TIME
     -rw-r--r--   1 root     root        47443 Iouv 12 21:27 tcsh
    
  2. 重新编译带有 localedef 的区域设置数据
  3. 检查 localedef 和 libc 的版本是否相同
     > localedef -V
     localedef (GNU libc) 2.0.4
     Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
     This is free software; see the source for copying conditions.  There is NO
     warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     Written by Ulrich Drepper.
     > ldd /bin/tcsh
            libnsl.so.1 => /lib/libnsl.so.1 (0x40003000)
            libncurses.so.4 => /usr/lib/libncurses.so.4 (0x4000a000)
            libcrypt.so.1 => /lib/libcrypt.so.1 (0x4004a000)
            libc.so.6 => /lib/libc.so.6 (0x40078000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00000000)
    
  4. 下载更新版本的区域设置数据
  5. 升级 libc

5.4 各种应用程序的设置

大多数应用程序唯一需要的是将 LANG 设置为 el_GR。

5.5 问题

很多 ;-)。

C 库 (libc) 的问题

来自 LOCALEDEF 和 GENCAT 的编译形式通常在 LIBC 之间更改,并且使用一个 LIBC 的头文件编译的程序可能无法读取由另一个库创建的区域设置数据。

X 的问题

Locale not supported from X library.(或类似的东西) 检查子目录的权限

      # chmod -cR a+r /usr/share/locale /usr/X11R6/lib/locale
检查 Xresources 并查找任何可疑内容
      >xrdb -query
请参阅 C 库的问题。

当一切正常时出现的问题 ;-)

守护进程 syslogd 以 7 位存储数据,许多应用程序将以希腊语向其发送日期,例如 PAM,导致有时您无法看到月份。

一些程序将等待“yes/no”的答案,而不是“y”或“n”,分别为“v”和“o”。

在控制台中,最好使用 iso-8859-7(ELOT-928) 字体。 特别是对于希腊语 tcsh。

5.6 附加信息

存在手册页:locale.5 locale.7 setlocale.2


Next Previous Contents