diff --git a/backend/app/pom.xml b/backend/app/pom.xml
new file mode 100644
index 0000000000..fdc5109db1
--- /dev/null
+++ b/backend/app/pom.xml
@@ -0,0 +1,90 @@
+
+
+ 4.0.0
+
+ io.metersphere
+ backend
+ ${revision}
+
+ app
+ ${revision}
+ app
+
+
+
+
+ io.metersphere
+ sdk
+ ${revision}
+
+
+
+ io.metersphere
+ api-test
+ ${revision}
+
+
+ io.metersphere
+ load-test
+ ${revision}
+
+
+ io.metersphere
+ project-management
+ ${revision}
+
+
+ io.metersphere
+ system-setting
+ ${revision}
+
+
+ io.metersphere
+ test-plan
+ ${revision}
+
+
+ io.metersphere
+ test-track
+ ${revision}
+
+
+ io.metersphere
+ ui-test
+ ${revision}
+
+
+ io.metersphere
+ workstation
+ ${revision}
+
+
+
+
+
+
+ src/main/java
+
+ **/*.properties
+ **/*.xml
+ **/*.json
+ **/*.tpl
+ **/*.js
+
+ false
+
+
+ src/main/resources
+
+ **/*
+
+ false
+
+
+
+
+
+
+
+
diff --git a/backend/services/app/src/main/java/io/metersphere/Application.java b/backend/app/src/main/java/io/metersphere/Application.java
similarity index 100%
rename from backend/services/app/src/main/java/io/metersphere/Application.java
rename to backend/app/src/main/java/io/metersphere/Application.java
diff --git a/backend/app/src/main/resources/application.properties b/backend/app/src/main/resources/application.properties
new file mode 100644
index 0000000000..ff96570910
--- /dev/null
+++ b/backend/app/src/main/resources/application.properties
@@ -0,0 +1,100 @@
+spring.application.name=metersphere
+server.port=8081
+management.server.port=7071
+#
+quartz.enabled=true
+quartz.scheduler-name=msScheduler
+#
+logging.file.path=/opt/metersphere/logs/metersphere
+# Hikari
+spring.datasource.type=com.zaxxer.hikari.HikariDataSource
+spring.datasource.hikari.maximum-pool-size=100
+spring.datasource.hikari.auto-commit=true
+spring.datasource.hikari.idle-timeout=10000
+spring.datasource.hikari.pool-name=DatebookHikariCP
+spring.datasource.hikari.max-lifetime=1800000
+spring.datasource.hikari.connection-timeout=30000
+spring.datasource.hikari.connection-test-query=SELECT 1
+#
+spring.datasource.quartz.url=${spring.datasource.url}
+spring.datasource.quartz.username=${spring.datasource.username}
+spring.datasource.quartz.password=${spring.datasource.password}
+spring.datasource.quartz.hikari.maximum-pool-size=50
+spring.datasource.quartz.hikari.auto-commit=true
+spring.datasource.quartz.hikari.idle-timeout=10000
+spring.datasource.quartz.hikari.pool-name=DatebookHikariCP
+spring.datasource.quartz.hikari.max-lifetime=1800000
+spring.datasource.quartz.hikari.connection-timeout=30000
+spring.datasource.quartz.hikari.connection-test-query=SELECT 1
+#
+# spring.kafka
+spring.kafka.bootstrap-servers=${kafka.bootstrap-servers}
+spring.kafka.consumer.group-id=metersphere_group_id
+spring.kafka.consumer.debug.group-id=metersphere_group_id_${random.uuid}
+spring.kafka.listener.missing-topics-fatal=false
+spring.kafka.producer.properties.max.request.size=32428800
+spring.kafka.producer.batch-size=16384
+spring.kafka.consumer.properties.max.partition.fetch.bytes=52428800
+# mybatis
+mybatis.configuration.cache-enabled=true
+mybatis.configuration.lazy-loading-enabled=false
+mybatis.configuration.aggressive-lazy-loading=true
+mybatis.configuration.multiple-result-sets-enabled=true
+mybatis.configuration.use-column-label=true
+mybatis.configuration.auto-mapping-behavior=full
+mybatis.configuration.default-statement-timeout=25000
+mybatis.configuration.map-underscore-to-camel-case=true
+# view
+spring.mvc.throw-exception-if-no-handler-found=true
+# ?? gzip ??
+server.compression.enabled=true
+server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css,text/javascript,image/jpeg
+server.compression.min-response-size=2048
+# flyway enable
+spring.flyway.enabled=false
+spring.flyway.baseline-on-migrate=true
+spring.flyway.locations=classpath:migration
+spring.flyway.table=metersphere_version
+spring.flyway.baseline-version=0
+spring.flyway.encoding=UTF-8
+spring.flyway.validate-on-migrate=false
+# jmeter kafka
+kafka.fields=
+kafka.timestamp=yyyy-MM-dd'T'HH:mm:ss.SSSZZ
+kafka.sample-filter=
+kafka.test-mode=info
+kafka.parse-all-req-headers=false
+kafka.parse-all-res-headers=false
+kafka.compression-type=
+kafka.batch-size=16384
+kafka.client-id=JMeterKafkaBackendListener
+kafka.connections-max-idle-ms=180000
+kafka.ssl.enabled=false
+kafka.ssl.key-password=
+kafka.ssl.keystore-location=
+kafka.ssl.keystore-password=
+kafka.ssl.truststore-location=
+kafka.ssl.truststore-password=
+kafka.ssl.enabled-protocols=TLSv1.2,TLSv1.1,TLSv1
+kafka.ssl.keystore-type=JKS
+kafka.ssl.protocol=TLS
+kafka.ssl.provider=
+kafka.ssl.truststore-type=
+# jmeter
+jmeter.home=/opt/jmeter
+quartz.thread-count=10
+quartz.properties.org.quartz.jobStore.acquireTriggersWithinLock=true
+# file upload
+spring.servlet.multipart.max-file-size=500MB
+spring.servlet.multipart.max-request-size=500MB
+# i18n
+spring.messages.basename=i18n/messages,i18n/api,i18n/load,i18n/project,i18n/system,i18n/plan,i18n/track,i18n/ui,i18n/workstation
+# actuator
+management.endpoints.web.exposure.include=*
+management.endpoints.enabled-by-default=false
+#spring.freemarker.checkTemplateLocation=false
+spring.session.timeout=43200s
+#
+# redisson
+spring.redis.redisson.file=file:/opt/metersphere/conf/redisson.yml
+spring.session.redis.repository-type=indexed
diff --git a/backend/services/app/src/main/resources/i18n/messages.properties b/backend/app/src/main/resources/i18n/messages.properties
similarity index 100%
rename from backend/services/app/src/main/resources/i18n/messages.properties
rename to backend/app/src/main/resources/i18n/messages.properties
diff --git a/backend/services/app/src/main/resources/i18n/messages_en_US.properties b/backend/app/src/main/resources/i18n/messages_en_US.properties
similarity index 100%
rename from backend/services/app/src/main/resources/i18n/messages_en_US.properties
rename to backend/app/src/main/resources/i18n/messages_en_US.properties
diff --git a/backend/services/app/src/main/resources/i18n/messages_zh_CN.properties b/backend/app/src/main/resources/i18n/messages_zh_CN.properties
similarity index 100%
rename from backend/services/app/src/main/resources/i18n/messages_zh_CN.properties
rename to backend/app/src/main/resources/i18n/messages_zh_CN.properties
diff --git a/backend/services/app/src/main/resources/i18n/messages_zh_TW.properties b/backend/app/src/main/resources/i18n/messages_zh_TW.properties
similarity index 100%
rename from backend/services/app/src/main/resources/i18n/messages_zh_TW.properties
rename to backend/app/src/main/resources/i18n/messages_zh_TW.properties
diff --git a/backend/services/app/src/main/resources/migration/3.0.0/ddl/V1__init.sql b/backend/app/src/main/resources/migration/3.0.0/ddl/V1__init.sql
similarity index 100%
rename from backend/services/app/src/main/resources/migration/3.0.0/ddl/V1__init.sql
rename to backend/app/src/main/resources/migration/3.0.0/ddl/V1__init.sql
diff --git a/backend/services/app/src/main/resources/migration/3.0.0/dml/V1_1__data.sql b/backend/app/src/main/resources/migration/3.0.0/dml/V1_1__data.sql
similarity index 100%
rename from backend/services/app/src/main/resources/migration/3.0.0/dml/V1_1__data.sql
rename to backend/app/src/main/resources/migration/3.0.0/dml/V1_1__data.sql
diff --git a/backend/framework/jmeter/pom.xml b/backend/framework/jmeter/pom.xml
index d598ef3314..54af1ff2b5 100644
--- a/backend/framework/jmeter/pom.xml
+++ b/backend/framework/jmeter/pom.xml
@@ -12,7 +12,7 @@
jmeter
${revision}
- ms-jmeter-core
+ jmeter
UTF-8
diff --git a/backend/framework/pom.xml b/backend/framework/pom.xml
index 20eb0c75dc..f25f011006 100644
--- a/backend/framework/pom.xml
+++ b/backend/framework/pom.xml
@@ -17,7 +17,6 @@
domain
jmeter
sdk
- xpack-interface
diff --git a/backend/framework/sdk/pom.xml b/backend/framework/sdk/pom.xml
index f506a1beda..08090d6621 100644
--- a/backend/framework/sdk/pom.xml
+++ b/backend/framework/sdk/pom.xml
@@ -193,7 +193,7 @@
-
+
io.metersphere
jmeter
diff --git a/backend/framework/xpack-interface/src/main/java/io/metersphere/xpack/display/dto/DisplayDTO.java b/backend/framework/xpack-interface/src/main/java/io/metersphere/xpack/display/dto/DisplayDTO.java
deleted file mode 100644
index 334ebbbece..0000000000
--- a/backend/framework/xpack-interface/src/main/java/io/metersphere/xpack/display/dto/DisplayDTO.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package io.metersphere.xpack.display.dto;
-
-import io.metersphere.domain.SystemParameter;
-import lombok.Getter;
-import lombok.Setter;
-import org.springframework.web.multipart.MultipartFile;
-
-@Getter
-@Setter
-public class DisplayDTO extends SystemParameter {
- private MultipartFile file;
- private String fileName;
-}
diff --git a/backend/framework/xpack-interface/src/main/java/io/metersphere/xpack/display/service/DisplayService.java b/backend/framework/xpack-interface/src/main/java/io/metersphere/xpack/display/service/DisplayService.java
deleted file mode 100644
index 70922757d7..0000000000
--- a/backend/framework/xpack-interface/src/main/java/io/metersphere/xpack/display/service/DisplayService.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package io.metersphere.xpack.display.service;
-
-import io.metersphere.xpack.display.dto.DisplayDTO;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.util.List;
-
-public interface DisplayService {
-
- void save(List requests, List files);
-
- List uiInfo(String type);
-}
diff --git a/backend/pom.xml b/backend/pom.xml
index fd064609a6..a6f923793f 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -16,6 +16,7 @@
framework
services
+ app
diff --git a/backend/services/app/pom.xml b/backend/services/api-test/pom.xml
similarity index 86%
rename from backend/services/app/pom.xml
rename to backend/services/api-test/pom.xml
index 4431c2a377..db37782eed 100644
--- a/backend/services/app/pom.xml
+++ b/backend/services/api-test/pom.xml
@@ -7,9 +7,9 @@
services
${revision}
- app
+ api-test
${revision}
- app
+ api-test
@@ -18,11 +18,7 @@
sdk
${revision}
-
- io.metersphere
- xpack-interface
- ${revision}
-
+
diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/domain/ApiDefinition.java b/backend/services/api-test/src/main/java/io/metersphere/api/domain/ApiDefinition.java
new file mode 100644
index 0000000000..9c988bcb16
--- /dev/null
+++ b/backend/services/api-test/src/main/java/io/metersphere/api/domain/ApiDefinition.java
@@ -0,0 +1,68 @@
+package io.metersphere.api.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ApiDefinition implements Serializable {
+ private String id;
+
+ private String projectId;
+
+ private String name;
+
+ private String method;
+
+ private String modulePath;
+
+ private String environmentId;
+
+ private String schedule;
+
+ private String status;
+
+ private String moduleId;
+
+ private String userId;
+
+ private Long createTime;
+
+ private Long updateTime;
+
+ private String protocol;
+
+ private String path;
+
+ private Integer num;
+
+ private String tags;
+
+ private String originalState;
+
+ private String createUser;
+
+ private String caseTotal;
+
+ private String caseStatus;
+
+ private String casePassingRate;
+
+ private Long deleteTime;
+
+ private String deleteUserId;
+
+ private Long order;
+
+ private String refId;
+
+ private String versionId;
+
+ private Boolean latest;
+
+ private Boolean toBeUpdated;
+
+ private Long toBeUpdateTime;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/backend/services/api-test/src/main/resources/i18n/api.properties b/backend/services/api-test/src/main/resources/i18n/api.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/api-test/src/main/resources/i18n/api_en_US.properties b/backend/services/api-test/src/main/resources/i18n/api_en_US.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/api-test/src/main/resources/i18n/api_zh_CN.properties b/backend/services/api-test/src/main/resources/i18n/api_zh_CN.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/api-test/src/main/resources/i18n/api_zh_TW.properties b/backend/services/api-test/src/main/resources/i18n/api_zh_TW.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/app/src/main/resources/application.properties b/backend/services/app/src/main/resources/application.properties
deleted file mode 100644
index 1863986876..0000000000
--- a/backend/services/app/src/main/resources/application.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-spring.application.name=metersphere
-server.port=8081
-management.server.port=7071
-#
-quartz.enabled=true
-quartz.scheduler-name=msScheduler
-#
-logging.file.path=/opt/metersphere/logs/metersphere
-
-# flyway
-spring.flyway.enabled=true
-spring.flyway.baseline-on-migrate=true
-spring.flyway.locations=classpath:migration
-spring.flyway.table=metersphere_version
-spring.flyway.baseline-version=0
-spring.flyway.encoding=UTF-8
-spring.flyway.validate-on-migrate=false
\ No newline at end of file
diff --git a/backend/services/load-test/pom.xml b/backend/services/load-test/pom.xml
new file mode 100644
index 0000000000..89fad73d8a
--- /dev/null
+++ b/backend/services/load-test/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ io.metersphere
+ services
+ ${revision}
+
+ load-test
+ ${revision}
+ load-test
+
+
+
+
+ io.metersphere
+ sdk
+ ${revision}
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.properties
+ **/*.xml
+ **/*.json
+ **/*.tpl
+ **/*.js
+
+ false
+
+
+ src/main/resources
+
+ **/*
+
+ false
+
+
+
+
+
+
+
+
diff --git a/backend/services/load-test/src/main/java/io/metersphere/load/domain/LoadTest.java b/backend/services/load-test/src/main/java/io/metersphere/load/domain/LoadTest.java
new file mode 100644
index 0000000000..209aba0931
--- /dev/null
+++ b/backend/services/load-test/src/main/java/io/metersphere/load/domain/LoadTest.java
@@ -0,0 +1,44 @@
+package io.metersphere.load.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class LoadTest implements Serializable {
+ private String id;
+
+ private String projectId;
+
+ private String name;
+
+ private String description;
+
+ private Long createTime;
+
+ private Long updateTime;
+
+ private String status;
+
+ private String testResourcePoolId;
+
+ private String userId;
+
+ private Integer num;
+
+ private String createUser;
+
+ private Integer scenarioVersion;
+
+ private String scenarioId;
+
+ private Long order;
+
+ private String versionId;
+
+ private String refId;
+
+ private Boolean latest;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/backend/services/load-test/src/main/resources/i18n/load.properties b/backend/services/load-test/src/main/resources/i18n/load.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/load-test/src/main/resources/i18n/load_en_US.properties b/backend/services/load-test/src/main/resources/i18n/load_en_US.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/load-test/src/main/resources/i18n/load_zh_CN.properties b/backend/services/load-test/src/main/resources/i18n/load_zh_CN.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/load-test/src/main/resources/i18n/load_zh_TW.properties b/backend/services/load-test/src/main/resources/i18n/load_zh_TW.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/pom.xml b/backend/services/pom.xml
index 65f657ab05..cea307cb79 100644
--- a/backend/services/pom.xml
+++ b/backend/services/pom.xml
@@ -13,5 +13,15 @@
services
${revision}
+
+ api-test
+ load-test
+ project-management
+ system-setting
+ test-plan
+ test-track
+ ui-test
+ workstation
+
diff --git a/backend/services/project-management/pom.xml b/backend/services/project-management/pom.xml
new file mode 100644
index 0000000000..f3a46a49e0
--- /dev/null
+++ b/backend/services/project-management/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ io.metersphere
+ services
+ ${revision}
+
+ project-management
+ ${revision}
+ project-management
+
+
+
+
+ io.metersphere
+ sdk
+ ${revision}
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.properties
+ **/*.xml
+ **/*.json
+ **/*.tpl
+ **/*.js
+
+ false
+
+
+ src/main/resources
+
+ **/*
+
+ false
+
+
+
+
+
+
+
+
diff --git a/backend/services/project-management/src/main/java/io/metersphere/project/domain/Project.java b/backend/services/project-management/src/main/java/io/metersphere/project/domain/Project.java
new file mode 100644
index 0000000000..95dbcd52cf
--- /dev/null
+++ b/backend/services/project-management/src/main/java/io/metersphere/project/domain/Project.java
@@ -0,0 +1,50 @@
+package io.metersphere.project.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class Project implements Serializable {
+ private String id;
+
+ private String workspaceId;
+
+ private String name;
+
+ private String description;
+
+ private Long createTime;
+
+ private Long updateTime;
+
+ private String tapdId;
+
+ private String jiraKey;
+
+ private String zentaoId;
+
+ private String azureDevopsId;
+
+ private String caseTemplateId;
+
+ private String issueTemplateId;
+
+ private String createUser;
+
+ private String systemId;
+
+ private String azureFilterId;
+
+ private String platform;
+
+ private Boolean thirdPartTemplate;
+
+ private Boolean versionEnable;
+
+ private String issueConfig;
+
+ private String apiTemplateId;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/backend/services/project-management/src/main/resources/i18n/project.properties b/backend/services/project-management/src/main/resources/i18n/project.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/project-management/src/main/resources/i18n/project_en_US.properties b/backend/services/project-management/src/main/resources/i18n/project_en_US.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/project-management/src/main/resources/i18n/project_zh_CN.properties b/backend/services/project-management/src/main/resources/i18n/project_zh_CN.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/project-management/src/main/resources/i18n/project_zh_TW.properties b/backend/services/project-management/src/main/resources/i18n/project_zh_TW.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/system-setting/pom.xml b/backend/services/system-setting/pom.xml
new file mode 100644
index 0000000000..7460e39968
--- /dev/null
+++ b/backend/services/system-setting/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ io.metersphere
+ services
+ ${revision}
+
+ system-setting
+ ${revision}
+ system-setting
+
+
+
+
+ io.metersphere
+ sdk
+ ${revision}
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.properties
+ **/*.xml
+ **/*.json
+ **/*.tpl
+ **/*.js
+
+ false
+
+
+ src/main/resources
+
+ **/*
+
+ false
+
+
+
+
+
+
+
+
diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/domain/User.java b/backend/services/system-setting/src/main/java/io/metersphere/system/domain/User.java
new file mode 100644
index 0000000000..5a11cb9431
--- /dev/null
+++ b/backend/services/system-setting/src/main/java/io/metersphere/system/domain/User.java
@@ -0,0 +1,40 @@
+package io.metersphere.system.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class User implements Serializable {
+ private String id;
+
+ private String name;
+
+ private String email;
+
+ private String password;
+
+ private String status;
+
+ private Long createTime;
+
+ private Long updateTime;
+
+ private String language;
+
+ private String lastWorkspaceId;
+
+ private String phone;
+
+ private String source;
+
+ private String lastProjectId;
+
+ private String createUser;
+
+ private String platformInfo;
+
+ private String seleniumServer;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/backend/services/system-setting/src/main/resources/i18n/system.properties b/backend/services/system-setting/src/main/resources/i18n/system.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/system-setting/src/main/resources/i18n/system_en_US.properties b/backend/services/system-setting/src/main/resources/i18n/system_en_US.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/system-setting/src/main/resources/i18n/system_zh_CN.properties b/backend/services/system-setting/src/main/resources/i18n/system_zh_CN.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/system-setting/src/main/resources/i18n/system_zh_TW.properties b/backend/services/system-setting/src/main/resources/i18n/system_zh_TW.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/test-plan/pom.xml b/backend/services/test-plan/pom.xml
new file mode 100644
index 0000000000..f2939c35a3
--- /dev/null
+++ b/backend/services/test-plan/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ io.metersphere
+ services
+ ${revision}
+
+ test-plan
+ ${revision}
+ test-plan
+
+
+
+
+ io.metersphere
+ sdk
+ ${revision}
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.properties
+ **/*.xml
+ **/*.json
+ **/*.tpl
+ **/*.js
+
+ false
+
+
+ src/main/resources
+
+ **/*
+
+ false
+
+
+
+
+
+
+
+
diff --git a/backend/services/test-plan/src/main/java/io/metersphere/plan/domain/TestPlan.java b/backend/services/test-plan/src/main/java/io/metersphere/plan/domain/TestPlan.java
new file mode 100644
index 0000000000..f227978826
--- /dev/null
+++ b/backend/services/test-plan/src/main/java/io/metersphere/plan/domain/TestPlan.java
@@ -0,0 +1,46 @@
+package io.metersphere.plan.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TestPlan implements Serializable {
+ private String id;
+
+ private String workspaceId;
+
+ private String reportId;
+
+ private String name;
+
+ private String description;
+
+ private String status;
+
+ private String stage;
+
+ private Long createTime;
+
+ private Long updateTime;
+
+ private Long plannedStartTime;
+
+ private Long plannedEndTime;
+
+ private Long actualStartTime;
+
+ private Long actualEndTime;
+
+ private String creator;
+
+ private String projectId;
+
+ private Integer executionTimes;
+
+ private Boolean automaticStatusUpdate;
+
+ private Boolean repeatCase;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/backend/services/test-plan/src/main/resources/i18n/plan.properties b/backend/services/test-plan/src/main/resources/i18n/plan.properties
new file mode 100644
index 0000000000..87d88014b4
--- /dev/null
+++ b/backend/services/test-plan/src/main/resources/i18n/plan.properties
@@ -0,0 +1,74 @@
+test_case_exist=
+before_delete_plan=
+test_case_node_level_tip=
+test_case_node_level=
+test_case_module_not_null=
+test_case_create_module_fail=
+test_case_import_template_name=
+test_case_import_template_sheet=
+module_not_null=
+user_not_exists=
+test_case_already_exists=
+parse_data_error=
+missing_header_information=
+number=
+row=
+error=
+incorrect_format=
+test_case_priority_validate=
+test_case_method_validate=
+test_case_name=
+test_case_module=
+test_case_type=
+test_case_maintainer=
+test_case_priority=
+test_case_method=
+test_case_prerequisite=
+test_case_remark=
+test_case_step_desc=
+test_case_step_result=
+test_case=
+user=
+user_import_template_name=
+user_import_template_sheet=
+user_import_format_wrong=
+user_import_id_is_repeat=
+user_import_email_is_repeat=
+user_import_password_format_wrong=
+user_import_phone_format_wrong=
+user_import_email_format_wrong=
+user_import_organization_not_fond=
+user_import_workspace_not_fond=
+org_admin=
+org_member=
+test_manager=
+tester=
+read_only_user=
+module=
+preconditions_optional=
+remark_optional=
+do_not_modify_header_order=
+module_created_automatically=
+options=
+options_yes=
+options_no=
+required=
+password_format_is_incorrect=
+please_input_workspace_member=
+test_case_report_template_repeat=
+custom_field_already=
+id_required=
+id_repeat_in_table=
+template_already=
+expect_name_exists=
+id_not_rightful=
+mock_warning=
+invalid_parameter=
+workspace_template_settings_issue=
+zentao_test_type_error=
+issue_jira_info_error=
+case_status_not_exist=
+jira_auth_error=
+# issue template copy
+target_issue_template_not_checked=
+source_issue_template_is_empty=
diff --git a/backend/services/test-plan/src/main/resources/i18n/plan_en_US.properties b/backend/services/test-plan/src/main/resources/i18n/plan_en_US.properties
new file mode 100644
index 0000000000..f07b1c41cc
--- /dev/null
+++ b/backend/services/test-plan/src/main/resources/i18n/plan_en_US.properties
@@ -0,0 +1,382 @@
+#commons
+error_lang_invalid=Invalid language parameter
+file_cannot_be_null=File cannot be empty!
+cannot_be_null=\tCannot be empty
+number=Number
+row=row
+error=error
+connection_failed=Connection failed
+connection_timeout=Connection timeout
+delete_fail=Delete fail
+start_engine_fail=Start fail
+upload_fail=Upload fail
+invalid_parameter=Invalid parameter!
+name_already_exists=Name already exists
+resource_not_exist=The resource does not exist or has been deleted
+upload_file_fail_get_file_path_fail=Failed to upload the file, failed to get the file path
+#user related
+user_email_already_exists=User email already exists
+user_id_is_null=User ID cannot be null
+user_name_is_null=User name cannot be null
+user_email_is_null=User email cannot be null
+password_is_null=Password cannot be null
+user_id_already_exists=User ID already exists
+password_modification_failed=The old password is wrong. Please re-enter it
+cannot_delete_current_user=Cannot delete the user currently logged in
+user_already_exists=The user already exists in the current member list
+cannot_remove_current=Unable to remove the currently logged in user
+password_is_incorrect=Incorrect password or username
+user_not_exist=user does not exist:
+user_has_been_disabled=the user has been disabled.
+excessive_attempts=Excessive attempts
+user_locked=the user has been locked.
+user_expires=user expires.
+not_authorized=not authorized.
+login_fail=Login fail
+user_apikey_limit=Can have up to 5 api keys
+please_logout_current_user=Please logout current user first
+#load test
+edit_load_test_not_found=Cannot edit test, test not found=
+run_load_test_not_found=Cannot run test, test not found=
+run_load_test_file_not_found=Unable to run test, unable to get test file meta information, test ID=
+run_load_test_file_content_not_found=Cannot run test, cannot get test file content, test ID=
+run_load_test_file_init_error=Failed to run the test, please go to [Settings-System-System Parameter Setting] to check the current site configuration. For details, see https://metersphere.io/docs/faq/load_ test/#url
+load_test_is_running=Load test is running, please wait.
+load_test_kafka_invalid=Kafka is not available, please check the configuration
+cannot_edit_load_test_running=Cannot modify the running test
+test_not_found=Test cannot be found:
+test_not_running=Test is not running
+load_test_already_exists=Duplicate load test name
+load_test_name_length=The length of the test name exceeds the limit
+no_nodes_message=No node message
+duplicate_node_ip=Duplicate IPs
+duplicate_node_port=Duplicate Ports
+duplicate_node_ip_port=Duplicate IPs & Ports
+max_thread_insufficient=The number of concurrent users exceeds
+related_case_del_fail_prefix=Connected to
+related_case_del_fail_suffix=TestCase, please disassociate first
+jmx_content_valid=JMX content is invalid
+container_delete_fail=The container failed to stop, please try again
+load_test_report_file_not_exist=There is no JTL file in the current report, please wait or execute it again to get it
+#workspace
+workspace_name_is_null=Workspace name cannot be null
+workspace_name_already_exists=The workspace name already exists
+workspace_does_not_belong_to_user=The current workspace does not belong to the current user
+workspace_not_exists=Workspace is not exists
+#test resource pool
+test_resource_pool_id_is_null=Test Resource Pool ID cannot be null
+test_resource_pool_name_is_null=Test Resource Pool name cannot be null
+test_resource_pool_name_already_exists=The test resource pool name already exists
+load_test=Load Test
+test_resource_pool_is_use=This resource pool is in use and cannot be deleted
+only_one_k8s=Only one K8S can be added
+test_resource_pool_not_exists=Test resource pool not exists
+test_resource_pool_invalid=Test resource pool invalid
+#project
+project_name_is_null=Project name cannot be null
+project_name_already_exists=The project name already exists
+project_file_already_exists=The file already exists
+project_file_in_use=use this file and cannot be deleted.
+#organization
+organization_name_is_null=organization name cannot be null
+organization_name_already_exists=The organization name already exists
+organization_does_not_belong_to_user=The current organization does not belong to the current user
+organization_id_is_null=Organization ID cannot be null
+#api
+api_load_script_error=Load script error
+illegal_xml_format=illegal XML format
+api_report_is_null="Report is null, can't update"
+api_test_environment_already_exists="Api test environment already exists"
+api_test=API Test
+#test case
+test_case_node_level=level
+test_case_node_level_tip=The node tree maximum depth is
+test_case_module_not_null=The owned module cannot be empty
+test_case_create_module_fail=Failed to create module
+test_case_import_template_name=Test_case_templates
+test_case_import_template_sheet=Template
+module_not_null=The module must not be blank
+user_not_exists=The user in this project is not exists
+test_case_already_exists=The test case in this project is exists
+parse_data_error=Parse data error
+missing_header_information=Missing header information
+test_case_exist=A test case already exists under this project:
+node_deep_limit=The node depth does not exceed 8 layers!
+before_delete_plan=There is an associated test case under this plan, please unlink it first!
+incorrect_format=\tincorrect format
+test_case_step_model_validate=\tmust be TEXT, STEP
+test_case_priority_validate=\tmust be P0, P1, P2, P3
+test_case_method_validate=\tmust be manual, auto
+test_case_name=Name
+test_case_type=Type
+test_case_maintainer=Maintainer
+test_case_priority=Priority
+test_case_method=method
+test_case_prerequisite=Prerequisite
+test_case_remark=Remark
+test_case_step_desc=Step description
+test_case_step_result=Step result
+test_case_module=Module
+test_case=Case
+user=User
+user_import_template_name=User import templates
+user_import_template_sheet=templates
+user_import_format_wrong=input error
+user_import_id_is_repeat=Id repeat
+user_import_email_is_repeat=E-mail repeat
+user_import_password_format_wrong=Wrong password format
+user_import_phone_format_wrong=Wrong phone format
+user_import_email_format_wrong=Wrong email format
+user_import_organization_not_fond=Organization is not found
+user_import_workspace_not_fond=Workspace is not found
+org_admin=Organization manager
+org_member=Organization member
+test_manager=Test manager
+tester=Tester
+read_only_user=Read-only user
+module=Module
+num_needed_modify_testcase=ID is needed when modifying testcase
+num_needless_create_testcase=ID is needless when creating testcase
+tag_tip_pattern=Labels should be separated by semicolons or commas
+preconditions_optional=Preconditions optional
+remark_optional=Remark optional
+do_not_modify_header_order=Do not modify the header order
+module_created_automatically=If there is no such module, will be created automatically
+options=options
+options_yes=Yes
+options_no=No
+required=Required
+password_format_is_incorrect=Valid password: 8-30 digits, English upper and lower case letters + numbers + special characters (optional)
+please_input_project_member=Please input project merber's number
+test_case_report_template_repeat=The workspace has the same name template
+plan_name_already_exists=Test plan name already exists
+test_case_already_exists_excel=There are duplicate test cases in the import file
+test_case_module_already_exists=The module name already exists at the same level
+api_test_name_already_exists=Test name already exists
+functional_method_tip=Functional test not support auto method
+custom_num_is_exist=Use case custom ID already exists
+custom_num_is_not_exist=Use case custom ID not exists
+id_required=ID required
+id_repeat_in_table=ID is repeat in table
+step_model_tip=Step description fill in STEP, text description please fill in TEXT (not required)
+case_status_not_exist=The use case status must be Prepare, Underway way and Completed
+issue_project_not_exist=ID does not exist or other errors
+tapd_project_not_exist=The associated TAPD item ID does not exist
+zentao_get_project_builds_fail=Get Affecting Version Errors
+zentao_project_id_not_exist=The associated Zen Tao ID does not exist or other errors
+#ldap
+ldap_url_is_null=LDAP address is empty
+ldap_dn_is_null=LDAP binding DN is empty
+ldap_ou_is_null=LDAP parameter OU is empty
+ldap_password_is_null=LDAP password is empty
+ldap_connect_fail=Connection LDAP failed
+ldap_connect_fail_user=Connection LDAP failed, wrong DN or password bound
+ldap_user_filter_is_null=LDAP user filter is empty
+ldap_user_mapping_is_null=LDAP user mapping is empty
+authentication_failed=User authentication failed,wrong user name or password
+user_not_found_or_not_unique=User does not exist or is not unique
+find_more_user=Multiple users found
+ldap_authentication_not_enabled=LDAP authentication is not enabled
+login_fail_email_null=Login failed, user mailbox is empty
+login_fail_ou_error=Login failed, please check the user OU
+login_fail_filter_error=Login failed, please check the user filter
+check_ldap_mapping=Check LDAP attribute mapping
+ldap_mapping_value_null=LDAP user attribute mapping field is empty
+oauth_mapping_config_error=OAuth2 attribute mapping misconfiguration
+oauth_mapping_value_null=OAuth2 user attribute mapping field is empty
+#quota
+quota_project_excess_ws_api=The total number of interface tests for a project cannot exceed the workspace quota
+quota_project_excess_ws_performance=The total number of performance tests for a project cannot exceed the workspace quota
+quota_project_excess_ws_max_threads=The maximum concurrent number of projects cannot exceed the quota of the workspace
+quota_project_excess_ws_max_duration=The stress test duration of the project cannot exceed the workspace quota
+quota_project_excess_ws_resource_pool=The resource pool of the project cannot exceed the scope of the resource pool of the workspace
+quota_project_excess_ws_vum_total=The sum of the total number of vums of the project cannot exceed the workspace quota
+quota_vum_used_gt_vum_total=The total number of vum cannot be less than the number of consumed vum
+quota_api_excess_workspace=The number of interface tests exceeds the workspace quota
+quota_api_excess_project=The number of interface tests exceeds the project limit
+quota_performance_excess_workspace=The number of performance tests exceeds the workspace quota
+quota_performance_excess_project=The number of performance tests exceeds the project limit
+quota_max_threads_excess_workspace=The maximum number of concurrent threads exceeds the workspace quota
+quota_max_threads_excess_project=The maximum concurrent number exceeds the project limit
+quota_duration_excess_workspace=The stress test duration exceeds the work space quota
+quota_duration_excess_project=The stress test time exceeds the project limit
+quota_member_excess_workspace=The number of members exceeds the workspace quota
+quota_member_excess_project=The number of members exceeds the project quota
+quota_project_excess_project=Number of projects exceeds workspace quota
+quota_vum_used_excess_workspace=The amount of vum consumed exceeds the workspace quota
+quota_vum_used_excess_project=The amount of vum consumed exceeds the project quota
+import_xmind_count_error=The number of use cases imported into the mind map cannot exceed 800
+import_xmind_not_found=Test case not found
+license_valid_license_error=Authorization authentication failed
+test_review_task_notice=Test review task notice
+swagger_url_scheduled_import_notification=SwaggerUrl Scheduled import notification
+test_track.length_less_than=The title is too long, the length must be less than
+# check owner
+check_owner_project=The current user does not have permission to operate this project
+check_owner_test=The current user does not have permission to operate this test
+check_owner_case=The current user does not have permission to operate this use case
+check_owner_plan=The current user does not have permission to operate this plan
+check_owner_review=The current user does not have permission to operate this review
+check_owner_comment=The current user does not have permission to manipulate this comment
+check_owner_workspace=The current user does not have permission to operate this workspace
+upload_content_is_null=Imported content is empty
+test_plan_notification=Test plan notification
+task_defect_notification=Task defect notification
+task_notification_=Timing task result notification
+api_definition_url_not_repeating=The interface request address already exists
+api_definition_name_not_repeating=The same name-url combination already exists
+task_notification_jenkins=Jenkins Task notification
+task_notification=Result notification
+message_task_already_exists=Task recipient already exists
+#automation
+automation_name_already_exists=the scenario already exists in the module of the same project
+automation_exec_info=There are no test steps to execute
+delete_check_reference_by=be referenced by Scenario
+not_execute=Not execute
+execute_not_pass=Not pass
+execute_pass=Pass
+import_fail_custom_num_exists=import fail, custom num is exists
+#authsource
+authsource_name_already_exists=Authentication source name already exists
+authsource_name_is_null=Authentication source name cannot be empty
+authsource_configuration_is_null=Authentication source configuration cannot be empty
+mobile_phone_number_cannot_be_empty=When the receiving mode is pin and enterprise wechat: the user's mobile phone number cannot be empty
+custom_field_already=A feild already exists under this workspace:
+template_already=A template already exists under this workspace:
+expect_name_exists=Expect name is exists
+ssl_password_error=The authentication password is wrong, please re-enter the password
+ssl_file_error=Failed to load the certification file, please check the certification file
+#log
+api_definition=Api definition
+api_definition_case=Api definition case
+api_automation_schedule=Api automation schedule
+api_automation=Api automation
+api_automation_report=Test Report
+track_test_case=Test case
+track_test_case_review=Case review
+track_test_plan=Test plan
+track_test_plan_schedule=Test plan schedule
+track_bug=Defect management
+track_report=Report
+performance_test=Performance test
+performance_test_report=Performance test report
+system_user=System user
+system_organization=System organization
+system_workspace=workspace
+system_test_resource=System test resource
+system_parameter_setting=System parameter setting
+system_quota_management=System Quota management
+system_authorization_management=System authorization management
+organization_member=Organization member
+organization_workspace=Organization workspace
+project_project_member=Project member
+workspace_service_integration=Workspace service integration
+workspace_message_settings=Workspace message settings
+workspace_member=Workspace member
+workspace_template_settings_field=Workspace template settings field
+workspace_template_settings_case=Workspace template settings case
+workspace_template_settings_issue=Workspace template settings issue
+project_project_manager=Project project manager
+project_project_jar=Project project jar
+project_environment_setting=Project environment setting
+project_file_management=Project file management
+personal_information_personal_settings=Personal information personal settings
+personal_information_apikeys=Personal information API Keys
+auth_title=Auth
+group_permission=Group
+test_case_status_prepare=Prepare
+test_case_status_again=Again
+test_case_status_running=Running
+test_case_status_finished=Finished
+test_case_status_error=Error
+test_case_status_success=Success
+test_case_status_trash=Trash
+test_case_status_saved=Saved
+connection_expired=The connection has expired, please get it again
+# track home
+api_case=Api
+performance_case=Performance
+scenario_case=Scenario
+scenario_name_is_null=Scenario name cannot be empty
+create_user=Create user
+test_case_status=Case status
+id_not_rightful=ID is not rightful
+project_reference_multiple_plateform=Projects point to multiple third-party platforms
+# mock
+mock_warning=No matching Mock expectation was found
+zentao_test_type_error=invalid Zentao request
+#项目报告
+enterprise_test_report=Enterprise report
+count=Count
+cannot_find_project=Cannot find project
+project_repeatable_is_false=Url repeatable not open
+#环境组
+null_environment_group_name=Environment group name is null
+environment_group_name=Environment group name
+environment_group_exist=already exists
+environment_group_has_duplicate_project=Environment group has duplicate project
+#误报库
+error_report_library=Error report
+issue_jira_info_error=Check the service integration information or Jira project ID
+error_code_is_unique=Error code is not unique
+no_version_exists=version not exists
+jira_auth_error=Account name or password (Token) is wrong
+jira_auth_url_error=The test connection failed, please check whether the Jira address is correct
+#ui 指令校驗
+param_error=Param Error
+is_null=can't be null
+url_is_null=URL can't be null
+frame_index_is_null=frame index can't be null
+element_is_null=element can't be null
+locator_is_null=locator can't be null
+coord=coord
+input_content=input
+subitem_type=subitem type
+subitem=subitem
+varname=variable
+varname_or_value=variable or value
+attributeName=attribute name
+webtitle_varname=title varname
+webhandle_varname=handle varname
+cant_be_negative=can't be negative
+expression=expression
+times=times
+command=command
+extract_type=extract type
+cmdValidation=validation
+cmdValidateValue=validate value
+cmdValidateText=validate text
+cmdValidateDropdown=validate dropdown
+cmdValidateElement=validate element
+cmdValidateTitle=validate title
+cmdOpen=open
+cmdSelectWindow=select window
+cmdSetWindowSize=set window size
+cmdSelectFrame=select frame
+cmdDialog=dialog operation
+cmdDropdownBox=dropdown
+submit=submit
+cmdSetItem=set item
+cmdWaitElement=wait element
+cmdInput=input
+cmdMouseClick=click
+cmdMouseMove=mouse move
+cmdMouseDrag=mouse drag
+cmdTimes=times
+cmdForEach=ForEach
+cmdWhile=While
+cmdIf=If
+cmdElse=Else
+cmdElseIf=ElseIf
+close=close
+cmdExtraction=extracion
+cmdExtractWindow=window extraction
+cmdExtractElement=element extraction
+tcp_mock_not_unique=This tcp port is be used
+no_tcp_mock_port=No idle tcp port, please contact administrators.
+name_already_exists_in_module=Name already exists in same module
+repository_module_already_exists=The repository name already exists at the same project
+can_not_move_to_repository_node=Can not move to repository node
+# issue template copy
+target_issue_template_not_checked=Cannot copy, target project not checked
+source_issue_template_is_empty=Copy error, source project is empty
\ No newline at end of file
diff --git a/backend/services/test-plan/src/main/resources/i18n/plan_zh_CN.properties b/backend/services/test-plan/src/main/resources/i18n/plan_zh_CN.properties
new file mode 100644
index 0000000000..9bf0e7818d
--- /dev/null
+++ b/backend/services/test-plan/src/main/resources/i18n/plan_zh_CN.properties
@@ -0,0 +1,379 @@
+#commons
+error_lang_invalid=语言参数错误
+file_cannot_be_null=文件不能为空!
+cannot_be_null=不能为空
+number=第
+row=行
+error=出错
+delete_fail=删除失败
+start_engine_fail=启动失败
+upload_fail=文件上传失败
+invalid_parameter=非法的参数
+name_already_exists=该名称已经存在
+resource_not_exist=资源不存在或已删除
+upload_file_fail_get_file_path_fail=文件上传失败,获取文件上传路径为空
+#user related
+user_email_already_exists=用户邮箱已存在
+user_id_is_null=用户ID不能为空
+user_name_is_null=用户名不能为空
+user_email_is_null=用户邮箱不能为空
+password_is_null=密码不能为空
+user_id_already_exists=用户id已存在
+password_modification_failed=旧密码输入错误,请重新输入
+cannot_delete_current_user=无法删除当前登录用户
+connection_failed=连接失败
+connection_timeout=连接超时
+user_already_exists=该用户已存在于当前成员列表中
+cannot_remove_current=无法移除当前登录用户
+login_fail=登录失败
+password_is_incorrect=用户名或密码不正确
+user_not_exist=用户不存在:
+user_has_been_disabled=用户已被禁用
+excessive_attempts=操作频繁
+user_locked=用户被锁定
+user_expires=用户过期
+not_authorized=未经授权
+user_apikey_limit=最多能有5个Api key
+please_logout_current_user=请先登出当前用户
+#load test
+edit_load_test_not_found=无法编辑测试,未找到测试:
+run_load_test_not_found=无法运行测试,未找到测试:
+run_load_test_file_not_found=无法运行测试,无法获取测试文件元信息,测试ID:
+run_load_test_file_content_not_found=无法运行测试,无法获取测试文件内容,测试ID:
+run_load_test_file_init_error=无法运行测试,请前往 [系统设置-系统-系统参数设置] 检查当前站点配置,详情见 https://metersphere.io/docs/v2.x/faq/load_test/#url
+load_test_is_running=测试正在运行, 请等待
+load_test_kafka_invalid=Kafka 不可用,请检查配置
+cannot_edit_load_test_running=不能修改正在运行的测试
+test_not_found=测试不存在:
+test_not_running=测试未运行
+load_test_already_exists=测试名称不能重复
+load_test_name_length=测试名称长度超过限制
+no_nodes_message=没有节点信息
+duplicate_node_ip=节点 IP 重复
+duplicate_node_port=节点 Port 重复
+duplicate_node_ip_port=节点 IP、Port 重复
+max_thread_insufficient=并发用户数超额
+related_case_del_fail_prefix=已关联到
+related_case_del_fail_suffix=测试用例,请先解除关联
+jmx_content_valid=JMX 内容无效,请检查
+container_delete_fail=容器由于网络原因停止失败,请重试
+load_test_report_file_not_exist=当前报告没有JTL文件,请等待或重新执行以便获取
+#workspace
+workspace_name_is_null=工作空间名不能为空
+workspace_name_already_exists=工作空间名已存在
+workspace_does_not_belong_to_user=当前工作空间不属于当前用户
+workspace_not_exists=工作空间不存在
+#test resource pool
+test_resource_pool_id_is_null=资源池ID不能为空
+test_resource_pool_name_is_null=资源池名称不能为空
+test_resource_pool_name_already_exists=资源池名称已存在
+load_test=性能测试
+test_resource_pool_is_use=正在使用此资源池,无法删除
+only_one_k8s=只能添加一个 K8S
+test_resource_pool_not_exists=测试资源池不存在
+test_resource_pool_invalid=当前测试使用的资源池处于禁用状态
+#project
+project_name_is_null=项目名称不能为空
+project_name_already_exists=项目名称已存在
+project_file_already_exists=项目下该文件已经存在
+project_file_in_use=占用文件,无法删除。
+#organization
+organization_name_is_null=组织名不能为空
+organization_name_already_exists=组织名已存在
+organization_does_not_belong_to_user=当前组织不属于当前用户
+organization_id_is_null=组织 ID 不能为空
+#api
+api_load_script_error=读取脚本失败
+illegal_xml_format=不合法的 XML 格式
+api_report_is_null="测试报告是未生成,无法更新"
+api_test_environment_already_exists="已存在该名称的环境配置"
+api_test=接口测试
+#test case
+test_case_node_level=层
+test_case_node_level_tip=模块树最大深度为
+test_case_module_not_null=所属模块不能为空
+test_case_create_module_fail=创建模块失败
+test_case_import_template_name=测试用例模版
+test_case_import_template_sheet=模版
+module_not_null=所属模块不能为空格
+user_not_exists=该项目下无该用户
+test_case_already_exists=该项目下已存在该测试用例
+parse_data_error=解析数据出错
+missing_header_information=缺少头部信息
+test_case_exist=该项目下已存在用例:
+node_deep_limit=节点深度不超过8层!
+before_delete_plan=该计划下存在关联测试用例,请先取消关联!
+incorrect_format=格式错误
+test_case_step_model_validate=必须为TEXT、STEP
+test_case_priority_validate=必须为P0、P1、P2、P3
+test_case_method_validate=必须为manual、auto
+test_case_name=用例名称
+test_case_type=用例类型
+test_case_maintainer=维护人
+test_case_priority=用例等级
+test_case_method=测试方式
+test_case_prerequisite=前置条件
+test_case_remark=备注
+test_case_step_desc=步骤描述
+test_case_step_result=预期结果
+test_case_module=所属模块
+test_case=功能用例
+user=用户
+user_import_template_name=用户导入模板
+user_import_template_sheet=模版
+user_import_format_wrong=格式错误
+user_import_id_is_repeat=ID重复
+user_import_email_is_repeat=E-mail重复
+user_import_password_format_wrong=密码格式错误
+user_import_phone_format_wrong=手机号码格式错误
+user_import_email_format_wrong=电子邮箱格式错误
+user_import_organization_not_fond=组织未找到
+user_import_workspace_not_fond=工作空间未找到
+org_admin=组织管理员
+org_member=组织成员
+test_manager=测试经理
+tester=测试成员
+read_only_user=只读用户
+module=模块
+num_needed_modify_testcase=修改用例时ID必填
+num_needless_create_testcase=创建用例时无需ID
+tag_tip_pattern=标签之间以分号或者逗号隔开
+preconditions_optional=前置条件选填
+remark_optional=备注选填
+do_not_modify_header_order=请勿修改表头顺序
+module_created_automatically=若无该模块将自动创建
+options=选项
+options_yes=是
+options_no=否
+required=必填
+password_format_is_incorrect=有效密码:8-30位,英文大小写字母+数字+特殊字符(可选)
+please_input_project_member=请填写该项目下的相关人员ID
+test_case_report_template_repeat=同一工作空间下不能存在同名模版
+plan_name_already_exists=测试计划名称已存在
+test_case_already_exists_excel=文件中存在多条相同用例
+test_case_module_already_exists=同层级下已存在该模块名称
+api_test_name_already_exists=测试名称已经存在
+functional_method_tip=功能测试不支持自动方式
+custom_num_is_exist=用例自定义ID已存在
+custom_num_is_not_exist=用例自定义ID不存在
+id_required=ID必填
+id_repeat_in_table=表格内ID重复
+step_model_tip=步骤描述填写 STEP,文本描述请填写 TEXT (非必填)
+case_status_not_exist=用例状态必须为未开始(Prepare)、进行中(Underway)、已完成(Completed)
+issue_project_not_exist=ID不存在或其它错误
+tapd_project_not_exist=关联的TAPD项目ID不存在
+zentao_get_project_builds_fail=获取影响版本错误
+zentao_project_id_not_exist=关联的禅道ID不存在或其它错误
+#ldap
+ldap_url_is_null=LDAP地址为空
+ldap_dn_is_null=LDAP绑定DN为空
+ldap_ou_is_null=LDAP参数OU为空
+ldap_password_is_null=LDAP密码为空
+ldap_connect_fail=连接LDAP失败
+ldap_connect_fail_user=连接LDAP失败,绑定的DN或密码错误
+ldap_user_filter_is_null=LDAP用户过滤器为空
+ldap_user_mapping_is_null=LDAP用户属性映射为空
+authentication_failed=用户认证失败,用户名或密码错误
+user_not_found_or_not_unique=用户不存在或者不唯一
+find_more_user=查找到多个用户
+ldap_authentication_not_enabled=LDAP认证未启用
+login_fail_email_null=登录失败,用户邮箱为空
+login_fail_ou_error=登录失败,请检查用户OU
+login_fail_filter_error=登录失败,请检查用户过滤器
+check_ldap_mapping=检查LDAP属性映射
+ldap_mapping_value_null=LDAP用户属性映射字段为空值
+oauth_mapping_config_error=OAuth2属性映射配置错误
+oauth_mapping_value_null=OAuth2用户属性映射字段为空值
+#quota
+quota_project_excess_ws_api=项目的接口测试数量总和不能超过工作空间的配额
+quota_project_excess_ws_performance=项目的性能测试数量总和不能超过工作空间的配额
+quota_project_excess_ws_max_threads=项目的最大并发数不能超过工作空间的配额
+quota_project_excess_ws_max_duration=项目的压测时长不能超过工作空间的配额
+quota_project_excess_ws_resource_pool=项目的资源池不能超过工作空间的资源池范围
+quota_project_excess_ws_vum_total=项目的总vum数量总和不能超过工作空间配额
+quota_vum_used_gt_vum_total=总vum数量不能小于已消耗的vum数量
+quota_api_excess_workspace=接口测试数量超过工作空间限额
+quota_api_excess_project=接口测试数量超过项目限额
+quota_performance_excess_workspace=性能测试数量超过工作空间限额
+quota_performance_excess_project=性能测试数量超过项目限额
+quota_max_threads_excess_workspace=最大并发数超过工作空间限额
+quota_max_threads_excess_project=最大并发数超过项目限额
+quota_duration_excess_workspace=压测时长超过工作空间限额
+quota_duration_excess_project=压测时长超过项目限额
+quota_member_excess_workspace=成员数超过工作空间配额
+quota_member_excess_project=成员数超过项目配额
+quota_project_excess_project=项目数超过工作空间配额
+quota_vum_used_excess_workspace=消耗的vum数量超过工作空间配额
+quota_vum_used_excess_project=消耗的vum数量超过项目配额
+import_xmind_count_error=思维导图导入用例数量不能超过 800 条
+license_valid_license_error=授权认证失败
+import_xmind_not_found=未找到测试用例
+test_review_task_notice=测试评审任务通知
+swagger_url_scheduled_import_notification=swagger_url定时导入通知
+test_track.length_less_than=标题过长,字数必须小于
+# check owner
+check_owner_project=当前用户没有操作此项目的权限
+check_owner_test=当前用户没有操作此测试的权限
+check_owner_case=当前用户没有操作此用例的权限
+check_owner_plan=当前用户没有操作此计划的权限
+check_owner_review=当前用户没有操作此评审的权限
+check_owner_comment=当前用户没有操作此评论的权限
+check_owner_workspace=当前用户没有操作此工作空间的权限
+upload_content_is_null=导入内容为空
+test_plan_notification=测试计划通知
+task_defect_notification=缺陷任务通知
+task_notification_=定时任务结果通知
+api_definition_url_not_repeating=接口请求地址已经存在
+api_definition_name_not_repeating=相同的名称-url组合已存在
+task_notification_jenkins=jenkins任务通知
+task_notification=任务通知
+message_task_already_exists=任务接收人已经存在
+#automation
+automation_name_already_exists=同一个项目的同一模块下,场景名称不能重复
+automation_exec_info=没有测试步骤,无法执行
+delete_check_reference_by=被场景引用
+not_execute=未执行
+execute_not_pass=未通过
+execute_pass=通过
+import_fail_custom_num_exists=导入失败,自定义ID已存在
+#authsource
+authsource_name_already_exists=认证源名称已经存在
+authsource_name_is_null=认证源名称不能为空
+authsource_configuration_is_null=认证源配置不能为空
+custom_field_already=工作空间下已存在该字段:
+template_already=工作空间下已存在该模板:
+expect_name_exists=预期名称已存在
+ssl_password_error=认证密码错误,请重新输入密码
+ssl_file_error=认证文件加载失败,请检查认证文件
+#log
+api_definition=接口定义
+api_definition_case=接口定义用例
+api_automation=接口自动化
+api_automation_schedule=接口自动化-定时任务
+api_automation_report=测试报告
+track_test_case=测试用例
+track_test_case_review=用例评审
+track_test_plan=测试计划
+track_test_plan_schedule=测试计划-定时任务
+track_bug=缺陷管理
+track_report=报告
+performance_test=性能测试
+performance_test_report=性能测试报告
+system_user=系统-用户
+system_organization=系统-组织
+system_workspace=工作空间
+system_test_resource=系统-测试资源池
+system_parameter_setting=系统-系统参数设置
+system_quota_management=系统-配额管理
+system_authorization_management=系统-授权管理
+organization_member=组织-成员
+organization_workspace=组织-工作空间
+workspace_service_integration=工作空间-服务集成
+workspace_message_settings=工作空间-消息设置
+workspace_member=工作空间-成员
+workspace_template_settings_field=工作空间-模版设置-自定义字段
+workspace_template_settings_case=工作空间-模版设置-用例模版
+workspace_template_settings_issue=工作空间-模版设置-缺陷模版
+project_project_manager=项目-项目管理
+project_project_member=项目-成员
+project_project_jar=項目-JAR包管理
+project_environment_setting=项目-环境设置
+project_file_management=项目-文件管理
+personal_information_personal_settings=个人信息-个人设置
+personal_information_apikeys=个人信息-API Keys
+auth_title=系统认证
+group_permission=用户组与权限
+test_case_status_prepare=未开始
+test_case_status_again=重新提审
+test_case_status_running=进行中
+test_case_status_finished=已完成
+connection_expired=连接已失效,请重新获取
+# track home
+api_case=接口用例
+performance_case=性能用例
+scenario_case=场景用例
+scenario_name_is_null=场景名称不能为空
+test_case_status_error=失败
+test_case_status_success=成功
+test_case_status_trash=废弃
+test_case_status_saved=已保存
+create_user=创建人
+test_case_status=用例状态
+id_not_rightful=ID 不合法
+project_reference_multiple_plateform=项目指向多个第三方平台
+# mock
+mock_warning=未找到匹配的Mock期望
+zentao_test_type_error=无效的 Zentao 请求
+#项目报告
+enterprise_test_report=项目报告
+count=统计
+cannot_find_project=未找到测试项目
+project_repeatable_is_false=项目未配置URL可重复
+#环境组
+null_environment_group_name=环境组名称不存在
+environment_group_name=环境组名称
+environment_group_exist=已存在
+environment_group_has_duplicate_project=每个项目只能选择一个环境!
+#误报库
+error_report_library=误报库
+issue_jira_info_error=请检查服务集成信息或Jira项目ID
+error_code_is_unique=错误代码不可重复
+no_version_exists=不存在版本!请先创建项目的版本
+jira_auth_error=账号名或密码(Token)错误
+jira_auth_url_error=测试连接失败,请检查Jira地址是否正确
+#ui 指令校验
+param_error=参数校验失败!请检查
+is_null=不能为空
+url_is_null=URL 参数不能为空
+frame_index_is_null=网页索引号不能为空
+element_is_null=元素对象已经被删除
+locator_is_null=元素定位参数不能有空
+coord=坐标
+input_content=输入内容
+subitem_type=子选项类型
+subitem=子选项值
+varname=变量名
+varname_or_value=变量名或变量值
+attributeName=属性名
+webtitle_varname=网页标题变量名
+webhandle_varname=网页窗口 handle变量名
+cant_be_negative=不能为负数
+expression=表达式
+times=循环次数
+command=步骤
+extract_type=提取信息类型
+cmdValidation=断言
+cmdValidateValue=断言值
+cmdValidateText=弹窗文本
+cmdValidateDropdown=下拉框
+cmdValidateElement=元素断言
+cmdValidateTitle=网页标题
+cmdOpen=打开网页
+cmdSelectWindow=切换窗口
+cmdSetWindowSize=设置窗口大小
+cmdSelectFrame=选择内嵌网页
+cmdDialog=弹窗操作
+cmdDropdownBox=下拉框操作
+submit=提交表单
+cmdSetItem=设置选项
+cmdWaitElement=等待元素
+cmdInput=输入操作
+cmdMouseClick=鼠标点击
+cmdMouseMove=鼠标移动
+cmdMouseDrag=鼠标拖拽
+cmdTimes=次数循环
+cmdForEach=ForEach 循环
+cmdWhile=While 循环
+cmdIf=If
+cmdElse=Else
+cmdElseIf=ElseIf
+close=关闭网页
+cmdExtraction=数据提取
+cmdExtractWindow=提取窗口信息
+cmdExtractElement=提取元素信息
+tcp_mock_not_unique=该TCP端口号已被使用
+no_tcp_mock_port=无可用的TCP端口号,请联系管理员
+name_already_exists_in_module=同层级下已经存在
+# issue template copy
+target_issue_template_not_checked=无法复制,未选中目标项目
+source_issue_template_is_empty=复制错误,源项目为空
diff --git a/backend/services/test-plan/src/main/resources/i18n/plan_zh_TW.properties b/backend/services/test-plan/src/main/resources/i18n/plan_zh_TW.properties
new file mode 100644
index 0000000000..3323dc8c5d
--- /dev/null
+++ b/backend/services/test-plan/src/main/resources/i18n/plan_zh_TW.properties
@@ -0,0 +1,378 @@
+#commons
+error_lang_invalid=語言參數錯誤
+file_cannot_be_null=文件不能為空!
+cannot_be_null=不能為空
+number=第
+row=行
+error=出錯
+delete_fail=刪除失敗
+start_engine_fail=啟動失敗
+upload_fail=文件上傳失敗
+invalid_parameter=非法的參數
+name_already_exists=該名稱已經存在
+resource_not_exist=資源不存在或已刪除
+upload_file_fail_get_file_path_fail=文件上傳失敗,獲取文件上傳路徑為空
+#user related
+user_email_already_exists=用戶郵箱已存在
+user_id_is_null=用戶ID不能為空
+user_name_is_null=用戶名不能為空
+user_email_is_null=用戶郵箱不能為空
+password_is_null=密碼不能為空
+user_id_already_exists=用戶id已存在
+password_modification_failed=舊密碼輸入錯誤,請重新輸入
+cannot_delete_current_user=無法刪除當前登錄用戶
+connection_failed=連接失敗
+connection_timeout=連接超時
+user_already_exists=該用戶已存在於當前成員列表中
+cannot_remove_current=無法移除當前登錄用戶
+login_fail=登錄失敗
+password_is_incorrect=用戶名或密碼不正確
+user_not_exist=用戶不存在:
+user_has_been_disabled=用戶已被禁用
+excessive_attempts=操作頻繁
+user_locked=用戶被鎖定
+user_expires=用戶過期
+not_authorized=未經授權
+user_apikey_limit=最多能有5個Api key
+please_logout_current_user=請先登出當前用戶
+#load test
+edit_load_test_not_found=無法編輯測試,未找到測試:
+run_load_test_not_found=無法運行測試,未找到測試:
+run_load_test_file_not_found=無法運行測試,無法獲取測試文件元信息,測試ID:
+run_load_test_file_content_not_found=無法運行測試,無法獲取測試文件內容,測試ID:
+run_load_test_file_init_error=無法運行測試,請前往 [系統設置-系統-系統參數設置] 檢查當前站點配置,詳情見 https://metersphere.io/docs/v2.x/faq/load_test/#url
+load_test_is_running=測試正在運行, 請等待
+load_test_kafka_invalid=Kafka 不可用,請檢查配置
+cannot_edit_load_test_running=不能修改正在運行的測試
+test_not_found=測試不存在:
+test_not_running=測試未運行
+load_test_already_exists=測試名稱不能重復
+load_test_name_length=測試名稱長度超過限製
+no_nodes_message=沒有節點信息
+duplicate_node_ip=節點 IP 重復
+duplicate_node_port=節點 Port 重復
+duplicate_node_ip_port=節點 IP、Port 重復
+max_thread_insufficient=並發用戶數超額
+related_case_del_fail_prefix=已關聯到
+related_case_del_fail_suffix=測試用例,請先解除關聯
+jmx_content_valid=JMX 內容無效,請檢查
+container_delete_fail=容器由於網絡原因停止失敗,請重試
+load_test_report_file_not_exist=當前報告沒有JTL文件,請等待或重新執行以便獲取
+#workspace
+workspace_name_is_null=工作空間名不能為空
+workspace_name_already_exists=工作空間名已存在
+workspace_does_not_belong_to_user=當前工作空間不屬於當前用戶
+workspace_not_exists=工作空間不存在
+#test resource pool
+test_resource_pool_id_is_null=資源池ID不能為空
+test_resource_pool_name_is_null=資源池名稱不能為空
+test_resource_pool_name_already_exists=資源池名稱已存在
+load_test=性能測試
+test_resource_pool_is_use=正在使用此資源池,無法刪除
+only_one_k8s=只能添加一個 K8S
+test_resource_pool_not_exists=測試資源池不存在
+test_resource_pool_invalid=當前測試使用的資源池處於禁用狀態
+#project
+project_name_is_null=項目名稱不能為空
+project_name_already_exists=項目名稱已存在
+project_file_already_exists=項目下該文件已經存在
+project_file_in_use=占用文件,無法刪除。
+#organization
+organization_name_is_null=組織名不能為空
+organization_name_already_exists=組織名已存在
+organization_does_not_belong_to_user=當前組織不屬於當前用戶
+organization_id_is_null=組織 ID 不能為空
+#api
+api_load_script_error=讀取腳本失敗
+illegal_xml_format=不合法的 XML 格式
+api_report_is_null="測試報告是未生成,無法更新"
+api_test_environment_already_exists="已存在該名稱的環境配置"
+api_test=接口測試
+#test case
+test_case_node_level=層
+test_case_node_level_tip=模塊樹最大深度為
+test_case_module_not_null=所屬模塊不能為空
+test_case_create_module_fail=創建模塊失敗
+test_case_import_template_name=測試用例模版
+test_case_import_template_sheet=模版
+module_not_null=所屬模塊不能為空格
+user_not_exists=該項目下無該用戶
+test_case_already_exists=該項目下已存在該測試用例
+parse_data_error=解析數據出錯
+missing_header_information=缺少頭部信息
+test_case_exist=該項目下已存在用例:
+node_deep_limit=節點深度不超過8層!
+before_delete_plan=該計劃下存在關聯測試用例,請先取消關聯!
+incorrect_format=格式錯誤
+test_case_step_model_validate=必須為TEXT、STEP
+test_case_priority_validate=必須為P0、P1、P2、P3
+test_case_method_validate=必須為manual、auto
+test_case_name=用例名稱
+test_case_type=用例類型
+test_case_maintainer=維護人
+test_case_priority=用例等級
+test_case_method=測試方式
+test_case_prerequisite=前置條件
+test_case_remark=備註
+test_case_step_desc=步驟描述
+test_case_step_result=預期結果
+test_case_module=所屬模塊
+test_case=功能用例
+user=用戶
+user_import_template_name=用戶導入模板
+user_import_template_sheet=模版
+user_import_format_wrong=格式錯誤
+user_import_id_is_repeat=ID重復
+user_import_email_is_repeat=E-mail重復
+user_import_password_format_wrong=密碼格式錯誤
+user_import_phone_format_wrong=手機號碼格式錯誤
+user_import_email_format_wrong=電子郵箱格式錯誤
+user_import_organization_not_fond=組織未找到
+user_import_workspace_not_fond=工作空間未找到
+org_admin=組織管理員
+org_member=組織成員
+test_manager=測試經理
+tester=測試成員
+read_only_user=只讀用戶
+module=模塊
+num_needed_modify_testcase=修改用例時ID必填
+num_needless_create_testcase=創建用例時無需ID
+tag_tip_pattern=標簽之間以分號或者逗號隔開
+preconditions_optional=前置條件選填
+remark_optional=備註選填
+do_not_modify_header_order=請勿修改表頭順序
+module_created_automatically=若無該模塊將自動創建
+options=選項
+options_yes=是
+options_no=否
+required=必填
+password_format_is_incorrect=有效密碼:8-30位,英文大小寫字母+數字+特殊字符(可選)
+please_input_project_member=請填寫該項目下的相關人員ID
+test_case_report_template_repeat=同一工作空間下不能存在同名模版
+plan_name_already_exists=測試計劃名稱已存在
+test_case_already_exists_excel=文件中存在多條相同用例
+test_case_module_already_exists=同層級下已存在該模塊名稱
+api_test_name_already_exists=測試名稱已經存在
+functional_method_tip=功能測試不支持自動方式
+custom_num_is_exist=用例自定義ID已存在
+custom_num_is_not_exist=用例自定義ID不存在
+id_required=ID必填
+id_repeat_in_table=表格內ID重復
+step_model_tip=步驟描述填寫 STEP,文本描述請填寫 TEXT (非必填)
+case_status_not_exist=用例狀態必須為未開始(Prepare)、進行中(Underway)、已完成(Completed)
+issue_project_not_exist=ID不存在或其它錯誤
+tapd_project_not_exist=關聯的TAPD項目ID不存在
+zentao_get_project_builds_fail=獲取影響版本錯誤
+zentao_project_id_not_exist=關聯的禪道ID不存在或其它錯誤
+#ldap
+ldap_url_is_null=LDAP地址為空
+ldap_dn_is_null=LDAP綁定DN為空
+ldap_ou_is_null=LDAP參數OU為空
+ldap_password_is_null=LDAP密碼為空
+ldap_connect_fail=連接LDAP失敗
+ldap_connect_fail_user=連接LDAP失敗,綁定的DN或密碼錯誤
+ldap_user_filter_is_null=LDAP用戶過濾器為空
+ldap_user_mapping_is_null=LDAP用戶屬性映射為空
+authentication_failed=用戶認證失敗,用戶名或密碼錯誤
+user_not_found_or_not_unique=用戶不存在或者不唯一
+find_more_user=查找到多個用戶
+ldap_authentication_not_enabled=LDAP認證未啟用
+login_fail_email_null=登錄失敗,用戶郵箱為空
+login_fail_ou_error=登錄失敗,請檢查用戶OU
+login_fail_filter_error=登錄失敗,請檢查用戶過濾器
+check_ldap_mapping=檢查LDAP屬性映射
+ldap_mapping_value_null=LDAP用戶屬性映射字段為空值
+oauth_mapping_config_error=OAuth2屬性映射配置錯誤
+oauth_mapping_value_null=OAuth2用戶屬性映射字段為空值
+#quota
+quota_project_excess_ws_api=項目的接口測試數量總和不能超過工作空間的配額
+quota_project_excess_ws_performance=項目的性能測試數量總和不能超過工作空間的配額
+quota_project_excess_ws_max_threads=項目的最大並發數不能超過工作空間的配額
+quota_project_excess_ws_max_duration=項目的壓測時長不能超過工作空間的配額
+quota_project_excess_ws_resource_pool=項目的資源池不能超過工作空間的資源池範圍
+quota_project_excess_ws_vum_total=項目的總vum數量總和不能超過工作空間配額
+quota_api_excess_workspace=接口測試數量超過工作空間限額
+quota_vum_used_gt_vum_total=總vum數量不能小於已消耗的vum數量
+quota_api_excess_project=接口測試數量超過項目限額
+quota_performance_excess_workspace=性能測試數量超過工作空間限額
+quota_performance_excess_project=性能測試數量超過項目限額
+quota_max_threads_excess_workspace=最大並發數超過工作空間限額
+quota_max_threads_excess_project=最大並發數超過項目限額
+quota_duration_excess_project=壓測時長超過項目限額
+quota_member_excess_workspace=成員數超過工作空間配額
+quota_member_excess_project=成員數超過項目配額
+quota_project_excess_project=項目數超過工作空間配額
+quota_vum_used_excess_workspace=消耗的vum數量超過工作空間配額
+quota_vum_used_excess_project=消耗的vum數量超過項目配額
+import_xmind_count_error=思維導圖導入用例數量不能超過 800 條
+license_valid_license_error=授權認證失敗
+import_xmind_not_found=未找到測試用例
+test_review_task_notice=測試評審任務通知
+swagger_url_scheduled_import_notification=swagger_url定時導入通知
+test_track.length_less_than=標題過長,字數必須小於
+# check owner
+check_owner_project=當前用戶沒有操作此項目的權限
+check_owner_test=當前用戶沒有操作此測試的權限
+check_owner_case=當前用戶沒有操作此用例的權限
+check_owner_plan=當前用戶沒有操作此計劃的權限
+check_owner_review=當前用戶沒有操作此評審的權限
+check_owner_comment=當前用戶沒有操作此評論的權限
+check_owner_workspace=當前用戶沒有操作此工作空間的權限
+upload_content_is_null=導入內容為空
+test_plan_notification=測試計劃通知
+task_defect_notification=缺陷任務通知
+task_notification_=定時任務結果通知
+api_definition_url_not_repeating=接口請求地址已經存在
+api_definition_name_not_repeating=相同的名稱-url組合已存在
+task_notification_jenkins=jenkins任務通知
+task_notification=任務通知
+message_task_already_exists=任務接收人已經存在
+#automation
+automation_name_already_exists=同一個項目同一模塊下,場景名稱不能重復
+automation_exec_info=沒有測試步驟,無法執行
+delete_check_reference_by=被場景引用
+not_execute=未執行
+execute_not_pass=未通過
+execute_pass=通過
+import_fail_custom_num_exists=導入失敗,自定義ID已存在
+#authsource
+authsource_name_already_exists=認證源名稱已經存在
+authsource_name_is_null=認證源名稱不能為空
+authsource_configuration_is_null=認證源配置不能為空
+custom_field_already=工作空間下已存在該字段:
+template_already=工作空間下已存在該模板:
+expect_name_exists=預期名稱已存在
+ssl_password_error=認證密碼錯誤,請重新輸入密碼
+ssl_file_error=認證文件加載失敗,請檢查認證文件
+#log
+api_definition=接口定義
+api_definition_case=接口定義用例
+api_automation=接口自動化
+api_automation_schedule=接口自動化-定時任務
+api_automation_report=測試報告
+track_test_case=測試用例
+track_test_case_review=用例評審
+track_test_plan=測試計劃
+track_test_plan_schedule=測試計劃-定時任務
+track_bug=缺陷管理
+track_report=報告
+performance_test=性能測試
+performance_test_report=性能測試報告
+system_user=系統-用戶
+system_organization=系統-組織
+system_workspace=工作空間
+system_test_resource=系統-測試資源池
+system_parameter_setting=系統-系統參數設置
+system_quota_management=系統-配額管理
+system_authorization_management=系統-授權管理
+organization_member=組織-成員
+organization_workspace=組織-工作空間
+workspace_service_integration=工作空間-服務集成
+workspace_message_settings=工作空間-消息設置
+workspace_member=工作空間-成員
+workspace_template_settings_field=工作空間-模版設置-自定義字段
+workspace_template_settings_case=工作空間-模版設置-用例模版
+workspace_template_settings_issue=工作空間-模版設置-缺陷模版
+project_project_manager=項目-項目管理
+project_project_member=項目-成員
+project_project_jar=項目-JAR包管理
+project_environment_setting=項目-環境設置
+project_file_management=項目-文件管理
+personal_information_personal_settings=個人信息-個人設置
+personal_information_apikeys=個人信息-API Keys
+auth_title=系統認證
+group_permission=用戶組與權限
+test_case_status_prepare=未開始
+test_case_status_again=重新提審
+test_case_status_running=進行中
+test_case_status_finished=已完成
+connection_expired=連接已失效,請重新獲取
+# track home
+api_case=接口用例
+performance_case=性能用例
+scenario_case=場景用例
+scenario_name_is_null=場景名稱不能為空
+test_case_status_error=失敗
+test_case_status_success=成功
+test_case_status_trash=廢棄
+test_case_status_saved=已保存
+create_user=創建人
+test_case_status=用例狀態
+id_not_rightful=ID 不合法
+project_reference_multiple_plateform=項目指向多個第三方平臺
+# mock
+mock_warning=未找到匹配的Mock期望
+zentao_test_type_error=請求方式錯誤
+#项目报告
+enterprise_test_report=項目報告
+count=統計
+cannot_find_project=未找到測試項目
+project_repeatable_is_false=項目未配置URL可重複
+#环境组
+null_environment_group_name=環境組名稱不存在
+environment_group_name=環境組名稱
+environment_group_exist=已存在
+environment_group_has_duplicate_project=每個項目只能選擇一個環境!
+#误报库
+error_report_library=誤報庫
+issue_jira_info_error=請檢查服務集成信息或Jira項目ID
+error_code_is_unique=錯誤代碼不可重複
+no_version_exists=不存在版本!請先創建項目的版本
+jira_auth_error=賬號名或密碼(Token)錯誤
+jira_auth_url_error=測試連接失敗,請檢查Jira地址是否正確
+#ui 指令校驗
+param_error=參數校驗失敗!請檢查
+is_null=不能為空
+url_is_null=URL 參數不能為空
+frame_index_is_null=網頁索引號不能為空
+element_is_null=元素對象已經被刪除
+locator_is_null=元素定位參數不能有空
+coord=坐標
+input_content=輸入內容
+subitem_type=子選項類型
+subitem=子選項值
+varname=變量名
+varname_or_value=變量名或變量值
+attributeName=屬性名
+webtitle_varname=網頁標題變量名
+webhandle_varname=網頁窗口 handle變量名
+cant_be_negative=不能為負數
+expression=表達式
+times=循環次數
+command=步驟
+extract_type=提取信息類型
+cmdValidation=斷言
+cmdValidateValue=斷言值
+cmdValidateText=彈窗文本
+cmdValidateDropdown=下拉框
+cmdValidateElement=元素斷言
+cmdValidateTitle=網頁標題
+cmdOpen=打開網頁
+cmdSelectWindow=切換窗口
+cmdSetWindowSize=設置窗口大小
+cmdSelectFrame=選擇內嵌網頁
+cmdDialog=彈窗操作
+cmdDropdownBox=下拉框操作
+submit=提交表單
+cmdSetItem=設置選項
+cmdWaitElement=等待元素
+cmdInput=輸入操作
+cmdMouseClick=鼠標點擊
+cmdMouseMove=鼠標移動
+cmdMouseDrag=鼠標拖拽
+cmdTimes=次數循環
+cmdForEach=ForEach 循環
+cmdWhile=While 循環
+cmdIf=If
+cmdElse=Else
+cmdElseIf=ElseIf
+close=關閉網頁
+cmdExtraction=數據提取
+cmdExtractWindow=提取窗口信息
+cmdExtractElement=提取元素信息
+tcp_mock_not_unique=該TCP端口號已被使用
+no_tcp_mock_port=無可用的TCP端口號,請聯繫管理員
+name_already_exists_in_module=同層級下已存在
+# issue template copy
+target_issue_template_not_checked=無法複製,未選中目標項目
+source_issue_template_is_empty=複製錯誤,源項目為空
diff --git a/backend/services/test-track/pom.xml b/backend/services/test-track/pom.xml
new file mode 100644
index 0000000000..54b041326f
--- /dev/null
+++ b/backend/services/test-track/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ io.metersphere
+ services
+ ${revision}
+
+ test-track
+ ${revision}
+ test-track
+
+
+
+
+ io.metersphere
+ sdk
+ ${revision}
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.properties
+ **/*.xml
+ **/*.json
+ **/*.tpl
+ **/*.js
+
+ false
+
+
+ src/main/resources
+
+ **/*
+
+ false
+
+
+
+
+
+
+
+
diff --git a/backend/services/test-track/src/main/java/io/metersphere/track/domain/TestCase.java b/backend/services/test-track/src/main/java/io/metersphere/track/domain/TestCase.java
new file mode 100644
index 0000000000..3ab5d7c0a5
--- /dev/null
+++ b/backend/services/test-track/src/main/java/io/metersphere/track/domain/TestCase.java
@@ -0,0 +1,72 @@
+package io.metersphere.track.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class TestCase implements Serializable {
+ private String id;
+
+ private String nodeId;
+
+ private String testId;
+
+ private String nodePath;
+
+ private String projectId;
+
+ private String name;
+
+ private String type;
+
+ private String maintainer;
+
+ private String priority;
+
+ private String method;
+
+ private Long createTime;
+
+ private Long updateTime;
+
+ private Integer sort;
+
+ private Integer num;
+
+ private String reviewStatus;
+
+ private String tags;
+
+ private String demandId;
+
+ private String demandName;
+
+ private String status;
+
+ private String stepModel;
+
+ private String customNum;
+
+ private String createUser;
+
+ private String originalStatus;
+
+ private Long deleteTime;
+
+ private String deleteUserId;
+
+ private Long order;
+
+ private Boolean casePublic;
+
+ private String versionId;
+
+ private String refId;
+
+ private Boolean latest;
+
+ private String lastExecuteResult;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/backend/services/test-track/src/main/resources/i18n/track.properties b/backend/services/test-track/src/main/resources/i18n/track.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/test-track/src/main/resources/i18n/track_en_US.properties b/backend/services/test-track/src/main/resources/i18n/track_en_US.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/test-track/src/main/resources/i18n/track_zh_CN.properties b/backend/services/test-track/src/main/resources/i18n/track_zh_CN.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/test-track/src/main/resources/i18n/track_zh_TW.properties b/backend/services/test-track/src/main/resources/i18n/track_zh_TW.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/framework/xpack-interface/pom.xml b/backend/services/ui-test/pom.xml
similarity index 86%
rename from backend/framework/xpack-interface/pom.xml
rename to backend/services/ui-test/pom.xml
index ecdf1a3e9e..fe1180d66e 100644
--- a/backend/framework/xpack-interface/pom.xml
+++ b/backend/services/ui-test/pom.xml
@@ -2,21 +2,23 @@
4.0.0
-
io.metersphere
- framework
+ services
${revision}
-
- xpack-interface
-
+ ui-test
+ ${revision}
+ ui-test
+
+
io.metersphere
sdk
${revision}
+
@@ -40,6 +42,9 @@
false
+
+
+
diff --git a/backend/services/ui-test/src/main/java/io/metersphere/ui/domain/UiScenario.java b/backend/services/ui-test/src/main/java/io/metersphere/ui/domain/UiScenario.java
new file mode 100644
index 0000000000..9a01f7a350
--- /dev/null
+++ b/backend/services/ui-test/src/main/java/io/metersphere/ui/domain/UiScenario.java
@@ -0,0 +1,74 @@
+package io.metersphere.ui.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class UiScenario implements Serializable {
+ private String id;
+
+ private String projectId;
+
+ private String tags;
+
+ private String userId;
+
+ private String moduleId;
+
+ private String modulePath;
+
+ private String name;
+
+ private String scenarioType;
+
+ private String level;
+
+ private String status;
+
+ private String principal;
+
+ private Integer stepTotal;
+
+ private String schedule;
+
+ private Long createTime;
+
+ private Long updateTime;
+
+ private String passRate;
+
+ private String lastResult;
+
+ private String reportId;
+
+ private Integer num;
+
+ private String originalState;
+
+ private String customNum;
+
+ private String createUser;
+
+ private Integer version;
+
+ private Long deleteTime;
+
+ private String deleteUserId;
+
+ private Integer executeTimes;
+
+ private Long order;
+
+ private String environmentType;
+
+ private String environmentGroupId;
+
+ private String versionId;
+
+ private String refId;
+
+ private Boolean latest;
+
+ private static final long serialVersionUID = 1L;
+}
diff --git a/backend/services/ui-test/src/main/resources/i18n/ui.properties b/backend/services/ui-test/src/main/resources/i18n/ui.properties
new file mode 100644
index 0000000000..87d88014b4
--- /dev/null
+++ b/backend/services/ui-test/src/main/resources/i18n/ui.properties
@@ -0,0 +1,74 @@
+test_case_exist=
+before_delete_plan=
+test_case_node_level_tip=
+test_case_node_level=
+test_case_module_not_null=
+test_case_create_module_fail=
+test_case_import_template_name=
+test_case_import_template_sheet=
+module_not_null=
+user_not_exists=
+test_case_already_exists=
+parse_data_error=
+missing_header_information=
+number=
+row=
+error=
+incorrect_format=
+test_case_priority_validate=
+test_case_method_validate=
+test_case_name=
+test_case_module=
+test_case_type=
+test_case_maintainer=
+test_case_priority=
+test_case_method=
+test_case_prerequisite=
+test_case_remark=
+test_case_step_desc=
+test_case_step_result=
+test_case=
+user=
+user_import_template_name=
+user_import_template_sheet=
+user_import_format_wrong=
+user_import_id_is_repeat=
+user_import_email_is_repeat=
+user_import_password_format_wrong=
+user_import_phone_format_wrong=
+user_import_email_format_wrong=
+user_import_organization_not_fond=
+user_import_workspace_not_fond=
+org_admin=
+org_member=
+test_manager=
+tester=
+read_only_user=
+module=
+preconditions_optional=
+remark_optional=
+do_not_modify_header_order=
+module_created_automatically=
+options=
+options_yes=
+options_no=
+required=
+password_format_is_incorrect=
+please_input_workspace_member=
+test_case_report_template_repeat=
+custom_field_already=
+id_required=
+id_repeat_in_table=
+template_already=
+expect_name_exists=
+id_not_rightful=
+mock_warning=
+invalid_parameter=
+workspace_template_settings_issue=
+zentao_test_type_error=
+issue_jira_info_error=
+case_status_not_exist=
+jira_auth_error=
+# issue template copy
+target_issue_template_not_checked=
+source_issue_template_is_empty=
diff --git a/backend/services/ui-test/src/main/resources/i18n/ui_en_US.properties b/backend/services/ui-test/src/main/resources/i18n/ui_en_US.properties
new file mode 100644
index 0000000000..f07b1c41cc
--- /dev/null
+++ b/backend/services/ui-test/src/main/resources/i18n/ui_en_US.properties
@@ -0,0 +1,382 @@
+#commons
+error_lang_invalid=Invalid language parameter
+file_cannot_be_null=File cannot be empty!
+cannot_be_null=\tCannot be empty
+number=Number
+row=row
+error=error
+connection_failed=Connection failed
+connection_timeout=Connection timeout
+delete_fail=Delete fail
+start_engine_fail=Start fail
+upload_fail=Upload fail
+invalid_parameter=Invalid parameter!
+name_already_exists=Name already exists
+resource_not_exist=The resource does not exist or has been deleted
+upload_file_fail_get_file_path_fail=Failed to upload the file, failed to get the file path
+#user related
+user_email_already_exists=User email already exists
+user_id_is_null=User ID cannot be null
+user_name_is_null=User name cannot be null
+user_email_is_null=User email cannot be null
+password_is_null=Password cannot be null
+user_id_already_exists=User ID already exists
+password_modification_failed=The old password is wrong. Please re-enter it
+cannot_delete_current_user=Cannot delete the user currently logged in
+user_already_exists=The user already exists in the current member list
+cannot_remove_current=Unable to remove the currently logged in user
+password_is_incorrect=Incorrect password or username
+user_not_exist=user does not exist:
+user_has_been_disabled=the user has been disabled.
+excessive_attempts=Excessive attempts
+user_locked=the user has been locked.
+user_expires=user expires.
+not_authorized=not authorized.
+login_fail=Login fail
+user_apikey_limit=Can have up to 5 api keys
+please_logout_current_user=Please logout current user first
+#load test
+edit_load_test_not_found=Cannot edit test, test not found=
+run_load_test_not_found=Cannot run test, test not found=
+run_load_test_file_not_found=Unable to run test, unable to get test file meta information, test ID=
+run_load_test_file_content_not_found=Cannot run test, cannot get test file content, test ID=
+run_load_test_file_init_error=Failed to run the test, please go to [Settings-System-System Parameter Setting] to check the current site configuration. For details, see https://metersphere.io/docs/faq/load_ test/#url
+load_test_is_running=Load test is running, please wait.
+load_test_kafka_invalid=Kafka is not available, please check the configuration
+cannot_edit_load_test_running=Cannot modify the running test
+test_not_found=Test cannot be found:
+test_not_running=Test is not running
+load_test_already_exists=Duplicate load test name
+load_test_name_length=The length of the test name exceeds the limit
+no_nodes_message=No node message
+duplicate_node_ip=Duplicate IPs
+duplicate_node_port=Duplicate Ports
+duplicate_node_ip_port=Duplicate IPs & Ports
+max_thread_insufficient=The number of concurrent users exceeds
+related_case_del_fail_prefix=Connected to
+related_case_del_fail_suffix=TestCase, please disassociate first
+jmx_content_valid=JMX content is invalid
+container_delete_fail=The container failed to stop, please try again
+load_test_report_file_not_exist=There is no JTL file in the current report, please wait or execute it again to get it
+#workspace
+workspace_name_is_null=Workspace name cannot be null
+workspace_name_already_exists=The workspace name already exists
+workspace_does_not_belong_to_user=The current workspace does not belong to the current user
+workspace_not_exists=Workspace is not exists
+#test resource pool
+test_resource_pool_id_is_null=Test Resource Pool ID cannot be null
+test_resource_pool_name_is_null=Test Resource Pool name cannot be null
+test_resource_pool_name_already_exists=The test resource pool name already exists
+load_test=Load Test
+test_resource_pool_is_use=This resource pool is in use and cannot be deleted
+only_one_k8s=Only one K8S can be added
+test_resource_pool_not_exists=Test resource pool not exists
+test_resource_pool_invalid=Test resource pool invalid
+#project
+project_name_is_null=Project name cannot be null
+project_name_already_exists=The project name already exists
+project_file_already_exists=The file already exists
+project_file_in_use=use this file and cannot be deleted.
+#organization
+organization_name_is_null=organization name cannot be null
+organization_name_already_exists=The organization name already exists
+organization_does_not_belong_to_user=The current organization does not belong to the current user
+organization_id_is_null=Organization ID cannot be null
+#api
+api_load_script_error=Load script error
+illegal_xml_format=illegal XML format
+api_report_is_null="Report is null, can't update"
+api_test_environment_already_exists="Api test environment already exists"
+api_test=API Test
+#test case
+test_case_node_level=level
+test_case_node_level_tip=The node tree maximum depth is
+test_case_module_not_null=The owned module cannot be empty
+test_case_create_module_fail=Failed to create module
+test_case_import_template_name=Test_case_templates
+test_case_import_template_sheet=Template
+module_not_null=The module must not be blank
+user_not_exists=The user in this project is not exists
+test_case_already_exists=The test case in this project is exists
+parse_data_error=Parse data error
+missing_header_information=Missing header information
+test_case_exist=A test case already exists under this project:
+node_deep_limit=The node depth does not exceed 8 layers!
+before_delete_plan=There is an associated test case under this plan, please unlink it first!
+incorrect_format=\tincorrect format
+test_case_step_model_validate=\tmust be TEXT, STEP
+test_case_priority_validate=\tmust be P0, P1, P2, P3
+test_case_method_validate=\tmust be manual, auto
+test_case_name=Name
+test_case_type=Type
+test_case_maintainer=Maintainer
+test_case_priority=Priority
+test_case_method=method
+test_case_prerequisite=Prerequisite
+test_case_remark=Remark
+test_case_step_desc=Step description
+test_case_step_result=Step result
+test_case_module=Module
+test_case=Case
+user=User
+user_import_template_name=User import templates
+user_import_template_sheet=templates
+user_import_format_wrong=input error
+user_import_id_is_repeat=Id repeat
+user_import_email_is_repeat=E-mail repeat
+user_import_password_format_wrong=Wrong password format
+user_import_phone_format_wrong=Wrong phone format
+user_import_email_format_wrong=Wrong email format
+user_import_organization_not_fond=Organization is not found
+user_import_workspace_not_fond=Workspace is not found
+org_admin=Organization manager
+org_member=Organization member
+test_manager=Test manager
+tester=Tester
+read_only_user=Read-only user
+module=Module
+num_needed_modify_testcase=ID is needed when modifying testcase
+num_needless_create_testcase=ID is needless when creating testcase
+tag_tip_pattern=Labels should be separated by semicolons or commas
+preconditions_optional=Preconditions optional
+remark_optional=Remark optional
+do_not_modify_header_order=Do not modify the header order
+module_created_automatically=If there is no such module, will be created automatically
+options=options
+options_yes=Yes
+options_no=No
+required=Required
+password_format_is_incorrect=Valid password: 8-30 digits, English upper and lower case letters + numbers + special characters (optional)
+please_input_project_member=Please input project merber's number
+test_case_report_template_repeat=The workspace has the same name template
+plan_name_already_exists=Test plan name already exists
+test_case_already_exists_excel=There are duplicate test cases in the import file
+test_case_module_already_exists=The module name already exists at the same level
+api_test_name_already_exists=Test name already exists
+functional_method_tip=Functional test not support auto method
+custom_num_is_exist=Use case custom ID already exists
+custom_num_is_not_exist=Use case custom ID not exists
+id_required=ID required
+id_repeat_in_table=ID is repeat in table
+step_model_tip=Step description fill in STEP, text description please fill in TEXT (not required)
+case_status_not_exist=The use case status must be Prepare, Underway way and Completed
+issue_project_not_exist=ID does not exist or other errors
+tapd_project_not_exist=The associated TAPD item ID does not exist
+zentao_get_project_builds_fail=Get Affecting Version Errors
+zentao_project_id_not_exist=The associated Zen Tao ID does not exist or other errors
+#ldap
+ldap_url_is_null=LDAP address is empty
+ldap_dn_is_null=LDAP binding DN is empty
+ldap_ou_is_null=LDAP parameter OU is empty
+ldap_password_is_null=LDAP password is empty
+ldap_connect_fail=Connection LDAP failed
+ldap_connect_fail_user=Connection LDAP failed, wrong DN or password bound
+ldap_user_filter_is_null=LDAP user filter is empty
+ldap_user_mapping_is_null=LDAP user mapping is empty
+authentication_failed=User authentication failed,wrong user name or password
+user_not_found_or_not_unique=User does not exist or is not unique
+find_more_user=Multiple users found
+ldap_authentication_not_enabled=LDAP authentication is not enabled
+login_fail_email_null=Login failed, user mailbox is empty
+login_fail_ou_error=Login failed, please check the user OU
+login_fail_filter_error=Login failed, please check the user filter
+check_ldap_mapping=Check LDAP attribute mapping
+ldap_mapping_value_null=LDAP user attribute mapping field is empty
+oauth_mapping_config_error=OAuth2 attribute mapping misconfiguration
+oauth_mapping_value_null=OAuth2 user attribute mapping field is empty
+#quota
+quota_project_excess_ws_api=The total number of interface tests for a project cannot exceed the workspace quota
+quota_project_excess_ws_performance=The total number of performance tests for a project cannot exceed the workspace quota
+quota_project_excess_ws_max_threads=The maximum concurrent number of projects cannot exceed the quota of the workspace
+quota_project_excess_ws_max_duration=The stress test duration of the project cannot exceed the workspace quota
+quota_project_excess_ws_resource_pool=The resource pool of the project cannot exceed the scope of the resource pool of the workspace
+quota_project_excess_ws_vum_total=The sum of the total number of vums of the project cannot exceed the workspace quota
+quota_vum_used_gt_vum_total=The total number of vum cannot be less than the number of consumed vum
+quota_api_excess_workspace=The number of interface tests exceeds the workspace quota
+quota_api_excess_project=The number of interface tests exceeds the project limit
+quota_performance_excess_workspace=The number of performance tests exceeds the workspace quota
+quota_performance_excess_project=The number of performance tests exceeds the project limit
+quota_max_threads_excess_workspace=The maximum number of concurrent threads exceeds the workspace quota
+quota_max_threads_excess_project=The maximum concurrent number exceeds the project limit
+quota_duration_excess_workspace=The stress test duration exceeds the work space quota
+quota_duration_excess_project=The stress test time exceeds the project limit
+quota_member_excess_workspace=The number of members exceeds the workspace quota
+quota_member_excess_project=The number of members exceeds the project quota
+quota_project_excess_project=Number of projects exceeds workspace quota
+quota_vum_used_excess_workspace=The amount of vum consumed exceeds the workspace quota
+quota_vum_used_excess_project=The amount of vum consumed exceeds the project quota
+import_xmind_count_error=The number of use cases imported into the mind map cannot exceed 800
+import_xmind_not_found=Test case not found
+license_valid_license_error=Authorization authentication failed
+test_review_task_notice=Test review task notice
+swagger_url_scheduled_import_notification=SwaggerUrl Scheduled import notification
+test_track.length_less_than=The title is too long, the length must be less than
+# check owner
+check_owner_project=The current user does not have permission to operate this project
+check_owner_test=The current user does not have permission to operate this test
+check_owner_case=The current user does not have permission to operate this use case
+check_owner_plan=The current user does not have permission to operate this plan
+check_owner_review=The current user does not have permission to operate this review
+check_owner_comment=The current user does not have permission to manipulate this comment
+check_owner_workspace=The current user does not have permission to operate this workspace
+upload_content_is_null=Imported content is empty
+test_plan_notification=Test plan notification
+task_defect_notification=Task defect notification
+task_notification_=Timing task result notification
+api_definition_url_not_repeating=The interface request address already exists
+api_definition_name_not_repeating=The same name-url combination already exists
+task_notification_jenkins=Jenkins Task notification
+task_notification=Result notification
+message_task_already_exists=Task recipient already exists
+#automation
+automation_name_already_exists=the scenario already exists in the module of the same project
+automation_exec_info=There are no test steps to execute
+delete_check_reference_by=be referenced by Scenario
+not_execute=Not execute
+execute_not_pass=Not pass
+execute_pass=Pass
+import_fail_custom_num_exists=import fail, custom num is exists
+#authsource
+authsource_name_already_exists=Authentication source name already exists
+authsource_name_is_null=Authentication source name cannot be empty
+authsource_configuration_is_null=Authentication source configuration cannot be empty
+mobile_phone_number_cannot_be_empty=When the receiving mode is pin and enterprise wechat: the user's mobile phone number cannot be empty
+custom_field_already=A feild already exists under this workspace:
+template_already=A template already exists under this workspace:
+expect_name_exists=Expect name is exists
+ssl_password_error=The authentication password is wrong, please re-enter the password
+ssl_file_error=Failed to load the certification file, please check the certification file
+#log
+api_definition=Api definition
+api_definition_case=Api definition case
+api_automation_schedule=Api automation schedule
+api_automation=Api automation
+api_automation_report=Test Report
+track_test_case=Test case
+track_test_case_review=Case review
+track_test_plan=Test plan
+track_test_plan_schedule=Test plan schedule
+track_bug=Defect management
+track_report=Report
+performance_test=Performance test
+performance_test_report=Performance test report
+system_user=System user
+system_organization=System organization
+system_workspace=workspace
+system_test_resource=System test resource
+system_parameter_setting=System parameter setting
+system_quota_management=System Quota management
+system_authorization_management=System authorization management
+organization_member=Organization member
+organization_workspace=Organization workspace
+project_project_member=Project member
+workspace_service_integration=Workspace service integration
+workspace_message_settings=Workspace message settings
+workspace_member=Workspace member
+workspace_template_settings_field=Workspace template settings field
+workspace_template_settings_case=Workspace template settings case
+workspace_template_settings_issue=Workspace template settings issue
+project_project_manager=Project project manager
+project_project_jar=Project project jar
+project_environment_setting=Project environment setting
+project_file_management=Project file management
+personal_information_personal_settings=Personal information personal settings
+personal_information_apikeys=Personal information API Keys
+auth_title=Auth
+group_permission=Group
+test_case_status_prepare=Prepare
+test_case_status_again=Again
+test_case_status_running=Running
+test_case_status_finished=Finished
+test_case_status_error=Error
+test_case_status_success=Success
+test_case_status_trash=Trash
+test_case_status_saved=Saved
+connection_expired=The connection has expired, please get it again
+# track home
+api_case=Api
+performance_case=Performance
+scenario_case=Scenario
+scenario_name_is_null=Scenario name cannot be empty
+create_user=Create user
+test_case_status=Case status
+id_not_rightful=ID is not rightful
+project_reference_multiple_plateform=Projects point to multiple third-party platforms
+# mock
+mock_warning=No matching Mock expectation was found
+zentao_test_type_error=invalid Zentao request
+#项目报告
+enterprise_test_report=Enterprise report
+count=Count
+cannot_find_project=Cannot find project
+project_repeatable_is_false=Url repeatable not open
+#环境组
+null_environment_group_name=Environment group name is null
+environment_group_name=Environment group name
+environment_group_exist=already exists
+environment_group_has_duplicate_project=Environment group has duplicate project
+#误报库
+error_report_library=Error report
+issue_jira_info_error=Check the service integration information or Jira project ID
+error_code_is_unique=Error code is not unique
+no_version_exists=version not exists
+jira_auth_error=Account name or password (Token) is wrong
+jira_auth_url_error=The test connection failed, please check whether the Jira address is correct
+#ui 指令校驗
+param_error=Param Error
+is_null=can't be null
+url_is_null=URL can't be null
+frame_index_is_null=frame index can't be null
+element_is_null=element can't be null
+locator_is_null=locator can't be null
+coord=coord
+input_content=input
+subitem_type=subitem type
+subitem=subitem
+varname=variable
+varname_or_value=variable or value
+attributeName=attribute name
+webtitle_varname=title varname
+webhandle_varname=handle varname
+cant_be_negative=can't be negative
+expression=expression
+times=times
+command=command
+extract_type=extract type
+cmdValidation=validation
+cmdValidateValue=validate value
+cmdValidateText=validate text
+cmdValidateDropdown=validate dropdown
+cmdValidateElement=validate element
+cmdValidateTitle=validate title
+cmdOpen=open
+cmdSelectWindow=select window
+cmdSetWindowSize=set window size
+cmdSelectFrame=select frame
+cmdDialog=dialog operation
+cmdDropdownBox=dropdown
+submit=submit
+cmdSetItem=set item
+cmdWaitElement=wait element
+cmdInput=input
+cmdMouseClick=click
+cmdMouseMove=mouse move
+cmdMouseDrag=mouse drag
+cmdTimes=times
+cmdForEach=ForEach
+cmdWhile=While
+cmdIf=If
+cmdElse=Else
+cmdElseIf=ElseIf
+close=close
+cmdExtraction=extracion
+cmdExtractWindow=window extraction
+cmdExtractElement=element extraction
+tcp_mock_not_unique=This tcp port is be used
+no_tcp_mock_port=No idle tcp port, please contact administrators.
+name_already_exists_in_module=Name already exists in same module
+repository_module_already_exists=The repository name already exists at the same project
+can_not_move_to_repository_node=Can not move to repository node
+# issue template copy
+target_issue_template_not_checked=Cannot copy, target project not checked
+source_issue_template_is_empty=Copy error, source project is empty
\ No newline at end of file
diff --git a/backend/services/ui-test/src/main/resources/i18n/ui_zh_CN.properties b/backend/services/ui-test/src/main/resources/i18n/ui_zh_CN.properties
new file mode 100644
index 0000000000..9bf0e7818d
--- /dev/null
+++ b/backend/services/ui-test/src/main/resources/i18n/ui_zh_CN.properties
@@ -0,0 +1,379 @@
+#commons
+error_lang_invalid=语言参数错误
+file_cannot_be_null=文件不能为空!
+cannot_be_null=不能为空
+number=第
+row=行
+error=出错
+delete_fail=删除失败
+start_engine_fail=启动失败
+upload_fail=文件上传失败
+invalid_parameter=非法的参数
+name_already_exists=该名称已经存在
+resource_not_exist=资源不存在或已删除
+upload_file_fail_get_file_path_fail=文件上传失败,获取文件上传路径为空
+#user related
+user_email_already_exists=用户邮箱已存在
+user_id_is_null=用户ID不能为空
+user_name_is_null=用户名不能为空
+user_email_is_null=用户邮箱不能为空
+password_is_null=密码不能为空
+user_id_already_exists=用户id已存在
+password_modification_failed=旧密码输入错误,请重新输入
+cannot_delete_current_user=无法删除当前登录用户
+connection_failed=连接失败
+connection_timeout=连接超时
+user_already_exists=该用户已存在于当前成员列表中
+cannot_remove_current=无法移除当前登录用户
+login_fail=登录失败
+password_is_incorrect=用户名或密码不正确
+user_not_exist=用户不存在:
+user_has_been_disabled=用户已被禁用
+excessive_attempts=操作频繁
+user_locked=用户被锁定
+user_expires=用户过期
+not_authorized=未经授权
+user_apikey_limit=最多能有5个Api key
+please_logout_current_user=请先登出当前用户
+#load test
+edit_load_test_not_found=无法编辑测试,未找到测试:
+run_load_test_not_found=无法运行测试,未找到测试:
+run_load_test_file_not_found=无法运行测试,无法获取测试文件元信息,测试ID:
+run_load_test_file_content_not_found=无法运行测试,无法获取测试文件内容,测试ID:
+run_load_test_file_init_error=无法运行测试,请前往 [系统设置-系统-系统参数设置] 检查当前站点配置,详情见 https://metersphere.io/docs/v2.x/faq/load_test/#url
+load_test_is_running=测试正在运行, 请等待
+load_test_kafka_invalid=Kafka 不可用,请检查配置
+cannot_edit_load_test_running=不能修改正在运行的测试
+test_not_found=测试不存在:
+test_not_running=测试未运行
+load_test_already_exists=测试名称不能重复
+load_test_name_length=测试名称长度超过限制
+no_nodes_message=没有节点信息
+duplicate_node_ip=节点 IP 重复
+duplicate_node_port=节点 Port 重复
+duplicate_node_ip_port=节点 IP、Port 重复
+max_thread_insufficient=并发用户数超额
+related_case_del_fail_prefix=已关联到
+related_case_del_fail_suffix=测试用例,请先解除关联
+jmx_content_valid=JMX 内容无效,请检查
+container_delete_fail=容器由于网络原因停止失败,请重试
+load_test_report_file_not_exist=当前报告没有JTL文件,请等待或重新执行以便获取
+#workspace
+workspace_name_is_null=工作空间名不能为空
+workspace_name_already_exists=工作空间名已存在
+workspace_does_not_belong_to_user=当前工作空间不属于当前用户
+workspace_not_exists=工作空间不存在
+#test resource pool
+test_resource_pool_id_is_null=资源池ID不能为空
+test_resource_pool_name_is_null=资源池名称不能为空
+test_resource_pool_name_already_exists=资源池名称已存在
+load_test=性能测试
+test_resource_pool_is_use=正在使用此资源池,无法删除
+only_one_k8s=只能添加一个 K8S
+test_resource_pool_not_exists=测试资源池不存在
+test_resource_pool_invalid=当前测试使用的资源池处于禁用状态
+#project
+project_name_is_null=项目名称不能为空
+project_name_already_exists=项目名称已存在
+project_file_already_exists=项目下该文件已经存在
+project_file_in_use=占用文件,无法删除。
+#organization
+organization_name_is_null=组织名不能为空
+organization_name_already_exists=组织名已存在
+organization_does_not_belong_to_user=当前组织不属于当前用户
+organization_id_is_null=组织 ID 不能为空
+#api
+api_load_script_error=读取脚本失败
+illegal_xml_format=不合法的 XML 格式
+api_report_is_null="测试报告是未生成,无法更新"
+api_test_environment_already_exists="已存在该名称的环境配置"
+api_test=接口测试
+#test case
+test_case_node_level=层
+test_case_node_level_tip=模块树最大深度为
+test_case_module_not_null=所属模块不能为空
+test_case_create_module_fail=创建模块失败
+test_case_import_template_name=测试用例模版
+test_case_import_template_sheet=模版
+module_not_null=所属模块不能为空格
+user_not_exists=该项目下无该用户
+test_case_already_exists=该项目下已存在该测试用例
+parse_data_error=解析数据出错
+missing_header_information=缺少头部信息
+test_case_exist=该项目下已存在用例:
+node_deep_limit=节点深度不超过8层!
+before_delete_plan=该计划下存在关联测试用例,请先取消关联!
+incorrect_format=格式错误
+test_case_step_model_validate=必须为TEXT、STEP
+test_case_priority_validate=必须为P0、P1、P2、P3
+test_case_method_validate=必须为manual、auto
+test_case_name=用例名称
+test_case_type=用例类型
+test_case_maintainer=维护人
+test_case_priority=用例等级
+test_case_method=测试方式
+test_case_prerequisite=前置条件
+test_case_remark=备注
+test_case_step_desc=步骤描述
+test_case_step_result=预期结果
+test_case_module=所属模块
+test_case=功能用例
+user=用户
+user_import_template_name=用户导入模板
+user_import_template_sheet=模版
+user_import_format_wrong=格式错误
+user_import_id_is_repeat=ID重复
+user_import_email_is_repeat=E-mail重复
+user_import_password_format_wrong=密码格式错误
+user_import_phone_format_wrong=手机号码格式错误
+user_import_email_format_wrong=电子邮箱格式错误
+user_import_organization_not_fond=组织未找到
+user_import_workspace_not_fond=工作空间未找到
+org_admin=组织管理员
+org_member=组织成员
+test_manager=测试经理
+tester=测试成员
+read_only_user=只读用户
+module=模块
+num_needed_modify_testcase=修改用例时ID必填
+num_needless_create_testcase=创建用例时无需ID
+tag_tip_pattern=标签之间以分号或者逗号隔开
+preconditions_optional=前置条件选填
+remark_optional=备注选填
+do_not_modify_header_order=请勿修改表头顺序
+module_created_automatically=若无该模块将自动创建
+options=选项
+options_yes=是
+options_no=否
+required=必填
+password_format_is_incorrect=有效密码:8-30位,英文大小写字母+数字+特殊字符(可选)
+please_input_project_member=请填写该项目下的相关人员ID
+test_case_report_template_repeat=同一工作空间下不能存在同名模版
+plan_name_already_exists=测试计划名称已存在
+test_case_already_exists_excel=文件中存在多条相同用例
+test_case_module_already_exists=同层级下已存在该模块名称
+api_test_name_already_exists=测试名称已经存在
+functional_method_tip=功能测试不支持自动方式
+custom_num_is_exist=用例自定义ID已存在
+custom_num_is_not_exist=用例自定义ID不存在
+id_required=ID必填
+id_repeat_in_table=表格内ID重复
+step_model_tip=步骤描述填写 STEP,文本描述请填写 TEXT (非必填)
+case_status_not_exist=用例状态必须为未开始(Prepare)、进行中(Underway)、已完成(Completed)
+issue_project_not_exist=ID不存在或其它错误
+tapd_project_not_exist=关联的TAPD项目ID不存在
+zentao_get_project_builds_fail=获取影响版本错误
+zentao_project_id_not_exist=关联的禅道ID不存在或其它错误
+#ldap
+ldap_url_is_null=LDAP地址为空
+ldap_dn_is_null=LDAP绑定DN为空
+ldap_ou_is_null=LDAP参数OU为空
+ldap_password_is_null=LDAP密码为空
+ldap_connect_fail=连接LDAP失败
+ldap_connect_fail_user=连接LDAP失败,绑定的DN或密码错误
+ldap_user_filter_is_null=LDAP用户过滤器为空
+ldap_user_mapping_is_null=LDAP用户属性映射为空
+authentication_failed=用户认证失败,用户名或密码错误
+user_not_found_or_not_unique=用户不存在或者不唯一
+find_more_user=查找到多个用户
+ldap_authentication_not_enabled=LDAP认证未启用
+login_fail_email_null=登录失败,用户邮箱为空
+login_fail_ou_error=登录失败,请检查用户OU
+login_fail_filter_error=登录失败,请检查用户过滤器
+check_ldap_mapping=检查LDAP属性映射
+ldap_mapping_value_null=LDAP用户属性映射字段为空值
+oauth_mapping_config_error=OAuth2属性映射配置错误
+oauth_mapping_value_null=OAuth2用户属性映射字段为空值
+#quota
+quota_project_excess_ws_api=项目的接口测试数量总和不能超过工作空间的配额
+quota_project_excess_ws_performance=项目的性能测试数量总和不能超过工作空间的配额
+quota_project_excess_ws_max_threads=项目的最大并发数不能超过工作空间的配额
+quota_project_excess_ws_max_duration=项目的压测时长不能超过工作空间的配额
+quota_project_excess_ws_resource_pool=项目的资源池不能超过工作空间的资源池范围
+quota_project_excess_ws_vum_total=项目的总vum数量总和不能超过工作空间配额
+quota_vum_used_gt_vum_total=总vum数量不能小于已消耗的vum数量
+quota_api_excess_workspace=接口测试数量超过工作空间限额
+quota_api_excess_project=接口测试数量超过项目限额
+quota_performance_excess_workspace=性能测试数量超过工作空间限额
+quota_performance_excess_project=性能测试数量超过项目限额
+quota_max_threads_excess_workspace=最大并发数超过工作空间限额
+quota_max_threads_excess_project=最大并发数超过项目限额
+quota_duration_excess_workspace=压测时长超过工作空间限额
+quota_duration_excess_project=压测时长超过项目限额
+quota_member_excess_workspace=成员数超过工作空间配额
+quota_member_excess_project=成员数超过项目配额
+quota_project_excess_project=项目数超过工作空间配额
+quota_vum_used_excess_workspace=消耗的vum数量超过工作空间配额
+quota_vum_used_excess_project=消耗的vum数量超过项目配额
+import_xmind_count_error=思维导图导入用例数量不能超过 800 条
+license_valid_license_error=授权认证失败
+import_xmind_not_found=未找到测试用例
+test_review_task_notice=测试评审任务通知
+swagger_url_scheduled_import_notification=swagger_url定时导入通知
+test_track.length_less_than=标题过长,字数必须小于
+# check owner
+check_owner_project=当前用户没有操作此项目的权限
+check_owner_test=当前用户没有操作此测试的权限
+check_owner_case=当前用户没有操作此用例的权限
+check_owner_plan=当前用户没有操作此计划的权限
+check_owner_review=当前用户没有操作此评审的权限
+check_owner_comment=当前用户没有操作此评论的权限
+check_owner_workspace=当前用户没有操作此工作空间的权限
+upload_content_is_null=导入内容为空
+test_plan_notification=测试计划通知
+task_defect_notification=缺陷任务通知
+task_notification_=定时任务结果通知
+api_definition_url_not_repeating=接口请求地址已经存在
+api_definition_name_not_repeating=相同的名称-url组合已存在
+task_notification_jenkins=jenkins任务通知
+task_notification=任务通知
+message_task_already_exists=任务接收人已经存在
+#automation
+automation_name_already_exists=同一个项目的同一模块下,场景名称不能重复
+automation_exec_info=没有测试步骤,无法执行
+delete_check_reference_by=被场景引用
+not_execute=未执行
+execute_not_pass=未通过
+execute_pass=通过
+import_fail_custom_num_exists=导入失败,自定义ID已存在
+#authsource
+authsource_name_already_exists=认证源名称已经存在
+authsource_name_is_null=认证源名称不能为空
+authsource_configuration_is_null=认证源配置不能为空
+custom_field_already=工作空间下已存在该字段:
+template_already=工作空间下已存在该模板:
+expect_name_exists=预期名称已存在
+ssl_password_error=认证密码错误,请重新输入密码
+ssl_file_error=认证文件加载失败,请检查认证文件
+#log
+api_definition=接口定义
+api_definition_case=接口定义用例
+api_automation=接口自动化
+api_automation_schedule=接口自动化-定时任务
+api_automation_report=测试报告
+track_test_case=测试用例
+track_test_case_review=用例评审
+track_test_plan=测试计划
+track_test_plan_schedule=测试计划-定时任务
+track_bug=缺陷管理
+track_report=报告
+performance_test=性能测试
+performance_test_report=性能测试报告
+system_user=系统-用户
+system_organization=系统-组织
+system_workspace=工作空间
+system_test_resource=系统-测试资源池
+system_parameter_setting=系统-系统参数设置
+system_quota_management=系统-配额管理
+system_authorization_management=系统-授权管理
+organization_member=组织-成员
+organization_workspace=组织-工作空间
+workspace_service_integration=工作空间-服务集成
+workspace_message_settings=工作空间-消息设置
+workspace_member=工作空间-成员
+workspace_template_settings_field=工作空间-模版设置-自定义字段
+workspace_template_settings_case=工作空间-模版设置-用例模版
+workspace_template_settings_issue=工作空间-模版设置-缺陷模版
+project_project_manager=项目-项目管理
+project_project_member=项目-成员
+project_project_jar=項目-JAR包管理
+project_environment_setting=项目-环境设置
+project_file_management=项目-文件管理
+personal_information_personal_settings=个人信息-个人设置
+personal_information_apikeys=个人信息-API Keys
+auth_title=系统认证
+group_permission=用户组与权限
+test_case_status_prepare=未开始
+test_case_status_again=重新提审
+test_case_status_running=进行中
+test_case_status_finished=已完成
+connection_expired=连接已失效,请重新获取
+# track home
+api_case=接口用例
+performance_case=性能用例
+scenario_case=场景用例
+scenario_name_is_null=场景名称不能为空
+test_case_status_error=失败
+test_case_status_success=成功
+test_case_status_trash=废弃
+test_case_status_saved=已保存
+create_user=创建人
+test_case_status=用例状态
+id_not_rightful=ID 不合法
+project_reference_multiple_plateform=项目指向多个第三方平台
+# mock
+mock_warning=未找到匹配的Mock期望
+zentao_test_type_error=无效的 Zentao 请求
+#项目报告
+enterprise_test_report=项目报告
+count=统计
+cannot_find_project=未找到测试项目
+project_repeatable_is_false=项目未配置URL可重复
+#环境组
+null_environment_group_name=环境组名称不存在
+environment_group_name=环境组名称
+environment_group_exist=已存在
+environment_group_has_duplicate_project=每个项目只能选择一个环境!
+#误报库
+error_report_library=误报库
+issue_jira_info_error=请检查服务集成信息或Jira项目ID
+error_code_is_unique=错误代码不可重复
+no_version_exists=不存在版本!请先创建项目的版本
+jira_auth_error=账号名或密码(Token)错误
+jira_auth_url_error=测试连接失败,请检查Jira地址是否正确
+#ui 指令校验
+param_error=参数校验失败!请检查
+is_null=不能为空
+url_is_null=URL 参数不能为空
+frame_index_is_null=网页索引号不能为空
+element_is_null=元素对象已经被删除
+locator_is_null=元素定位参数不能有空
+coord=坐标
+input_content=输入内容
+subitem_type=子选项类型
+subitem=子选项值
+varname=变量名
+varname_or_value=变量名或变量值
+attributeName=属性名
+webtitle_varname=网页标题变量名
+webhandle_varname=网页窗口 handle变量名
+cant_be_negative=不能为负数
+expression=表达式
+times=循环次数
+command=步骤
+extract_type=提取信息类型
+cmdValidation=断言
+cmdValidateValue=断言值
+cmdValidateText=弹窗文本
+cmdValidateDropdown=下拉框
+cmdValidateElement=元素断言
+cmdValidateTitle=网页标题
+cmdOpen=打开网页
+cmdSelectWindow=切换窗口
+cmdSetWindowSize=设置窗口大小
+cmdSelectFrame=选择内嵌网页
+cmdDialog=弹窗操作
+cmdDropdownBox=下拉框操作
+submit=提交表单
+cmdSetItem=设置选项
+cmdWaitElement=等待元素
+cmdInput=输入操作
+cmdMouseClick=鼠标点击
+cmdMouseMove=鼠标移动
+cmdMouseDrag=鼠标拖拽
+cmdTimes=次数循环
+cmdForEach=ForEach 循环
+cmdWhile=While 循环
+cmdIf=If
+cmdElse=Else
+cmdElseIf=ElseIf
+close=关闭网页
+cmdExtraction=数据提取
+cmdExtractWindow=提取窗口信息
+cmdExtractElement=提取元素信息
+tcp_mock_not_unique=该TCP端口号已被使用
+no_tcp_mock_port=无可用的TCP端口号,请联系管理员
+name_already_exists_in_module=同层级下已经存在
+# issue template copy
+target_issue_template_not_checked=无法复制,未选中目标项目
+source_issue_template_is_empty=复制错误,源项目为空
diff --git a/backend/services/ui-test/src/main/resources/i18n/ui_zh_TW.properties b/backend/services/ui-test/src/main/resources/i18n/ui_zh_TW.properties
new file mode 100644
index 0000000000..3323dc8c5d
--- /dev/null
+++ b/backend/services/ui-test/src/main/resources/i18n/ui_zh_TW.properties
@@ -0,0 +1,378 @@
+#commons
+error_lang_invalid=語言參數錯誤
+file_cannot_be_null=文件不能為空!
+cannot_be_null=不能為空
+number=第
+row=行
+error=出錯
+delete_fail=刪除失敗
+start_engine_fail=啟動失敗
+upload_fail=文件上傳失敗
+invalid_parameter=非法的參數
+name_already_exists=該名稱已經存在
+resource_not_exist=資源不存在或已刪除
+upload_file_fail_get_file_path_fail=文件上傳失敗,獲取文件上傳路徑為空
+#user related
+user_email_already_exists=用戶郵箱已存在
+user_id_is_null=用戶ID不能為空
+user_name_is_null=用戶名不能為空
+user_email_is_null=用戶郵箱不能為空
+password_is_null=密碼不能為空
+user_id_already_exists=用戶id已存在
+password_modification_failed=舊密碼輸入錯誤,請重新輸入
+cannot_delete_current_user=無法刪除當前登錄用戶
+connection_failed=連接失敗
+connection_timeout=連接超時
+user_already_exists=該用戶已存在於當前成員列表中
+cannot_remove_current=無法移除當前登錄用戶
+login_fail=登錄失敗
+password_is_incorrect=用戶名或密碼不正確
+user_not_exist=用戶不存在:
+user_has_been_disabled=用戶已被禁用
+excessive_attempts=操作頻繁
+user_locked=用戶被鎖定
+user_expires=用戶過期
+not_authorized=未經授權
+user_apikey_limit=最多能有5個Api key
+please_logout_current_user=請先登出當前用戶
+#load test
+edit_load_test_not_found=無法編輯測試,未找到測試:
+run_load_test_not_found=無法運行測試,未找到測試:
+run_load_test_file_not_found=無法運行測試,無法獲取測試文件元信息,測試ID:
+run_load_test_file_content_not_found=無法運行測試,無法獲取測試文件內容,測試ID:
+run_load_test_file_init_error=無法運行測試,請前往 [系統設置-系統-系統參數設置] 檢查當前站點配置,詳情見 https://metersphere.io/docs/v2.x/faq/load_test/#url
+load_test_is_running=測試正在運行, 請等待
+load_test_kafka_invalid=Kafka 不可用,請檢查配置
+cannot_edit_load_test_running=不能修改正在運行的測試
+test_not_found=測試不存在:
+test_not_running=測試未運行
+load_test_already_exists=測試名稱不能重復
+load_test_name_length=測試名稱長度超過限製
+no_nodes_message=沒有節點信息
+duplicate_node_ip=節點 IP 重復
+duplicate_node_port=節點 Port 重復
+duplicate_node_ip_port=節點 IP、Port 重復
+max_thread_insufficient=並發用戶數超額
+related_case_del_fail_prefix=已關聯到
+related_case_del_fail_suffix=測試用例,請先解除關聯
+jmx_content_valid=JMX 內容無效,請檢查
+container_delete_fail=容器由於網絡原因停止失敗,請重試
+load_test_report_file_not_exist=當前報告沒有JTL文件,請等待或重新執行以便獲取
+#workspace
+workspace_name_is_null=工作空間名不能為空
+workspace_name_already_exists=工作空間名已存在
+workspace_does_not_belong_to_user=當前工作空間不屬於當前用戶
+workspace_not_exists=工作空間不存在
+#test resource pool
+test_resource_pool_id_is_null=資源池ID不能為空
+test_resource_pool_name_is_null=資源池名稱不能為空
+test_resource_pool_name_already_exists=資源池名稱已存在
+load_test=性能測試
+test_resource_pool_is_use=正在使用此資源池,無法刪除
+only_one_k8s=只能添加一個 K8S
+test_resource_pool_not_exists=測試資源池不存在
+test_resource_pool_invalid=當前測試使用的資源池處於禁用狀態
+#project
+project_name_is_null=項目名稱不能為空
+project_name_already_exists=項目名稱已存在
+project_file_already_exists=項目下該文件已經存在
+project_file_in_use=占用文件,無法刪除。
+#organization
+organization_name_is_null=組織名不能為空
+organization_name_already_exists=組織名已存在
+organization_does_not_belong_to_user=當前組織不屬於當前用戶
+organization_id_is_null=組織 ID 不能為空
+#api
+api_load_script_error=讀取腳本失敗
+illegal_xml_format=不合法的 XML 格式
+api_report_is_null="測試報告是未生成,無法更新"
+api_test_environment_already_exists="已存在該名稱的環境配置"
+api_test=接口測試
+#test case
+test_case_node_level=層
+test_case_node_level_tip=模塊樹最大深度為
+test_case_module_not_null=所屬模塊不能為空
+test_case_create_module_fail=創建模塊失敗
+test_case_import_template_name=測試用例模版
+test_case_import_template_sheet=模版
+module_not_null=所屬模塊不能為空格
+user_not_exists=該項目下無該用戶
+test_case_already_exists=該項目下已存在該測試用例
+parse_data_error=解析數據出錯
+missing_header_information=缺少頭部信息
+test_case_exist=該項目下已存在用例:
+node_deep_limit=節點深度不超過8層!
+before_delete_plan=該計劃下存在關聯測試用例,請先取消關聯!
+incorrect_format=格式錯誤
+test_case_step_model_validate=必須為TEXT、STEP
+test_case_priority_validate=必須為P0、P1、P2、P3
+test_case_method_validate=必須為manual、auto
+test_case_name=用例名稱
+test_case_type=用例類型
+test_case_maintainer=維護人
+test_case_priority=用例等級
+test_case_method=測試方式
+test_case_prerequisite=前置條件
+test_case_remark=備註
+test_case_step_desc=步驟描述
+test_case_step_result=預期結果
+test_case_module=所屬模塊
+test_case=功能用例
+user=用戶
+user_import_template_name=用戶導入模板
+user_import_template_sheet=模版
+user_import_format_wrong=格式錯誤
+user_import_id_is_repeat=ID重復
+user_import_email_is_repeat=E-mail重復
+user_import_password_format_wrong=密碼格式錯誤
+user_import_phone_format_wrong=手機號碼格式錯誤
+user_import_email_format_wrong=電子郵箱格式錯誤
+user_import_organization_not_fond=組織未找到
+user_import_workspace_not_fond=工作空間未找到
+org_admin=組織管理員
+org_member=組織成員
+test_manager=測試經理
+tester=測試成員
+read_only_user=只讀用戶
+module=模塊
+num_needed_modify_testcase=修改用例時ID必填
+num_needless_create_testcase=創建用例時無需ID
+tag_tip_pattern=標簽之間以分號或者逗號隔開
+preconditions_optional=前置條件選填
+remark_optional=備註選填
+do_not_modify_header_order=請勿修改表頭順序
+module_created_automatically=若無該模塊將自動創建
+options=選項
+options_yes=是
+options_no=否
+required=必填
+password_format_is_incorrect=有效密碼:8-30位,英文大小寫字母+數字+特殊字符(可選)
+please_input_project_member=請填寫該項目下的相關人員ID
+test_case_report_template_repeat=同一工作空間下不能存在同名模版
+plan_name_already_exists=測試計劃名稱已存在
+test_case_already_exists_excel=文件中存在多條相同用例
+test_case_module_already_exists=同層級下已存在該模塊名稱
+api_test_name_already_exists=測試名稱已經存在
+functional_method_tip=功能測試不支持自動方式
+custom_num_is_exist=用例自定義ID已存在
+custom_num_is_not_exist=用例自定義ID不存在
+id_required=ID必填
+id_repeat_in_table=表格內ID重復
+step_model_tip=步驟描述填寫 STEP,文本描述請填寫 TEXT (非必填)
+case_status_not_exist=用例狀態必須為未開始(Prepare)、進行中(Underway)、已完成(Completed)
+issue_project_not_exist=ID不存在或其它錯誤
+tapd_project_not_exist=關聯的TAPD項目ID不存在
+zentao_get_project_builds_fail=獲取影響版本錯誤
+zentao_project_id_not_exist=關聯的禪道ID不存在或其它錯誤
+#ldap
+ldap_url_is_null=LDAP地址為空
+ldap_dn_is_null=LDAP綁定DN為空
+ldap_ou_is_null=LDAP參數OU為空
+ldap_password_is_null=LDAP密碼為空
+ldap_connect_fail=連接LDAP失敗
+ldap_connect_fail_user=連接LDAP失敗,綁定的DN或密碼錯誤
+ldap_user_filter_is_null=LDAP用戶過濾器為空
+ldap_user_mapping_is_null=LDAP用戶屬性映射為空
+authentication_failed=用戶認證失敗,用戶名或密碼錯誤
+user_not_found_or_not_unique=用戶不存在或者不唯一
+find_more_user=查找到多個用戶
+ldap_authentication_not_enabled=LDAP認證未啟用
+login_fail_email_null=登錄失敗,用戶郵箱為空
+login_fail_ou_error=登錄失敗,請檢查用戶OU
+login_fail_filter_error=登錄失敗,請檢查用戶過濾器
+check_ldap_mapping=檢查LDAP屬性映射
+ldap_mapping_value_null=LDAP用戶屬性映射字段為空值
+oauth_mapping_config_error=OAuth2屬性映射配置錯誤
+oauth_mapping_value_null=OAuth2用戶屬性映射字段為空值
+#quota
+quota_project_excess_ws_api=項目的接口測試數量總和不能超過工作空間的配額
+quota_project_excess_ws_performance=項目的性能測試數量總和不能超過工作空間的配額
+quota_project_excess_ws_max_threads=項目的最大並發數不能超過工作空間的配額
+quota_project_excess_ws_max_duration=項目的壓測時長不能超過工作空間的配額
+quota_project_excess_ws_resource_pool=項目的資源池不能超過工作空間的資源池範圍
+quota_project_excess_ws_vum_total=項目的總vum數量總和不能超過工作空間配額
+quota_api_excess_workspace=接口測試數量超過工作空間限額
+quota_vum_used_gt_vum_total=總vum數量不能小於已消耗的vum數量
+quota_api_excess_project=接口測試數量超過項目限額
+quota_performance_excess_workspace=性能測試數量超過工作空間限額
+quota_performance_excess_project=性能測試數量超過項目限額
+quota_max_threads_excess_workspace=最大並發數超過工作空間限額
+quota_max_threads_excess_project=最大並發數超過項目限額
+quota_duration_excess_project=壓測時長超過項目限額
+quota_member_excess_workspace=成員數超過工作空間配額
+quota_member_excess_project=成員數超過項目配額
+quota_project_excess_project=項目數超過工作空間配額
+quota_vum_used_excess_workspace=消耗的vum數量超過工作空間配額
+quota_vum_used_excess_project=消耗的vum數量超過項目配額
+import_xmind_count_error=思維導圖導入用例數量不能超過 800 條
+license_valid_license_error=授權認證失敗
+import_xmind_not_found=未找到測試用例
+test_review_task_notice=測試評審任務通知
+swagger_url_scheduled_import_notification=swagger_url定時導入通知
+test_track.length_less_than=標題過長,字數必須小於
+# check owner
+check_owner_project=當前用戶沒有操作此項目的權限
+check_owner_test=當前用戶沒有操作此測試的權限
+check_owner_case=當前用戶沒有操作此用例的權限
+check_owner_plan=當前用戶沒有操作此計劃的權限
+check_owner_review=當前用戶沒有操作此評審的權限
+check_owner_comment=當前用戶沒有操作此評論的權限
+check_owner_workspace=當前用戶沒有操作此工作空間的權限
+upload_content_is_null=導入內容為空
+test_plan_notification=測試計劃通知
+task_defect_notification=缺陷任務通知
+task_notification_=定時任務結果通知
+api_definition_url_not_repeating=接口請求地址已經存在
+api_definition_name_not_repeating=相同的名稱-url組合已存在
+task_notification_jenkins=jenkins任務通知
+task_notification=任務通知
+message_task_already_exists=任務接收人已經存在
+#automation
+automation_name_already_exists=同一個項目同一模塊下,場景名稱不能重復
+automation_exec_info=沒有測試步驟,無法執行
+delete_check_reference_by=被場景引用
+not_execute=未執行
+execute_not_pass=未通過
+execute_pass=通過
+import_fail_custom_num_exists=導入失敗,自定義ID已存在
+#authsource
+authsource_name_already_exists=認證源名稱已經存在
+authsource_name_is_null=認證源名稱不能為空
+authsource_configuration_is_null=認證源配置不能為空
+custom_field_already=工作空間下已存在該字段:
+template_already=工作空間下已存在該模板:
+expect_name_exists=預期名稱已存在
+ssl_password_error=認證密碼錯誤,請重新輸入密碼
+ssl_file_error=認證文件加載失敗,請檢查認證文件
+#log
+api_definition=接口定義
+api_definition_case=接口定義用例
+api_automation=接口自動化
+api_automation_schedule=接口自動化-定時任務
+api_automation_report=測試報告
+track_test_case=測試用例
+track_test_case_review=用例評審
+track_test_plan=測試計劃
+track_test_plan_schedule=測試計劃-定時任務
+track_bug=缺陷管理
+track_report=報告
+performance_test=性能測試
+performance_test_report=性能測試報告
+system_user=系統-用戶
+system_organization=系統-組織
+system_workspace=工作空間
+system_test_resource=系統-測試資源池
+system_parameter_setting=系統-系統參數設置
+system_quota_management=系統-配額管理
+system_authorization_management=系統-授權管理
+organization_member=組織-成員
+organization_workspace=組織-工作空間
+workspace_service_integration=工作空間-服務集成
+workspace_message_settings=工作空間-消息設置
+workspace_member=工作空間-成員
+workspace_template_settings_field=工作空間-模版設置-自定義字段
+workspace_template_settings_case=工作空間-模版設置-用例模版
+workspace_template_settings_issue=工作空間-模版設置-缺陷模版
+project_project_manager=項目-項目管理
+project_project_member=項目-成員
+project_project_jar=項目-JAR包管理
+project_environment_setting=項目-環境設置
+project_file_management=項目-文件管理
+personal_information_personal_settings=個人信息-個人設置
+personal_information_apikeys=個人信息-API Keys
+auth_title=系統認證
+group_permission=用戶組與權限
+test_case_status_prepare=未開始
+test_case_status_again=重新提審
+test_case_status_running=進行中
+test_case_status_finished=已完成
+connection_expired=連接已失效,請重新獲取
+# track home
+api_case=接口用例
+performance_case=性能用例
+scenario_case=場景用例
+scenario_name_is_null=場景名稱不能為空
+test_case_status_error=失敗
+test_case_status_success=成功
+test_case_status_trash=廢棄
+test_case_status_saved=已保存
+create_user=創建人
+test_case_status=用例狀態
+id_not_rightful=ID 不合法
+project_reference_multiple_plateform=項目指向多個第三方平臺
+# mock
+mock_warning=未找到匹配的Mock期望
+zentao_test_type_error=請求方式錯誤
+#项目报告
+enterprise_test_report=項目報告
+count=統計
+cannot_find_project=未找到測試項目
+project_repeatable_is_false=項目未配置URL可重複
+#环境组
+null_environment_group_name=環境組名稱不存在
+environment_group_name=環境組名稱
+environment_group_exist=已存在
+environment_group_has_duplicate_project=每個項目只能選擇一個環境!
+#误报库
+error_report_library=誤報庫
+issue_jira_info_error=請檢查服務集成信息或Jira項目ID
+error_code_is_unique=錯誤代碼不可重複
+no_version_exists=不存在版本!請先創建項目的版本
+jira_auth_error=賬號名或密碼(Token)錯誤
+jira_auth_url_error=測試連接失敗,請檢查Jira地址是否正確
+#ui 指令校驗
+param_error=參數校驗失敗!請檢查
+is_null=不能為空
+url_is_null=URL 參數不能為空
+frame_index_is_null=網頁索引號不能為空
+element_is_null=元素對象已經被刪除
+locator_is_null=元素定位參數不能有空
+coord=坐標
+input_content=輸入內容
+subitem_type=子選項類型
+subitem=子選項值
+varname=變量名
+varname_or_value=變量名或變量值
+attributeName=屬性名
+webtitle_varname=網頁標題變量名
+webhandle_varname=網頁窗口 handle變量名
+cant_be_negative=不能為負數
+expression=表達式
+times=循環次數
+command=步驟
+extract_type=提取信息類型
+cmdValidation=斷言
+cmdValidateValue=斷言值
+cmdValidateText=彈窗文本
+cmdValidateDropdown=下拉框
+cmdValidateElement=元素斷言
+cmdValidateTitle=網頁標題
+cmdOpen=打開網頁
+cmdSelectWindow=切換窗口
+cmdSetWindowSize=設置窗口大小
+cmdSelectFrame=選擇內嵌網頁
+cmdDialog=彈窗操作
+cmdDropdownBox=下拉框操作
+submit=提交表單
+cmdSetItem=設置選項
+cmdWaitElement=等待元素
+cmdInput=輸入操作
+cmdMouseClick=鼠標點擊
+cmdMouseMove=鼠標移動
+cmdMouseDrag=鼠標拖拽
+cmdTimes=次數循環
+cmdForEach=ForEach 循環
+cmdWhile=While 循環
+cmdIf=If
+cmdElse=Else
+cmdElseIf=ElseIf
+close=關閉網頁
+cmdExtraction=數據提取
+cmdExtractWindow=提取窗口信息
+cmdExtractElement=提取元素信息
+tcp_mock_not_unique=該TCP端口號已被使用
+no_tcp_mock_port=無可用的TCP端口號,請聯繫管理員
+name_already_exists_in_module=同層級下已存在
+# issue template copy
+target_issue_template_not_checked=無法複製,未選中目標項目
+source_issue_template_is_empty=複製錯誤,源項目為空
diff --git a/backend/services/workstation/pom.xml b/backend/services/workstation/pom.xml
new file mode 100644
index 0000000000..b317fd7513
--- /dev/null
+++ b/backend/services/workstation/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ io.metersphere
+ services
+ ${revision}
+
+ workstation
+ ${revision}
+ workstation
+
+
+
+
+ io.metersphere
+ sdk
+ ${revision}
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.properties
+ **/*.xml
+ **/*.json
+ **/*.tpl
+ **/*.js
+
+ false
+
+
+ src/main/resources
+
+ **/*
+
+ false
+
+
+
+
+
+
+
+
diff --git a/backend/services/workstation/src/main/java/io/metersphere/workstation/utils/ShareUtil.java b/backend/services/workstation/src/main/java/io/metersphere/workstation/utils/ShareUtil.java
new file mode 100644
index 0000000000..55246c7524
--- /dev/null
+++ b/backend/services/workstation/src/main/java/io/metersphere/workstation/utils/ShareUtil.java
@@ -0,0 +1,50 @@
+package io.metersphere.workstation.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+
+public class ShareUtil {
+
+ private static final String UNIT_HOUR = "H";
+ private static final String UNIT_DAY = "D";
+ private static final String UNIT_MONTH = "M";
+ private static final String UNIT_YEAR = "Y";
+
+ /**
+ * return time + expr
+ *
+ * @param time
+ * @param expr
+ * @return
+ */
+ public static long getTimeMills(long time, String expr) {
+ Instant instant = Instant.ofEpochMilli(time);
+ ZoneId zone = ZoneId.systemDefault();
+ LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
+ long timeMills = 0;
+ LocalDateTime date = exprToLocalDateTime(localDateTime, expr);
+ if (date != null) {
+ timeMills = date.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+ }
+ return timeMills;
+ }
+
+ public static LocalDateTime exprToLocalDateTime(LocalDateTime localDateTime, String expr) {
+ LocalDateTime date = null;
+ String unit = expr.substring(expr.length() - 1);
+ int quantity = Integer.parseInt(expr.substring(0, expr.length() - 1));
+ if (StringUtils.equals(unit, UNIT_HOUR)) {
+ date = localDateTime.plusHours(quantity);
+ } else if (StringUtils.equals(unit, UNIT_DAY)) {
+ date = localDateTime.plusDays(quantity);
+ } else if (StringUtils.equals(unit, UNIT_MONTH)) {
+ date = localDateTime.plusMonths(quantity);
+ } else if (StringUtils.equals(unit, UNIT_YEAR)) {
+ date = localDateTime.plusYears(quantity);
+ }
+ return date;
+ }
+}
diff --git a/backend/services/workstation/src/main/resources/i18n/workstation.properties b/backend/services/workstation/src/main/resources/i18n/workstation.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/workstation/src/main/resources/i18n/workstation_en_US.properties b/backend/services/workstation/src/main/resources/i18n/workstation_en_US.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/workstation/src/main/resources/i18n/workstation_zh_CN.properties b/backend/services/workstation/src/main/resources/i18n/workstation_zh_CN.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/services/workstation/src/main/resources/i18n/workstation_zh_TW.properties b/backend/services/workstation/src/main/resources/i18n/workstation_zh_TW.properties
new file mode 100644
index 0000000000..e69de29bb2