对于国家语言支持 (缩写 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)。
首先查看您的系统中有多少个 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)
您需要区域设置数据 (localedata)、编译器 localedef 和诊断工具 locale。
ftp://dkuug.dk/i18n/WG15-collection/locales/gr_GR (2679 bytes) ftp://dkuug.dk/i18n/WG15-collection/charmaps/ISO_8859-7:1987 (19768 bytes) ftp://dkuug.dk/i18n/WG15-collection/locales/en_DK (101080 bytes)
locales/gr_GR locales/en_DK charmaps/ISO_8859-7,1987(应该只适用于 libc 5.4.x)
首先转到您找到 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。
下载 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.如果它没有输出希腊语消息,那么
>ls -l /usr/share/locale/el_GR/tcsh -rw-r--r-- 1 root root 47443 Iouv 12 21:27 /usr/share/locale/el_GR/tcsh >file /usr/share/locale/el_GR/tcsh /usr/share/locale/el_GR/tcsh: data >ls -l /bin/tcsh -rwxr-xr-x 1 root root 270476 Sab Aug 10:23 /bin/tcsh >date Sab Aug 9 10:38 EET DST 1997
> gencat -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)
如果消息是这样的
fkjg: ^H ^e^v^t^o^l^n ^d^e ^b^r^e^8^n^k^e.
> 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
> 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)
大多数应用程序唯一需要的是将 LANG 设置为 el_GR。
#include <locale.h> ..... setlocale(LC_ALL,""); ..... >dokimn --ola还有其他应用程序吗?
很多 ;-)。
来自 LOCALEDEF 和 GENCAT 的编译形式通常在 LIBC 之间更改,并且使用一个 LIBC 的头文件编译的程序可能无法读取由另一个库创建的区域设置数据。
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。