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 |