/////////////////////////////////////////////////////////////////////////////// // Name: wx/uilocale.h // Purpose: wxUILocale class declaration. // Author: Vadim Zeitlin // Created: 2021-07-31 // Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org> // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// #ifndef _WX_UILOCALE_H_ #define _WX_UILOCALE_H_ #include "wx/defs.h" #if wxUSE_INTL #include "wx/datetime.h" #include "wx/localedefs.h" #include "wx/string.h" #include "wx/vector.h" class wxUILocaleImpl; // Flags for wxUILocale::CompareStrings(). enum { wxCompare_CaseSensitive = 0, wxCompare_CaseInsensitive = 1 }; // ---------------------------------------------------------------------------- // wxLocaleIdent: allows to fully identify a locale under all platforms // ---------------------------------------------------------------------------- class WXDLLIMPEXP_BASE wxLocaleIdent { public: // Create the object from BCP 47-like language tag: the string must contain // at least the language part (2 or 3 ASCII letters) and may contain script // and region separated by dashes. static wxLocaleIdent FromTag(const wxString& tag); // Default ctor creates an empty, invalid identifier. wxLocaleIdent() { } // Set language wxLocaleIdent& Language(const wxString& language); // Set region wxLocaleIdent& Region(const wxString& region); // Set script (not supported and ignored under Unix) wxLocaleIdent& Script(const wxString& script); // Set charset (only supported under Unix) wxLocaleIdent& Charset(const wxString& charset); // Set modifier (only supported under Unix) wxLocaleIdent& Modifier(const wxString& modifier); // Set extension (only supported under Windows) wxLocaleIdent& Extension(const wxString& extension); // Set sort order (only supported under Windows) wxLocaleIdent& SortOrder(const wxString& sortorder); // Accessors for the individual fields. const wxString& GetLanguage() const { return m_language; } const wxString& GetRegion() const { return m_region; } const wxString& GetScript() const { return m_script; } const wxString& GetCharset() const { return m_charset; } const wxString& GetModifier() const { return m_modifier; } const wxString& GetExtension() const { return m_extension; } const wxString& GetSortorder() const { return m_sortorder; } // Construct platform dependent name wxString GetName() const; // Get the language tag: for the objects created with FromTag() returns the // string passed to it directly, otherwise reconstructs this string from // the components. wxString GetTag(wxLocaleTagType tagType = wxLOCALE_TAGTYPE_DEFAULT) const; // Empty locale identifier is invalid. at least Language() must be called. bool IsEmpty() const { return m_language.empty(); } private: wxString m_tag; wxString m_language; wxString m_region; wxString m_script; wxString m_charset; wxString m_modifier; wxString m_extension; wxString m_sortorder; }; // ---------------------------------------------------------------------------- // wxUILocale allows to use the default UI locale and get information about it // ---------------------------------------------------------------------------- class WXDLLIMPEXP_BASE wxUILocale { public: // Configure the UI to use the default user locale. static bool UseDefault(); // Use the locale corresponding to the given POSIX locale, e.g. "de_DE.UTF-8". // // This is a compatibility function used by wxWidgets itself, don't use it // in the new code. static bool UseLocaleName(const wxString& localeName); // Get the object corresponding to the currently used locale. static const wxUILocale& GetCurrent(); // A helper just to avoid writing wxUILocale(wxLocaleIdent::FromTag(...)). static wxUILocale FromTag(const wxString& tag) { return wxUILocale(wxLocaleIdent::FromTag(tag)); } // Create the object corresponding to the given locale. explicit wxUILocale(const wxLocaleIdent& localeId); // Objects of this class can be (cheaply) copied. wxUILocale(const wxUILocale& loc); wxUILocale& operator=(const wxUILocale& loc); // Check if the locale is actually supported by the current system: if it's // not supported, the other functions will behave as for the "C" locale. bool IsSupported() const; // Get the platform-dependent name of the current locale. wxString GetName() const; // Get the locale id from which the current locale was instantiated. wxLocaleIdent GetLocaleId() const; // Query the locale for the specified information. wxString GetInfo(wxLocaleInfo index, wxLocaleCategory cat = wxLOCALE_CAT_DEFAULT) const; // Query the locale for the specified localized name. wxString GetLocalizedName(wxLocaleName name, wxLocaleForm form) const; // Query the layout direction of the current locale. wxLayoutDirection GetLayoutDirection() const; // Compares two strings in the order defined by this locale. int CompareStrings(const wxString& lhs, const wxString& rhs, int flags = wxCompare_CaseSensitive) const; #if wxUSE_DATETIME #if wxABI_VERSION >= 30203 // Get the full (default) or abbreviated localized month name // returns empty string on error wxString GetMonthName(wxDateTime::Month month, wxDateTime::NameFlags flags = wxDateTime::Name_Full) const; // Get the full (default) or abbreviated localized weekday name // returns empty string on error wxString GetWeekDayName(wxDateTime::WeekDay weekday, wxDateTime::NameFlags flags = wxDateTime::Name_Full) const; #endif // wxABI_VERSION >= 3.2.3 #endif // wxUSE_DATETIME // Note that this class is not supposed to be used polymorphically, hence // its dtor is not virtual. ~wxUILocale(); #if wxABI_VERSION >= 30202 // Return the locale ID representing the default system locale, which would // be set is UseDefault() is called. static wxLocaleIdent GetSystemLocaleId(); #endif // wxABI_VERSION >= 3.2.2 // Try to get user's (or OS's) preferred language setting. // Return wxLANGUAGE_UNKNOWN if the language-guessing algorithm failed // Prefer using GetSystemLocaleId() above. static int GetSystemLanguage(); // Try to get user's (or OS's) default locale setting. // Return wxLANGUAGE_UNKNOWN if the locale-guessing algorithm failed // Prefer using GetSystemLocaleId() above. static int GetSystemLocale(); // Try to retrieve a list of user's (or OS's) preferred UI languages. // Return empty list if language-guessing algorithm failed static wxVector<wxString> GetPreferredUILanguages(); // 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); // 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 wxLocaleIdent& locId); // 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); // These two methods are for internal use only. First one creates the // global language database if it doesn't already exist, second one destroys // it. static void CreateLanguagesDB(); static void DestroyLanguagesDB(); // These two methods are for internal use only. // wxLocaleIdent expects script identifiers as listed in ISO 15924. // However, directory names for translation catalogs follow the // Unix convention, using script aliases as listed in ISO 15924. // First one converts a script name to its alias, second converts // a script alias to its corresponding script name. // Both methods return empty strings, if the script name or alias // couldn't be found. static wxString GetScriptAliasFromName(const wxString& scriptName); static wxString GetScriptNameFromAlias(const wxString& scriptAlias); private: // This ctor is private and exists only for implementation reasons. // It takes ownership of the provided pointer. explicit wxUILocale(wxUILocaleImpl* impl = NULL) : m_impl(impl) { } // Creates the global tables of languages and scripts called by CreateLanguagesDB static void InitLanguagesDB(); static wxUILocale ms_current; wxUILocaleImpl* m_impl; }; inline wxString wxGetUIDateFormat() { return wxUILocale::GetCurrent().GetInfo(wxLOCALE_SHORT_DATE_FMT); } #else // !wxUSE_INTL inline wxString wxGetUIDateFormat() { return wxString(wxS("%x")); } #endif // wxUSE_INTL/!wxUSE_INTL #endif // _WX_UILOCALE_H_