| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: translation.h
- // Purpose: wxTranslation class
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- This class allows to get translations for strings.
- In wxWidgets this class manages message catalogs which contain the
- translations of the strings used to the current language. Unlike wxLocale,
- it isn't bound to locale. It can be used either independently of, or in
- conjunction with wxLocale. In the latter case, you should initialize
- wxLocale (which creates wxTranslations instance) first; in the former, you
- need to create a wxTranslations object and Set() it manually.
- Only one wxTranslations instance is active at a time; it is set with the
- Set() method and obtained using Get().
- Unlike wxLocale, wxTranslations' primary mean of identifying language
- is by its "canonical name", i.e. ISO 639 code, possibly combined with
- ISO 3166 country code and additional modifiers (examples include
- "fr", "en_GB" or "ca@valencia"; see wxLocale::GetCanonicalName() for
- more information). This allows apps using wxTranslations API to use even
- languages not recognized by the operating system or not listed in
- wxLanguage enum.
- @since 2.9.1
- @see wxLocale, wxTranslationsLoader, wxFileTranslationsLoader
- */
- class wxTranslations
- {
- public:
- /// Constructor
- wxTranslations();
- /**
- Returns current translations object, may return NULL.
- You must either call this early in app initialization code, or let
- wxLocale do it for you.
- */
- static wxTranslations *Get();
- /**
- Sets current translations object.
- Deletes previous translation object and takes ownership of @a t.
- */
- static void Set(wxTranslations *t);
- /**
- Changes loader use to read catalogs to a non-default one.
- Deletes previous loader and takes ownership of @a loader.
- @see wxTranslationsLoader, wxFileTranslationsLoader, wxResourceTranslationsLoader
- */
- void SetLoader(wxTranslationsLoader *loader);
- /**
- Sets translations language to use.
- wxLANGUAGE_DEFAULT has special meaning: best suitable translation,
- given user's preference and available translations, will be used.
- */
- void SetLanguage(wxLanguage lang);
- /**
- Sets translations language to use.
- Empty @a lang string has the same meaning as wxLANGUAGE_DEFAULT in
- SetLanguage(wxLanguage): best suitable translation, given user's
- preference and available translations, will be used.
- */
- void SetLanguage(const wxString& lang);
- /**
- Returns list of all translations of @a domain that were found.
- This method can be used e.g. to populate list of application's
- translations offered to the user. To do this, pass the app's main
- catalog as @a domain.
- @see GetBestTranslation()
- */
- wxArrayString GetAvailableTranslations(const wxString& domain) const;
- /**
- Returns the best UI language for the @a domain.
- The language is determined from the preferred UI language or languages
- list the user configured in the OS. Notice that this may or may not
- correspond to the default @em locale as obtained from
- wxLocale::GetSystemLanguage(); modern operation systems (Windows
- Vista+, OS X) have separate language and regional (= locale) settings.
- @param domain
- The catalog domain to look for.
- @param msgIdLanguage
- Specifies the language of "msgid" strings in source code
- (i.e. arguments to GetString(), wxGetTranslation() and the _() macro).
- @return Language code if a suitable match was found, empty string
- otherwise.
- @since 2.9.5
- */
- wxString GetBestTranslation(const wxString& domain, wxLanguage msgIdLanguage);
- /**
- Returns the best UI language for the @a domain.
- The language is determined from the preferred UI language or languages
- list the user configured in the OS. Notice that this may or may not
- correspond to the default @em locale as obtained from
- wxLocale::GetSystemLanguage(); modern operation systems (Windows
- Vista+, OS X) have separate language and regional (= locale) settings.
- @param domain
- The catalog domain to look for.
- @param msgIdLanguage
- Specifies the language of "msgid" strings in source code
- (i.e. arguments to GetString(), wxGetTranslation() and the _() macro).
- @return Language code if a suitable match was found, empty string
- otherwise.
- @since 2.9.5
- */
- wxString GetBestTranslation(const wxString& domain,
- const wxString& msgIdLanguage = "en");
- /**
- Add standard wxWidgets catalogs ("wxstd" and possible port-specific
- catalogs).
- @return @true if a suitable catalog was found, @false otherwise
- @see AddCatalog()
- */
- bool AddStdCatalog();
- /**
- Add a catalog for use with the current locale.
- By default, it is searched for in standard places (see
- wxFileTranslationsLoader), but you may also prepend additional
- directories to the search path with
- wxFileTranslationsLoader::AddCatalogLookupPathPrefix().
- All loaded catalogs will be used for message lookup by GetString() for
- the current locale.
- In this overload, @c msgid strings are assumed
- to be in English and written only using 7-bit ASCII characters.
- If you have to deal with non-English strings or 8-bit characters in the
- source code, see the instructions in @ref overview_nonenglish.
- @return
- @true if catalog was successfully loaded, @false otherwise (which might
- mean that the catalog is not found or that it isn't in the correct format).
- */
- bool AddCatalog(const wxString& domain);
- /**
- Same as AddCatalog(const wxString&), but takes an additional argument,
- @a msgIdLanguage.
- @param domain
- The catalog domain to add.
- @param msgIdLanguage
- Specifies the language of "msgid" strings in source code
- (i.e. arguments to GetString(), wxGetTranslation() and the _() macro).
- It is used if AddCatalog() cannot find any catalog for current language:
- if the language is same as source code language, then strings from source
- code are used instead.
- @return
- @true if catalog was successfully loaded, @false otherwise (which might
- mean that the catalog is not found or that it isn't in the correct format).
- */
- bool AddCatalog(const wxString& domain, wxLanguage msgIdLanguage);
- /**
- Same as AddCatalog(const wxString&, wxLanguage), but takes two
- additional arguments, @a msgIdLanguage and @a msgIdCharset.
- This overload is only available in non-Unicode build.
- @param domain
- The catalog domain to add.
- @param msgIdLanguage
- Specifies the language of "msgid" strings in source code
- (i.e. arguments to GetString(), wxGetTranslation() and the _() macro).
- It is used if AddCatalog() cannot find any catalog for current language:
- if the language is same as source code language, then strings from source
- code are used instead.
- @param msgIdCharset
- Lets you specify the charset used for msgids in sources
- in case they use 8-bit characters (e.g. German or French strings).
- @return
- @true if catalog was successfully loaded, @false otherwise (which might
- mean that the catalog is not found or that it isn't in the correct format).
- */
- bool AddCatalog(const wxString& domain,
- wxLanguage msgIdLanguage,
- const wxString& msgIdCharset);
- /**
- Check if the given catalog is loaded, and returns @true if it is.
- According to GNU gettext tradition, each catalog normally corresponds to
- 'domain' which is more or less the application name.
- @see AddCatalog()
- */
- bool IsLoaded(const wxString& domain) const;
- /**
- Retrieves the translation for a string in all loaded domains unless the @a domain
- parameter is specified (and then only this catalog/domain is searched).
- Returns @NULL if translation is not available.
- This function is thread-safe.
- @remarks Domains are searched in the last to first order, i.e. catalogs
- added later override those added before.
- @since 3.0
- */
- const wxString *GetTranslatedString(const wxString& origString,
- const wxString& domain = wxEmptyString) const;
- /**
- Retrieves the translation for a string in all loaded domains unless the @a domain
- parameter is specified (and then only this catalog/domain is searched).
- Returns @NULL if translation is not available.
- This form is used when retrieving translation of string that has different
- singular and plural form in English or different plural forms in some
- other language.
- @param origString The singular form of the string to be converted.
- @param n The number on which the plural form choice depends on.
- (In some languages, there are different plural forms
- for e.g. n=2 and n=3 etc., in addition to the singular
- form (n=1) being different.)
- @param domain The only domain (i.e. message catalog) to search if
- specified. By default this parameter is empty,
- indicating that all loaded catalogs should be
- searched.
- See GNU gettext manual for additional information on plural forms handling.
- This method is called by the wxGetTranslation() function and _() macro.
- This function is thread-safe.
- @remarks Domains are searched in the last to first order, i.e. catalogs
- added later override those added before.
- @since 3.0
- */
- const wxString *GetTranslatedString(const wxString& origString,
- unsigned n,
- const wxString& domain = wxEmptyString) const;
- /**
- Returns the header value for header @a header.
- The search for @a header is case sensitive. If an @a domain is passed,
- this domain is searched. Else all domains will be searched until a
- header has been found.
- The return value is the value of the header if found. Else this will be empty.
- */
- wxString GetHeaderValue(const wxString& header,
- const wxString& domain = wxEmptyString) const;
- };
- /**
- Abstraction of translations discovery and loading.
- This interface makes it possible to override wxWidgets' default catalogs
- loading mechanism and load MO files from locations other than the
- filesystem (e.g. embed them in executable).
- Implementations must implement the LoadCatalog() method.
- @see wxFileTranslationsLoader, wxResourceTranslationsLoader
- @since 2.9.1
- */
- class wxTranslationsLoader
- {
- public:
- /// Trivial default constructor.
- wxTranslationsLoader();
- /**
- Called to load requested catalog.
- If the catalog is found, LoadCatalog() should create wxMsgCatalog
- instance with its data and return it. The caller will take ownership
- of the catalog.
- @param domain Domain to load.
- @param lang Language to look for. This is "canonical name"
- (see wxLocale::GetCanonicalName()), i.e. ISO 639
- code, possibly combined with country code or
- additional modifiers (e.g. "fr", "en_GB" or
- "ca@valencia").
- @return Loaded catalog or NULL on failure.
- */
- virtual wxMsgCatalog *LoadCatalog(const wxString& domain,
- const wxString& lang) = 0;
- /**
- Implements wxTranslations::GetAvailableTranslations().
- */
- virtual wxArrayString GetAvailableTranslations(const wxString& domain) const = 0;
- };
- /**
- Standard wxTranslationsLoader implementation.
- This finds catalogs in the filesystem, using the standard Unix layout.
- This is the default unless you change the loader with
- wxTranslations::SetLoader().
- Catalogs are searched for in standard places (system locales directory,
- `LC_PATH` on Unix systems, Resources subdirectory of the application bundle
- on OS X, executable's directory on Windows), but you may also prepend
- additional directories to the search path with
- AddCatalogLookupPathPrefix().
- @since 2.9.1
- */
- class wxFileTranslationsLoader : public wxTranslationsLoader
- {
- public:
- /**
- Add a prefix to the catalog lookup path: the message catalog files will
- be looked up under prefix/lang/LC_MESSAGES and prefix/lang directories
- (in this order).
- This only applies to subsequent invocations of
- wxTranslations::AddCatalog().
- */
- static void AddCatalogLookupPathPrefix(const wxString& prefix);
- };
- /**
- This loader makes it possible to load translations from Windows
- resources.
- If you wish to store translation MO files in resources, you have to
- enable this loader before calling wxTranslations::AddCatalog() or
- wxLocale::AddCatalog():
- @code
- wxTranslations::Get()->SetLoader(new wxResourceTranslationsLoader);
- @endcode
- Translations are stored in resources as compiled MO files, with type
- set to "MOFILE" (unless you override GetResourceType()) and name
- consisting of the domain, followed by underscore, followed by language
- identification. For example, the relevant part of .rc file would look
- like this:
- @code
- myapp_de MOFILE "catalogs/de/myapp.mo"
- myapp_fr MOFILE "catalogs/fr/myapp.mo"
- myapp_en_GB MOFILE "catalogs/en_GB/myapp.mo"
- @endcode
- This class is only available on Windows.
- @since 2.9.1
- */
- class wxResourceTranslationsLoader : public wxTranslationsLoader
- {
- protected:
- /**
- Returns resource type to use for translations.
- Default type is "MOFILE".
- */
- virtual wxString GetResourceType() const;
- /**
- Returns handle of the module to load resources from.
- By default, the main executable is used.
- */
- virtual WXHINSTANCE GetModule() const;
- };
- /**
- Represents a loaded translations message catalog.
- This class should only be used directly by wxTranslationsLoader
- implementations.
- @since 2.9.1
- */
- class wxMsgCatalog
- {
- public:
- /**
- Creates catalog loaded from a MO file.
- @param filename Path to the MO file to load.
- @param domain Catalog's domain. This typically matches
- the @a filename.
- @return Successfully loaded catalog or NULL on failure.
- */
- static wxMsgCatalog *CreateFromFile(const wxString& filename,
- const wxString& domain);
- /**
- Creates catalog from MO file data in memory buffer.
- @param data Data in MO file format.
- @param domain Catalog's domain. This typically matches
- the @a filename.
- @return Successfully loaded catalog or NULL on failure.
- */
- static wxMsgCatalog *CreateFromData(const wxScopedCharBuffer& data,
- const wxString& domain);
- };
- // ============================================================================
- // Global functions/macros
- // ============================================================================
- /** @addtogroup group_funcmacro_string */
- //@{
- /**
- This macro is identical to _() but for the plural variant of
- wxGetTranslation().
- @return A const wxString.
- @header{wx/intl.h}
- */
- #define wxPLURAL(string, plural, n)
- /**
- This macro doesn't do anything in the program code -- it simply expands to
- the value of its argument.
- However it does have a purpose which is to mark the literal strings for the
- extraction into the message catalog created by @c xgettext program. Usually
- this is achieved using _() but that macro not only marks the string for
- extraction but also expands into a wxGetTranslation() call which means that
- it cannot be used in some situations, notably for static array
- initialization.
- Here is an example which should make it more clear: suppose that you have a
- static array of strings containing the weekday names and which have to be
- translated (note that it is a bad example, really, as wxDateTime already
- can be used to get the localized week day names already). If you write:
- @code
- static const char * const weekdays[] = { _("Mon"), ..., _("Sun") };
- ...
- // use weekdays[n] as usual
- @endcode
- The code wouldn't compile because the function calls are forbidden in the
- array initializer. So instead you should do this:
- @code
- static const char * const weekdays[] = { wxTRANSLATE("Mon"), ...,
- wxTRANSLATE("Sun") };
- ...
- // use wxGetTranslation(weekdays[n])
- @endcode
- Note that although the code @b would compile if you simply omit
- wxTRANSLATE() in the above, it wouldn't work as expected because there
- would be no translations for the weekday names in the program message
- catalog and wxGetTranslation() wouldn't find them.
- @return A const wxChar*.
- @header{wx/intl.h}
- */
- #define wxTRANSLATE(string)
- /**
- This function returns the translation of @a string in the current
- @c locale(). If the string is not found in any of the loaded message
- catalogs (see @ref overview_i18n), 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. If @a 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 _() macro is defined to do the same thing as
- wxGetTranslation().
- This function is thread-safe.
- @note This function is not suitable for literal strings in Unicode builds
- since the literal strings must be enclosed in wxT() macro which makes
- them unrecognised by @c xgettext, and so they are not extracted to
- the message catalog. Instead, use the _() and wxPLURAL() macro for
- all literal strings.
- @see wxGetTranslation(const wxString&, const wxString&, unsigned, const wxString&)
- @header{wx/intl.h}
- */
- const wxString& wxGetTranslation(const wxString& string,
- const wxString& domain = wxEmptyString);
- /**
- This is an overloaded version of
- wxGetTranslation(const wxString&, const wxString&), please see its
- documentation for general information.
- This version is used when retrieving translation of string that has
- different singular and plural forms in English or different plural forms in
- some other language. Like wxGetTranslation(const wxString&,const wxString&),
- the @a string parameter must contain the singular form of the string to be
- converted and is used as the key for the search in the catalog. The
- @a plural parameter is the plural form (in English). The parameter @a n is
- used to determine the plural form. If no message catalog is found,
- @a string is returned if "n == 1", otherwise @a plural is returned.
- See GNU gettext Manual for additional information on plural forms handling:
- <http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms>
- For a shorter alternative see the wxPLURAL() macro.
- This function is thread-safe.
- @header{wx/intl.h}
- */
- const wxString& wxGetTranslation(const wxString& string,
- const wxString& plural, unsigned n,
- const wxString& domain = wxEmptyString);
- /**
- Macro to be used around all literal strings that should be translated.
- This macro expands into a call to wxGetTranslation(), so it marks the
- message for the extraction by @c xgettext just as wxTRANSLATE() does, but
- also returns the translation of the string for the current locale during
- execution.
- This macro is thread-safe.
- @header{wx/intl.h}
- */
- const wxString& _(const wxString& string);
- //@}
|