1 Star 0 Fork 16

zhanghy / dict-trans

forked from aizuda / dict-trans 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MulanPSL-2.0

logo

dict-trans

前言

简单的字典翻译组件

功能

  • 字典翻译
  • 枚举翻译
  • 数据库翻译
  • 自定义翻译
  • 翻译结果脱敏
  • json字符串翻译为json对象
  • 文章摘要提取(富文本将会变为纯文本)
  • 嵌套翻译

项目结构

dict-trans
 ├── dict-trans-core
 │   └── src
 │       └── main
 │           └── java
 │               └── com
 │                   └── aizuda
 │                       └── trans
 │                           ├── annotation                                               翻译注解
 │                           │   ├── Dictionary.java                                      字典注解,标识在字典数据类上(自动生成查询 SQL)
 │                           │   ├── Translate.java                                       翻译字段注解,标识在需要翻译的字段上
 │                           │   └── Translator.java                                      翻译方法注解,对方法返回值进行翻译
 │                           ├── constants                                                常量配置
 │                           │   └── DesensitizedTypeConstants.java
 │                           ├── desensitized                                             脱敏相关
 │                           │   ├── Desensitized.java
 │                           │   └── IDesensitized.java
 │                           ├── dict                                                     数据字典相关
 │                           │   └── DictTranslate.java
 │                           ├── entity                                                   参数实体相关
 │                           │   └── ExtendParam.java
 │                           ├── enums                                                    枚举相关
 │                           │   ├── EnumPool.java
 │                           │   ├── FormatType.java
 │                           │   └── IEnum.java
 │                           ├── json                                                     json相关
 │                           │   ├── IJsonConvert.java
 │                           │   └── JSONConvert.java
 │                           ├── summary                                                  摘要提取相关
 │                           │   ├── ISummaryExtract.java
 │                           │   └── SummaryExtract.java
 │                           ├── service
 │                           │   ├── DictTranslateService.java                            字典翻译接口(用户可自定义实现字典翻译功能)
 │                           │   ├── SummaryExtractService.java                           摘要提取服务接口(用户可自定义实现摘要提取功能)
 │                           │   └── Translatable.java                                    翻译接口(字典、枚举、....接实现该接口)
 │                           └── util                                                     一些工具类
 │                               ├── LambdaUtil.java
 │                               └── NameUtil.java
 ├── dict-trans-demo                                                                      demo演示
 │   └── src
 │       ├── main
 │       │   ├── java
 │       │   │   └── com
 │       │   │       └── aizuda
 │       │   │           └── trans
 │       │   │               ├── controller
 │       │   │               │   └── TestController.java
 │       │   │               ├── demo
 │       │   │               │   ├── DemoService.java
 │       │   │               │   └── impl
 │       │   │               │       ├── CustomerTranslateServiceImpl.java
 │       │   │               │       ├── DemoServiceImpl.java
 │       │   │               │       └── ResultUnWrapper.java                             业务统一返回 解包器实现
 │       │   │               ├── dict
 │       │   │               │   └── CustomerDictImpl.java
 │       │   │               ├── entity
 │       │   │               │   ├── Device.java
 │       │   │               │   ├── Dict.java
 │       │   │               │   ├── People.java
 │       │   │               │   ├── People2.java
 │       │   │               │   ├── People3.java
 │       │   │               │   ├── Result.java
 │       │   │               │   └── UserDB.java
 │       │   │               ├── enums
 │       │   │               │   └── DeviceStatus.java
 │       │   │               └── TranslatorBootApplication.java
 │       │   └── resources
 │       │       └── application.yml
 │       └── test
 │           └── java
 │               └── com
 │                   └── aizuda
 │                       └── trans
 │                           └── TranslatorTest.java
 ├── dict-trans-spring-boot-starter
 │   └── src
 │       └── main
 │           └── java
 │               └── com
 │                   └── aizuda
 │                       └── trans
 │                           ├── aspect                                                   翻译切面
 │                           │   └── TranslateAspect.java
 │                           ├── config
 │                           │   └── TranslatorConfig.java                                默认翻译方法注入配置
 │                           ├── handler                                                  主要操作类
 │                           │   └── TranslatorHandle.java
 │                           ├── util                                                     工具库
 │                           │   └── TranslatorUtil.java                                  提供翻译工具类(免写 @Translator 注解)
 │                           └── service
 │                               ├── impl
 │                               │   ├── convert
 │                               │   │   └── CustomerStrConvertImpl.java                  改动 Hutool 的字符串转换类
 │                               │   ├── DataBaseTranslator.java                          数据库翻译服务
 │                               │   ├── DefaultDictTranslateServiceImpl.java             默认数据字典翻译实现(实现字典翻译接口。仿照该方法,实现自己的业务)
 │                               │   ├── DesensitizedTranslator.java                      脱敏实现(没啥操作,就返回原值)
 │                               │   ├── DictCacheTranslator.java                         数据字典翻译实现(调用 字典翻译接口实现)
 │                               │   ├── EnumTranslator.java                              枚举翻译实现
 │                               │   ├── JsonConvertTranslator.java                       json翻译实现
 │                               │   ├── DefaultSummaryExtractServiceImpl.java            摘要提取服务默认实现
 │                               │   ├── SummaryExtractTranslator.java                    摘要提取翻译实现
 │                               │   └── wrapper
 │                               │       └── IPageUnWrapper.java                          mybatis-plus 解包实现(就是取 records 而已)
 │                               └── UnWrapper.java                                       解包接口
 └── doc
     ├── imgs
     │   └── demo.png
     └── t_test.sql                                                                       demo 数据库脚本

快速开始

引入jar包

不要问为什么强依赖 HutoolMyBatis-Plus

就是爱!

不用这两个的,下面可以不用看了!!!

<dependencies>

  <!-- 可自行编译 或 从中央仓库引入 -->
  <!-- https://central.sonatype.com/artifact/com.aizuda/dict-trans -->
  <dependency>
    <groupId>com.aizuda</groupId>
    <artifactId>dict-trans</artifactId>
    <version>0.5</version>
  </dependency>
  
  <!-- hutool工具类(必须) -->
  <dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.21</version>
  </dependency>
  
  <!-- mybatis-plus 工具(必须) -->
  <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
  </dependency>
  
  <!--  ====================== 以下的非必须 ====================== -->
  
  <!-- spring-boot -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.7.12</version>
  </dependency>
  
  <!-- mysql 驱动 -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
  </dependency>

</dependencies>

配置

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/t_test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&allowMultiQueries=true&useSSL=false&rewriteBatchedStatements=true
    username: root
    password: 123456

注解说明

@Dictionary

需配合 @Translate@Translator 食用

说明:标识在字典数据类上(自动生成查询 SQL),只能用在类上

参数:

  • table:字典表名,为空时取 TableName ,取不到则取 类名(驼峰转大写下划线)
  • codeColumn:字典编码的属性,对应 查询条件的列字段(需要的是表字段)
  • textColumn:字典值的列名,对应 要查询的字段(需要的是表字段)
  • groupColumn:字典组别属性,对应 要查询的字段(需要的是表字段,某些字典可能会需要根据某个类别划分,再进行翻译,如静态字典中的DICT_ID)
  • translator:自定义翻译方法,遇到特殊的翻译场景可自定义翻译实现,需要自行编写实现类实现Translatable接口并实现翻译方法,程序将使用该方法进行翻译,该注解中的所有配置信息将传递到实现方法中

示例:

// =========================== 示例1 ===========================
/**
 * 用户(数据库)
 *
 * @author nn200433
 * @date 2022-12-16 016 14:07:27
 */
@Dictionary(codeColumn = "id", textColumn = {"user_name"})
@TableName("sys_user")
public class UserDB {
    
    @TableId(value = "id", type = IdType.ASSIGN_UUID)
    private String id;
    
    @TableField(value = "user_name")
    private String name;

}

// =========================== 示例2 ===========================
/**
 * 人
 *
 * @author nn200433
 * @date 2022-12-16 016 11:40:30
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class People {
    
    @Translate(dictClass = Dict.class, groupValue = "sex", translateField = "sexName")
    private String sex;
    
    private String sexName;
    
    @Translate(dictClass = Desensitized.class, translateField = "phone", desensitizedModel = DesensitizedTypeConstants.MOBILE_PHONE)
    private String phone;
    
    @Translate(dictionary = @Dictionary(translator = CustomerTranslateServiceImpl.class), translateField = "name")
    private String id;
    
    private String name;

}

@Translate

需配合 @Dictionary@Translator 食用

说明:标识在需要翻译的字段上,只能用在字段上

参数:

  • dictClass:字典配置类,指定的 class 上必须是 DictTranslate.class 实现类 、 IEnum 接口的实现类 、 DesensitizedSummaryExtract 或者是 @Dictionary 注解;

  • translateField:翻译后的属性名,注意使用驼峰命名,默认为原属性名去除末尾的 "Id" 和 "Code" 再接上 "Name";

  • groupValue:组属性值,在静态字典表这种拥有组属性的字典中需要手动传入一个定值(即:字典分组的 code);

  • dictionary:指定 Dictionary 并设置其属性,将覆盖 dictClass 上的 Dictionary 注解的配置,指定了该属性后也可不指定 dictClass ,一般情况下不会使用;

  • conditionField:指定判断条件字段(仅自定义翻译实现时用来进行判断)『20230822更新后支持固定值,格式:V:<值>』;

  • desensitizedModel:脱敏模型,用来给数据脱敏打 * 使用。常见模型在 DesensitizedTypeConstants 常量中。也可自定义,格式:{含开始位置,含结束位置} ,举例:{1,2}

    注:字段自身脱敏时,需将 dictClass 设置为 Desensitized.class(此时字段仅返回原值后脱敏。可与翻译共用,那样先翻译后脱敏。)

  • value:dictClass的别名,当只需要配置 dictClass 时,可以简写成 @Translate(XX.class)

示例:

// =========================== 示例1 字典 ===========================

// 1.1 字典 code(需要在实现字典翻译服务时自己实现)

@Translate(dictClass = Dict.class, groupValue = "sex", translateField = "sexName")
private String sex;

private String sexName;

// 1.2 自定义完整字典(需要在实现字典翻译服务时自己实现)

@Translate(dictClass = Dict.class, groupValue = "{男:1;女:2;}", translateField = "sexName")
private String sex;

private String sexName;

// =========================== 示例2 数据库 ===========================

// 2.1. 字典定义
@Dictionary(codeColumn = "id", textColumn = {"user_name"})
@TableName("sys_user")
// 省略 @Data 等
// ....
public class UserDB {
}

// 2.2. 字段翻译
@Translate(dictClass = UserDB.class, translateField = "name")
private String id;
    
private String name;

// =========================== 示例3 枚举 ===========================

// 3.1. 枚举定义
public interface MyDict {
    /**
     * 示例1:性别枚举
     */
    enum SexDict implements IDict {
        //
        MALE("0", "男"),
        FEMALE("1", "女");

        SexDict(String code, String text) {
            // 构造方法中只需要调用接口的init方法即可,省略了属性的定义和赋值,也不用定义累赘的get方法
            init(code, text);
        }
    }
}

// 3.2. 枚举翻译
/**
 * 性别
 */
@Translate(MyDict.SexDict.class)
private String sex;

private String sexName;

// =========================== 示例4 脱敏 ===========================

// 4.1 字段给自身脱敏
@ApiModelProperty("联系电话")
@Translate(dictClass = Desensitized.class, desensitizedModel = DesensitizedTypeConstants.MOBILE_PHONE, translateField = "phone")
private String phone;

// 4.2 字段翻译并脱敏
@ApiModelProperty("用户等级")
@Translate(dictClass = Dict.class, groupValue = DictConstants.APP_USER_LEVEL, translateField = "userLevelName", desensitizedModel = "{0,1}")
private String userLevel;

@ApiModelProperty("用户等级中文")
private String userLevelName;

// =========================== 示例5 摘要提取 ===========================

/** 摘要提取 */
@Translate(dictClass = SummaryExtract.class, maxLen = 10)
private String introduce;

// =========================== 示例6 自定义 ===========================
    
// 5.1 翻译字段
@Translate(dictionary = @Dictionary(translator = CustomerTranslateServiceImpl.class), translateField = "name")
private String id;
    
private String name;

// 5.2 自定义翻译方法
@Component
public class CustomerTranslateServiceImpl implements Translatable {
    
    @Override
    public List<String> translate(String groupValue, String conditionValue, String origin, Dictionary dictConfig,
                                  Class dictClass) {
        List<String> rList = new ArrayList<String>(1);
        if (StrUtil.equals(origin, "1")) {
            rList.add("结果1");
        } else {
            rList.add("结果2");
        }
        return rList;
    }

}

// =========================== 示例6 数据库查询多字段进行字段映射 ===========================

// 6.1 数据库字典类
@Dictionary(codeColumn = "id", textColumn = {"user_name", "real_name"})
@TableName("sys_user")
// 省略 @Data 等
// ....
public class UserDB {
}


// 6.2 翻译字段
// 注意:translateField 需要跟 textColumn 的下标一一对应!!!
@Translate(dictClass = UserDB.class, translateField = {"zh", "zsxm"})
private String id;

private String zh;

private String zsxm;
    
// =========================== 示例7 json字符串翻译为json对象 ===========================
    
@Translate(dictClass = JSONConvert.class, translateField = "jsonObj")
private String json;

private Object jsonObj;

@Translator

需配合 @Dictionary@Translate 食用

方法返回类型支持 MapEntityListIPage

说明:对方法返回值进行翻译,可用在方法、字段上

参数:无

示例:

// =========================== 示例1 用在方法上 ===========================
@Component
public class DemoServiceImpl implements DemoService {
    
    @Translator
    @Override
    public List<People> dictDemo() {
        People man   = People.builder().sex("1").id("1").phone("18612345678").build();
        People woman = People.builder().sex("2").id("2").phone("18612345678").build();
        return CollUtil.newArrayList(man, woman);
    }
    
    @Translator
    @Override
    public List<Device> enumDemo() {
        Device man   = Device.builder().status("1").build();
        Device woman = Device.builder().status("2").build();
        return CollUtil.newArrayList(man, woman);
    }
    
    @Translator
    @Override
    public List<People2> dbDemo() {
        People2 man   = People2.builder().id("1").build();
        People2 woman = People2.builder().id("17ed02e3f05c629385371ce561f2dc50").build();
        return CollUtil.newArrayList(man, woman);
    }

}

// =========================== 示例2 用在字段上 ===========================

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class People {
    
    @Translate(dictClass = Dict.class, groupValue = "sex", translateField = "sexName")
    private String sex;
    
    private String sexName;
    
    /** 手机号脱敏 */
    @Translate(dictClass = Desensitized.class, translateField = "phone", desensitizedModel = DesensitizedTypeConstants.MOBILE_PHONE)
    private String phone;
    
    /** 自定义翻译 */
    @Translate(dictionary = @Dictionary(translator = CustomerTranslateServiceImpl.class), translateField = "name")
    private String id;
    
    private String name;

    /** 用在字段上,可嵌套翻译 */
    @Translator
    private Device device;
    
}

嵌套翻译示例:

package com.aizuda.trans.demo.impl;

import com.aizuda.trans.entity.Result;
import com.aizuda.trans.service.UnWrapper;
import org.springframework.stereotype.Component;

/**
 * 结果解包器
 *
 * @author nn200433
 * @date 2023-05-25 025 14:48:43
 */
@Component
public class ResultUnWrapper<T> implements UnWrapper<Result<T>> {

    @Override
    public Object unWrap(Result<T> source) {
        return source.getData();
    }

}

演示

完整示例参考 dict-trans-demo 模块

/**
 * 转换测试
 *
 * @author nn200433
 * @date 2020年05月18日 0018 15:05:05
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class TranslatorTest {

    @Autowired
    private DemoService demoService;

    @Test
    public void demo1() {
        List<People> peopleList = demoService.dictDemo();
        Console.log("---> 字典 & 脱敏 翻译结果:{}", JSONUtil.toJsonStr(peopleList));
    }

    @Test
    public void demo2() {
        List<Device> deviceList = demoService.enumDemo();
        Console.log("---> 枚举 翻译结果:{}", JSONUtil.toJsonStr(deviceList));
    }

    @Test
    public void demo3() {
        List<People2> peopleList = demoService.dbDemo();
        Console.log("---> 数据库 翻译结果:{}", JSONUtil.toJsonStr(peopleList));
    }

    @Test
    public void demo4() {
        List<People3> peopleList = demoService.jsonDemo();
        Console.log("---> json 翻译结果:{}", JSONUtil.toJsonStr(peopleList));
    }

    @Test
    public void demo5() {
        Result result = demoService.responseNestedMockTest();
        Console.log("---> 响应嵌套数据:{}", JSONUtil.toJsonStr(result));
    }

    @Test
    public void demo6() {
        List<People> peopleList = demoService.dictDemo2();
        Console.log("---> 字典 & 脱敏 & 摘要提取 翻译结果:{}", JSONUtil.toJsonStr(peopleList));
    }

}

运行示例

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::               (v2.7.12)

2023-06-07 16:41:13.752  INFO 30996 --- [           main] com.aizuda.trans.TranslatorTest          : Starting TranslatorTest using Java 1.8.0_311 on LAPTOP-N9LDSE74 with PID 30996 (started by nn200 in D:\idea_hengfeng\dict-trans\dict-trans-demo)
2023-06-07 16:41:13.755  INFO 30996 --- [           main] com.aizuda.trans.TranslatorTest          : No active profile set, falling back to 1 default profile: "default"
2023-06-07 16:41:16.453  WARN 30996 --- [           main] o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in '[com.aizuda.trans]' package. Please check your configuration.
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.5.3.1 
2023-06-07 16:41:24.532  INFO 30996 --- [           main] com.aizuda.trans.TranslatorTest          : Started TranslatorTest in 12.088 seconds (JVM running for 15.043)
---> 字典 & 脱敏 翻译结果:[{"sex":"1","sexName":"男","phone":"186****5678","id":"1","name":"结果1"},{"sex":"2","sexName":"女","phone":"186****5678","id":"2","name":"结果2"}]
---> 枚举 翻译结果:[{"status":"1","statusName":"未使用"},{"status":"2","statusName":"试运行"}]
2023-06-07 16:41:25.435  INFO 30996 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2023-06-07 16:41:26.050  INFO 30996 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
---> 数据库 翻译结果:[{"id":"1","name":"张三"},{"id":"2","name":"李四"}]
---> json 翻译结果:[{"id":"1","name":"张三","json":"{\"abc\":\"def\", \"eg\":3}","jsonObj":{"abc":"def","eg":3}},{"id":"2","name":"李四","json":"[{\"a\":\"b\",\"c\":6},{\"d\":\"f\",\"e\":{\"a\":\"6\"}}]","jsonObj":[{"a":"b","c":6},{"d":"f","e":{"a":"6"}}]}]
---> 响应嵌套数据:{"status":200,"data":[{"sex":"1","sexName":"男","phone":"186****5678","id":"1","name":"结果1","device":{"status":"1","statusName":"未使用"}},{"sex":"2","sexName":"女","phone":"186****5678","id":"2","name":"结果2","device":{"status":"2","statusName":"试运行"}}]}
---> 字典 & 脱敏 & 摘要提取 翻译结果:[{"sex":"1","sexName":"男","phone":"186****5678","introduce":"我是一名热爱技术的软...","id":"1","name":"结果1"},{"sex":"2","sexName":"女","phone":"186****5678","introduce":"我是一名热爱艺术的画...","id":"2","name":"结果2"}]
2023-06-07 16:41:26.390  INFO 30996 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2023-06-07 16:41:26.403  INFO 30996 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
Disconnected from the target VM, address: '127.0.0.1:35075', transport: 'socket'

Process finished with exit code 0

附注

该项目得益于 Transformer v1 版本 增加了 脱敏,完善了 数据库翻译 等功能。(Transformer可能是最简单,但最强大的字段转换插件,一个注解搞定任意转换,让开发变得更加丝滑),基本上就是在此项目上增加功能。

特别鸣谢

感谢以下的项目,排名不分先后

  • Hutool Hutool是一个Java工具包,让Java语言也可以“甜甜的”。
  • MyBatis-Plus MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
  • Transformer Transformer 是一款功能全面的数据转换工具,只需要几个简单的注解配置,即可实现各种姿势的字段转换,抛弃连表查询和累赘的转换逻辑,让开发更简单。
木兰宽松许可证, 第2版 木兰宽松许可证, 第2版 2020年1月 http://license.coscl.org.cn/MulanPSL2 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: 0. 定义 “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 “法人实体”是指提交贡献的机构及其“关联实体”。 “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 1. 授予版权许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 2. 授予专利许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 3. 无商标许可 “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 4. 分发限制 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 5. 免责声明与责任限制 “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 6. 语言 “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 条款结束 如何将木兰宽松许可证,第2版,应用到您的软件 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; 3, 请将如下声明文本放入每个源文件的头部注释中。 Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details. Mulan Permissive Software License,Version 2 Mulan Permissive Software License,Version 2 (Mulan PSL v2) January 2020 http://license.coscl.org.cn/MulanPSL2 Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: 0. Definition Software means the program and related documents which are licensed under this License and comprise all Contribution(s). Contribution means the copyrightable work licensed by a particular Contributor under this License. Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. Legal Entity means the entity making a Contribution and all its Affiliates. Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. 1. Grant of Copyright License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. 2. Grant of Patent License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. 3. No Trademark License No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. 4. Distribution Restriction You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. 5. Disclaimer of Warranty and Limitation of Liability THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 6. Language THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. END OF THE TERMS AND CONDITIONS How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details.

简介

🔥🔥🔥简单的字典翻译组件 展开 收起
Java
MulanPSL-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/kalajia/dict-trans.git
git@gitee.com:kalajia/dict-trans.git
kalajia
dict-trans
dict-trans
master

搜索帮助