linux i18n修改,中文版英文版体现

对于国内的Linux用户,常常烦恼的一个问题是:系统经常在须要显示中文的时候却显示成了乱码,而因为某些缘由,须要英文界面的系统的时候,却苦于系统 不能正常输入和显示中文.另外,因为大部分主要Linux发行版都是以英语为主体的,英文界面的系统和应用程序无论在界面的美观程度和稳定程度上都比中文 的略好一些,各类奇怪的BUG也要少一些。所以,不少稍微有英语基础的Linux用户都宁愿使用英文界面的系统。可是,矛盾又突现出来:在英文系统下,如 何才能正常显示和输入中文呢?有没有一箭双鵰的方案呢?所以,笔者开始探索如何解决这个问题。个人完美状态是:系统和应用程序所有为英文(系统菜单、应用 程序工具栏、默认输入法等),而我须要阅读和撰写中文文档的时候,能正确的显示中文并调出中文输入法。通过尝试,设置成功,如今以FC4 Linux为 例,讲解一些相关知识和设置过程。 linux


本文主要经过修改系统配置的过程来展示修改linux系统配置的通常思路和过程,若是你不太有耐心看完,请跳过文章的1—4节,直接看第五节快速设置部分。 

一,相关变量介绍 

咱们知道大部分Linux系统是无所谓中文版和英文版的,以FC4 Linux为例,系统发行的时候全世界都同样,系统是中文的仍是英文的彻底取决于你选 择的语言包。不一样国家的人在安装使用的时候选择属于本身国家的语言包,应用程序中的语言也不是写死的,它根据系统的设置来调用相关的语言,因此,一个应用 程序写出来不通过修改,全世界不一样国家的用户均可以以母语界面使用它,这就事所谓的internationalization(国际化),简称 i18n。这也是将来软件的发展趋势。 

那么,若是我在系统中安装了不一样的语言包和不一样的字体,系统是如何判断我所要的语言界面并调用相关的字体的呢?系统中那些文件和变量在控制这些呢? 

在redHat和FC系列Linux系统下,记录系统默认使用语言的文件是/etc/sysconfig/i18n,若是默认安装的是中文的系统,i18n的内容以下: 
代码: 

LANG="zh_CN.UTF-8" SYSFONT="latarcyrheb-sun16" SUPPORTED="zh_CN.UTF-8:zh_CN:zh" 


其中LANG变量是language的简称,稍微有英语基础的用户一看就看出来这个变量是决定系统的默认语言的,即系统的菜单、程序的工具栏语言、输入法默认语言等。SYSFONT是system font的简称,决定系统默认用哪种字体。SUPPORTED变量决定系统支持的语言,即系统可以显示的语言。须要说明的是,因为计算机起源于英语国家,所以,无论你把这些变量设置成什么,英语老是默认支持的,并且无论用什么字体,英文字体总包含在其中。 

这些变量中LANG变量是在字符模式和图形界面下都用到的,在你登陆系统后就被读取并生效,相信不少人在字符界面下输入Linux命令的时候常常会遇到显 示出来的出错信息是乱码的状况,必需安装zhcon或者cce等字符模式下的中文软件才能正常显示中文的出错信息。若是我不要他显示中文乱码,我也不要为 了看个很简单的出错信息而特地起用zhcon那我该怎么办呢?一个简单的零时解决的办法就是设置一下LANG变量: 
代码: 

[root@gucuiwen ~]# LANG="en_US.UTF-8" 


即把系统的语言临时设置成英文,或者更简单一点,能够直接这样: 
代码: 

[root@gucuiwen ~]# LANG="" 


即把LANG变量清空,因为英语是不管什么状况都支持的,LANG变量被清空后,系统就默认用英语。这样设置后,在字符模式下输出的出错信息等就是全英文 的了。但这种设置是临时的,只是临时改变了LANG这个bash变量而已。当退出从新登陆或者切换到其余字符终端后就无效了。
web

到如今,读者应该想到了,只要把i18n文件中的LANG变量设置成英文的”en_US.UTF-8”,就能够永久解决这个问题了。修改后的文件以下: 
代码: 

#LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16" SUPPORTED="zh_CN.UTF-8:zh_CN:zh" 


请不要把LANG变量简单的清空,由于这个变量不只在字符模式下用到,在图形界面下也用到,简单清空在字符模式下确实不会有问题,但在图形界面下,却会形成中文没法正常显示的状况,在过去Re d ha t 系列的版本中i18n文件中还有一个叫LANGUAGE的变量,专门控制图形界面下的语言设置,如今的FC系列中已经把这两个变量整合成一个变量了。 

通过修改这个变量,从新起动图形界面后,就能够看到界面一经彻底是英文的了。可是按ctrl+空格却不能调出中文输入法,输入法菜单中也不能添加中文输入 法。咱们只简单的修改了LANG变量改变了系统语言设置,固然这一步也能够用图形界面下的工具修改,而不用亲自修改配置文件。 

二,关于运行等级 

这个问题彷佛和这篇文章的的主题无关,可是介于如今愈来愈多的linux新手遇到linux图形界面的问题,并且在中文输入法设置过程当中也牵涉到这些问题,所以想顺便提一下。 

如今的linux安装完成后,默认就运行在第5个系统运行级别。在SYSTEM V 风格的UNIX系统中,系统被分为不一样的运行级别,这和BSD分支的UNIX有所不一样,经常使用的为0~6七个级别: 

0 关机 
1 单用户 
2 不带网络的多用户 
3 带网络的多用户 
4 保留,用户能够自给定义 
5 图形界面的多用户 
6 重起系统 

因为如今的Linux系统安装完后就运行在第5个级别,即系统启动后直接进入图形界面,而不用在字符模式下登陆后用startx或者xinit 来起动图形界面。这样看起来很方便。可是有什么坏处呢? 一旦你改变了某些设置,显示出问题的时候,系统不断在图形和字符间派徊,新手又不知道如何应对, 十分麻烦,并且对于学习研究Linux的人来讲,这样不利于了解和学习Linux底层的一些东西。很早就用Linux的老用户都知道,过去的Linux如 redhat6.0,都是默认运行接别为3,即便后来的RedHat9.0也能够在安装时候选默认字符登陆仍是图形登陆。但如今的FC系列和其余大多数版 本都无论三七二十一直接帮用户选择了直接图形界面登陆。虽然对于大多数菜鸟来讲,Linux确实愈来愈简单了,可是不少乐趣,那些新手也体验不到了。 

也许你不相信,直接图形登陆到系统确实会有不少问题,所以,做为一个有6年Linux使用经验的Linux和Solaris 系统管理员,我强烈建议在系统安装完成后把系统的默认运行等级设置在第3级,在字符终端登陆后,再手工输入startx 命令起动图形界面。能够用以下的方法修改: 
用文本编辑器修改 /etc/inittab文件,把 
代码: 

id:5:initdefault: 


这一行,修改为 
代码: 

id:3:initdefault: 


保存后就重起,系统就默认起动到字符界面。不一样运行级别之间的差异的在于系统默认起动的服务的不一样,如运行级别3默认不启动X图形界面服务,而运行级别5 却默认起动。本质上是没有区别的,更无所谓不一样级别间功能强弱的问题。用户彻底可自给定义不一样级别的默认服务。在任何运行级别,用户均可用init 命令来切换到其余运行级别。

三,调出中文输入法: 

我之因此要在上面费那么多笔墨来说系统运行级别,是由于对系统的认识是从底部向上开始的。 
先把默认运行级别修改为3级别,固然,若是你实在不想修改,就临时用init 3命令切换到第3级。 

这样你就能够用startx起动图形界面,而后用ctrl+alt+backspace退出图形界面。请注意我说的是“退出”图形界面,而不是按ctrl+alt+F2切到一个字符终端。 

好了,一切由startx开始。当你须要在Linux系统中设置某个东西,或者配置某个服务的时候,最关键的是要知道,这一切是怎么开始的。知其然必需知 其因此然。若是你有空把/etc/rc.d目录下的系统起动时运行的脚本通读一遍,就彻底知道了/etc下的各类配置文件是用来干什么的、如何修改、修改 后有什么效果等等。玩起系统来也能为所欲为想怎么改就怎么改。这就是我一直强调的,知其然必定要知其因此然。必定要深刻系统,读脚本,学会用命令和手工修 改系统配置文件。这样对系统才会有透彻的了解,成天用图形界面的工具是不能帮助你对系统有教为透彻深刻的了解的,不一样的linux系统提供的图形界面配置 程序会不一样,但命令和配置文件都是相同的,越是底层的东西越具备通用性。因此,应当先学会手动配置和修改系统配置文件,等熟悉了之后,再用图形界面的工具 修改,以便减小工做量。 

上面提了一下我解决问题的思路。我是顺着这个思路开始的: 

中文输入法是在图形界面下使用的,是图形界面下运行的一个程序。而图形界面中的一切,都是由startx程序开启运行的。这就是问题的根源。 

找出startx的位置: 
代码: 

[root@gucuiwen ~]# which startx /usr/X11R6/bin/startx 


看startx是一个脚本仍是二进制文件: 
代码: 

[root@gucuiwen ~]# file /usr/X11R6/bin/startx /usr/X11R6/bin/startx: Bourne shell script text executable 


发现startx是一个shell 脚本,因而我打开它分析并阅读,看看能不能找到一些关于输入法起动过程和相关变量的线索: 
代码: 

[root@gucuiwen ~]# vi /usr/X11R6/bin/startx 


我找到了该脚本在运行过程当中调用的其余脚本和配置文件的信息: 
代码: 

userclientrc=HOME/.xinitrcuserserverrc=HOME/.xserverrc sysclientrc=/etc/X11/xinit/xinitrc sysserverrc=/etc/X11/xinit/xserverrc 


而且知道,startx的目的是寻找系统中可用的桌面系统X服务器系统、以及用户自定义的参数,最终调用xinit来初始化X图形界面。我没有在 startx脚本中找到直接和起动输入法相关的代码,因而就能够确定,输入法相关的代码在startx调用的脚本中。因而我来到 
/etc/X11/xinit/ 目录下,阅读并分析该目录下的脚本,这些脚本有些是startx直接调用的,有些是被startx调用的脚本再调用的,存在着多级嵌套的关系,没有一点耐 心还真是搞不清楚。最终我在/etc/X11/xinit/xinitrc.d目录中的xinput.sh脚本中找到了和输入法相关的代码: 
代码: 

lang_region=(echotmplang | sed -e 's/"..*//') lang_region="zh_CN"  #这一行是修改后加上去的 for f in HOME/.xinput.d/{lang_region} " HOME/.xinput.d/default"/etc/X11/xinit/xinput.d/{lang_region} " /etc/X11/xinit/xinput.d/default ; do [ -r f ]
&& source
f && break done 


经过分析脚本,我知道,图形界面启动的时候脚本是根据LANG变量来决定是否启用输入法,以及启用哪一种语言的输入法等。问题在于:咱们尚未把LANG变 量改为英语以前,系统获得的LANG变量是中文的,所以,它知道须要在图形界面启动过程当中启用中文输入法,但把LANG变量改为英文后,系统根据LANG 变量知道系统是英文的,它便再也不启动中文输入法,也再也不设置和导出相关的变量,致使中文输入法不可用。所以,只要在这个脚本中,“骗”过系统,让输入法脚 本“觉得”系统是中文的,它不就运行中文输入法,并导出相关变量了吗? 因而,经过分析脚本,我在xinput.sh中的: 
代码: 
shell

lang_region=(echotmplang | sed -e 's/"..*//') 后面又添加了 lang_region="zh_CN" bash



直接把lang_region=(echotmplang | sed -e 's/"..*//') 修改为 lang_region="zh_CN" 也能够 
多添加一行是为了之后改过来方便,直接删除添加的一行就能够了。 

固然,把for循环中的/etc/X11/xinit/xinput.d/{lang_region}该成  

/etc/X11/xinit/xinput.d/zh _CN也能够。  
 
固然还有其余的改法,前提是你要懂得shell
脚本的语法,看得懂脚本的意思。这样修改后,即使系统是英文的,xinput.sh脚本也会去读取/etc/X11/xinit/xinput.d/zh
_CN 文件并导出其中的内容、设置好XMODIFERS等输入法变量,并运行iiimx输入法程序。  

 
那么为何不在图形界面启动后直接运行iiimx输入法程序呢?实验一下就知道,这根本不行。由于输入法程序是需要和被输入的应用程序配合运行的软件,在运行过程当中须要导出不少变量。直接运行iiimx只运行了主程序,而没相关变量,没办法和应用程序配合完成输入工做。  

 
完成修改工做后,保存脚本文件。输入startx命令启动图形界面,就能够用全英文的系统界面和中文输入法了。但须要注意的是:因为系统是全英文的,默认
输入法也是英文,经过GNOME或者KDE菜单起动的应用程序第一次输入中文的时候不能按ctrl+空格来切换到中文,须要用鼠标在任务栏上点击输入法图
标切换,第一次切换后之后就能够用ctrl+空格快捷键来切换中英文输入法了。  

 
四,一些后续问题  
 
某些软件,好比Open
Office,经过GNOME或者KDE菜单启动的话,即便切换到中文输入法也输不进中文,这是由于整个桌面系统的环境是英文的,软件“继承”了英文环境
的相关变量,这些软件就“认死理”,就是不让输入中文,这时候能够打开一个gnome终端,把LANG变量临时设置成zh_CN.UTF-8 :  

 
[root@gucuiwen ~]# LANG="zh_CN.UTF-8"  
 
而后在这个gnome终端中,用命令打开open office:  
 
[root@gucuiwen ~]# oowriter
&  
 
这样Open
Office就“继承”了gnome终端的LANG变量,起动后,工具栏和菜单等都是中文的,并且能输入中文。推而广之,任何软件均可以用这种方法,根据
须要,打开中文界面的软件和英文界面的软件。要以英文界面运行软件时,只要从GNOME或者KDE菜单打开,要用中文界面运行软件时,在终端中修该
LANG变量,从修改过LANG变量的终端中经过命令运行便可。固然,若是你还安装了其余语言的字体,你还能够以其余语言的界面来运行程序。如日语:  

 
[root@gucuiwen ~]# LANG="ja_JP.UTF-8"  
[root@gucuiwen ~]# gedit &  
 
我用上面的两条命令打开的gedit
编辑器就是全日语界面的,可是能输入中文和英文,并显示日文。从而达到,一个系统,多种语言和文字共存的目的。  

 
固然,前提是要安装了日语字体和日语locale,不然全部有文字的地方会所有显示成一连串问号。总之,要先懂得原理,以后想怎么玩就怎么玩,为所欲为,彻底不受限制,充分享受用Linux的乐趣。  

 
 
五, 快速设置步骤:  
 
1.修改/etc/sysconf/i18n文件,把  
LANG="zh_CN.UTF-8"  
修改为:  
LANG="en_US.UTF-8"  
 
2.修改/etc/X11/xinit/xinitrc.d/xinput.sh文件,把其中一行:  

 
lang_region=
(echo $tmplang | sed -e 's/"..*//') 

修改为: 

lang_region=”zh_CN” 服务器

相关文章
相关标签/搜索