浏览代码

后端代码国际化定制

xuxueli 7 年之前
父节点
当前提交
54f6c050c5

+ 3 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java

@@ -2,6 +2,7 @@ package com.xxl.job.admin.controller;
 
 
 import com.xxl.job.admin.controller.annotation.PermessionLimit;
 import com.xxl.job.admin.controller.annotation.PermessionLimit;
 import com.xxl.job.admin.controller.interceptor.PermissionInterceptor;
 import com.xxl.job.admin.controller.interceptor.PermissionInterceptor;
+import com.xxl.job.admin.core.util.I18nUtil;
 import com.xxl.job.admin.service.XxlJobService;
 import com.xxl.job.admin.service.XxlJobService;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.biz.model.ReturnT;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -67,14 +68,14 @@ public class IndexController {
 
 
 		// param
 		// param
 		if (StringUtils.isBlank(userName) || StringUtils.isBlank(password)){
 		if (StringUtils.isBlank(userName) || StringUtils.isBlank(password)){
-			return new ReturnT<String>(500, "账号或密码为空");
+			return new ReturnT<String>(500, I18nUtil.getString("login_param_empty"));
 		}
 		}
 		boolean ifRem = (StringUtils.isNotBlank(ifRemember) && "on".equals(ifRemember))?true:false;
 		boolean ifRem = (StringUtils.isNotBlank(ifRemember) && "on".equals(ifRemember))?true:false;
 
 
 		// do login
 		// do login
 		boolean loginRet = PermissionInterceptor.login(response, userName, password, ifRem);
 		boolean loginRet = PermissionInterceptor.login(response, userName, password, ifRem);
 		if (!loginRet) {
 		if (!loginRet) {
-			return new ReturnT<String>(500, "账号或密码错误");
+			return new ReturnT<String>(500, I18nUtil.getString("login_param_unvalid"));
 		}
 		}
 		return ReturnT.SUCCESS;
 		return ReturnT.SUCCESS;
 	}
 	}

+ 6 - 5
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java

@@ -2,6 +2,7 @@ package com.xxl.job.admin.controller;
 
 
 import com.xxl.job.admin.core.model.XxlJobInfo;
 import com.xxl.job.admin.core.model.XxlJobInfo;
 import com.xxl.job.admin.core.model.XxlJobLogGlue;
 import com.xxl.job.admin.core.model.XxlJobLogGlue;
+import com.xxl.job.admin.core.util.I18nUtil;
 import com.xxl.job.admin.dao.XxlJobInfoDao;
 import com.xxl.job.admin.dao.XxlJobInfoDao;
 import com.xxl.job.admin.dao.XxlJobLogGlueDao;
 import com.xxl.job.admin.dao.XxlJobLogGlueDao;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.biz.model.ReturnT;
@@ -34,10 +35,10 @@ public class JobCodeController {
 		List<XxlJobLogGlue> jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId);
 		List<XxlJobLogGlue> jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId);
 
 
 		if (jobInfo == null) {
 		if (jobInfo == null) {
-			throw new RuntimeException("抱歉,任务不存在.");
+			throw new RuntimeException(I18nUtil.getString("jobinfo_glue_jobid_unvalid"));
 		}
 		}
 		if (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType())) {
 		if (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType())) {
-			throw new RuntimeException("该任务非GLUE模式.");
+			throw new RuntimeException(I18nUtil.getString("jobinfo_glue_gluetype_unvalid"));
 		}
 		}
 
 
 		// Glue类型-字典
 		// Glue类型-字典
@@ -53,14 +54,14 @@ public class JobCodeController {
 	public ReturnT<String> save(Model model, int id, String glueSource, String glueRemark) {
 	public ReturnT<String> save(Model model, int id, String glueSource, String glueRemark) {
 		// valid
 		// valid
 		if (glueRemark==null) {
 		if (glueRemark==null) {
-			return new ReturnT<String>(500, "请输入备注");
+			return new ReturnT<String>(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_glue_remark")) );
 		}
 		}
 		if (glueRemark.length()<4 || glueRemark.length()>100) {
 		if (glueRemark.length()<4 || glueRemark.length()>100) {
-			return new ReturnT<String>(500, "备注长度应该在4至100之间");
+			return new ReturnT<String>(500, I18nUtil.getString("jobinfo_glue_remark_limit"));
 		}
 		}
 		XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(id);
 		XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(id);
 		if (exists_jobInfo == null) {
 		if (exists_jobInfo == null) {
-			return new ReturnT<String>(500, "参数异常");
+			return new ReturnT<String>(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid"));
 		}
 		}
 		
 		
 		// update new code
 		// update new code

+ 15 - 14
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java

@@ -1,6 +1,7 @@
 package com.xxl.job.admin.controller;
 package com.xxl.job.admin.controller;
 
 
 import com.xxl.job.admin.core.model.XxlJobGroup;
 import com.xxl.job.admin.core.model.XxlJobGroup;
+import com.xxl.job.admin.core.util.I18nUtil;
 import com.xxl.job.admin.dao.XxlJobGroupDao;
 import com.xxl.job.admin.dao.XxlJobGroupDao;
 import com.xxl.job.admin.dao.XxlJobInfoDao;
 import com.xxl.job.admin.dao.XxlJobInfoDao;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.biz.model.ReturnT;
@@ -42,22 +43,22 @@ public class JobGroupController {
 
 
 		// valid
 		// valid
 		if (xxlJobGroup.getAppName()==null || StringUtils.isBlank(xxlJobGroup.getAppName())) {
 		if (xxlJobGroup.getAppName()==null || StringUtils.isBlank(xxlJobGroup.getAppName())) {
-			return new ReturnT<String>(500, "请输入AppName");
+			return new ReturnT<String>(500, (I18nUtil.getString("system_please_input")+"AppName") );
 		}
 		}
-		if (xxlJobGroup.getAppName().length()>64) {
-			return new ReturnT<String>(500, "AppName长度限制为4~64");
+		if (xxlJobGroup.getAppName().length()<4 || xxlJobGroup.getAppName().length()>64) {
+			return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_appName_length") );
 		}
 		}
 		if (xxlJobGroup.getTitle()==null || StringUtils.isBlank(xxlJobGroup.getTitle())) {
 		if (xxlJobGroup.getTitle()==null || StringUtils.isBlank(xxlJobGroup.getTitle())) {
-			return new ReturnT<String>(500, "请输入名称");
+			return new ReturnT<String>(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) );
 		}
 		}
 		if (xxlJobGroup.getAddressType()!=0) {
 		if (xxlJobGroup.getAddressType()!=0) {
 			if (StringUtils.isBlank(xxlJobGroup.getAddressList())) {
 			if (StringUtils.isBlank(xxlJobGroup.getAddressList())) {
-				return new ReturnT<String>(500, "手动录入注册方式,机器地址不可为空");
+				return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_addressType_limit") );
 			}
 			}
 			String[] addresss = xxlJobGroup.getAddressList().split(",");
 			String[] addresss = xxlJobGroup.getAddressList().split(",");
 			for (String item: addresss) {
 			for (String item: addresss) {
 				if (StringUtils.isBlank(item)) {
 				if (StringUtils.isBlank(item)) {
-					return new ReturnT<String>(500, "机器地址非法");
+					return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_registryList_unvalid") );
 				}
 				}
 			}
 			}
 		}
 		}
@@ -71,22 +72,22 @@ public class JobGroupController {
 	public ReturnT<String> update(XxlJobGroup xxlJobGroup){
 	public ReturnT<String> update(XxlJobGroup xxlJobGroup){
 		// valid
 		// valid
 		if (xxlJobGroup.getAppName()==null || StringUtils.isBlank(xxlJobGroup.getAppName())) {
 		if (xxlJobGroup.getAppName()==null || StringUtils.isBlank(xxlJobGroup.getAppName())) {
-			return new ReturnT<String>(500, "请输入AppName");
+			return new ReturnT<String>(500, (I18nUtil.getString("system_please_input")+"AppName") );
 		}
 		}
-		if (xxlJobGroup.getAppName().length()>64) {
-			return new ReturnT<String>(500, "AppName长度限制为4~64");
+		if (xxlJobGroup.getAppName().length()<4 || xxlJobGroup.getAppName().length()>64) {
+			return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_appName_length") );
 		}
 		}
 		if (xxlJobGroup.getTitle()==null || StringUtils.isBlank(xxlJobGroup.getTitle())) {
 		if (xxlJobGroup.getTitle()==null || StringUtils.isBlank(xxlJobGroup.getTitle())) {
-			return new ReturnT<String>(500, "请输入名称");
+			return new ReturnT<String>(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) );
 		}
 		}
 		if (xxlJobGroup.getAddressType()!=0) {
 		if (xxlJobGroup.getAddressType()!=0) {
 			if (StringUtils.isBlank(xxlJobGroup.getAddressList())) {
 			if (StringUtils.isBlank(xxlJobGroup.getAddressList())) {
-				return new ReturnT<String>(500, "手动录入注册方式,机器地址不可为空");
+				return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_addressType_limit") );
 			}
 			}
 			String[] addresss = xxlJobGroup.getAddressList().split(",");
 			String[] addresss = xxlJobGroup.getAddressList().split(",");
 			for (String item: addresss) {
 			for (String item: addresss) {
 				if (StringUtils.isBlank(item)) {
 				if (StringUtils.isBlank(item)) {
-					return new ReturnT<String>(500, "机器地址非法");
+					return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_registryList_unvalid") );
 				}
 				}
 			}
 			}
 		}
 		}
@@ -102,12 +103,12 @@ public class JobGroupController {
 		// valid
 		// valid
 		int count = xxlJobInfoDao.pageListCount(0, 10, id, null, null);
 		int count = xxlJobInfoDao.pageListCount(0, 10, id, null, null);
 		if (count > 0) {
 		if (count > 0) {
-			return new ReturnT<String>(500, "该分组使用中, 不可删除");
+			return new ReturnT<String>(500, I18nUtil.getString("jobgroup_del_limit_0") );
 		}
 		}
 
 
 		List<XxlJobGroup> allList = xxlJobGroupDao.findAll();
 		List<XxlJobGroup> allList = xxlJobGroupDao.findAll();
 		if (allList.size() == 1) {
 		if (allList.size() == 1) {
-			return new ReturnT<String>(500, "删除失败, 系统需要至少预留一个默认分组");
+			return new ReturnT<String>(500, I18nUtil.getString("jobgroup_del_limit_1") );
 		}
 		}
 
 
 		int ret = xxlJobGroupDao.remove(id);
 		int ret = xxlJobGroupDao.remove(id);

+ 6 - 5
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java

@@ -4,6 +4,7 @@ import com.xxl.job.admin.core.model.XxlJobGroup;
 import com.xxl.job.admin.core.model.XxlJobInfo;
 import com.xxl.job.admin.core.model.XxlJobInfo;
 import com.xxl.job.admin.core.model.XxlJobLog;
 import com.xxl.job.admin.core.model.XxlJobLog;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
+import com.xxl.job.admin.core.util.I18nUtil;
 import com.xxl.job.admin.dao.XxlJobGroupDao;
 import com.xxl.job.admin.dao.XxlJobGroupDao;
 import com.xxl.job.admin.dao.XxlJobInfoDao;
 import com.xxl.job.admin.dao.XxlJobInfoDao;
 import com.xxl.job.admin.dao.XxlJobLogDao;
 import com.xxl.job.admin.dao.XxlJobLogDao;
@@ -107,7 +108,7 @@ public class JobLogController {
 		ReturnT<String> logStatue = ReturnT.SUCCESS;
 		ReturnT<String> logStatue = ReturnT.SUCCESS;
 		XxlJobLog jobLog = xxlJobLogDao.load(id);
 		XxlJobLog jobLog = xxlJobLogDao.load(id);
 		if (jobLog == null) {
 		if (jobLog == null) {
-            throw new RuntimeException("抱歉,日志ID非法.");
+            throw new RuntimeException(I18nUtil.getString("joblog_logid_unvalid"));
 		}
 		}
 
 
         model.addAttribute("triggerCode", jobLog.getTriggerCode());
         model.addAttribute("triggerCode", jobLog.getTriggerCode());
@@ -147,10 +148,10 @@ public class JobLogController {
 		XxlJobLog log = xxlJobLogDao.load(id);
 		XxlJobLog log = xxlJobLogDao.load(id);
 		XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId());
 		XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId());
 		if (jobInfo==null) {
 		if (jobInfo==null) {
-			return new ReturnT<String>(500, "参数异常");
+			return new ReturnT<String>(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid"));
 		}
 		}
 		if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) {
 		if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) {
-			return new ReturnT<String>(500, "调度失败,无法终止日志");
+			return new ReturnT<String>(500, I18nUtil.getString("joblog_kill_log_limit"));
 		}
 		}
 
 
 		// request of kill
 		// request of kill
@@ -165,7 +166,7 @@ public class JobLogController {
 
 
 		if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
 		if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
 			log.setHandleCode(ReturnT.FAIL_CODE);
 			log.setHandleCode(ReturnT.FAIL_CODE);
-			log.setHandleMsg("人为操作主动终止:" + (runResult.getMsg()!=null?runResult.getMsg():""));
+			log.setHandleMsg( I18nUtil.getString("joblog_kill_log_byman")+":" + (runResult.getMsg()!=null?runResult.getMsg():""));
 			log.setHandleTime(new Date());
 			log.setHandleTime(new Date());
 			xxlJobLogDao.updateHandleInfo(log);
 			xxlJobLogDao.updateHandleInfo(log);
 			return new ReturnT<String>(runResult.getMsg());
 			return new ReturnT<String>(runResult.getMsg());
@@ -199,7 +200,7 @@ public class JobLogController {
 		} else if (type == 9) {
 		} else if (type == 9) {
 			clearBeforeNum = 0;			// 清理所有日志数据
 			clearBeforeNum = 0;			// 清理所有日志数据
 		} else {
 		} else {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "清理类型参数异常");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_clean_type_unvalid"));
 		}
 		}
 
 
 		xxlJobLogDao.clearLog(jobGroup, jobId, clearBeforeTime, clearBeforeNum);
 		xxlJobLogDao.clearLog(jobGroup, jobId, clearBeforeTime, clearBeforeNum);

+ 4 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/enums/ExecutorFailStrategyEnum.java

@@ -1,13 +1,15 @@
 package com.xxl.job.admin.core.enums;
 package com.xxl.job.admin.core.enums;
 
 
+import com.xxl.job.admin.core.util.I18nUtil;
+
 /**
 /**
  * Created by xuxueli on 17/5/9.
  * Created by xuxueli on 17/5/9.
  */
  */
 public enum ExecutorFailStrategyEnum {
 public enum ExecutorFailStrategyEnum {
 
 
-    FAIL_ALARM("失败告警"),
+    FAIL_ALARM(I18nUtil.getString("jobconf_fail_alarm")),
 
 
-    FAIL_RETRY("失败重试");
+    FAIL_RETRY(I18nUtil.getString("jobconf_fail_retry"));
 
 
     private final String title;
     private final String title;
     private ExecutorFailStrategyEnum(String title) {
     private ExecutorFailStrategyEnum(String title) {

+ 11 - 10
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java

@@ -1,22 +1,23 @@
 package com.xxl.job.admin.core.route;
 package com.xxl.job.admin.core.route;
 
 
 import com.xxl.job.admin.core.route.strategy.*;
 import com.xxl.job.admin.core.route.strategy.*;
+import com.xxl.job.admin.core.util.I18nUtil;
 
 
 /**
 /**
  * Created by xuxueli on 17/3/10.
  * Created by xuxueli on 17/3/10.
  */
  */
 public enum ExecutorRouteStrategyEnum {
 public enum ExecutorRouteStrategyEnum {
 
 
-    FIRST("第一个", new ExecutorRouteFirst()),
-    LAST("最后一个", new ExecutorRouteLast()),
-    ROUND("轮询", new ExecutorRouteRound()),
-    RANDOM("随机", new ExecutorRouteRandom()),
-    CONSISTENT_HASH("一致性HASH", new ExecutorRouteConsistentHash()),
-    LEAST_FREQUENTLY_USED("最不经常使用", new ExecutorRouteLFU()),
-    LEAST_RECENTLY_USED("最近最久未使用", new ExecutorRouteLRU()),
-    FAILOVER("故障转移", new ExecutorRouteFailover()),
-    BUSYOVER("忙碌转移", new ExecutorRouteBusyover()),
-    SHARDING_BROADCAST("分片广播", null);
+    FIRST(I18nUtil.getString("jobconf_route_first"), new ExecutorRouteFirst()),
+    LAST(I18nUtil.getString("jobconf_route_last"), new ExecutorRouteLast()),
+    ROUND(I18nUtil.getString("jobconf_route_round"), new ExecutorRouteRound()),
+    RANDOM(I18nUtil.getString("jobconf_route_random"), new ExecutorRouteRandom()),
+    CONSISTENT_HASH(I18nUtil.getString("jobconf_route_consistenthash"), new ExecutorRouteConsistentHash()),
+    LEAST_FREQUENTLY_USED(I18nUtil.getString("jobconf_route_lfu"), new ExecutorRouteLFU()),
+    LEAST_RECENTLY_USED(I18nUtil.getString("jobconf_route_lru"), new ExecutorRouteLRU()),
+    FAILOVER(I18nUtil.getString("jobconf_route_failover"), new ExecutorRouteFailover()),
+    BUSYOVER(I18nUtil.getString("jobconf_route_busyover"), new ExecutorRouteBusyover()),
+    SHARDING_BROADCAST(I18nUtil.getString("jobconf_route_shard"), null);
 
 
     ExecutorRouteStrategyEnum(String title, ExecutorRouter router) {
     ExecutorRouteStrategyEnum(String title, ExecutorRouter router) {
         this.title = title;
         this.title = title;

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java

@@ -3,6 +3,7 @@ package com.xxl.job.admin.core.route.strategy;
 import com.xxl.job.admin.core.route.ExecutorRouter;
 import com.xxl.job.admin.core.route.ExecutorRouter;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
 import com.xxl.job.admin.core.trigger.XxlJobTrigger;
 import com.xxl.job.admin.core.trigger.XxlJobTrigger;
+import com.xxl.job.admin.core.util.I18nUtil;
 import com.xxl.job.core.biz.ExecutorBiz;
 import com.xxl.job.core.biz.ExecutorBiz;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.biz.model.TriggerParam;
 import com.xxl.job.core.biz.model.TriggerParam;
@@ -33,7 +34,7 @@ public class ExecutorRouteBusyover extends ExecutorRouter {
                 idleBeatResult = new ReturnT<String>(ReturnT.FAIL_CODE, ""+e );
                 idleBeatResult = new ReturnT<String>(ReturnT.FAIL_CODE, ""+e );
             }
             }
             idleBeatResultSB.append( (idleBeatResultSB.length()>0)?"<br><br>":"")
             idleBeatResultSB.append( (idleBeatResultSB.length()>0)?"<br><br>":"")
-                    .append("空闲检测:")
+                    .append(I18nUtil.getString("jobconf_idleBeat") + ":")
                     .append("<br>address:").append(address)
                     .append("<br>address:").append(address)
                     .append("<br>code:").append(idleBeatResult.getCode())
                     .append("<br>code:").append(idleBeatResult.getCode())
                     .append("<br>msg:").append(idleBeatResult.getMsg());
                     .append("<br>msg:").append(idleBeatResult.getMsg());

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java

@@ -3,6 +3,7 @@ package com.xxl.job.admin.core.route.strategy;
 import com.xxl.job.admin.core.route.ExecutorRouter;
 import com.xxl.job.admin.core.route.ExecutorRouter;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
 import com.xxl.job.admin.core.trigger.XxlJobTrigger;
 import com.xxl.job.admin.core.trigger.XxlJobTrigger;
+import com.xxl.job.admin.core.util.I18nUtil;
 import com.xxl.job.core.biz.ExecutorBiz;
 import com.xxl.job.core.biz.ExecutorBiz;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.biz.model.TriggerParam;
 import com.xxl.job.core.biz.model.TriggerParam;
@@ -33,7 +34,7 @@ public class ExecutorRouteFailover extends ExecutorRouter {
                 beatResult = new ReturnT<String>(ReturnT.FAIL_CODE, ""+e );
                 beatResult = new ReturnT<String>(ReturnT.FAIL_CODE, ""+e );
             }
             }
             beatResultSB.append( (beatResultSB.length()>0)?"<br><br>":"")
             beatResultSB.append( (beatResultSB.length()>0)?"<br><br>":"")
-                    .append("心跳检测:")
+                    .append(I18nUtil.getString("jobconf_beat") + ":")
                     .append("<br>address:").append(address)
                     .append("<br>address:").append(address)
                     .append("<br>code:").append(beatResult.getCode())
                     .append("<br>code:").append(beatResult.getCode())
                     .append("<br>msg:").append(beatResult.getMsg());
                     .append("<br>msg:").append(beatResult.getMsg());

+ 8 - 7
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java

@@ -4,6 +4,7 @@ import com.xxl.job.admin.core.model.XxlJobGroup;
 import com.xxl.job.admin.core.model.XxlJobInfo;
 import com.xxl.job.admin.core.model.XxlJobInfo;
 import com.xxl.job.admin.core.model.XxlJobLog;
 import com.xxl.job.admin.core.model.XxlJobLog;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
+import com.xxl.job.admin.core.util.I18nUtil;
 import com.xxl.job.admin.core.util.MailUtil;
 import com.xxl.job.admin.core.util.MailUtil;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.handler.IJobHandler;
 import com.xxl.job.core.handler.IJobHandler;
@@ -119,14 +120,14 @@ public class JobFailMonitorHelper {
 	// ---------------------- alarm ----------------------
 	// ---------------------- alarm ----------------------
 
 
 	// email alarm template
 	// email alarm template
-	private static final String mailBodyTemplate = "<h5>监控告警明细:</span>" +
+	private static final String mailBodyTemplate = "<h5>" + I18nUtil.getString("jobconf_monitor_detail") + ":</span>" +
 			"<table border=\"1\" cellpadding=\"3\" style=\"border-collapse:collapse; width:80%;\" >\n" +
 			"<table border=\"1\" cellpadding=\"3\" style=\"border-collapse:collapse; width:80%;\" >\n" +
 			"   <thead style=\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\" >" +
 			"   <thead style=\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\" >" +
 			"      <tr>\n" +
 			"      <tr>\n" +
-			"         <td>执行器</td>\n" +
-			"         <td>任务ID</td>\n" +
-			"         <td>任务描述</td>\n" +
-			"         <td>告警类型</td>\n" +
+			"         <td>"+ I18nUtil.getString("jobinfo_field_jobgroup") +"</td>\n" +
+			"         <td>"+ I18nUtil.getString("jobinfo_field_id") +"</td>\n" +
+			"         <td>"+ I18nUtil.getString("jobinfo_field_jobdesc") +"</td>\n" +
+			"         <td>"+ I18nUtil.getString("jobconf_monitor_alarm_title") +"</td>\n" +
 			"      </tr>\n" +
 			"      </tr>\n" +
 			"   <thead/>\n" +
 			"   <thead/>\n" +
 			"   <tbody>\n" +
 			"   <tbody>\n" +
@@ -134,7 +135,7 @@ public class JobFailMonitorHelper {
 			"         <td>{0}</td>\n" +
 			"         <td>{0}</td>\n" +
 			"         <td>{1}</td>\n" +
 			"         <td>{1}</td>\n" +
 			"         <td>{2}</td>\n" +
 			"         <td>{2}</td>\n" +
-			"         <td>调度失败</td>\n" +
+			"         <td>"+ I18nUtil.getString("jobconf_monitor_alarm_type") +"</td>\n" +
 			"      </tr>\n" +
 			"      </tr>\n" +
 			"   <tbody>\n" +
 			"   <tbody>\n" +
 			"</table>";
 			"</table>";
@@ -154,7 +155,7 @@ public class JobFailMonitorHelper {
 			for (String email: emailSet) {
 			for (String email: emailSet) {
 				XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(Integer.valueOf(info.getJobGroup()));
 				XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(Integer.valueOf(info.getJobGroup()));
 
 
-				String title = "调度中心监控报警";
+				String title = I18nUtil.getString("jobconf_monitor");
 				String content = MessageFormat.format(mailBodyTemplate, group!=null?group.getTitle():"null", info.getId(), info.getJobDesc());
 				String content = MessageFormat.format(mailBodyTemplate, group!=null?group.getTitle():"null", info.getId(), info.getJobDesc());
 
 
 				MailUtil.sendMail(email, title, content);
 				MailUtil.sendMail(email, title, content);

+ 22 - 19
xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java

@@ -7,6 +7,7 @@ import com.xxl.job.admin.core.model.XxlJobLog;
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
 import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
 import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
+import com.xxl.job.admin.core.util.I18nUtil;
 import com.xxl.job.core.biz.ExecutorBiz;
 import com.xxl.job.core.biz.ExecutorBiz;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.biz.model.TriggerParam;
 import com.xxl.job.core.biz.model.TriggerParam;
@@ -67,17 +68,18 @@ public class XxlJobTrigger {
 
 
                 ReturnT<String> triggerResult = new ReturnT<String>(null);
                 ReturnT<String> triggerResult = new ReturnT<String>(null);
                 StringBuffer triggerMsgSb = new StringBuffer();
                 StringBuffer triggerMsgSb = new StringBuffer();
-                triggerMsgSb.append("调度机器:").append(IpUtil.getIp());
-                triggerMsgSb.append("<br>执行器-注册方式:").append( (group.getAddressType() == 0)?"自动注册":"手动录入" );
-                triggerMsgSb.append("<br>执行器-地址列表:").append(group.getRegistryList());
-                triggerMsgSb.append("<br>路由策略:").append(executorRouteStrategyEnum.getTitle()).append("("+i+"/"+addressList.size()+")"); // update01
-                triggerMsgSb.append("<br>阻塞处理策略:").append(blockStrategy.getTitle());
-                triggerMsgSb.append("<br>失败处理策略:").append(failStrategy.getTitle());
+                triggerMsgSb.append(I18nUtil.getString("jobconf_trigger_admin_adress")).append(":").append(IpUtil.getIp());
+                triggerMsgSb.append("<br>").append(I18nUtil.getString("jobconf_trigger_exe_regtype")).append(":")
+                        .append( (group.getAddressType() == 0)?I18nUtil.getString("jobgroup_field_addressType_0"):I18nUtil.getString("jobgroup_field_addressType_1") );
+                triggerMsgSb.append("<br>").append(I18nUtil.getString("jobconf_trigger_exe_regaddress")).append(":").append(group.getRegistryList());
+                triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")).append(":").append(executorRouteStrategyEnum.getTitle()).append("("+i+"/"+addressList.size()+")"); // update01
+                triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")).append(":").append(blockStrategy.getTitle());
+                triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorFailStrategy")).append(":").append(failStrategy.getTitle());
 
 
                 // 3、trigger-valid
                 // 3、trigger-valid
                 if (triggerResult.getCode()==ReturnT.SUCCESS_CODE && CollectionUtils.isEmpty(addressList)) {
                 if (triggerResult.getCode()==ReturnT.SUCCESS_CODE && CollectionUtils.isEmpty(addressList)) {
                     triggerResult.setCode(ReturnT.FAIL_CODE);
                     triggerResult.setCode(ReturnT.FAIL_CODE);
-                    triggerMsgSb.append("<br>----------------------<br>").append("调度失败:").append("执行器地址为空");
+                    triggerMsgSb.append("<br>----------------------<br>").append(I18nUtil.getString("jobconf_trigger_address_empty"));
                 }
                 }
 
 
                 if (triggerResult.getCode() == ReturnT.SUCCESS_CODE) {
                 if (triggerResult.getCode() == ReturnT.SUCCESS_CODE) {
@@ -97,12 +99,12 @@ public class XxlJobTrigger {
 
 
                     // 4.2、trigger-run (route run / trigger remote executor)
                     // 4.2、trigger-run (route run / trigger remote executor)
                     triggerResult = runExecutor(triggerParam, address);     // update03
                     triggerResult = runExecutor(triggerParam, address);     // update03
-                    triggerMsgSb.append("<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
+                    triggerMsgSb.append("<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_run") +"<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
 
 
                     // 4.3、trigger (fail retry)
                     // 4.3、trigger (fail retry)
                     if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_RETRY) {
                     if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_RETRY) {
                         triggerResult = runExecutor(triggerParam, address);  // update04
                         triggerResult = runExecutor(triggerParam, address);  // update04
-                        triggerMsgSb.append("<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>失败重试<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
+                        triggerMsgSb.append("<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_retry") +"<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
                     }
                     }
                 }
                 }
 
 
@@ -134,17 +136,18 @@ public class XxlJobTrigger {
 
 
             ReturnT<String> triggerResult = new ReturnT<String>(null);
             ReturnT<String> triggerResult = new ReturnT<String>(null);
             StringBuffer triggerMsgSb = new StringBuffer();
             StringBuffer triggerMsgSb = new StringBuffer();
-            triggerMsgSb.append("调度机器:").append(IpUtil.getIp());
-            triggerMsgSb.append("<br>执行器-注册方式:").append( (group.getAddressType() == 0)?"自动注册":"手动录入" );
-            triggerMsgSb.append("<br>执行器-地址列表:").append(group.getRegistryList());
-            triggerMsgSb.append("<br>路由策略:").append(executorRouteStrategyEnum.getTitle());
-            triggerMsgSb.append("<br>阻塞处理策略:").append(blockStrategy.getTitle());
-            triggerMsgSb.append("<br>失败处理策略:").append(failStrategy.getTitle());
+            triggerMsgSb.append(I18nUtil.getString("jobconf_trigger_admin_adress")).append(":").append(IpUtil.getIp());
+            triggerMsgSb.append("<br>").append(I18nUtil.getString("jobconf_trigger_exe_regtype")).append(":")
+                    .append( (group.getAddressType() == 0)?I18nUtil.getString("jobgroup_field_addressType_0"):I18nUtil.getString("jobgroup_field_addressType_1") );
+            triggerMsgSb.append("<br>").append(I18nUtil.getString("jobconf_trigger_exe_regaddress")).append(":").append(group.getRegistryList());
+            triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")).append(":").append(executorRouteStrategyEnum.getTitle());
+            triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")).append(":").append(blockStrategy.getTitle());
+            triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorFailStrategy")).append(":").append(failStrategy.getTitle());
 
 
             // 3、trigger-valid
             // 3、trigger-valid
             if (triggerResult.getCode()==ReturnT.SUCCESS_CODE && CollectionUtils.isEmpty(addressList)) {
             if (triggerResult.getCode()==ReturnT.SUCCESS_CODE && CollectionUtils.isEmpty(addressList)) {
                 triggerResult.setCode(ReturnT.FAIL_CODE);
                 triggerResult.setCode(ReturnT.FAIL_CODE);
-                triggerMsgSb.append("<br>----------------------<br>").append("调度失败:").append("执行器地址为空");
+                triggerMsgSb.append("<br>----------------------<br>").append(I18nUtil.getString("jobconf_trigger_address_empty"));
             }
             }
 
 
             if (triggerResult.getCode() == ReturnT.SUCCESS_CODE) {
             if (triggerResult.getCode() == ReturnT.SUCCESS_CODE) {
@@ -164,12 +167,12 @@ public class XxlJobTrigger {
 
 
                 // 4.2、trigger-run (route run / trigger remote executor)
                 // 4.2、trigger-run (route run / trigger remote executor)
                 triggerResult = executorRouteStrategyEnum.getRouter().routeRun(triggerParam, addressList);
                 triggerResult = executorRouteStrategyEnum.getRouter().routeRun(triggerParam, addressList);
-                triggerMsgSb.append("<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
+                triggerMsgSb.append("<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_run") +"<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
 
 
                 // 4.3、trigger (fail retry)
                 // 4.3、trigger (fail retry)
                 if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_RETRY) {
                 if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_RETRY) {
                     triggerResult = executorRouteStrategyEnum.getRouter().routeRun(triggerParam, addressList);
                     triggerResult = executorRouteStrategyEnum.getRouter().routeRun(triggerParam, addressList);
-                    triggerMsgSb.append("<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>调度失败重试<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
+                    triggerMsgSb.append("<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_fail_retry") +"<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
                 }
                 }
             }
             }
 
 
@@ -202,7 +205,7 @@ public class XxlJobTrigger {
             runResult = new ReturnT<String>(ReturnT.FAIL_CODE, ""+e );
             runResult = new ReturnT<String>(ReturnT.FAIL_CODE, ""+e );
         }
         }
 
 
-        StringBuffer runResultSB = new StringBuffer("触发调度:");
+        StringBuffer runResultSB = new StringBuffer(I18nUtil.getString("jobconf_trigger_run") + ":");
         runResultSB.append("<br>address:").append(address);
         runResultSB.append("<br>address:").append(address);
         runResultSB.append("<br>code:").append(runResult.getCode());
         runResultSB.append("<br>code:").append(runResult.getCode());
         runResultSB.append("<br>msg:").append(runResult.getMsg());
         runResultSB.append("<br>msg:").append(runResult.getMsg());

+ 29 - 24
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java

@@ -5,6 +5,7 @@ import com.xxl.job.admin.core.model.XxlJobGroup;
 import com.xxl.job.admin.core.model.XxlJobInfo;
 import com.xxl.job.admin.core.model.XxlJobInfo;
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
+import com.xxl.job.admin.core.util.I18nUtil;
 import com.xxl.job.admin.dao.XxlJobGroupDao;
 import com.xxl.job.admin.dao.XxlJobGroupDao;
 import com.xxl.job.admin.dao.XxlJobInfoDao;
 import com.xxl.job.admin.dao.XxlJobInfoDao;
 import com.xxl.job.admin.dao.XxlJobLogDao;
 import com.xxl.job.admin.dao.XxlJobLogDao;
@@ -71,31 +72,31 @@ public class XxlJobServiceImpl implements XxlJobService {
 		// valid
 		// valid
 		XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup());
 		XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup());
 		if (group == null) {
 		if (group == null) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "请选择“执行器”");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_choose")+I18nUtil.getString("jobinfo_field_jobgroup")) );
 		}
 		}
 		if (!CronExpression.isValidExpression(jobInfo.getJobCron())) {
 		if (!CronExpression.isValidExpression(jobInfo.getJobCron())) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "请输入格式正确的“Cron”");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid") );
 		}
 		}
 		if (StringUtils.isBlank(jobInfo.getJobDesc())) {
 		if (StringUtils.isBlank(jobInfo.getJobDesc())) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "请输入“任务描述”");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) );
 		}
 		}
 		if (StringUtils.isBlank(jobInfo.getAuthor())) {
 		if (StringUtils.isBlank(jobInfo.getAuthor())) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "请输入“负责人”");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) );
 		}
 		}
 		if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
 		if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "路由策略非法");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy")+I18nUtil.getString("system_unvalid")) );
 		}
 		}
 		if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) {
 		if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "阻塞处理策略非法");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy")+I18nUtil.getString("system_unvalid")) );
 		}
 		}
 		if (ExecutorFailStrategyEnum.match(jobInfo.getExecutorFailStrategy(), null) == null) {
 		if (ExecutorFailStrategyEnum.match(jobInfo.getExecutorFailStrategy(), null) == null) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "失败处理策略非法");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorFailStrategy")+I18nUtil.getString("system_unvalid")) );
 		}
 		}
 		if (GlueTypeEnum.match(jobInfo.getGlueType()) == null) {
 		if (GlueTypeEnum.match(jobInfo.getGlueType()) == null) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "运行模式非法非法");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_gluetype")+I18nUtil.getString("system_unvalid")) );
 		}
 		}
 		if (GlueTypeEnum.BEAN==GlueTypeEnum.match(jobInfo.getGlueType()) && StringUtils.isBlank(jobInfo.getExecutorHandler())) {
 		if (GlueTypeEnum.BEAN==GlueTypeEnum.match(jobInfo.getGlueType()) && StringUtils.isBlank(jobInfo.getExecutorHandler())) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "请输入“JobHandler”");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+"JobHandler") );
 		}
 		}
 
 
 		// fix "\r" in shell
 		// fix "\r" in shell
@@ -110,10 +111,12 @@ public class XxlJobServiceImpl implements XxlJobService {
 				if (StringUtils.isNotBlank(childJobIdItem) && StringUtils.isNumeric(childJobIdItem)) {
 				if (StringUtils.isNotBlank(childJobIdItem) && StringUtils.isNumeric(childJobIdItem)) {
 					XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.valueOf(childJobIdItem));
 					XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.valueOf(childJobIdItem));
 					if (childJobInfo==null) {
 					if (childJobInfo==null) {
-						return new ReturnT<String>(ReturnT.FAIL_CODE, MessageFormat.format("子任务ID({0})无效", childJobIdItem));
+						return new ReturnT<String>(ReturnT.FAIL_CODE,
+								MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_not_found")), childJobIdItem));
 					}
 					}
 				} else {
 				} else {
-					return new ReturnT<String>(ReturnT.FAIL_CODE, MessageFormat.format("子任务ID({0})格式错误", childJobIdItem));
+					return new ReturnT<String>(ReturnT.FAIL_CODE,
+							MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_unvalid")), childJobIdItem));
 				}
 				}
 			}
 			}
 			jobInfo.setChildJobId(StringUtils.join(childJobIds, ","));
 			jobInfo.setChildJobId(StringUtils.join(childJobIds, ","));
@@ -122,7 +125,7 @@ public class XxlJobServiceImpl implements XxlJobService {
 		// add in db
 		// add in db
 		xxlJobInfoDao.save(jobInfo);
 		xxlJobInfoDao.save(jobInfo);
 		if (jobInfo.getId() < 1) {
 		if (jobInfo.getId() < 1) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "新增任务失败");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add")+I18nUtil.getString("system_fail")) );
 		}
 		}
 
 
 		// add in quartz
 		// add in quartz
@@ -140,7 +143,7 @@ public class XxlJobServiceImpl implements XxlJobService {
             } catch (SchedulerException e1) {
             } catch (SchedulerException e1) {
                 logger.error(e.getMessage(), e1);
                 logger.error(e.getMessage(), e1);
             }
             }
-            return new ReturnT<String>(ReturnT.FAIL_CODE, "新增任务失败:" + e.getMessage());
+            return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add")+I18nUtil.getString("system_fail"))+":" + e.getMessage());
         }
         }
 	}
 	}
 
 
@@ -149,22 +152,22 @@ public class XxlJobServiceImpl implements XxlJobService {
 
 
 		// valid
 		// valid
 		if (!CronExpression.isValidExpression(jobInfo.getJobCron())) {
 		if (!CronExpression.isValidExpression(jobInfo.getJobCron())) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "请输入格式正确的“Cron”");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid") );
 		}
 		}
 		if (StringUtils.isBlank(jobInfo.getJobDesc())) {
 		if (StringUtils.isBlank(jobInfo.getJobDesc())) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "请输入“任务描述”");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) );
 		}
 		}
 		if (StringUtils.isBlank(jobInfo.getAuthor())) {
 		if (StringUtils.isBlank(jobInfo.getAuthor())) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "请输入“负责人”");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) );
 		}
 		}
 		if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
 		if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "路由策略非法");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy")+I18nUtil.getString("system_unvalid")) );
 		}
 		}
 		if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) {
 		if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "阻塞处理策略非法");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy")+I18nUtil.getString("system_unvalid")) );
 		}
 		}
 		if (ExecutorFailStrategyEnum.match(jobInfo.getExecutorFailStrategy(), null) == null) {
 		if (ExecutorFailStrategyEnum.match(jobInfo.getExecutorFailStrategy(), null) == null) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "失败处理策略非法");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorFailStrategy")+I18nUtil.getString("system_unvalid")));
 		}
 		}
 
 
 		// ChildJobId valid
 		// ChildJobId valid
@@ -174,14 +177,16 @@ public class XxlJobServiceImpl implements XxlJobService {
 				if (StringUtils.isNotBlank(childJobIdItem) && StringUtils.isNumeric(childJobIdItem)) {
 				if (StringUtils.isNotBlank(childJobIdItem) && StringUtils.isNumeric(childJobIdItem)) {
 					XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.valueOf(childJobIdItem));
 					XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.valueOf(childJobIdItem));
 					if (childJobInfo==null) {
 					if (childJobInfo==null) {
-						return new ReturnT<String>(ReturnT.FAIL_CODE, MessageFormat.format("子任务ID({0})无效", childJobIdItem));
+						return new ReturnT<String>(ReturnT.FAIL_CODE,
+								MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_not_found")), childJobIdItem));
 					}
 					}
 					// avoid cycle relate
 					// avoid cycle relate
 					if (childJobInfo.getId() == jobInfo.getId()) {
 					if (childJobInfo.getId() == jobInfo.getId()) {
-						return new ReturnT<String>(ReturnT.FAIL_CODE, MessageFormat.format("子任务ID({0})不可与父任务重复", childJobIdItem));
+						return new ReturnT<String>(ReturnT.FAIL_CODE, MessageFormat.format(I18nUtil.getString("jobinfo_field_childJobId_limit"), childJobIdItem));
 					}
 					}
 				} else {
 				} else {
-					return new ReturnT<String>(ReturnT.FAIL_CODE, MessageFormat.format("子任务ID({0})格式错误", childJobIdItem));
+					return new ReturnT<String>(ReturnT.FAIL_CODE,
+							MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_unvalid")), childJobIdItem));
 				}
 				}
 			}
 			}
 			jobInfo.setChildJobId(StringUtils.join(childJobIds, ","));
 			jobInfo.setChildJobId(StringUtils.join(childJobIds, ","));
@@ -190,7 +195,7 @@ public class XxlJobServiceImpl implements XxlJobService {
 		// stage job info
 		// stage job info
 		XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId());
 		XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId());
 		if (exists_jobInfo == null) {
 		if (exists_jobInfo == null) {
-			return new ReturnT<String>(ReturnT.FAIL_CODE, "参数异常");
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_not_found")) );
 		}
 		}
 		//String old_cron = exists_jobInfo.getJobCron();
 		//String old_cron = exists_jobInfo.getJobCron();
 
 
@@ -271,7 +276,7 @@ public class XxlJobServiceImpl implements XxlJobService {
 	public ReturnT<String> triggerJob(int id) {
 	public ReturnT<String> triggerJob(int id) {
         XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
         XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
         if (xxlJobInfo == null) {
         if (xxlJobInfo == null) {
-        	return new ReturnT<String>(ReturnT.FAIL_CODE, "任务ID非法");
+        	return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_unvalid")) );
 		}
 		}
 
 
         String group = String.valueOf(xxlJobInfo.getJobGroup());
         String group = String.valueOf(xxlJobInfo.getJobGroup());

+ 43 - 2
xxl-job-admin/src/main/resources/i18n/message.properties

@@ -12,6 +12,7 @@ system_search=搜索
 system_status=状态
 system_status=状态
 system_opt=操作
 system_opt=操作
 system_please_input=请输入
 system_please_input=请输入
+system_please_choose=请选择
 system_success=成功
 system_success=成功
 system_fail=失败
 system_fail=失败
 system_add_suc=新增成功
 system_add_suc=新增成功
@@ -26,6 +27,8 @@ system_opt_suc=操作成功
 system_opt_fail=操作失败
 system_opt_fail=操作失败
 system_opt_edit=编辑
 system_opt_edit=编辑
 system_opt_del=删除
 system_opt_del=删除
+system_unvalid=非法
+system_not_found=不存在
 
 
 ## daterangepicker
 ## daterangepicker
 daterangepicker_ranges_recent_hour=最近一小时
 daterangepicker_ranges_recent_hour=最近一小时
@@ -58,7 +61,6 @@ dataTable_sLast=末页
 dataTable_sSortAscending=: 以升序排列此列
 dataTable_sSortAscending=: 以升序排列此列
 dataTable_sSortDescending=: 以降序排列此列
 dataTable_sSortDescending=: 以降序排列此列
 
 
-
 ## login
 ## login
 login_btn=登录
 login_btn=登录
 login_remember_me=记住密码
 login_remember_me=记住密码
@@ -70,6 +72,8 @@ login_password_empty=请输入登录密码
 login_password_lt_5=登录密码不应低于5位
 login_password_lt_5=登录密码不应低于5位
 login_success=登录成功
 login_success=登录成功
 login_fail=登录失败
 login_fail=登录失败
+login_param_empty=账号或密码为空
+login_param_unvalid=账号或密码错误
 
 
 ## logout
 ## logout
 logout_btn=注销
 logout_btn=注销
@@ -104,11 +108,13 @@ jobinfo_field_jobgroup=执行器
 jobinfo_field_jobdesc=任务描述
 jobinfo_field_jobdesc=任务描述
 jobinfo_field_gluetype=运行模式
 jobinfo_field_gluetype=运行模式
 jobinfo_field_executorparam=任务参数
 jobinfo_field_executorparam=任务参数
+jobinfo_field_cron_unvalid=请输入格式正确的Cron
 jobinfo_field_author=负责人
 jobinfo_field_author=负责人
 jobinfo_field_alarmemail=报警邮件
 jobinfo_field_alarmemail=报警邮件
 jobinfo_field_alarmemail_placeholder=请输入报警邮件,多个邮件地址则逗号分隔
 jobinfo_field_alarmemail_placeholder=请输入报警邮件,多个邮件地址则逗号分隔
 jobinfo_field_executorRouteStrategy=路由策略
 jobinfo_field_executorRouteStrategy=路由策略
 jobinfo_field_childJobId=子任务ID
 jobinfo_field_childJobId=子任务ID
+jobinfo_field_childJobId_limit=子任务ID({0})不可与父任务重复
 jobinfo_field_childJobId_placeholder=请输入子任务的任务ID,如存在多个则逗号分隔
 jobinfo_field_childJobId_placeholder=请输入子任务的任务ID,如存在多个则逗号分隔
 jobinfo_field_executorBlockStrategy=阻塞处理策略
 jobinfo_field_executorBlockStrategy=阻塞处理策略
 jobinfo_field_executorFailStrategy=失败处理策略
 jobinfo_field_executorFailStrategy=失败处理策略
@@ -122,6 +128,8 @@ jobinfo_opt_run=执行
 jobinfo_glue_remark=源码备注
 jobinfo_glue_remark=源码备注
 jobinfo_glue_remark_limit=源码备注长度限制为4~100
 jobinfo_glue_remark_limit=源码备注长度限制为4~100
 jobinfo_glue_rollback=版本回溯
 jobinfo_glue_rollback=版本回溯
+jobinfo_glue_jobid_unvalid=任务ID非法
+jobinfo_glue_gluetype_unvalid=该任务非GLUE模式
 
 
 ## job log
 ## job log
 joblog_name=调度日志
 joblog_name=调度日志
@@ -149,14 +157,18 @@ joblog_clean_type_6=清理一万条以前日志数据
 joblog_clean_type_7=清理三万条以前日志数据
 joblog_clean_type_7=清理三万条以前日志数据
 joblog_clean_type_8=清理十万条以前日志数据
 joblog_clean_type_8=清理十万条以前日志数据
 joblog_clean_type_9=清理所有日志数据
 joblog_clean_type_9=清理所有日志数据
+joblog_clean_type_unvalid=清理类型参数异常
 joblog_handleCode_200=成功
 joblog_handleCode_200=成功
 joblog_handleCode_500=失败
 joblog_handleCode_500=失败
 joblog_handleCode_501=失败重试
 joblog_handleCode_501=失败重试
 joblog_kill_log=终止任务
 joblog_kill_log=终止任务
+joblog_kill_log_limit=调度失败,无法终止日志
+joblog_kill_log_byman=人为操作主动终止
 joblog_rolling_log=执行日志
 joblog_rolling_log=执行日志
 joblog_rolling_log_refresh=刷新
 joblog_rolling_log_refresh=刷新
 joblog_rolling_log_triggerfail=任务发起调度失败,无法查看执行日志
 joblog_rolling_log_triggerfail=任务发起调度失败,无法查看执行日志
 joblog_rolling_log_failoften=终止请求Rolling日志,请求失败次数超上限,可刷新页面重新加载日志
 joblog_rolling_log_failoften=终止请求Rolling日志,请求失败次数超上限,可刷新页面重新加载日志
+joblog_logid_unvalid=日志ID非法
 
 
 ## job group
 ## job group
 jobgroup_name=执行器管理
 jobgroup_name=执行器管理
@@ -169,14 +181,43 @@ jobgroup_field_title=名称
 jobgroup_field_addressType=注册方式
 jobgroup_field_addressType=注册方式
 jobgroup_field_addressType_0=自动注册
 jobgroup_field_addressType_0=自动注册
 jobgroup_field_addressType_1=手动录入
 jobgroup_field_addressType_1=手动录入
+jobgroup_field_addressType_limit=手动录入注册方式,机器地址不可为空
 jobgroup_field_registryList=机器地址
 jobgroup_field_registryList=机器地址
+jobgroup_field_registryList_unvalid=机器地址格式非法
 jobgroup_field_registryList_placeholder=请输入执行器地址列表,多地址逗号分隔
 jobgroup_field_registryList_placeholder=请输入执行器地址列表,多地址逗号分隔
 jobgroup_field_appName_limit=限制以小写字母开头,由小写字母、数字和中划线组成
 jobgroup_field_appName_limit=限制以小写字母开头,由小写字母、数字和中划线组成
 jobgroup_field_appName_length=AppName长度限制为4~64
 jobgroup_field_appName_length=AppName长度限制为4~64
 jobgroup_field_title_length=名称长度限制为4~12
 jobgroup_field_title_length=名称长度限制为4~12
 jobgroup_field_order_digits=请输入整数
 jobgroup_field_order_digits=请输入整数
 jobgroup_field_orderrange=取值范围为1~1000
 jobgroup_field_orderrange=取值范围为1~1000
+jobgroup_del_limit_0=拒绝删除,该执行器使用中
+jobgroup_del_limit_1=拒绝删除, 系统至少保留一个执行器
+
+## job conf
+jobconf_fail_alarm=失败告警
+jobconf_fail_retry=失败重试
+jobconf_route_first=第一个
+jobconf_route_last=最后一个
+jobconf_route_round=轮询
+jobconf_route_random=随机
+jobconf_route_consistenthash=一致性HASH
+jobconf_route_lfu=最不经常使用
+jobconf_route_lru=最近最久未使用
+jobconf_route_failover=故障转移
+jobconf_route_busyover=忙碌转移
+jobconf_route_shard=分片广播
+jobconf_idleBeat=空闲检测
+jobconf_beat=心跳检测
+jobconf_monitor=调度中心监控报警
+jobconf_monitor_detail=监控告警明细
+jobconf_monitor_alarm_title=告警类型
+jobconf_monitor_alarm_type=调度失败
+jobconf_trigger_admin_adress=调度机器
+jobconf_trigger_exe_regtype=执行器-注册方式
+jobconf_trigger_exe_regaddress=执行器-地址列表
+jobconf_trigger_address_empty=调度失败:执行器地址为空
+jobconf_trigger_run=触发调度
 
 
 ## help
 ## help
 job_help=使用教程
 job_help=使用教程
-job_help_document=官方文档
+job_help_document=官方文档