Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Класс для локализации (работает с форматом JSON)
- * @see com.google.gson
- * Предназначен для накопления языков и для других плагинов
- * структура:
- * Ключ Формат
- */
- public class LocaleLanguage {//JsonLocaleLanguage
- public static Language DEFAULT = Language.RU;
- /**
- * Мапа статичная чтобы копить локализации других плагинов
- * Language - язык
- * Map<String, Object> - {Object} может служить другим разветление(к примеру List)
- * но обычно - String
- */
- private static final EnumMap<Language, Resource> languageMap = new EnumMap<>(Language.class);
- //Класс-Загрузчик для загрузки локализации
- private final ClassLoader loader;
- private int flags;
- public LocaleLanguage(ClassLoader loader) {
- this.loader = loader;
- }
- private Resource loadResource(Language lang) {
- try (InputStream stream = loader.getResourceAsStream(lang.getFileName() + ".json")) {
- assert stream != null;
- try (InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) {
- flags |= 1 << lang.ordinal();
- return new Resource(StringBind.fromJson(reader, new LocalizationTypeToken().getType()));
- }
- } catch (IOException e) {
- throw new RuntimeException(e);//todo: ошибка
- }
- }
- /**
- * Получает строку для данного ключа из этого пакета ресурсов
- * Этот метод сначала пытается получить объект из этого пакета ресурсов с помощью
- * {@link #getOrLoad}.
- * Если родительский пакет ресурсов содержится в мапе,
- * он вызывает метод {@code get}
- * Если массив аргументов не пустой - заменяем в строке %s на аргументы
- * @param lang - язык
- * @param key - ключ
- * @param args - аргументы, на которые нужно заменить %s
- * @return - строку с заменой
- */
- public String getCorrectLine(Language lang, String key, Object... args) {
- Resource j = getResource(lang);
- return args.length == 0 ? j.getString(key) : String.format(j.getString(key), args);
- }
- /**
- * Получает объект для данного ключа из этого пакета ресурсов
- * Этот метод сначала пытается получить объект из этого пакета ресурсов с помощью
- * Если родительский пакет ресурсов содержится в мапе,
- * он вызывает метод {@code get}.
- * @param lang - язык
- * @param key - ключ
- * @return - Объект
- */
- public Object get(Language lang, String key) {
- return getResource(lang).getObject(key);
- }
- private Resource getResource(Language lang) {
- //Загружаю язык или получаю
- Resource r = languageMap.get(lang);
- if (r == null) {
- Resource newResource = loadResource(lang);
- languageMap.put(lang, newResource);
- return newResource;
- } else if ((flags & 1 << lang.ordinal()) == 0) {//чек на загрузку языка плагина
- BukkitUtils.messagesPlayers("§cЗагружаю язык: "+lang + " плагина "+loader.getName());
- r.lookup.putAll(loadResource(lang).lookup);
- }
- return r;
- }
- private static class Resource {
- private final Map<String, Object> lookup;
- public Resource(Map<String, Object> map) {
- this.lookup = map;
- }
- public String getString(String key) {
- return (String) lookup.get(key);
- }
- public Object getObject(String key) {
- return lookup.get(key);
- }
- public List<Object> getArray(String key) {
- return (List<Object>) lookup.get(key);
- }
- }
- private static class LocalizationTypeToken extends TypeToken<Map<String, Object>> {
- private static final long serialVersionUID = 3988518176787768044L;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement