设计一个可以移植到多种语言的GUI

时间:2017-09-19 17:49:47

标签: java swing user-interface gui-design

我目前正在为一个项目开发一个java swing GUI。用户界面需要使用多种语言(英语德语法语等),我不知道。有人建议我使用配置文件来存储所有文本,以便翻译人员可以在项目完成后进行翻译而无需重新编译。这有一个额外的好处,即能够在完成后更改文本和添加语言,我还可以在这里为UI添加一些配置,以便它更具可配置性。经过一些反思后,我意识到这将非常慢,因为每次GUI更改时我都需要执行文件IO。我怎样才能设计一个GUI,以便我可以让一个外行人在没有我的情况下翻译它,但不会减慢程序的速度?

2 个答案:

答案 0 :(得分:0)

通常在java中,与任何语言一样,您可以将文本提供为在启动时读取的简单属性文件,或者作为指向属性文件包的资源包。它们被加载到内存中,这使得它们非常快。

我建议您在谷歌搜索您目前使用的UI框架以及如何处理国际化,因为这是一个常见问题,应该解决。

答案 1 :(得分:0)

有很多方法可以做到这一点,但如果您想自己编写,可以采用一种方法。

ISO 639 language codes之后,您通常会有一个如下所示的资源目录:

resources/
    languages/
        en/
            strings.conf
        de/
            strings.conf

然后,当您的应用程序首次加载时,您将get the users default language,然后相应地加载语言文件;该文件应仅从磁盘加载一次,然后保存在内存中。您可以使用类似下面的内容,通过保留LanguageLoader的实例,您可以调用.getStringById()并按名称加载密钥。

public class LanguageLoader() {

    final HashMap<String, String> localizedStrings;

    public LanguageLoader(String language) {

        localizedStrings = new HashMap<String, String>();

        File f = new File( "languages/" + language + "/strings.conf" );

        // TODO read file line by line and add key / value pairs to hash map
    }

    public String getStringById( String stringId ) {

        return localizedString.get(stringId);
    }
}

并在您的申请中

String languagePack = Locale.getDefault();

LanguageLoader localization = new LanguageLoader(languagePack);

String inAnyLanguage = localization.getStringById("welcome_001");

您的语言文件由

组成
en/strings.conf
    welcome_001=Hello World!

de/strings.conf
    welcome_001=Hallo Welt!