summaryrefslogtreecommitdiff
path: root/core/translation.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/translation.h')
-rw-r--r--core/translation.h47
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();