penguin/narou-android

Simple 縦書き reader for narou

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