There is no reason to use the macro-based classes for this array as there are no compatibility constraints here, so use a simple vector instead. Note that we need an extra boolean variable now that we don't use a pointer because we can't just check whether the vector is empty, as this would return in infinite recursion when InitLanguagesDB() calls AddLanguage() which, in turn, calls CreateLanguagesDB().
300 lines
11 KiB
C++
300 lines
11 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/intl.h
|
|
// Purpose: Internationalization and localisation for wxWidgets
|
|
// Author: Vadim Zeitlin
|
|
// Modified by: Michael N. Filippov <michael@idisys.iae.nsk.su>
|
|
// (2003/09/30 - plural forms support)
|
|
// Created: 29/01/98
|
|
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_INTL_H_
|
|
#define _WX_INTL_H_
|
|
|
|
#include "wx/defs.h"
|
|
#include "wx/localedefs.h"
|
|
#include "wx/string.h"
|
|
#include "wx/translation.h"
|
|
|
|
#if wxUSE_INTL
|
|
|
|
#include "wx/fontenc.h"
|
|
#include "wx/language.h"
|
|
|
|
// ============================================================================
|
|
// global decls
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// macros
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// forward decls
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class WXDLLIMPEXP_FWD_BASE wxLocale;
|
|
|
|
// ============================================================================
|
|
// locale support
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxLocale: encapsulates all language dependent settings, including current
|
|
// message catalogs, date, time and currency formats (TODO) &c
|
|
// ----------------------------------------------------------------------------
|
|
|
|
enum wxLocaleInitFlags
|
|
{
|
|
wxLOCALE_DONT_LOAD_DEFAULT = 0x0000, // don't load wxwin.mo
|
|
wxLOCALE_LOAD_DEFAULT = 0x0001 // load wxwin.mo?
|
|
#if WXWIN_COMPATIBILITY_2_8
|
|
,wxLOCALE_CONV_ENCODING = 0x0002 // no longer used, simply remove
|
|
// it from the existing code
|
|
#endif
|
|
};
|
|
|
|
// NOTE: This class is deprecated, use wxUILocale and wxTranslations instead.
|
|
|
|
class WXDLLIMPEXP_BASE wxLocale
|
|
{
|
|
public:
|
|
// ctor & dtor
|
|
// -----------
|
|
|
|
// call Init() if you use this ctor
|
|
wxLocale() { DoCommonInit(); }
|
|
|
|
// the ctor has a side effect of changing current locale
|
|
wxLocale(const wxString& name, // name (for messages)
|
|
const wxString& shortName = wxEmptyString, // dir prefix (for msg files)
|
|
const wxString& locale = wxEmptyString, // locale (for setlocale)
|
|
bool bLoadDefault = true // preload wxstd.mo?
|
|
#if WXWIN_COMPATIBILITY_2_8
|
|
,bool bConvertEncoding = true // convert Win<->Unix if necessary?
|
|
#endif
|
|
)
|
|
{
|
|
DoCommonInit();
|
|
|
|
#if WXWIN_COMPATIBILITY_2_8
|
|
Init(name, shortName, locale, bLoadDefault, bConvertEncoding);
|
|
#else
|
|
Init(name, shortName, locale, bLoadDefault);
|
|
#endif
|
|
}
|
|
|
|
wxLocale(int language, // wxLanguage id or custom language
|
|
int flags = wxLOCALE_LOAD_DEFAULT)
|
|
{
|
|
DoCommonInit();
|
|
|
|
Init(language, flags);
|
|
}
|
|
|
|
// the same as a function (returns true on success)
|
|
bool Init(const wxString& name,
|
|
const wxString& shortName = wxEmptyString,
|
|
const wxString& locale = wxEmptyString,
|
|
bool bLoadDefault = true
|
|
#if WXWIN_COMPATIBILITY_2_8
|
|
,bool bConvertEncoding = true
|
|
#endif
|
|
);
|
|
|
|
// same as second ctor (returns true on success)
|
|
bool Init(int language = wxLANGUAGE_DEFAULT,
|
|
int flags = wxLOCALE_LOAD_DEFAULT);
|
|
|
|
// restores old locale
|
|
virtual ~wxLocale();
|
|
|
|
// Try to get user's (or OS's) preferred language setting.
|
|
// Return wxLANGUAGE_UNKNOWN if language-guessing algorithm failed
|
|
static int GetSystemLanguage();
|
|
|
|
// get the encoding used by default for text on this system, returns
|
|
// wxFONTENCODING_SYSTEM if it couldn't be determined
|
|
static wxFontEncoding GetSystemEncoding();
|
|
|
|
// get the string describing the system encoding, return empty string if
|
|
// couldn't be determined
|
|
static wxString GetSystemEncodingName();
|
|
|
|
// get the values of the given locale-dependent datum: the current locale
|
|
// is used, the US default value is returned if everything else fails
|
|
static wxString GetInfo(wxLocaleInfo index,
|
|
wxLocaleCategory cat = wxLOCALE_CAT_DEFAULT);
|
|
|
|
// Same as GetInfo() but uses current locale at the OS level to retrieve
|
|
// the information. Normally it should be the same as the one used by
|
|
// GetInfo() but there are two exceptions: the most important one is that
|
|
// if no locale had been set, GetInfo() would fall back to "C" locale,
|
|
// while this one uses the default OS locale. Another, more rare, one is
|
|
// that some locales might not supported by the OS.
|
|
//
|
|
// Currently this is the same as GetInfo() under non-MSW platforms.
|
|
static wxString GetOSInfo(wxLocaleInfo index,
|
|
wxLocaleCategory cat = wxLOCALE_CAT_DEFAULT);
|
|
|
|
// return true if the locale was set successfully
|
|
bool IsOk() const { return m_pszOldLocale != NULL; }
|
|
|
|
// returns locale name
|
|
const wxString& GetLocale() const { return m_strLocale; }
|
|
|
|
// return current locale wxLanguage value
|
|
int GetLanguage() const { return m_language; }
|
|
|
|
// return locale name to be passed to setlocale()
|
|
wxString GetSysName() const;
|
|
|
|
// return 'canonical' name, i.e. in the form of xx[_YY], where xx is
|
|
// language code according to ISO 639 and YY is country name
|
|
// as specified by ISO 3166.
|
|
wxString GetCanonicalName() const { return m_strShort; }
|
|
|
|
// add a prefix to the catalog lookup path: the message catalog files will be
|
|
// looked up under prefix/<lang>/LC_MESSAGES, prefix/LC_MESSAGES and prefix
|
|
// (in this order).
|
|
//
|
|
// This only applies to subsequent invocations of AddCatalog()!
|
|
static void AddCatalogLookupPathPrefix(const wxString& prefix)
|
|
{ wxFileTranslationsLoader::AddCatalogLookupPathPrefix(prefix); }
|
|
|
|
// add a catalog: it's searched for in standard places (current directory
|
|
// first, system one after), but the you may prepend additional directories to
|
|
// the search path with AddCatalogLookupPathPrefix().
|
|
//
|
|
// The loaded catalog will be used for message lookup by GetString().
|
|
//
|
|
// Returns 'true' if it was successfully loaded
|
|
bool AddCatalog(const wxString& domain);
|
|
bool AddCatalog(const wxString& domain, wxLanguage msgIdLanguage);
|
|
bool AddCatalog(const wxString& domain,
|
|
wxLanguage msgIdLanguage, const wxString& msgIdCharset);
|
|
|
|
// check if the given locale is provided by OS and C run time
|
|
static bool IsAvailable(int lang);
|
|
|
|
// check if the given catalog is loaded
|
|
bool IsLoaded(const wxString& domain) const;
|
|
|
|
// Retrieve the language info struct for the given language
|
|
//
|
|
// Returns NULL if no info found, pointer must *not* be deleted by caller
|
|
static const wxLanguageInfo *GetLanguageInfo(int lang);
|
|
|
|
// Returns language name in English or empty string if the language
|
|
// is not in database
|
|
static wxString GetLanguageName(int lang);
|
|
|
|
// Returns ISO code ("canonical name") of language or empty string if the
|
|
// language is not in database
|
|
static wxString GetLanguageCanonicalName(int lang);
|
|
|
|
// Find the language for the given locale string which may be either a
|
|
// canonical ISO 2 letter language code ("xx"), a language code followed by
|
|
// the country code ("xx_XX") or a Windows full language name ("Xxxxx...")
|
|
//
|
|
// Returns NULL if no info found, pointer must *not* be deleted by caller
|
|
static const wxLanguageInfo *FindLanguageInfo(const wxString& locale);
|
|
|
|
// Add custom language to the list of known languages.
|
|
// Notes: 1) wxLanguageInfo contains platform-specific data
|
|
// 2) must be called before Init to have effect
|
|
static void AddLanguage(const wxLanguageInfo& info);
|
|
|
|
// retrieve the translation for a string in all loaded domains unless
|
|
// the szDomain parameter is specified (and then only this domain is
|
|
// searched)
|
|
// n - additional parameter for PluralFormsParser
|
|
//
|
|
// return original string if translation is not available
|
|
// (in this case an error message is generated the first time
|
|
// a string is not found; use wxLogNull to suppress it)
|
|
//
|
|
// domains are searched in the last to first order, i.e. catalogs
|
|
// added later override those added before.
|
|
const wxString& GetString(const wxString& origString,
|
|
const wxString& domain = wxEmptyString) const
|
|
{
|
|
return wxGetTranslation(origString, domain);
|
|
}
|
|
// plural form version of the same:
|
|
const wxString& GetString(const wxString& origString,
|
|
const wxString& origString2,
|
|
unsigned n,
|
|
const wxString& domain = wxEmptyString) const
|
|
{
|
|
return wxGetTranslation(origString, origString2, n, domain);
|
|
}
|
|
|
|
// Returns the current short name for the locale
|
|
const wxString& GetName() const { return m_strShort; }
|
|
|
|
// return the contents of .po file header
|
|
wxString GetHeaderValue(const wxString& header,
|
|
const wxString& domain = wxEmptyString) const;
|
|
|
|
// These two methods are for internal use only. First one creates
|
|
// ms_languagesDB if it doesn't already exist, second one destroys
|
|
// it.
|
|
static void CreateLanguagesDB();
|
|
static void DestroyLanguagesDB();
|
|
|
|
private:
|
|
// This method updates the member fields when this locale is actually set
|
|
// as active.
|
|
void DoInit(const wxString& name,
|
|
const wxString& shortName,
|
|
int language);
|
|
|
|
// copy default table of languages from global static array to
|
|
// m_langugagesInfo, called by InitLanguagesDB
|
|
static void InitLanguagesDB();
|
|
|
|
// This method is trivial and just initializes the member fields to default
|
|
// values.
|
|
void DoCommonInit();
|
|
|
|
// After trying to set locale, call this method to give the appropriate
|
|
// error if it couldn't be set (success == false) and to load the
|
|
// translations for the given language, if necessary.
|
|
//
|
|
// The return value is the same as "success" parameter.
|
|
bool DoCommonPostInit(bool success,
|
|
const wxString& name,
|
|
const wxString& shortName,
|
|
bool bLoadDefault);
|
|
|
|
|
|
wxString m_strLocale, // this locale name
|
|
m_strShort; // short name for the locale
|
|
int m_language; // this locale wxLanguage value
|
|
|
|
const char *m_pszOldLocale; // previous locale from setlocale()
|
|
wxLocale *m_pOldLocale; // previous wxLocale
|
|
#ifdef __WIN32__
|
|
wxUint32 m_oldLCID;
|
|
#endif
|
|
|
|
bool m_initialized;
|
|
|
|
wxTranslations m_translations;
|
|
|
|
wxDECLARE_NO_COPY_CLASS(wxLocale);
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// global functions
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// get the current locale object (note that it may be NULL!)
|
|
extern WXDLLIMPEXP_BASE wxLocale* wxGetLocale();
|
|
|
|
#endif // wxUSE_INTL
|
|
|
|
#endif // _WX_INTL_H_
|