[Idea]: Folia support for OpenInv #196

Closed
reabuc wants to merge 137 commits from master into master
72 changed files with 6830 additions and 2841 deletions
Showing only changes of commit f34b342cdd - Show all commits

View File

@@ -39,132 +39,132 @@ import org.jetbrains.annotations.Nullable;
*/ */
public class LanguageManager { public class LanguageManager {
private final OpenInv plugin; private final OpenInv plugin;
private final String defaultLocale; private final String defaultLocale;
private final Map<String, YamlConfiguration> locales; private final Map<String, YamlConfiguration> locales;
public LanguageManager(@NotNull OpenInv plugin, @NotNull String defaultLocale) { public LanguageManager(@NotNull OpenInv plugin, @NotNull String defaultLocale) {
this.plugin = plugin; this.plugin = plugin;
this.defaultLocale = defaultLocale; this.defaultLocale = defaultLocale;
this.locales = new HashMap<>(); this.locales = new HashMap<>();
getOrLoadLocale(defaultLocale); getOrLoadLocale(defaultLocale);
} }
private YamlConfiguration getOrLoadLocale(@NotNull String locale) { private YamlConfiguration getOrLoadLocale(@NotNull String locale) {
YamlConfiguration loaded = locales.get(locale); YamlConfiguration loaded = locales.get(locale);
if (loaded != null) { if (loaded != null) {
return loaded; return loaded;
} }
InputStream resourceStream = plugin.getResource("locale/" + locale + ".yml"); InputStream resourceStream = plugin.getResource("locale/" + locale + ".yml");
YamlConfiguration localeConfigDefaults; YamlConfiguration localeConfigDefaults;
if (resourceStream == null) { if (resourceStream == null) {
localeConfigDefaults = new YamlConfiguration(); localeConfigDefaults = new YamlConfiguration();
} else { } else {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceStream))) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceStream))) {
localeConfigDefaults = YamlConfiguration.loadConfiguration(reader); localeConfigDefaults = YamlConfiguration.loadConfiguration(reader);
} catch (IOException e) { } catch (IOException e) {
plugin.getLogger().log(Level.WARNING, "[LanguageManager] Unable to load resource " + locale + ".yml", e); plugin.getLogger().log(Level.WARNING, "[LanguageManager] Unable to load resource " + locale + ".yml", e);
localeConfigDefaults = new YamlConfiguration(); localeConfigDefaults = new YamlConfiguration();
} }
} }
File file = new File(plugin.getDataFolder(), locale + ".yml"); File file = new File(plugin.getDataFolder(), locale + ".yml");
YamlConfiguration localeConfig; YamlConfiguration localeConfig;
if (!file.exists()) { if (!file.exists()) {
localeConfig = localeConfigDefaults; localeConfig = localeConfigDefaults;
try { try {
localeConfigDefaults.save(file); localeConfigDefaults.save(file);
} catch (IOException e) { } catch (IOException e) {
plugin.getLogger().log(Level.WARNING, "[LanguageManager] Unable to save resource " + locale + ".yml", e); plugin.getLogger().log(Level.WARNING, "[LanguageManager] Unable to save resource " + locale + ".yml", e);
} }
} else { } else {
localeConfig = YamlConfiguration.loadConfiguration(file); localeConfig = YamlConfiguration.loadConfiguration(file);
// Add new language keys // Add new language keys
List<String> newKeys = new ArrayList<>(); List<String> newKeys = new ArrayList<>();
for (String key : localeConfigDefaults.getKeys(true)) { for (String key : localeConfigDefaults.getKeys(true)) {
if (localeConfigDefaults.isConfigurationSection(key)) { if (localeConfigDefaults.isConfigurationSection(key)) {
continue; continue;
} }
if (localeConfig.isSet(key)) { if (localeConfig.isSet(key)) {
continue; continue;
} }
localeConfig.set(key, localeConfigDefaults.get(key)); localeConfig.set(key, localeConfigDefaults.get(key));
newKeys.add(key); newKeys.add(key);
} }
if (!newKeys.isEmpty()) { if (!newKeys.isEmpty()) {
plugin.getLogger().info("[LanguageManager] Added new language keys: " + String.join(", ", newKeys)); plugin.getLogger().info("[LanguageManager] Added new language keys: " + String.join(", ", newKeys));
try { try {
localeConfig.save(file); localeConfig.save(file);
} catch (IOException e) { } catch (IOException e) {
plugin.getLogger().log(Level.WARNING, "[LanguageManager] Unable to save resource " + locale + ".yml", e); plugin.getLogger().log(Level.WARNING, "[LanguageManager] Unable to save resource " + locale + ".yml", e);
} }
} }
} }
if (!locale.equals(defaultLocale)) { if (!locale.equals(defaultLocale)) {
localeConfigDefaults = locales.get(defaultLocale); localeConfigDefaults = locales.get(defaultLocale);
// Check for missing keys // Check for missing keys
List<String> newKeys = new ArrayList<>(); List<String> newKeys = new ArrayList<>();
for (String key : localeConfigDefaults.getKeys(true)) { for (String key : localeConfigDefaults.getKeys(true)) {
if (localeConfigDefaults.isConfigurationSection(key)) { if (localeConfigDefaults.isConfigurationSection(key)) {
continue; continue;
} }
if (localeConfig.isSet(key)) { if (localeConfig.isSet(key)) {
continue; continue;
} }
newKeys.add(key); newKeys.add(key);
} }
if (!newKeys.isEmpty()) { if (!newKeys.isEmpty()) {
plugin.getLogger().info("[LanguageManager] Missing translations from " + locale + ".yml: " + String.join(", ", newKeys)); plugin.getLogger().info("[LanguageManager] Missing translations from " + locale + ".yml: " + String.join(", ", newKeys));
} }
// Fall through to default locale // Fall through to default locale
localeConfig.setDefaults(localeConfigDefaults); localeConfig.setDefaults(localeConfigDefaults);
} }
locales.put(locale, localeConfig); locales.put(locale, localeConfig);
return localeConfig; return localeConfig;
} }
@Nullable @Nullable
public String getValue(@NotNull String key, @Nullable String locale) { public String getValue(@NotNull String key, @Nullable String locale) {
String value = getOrLoadLocale(locale == null ? defaultLocale : locale.toLowerCase()).getString(key); String value = getOrLoadLocale(locale == null ? defaultLocale : locale.toLowerCase()).getString(key);
if (value == null || value.isEmpty()) { if (value == null || value.isEmpty()) {
return null; return null;
} }
value = ChatColor.translateAlternateColorCodes('&', value); value = ChatColor.translateAlternateColorCodes('&', value);
return value; return value;
} }
@Nullable @Nullable
public String getValue(@NotNull String key, @Nullable String locale, @NotNull String... replacements) { public String getValue(@NotNull String key, @Nullable String locale, @NotNull String... replacements) {
if (replacements.length % 2 != 0) { if (replacements.length % 2 != 0) {
plugin.getLogger().log(Level.WARNING, "[LanguageManager] Replacement data is uneven", new Exception()); plugin.getLogger().log(Level.WARNING, "[LanguageManager] Replacement data is uneven", new Exception());
} }
String value = getValue(key, locale); String value = getValue(key, locale);
if (value == null) { if (value == null) {
return null; return null;
} }
for (int i = 0; i < replacements.length; i += 2) { for (int i = 0; i < replacements.length; i += 2) {
value = value.replace(replacements[i], replacements[i + 1]); value = value.replace(replacements[i], replacements[i + 1]);
} }
return value; return value;
} }
} }