package neembuu.uploader.translation; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import neembuu.uploader.api.AppLocationProvider; //import neembuu.uploader.settings.SettingsManager; import neembuu.uploader.utils.NULogger; /** * * @author Shashank Tulsyan */ public final class TranslationProvider { private final Properties properties; private final String language; //guarded by this class private static TranslationProvider singleton = null; private static TranslationProvider defaultprovider = null; private static AppLocationProvider appLocationProvider = null; private static LanguageChangedCallback lcc = null; public static final void init(AppLocationProvider appLocationProvider,LanguageChangedCallback lcc){ if(TranslationProvider.appLocationProvider!=null){ throw new IllegalStateException("Already initialized"); } if(TranslationProvider.lcc!=null){ throw new IllegalStateException("Already initialized"); } TranslationProvider.appLocationProvider = appLocationProvider; TranslationProvider.lcc = lcc; } /** * * @return a translation provider based on default locale. If none exist, get TranslationProvider for English */ public static synchronized TranslationProvider getTranslationProvider() { if (singleton == null) { // singleton = new TranslationProvider(Locale.getDefault().getLanguage()); // defaultprovider = new TranslationProvider("en"); // if (singleton.properties == null) { // singleton = defaultprovider; // } singleton = new TranslationProvider("en"); } return singleton; } /** * * @return TranslationProvider with English language as default */ public static synchronized TranslationProvider getDefaultTranslationProvider() { if (defaultprovider == null) { defaultprovider = new TranslationProvider("en"); } return defaultprovider; } /** * * @return language currently in use */ public final String getLanguage() { return language; } /** * Private constructor.. * @param language */ private TranslationProvider(final String language) { this.language = language; Properties p = new Properties(); try { InputStream prof = null; String urlpth = "translations/NeembuuUploader_" + language + ".properties"; prof = new FileInputStream(new File(appLocationProvider.getPath(), urlpth)); p.load(prof); } catch (Exception a) { Logger.getLogger(TranslationProvider.class.getName()).log(Level.SEVERE, "Could not set language for language " + language, a);; TranslationProvider.changeLanguage("en"); } properties = p; } /** * Use this method to get the locale specific value for a key * @param property * @return locale specific value for a key */ public static String get(String property) { Properties p = TranslationProvider.getTranslationProvider().properties; if (p == null) { return property; } String localvalue = p.getProperty(property,""); if (!localvalue.isEmpty()) { return localvalue; } else { TranslationProvider tp = TranslationProvider.getDefaultTranslationProvider(); Properties p1 = tp.properties; String ret = p1.getProperty(property); /*if(ret==null){ return "<null>"+property; }*/ return ret; } } /** * * @param property * @return value for a key in default ENGLISH */ public static String getDefault(String property) { return TranslationProvider.getDefaultTranslationProvider().properties.getProperty(property, ""); } /**This is the method used to initialize TranslationProvider and also to change language. * It also updates the GUI of NeembuuUploader and Table automatically. * @param locale * @throws SecurityException The program is designed to allow * changes from only NeembuuUploader.class and TranslationProvider.class . * This is to prevent, malicious behavior. */ public static synchronized void changeLanguage(String languagecode) { /*package private*/ // getStackTrace()[0] will be getStackTrace() // getStackTrace()[1] will be changeLanguage() // getStackTrace()[2] will be the calling class which should be one of the three allowed classes. String name = Thread.currentThread().getStackTrace()[2].getClassName(); // takes around 228.3 microsec //name = sun.reflect.Reflection.getCallerClass(2).getName(); // takes around 40 microsecs*/ if (!name.equals("neembuu.uploader.NeembuuUploader") && !name.equals("neembuu.uploader.Main") && !name.equals(TranslationProvider.class.getName()) && !name.equals("neembuu.uploader.settings.SettingsManager")) { throw new SecurityException(name + " does not have rights to call this function"); } singleton = new TranslationProvider(languagecode); NULogger.getLogger().log(Level.INFO, "{0}Language Changed", TranslationProvider.class.getName()); //Update GUI on NU lcc.updateGUI(); //NeembuuUploader.getInstance().languageChanged_UpdateGUI(); } }