Refactored localization
This commit is contained in:
parent
5fcccf05ca
commit
280ffba4c0
@ -2,5 +2,5 @@ package ru.windcorp.progressia.client.localization;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface LocaleListener {
|
||||
void onLocaleChanged(String newLanguage);
|
||||
void onLocaleChanged(String newLanguage);
|
||||
}
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user