更新
This commit is contained in:
parent
71547865f9
commit
eb616fd5bd
@ -15,7 +15,7 @@ import java.util.Collections;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Function;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ThreadSafe
|
@ThreadSafe
|
||||||
@ -24,6 +24,7 @@ class TLocaleInstance {
|
|||||||
|
|
||||||
private final Map<String, List<TLocaleSerialize>> map = new HashMap<>();
|
private final Map<String, List<TLocaleSerialize>> map = new HashMap<>();
|
||||||
private final Plugin plugin;
|
private final Plugin plugin;
|
||||||
|
private final AtomicInteger latestUpdateNodes = new AtomicInteger();
|
||||||
|
|
||||||
TLocaleInstance(Plugin plugin) {
|
TLocaleInstance(Plugin plugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
@ -46,6 +47,10 @@ class TLocaleInstance {
|
|||||||
return plugin;
|
return plugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AtomicInteger getLatestUpdateNodes() {
|
||||||
|
return latestUpdateNodes;
|
||||||
|
}
|
||||||
|
|
||||||
public void sendTo(String path, CommandSender sender, String... args) {
|
public void sendTo(String path, CommandSender sender, String... args) {
|
||||||
try {
|
try {
|
||||||
map.getOrDefault(path, ImmutableList.of(TLocaleSerialize.getEmpty(path))).forEach(tSender -> {
|
map.getOrDefault(path, ImmutableList.of(TLocaleSerialize.getEmpty(path))).forEach(tSender -> {
|
||||||
@ -80,20 +85,34 @@ class TLocaleInstance {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void load(YamlConfiguration configuration) {
|
public void load(YamlConfiguration configuration) {
|
||||||
configuration.getKeys(true).forEach(s -> {
|
load(configuration, false);
|
||||||
Object object = configuration.get(s);
|
}
|
||||||
if (object instanceof TLocaleSerialize) {
|
|
||||||
map.put(s, Collections.singletonList((TLocaleSerialize) object));
|
public void load(YamlConfiguration configuration, boolean cleanup) {
|
||||||
} else if (object instanceof List && !((List) object).isEmpty()) {
|
int originNodes = map.size();
|
||||||
if (isListString((List) object)) {
|
int updateNodes = 0;
|
||||||
map.put(s, Collections.singletonList(TLocaleText.of(object)));
|
if (cleanup) {
|
||||||
|
map.clear();
|
||||||
|
}
|
||||||
|
for (String s : configuration.getKeys(true)) {
|
||||||
|
boolean updated = false;
|
||||||
|
Object value = configuration.get(s);
|
||||||
|
if (value instanceof TLocaleSerialize) {
|
||||||
|
updated = map.put(s, Collections.singletonList((TLocaleSerialize) value)) != null;
|
||||||
|
} else if (value instanceof List && !((List) value).isEmpty()) {
|
||||||
|
if (isListString((List) value)) {
|
||||||
|
updated = map.put(s, Collections.singletonList(TLocaleText.of(value))) != null;
|
||||||
} else {
|
} else {
|
||||||
map.put(s, ((List<?>) object).stream().map(o -> o instanceof TLocaleSerialize ? (TLocaleSerialize) o : TLocaleText.of(String.valueOf(o))).collect(Collectors.toList()));
|
updated = map.put(s, ((List<?>) value).stream().map(o -> o instanceof TLocaleSerialize ? (TLocaleSerialize) o : TLocaleText.of(String.valueOf(o))).collect(Collectors.toList())) != null;
|
||||||
}
|
}
|
||||||
} else if (!(object instanceof ConfigurationSection)) {
|
} else if (!(value instanceof ConfigurationSection)) {
|
||||||
String str = String.valueOf(object);
|
String str = String.valueOf(value);
|
||||||
map.put(s, Collections.singletonList(str.length() == 0 ? TLocaleSerialize.getEmpty() : TLocaleText.of(str)));
|
updated = map.put(s, Collections.singletonList(str.length() == 0 ? TLocaleSerialize.getEmpty() : TLocaleText.of(str))) != null;
|
||||||
}
|
}
|
||||||
});
|
if (updated) {
|
||||||
|
updateNodes++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
latestUpdateNodes.set(originNodes - updateNodes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package com.ilummc.tlib.resources;
|
package com.ilummc.tlib.resources;
|
||||||
|
|
||||||
import com.google.common.io.Files;
|
|
||||||
import com.ilummc.tlib.TLib;
|
import com.ilummc.tlib.TLib;
|
||||||
import com.ilummc.tlib.annotations.TLocalePlugin;
|
import com.ilummc.tlib.annotations.TLocalePlugin;
|
||||||
import com.ilummc.tlib.logger.TLogger;
|
import com.ilummc.tlib.logger.TLogger;
|
||||||
@ -14,13 +13,14 @@ import org.bukkit.command.CommandSender;
|
|||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
import org.bukkit.configuration.serialization.ConfigurationSerialization;
|
import org.bukkit.configuration.serialization.ConfigurationSerialization;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.yaml.snakeyaml.Yaml;
|
|
||||||
import sun.security.krb5.Config;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
public class TLocaleLoader {
|
public class TLocaleLoader {
|
||||||
@ -74,20 +74,23 @@ public class TLocaleLoader {
|
|||||||
if (isLoadLocale(plugin, isCover)) {
|
if (isLoadLocale(plugin, isCover)) {
|
||||||
// 获取文件
|
// 获取文件
|
||||||
File localeFile = getLocaleFile(plugin);
|
File localeFile = getLocaleFile(plugin);
|
||||||
|
if (localeFile == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 加载文件
|
// 加载文件
|
||||||
infoLogger("TRY-LOADING-LANG", plugin.getName(), localeFile.getName());
|
infoLogger("TRY-LOADING-LANG", plugin.getName(), localeFile.getName());
|
||||||
Map<String, Object> originMap = getLocaleAtStream(plugin, localeFile);
|
YamlConfiguration localeConfiguration = ConfigUtils.loadYaml(plugin, localeFile);
|
||||||
|
YamlConfiguration localeConfigurationAtStream = getLocaleAtStream(plugin, localeFile);
|
||||||
TLib.getTLib().getConfigWatcher().removeListener(localeFile);
|
|
||||||
|
|
||||||
// 载入配置
|
// 载入配置
|
||||||
updateAndLoad(plugin, localeFile, originMap);
|
loadPluginLocale(plugin, localeFile, localeConfiguration, localeConfigurationAtStream);
|
||||||
|
|
||||||
// 注册监听
|
// 注册监听
|
||||||
|
TLib.getTLib().getConfigWatcher().removeListener(localeFile);
|
||||||
TLib.getTLib().getConfigWatcher().addListener(localeFile, null, obj -> {
|
TLib.getTLib().getConfigWatcher().addListener(localeFile, null, obj -> {
|
||||||
infoLogger("RELOADING-LANG", plugin.getName());
|
infoLogger("RELOADING-LANG", plugin.getName());
|
||||||
updateAndLoad(plugin, localeFile, getLocaleAtStream(plugin, localeFile));
|
loadPluginLocale(plugin, localeFile, ConfigUtils.loadYaml(plugin, localeFile), getLocaleAtStream(plugin, localeFile));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -107,28 +110,24 @@ public class TLocaleLoader {
|
|||||||
TLogger.getGlobalLogger().error(Strings.replaceWithOrder(TLib.getInternalLanguage().getString(path), args));
|
TLogger.getGlobalLogger().error(Strings.replaceWithOrder(TLib.getInternalLanguage().getString(path), args));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isVersionOutOfDate(YamlConfiguration configuration, YamlConfiguration configurationAtSteam) {
|
|
||||||
return configurationAtSteam != null && configurationAtSteam.getDouble("VERSION", 0) > configuration.getDouble("VERSION", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static File getLocaleFile(Plugin plugin) {
|
private static File getLocaleFile(Plugin plugin) {
|
||||||
releaseLocales(plugin);
|
releaseLocales(plugin);
|
||||||
return getLocalePriority().stream().map(localeName -> new File(plugin.getDataFolder(), "lang/" + localeName + ".yml")).filter(File::exists).findFirst().orElseThrow(NullPointerException::new);
|
return getLocalePriority().stream().map(localeName -> new File(plugin.getDataFolder(), "lang/" + localeName + ".yml")).filter(File::exists).findFirst().orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void releaseLocales(Plugin plugin) {
|
private static void releaseLocales(Plugin plugin) {
|
||||||
getLocalePriority().stream().filter(localeName -> !new File(plugin.getDataFolder(), "lang/" + localeName + ".yml").exists() && plugin.getResource("lang/" + localeName + ".yml") != null).forEach(localeName -> plugin.saveResource("lang/" + localeName + ".yml", true));
|
getLocalePriority().stream().filter(localeName -> !new File(plugin.getDataFolder(), "lang/" + localeName + ".yml").exists() && plugin.getResource("lang/" + localeName + ".yml") != null).forEach(localeName -> plugin.saveResource("lang/" + localeName + ".yml", true));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isLocaleLoaded(Plugin plugin) {
|
public static boolean isLocaleLoaded(Plugin plugin) {
|
||||||
return map.containsKey(plugin.getName());
|
return map.containsKey(plugin.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isDependWithTabooLib(Plugin plugin) {
|
public static boolean isDependWithTabooLib(Plugin plugin) {
|
||||||
return plugin.getClass().getAnnotation(TLocalePlugin.class) != null || plugin.getDescription().getDepend().contains(Main.getInst().getName()) || plugin.getDescription().getSoftDepend().contains(Main.getInst().getName());
|
return plugin.getClass().getAnnotation(TLocalePlugin.class) != null || plugin.getDescription().getDepend().contains(Main.getInst().getName()) || plugin.getDescription().getSoftDepend().contains(Main.getInst().getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<String> getLocalePriority() {
|
public static List<String> getLocalePriority() {
|
||||||
return Main.getInst().getConfig().contains("LOCALE.PRIORITY") ? Main.getInst().getConfig().getStringList("LOCALE.PRIORITY") : Collections.singletonList("zh_CN");
|
return Main.getInst().getConfig().contains("LOCALE.PRIORITY") ? Main.getInst().getConfig().getStringList("LOCALE.PRIORITY") : Collections.singletonList("zh_CN");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,65 +137,28 @@ public class TLocaleLoader {
|
|||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String, Object> getLocaleAtStream(Plugin plugin, File localeFile) {
|
private static YamlConfiguration getLocaleAtStream(Plugin plugin, File localeFile) {
|
||||||
InputStream localeInputSteam = plugin.getClass().getResourceAsStream("/lang/" + localeFile.getName());
|
InputStream localeInputSteam = plugin.getClass().getResourceAsStream("/lang/" + localeFile.getName());
|
||||||
try {
|
try {
|
||||||
String yamlText = new String(IO.readFully(localeInputSteam), Charset.forName("utf-8"));
|
String yamlText = new String(IO.readFully(localeInputSteam), Charset.forName("utf-8"));
|
||||||
Object load = new Yaml().load(yamlText);
|
YamlConfiguration yaml = new YamlConfiguration();
|
||||||
return load instanceof Map ? (Map<String, Object>) load : new HashMap<>(0);
|
yaml.loadFromString(yamlText);
|
||||||
} catch (Exception e) {
|
return yaml;
|
||||||
return new HashMap<>(0);
|
} catch (Exception ignored) {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String, Object> currentLocaleMap(File localeFile) {
|
private static void loadPluginLocale(Plugin plugin, File localeFile, YamlConfiguration localeConfiguration, YamlConfiguration localeConfigurationAtStream) {
|
||||||
try {
|
|
||||||
Object load = new Yaml().load(Files.toString(localeFile, Charset.forName("utf-8")));
|
|
||||||
return load instanceof Map ? (Map<String, Object>) load : new HashMap<>(0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
return new HashMap<>(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int compareAndSet(Map<String, Object> origin, Map<String, Object> current, File file) {
|
|
||||||
int i = compareMaps(origin, current);
|
|
||||||
// DumperOptions options = new DumperOptions();
|
|
||||||
// options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
|
||||||
// options.setAllowUnicode(false);
|
|
||||||
// Yaml yaml = new Yaml(options);
|
|
||||||
// String dump = yaml.dump(current);
|
|
||||||
// try {
|
|
||||||
// Files.write(dump.getBytes(Charset.forName("utf-8")), file);
|
|
||||||
// } catch (IOException ignored) {
|
|
||||||
// }
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private static int compareMaps(Map<String, Object> origin, Map<String, Object> current) {
|
|
||||||
int res = 0;
|
|
||||||
for (Map.Entry<String, Object> entry : origin.entrySet()) {
|
|
||||||
if (current.putIfAbsent(entry.getKey(), entry.getValue()) != null) {
|
|
||||||
if (entry.getValue() instanceof Map && !((Map) entry.getValue()).containsKey("==") && current.get(entry.getKey()) instanceof Map) {
|
|
||||||
res += compareMaps((Map<String, Object>) entry.getValue(), (Map<String, Object>) current.get(entry.getKey()));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
++res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void updateAndLoad(Plugin plugin, File localeFile, Map<String, Object> originMap) {
|
|
||||||
Map<String, Object> currentMap = currentLocaleMap(localeFile);
|
|
||||||
int update = compareAndSet(originMap, currentMap, localeFile);
|
|
||||||
TLocaleInstance localeInstance = getLocaleInstance(plugin);
|
TLocaleInstance localeInstance = getLocaleInstance(plugin);
|
||||||
YamlConfiguration localeConfiguration = (YamlConfiguration) ConfigUtils.mapToConf(currentMap);
|
if (localeConfigurationAtStream != null) {
|
||||||
|
localeInstance.load(localeConfigurationAtStream);
|
||||||
|
}
|
||||||
localeInstance.load(localeConfiguration);
|
localeInstance.load(localeConfiguration);
|
||||||
if (update == 0) {
|
if (localeInstance.getLatestUpdateNodes().get() <= 0) {
|
||||||
infoLogger("SUCCESS-LOADING-LANG-NORMAL", plugin.getName(), localeFile.getName().split("\\.")[0], String.valueOf(localeInstance.size()));
|
infoLogger("SUCCESS-LOADING-LANG-NORMAL", plugin.getName(), localeFile.getName().split("\\.")[0], String.valueOf(localeInstance.size()));
|
||||||
} else {
|
} else {
|
||||||
infoLogger("SUCCESS-LOADING-LANG-UPDATE", plugin.getName(), localeFile.getName().split("\\.")[0], String.valueOf(localeInstance.size()), String.valueOf(update));
|
infoLogger("SUCCESS-LOADING-LANG-UPDATE", plugin.getName(), localeFile.getName().split("\\.")[0], String.valueOf(localeInstance.size()), String.valueOf(localeInstance.getLatestUpdateNodes().get()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,11 +51,6 @@ public class ListenerItemListCommand implements Listener {
|
|||||||
meta.setLore(lore);
|
meta.setLore(lore);
|
||||||
item.setItemMeta(meta);
|
item.setItemMeta(meta);
|
||||||
inventory.setItem(slot, item);
|
inventory.setItem(slot, item);
|
||||||
|
|
||||||
System.out.println("lore: " + TLocale.asString("COMMANDS.TABOOLIB.ITEMLIST.MENU.LORE", name));
|
|
||||||
System.out.println("lore: " + TLocale.asStringList("COMMANDS.TABOOLIB.ITEMLIST.MENU.LORE", name));
|
|
||||||
|
|
||||||
TLocale.sendTo(player, "COMMANDS.TABOOLIB.ITEMLIST.MENU.LORE", name);
|
|
||||||
holder.ITEMS_DATA.put(slot, name);
|
holder.ITEMS_DATA.put(slot, name);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user