summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroehhar <harald.oehlmann@elmicron.de>2012-09-07 15:32:15 (GMT)
committeroehhar <harald.oehlmann@elmicron.de>2012-09-07 15:32:15 (GMT)
commitec48c37cfcfbbd45233696741ce5c7b44b8e43bf (patch)
tree2f6f043866e7af65c844fc0ccbc7cc4f63458e90
parent43f16074cb838b5bb19f3504fc9e6c66458fbdf9 (diff)
downloadtcl-ec48c37cfcfbbd45233696741ce5c7b44b8e43bf.zip
tcl-ec48c37cfcfbbd45233696741ce5c7b44b8e43bf.tar.gz
tcl-ec48c37cfcfbbd45233696741ce5c7b44b8e43bf.tar.bz2
Reentrant mcfl(m)set command, test, document mcflset as recommended for message files
-rw-r--r--doc/msgcat.n12
-rw-r--r--library/msgcat/msgcat.tcl12
-rw-r--r--tests/msgcat.test44
3 files changed, 56 insertions, 12 deletions
diff --git a/doc/msgcat.n b/doc/msgcat.n
index d65563a..af6be7f 100644
--- a/doc/msgcat.n
+++ b/doc/msgcat.n
@@ -139,7 +139,7 @@ returns the number of translations set.
.TP
\fB::msgcat::mcflset \fIsrc-string \fR?\fItranslate-string\fR?
.VS "TIP 404"
-Sets the translation for \fIsrc-string\fR to \fItranslate-string\fR in the the
+Sets the translation for \fIsrc-string\fR to \fItranslate-string\fR in the
current namespace for the locale implied by the name of the message catalog
being loaded via \fB::msgcat::mcload\fR. If \fItranslate-string\fR is not
specified, \fIsrc-string\fR is used for both. The function returns
@@ -153,8 +153,8 @@ the current namespace for the locale implied by the name of the message
catalog being loaded via \fB::msgcat::mcload\fR. \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?}
-\fB::msgcat::mcmset\fR can be significantly faster than multiple invocations
-of \fB::msgcat::mcset\fR. The function returns the number of translations set.
+\fB::msgcat::mcflmset\fR can be significantly faster than multiple invocations
+of \fB::msgcat::mcflset\fR. The function returns the number of translations set.
.VE "TIP 404"
.TP
\fB::msgcat::mcunknown \fIlocale src-string\fR
@@ -312,15 +312,15 @@ cause peculiar behavior, such as marking the message file as
.QW hidden
on Unix file systems.
.IP [3]
-The file contains a series of calls to \fBmcset\fR and
-\fBmcmset\fR, setting the necessary translation strings
+The file contains a series of calls to \fBmcflset\fR and
+\fBmcflmset\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:
.PP
.CS
namespace eval ::mypackage {
- \fB::msgcat::mcset\fR es "Free Beer!" "Cerveza Gracias!"
+ \fB::msgcat::mcflset\fR "Free Beer!" "Cerveza Gracias!"
}
.CE
.SH "RECOMMENDED MESSAGE SETUP FOR PACKAGES"
diff --git a/library/msgcat/msgcat.tcl b/library/msgcat/msgcat.tcl
index 6dd44d2..112507a 100644
--- a/library/msgcat/msgcat.tcl
+++ b/library/msgcat/msgcat.tcl
@@ -25,10 +25,7 @@ namespace eval msgcat {
# Records the list of locales to search
variable Loclist {}
- # Records the locale of the currently sourced message catalogue file; this
- # would be problematic if anyone were to recursively load a message
- # catalog for a different locale from inside a catalog, but that's not a
- # case that we really need to worry about.
+ # Records the locale of the currently sourced message catalogue file
variable FileLocale
# Records the mapping between source strings and translated strings. The
@@ -284,6 +281,10 @@ proc msgcat::mcpreferences {} {
proc msgcat::mcload {langdir} {
variable FileLocale
+ # Save the file locale if we are recursively called
+ if {[info exists FileLocale]} {
+ set nestedFileLocale $FileLocale
+ }
set x 0
foreach p [mcpreferences] {
if { $p eq {} } {
@@ -300,6 +301,9 @@ proc msgcat::mcload {langdir} {
unset FileLocale
}
}
+ if {[info exists nestedFileLocale]} {
+ set FileLocale $nestedFileLocale
+ }
return $x
}
diff --git a/tests/msgcat.test b/tests/msgcat.test
index bbcd023..d75bf8e 100644
--- a/tests/msgcat.test
+++ b/tests/msgcat.test
@@ -17,8 +17,8 @@ if {[catch {package require tcltest 2}]} {
puts stderr "Skipping tests in [info script]. tcltest 2 required."
return
}
-if {[catch {package require msgcat 1.4.5}]} {
- puts stderr "Skipping tests in [info script]. No msgcat 1.4.5 found to test."
+if {[catch {package require msgcat 1.5.0}]} {
+ puts stderr "Skipping tests in [info script]. No msgcat 1.5.0 found to test."
return
}
@@ -611,6 +611,46 @@ namespace eval ::msgcat::test {
mc "this is a %s" "good test"
} -result "this is a good test"
+ # Tests msgcat-8.*: [mcflset]
+
+ set msgdir1 [makeDirectory msgdir1]
+ makeFile {::msgcat::mcflset k1 v1} l1.msg $msgdir1
+
+ test msgcat-8.1 {mcflset} -setup {
+ variable locale [mclocale]
+ mclocale l1
+ mcload $msgdir1
+ } -cleanup {
+ mclocale $locale
+ } -body {
+ mc k1
+ } -result v1
+
+ removeFile l1.msg $msgdir1
+ removeDirectory msgdir1
+
+ set msgdir2 [makeDirectory msgdir2]
+ set msgdir3 [makeDirectory msgdir3]
+ makeFile "::msgcat::mcflset k2 v2 ; ::msgcat::mcload [list $msgdir3]"\
+ l2.msg $msgdir2
+ makeFile {::msgcat::mcflset k3 v3} l2.msg $msgdir3
+
+ # chained mcload
+ test msgcat-8.2 {mcflset} -setup {
+ variable locale [mclocale]
+ mclocale l2
+ mcload $msgdir2
+ } -cleanup {
+ mclocale $locale
+ } -body {
+ return [mc k2][mc k3]
+ } -result v2v3
+
+ removeFile l2.msg $msgdir2
+ removeDirectory msgdir2
+ removeFile l3.msg $msgdir3
+ removeDirectory msgdir3
+
cleanupTests
}
namespace delete ::msgcat::test