From 1f5b06daa242c30f5b561b8e60f4cc3a08d0b9dd Mon Sep 17 00:00:00 2001 From: X-Green <35984104+X-Green@users.noreply.github.com> Date: Sat, 16 May 2020 01:58:50 +0800 Subject: [PATCH 1/3] Add Language Support For Carpet Settings (#267) * Added language supports for carpet settings use /set-carpet-language to set your language. * Added zh_cn.json - in progress Not accomplished yet, only translations for testing the language support. * Create model_for_new_language.jsons.txt * Rename model_for_new_language.jsons.txt to model_for_new_language.json * Update model_for_new_language.json * Update model_for_new_language.json * Update and rename model_for_new_language.json to en_us.json * Added setting CarpetLanguage * Delete SetLanguageCommand.java * Add files via upload * Update SettingsManager.java * Add files via upload * Update LanguageUtils.java * Update SettingsManager.java --- src/main/java/carpet/CarpetSettings.java | 8 ++ .../java/carpet/settings/SettingsManager.java | 63 +++++++---- src/main/java/carpet/utils/LanguageUtils.java | 106 ++++++++++++++++++ .../resources/assets/carpet/lang/en_us.json | 49 ++++++++ .../resources/assets/carpet/lang/zh_cn.json | 41 +++++++ 5 files changed, 243 insertions(+), 24 deletions(-) create mode 100644 src/main/java/carpet/utils/LanguageUtils.java create mode 100644 src/main/resources/assets/carpet/lang/en_us.json create mode 100644 src/main/resources/assets/carpet/lang/zh_cn.json diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 2d83b9c3..e2b6b843 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -41,6 +41,14 @@ public class CarpetSettings public static Vec3d fixedPosition = null; public static int runPermissionLevel = 2; + @Rule( + desc = "sets the language of CarpetMod", + category = {CREATIVE, SURVIVAL}, + options = {"none"}, + strict = false + ) + public static String carpetLanguage = "none"; + @Rule( desc = "Nether portals correctly place entities going through", extra = "Entities shouldn't suffocate in obsidian", diff --git a/src/main/java/carpet/settings/SettingsManager.java b/src/main/java/carpet/settings/SettingsManager.java index 675df7b8..bb1fd66f 100644 --- a/src/main/java/carpet/settings/SettingsManager.java +++ b/src/main/java/carpet/settings/SettingsManager.java @@ -2,6 +2,7 @@ package carpet.settings; import carpet.CarpetServer; import carpet.CarpetSettings; +import carpet.utils.LanguageUtils; import carpet.utils.Messenger; import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; @@ -350,7 +351,7 @@ public class SettingsManager String ruleName = StringArgumentType.getString(ctx, "rule"); ParsedRule rule = getRule(ruleName); if (rule == null) - throw new SimpleCommandExceptionType(Messenger.c("rb Unknown rule: "+ruleName)).create(); + throw new SimpleCommandExceptionType(Messenger.c("rb "+ LanguageUtils.translateOrDefault("carpet.ui.statement.unknown_rule","Unknown rule")+": "+ruleName)).create(); return rule; } @@ -366,18 +367,22 @@ public class SettingsManager LiteralArgumentBuilder literalargumentbuilder = literal(identifier).requires((player) -> player.hasPermissionLevel(2) && !locked); - literalargumentbuilder.executes((context)->listAllSettings(context.getSource())). + literalargumentbuilder.executes((context)-> + { + LanguageUtils.setLanguage(CarpetSettings.carpetLanguage); + return listAllSettings(context.getSource()); + }). then(literal("list"). - executes( (c) -> listSettings(c.getSource(), "All "+fancyName+" Settings", + executes( (c) -> listSettings(c.getSource(), String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.all_%s_settings","All %s Settings"), fancyName), getRules())). then(literal("defaults"). executes( (c)-> listSettings(c.getSource(), - "Current "+fancyName+" Startup Settings from "+identifier+".conf", + String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.current_%s_startup_settings_from_%s","Current %s Startup Settings from %s"), fancyName, (identifier+".conf")), findStartupOverrides()))). then(argument("tag",StringArgumentType.word()). suggests( (c, b)->suggestMatching(getCategories(), b)). executes( (c) -> listSettings(c.getSource(), - String.format(fancyName+" Settings matching \"%s\"", StringArgumentType.getString(c, "tag")), + String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.%s_settings_matching_'%s'","%s Settings matching \"%s\""), fancyName, LanguageUtils.translateOrDefault("carpet.ui.category." + StringArgumentType.getString(c, "tag"),StringArgumentType.getString(c, "tag"))), getRulesMatching(StringArgumentType.getString(c, "tag")))))). then(literal("removeDefault"). requires(s -> !locked). @@ -405,33 +410,36 @@ public class SettingsManager private int displayRuleMenu(ServerCommandSource source, ParsedRule rule) { PlayerEntity player; + String translatedPlusName = LanguageUtils.translatePlusDefault(LanguageUtils.getRuleNameKey(rule.name), rule.name); try { player = source.getPlayer(); } catch (CommandSyntaxException e) { - Messenger.m(source, "w "+rule.name +" is set to: ","wb "+rule.getAsString()); + Messenger.m(source, "w "+ translatedPlusName +" "+LanguageUtils.translateOrDefault( "carpet.ui.statement.is_set_to","is set to")+": ","wb "+rule.getAsString()); return 1; } Messenger.m(player, ""); - Messenger.m(player, "wb "+rule.name,"!/"+identifier+" "+rule.name,"^g refresh"); - Messenger.m(player, "w "+rule.description); + Messenger.m(player, "wb "+ translatedPlusName ,"!/"+identifier+" "+rule.name,"^g refresh"); + Messenger.m(player, "w "+ LanguageUtils.translateOrDefault(LanguageUtils.getRuleDescKey(rule.name), rule.description)); - rule.extraInfo.forEach(s -> Messenger.m(player, "g "+s)); + ImmutableList translatedExtraInfo = LanguageUtils.getRuleExtras(rule.name, rule.extraInfo); + translatedExtraInfo.forEach(s -> Messenger.m(player, "g "+s)); List tags = new ArrayList<>(); - tags.add(Messenger.c("w Tags: ")); + tags.add(Messenger.c("w "+LanguageUtils.translateOrDefault("carpet.ui.statement.tags", "Tags")+": ")); for (String t: rule.categories) { - tags.add(Messenger.c("c ["+t+"]", "^g list all "+t+" settings","!/"+identifier+" list "+t)); + String translated = LanguageUtils.translateOrDefault("carpet.ui.category." + t, t); + tags.add(Messenger.c("c ["+ translated +"]", "^g "+ String.format(LanguageUtils.translateOrDefault("list_all_%s_settings","list all %s settings"), translated),"!/"+identifier+" list "+t)); tags.add(Messenger.c("w , ")); } tags.remove(tags.size()-1); Messenger.m(player, tags.toArray(new Object[0])); - Messenger.m(player, "w Current value: ",String.format("%s %s (%s value)",rule.getBoolValue()?"lb":"nb", rule.getAsString(),rule.isDefault()?"default":"modified")); + Messenger.m(player, "w "+LanguageUtils.translateOrDefault("carpet.ui.statement.current_value", "Current value")+": ",String.format("%s %s (%s value)",rule.getBoolValue()?"lb":"nb", rule.getAsString(),rule.isDefault()?"default":"modified")); List options = new ArrayList<>(); options.add(Messenger.c("w Options: ", "y [ ")); for (String o: rule.options) @@ -449,8 +457,8 @@ public class SettingsManager private int setRule(ServerCommandSource source, ParsedRule rule, String newValue) { if (rule.set(source, newValue) != null) - Messenger.m(source, "w "+rule.toString()+", ", "c [change permanently?]", - "^w Click to keep the settings in "+identifier+".conf to save across restarts", + Messenger.m(source, "w "+rule.toString()+", ", "c ["+LanguageUtils.translateOrDefault("carpet.ui.statement.change_permanently","change permanently")+"?]", + "^w "+String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.click_to_keep_the_settings_in_%s_to_save_across_restarts","Click to keep the settings in %s to save across restarts"), identifier+".conf"), "?/"+identifier+" setDefault "+rule.name+" "+rule.getAsString()); return 1; } @@ -465,7 +473,7 @@ public class SettingsManager writeSettingsToConf(conf.getLeft()); // this may feels weird, but if conf // is locked, it will never reach this point. rule.set(source,stringValue); - Messenger.m(source ,"gi rule "+ rule.name+" will now default to "+ stringValue); + Messenger.m(source ,"gi "+String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.rule_%s_will_now_default_to_%s","rule %s will now default to %s"), LanguageUtils.translateOrDefault(LanguageUtils.getRuleNameKey(rule.name), rule.name), stringValue)); return 1; } // removes overrides of the default values in the file @@ -482,10 +490,11 @@ public class SettingsManager private BaseText displayInteractiveSetting(ParsedRule rule) { + String translatedPlusName = LanguageUtils.translatePlusDefault(LanguageUtils.getRuleNameKey(rule.name), rule.name); List args = new ArrayList<>(); - args.add("w - "+rule.name+" "); + args.add("w - "+ translatedPlusName +" "); args.add("!/"+identifier+" "+rule.name); - args.add("^y "+rule.description); + args.add("^y "+LanguageUtils.translateOrDefault(LanguageUtils.getRuleDescKey(rule.name), rule.description)); for (String option: rule.options) { args.add(makeSetRuleButton(rule, option, true)); @@ -511,10 +520,10 @@ public class SettingsManager } String baseText = style + (brackets ? " [" : " ") + option + (brackets ? "]" : ""); if (locked) - return Messenger.c(baseText, "^g "+fancyName+" settings are locked"); + return Messenger.c(baseText, "^g "+fancyName+" " + LanguageUtils.translateOrDefault("carpet.ui.statement.settings_are_locked","settings are locked")); if (option.equalsIgnoreCase(rule.getAsString())) return Messenger.c(baseText); - return Messenger.c(baseText, "^g Switch to " + option+(option.equalsIgnoreCase(rule.defaultAsString)?" (default)":""), "?/"+identifier+" " + rule.name + " " + option); + return Messenger.c(baseText, "^g "+ LanguageUtils.translateOrDefault("carpet.ui.statement.switch_to","Switch to") +" " + option+(option.equalsIgnoreCase(rule.defaultAsString)?" (default)":""), "?/"+identifier+" " + rule.name + " " + option); } private int listSettings(ServerCommandSource source, String title, Collection> settings_list) @@ -535,19 +544,25 @@ public class SettingsManager } private int listAllSettings(ServerCommandSource source) { - listSettings(source, "Current "+fancyName+" Settings", getNonDefault()); + //listSettings(source, "Current "+fancyName+" Settings", getNonDefault()); + listSettings(source, String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.current_%s_settings","Current %s Settings"), fancyName), getNonDefault()); if (version != null) - Messenger.m(source, "g "+fancyName+" version: "+ version); + //Messenger.m(source, "g "+fancyName+" version: "+ version); + Messenger.m(source, "g "+fancyName+" "+ LanguageUtils.translateOrDefault("carpet.ui.statement.version", "version") + ": "+ version); try { PlayerEntity player = source.getPlayer(); List tags = new ArrayList<>(); - tags.add("w Browse Categories:\n"); + //tags.add("w Browse Categories:\n"); + tags.add("w " + LanguageUtils.translateOrDefault("carpet.ui.statement.browse_categories", "Browse Categories") + ":\n"); for (String t : getCategories()) { - tags.add("c [" + t+"]"); - tags.add("^g list all " + t + " settings"); + String translated = LanguageUtils.translateOrDefault("carpet.ui.category." + t, t); + String translatedPlus = LanguageUtils.translatePlusDefault("carpet.ui.category." + t, t); + tags.add("c [" + translated +"]"); + //tags.add("^g list all " + translated + " settings"); + tags.add("^g " + String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.list_all_%s_settings","list all %s settings"), translatedPlus)); tags.add("!/"+identifier+" list " + t); tags.add("w "); } diff --git a/src/main/java/carpet/utils/LanguageUtils.java b/src/main/java/carpet/utils/LanguageUtils.java new file mode 100644 index 00000000..65e3015b --- /dev/null +++ b/src/main/java/carpet/utils/LanguageUtils.java @@ -0,0 +1,106 @@ +package carpet.utils; + +import com.google.common.collect.ImmutableList; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class LanguageUtils +{ + private static Map translationMap; + + public static String currentLanguage; + + public static String translate(String translationKey) + { + if (translationMap == null) + { + return translationKey; + } + return translationMap.getOrDefault(translationKey, translationKey); + } + + public static String translateOrDefault(String translationKey, String defaultValue) + { + if (translationMap == null) + { + return defaultValue; + } + return translationMap.getOrDefault(translationKey, defaultValue); + } + + public static String translatePlusDefault(String translationKey, String defaultValue){ + return translationMap.containsKey(translationKey) ? translateOrDefault(translationKey, defaultValue) + String.format(" (%s)", defaultValue): defaultValue; + } + + public static String getRuleNameKey(String rule) + { + return String.format("carpet.rule.%s.name", rule); + } + + public static String getRuleDescKey(String rule) + { + return String.format("carpet.rule.%s.desc", rule); + } + + public static ImmutableList getRuleExtras(String rule, ImmutableList defaultList) + { + if (translationMap == null) return defaultList; + String keyBase = String.format("carpet.rule.%s.extra.", rule); + List extras = new ArrayList<>(); + int i = 0; + do { + String keyExtra = keyBase + i; + String value = translationMap.get(keyExtra); + System.out.println(keyExtra); + System.out.println(value); + if (value != null && !value.equals("")) + { + extras.add(value); + } + i++; + } + while (translationMap.containsKey(keyBase + (i - 1))); + return (extras.isEmpty()) ? defaultList : ImmutableList.copyOf(extras); + } + + public static void setLanguage(String language) + { + if (language.equals("none")) + { + currentLanguage = language; + translationMap = null; + return; + } + + String langJs; + try{ + langJs = IOUtils.toString( + Objects.requireNonNull(LanguageUtils.class.getClassLoader().getResourceAsStream(String.format("assets/carpet/lang/%s.json", language))), + StandardCharsets.UTF_8); + } catch (NullPointerException | IOException e) { + return; + } + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Type type = new TypeToken>() {}.getType(); + Map map1 = gson.fromJson(langJs, type); + currentLanguage = language; + translationMap = map1; + } + + public static void loadConfiguration() + { + + } + + +} diff --git a/src/main/resources/assets/carpet/lang/en_us.json b/src/main/resources/assets/carpet/lang/en_us.json new file mode 100644 index 00000000..ad516a4a --- /dev/null +++ b/src/main/resources/assets/carpet/lang/en_us.json @@ -0,0 +1,49 @@ +// This file isn't necessary at all, because the language module would use the strings coded in the source if language "none" is selected. +// So en_us is the default language and probably no change will be made after loading this file. +// But it could be a good example for writing the language file for other languages. + +{ + "carpet.rule.portalSuffocationFix.name": "", + "// the key is genetated as:" : "String.format('carpet.rule.%s.name', rule.name)", + + + "carpet.rule.portalSuffocationFix.desc": "", + "// the key is genetated as:" : "String.format('carpet.rule.%s.desc', rule.name)", + + + "carpet.rule.portalSuffocationFix.extra.0": "", + "carpet.rule.portalSuffocationFix.extra.1": "", + "// the key is genetated as:" : "String.format('carpet.rule.%s.extra.%i', rule.name, index)", + + + "carpet.ui.category.bugfix": "bugfix", + "carpet.ui.category.survival": "survival", + "carpet.ui.category.creative": "creative", + "carpet.ui.category.experimental": "experimental", + "carpet.ui.category.optimization": "optimization", + "carpet.ui.category.feature": "feature", + "carpet.ui.category.command": "command", + "carpet.ui.category.tnt": "TNT", + "carpet.ui.category.dispenser": "dispenser", + "carpet.ui.category.scarpet": "scarpet", + "carpet.ui.category.client": "client", + + + "carpet.ui.statement.browse_categories": "Brouse categories", + "carpet.ui.statement.list_all_%s_settings": "list all %s settings", + "carpet.ui.statement.version": "Version", + "carpet.ui.statement.current_%s_settings": "Current %s settings", + "carpet.ui.statement.switch_to": "Switch to", + "carpet.ui.statement.settings_are_locked": "settings are locked", + "carpet.ui.statement.is_set_to": "is set to", + "carpet.ui.statement.unknown_rule": "Unknown ruls", + "carpet.ui.statement.current_%s_startup_settings_from_%s": "current %s startup settings from %s", + "carpet.ui.statement.%s_settings_matching_'%s'": "%s settings matching \"%s\" ", + "carpet.ui.statement.all_%s_settings": "all %s settings", + "carpet.ui.statement.tags": "Tags", + "carpet.ui.statement.change_permanently": "Change permanently", + "carpet.ui.statement.click_to_keep_the_settings_in_%s_to_save_across_restarts": "click to keep the settings in %s to save across restarts", + "carpet.ui.statement.rule_%s_will_now_default_to_%s": "rule %s will now default to %s", + "carpet.ui.statement.current_value": "current value" + +} diff --git a/src/main/resources/assets/carpet/lang/zh_cn.json b/src/main/resources/assets/carpet/lang/zh_cn.json new file mode 100644 index 00000000..0ff8835f --- /dev/null +++ b/src/main/resources/assets/carpet/lang/zh_cn.json @@ -0,0 +1,41 @@ +{ + "carpet.rule.portalSuffocationFix.name": "传送门窒息修复", + + + "carpet.rule.portalSuffocationFix.desc": "使下界传送门正确地传送实体", + + + "carpet.rule.portalSuffocationFix.extra.0": "0000000", + "carpet.rule.portalSuffocationFix.extra.1": "1111111", + + + "carpet.ui.category.bugfix": "BUG修复", + "carpet.ui.category.survival": "生存", + "carpet.ui.category.creative": "创造", + "carpet.ui.category.experimental": "试验性", + "carpet.ui.category.optimization": "优化", + "carpet.ui.category.feature": "特性", + "carpet.ui.category.command": "指令", + "carpet.ui.category.tnt": "TNT", + "carpet.ui.category.dispenser": "发射器", + "carpet.ui.category.scarpet": "SCarpet脚本语言", + "carpet.ui.category.client": "客户端", + + "carpet.ui.statement.browse_categories": "浏览分类", + "carpet.ui.statement.list_all_%s_settings": "列出所有 %s 选项", + "carpet.ui.statement.version": "版本", + "carpet.ui.statement.current_%s_settings": "目前启用的 %s 选项", + "carpet.ui.statement.switch_to": "切换至", + "carpet.ui.statement.settings_are_locked": "选项被锁定", + "carpet.ui.statement.is_set_to": "被设置为", + "carpet.ui.statement.unknown_rule": "未知的规则选项", + "carpet.ui.statement.current_%s_startup_settings_from_%s": "目前启用的%s选项,从%s中读取得", + "carpet.ui.statement.%s_settings_matching_'%s'": "%s中符合\"%s\"的选项:", + "carpet.ui.statement.all_%s_settings": "所有的%s选项", + "carpet.ui.statement.tags": "分类", + "carpet.ui.statement.change_permanently": "永久更改", + "carpet.ui.statement.click_to_keep_the_settings_in_%s_to_save_across_restarts": "点击此按钮以使此选项保存于%s,重启后依旧生效", + "carpet.ui.statement.rule_%s_will_now_default_to_%s": "规则%s将会被默认设置为%s", + "carpet.ui.statement.current_value": "当前的值" + +} \ No newline at end of file From 1e39f6caa82b2b82aa9ce8273b93685ed01d3803 Mon Sep 17 00:00:00 2001 From: gnembon Date: Fri, 15 May 2020 17:26:36 -0300 Subject: [PATCH 2/3] updates to translations --- src/main/java/carpet/CarpetSettings.java | 28 ++++- src/main/java/carpet/settings/ParsedRule.java | 31 +++++ .../java/carpet/settings/SettingsManager.java | 64 +++++------ src/main/java/carpet/utils/LanguageUtils.java | 106 ------------------ src/main/java/carpet/utils/Translations.java | 68 +++++++++++ 5 files changed, 152 insertions(+), 145 deletions(-) delete mode 100644 src/main/java/carpet/utils/LanguageUtils.java create mode 100644 src/main/java/carpet/utils/Translations.java diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index e2b6b843..938e11c0 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -4,6 +4,7 @@ import carpet.settings.ParsedRule; import carpet.settings.Rule; import carpet.settings.SettingsManager; import carpet.settings.Validator; +import carpet.utils.Translations; import carpet.utils.Messenger; import carpet.utils.SpawnChunks; import net.minecraft.server.MinecraftServer; @@ -41,13 +42,30 @@ public class CarpetSettings public static Vec3d fixedPosition = null; public static int runPermissionLevel = 2; + private static class LanguageValidator extends Validator { + @Override public String validate(ServerCommandSource source, ParsedRule currentRule, String newValue, String string) { + if (currentRule.get().equals(newValue)) + { + return newValue; + } + if (!Translations.isValidLanguage(newValue)) + { + Messenger.m(source, "r "+newValue+" is not a valid language"); + return null; + } + CarpetSettings.language = newValue; + Translations.updateLanguage(source); + return newValue; + } + } @Rule( - desc = "sets the language of CarpetMod", - category = {CREATIVE, SURVIVAL}, - options = {"none"}, - strict = false + desc = "sets the language for carpet", + category = FEATURE, + options = {"none", "zh_cn"}, + strict = false, + validate = LanguageValidator.class ) - public static String carpetLanguage = "none"; + public static String language = "none"; @Rule( desc = "Nether portals correctly place entities going through", diff --git a/src/main/java/carpet/settings/ParsedRule.java b/src/main/java/carpet/settings/ParsedRule.java index e75bb3f6..652ae454 100644 --- a/src/main/java/carpet/settings/ParsedRule.java +++ b/src/main/java/carpet/settings/ParsedRule.java @@ -1,6 +1,7 @@ package carpet.settings; import carpet.CarpetServer; +import carpet.utils.Translations; import carpet.utils.Messenger; import com.google.common.collect.ImmutableList; import net.minecraft.server.command.ServerCommandSource; @@ -12,6 +13,8 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; +import static carpet.utils.Translations.tr; + public final class ParsedRule implements Comparable { public final Field field; public final String name; @@ -225,4 +228,32 @@ public final class ParsedRule implements Comparable { { return this.name + ": " + getAsString(); } + + private String translationKey() + { + return String.format("carpet.rule.%s.name", name); + } + + public String translatedName(){ + String key = translationKey(); + return Translations.hasTranslation(key) ? tr(key) + String.format(" (%s)", name): name; + } + + public String translatedDescription() + { + return tr(String.format("carpet.rule.%s.desc", (name)), description); + } + + public List translatedExtras() + { + if (!Translations.hasTranslations()) return extraInfo; + String keyBase = String.format("carpet.rule.%s.extra.", name); + List extras = new ArrayList<>(); + int i = 0; + while (Translations.hasTranslation(keyBase+i)) + { + extras.add(Translations.tr(keyBase+i)); + } + return (extras.isEmpty()) ? extraInfo : extras; + } } diff --git a/src/main/java/carpet/settings/SettingsManager.java b/src/main/java/carpet/settings/SettingsManager.java index bb1fd66f..cb5eede2 100644 --- a/src/main/java/carpet/settings/SettingsManager.java +++ b/src/main/java/carpet/settings/SettingsManager.java @@ -2,7 +2,7 @@ package carpet.settings; import carpet.CarpetServer; import carpet.CarpetSettings; -import carpet.utils.LanguageUtils; +import carpet.utils.Translations; import carpet.utils.Messenger; import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; @@ -40,6 +40,7 @@ import java.util.Set; import java.util.TreeMap; import java.util.stream.Collectors; +import static carpet.utils.Translations.tr; import static net.minecraft.server.command.CommandManager.argument; import static net.minecraft.server.command.CommandManager.literal; import static net.minecraft.server.command.CommandSource.suggestMatching; @@ -351,7 +352,7 @@ public class SettingsManager String ruleName = StringArgumentType.getString(ctx, "rule"); ParsedRule rule = getRule(ruleName); if (rule == null) - throw new SimpleCommandExceptionType(Messenger.c("rb "+ LanguageUtils.translateOrDefault("carpet.ui.statement.unknown_rule","Unknown rule")+": "+ruleName)).create(); + throw new SimpleCommandExceptionType(Messenger.c("rb "+ tr("carpet.ui.statement.unknown_rule","Unknown rule")+": "+ruleName)).create(); return rule; } @@ -367,22 +368,18 @@ public class SettingsManager LiteralArgumentBuilder literalargumentbuilder = literal(identifier).requires((player) -> player.hasPermissionLevel(2) && !locked); - literalargumentbuilder.executes((context)-> - { - LanguageUtils.setLanguage(CarpetSettings.carpetLanguage); - return listAllSettings(context.getSource()); - }). + literalargumentbuilder.executes((context)-> listAllSettings(context.getSource())). then(literal("list"). - executes( (c) -> listSettings(c.getSource(), String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.all_%s_settings","All %s Settings"), fancyName), + executes( (c) -> listSettings(c.getSource(), String.format(tr("carpet.ui.statement.all_%s_settings","All %s Settings"), fancyName), getRules())). then(literal("defaults"). executes( (c)-> listSettings(c.getSource(), - String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.current_%s_startup_settings_from_%s","Current %s Startup Settings from %s"), fancyName, (identifier+".conf")), + String.format(tr("carpet.ui.statement.current_%s_startup_settings_from_%s","Current %s Startup Settings from %s"), fancyName, (identifier+".conf")), findStartupOverrides()))). then(argument("tag",StringArgumentType.word()). suggests( (c, b)->suggestMatching(getCategories(), b)). executes( (c) -> listSettings(c.getSource(), - String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.%s_settings_matching_'%s'","%s Settings matching \"%s\""), fancyName, LanguageUtils.translateOrDefault("carpet.ui.category." + StringArgumentType.getString(c, "tag"),StringArgumentType.getString(c, "tag"))), + String.format(tr("carpet.ui.statement.%s_settings_matching_'%s'","%s Settings matching \"%s\""), fancyName, tr("carpet.ui.category." + StringArgumentType.getString(c, "tag"),StringArgumentType.getString(c, "tag"))), getRulesMatching(StringArgumentType.getString(c, "tag")))))). then(literal("removeDefault"). requires(s -> !locked). @@ -410,36 +407,35 @@ public class SettingsManager private int displayRuleMenu(ServerCommandSource source, ParsedRule rule) { PlayerEntity player; - String translatedPlusName = LanguageUtils.translatePlusDefault(LanguageUtils.getRuleNameKey(rule.name), rule.name); + String displayName = rule.translatedName(); try { player = source.getPlayer(); } catch (CommandSyntaxException e) { - Messenger.m(source, "w "+ translatedPlusName +" "+LanguageUtils.translateOrDefault( "carpet.ui.statement.is_set_to","is set to")+": ","wb "+rule.getAsString()); + Messenger.m(source, "w "+ displayName +" "+ tr( "carpet.ui.statement.is_set_to","is set to")+": ","wb "+rule.getAsString()); return 1; } Messenger.m(player, ""); - Messenger.m(player, "wb "+ translatedPlusName ,"!/"+identifier+" "+rule.name,"^g refresh"); - Messenger.m(player, "w "+ LanguageUtils.translateOrDefault(LanguageUtils.getRuleDescKey(rule.name), rule.description)); + Messenger.m(player, "wb "+ displayName ,"!/"+identifier+" "+rule.name,"^g refresh"); + Messenger.m(player, "w "+ rule.translatedDescription()); - ImmutableList translatedExtraInfo = LanguageUtils.getRuleExtras(rule.name, rule.extraInfo); - translatedExtraInfo.forEach(s -> Messenger.m(player, "g "+s)); + rule.translatedExtras().forEach(s -> Messenger.m(player, "g "+s)); List tags = new ArrayList<>(); - tags.add(Messenger.c("w "+LanguageUtils.translateOrDefault("carpet.ui.statement.tags", "Tags")+": ")); + tags.add(Messenger.c("w "+ tr("carpet.ui.statement.tags", "Tags")+": ")); for (String t: rule.categories) { - String translated = LanguageUtils.translateOrDefault("carpet.ui.category." + t, t); - tags.add(Messenger.c("c ["+ translated +"]", "^g "+ String.format(LanguageUtils.translateOrDefault("list_all_%s_settings","list all %s settings"), translated),"!/"+identifier+" list "+t)); + String translated = tr("carpet.ui.category." + t, t); + tags.add(Messenger.c("c ["+ translated +"]", "^g "+ String.format(tr("list_all_%s_settings","list all %s settings"), translated),"!/"+identifier+" list "+t)); tags.add(Messenger.c("w , ")); } tags.remove(tags.size()-1); Messenger.m(player, tags.toArray(new Object[0])); - Messenger.m(player, "w "+LanguageUtils.translateOrDefault("carpet.ui.statement.current_value", "Current value")+": ",String.format("%s %s (%s value)",rule.getBoolValue()?"lb":"nb", rule.getAsString(),rule.isDefault()?"default":"modified")); + Messenger.m(player, "w "+ tr("carpet.ui.statement.current_value", "Current value")+": ",String.format("%s %s (%s value)",rule.getBoolValue()?"lb":"nb", rule.getAsString(),rule.isDefault()?"default":"modified")); List options = new ArrayList<>(); options.add(Messenger.c("w Options: ", "y [ ")); for (String o: rule.options) @@ -457,8 +453,8 @@ public class SettingsManager private int setRule(ServerCommandSource source, ParsedRule rule, String newValue) { if (rule.set(source, newValue) != null) - Messenger.m(source, "w "+rule.toString()+", ", "c ["+LanguageUtils.translateOrDefault("carpet.ui.statement.change_permanently","change permanently")+"?]", - "^w "+String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.click_to_keep_the_settings_in_%s_to_save_across_restarts","Click to keep the settings in %s to save across restarts"), identifier+".conf"), + Messenger.m(source, "w "+rule.toString()+", ", "c ["+ tr("carpet.ui.statement.change_permanently","change permanently")+"?]", + "^w "+String.format(tr("carpet.ui.statement.click_to_keep_the_settings_in_%s_to_save_across_restarts","Click to keep the settings in %s to save across restarts"), identifier+".conf"), "?/"+identifier+" setDefault "+rule.name+" "+rule.getAsString()); return 1; } @@ -473,7 +469,7 @@ public class SettingsManager writeSettingsToConf(conf.getLeft()); // this may feels weird, but if conf // is locked, it will never reach this point. rule.set(source,stringValue); - Messenger.m(source ,"gi "+String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.rule_%s_will_now_default_to_%s","rule %s will now default to %s"), LanguageUtils.translateOrDefault(LanguageUtils.getRuleNameKey(rule.name), rule.name), stringValue)); + Messenger.m(source ,"gi "+String.format(tr("carpet.ui.statement.rule_%s_will_now_default_to_%s","rule %s will now default to %s"), rule.translatedName(), stringValue)); return 1; } // removes overrides of the default values in the file @@ -490,11 +486,11 @@ public class SettingsManager private BaseText displayInteractiveSetting(ParsedRule rule) { - String translatedPlusName = LanguageUtils.translatePlusDefault(LanguageUtils.getRuleNameKey(rule.name), rule.name); + String displayName = rule.translatedName(); List args = new ArrayList<>(); - args.add("w - "+ translatedPlusName +" "); + args.add("w - "+ displayName +" "); args.add("!/"+identifier+" "+rule.name); - args.add("^y "+LanguageUtils.translateOrDefault(LanguageUtils.getRuleDescKey(rule.name), rule.description)); + args.add("^y "+rule.translatedDescription()); for (String option: rule.options) { args.add(makeSetRuleButton(rule, option, true)); @@ -520,10 +516,10 @@ public class SettingsManager } String baseText = style + (brackets ? " [" : " ") + option + (brackets ? "]" : ""); if (locked) - return Messenger.c(baseText, "^g "+fancyName+" " + LanguageUtils.translateOrDefault("carpet.ui.statement.settings_are_locked","settings are locked")); + return Messenger.c(baseText, "^g "+fancyName+" " + tr("carpet.ui.statement.settings_are_locked","settings are locked")); if (option.equalsIgnoreCase(rule.getAsString())) return Messenger.c(baseText); - return Messenger.c(baseText, "^g "+ LanguageUtils.translateOrDefault("carpet.ui.statement.switch_to","Switch to") +" " + option+(option.equalsIgnoreCase(rule.defaultAsString)?" (default)":""), "?/"+identifier+" " + rule.name + " " + option); + return Messenger.c(baseText, "^g "+ tr("carpet.ui.statement.switch_to","Switch to") +" " + option+(option.equalsIgnoreCase(rule.defaultAsString)?" (default)":""), "?/"+identifier+" " + rule.name + " " + option); } private int listSettings(ServerCommandSource source, String title, Collection> settings_list) @@ -545,24 +541,24 @@ public class SettingsManager private int listAllSettings(ServerCommandSource source) { //listSettings(source, "Current "+fancyName+" Settings", getNonDefault()); - listSettings(source, String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.current_%s_settings","Current %s Settings"), fancyName), getNonDefault()); + listSettings(source, String.format(tr("carpet.ui.statement.current_%s_settings","Current %s Settings"), fancyName), getNonDefault()); if (version != null) //Messenger.m(source, "g "+fancyName+" version: "+ version); - Messenger.m(source, "g "+fancyName+" "+ LanguageUtils.translateOrDefault("carpet.ui.statement.version", "version") + ": "+ version); + Messenger.m(source, "g "+fancyName+" "+ tr("carpet.ui.statement.version", "version") + ": "+ version); try { PlayerEntity player = source.getPlayer(); List tags = new ArrayList<>(); //tags.add("w Browse Categories:\n"); - tags.add("w " + LanguageUtils.translateOrDefault("carpet.ui.statement.browse_categories", "Browse Categories") + ":\n"); + tags.add("w " + tr("carpet.ui.statement.browse_categories", "Browse Categories") + ":\n"); for (String t : getCategories()) { - String translated = LanguageUtils.translateOrDefault("carpet.ui.category." + t, t); - String translatedPlus = LanguageUtils.translatePlusDefault("carpet.ui.category." + t, t); + String translated = tr("carpet.ui.category." + t, t); + String translatedPlus = Translations.hasTranslation("carpet.ui.category." + t) ? tr("carpet.ui.category." + t, t) + String.format(" (%s)", t) : t; tags.add("c [" + translated +"]"); //tags.add("^g list all " + translated + " settings"); - tags.add("^g " + String.format(LanguageUtils.translateOrDefault("carpet.ui.statement.list_all_%s_settings","list all %s settings"), translatedPlus)); + tags.add("^g " + String.format(tr("carpet.ui.statement.list_all_%s_settings","list all %s settings"), translatedPlus)); tags.add("!/"+identifier+" list " + t); tags.add("w "); } diff --git a/src/main/java/carpet/utils/LanguageUtils.java b/src/main/java/carpet/utils/LanguageUtils.java deleted file mode 100644 index 65e3015b..00000000 --- a/src/main/java/carpet/utils/LanguageUtils.java +++ /dev/null @@ -1,106 +0,0 @@ -package carpet.utils; - -import com.google.common.collect.ImmutableList; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; -import org.apache.commons.io.IOUtils; - -import java.io.IOException; -import java.lang.reflect.Type; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -public class LanguageUtils -{ - private static Map translationMap; - - public static String currentLanguage; - - public static String translate(String translationKey) - { - if (translationMap == null) - { - return translationKey; - } - return translationMap.getOrDefault(translationKey, translationKey); - } - - public static String translateOrDefault(String translationKey, String defaultValue) - { - if (translationMap == null) - { - return defaultValue; - } - return translationMap.getOrDefault(translationKey, defaultValue); - } - - public static String translatePlusDefault(String translationKey, String defaultValue){ - return translationMap.containsKey(translationKey) ? translateOrDefault(translationKey, defaultValue) + String.format(" (%s)", defaultValue): defaultValue; - } - - public static String getRuleNameKey(String rule) - { - return String.format("carpet.rule.%s.name", rule); - } - - public static String getRuleDescKey(String rule) - { - return String.format("carpet.rule.%s.desc", rule); - } - - public static ImmutableList getRuleExtras(String rule, ImmutableList defaultList) - { - if (translationMap == null) return defaultList; - String keyBase = String.format("carpet.rule.%s.extra.", rule); - List extras = new ArrayList<>(); - int i = 0; - do { - String keyExtra = keyBase + i; - String value = translationMap.get(keyExtra); - System.out.println(keyExtra); - System.out.println(value); - if (value != null && !value.equals("")) - { - extras.add(value); - } - i++; - } - while (translationMap.containsKey(keyBase + (i - 1))); - return (extras.isEmpty()) ? defaultList : ImmutableList.copyOf(extras); - } - - public static void setLanguage(String language) - { - if (language.equals("none")) - { - currentLanguage = language; - translationMap = null; - return; - } - - String langJs; - try{ - langJs = IOUtils.toString( - Objects.requireNonNull(LanguageUtils.class.getClassLoader().getResourceAsStream(String.format("assets/carpet/lang/%s.json", language))), - StandardCharsets.UTF_8); - } catch (NullPointerException | IOException e) { - return; - } - Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); - Type type = new TypeToken>() {}.getType(); - Map map1 = gson.fromJson(langJs, type); - currentLanguage = language; - translationMap = map1; - } - - public static void loadConfiguration() - { - - } - - -} diff --git a/src/main/java/carpet/utils/Translations.java b/src/main/java/carpet/utils/Translations.java new file mode 100644 index 00000000..e8ffd8a6 --- /dev/null +++ b/src/main/java/carpet/utils/Translations.java @@ -0,0 +1,68 @@ +package carpet.utils; + +import carpet.CarpetSettings; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import net.minecraft.server.command.ServerCommandSource; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Objects; + +public class Translations +{ + private static Map translationMap; + + public static String tr(String key) + { + return translationMap == null ? key : translationMap.getOrDefault(key, key); + } + + public static String tr(String key, String str) + { + return translationMap == null ? str : translationMap.getOrDefault(key, str); + } + + public static boolean hasTranslations() + { + return translationMap != null; + } + + public static boolean hasTranslation(String key) + { + return translationMap != null && translationMap.containsKey(key); + } + + public static void updateLanguage(ServerCommandSource source) + { + if (CarpetSettings.language.equalsIgnoreCase("none")) + { + translationMap = null; + return; + } + String langJs; + try + { + langJs = IOUtils.toString( + Objects.requireNonNull(Translations.class.getClassLoader().getResourceAsStream(String.format("assets/carpet/lang/%s.json", CarpetSettings.language))), + StandardCharsets.UTF_8); + } catch (NullPointerException | IOException e) { + Messenger.m(source, "r Failed to update language"); + return; + } + Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); + Type type = new TypeToken>() {}.getType(); + translationMap = gson.fromJson(langJs, type); + } + + + public static boolean isValidLanguage(String newValue) + { + // will put some validations for availble languages at some point + return true; + } +} From 74c62e5a13aa7d2f5505be7d8212501d9659ab03 Mon Sep 17 00:00:00 2001 From: gnembon Date: Fri, 15 May 2020 20:00:27 -0300 Subject: [PATCH 3/3] simplified translations keys --- src/main/java/carpet/settings/ParsedRule.java | 6 +- .../java/carpet/settings/SettingsManager.java | 39 ++++----- src/main/java/carpet/utils/Translations.java | 1 + .../resources/assets/carpet/lang/en_us.json | 72 +++++++++-------- .../resources/assets/carpet/lang/zh_cn.json | 80 +++++++++---------- 5 files changed, 102 insertions(+), 96 deletions(-) diff --git a/src/main/java/carpet/settings/ParsedRule.java b/src/main/java/carpet/settings/ParsedRule.java index 652ae454..e2acdd25 100644 --- a/src/main/java/carpet/settings/ParsedRule.java +++ b/src/main/java/carpet/settings/ParsedRule.java @@ -231,7 +231,7 @@ public final class ParsedRule implements Comparable { private String translationKey() { - return String.format("carpet.rule.%s.name", name); + return String.format("rule.%s.name", name); } public String translatedName(){ @@ -241,13 +241,13 @@ public final class ParsedRule implements Comparable { public String translatedDescription() { - return tr(String.format("carpet.rule.%s.desc", (name)), description); + return tr(String.format("rule.%s.desc", (name)), description); } public List translatedExtras() { if (!Translations.hasTranslations()) return extraInfo; - String keyBase = String.format("carpet.rule.%s.extra.", name); + String keyBase = String.format("rule.%s.extra.", name); List extras = new ArrayList<>(); int i = 0; while (Translations.hasTranslation(keyBase+i)) diff --git a/src/main/java/carpet/settings/SettingsManager.java b/src/main/java/carpet/settings/SettingsManager.java index cb5eede2..3b27d3c2 100644 --- a/src/main/java/carpet/settings/SettingsManager.java +++ b/src/main/java/carpet/settings/SettingsManager.java @@ -352,7 +352,7 @@ public class SettingsManager String ruleName = StringArgumentType.getString(ctx, "rule"); ParsedRule rule = getRule(ruleName); if (rule == null) - throw new SimpleCommandExceptionType(Messenger.c("rb "+ tr("carpet.ui.statement.unknown_rule","Unknown rule")+": "+ruleName)).create(); + throw new SimpleCommandExceptionType(Messenger.c("rb "+ tr("ui.unknown_rule","Unknown rule")+": "+ruleName)).create(); return rule; } @@ -370,16 +370,16 @@ public class SettingsManager literalargumentbuilder.executes((context)-> listAllSettings(context.getSource())). then(literal("list"). - executes( (c) -> listSettings(c.getSource(), String.format(tr("carpet.ui.statement.all_%s_settings","All %s Settings"), fancyName), + executes( (c) -> listSettings(c.getSource(), String.format(tr("ui.all_%(mod)s_settings","All %s Settings"), fancyName), getRules())). then(literal("defaults"). executes( (c)-> listSettings(c.getSource(), - String.format(tr("carpet.ui.statement.current_%s_startup_settings_from_%s","Current %s Startup Settings from %s"), fancyName, (identifier+".conf")), + String.format(tr("ui.current_%(mod)s_startup_settings_from_%(conf)s","Current %s Startup Settings from %s"), fancyName, (identifier+".conf")), findStartupOverrides()))). then(argument("tag",StringArgumentType.word()). suggests( (c, b)->suggestMatching(getCategories(), b)). executes( (c) -> listSettings(c.getSource(), - String.format(tr("carpet.ui.statement.%s_settings_matching_'%s'","%s Settings matching \"%s\""), fancyName, tr("carpet.ui.category." + StringArgumentType.getString(c, "tag"),StringArgumentType.getString(c, "tag"))), + String.format(tr("ui.%(mod)s_settings_matching_'%(query)s'","%s Settings matching \"%s\""), fancyName, tr("category." + StringArgumentType.getString(c, "tag"),StringArgumentType.getString(c, "tag"))), getRulesMatching(StringArgumentType.getString(c, "tag")))))). then(literal("removeDefault"). requires(s -> !locked). @@ -414,7 +414,7 @@ public class SettingsManager } catch (CommandSyntaxException e) { - Messenger.m(source, "w "+ displayName +" "+ tr( "carpet.ui.statement.is_set_to","is set to")+": ","wb "+rule.getAsString()); + Messenger.m(source, "w "+ displayName +" "+ tr( "ui.is_set_to","is set to")+": ","wb "+rule.getAsString()); return 1; } @@ -425,17 +425,17 @@ public class SettingsManager rule.translatedExtras().forEach(s -> Messenger.m(player, "g "+s)); List tags = new ArrayList<>(); - tags.add(Messenger.c("w "+ tr("carpet.ui.statement.tags", "Tags")+": ")); + tags.add(Messenger.c("w "+ tr("ui.tags", "Tags")+": ")); for (String t: rule.categories) { - String translated = tr("carpet.ui.category." + t, t); + String translated = tr("category." + t, t); tags.add(Messenger.c("c ["+ translated +"]", "^g "+ String.format(tr("list_all_%s_settings","list all %s settings"), translated),"!/"+identifier+" list "+t)); tags.add(Messenger.c("w , ")); } tags.remove(tags.size()-1); Messenger.m(player, tags.toArray(new Object[0])); - Messenger.m(player, "w "+ tr("carpet.ui.statement.current_value", "Current value")+": ",String.format("%s %s (%s value)",rule.getBoolValue()?"lb":"nb", rule.getAsString(),rule.isDefault()?"default":"modified")); + Messenger.m(player, "w "+ tr("ui.current_value", "Current value")+": ",String.format("%s %s (%s value)",rule.getBoolValue()?"lb":"nb", rule.getAsString(),rule.isDefault()?"default":"modified")); List options = new ArrayList<>(); options.add(Messenger.c("w Options: ", "y [ ")); for (String o: rule.options) @@ -453,8 +453,8 @@ public class SettingsManager private int setRule(ServerCommandSource source, ParsedRule rule, String newValue) { if (rule.set(source, newValue) != null) - Messenger.m(source, "w "+rule.toString()+", ", "c ["+ tr("carpet.ui.statement.change_permanently","change permanently")+"?]", - "^w "+String.format(tr("carpet.ui.statement.click_to_keep_the_settings_in_%s_to_save_across_restarts","Click to keep the settings in %s to save across restarts"), identifier+".conf"), + Messenger.m(source, "w "+rule.toString()+", ", "c ["+ tr("ui.change_permanently","change permanently")+"?]", + "^w "+String.format(tr("ui.click_to_keep_the_settings_in_%(conf)s_to_save_across_restarts","Click to keep the settings in %s to save across restarts"), identifier+".conf"), "?/"+identifier+" setDefault "+rule.name+" "+rule.getAsString()); return 1; } @@ -469,7 +469,7 @@ public class SettingsManager writeSettingsToConf(conf.getLeft()); // this may feels weird, but if conf // is locked, it will never reach this point. rule.set(source,stringValue); - Messenger.m(source ,"gi "+String.format(tr("carpet.ui.statement.rule_%s_will_now_default_to_%s","rule %s will now default to %s"), rule.translatedName(), stringValue)); + Messenger.m(source ,"gi "+String.format(tr("ui.rule_%(rule)s_will_now_default_to_%(value)s","rule %s will now default to %s"), rule.translatedName(), stringValue)); return 1; } // removes overrides of the default values in the file @@ -516,10 +516,10 @@ public class SettingsManager } String baseText = style + (brackets ? " [" : " ") + option + (brackets ? "]" : ""); if (locked) - return Messenger.c(baseText, "^g "+fancyName+" " + tr("carpet.ui.statement.settings_are_locked","settings are locked")); + return Messenger.c(baseText, "^g "+fancyName+" " + tr("ui.settings_are_locked","settings are locked")); if (option.equalsIgnoreCase(rule.getAsString())) return Messenger.c(baseText); - return Messenger.c(baseText, "^g "+ tr("carpet.ui.statement.switch_to","Switch to") +" " + option+(option.equalsIgnoreCase(rule.defaultAsString)?" (default)":""), "?/"+identifier+" " + rule.name + " " + option); + return Messenger.c(baseText, "^g "+ tr("ui.switch_to","Switch to") +" " + option+(option.equalsIgnoreCase(rule.defaultAsString)?" (default)":""), "?/"+identifier+" " + rule.name + " " + option); } private int listSettings(ServerCommandSource source, String title, Collection> settings_list) @@ -541,24 +541,25 @@ public class SettingsManager private int listAllSettings(ServerCommandSource source) { //listSettings(source, "Current "+fancyName+" Settings", getNonDefault()); - listSettings(source, String.format(tr("carpet.ui.statement.current_%s_settings","Current %s Settings"), fancyName), getNonDefault()); + listSettings(source, String.format(tr("ui.current_%(mod)s_settings","Current %s Settings"), fancyName), getNonDefault()); if (version != null) //Messenger.m(source, "g "+fancyName+" version: "+ version); - Messenger.m(source, "g "+fancyName+" "+ tr("carpet.ui.statement.version", "version") + ": "+ version); + Messenger.m(source, "g "+fancyName+" "+ tr("ui.version", "version") + ": "+ version); try { PlayerEntity player = source.getPlayer(); List tags = new ArrayList<>(); //tags.add("w Browse Categories:\n"); - tags.add("w " + tr("carpet.ui.statement.browse_categories", "Browse Categories") + ":\n"); + tags.add("w " + tr("ui.browse_categories", "Browse Categories") + ":\n"); for (String t : getCategories()) { - String translated = tr("carpet.ui.category." + t, t); - String translatedPlus = Translations.hasTranslation("carpet.ui.category." + t) ? tr("carpet.ui.category." + t, t) + String.format(" (%s)", t) : t; + String catKey = "category." + t; + String translated = tr(catKey, t); + String translatedPlus = Translations.hasTranslation(catKey) ? String.format("%s (%s)",tr(catKey, t), t) : t; tags.add("c [" + translated +"]"); //tags.add("^g list all " + translated + " settings"); - tags.add("^g " + String.format(tr("carpet.ui.statement.list_all_%s_settings","list all %s settings"), translatedPlus)); + tags.add("^g " + String.format(tr("ui.list_all_%(cat)s_settings","list all %s settings"), translatedPlus)); tags.add("!/"+identifier+" list " + t); tags.add("w "); } diff --git a/src/main/java/carpet/utils/Translations.java b/src/main/java/carpet/utils/Translations.java index e8ffd8a6..081d656b 100644 --- a/src/main/java/carpet/utils/Translations.java +++ b/src/main/java/carpet/utils/Translations.java @@ -57,6 +57,7 @@ public class Translations Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); Type type = new TypeToken>() {}.getType(); translationMap = gson.fromJson(langJs, type); + translationMap.entrySet().removeIf(e -> e.getKey().startsWith("//")); } diff --git a/src/main/resources/assets/carpet/lang/en_us.json b/src/main/resources/assets/carpet/lang/en_us.json index ad516a4a..34331d5c 100644 --- a/src/main/resources/assets/carpet/lang/en_us.json +++ b/src/main/resources/assets/carpet/lang/en_us.json @@ -3,47 +3,51 @@ // But it could be a good example for writing the language file for other languages. { - "carpet.rule.portalSuffocationFix.name": "", - "// the key is genetated as:" : "String.format('carpet.rule.%s.name', rule.name)", + "// Rules:": "", + "rule.portalSuffocationFix.name": "", + "// the key is genetated as:" : "String.format('rule.%s.name', rule.name)", - "carpet.rule.portalSuffocationFix.desc": "", - "// the key is genetated as:" : "String.format('carpet.rule.%s.desc', rule.name)", + "rule.portalSuffocationFix.desc": "", + "// the key is genetated as:" : "String.format('rule.%s.desc', rule.name)", - "carpet.rule.portalSuffocationFix.extra.0": "", - "carpet.rule.portalSuffocationFix.extra.1": "", - "// the key is genetated as:" : "String.format('carpet.rule.%s.extra.%i', rule.name, index)", + "rule.portalSuffocationFix.extra.0": "", + "rule.portalSuffocationFix.extra.1": "", + "// the key is genetated as:" : "String.format('rule.%s.extra.%i', rule.name, index)", - "carpet.ui.category.bugfix": "bugfix", - "carpet.ui.category.survival": "survival", - "carpet.ui.category.creative": "creative", - "carpet.ui.category.experimental": "experimental", - "carpet.ui.category.optimization": "optimization", - "carpet.ui.category.feature": "feature", - "carpet.ui.category.command": "command", - "carpet.ui.category.tnt": "TNT", - "carpet.ui.category.dispenser": "dispenser", - "carpet.ui.category.scarpet": "scarpet", - "carpet.ui.category.client": "client", + "// Categories:": "", + "category.bugfix": "bugfix", + "category.survival": "survival", + "category.creative": "creative", + "category.experimental": "experimental", + "category.optimization": "optimization", + "category.feature": "feature", + "category.command": "command", + "category.tnt": "TNT", + "category.dispenser": "dispenser", + "category.scarpet": "scarpet", + "category.client": "client", - "carpet.ui.statement.browse_categories": "Brouse categories", - "carpet.ui.statement.list_all_%s_settings": "list all %s settings", - "carpet.ui.statement.version": "Version", - "carpet.ui.statement.current_%s_settings": "Current %s settings", - "carpet.ui.statement.switch_to": "Switch to", - "carpet.ui.statement.settings_are_locked": "settings are locked", - "carpet.ui.statement.is_set_to": "is set to", - "carpet.ui.statement.unknown_rule": "Unknown ruls", - "carpet.ui.statement.current_%s_startup_settings_from_%s": "current %s startup settings from %s", - "carpet.ui.statement.%s_settings_matching_'%s'": "%s settings matching \"%s\" ", - "carpet.ui.statement.all_%s_settings": "all %s settings", - "carpet.ui.statement.tags": "Tags", - "carpet.ui.statement.change_permanently": "Change permanently", - "carpet.ui.statement.click_to_keep_the_settings_in_%s_to_save_across_restarts": "click to keep the settings in %s to save across restarts", - "carpet.ui.statement.rule_%s_will_now_default_to_%s": "rule %s will now default to %s", - "carpet.ui.statement.current_value": "current value" + "// Settings command UI elements": "", + + "ui.browse_categories": "Browse categories", + "ui.list_all_%(cat)s_settings": "list all %s settings", + "ui.version": "Version", + "ui.current_%(mod)s_settings": "Current %s settings", + "ui.switch_to": "Switch to", + "ui.settings_are_locked": "settings are locked", + "ui.is_set_to": "is set to", + "ui.unknown_rule": "Unknown rule", + "ui.current_%(mod)s_startup_settings_from_%(conf)s": "Current %s Startup Settings from %s", + "ui.%(mod)s_settings_matching_'%(query)s'": "%s settings matching \"%s\" ", + "ui.all_%(mod)s_settings": "All %s settings", + "ui.tags": "Tags", + "ui.change_permanently": "Change permanently", + "ui.click_to_keep_the_settings_in_%(conf)s_to_save_across_restarts": "click to keep the settings in %s to save across restarts", + "ui.rule_%(rule)s_will_now_default_to_%(value)s": "rule %s will now default to %s", + "ui.current_value": "current value" } diff --git a/src/main/resources/assets/carpet/lang/zh_cn.json b/src/main/resources/assets/carpet/lang/zh_cn.json index 0ff8835f..9784f087 100644 --- a/src/main/resources/assets/carpet/lang/zh_cn.json +++ b/src/main/resources/assets/carpet/lang/zh_cn.json @@ -1,41 +1,41 @@ -{ - "carpet.rule.portalSuffocationFix.name": "传送门窒息修复", - - - "carpet.rule.portalSuffocationFix.desc": "使下界传送门正确地传送实体", - - - "carpet.rule.portalSuffocationFix.extra.0": "0000000", - "carpet.rule.portalSuffocationFix.extra.1": "1111111", - - - "carpet.ui.category.bugfix": "BUG修复", - "carpet.ui.category.survival": "生存", - "carpet.ui.category.creative": "创造", - "carpet.ui.category.experimental": "试验性", - "carpet.ui.category.optimization": "优化", - "carpet.ui.category.feature": "特性", - "carpet.ui.category.command": "指令", - "carpet.ui.category.tnt": "TNT", - "carpet.ui.category.dispenser": "发射器", - "carpet.ui.category.scarpet": "SCarpet脚本语言", - "carpet.ui.category.client": "客户端", - - "carpet.ui.statement.browse_categories": "浏览分类", - "carpet.ui.statement.list_all_%s_settings": "列出所有 %s 选项", - "carpet.ui.statement.version": "版本", - "carpet.ui.statement.current_%s_settings": "目前启用的 %s 选项", - "carpet.ui.statement.switch_to": "切换至", - "carpet.ui.statement.settings_are_locked": "选项被锁定", - "carpet.ui.statement.is_set_to": "被设置为", - "carpet.ui.statement.unknown_rule": "未知的规则选项", - "carpet.ui.statement.current_%s_startup_settings_from_%s": "目前启用的%s选项,从%s中读取得", - "carpet.ui.statement.%s_settings_matching_'%s'": "%s中符合\"%s\"的选项:", - "carpet.ui.statement.all_%s_settings": "所有的%s选项", - "carpet.ui.statement.tags": "分类", - "carpet.ui.statement.change_permanently": "永久更改", - "carpet.ui.statement.click_to_keep_the_settings_in_%s_to_save_across_restarts": "点击此按钮以使此选项保存于%s,重启后依旧生效", - "carpet.ui.statement.rule_%s_will_now_default_to_%s": "规则%s将会被默认设置为%s", - "carpet.ui.statement.current_value": "当前的值" - +{ + "rule.portalSuffocationFix.name": "传送门窒息修复", + + + "rule.portalSuffocationFix.desc": "使下界传送门正确地传送实体", + + + "rule.portalSuffocationFix.extra.0": "0000000", + "rule.portalSuffocationFix.extra.1": "1111111", + + + "category.bugfix": "BUG修复", + "category.survival": "生存", + "category.creative": "创造", + "category.experimental": "试验性", + "category.optimization": "优化", + "category.feature": "特性", + "category.command": "指令", + "category.tnt": "TNT", + "category.dispenser": "发射器", + "category.scarpet": "scarpet脚本语言", + "category.client": "客户端", + + "ui.browse_categories": "浏览分类", + "ui.list_all_%(cat)s_settings": "列出所有 %s 选项", + "ui.version": "版本", + "ui.current_%(mod)s_settings": "目前启用的 %s 选项", + "ui.switch_to": "切换至", + "ui.settings_are_locked": "选项被锁定", + "ui.is_set_to": "被设置为", + "ui.unknown_rule": "未知的规则选项", + "ui.current_%(mod)s_startup_settings_from_%(conf)s": "目前启用的%s选项,从%s中读取得", + "ui.%(mod)s_settings_matching_'%(query)s'": "%s中符合\"%s\"的选项:", + "ui.all_%(mod)s_settings": "所有的%s选项", + "ui.tags": "分类", + "ui.change_permanently": "永久更改", + "ui.click_to_keep_the_settings_in_%(conf)s_to_save_across_restarts": "点击此按钮以使此选项保存于%s,重启后依旧生效", + "ui.rule_%(rule)s_will_now_default_to_%(value)s": "规则%s将会被默认设置为%s", + "ui.current_value": "当前的值" + } \ No newline at end of file