]> git.saurik.com Git - wxWidgets.git/commitdiff
Make it possible to tell wxXmlResource which domain to pull
authorRobin Dunn <robin@alldunn.com>
Mon, 21 Aug 2006 18:27:15 +0000 (18:27 +0000)
committerRobin Dunn <robin@alldunn.com>
Mon, 21 Aug 2006 18:27:15 +0000 (18:27 +0000)
translatable strings from.

Make the wxLocale::GetString methods virtual so they can be overridden
in derived classes.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40728 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

13 files changed:
docs/latex/wx/function.tex
docs/latex/wx/xmlres.tex
include/wx/intl.h
include/wx/xrc/xmlres.h
src/xrc/xh_chckl.cpp
src/xrc/xh_choic.cpp
src/xrc/xh_combo.cpp
src/xrc/xh_listb.cpp
src/xrc/xh_odcombo.cpp
src/xrc/xh_radbx.cpp
src/xrc/xmlres.cpp
wxPython/src/_intl.i
wxPython/src/_xmlres.i

index f3565f5b8e3491d05c74c2c3054bbd226c02c6b6..377d434f9678e59b155c7011624d56d6b0753c2e 100644 (file)
@@ -1536,15 +1536,19 @@ This function is deprecated, use \helpref{wxString}{wxstring} class instead.
 
 \membersection{::wxGetTranslation}\label{wxgettranslation}
 
-\func{const char *}{wxGetTranslation}{\param{const char * }{str}}
+\func{const wxChar *}{wxGetTranslation}{\param{const wxChar* }{str},
+  \param{const wxChar* }{domain = NULL}}
 
-\func{const char *}{wxGetTranslation}{\param{const char * }{str}, \param{const char * }{strPlural}, \param{size\_t }{n}}
+\func{const wxChar *}{wxGetTranslation}{\param{const wxChar* }{str}, \param{const wxChar* }{strPlural}, \param{size\_t }{n},
+  \param{const wxChar* }{domain = NULL}}}
 
 This function returns the translation of string {\it str} in the current
 \helpref{locale}{wxlocale}. If the string is not found in any of the loaded
 message catalogs (see \helpref{internationalization overview}{internationalization}), the
 original string is returned. In debug build, an error message is logged -- this
-should help to find the strings which were not yet translated. As this function
+should help to find the strings which were not yet translated.  If
+{\it domain} is specified then only that domain/catalog is searched
+for a matching string.  As this function
 is used very often, an alternative (and also common in Unix world) syntax is
 provided: the \helpref{\_()}{underscore} macro is defined to do the same thing
 as wxGetTranslation.
index 05e6b72dfd666e114b697374d41cf50d452249e9..c4f6b75730f0cf8e6317a1391da0b92fcd0741f7 100644 (file)
@@ -35,7 +35,9 @@ enum wxXmlResourceFlags
 
 \membersection{wxXmlResource::wxXmlResource}\label{wxxmlresourcector}
 
-\func{}{wxXmlResource}{\param{const wxString\& }{filemask}, \param{int }{flags = wxXRC\_USE\_LOCALE}}
+\func{}{wxXmlResource}{\param{const wxString\& }{filemask}, 
+    \param{int }{flags = wxXRC\_USE\_LOCALE},
+    \param{const wxString& }{domain = wxEmptyString}}
 
 Constructor.
 
@@ -46,7 +48,13 @@ load all resource files inside a zip archive.}
 wxXRC\_NO\_SUBCLASSING: subclass property of object nodes will be ignored
 (useful for previews in XRC editors).}
 
-\func{}{wxXmlResource}{\param{int }{flags = wxXRC\_USE\_LOCALE}}
+\docparam{domain}{The name of the gettext catalog to search for
+  translatable strings.  By default all loaded catalogs will be
+  searched.  This provides a way to allow the strings to only come
+  from a specific catalog.}
+
+\func{}{wxXmlResource}{\param{int }{flags = wxXRC\_USE\_LOCALE},
+    \param{const wxString& }{domain = wxEmptyString}}
 
 Constructor.
 
@@ -56,6 +64,11 @@ wxXRC\_NO\_SUBCLASSING: subclass property of object nodes will be ignored
 XRC files from being reloaded from disk in case they have been modified there
 since being last loaded (may slightly speed up loading them).}
 
+\docparam{domain}{The name of the gettext catalog to search for
+  translatable strings.  By default all loaded catalogs will be
+  searched.  This provides a way to allow the strings to only come
+  from a specific catalog.}
+
 
 \membersection{wxXmlResource::\destruct{wxXmlResource}}\label{wxxmlresourcedtor}
 
@@ -254,3 +267,19 @@ This function unloads a resource previously loaded by
 Returns \true if the resource was successfully unloaded and \false if it hasn't
 been found in the list of loaded resources.
 
+
+
+\membersection{wxXmlResource::GetDomain}\label{wxxmlresourcegetdomain}
+
+\func{wxChar*}{GetDomain}{}
+
+Returns the domain (message catalog) that will be used to load
+translatable strings in the XRC.
+
+
+\membersection{wxXmlResource::SetDomain}\label{wxxmlresourcesetdomain}
+
+\func{wxChar*}{SetDomain}{\param{const wxChar* }{domain}}
+
+Sets the domain (message catalog) that will be used to load
+translatable strings in the XRC.
index 3e523ec95f383bd257a9eb8ab192ccb3fe242177..1518905484fde91a14d12efd36218dd2ea661781 100644 (file)
@@ -402,7 +402,7 @@ public:
               int flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING);
 
         // restores old locale
-    ~wxLocale();
+    virtual ~wxLocale();
 
     // Try to get user's (or OS's) preferred language setting.
     // Return wxLANGUAGE_UNKNOWN if language-guessing algorithm failed
@@ -490,13 +490,13 @@ public:
     //
     // domains are searched in the last to first order, i.e. catalogs
     // added later override those added before.
-    const wxChar *GetString(const wxChar *szOrigString,
-                            const wxChar *szDomain = NULL) const;
+    virtual const wxChar *GetString(const wxChar *szOrigString,
+                                    const wxChar *szDomain = NULL) const;
     // plural form version of the same:
-    const wxChar *GetString(const wxChar *szOrigString,
-                            const wxChar *szOrigString2,
-                            size_t n,
-                            const wxChar *szDomain = NULL) const;
+    virtual const wxChar *GetString(const wxChar *szOrigString,
+                                    const wxChar *szOrigString2,
+                                    size_t n,
+                                    const wxChar *szDomain = NULL) const;
 
     // Returns the current short name for the locale
     const wxString& GetName() const { return m_strShort; }
@@ -548,20 +548,20 @@ private:
 extern WXDLLIMPEXP_BASE wxLocale* wxGetLocale();
 
 // get the translation of the string in the current locale
-inline const wxChar *wxGetTranslation(const wxChar *sz)
+inline const wxChar *wxGetTranslation(const wxChar *sz, const wxChar* domain=NULL)
 {
     wxLocale *pLoc = wxGetLocale();
     if (pLoc)
-        return pLoc->GetString(sz);
+        return pLoc->GetString(sz, domain);
     else
         return sz;
 }
 inline const wxChar *wxGetTranslation(const wxChar *sz1, const wxChar *sz2,
-                                      size_t n)
+                                      size_t n, const wxChar* domain=NULL)
 {
     wxLocale *pLoc = wxGetLocale();
     if (pLoc)
-        return pLoc->GetString(sz1, sz2, n);
+        return pLoc->GetString(sz1, sz2, n, domain);
     else
         return n == 1 ? sz1 : sz2;
 }
index 2644c6e86aac62451442f262fbc4f037ea23b6d1..715133b2cbc85e3dd1ee93e1b910ae60d89b4cca 100644 (file)
@@ -104,21 +104,25 @@ public:
     // Constructor.
     // Flags: wxXRC_USE_LOCALE
     //              translatable strings will be translated via _()
+    //              using the given domain if specified
     //        wxXRC_NO_SUBCLASSING
     //              subclass property of object nodes will be ignored
     //              (useful for previews in XRC editors)
     //        wxXRC_NO_RELOADING
     //              don't check the modification time of the XRC files and
     //              reload them if they have changed on disk
-    wxXmlResource(int flags = wxXRC_USE_LOCALE);
+    wxXmlResource(int flags = wxXRC_USE_LOCALE,
+                  const wxString& domain=wxEmptyString);
 
     // Constructor.
     // Flags: wxXRC_USE_LOCALE
     //              translatable strings will be translated via _()
+    //              using the given domain if specified
     //        wxXRC_NO_SUBCLASSING
     //              subclass property of object nodes will be ignored
     //              (useful for previews in XRC editors)
-    wxXmlResource(const wxString& filemask, int flags = wxXRC_USE_LOCALE);
+    wxXmlResource(const wxString& filemask, int flags = wxXRC_USE_LOCALE,
+                  const wxString& domain=wxEmptyString);
 
     // Destructor.
     ~wxXmlResource();
@@ -242,6 +246,10 @@ public:
     // Set flags after construction.
     void SetFlags(int flags) { m_flags = flags; }
 
+    // Get/Set the domain to be passed to the translation functions, defaults to NULL.
+    wxChar* GetDomain() const { return m_domain; }
+    void SetDomain(const wxChar* domain);
+    
 protected:
     // Scans the resources list for unloaded files and loads them. Also reloads
     // files that have been modified since last loading.
@@ -281,6 +289,9 @@ private:
     wxFileSystem& GetCurFileSystem() { return m_curFileSystem; }
 #endif
 
+    // domain to pass to translation functions, if any.
+    wxChar* m_domain;
+    
     friend class wxXmlResourceHandler;
     friend class wxXmlResourceModule;
 
index d3a8257cd3bf9efb69cd2140daac85274fc0b8a4..04fb3b78da154e87db5f5002d51cf743af28edec 100644 (file)
@@ -113,7 +113,7 @@ wxObject *wxCheckListBoxXmlHandler::DoCreateResource()
         // add to the list
         wxString str = GetNodeContent(m_node);
         if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
-            str = wxGetTranslation(str);
+            str = wxGetTranslation(str, m_resource->GetDomain());
         strList.Add(str);
         return NULL;
     }
index c26bf71eea695b6e33abbf4a39a62568dc058b32..04b726e7c05eb14f27eb185ca9536f4d6ee9131b 100644 (file)
@@ -82,7 +82,7 @@ wxObject *wxChoiceXmlHandler::DoCreateResource()
         // add to the list
         wxString str = GetNodeContent(m_node);
         if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
-            str = wxGetTranslation(str);
+            str = wxGetTranslation(str, m_resource->GetDomain());
         strList.Add(str);
 
         return NULL;
index 6950cfc1988bcd7d775532b06c142261c6273a5e..99c037055926eb8a44a5e64a45b0808eeca8ad70 100644 (file)
@@ -87,7 +87,7 @@ wxObject *wxComboBoxXmlHandler::DoCreateResource()
         // add to the list
         wxString str = GetNodeContent(m_node);
         if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
-            str = wxGetTranslation(str);
+            str = wxGetTranslation(str, m_resource->GetDomain());
         strList.Add(str);
 
         return NULL;
index 0deaa03beddd11f762d3b0625a9b71fd64dc8383..a319449d20ccc2e3d87311c7b679d70e49462009 100644 (file)
@@ -88,7 +88,7 @@ wxObject *wxListBoxXmlHandler::DoCreateResource()
         // add to the list
         wxString str = GetNodeContent(m_node);
         if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
-            str = wxGetTranslation(str);
+            str = wxGetTranslation(str, m_resource->GetDomain());
         strList.Add(str);
 
         return NULL;
index f5108204a48aa938ec6f8c55527d796e90036497..8f5d6d27058f7e1c52aae9ea9411a8abe0ceafa4 100644 (file)
@@ -97,7 +97,7 @@ wxObject *wxOwnerDrawnComboBoxXmlHandler::DoCreateResource()
         // add to the list
         wxString str = GetNodeContent(m_node);
         if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
-            str = wxGetTranslation(str);
+            str = wxGetTranslation(str, m_resource->GetDomain());
         strList.Add(str);
 
         return NULL;
index 2b5a066b1dbb3f9f0e5f4169f3c9cb01d744da44..5cf6472c5beb0e0c1363902f7f44646d4cffd29d 100644 (file)
@@ -116,11 +116,11 @@ wxObject *wxRadioBoxXmlHandler::DoCreateResource()
 
         if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
         {
-            str = wxGetTranslation(str);
+            str = wxGetTranslation(str, m_resource->GetDomain());
             if ( !tooltip.empty() )
-                tooltip = wxGetTranslation(tooltip);
+                tooltip = wxGetTranslation(tooltip, m_resource->GetDomain());
             if ( hasHelptext )
-                helptext = wxGetTranslation(helptext);
+                helptext = wxGetTranslation(helptext, m_resource->GetDomain());
         }
 
         labels.push_back(str);
index 20b402dc64453747ebf43519f3255582e3f3c606..9a55df5861ad75861ae723adcd8d64496aa20068 100644 (file)
@@ -65,24 +65,41 @@ wxXmlResource *wxXmlResource::ms_instance = NULL;
     return old;
 }
 
-wxXmlResource::wxXmlResource(int flags)
+wxXmlResource::wxXmlResource(int flags, const wxString& domain)
 {
     m_flags = flags;
     m_version = -1;
+    m_domain = NULL;
+    if (! domain.empty() )
+        SetDomain(domain);
 }
 
-wxXmlResource::wxXmlResource(const wxString& filemask, int flags)
+wxXmlResource::wxXmlResource(const wxString& filemask, int flags, const wxString& domain)
 {
     m_flags = flags;
     m_version = -1;
+    m_domain = NULL;
+    if (! domain.empty() )
+        SetDomain(domain);
     Load(filemask);
 }
 
 wxXmlResource::~wxXmlResource()
 {
+    if (m_domain)
+        free(m_domain);
     ClearHandlers();
 }
 
+void wxXmlResource::SetDomain(const wxChar* domain)
+{
+    if (m_domain)
+        free(m_domain);
+    m_domain = NULL;
+    if (domain && wxStrlen(domain))
+        m_domain = wxStrdup(domain);
+}
+
 
 /* static */
 wxString wxXmlResource::ConvertFileNameToURL(const wxString& filename)
@@ -916,7 +933,7 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate)
         if (translate && parNode &&
             parNode->GetPropVal(wxT("translate"), wxEmptyString) != wxT("0"))
         {
-            return wxGetTranslation(str2);
+            return wxGetTranslation(str2, m_resource->GetDomain());
         }
         else
         {
index 5901e839a58e76377490f092deb2f89b341e6b36..32b102bad91b751f23fa06a01234426fd4b109de 100644 (file)
@@ -461,7 +461,163 @@ public:
 
 };
 
+//---------------------------------------------------------------------------
+
+%{
+class wxPyLocale : public wxLocale
+{
+public:
+    wxPyLocale();
+
+    wxPyLocale(const wxChar *szName,                             // name (for messages)
+             const wxChar *szShort = (const wxChar *) NULL,      // dir prefix (for msg files)
+             const wxChar *szLocale = (const wxChar *) NULL,     // locale (for setlocale)
+             bool bLoadDefault = true,                           // preload wxstd.mo?
+             bool bConvertEncoding = false);                     // convert Win<->Unix if necessary?
+
+    wxPyLocale(int language, // wxLanguage id or custom language
+             int flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING);
+             
+    ~wxPyLocale();
+
+    virtual const wxChar *GetString(const wxChar *szOrigString,
+                                    const wxChar *szDomain = NULL) const;
+    virtual const wxChar *GetString(const wxChar *szOrigString,
+                                    const wxChar *szOrigString2, size_t n,
+                                    const wxChar *szDomain = NULL) const;
+    
+    virtual wxChar *GetSingularString(const wxChar *szOrigString,
+                                      const wxChar *szDomain = NULL) const;
+    virtual wxChar *GetPluralString(const wxChar *szOrigString,
+                                    const wxChar *szOrigString2, size_t n,
+                                    const wxChar *szDomain = NULL) const;
+
+    PYPRIVATE;
+private:
+    DECLARE_NO_COPY_CLASS(wxPyLocale)
+};
+
+wxPyLocale::wxPyLocale() : wxLocale()
+{
+}
+
+wxPyLocale::wxPyLocale(const wxChar *szName,  // name (for messages)
+             const wxChar *szShort,           // dir prefix (for msg files)
+             const wxChar *szLocale,          // locale (for setlocale)
+             bool bLoadDefault,               // preload wxstd.mo?
+             bool bConvertEncoding)           // convert Win<->Unix if necessary?
+             : wxLocale(szName, szShort, szLocale, bLoadDefault, bConvertEncoding)
+{
+}
+
+wxPyLocale::wxPyLocale(int language, // wxLanguage id or custom language
+                       int flags) : wxLocale(language, flags)
+{
+}
+             
+wxPyLocale::~wxPyLocale()
+{
+}
+
+const wxChar *wxPyLocale::GetString(const wxChar *szOrigString,
+                                    const wxChar *szDomain) const 
+{
+    wxChar *str = GetSingularString(szOrigString, szDomain);
+    return (str != NULL) ? str : wxLocale::GetString(szOrigString, szDomain);
+}
+
+const wxChar *wxPyLocale::GetString(const wxChar *szOrigString,
+                                    const wxChar *szOrigString2, size_t n,
+                                    const wxChar *szDomain) const
+{
+    wxChar *str = GetPluralString(szOrigString, szOrigString2, n, szDomain);
+    return (str != NULL) ? str : wxLocale::GetString(szOrigString, szOrigString2, n, szDomain);
+}
+
+wxChar *wxPyLocale::GetSingularString(const wxChar *szOrigString,
+                                      const wxChar *szDomain) const
+{
+    bool found;
+    static wxString str;
+    str = _T("error in translation"); // when the first if condition is true but the second if condition is not we do not want to return the previously queried string.
+    wxPyBlock_t blocked = wxPyBeginBlockThreads();
+    if((found=wxPyCBH_findCallback(m_myInst, "GetSingularString"))) {
+        PyObject* param1 = wx2PyString(szOrigString);
+        PyObject* param2 = wx2PyString(szDomain);
+        PyObject* ret = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(OO)", param1, param2));
+        Py_DECREF(param1);
+        Py_DECREF(param2);
+        if (ret) {
+            str = Py2wxString(ret);
+            Py_DECREF(ret);
+        }
+    }
+    wxPyEndBlockThreads(blocked);
+    return (found ? (wxChar*)str.c_str() : NULL);
+}
 
+wxChar *wxPyLocale::GetPluralString(const wxChar *szOrigString,
+                                    const wxChar *szOrigString2, size_t n,
+                                    const wxChar *szDomain) const
+{
+    bool found;
+    static wxString str;
+    str = _T("error in translation"); // when the first if condition is true but the second if condition is not we do not want to return the previously queried string.
+    wxPyBlock_t blocked = wxPyBeginBlockThreads();
+    if((found=wxPyCBH_findCallback(m_myInst, "GetPluralString"))) {
+        PyObject* param1 = wx2PyString(szOrigString);
+        PyObject* param2 = wx2PyString(szOrigString2);
+        PyObject* param4 = wx2PyString(szDomain);
+        PyObject* ret = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(OOiO)", param1, param2, (int)n, param4));
+        Py_DECREF(param1);
+        Py_DECREF(param2);
+        Py_DECREF(param4);
+        if( ret) {
+            str = Py2wxString(ret);
+            Py_DECREF(ret);
+        }
+    }
+    wxPyEndBlockThreads(blocked);
+    return (found ? (wxChar*)str.c_str() : NULL);
+}
+%}
+
+
+class wxPyLocale : public wxLocale
+{
+public:
+    %pythonAppend wxPyLocale "self._setCallbackInfo(self, PyLocale)"
+
+    // ctor & dtor
+    // -----------
+    %extend {
+        wxPyLocale(int language = -1,
+                   int flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING) {
+            wxPyLocale* loc;
+            if (language == -1)
+                loc = new wxPyLocale();
+            else
+                loc = new wxPyLocale(language, flags);
+            // Python before 2.4 needs to have LC_NUMERIC set to "C" in order
+            // for the floating point conversions and such to work right.
+%#if PY_VERSION_HEX < 0x02040000
+            setlocale(LC_NUMERIC, "C");
+%#endif
+            return loc;
+        }
+    }
+    ~wxPyLocale();
+    
+    void _setCallbackInfo(PyObject* self, PyObject* _class);
+    
+    virtual const wxChar *GetSingularString(const wxChar *szOrigString,
+                                            const wxChar *szDomain = NULL) const;
+    virtual const wxChar *GetPluralString(const wxChar *szOrigString,
+                                          const wxChar *szOrigString2, size_t n,
+                                          const wxChar *szDomain = NULL) const;
+};
+
+//---------------------------------------------------------------------------
 
 // get the current locale object (note that it may be NULL!)
 wxLocale* wxGetLocale();
@@ -469,7 +625,9 @@ wxLocale* wxGetLocale();
 // get the translation of the string in the current locale
 %nokwargs wxGetTranslation;
 wxString wxGetTranslation(const wxString& str);
+wxString wxGetTranslation(const wxString& str, const wxString& domain);
 wxString wxGetTranslation(const wxString& str, const wxString& strPlural, size_t n);
+wxString wxGetTranslation(const wxString& str, const wxString& strPlural, size_t n, const wxString& domain);
 
 //---------------------------------------------------------------------------
 %newgroup
index d313e342ec332b543331a673fe101a306f7ccc9b..87310ca821fcd160a27892acfba9c8b33cc2d63f 100644 (file)
@@ -45,8 +45,10 @@ class wxXmlResource : public wxObject
 {
 public:
 
-    %pythonAppend wxXmlResource(const wxString& filemask, int flags)   "self.InitAllHandlers()"
-    %pythonAppend wxXmlResource(int flags)                             "val.InitAllHandlers()"
+    %pythonAppend wxXmlResource(const wxString& filemask, int flags,
+                  const wxString& domain=wxEmptyString)   "self.InitAllHandlers()"
+    %pythonAppend wxXmlResource(int flags,
+                  const wxString& domain=wxEmptyString)   "val.InitAllHandlers()"
 
     // Ctors.
     // Flags: wxXRC_USE_LOCALE
@@ -54,8 +56,11 @@ public:
     //        wxXRC_NO_SUBCLASSING
     //              subclass property of object nodes will be ignored
     //              (useful for previews in XRC editors)
-    wxXmlResource(const wxString& filemask, int flags = wxXRC_USE_LOCALE);
-    %RenameCtor(EmptyXmlResource,  wxXmlResource(int flags = wxXRC_USE_LOCALE));
+    wxXmlResource(const wxString& filemask, int flags = wxXRC_USE_LOCALE,
+                  const wxString& domain=wxEmptyString);
+    %RenameCtor(EmptyXmlResource,  wxXmlResource(int flags = wxXRC_USE_LOCALE,
+                  const wxString& domain=wxEmptyString));
+    
     ~wxXmlResource();
 
 
@@ -195,6 +200,9 @@ public:
     // Set flags after construction.
     void SetFlags(int flags) { m_flags = flags; }
 
+    // Get/Set the domain to be passed to the translation functions, defaults to NULL.
+    wxString GetDomain() const;
+    void SetDomain(const wxString& domain);
 };
 
 //----------------------------------------------------------------------