0

私は多くのモジュールを備えた国際化されたプロジェクトを持っています。各モジュールには、独自のバンドルセットがあります。

- database-module
    + com_naugler_project_database.properties
    + com_naugler_project_database_fr.properties
- mapping-module
    + com_naugler_project_mapping.properties
    + com_naugler_project_mapping_fr.properties

ただし、国際化された用語の多くは冗長であり(「OK」や「キャンセル」など)、保守と開発を容易にするために、これらの用語を1か所にまとめたいと思います。

ResourceBundleの継承についてこの役立つ説明を見つけましたが、次の理由により、(そうではない?)共通の祖先が適切に国際化されていないように見えます。

- common-module
    + com_naugler_project.properties
    + com_naugler_project_fr.properties          <-- this is not an ancestor
- database-module
    + com_naugler_project_database.properties
    + com_naugler_project_database_fr.properties <-- of this

バンドル組織とのベースから離れていますか?共通の国際化された祖先を提供する正しい方法は何ですか?

4

2 に答える 2

3

必要なのはリソースの階層であるように思われます。つまり、1つのクラスをオーバーから派生させたい(または特定の部分と共通の部分で構成されている)可能性があります。

基本的に、ResourceBundleはそのために設計されたものではなく、あなたはあなた自身です。

しかし、あなたはいくつかのアドバイスが必要だと思います。

  • 一般的な用語が本当に一般的であることを確認してください。つまり、「OK」、「キャンセル」、「次へ>」、「<前へ」、「開く」、「ファイル」などのコンテキストでは、一般的な翻訳が使用されます。つまり、このような標準アイテムを1回だけ翻訳するのはかなり安全ですが、別のコンテキストでそれらを使用する場合は、別のエントリが必要です。なんで?「開く」ボタンの翻訳は、かなりの数の言語での「開く」ダイアログのタイトルの翻訳とは異なるためです。

  • すべての.propertiesファイルを1つの場所(たとえば、「resources」というディレクトリ)に移動します。もちろん、モジュール固有のファイルは異なるサブディレクトリに分離する必要があります...

    • ResourceBundleクラスのインスタンスを返すリソースファクトリを作成します(または独自のファサード-このアプローチでは、実際にいくつかの共通バンドルを共有できます)。
  • 大規模なアプリケーションの良い習慣は、言語パックを作成することです。つまり、言語リソースを独自のディレクトリ(つまり、/ resources / en、/ resources / fr、/ resources / zh-Hans)に分離します。ただし、このアプローチの問題は、リソースフォールバックを自分で実装する必要があるという事実です(質問で言及した記事の助けを借りて、階層は実際にはリソース読み込み階層です)。つまり、言語タグ「nb」から「no」にフォールバックするが、「nn」からフォールバックしないなどの特殊なケースがあります。「zh-CN」と「zh-SG」から「zh-Hans」にフォールバックし、次に「zh」にフォールバックしますが、「zh-HK」と「zh-TW」と「zh-MO」から「zh」にフォールバックします。 -「ハント」してからデフォルトの言語に変更します。「pt-BR」に該当しません。

大変な作業のようですか?ええと、でもその後のメンテナンス作業は最小限になります。

PropertyResourceBundleには、必要なプロパティファイルをロードできる2つのコンストラクター、つまりPropertyResourceBundle(InputStream stream)PropertyResourceBundle(Reader reader)があります。正直なところ、大規模なプロジェクトでは、標準のResourceBundleメカニズムには制限が多すぎるため、独自のリソースアクセスレイヤーが本当に必要です...

于 2012-07-11T14:36:35.173 に答える
1

PawełDydaが示したように、リソースバンドル自体はクラス階層の解決をサポートしていません。ただし、私の会社がリリースしたばかりのRinclプロジェクトは、探していることを実行し、UTF-8.propertiesファイルとXMLプロパティファイルも処理する必要があります。その場でメッセージのフォーマットも行います。

Rinclクイックスタートで説明されているように、単純に実装してから;Rincledを呼び出すことができます。getResources()Rinclは、親クラスまたはインターフェイスで宣言されている場合でも、リソースバンドルをロードします。

public class MyClass extends BaseClass implements Rincled {
  …

    final String userName = "Jane Doe";
    //Retrieve the formatted user label based upon the current locale.
    //en-US: "Settings for user Jane Doe."
    //pt-BR: "Definições para usuário Jane Doe."
    final String userLabel = getResources().getString("user-label", userName);
  …

Rinclはhttp://rincl.io/で入手でき、 Javaの国際化に関するイントロと完全なレッスンもあります。多くの新機能が登場しますが、最新バージョンはすでに機能しているはずです。ご不明な点や問題がございましたら、お気軽にお問い合わせください。

于 2016-07-14T18:25:15.803 に答える