summaryrefslogtreecommitdiffstats
path: root/library/msgcat/msgcat.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'library/msgcat/msgcat.tcl')
-rw-r--r--library/msgcat/msgcat.tcl177
1 files changed, 177 insertions, 0 deletions
diff --git a/library/msgcat/msgcat.tcl b/library/msgcat/msgcat.tcl
new file mode 100644
index 0000000..37676da
--- /dev/null
+++ b/library/msgcat/msgcat.tcl
@@ -0,0 +1,177 @@
+# msgcat.tcl --
+#
+# This file defines various procedures which implement a
+# message catalog facility for Tcl programs. It should be
+# loaded with the command "package require msgcat".
+#
+# Copyright (c) 1998 by Scriptics Corporation.
+# Copyright (c) 1998 by Mark Harrison.
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# RCS: @(#) $Id: msgcat.tcl,v 1.2 1999/04/16 00:47:17 stanton Exp $
+
+package provide msgcat 1.0
+
+namespace eval msgcat {
+ namespace export mc mcset mclocale mcpreferences mcunknown
+
+ # Records the current locale as passed to mclocale
+ variable locale ""
+
+ # Records the list of locales to search
+ variable loclist {}
+
+ # Records the mapping between source strings and translated strings. The
+ # array key is of the form "<locale>,<namespace>,<src>" and the value is
+ # the translated string.
+ array set msgs {}
+}
+
+# msgcat::mc --
+#
+# Find the translation for the given string based on the current
+# locale setting.
+#
+# Arguments:
+# src The string to translate.
+#
+# Results:
+# Returns the translatd string.
+
+proc msgcat::mc {src} {
+ set ns [uplevel {namespace current}]
+ foreach loc $::msgcat::loclist {
+ if {[info exists ::msgcat::msgs($loc,$ns,$src)]} {
+ return $::msgcat::msgs($loc,$ns,$src)
+ }
+ }
+ # we have not found the translation
+ return [uplevel 1 [list [namespace origin mcunknown] \
+ $::msgcat::locale $src]]
+}
+
+# msgcat::mclocale --
+#
+# Query or set the current locale.
+#
+# Arguments:
+# newLocale (Optional) The new locale string. Locale strings
+# should be composed of one or more sublocale parts
+# separated by underscores (e.g. en_US).
+#
+# Results:
+# Returns the current locale.
+
+proc msgcat::mclocale {args} {
+ set len [llength $args]
+
+ if {$len > 1} {
+ error {wrong # args: should be "mclocale ?newLocale?"}
+ }
+
+ set args [string tolower $args]
+ if {$len == 1} {
+ set ::msgcat::locale $args
+ set ::msgcat::loclist {}
+ set word ""
+ foreach part [split $args _] {
+ set word [string trimleft "${word}_${part}" _]
+ set ::msgcat::loclist \
+ [linsert $::msgcat::loclist 0 $word]
+ }
+ }
+ return $::msgcat::locale
+}
+
+# msgcat::mcpreferences --
+#
+# Fetch the list of locales used to look up strings, ordered from
+# most preferred to least preferred.
+#
+# Arguments:
+# None.
+#
+# Results:
+# Returns an ordered list of the locales preferred by the user.
+
+proc msgcat::mcpreferences {} {
+ return $::msgcat::loclist
+}
+
+# msgcat::mcload --
+#
+# Attempt to load message catalogs for each locale in the
+# preference list from the specified directory.
+#
+# Arguments:
+# langdir The directory to search.
+#
+# Results:
+# Returns the number of message catalogs that were loaded.
+
+proc msgcat::mcload {langdir} {
+ set x 0
+ foreach p [::msgcat::mcpreferences] {
+ set langfile [file join $langdir $p.msg]
+ if {[file exists $langfile]} {
+ incr x
+ uplevel [list source $langfile]
+ }
+ }
+ return $x
+}
+
+# msgcat::mcset --
+#
+# Set the translation for a given string in a specified locale.
+#
+# Arguments:
+# locale The locale to use.
+# src The source string.
+# dest (Optional) The translated string. If omitted,
+# the source string is used.
+#
+# Results:
+# Returns the new locale.
+
+proc msgcat::mcset {locale src {dest ""}} {
+ if {$dest == ""} {
+ set dest $src
+ }
+
+ set ns [uplevel {namespace current}]
+
+ set ::msgcat::msgs([string tolower $locale],$ns,$src) $dest
+ return $dest
+}
+
+# msgcat::mcunknown --
+#
+# This routine is called by msgcat::mc if a translation cannot
+# be found for a string. This routine is intended to be replaced
+# by an application specific routine for error reporting
+# purposes. The default behavior is to return the source string.
+#
+# Arguments:
+# locale The current locale.
+# src The string to be translated.
+#
+# Results:
+# Returns the translated value.
+
+proc msgcat::mcunknown {locale src} {
+ return $src
+}
+
+# Initialize the default locale
+
+namespace eval msgcat {
+ # set default locale, try to get from environment
+ if {[info exists ::env(LANG)]} {
+ mclocale $::env(LANG)
+ } else {
+ mclocale "C"
+ }
+}