プログラムに国際化を追加する必要があります。ありがたいことに、まだ全体ではなく、ほんの一部ですが、プログラム全体をカバーできるようにスケールアップする方法が必要です. 問題は、私たちのプログラムはプラグインに基づいているため、すべての文字列が同じ場所にあるわけではないということです。
私が理解している限りでは、Java のResourceBundle
動作はこのようなものです。ResourceBundle
などと呼ばれるを拡張するクラスと、などMyProgramStrings
と呼ばれる言語固有のクラスを作成します。これらの各クラスは、キー (文字列) を値 (任意のオブジェクト) にマップします。データをどこから取得するかはこれらのクラスごとに異なりますが、共通の場所はプロパティ ファイルです。MyProgramStrings_fr
MyProgramStrings_es
値を 2 段階で検索します。最初に正しいバンドルを取得し、次に必要な文字列を照会します。
Locale locale = Locale.getDefault(); // or = new Locale("en", "GB");
ResourceBundle rb = ResourceBundle.getBundle("MyProgramStrings", locale);
String wotsitName = rb.getString("wotsit.name");
ただし、必要なのは、複数のロケールの結果を 1 つのリソース空間に結合することです。たとえば、プラグインは、既に定義されている文字列をオーバーライドし、コードが文字列を検索するたびにその新しい値を返すことができる必要があります。
私はこれらすべてに少し迷っています。誰でも助けることができますか?
更新: David Waters 氏は次のように尋ねました。
回答を最後に記載しましたが、この問題をどのように解決したかをお聞きしたいと思います。
まあ、まだそれほど進んでいません - 長期的なWIBNIは常に最新の危機の犠牲者になります - しかし、プラグインが実装するインターフェースに基づいており、リソースはインターフェースと同じ完全修飾名を持つという慣習があります.
そのため、インターフェイスUsersAPI
にはさまざまな実装が含まれる場合があります。そのインターフェイスのメソッドgetBundle()
は、デフォルトで と同等のものを返します ResourceBundle.get("...UsersAPI", locale)
。そのファイルを置き換えるか、より複雑なものが必要な場合は、UsersAPI の実装でメソッドをオーバーライドできます。
これまでのところ、これで必要なことは完了していますが、プラグインに基づくより柔軟なソリューションを引き続き検討しています。