Refactored localization

This commit is contained in:
Евгений Смирнов 2020-08-28 22:19:58 +03:00
parent 5fcccf05ca
commit 280ffba4c0
3 changed files with 123 additions and 135 deletions

View File

@ -4,9 +4,7 @@ import java.lang.ref.WeakReference;
import java.util.*; import java.util.*;
public class Localizer { public class Localizer {
private static final Localizer instance = new Localizer("assets/languages/lang_list.txt"); private static final Localizer INSTANCE = new Localizer("assets/languages/");
private final Parser langParser;
private String language; private String language;
private final String langFolder; private final String langFolder;
@ -18,17 +16,15 @@ public class Localizer {
Collections.synchronizedCollection(new LinkedList<>()); Collections.synchronizedCollection(new LinkedList<>());
//lang list must be in the same folder as .lang files //lang list must be in the same folder as .lang files
public Localizer(String langList) { public Localizer(String langFolder) {
this.langFolder = langList.concat("/../"); this.langFolder = langFolder;
langParser = new Parser(langList); this.langList = new Parser(langFolder + "lang_list.txt").parse();
this.langList = langParser.parse();
} }
public synchronized void setLanguage(String language) { public synchronized void setLanguage(String language) {
if (langList.containsKey(language)) { if (langList.containsKey(language)) {
this.language = language; this.language = language;
langParser.setFilePath(langFolder + language + ".lang"); data = new Parser(langFolder + language + ".lang").parse();
data = langParser.parse();
pokeListeners(language); pokeListeners(language);
} else { } else {
throw new RuntimeException("Language not found: " + language); throw new RuntimeException("Language not found: " + language);
@ -40,12 +36,7 @@ public class Localizer {
} }
public synchronized String getValue(String key) { public synchronized String getValue(String key) {
try {
return data.getOrDefault(key, key); return data.getOrDefault(key, key);
} catch (NullPointerException e) {
e.printStackTrace();
return key;
}
} }
private void pokeListeners(String newLanguage) { private void pokeListeners(String newLanguage) {
@ -63,7 +54,7 @@ public class Localizer {
} }
public static Localizer getInstance() { public static Localizer getInstance() {
return instance; return INSTANCE;
} }
public void addListener(LocaleListener listener) { public void addListener(LocaleListener listener) {

View File

@ -4,13 +4,15 @@ import ru.windcorp.jputil.chars.EscapeException;
import ru.windcorp.jputil.chars.Escaper; import ru.windcorp.jputil.chars.Escaper;
import ru.windcorp.progressia.common.resource.ResourceManager; import ru.windcorp.progressia.common.resource.ResourceManager;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class Parser { public class Parser {
private String filePath;
static private final Escaper ESCAPER = new Escaper.EscaperBuilder()
.withChars("n", "\n").build();
public Parser(String filePath) { public Parser(String filePath) {
this.filePath = filePath; this.filePath = filePath;
@ -50,7 +52,7 @@ public class Parser {
} }
c = (char) code; c = (char) code;
if (c == '=') { if (c == '=') {
String key = escaper.escape(stringBuilder.toString()); String key = ESCAPER.escape(stringBuilder.toString());
stringBuilder.setLength(0); stringBuilder.setLength(0);
rawData.read(); //skip a char rawData.read(); //skip a char
while (true) { while (true) {
@ -66,8 +68,8 @@ public class Parser {
stringBuilder.append(c); stringBuilder.append(c);
} }
} }
parsedData.put(escaper.unescape(key), parsedData.put(ESCAPER.unescape(key),
escaper.unescape(stringBuilder.toString())); ESCAPER.unescape(stringBuilder.toString()));
stringBuilder.setLength(0); stringBuilder.setLength(0);
} }
} else if (c == '\n') { } else if (c == '\n') {
@ -86,9 +88,4 @@ public class Parser {
public String getFilePath() { public String getFilePath() {
return filePath; return filePath;
} }
private String filePath;
static private final Escaper escaper = new Escaper.EscaperBuilder()
.withChars("n", "\n").build();
} }