feat: initial CMagicGem reimplementation

This commit is contained in:
Coldsmile_7
2026-10-01 14:51:20 +08:00
commit 536c02b57e
82 changed files with 16612 additions and 0 deletions
@@ -0,0 +1,86 @@
package cn.infstar.cmagicgem.config;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public final class LanguageManager {
private final JavaPlugin plugin;
private volatile YamlConfiguration messages = new YamlConfiguration();
private volatile String language = "zh_CN";
public LanguageManager(JavaPlugin plugin) {
this.plugin = plugin;
}
public void reload() {
String configured = plugin.getConfig().getString("language",
plugin.getConfig().getString("lang", "zh_CN"));
language = safeName(configured);
File file = new File(plugin.getDataFolder(), "languages/" + language + ".yml");
YamlConfiguration loaded = YamlConfiguration.loadConfiguration(file);
try (InputStream input = plugin.getResource("languages/" + language + ".yml")) {
if (input != null) {
YamlConfiguration bundled = YamlConfiguration.loadConfiguration(
new InputStreamReader(input, StandardCharsets.UTF_8));
loaded.setDefaults(bundled);
}
} catch (Exception exception) {
plugin.getLogger().warning("无法读取内置语言 " + language + ": " + exception.getMessage());
}
messages = loaded;
}
public String language() {
return language;
}
public String text(String path, String fallback, Object... replacements) {
String value = messages.getString(path, fallback);
if (value == null) value = fallback == null ? "" : fallback;
value = commandName(value);
for (int index = 0; index + 1 < replacements.length; index += 2) {
String key = String.valueOf(replacements[index]);
String replacement = String.valueOf(replacements[index + 1]);
value = value.replace("{" + key + "}", replacement).replace("%" + key + "%", replacement);
}
return value;
}
public String format(String path, String fallback, Object... arguments) {
String pattern = text(path, fallback);
try {
return String.format(Locale.ROOT, pattern, arguments);
} catch (RuntimeException exception) {
return pattern;
}
}
public List<String> section(String path) {
ConfigurationSection section = messages.getConfigurationSection(path);
if (section == null) return List.of();
List<String> result = new ArrayList<>();
for (String key : section.getKeys(false)) {
String value = section.getString(key);
if (value != null) result.add(commandName(value));
}
return List.copyOf(result);
}
private String commandName(String value) {
return value.replace("/mgem", "/cmgem").replace("/magicgem", "/cmagicgem");
}
private String safeName(String configured) {
if (configured == null || !configured.matches("[A-Za-z0-9_-]+")) return "zh_CN";
return configured;
}
}