diff options
author | hop311 <hop3114@gmail.com> | 2023-11-08 23:24:21 +0100 |
---|---|---|
committer | hop311 <hop3114@gmail.com> | 2023-11-16 00:24:28 +0100 |
commit | bc0b3c61ae0b742da304cada451fba1df72bb0ad (patch) | |
tree | 047968e7ea8189ad8391dcabbd09fee1d8cdc30c /extension/src/openvic-extension/LoadLocalisation.cpp | |
parent | 72d893d55d26ae9dc6739a853d1773b3cb286123 (diff) |
GUI elements -> Godot UI nodes generator
Diffstat (limited to 'extension/src/openvic-extension/LoadLocalisation.cpp')
-rw-r--r-- | extension/src/openvic-extension/LoadLocalisation.cpp | 168 |
1 files changed, 0 insertions, 168 deletions
diff --git a/extension/src/openvic-extension/LoadLocalisation.cpp b/extension/src/openvic-extension/LoadLocalisation.cpp deleted file mode 100644 index ee90633..0000000 --- a/extension/src/openvic-extension/LoadLocalisation.cpp +++ /dev/null @@ -1,168 +0,0 @@ -#include "LoadLocalisation.hpp" - -#include <godot_cpp/classes/dir_access.hpp> -#include <godot_cpp/classes/file_access.hpp> -#include <godot_cpp/classes/translation_server.hpp> -#include <godot_cpp/variant/utility_functions.hpp> - -#include "openvic-extension/Utilities.hpp" - -using namespace godot; -using namespace OpenVic; - -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(String const& file_path, Ref<Translation> translation) const { - const Ref<FileAccess> 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()) { - static const String delimeter = ";"; - const PackedStringArray line = file->get_csv_line(delimeter); - 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 - ); - err = FAILED; - } 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 - ); - err = FAILED; - } - continue; - } - translation->add_message(line[0], line[1].c_unescape()); - } - return err; -} - -Ref<Translation> LoadLocalisation::_get_translation(String const& locale) const { - TranslationServer* server = TranslationServer::get_singleton(); - if (server == nullptr) { - UtilityFunctions::push_error("Failed to get TranslationServer singleton"); - return nullptr; - } - Ref<Translation> 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) const { - return _load_file(file_path, _get_translation(locale)); -} - -/* REQUIREMENTS - * FS-18, FS-24, FS-25 - */ -Error LoadLocalisation::load_locale_dir(String const& dir_path, String const& locale) const { - if (!DirAccess::dir_exists_absolute(dir_path)) { - UtilityFunctions::push_error("Locale directory does not exist: ", dir_path); - return FAILED; - } - /* This will add the locale to the list of loaded locales even if it has no - * localisation files - this is useful for testing other aspects of localisation - * such as number formatting and text direction. To disable this behaviour and - * only show non-empty localisations, move the `_get_translation` call to after - * the `files.size()` check. - */ - const Ref<Translation> translation = _get_translation(locale); - const PackedStringArray files = DirAccess::get_files_at(dir_path); - if (files.size() < 1) { - UtilityFunctions::push_error("Locale directory does not contain any files: ", dir_path); - return FAILED; - } - Error err = OK; - for (String const& file_name : files) { - if (file_name.get_extension().to_lower() == "csv") { - if (_load_file(dir_path.path_join(file_name), translation) != OK) { - err = FAILED; - } - } - } - return err; -} - -/* REQUIREMENTS - * FS-23 - */ -Error LoadLocalisation::load_localisation_dir(String const& dir_path) const { - if (!DirAccess::dir_exists_absolute(dir_path)) { - UtilityFunctions::push_error("Localisation directory does not exist: ", dir_path); - return FAILED; - } - PackedStringArray const dirs = DirAccess::get_directories_at(dir_path); - if (dirs.size() < 1) { - UtilityFunctions::push_error("Localisation directory does not contain any sub-directories: ", dir_path); - return FAILED; - } - TranslationServer* server = TranslationServer::get_singleton(); - if (server == nullptr) { - UtilityFunctions::push_error("Failed to get TranslationServer singleton"); - return FAILED; - } - Error err = OK; - for (String const& locale_name : dirs) { - if (locale_name != server->standardize_locale(locale_name)) { - UtilityFunctions::push_error("Invalid locale directory name: ", locale_name); - } else if (load_locale_dir(dir_path.path_join(locale_name), locale_name) == OK) { - continue; - } - err = FAILED; - } - return err; -} -bool LoadLocalisation::add_message(std::string_view key, Dataloader::locale_t locale, std::string_view localisation) { - static Ref<Translation> translations[Dataloader::_LocaleCount] = { nullptr }; - Ref<Translation>& translation = translations[locale]; - if (translation.is_null()) { - translation = singleton->_get_translation(Dataloader::locale_names[locale]); - if (translation.is_null()) { - UtilityFunctions::push_error("Failed to get translation object: ", Dataloader::locale_names[locale]); - return false; - } - } - const StringName godot_key = Utilities::std_view_to_godot_string(key); - const StringName godot_localisation = Utilities::std_view_to_godot_string(localisation); - if (0) { - const StringName old_localisation = translation->get_message(godot_key); - if (!old_localisation.is_empty()) { - UtilityFunctions::push_warning( - "Changing translation ", godot_key, " (", Dataloader::locale_names[locale], ") from \"", - old_localisation, "\" to \"", godot_localisation, "\"" - ); - } - } - translation->add_message(godot_key, godot_localisation); - return true; -} |