From 280ffba4c01c1aee91888f343e3cbbdb9c7ca9ba Mon Sep 17 00:00:00 2001 From: Eugenuss Date: Fri, 28 Aug 2020 22:19:58 +0300 Subject: [PATCH] Refactored localization --- .../client/localization/LocaleListener.java | 2 +- .../client/localization/Localizer.java | 109 ++++++------- .../client/localization/Parser.java | 147 +++++++++--------- 3 files changed, 123 insertions(+), 135 deletions(-) diff --git a/src/main/java/ru/windcorp/progressia/client/localization/LocaleListener.java b/src/main/java/ru/windcorp/progressia/client/localization/LocaleListener.java index 933e75a..3e12801 100644 --- a/src/main/java/ru/windcorp/progressia/client/localization/LocaleListener.java +++ b/src/main/java/ru/windcorp/progressia/client/localization/LocaleListener.java @@ -2,5 +2,5 @@ package ru.windcorp.progressia.client.localization; @FunctionalInterface public interface LocaleListener { - void onLocaleChanged(String newLanguage); + void onLocaleChanged(String newLanguage); } \ No newline at end of file diff --git a/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java b/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java index 99780e6..dc8a97e 100644 --- a/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java +++ b/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java @@ -3,74 +3,65 @@ package ru.windcorp.progressia.client.localization; import java.lang.ref.WeakReference; import java.util.*; -public class Localizer { - private static final Localizer instance = new Localizer("assets/languages/lang_list.txt"); +public class Localizer { + private static final Localizer INSTANCE = new Localizer("assets/languages/"); - private final Parser langParser; + private String language; + private final String langFolder; - private String language; - private final String langFolder; + private Map data; + private final Map langList; - private Map data; - private final Map langList; + private final Collection> listeners = + Collections.synchronizedCollection(new LinkedList<>()); - private final Collection> listeners = - Collections.synchronizedCollection(new LinkedList<>()); + //lang list must be in the same folder as .lang files + public Localizer(String langFolder) { + this.langFolder = langFolder; + this.langList = new Parser(langFolder + "lang_list.txt").parse(); + } - //lang list must be in the same folder as .lang files - public Localizer(String langList) { - this.langFolder = langList.concat("/../"); - langParser = new Parser(langList); - this.langList = langParser.parse(); - } + public synchronized void setLanguage(String language) { + if (langList.containsKey(language)) { + this.language = language; + data = new Parser(langFolder + language + ".lang").parse(); + pokeListeners(language); + } else { + throw new RuntimeException("Language not found: " + language); + } + } - public synchronized void setLanguage(String language) { - if (langList.containsKey(language)) { - this.language = language; - langParser.setFilePath(langFolder + language + ".lang"); - data = langParser.parse(); - pokeListeners(language); - } else { - throw new RuntimeException("Language not found: " + language); - } - } + public synchronized String getLanguage() { + return language; + } - public synchronized String getLanguage() { - return language; - } + public synchronized String getValue(String key) { + return data.getOrDefault(key, key); + } - public synchronized String getValue(String key) { - try { - return data.getOrDefault(key, key); - } catch (NullPointerException e) { - e.printStackTrace(); - return key; - } - } + private void pokeListeners(String newLanguage) { + synchronized (listeners) { + Iterator> iterator = listeners.iterator(); + while (iterator.hasNext()) { + LocaleListener listenerOrNull = iterator.next().get(); + if (listenerOrNull == null) { + iterator.remove(); + } else { + listenerOrNull.onLocaleChanged(newLanguage); + } + } + } + } - private void pokeListeners(String newLanguage) { - synchronized (listeners) { - Iterator> iterator = listeners.iterator(); - while (iterator.hasNext()) { - LocaleListener listenerOrNull = iterator.next().get(); - if (listenerOrNull == null) { - iterator.remove(); - } else { - listenerOrNull.onLocaleChanged(newLanguage); - } - } - } - } + public static Localizer getInstance() { + return INSTANCE; + } - public static Localizer getInstance() { - return instance; - } + public void addListener(LocaleListener listener) { + listeners.add(new WeakReference<>(listener)); + } - public void addListener(LocaleListener listener) { - listeners.add(new WeakReference<>(listener)); - } - - public void removeListener(LocaleListener listener) { - listeners.removeIf(ref -> listener.equals(ref.get())); - } + public void removeListener(LocaleListener listener) { + listeners.removeIf(ref -> listener.equals(ref.get())); + } } diff --git a/src/main/java/ru/windcorp/progressia/client/localization/Parser.java b/src/main/java/ru/windcorp/progressia/client/localization/Parser.java index bb09b2d..cfa6022 100644 --- a/src/main/java/ru/windcorp/progressia/client/localization/Parser.java +++ b/src/main/java/ru/windcorp/progressia/client/localization/Parser.java @@ -4,91 +4,88 @@ import ru.windcorp.jputil.chars.EscapeException; import ru.windcorp.jputil.chars.Escaper; import ru.windcorp.progressia.common.resource.ResourceManager; -import java.io.File; import java.io.IOException; import java.io.Reader; import java.util.HashMap; import java.util.Map; public class Parser { + private String filePath; + static private final Escaper ESCAPER = new Escaper.EscaperBuilder() + .withChars("n", "\n").build(); - public Parser(String filePath) { - this.filePath = filePath; - } + public Parser(String filePath) { + this.filePath = filePath; + } - public void setFilePath(String filePath) { - this.filePath = filePath; - } + public void setFilePath(String filePath) { + this.filePath = filePath; + } - public Map parse() { - Map parsedData = new HashMap<>(); - try (Reader rawData = ResourceManager - .getResource(filePath) - .getReader() - ) { - int code; - char c; - StringBuilder stringBuilder = new StringBuilder(); - while (true) { - code = rawData.read(); - if (code == -1) { - break; - } - c = (char)code; - if (c == '#') { - while (c != '\n') { - code = rawData.read(); - if (code == -1) { - break; - } - c = (char)code; - } - } else if (c == ' ') { - code = rawData.read(); - if (code == -1) { - break; - } - c = (char) code; - if (c == '=') { - String key = escaper.escape(stringBuilder.toString()); - stringBuilder.setLength(0); - rawData.read(); //skip a char - while (true) { - code = rawData.read(); - if (code == -1) { - break; - } + public Map parse() { + Map parsedData = new HashMap<>(); + try (Reader rawData = ResourceManager + .getResource(filePath) + .getReader() + ) { + int code; + char c; + StringBuilder stringBuilder = new StringBuilder(); + while (true) { + code = rawData.read(); + if (code == -1) { + break; + } + c = (char) code; + if (c == '#') { + while (c != '\n') { + code = rawData.read(); + if (code == -1) { + break; + } + c = (char) code; + } + } else if (c == ' ') { + code = rawData.read(); + if (code == -1) { + break; + } + c = (char) code; + if (c == '=') { + String key = ESCAPER.escape(stringBuilder.toString()); + stringBuilder.setLength(0); + rawData.read(); //skip a char + while (true) { + code = rawData.read(); + if (code == -1) { + break; + } - c = (char) code; - if (code == '\n') { - break; - } else { - stringBuilder.append(c); - } - } - parsedData.put(escaper.unescape(key), - escaper.unescape(stringBuilder.toString())); - stringBuilder.setLength(0); - } - } else if (c == '\n') { - stringBuilder.setLength(0); - } else { - stringBuilder.append(c); - } - } + c = (char) code; + if (code == '\n') { + break; + } else { + stringBuilder.append(c); + } + } + parsedData.put(ESCAPER.unescape(key), + ESCAPER.unescape(stringBuilder.toString())); + stringBuilder.setLength(0); + } + } else if (c == '\n') { + stringBuilder.setLength(0); + } else { + stringBuilder.append(c); + } + } - } catch (IOException | EscapeException e) { - throw new RuntimeException(e); - } - return parsedData; - } + } catch (IOException | EscapeException e) { + throw new RuntimeException(e); + } + return parsedData; + } - public String getFilePath() { - return filePath; - } - - - private String filePath; - static private final Escaper escaper = new Escaper.EscaperBuilder() - .withChars("n", "\n").build(); + public String getFilePath() { + return filePath; + } }