【问题标题】:Designing a GUI to be ported to multiple languages [closed]设计要移植到多种语言的 GUI [关闭]
【发布时间】:2018-02-28 14:49:23
【问题描述】:

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

【问题讨论】:

  • 翻译(命名资源包)通常与代码捆绑在 jar 文件中。但是即使在外面,为什么在启动时从文件中读取翻译会很慢? “每次更改 GUI 时我都需要执行文件 IO”是什么意思?读取几百行的文件非常快,用户不会注意到任何东西。
  • ResourceBundle class 正是为此目的而设计的。它并不比 Java 运行时从文件中读取你的类慢。事实上,ResourceBundle 入口文件几乎总是与读取它们的类捆绑在一起。

标签: java swing user-interface gui-design


【解决方案1】:

确实有很多方法可以做到这一点,但如果您想自己编写,这里有一种可能的实现方式。

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!

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2022-09-23
      相关资源
      最近更新 更多