diff --git a/forge-core/src/main/java/forge/util/Localizer.java b/forge-core/src/main/java/forge/util/Localizer.java index 60acb7e0b59..11aaca1320f 100644 --- a/forge-core/src/main/java/forge/util/Localizer.java +++ b/forge-core/src/main/java/forge/util/Localizer.java @@ -15,147 +15,155 @@ import java.util.MissingResourceException; import java.util.ResourceBundle; public class Localizer { - - private static Localizer instance; - private List observers = new ArrayList<>(); - - private Locale locale; - private ResourceBundle resourceBundle; + private static Localizer instance; - public static Localizer getInstance() { - if (instance == null) { - synchronized (Localizer.class) { - instance = new Localizer(); - } - } - return instance; - } - - private Localizer() { - } - - public void initialize(String localeID, String languagesDirectory) { - setLanguage(localeID, languagesDirectory); - } + private List observers = new ArrayList<>(); - public String convert(String value, String fromEncoding, String toEncoding) throws UnsupportedEncodingException { - return new String(value.getBytes(fromEncoding), toEncoding); - } + private Locale locale; + private ResourceBundle resourceBundle; - public String charset(String value, String charsets[]) { - String probe = StandardCharsets.UTF_8.name(); - for(String c : charsets) { - Charset charset = Charset.forName(c); - if(charset != null) { - try { - if (value.equals(convert(convert(value, charset.name(), probe), probe, charset.name()))) { - return c; - } - } catch(UnsupportedEncodingException ignored) {} - } - } - return StandardCharsets.UTF_8.name(); - } + public static Localizer getInstance() { + if (instance == null) { + synchronized (Localizer.class) { + instance = new Localizer(); + } + } + return instance; + } - public String getMessage(final String key, final Object... messageArguments) { - MessageFormat formatter = null; + private Localizer() { + } - try { - //formatter = new MessageFormat(resourceBundle.getString(key.toLowerCase()), locale); - formatter = new MessageFormat(resourceBundle.getString(key), locale); - } catch (final IllegalArgumentException | MissingResourceException e) { - e.printStackTrace(); - } - - if (formatter == null) { - System.err.println("INVALID PROPERTY: '" + key + "' -- Translation Needed?"); - return "INVALID PROPERTY: '" + key + "' -- Translation Needed?"; - } - - formatter.setLocale(locale); - - String formattedMessage = "CHAR ENCODING ERROR"; - final String[] charsets = { "ISO-8859-1", "UTF-8" }; - //Support non-English-standard characters - String detectedCharset = charset(resourceBundle.getString(key), charsets); + public void initialize(String localeID, String languagesDirectory) { + setLanguage(localeID, languagesDirectory); + } - final int argLength = messageArguments.length; - Object[] syncEncodingMessageArguments = new Object[argLength]; - //when messageArguments encoding not equal resourceBundle.getString(key),convert to equal - //avoid convert to a have two encoding content formattedMessage string. - for (int i = 0; i < argLength; i++) { - String objCharset = charset(messageArguments[i].toString(), charsets); - try { - syncEncodingMessageArguments[i] = convert(messageArguments[i].toString(), objCharset, detectedCharset); - } catch (UnsupportedEncodingException ignored) { - System.err.println("Cannot Convert '" + messageArguments[i].toString() + "' from '" + objCharset + "' To '" + detectedCharset + "'"); - return "encoding '" + key + "' translate string failure"; - } - } + public String convert(String value, String fromEncoding, String toEncoding) throws UnsupportedEncodingException { + return new String(value.getBytes(fromEncoding), toEncoding); + } - try { - formattedMessage = new String(formatter.format(syncEncodingMessageArguments).getBytes(detectedCharset), StandardCharsets.UTF_8); - } catch(UnsupportedEncodingException ignored) {} + public String charset(String value, String charsets[]) { + String probe = StandardCharsets.UTF_8.name(); + for(String c : charsets) { + Charset charset = Charset.forName(c); + if(charset != null) { + try { + if (value.equals(convert(convert(value, charset.name(), probe), probe, charset.name()))) { + return c; + } + } catch(UnsupportedEncodingException ignored) {} + } + } + return StandardCharsets.UTF_8.name(); + } - return formattedMessage; - } + public String getMessage(final String key, String defaultValue, final Object... messageArguments) { + try { + return getMessage(key, messageArguments); + } catch (Exception e) { + return defaultValue; + } + } + //FIXME: localizer should return default value from english locale or it will crash some GUI element like the NewGameMenu->NewGameScreen Popup when returned null... + public String getMessage(final String key, final Object... messageArguments) { + MessageFormat formatter = null; - public void setLanguage(final String languageRegionID, final String languagesDirectory) { - - String[] splitLocale = languageRegionID.split("-"); - - Locale oldLocale = locale; - locale = new Locale(splitLocale[0], splitLocale[1]); - - //Don't reload the language if nothing changed - if (oldLocale == null || !oldLocale.equals(locale)) { + try { + //formatter = new MessageFormat(resourceBundle.getString(key.toLowerCase()), locale); + formatter = new MessageFormat(resourceBundle.getString(key), locale); + } catch (final IllegalArgumentException | MissingResourceException e) { + e.printStackTrace(); + } - File file = new File(languagesDirectory); - URL[] urls = null; - - try { - urls = new URL[] { file.toURI().toURL() }; - } catch (MalformedURLException e) { - e.printStackTrace(); - } + if (formatter == null) { + System.err.println("INVALID PROPERTY: '" + key + "' -- Translation Needed?"); + return "INVALID PROPERTY: '" + key + "' -- Translation Needed?"; + } - ClassLoader loader = new URLClassLoader(urls); + formatter.setLocale(locale); - try { - resourceBundle = ResourceBundle.getBundle(languageRegionID, new Locale(splitLocale[0], splitLocale[1]), loader); - } catch (NullPointerException | MissingResourceException e) { - //If the language can't be loaded, default to US English - resourceBundle = ResourceBundle.getBundle("en-US", new Locale("en", "US"), loader); - e.printStackTrace(); - } + String formattedMessage = "CHAR ENCODING ERROR"; + final String[] charsets = { "ISO-8859-1", "UTF-8" }; + //Support non-English-standard characters + String detectedCharset = charset(resourceBundle.getString(key), charsets); - System.out.println("Language '" + resourceBundle.toString() + "' loaded successfully."); - - notifyObservers(); - - } - - } - - public List getLanguages() { - //TODO List all languages by getting their files - return null; - } - - public void registerObserver(LocalizationChangeObserver observer) { - observers.add(observer); - } - - private void notifyObservers() { - for (LocalizationChangeObserver observer : observers) { - observer.localizationChanged(); - } - } + final int argLength = messageArguments.length; + Object[] syncEncodingMessageArguments = new Object[argLength]; + //when messageArguments encoding not equal resourceBundle.getString(key),convert to equal + //avoid convert to a have two encoding content formattedMessage string. + for (int i = 0; i < argLength; i++) { + String objCharset = charset(messageArguments[i].toString(), charsets); + try { + syncEncodingMessageArguments[i] = convert(messageArguments[i].toString(), objCharset, detectedCharset); + } catch (UnsupportedEncodingException ignored) { + System.err.println("Cannot Convert '" + messageArguments[i].toString() + "' from '" + objCharset + "' To '" + detectedCharset + "'"); + return "encoding '" + key + "' translate string failure"; + } + } - public static class Language { - public String languageName; - public String languageID; - } + try { + formattedMessage = new String(formatter.format(syncEncodingMessageArguments).getBytes(detectedCharset), StandardCharsets.UTF_8); + } catch(UnsupportedEncodingException ignored) {} + + return formattedMessage; + } + + public void setLanguage(final String languageRegionID, final String languagesDirectory) { + + String[] splitLocale = languageRegionID.split("-"); + + Locale oldLocale = locale; + locale = new Locale(splitLocale[0], splitLocale[1]); + + //Don't reload the language if nothing changed + if (oldLocale == null || !oldLocale.equals(locale)) { + + File file = new File(languagesDirectory); + URL[] urls = null; + + try { + urls = new URL[] { file.toURI().toURL() }; + } catch (MalformedURLException e) { + e.printStackTrace(); + } + + ClassLoader loader = new URLClassLoader(urls); + + try { + resourceBundle = ResourceBundle.getBundle(languageRegionID, new Locale(splitLocale[0], splitLocale[1]), loader); + } catch (NullPointerException | MissingResourceException e) { + //If the language can't be loaded, default to US English + resourceBundle = ResourceBundle.getBundle("en-US", new Locale("en", "US"), loader); + e.printStackTrace(); + } + + System.out.println("Language '" + resourceBundle.toString() + "' loaded successfully."); + + notifyObservers(); + + } + + } + + public List getLanguages() { + //TODO List all languages by getting their files + return null; + } + + public void registerObserver(LocalizationChangeObserver observer) { + observers.add(observer); + } + + private void notifyObservers() { + for (LocalizationChangeObserver observer : observers) { + observer.localizationChanged(); + } + } + + public static class Language { + public String languageName; + public String languageID; + } } diff --git a/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java b/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java index 44ad3f5d7b8..d973d3a7dc9 100644 --- a/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java +++ b/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java @@ -24,13 +24,13 @@ public class NewGameMenu extends FPopupMenu { final static Localizer localizer = Localizer.getInstance(); public enum NewGameScreen { - Constructed(localizer.getMessage("lblConstructed"), FSkinImage.MENU_CONSTRUCTED, ConstructedScreen.class), - BoosterDraft(localizer.getMessage("lblBoosterDraft"), FSkinImage.MENU_DRAFT, NewDraftScreen.class), - SealedDeck(localizer.getMessage("lblSealedDeck"), FSkinImage.MENU_SEALED, NewSealedScreen.class), - QuestMode(localizer.getMessage("lblQuestMode"), FSkinImage.QUEST_ZEP, NewQuestScreen.class), - PuzzleMode(localizer.getMessage("lblPuzzleMode"), FSkinImage.MENU_PUZZLE, PuzzleScreen.class), - PlanarConquest(localizer.getMessage("lblPlanarConquest"), FSkinImage.MENU_GALAXY, NewConquestScreen.class), - Gauntlet(localizer.getMessage("lblGauntlet"), FSkinImage.MENU_GAUNTLET, NewGauntletScreen.class); + Constructed(localizer.getMessage("lblConstructed", "Constructed"), FSkinImage.MENU_CONSTRUCTED, ConstructedScreen.class), + BoosterDraft(localizer.getMessage("lblBoosterDraft", "Booster Draft"), FSkinImage.MENU_DRAFT, NewDraftScreen.class), + SealedDeck(localizer.getMessage("lblSealedDeck", "Sealed Deck"), FSkinImage.MENU_SEALED, NewSealedScreen.class), + QuestMode(localizer.getMessage("lblQuestMode", "Quest Mode"), FSkinImage.QUEST_ZEP, NewQuestScreen.class), + PuzzleMode(localizer.getMessage("lblPuzzleMode", "Puzzle Mode"), FSkinImage.MENU_PUZZLE, PuzzleScreen.class), + PlanarConquest(localizer.getMessage("lblPlanarConquest", "Planar Conquest"), FSkinImage.MENU_GALAXY, NewConquestScreen.class), + Gauntlet(localizer.getMessage("lblGauntlet", "Gauntlet"), FSkinImage.MENU_GAUNTLET, NewGauntletScreen.class); private final FMenuItem item; private final Class screenClass; @@ -51,7 +51,7 @@ public class NewGameMenu extends FPopupMenu { if (screen == null) { //don't initialize screen until it's opened the first time try { screen = screenClass.newInstance(); - screen.setHeaderCaption(localizer.getMessage("lblNewGame") + " - " + item.getText()); + screen.setHeaderCaption(localizer.getMessage("lblNewGame", "New Game") + " - " + item.getText()); } catch (Exception e) { e.printStackTrace();