ReactOS的中文本地化(转载)((雄)blog.csdn.net/mickey139)
reactos吧
全部回复
仅看楼主
level 6
fros 楼主
2009年04月07日 13点04分 1
level 6
fros 楼主
ReactOS 对多种语言支持
多语言支持对于windows来说其实就是National Language Support既(NLS)本地化语言支持。那么如何来支持呢?这里其实主要是想知道如何对中文的支持。不过中文是建立在这个之上的,因此干脆就了解一下NLS吧。
2009年04月07日 13点04分 2
level 6
fros 楼主
本地化语言到底需要解决那些问题
 
给用户提供一个符合本地区语言习惯和其他一些本地化的环境,用户可以在这个环境中,使用自己地区的键盘布局、输入、显示、编辑、打印不同种类的语言文字文档,对应的,系统管理员和用户可以设置环境中的区域、相应语种用的字体、以及本地数据格式比如日期、时间、货币单位等等。
2009年04月07日 13点04分 3
level 6
fros 楼主
转不过了。
百度说有广告和不适合的内容。
直接发原文地址吧。
http://blog.csdn.net/mickey139/archive/2008/03/12/2174907.aspx
2009年04月07日 13点04分 4
level 6
fros 楼主
NLS术语
Language group(语系集合)
英文版是基础
ReactOS英文版是作为其它语种的基础版本。这个理论是根据ReactOS中对多语种支持得出的,因为任何非英文版的ReactOS都必须保留一个英文版的ReactOS,也就是说,ReactOS英文版是所有语种实现本地化版本的基础。
其实这也是不可避免的,毕竟英语在世界上很流行。而且总是要有一种语言成为缺省的语言。比如说在底层产生错误,那么最基本的错误提示总是要有的吧。
其他的本地语言由相应的的本地语言的用户界面软件包构成,这些界面包并不是要把所有的和界面相关的文件全部替换掉,具体的相关部分下面介绍。
ReactOS除了西欧、美国的英文版外,还应该包含其他的语系集合包。 按照windows的标准则应该包含除前面说的那个语系外的其他16个语系集合包
2009年04月07日 13点04分 5
level 6
fros 楼主
[分析环境reactos0.3.1 ,i386体系]
ReactOS的中文本地化
(类似Windows操作系统源代码分析)
2009年04月07日 13点04分 6
level 6
fros 楼主
4.1 什么是Unicode
上面的问题并仅仅是在汉字的编码上产生的问题,在不同的地区不同的文字下都会出现这个问题。
于是,Unicode诞生了,Unicode有两套标准,一套叫UCS-2(Unicode-16),用2个字节为字符编码,另一套叫UCS-4 (Unicode-32),用4个字节为字符编码。以目前常用的UCS-2为例,它可以表示的字符数为2^16=65535,基本上可以容纳所有的欧美字符和绝大部分的亚洲字符。在Unicode里,所有的字符被一视同仁。汉字不再使用“两个扩展ASCII”,而是使用“1个Unicode”。而ReactOS的内部完全采用 Unicode这种编码。因此给中文的实现打下了良好的基础。也就是说目前的主要任务就放在了汉字的显示上。
2009年04月07日 13点04分 8
level 6
fros 楼主
4.2 语言和区域设置
ReactOS为适应不同地区和语言的用户以及键盘布局在注册表中设立了一个键值,用于表示用户所在的地区。(主要还是和Microsoft Windows兼容)
在系统初始化过程中会查询注册表文件用于确定系统当前所在的区域和默认的输入语言,并且根据这个配置信息来确定创建线程时的区域信息,则这个线程中的区域信息又决定了如何查找应用程序中和语言相关的资源信息。
在注册表中有几个键值是用来确定系统所在的区域,当操作系统启动后,这些设置将保存在系统的一些全局变量中,利用这些变量的值系统可以确定当启动一个应用程序时如何加载系统地缺省语言的资源文件。比如如果区域被设置成了美国地区则某个gLocale全局变量的值就是0x 00000409,如果区域是中国则该值为0x00000804,不过就目前的ReactOS 0.3.1版来说还是不要修改安装注册表文件中的设置。因为会导致系统在引导时失败。直接修改代码可以让系统暂时实现比较安全的中文显示,不过这是非标准的做法,以后的版本可能直接修改注册表会更方便。
找到位于(ntoskrnl\ex)的Locale.c这个文件它包含了系统和区域语言相关的函数
这个文件中包含了reactos缺省的区域
2009年04月07日 13点04分 9
level 6
fros 楼主
/* System IDs: EN_US */
LCID PsDefaultSystemLocaleId = 0x00000409; //chinese 0x00000804
LANGID PsInstallUILanguageId = LANGIDFROMLCID(0x00000409);
/* UI/Thread IDs: Same as system */
LANGID PsDefaultUILanguageId = 0x00000409; //chinese 0x00000804
LCID PsDefaultThreadLocaleId = LANGIDFROMLCID(0x00000409);
修改了上面的信息后,你基本上就不用屏蔽掉非中文资源文件,这时的应用程序会更具具体的环境来显示不同的语言。(一个应用程序是可以包含很多不同语言的资源文件的)
2009年04月07日 13点04分 10
level 6
fros 楼主
4.3 中文显示
4.3.1 关于字体文件freetype(truetype)
在解决中文编码后,中文的显示相对来说就要简单多了,无非就是根据中文编码查找相应的字库文件,然后将字库文件中的文字信息显示出来。
在windows中,字体的显示使用了一种叫TrueType(轮廓字体的一种)的字体文件,这种字体是设备无关字体,按轮廓存储它们可以任意调整高度,而且打印出来的效果和屏幕上显示的完全相同。
不过TrueType是必须付费的,因此不可能用在一个免费的系统中,好在GNU的开放项目中有一个叫做FreeType的项目它提供了一套TrueType的完整支持。
2009年04月07日 13点04分 11
level 6
fros 楼主
在中文版的windows中,系统的缺省字体是一种字体名叫“宋体&新宋体”的字体文件,
2009年04月07日 13点04分 12
level 6
fros 楼主
在windows 2000以后这个文件的文件名叫simsun.ttc,在windows98里叫simsun.ttf,
2009年04月07日 13点04分 13
level 6
fros 楼主
在这里我们需要的是ttf格式的字体文件,还需要注意的是微软的ttf文件也是有版权的,并且授权协议也不是GPL的形式,因此是不能作为Reactos的一部分来发布的,
2009年04月07日 13点04分 14
level 6
fros 楼主
去找一种类似simsun.ttf的免费中文字体来试验一下ReactOS的中文显示,找到以后把他放入到 ReactOS_root\media\fonts文件夹中,如果你不想修改太多的配置文件,我建议以相同的名字替换掉这个文件夹中已经存在的一个字体文件比如courb.ttf。
2009年04月07日 13点04分 15
level 6
fros 楼主
4.3.2 缺省的系统字体(系统库存字体对象)
在Windows GDI中存在作一些库存GDI对象,这些库存GDI对象中有一部分是库存的字体对象,库存字体对象的作用有一部分是为了系统本身不会平凡的创建字体而占用过多的资源。对于库存字体对象,仅仅需要调用GetStockObject()函数就可以取出库存字体,然后再调用SelectObject()将字体对象选入指定的设备就可以,对于中文版的ReactOS应该建立的缺省的库存字体应该是一个中文的ttf字体,因此还必须修改缺省的库存字体,而且当用户调用GetDCEx是系统需要创建一个DC这个DC会初始化一些缺省的DC信息,如:
这个文件在[ReactOS_Root\subsystems\win32\win32k\objects]下的文件找到以下文件stockobj.c编辑缺省的SystemFont库存字体对象,这个代码将在系统初始化时建立系统的库存能字体:
static LOGFONTW SystemFont =
{ 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, GB2312_CHARSET,
 OUT_STRING_PRECIS, CLIP_STROKE_PRECIS, PROOF_QUALITY, VARIABLE_PITCH | FF_SWISS, L"simsun" }; //中文字体名,该字体必须复制到ReactOS_Root\media\fonts文件夹下,具体的字体名称不一定是simsun,要看你复制的这个 ttf文件包含的字体叫什么名字。
通过这样的修改后,系统建立的就是一个支持中文的缺省的库存GDI字体对象,所有的缺省操作都将是用这个字体输出。
2009年04月07日 13点04分 16
level 6
fros 楼主
4.3.3 系统中可替代的字体
当用户调用 CreateFont()或CreateFontIndirect()函数指定一个字体名,系统会先查找注册表中的“可替代字体名列表”如果指定的字体名存在于这个“可替代字体名列表”中,则系统会自动将替代这个指定的指定的字体名,在ReactOS的注册表中这个“可替代字体名列表”位于: ReactOS_Root\Boot\bootdata\hivesft.inf中,
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes处,这里列出里用于替代的字体名。如用“MS Shell Dlg”来创建一个逻辑字体,则会被替代成这里指定的字体名。
4.3.4 标题、菜单、按钮中文显示
同样在注册表中可以管理如窗口标题、菜单、按钮等的中文显示,即采用何种字体,字体的大小,颜色等各式。在ReactOS的注册表中位于一下键值部分。
文件在ReactOS_Root\boot\bootdata\hivedef.inf,编辑这个文件的
HKCU, "Control Panel\Desktop\WindowMetrics部分可以修改相对的GUI元素的逻辑字体属性。不过这些数值修改起来有点麻烦,因为是采用二进制的形式表示一个LOGFONTW的结构中各个字段。
理论上讲只要把各个GUI元素如标题条的LOGFONTW结构的lfFaceName修改成中文TTF的字体名如:“simsun”就可以在标题中显示中文,不过这样修改后依然不能显示中文。
2009年04月07日 13点04分 17
level 6
fros 楼主
4.3.5 ReactOS v0.3.1中存在的问题
对于上面的那个问题我在目前的v0.3.1版中找到了答案。看下面的代码:
文件是Misc.c (位于ReactOS_Root\subsystems\win32\win32k\ntuser下) 编辑这个文件找到
IntGetFontMetricSetting 函数,这个函数在系统绘制标题等GUI元素的文字时调用。该函数的目的是查找绘制这些GUI元素时需要的字体信息,不过目前好像有点问题就是它在调用 RtlQueryRegistryValues()查询注册表字体信息是返回的Status总是一个FALSE这样就导致了它总是调用之后的字体缺省操作,这就是为什么会在某些窗口的菜单或按钮上看见类似“□□□□”的显示。其实看见“□□□□”符号反而可以证明你已经在显示中文了,只是在这个字体文件中没有找到这个文字而用了“□”符号做缺省替代。
RtlCopyMemory(font, &DefaultFont, sizeof(LOGFONTW));
因此中文化还要将这里改称如下的中文字体名
static LOGFONTW DefaultFont = { 12, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, GB2312_CHARSET, OUT_STRING_PRECIS,CLIP_STROKE_PRECIS, PROOF_QUALITY, VARIABLE_PITCH | FF_SWISS, L"simsun" }; //具体的字体名称不一定是simsun,要看你复制的这个ttf文件包含的字体叫什么名字。
这样一来即使任何操作都将产生中文的逻辑字体。
4.4 输入法
最后是输入法,中文输入法决定了系统是否支持中文的关键,因为即使是所有的显示都可以是中文,但是如果不支持中文的输入,那么说是一个中文的系统也是大打折扣,目前的ReactOS还没有任何的中文输入法,不过在ReactOS的代码中已经可以看见和IME(Input Method Editor)相关的部分,ReactOS是一个开源的项目,还需要大家的支持,也许ReactOS的中文输入法将会由你来创造。
2009年04月07日 13点04分 18
level 6
fros 楼主
原文地址:
http://blog.csdn.net/mickey139/archive/2007/07/22/1702030.aspx
郁闷。
都被百度给审核成什么样子了。
-_-!!!
2009年04月07日 13点04分 19
level 6
fros 楼主
需要解释的是ttc是一种包含了多种ttf字体的集合,
2009年04月07日 13点04分 20
level 6
fros 楼主
那位大牛的汉化版本!0.35的。
http://blog.csdn.net/mickey139/archive/2008/07/09/2630135.aspx
2009年04月07日 15点04分 21
1 2 尾页