本地设置支持在今天是非常重要的因素,它体现了各个操作系统。人们曾经对能用电脑写字就感到高兴的时代已经一去不复返了,用户现在要求支持他们的本地设置。在 GNU 系统中,这种支持直接在 C 语言的标准库 -- GNU libc 中实现。这种支持的设计考虑了对任何国家和任何语言的设置的所有要求。
不同的国家和文化有不同的沟通规则。这些规则可能范围很小,例如日期和时间的格式,也可能非常复杂,例如他们说的语言。
软件国际化意味着对其进行编程,使其能够与用户的本地设置一起工作。在 ISO C 中,国际化以 locales 的形式工作。每个 locale(本地设置)都指定一组规则,每个用途一个规则。用户通过指定 locale(使用系统变量)来选择一组规则。
所有程序都继承其环境中的 locale 设置。在程序编写得可以接受 locale 设置的前提下,它们可以遵循用户偏好的规则。
本节介绍影响本地设置的各个变量,GNU libc 库的函数也受这些变量的控制。
环境变量的设置是通过 shell 命令完成的
bash$ export LC_PREMENNA=sk tcsh$ setenv LC_PREMENNA sk |
LC_PREMENNA是以下之一
LC_COLLATE--- 字符串排序。通过设置此变量,可以强制应用程序,例如 sort,ls 和其他应用程序,在比较字符串时考虑字母表中各个字母的本地布局。例如,斯洛伐克语有几个字符,如果按照字符的数值排序,会引起问题。斯洛伐克语排序设置告诉函数strcoll和strxfrm,例如ch是一个字母,紧随其后h而不是在c,宽的�紧随其后的是长的�然后又是普通的和。在 sort 命令中尝试一下。输入字母cc ch hh,然后更改LC_COLLATE命令
bash$ export LC_COLLATE=sk tcsh$ setenv LC_COLLATE sk |
再次使用 sort 尝试,并比较结果...
LC_CTYPE--- 字符分类和转换,多字节。正确设置此变量对于正确区分各个语言的字母字符、确定数字、所谓的空白字符、将小写字母转换为大写字母等至关重要。最合适的做法是不设置此变量,从而使其值从变量LC_ALL或LANG(见下文)。但是,如果您不想使用斯洛伐克语设置,只想在控制台和 iX 环境下正确显示斯洛伐克语字体和功能正常的斯洛伐克语键盘,则只需设置此变量。
![]() | 始终要百分百确定您已设置此变量(无论是通过LC_ALL, LANG还是直接设置),否则继续阅读就毫无意义了! “字符分类和转换” 听起来可能不太吸引人,但要知道,这对于斯洛伐克语字母在您的 Linux 系统中生存至关重要! |
LC_MONETARY, LC_NUMERIC--- 货币和数值格式。允许更改用于格式化货币值或所有其他数值的设置组。这些设置包括小数点、千位分隔符、数字分组、正负号等。
LC_TIME--- 日期和时间格式。小时、分钟和秒之间的分隔符设置、星期几的名称、日期中年、月、日的顺序,...
LC_MESSAGES--- 选择用户界面用于翻译程序消息的语言。这正是迫使应用程序说斯洛伐克语的变量。见后续章节。
与程序消息的翻译,特别是翻译后的字符串文件的位置相关的变量是NLSPATH。它应该包含一个以冒号分隔的目录列表,将在其中搜索.mo用于给定变量的本地设置文件。LC_MESSAGES。变量NLSPATH然而,只需要在特殊情况下设置,因为应用程序会在这些文件的标准目录中查找其消息的翻译。
除了这些变量之外,还实现了一些其他变量,这些变量尚未记录在案(The GNU C Library Reference Manual)。它们的含义从名称中显而易见,因此我也将介绍我的推论。
LC_PAPER--- 纸张格式。例如,在我们的纬度,使用 A4 格式,在美国是 Letter 格式等等。注意,此变量不直接包含格式名称,而是(与所有LC_变量一样),本地设置的缩写,所以在我们这里将是sk。如果我们想使用 Letter 格式,我们将不得不将此变量设置为使用这种格式的某个国家的本地设置代码,例如us。在这种情况下,必须安装包含此国家/地区的本地设置的软件包 (locales-us)。
LC_NAME--- 姓名和姓氏的格式。在我们这里,每个人都有两个名字,按名字、姓氏的顺序书写。在俄罗斯,他们有三个名字,按名字、父名、姓氏的顺序排列。在匈牙利,他们有两个名字,和我们一样,但顺序相反。这个变量就是关于这个的。大概...
LC_ADDRESS--- 地址的写入方式。街道和门牌号的顺序、邮政编码、邮政编码等。
LC_TELEPHONE--- 电话和传真号码的格式。确定数字的分组、分隔、区号的位数,...
LC_MEASUREMENT--- 度量单位。该国家/地区使用的重量、体积、温度和长度单位。在美国编写的程序可能会以加仑水计算,但如果编写正确,则变量LC_MEASUREMENT设置为 “sk” 将以正确的比例显示升。例如,将华氏温度转换为摄氏温度也是如此。
LC_IDENTIFICATION--- 天啊,这个我不知道。出生证明号?社会保障号?鞋码?
LC_ALL--- 如果设置了此变量,则其值将用于所有上述 locale 组,而与相应变量的值无关。
LANG--- 此变量的值将用于那些没有设置相应变量的 locale 组。
LANGUAGE--- 备用本地设置。此变量可以包含以冒号分隔的本地设置代码的有序列表。程序消息的翻译文件将按照此列表中指定的顺序进行搜索。如果在一个语言中找不到程序消息的翻译文件,则将使用列表中下一个语言的文件LANGUAGE。此外,即使找到了第一种语言的文件,但其中某些字符串未翻译,也不会使用原始语言(英语),而是首先尝试在列表中下一种语言的文件中找到该字符串的翻译LANGUAGE。这对于除了自己的语言外,还掌握一些比英语更好的其他语言的人来说很有用,程序通常最初是用英语编写的。例如,斯洛伐克人可以设置LANGUAGE="sk:cz"而来自科马尔诺的匈牙利族可以设置LANGUAGE="hu:sk".
![]() | 变量LANGUAGE仅影响变量LC_MESSAGES!为了正常运行,还需要设置其他变量(至少LC_CTYPE). |
LINGUAS--- 此变量从 GNU libc 的角度来看没有特殊意义,但通常在安装程序(从源代码)时使用。以空格分隔的本地设置代码列表指定用户希望安装应用程序字符串翻译的语言。例子
bash$ export LINGUAS="sk cz" bash$ ./configure bash$ make install |
这些命令编译并安装支持斯洛伐克语和捷克语的应用程序。安装脚本通常还会检查变量的内容LANG和LC_ALL,但这些变量可能只包含一个本地设置代码。
RPM_INSTALL_LANG--- 应用程序通常从各种软件包(rpm、deb 等)安装,而不是从源代码安装。为了节省磁盘空间(并且符合逻辑 -- 很少有人掌握三十种语言),在 RPM4 中可以指定要安装其翻译消息的语言。因此,我建议将以下行添加到.bash_profile (.login) 安装软件包的用户(root)的配置文件中。
bash$ export RPM_INSTALL_LANG=sk tcsh$ setenv RPM_INSTALL_LANG "sk" |
如果您不幸遇到安装了整个操作系统后才了解此变量的情况(就像我一样),请尝试 RPM4 部分中提到的脚本。
本地设置由上述变量确定,这些变量按以下顺序评估
LANGUAGE--- 仅影响LC_MESSAGES |
LC_ALL |
LC_* |
LANG |
这意味着,一旦设置了LC_ALL,各个变量LC_*将不再考虑。另一方面,例如,如果您只设置了其中一些LC_*,其余的将设置为变量的值LANG.
影响本地设置的变量用本地设置代码填充。本地设置代码是字符串,其格式遵循几个规则。通用形式是
jazyk[_�zemie[.k�dovanie]][@modifik�tor] |
语言例如是sk斯洛伐克语,cs捷克语,hu匈牙利语,地区是SK斯洛伐克,CZ捷克共和国,HU匈牙利,编码是ISO-8859-2适用于所有中欧语言(可以使用多种格式来指定编码),修饰符用于启用或禁用某些功能。这些在本地设置的定义中给出。例如,对于英国,修饰符是字符串euro并且在使用它时,欧元将用作货币,而不是英镑。这意味着必须使用编码iso-8859-15,它定义了欧元和美分符号。
本地设置代码示例(这些字符串中的每一个都可以分配给本地设置变量,但最常用的是最后一列中的双字母缩写)
表 1. 本地设置代码示例
sk_SK.ISO-8859-2 | sk_SK | sk | |
cs_CZ.ISO-8859-2 | cs_CZ@-ch | cs@-ch | cs |
en_GB.iso8859 | en_GB | en@euro | en |
ja_JP.ujis | ja_JP.EUC | ja_JP | ja |
我们不应该忘记两个标准 locale,如果系统变量未设置并且程序使用它们直到本地化初始化,则将使用这两个标准 locale。我说将使用这两个标准 locale,因为它们目前是相同的,但未来 ISO C 和 POSIX 标准可能在此领域有所不同,那时这将取决于系统配置。
C--- 根据 ISO C 标准设置。 |
POSIX--- 根据 POSIX 标准设置。目前,它是设置的别名C. |
首先,需要安装支持本地设置的软件包,其名称为 locales,以及直接支持斯洛伐克的软件包 --- locales-sk。如果您也有兴趣使用对其他语言的支持(在我们的地区,捷克语和匈牙利语是最相关的),您还必须安装这些语言的软件包。
其次,您必须安装支持本地设置和直接支持斯洛伐克语的软件包(即 locales 和 locales-sk)。
在下一步中,不要忘记安装 locales 和 locales-sk 软件包。同样,对于您计划使用的每种语言,请安装支持本地设置的软件包。
如果在本地设置方面遇到问题,请遵循前三个步骤。
现在让我们稍微浏览一下我们的目录。首先我们访问/usr/share/locale/sk。乍一看,很明显,此目录中的目录和文件名称与用于设置各个本地设置类别的变量相同。这是因为正是从这些文件中读取设置的,当给定变量设置为值时sk。除了它们之外,这里可能还有一个文件charset,它只包含一行字符串iso-8859-2。它说明了应该为给定的本地设置使用哪种字符编码。
此目录中的所有文件都是二进制数据和目录LC_MESSAGES包含的文件名称与系统上安装的某些软件包的名称相同,后缀为 mo。这些是来自各个应用程序的字符串翻译。我们稍后会讨论它们。现在我们可能会找出文件实际包含什么LC_*.
让我们移动到目录/usr/share/i18n/。在这里,在文本文件中sk_SK在子目录locales/终于找到了可读(和可编辑)形式的斯洛伐克语本地设置。此目录中的文件具有精确给定的结构,该结构在 locale(5) 手册页中描述。对于普通用户来说,更改此文件中的设置没有意义,因为这些是斯洛伐克全国使用的标准设置。但是,众口难调!因此,如果您决定更改此文件中的某些内容,则必须更新第一个提到的目录中的文件/usr/share/locales/sk/使用命令,该命令将文件中的数据sk_SK编译并保存到文件中LC_COLLATE, LC_CTYPE, ...
sh$ localedef -i sk_SK -f ISO-8859-2 sk_SK |
在子目录/usr/share/i18n/charmaps/包含描述各个字符编码的文件。对于斯洛伐克,当前的是ISO-8859-2(这也是提到文件的内容charset).
在目录/usr/share/locale/包含文件locale.alias,它定义了本地设置代码的所谓 别名。为了使斯洛伐克语本地设置正常工作,它应该包含以下两行
sk sk_SK.ISO-8859-2 slovak sk_SK.ISO-8859-2 |
这确保了即使您没有指定字符编码,也将使用 iso-8859-2。第二行负责可以用 slovak 代替 sk。
![]() | 但是对于类型的别名slovak要小心!一些与本地设置相关的应用程序不使用 libc 服务,它们会忽略别名,只对设置变量的前两个字符感兴趣。因此,从slovak变成sl,这是斯洛文尼亚。积极的是,对于斯洛伐克语,您可以将变量设置为例如值skaderukaskadenoha. |
国际化设置(在 RedHat 和 Mandrake 中)位于文件中/etc/sysconfig/i18n。这是一个非常有用的文件,您会很快喜欢上它。您可以在其中设置所有与国际化、国家字体和键盘布局相关的内容。但是,此文件仅定义系统变量,并且通常包含在 (source /etc/sysconfig/i18n) 初始化脚本中。变量的导出(传递给其他应用程序)由脚本负责/etc/profile.d/lang.sh(bash) 或/etc/profile.d/lang.csh(tcsh)。这会在每次 shell 启动时执行,通常从/etc/profile(bash) 或/etc/csh.cshrc(tcsh) 调用。
文件/etc/sysconfig/i18n定义了整个系统的设置。如果找不到包含用户设置的文件,则将使用这些设置。每个用户都可以在文件中指定自己的设置.i18n在其主目录中。设置始终仅从这些文件之一读取,因此如果用户有自己的文件˜/.i18n,则来自文件的设置/etc/sysconfig/i18n将被忽略。
用户也可以随时通过手动设置环境变量来更改设置LC_MESSAGES, LANG,等等。
可以使用命令关闭某些设置
sh$ unset LC_MESSAGES LANG |
这将取消给定变量的设置(并将使用标准 localeC或POSIX).
例如,如果您已设置变量LC_ALL=sk和LC_MESSAGES=cz,那么在命令之后unset LC_ALL您将不会收到英语的程序消息,而是捷克语的消息。因此,如果您想关闭某些设置,则始终必须使用 unset 命令取消可能影响给定本地设置的所有变量的设置。
![]() | export/setenv |
---|---|
我忍不住要对 export 命令做一个小注释。它是与经典 sh(也包括 bash)兼容的所有 shell 的内置函数。对于 tcsh 类型的 shell,等效的命令是 setenv。 重要的是要理解此命令对变量的确切作用。bash 文档指出,export 标记变量,以便将其传递给环境 (environment) 中的子 (child) 进程。这意味着,例如,当您从父进程 bash 启动 iX 环境时,该父进程在启动时导出了变量LANG=sk,X Window System 环境中的所有应用程序都将继承此设置,因此(如果它们本身支持)它们将以斯洛伐克语运行。如果您想在没有斯洛伐克语设置的情况下运行应用程序,则必须在 xterm 中输入命令unset LANG (unsetenv LANG对于 tcsh),从而为 xterm 的所有子进程(更准确地说,是其中运行的 shell)取消变量的设置LANG。然后,直接从此 xterm 启动的应用程序将在没有斯洛伐克语支持的情况下运行。稍微玩一下。 |
时区设置也与本地设置密切相关。我可以谈论它几个小时,但这应该比只设置一个变量更复杂... 就像这样
bash$ export TZ="Europe/Bratislava" tcsh$ setenv TZ "Europe/Bratislava" |
此设置仅影响硬件时钟的时差。(顺便说一句,我建议将硬件时钟设置为格林威治标准时间,这样也消除了夏令时和冬令时之间切换的问题等等,但其他文件对此进行了描述。)这整个事情都很好,特别是如果您可以访问其他时区的计算机,但想在中欧时区工作。在你的文件中.bash_profile (.login对于 tcsh) 插入上面提到的行。
用户虽然来自斯洛伐克中部,但早在他妈妈怀他的时候,就给他肚子里播放英语课程。因此,使用斯洛伐克语设置没有意义,除非在极端情况下,例如 Gimp 中的斯洛伐克语字体。给他一个文件.i18n包含以下内容(即使对于这样的小事,他也需要 locales-sk)
LC_CTYPE=sk |
用户是正常的,他喜欢他的母语,但当他一半的应用程序是斯洛伐克语,一半是英语时,他并不感到困扰。他懂捷克语。这会让他高兴(不要忘记偷偷给他安装 locales-cs)
LANGUAGE=sk:cs LANG=sk |
用户来自附近南部,他最喜欢的湖泊是巴拉顿湖,他想要所有匈牙利语的消息,如果不可能,他也能理解斯洛伐克语。我们不能忘记他的轻微精神分裂症,其中一个自我需要斯洛伐克语字符串排序,而另一个自我离不开捷克语的日期和时间格式。永远不要忘记从支持 LINGUAS 变量的软件包中安装匈牙利语、捷克语和斯洛伐克语的消息翻译。还需要说服他,安装 locales-{sk,hu,cs} 不会构成安全风险
LANGUAGE=hu:sk:cs LC_COLLATE=sk LC_TIME=cs LANG=hu LINGUAS="hu cs sk" |