From 997ec67c58afdf783dfc02112f9ae23c2b44611d Mon Sep 17 00:00:00 2001 From: Tsubasa6848 <116721335+Tsubasa6848@users.noreply.github.com> Date: Mon, 6 May 2024 00:06:12 +0800 Subject: [PATCH] feat: finish I18n --- SDK-GMLIB | 2 +- lib/GMLIB_API-JS.js | 76 +++++++++++++++++++++++++++++++--------- src/CompatibilityApi.cpp | 31 ++++++++++++++++ 3 files changed, 92 insertions(+), 17 deletions(-) diff --git a/SDK-GMLIB b/SDK-GMLIB index fd84632..7206bf0 160000 --- a/SDK-GMLIB +++ b/SDK-GMLIB @@ -1 +1 @@ -Subproject commit fd8463224fca3a7a716b7dc29bac2cc4aeae4dfb +Subproject commit 7206bf0c108cb469a5239769604c385150e592e0 diff --git a/lib/GMLIB_API-JS.js b/lib/GMLIB_API-JS.js index e596f3e..d5330a7 100644 --- a/lib/GMLIB_API-JS.js +++ b/lib/GMLIB_API-JS.js @@ -93,7 +93,12 @@ const GMLIB_API = { getPlayerSpawnPoint: ll.import("GMLIB_API", "getPlayerSpawnPoint"), setPlayerSpawnPoint: ll.import("GMLIB_API", "setPlayerSpawnPoint"), clearPlayerSpawnPoint: ll.import("GMLIB_API", "clearPlayerSpawnPoint"), - setCustomPackPath: ll.import("GMLIB_API", "setCustomPackPath") + setCustomPackPath: ll.import("GMLIB_API", "setCustomPackPath"), + getSupportedLanguages: ll.import("GMLIB_API", "getSupportedLanguages"), + loadLanguage: ll.import("GMLIB_API", "loadLanguage"), + updateOrCreateLanguageFile: ll.import("GMLIB_API", "updateOrCreateLanguageFile"), + loadLanguagePath: ll.import("GMLIB_API", "loadLanguagePath"), + mergePatchJson: ll.import("GMLIB_API", "mergePatchJson") } const FloatingTextList = []; @@ -360,11 +365,11 @@ class Minecraft { } static getServerLanguage() { - return GMLIB_API.getResourcePackI18nLanguage(language); + return I18nAPI.getCurrentLanguage(); } static setServerLanguage(language) { - return GMLIB_API.chooseResourcePackI18nLanguage(language); + return I18nAPI.chooseLanguage(language); } static setCustomPackPath(path) { @@ -372,7 +377,7 @@ class Minecraft { } static resourcePackTranslate(key, params = []) { - return GMLIB_API.resourcePackTranslate(key, params); + return I18nAPI.get(key, params); } } @@ -693,7 +698,14 @@ class JsonConfig { init() { if (File.exists(this.mPath)) { let existDataStr = File.readFrom(this.mPath); - this.mData = Object.assign({}, this.mData, JSON.parse(existDataStr)); + existDataStr = existDataStr.replace(/\/\/.*|\/\*[^]*?\*\//g, ""); + try { + let result = GMLIB_API.mergePatchJson(JSON.stringify(this.mData), existDataStr); + this.mData = JSON.parse(result); + } catch { + let newPath = this.mPath + "_old"; + File.rename(this.mPath, newPath); + } } this.save(); } @@ -707,9 +719,9 @@ class JsonConfig { return this.mData; } - get(key, defultValue = null) { + get(key, defultValue = undefined) { let result = this.getData()[key]; - if (!result && defultValue != null) { + if (!result && defultValue != undefined) { this.set(key, defultValue); return defultValue; } @@ -795,6 +807,44 @@ class JsonI18n { } }; +class I18nAPI { + constructor() { + throw new Error("Static class cannot be instantiated"); + } + + static get(key, params = []) { + GMLIB_API.resourcePackTranslate(key, params); + } + + static translate(key, params = []) { + return I18nAPI.get(key, params); + } + + static getSupportedLanguages() { + return GMLIB_API.getSupportedLanguages(); + } + + static getCurrentLanguage() { + return GMLIB_API.getResourcePackI18nLanguage(language); + } + + static chooseLanguage(language) { + GMLIB_API.chooseResourcePackI18nLanguage(language); + } + + static loadLanguage(code, language) { + GMLIB_API.loadLanguage(code, language); + } + + static updateOrCreateLanguageFile(code, lang, path) { + GMLIB_API.updateOrCreateLanguageFile(code, lang, path); + } + + static loadLanguagePath(path) { + GMLIB_API.loadLanguagePath(path); + } +}; + LLSE_Player.prototype.toEntity = function () { return GMLIB_API.PlayerToEntity(this); } @@ -819,7 +869,6 @@ LLSE_Entity.prototype.throwEntity = function (proj, speed = 2, offset = 3) { return GMLIB_API.throwEntity(this, proj, speed, offset); } - module.exports = { StaticFloatingText, DynamicFloatingText, @@ -831,11 +880,6 @@ module.exports = { JsonConfig, JsonLanguage, JsonI18n, - Version -}; - - - - - - + Version, + I18nAPI +}; \ No newline at end of file diff --git a/src/CompatibilityApi.cpp b/src/CompatibilityApi.cpp index fee336c..ff83f99 100644 --- a/src/CompatibilityApi.cpp +++ b/src/CompatibilityApi.cpp @@ -175,6 +175,31 @@ void Export_Compatibility_API() { } return "unknown"; }); + RemoteCall::exportAs("GMLIB_API", "getSupportedLanguages", []() -> std::vector { + if (GMLIB_Level::getInstance()) { + return I18nAPI::getSupportedLanguageCodes(); + } + return {}; + }); + RemoteCall::exportAs("GMLIB_API", "loadLanguage", [](std::string code, std::string lang) -> void { + if (GMLIB_Level::getInstance()) { + I18nAPI::loadLanguage(code, lang); + } + }); + RemoteCall::exportAs( + "GMLIB_API", + "updateOrCreateLanguageFile", + [](std::string code, std::string lang, std::string path) -> void { + if (GMLIB_Level::getInstance()) { + I18nAPI::updateOrCreateLanguageFile(path, code, lang); + } + } + ); + RemoteCall::exportAs("GMLIB_API", "loadLanguagePath", [](std::string path) -> void { + if (GMLIB_Level::getInstance()) { + I18nAPI::loadLanguagesFromDirectory(path); + } + }); RemoteCall::exportAs("GMLIB_API", "getPlayerPosition", [](std::string uuid) -> std::pair { auto uid = mce::UUID::fromString(uuid); auto pos = GMLIB_Player::getPlayerPosition(uid); @@ -427,4 +452,10 @@ void Export_Compatibility_API() { auto player = (GMLIB_Player*)pl; player->clearSpawnPoint(); }); + RemoteCall::exportAs("GMLIB_API", "mergePatchJson", [](std::string oldJson, std::string patchJson) -> std::string { + auto oldData = nlohmann::ordered_json::parse(oldJson); + auto newData = nlohmann::ordered_json::parse(patchJson); + oldData.merge_patch(newData); + return oldData.dump(); + }); } \ No newline at end of file