`
f0rb
  • 浏览: 118600 次
  • 性别: 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开发详解.zip

    031103_【第11章:Java常用类库】_国际化程序笔记.pdf 031104_【第11章:Java常用类库】_System类笔记.pdf 031105_【第11章:Java常用类库】_日期操作类(Date、Calendar)笔记.pdf 031106_【第11章:Java常用类库】...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    12.2 国际化基础、日期 387 12.2.1 关于i18n 387 12.2.2 使用date与dateformat 390 12.2.3 使用calendar 393 12.3 规则表示式 395 12.3.1 定义规则表示式 396 12.3.2 pattern与matcher 403 12.4 nio2...

    nv-i18n:支持国际化的软件包,其中包含ISO 3166-1国家_地区代码枚举,ISO 639-1语言代码枚举等

    支持国际化的软件包,其中包含ISO 3166-1国家/地区代码枚举,ISO 639-1语言代码枚举,ISO 15924脚本代码枚举等。 班级 描述 CountryCode ISO 3166-1国家/地区代码。 LanguageCode ISO 639-1语言代码。 ...

    mysql官方中文参考手册

    5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. ...

    MYSQL中文手册

    5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 ...

    MySQL 5.1参考手册中文版

    5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 ...

    MySQL 5.1参考手册

    5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. ...

    MySQL5.1参考手册官方简体中文版

    5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. ...

    MySQL 5.1中文手冊

    5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. ...

    MySQL 5.1参考手册 (中文版)

    5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. ...

    Effective C++ 中文版

    条款04:确定对象被使用前已先被初始化 2.构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 条款06:若不想使用编译器自动成生的函数,就该明确拒绝 条款07:为多态基类声明Virtual析构函数 条款08:...

    MySQL 5.1官方简体中文参考手册

    5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/(第 5/24 页)2006-11-02 19:12:13 MySQL 5.1 Reference Manual 5.10.2. 设置错误消息语言 ...

    mysql5.1中文手册

    MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集...

Global site tag (gtag.js) - Google Analytics