Subject: Reentrant mcfl(m)set command, test, document mcflset as recommended for message files

From: oehhar <[email-masked]>
Date: Fri, 7 Sep 2012 15:32:15 +0000

---
 doc/msgcat.n              | 12 ++++++------
 library/msgcat/msgcat.tcl | 12 ++++++++----
 tests/msgcat.test         | 44 ++++++++++++++++++++++++++++++++++++++++++--
 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
-- 
cgit v0.12