From 01e6306ef2677b7ae4d1e57759ece4cc8ab0b399 Mon Sep 17 00:00:00 2001 From: BONNe Date: Mon, 20 Sep 2021 11:15:24 +0300 Subject: [PATCH] Implement multi-linguistic server support. Now server owners can specify different name, description and reward text for each challenge and level via locales file. Add showcase example. --- .../challenges/panel/CommonPanel.java | 54 +++++++-- src/main/resources/locales/en-US.yml | 105 +++++++++++------- 2 files changed, 111 insertions(+), 48 deletions(-) diff --git a/src/main/java/world/bentobox/challenges/panel/CommonPanel.java b/src/main/java/world/bentobox/challenges/panel/CommonPanel.java index 1e5d967..60c7492 100644 --- a/src/main/java/world/bentobox/challenges/panel/CommonPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/CommonPanel.java @@ -139,9 +139,16 @@ public abstract class CommonPanel final String reference = Constants.DESCRIPTIONS + "challenge."; - // Get description in single string - String description = Util.translateColorCodes(String.join("\n", - challenge.getDescription())); + // Get description from custom translations + String description = this.user.getTranslationOrNothing( + "challenges.challenges." + challenge.getUniqueId() + ".description"); + + if (description.isEmpty()) + { + // Get data from object in single string. + description = Util.translateColorCodes(String.join("\n", challenge.getDescription())); + } + // Non-memory optimal code used for easier debugging and nicer code layout for my eye :) // Get status in single string String status = this.generateChallengeStatus(isCompletedOnce, @@ -678,8 +685,16 @@ public abstract class CommonPanel return ""; } + String rewardText = this.user.getTranslationOrNothing( + "challenges.challenges." + challenge.getUniqueId() + ".repeat-reward-text"); + + if (rewardText.isEmpty()) + { + rewardText = Util.translateColorCodes(String.join("\n", challenge.getRepeatRewardText())); + } + return this.user.getTranslationOrNothing(reference + "lore", - "[text]", Util.translateColorCodes(String.join("\n", challenge.getRepeatRewardText())), + "[text]", rewardText, "[items]", items, "[experience]", experience, "[money]", money, @@ -771,8 +786,16 @@ public abstract class CommonPanel return ""; } + String rewardText = this.user.getTranslationOrNothing( + "challenges.challenges." + challenge.getUniqueId() + ".reward-text"); + + if (rewardText.isEmpty()) + { + rewardText = Util.translateColorCodes(String.join("\n", challenge.getRewardText())); + } + return this.user.getTranslationOrNothing(reference + "lore", - "[text]", Util.translateColorCodes(String.join("\n", challenge.getRewardText())), + "[text]", rewardText, "[items]", items, "[experience]", experience, "[money]", money, @@ -834,8 +857,16 @@ public abstract class CommonPanel // Get rewards in single string String rewards = !levelStatus.isUnlocked() ? "" : this.generateReward(level); + String description = this.user.getTranslationOrNothing( + "challenges.levels." + level.getUniqueId() + ".description"); + + if (description.isEmpty()) + { + description = Util.translateColorCodes(String.join("\n", level.getUnlockMessage())); + } + String returnString = this.user.getTranslation(reference + "lore", - "[text]", Util.translateColorCodes(levelStatus.getLevel().getUnlockMessage()), + "[text]", description, "[waiver]", waiver, "[rewards]", rewards, "[status]", status); @@ -966,8 +997,16 @@ public abstract class CommonPanel return ""; } + String rewardText = this.user.getTranslationOrNothing( + "challenges.levels." + level.getUniqueId() + ".reward-text"); + + if (rewardText.isEmpty()) + { + rewardText = Util.translateColorCodes(String.join("\n", level.getRewardText())); + } + return this.user.getTranslationOrNothing(reference + "lore", - "[text]", Util.translateColorCodes(String.join("\n", level.getRewardText())), + "[text]", rewardText, "[items]", items, "[experience]", experience, "[money]", money, @@ -975,7 +1014,6 @@ public abstract class CommonPanel } - // --------------------------------------------------------------------- // Section: Variables // --------------------------------------------------------------------- diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 8688c6f..547b75f 100755 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -1141,46 +1141,71 @@ challenges: invalid-challenge: "&c Challenge [challenge] contains invalid data. It will not be loaded from database!" no-library-entries: "&c Cannot find any library entries. Nothing to show." not-hooked: "&c Challenges Addon could not find any GameMode." - # Showcase for manual material translation - materials: - # Names should be lowercase. - cobblestone: "Cobblestone" - # Also supports descriptions. - stone: - name: "Stone" - description: "" - item-stacks: - # Non-specific item meta translations. - # TYPE is the item type - # META is a content of item meta. - generic: "[type] [meta]" - # Non-specific meta translations. Will replace [meta] - meta: - upgraded: "Upgraded" - extended: "Extended" - potion-meta: "&e [type] [upgraded] [extended]" - # Be aware, enchants are always listed below item in separate line. - enchant-meta: " &7 - &e [type] [level]" - skull-meta: ": &e [player-name]" - book-meta: "&e [title] [author]" - # Custom Enchantment Translation. - enchant: - menting: "Mending" - unbreaking: "Unbreaking" - # Custom Potion Translation. - potion-effect: - water_breathing: "Water Breathing" - # You can also create specific item translations - # Like translate all potions. - potion: - # This will overwrite generic translation. - name: "[type] [upgraded] [extended]" - # Type is either specific translation or potion effect. - water_breathing: "Potion of Water Breathing" - stone_shovel: - # This will mean that only stone shovels will not show - # meta information. - name: "[type]" +# # Showcase for manual material translation +# materials: +# # Names should be lowercase. +# cobblestone: "Cobblestone" +# # Also supports descriptions. +# stone: +# name: "Stone" +# description: "" +# item-stacks: +# # Non-specific item meta translations. +# # TYPE is the item type +# # META is a content of item meta. +# generic: "[type] [meta]" +# # Non-specific meta translations. Will replace [meta] +# meta: +# upgraded: "Upgraded" +# extended: "Extended" +# potion-meta: "&e [type] [upgraded] [extended]" +# # Be aware, enchants are always listed below item in separate line. +# enchant-meta: " &7 - &e [type] [level]" +# skull-meta: ": &e [player-name]" +# book-meta: "&e [title] [author]" +# # Custom Enchantment Translation. +# enchant: +# menting: "Mending" +# unbreaking: "Unbreaking" +# # Custom Potion Translation. +# potion-effect: +# water_breathing: "Water Breathing" +# # You can also create specific item translations +# # Like translate all potions. +# potion: +# # This will overwrite generic translation. +# name: "[type] [upgraded] [extended]" +# # Type is either specific translation or potion effect. +# water_breathing: "Potion of Water Breathing" +# stone_shovel: +# # This will mean that only stone shovels will not show +# # meta information. +# name: "[type]" +# +# # Showcase how to support multi-linguistic challenges +# challenges: +# # Database ID name. +# example_challenge_id: +# name: "&2 Translated Name" +# description: |- +# &7 Translated Custom +# &7 description +# reward-text: |- +# &7 Translated Reward +# &7 text +# repeat-reward-text: |- +# &7 Translated Repeat +# &7 Reward text +# levels: +# # Database ID name. +# example_level_id: +# name: "&2 Translated Name" +# description: |- +# &7 Translated Custom +# &7 description +# reward-text: |- +# &7 Translated Reward +# &7 text protection: flags: CHALLENGES_ISLAND_PROTECTION: