[Idea]: Folia support for OpenInv #196
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user