首页 > 解决方案 > 如何加载正确的语言(在配置中设置)而不是数组中最后的语言

问题描述

我正在创建一个小的 java 应用程序,我正在尝试基于 config.yml 语言集(en/it)加载 yml 文件,但我找不到加载它们的方法,只有数组中的最后一个是加载对我来说是“它”。

我知道我的方法可能是语言文件最糟糕的解决方案,我愿意接受所有可以帮助我解决问题的方法。但我更喜欢外部 lang_en/it 文件而不是内部文件(或者内部文件更好?)

设置语言后,该应用程序将自动更新每节课中的每个文本。

static final Properties props = new Properties();
static WelcomeMessage main = new WelcomeMessage();
static File file = null;
static File folder = null;
static boolean os = main.os.startsWith("Windows");

public static void create() {
    String[] lang = {"en", "it"};
    for (String s : lang) {
        file = new File(WelcomeMessage.user + "/AppData/Roaming/MyApp/lang_" + s + ".yml");
        folder = new File(file.getParent());
        SetLanguages(s);
    }
    if (!file.exists()) {
        try {
            if (os) {
                folder.mkdir();
                file.createNewFile();
            } else {
                file = new File(main.user + "/Library/Application Support/MyApp/config.yml");
                folder.mkdir();
                file.createNewFile();
            }
        } catch (Exception e) {
            System.out.println(e + " " + file);
        }
    }
}

public static void SetLanguages(String lang) {
    if (lang.equals("en")) {
        store("Settings.Save", "Save");
        store("Settings.ConfigPath", "Config Path");
        store("Settings.Language", "Language");
        store("Settings.Title", "Settings");
    } else if (lang.equals("it")) {
        store("Settings.Save", "Salva");
        store("Settings.ConfigPath", "Percorso config");
        store("Settings.Language", "Lingua");
        store("Settings.Title", "Impostazioni");
    }
}

public static String get(String value) {
    String key = null;
    try {
        FileInputStream in = new FileInputStream(file);
        props.load(in);
        key = props.getProperty(value);
        in.close();
    } catch (Exception fnf) {
        System.out.println(fnf);
    }
    return key;
}

public static void store(String value, String key) {
    try {
        FileOutputStream out = new FileOutputStream(file);
        props.setProperty(value, key);
        props.store(out, null);
        out.close();
    } catch (Exception fnf) {
        System.out.println(fnf);
    }
}

这就是我从 yml 获取文本的方式:

path.setText(Language.get("Settings.ConfigPath"));    
language.setText(Language.get("Settings.Language"));    
f.setTitle(Language.get("Settings.Title"));    
save.setText(Language.get("Settings.Save"));

这是我的 Language.get(key)

public static String get(String value) {
    String key = null;
    try {
        FileInputStream in = new FileInputStream(file);
        props.load(in);
        key = props.getProperty(value);
        in.close();
    } catch (Exception fnf) {
        System.out.println(fnf);
    }
    return key;
}

标签: java

解决方案


我建议进行以下更改:

  1. 创建一个类来Settings保存属性saveconfigPath和。如果这个类使用不可变的构建器模式会更好,因为一旦设置,属性将永远不会改变。languagetitle
  2. 使用方法创建一个SettingsFactorygetSettings(language)。这个类也应该有一个字段Map<String, Settings>。在构造函数(或静态块)中,首先检查磁盘上是否存在文件,如果存在,则将其加载到映射中。如果没有,则填充地图,每种语言都有一个条目,并保存到磁盘。
  3. getSettings将简单地从映射中返回与给定语言相对应的值。

写入磁盘的文件格式是另一回事。您说 YAML,但我在您的代码段中没有看到任何 YAML 特定代码。如果您不知道如何将映射写入 YAML,请打开另一个问题。


推荐阅读