From 1f12b58a1f1d992f5453ef5d9c61311d0b54c9a1 Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Fri, 3 Mar 2023 17:37:10 +0100 Subject: [PATCH] Language provider This commit makes it possible to define how the player's language is determined --- .../component/ComponentWrapper.java | 13 ++++++ .../component/i18n/Languages.java | 40 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/ComponentWrapper.java b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/ComponentWrapper.java index 5d48bf2..a42bc5c 100644 --- a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/ComponentWrapper.java +++ b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/ComponentWrapper.java @@ -1,5 +1,6 @@ package xyz.xenondevs.inventoryaccess.component; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import xyz.xenondevs.inventoryaccess.component.i18n.Languages; @@ -24,6 +25,18 @@ public interface ComponentWrapper extends Cloneable { */ @NotNull ComponentWrapper localized(@NotNull String lang); + /** + * Creates a localized version of the component by replacing all translatable components with text components + * of the {@link Player Player's} language. + * + * @param player The player to get the language from. Uses {@link Languages#getLanguage(Player)}. + * @return A new {@link ComponentWrapper} of the localized component or the same {@link ComponentWrapper} + * if {@link Languages} is disabled. + */ + default @NotNull ComponentWrapper localized(@NotNull Player player) { + return localized(Languages.getInstance().getLanguage(player)); + } + /** * Clones this {@link ComponentWrapper}. * diff --git a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/i18n/Languages.java b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/i18n/Languages.java index 2005a09..3582417 100644 --- a/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/i18n/Languages.java +++ b/inventoryaccess/inventory-access/src/main/java/xyz/xenondevs/inventoryaccess/component/i18n/Languages.java @@ -1,19 +1,25 @@ package xyz.xenondevs.inventoryaccess.component.i18n; import com.google.gson.stream.JsonReader; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; +import java.io.File; +import java.io.FileReader; import java.io.IOException; import java.io.Reader; +import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; +import java.util.function.Function; public class Languages { private static final Languages INSTANCE = new Languages(); private final Map> translations = new HashMap<>(); + private Function languageProvider = Player::getLocale; private boolean serverSideTranslations = true; private Languages() { @@ -61,6 +67,20 @@ public class Languages { } } + /** + * Adds a language under the given lang code after reading it from the given file. + * + * @param lang The lang code of the language. + * @param file The file to read the language from. + * @param charset The charset to use. + * @throws IOException If an error occurs while reading. + */ + public void loadLanguage(@NotNull String lang, @NotNull File file, @NotNull Charset charset) throws IOException { + try (var reader = new FileReader(file, charset)) { + loadLanguage(lang, reader); + } + } + /** * Retrieves the format string for the given key under the given language. * @@ -75,6 +95,26 @@ public class Languages { return map.get(key); } + /** + * Sets the way the language is determined for a player. + * By default, the language is determined using {@link Player#getLocale()}. + * + * @param languageProvider The language provider. + */ + public void setLanguageProvider(@NotNull Function<@NotNull Player, @NotNull String> languageProvider) { + this.languageProvider = languageProvider; + } + + /** + * Gets the language for the given player by invoking the configured language provider. + * + * @param player The player to get the language for. + * @return The language of the player. + */ + public @NotNull String getLanguage(@NotNull Player player) { + return languageProvider.apply(player); + } + /** * Enables or disables server-side translations for {@link ComponentWrapper ComponentWrappers}. *