123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- /*
- ==============================================================================
- This file is part of the juce_core module of the JUCE library.
- Copyright (c) 2015 - ROLI Ltd.
- Permission to use, copy, modify, and/or distribute this software for any purpose with
- or without fee is hereby granted, provided that the above copyright notice and this
- permission notice appear in all copies.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
- TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
- NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
- IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- ------------------------------------------------------------------------------
- NOTE! This permissive ISC license applies ONLY to files within the juce_core module!
- All other JUCE modules are covered by a dual GPL/commercial license, so if you are
- using any other modules, be sure to check that you also comply with their license.
- For more details, visit www.juce.com
- ==============================================================================
- */
- #ifndef JUCE_LOCALISEDSTRINGS_H_INCLUDED
- #define JUCE_LOCALISEDSTRINGS_H_INCLUDED
- //==============================================================================
- /**
- Used to convert strings to localised foreign-language versions.
- This is basically a look-up table of strings and their translated equivalents.
- It can be loaded from a text file, so that you can supply a set of localised
- versions of strings that you use in your app.
- To use it in your code, simply call the translate() method on each string that
- might have foreign versions, and if none is found, the method will just return
- the original string.
- The translation file should start with some lines specifying a description of
- the language it contains, and also a list of ISO country codes where it might
- be appropriate to use the file. After that, each line of the file should contain
- a pair of quoted strings with an '=' sign.
- E.g. for a french translation, the file might be:
- @code
- language: French
- countries: fr be mc ch lu
- "hello" = "bonjour"
- "goodbye" = "au revoir"
- @endcode
- If the strings need to contain a quote character, they can use '\"' instead, and
- if the first non-whitespace character on a line isn't a quote, then it's ignored,
- (you can use this to add comments).
- Note that this is a singleton class, so don't create or destroy the object directly.
- There's also a TRANS(text) macro defined to make it easy to use the this.
- E.g. @code
- printSomething (TRANS("hello"));
- @endcode
- This macro is used in the Juce classes themselves, so your application has a chance to
- intercept and translate any internal Juce text strings that might be shown. (You can easily
- get a list of all the messages by searching for the TRANS() macro in the Juce source
- code).
- */
- class JUCE_API LocalisedStrings
- {
- public:
- //==============================================================================
- /** Creates a set of translations from the text of a translation file.
- When you create one of these, you can call setCurrentMappings() to make it
- the set of mappings that the system's using.
- */
- LocalisedStrings (const String& fileContents, bool ignoreCaseOfKeys);
- /** Creates a set of translations from a file.
- When you create one of these, you can call setCurrentMappings() to make it
- the set of mappings that the system's using.
- */
- LocalisedStrings (const File& fileToLoad, bool ignoreCaseOfKeys);
- LocalisedStrings (const LocalisedStrings&);
- LocalisedStrings& operator= (const LocalisedStrings&);
- /** Destructor. */
- ~LocalisedStrings();
- //==============================================================================
- /** Selects the current set of mappings to be used by the system.
- The object you pass in will be automatically deleted when no longer needed, so
- don't keep a pointer to it. You can also pass in nullptr to remove the current
- mappings.
- See also the TRANS() macro, which uses the current set to do its translation.
- @see translateWithCurrentMappings
- */
- static void setCurrentMappings (LocalisedStrings* newTranslations);
- /** Returns the currently selected set of mappings.
- This is the object that was last passed to setCurrentMappings(). It may
- be nullptr if none has been created.
- */
- static LocalisedStrings* getCurrentMappings();
- /** Tries to translate a string using the currently selected set of mappings.
- If no mapping has been set, or if the mapping doesn't contain a translation
- for the string, this will just return the original string.
- See also the TRANS() macro, which uses this method to do its translation.
- @see setCurrentMappings, getCurrentMappings
- */
- static String translateWithCurrentMappings (const String& text);
- /** Tries to translate a string using the currently selected set of mappings.
- If no mapping has been set, or if the mapping doesn't contain a translation
- for the string, this will just return the original string.
- See also the TRANS() macro, which uses this method to do its translation.
- @see setCurrentMappings, getCurrentMappings
- */
- static String translateWithCurrentMappings (const char* text);
- //==============================================================================
- /** Attempts to look up a string and return its localised version.
- If the string isn't found in the list, the original string will be returned.
- */
- String translate (const String& text) const;
- /** Attempts to look up a string and return its localised version.
- If the string isn't found in the list, the resultIfNotFound string will be returned.
- */
- String translate (const String& text, const String& resultIfNotFound) const;
- /** Returns the name of the language specified in the translation file.
- This is specified in the file using a line starting with "language:", e.g.
- @code
- language: german
- @endcode
- */
- String getLanguageName() const { return languageName; }
- /** Returns the list of suitable country codes listed in the translation file.
- These is specified in the file using a line starting with "countries:", e.g.
- @code
- countries: fr be mc ch lu
- @endcode
- The country codes are supposed to be 2-character ISO complient codes.
- */
- const StringArray& getCountryCodes() const { return countryCodes; }
- /** Provides access to the actual list of mappings. */
- const StringPairArray& getMappings() const { return translations; }
- //==============================================================================
- /** Adds and merges another set of translations into this set.
- Note that the language name and country codes of the new LocalisedStrings
- object must match that of this object - an assertion will be thrown if they
- don't match.
- Any existing values will have their mappings overwritten by the new ones.
- */
- void addStrings (const LocalisedStrings&);
- /** Gives this object a set of strings to use as a fallback if a string isn't found.
- The object that is passed-in will be owned and deleted by this object
- when no longer needed. It can be nullptr to clear the existing fallback object.
- */
- void setFallback (LocalisedStrings* fallbackStrings);
- private:
- //==============================================================================
- String languageName;
- StringArray countryCodes;
- StringPairArray translations;
- ScopedPointer<LocalisedStrings> fallback;
- friend struct ContainerDeletePolicy<LocalisedStrings>;
- void loadFromText (const String&, bool ignoreCase);
- JUCE_LEAK_DETECTOR (LocalisedStrings)
- };
- //==============================================================================
- #ifndef TRANS
- /** Uses the LocalisedStrings class to translate the given string literal.
- This macro is provided for backwards-compatibility, and just calls the translate()
- function. In new code, it's recommended that you just call translate() directly
- instead, and avoid using macros.
- @see translate(), LocalisedStrings
- */
- #define TRANS(stringLiteral) juce::translate (stringLiteral)
- #endif
- /** A dummy version of the TRANS macro, used to indicate a string literal that should be
- added to the translation file by source-code scanner tools.
- Wrapping a string literal in this macro has no effect, but by using it around strings
- that your app needs to translate at a later stage, it lets automatic code-scanning tools
- find this string and add it to the list of strings that need translation.
- */
- #define NEEDS_TRANS(stringLiteral) (stringLiteral)
- /** Uses the LocalisedStrings class to translate the given string literal.
- @see LocalisedStrings
- */
- JUCE_API String translate (const String& stringLiteral);
- /** Uses the LocalisedStrings class to translate the given string literal.
- @see LocalisedStrings
- */
- JUCE_API String translate (const char* stringLiteral);
- /** Uses the LocalisedStrings class to translate the given string literal.
- @see LocalisedStrings
- */
- JUCE_API String translate (CharPointer_UTF8 stringLiteral);
- /** Uses the LocalisedStrings class to translate the given string literal.
- @see LocalisedStrings
- */
- JUCE_API String translate (const String& stringLiteral, const String& resultIfNotFound);
- #endif // JUCE_LOCALISEDSTRINGS_H_INCLUDED
|