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 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)); } } }