app/src/main/java/net/astropenguin/naroureader/LanguagePacks.java
raw · 2431 bytes
package net.astropenguin.naroureader;
import android.content.Context;
import org.json.JSONObject;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
/** Uses the same bundled JSON packs as the reader extension. */
final class LanguagePacks {
private final Context context;
private final JSONObject supported, fallback;
private final String defaultLanguage;
private JSONObject selected;
private String language;
LanguagePacks(Context context, String savedLanguage) {
this.context = context;
try {
JSONObject config = read("config");
supported = config.getJSONObject("supportedLanguages");
defaultLanguage = config.getString("defaultLanguage");
if (!supported.has(defaultLanguage)) throw new IllegalArgumentException("Unsupported default language");
java.util.Iterator<String> codes = supported.keys();
while (codes.hasNext()) {
if (!codes.next().matches("[a-z]{2,3}(?:-[A-Za-z0-9]+)*")) throw new IllegalArgumentException("Invalid language code");
}
fallback = read(defaultLanguage);
} catch (Exception error) {
throw new IllegalStateException("Invalid bundled language configuration", error);
}
select(savedLanguage);
}
void select(String code) {
if (code == null || !supported.has(code)) code = defaultLanguage;
try {
selected = code.equals(defaultLanguage) ? fallback : read(code);
language = code;
} catch (Exception error) {
selected = fallback;
language = defaultLanguage;
}
}
String language() { return language; }
String text(String key) {
Object value = selected.opt(key);
return value instanceof String ? (String) value : fallback.optString(key, key);
}
private JSONObject read(String code) throws Exception {
try (InputStream input = context.getAssets().open("reader/langpacks/" + code + ".json");
ByteArrayOutputStream output = new ByteArrayOutputStream()) {
byte[] buffer = new byte[4096];
int count;
while ((count = input.read(buffer)) != -1) output.write(buffer, 0, count);
return new JSONObject(new String(output.toByteArray(), StandardCharsets.UTF_8));
}
}
}