13.3. 使用區域化

i18n 並不是 FreeBSD 所有的特定標準而是一個協定。 我們鼓勵你去幫助 FreeBSD 跟隨這樣的協定。

區域化的設定是架構在三個主要的方面:語言碼、國家碼和字元編碼。 區域名是由下列這些部分所構成的:

    LanguageCode_CountryCode.Encoding

13.3.1. 語言與國家碼

為了區域化 FreeBSD 系統去提供一個特殊的語言 (或者任何 其他支援 i18n 的 UNIX),使用者必須找出特定的國家和語言碼 (國家碼告訴應用軟體要去使用那一種語言)。 此外,SMTP/POP 伺服器、網頁伺服器、等都是基於以上。 以下是語言和國家碼的範例:

Language/Country CodeDescription
en_USEnglish - United States
ru_RURussian for Russia
zh_TWTraditional Chinese for Taiwan

13.3.2. 字元編碼

有些語言使用 8-bit 的非 ASCII 編碼,寬或多位元,參考 multibyte(3) 得到更多的細節。較舊的應用軟體無法辨識這些字元,且將它們誤認為是控制字元, 新的應用軟體通常都辨識 8-bit 字元。為了配合這樣的解決方案, 使用者可能被要求去編譯一個提供寬或多位元字元的應用軟體,或者是正確的設定。 為了能夠輸入和處理寬或多字元, FreeBSD Ports collection 已經對每個語言提供了不同的程式。參考在各個 FreeBSD Port 在 i18n 的文件。

具體而言,使用者需要去檢查應用軟體文件去決定如何正確的設定, 或是傳入正確的值到 configure/Makefile/compiler。

有些需要牢記在心中的事情:

你可以檢查字元設定的 active 列表在 IANA Registry

Note: FreeBSD 版本 4.5 以及以上使用 X11 相容 locale 字元編碼來替代。

13.3.3. I18N 應用軟體

在 FreeBSD Ports 和套件系統, I18N 應用軟體為了容易辨識已經被命名帶有 I18N 在他們的名字中。 然而,這些並不總是提供所有需要的語言。

13.3.4. 設定 Locale

理論上,只需要輸出其locale name的數值, 如同在login shell的 LANG, 並且是經常透過使用者的 ~/.login_conf 或是使用者login shell設定 (~/.profile, ~/.bashrc, ~/.cshrc)。 這應該會設定所有的locale中的相關元素 (如 LC_CTYPE, LC_CTIME, 等等)。 請參考特定語言的FreeBSD文件以獲得更多資訊。

您應該在您的設定檔案中設定以下兩個參數:

這包括了使用者 Shell 設定,特定運用軟體設定,與X11的設定。

13.3.4.1. 設定 Locale 方法

這裡有兩種如下所述的方法來作區域化設定的工作。 第一種方法(也是我們所建議的)是在 login class 中設定其環境變數,而第二種方法是在系統的 shell startup file 中加入環境變數的設定。

13.3.4.1.1. 在 Login Classes 中設定

這個方法可以使所有 shell 能夠使用這些與 local name 及 MIME 字集有關的變數,而不需要在所有的殼層啟動檔案中加入這些變數。 一般使用者可以透過 User Level Setup 來完成這項工作,而 Administrator Level Setup 則需要超級使用者的權限。

13.3.4.1.1.1. User Level Setup

這裡有一個 .login_conf 的小例子。 這個檔案位在使用者目錄下,裡面包含有對 Latin-1 編碼設定的變數。

    german:German User:\
    	:charset=ISO-8859-1:\
    	:lang=de_DE.ISO_8859-1:

Note: de_DE.ISO8859-1 在 FreeBSD 版本 4.5 和以上才存在。

這裡有一個 .login_conf 設定繁體中文且使用 BIG-5 字元編碼的範例。 注意在此有許多變數被設定, 因為有些軟體並不會正確地重視中文、日文、韓文的 locale 變數。

    #Users who do not wish to use monetary units or time formats
    #of Taiwan can manually change each variable
    taiwan:Taiwanese User:\
    	lang=zh_TW.Big5:\
    	lc_all=zh_TW.Big:\
    	lc_collate=zh_TW.Big5:\ 
    	lc_ctype=zh_TW.Big5:\
    	lc_messages=zh_TW.Big5:\
    	lc_monetary=zh_TW.Big5:\
    	lc_numeric=zh_TW.Big5:\
    	lc_time=zh_TW.Big5:\
    	charset=big5:\
    	xmodifiers="@im=xcin": #Setting the XIM Input Server

參考 Administrator Level Setuplogin.conf(5) 以獲得更多細節。

13.3.4.1.1.2. Administrator Level Setup

檢查 /etc/login.conf 中的語言使用者等級是否正確。 確認 /etc/login.conf 存在下列的設定值。

    language_name:accounts_title:\
    	:charset=MIME_charset:\
    	:lang=locale_name:\
    	:tc=default:

所以跟前一個使用Latin-1的例子比較起來,它看起來就如下:

    german:German Users Accounts:\
    	:charset=ISO-8859-1:\
    	:lang=de_DE.ISO_8859-1:\
    	:tc=default:

Note: de_DE.ISO8859-1 for FreeBSD versions 4.5 and up.

vipw(8) 改變 Login Classes

使用 vipw 新增使用者, 並且設定如下所示的參數:

    user:password:1111:11:language:0:0:User Name:/home/user:/bin/sh

adduser(8) 改變 Login Classes

使用 adduser 新增使用者, 並且按照下述的步驟:

  • Set defaultclass = language in /etc/adduser.conf. Keep in mind you must enter a default class for all users of other languages in this case.

  • An alternative variant is answering the specified language each time that

        Enter login class: default []: 
    appears from adduser(8)

  • 另一個選擇是使用下列的方法來決定每一個使用者使用你想要加上的語言:

        # adduser -class language

pw(8) 改變 Login Classes

如果你是用 pw(8) 來新增使用者, 請照下列格式輸入:

    # pw useradd user_name -L language

13.3.4.1.2. 在 Shell 啟動檔案中設定

Note: 我們並不建議使用這個方法,因為這必須對所有登入程式作設定。 使用在 Login Class Method 中設定的方法。

/etc/profile 且/或 /etc/csh.login shell 啟動檔案中增加下列兩個環境變數,如此方能加入 locale name 與 MIME 字集。我們以德語為例子:

/etc/profile 中:

    LANG=de_DE.ISO_8859-1; export LANG
    MM_CHARSET=ISO-8859-1; export MM_CHARSET

或是在 /etc/csh.login 中:

    setenv LANG de_DE.ISO_8859-1
    setenv MM_CHARSET ISO-8859-1

Note: de_DE.ISO8859-1 for FreeBSD versions 4.5 and up.

也可以將上述指令加入到 /usr/share/skel/dot.profile (與上述加入到 /etc/profile 的東西相似) 或 /usr/share/skel/dot.login (與上述加入到 /etc/csh.login 的東西相似)。

For X11:

In $HOME/.xinitrc:

    LANG=de_DE.ISO_8859-1; export LANG

Or:

    setenv LANG de_DE.ISO_8859-1

依你的 shell 而定(參照前述)。

Note: de_DE.ISO8859-1 for FreeBSD versions 4.5 and up.

13.3.5. 終端機設定

對所有單一字元集,在 /etc/rc.conf 中針對語言設定正確的終端機字型:

    font8x16=font_name
    font8x14=font_name
    font8x8=font_name

在這邊的 font_name 是來自 /usr/share/syscons/fonts 目錄下,不包含 .fnt 的字尾。

也要確認透過設定 /stand/sysinstall 對單一字元設定了正確的鍵盤對映與螢幕對映。 在 sysinstall 中,選擇 Configure ,然後 Console。 二者選擇一地將下列的加到 /etc/rc.conf 當中:

    scrnmap=screenmap_name
    keymap=keymap_name
    keychange="fkey_number sequence"

這邊的 screenmap_name 是來自 /usr/share/syscons/scrnmaps 目錄而且沒有 .scm 的字尾。 一個有相同對映字型的螢幕對映通常會被用來當作一張 VGA顯示卡的字型陣列在先置圖形處理區域的修正, 這個修正適用來將位元8擴充至位元9,換言之, 當螢幕字型使用一個位元8欄位時,將字移出這個區域。

當你將滑鼠程式啟動藉由以下在 /etc/rc.conf 中的設定:

    moused_enable="YES"

然後檢查滑鼠游標資訊在下一段文章。

預設驅動的滑鼠游標會佔領0xd0-0xd3範圍在字元組當中。 如果你的語言使用到這個範圍,你需要將游標範圍避開它。 為了修正FreeBSD 5.0以前版本將下列這行放到你的 kernel config當中:

    options		SC_MOUSE_CHAR=0x03

對FreeBSD 4.4以上版本請將下列這行放到 /etc/rc.conf

    mousechar_start=3

這裡的 keymap_name 是從 /usr/share/syscons/keymaps 的目錄中取出的, 去掉.kbd副檔名。 如果你不確定使用哪個鍵盤對映,使用 kbdmap(1) 來測試鍵盤對映而不需重開機。

當遇到定義功能鍵來符合被選中的終端機型態的時候, 變換鍵是需要的,因為功能鍵的連續號無法由鍵盤對映表來定義。

並且請確定在 /etc/ttys 有為所有的 ttyv* 進入點設定正確的終端型態。目前有先定義的對映如下:

Character SetTerminal Type
ISO-8859-1 or ISO-8859-15cons25l1
ISO-8859-2cons25l2
ISO-8859-7cons25l7
KOI8-Rcons25r
KOI8-Ucons25u
CP437 (VGA default)cons25
US-ASCIIcons25w

對於寬字元或多位元組字元的語言,使用在 /usr/ports/language 目錄中正確的FreeBSD port。 有些port會像是console當系統將它當成是serial vtty's, 因此你必須保留足夠的vtty's給X11跟pseudo-serial console。 這裡有部分在console中使用其他語言的應用程式的名單:

LanguageLocation
Traditional Chinese (BIG-5)chinese/big5con
Japanesejapanese/ja-kon2-* or japanese/Mule_Wnn
Koreankorean/ko-han

13.3.6. X11 Setup

雖然X11並不是 FreeBSD project 的一部份,我們也為了 FreeBSD 的使用者含括了一些資料進去。更詳細的說,參考 XFree86 web site 或是任何一個你所看的的 X11 Server。

~/.Xresources 這個目錄下, 你可以同時地對某些特定的 i18n 的設定值做一些調整 (例如:字型、選單、等等。)。

13.3.6.1. Displaying Fonts

安裝 X11 的 True Type-Common server(XTT-common) 並且安裝語言的 truetype 的字型。設定正確的 locale 將允許你在選單及其他地方看到你所選的語言。

13.3.6.2. Inputting Non-English Characters

X11輸入的方式(XIM)協定是一種對所有 X11 clients 的新的標準。 所有的 X11 的應用程式都應該以採用 XIM Input servers 做輸入的 XIM clients 所寫成。有數種的 XIM servers 提供不同的語言的需求。

13.3.7. Printer Setup

一些獨特的 C 的字元集通常利用硬體編碼到印表機中。 寬或是多位元集需要特別的設定並且我們建議使用 apsfilter。 你也可以使用語言特定的轉換器來把這些文件轉成 Postscript 或 PDF 的格式。

13.3.8. Kernel 和檔案系統

FreeBSD 的 FFS 是完整的 8-bit 檔案系統,所以它可以被使用在任何單獨的 C 字元集中(參考 multibyte(3)), 但是沒有一個字元集名單被儲存在檔案系統中; 假設,它是原始的 8-bit 並且不知道任何有關編碼順序的事情。 正式來說,FFS 還沒支援任何的寬或是多位元集的形式。 然而一些寬或是多位元集有為 FFS 所做的獨立的 patches 使其能夠支援。 它們只是暫存的不可移植的解決方法或是 hacks 並且我們已經決定不在 source tree 中包含這些東西。 參考個別語言的站台以得到更多的資料和 patch 的檔案。

FreeBSD 的 MS-DOS 檔案系統有在 MS-DOS、Unicode 字元集和挑選的 FreeBSD檔案系統中更改格式的能力。參考 mount_msdos(8) 得到更詳盡的資料。