Debian配置语言环境的方法

2024-11-09 4

在Debian系统中,配置语言环境是实现程序国际化行为的关键步骤,主要通过设置环境变量 “$LANG” 来实现。现代的GNOME和KDE等软件都是多语言的,它们通过处理UTF-8数据来实现国际化,并通过gettext(1)架构提供翻译信息来本地化。

8864678a189e7428b0a4543340c3f3bb_u=3362557848,2453851835&fm=253&fmt=auto&app=138&f=JPEG_w=683&h=273.webp

程序支持国际化的行为,通过配置环境变量 $LANG 来支持本地化,同时依赖 libc 库提供的特性,并要求安装 locales 或 locales-all 软件包。这些软件包提供了本地化所需的语言环境、字符编码等方面的支持。

对于现代软件如 GNOME 和 KDE,它们通常处理 UTF-8 编码的数据以支持国际化,并通过 gettext(1) 架构提供翻译信息以进行本地化。翻译信息可以由独立的本地化软件包来提供。

在 Debian 桌面 GUI 系统中,可以通过 GUI 对话框设置语言环境为 “LANG=xx_YY.UTF-8″,其中 xx 是 ISO 639 语言代码,YY 是 ISO 3166 国家地区代码。这些值会影响程序的行为,从而实现本地化支持。

一、语言环境的基本原理

最简单的文本数据表达是 ASCII,它对英语是足够的,少于 127 个字符(使用 7 位描述)。

即使纯英文文本也可能包含非 ASCII 字符,例如微微卷曲的左右引号在 ASCII 中是不可用的。

“double quoted text” is not "double quoted ASCII"‘single quoted text’ is not 'single quoted ASCII'

为了支持更多字符,许多字符集和编码系统被用来支持多语言。Unicode 字符集可以用 21 位码点范围来显示几乎所有人类已知的字符(例如,十六进制的 0 到 10FFFF)。

文本编码系统 UTF-8 将 Unicode 码点适配到一个合理的 8 位数据流,并大部分兼容 ASCII 数据处理系统。这个使 UTF-8 作为现代推荐的选择。UTF 表示 Unicode 转换格式(Unicode Transformation Format)。当 ASCII 纯文本数据转换为 UTF-8 数据,它有和原始 ASCII 完全一样的内容和大小。所以配置 UTF-8 语言环境不会有任何丢失。

在 UTF-8 语言环境下兼容的应用程序,可以显示和编辑外语文本数据,在所要求的字体和输入法安装和启用后。例如在”LANG=fr_FR.UTF-8″语言环境下,gedit(1) (GNOME 桌面的文本编辑器) 能够显示和编辑中文字符文本数据,而显示的菜单是法语。

新标准的 “en_US.UTF-8″和老标准的”C”/”POSIX”语言环境都使用标准的 US 英文消息,它们在排序等方面有细微的不同。在维护老的”C”本地行为时,如果不仅想处理 ASCII 字符,同时还想优雅的处理 UTF-8 编码的字符,在 Debian 上使用非标准的 “C.UTF-8″语言环境。

一些程序在支持 I8N 后会消耗更多的内存。这是因为它们为了速度优化,而在内部使用 UTF-32(UCS4) 来支持 Unicode,并且每个独立于语言环境所选的 ASCII 字符数据都会消耗 4 个字节。再一次地,使用 UTF-8 语言环境并不会使损失什么。

二、语言环境的重新配置

为了让系统访问某一语言环境,语言环境数据必须从语言环境数据库中编译。locales 软件包 没有 包含预先编译的语言环境数据。需要按下面的方法配置:

# dpkg-reconfigure locales

该过程包含 2 个步骤。

1、选择所有需要的语言环境数据编译为二进制形式。(请确认至少包含一个 UTF-8 语言环境 )

2、通过创建 “/etc/default/locale” 来设置系统默认的语言环境值给 PAM 使用。

设置在 “/etc/default/locale” 里的系统范围的默认语言环境,可以被 GUI(图形用户界面)应用程序的 GUI 配置覆盖。

注意:所使用的确切传统编码系统可以通过 “/usr/share/i18n/SUPPORTED” 来确认。因此, “LANG=en_US” 是 “LANG=en_US.ISO-8859-1″。

locales-all 软件包有所有预编译的语言环境数据,但是不创建”/etc/default/locale”,可能还需要安装 locales 软件包。

一些 Debian 系发行版的 locales 软件包,包含有所有语言环境的预先编译好的语言环境数据。为了模拟这样的系统环境,需要同时在 Debian 安装 locales 和 locales-all 软件包。

三、文件名编码

对于跨平台的数据交换,需要使用特殊的编码挂载文件系统.举个例子,不使用选项时,mount(8) 假设 vfat 文件系统 使用 CP437. 需要给文件名提供明确的挂载选项来使用UTF-8 或 CP932.

在 GNOME 这类的现代桌面环境下,当自动挂载一个热拔插 U 盘时,可以提供这样的挂载选项。右击桌面上的图标,点击 “Drive” , “Setting”, 输入 “utf8” 到 “Mount options:”. 当这个 U 盘下次挂载时,UTF-8 就可以了。

如果在升级一个系统,或者从老的非 UTF-8 系统迁移磁盘,非 ASCII 字符的文件名也许是使用老旧的 ISO-8859-1 或 eucJP 来编码. 请寻求文本转换工具把他们转换到 UTF-8.

在默认情况下,Samba 对新的客户端(Windows NT, 200x, XP)使用 Unicode,但对老的客户端(DOS 和 Windows 9x/Me)使用 CP850.可以在 “/etc/samba/smb.conf” 文件里面,使用”dos charset” 来改变老客户端的这个默认编码。比如说,CP932 表示为日语。

四、本地化信息和翻译文档

在 Debian 系统中显示的许多文档和文本信息有翻译存在,比如错误信息、标准程序输出、菜单和手册页。GNU gettext(1) 命令工具链是大部分翻译活动的后端工具。

举个例子,可以安装 manpages-LANG 包来获得本地化 man 手册页信息。从 “/usr/share/man/it/” 来读取 programname 意大利语的 man 手册页 ,执行下面的操作。

LANG=it_IT.UTF-8 man programname

通过 $LANGUAGE 环境变量,GNU gettext 能够适应翻译语言的优先级列表。例如:

$ export LANGUAGE="pt:pt_BR:es:it:fr"

五、语言环境的影响

使用 sort(1) 和 ls(1) 时,字符的排序顺序受本地语言的影响。导出.UTF-8 会按字典 A->a->B->b…->Z->z 的顺序排序,而导出.UTF-8 会按 ASCII 二进制 A->B->…->Z->a->b…的顺序排序。

ls(1) 的日期格式受 locale 影响 ;

date(1) 的日期格式受本地语言影响。例如

$ unset LC_ALL$.UTF-8 dateThu Dec 24 08:30:00 PM JST 2023$.UTF-8 dateThu 24 Dec 20:30:10 JST 2023$.UTF-8 datejue 24 dic 2023 20:30:20 JST$ LC_TIME=en_DK.UTF-8 date2023-12-24T20:30:30 JST

不同语言环境下数字标点的显示方式是不同的。在英语语言环境中,一千点一会显示为 “1,000.1”,而在德语语言环境中,它会显示为 “1.000,1”。这种差异在电子表格等程序中尤其明显。

除了 “LANG” 环境变量,还可以通过设置 “LANG”环境变量,还可以通过设置”LC_*” 变量来覆盖每个细节特征。而 “LC_ALL” 变量则可以进一步覆盖所有其他相关变量。然而,除非有强烈的理由需要创建复杂的配置,否则建议避免使用这些变量,并只使用 “LC
A

LL”变量则可以进一步覆盖所有其他相关变量。然而,除非有强烈的理由需要创建复杂的配置,否则建议避免使用这些变量,并只使用”LANG” 变量来设置一个统一的 UTF-8 语言环境。

这样做的好处是简化配置并确保整个系统都采用一致的语言环境,避免不必要的复杂性和混乱。同时,保持统一的 UTF-8 语言环境也有助于确保文字、字符编码和本地化的正确处理。