Advertisement
JolyJDIA

Untitled

Oct 22nd, 2020 (edited)
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.52 KB | None | 0 0
  1. /**
  2.  * Класс для локализации (работает с форматом JSON)
  3.  * @see com.google.gson
  4.  * Предназначен для накопления языков и для других плагинов
  5.  * структура:
  6.  *      Ключ Формат
  7.  */
  8. public class LocaleLanguage {//JsonLocaleLanguage
  9.     public static Language DEFAULT = Language.RU;
  10.     /**
  11.      * Мапа статичная чтобы копить локализации других плагинов
  12.      * Language - язык
  13.      * Map<String, Object> - {Object} может служить другим разветление(к примеру List)
  14.      * но обычно - String
  15.      */
  16.     private static final EnumMap<Language, Resource> languageMap = new EnumMap<>(Language.class);
  17.     //Класс-Загрузчик для загрузки локализации
  18.     private final ClassLoader loader;
  19.     private int flags;
  20.  
  21.     public LocaleLanguage(ClassLoader loader) {
  22.         this.loader = loader;
  23.     }
  24.     private Resource loadResource(Language lang) {
  25.         try (InputStream stream = loader.getResourceAsStream(lang.getFileName() + ".json")) {
  26.             assert stream != null;
  27.             try (InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) {
  28.                 flags |= 1 << lang.ordinal();
  29.                 return new Resource(StringBind.fromJson(reader, new LocalizationTypeToken().getType()));
  30.             }
  31.         } catch (IOException e) {
  32.             throw new RuntimeException(e);//todo: ошибка
  33.         }
  34.     }
  35.     /**
  36.      * Получает строку для данного ключа из этого пакета ресурсов
  37.      * Этот метод сначала пытается получить объект из этого пакета ресурсов с помощью
  38.      * {@link #getOrLoad}.
  39.      * Если родительский пакет ресурсов содержится в мапе,
  40.      * он вызывает метод {@code get}
  41.      * Если массив аргументов не пустой - заменяем в строке %s на аргументы
  42.      * @param lang - язык
  43.      * @param key - ключ
  44.      * @param args - аргументы, на которые нужно заменить %s
  45.      * @return - строку с заменой
  46.      */
  47.     public String getCorrectLine(Language lang, String key, Object... args) {
  48.         Resource j = getResource(lang);
  49.         return args.length == 0 ? j.getString(key) : String.format(j.getString(key), args);
  50.     }
  51.     /**
  52.      * Получает объект для данного ключа из этого пакета ресурсов
  53.      * Этот метод сначала пытается получить объект из этого пакета ресурсов с помощью
  54.      * Если родительский пакет ресурсов содержится в мапе,
  55.      * он вызывает метод {@code get}.
  56.      * @param lang - язык
  57.      * @param key - ключ
  58.      * @return - Объект
  59.      */
  60.     public Object get(Language lang, String key) {
  61.         return getResource(lang).getObject(key);
  62.     }
  63.     private Resource getResource(Language lang) {
  64.         //Загружаю язык или получаю
  65.         Resource r = languageMap.get(lang);
  66.         if (r == null) {
  67.             Resource newResource = loadResource(lang);
  68.             languageMap.put(lang, newResource);
  69.             return newResource;
  70.         } else if ((flags & 1 << lang.ordinal()) == 0) {//чек на загрузку языка плагина
  71.             BukkitUtils.messagesPlayers("§cЗагружаю язык: "+lang + " плагина "+loader.getName());
  72.             r.lookup.putAll(loadResource(lang).lookup);
  73.         }
  74.         return r;
  75.     }
  76.     private static class Resource {
  77.         private final Map<String, Object> lookup;
  78.  
  79.         public Resource(Map<String, Object> map) {
  80.             this.lookup = map;
  81.         }
  82.  
  83.         public String getString(String key) {
  84.             return (String) lookup.get(key);
  85.         }
  86.  
  87.  
  88.         public Object getObject(String key) {
  89.             return lookup.get(key);
  90.         }
  91.  
  92.  
  93.         public List<Object> getArray(String key) {
  94.             return (List<Object>) lookup.get(key);
  95.         }
  96.     }
  97.     private static class LocalizationTypeToken extends TypeToken<Map<String, Object>> {
  98.         private static final long serialVersionUID = 3988518176787768044L;
  99.     }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement