使用ResourceBundle(locale.properties)的Java本地化文本Web服务

使用ResourceBundle(locale.properties)的Java本地化文本Web服务,java,web-services,localization,resourcebundle,Java,Web Services,Localization,Resourcebundle,由于某些原因,有一项功能已从web应用程序转移到web服务。在web应用程序端,我们使用FMT标记来检索本地化文本,它过去工作得很好。现在我需要在Web服务应用程序上实现同样的功能。为了实现这一点,我考虑使用ResourceBundle类,但是由于web服务是无状态的,所以我不想调用 ResourceBundle.getBundle(文件名) 因为每次调用web服务调用时,它都可能调用IO操作。相反,由于我的区域设置键不是很大,我想到了在一个单例映射中加载所有ResourceBundle,然后传

由于某些原因,有一项功能已从web应用程序转移到web服务。在web应用程序端,我们使用FMT标记来检索本地化文本,它过去工作得很好。现在我需要在Web服务应用程序上实现同样的功能。为了实现这一点,我考虑使用ResourceBundle类,但是由于web服务是无状态的,所以我不想调用
ResourceBundle.getBundle(文件名)

因为每次调用web服务调用时,它都可能调用IO操作。相反,由于我的区域设置键不是很大,我想到了在一个单例映射中加载所有ResourceBundle,然后传递键并获得bundle之类的方法

这方面有一些问题: a、 )这种方法行吗? b、 )如何在我的单例映射中使用resourcebundle加载所有区域设置,即是否有一种方法可以加载区域设置文件夹中提到的所有区域设置文件,而无需明确提及每个文件的名称

提前感谢您的帮助

Rgards


Vaibhav

第一件事:我永远不会让我的web服务具有“语言环境感知”。向用户显示本地化消息这是呼叫方的工作。web服务是一个后端组件,与语言无关,与屏幕分辨率无关。但无论如何

…如果我不能就我的web服务是否“i18n感知”进行讨价还价,我会将每个捆绑包文件加载到一个对象中,然后将所有这些对象放在一个映射中,并使其在应用程序的上下文中可用


希望这有帮助

正如Daniel所指出的,创建与语言环境无关的web服务是非常有意义的。最好的方法是只返回标识符(例如资源密钥名),并在客户端将其解析为适当的消息

但是,如果您使用JavaScript访问代码,则无法真正使用上述方法,您需要实际翻译。
在这种情况下,您需要构建一些实际资源文件的访问层。可以根据需要使用和加载资源文件

为了明确我的意思,我认为你需要以下几点:

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缓存=
新WeakHashMap();
公共字符串getString(字符串键、区域设置){
ResourceBundle resources=cache.get(区域设置);
if(资源==null){
resources=ResourceBundle.getBundle(基本名称、区域设置);
cache.put(区域设置、资源);
}
试一试{
返回resources.getString(key);
}捕获(丢失资源异常mre){
logger.error(“转换为“+键
+区域设置“+locale.toLanguageTag())中缺少“;
//直观地指出错误
返回“!”+键+“!”;
}
}
}
这里有几点需要说明。WeakHashMap将在需要时保留文件,因此不会对内存占用造成太大影响。在本例中,您将看到的实际上是类的实例。您可能想签出它,但实际的实现一次读取所有属性文件,并在HashMap中对其进行备份。因此,您将仅在第一次访问给定语言资源时执行I/O操作。
这是内存消耗和磁盘使用之间的某种折衷,因此您可能希望预加载常用语言的内容


最后,但并非最不重要。我并不是真的推荐这个解决方案,但实际上您可以将资源放入数据库(这会影响本地化)并按需阅读。

确实很有意义,Web服务级别的本地化确实是一个很大的问题,但这是特定应用程序的自定义情况,因此我只能做较少的选择。同样地,请告知您的回复,