package org.smartly.application.desktopgap.impl.app.applications.window; import org.smartly.Smartly; import org.smartly.commons.logging.Level; import org.smartly.commons.util.FileUtils; import org.smartly.commons.util.LocaleUtils; import org.smartly.commons.util.PathUtils; import org.smartly.commons.util.StringUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; /** * */ public final class AppLocalization { private static final String I18N_DIR = "i18n"; private static final String EXT = ".properties"; private static final String DEFAULT = "default"; private final AppInstance _app; private final String _root; private final Map<String, Map<String, String>> _dictionaries; public AppLocalization(final AppInstance app) { _app = app; _root = app.getManifest().getAbsoluteAppPath(I18N_DIR); _dictionaries = new HashMap<String, Map<String, String>>(); this.init(); } /** * Return dictionary value * * @param lang Language * @param dictionaryName Dictionary Name * @param key Resource key * @return Dictionary resource or empty string. Never Null. */ public String get(final String lang, final String dictionaryName, final String key) { final Map<String, String> dictionary = this.getDictionary(lang); final String name_key = StringUtils.concatDot(dictionaryName, key); final String result; if (dictionary.containsKey(name_key)) { result = dictionary.get(name_key); } else { result = this.getDictionary(DEFAULT).get(name_key); } return null != result ? result : ""; } // ------------------------------------------------------------------------ // p r i v a t e // ------------------------------------------------------------------------ private void init() { if (PathUtils.exists(_root)) { final List<File> files = new LinkedList<File>(); FileUtils.listFiles(files, new File(_root)); this.init(files); } } private void init(final List<File> files) { for (final File file : files) { this.load(file); } } private boolean isPropertyFile(final String fileName) { return PathUtils.getFilenameExtension(fileName, true).equalsIgnoreCase(EXT); } private boolean isFile(final String resValue) { try { final File file = new File(PathUtils.concat(_root, resValue)); return file.isFile() || file.exists(); } catch (Throwable ignored) { return false; } } private String[] splitNameLang(final String fileName) { final String name = PathUtils.getFilename(fileName, false); final String[] tokens = StringUtils.splitFirst(name, "_"); if (tokens.length == 2) { return new String[]{tokens[0], LocaleUtils.getLanguage(tokens[1])}; } return new String[]{fileName, DEFAULT}; } private void load(final File file) { try { if (this.isPropertyFile(file.getName())) { final String[] name_lang = this.splitNameLang(file.getName()); final String name = name_lang[0]; final String lang = name_lang[1]; final Map<String, String> dictionary = this.getDictionary(lang); final Properties props = new Properties(); props.load(new InputStreamReader(new FileInputStream(file), Smartly.getCharset())); final Set<Object> keys = props.keySet(); for (final Object key : keys) { if (null != key) { try { this.load(dictionary, name, key.toString(), props.getProperty(key.toString())); } catch (Throwable t) { _app.getLogger().log(Level.SEVERE, null, t); } } } } } catch (Throwable t) { _app.getLogger().log(Level.SEVERE, null, t); } } private void load(final Map<String, String> lang, final String name, final String key, final String value) throws IOException { final String name_key = StringUtils.concatDot(name, key); final String res_value; if (this.isFile(value)) { res_value = FileUtils.readFileToString(new File(PathUtils.concat(_root, value)), Smartly.getCharset()); } else { res_value = value; } lang.put(name_key, res_value); } private Map<String, String> getDictionary(final String lang) { if (!_dictionaries.containsKey(lang)) { _dictionaries.put(lang, new HashMap<String, String>()); } return _dictionaries.get(lang); } }