Language provider

This commit makes it possible to define how the player's language is determined
This commit is contained in:
NichtStudioCode 2023-03-03 17:37:10 +01:00
parent 3d4e062901
commit 1f12b58a1f
2 changed files with 53 additions and 0 deletions

@ -1,5 +1,6 @@
package xyz.xenondevs.inventoryaccess.component; package xyz.xenondevs.inventoryaccess.component;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.inventoryaccess.component.i18n.Languages; import xyz.xenondevs.inventoryaccess.component.i18n.Languages;
@ -24,6 +25,18 @@ public interface ComponentWrapper extends Cloneable {
*/ */
@NotNull ComponentWrapper localized(@NotNull String lang); @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}. * Clones this {@link ComponentWrapper}.
* *

@ -1,19 +1,25 @@
package xyz.xenondevs.inventoryaccess.component.i18n; package xyz.xenondevs.inventoryaccess.component.i18n;
import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonReader;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import xyz.xenondevs.inventoryaccess.component.ComponentWrapper; import xyz.xenondevs.inventoryaccess.component.ComponentWrapper;
import java.io.File;
import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
import java.nio.charset.Charset;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Function;
public class Languages { public class Languages {
private static final Languages INSTANCE = new Languages(); private static final Languages INSTANCE = new Languages();
private final Map<String, Map<String, String>> translations = new HashMap<>(); private final Map<String, Map<String, String>> translations = new HashMap<>();
private Function<Player, String> languageProvider = Player::getLocale;
private boolean serverSideTranslations = true; private boolean serverSideTranslations = true;
private Languages() { 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. * Retrieves the format string for the given key under the given language.
* *
@ -75,6 +95,26 @@ public class Languages {
return map.get(key); 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}. * Enables or disables server-side translations for {@link ComponentWrapper ComponentWrappers}.
* *