船新 I18n 系统

修了一个配置文件小bug
This commit is contained in:
Izzel_Aliz
2018-04-22 13:30:50 +08:00
parent 385b2aa974
commit c573617a01
18 changed files with 479 additions and 38 deletions

View File

@@ -3,6 +3,7 @@ package com.ilummc.tlib.inject;
import com.ilummc.tlib.TLib;
import com.ilummc.tlib.annotations.*;
import com.ilummc.tlib.dependency.TDependency;
import com.ilummc.tlib.resources.LocaleLoader;
import com.ilummc.tlib.util.Ref;
import com.ilummc.tlib.util.TLogger;
import org.bukkit.Bukkit;
@@ -15,10 +16,11 @@ import java.lang.reflect.Field;
public class DependencyInjector {
public static void inject(Plugin plugin, Object o) {
injectDependencies(plugin, o);
injectLogger(plugin, o);
injectConfig(plugin, o);
injectPluginInstance(plugin, o);
injectDependencies(plugin, o);
LocaleLoader.load(plugin, true);
}
static void injectOnEnable(Plugin plugin) {
@@ -39,7 +41,7 @@ public class DependencyInjector {
private static void ejectConfig(Plugin plugin, Object o) {
for (Field field : Ref.getDeclaredFields(o.getClass())) {
Config config;
if ((config = field.getType().getAnnotation(Config.class)) != null) {
if ((config = field.getType().getAnnotation(Config.class)) != null && config.saveOnExit()) {
try {
field.setAccessible(true);
TConfigInjector.saveConfig(plugin, field.get(o));

View File

@@ -1,5 +1,6 @@
package com.ilummc.tlib.inject;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.io.Files;
import com.google.gson.Gson;
@@ -9,6 +10,7 @@ import com.ilummc.tlib.TLib;
import com.ilummc.tlib.annotations.Config;
import com.ilummc.tlib.bean.Property;
import org.apache.commons.lang3.Validate;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
import org.bukkit.plugin.Plugin;
@@ -17,7 +19,6 @@ import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.nio.charset.Charset;
import java.util.*;
@@ -25,6 +26,36 @@ import java.util.stream.Collectors;
public class TConfigInjector {
public static void fixUnicode(YamlConfiguration configuration) {
try {
Field field = YamlConfiguration.class.getDeclaredField("yamlOptions");
field.setAccessible(true);
field.set(configuration, NoUnicodeDumperOption.INSTANCE);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
private static final class NoUnicodeDumperOption extends DumperOptions {
private static final NoUnicodeDumperOption INSTANCE = new NoUnicodeDumperOption();
@Override
public void setAllowUnicode(boolean allowUnicode) {
super.setAllowUnicode(false);
}
@Override
public boolean isAllowUnicode() {
return false;
}
@Override
public void setLineBreak(LineBreak lineBreak) {
super.setLineBreak(LineBreak.getPlatformLineBreak());
}
}
public static Object loadConfig(Plugin plugin, Class<?> clazz) {
try {
Config config = clazz.getAnnotation(Config.class);
@@ -32,7 +63,9 @@ public class TConfigInjector {
File file = new File(plugin.getDataFolder(), config.name());
if (!file.exists()) if (config.fromJar()) plugin.saveResource(config.name(), true);
else saveConfig(plugin, clazz.newInstance());
return unserialize(plugin, clazz);
Object obj = unserialize(plugin, clazz);
if (!config.readOnly()) saveConfig(plugin, obj);
return obj;
} catch (NullPointerException e) {
TLib.getTLib().getLogger().warn("插件 " + plugin + " 的配置类 " + clazz.getSimpleName() + " 加载失败:没有 @Config 注解");
} catch (Exception e) {
@@ -83,6 +116,7 @@ public class TConfigInjector {
if (!target.exists()) target.createNewFile();
DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
options.setAllowUnicode(false);
Yaml yaml = new Yaml(options);
String str = yaml.dump(obj);
byte[] arr = str.getBytes(config.charset());
@@ -124,12 +158,7 @@ public class TConfigInjector {
if (o.getClass().isPrimitive() || primitiveType.contains(o.getClass())) {
return o;
} else if (o.getClass().isArray()) {
List list = new ArrayList<>();
int len = (int) o.getClass().getField("length").get(o);
for (int i = 0; i < len; i++) {
list.add(serialize(Array.get(o, i)));
}
return list;
return ImmutableList.copyOf(((Object[]) o));
} else if (o instanceof Collection) {
return ((Collection) o).stream().map(this::serialize).collect(Collectors.toList());
} else if (o instanceof Map) {