Message.java
public enum Message {
USER_USERNAME_EXISTENT,
WHATEVER_YOU_WANT("whatever.You.WANT"),
NOT_DEFINED;
private final static ThreadLocal<ResourceBundle> lang = new ThreadLocal<ResourceBundle>();
private final static String BASENAME = "lang";
public final String key;
Message() {
key = name().toLowerCase().replace('_', '.');
}
Message(String key) {
this.key = key;
}
public String value() {
return text(key);
}
public String value(Object[] o) {
return text(key, o);
}
@Override
public String toString() {
return value();
}
private static String text(String key) {
return text(key, "");
}
private static String text(String key, Object[] o) {
return new MessageFormat(text(key)).format(o);
}
private static String text(String key, String defaultValue) {
return key == null || lang.get() == null || !lang.get().containsKey(key) ? defaultValue : lang.get().getString(key);
}
/*private static String text(String key, String defaultValue, Object[] o) {
return new MessageFormat(text(key, defaultValue)).format(o);
}*/
public static void setLocale(String s) {
try {
String[] arr = s.split("_");
Locale locale = null;
switch (arr.length) {
case 1:
locale = new Locale(arr[0]);
break;
case 2:
locale = new Locale(arr[0], arr[1]);
break;
case 3:
locale = new Locale(arr[0], arr[1], arr[2]);
break;
}
setLocale(locale);
} catch (Exception e) {
e.printStackTrace();
setLocale(Locale.CHINA);
}
}
public static void setLocale(Locale locale) {
lang.set(ResourceBundle.getBundle(BASENAME, locale));
}
public static void main(String[] args) {
testLocale(Locale.CHINA);
testLocale(Locale.CANADA);
testLocale(Locale.US);
}
private static void testLocale(Locale locale) {
setLocale(locale);
System.err.println("国际化资源完整性检查:" + BASENAME + "_" + locale + ".properties");
for (Message message : Message.values()) {
if (message.value().equals("")) {
System.err.println(message.key);
} /*else {
System.out.println(message.key + "=" + message.value());
}*/
}
}
}
在国际化资源文件lang_zh_CN.properties中定义如下:
user.username.existent=账号已存在
whatever.You.WANT=非默认格式的键
Message类中的变量说明:
String key 对应资源文件中的键, 默认将枚举名的大写转小写, 下划线转点号
ThreadLocal<ResourceBundle> lang 在多线程环境中为本地线程保存一个对国际化资源的引用
String BASENAME 资源名
方法说明
toString,value,text都是根据key去找对应的国际化消息, 如果是格式化的字符串, 还可以带参数
setLocale 线程创建时设置国际化资源
testLocale 这个方法是个亮点, 使用它可以迅速地查出国际化资源里那些国际化消息还没有实现
调用示例:
Jsp
<%@ page import="com.xxx.xxx.Message" %>
<%=Message.USER_USERNAME_EXISTENT%>
Java
String text = Message.USER_USERNAME_EXISTENT.value();
可以看出, 在Jsp页面上对国际化消息的处理比任何标签都来的简洁, 而且不会因为字符串的拼写错误而无法找到国际化资源里的键.
分享到:
相关推荐
在本项目中,我们关注的是一个使用Java编程语言实现的国际象棋游戏,它具有一个可视化界面。这个项目的核心目标是创建一个用户友好的棋盘界面,允许玩家进行互动并执行标准的国际象棋规则。以下是一些关键知识点: ...
在Java编程语言中,创建一个国际象棋棋盘是一项有趣且具有挑战性的任务,它可以作为初学者提升技能的练习项目。下面将详细讲解如何实现这个项目,并涉及相关的Java知识点。 首先,我们需要理解国际象棋棋盘的基本...
使用 ResourceBundle 等类进行国际化处理。 31. Java 线程状态 * Java 中有哪些线程状态?新建状态、就绪状态、运行状态、阻塞状态、死亡状态等。 32. Java 序列化和反序列化 * 如何在 Java 中进行序列化和反...
7. 国际化(I18N)与本地化(L10N):Java通过`java.text`和`java.util.Locale`类支持国际化和本地化,使得应用程序能够适应不同地区的语言和习惯。 8. 日志和诊断:`java.util.logging`包提供了日志系统,可以帮助...
12. **国际化**: `java.text`和`java.util`包提供了处理日期、时间、数字格式化和本地化的能力,方便程序适应不同地区的文化习惯。 Java API 1.6中文版的详细文档对于学习和开发Java应用程序至关重要,无论是初学者...
10. **国际化和本地化**:`java.text`和`java.util.Locale`类帮助开发者实现应用程序的国际化和本地化。 总之,Java API的HTML版是学习和使用Java编程不可或缺的一部分。通过深入阅读和理解API文档,开发者可以更好...
Java 1.6支持国际化的字符串和日期格式化,通过Locale类和ResourceBundle类可以方便地实现本地化资源的加载。 九、XML处理 DOM、SAX和JAXB等API用于解析和生成XML文档,JAXP提供了XPath和XSLT支持,便于XML数据的...
以上只是Java API中的一部分关键知识点,实际开发中还会涉及到更多如XML处理、数据库连接(JDBC)、国际化(java.text包)以及并发工具类等内容。Java API的广泛性和深度使得开发者能够应对各种复杂的编程需求。
14. **国际化与本地化**:`java.text`和`java.util.Locale`类提供了处理文本格式和用户地区设置的机制。 15. **XML处理**:`javax.xml`和`org.w3c.dom`等包提供了解析、生成XML文档的工具。 这个中文版的Java API...
12. **国际化(Internationalization)**:`java.text`和`java.util`包提供了处理不同地区和语言的工具,如日期、时间、数字格式。 13. **并发编程(Concurrency)**:`java.util.concurrent`包提供了高效率的并发...
7. **改进的国际化**:Java 6提供了更好的日期和时间格式化,以及对Unicode扩展的支持,使得开发全球化的应用程序更加方便。 8. **并发编程工具**:Java 6引入了`java.util.concurrent`包,包含了线程池、Future、...
6. **国际化**:`java.text`和`java.util`包中的类支持国际化和本地化,如`ResourceBundle`用于管理不同语言的资源文件,`DateFormat`和`NumberFormat`处理日期和数字的格式化。 三、JVM优化 Java 6.0的JVM进行了多...
我们在查数据的时候,又能将数据库的数字转换成java枚举类,在处理完对应的业务逻辑之后,将枚举和枚举类对应的展示信息一起传递到前台,前台不需要维护这个枚举类和展示信息的对应关系,同时展示信息支持国际化处理...
6. **国际化(I18N)**:如果工具类需要面向不同的用户,可以考虑使用资源包(Properties文件)来支持多语言显示生肖和星座的名称。 7. **单元测试**:为了确保工具类的正确性,编写单元测试是必要的。使用JUnit或...
10. **国际化与本地化**:`java.text`和`java.util.Locale`提供了支持多种语言和文化的工具,如日期和时间格式化,数字和货币格式化等。 此外,Java 2 类库还包含了一些高级特性,如垃圾回收(Garbage Collection)...
14. **国际化(Internationalization)**:`java.text`和`java.util`包提供了支持多语言的类和接口,如DateFormat、NumberFormat和ResourceBundle,方便程序适应不同地区的文化习惯。 15. **Swing和AWT**:Java的...
以上只是Java API中的一部分常用功能,实际的API还包括许多其他模块,如数据库访问(JDBC)、GUI编程(Swing或JavaFX)、国际化(java.text)等。熟练掌握这些API是成为一名优秀的Java程序员的关键。
8. TimeZone和Locale类:处理时区和地域设置,用于国际化和本地化。 9. EventObject和EventListener接口:与事件处理相关,是观察者模式的一部分,通常在图形用户界面编程中使用。 10. ResourceBundle类:用于加载...
Java中文API是Java开发者的重要参考资料,...以上只是Java API中的一部分关键知识点,实际上Java API非常庞大且功能丰富,涵盖了数据库访问、XML处理、国际化、安全管理等多个方面,是Java开发者日常开发中的重要参考。
中文版的帮助文档不仅包含了这些核心特性的介绍,还详细列出了所有Java 7 API的类库、接口和方法,包括常用的集合框架、I/O流、网络编程、多线程、反射、国际化等模块。开发者可以通过查阅这个文档,快速查找并了解...