寻求GWT从静态字符串国际化转动态实现的教程示例
Java动态字符串国际化实现示例
当然有人这么做过,动态国际化的核心是让应用能在运行时加载/切换语言资源,不用重启服务,刚好能解决你要减少浏览器排列数的需求。下面是具体的实现方案和代码示例:
核心思路
Java默认的ResourceBundle会缓存加载的资源文件,无法动态刷新。要实现动态国际化,需要自定义ResourceBundle.Control来打破缓存,让资源可以按需重新加载,并且支持运行时切换Locale。
实现步骤及代码示例
1. 自定义ResourceBundle.Control
这个类负责控制资源文件的加载和刷新逻辑:
import java.util.ResourceBundle; import java.util.concurrent.TimeUnit; public class DynamicResourceBundleControl extends ResourceBundle.Control { // 设置资源过期时间,这里设为1秒,实际可根据需求调整 @Override public long getTimeToLive(String baseName, java.util.Locale locale) { return TimeUnit.SECONDS.toMillis(1); } // 允许资源重新加载 @Override public boolean needsReload(String baseName, java.util.Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime) { return true; } }
2. 封装动态国际化工具类
这个工具类简化动态获取国际化字符串的操作:
import java.util.Locale; import java.util.ResourceBundle; public class DynamicI18nUtils { private static final DynamicResourceBundleControl CONTROL = new DynamicResourceBundleControl(); private static final String BASE_NAME = "messages"; // 你的资源文件基名,比如messages_en.properties // 根据指定Locale获取国际化字符串 public static String getMessage(String key, Locale locale) { ResourceBundle bundle = ResourceBundle.getBundle(BASE_NAME, locale, CONTROL); return bundle.getString(key); } // 重载方法,使用默认Locale(可选) public static String getMessage(String key) { return getMessage(key, Locale.getDefault()); } }
3. 资源文件示例
假设你有以下资源文件放在classpath下:
messages_en.properties
greeting=Hello, {0}!
messages_zh.properties
greeting=你好,{0}!
4. 使用示例
在业务代码中,你可以根据浏览器请求的Locale动态获取字符串,比如在Web应用中:
import java.util.Locale; import java.text.MessageFormat; // 模拟从请求中获取浏览器的Locale(实际可从HttpServletRequest.getLocale()获取) Locale browserLocale = new Locale("zh", "CN"); // 获取格式化后的国际化字符串 String greeting = DynamicI18nUtils.getMessage("greeting", browserLocale); String formattedGreeting = MessageFormat.format(greeting, "Gabriela"); System.out.println(formattedGreeting); // 输出:你好,Gabriela!
关于减少浏览器排列数
如果你的场景是不同浏览器对应不同Locale,现在可以通过动态获取请求对应的Locale,直接加载对应语言的资源,不需要为每个浏览器预生成排列。每次请求时根据当前浏览器的Locale调用DynamicI18nUtils.getMessage()即可,这样每个浏览器只需要对应一个Locale实例,排列数自然降到1。
内容的提问来源于stack exchange,提问作者Gabriela Knapik
相关产品推荐
相关产品推荐

