Diff
Not logged in

Differences From Artifact [0e4535e927]:

To Artifact [967fb91de2]:


11
12
13
14
15
16
17
18

19
20
21
22
23
24
25
11
12
13
14
15
16
17

18
19
20
21
22
23
24
25







-
+







.BS
'\" Note:  do not modify the .SH NAME line immediately below!
.SH NAME
msgcat \- Tcl message catalog
.SH SYNOPSIS
\fBpackage require Tcl 8.2\fR
.sp
\fBpackage require msgcat 1.2\fR
\fBpackage require msgcat 1.3\fR
.sp
\fB::msgcat::mc \fIsrc-string\fR ?\fIarg arg ...\fR?
.sp
\fB::msgcat::mcmax ?\fIsrc-string src-string ...\fR?
.sp
\fB::msgcat::mclocale \fR?\fInewLocale\fR?
.sp
76
77
78
79
80
81
82
83
84
85




86
87
88
89
90
91
92
93





94
95
96
97
98
99







100
101
102
103
104
105
106



107
108
109
110


111
112
113

114
115
116
117
118
119
120
121
122
123
124
125
126
127
128

129
130


131
132
133
134
135
136


137
138
139
140
141
















142
143


144
145
146
147
148
149
150
76
77
78
79
80
81
82



83
84
85
86
87
88
89
90
91
92


93
94
95
96
97
98
99
100



101
102
103
104
105
106
107
108
109
110
111



112
113
114
115
116
117

118
119
120
121

122
123
124
125
126
127
128
129
130
131
132
133
134
135
136

137
138

139
140
141
142
143
144


145
146
147




148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163


164
165
166
167
168
169
170
171
172







-
-
-
+
+
+
+






-
-
+
+
+
+
+



-
-
-
+
+
+
+
+
+
+




-
-
-
+
+
+



-
+
+


-
+














-
+

-
+
+




-
-
+
+

-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+







of the longest translated string.  This is useful when designing
localized GUI's, which may require that all buttons, for example, be a
fixed width (which will be the width of the widest button).
.TP
\fB::msgcat::mclocale \fR?\fInewLocale\fR?  
This function sets the locale to \fInewLocale\fR.  If \fInewLocale\fR
is omitted, the current locale is returned, otherwise the current locale
is set to \fInewLocale\fR.
The initial locale defaults to the locale specified in
the user's environment.  See \fBLOCALE AND SUBLOCALE SPECIFICATION\fR
is set to \fInewLocale\fR.  msgcat stores and compares the locale in a
case-insensitive manner, and returns locales in lowercase.
The initial locale is determined by the locale specified in
the user's environment.  See \fBLOCALE SPECIFICATION\fR
below for a description of the locale string format.
.TP
\fB::msgcat::mcpreferences\fR
Returns an ordered list of the locales preferred by
the user, based on the user's language specification.
The list is ordered from most specific to least
preference.  If the user has specified LANG=en_US_funky,
this procedure would return {en_US_funky en_US en}.
preference.  The list is derived from the current
locale set in msgcat by \fBmsgcat::mclocale\fR, and
cannot be set independently.  For example, if the
current locale is en_US_funky, then \fBmsgcat::mcpreferences\fR
returns {en_US_funky en_US en}.
.TP
\fB::msgcat::mcload \fIdirname\fR
Searches the specified directory for files that match
the language specifications returned by \fB::msgcat::mcpreferences\fR.
Each file located is sourced.  The file extension is ``.msg''.
The number of message files which matched the specification
the language specifications returned by \fB::msgcat::mcpreferences\fR,
extended by the file extension ``.msg''.  Each matching file is 
read in order, assuming a UTF-8 encoding.  The file contents are
then evaluated as a Tcl script.  This means that non-Latin characters
may be present in the message file either directly in their UTF-8
encoded form, or by use of the backslash-u quoting recognized by Tcl
evaluation.  The number of message files which matched the specification
and were loaded is returned.
.TP
\fB::msgcat::mcset \fIlocale src-string \fR?\fItranslate-string\fR?
Sets the translation for \fIsrc-string\fR to \fItranslate-string\fR
in the specified \fIlocale\fR.  If \fItranslate-string\fR is not
specified, \fIsrc-string\fR is used for both.  The function
returns \fItranslate-string\fR.
in the specified \fIlocale\fR and the current namespace.  If
\fItranslate-string\fR is not specified, \fIsrc-string\fR is used
for both.  The function returns \fItranslate-string\fR.
.TP
\fB::msgcat::mcmset \fIlocale src-trans-list\fR
Sets the translation for multiple source strings in
\fIsrc-trans-list\fR in the specified \fIlocale\fR.
\fIsrc-trans-list\fR in the specified \fIlocale\fR and the current
namespace.
\fIsrc-trans-list\fR must have an even number of elements and is in
the form {\fIsrc-string translate-string\fR ?\fIsrc-string
translate-string ...\fR?} \fBmcsetcat::mcmset\fR can be significantly
translate-string ...\fR?} \fBmsgcat::mcmset\fR can be significantly
faster than multiple invocations of \fBmsgcat::mcset\fR. The function
returns the number of translations set.
.TP
\fB::msgcat::mcunknown \fIlocale src-string\fR
This routine is called by \fB::msgcat::mc\fR in the case when
a translation for \fIsrc-string\fR is not defined in the
current locale.  The default action is to return
\fIsrc-string\fR.  This procedure can be redefined by the
application, for example to log error messages for each unknown
string.  The \fB::msgcat::mcunknown\fR procedure is invoked at the
same stack context as the call to \fB::msgcat::mc\fR.  The return vaue
of \fB::msgcat::mcunknown\fR is used as the return vaue for the call
to \fB::msgcat::mc\fR.  

.SH "LOCALE AND SUBLOCALE SPECIFICATION"
.SH "LOCALE SPECIFICATION"
.PP
The locale is specified by a locale string.
The locale is specified to \fBmsgcat\fR by a locale string
passed to \fB::msgcat::mclocale\fR.
The locale string consists of
a language code, an optional country code, and an optional
system-specific code, each separated by ``_''.  The country and language
codes are specified in standards ISO-639 and ISO-3166.
For example, the locale ``en'' specifies English and
 ``en_US'' specifes  U.S. English.
For example, the locale ``en'' specifies English and ``en_US'' specifies
U.S. English.
.PP
The locale defaults to the value in \fBenv(LANG)\fR at the time the
\fBmsgcat\fR package is loaded.  On Windows, if \fBenv(LANG)\fR is not
set, the package will attempt to extract locale information from the
registry.  If it cannot find this information in the registry, or on
When the msgcat package is first loaded, the locale is initialized
according to the user's environment.  The variables \fBenv(LC_ALL)\fR,
\fBenv(LC_MESSAGES)\fR, and \fBenv(LANG)\fR are examined in order.
The first of them to have a non-empty value is used to determine the
initial locale.  The value is parsed according to the XPG4 pattern
.CS
language[_country][.codeset][@modifier]
.CE
to extract its parts.  The initial locale is then set by calling
\fBmsgcat::mclocale\fR with the argument 
.CS
language[_country][_modifier]
.CE
On Windows, if none of those environment variables is set, msgcat will
attempt to extract locale information from the
registry.  If all these attempts to discover an initial locale
non-Windows platforms when \fBenv(LANG)\fR is not defined, the
locale defaults to ``C''.
from the user's environment fail, msgcat defaults to an initial
locale of ``C''.
.PP
When a locale is specified by the user, a ``best match'' search is
performed during string translation.  For example, if a user specifies
en_UK_Funky, the locales ``en_UK_Funky'', ``en_UK'', and ``en'' are
searched in order until a matching translation string is found.  If no
translation string is available, then \fB::msgcat::unknown\fR is
called.
173
174
175
176
177
178
179
180

181
182
183
184
185
186
187
195
196
197
198
199
200
201

202
203
204
205
206
207
208
209







-
+







.PP
When searching for a translation of a message, the
message catalog will search first the current namespace,
then the parent of the current namespace, and so on until
the global namespace is reached.  This allows child namespaces
to "inherit" messages from their parent namespace.
.PP
For example, executing the code
For example, executing (in the ``en'' locale) the code 
.CS
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"
210
211
212
213
214
215
216
217
218





219

220


221
222
223
224
225
226
227
232
233
234
235
236
237
238


239
240
241
242
243
244
245

246
247
248
249
250
251
252
253
254







-
-
+
+
+
+
+

+
-
+
+







The message file name is a locale specifier followed
by ``.msg''.  For example:
.CS
es.msg    -- spanish
en_UK.msg -- UK English
.CE
.IP [3]
The file contains a series of calls to mcset, setting the
necessary translation strings for the language. For example:
The file contains a series of calls to \fBmcset\fR and
\fBmcmset\fR, setting the necessary translation strings
for the language, likely enclosed in a \fBnamespace eval\fR
so that all source strings are tied to the namespace of
the package. For example, a short \fBes.msg\fR might contain:
.CS
namespace eval ::mypackage {
::msgcat::mcset es "Free Beer!" "Cerveza Gracias!"
    ::msgcat::mcset es "Free Beer!" "Cerveza Gracias!"
}
.CE

.SH "RECOMMENDED MESSAGE SETUP FOR PACKAGES"
.PP
If a package is installed into a subdirectory of the
\fBtcl_pkgPath\fR and loaded via \fBpackage require\fR, the
following procedure is recommended.