【问题标题】:How to change the language of a java app using interfaces?如何使用接口更改 Java 应用程序的语言?
【发布时间】:2014-03-10 18:35:31
【问题描述】:

目前我正在为我的应用程序中所有需要的字符串使用一个接口。我从应用程序的任何位置访问接口(称为 StringConstants)。该界面以荷兰语设置所有字符串,但知道我还想添加一个语言切换选项(英语)。更改我正在使用的界面的技巧是什么,或者我应该为我想使用的每种语言制作一个界面?

这是我目前使用的接口代码:

package constants;

public interface StringConstants {
    //LabyrintUI//
    public String APP_TITLE = "Labyrint";
    public String APP_VERSION = "Versie 1.0";
    public String MENU_TITLE = "Labyrint - Menu";
    public String MOEILIJKHEID1 = "Gemakkelijk";
    public String MOEILIJKHEID2 = "Normaal";
    public String MOEILIJKHEID3 = "Moeilijk";
    public String BTN_SPEEL_TITLE = "Speel";
    public String BTN_OPTIES_TITLE = "Opties";
    public String BTN_STOP_TITLE = "Stop";
    public String BTN_RESET_SCORES_TITLE = "Verwijder de highscores";
    public String BTN_SPELREGELS_TITLE = "Spelregels";
    public String BTN_OVER_TITLE = "Over";
    public String BTN_DEFAULT_SETTINGS_TERUG_ZETTEN_TITLE = "Standaardinstellingen terugzetten";
    public String BTN_OPSLAAN_TITLE = "Opslaan";
    public String LBL_MOEILIJKHEIDSGRAAD_TITLE = "Moeilijkheidsgraad";
    public String LBL_GELUID_TITLE = "Geluid";
    public String LBL_SCORES_TITLE = "Highscores";
    public String LBL_LAST_SCORE_TITLE = "Laatste score";
    public String MI_NIEUWSPEL_TITLE = "Nieuw spel";
    public String MI_NIEUWSPEL_TOOLTIP_TEXT = "Nieuw spel starten";
    public String MI_SPEEL_OF_PAUZE_TITLE_PAUSE = "Pauzeer";
    public String MI_SPEEL_OF_PAUZE_TOOLTIP_TEXT_PAUSE = "Pauzeer het huidig spel";
    public String MI_SPEEL_OF_PAUZE_TITLE_PLAY = "Speel";
    public String MI_SPEEL_OF_PAUZE_TOOLTIP_TEXT_PLAY = "Hervat het huidig spel";
    public String MI_STOPSPEL_TITLE = "Stop";
    public String MI_STOPSPEL_TOOLTIP_TEXT = "Stop het huidig spel";
    public String MI_GELUID_TITLE_OFF = "Geluid uit";
    public String MI_GELUID_TOOLTIP_TEXT_OFF = "Zet geluid uit";
    public String MI_GELUID_TITLE_ON = "Geluid aan";
    public String MI_GELUID_TOOLTIP_TEXT_ON = "Zet geluid aan";

    //BORD//
    public String VAK_BEGIN_VALUE = "BEGIN";
    public String VAK_LEEG_VALUE = "LEEG";
    public String VAK_MUUR_VALUE = "MUUR";
    public String VAK_LAVA_VALUE = "LAVA";
    public String VAK_DOORGANG_VALUE = "DOORGANG";
    public String VAK_EINDE_VALUE = "EINDE";

    //LINKERPANEEL//
    public String HIGHSCORE_NOT_FOUND_TEXT = "Nog geen highscore gevonden...";

    //DIALOGS//
    public String ABOUT_DIALOG_CONTENT = APP_TITLE + " is een app gemaakt door Vincent Devaux en Thibault Helsmoortel.";
    public String NIEUW_SPEL_DIALOG_TITLE = APP_TITLE + " - Nieuw spel";
    public String NIEUW_SPEL_DIALOG_CONTENT = "Weet u zeker dat u uw huidig spel wilt stoppen om een nieuw spel te beginnen?";
    public String STOP_SPEL_DIALOG_TITLE = APP_TITLE + " - Spel stoppen";
    public String STOP_DPEL_DIALOG_CONTENT = "Weet u zeker dat u uw huidig spel wilt stoppen?";
    public String SLUIT_APP_DIALOG_TITLE = APP_TITLE + " - Labyrint sluiten";
    public String SLUIT_APP_DIALOG_CONTENT = "Weet u zeker dat u het spel wilt verlaten?";
    public String SPELREGELS_DIALOG_TITLE = APP_TITLE + " - Spelregels";
    public String SPELREGELS_DIALOG_CONTENT = "Spelregels:" + "\n";
    public String SPELREGELS = "Doel van het spel: geraak met je speler zo snel mogelijk aan het einde." +
            "\n-Gebruik de doorgangen om je sneller door het labyrint te verplaatsen." +
            "\n-Zorg ervoor dat het spook je niet vangt." +
            "\n-Daag een vriend uit en verbeter zijn tijd.";
    public String BTN_JA_TITLE = "Ja";
    public String BTN_ANNULEREN_TITLE = "Annuleren";
    public String BTN_OK_TITLE = "Ok";
    public String VRAAG_SPELERNAAM_TITLE = APP_TITLE + " - Naam invoeren";
    public String VRAAG_SPELERNAAM_TIJD = "Je eindigde in ";
    public String VRAAG_SPELERNAAM_NAAM = "\nVul je naam in:";
    public String FOUTMELDING_LEZEN_SCORES = "Er is een fout opgetreden bij het lezen van de scores. ";
    public String FOUTMELDING_SCHRIJVEN_SCORES = "Er is een fout opgetreden bij het schrijven van de scores. ";
    public String GAME_OVER_DIALOG = "Game over!";
    public String SCORES_VERWIJDEREN_DIALOG_TITLE = APP_TITLE + " - Scores verwijderen";
    public String SCORES_VERWIJDEREN_DIALOG_CONTENT = "Weet je zeker dat je alle scores wilt verwijderen?\nAlle scores zullen verwijdert worden!";

    //PROPERTIES//
    public String INITIAL_USER_NAME = System.getProperty("user.name");
    public String FILE_SEPARATOR = System.getProperty("file.separator");
    public String LINE_SEPARATOR = System.getProperty("line.separator");
    public String KEYBOARD_FORMAT = System.getProperty("user.country.format");
    public String CUSTOM_PROPS_HEADLINE = "Customsettings";
    public String PROP_MOEILIJKHEIDSGRAAD = "moeilijkheidsgraad";
    public String PROP_GELUID = "geluid";
    public String SCORES_MAKKELIJK_HEADLINE = "Scores Makkelijk";
    public String SCORES_NORMAAL_HEADLINE = "Scores Normaal";
    public String SCORES_MOEILIJK_HEADLINE = "Scores Moeilijk";

    //ANDERE//
    public String FILE_DEFAULT_SETTINGS_PATH = "src" + FILE_SEPARATOR + "bestanden" + FILE_SEPARATOR + "settings" + FILE_SEPARATOR + "default.ini";
    public String FILE_CUSTOM_SETTINGS_PATH = "src" + FILE_SEPARATOR + "bestanden" + FILE_SEPARATOR + "settings" + FILE_SEPARATOR + "custom.ini";
}

【问题讨论】:

  • 使用资源包。您正在使用 contant 接口反模式。这些字段是公共静态最终字符串,即常量。它们不能被覆盖。至于Java中几乎所有的东西,都有一个关于国际化的教程:docs.oracle.com/javase/tutorial/i18n
  • 嗯,如果你使用 ResourceBundle,如果我做对了,你也需要一个语言环境。荷兰语没有标准的语言环境是个问题吗?
  • 不,不是。只需使用new Locale("nl")

标签: java interface localization


【解决方案1】:

为每种语言使用 ResourceBundle 和 *.properties 文件。

【讨论】:

  • 我必须对此进行大量研究,但是是的,ResourceBundle 正是我所需要的!
【解决方案2】:

请查看下面的帖子,这可能对您有用。

Convert String to another locale in java

但更好的使用 i18n 的方法是使用带有 ResourseBoundle 类的属性文件。

谢谢 萨提亚

【讨论】:

  • 这似乎是非常硬编码的,我正在寻找一个平滑的解决方案。还是谢谢!
猜你喜欢
  • 2015-05-09
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 2013-08-08
  • 2013-08-28
  • 1970-01-01
  • 2012-10-06
  • 2016-09-03
相关资源
最近更新 更多