正如 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 操作。
这是内存消耗和磁盘使用之间的某种折衷,因此您可能需要为常用语言预加载内容...
最后但并非最不重要的。我并没有真正推荐该解决方案,但您实际上可以将资源放入数据库(这会损害 Localizability)并按需读取。