1

いくつかの理由により、WebアプリケーションからWebサービスに移動された機能があります。Webアプリケーション側では、FMTタグを使用してローカライズされたテキストを取得し、以前は正常に機能していました。今、私はWebサービスアプリケーションに同じものを実装する必要があります。これを実装するために、ResourceBundleクラスを使用することを考えましたが、Webサービスはステートレスであるため、呼び出したくありません。 ResourceBundle.getBundle(filename)

Webサービス呼び出しを呼び出すたびにIO操作が呼び出される可能性があるためです。代わりに、私のロケールキーは巨大ではないので、すべてのResourceBundleをシングルトンマップにロードしてキーを渡し、バンドルのようなアプローチをとることを考えました。

これには質問があります:a。)このアプローチは問題ありませんか?b。)シングルトンマップでresourcebundleを使用してすべてのロケールをロードするにはどうすればよいですか。つまり、各ファイルの名前を明示的に指定せずに、ロケールフォルダーに指定されているすべてのロケールファイルをロードできる方法があります。

事前に助けに感謝します。

Rgards、

Vaibhav

4

2 に答える 2

2

まず最初に、Web サービスを「ロケール対応」にすることは決してありません。ローカライズされたメッセージをユーザーに表示するのは発信者の仕事です。Web サービスはバックエンド コンポーネントであり、画面の解像度を気にするのと同様に、言語を気にしません。とにかく...

...自分の Web サービスが「i18n 対応」であることについて交渉する立場にない場合は、各バンドル ファイルをjava.util.Propertiesオブジェクトにロードし、それらすべてのオブジェクトを Map に配置して、アプリケーションのコンテキスト。

お役に立てれば!

于 2012-11-07T06:16:06.023 に答える
1

Daniel が指摘したように、ロケールに依存しない Web サービスを作成することは非常に理にかなっています。最善の方法は、識別子 (リソース キー名など) のみを返し、それらをクライアント側で適切なメッセージに解決することです。

ただし、JavaScript でコードにアクセスする場合、上記の方法は実際には使用できず、実際の翻訳が必要です。
その場合、実際のリソース ファイルへのアクセス レイヤーを構築する必要があります。これは、WeakHashMapを使用して、オンデマンドでリソース ファイルをロードすることで実行できます。

私の言いたいことを明確にするために、次のようなものが必要だと思います。

public class ResourceLayer {
    private final WeakHashMap<Locale, ResourceBundle> cache =
                      new WeakHashMap<>();

    public String getString(String key, Locale locale) {
        ResourceBundle resources = cache.get(locale);

        if (resources == null) {
            resources = ResourceBundle.getBundle(BASE_NAME, locale);
            cache.put(locale, resources);
        }

        try {
            return resources.getString(key);
        } catch (MissingResourceException mre) {        
            logger.error("The translation for " + key
                    + " is missing for locale " + locale.toLanguageTag());
            // Visually indicate an error
            return "!" + key + "!";
        }
    }
}

ここで注意すべき点がいくつかあります。WeakHashMap は必要な限りファイルを保持するため、メモリ フットプリントに大きな影響を与えることはありません。この例で読み取るResourceBundleは、実際にはPropertyResourceBundleクラスのインスタンスです。調べてみたくなるかもしれませんが、実際の実装ではプロパティファイルを一気に読み込んで HashMap に戻します。したがって、特定の言語リソースへの最初のアクセスでのみ I/O 操作にヒットします。
これは、メモリ消費量とディスク使用量の間のある種の妥協であるため、一般的に使用される言語のものを事前にロードすることをお勧めします...

最後だが大事なことは。私はこのソリューションをあまりお勧めしませんでしたが、実際にリソースをデータベースに入れ (ローカライズ可能性が損なわれます)、必要に応じて読み取ることができます。

于 2012-11-07T21:38:53.393 に答える