// This file is part of AceWiki. // Copyright 2008-2013, AceWiki developers. // // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU // Lesser General Public License as published by the Free Software Foundation, either version 3 of // the License, or (at your option) any later version. // // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If // not, see http://www.gnu.org/licenses/. package ch.uzh.ifi.attempto.echocomp; import java.text.Collator; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; import nextapp.echo.app.ApplicationInstance; /** * With this class, the text resources of different locales can be accessed. * * @author Tobias Kuhn */ public class LocaleResources { /** * The default locale. */ public static final Locale defaultLocale = new Locale("en", "US"); private static Map<String, ResourceBundle> bundles = new HashMap<>(); private static List<String> baseNames = new ArrayList<>(); private LocaleResources() {} // no instances allowed /** * Loads a bundle, unless it is loaded already. * * @param baseName The base name referring to the properties file to be loaded. */ public static void loadBundle(String baseName) { if (!baseNames.contains(baseName)) { baseNames.add(baseName); } } /** * Returns a localized text. * * @param l The locale. * @param key The key of the text item. * @return The localized string. */ public static String getString(Locale l, String key) { String s = null; if (l != null) { s = getResourceString(l, key); } if (isEmpty(s)) { s = getResourceString(defaultLocale, key); } if (isEmpty(s)) s = null; return s; } /** * Returns a localized text for the current locale. * * @param key The key of the text item. * @return The localized string. */ public static String getString(String key) { return getString(getLocale(), key); } /** * Returns the locale of the current application instance. * * @return The locale. */ public static Locale getLocale() { ApplicationInstance app = EchoThread.getActiveApplication(); if (app == null) return defaultLocale; Locale locale = app.getLocale(); if (locale == null) return defaultLocale; return locale; } /** * Returns a collator for the current locale. * * @return The collator. */ public static Collator getCollator() { return Collator.getInstance(getLocale()); } private static String getResourceString(Locale l, String key) { String s = null; for (String n : baseNames) { s = getResourceString(n, l, key); if (!isEmpty(s)) return s; } return s; } private static String getResourceString(String baseName, Locale l, String key) { String s = null; try { s = getResourceBundle(baseName, l).getString(key); } catch (MissingResourceException ex) {} return s; } private static ResourceBundle getResourceBundle(String baseName, Locale l) { ResourceBundle r = bundles.get(baseName + " " + l); if (r == null) { try { r = ResourceBundle.getBundle(baseName, l); } catch (MissingResourceException ex) { r = ResourceBundle.getBundle(baseName, defaultLocale); } bundles.put(baseName + " " + l, r); } return r; } private static boolean isEmpty(String s) { return s == null || s.matches("\\s*"); } }