企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 第 20 章 国际化 **目录** [](ch20.html#id3091130) [I18N 简介](ch20s02.html) [locale 变量](ch20s02.html#id3090533) [locale 值](ch20s02.html#id3091286) [字符集](ch20s02.html#id3091389) [其它](ch20s02.html#id3091435) [设置 locale](ch20s03.html) [生成 locale](ch20s03.html#id3091569) [locale 策略](ch20s04.html) [中文图形界面](ch20s04.html#id3091648) [英文界面+中文输入](ch20s04.html#id3091700) [关于输入法的设置](ch20s04.html#id3091717) ## I18N 简介 习惯上,`internationalization`(国际化)简写为`I18N`,中间的数字为省略的字母个数。 在 Linux 系统中,通过定义一组环境变量来设置程序的语言环境,以实现对`I18N`的支持,这种机制称为:`locale`(本地化) ### locale 变量 | | | | --- | --- | | LANG | 低优先级全局 locale 变量 | 如果下面的变量未赋值,默认使用此变量的值 | | LC_COLLATE | 比较和排序习惯 | 会影响目录列表的分类显示等 | | LC_CTYPE | 定义系统的字符处理特性 | 哪些字符能被视为字母、数字,等等;与中文输入关系密切 | | LC_MESSAGES | 提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等 | | LC_MONETARY | 定义货币单位和货币型数值的格式 | | LC_NUMERIC | 定义非货币型数值的格式 | 影响到千位分隔符和小数分隔符等 | | LC_TIME | 定义日期和时间的格式 | | LC_NAME | 姓名书写方式 | | LC_ADDRESS | 地址书写方式 | | LC_TELEPHONE | 电话号码书写方式 | | LC_MEASUREMENT | 度量衡表达方式 | | LC_PAPER | 定义默认的纸张尺寸 | | LC_IDENTIFICATION | 对 locale 自身包含信息的概述 | | LC_ALL | 高优先级全局 locale 变量 | 为此变量赋值会强行覆盖上面变量的值,不推荐 | * 假如未设置以上变量,系统将采用 POSIX 作为 lcoale,也就是 C locale ### locale 值 `locale` 变量的值有三个要素:语言代码 (Language Code)、 地域代码 (Country Code) 和字符集(Encoding)[[35](ch20s02.html#ftn.id3091303)]: ``` 语言代码[_地域代码[.字符集]] ``` 例如: | 语言/国家代码 | 描述 | | --- | --- | | en_US.ISO-8859-1 | 美国英语 | | en_US.UTF-8 | | zh_CN.UTF-8 | 简体中文 | | zh_TW.UTF-8 | 繁体中文 | ### 字符集 众所周知,计算机中的信息,是以数字形式表示的,字符也不例外。字符以数字编号的形式存储,使用时,根据这个编号,在字符集中找到相应的字符 字符集是字符在系统内的编码方式,也就是通常所说的内码[[36](ch20s02.html#ftn.id3091405)]。不同的字符集有不同的编码方式, 例如“码”字,它的 GB2312编码 为 426B;UTF-8编码 为 E7A081 。如果错误的以 GB2312编码 来检索 E7A081,将会产生类似 “锘跨爜” 的乱码 只要系统中安装了中文字体,通过字符集的支持,便可以正常显示中文,而无需设置 locale;locale 可以使操作界面显示中文,并可以使用中文输入等 ### 其它 另外还有一个本地化变量叫做 LINGUAS。它会影响到基于 gettext 的程序[[37](ch20s02.html#ftn.id3091444)];它还能决定某些特殊软件包的本地化,比如kde-i18n和openoffice。这个变量的值为一组以空格分隔的语言代码: ``` LINGUAS="zh en" ``` * * * > [[35](ch20s02.html#id3091303)] 中文 Windows 系统中使用的字符集为 `GB2132`,而 `UTF-8` 是大势所趋,它能够显示比 GB2312 更多的字符 > [[36](ch20s02.html#id3091405)] 参见`/usr/share/i18n/charmaps`文件 > [[37](ch20s02.html#id3091444)] 通过编译时安装本地化文件的方式实现`I18N`,编译时需要Native Language Support(NLS)支持 ## 设置 locale 设置 `locale` 其实就是设置环境变量。在 `/etc/environment`[[38](ch20s03.html#ftn.id3091511)]文件中设置全局环境变量: ``` LANG="zh_CN.UTF-8" ``` 在`~/.profile`或`~/.bashrc`中设置用户环境变量: ``` export LANG="zh_CN.UTF-8" ``` 完成后可以使用**locale**命令检验 ### 生成 locale 如果你设置了一个不可用的 locale,请使用 localedef 生成该 locale ``` localedef -c -i en_US -f ISO-8859-15 en_US.ISO-8859-15 ``` 可能你在系统中只要用到一个或者两个 locale。你可以在 `/etc/locale.gen` 中指定所需的的 locale。添加 locale 到 `/etc/locale.gen`: ``` en_GB ISO-8859-1 en_GB.UTF-8 UTF-8 de_DE ISO-8859-1 de_DE@euro ISO-8859-15 ``` 下一步是执行locale-gen。它会生成`/etc/locale.gen`文件中指定的所有 locale。 * * * > [[38](ch20s03.html#id3091511)] 在 gentoo 中使用专门的文件 `/etc/env.d/02locale` 设置 locale ## locale 策略 ### 中文图形界面 由于 Linux 的控制台不能方便的显示中文,所以最实用的方案是“英文控制台+中文图形界面” 为了能够正常处理中文,需要使用locale-gen生成中文 locale,在`/etc/locale.gen`文件中添加如下内容: ``` zh_CN.UTF-8 UTF-8 zh_CN.GB18030 GB18030 zh_CN.GBK GBK zh_CN GB2312 ``` 然后在 gdm 启动菜单中选择中文,或者写入配置文件`~/.dmrc` ``` [Desktop] Session=openbox Language=zh_CN.UTF-8 ``` ### 英文界面+中文输入 使用如下设定: ``` LANG="en_US.UTF-8" LC_CTYPE="zh_CN.UTF-8" ``` ### 关于输入法的设置 在`~/.profile`或`~/.bashrc`中设置用户环境变量: **例 20.1. 输入法配置 `.profile`** ``` export XMODIFIERS="@im=fcitx" export GTK_IM_MODULE=xim export QT_IM_MODULE=xim fcitx& ``` > [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch20s04.html#i18n-im1) 使用fcitx输入法 > [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch20s04.html#i18n-im2) GTK2 程序输入法引擎。fcitx 使用xim引擎 > [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch20s04.html#i18n-im3) QT 输入法引擎。