对任何应用和包使用消息目录都是可选的,但是鼓励你使用它,以便应用或包在多语言环境中被采用。
::msgcat::mc 是用来本地化一个应用的主要函数。不再直接的使用英文字符串,一个应用可以把英文字符串传递给 ::msgcat::mc 并使用它的结果。如果以这种方式用一种语言写了一个应用,通过简单的定义新的消息目录条目,以后增加附加的语言支持是很容易的。
区域定义缺省为装载 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 Korea |
ko_KR |
Spanish |
Spain |
es_ES |
Swedish |
Sweden |
sv_SE |
例如,执行代码
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!"
# load language files, stored in msgs subdirectory ::msgcat::mcload [file join [file dirname [info script]] msgs]
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 中使用定位参数来提取国际化字符串中的值。
Copyright © 1998 Mark Harrison. Copyright © 1995-1997 Roger E. Critchlow Jr.
译注:部分句子写的莫名其妙,余加以意译。