Translate information about anonymous donors

This commit is contained in:
Haoyu Qiu 2024-09-24 22:39:08 +08:00
parent c3e16cda00
commit fe343a4d76
4 changed files with 50 additions and 25 deletions

View File

@ -137,11 +137,16 @@ Dictionary Engine::get_version_info() const {
return dict;
}
static Array array_from_info(const char *const *info_list) {
static Array array_from_info(const char *const *info_list, int anonymous_count = 0) {
Array arr;
for (int i = 0; info_list[i] != nullptr; i++) {
arr.push_back(String::utf8(info_list[i]));
}
if (anonymous_count > 0) {
// This function is technically not only used for donors.
// But currently only donors have anonymous entries.
arr.push_back(vformat(anonymous_count == 1 ? "And %d anonymous donor" : "And %d anonymous donors", anonymous_count));
}
return arr;
}
@ -188,14 +193,14 @@ TypedArray<Dictionary> Engine::get_copyright_info() const {
Dictionary Engine::get_donor_info() const {
Dictionary donors;
donors["patrons"] = array_from_info(DONORS_PATRONS);
donors["platinum_sponsors"] = array_from_info(DONORS_SPONSORS_PLATINUM);
donors["gold_sponsors"] = array_from_info(DONORS_SPONSORS_GOLD);
donors["silver_sponsors"] = array_from_info(DONORS_SPONSORS_SILVER);
donors["diamond_members"] = array_from_info(DONORS_MEMBERS_DIAMOND);
donors["titanium_members"] = array_from_info(DONORS_MEMBERS_TITANIUM);
donors["platinum_members"] = array_from_info(DONORS_MEMBERS_PLATINUM);
donors["gold_members"] = array_from_info(DONORS_MEMBERS_GOLD);
donors["patrons"] = array_from_info(DONORS_PATRONS, DONORS_PATRONS_ANONYMOUS);
donors["platinum_sponsors"] = array_from_info(DONORS_SPONSORS_PLATINUM, DONORS_SPONSORS_PLATINUM_ANONYMOUS);
donors["gold_sponsors"] = array_from_info(DONORS_SPONSORS_GOLD, DONORS_SPONSORS_GOLD_ANONYMOUS);
donors["silver_sponsors"] = array_from_info(DONORS_SPONSORS_SILVER, DONORS_SPONSORS_SILVER_ANONYMOUS);
donors["diamond_members"] = array_from_info(DONORS_MEMBERS_DIAMOND, DONORS_MEMBERS_DIAMOND_ANONYMOUS);
donors["titanium_members"] = array_from_info(DONORS_MEMBERS_TITANIUM, DONORS_MEMBERS_TITANIUM_ANONYMOUS);
donors["platinum_members"] = array_from_info(DONORS_MEMBERS_PLATINUM, DONORS_MEMBERS_PLATINUM_ANONYMOUS);
donors["gold_members"] = array_from_info(DONORS_MEMBERS_GOLD, DONORS_MEMBERS_GOLD_ANONYMOUS);
return donors;
}

View File

@ -1,5 +1,6 @@
"""Functions used to generate source files during build time"""
import re
import zlib
@ -123,6 +124,7 @@ def make_donors_header(target, source, env):
"DONORS_MEMBERS_PLATINUM",
"DONORS_MEMBERS_GOLD",
]
anonymous_donor_pattern = re.compile(r"And (?P<count>\d+) anonymous donor")
src = str(source[0])
dst = str(target[0])
@ -132,14 +134,21 @@ def make_donors_header(target, source, env):
g.write("#define DONORS_GEN_H\n")
reading = False
current_section = None
anonymous_donor_count = 0
def close_section():
g.write("\t0\n")
g.write("};\n")
g.write("#define {}_ANONYMOUS {}\n".format(current_section, anonymous_donor_count))
for line in f:
if reading >= 0:
if reading:
if line.startswith(" "):
match = anonymous_donor_pattern.search(line)
if match:
anonymous_donor_count = int(match.group("count"))
else:
g.write('\t"' + escape_string(line.strip()) + '",\n')
continue
if line.startswith("## "):

View File

@ -96,7 +96,7 @@ void EditorAbout::_item_list_resized(ItemList *p_il) {
p_il->set_fixed_column_width(p_il->get_size().x / 3.0 - 16 * EDSCALE * 2.5); // Weird. Should be 3.0 and that's it?.
}
ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<String> &p_sections, const char *const *const p_src[], const int p_single_column_flags, const bool p_allow_website) {
ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<String> &p_sections, const char *const *const p_src[], const int *p_anonymous_counts, const int p_single_column_flags, const bool p_allow_website) {
ScrollContainer *sc = memnew(ScrollContainer);
sc->set_name(p_name);
sc->set_v_size_flags(Control::SIZE_EXPAND);
@ -141,19 +141,19 @@ ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<St
const String identifier = name.get_slice("<", 0);
const String website = name.get_slice_count("<") == 1 ? "" : name.get_slice("<", 1).trim_suffix(">");
const int name_item_id = il->add_item(identifier, nullptr, false);
il->set_item_tooltip_enabled(name_item_id, false);
il->add_item(identifier, nullptr, false);
il->set_item_tooltip_enabled(-1, !website.is_empty());
if (!website.is_empty()) {
il->set_item_selectable(name_item_id, true);
il->set_item_metadata(name_item_id, website);
il->set_item_tooltip(name_item_id, website + "\n\n" + TTR("Double-click to open in browser."));
il->set_item_tooltip_enabled(name_item_id, true);
il->set_item_selectable(-1, true);
il->set_item_metadata(-1, website);
il->set_item_tooltip(-1, website + "\n\n" + TTR("Double-click to open in browser."));
}
if (!*names_ptr && name.contains(" anonymous ")) {
il->set_item_disabled(name_item_id, true);
}
if (p_anonymous_counts && p_anonymous_counts[i] > 0) {
il->add_item(vformat(TTRN("And %d anonymous donor", "And %d anonymous donors", p_anonymous_counts[i]), p_anonymous_counts[i]), nullptr, false);
il->set_item_tooltip_enabled(-1, false);
il->set_item_disabled(-1, true);
}
} else {
while (*names_ptr) {
@ -248,7 +248,7 @@ EditorAbout::EditorAbout() {
AUTHORS_PROJECT_MANAGERS,
AUTHORS_DEVELOPERS,
};
tc->add_child(_populate_list(TTR("Authors"), dev_sections, dev_src, 0b1)); // First section (Project Founders) is always one column.
tc->add_child(_populate_list(TTR("Authors"), dev_sections, dev_src, nullptr, 0b1)); // First section (Project Founders) is always one column.
// Donors.
@ -271,7 +271,18 @@ EditorAbout::EditorAbout() {
DONORS_MEMBERS_PLATINUM,
DONORS_MEMBERS_GOLD,
};
tc->add_child(_populate_list(TTR("Donors"), donor_sections, donor_src, 0b1, true)); // First section (Patron) is one column.
int anonymous_donors_count[] = {
DONORS_PATRONS_ANONYMOUS,
DONORS_SPONSORS_PLATINUM_ANONYMOUS,
DONORS_SPONSORS_GOLD_ANONYMOUS,
DONORS_SPONSORS_SILVER_ANONYMOUS,
DONORS_MEMBERS_DIAMOND_ANONYMOUS,
DONORS_MEMBERS_TITANIUM_ANONYMOUS,
DONORS_MEMBERS_PLATINUM_ANONYMOUS,
DONORS_MEMBERS_GOLD_ANONYMOUS,
};
static_assert(sizeof(donor_src) / sizeof(donor_src[0]) == sizeof(anonymous_donors_count) / sizeof(anonymous_donors_count[0]));
tc->add_child(_populate_list(TTR("Donors"), donor_sections, donor_src, anonymous_donors_count, 0b1, true)); // First section (Patron) is one column.
// License.

View File

@ -56,7 +56,7 @@ private:
void _version_button_pressed();
void _item_with_website_selected(int p_id, ItemList *p_il);
void _item_list_resized(ItemList *p_il);
ScrollContainer *_populate_list(const String &p_name, const List<String> &p_sections, const char *const *const p_src[], int p_single_column_flags = 0, bool p_allow_website = false);
ScrollContainer *_populate_list(const String &p_name, const List<String> &p_sections, const char *const *const p_src[], const int *p_anonymous_count, int p_single_column_flags = 0, bool p_allow_website = false);
LinkButton *version_btn = nullptr;
Tree *_tpl_tree = nullptr;