`
f0rb
  • 浏览: 119242 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类

Java使用enum处理国际化问题

阅读更多
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页面上对国际化消息的处理比任何标签都来的简洁, 而且不会因为字符串的拼写错误而无法找到国际化资源里的键.
0
0
分享到:
评论

相关推荐

    国际象棋 java 实现 可视化界面

    在本项目中,我们关注的是一个使用Java编程语言实现的国际象棋游戏,它具有一个可视化界面。这个项目的核心目标是创建一个用户友好的棋盘界面,允许玩家进行互动并执行标准的国际象棋规则。以下是一些关键知识点: ...

    java 国际象棋棋盘

    在Java编程语言中,创建一个国际象棋棋盘是一项有趣且具有挑战性的任务,它可以作为初学者提升技能的练习项目。下面将详细讲解如何实现这个项目,并涉及相关的Java知识点。 首先,我们需要理解国际象棋棋盘的基本...

    74个java面试题,只有题目没有答案

    使用 ResourceBundle 等类进行国际化处理。 31. Java 线程状态 * Java 中有哪些线程状态?新建状态、就绪状态、运行状态、阻塞状态、死亡状态等。 32. Java 序列化和反序列化 * 如何在 Java 中进行序列化和反...

    Java API文档中文版.zip

    7. 国际化(I18N)与本地化(L10N):Java通过`java.text`和`java.util.Locale`类支持国际化和本地化,使得应用程序能够适应不同地区的语言和习惯。 8. 日志和诊断:`java.util.logging`包提供了日志系统,可以帮助...

    java api 1.6中文

    12. **国际化**: `java.text`和`java.util`包提供了处理日期、时间、数字格式化和本地化的能力,方便程序适应不同地区的文化习惯。 Java API 1.6中文版的详细文档对于学习和开发Java应用程序至关重要,无论是初学者...

    java-api的html版

    10. **国际化和本地化**:`java.text`和`java.util.Locale`类帮助开发者实现应用程序的国际化和本地化。 总之,Java API的HTML版是学习和使用Java编程不可或缺的一部分。通过深入阅读和理解API文档,开发者可以更好...

    java 1.6 API 中文版

    Java 1.6支持国际化的字符串和日期格式化,通过Locale类和ResourceBundle类可以方便地实现本地化资源的加载。 九、XML处理 DOM、SAX和JAXB等API用于解析和生成XML文档,JAXP提供了XPath和XSLT支持,便于XML数据的...

    java开发常用API

    以上只是Java API中的一部分关键知识点,实际开发中还会涉及到更多如XML处理、数据库连接(JDBC)、国际化(java.text包)以及并发工具类等内容。Java API的广泛性和深度使得开发者能够应对各种复杂的编程需求。

    JAVA-API.rar_Java API文档·_Java api文档_java api

    14. **国际化与本地化**:`java.text`和`java.util.Locale`类提供了处理文本格式和用户地区设置的机制。 15. **XML处理**:`javax.xml`和`org.w3c.dom`等包提供了解析、生成XML文档的工具。 这个中文版的Java API...

    JavaAPI(官方英文版)

    12. **国际化(Internationalization)**:`java.text`和`java.util`包提供了处理不同地区和语言的工具,如日期、时间、数字格式。 13. **并发编程(Concurrency)**:`java.util.concurrent`包提供了高效率的并发...

    JAVA SE6.0 API文档

    7. **改进的国际化**:Java 6提供了更好的日期和时间格式化,以及对Unicode扩展的支持,使得开发全球化的应用程序更加方便。 8. **并发编程工具**:Java 6引入了`java.util.concurrent`包,包含了线程池、Future、...

    JAVA6.0帮助文档

    6. **国际化**:`java.text`和`java.util`包中的类支持国际化和本地化,如`ResourceBundle`用于管理不同语言的资源文件,`DateFormat`和`NumberFormat`处理日期和数字的格式化。 三、JVM优化 Java 6.0的JVM进行了多...

    优雅地在Java应用中实现全局枚举处理的方法

    我们在查数据的时候,又能将数据库的数字转换成java枚举类,在处理完对应的业务逻辑之后,将枚举和枚举类对应的展示信息一起传递到前台,前台不需要维护这个枚举类和展示信息的对应关系,同时展示信息支持国际化处理...

    十二生肖和星座Java工具类.rar

    6. **国际化(I18N)**:如果工具类需要面向不同的用户,可以考虑使用资源包(Properties文件)来支持多语言显示生肖和星座的名称。 7. **单元测试**:为了确保工具类的正确性,编写单元测试是必要的。使用JUnit或...

    Java2 类库--技术手册

    10. **国际化与本地化**:`java.text`和`java.util.Locale`提供了支持多种语言和文化的工具,如日期和时间格式化,数字和货币格式化等。 此外,Java 2 类库还包含了一些高级特性,如垃圾回收(Garbage Collection)...

    java的中文帮助文档

    14. **国际化(Internationalization)**:`java.text`和`java.util`包提供了支持多语言的类和接口,如DateFormat、NumberFormat和ResourceBundle,方便程序适应不同地区的文化习惯。 15. **Swing和AWT**:Java的...

    高手总结java常用API.

    以上只是Java API中的一部分常用功能,实际的API还包括许多其他模块,如数据库访问(JDBC)、GUI编程(Swing或JavaFX)、国际化(java.text)等。熟练掌握这些API是成为一名优秀的Java程序员的关键。

    java.util包总结

    8. TimeZone和Locale类:处理时区和地域设置,用于国际化和本地化。 9. EventObject和EventListener接口:与事件处理相关,是观察者模式的一部分,通常在图形用户界面编程中使用。 10. ResourceBundle类:用于加载...

    java中文API

    Java中文API是Java开发者的重要参考资料,...以上只是Java API中的一部分关键知识点,实际上Java API非常庞大且功能丰富,涵盖了数据库访问、XML处理、国际化、安全管理等多个方面,是Java开发者日常开发中的重要参考。

    java1.7帮助文档

    中文版的帮助文档不仅包含了这些核心特性的介绍,还详细列出了所有Java 7 API的类库、接口和方法,包括常用的集合框架、I/O流、网络编程、多线程、反射、国际化等模块。开发者可以通过查阅这个文档,快速查找并了解...

Global site tag (gtag.js) - Google Analytics