From 3384b21177a160f7192a2e4877eea3b29880bf4e Mon Sep 17 00:00:00 2001 From: Hop311 Date: Thu, 30 Mar 2023 14:04:58 +0100 Subject: Added Localisation (#77) * Added Localisation * Removed `.gdignore`s. * Localisation dir path and Locale name cleanup * Incomplete entry warnings + README --- extension/src/LoadLocalisation.cpp | 111 +++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 extension/src/LoadLocalisation.cpp (limited to 'extension/src/LoadLocalisation.cpp') diff --git a/extension/src/LoadLocalisation.cpp b/extension/src/LoadLocalisation.cpp new file mode 100644 index 0000000..c95c08b --- /dev/null +++ b/extension/src/LoadLocalisation.cpp @@ -0,0 +1,111 @@ +#include "LoadLocalisation.hpp" + +#include +#include +#include +#include + +using namespace godot; +using namespace OpenVic2; + +LoadLocalisation *LoadLocalisation::singleton = nullptr; + +void LoadLocalisation::_bind_methods() { + ClassDB::bind_method(D_METHOD("load_file", "file_path", "locale"), &LoadLocalisation::load_file); + ClassDB::bind_method(D_METHOD("load_locale_dir", "dir_path", "locale"), &LoadLocalisation::load_locale_dir); + ClassDB::bind_method(D_METHOD("load_localisation_dir", "dir_path"), &LoadLocalisation::load_localisation_dir); +} + +LoadLocalisation *LoadLocalisation::get_singleton() { + return singleton; +} + +LoadLocalisation::LoadLocalisation() { + ERR_FAIL_COND(singleton != nullptr); + singleton = this; +} + +LoadLocalisation::~LoadLocalisation() { + ERR_FAIL_COND(singleton != this); + singleton = nullptr; +} + +Error LoadLocalisation::_load_file_into_translation(String const& file_path, Ref translation) { + Ref file = FileAccess::open(file_path, FileAccess::ModeFlags::READ); + Error err = FileAccess::get_open_error(); + if (err != OK || file.is_null()) { + UtilityFunctions::push_error("Failed to load localisation file: ", file_path); + return err == OK ? FAILED : err; + } + int line_number = 0; + while (!file->eof_reached()) { + PackedStringArray line = file->get_csv_line(); + line_number++; + if (line.size() < 2 || line[0].is_empty() || line[1].is_empty()) { + if (!line[0].is_empty()) + UtilityFunctions::push_warning("Key \"", line[0], "\" missing value on line ", line_number, " in file: ", file_path); + else if (line.size() >= 2 && !line[1].is_empty()) + UtilityFunctions::push_warning("Value \"", line[1], "\" missing key on line ", line_number, " in file: ", file_path); + continue; + } + translation->add_message(line[0], line[1].c_unescape()); + } + return OK; +} + +Ref LoadLocalisation::_get_translation(String const& locale) { + TranslationServer *server = TranslationServer::get_singleton(); + Ref translation = server->get_translation_object(locale); + if (translation.is_null() || translation->get_locale() != locale) { + translation.instantiate(); + translation->set_locale(locale); + server->add_translation(translation); + } + return translation; +} + +Error LoadLocalisation::load_file(String const& file_path, String const& locale) { + return _load_file_into_translation(file_path, _get_translation(locale)); +} + +/* REQUIREMENTS + * FS-18, FS-24, FS-25 + */ +Error LoadLocalisation::load_locale_dir(String const& dir_path, String const& locale) { + Ref translation = _get_translation(locale); + if (DirAccess::dir_exists_absolute(dir_path)) { + Error err = OK; + for (String const& file_name : DirAccess::get_files_at(dir_path)) { + if (file_name.get_extension().to_lower() == "csv") { + String file_path = dir_path.path_join(file_name); + if (_load_file_into_translation(file_path, translation) != OK) + err = FAILED; + } + } + return err; + } + UtilityFunctions::push_error("Locale directory does not exist: ", dir_path); + return FAILED; +} + +/* REQUIREMENTS + * FS-23 + */ +Error LoadLocalisation::load_localisation_dir(String const& dir_path) { + if (DirAccess::dir_exists_absolute(dir_path)) { + TranslationServer *server = TranslationServer::get_singleton(); + Error err = OK; + for (String const& locale_name : DirAccess::get_directories_at(dir_path)) { + if (locale_name == server->standardize_locale(locale_name)) { + if (load_locale_dir(dir_path.path_join(locale_name), locale_name) != OK) + err = FAILED; + } else { + err = FAILED; + UtilityFunctions::push_error("Invalid locale directory name: ", locale_name); + } + } + return err; + } + UtilityFunctions::push_error("Localisation directory does not exist: ", dir_path); + return FAILED; +} -- cgit v1.2.3-56-ga3b1