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

@ -2,5 +2,5 @@ package ru.windcorp.progressia.client.localization;
@FunctionalInterface
public interface LocaleListener {
void onLocaleChanged(String newLanguage);
void onLocaleChanged(String newLanguage);
}

View File

@ -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<String, String> data;
private final Map<String, String> langList;
private Map<String, String> data;
private final Map<String, String> langList;
private final Collection<WeakReference<LocaleListener>> listeners =
Collections.synchronizedCollection(new LinkedList<>());
private final Collection<WeakReference<LocaleListener>> 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<WeakReference<LocaleListener>> 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<WeakReference<LocaleListener>> 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()));
}
}

View File

@ -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<String, String> parse() {
Map<String, String> 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<String, String> parse() {
Map<String, String> 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;
}
}