msgcat(3tcl) | Tcl Built-In Commands | msgcat(3tcl) |
msgcat - Tcl 訊息目錄
package require Tcl 8.2
package require msgcat 1.1
::msgcat::mc src-string
::msgcat::mclocale ?newLocale?
::msgcat::mcpreferences
::msgcat::mcload dirname
::msgcat::mcset locale src-string ?translate-string?
::msgcat::mcunknown locale src-string
msgcat 包提供用來管理多語言的使用者介面的一系列函式。在獨立於應用的一個“訊息目錄”中定義文字串,可以編輯和修改這些文字串而不用修改應用的原始碼。透過向這個訊息目錄增加一個新檔案來提供一個新語言或地域(locale)。
對任何應用和包使用訊息目錄都是可選的,但是鼓勵你使用它,以便應用或包在多語言環境中被採用。
為了翻譯 src-string ::msgcat::mc 將在當前名字空間中查詢定義的訊息;如果未找到,它將在當前的名字空間的父空間中查詢,以此類推直到到達全域性名字空間。如果不存在轉換字串,呼叫 ::msgcat::mcunknown 並返回 ::msgcat::mcunknown 的返回。
::msgcat::mc 是用來本地化一個應用的主要函式。不再直接的使用英文字串,一個應用可以把英文字串傳遞給 ::msgcat::mc 並使用它的結果。如果以這種方式用一種語言寫了一個應用,透過簡單的定義新的訊息目錄條目,以後增加附加的語言支援是很容易的。
用地域字串指定地域。地域字串的組成是一個語言程式碼,一個可選的國家(地區)程式碼,一個可選的特定於系統程式碼,它們用“_”分割。國家和語言程式碼在標準ISO-639 和 ISO-3166 中。例如,地域“en”指定 English 而“en_US”指定 U.S. English。
區域定義預設為裝載 msgcat 包時在 env(LANG) 中的值。如果未定義 env(LANG),則地域預設為“C”。
在使用者指定一個地域的時候,在字串翻譯期間進行“最佳匹配”查詢。例如,如果使用者指定了 en_UK_Funky,按“en_UK_Funky”、“en_UK”、和“en” 的次序查詢地域,直到找到一個匹配的字串翻譯。如果沒有找到這個字串的翻譯,則呼叫 ::msgcat::unknown。
譯註:常用地域字串的一部分
語言 國家(地區) 地域 ID Arabic Saudi Arabia ar_SA Chinese (Simplified) China zh_CN Chinese (Traditional) Taiwan zh_TW English United States en_US French France fr_FR German Germany de_DE Hebrew Israel iw_IL Italian Italy it_IT Japanese Japan ja_JP Korean South Koreako_KR Spanish Spain es_ES Swedish Sweden sv_SE
在訊息目錄中儲存的字串被儲存為相對於在其中增加它們的那個名字空間。這允許多個包使用相同的字串而不用害怕與其他包衝突。它還允許源字串被縮寫而減少(less prone to)排字錯誤。
例如,執行程式碼
mcset en hello "hello from ::" namespace eval foo {mcset en hello "hello from ::foo"} puts [mc hello] namespace eval foo {puts [mc hello]}
hello from :: hello from ::foo
在查詢一個訊息的翻譯的時候,訊息目錄將首先查詢當前名字空間,接著是當前名字空間的父名字空間,以次類推知道到達全域性名字空間。這允許子名字空間從它的父名字空間“繼承”訊息。
例如,執行程式碼
mcset en m1 ":: message1" mcset en m2 ":: message2" mcset en m3 ":: message3" namespace eval ::foo {
mcset en m2 "::foo message2"
mcset en m3 "::foo message3" } namespace eval ::foo::bar {
mcset en m3 "::foo::bar message3" } puts "[mc m1]; [mc m2]; [mc m3]" namespace eval ::foo {puts "[mc m1]; [mc m2]; [mc m3]"} namespace eval ::foo::bar {puts "[mc m1]; [mc m2]; [mc m3]"}
:: message1; :: message2; :: message3 :: message1; ::foo message2; ::foo message3 :: message1; ::foo message2; ::foo::bar message3
訊息檔案可以位於任何目錄中,取決於下列條件:
es.msg -- spanish en_UK.msg -- UK English
::msgcat::mcset es "Free Beer!" "Cerveza Gracias!"
如果一個包被安裝到tcl_pkgPath 的一個子目錄中並透過 package require 裝載,推薦下列過程。
# load language files, stored in msgs subdirectory ::msgcat::mcload [file join [file dirname [info script]] msgs]
用做給 format 的引數的一個訊息字串中的轉換指定符可以包含一個 XPG3 位置指定符。例如,它可以按句法的需要在翻譯的時候重新安排句子結構。
format "We produced %d units in location %s" $num $city format "In location %s we produced %d units" $city $num
可使用定位引數來處理:
format "We produced %1\$d units in location %2\$s" $num $city format "In location %2\$s we produced %1\$d units" $num $city
類似的,可以在 scan 中使用定位引數來提取國際化字串中的值。
訊息目錄程式碼由 Mark Harrison 開發。
format(n), scan(n), namespace(n), package(n)
internationalization, i18n, localization, l10n, message, text, translation
寒蟬退士
譯註:部分句子寫的莫名其妙,餘加以意譯。
2001/10/12
http://cmpp.linuxforum.net
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
8.1 | Tcl |