diff options
Diffstat (limited to 'core/translation.h')
-rw-r--r-- | core/translation.h | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/core/translation.h b/core/translation.h index 4f50a1a4bc..b4329c0ef7 100644 --- a/core/translation.h +++ b/core/translation.h @@ -31,6 +31,9 @@ #ifndef TRANSLATION_H #define TRANSLATION_H +//#define DEBUG_TRANSLATION + +#include "core/math/expression.h" #include "core/resource.h" class Translation : public Resource { @@ -39,12 +42,23 @@ class Translation : public Resource { RES_BASE_EXTENSION("translation"); String locale = "en"; - Map<StringName, StringName> translation_map; + int plural_forms = 0; // 0 means no "Plural-Forms" is given in the PO header file. The min for all languages is 1. + String plural_rule; + + // TLDR: Maps context to a list of source strings and translated strings. In PO terms, maps msgctxt to a list of msgid and msgstr. + // The first key corresponds to context, and the second key (of the contained HashMap) corresponds to source string. + // The value Vector<StringName> in the second map stores the translated strings. Index 0, 1, 2 matches msgstr[0], msgstr[1], msgstr[2]... in the case of plurals. + // Otherwise index 0 mathes to msgstr in a singular translation. + // Strings without context have "" as first key. + HashMap<StringName, HashMap<StringName, Vector<StringName>>> translation_map; Vector<String> _get_message_list() const; - Vector<String> _get_messages() const; - void _set_messages(const Vector<String> &p_messages); + Dictionary _get_messages() const; + void _set_messages(const Dictionary &p_messages); + + int _get_plural_index(int p_n) const; + int _get_plural_index(const String &p_plural_rule, const Vector<String> &p_input_name, const Array &p_input_value, Ref<Expression> &r_expr) const; protected: static void _bind_methods(); @@ -52,14 +66,24 @@ protected: public: void set_locale(const String &p_locale); _FORCE_INLINE_ String get_locale() const { return locale; } + void set_plural_rule(const String &p_plural_rule); - void add_message(const StringName &p_src_text, const StringName &p_xlated_text); - virtual StringName get_message(const StringName &p_src_text) const; //overridable for other implementations - void erase_message(const StringName &p_src_text); + void add_message(const StringName &p_src_text, const StringName &p_xlated_text, const StringName &p_context = ""); + void add_plural_message(const StringName &p_src_text, const Vector<String> &p_plural_texts, const StringName &p_context = ""); + virtual StringName get_message(const StringName &p_src_text, const StringName &p_context = "") const; //overridable for other implementations + virtual StringName get_plural_message(const StringName &p_src_text, const StringName &p_plural_text, int p_n, const StringName &p_context = "") const; + void erase_message(const StringName &p_src_text, const StringName &p_context = ""); void get_message_list(List<StringName> *r_messages) const; int get_message_count() const; + int get_plural_forms() const; + String get_plural_rule() const; + +#ifdef DEBUG_TRANSLATION + void print_translation_map(); +#endif + Translation() {} }; @@ -80,6 +104,8 @@ class TranslationServer : public Object { static TranslationServer *singleton; bool _load_translations(const String &p_from); + StringName _get_message_from_translations(const StringName &p_message, const StringName &p_context, const String &p_locale, const String &p_message_plural = "", int p_n = -1) const; + static void _bind_methods(); public: @@ -98,7 +124,8 @@ public: void add_translation(const Ref<Translation> &p_translation); void remove_translation(const Ref<Translation> &p_translation); - StringName translate(const StringName &p_message) const; + StringName translate(const StringName &p_message, const StringName &p_context = "") const; + StringName translate_plural(const StringName &p_message, const StringName &p_message_plural, int p_n, const StringName &p_context = "") const; static Vector<String> get_all_locales(); static Vector<String> get_all_locale_names(); @@ -107,9 +134,11 @@ public: static String get_language_code(const String &p_locale); void set_tool_translation(const Ref<Translation> &p_translation); - StringName tool_translate(const StringName &p_message) const; + StringName tool_translate(const StringName &p_message, const StringName &p_context = "") const; + StringName tool_translate_plural(const StringName &p_message, const StringName &p_message_plural, int p_n, const StringName &p_context = "") const; void set_doc_translation(const Ref<Translation> &p_translation); - StringName doc_translate(const StringName &p_message) const; + StringName doc_translate(const StringName &p_message, const StringName &p_context = "") const; + StringName doc_translate_plural(const StringName &p_message, const StringName &p_message_plural, int p_n, const StringName &p_context = "") const; void setup(); |