Arch manual pages

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)。

對任何應用和包使用消息目錄都是可選的,但是鼓勵你使用它,以便應用或包在多語言環境中被採用。

::msgcat::mc src-string ?arg arg ...?
依照用戶的當前地區,返回 src-string 的翻譯(translation)。如果在 src-string 之後給出了附加的參數,使用 format 命令把 src-string 的翻譯中的轉換指定符替換成補充參數。

爲了翻譯 src-string ::msgcat::mc 將在當前名字空間中查找定義的消息;如果未找到,它將在當前的名字空間的父空間中查找,以此類推直到到達全局名字空間。如果不存在轉換字符串,調用 ::msgcat::mcunknown 並返回 ::msgcat::mcunknown 的返回。

::msgcat::mc 是用來本地化一個應用的主要函數。不再直接的使用英文字符串,一個應用可以把英文字符串傳遞給 ::msgcat::mc 並使用它的結果。如果以這種方式用一種語言寫了一個應用,通過簡單的定義新的消息目錄條目,以後增加附加的語言支持是很容易的。

::msgcat::mclocale ?newLocale?
這個函數把地域設置成 newLocale。如果省略了 newLocale,返回當前的地域,否則當前的地域被設置成 newLocale。初始的地域缺省爲在用戶的環境變量中指定的地域。關於地域字符串的格式的詳細描述參見下面的 LOCALE AND SUBLOCALE SPECIFICATION 地域和子地域指定章節。
::msgcat::mcpreferences
返回一個有序的地域列表,它們是基於用戶指定的語言,以用戶喜好程度爲次序。次序是從最偏好到最不喜好的。如果用戶已經指定了LANG=en_US_funky,這個過程將返回{en_US_funky en_US en}。
::msgcat::mcload dirname
在指定的目錄中查找一個文件,這個文件匹配用 ::msgcat::mcpreferences 返回的語言指定。每個文件的根文件名是地域字符串,擴展名是“.msg”。返回匹配的指定和裝載了消息的數目。
::msgcat::mcset locale src-string ?translate-string?
在指定的 locale 中設置從 src-stringtranslate-string 的翻譯。如果未指定 translate-string,對二者都使用 src-string 。函數返回 translate-string
::msgcat::mcunknown locale src-string
在當前的地域中沒有給 src-string 定義的翻譯的情況下,這個例程被 ::msgcat::mc 調用。缺省的動作是返回 src-string。這個過程可以被這個應用重新定義,比如對每個未知字符串記錄錯誤消息日誌。在與 ::msgcat::mc 相同的棧層次上調用 ::msgcat::mcunknown 過程。 ::msgcat::mcunknown 的返回值被用做 ::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

消息文件可以位於任何目錄中,取決於下列條件:
[1]
給一個包的所有消息文件都在相同的目錄中。
[2]
消息文件名跟一個地域指定符並跟隨着“.msg”。例如:
es.msg    -- spanish
en_UK.msg -- UK English
[3]
這個文件包含一系列對 mcset 的調用,它們爲這個語言設置需要的翻譯字符串。例如:
::msgcat::mcset es "Free Beer!" "Cerveza Gracias!"

如果一個包被安裝到tcl_pkgPath 的一個子目錄中並通過 package require 裝載,推薦下列過程。
[1]
在包安裝期間,在你的包目錄下建立一個子目錄msgs
[2]
複製你的 *.msg 文件到這個目錄中。
[3]
在你的包初始化腳本中增加下列命令:
# 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