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 操作にヒットします。
これは、メモリ消費量とディスク使用量の間のある種の妥協であるため、一般的に使用される言語のものを事前にロードすることをお勧めします...
最後だが大事なことは。私はこのソリューションをあまりお勧めしませんでしたが、実際にリソースをデータベースに入れ (ローカライズ可能性が損なわれます)、必要に応じて読み取ることができます。