• java--国际化i18n


    1. Java国际化简介

    Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, 为了解决这个问题Java给我们提供了一个工具类ResourceBundle, 帮助我们实现Java的国际化, 核心的思想就是, 对不同的语言提供一个不同的资源文件.

    2. Java国际化的步骤

    (1) 当然是编写要实现国际化的主程序.

    (2) 定义资源文件, 注意资源文件的定义要符合一定的规范, 规范如下: 如果我们将缺省的资源文件的文件名取名为message.properties, 那么相应的其他语言的资源文件名就是message_语言代码_国家代码.properties. 例如: 我们的语言汉语的语言代码是zh, 国家代码是CN, 所以简体中文的资源文件名就是: message_zh_CN.properties, 英语的语言代码是en, 美国的国家代码是US, 所以美国英语的资源文件就是: message_en_US.properties.

    (3) 根据软件的使用环境取得相应的资源文件

    (4) 在取得的资源文件中取得Key对应的值.

    3. 例子(注意这里的资源文件必须放在classpath的根路径下)

    (1) 主程序ParamFormat.java

    import org.springframework.util.StringUtils;
    
    import java.text.MessageFormat;
    import java.util.Locale;
    import java.util.ResourceBundle;
    
    /**
     * 演示Java的国际化
     *
     * @author Abu
     */
    public class I18nUtil {
        public static String getI18nMessage(String language, String key) {
            // 设置定制的语言国家代码
            Locale locale = null;
            if (StringUtils.isEmpty(language)) {
                locale = Locale.getDefault();
            } else {
                locale = new Locale(language);
            }
            // 获得资源文件
            ResourceBundle rb = ResourceBundle.getBundle("message", locale);
            // 获得相应的key值
            return rb.getString(key);
        }
    
        public static String getI18nMessage(String language, String key, Object[] params) {
            // 设置定制的语言国家代码
            Locale locale = null;
            if (StringUtils.isEmpty(language)) {
                locale = Locale.getDefault();
            } else {
                locale = new Locale(language);
            }
            // 获得资源文件
            ResourceBundle rb = ResourceBundle.getBundle("message", locale);
            // 获得相应的key值
            String value = rb.getString(key);
            // 格式化参数,返回格式后的字符串
            return MessageFormat.format(value, params);
        }
    }

    2) 缺省的资源文件message.properties(这里使用native2ascii将中文转化成了ISO-8859-1编码.)

    转码前:

    greeting = 你好,{0}.
    accountRegesitFailure = 账号注册失败!

    转码后(native2ascii -encoding gb2312 message_zh_pre.properties message_zh_CN.properties):

    greeting = u4f60u597d,{0}.
    accountRegesitFailure = u8d26u53f7u6ce8u518cu5931u8d25uff01

    (3) 美国英语的资源文件message_en_US.properties

    greeting = Welcome,{0}.
    accountRegesitFailure = Account regesit failure.

    4.总结

    其实这就是Java的i18n的本质了, 其他的一些框架例如struts, webwork等的国际化核心都是如此.

  • 相关阅读:
    Python自制小时钟,并转换为exe可执行程序详解
    Linux下搭建jmeter
    adb server is out of date. killing完美解决
    Python通过百度Ai识别图片中的文字
    robotframework在3.7下的搭建
    VIVO 手机重力传感器踩坑记录
    GPU 实现 RGB -- YUV 转换 (OpenGL)
    iOS UImage 与 RGB 裸数据的相互转换
    CVPixelBuffer的创建 数据填充 以及数据读取
    glReadPixel 读取数据错误问题
  • 原文地址:https://www.cnblogs.com/jvStarBlog/p/12509961.html
Copyright © 2020-2023  润新知