All Downloads are FREE. Search and download functionalities are using the official Maven repository.

vip.efactory.common.i18n.enums.Entityi18nUtil Maven / Gradle / Ivy

There is a newer version: 1.3.0
Show newest version
package vip.efactory.common.i18n.enums;

import lombok.SneakyThrows;
import vip.efactory.common.i18n.util.FileUtil;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 * 本工具类是为了快速地将项目中的实体属性快速地转换为国际化的key和value
 */
public class Entityi18nUtil {
    private static List locales = new ArrayList<>();  // 支持的国际化种类,参考了Java的Locale类的种类
    private static List entities = new LinkedList<>(); // 保存要生成国际化的类信息

    /**
     * 静态初始化支持的国际化种类,参考了Java的Locale类的种类,更多参见:http://www.localeplanet.com/icu/
     */
    static {
        locales.add("zh_CN");   // 中文简体
        locales.add("zh_TW");   // 中文繁体
        locales.add("ru_RU");   // 俄语
        locales.add("ru_KZ");   // 俄语 -哈萨克斯坦
        locales.add("en_US");   // 美国英语
        locales.add("en_GB");   // 英国英语
        locales.add("en_CA");   // 加拿大英语
        locales.add("fr_FR");   // 法国法语
        locales.add("fr_CA");   // 加拿大法语
        locales.add("de_DE");   // 德语
        locales.add("it_IT");   // 意大利
        locales.add("ja_JP");   // 日语
        locales.add("ko_KR");   // 韩语
    }

    /**
     * 添加要生成国际化的实体
     */
    private static void addEntity(Class clazz) {
        entities.add(clazz);
    }

    /**
     * 批量添加
     *
     * @param clazzs
     */
    private static void addEntitys(List clazzs) {
        entities.addAll(clazzs);
    }

    // 对每一个实体实例,生成:key = value格式的条目!
    public static String installResourceEntry(Class clazz, Field field) {
        // 整的key键:类名.属性
        return clazz.getSimpleName() + "." + field.getName() + "=" + ErrorCodeUtil.toUnicodeString(field.getName());
    }

    /**
     * 利用实体生成国际化的资源文件
     *
     * @param fileName 仅仅是文件名,不包含路径与后缀
     * @param entities
     */
    @SneakyThrows
    public static String geni18nPropertiesFile(String fileName, List entities) {
        //生成的错误码文件的存放位置,直接在项目的指定位置,注意,如果手动修改过此文件,谨慎执行此main方法.
//        Map envs = System.getenv();
        String pathanme = System.getenv("PWD") + File.separator + fileName + ".properties";
        //容纳所有的条目
        List lines = new ArrayList();
        //生成的时间写入注释头中
        lines.add("# This file create at " + new Date() + " ,by Entityi18nUtil! \n");
        String lastClass = "";
        String currClass = "";      //当前正在处理的实体类
        for (Class clazz : entities) {
            currClass = clazz.getName();         //通过反射获取到当前实体的类名
            if (!lastClass.equals(currClass)) {
                if (!lastClass.isEmpty()) {
                    lines.add("\n");                        //添加一个换行
                }
                lines.add("#" + currClass + "\n");          //添加一个当前实体类的注释
                lastClass = currClass;
            }

            // 得到当前实例的所有属性
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                // 检查是否是静态属性,是则跳过,因为静态属性有问题通常都是代码的问题与用户无关!
               if (Modifier.isStatic(field.getModifiers())){
                   continue;
               }
                lines.add(installResourceEntry(clazz, field) + "\n"); //生成实体对应的键值对
            }
        }
        //将上面的实体值生成文本文件,以便拷贝到项目里面来用
        FileUtil.writeFileByLines(lines, pathanme);         //将所有的键值对写出!

        System.out.println("文件写出完毕!");
        System.out.println("请到此目录找生成的文件:" + pathanme);
        return pathanme;
    }

    /**
     * 拷贝基础的生成文件,复制成其他的文件,以便专业的人员进一步进行优化翻译
     *
     * @param pathanme 基础的文件,不带国际化参数的文件
     * @param locales  要生成的国际化文件种类
     */
    public static void copyToLocale(String pathanme, List locales) {
        // 拷贝成其他的国际化文件
        for (String locale : locales) {
            String newFileName = pathanme.substring(0, pathanme.lastIndexOf(".")) + "_" + locale + pathanme.substring(pathanme.lastIndexOf("."));
            FileUtil.copyFile(pathanme, newFileName, true);
            System.out.println("请到此目录找生成的文件:" + newFileName);
        }
    }

    /**
     * 拷贝基础的生成文件,复制成其他的文件,以便专业的人员进一步进行优化翻译,
     * 不指定生成哪些国际化就默认本文件中的默认列表
     *
     * @param pathanme 基础的文件,不带国际化参数的文件,包含路径及完整的文件名及后缀
     */
    public static void copyToLocale(String pathanme) {
        // 拷贝成其他的国际化文件
        for (String locale : locales) {
            String newFileName = pathanme.substring(0, pathanme.lastIndexOf(".")) + "_" + locale + pathanme.substring(pathanme.lastIndexOf("."));
            FileUtil.copyFile(pathanme, newFileName, true);
            System.out.println("请到此目录找生成的文件:" + newFileName);
        }
    }


    public static void main(String[] args) {
        addEntity(Entityi18nUtil.class);
        //生成的错误码文件的存放位置,直接在项目的指定位置,注意,如果手动修改过此文件,谨慎执行此main方法.
        String fileName = "messages";
        // 生成基础的文件,并拷贝生成其他的国际化的文件
//        copyToLocale(geni18nPropertiesFile(fileName, entities), locales);
        copyToLocale(geni18nPropertiesFile(fileName, entities));
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy