diff --git a/src/main/java/net/mingsoft/config/I18NConfig.java b/src/main/java/net/mingsoft/config/I18NConfig.java
new file mode 100644
index 00000000..2175f21a
--- /dev/null
+++ b/src/main/java/net/mingsoft/config/I18NConfig.java
@@ -0,0 +1,31 @@
+package net.mingsoft.config;
+
+import com.jagregory.shiro.freemarker.ShiroTags;
+import freemarker.template.TemplateException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import java.io.IOException;
+
+/**
+ * 读取国际化配置,传递给freemker
+ */
+@Configuration
+public class I18NConfig {
+ @Autowired
+ protected freemarker.template.Configuration configuration;
+
+ @Value("${ms.local.default:zh_CN}")
+ private String defaultLocal;
+ @Value("${ms.local.messages:zh_CN,en_US}")
+ private String messages;
+
+ @PostConstruct
+ public void init() throws IOException, TemplateException {
+ configuration.setSharedVariable("localDefault",defaultLocal);
+ configuration.setSharedVariable("localMessages",messages.split(","));
+ }
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 35973503..ac1466fd 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -13,6 +13,9 @@ logging:
path: log #会在项目的根目录下生成log目录,里面会生成对应的日期目录,日期目录下面生成日志压缩包备份文件,默认按每10M分割一个日志文件,例如:log/2020-01/app-2020-01-03-18.1.log.gz(表示2020年1月3号下午六点的第一个备份),也可以根据实际情况写绝对路径,例如:d:/log
ms:
+ local:
+ default: zh_CN #默认语言
+ messages: zh_CN,en_US #全部语言
# scheme: https #解决使用代理服务器代理应用时标签解析域名依旧为http的问题
swagger:
enable: true #启用swagger文档,生产的时候务必关掉
diff --git a/src/main/webapp/WEB-INF/manager/include/local.ftl b/src/main/webapp/WEB-INF/manager/include/local.ftl
new file mode 100644
index 00000000..2e3242e1
--- /dev/null
+++ b/src/main/webapp/WEB-INF/manager/include/local.ftl
@@ -0,0 +1,39 @@
+<#list localMessages as item>
+
+#list>
+
\ No newline at end of file
diff --git a/src/main/webapp/static/locale/lang/base/en_US.js b/src/main/webapp/static/locale/lang/base/en_US.js
new file mode 100644
index 00000000..db74d72f
--- /dev/null
+++ b/src/main/webapp/static/locale/lang/base/en_US.js
@@ -0,0 +1,26 @@
+var base_en_US={
+ base:{
+ operate:{
+ save:'save',
+ back:'back',
+ edit:'edit',
+ back:'back',
+ cancel:'cancel',
+ del:'del',
+ rest:'rest',
+ search:'search',
+ filter:'filter',
+ action:'action',
+ confirm:'confirm'
+ },
+ message:{
+ success:'success',
+ tip:'tip',
+ confirmdel:'This operation will permanently delete the selection. Do you want to continue',
+ empty:'empty',
+ exist:'exist',
+ fail:'fail',
+ }
+ }
+}
+Object.assign(base_en_US,ELEMENT.lang.en)
diff --git a/src/main/webapp/static/locale/lang/base/zh_CN.js b/src/main/webapp/static/locale/lang/base/zh_CN.js
new file mode 100644
index 00000000..3be3d96c
--- /dev/null
+++ b/src/main/webapp/static/locale/lang/base/zh_CN.js
@@ -0,0 +1,26 @@
+var base_zh_CN={
+ base:{
+ operate:{
+ add:'新增',
+ save:'保存',
+ edit:'编辑',
+ back:'返回',
+ cancel:'取消',
+ del:'删除',
+ rest:'重置',
+ search:'查询',
+ filter:'塞选',
+ action:'操作',
+ confirm:'确定'
+ },
+ message:{
+ success:'成功',
+ tip:'提示',
+ confirmdel:'此操作将永久删除所选内容, 是否继续',
+ empty:'暂无数据',
+ exist:'已存在',
+ fail:'失败',
+ }
+ }
+}
+Object.assign(base_zh_CN,ELEMENT.lang.zhCN)
diff --git a/src/main/webapp/static/plugins/element-ui/2.13.0/locale/en_US.js b/src/main/webapp/static/plugins/element-ui/2.13.0/locale/en_US.js
new file mode 100644
index 00000000..24ef93e0
--- /dev/null
+++ b/src/main/webapp/static/plugins/element-ui/2.13.0/locale/en_US.js
@@ -0,0 +1,139 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define('element/locale/en', ['module', 'exports'], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(module, exports);
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(mod, mod.exports);
+ global.ELEMENT.lang = global.ELEMENT.lang || {};
+ global.ELEMENT.lang.en = mod.exports;
+ }
+})(this, function (module, exports) {
+ 'use strict';
+
+ exports.__esModule = true;
+ exports.default = {
+ el: {
+ colorpicker: {
+ confirm: 'OK',
+ clear: 'Clear'
+ },
+ datepicker: {
+ now: 'Now',
+ today: 'Today',
+ cancel: 'Cancel',
+ clear: 'Clear',
+ confirm: 'OK',
+ selectDate: 'Select date',
+ selectTime: 'Select time',
+ startDate: 'Start Date',
+ startTime: 'Start Time',
+ endDate: 'End Date',
+ endTime: 'End Time',
+ prevYear: 'Previous Year',
+ nextYear: 'Next Year',
+ prevMonth: 'Previous Month',
+ nextMonth: 'Next Month',
+ year: '',
+ month1: 'January',
+ month2: 'February',
+ month3: 'March',
+ month4: 'April',
+ month5: 'May',
+ month6: 'June',
+ month7: 'July',
+ month8: 'August',
+ month9: 'September',
+ month10: 'October',
+ month11: 'November',
+ month12: 'December',
+ week: 'week',
+ weeks: {
+ sun: 'Sun',
+ mon: 'Mon',
+ tue: 'Tue',
+ wed: 'Wed',
+ thu: 'Thu',
+ fri: 'Fri',
+ sat: 'Sat'
+ },
+ months: {
+ jan: 'Jan',
+ feb: 'Feb',
+ mar: 'Mar',
+ apr: 'Apr',
+ may: 'May',
+ jun: 'Jun',
+ jul: 'Jul',
+ aug: 'Aug',
+ sep: 'Sep',
+ oct: 'Oct',
+ nov: 'Nov',
+ dec: 'Dec'
+ }
+ },
+ select: {
+ loading: 'Loading',
+ noMatch: 'No matching data',
+ noData: 'No data',
+ placeholder: 'Select'
+ },
+ cascader: {
+ noMatch: 'No matching data',
+ loading: 'Loading',
+ placeholder: 'Select',
+ noData: 'No data'
+ },
+ pagination: {
+ goto: 'Go to',
+ pagesize: '/page',
+ total: 'Total {total}',
+ pageClassifier: ''
+ },
+ messagebox: {
+ title: 'Message',
+ confirm: 'OK',
+ cancel: 'Cancel',
+ error: 'Illegal input'
+ },
+ upload: {
+ deleteTip: 'press delete to remove',
+ delete: 'Delete',
+ preview: 'Preview',
+ continue: 'Continue'
+ },
+ table: {
+ emptyText: 'No Data',
+ confirmFilter: 'Confirm',
+ resetFilter: 'Reset',
+ clearFilter: 'All',
+ sumText: 'Sum'
+ },
+ tree: {
+ emptyText: 'No Data'
+ },
+ transfer: {
+ noMatch: 'No matching data',
+ noData: 'No data',
+ titles: ['List 1', 'List 2'], // to be translated
+ filterPlaceholder: 'Enter keyword', // to be translated
+ noCheckedFormat: '{total} items', // to be translated
+ hasCheckedFormat: '{checked}/{total} checked' // to be translated
+ },
+ image: {
+ error: 'FAILED'
+ },
+ pageHeader: {
+ title: 'Back' // to be translated
+ },
+ popconfirm: {
+ confirmButtonText: 'Yes',
+ cancelButtonText: 'No'
+ }
+ }
+ };
+ module.exports = exports['default'];
+});
\ No newline at end of file
diff --git a/src/main/webapp/static/plugins/element-ui/2.13.0/locale/zh_CN.js b/src/main/webapp/static/plugins/element-ui/2.13.0/locale/zh_CN.js
new file mode 100644
index 00000000..13383159
--- /dev/null
+++ b/src/main/webapp/static/plugins/element-ui/2.13.0/locale/zh_CN.js
@@ -0,0 +1,139 @@
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define('element/locale/zh-CN', ['module', 'exports'], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(module, exports);
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(mod, mod.exports);
+ global.ELEMENT.lang = global.ELEMENT.lang || {};
+ global.ELEMENT.lang.zhCN = mod.exports;
+ }
+})(this, function (module, exports) {
+ 'use strict';
+
+ exports.__esModule = true;
+ exports.default = {
+ el: {
+ colorpicker: {
+ confirm: '确定',
+ clear: '清空'
+ },
+ datepicker: {
+ now: '此刻',
+ today: '今天',
+ cancel: '取消',
+ clear: '清空',
+ confirm: '确定',
+ selectDate: '选择日期',
+ selectTime: '选择时间',
+ startDate: '开始日期',
+ startTime: '开始时间',
+ endDate: '结束日期',
+ endTime: '结束时间',
+ prevYear: '前一年',
+ nextYear: '后一年',
+ prevMonth: '上个月',
+ nextMonth: '下个月',
+ year: '年',
+ month1: '1 月',
+ month2: '2 月',
+ month3: '3 月',
+ month4: '4 月',
+ month5: '5 月',
+ month6: '6 月',
+ month7: '7 月',
+ month8: '8 月',
+ month9: '9 月',
+ month10: '10 月',
+ month11: '11 月',
+ month12: '12 月',
+ // week: '周次',
+ weeks: {
+ sun: '日',
+ mon: '一',
+ tue: '二',
+ wed: '三',
+ thu: '四',
+ fri: '五',
+ sat: '六'
+ },
+ months: {
+ jan: '一月',
+ feb: '二月',
+ mar: '三月',
+ apr: '四月',
+ may: '五月',
+ jun: '六月',
+ jul: '七月',
+ aug: '八月',
+ sep: '九月',
+ oct: '十月',
+ nov: '十一月',
+ dec: '十二月'
+ }
+ },
+ select: {
+ loading: '加载中',
+ noMatch: '无匹配数据',
+ noData: '无数据',
+ placeholder: '请选择'
+ },
+ cascader: {
+ noMatch: '无匹配数据',
+ loading: '加载中',
+ placeholder: '请选择',
+ noData: '暂无数据'
+ },
+ pagination: {
+ goto: '前往',
+ pagesize: '条/页',
+ total: '共 {total} 条',
+ pageClassifier: '页'
+ },
+ messagebox: {
+ title: '提示',
+ confirm: '确定',
+ cancel: '取消',
+ error: '输入的数据不合法!'
+ },
+ upload: {
+ deleteTip: '按 delete 键可删除',
+ delete: '删除',
+ preview: '查看图片',
+ continue: '继续上传'
+ },
+ table: {
+ emptyText: '暂无数据',
+ confirmFilter: '筛选',
+ resetFilter: '重置',
+ clearFilter: '全部',
+ sumText: '合计'
+ },
+ tree: {
+ emptyText: '暂无数据'
+ },
+ transfer: {
+ noMatch: '无匹配数据',
+ noData: '无数据',
+ titles: ['列表 1', '列表 2'],
+ filterPlaceholder: '请输入搜索内容',
+ noCheckedFormat: '共 {total} 项',
+ hasCheckedFormat: '已选 {checked}/{total} 项'
+ },
+ image: {
+ error: '加载失败'
+ },
+ pageHeader: {
+ title: '返回'
+ },
+ popconfirm: {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消'
+ }
+ }
+ };
+ module.exports = exports['default'];
+});
\ No newline at end of file