Make it possible to tell wxXmlResource which domain to pull

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
This commit is contained in:
Robin Dunn
2006-08-21 18:27:15 +00:00
parent 4e9080bc8e
commit d4a724d407
13 changed files with 260 additions and 33 deletions

View 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