1、什么是国际化?
国际化就是可以把页面中的中文变成英文,例如页面中的登录表单:
2、理解国际化
想把页面中的文字修改,那么就不能使用硬编码,例如下面的页面都是硬编码:
上图中的中文想转换成英文,那么就需要把他们编程或编码:
3、Local类
创建Local类对象:
- new Local(" zh "," CN ");
- new Local(" en "," US ");
一个Local对象表示的就是语言和国家。
4、ResourceBundle类
ResourceBundle类用来获取配置文件中的内容。
下面是两个配置文件的内容:
- res_zh_CN.properties
- res_en_US.properties
ResourceBundle的getBundle()方法需要两个参数:
- 第一个参数:配置文件的基本名称;
- 第二个参数:Locale;
5、页面国际化
其实页面国际化也是同一个道理,只需要通过切换Locale类来切换配置文件。我们配置一个MessageUtils类,内部需要ResourceBundle的实力。
public class MessageUtils {
private static String baseName = "res";
private static Locale locale;
public static String getText(String key) {
return ResourceBundle.getBundle(baseName, locale).getString(key);
}
public static Locale getLocale() {
return locale;
}
public static void setLocale(Locale locale) {
MessageUtils.locale = locale;
}
}
我们再写一个过滤器MessageFilter,他通过参数来创建Locale对象,传递给MessageUtils,然后再页面中使用MessageUtils来获取文本信息。
public class MessageFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String l = req.getParameter("request_locale");
Locale locale = null;
if(l != null && !l.isEmpty()) {
String[] strs = l.split("_");
locale = new Locale(strs[0], strs[1]);
req.getSession().setAttribute("WW_TRANS_I18N_LOCALE", locale);
} else {
locale = (Locale)req.getSession().getAttribute("WW_TRANS_I18N_LOCALE");
}
if(locale == null) {
locale = req.getLocale();
}
MessageUtils.setLocale(locale);
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
<p><span style="color:#08080;"><</span><span style="color:#3f7f7f;">body</span><span style="color:#08080;">></span></p><p><span style="color:#000000;"> </span><span style="color:#08080;"><</span><span style="color:#3f7f7f;">p</span><span style="color:#08080;">></span><span style="color:#bf5f3f;"><%=</span><span style="color:#000000;">MessageUtils.getText(</span><span style="color:#2a0ff;">"hello"</span><span style="color:#000000;">) + </span><span style="color:#2a0ff;">":"</span><span style="color:#000000;"> +request.getParameter(</span><span style="color:#2a0ff;">"username"</span><span style="color:#000000;">) </span><span style="color:#bf5f3f;">%></span><span style="color:#000000;">:</span><span style="color:#08080;"></</span><span style="color:#3f7f7f;">p</span><span style="color:#08080;">></span></p><p><span style="color:#000000;"> </span><span style="color:#08080;"></</span><span style="color:#3f7f7f;">body</span><span style="color:#08080;">></span></p>
6、NumberFormat
NumberFormat类用于对数字进行格式化,我们只需要使用String format( double d )一个方法即可。下面是获取NumberFormat实例的方法:
- NumberFormat.getNumberFormat()
- NumberFormat.getNumberFormat(Locale l)
- NumberFormat.getCurrentcyFormat()
- NumberFormat.getCurrentcyFormat(Locale l)
- NumberFormat.getParentFormat()
- NumberFormat.getParentFormat(Locale l)
7、DateFormat
DateFormat类用来对日期进行格式化,我们只需要使用String format(Date d)一个方法即可。下面是获取DateFormat的实例:
- DateFormat.getDateFormat()
- DateFormat.getTimeFormat()
- DateFormat.getDateTimeFormat()
- DateFormat.getDateFormat(int style,Locale locale)
- DateFormat.getTimeFormat(int style,Locale locale)
- DateFormat.getDateTimeFormate(int style,Locale locale)
其中style是对日期的长、中、短,以及完整样式。
- SHORT
- MEDIUM
- LONG
- FULL
8、MessageFormat
MessageFormat可以把模式中的{N}使用参数来替换。我们把{N}称之为点位符,其中点位符中的N是从0开始的整数。
MessageFormat.format(String pattern,Object... params),其中pattern是包含0~n个点位符,而params表示对点位符的替换文本。注意:点位符是从0开始的。
String p = " {0}或{1}错误 ";
String text = MessageFormat.format(p," 用户名 "," 密码 ");
System.out.println(text);//用户名或密码错误