Add default plural rules

This makes the PO loader correctly handle the situation where the optional
`Plural-Forms` header field does not exist.

The `Translation` class and its subclasses always have access to valid plural
rules via `_get_plural_rules()`. Plural rules are prioritized:

1. `Translation.plural_rules_override`
2. `TranslationServer.get_plural_rules(locale)`
3. The English plural rules: `nplurals=2; plurals=(n != 1)`

Co-Authored-By: Pāvels Nadtočajevs <7645683+bruvzg@users.noreply.github.com>
This commit is contained in:
Haoyu Qiu
2025-07-21 17:59:14 +08:00
parent ebb96e2303
commit e882e42e1b
11 changed files with 202 additions and 61 deletions
+11 -1
View File
@@ -33,6 +33,8 @@
#include "core/io/resource.h"
#include "core/object/gdvirtual.gen.inc"
class PluralRules;
class Translation : public Resource {
GDCLASS(Translation, Resource);
OBJ_SAVE_TYPE(Translation);
@@ -41,6 +43,9 @@ class Translation : public Resource {
String locale = "en";
HashMap<StringName, StringName> translation_map;
mutable PluralRules *plural_rules_cache = nullptr;
String plural_rules_override;
virtual Vector<String> _get_message_list() const;
virtual Dictionary _get_messages() const;
virtual void _set_messages(const Dictionary &p_messages);
@@ -48,6 +53,8 @@ class Translation : public Resource {
protected:
static void _bind_methods();
PluralRules *_get_plural_rules() const;
GDVIRTUAL2RC(StringName, _get_message, StringName, StringName);
GDVIRTUAL4RC(StringName, _get_plural_message, StringName, StringName, int, StringName);
@@ -64,5 +71,8 @@ public:
virtual int get_message_count() const;
virtual Vector<String> get_translated_message_list() const;
Translation() {}
void set_plural_rules_override(const String &p_rules);
String get_plural_rules_override() const;
~Translation();
};