msgcat.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:11k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1998 Mark Harrison.
  3. '"
  4. '" See the file "license.terms" for information on usage and redistribution
  5. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  6. '" 
  7. '" SCCS: @(#) msgcat.n
  8. '" 
  9. .so man.macros
  10. .TH "msgcat" n 1.3 msgcat "Tcl Bundled Packages"
  11. .BS
  12. '" Note:  do not modify the .SH NAME line immediately below!
  13. .SH NAME
  14. msgcat - Tcl message catalog
  15. .SH SYNOPSIS
  16. fBpackage require Tcl 8.2fR
  17. .sp
  18. fBpackage require msgcat 1.3.4fR
  19. .sp
  20. fB::msgcat::mc fIsrc-stringfR ?fIarg arg ...fR?
  21. .sp
  22. fB::msgcat::mcmax ?fIsrc-string src-string ...fR?
  23. .sp
  24. fB::msgcat::mclocale fR?fInewLocalefR?
  25. .sp
  26. fB::msgcat::mcpreferencesfR
  27. .sp
  28. fB::msgcat::mcload fIdirnamefR
  29. .sp
  30. fB::msgcat::mcset fIlocale src-string fR?fItranslate-stringfR?
  31. .sp
  32. fB::msgcat::mcmset fIlocale src-trans-listfR
  33. .sp
  34. fB::msgcat::mcunknown fIlocale src-stringfR
  35. .BE
  36. .SH DESCRIPTION
  37. .PP
  38. The fBmsgcatfR package provides a set of functions
  39. that can be used to manage multi-lingual user interfaces.
  40. Text strings are defined in a ``message catalog'' which
  41. is independent from the application, and
  42. which can be edited or localized without modifying
  43. the application source code.  New languages
  44. or locales are provided by adding a new file to
  45. the message catalog.
  46. .PP
  47. Use of the message catalog is optional by any application
  48. or package, but is encouraged if the application or package
  49. wishes to be enabled for multi-lingual applications.
  50. .SH COMMANDS
  51. .TP
  52. fB::msgcat::mc fIsrc-stringfR ?fIarg arg ...fR?
  53. Returns a translation of fIsrc-stringfR according to the
  54. user's current locale.  If additional arguments past fIsrc-stringfR
  55. are given, the fBformatfR command is used to substitute the
  56. additional arguments in the translation of fIsrc-stringfR.
  57. .PP
  58. fB::msgcat::mcfR will search the messages defined
  59. in the current namespace for a translation of fIsrc-stringfR; if
  60. none is found, it will search in the parent of the current namespace,
  61. and so on until it reaches the global namespace.  If no translation
  62. string exists, fB::msgcat::mcunknownfR is called and the string
  63. returned from fB::msgcat::mcunknownfR is returned.
  64. .PP
  65. fB::msgcat::mcfR is the main function used to localize an
  66. application.  Instead of using an English string directly, an
  67. application can pass the English string through fB::msgcat::mcfR and
  68. use the result.  If an application is written for a single language in
  69. this fashion, then it is easy to add support for additional languages
  70. later simply by defining new message catalog entries.
  71. .TP
  72. fB::msgcat::mcmax ?fIsrc-string src-string ...fR?
  73. Given several source strings, fB::msgcat::mcmaxfR returns the length
  74. of the longest translated string.  This is useful when designing
  75. localized GUIs, which may require that all buttons, for example, be a
  76. fixed width (which will be the width of the widest button).
  77. .TP
  78. fB::msgcat::mclocale fR?fInewLocalefR?  
  79. This function sets the locale to fInewLocalefR.  If fInewLocalefR
  80. is omitted, the current locale is returned, otherwise the current locale
  81. is set to fInewLocalefR.  msgcat stores and compares the locale in a
  82. case-insensitive manner, and returns locales in lowercase.
  83. The initial locale is determined by the locale specified in
  84. the user's environment.  See fBLOCALE SPECIFICATIONfR
  85. below for a description of the locale string format.
  86. .TP
  87. fB::msgcat::mcpreferencesfR
  88. Returns an ordered list of the locales preferred by
  89. the user, based on the user's language specification.
  90. The list is ordered from most specific to least
  91. preference.  The list is derived from the current
  92. locale set in msgcat by fB::msgcat::mclocalefR, and
  93. cannot be set independently.  For example, if the
  94. current locale is en_US_funky, then fB::msgcat::mcpreferencesfR
  95. returns fB{en_US_funky en_US en}fR.
  96. .TP
  97. fB::msgcat::mcload fIdirnamefR
  98. Searches the specified directory for files that match
  99. the language specifications returned by fB::msgcat::mcpreferencesfR
  100. (note that these are all lowercase), extended by the file
  101. extension ``.msg''.  Each matching file is 
  102. read in order, assuming a UTF-8 encoding.  The file contents are
  103. then evaluated as a Tcl script.  This means that Unicode characters
  104. may be present in the message file either directly in their UTF-8
  105. encoded form, or by use of the backslash-u quoting recognized by Tcl
  106. evaluation.  The number of message files which matched the specification
  107. and were loaded is returned.
  108. .TP
  109. fB::msgcat::mcset fIlocale src-string fR?fItranslate-stringfR?
  110. Sets the translation for fIsrc-stringfR to fItranslate-stringfR
  111. in the specified fIlocalefR and the current namespace.  If
  112. fItranslate-stringfR is not specified, fIsrc-stringfR is used
  113. for both.  The function returns fItranslate-stringfR.
  114. .TP
  115. fB::msgcat::mcmset fIlocale src-trans-listfR
  116. Sets the translation for multiple source strings in
  117. fIsrc-trans-listfR in the specified fIlocalefR and the current
  118. namespace.
  119. fIsrc-trans-listfR must have an even number of elements and is in
  120. the form {fIsrc-string translate-stringfR ?fIsrc-string
  121. translate-string ...fR?} fB::msgcat::mcmsetfR can be significantly
  122. faster than multiple invocations of fB::msgcat::mcsetfR. The function
  123. returns the number of translations set.
  124. .TP
  125. fB::msgcat::mcunknown fIlocale src-stringfR
  126. This routine is called by fB::msgcat::mcfR in the case when
  127. a translation for fIsrc-stringfR is not defined in the
  128. current locale.  The default action is to return
  129. fIsrc-stringfR.  This procedure can be redefined by the
  130. application, for example to log error messages for each unknown
  131. string.  The fB::msgcat::mcunknownfR procedure is invoked at the
  132. same stack context as the call to fB::msgcat::mcfR.  The return value
  133. of fB::msgcat::mcunknownfR is used as the return value for the call
  134. to fB::msgcat::mcfR.  
  135. .SH "LOCALE SPECIFICATION"
  136. .PP
  137. The locale is specified to fBmsgcatfR by a locale string
  138. passed to fB::msgcat::mclocalefR.
  139. The locale string consists of
  140. a language code, an optional country code, and an optional
  141. system-specific code, each separated by ``_''.  The country and language
  142. codes are specified in standards ISO-639 and ISO-3166.
  143. For example, the locale ``en'' specifies English and ``en_US'' specifies
  144. U.S. English.
  145. .PP
  146. When the msgcat package is first loaded, the locale is initialized
  147. according to the user's environment.  The variables fBenv(LC_ALL)fR,
  148. fBenv(LC_MESSAGES)fR, and fBenv(LANG)fR are examined in order.
  149. The first of them to have a non-empty value is used to determine the
  150. initial locale.  The value is parsed according to the XPG4 pattern
  151. .CS
  152. language[_country][.codeset][@modifier]
  153. .CE
  154. to extract its parts.  The initial locale is then set by calling
  155. fB::msgcat::mclocalefR with the argument 
  156. .CS
  157. language[_country][_modifier]
  158. .CE
  159. On Windows, if none of those environment variables is set, msgcat will
  160. attempt to extract locale information from the
  161. registry.  If all these attempts to discover an initial locale
  162. from the user's environment fail, msgcat defaults to an initial
  163. locale of ``C''.
  164. .PP
  165. When a locale is specified by the user, a ``best match'' search is
  166. performed during string translation.  For example, if a user specifies
  167. en_GB_Funky, the locales ``en_GB_Funky'', ``en_GB'', and ``en'' are
  168. searched in order until a matching translation string is found.  If no
  169. translation string is available, then fB::msgcat::mcunknownfR is
  170. called.
  171. .SH "NAMESPACES AND MESSAGE CATALOGS"
  172. .PP
  173. Strings stored in the message catalog are stored relative
  174. to the namespace from which they were added.  This allows
  175. multiple packages to use the same strings without fear
  176. of collisions with other packages.  It also allows the
  177. source string to be shorter and less prone to typographical
  178. error.
  179. .PP
  180. For example, executing the code
  181. .CS
  182. fB::msgcat::mcsetfR en hello "hello from ::"
  183. namespace eval foo {
  184.    fB::msgcat::mcsetfR en hello "hello from ::foo"
  185. }
  186. puts [fB::msgcat::mcfR hello]
  187. namespace eval foo {puts [fB::msgcat::mcfR hello]}
  188. .CE
  189. will print
  190. .CS
  191. hello from ::
  192. hello from ::foo
  193. .CE
  194. .PP
  195. When searching for a translation of a message, the
  196. message catalog will search first the current namespace,
  197. then the parent of the current namespace, and so on until
  198. the global namespace is reached.  This allows child namespaces
  199. to "inherit" messages from their parent namespace.
  200. .PP
  201. For example, executing (in the ``en'' locale) the code 
  202. .CS
  203. fB::msgcat::mcsetfR en m1 ":: message1"
  204. fB::msgcat::mcsetfR en m2 ":: message2"
  205. fB::msgcat::mcsetfR en m3 ":: message3"
  206. namespace eval ::foo {
  207.    fB::msgcat::mcsetfR en m2 "::foo message2"
  208.    fB::msgcat::mcsetfR en m3 "::foo message3"
  209. }
  210. namespace eval ::foo::bar {
  211.    fB::msgcat::mcsetfR en m3 "::foo::bar message3"
  212. }
  213. namespace import fB::msgcat::mcfR
  214. puts "[fBmcfR m1]; [fBmcfR m2]; [fBmcfR m3]"
  215. namespace eval ::foo {puts "[fBmcfR m1]; [fBmcfR m2]; [fBmcfR m3]"}
  216. namespace eval ::foo::bar {puts "[fBmcfR m1]; [fBmcfR m2]; [fBmcfR m3]"}
  217. .CE
  218. will print
  219. .CS
  220. :: message1; :: message2; :: message3
  221. :: message1; ::foo message2; ::foo message3
  222. :: message1; ::foo message2; ::foo::bar message3
  223. .CE
  224. .SH "LOCATION AND FORMAT OF MESSAGE FILES"
  225. .PP
  226. Message files can be located in any directory, subject
  227. to the following conditions:
  228. .IP [1]
  229. All message files for a package are in the same directory.
  230. .IP [2]
  231. The message file name is a msgcat locale specifier (all lowercase)
  232. followed by ``.msg''.  For example:
  233. .CS
  234. es.msg    -- spanish
  235. en_gb.msg -- United Kingdom English
  236. .CE
  237. .IP [3]
  238. The file contains a series of calls to fBmcsetfR and
  239. fBmcmsetfR, setting the necessary translation strings
  240. for the language, likely enclosed in a fBnamespace evalfR
  241. so that all source strings are tied to the namespace of
  242. the package. For example, a short fBes.msgfR might contain:
  243. .CS
  244. namespace eval ::mypackage {
  245.    fB::msgcat::mcsetfR es "Free Beer!" "Cerveza Gracias!"
  246. }
  247. .CE
  248. .SH "RECOMMENDED MESSAGE SETUP FOR PACKAGES"
  249. .PP
  250. If a package is installed into a subdirectory of the
  251. fBtcl_pkgPathfR and loaded via fBpackage requirefR, the
  252. following procedure is recommended.
  253. .IP [1]
  254. During package installation, create a subdirectory
  255. fBmsgsfR under your package directory.
  256. .IP [2]
  257. Copy your *.msg files into that directory.
  258. .IP [3]
  259.  Add the following command to your package
  260. initialization script:
  261. .CS
  262. # load language files, stored in msgs subdirectory
  263. fB::msgcat::mcloadfR [file join [file dirname [info script]] msgs]
  264. .CE
  265. .SH "POSITIONAL CODES FOR FORMAT AND SCAN COMMANDS"
  266. .PP
  267. It is possible that a message string used as an argument
  268. to fBformatfR might have positionally dependent parameters that
  269. might need to be repositioned.  For example, it might be
  270. syntactically desirable to rearrange the sentence structure
  271. while translating.
  272. .CS
  273. format "We produced %d units in location %s" $num $city
  274. format "In location %s we produced %d units" $city $num
  275. .CE
  276. .PP
  277. This can be handled by using the positional
  278. parameters:
  279. .CS
  280. format "We produced %1\$d units in location %2\$s" $num $city
  281. format "In location %2\$s we produced %1\$d units" $num $city
  282. .CE
  283. .PP
  284. Similarly, positional parameters can be used with fBscanfR to
  285. extract values from internationalized strings.
  286. .SH CREDITS
  287. .PP
  288. The message catalog code was developed by Mark Harrison.
  289. .SH "SEE ALSO"
  290. format(n), scan(n), namespace(n), package(n)
  291. .SH KEYWORDS
  292. internationalization, i18n, localization, l10n, message, text, translation