發(fā)表日期:2013-03-08 文章編輯:天天 瀏覽次數(shù):19 標(biāo)簽:你會(huì)用m17n對(duì)各國(guó)語(yǔ)言間代碼移植轉(zhuǎn)換嗎?
你會(huì)用m17n對(duì)各國(guó)語(yǔ)言間代碼移植轉(zhuǎn)換嗎?
為了讓 Linuxreg; 應(yīng)用程序在全世界范圍都可以使用,而不會(huì)在西方語(yǔ)言與世界上其他語(yǔ)言之間產(chǎn)生任何區(qū)別,我們應(yīng)該發(fā)行一些本地化后的版本,它們可以輸入、存儲(chǔ)、提取或呈現(xiàn)任何語(yǔ)言,而不管這些語(yǔ)言是多么復(fù)雜。多語(yǔ)言庫(kù),或稱為 m17n,為類 UNIXreg; 平臺(tái)上的所有語(yǔ)言提供了一個(gè)國(guó)際化解決方案。
在很短的時(shí)間之內(nèi) —— 總共還不到 20 年 —— 個(gè)人計(jì)算機(jī)已經(jīng)成為我們工作和生活中的一種必需設(shè)備。受到半導(dǎo)體和處理器快速發(fā)展的推動(dòng),大量的供應(yīng)商使得計(jì)算機(jī)的價(jià)格一落千丈,Internet 也已經(jīng)在全球廣為分布,個(gè)人計(jì)算機(jī)現(xiàn)在已經(jīng)不再是一種奢侈品,而是一種常見的家用電器了。
實(shí)際上,在很多富裕的國(guó)家(例如美國(guó)、日本、英國(guó)),每?jī)蓚€(gè)家庭就會(huì)擁有一臺(tái)計(jì)算機(jī),并且會(huì)使用寬帶服務(wù)。就全世界來(lái)看,雖然家庭收入可能會(huì)有很大的不同,但是個(gè)人計(jì)算機(jī)都很容易購(gòu)買了,即使在馬爾代夫,我們也很容易購(gòu)買到筆記本。另外,如果我們碰巧說(shuō)的是 Dhivehi 方言(馬爾代夫的一種方言),微軟也為我們提供了一個(gè)這種版本的 Microsoftreg; Windowsreg; XP 操作系統(tǒng)。
就全球廣泛接受的個(gè)人計(jì)算機(jī)來(lái)說(shuō),大部分現(xiàn)代操作系統(tǒng)都提供了一些編程庫(kù)來(lái)促進(jìn) 國(guó)際化 的發(fā)展,或者將軟件調(diào)整為支持多種語(yǔ)言的。國(guó)際化(通常簡(jiǎn)寫為 i18n,節(jié)選自 i-nternationalizatio-n)庫(kù)通常都會(huì)將應(yīng)用程序的文本資源(按鈕標(biāo)簽、用戶界面[UI] 提示和菜單選項(xiàng))保存成多種語(yǔ)言的。在啟動(dòng)國(guó)際化后的應(yīng)用程序后顯示哪種語(yǔ)言,這要取決于用戶的區(qū)域設(shè)置 —— 通常,這是一個(gè)可配置的系統(tǒng)或個(gè)人帳號(hào)首選項(xiàng)。
理想來(lái)說(shuō) —— 至少對(duì)于獨(dú)立軟件供應(yīng)商來(lái)說(shuō) —— 相同的可執(zhí)行程序以日語(yǔ)或希臘語(yǔ)運(yùn)行時(shí)都能運(yùn)行得一樣好。然而,構(gòu)建 “本地方言” 版本的應(yīng)用程序的情況遠(yuǎn)遠(yuǎn)沒有這么理想。包括被廣泛認(rèn)可的 ISO(International Standards Organization)/IEC(International Engineering Consortium)10646 和 Unicode,沒有哪種字符編碼可以解決如何實(shí)現(xiàn)任意語(yǔ)言的輸入和呈現(xiàn)問題。ISO/IEC 10646 和 Unicode 只指定了如何存儲(chǔ)、檢索和排序字符以及字符的特殊組合。例如,這些標(biāo)準(zhǔn)并沒有規(guī)定統(tǒng)一的格式、嵌入式數(shù)據(jù)或標(biāo)識(shí)來(lái)讓使用泰國(guó)語(yǔ)書寫的文檔怎樣才能按照泰國(guó)語(yǔ)的規(guī)范規(guī)則正確地呈現(xiàn)出它們的樣子來(lái)。是的,Unicode 可以維護(hù)使用泰國(guó)語(yǔ)書寫的文檔的內(nèi)容,也可以保證這種文件在所有使用 Unicode 的平臺(tái)上都可以很好地進(jìn)行移植,但是它并不能保證我們可以正確查看文件,也不能保證文檔所呈現(xiàn)出來(lái)的樣子與作者的意圖一致。
我們來(lái)考慮一下這種情況:盡管 Linux GNU C 庫(kù)(glibc)提供了一些函數(shù)來(lái)處理 ISO 10646 兼容的 31 位字符,但是它并不能保證這些字符可以在顯示設(shè)備上正確進(jìn)行顯示。有些 glibc 字符串函數(shù),例如 strcat() 和 strlen(),都可以正確地處理多字節(jié)的問題,但是要正確顯示阿拉伯語(yǔ),需要雙向(bidi)顯示的功能,這種功能只有在圖形用戶界面(GUI)工具包和專用字符串顯示庫(kù)中才能找到。
例如,GNOME 需要 GTK+ 工具包和 Pango(一個(gè)文本顯示庫(kù))來(lái)實(shí)現(xiàn)對(duì) i18n 的完整支持(然而,Pango 在解決自己用途不夠廣泛方面有一些限制。請(qǐng)參看側(cè)欄 pango 的問題)。其他 GUI 工具包提供了對(duì) i18n 的支持,但卻并不總是能兼容這些標(biāo)準(zhǔn)。當(dāng)然,Linux 上的圖形應(yīng)用程序也需要 X Window System 的基本顯示庫(kù) Xlib,它提供了兩種繪圖(形狀和線條)和字符顯示原語(yǔ)。不幸的是,Xlib 只能顯示西歐語(yǔ)言。
Pango 的問題
Pango 可以放置(布局)并顯示一些復(fù)雜的手稿,但是不能對(duì)多字節(jié)的文本進(jìn)行排序或搜索功能。Pango 假設(shè)底層庫(kù) —— 通常是使用 C 語(yǔ)言編寫的,可以對(duì)使用 Unicode 標(biāo)準(zhǔn)指定的所有語(yǔ)言都進(jìn)行操作 —— 可以執(zhí)行基本的文本處理操作。
一個(gè)庫(kù)顯示所有語(yǔ)言
要讓應(yīng)用程序在全球都可以使用 —— 而不會(huì)在西方國(guó)家和世界上其他很多語(yǔ)言之間產(chǎn)生不公平的現(xiàn)象 —— 我們必須要能夠 輸入、存儲(chǔ)、提取并 顯示 任何語(yǔ)言,而不管這究竟會(huì)多么復(fù)雜。正如上面介紹的一樣,有一些廣為認(rèn)可的標(biāo)準(zhǔn)為多字節(jié)存儲(chǔ)和可移植性提供了一些便利;然而,現(xiàn)在還沒有為輸入和顯示制定標(biāo)準(zhǔn)。更加糟糕的是,即使是最好的多語(yǔ)言文本編輯器也會(huì)被迫混合使用簡(jiǎn)單的國(guó)際化庫(kù)和私有 GUI 工具包。添加一種語(yǔ)言可能會(huì)需要另外一種(很可能是新的)定制庫(kù)。
Multilingualization Library 或 m17n 庫(kù)會(huì)盡力為類 UNIX 平臺(tái)上多種語(yǔ)言書寫的文本的輸入、處理和顯示提供一種單一的解決方案。另外,m17n 的目標(biāo)是充分利用現(xiàn)有且大家都可以很好地理解的典型 UNIX 應(yīng)用程序框架,而不是利用軟件開發(fā)人員的其他模型。
最后,m17n 會(huì)努力使國(guó)際化的內(nèi)容更加豐富,而不僅僅是簡(jiǎn)單地從英語(yǔ)移植到另外一種語(yǔ)言上。使用 m17n,同一個(gè)二進(jìn)制文件可以在一個(gè)系統(tǒng)上顯示法語(yǔ),在另外一個(gè)系統(tǒng)上顯示蒙古語(yǔ),甚至在同一個(gè)屏幕上就可以顯示多種語(yǔ)言的文本。更好的是,m17n 可以(令人信服地)實(shí)現(xiàn)諸如文本數(shù)據(jù)庫(kù)之類的功能,這使它可以存儲(chǔ)并處理大量的國(guó)際化內(nèi)容。
m17n 庫(kù)是在日本 Tsukuba 的 National Institute for Advanced Science and Technology 工作的 4 個(gè)日本程序員編寫的。很多年以來(lái),日本都一直走在了國(guó)際化的前端,部分原因是日語(yǔ)學(xué)者一直在試圖為人文學(xué)科探索一種百科全書式的方法 —— 尤其對(duì)世界上各種語(yǔ)言更為關(guān)注。
m17n 庫(kù)是由 3 個(gè)庫(kù)和一個(gè)存儲(chǔ)單一腳本以及正確顯示腳本所需要的元數(shù)據(jù)的數(shù)據(jù)庫(kù)構(gòu)成的:
m17n C 庫(kù)可以類似地實(shí)現(xiàn) glibc (以及各種風(fēng)格的 libc )的一些基本的文本處理功能。
m17n X 庫(kù)與 Xlib 是緊密對(duì)應(yīng)的。它提供了基本的繪制字符的功能,并且對(duì)呈現(xiàn)所做的假設(shè)很少。
m17n 工具包提供了一些功能,可以對(duì)復(fù)雜的腳本進(jìn)行處理,使它們可以準(zhǔn)備好在屏幕上進(jìn)行顯示。例如,泰國(guó)語(yǔ)在顯示之前,必須進(jìn)行排序、合成和重新排序。
最后,m17n 數(shù)據(jù)庫(kù)存儲(chǔ)了每種語(yǔ)言所特有的一些數(shù)據(jù)。例如,某種特有語(yǔ)言可能會(huì)需要自己的字體、一種特定的編碼以及一些特殊的機(jī)制來(lái)輸入自己的數(shù)據(jù)。m17n 庫(kù)是與語(yǔ)言無(wú)關(guān)的;m17n 數(shù)據(jù)庫(kù)中保存了所有與語(yǔ)言有關(guān)的信息。
圖 1 給出了 m17n 的 4 個(gè)部分,以及這些庫(kù)是如何與現(xiàn)有的系統(tǒng)組件對(duì)應(yīng)的。m17n 組件和傳統(tǒng) UNIX 庫(kù)之間存在驚人的類似之處并不意外:m17n 的創(chuàng)建者希望能夠讓多語(yǔ)言的應(yīng)用程序的編寫盡量簡(jiǎn)單。我們只要使用一個(gè)等效的多語(yǔ)言庫(kù)來(lái)替換相同語(yǔ)義的函數(shù)即可。
(從側(cè)面來(lái)看,m17n C 和 X 庫(kù)就預(yù)示著 X 服務(wù)器可以提供國(guó)際化功能。不過,m17n 對(duì)底層操作系統(tǒng)和呈現(xiàn)機(jī)制的假設(shè)較少,因此我們可以將 m17n 移植到其他窗口系統(tǒng)上。實(shí)際上,將 m17n 集成到跨平臺(tái)的 GUI 工具包(例如類 UNIX 系統(tǒng)上使用的 Qt)正是當(dāng)前的工作重點(diǎn),m17n 團(tuán)隊(duì)正在將自己的代碼加入 GTK 的修正版本中。)
字符一瞥
添加新拼字法也非常簡(jiǎn)單:不需要改編 m17n 庫(kù)來(lái)顯示新腳本。相反,只需要?jiǎng)?chuàng)建一個(gè)新的 m17n M-text,并將 M-text 添加到 m17n 數(shù)據(jù)庫(kù)上即可。
可以將 M-text 當(dāng)作一個(gè)泛化的 C 字符串,因?yàn)檫@就可以將任意屬性添加到通常與 C 字符串有關(guān)的字符代碼中。一個(gè)屬性可以指定語(yǔ)言要顯示的字符,而另外一個(gè)屬性則可以指定特定的字體。Bidi 信息也是使用 M-text 表示來(lái)進(jìn)行編碼的,并且基本的字形信息都可以出現(xiàn)。
例如,圖 2(已經(jīng)得到 m17n 開發(fā)人員的許可進(jìn)行復(fù)制)展示了這些屬性如何用來(lái)修改文本字符串的外觀。這個(gè)字符串非常簡(jiǎn)單,內(nèi)容是 “This is sample text to show the property”。然而,每個(gè)字符串都有一個(gè) face 屬性 —— 或多個(gè) face 屬性 —— 它決定了要使用哪些字體來(lái)顯示字符。該圖中所顯示的 face 屬性都故意進(jìn)行了簡(jiǎn)化,但是我們可以看到這種特性所提供的靈活性,這對(duì)于世界上很多手寫語(yǔ)言來(lái)說(shuō)都是必要的。
有很多腳本都需要復(fù)雜的過程來(lái)重新進(jìn)行排序,或重新放置各個(gè)要顯示的復(fù)雜合成圖形。諸如泰米爾語(yǔ)、緬甸語(yǔ)和泰國(guó)語(yǔ)之類的腳本在進(jìn)行顯示之前都需要這種重新排序過程。作為更為具體的一個(gè)例子,圖 3(也已經(jīng)獲得作者許可進(jìn)行復(fù)制)展示了單詞 Hindi 是如何進(jìn)行處理來(lái)使用 Devanagri 腳本正確顯示的。這需要兩個(gè)階段。第一個(gè)階段是將字符序列從字節(jié)順序(字符在內(nèi)存中如何存儲(chǔ))轉(zhuǎn)換成正確的手寫順序(字符如何在紙面上顯示)。
第二個(gè)階段負(fù)責(zé)掃描特有的字形和讀音序列(如果存在)并將這個(gè)序列替換成 “復(fù)合” 字形(英語(yǔ)有很多這種轉(zhuǎn)換來(lái)增強(qiáng)文本的可讀性。根據(jù)所使用的字體的不同, f 和 i 序列通常都會(huì)使用一個(gè) fi 字形代替,這要取決于我們選擇的字體)。
這個(gè)重新排序過程的通用名字是 Complex Font Layout(CFL)。通常,CFL 信息都包含在字體中,在某些情況中,已經(jīng)寫死到顯示庫(kù)中了。在 m17n 中,CFL 信息可以在 FLT(Font Layout Table)中找到。有些拼字法需要少量的 FLT 數(shù)據(jù);另外一些字符則需要很多信息來(lái)捕獲復(fù)雜的規(guī)則。
例如, Sino-Japanese orthography 就沒有前后規(guī)則可以影響單個(gè)字形組合的復(fù)合。然而,泰國(guó)語(yǔ)的確有一些有趣的規(guī)則可以影響 orthography 的變化,但是它對(duì)于泰國(guó)口語(yǔ)不會(huì)產(chǎn)生任何影響。泰國(guó)語(yǔ)的拼字法 對(duì)于周圍的文本來(lái)說(shuō)非常敏感,但是對(duì)于口語(yǔ)來(lái)說(shuō)則并非如此。印度腳本中特定的組合規(guī)則也相當(dāng)復(fù)雜,必須使用 FLT 來(lái)顯示。
最后,諸如字體、雙向顯示、Unicode 和語(yǔ)言之類的數(shù)據(jù)都會(huì)將文本的顯示呈現(xiàn)在屏幕上。下一個(gè)棘手的問題 —— 也可能是現(xiàn)在正出現(xiàn)在您腦海中的問題 —— 是我們?nèi)绾我苑?ASCII 字體的形式來(lái)輸入文本。
使用有 500 個(gè)鍵的鍵盤
對(duì)于英語(yǔ)和很多歐洲語(yǔ)言來(lái)說(shuō),一個(gè)字符映射為一個(gè)鍵(或兩個(gè)鍵)就足夠了。大寫鍵可以直接打印,鍵盤驅(qū)動(dòng)程序可以對(duì)很多更為特殊的情況進(jìn)行編碼,但是其模型是相同的:按下一個(gè)鍵就代表輸入某個(gè)特定的字符。
那么,如果一種拼字法中有數(shù)百個(gè)字符,或者更特殊一點(diǎn),它們之間有很多組合,情況如何呢?那么我們就不能簡(jiǎn)單地使用一次擊鍵來(lái)實(shí)現(xiàn)了,而是需要使用 擊鍵序列 ,或者快速連續(xù)輸入多個(gè)鍵。有一種特別的軟件叫 輸入法,它可以將每個(gè)鍵盤序列轉(zhuǎn)換成一個(gè)字符或一系列字符。
當(dāng)然,有些擊鍵序列可能就是一次擊鍵。另外,我們可以創(chuàng)建一種輸入法將標(biāo)準(zhǔn)的拉丁字母鍵盤 轉(zhuǎn)換 成其他語(yǔ)系的拼字法。例如,老式的日語(yǔ)鍵盤就將拉丁字母轉(zhuǎn)換成平假名和片假名。然而,試圖使用 26 個(gè)字母(A 到 Z 的拉丁字母)表示大約 46 個(gè)平假名有些困難。
鍵盤映射、擊鍵序列以及音譯輸入法都可以使用 m17n 數(shù)據(jù)庫(kù)來(lái)表示。這種方法很大的一個(gè)優(yōu)點(diǎn)是可以將拼字法 的規(guī)則與應(yīng)用程序代碼清楚地區(qū)分開來(lái)。應(yīng)用程序代碼最適合由程序員來(lái)開發(fā);如何顯示正確的文本則是語(yǔ)言學(xué)家的工作。
獲取 m17n 庫(kù)
正如上面介紹的一樣,m17n 包括 3 個(gè)庫(kù)和 m17n 數(shù)據(jù)庫(kù)。現(xiàn)在,我們可以使用一個(gè) m17n libc,另外還可以使用一個(gè) Xlib 的 m17n 版本進(jìn)行編碼。開發(fā)團(tuán)隊(duì)正在努力編寫第 3 層的庫(kù)即 m17n X 工具包,它將成為 GTK+ 的一部分。m17n 開發(fā)人員也從事語(yǔ)言綁定的工作,這樣諸如 Perl 和 Ruby 之類的編程語(yǔ)言就都可以使用 m17n 了(這個(gè)工具包和綁定何時(shí)可用,尚沒有進(jìn)度表)。m17n 庫(kù)也已經(jīng)被接納為 Linux Standard Base(LSB)的一個(gè)部分,它可能會(huì)成為 Linux 國(guó)際化標(biāo)準(zhǔn)實(shí)現(xiàn)的一個(gè)很好的部分。
m17n 庫(kù)的最新版本是 1.3.3,這是在 2006 年 2 月 22 日發(fā)布的。我們可以按照下面的方式來(lái)獲取 m17n 庫(kù):
下載 m17n 源代碼。這個(gè)下載頁(yè)面中還提供了使用英語(yǔ)和日語(yǔ)編寫的程序員文檔包。
如果喜歡使用 CVS(Concurrent Versions System),也可以使用下面的 CVS 命令來(lái)下載代碼:
$ cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/m17n login
$ cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/m17n co m17n-lib
$ cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/m17n co m17n-db
從源代碼開始編譯程序也非常簡(jiǎn)單:m17n 庫(kù)使用了典型的配置腳本來(lái)配置系統(tǒng),并為編譯和安裝創(chuàng)建合適的 Makefile(詳細(xì)內(nèi)容請(qǐng)參看 m17n 軟件包中的 README 文件)。
如果碰巧使用的是 Debian 的發(fā)行版本,就可以使用非常方便的 APT 安裝工具來(lái)安裝 m17n 庫(kù)和它所依賴的庫(kù)。例如,要尋找 Debian 系統(tǒng)上所有可用的 m17n 包,就需要使用 apt-cache,例如 apt-cache search m17n。
根據(jù) APT 所指向的 Debian 儲(chǔ)存庫(kù)的不同,可能會(huì)看到如清單 1 所示的輸出內(nèi)容。
清單 1. apt-cache search m17n 命令的輸出結(jié)果
libm17n-0 - a multilingual text processing library - runtime
libm17n-dev - a multilingual text processing library - development
m17n-db - a multilingual text processing library - database
m17n-docs - a multilingual text processing library - documents
m17n-env - set up multilingual X environment
m17n-lib-bin - a multilingual text processing library - utilities
mlterm-im-m17nlib - MultiLingual TERMinal, m17nlib input method plugin
在找到包名之后,就可以運(yùn)行 apt-get install 來(lái)自動(dòng)下載并安裝 m17n 包了。根據(jù) m17n 開發(fā)人員的說(shuō)法,為 Fedora Core、Mandrake、SUSE Linux 和 Gentoo Linux 提供的包也都可以使用。
m17n 庫(kù)依賴于幾個(gè)其他庫(kù),這幾個(gè)庫(kù)在您的系統(tǒng)上可能有,也可能沒有。請(qǐng)閱讀前提條件中最新的列表。
m17n 簡(jiǎn)介
從內(nèi)部來(lái)說(shuō),m17n 庫(kù)會(huì)被組織成幾個(gè)應(yīng)用程序接口(API):
Core:這個(gè) API 提供了處理 M-texts 的功能。Core API 并不需要 m17n 數(shù)據(jù)庫(kù)。
Shell:Shell API 增加了 m17n 的數(shù)據(jù)庫(kù)查找和搜索功能。Shell 包括了這個(gè) API 的所有功能和特性。
GUI:GUI API 提供了在圖形顯示設(shè)備上輸入并顯示文本的功能。GUI 隱式地包含了 Shell 和 Core API 的所有特性。
Miscellaneous:這個(gè) API 定義了幾個(gè)函數(shù)來(lái)幫助對(duì) m17n 庫(kù)進(jìn)行調(diào)試和跟蹤。
m17n 庫(kù)的使用與其他 Linux 或 UNIX 的庫(kù)的使用相同。如果要使用這個(gè)庫(kù)的所有特性,就需要在程序中包含 m17n.h 頭文件,然后在鏈接選項(xiàng)中加上 -lm17n 選項(xiàng),這可以在 Makefile 中實(shí)現(xiàn)。 如果只想使用 m17n 的一部分功能,Core、Shell、GUI 以及 Miscellaneous API 每個(gè)都有單獨(dú)的包含文件。不幸的是,m17n 并沒有很多樣例代碼,很多明顯引用它們的程序,例如可以識(shí)別 m17n 的應(yīng)用程序,也只有兩年的時(shí)間。然而,m17n 的軟件開發(fā)包(SDK)確實(shí)包含了一個(gè)簡(jiǎn)單的程序,它可以使用各種編碼來(lái)顯示文件。我們可以查看一下所下載的 m17n 工具包中的 example 目錄。在這個(gè)目錄中,打開 mview.c 文件。這個(gè)文件的一部分如清單 2 所示。
清單 2. m17n 示例文件
...
325 M17N_INIT ();
326 if (merror_code != MERROR_NONE)
327 FATAL_ERROR ("%s\n", "Fail to initialize the m17n library.");
328
329 /* Decide how to decode the input stream. */
330 if (coding_name)
331 {
332 coding = mconv_resolve_coding (msymbol (coding_name));
333 if (coding == Mnil)
334 FATAL_ERROR ("Invalid coding: %s\n", coding_name);
335 }
336 else
337 coding = Mcoding_utf_8;
338
339 mt = mconv_decode_stream (coding, fp);
340 fclose (fp);
341 if (! mt)
342 FATAL_ERROR ("%s\n", "Fail to de
code the input file or stream!");
343
344 {
345 MPlist *param = mplist ();
346 MFace *face = mface ();
347
348 if (fontsize)
349 mface_put_prop (face, Msize, (void *) fontsize);
350 mplist_put (param, Mwidget, shell);
351 mplist_put (param, Mface, face);
352 frame = mframe (param);
353 m17n_object_unref (param);
354 m17n_object_unref (face);
355 }
356
357 /* Create this widget hierarchy.
358 Shell - form -+- quit
359
360 +- viewport - text */
361
362 form = XtCreateManagedWidget ("form", formWidgetClass, shell, NULL, 0);
363 XtSetArg (arg[0], XtNleft, XawChainLeft);
364 XtSetArg (arg[1], XtNright, XawChainLeft);
365 XtSetArg (arg[2], XtNtop, XawChainTop);
366 XtSetArg (arg[3], XtNbottom, XawChainTop);
367 XtSetArg (arg[4], XtNaccelerators, XtParseAcceleratorTable (quit_action));
368 quit = XtCreateManagedWidget ("quit", commandWidgetClass, form, arg, 5);
369 XtAddCallback (quit, XtNcallback, QuitProc, NULL);
370
371 viewport_width = (int) mframe_get_prop (frame, Mfont_width) * 80;
372 viewport_height
373 = ((int) mframe_get_prop (frame, Mfont_ascent)
374 + (int) mframe_get_prop (frame, Mfont_descent)) * 24;
375 XtSetArg (arg[0], XtNallowVert, True);
376 XtSetArg (arg[1], XtNforceBars, False);
377 XtSetArg (arg[2], XtNfromVert, quit);
378 XtSetArg (arg[3], XtNtop, XawChainTop);
379 XtSetArg (arg[4], XtNbottom, XawChainBottom);
380 XtSetArg (arg[5], XtNright, XawChainRight);
381 XtSetArg (arg[6], XtNwidth, viewport_width);
382 XtSetArg (arg[7], XtNheight, viewport_height);
383 viewport = XtCreateManagedWidget ("viewport", viewportWidgetClass, form,
384 arg, 8);
385
386 /* Before creating the text widget, we must calculate the height of
387 the M-text to draw. */
388 control.two_dimensional = 1;
389 control.enable_bidi = 1;
390 control.disable_caching = 1;
391 control.max_line_width = viewport_width;
392 mdraw_text_extents (frame, mt, 0, mtext_len (mt), &control,
393 NULL, NULL, metric);
...
下面對(duì)這些代碼詳細(xì)介紹一下:
第 325 行負(fù)責(zé)對(duì) m17n 庫(kù)進(jìn)行初始化。
第 330 行的 coding_name 變量源自于一個(gè)指定輸入文件編碼的命令行參數(shù);如果沒有提供這種命令行,就使用 UTF-8 編碼。
第 339 行讀取到達(dá)的數(shù)據(jù),并根據(jù)編碼類型對(duì)其進(jìn)行解碼,現(xiàn)在都反應(yīng)在 coding 中。
第 345 到 354 行設(shè)置要畫的文本框架。第 345 行從手頭的 M-text 中提取出一些屬性,而 346 行則提取出給定文本使用的適當(dāng)字體。第 348 行設(shè)置要顯示使用的字體大小(fontsize 是另外一個(gè)命令行參數(shù)),第 350 和 351 行設(shè)置該框架中要畫的其他屬性,包括要畫到哪個(gè)小部件上(前面的 shell = XtOpenApplication (&context, "M17NView", NULL, 0, argc, argv, NULL, sessionShellWidgetClass, NULL, 0) 和最后的類型定義。
第 362 到 383 行是典型的 X 工具包調(diào)用,用來(lái)設(shè)置應(yīng)用程序的主窗口。第 371 到 372 行負(fù)責(zé)計(jì)算對(duì)于本地拼字法的一個(gè) 80 x 24 的窗口來(lái)說(shuō),視口應(yīng)該多大。
最后,在為 M-text 呈現(xiàn)設(shè)置一些參數(shù)之后,在 392 行就會(huì)開始顯示 m17n 文本。
總而言之,上面對(duì)這段代碼片段的簡(jiǎn)短分析就說(shuō)明了在標(biāo)準(zhǔn)的 X 應(yīng)用程序中通常要執(zhí)行哪些操作。在很多情況中,創(chuàng)建一個(gè)多語(yǔ)言的應(yīng)用程序只需要很少的額外代碼就可以實(shí)現(xiàn),這需要采用 m17n 的函數(shù),而不是傳統(tǒng)的 X 調(diào)用。
展望
如果沒有可以構(gòu)建 m17n 代碼的系統(tǒng),也不要煩惱。您仍然可以通過在線 m17n 呈現(xiàn)演示來(lái)體驗(yàn)這個(gè)庫(kù)的作用。
據(jù)開發(fā)人員說(shuō),他們正在繼續(xù)在 GTK+ 中集成 m17n —— 這是擴(kuò)寬 m17n 的認(rèn)可程度以及影響力的下一個(gè)必不可少的步驟?,F(xiàn)在,m17n 項(xiàng)目缺少樣例代碼供參考和擴(kuò)展。建立更好的文檔也是另外一個(gè)需要做的工作,這與為主流平臺(tái)提供二進(jìn)制文件一樣重要。然而,m17n 確實(shí)承諾會(huì)對(duì)各個(gè)省的方言也能夠?qū)崿F(xiàn) WYSIEYG 的編輯。這對(duì)任何語(yǔ)言來(lái)說(shuō)都是個(gè)好消息。
個(gè)人計(jì)算機(jī)已經(jīng)不再是什么新奇的東西了。實(shí)際上,在不到 20 年的時(shí)間內(nèi),計(jì)算機(jī)已經(jīng)成為了家庭的日常用品 —— 只不過它不是什么衣服之類的東西,而是用來(lái)管理信息的工具。然而,有些國(guó)家計(jì)算機(jī)的獲得和使用還并不普遍。為了平衡這種不平等,需要讓這些國(guó)家能夠獲得負(fù)擔(dān)得起的各種計(jì)算機(jī)硬件和軟件。另外,還要保證本土居民能夠以本地方言來(lái)使用計(jì)算機(jī)。
m17n 庫(kù)構(gòu)建在 Unicode 和其他標(biāo)準(zhǔn)之上,用來(lái)根據(jù)手寫語(yǔ)言的規(guī)則畫出任意復(fù)雜的拼字法。它將代碼與字符的格式區(qū)分開來(lái),因此相同的代碼可以反復(fù)使用,甚至是在相同的應(yīng)用程序中呈現(xiàn)不同的拼字法都可以。隨著這些工作的不斷進(jìn)展,m17n 正在逐漸讓計(jì)算機(jī)語(yǔ)言變成一種全球的方言。
企業(yè)網(wǎng)站建設(shè)解決方案 營(yíng)銷型網(wǎng)站建設(shè)解決方案 行業(yè)門戶網(wǎng)站建設(shè)解決方案 外貿(mào)網(wǎng)站解建設(shè)決方案 品牌形象網(wǎng)站建設(shè)解決方案 購(gòu)物商城網(wǎng)站建設(shè)解決方案 政府網(wǎng)站建設(shè)解決方案 手機(jī)網(wǎng)站建設(shè)解決方案 教育培訓(xùn)網(wǎng)站建設(shè)解決方案 珠寶高端奢飾品網(wǎng)站建設(shè)解決方案 房地產(chǎn)、地產(chǎn)項(xiàng)目網(wǎng)站建設(shè)解決方案 集團(tuán)、上市企業(yè)網(wǎng)站建設(shè)解決方案 數(shù)碼、電子產(chǎn)品網(wǎng)站建設(shè)解決方案 美容、化妝品行業(yè)網(wǎng)站建設(shè)解決方案
10年專業(yè)互聯(lián)網(wǎng)服務(wù)經(jīng)驗(yàn) 重慶最專業(yè)網(wǎng)站團(tuán)隊(duì) 資深行業(yè)分析策劃 B2C營(yíng)銷型網(wǎng)站建設(shè)領(lǐng)先者 最前沿視覺設(shè)計(jì)、研發(fā)能力 時(shí)刻最新技術(shù)領(lǐng)先研發(fā)能力 具有完備的項(xiàng)目管理 完善的售后服務(wù)體系 深厚的網(wǎng)絡(luò)運(yùn)營(yíng)經(jīng)驗(yàn)
中技互聯(lián)一直秉承專業(yè)、誠(chéng)信、服務(wù)、進(jìn)取的價(jià)值觀,堅(jiān)持優(yōu)秀的商業(yè)道德,以用戶最終價(jià)值為導(dǎo)向,向用戶提供優(yōu)質(zhì)產(chǎn)品和優(yōu)質(zhì)服務(wù),從而贏得了用戶的信賴。始終以不懈的努力、更高的目標(biāo)來(lái)要求自己。
主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè) | 重慶網(wǎng)站建設(shè) | 重慶網(wǎng)站設(shè)計(jì) | 重慶網(wǎng)站制作 | 重慶網(wǎng)頁(yè)設(shè)計(jì) | 重慶網(wǎng)站開發(fā)