package fr.tikione.steam.cleaner.util; import fr.tikione.ini.InfinitiveLoopException; import fr.tikione.ini.Ini; import fr.tikione.steam.cleaner.Main; import fr.tikione.steam.cleaner.util.conf.I18nEncoding; import java.io.CharConversionException; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.regex.PatternSyntaxException; /** * Translation handler. */ public class Translation { private static final String DEFAULT_LANGCODE = "en"; private static final String CONF_BASEPATH = "conf/i18n/"; public static final String CONF_BASEPATH_FLAGS = CONF_BASEPATH + "flags/"; private static final String CONF_EXT = ".ini"; private Ini iniLang; public static final String SEC_WMAIN = "W_MAIN"; public static final String SEC_WABOUT = "W_ABOUT"; public static final String SEC_WCHECKFORUPDATES = "W_CHECKFORUPDATES"; public static final String SEC_DELETE = "W_DELETE"; public static final String SEC_OPTIONS = "W_OPTIONS"; public Translation(String localeCode) { try { iniLang = new Ini(); String lngEncoding = I18nEncoding.getInstance().getLngEncoding(localeCode); iniLang.load(new File(CONF_BASEPATH + localeCode + ".ini"), lngEncoding); Log.info("Loaded language '" + localeCode + "' with " + lngEncoding + " encoding"); } catch (IOException | PatternSyntaxException | InfinitiveLoopException ex) { Log.error(ex); } } /** * Get a translated string denoted by an identifier and a section name. * * @param section the section name. * @param key the string identifier. * @return the translated string. */ public String getString(String section, String key) { try { return iniLang.getKeyValue(" ??? ", section, key); } catch (CharConversionException | InfinitiveLoopException ex) { Log.error(ex); return " ??? "; } } public static List<CountryLanguage> getAvailLangList() throws IOException, InfinitiveLoopException { List<CountryLanguage> langList = new ArrayList<>(2); File i18nFolder = new File(CONF_BASEPATH); File[] langFiles = i18nFolder.listFiles((File dir, String name) -> name.endsWith(CONF_EXT) && !name.equalsIgnoreCase("encoding.ini")); Ini langIni = new Ini(); if (langFiles != null) { for (File langFile : langFiles) { langIni.load(langFile, Main.CONF_ENCODING); String langDesc = langIni.getKeyValue(" ??? ", "", "name"); String langFilename = langFile.getName(); langFilename = langFilename.substring(0, langFilename.indexOf('.')); langList.add(new CountryLanguage(langFilename, langDesc)); } } return langList; } @SuppressWarnings("CallToThreadDumpStack") public static String getSystemLangIfAvailable(List<CountryLanguage> availLangList) { String sysLang = DEFAULT_LANGCODE; try { String userLanguage = System.getProperty("user.language"); String userCountry = System.getProperty("user.country"); String userLocale = userLanguage + "_" + userCountry; for (CountryLanguage lang : availLangList) { String langCode = lang.getCode(); if (langCode.equalsIgnoreCase(userLocale) || langCode.equalsIgnoreCase(userLanguage)) { sysLang = langCode; break; } } } catch (Exception ex) { Log.error(ex); sysLang = DEFAULT_LANGCODE; } return sysLang; } }