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.*;
public class Localizer {
private static final Localizer instance = new Localizer("assets/languages/lang_list.txt");
private final Parser langParser;
private static final Localizer INSTANCE = new Localizer("assets/languages/");
private String language;
private final String langFolder;
@ -18,17 +16,15 @@ public class Localizer {
Collections.synchronizedCollection(new LinkedList<>());
//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 Localizer(String langFolder) {
this.langFolder = langFolder;
this.langList = new Parser(langFolder + "lang_list.txt").parse();
}
public synchronized void setLanguage(String language) {
if (langList.containsKey(language)) {
this.language = language;
langParser.setFilePath(langFolder + language + ".lang");
data = langParser.parse();
data = new Parser(langFolder + language + ".lang").parse();
pokeListeners(language);
} else {
throw new RuntimeException("Language not found: " + language);
@ -40,12 +36,7 @@ public class Localizer {
}
public synchronized String getValue(String key) {
try {
return data.getOrDefault(key, key);
} catch (NullPointerException e) {
e.printStackTrace();
return key;
}
}
private void pokeListeners(String newLanguage) {
@ -63,7 +54,7 @@ public class Localizer {
}
public static Localizer getInstance() {
return instance;
return INSTANCE;
}
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.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;
@ -34,14 +36,14 @@ public class Parser {
if (code == -1) {
break;
}
c = (char)code;
c = (char) code;
if (c == '#') {
while (c != '\n') {
code = rawData.read();
if (code == -1) {
break;
}
c = (char)code;
c = (char) code;
}
} else if (c == ' ') {
code = rawData.read();
@ -50,7 +52,7 @@ public class Parser {
}
c = (char) code;
if (c == '=') {
String key = escaper.escape(stringBuilder.toString());
String key = ESCAPER.escape(stringBuilder.toString());
stringBuilder.setLength(0);
rawData.read(); //skip a char
while (true) {
@ -66,8 +68,8 @@ public class Parser {
stringBuilder.append(c);
}
}
parsedData.put(escaper.unescape(key),
escaper.unescape(stringBuilder.toString()));
parsedData.put(ESCAPER.unescape(key),
ESCAPER.unescape(stringBuilder.toString()));
stringBuilder.setLength(0);
}
} else if (c == '\n') {
@ -86,9 +88,4 @@ public class Parser {
public String getFilePath() {
return filePath;
}
private String filePath;
static private final Escaper escaper = new Escaper.EscaperBuilder()
.withChars("n", "\n").build();
}