2017-09-19 10 views
-1

私は現在、プロジェクト用のJava Swing GUIを作成中です。ユーザーインターフェイスは私が知らない複数の言語(英語ドイツ語フランス語など)である必要があります。すべてのテキストを保存するためにconfigファイルを使用して、翻訳者がプロジェクトを再コンパイルせずに翻訳できるようにすることが提案されました。これには、テキストの変更や完成後の言語の追加が可能になるという追加の利点があります。また、ここにUIの設定をいくつか入れて、設定を変更することもできます。しかし、いくつかの反射の後、私はGUIが変更されるたびにファイルIOを行う必要があるので、これは非常に遅いことに気付きました。どのようにしてGUIを設計すれば、私はまだ素人が私なしで翻訳することができますが、プログラムを遅くすることはできません。複数の言語に移植されるGUIの設計

+0

翻訳(という名前のリソースバンドル)で構成されて

String languagePack = Locale.getDefault(); LanguageLoader localization = new LanguageLoader(languagePack); String inAnyLanguage = localization.getStringById("welcome_001"); 

は通常のコードで、jarファイルにバンドルされています。しかし、それが外にあっても、起動時にファイルから翻訳を読むのがなぜ遅いのでしょうか? 「GUIを変更するたびにファイルI/Oを実行する必要がある」とはどういう意味ですか?数百行のファイルを読むのは非常に高速で、ユーザーは気づかないでしょう。 –

+0

[ResourceBundleクラス](https://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html)は、まさにこの目的のために設計されています。ファイルからクラスを読み込むJavaランタイムよりも遅くはありません。実際、ResourceBundleのエントリファイルは、ほとんどの場合、それらを読み込むクラスにバンドルされています。 – VGR

答えて

0

これを行うにはさまざまな方法がありますが、あなた自身で書きたい場合はここに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); 
    } 
} 

そして、あなたのアプリケーションで使用する言語ファイルが

en/strings.conf 
    welcome_001=Hello World! 

de/strings.conf 
    welcome_001=Hallo Welt! 
0

通常、Javaの場合、どの言語でもそうですが、起動時に読み込む単純なプロパティファイルまたはプロパティファイルのバンドルを示すリソースバンドルとしてテキストを提供します。これらはメモリにロードされ、非常に高速になります。

これは一般的な問題であり解決する必要があるため、現在使用しているUIフレームワークと国際化を処理する方法についてGoogle検索を行うことをお勧めします。

関連する問題