mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2024-11-29 08:36:45 +01:00
Draft of Caption resolving
This commit is contained in:
parent
600f757046
commit
f80cadcd7f
@ -28,13 +28,16 @@ package com.plotsquared.core;
|
|||||||
import com.plotsquared.core.command.WE_Anywhere;
|
import com.plotsquared.core.command.WE_Anywhere;
|
||||||
import com.plotsquared.core.components.ComponentPresetManager;
|
import com.plotsquared.core.components.ComponentPresetManager;
|
||||||
import com.plotsquared.core.configuration.Caption;
|
import com.plotsquared.core.configuration.Caption;
|
||||||
|
import com.plotsquared.core.configuration.caption.CaptionMap;
|
||||||
import com.plotsquared.core.configuration.CaptionUtility;
|
import com.plotsquared.core.configuration.CaptionUtility;
|
||||||
import com.plotsquared.core.configuration.Captions;
|
import com.plotsquared.core.configuration.Captions;
|
||||||
import com.plotsquared.core.configuration.ConfigurationSection;
|
import com.plotsquared.core.configuration.ConfigurationSection;
|
||||||
import com.plotsquared.core.configuration.ConfigurationUtil;
|
import com.plotsquared.core.configuration.ConfigurationUtil;
|
||||||
|
import com.plotsquared.core.configuration.caption.LegacyCaptionMap;
|
||||||
import com.plotsquared.core.configuration.MemorySection;
|
import com.plotsquared.core.configuration.MemorySection;
|
||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
import com.plotsquared.core.configuration.Storage;
|
import com.plotsquared.core.configuration.Storage;
|
||||||
|
import com.plotsquared.core.configuration.caption.CaptionLoader;
|
||||||
import com.plotsquared.core.configuration.file.YamlConfiguration;
|
import com.plotsquared.core.configuration.file.YamlConfiguration;
|
||||||
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
import com.plotsquared.core.configuration.serialization.ConfigurationSerialization;
|
||||||
import com.plotsquared.core.database.DBFunc;
|
import com.plotsquared.core.database.DBFunc;
|
||||||
@ -107,6 +110,7 @@ import java.net.MalformedURLException;
|
|||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.nio.file.StandardOpenOption;
|
import java.nio.file.StandardOpenOption;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
@ -164,6 +168,8 @@ public class PlotSquared {
|
|||||||
public HashMap<String, Set<PlotCluster>> clusters_tmp;
|
public HashMap<String, Set<PlotCluster>> clusters_tmp;
|
||||||
public HashMap<String, HashMap<PlotId, Plot>> plots_tmp;
|
public HashMap<String, HashMap<PlotId, Plot>> plots_tmp;
|
||||||
private YamlConfiguration config;
|
private YamlConfiguration config;
|
||||||
|
// Localization
|
||||||
|
@Getter private CaptionMap captionMap;
|
||||||
// Implementation logger
|
// Implementation logger
|
||||||
@Setter @Getter private ILogger logger;
|
@Setter @Getter private ILogger logger;
|
||||||
// Platform / Version / Update URL
|
// Platform / Version / Update URL
|
||||||
@ -219,10 +225,23 @@ public class PlotSquared {
|
|||||||
if (!setupConfigs()) {
|
if (!setupConfigs()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.translationFile = MainUtil.getFile(this.IMP.getDirectory(),
|
|
||||||
Settings.Paths.TRANSLATIONS + File.separator + IMP.getPluginName()
|
// Setup localization
|
||||||
+ ".use_THIS.yml");
|
CaptionMap captionMap;
|
||||||
Captions.load(this.translationFile);
|
if (Settings.Enabled_Components.PER_USER_LOCALE) {
|
||||||
|
captionMap = CaptionLoader.loadAll(Paths.get("lang"));
|
||||||
|
} else {
|
||||||
|
String fileName = "messages_" + Settings.Enabled_Components.DEFAULT_LOCALE + ".json";
|
||||||
|
captionMap = CaptionLoader.loadSingle(Paths.get("lang", fileName));
|
||||||
|
}
|
||||||
|
if (Settings.Enabled_Components.LEGACY_MESSAGES) {
|
||||||
|
this.translationFile = MainUtil.getFile(this.IMP.getDirectory(),
|
||||||
|
Settings.Paths.TRANSLATIONS + File.separator + IMP.getPluginName()
|
||||||
|
+ ".use_THIS.yml");
|
||||||
|
Captions.load(this.translationFile);
|
||||||
|
captionMap = new LegacyCaptionMap(captionMap);
|
||||||
|
}
|
||||||
|
this.captionMap = captionMap;
|
||||||
|
|
||||||
// Setup plotAreaManager
|
// Setup plotAreaManager
|
||||||
if (Settings.Enabled_Components.WORLDS) {
|
if (Settings.Enabled_Components.WORLDS) {
|
||||||
|
@ -573,6 +573,10 @@ public class Settings extends Config {
|
|||||||
PERSISTENT_ROAD_REGEN = false;
|
PERSISTENT_ROAD_REGEN = false;
|
||||||
@Comment({"Enable the `/plot component` preset GUI",
|
@Comment({"Enable the `/plot component` preset GUI",
|
||||||
"Read more about components here: https://wiki.intellectualsites.com/en/plotsquared/installation/plot-components"}) public static boolean COMPONENT_PRESETS = true;
|
"Read more about components here: https://wiki.intellectualsites.com/en/plotsquared/installation/plot-components"}) public static boolean COMPONENT_PRESETS = true;
|
||||||
|
@Comment({"Use legacy messages (will be removed in future)",
|
||||||
|
"It is recommended to use the new message system"}) public static boolean LEGACY_MESSAGES = true;
|
||||||
|
@Comment("Enable per user locale") public static boolean PER_USER_LOCALE = false;
|
||||||
|
@Comment("The default locale") public static String DEFAULT_LOCALE = "en";
|
||||||
@Comment("Use UUID cache to complete usernames")
|
@Comment("Use UUID cache to complete usernames")
|
||||||
public static boolean EXTENDED_USERNAME_COMPLETION = true;
|
public static boolean EXTENDED_USERNAME_COMPLETION = true;
|
||||||
@Comment("Command aliases that will be tab completed")
|
@Comment("Command aliases that will be tab completed")
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
package com.plotsquared.core.configuration.caption;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public final class CaptionLoader {
|
||||||
|
private static final Gson GSON = new GsonBuilder().create();
|
||||||
|
private static final Pattern FILE_NAME_PATTERN = Pattern.compile("messages_(.*)\\.json");
|
||||||
|
|
||||||
|
private CaptionLoader() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CaptionMap loadAll(@NotNull final Path directory) throws IOException {
|
||||||
|
final Map<Locale, CaptionMap> localeMaps = new HashMap<>();
|
||||||
|
try (Stream<Path> files = Files.list(directory)) {
|
||||||
|
List<Path> captionFiles = files.filter(Files::isRegularFile).collect(Collectors.toList());
|
||||||
|
for (Path file : captionFiles) {
|
||||||
|
CaptionMap localeMap = loadSingle(file);
|
||||||
|
localeMaps.put(localeMap.getLocale(), localeMap);
|
||||||
|
}
|
||||||
|
return new PerUserLocaleCaptionMap(localeMaps);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CaptionMap loadSingle(@NotNull final Path file) throws IOException {
|
||||||
|
final String fileName = file.getFileName().toString();
|
||||||
|
final Matcher matcher = FILE_NAME_PATTERN.matcher(fileName);
|
||||||
|
final Locale locale;
|
||||||
|
if (matcher.matches()) {
|
||||||
|
locale = Locale.forLanguageTag(matcher.group(1));
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException(fileName + " is an invalid message file (cannot extract locale)");
|
||||||
|
}
|
||||||
|
JsonObject object = GSON.fromJson(
|
||||||
|
Files.newBufferedReader(file, StandardCharsets.UTF_16),
|
||||||
|
JsonObject.class);
|
||||||
|
Map<TranslatableCaption, String> captions = new HashMap<>();
|
||||||
|
for (Map.Entry<String, JsonElement> entry : object.entrySet()) {
|
||||||
|
TranslatableCaption key = TranslatableCaption.of(entry.getKey());
|
||||||
|
captions.put(key, entry.getValue().getAsString());
|
||||||
|
}
|
||||||
|
return new LocalizedCaptionMap(locale, captions);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.plotsquared.core.configuration.caption;
|
||||||
|
|
||||||
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
public interface CaptionMap {
|
||||||
|
|
||||||
|
String getMessage(TranslatableCaption caption);
|
||||||
|
|
||||||
|
String getMessage(TranslatableCaption caption, PlotPlayer<?> context);
|
||||||
|
|
||||||
|
boolean supportsLocale(Locale locale);
|
||||||
|
|
||||||
|
Locale getLocale();
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
package com.plotsquared.core.configuration.caption;
|
||||||
|
|
||||||
|
import com.plotsquared.core.configuration.Caption;
|
||||||
|
import com.plotsquared.core.configuration.Captions;
|
||||||
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public class LegacyCaptionMap implements CaptionMap {
|
||||||
|
private final CaptionMap parent;
|
||||||
|
private final Map<String, Caption> legacyMap;
|
||||||
|
|
||||||
|
public LegacyCaptionMap(CaptionMap parent) {
|
||||||
|
this.parent = parent;
|
||||||
|
this.legacyMap = new HashMap<>();
|
||||||
|
// add here custom mappings
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage(TranslatableCaption caption) {
|
||||||
|
Caption legacy = this.legacyMap.computeIfAbsent(caption.getKey(), key -> {
|
||||||
|
String captionsName = key.substring(key.indexOf('.') + 1).toUpperCase(Locale.ROOT);
|
||||||
|
try {
|
||||||
|
return Captions.valueOf(captionsName);
|
||||||
|
} catch (IllegalArgumentException ignored) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (legacy == null) {
|
||||||
|
return this.parent.getMessage(caption);
|
||||||
|
}
|
||||||
|
return legacy.getTranslated();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage(TranslatableCaption caption, PlotPlayer<?> context) {
|
||||||
|
return getMessage(caption); // Captions does not allow per player locale
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsLocale(Locale locale) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Locale getLocale() {
|
||||||
|
return Locale.ROOT;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.plotsquared.core.configuration.caption;
|
||||||
|
|
||||||
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class LocalizedCaptionMap implements CaptionMap {
|
||||||
|
private final Locale locale;
|
||||||
|
private final Map<TranslatableCaption, String> captions;
|
||||||
|
|
||||||
|
public LocalizedCaptionMap(Locale locale, Map<TranslatableCaption, String> captions) {
|
||||||
|
this.locale = locale;
|
||||||
|
this.captions = captions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public String getMessage(TranslatableCaption caption) {
|
||||||
|
return this.captions.get(caption);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public String getMessage(TranslatableCaption caption, PlotPlayer<?> context) {
|
||||||
|
return getMessage(caption); // use the translation of this locale
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public boolean supportsLocale(Locale locale) {
|
||||||
|
return this.locale.equals(locale);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public Locale getLocale() {
|
||||||
|
return this.locale;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.plotsquared.core.configuration.caption;
|
||||||
|
|
||||||
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class PerUserLocaleCaptionMap extends LocalizedCaptionMap {
|
||||||
|
private final Map<Locale, CaptionMap> localeMap;
|
||||||
|
|
||||||
|
public PerUserLocaleCaptionMap(Map<Locale, CaptionMap> localeMap) {
|
||||||
|
super(Locale.ROOT, Collections.emptyMap());
|
||||||
|
this.localeMap = localeMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage(TranslatableCaption caption, PlotPlayer<?> context) {
|
||||||
|
return this.localeMap.get(context.getLocale()).getMessage(caption);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsLocale(Locale locale) {
|
||||||
|
return this.localeMap.containsKey(locale);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package com.plotsquared.core.configuration.caption;
|
||||||
|
|
||||||
|
import com.plotsquared.core.configuration.Caption;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public final class TranslatableCaption implements Caption {
|
||||||
|
@NotNull private final String key;
|
||||||
|
|
||||||
|
private TranslatableCaption(@NotNull String key) {
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TranslatableCaption of(@NotNull final String key) {
|
||||||
|
return new TranslatableCaption(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public String getTranslated() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public boolean usePrefix() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull public String getKey() {
|
||||||
|
return this.key;
|
||||||
|
}
|
||||||
|
}
|
@ -61,6 +61,7 @@ import java.util.Collections;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -86,6 +87,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
|
|||||||
*/
|
*/
|
||||||
private ConcurrentHashMap<String, Object> meta;
|
private ConcurrentHashMap<String, Object> meta;
|
||||||
private int hash;
|
private int hash;
|
||||||
|
private Locale locale;
|
||||||
|
|
||||||
public static <T> PlotPlayer<T> from(@NonNull final T object) {
|
public static <T> PlotPlayer<T> from(@NonNull final T object) {
|
||||||
if (!converters.containsKey(object.getClass())) {
|
if (!converters.containsKey(object.getClass())) {
|
||||||
@ -737,6 +739,21 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
|
|||||||
return this.getAttribute("debug");
|
return this.getAttribute("debug");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull public Locale getLocale() {
|
||||||
|
if (this.locale == null) {
|
||||||
|
this.locale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
|
||||||
|
}
|
||||||
|
return this.locale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocale(@NotNull final Locale locale) {
|
||||||
|
if (!PlotSquared.get().getCaptionMap().supportsLocale(locale)) {
|
||||||
|
this.locale = Locale.forLanguageTag(Settings.Enabled_Components.DEFAULT_LOCALE);
|
||||||
|
} else {
|
||||||
|
this.locale = locale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override public int hashCode() {
|
@Override public int hashCode() {
|
||||||
if (this.hash == 0 || this.hash == 485) {
|
if (this.hash == 0 || this.hash == 485) {
|
||||||
this.hash = 485 + this.getUUID().hashCode();
|
this.hash = 485 + this.getUUID().hashCode();
|
||||||
|
Loading…
Reference in New Issue
Block a user