1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-19 19:25:48 +00:00

Complete restructure of language files

This commit is contained in:
TheBusyBiscuit 2021-04-23 20:48:24 +02:00
parent 3ad981aa1e
commit 1c5372d261
139 changed files with 123 additions and 110 deletions

View File

@ -23,4 +23,4 @@ rules:
## Trailing Spaces for language files are too common and these files are automated anyway ## Trailing Spaces for language files are too common and these files are automated anyway
trailing-spaces: trailing-spaces:
ignore: | ignore: |
/src/main/resources/languages/*.yml /src/main/resources/languages/**/*.yml

View File

@ -5,7 +5,7 @@ on:
branches: branches:
- master - master
paths: paths:
- 'src/main/resources/languages/**_en.yml' - 'src/main/resources/languages/en/**.yml'
jobs: jobs:
notify: notify:

View File

@ -203,11 +203,6 @@
<pattern>kong.unirest</pattern> <pattern>kong.unirest</pattern>
<shadedPattern>io.github.thebusybiscuit.slimefun4.libraries.unirest</shadedPattern> <shadedPattern>io.github.thebusybiscuit.slimefun4.libraries.unirest</shadedPattern>
</relocation> </relocation>
<relocation>
<!-- (Dependency of Unirest) -->
<pattern>org.apache</pattern>
<shadedPattern>io.github.thebusybiscuit.slimefun4.libraries.apache</shadedPattern>
</relocation>
</relocations> </relocations>
<!-- Exclude unneeded metadata files from shaded dependencies --> <!-- Exclude unneeded metadata files from shaded dependencies -->

View File

@ -13,6 +13,7 @@ import java.util.logging.Level;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
@ -24,6 +25,7 @@ import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import io.github.thebusybiscuit.slimefun4.core.services.localization.Language; import io.github.thebusybiscuit.slimefun4.core.services.localization.Language;
import io.github.thebusybiscuit.slimefun4.core.services.localization.LanguageFile;
import io.github.thebusybiscuit.slimefun4.core.services.localization.SlimefunLocalization; import io.github.thebusybiscuit.slimefun4.core.services.localization.SlimefunLocalization;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.NumberUtils; import io.github.thebusybiscuit.slimefun4.utils.NumberUtils;
@ -60,7 +62,7 @@ public class LocalizationService extends SlimefunLocalization {
translationsEnabled = SlimefunPlugin.getCfg().getBoolean("options.enable-translations"); translationsEnabled = SlimefunPlugin.getCfg().getBoolean("options.enable-translations");
defaultLanguage = new Language(serverDefaultLanguage, "11b3188fd44902f72602bd7c2141f5a70673a411adb3d81862c69e536166b"); defaultLanguage = new Language(serverDefaultLanguage, "11b3188fd44902f72602bd7c2141f5a70673a411adb3d81862c69e536166b");
defaultLanguage.setMessagesFile(getConfig().getConfiguration()); defaultLanguage.setFile(LanguageFile.MESSAGES, getConfig().getConfiguration());
loadEmbeddedLanguages(); loadEmbeddedLanguages();
@ -122,7 +124,7 @@ public class LocalizationService extends SlimefunLocalization {
public boolean hasLanguage(@Nonnull String id) { public boolean hasLanguage(@Nonnull String id) {
Validate.notNull(id, "The language id cannot be null"); Validate.notNull(id, "The language id cannot be null");
// Checks if our jar files contains a messages.yml file for that language // Checks if our jar files contains a messages.yml file for that language
return containsResource("messages_" + id); return containsResource(id, LanguageFile.MESSAGES);
} }
/** /**
@ -138,9 +140,11 @@ public class LocalizationService extends SlimefunLocalization {
return languages.containsKey(id); return languages.containsKey(id);
} }
private boolean containsResource(@Nonnull String file) { private boolean containsResource(@Nonnull String languageId, @Nonnull LanguageFile file) {
Validate.notNull(file, "File name cannot be null!"); Validate.notNull(languageId, "Language id cannot be null");
return plugin.getClass().getResource("/languages/" + file + ".yml") != null; Validate.notNull(file, "Language file cannot be null");
return plugin.getClass().getResource(file.getFilePath(languageId)) != null;
} }
@Override @Override
@ -172,16 +176,18 @@ public class LocalizationService extends SlimefunLocalization {
getConfig().clear(); getConfig().clear();
} }
defaultLanguage.setResearchesFile(streamConfigFile("researches_" + language + ".yml", null)); // Copy defaults
defaultLanguage.setResourcesFile(streamConfigFile("resources_" + language + ".yml", null)); for (LanguageFile file : LanguageFile.values()) {
defaultLanguage.setCategoriesFile(streamConfigFile("categories_" + language + ".yml", null)); if (file != LanguageFile.MESSAGES) {
defaultLanguage.setRecipeTypesFile(streamConfigFile("recipes_" + language + ".yml", null)); copyToDefaultLanguage(language, file);
}
}
SlimefunPlugin.logger().log(Level.INFO, "Loaded language \"{0}\"", language); SlimefunPlugin.logger().log(Level.INFO, "Loaded language \"{0}\"", language);
getConfig().setValue(LANGUAGE_PATH, language); getConfig().setValue(LANGUAGE_PATH, language);
// Loading in the defaults from our resources folder // Loading in the defaults from our resources folder
String path = "/languages/messages_" + language + ".yml"; String path = "/languages/" + language + "/messages.yml";
try (BufferedReader reader = new BufferedReader(new InputStreamReader(plugin.getClass().getResourceAsStream(path), StandardCharsets.UTF_8))) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(plugin.getClass().getResourceAsStream(path), StandardCharsets.UTF_8))) {
FileConfiguration config = YamlConfiguration.loadConfiguration(reader); FileConfiguration config = YamlConfiguration.loadConfiguration(reader);
@ -193,24 +199,25 @@ public class LocalizationService extends SlimefunLocalization {
save(); save();
} }
@ParametersAreNonnullByDefault
private void copyToDefaultLanguage(String language, LanguageFile file) {
FileConfiguration config = streamConfigFile(file.getFilePath(language), null);
defaultLanguage.setFile(file, config);
}
@Override @Override
protected void addLanguage(@Nonnull String id, @Nonnull String texture) { protected void addLanguage(@Nonnull String id, @Nonnull String texture) {
Validate.notNull(id, "The language id cannot be null!"); Validate.notNull(id, "The language id cannot be null!");
Validate.notNull(texture, "The language texture cannot be null"); Validate.notNull(texture, "The language texture cannot be null");
if (hasLanguage(id)) { if (hasLanguage(id)) {
FileConfiguration messages = streamConfigFile("messages_" + id + ".yml", getConfig().getConfiguration());
FileConfiguration researches = streamConfigFile("researches_" + id + ".yml", null);
FileConfiguration resources = streamConfigFile("resources_" + id + ".yml", null);
FileConfiguration categories = streamConfigFile("categories_" + id + ".yml", null);
FileConfiguration recipes = streamConfigFile("recipes_" + id + ".yml", null);
Language language = new Language(id, texture); Language language = new Language(id, texture);
language.setMessagesFile(messages);
language.setResearchesFile(researches); for (LanguageFile file : LanguageFile.values()) {
language.setResourcesFile(resources); FileConfiguration defaults = file == LanguageFile.MESSAGES ? getConfig().getConfiguration() : null;
language.setCategoriesFile(categories); FileConfiguration config = streamConfigFile(file.getFilePath(language), defaults);
language.setRecipeTypesFile(recipes); language.setFile(file, config);
}
languages.put(id, language); languages.put(id, language);
} }
@ -263,14 +270,13 @@ public class LocalizationService extends SlimefunLocalization {
return keys; return keys;
} }
@Nullable
private FileConfiguration streamConfigFile(@Nonnull String file, @Nullable FileConfiguration defaults) { private FileConfiguration streamConfigFile(@Nonnull String file, @Nullable FileConfiguration defaults) {
String path = "/languages/" + file; if (plugin.getClass().getResourceAsStream(file) == null) {
if (plugin.getClass().getResourceAsStream(path) == null) {
return new YamlConfiguration(); return new YamlConfiguration();
} }
try (BufferedReader reader = new BufferedReader(new InputStreamReader(plugin.getClass().getResourceAsStream(path), StandardCharsets.UTF_8))) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(plugin.getClass().getResourceAsStream(file), StandardCharsets.UTF_8))) {
FileConfiguration config = YamlConfiguration.loadConfiguration(reader); FileConfiguration config = YamlConfiguration.loadConfiguration(reader);
if (defaults != null) { if (defaults != null) {
@ -279,7 +285,7 @@ public class LocalizationService extends SlimefunLocalization {
return config; return config;
} catch (IOException e) { } catch (IOException e) {
SlimefunPlugin.logger().log(Level.SEVERE, e, () -> "Failed to load language file into memory: \"" + path + "\""); SlimefunPlugin.logger().log(Level.SEVERE, e, () -> "Failed to load language file into memory: \"" + file + "\"");
return null; return null;
} }
} }

View File

@ -1,6 +1,9 @@
package io.github.thebusybiscuit.slimefun4.core.services.localization; package io.github.thebusybiscuit.slimefun4.core.services.localization;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -26,16 +29,12 @@ import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
*/ */
public final class Language { public final class Language {
private final Map<LanguageFile, FileConfiguration> files = new EnumMap<>(LanguageFile.class);
private final String id; private final String id;
private final ItemStack item; private final ItemStack item;
private double progress = -1; private double progress = -1;
private FileConfiguration messages;
private FileConfiguration researches;
private FileConfiguration resources;
private FileConfiguration categories;
private FileConfiguration recipeTypes;
/** /**
* This instantiates a new {@link Language} with the given language code * This instantiates a new {@link Language} with the given language code
* and skull texture. * and skull texture.
@ -85,58 +84,15 @@ public final class Language {
} }
@Nullable @Nullable
FileConfiguration getMessagesFile() { FileConfiguration getFile(@Nonnull LanguageFile file) {
return messages; return files.get(file);
} }
@Nullable public void setFile(@Nonnull LanguageFile file, @Nonnull FileConfiguration config) {
FileConfiguration getResearchesFile() { Validate.notNull(file, "The provided file should not be null.");
return researches; Validate.notNull(config, "The provided config should not be null.");
}
@Nullable files.put(file, config);
FileConfiguration getResourcesFile() {
return resources;
}
@Nullable
FileConfiguration getCategoriesFile() {
return categories;
}
@Nullable
FileConfiguration getRecipeTypesFile() {
return recipeTypes;
}
public void setMessagesFile(@Nonnull FileConfiguration config) {
Validate.notNull(config);
this.messages = config;
}
public void setResearchesFile(@Nonnull FileConfiguration config) {
Validate.notNull(config);
this.researches = config;
}
public void setResourcesFile(@Nonnull FileConfiguration config) {
Validate.notNull(config);
this.resources = config;
}
public void setCategoriesFile(@Nonnull FileConfiguration config) {
Validate.notNull(config);
this.categories = config;
}
public void setRecipeTypesFile(@Nonnull FileConfiguration config) {
Validate.notNull(config);
this.recipeTypes = config;
} }
/** /**
@ -180,7 +136,7 @@ public final class Language {
@Nonnull @Nonnull
public FileConfiguration[] getFiles() { public FileConfiguration[] getFiles() {
return new FileConfiguration[] { getMessagesFile(), getCategoriesFile(), getResearchesFile(), getResourcesFile() }; return Arrays.stream(LanguageFile.valuesCached).map(this::getFile).toArray(FileConfiguration[]::new);
} }
} }

View File

@ -0,0 +1,43 @@
package io.github.thebusybiscuit.slimefun4.core.services.localization;
import javax.annotation.Nonnull;
import org.apache.commons.lang.Validate;
/**
* This enum holds the different types of files each {@link Language} holds.
*
* @author TheBusyBiscuit
*
* @see Language
* @see SlimefunLocalization
*
*/
public enum LanguageFile {
MESSAGES("messages.yml"),
CATEGORIES("categories.yml"),
RECIPES("recipes.yml"),
RESOURCES("resources.yml"),
RESEARCHES("researches.yml");
static final LanguageFile[] valuesCached = values();
private final String fileName;
LanguageFile(@Nonnull String fileName) {
this.fileName = fileName;
}
@Nonnull
public String getFilePath(@Nonnull Language language) {
return getFilePath(language.getId());
}
@Nonnull
public String getFilePath(@Nonnull String languageId) {
Validate.notNull(languageId, "Language id must not be null!");
return "/languages/" + languageId + '/' + fileName;
}
}

View File

@ -121,6 +121,23 @@ public abstract class SlimefunLocalization extends Localization implements Keyed
} }
} }
@Nonnull
private final FileConfiguration getFallback(@Nonnull LanguageFile file) {
Language language = getLanguage(SupportedLanguage.ENGLISH.getLanguageId());
if (language == null) {
throw new IllegalStateException("Fallback language \"en\" is missing!");
}
FileConfiguration fallback = language.getFile(file);
if (fallback != null) {
return fallback;
} else {
throw new IllegalStateException("Fallback file: \"" + file.getFilePath("en") + "\" is missing!");
}
}
@Nonnull @Nonnull
@Override @Override
public String getMessage(@Nonnull String key) { public String getMessage(@Nonnull String key) {
@ -128,11 +145,10 @@ public abstract class SlimefunLocalization extends Localization implements Keyed
Language language = getDefaultLanguage(); Language language = getDefaultLanguage();
String message = language == null ? null : language.getMessagesFile().getString(key); String message = language == null ? null : language.getFile(LanguageFile.MESSAGES).getString(key);
if (message == null) { if (message == null) {
Language fallback = getLanguage(SupportedLanguage.ENGLISH.getLanguageId()); return getFallback(LanguageFile.MESSAGES).getString(key);
return fallback.getMessagesFile().getString(key);
} }
return message; return message;
@ -149,11 +165,10 @@ public abstract class SlimefunLocalization extends Localization implements Keyed
return "NO LANGUAGE FOUND"; return "NO LANGUAGE FOUND";
} }
String message = language.getMessagesFile().getString(key); String message = language.getFile(LanguageFile.MESSAGES).getString(key);
if (message == null) { if (message == null) {
Language fallback = getLanguage(SupportedLanguage.ENGLISH.getLanguageId()); return getFallback(LanguageFile.MESSAGES).getString(key);
return fallback.getMessagesFile().getString(key);
} }
return message; return message;
@ -170,11 +185,10 @@ public abstract class SlimefunLocalization extends Localization implements Keyed
return Collections.singletonList("NO LANGUAGE FOUND"); return Collections.singletonList("NO LANGUAGE FOUND");
} }
List<String> messages = language.getMessagesFile().getStringList(key); List<String> messages = language.getFile(LanguageFile.MESSAGES).getStringList(key);
if (messages.isEmpty()) { if (messages.isEmpty()) {
Language fallback = getLanguage(SupportedLanguage.ENGLISH.getLanguageId()); return getFallback(LanguageFile.MESSAGES).getStringList(key);
return fallback.getMessagesFile().getStringList(key);
} }
return messages; return messages;
@ -200,11 +214,11 @@ public abstract class SlimefunLocalization extends Localization implements Keyed
Language language = getLanguage(p); Language language = getLanguage(p);
if (language == null || language.getResearchesFile() == null) { if (language == null || language.getFile(LanguageFile.RESEARCHES) == null) {
return null; return null;
} }
return language.getResearchesFile().getString(key.getNamespace() + '.' + key.getKey()); return language.getFile(LanguageFile.RESEARCHES).getString(key.getNamespace() + '.' + key.getKey());
} }
@Nullable @Nullable
@ -214,11 +228,11 @@ public abstract class SlimefunLocalization extends Localization implements Keyed
Language language = getLanguage(p); Language language = getLanguage(p);
if (language == null || language.getCategoriesFile() == null) { if (language == null || language.getFile(LanguageFile.CATEGORIES) == null) {
return null; return null;
} }
return language.getCategoriesFile().getString(key.getNamespace() + '.' + key.getKey()); return language.getFile(LanguageFile.CATEGORIES).getString(key.getNamespace() + '.' + key.getKey());
} }
@Nullable @Nullable
@ -228,13 +242,12 @@ public abstract class SlimefunLocalization extends Localization implements Keyed
Language language = getLanguage(p); Language language = getLanguage(p);
String value = language != null && language.getResourcesFile() != null ? language.getResourcesFile().getString(key) : null; String value = language != null && language.getFile(LanguageFile.RESOURCES) != null ? language.getFile(LanguageFile.RESOURCES).getString(key) : null;
if (value != null) { if (value != null) {
return value; return value;
} else { } else {
Language fallback = getLanguage(SupportedLanguage.ENGLISH.getLanguageId()); return getFallback(LanguageFile.RESOURCES).getString(key);
return fallback.getResourcesFile().getString(key);
} }
} }
@ -247,15 +260,15 @@ public abstract class SlimefunLocalization extends Localization implements Keyed
ItemStack item = recipeType.toItem(); ItemStack item = recipeType.toItem();
NamespacedKey key = recipeType.getKey(); NamespacedKey key = recipeType.getKey();
if (language == null || language.getRecipeTypesFile() == null || !language.getRecipeTypesFile().contains(key.getNamespace() + '.' + key.getKey())) { if (language == null || language.getFile(LanguageFile.RECIPES) == null || !language.getFile(LanguageFile.RECIPES).contains(key.getNamespace() + '.' + key.getKey())) {
language = getLanguage("en"); language = getLanguage("en");
} }
if (!language.getRecipeTypesFile().contains(key.getNamespace() + '.' + key.getKey())) { if (!language.getFile(LanguageFile.RECIPES).contains(key.getNamespace() + '.' + key.getKey())) {
return item; return item;
} }
FileConfiguration config = language.getRecipeTypesFile(); FileConfiguration config = language.getFile(LanguageFile.RECIPES);
return new CustomItem(item, meta -> { return new CustomItem(item, meta -> {
meta.setDisplayName(ChatColor.AQUA + config.getString(key.getNamespace() + "." + key.getKey() + ".name")); meta.setDisplayName(ChatColor.AQUA + config.getString(key.getNamespace() + "." + key.getKey() + ".name"));

Some files were not shown because too many files have changed in this diff Show More