diff --git a/backend/src/main/java/io/metersphere/excel/constants/TestCaseImportFiled.java b/backend/src/main/java/io/metersphere/excel/constants/TestCaseImportFiled.java index 8578692a6e..c9f553ad76 100644 --- a/backend/src/main/java/io/metersphere/excel/constants/TestCaseImportFiled.java +++ b/backend/src/main/java/io/metersphere/excel/constants/TestCaseImportFiled.java @@ -61,4 +61,8 @@ public enum TestCaseImportFiled { } return tags; } + + public boolean containsHead(String head) { + return filedLangMap.values().contains(head); + } } diff --git a/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportCommendConverter.java b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportCommendConverter.java new file mode 100644 index 0000000000..52b27db160 --- /dev/null +++ b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportCommendConverter.java @@ -0,0 +1,62 @@ +package io.metersphere.excel.converter; + +import io.metersphere.commons.constants.TestCaseCommentType; +import io.metersphere.commons.constants.TestPlanTestCaseStatus; +import io.metersphere.commons.constants.TestReviewCaseStatus; +import io.metersphere.commons.utils.CommonBeanFactory; +import io.metersphere.commons.utils.DateUtils; +import io.metersphere.i18n.Translator; +import io.metersphere.track.dto.TestCaseCommentDTO; +import io.metersphere.track.dto.TestCaseDTO; +import io.metersphere.track.service.TestCaseCommentService; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; + +public class TestCaseExportCommendConverter implements TestCaseExportConverter { + + private HashMap commendTypeMap = new HashMap<>(); + private HashMap planCaseStatusMap = new HashMap<>(); + private HashMap reviewCaseStatusMap = new HashMap<>(); + + public TestCaseExportCommendConverter() { + commendTypeMap.put(TestCaseCommentType.CASE.name(), "test_case_comment"); + commendTypeMap.put(TestCaseCommentType.PLAN.name(), "test_case_plan_comment"); + commendTypeMap.put(TestCaseCommentType.REVIEW.name(), "test_case_review_comment"); + + planCaseStatusMap.put(TestPlanTestCaseStatus.Pass.name(), "execute_pass"); + planCaseStatusMap.put(TestPlanTestCaseStatus.Underway.name(), "test_case_status_prepare"); + planCaseStatusMap.put(TestPlanTestCaseStatus.Blocking.name(), "plan_case_status_blocking"); + planCaseStatusMap.put(TestPlanTestCaseStatus.Failure.name(), "test_case_status_error"); + planCaseStatusMap.put(TestPlanTestCaseStatus.Skip.name(), "plan_case_status_skip"); + + reviewCaseStatusMap.put(TestReviewCaseStatus.Prepare.name(), "test_case_status_prepare"); + reviewCaseStatusMap.put(TestReviewCaseStatus.Pass.name(), "execute_pass"); + reviewCaseStatusMap.put(TestReviewCaseStatus.UnPass.name(), "execute_not_pass"); + } + + @Override + public String parse(TestCaseDTO testCase) { + TestCaseCommentService testCaseCommentService = CommonBeanFactory.getBean(TestCaseCommentService.class); + List caseComments = testCaseCommentService.getCaseComments(testCase.getId()); + StringBuilder result = new StringBuilder(); + String template = Translator.get("test_case_comment_template"); + caseComments.forEach(comment -> { + String authorName = comment.getAuthorName(); + String type = getFromMapOfNullableWithTranslate(commendTypeMap, comment.getType()); + String status = ""; + if (StringUtils.equals(comment.getType(), TestCaseCommentType.PLAN.name())) { + status = getFromMapOfNullableWithTranslate(planCaseStatusMap, comment.getStatus()); + status = "[".concat(status).concat("]"); + } else if (StringUtils.equals(comment.getType(), TestCaseCommentType.REVIEW.name())) { + status = getFromMapOfNullableWithTranslate(reviewCaseStatusMap, comment.getStatus()); + status = "[".concat(status).concat("]"); + } + String updateTime = DateUtils.getTimeString(comment.getUpdateTime()); + String description = comment.getDescription(); + result.append(String.format(template, authorName, type, status, updateTime, description)); + }); + return result.toString(); + } +} diff --git a/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportConverter.java b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportConverter.java new file mode 100644 index 0000000000..52300f7c7d --- /dev/null +++ b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportConverter.java @@ -0,0 +1,31 @@ +package io.metersphere.excel.converter; + +import io.metersphere.i18n.Translator; +import io.metersphere.track.dto.TestCaseDTO; +import org.apache.commons.lang3.StringUtils; + +import java.util.Map; + +/** + * 功能用例导出时解析其他字段对应的列 + * @author jianxing + */ +public interface TestCaseExportConverter { + + String parse(TestCaseDTO testCase); + + default String getFromMapOfNullable(Map map, String key) { + if (StringUtils.isNotBlank(key)) { + return map.get(key); + } + return ""; + } + + default String getFromMapOfNullableWithTranslate(Map map, String key) { + String value = getFromMapOfNullable(map, key); + if (StringUtils.isNotBlank(value)) { + return Translator.get(value); + } + return value; + } +} diff --git a/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportConverterFactory.java b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportConverterFactory.java new file mode 100644 index 0000000000..94f9c4becf --- /dev/null +++ b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportConverterFactory.java @@ -0,0 +1,51 @@ +package io.metersphere.excel.converter; + +import io.metersphere.commons.utils.LogUtil; +import io.metersphere.track.constants.TestCaseExportOtherField; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TestCaseExportConverterFactory { + + public static Map getConverters(List keys) { + Map converterMapResult = new HashMap<>(); + try { + HashMap> converterMap = getConverterMap(); + for (String key : keys) { + Class clazz = converterMap.get(key); + if (clazz != null) { + converterMapResult.put(key, clazz.getDeclaredConstructor().newInstance()); + } + } + } catch (Exception e) { + LogUtil.error(e); + } + return converterMapResult; + } + + public static TestCaseExportConverter getConverter(String key) { + try { + Class clazz = getConverterMap().get(key); + if (clazz != null) { + return clazz.getDeclaredConstructor().newInstance(); + } + } catch (Exception e) { + LogUtil.error(e); + } + return null; + } + + private static HashMap> getConverterMap() { + return new HashMap<>() {{ + put(TestCaseExportOtherField.VERSION.getValue(), TestCaseExportVersionConverter.class); + put(TestCaseExportOtherField.COMMEND.getValue(), TestCaseExportCommendConverter.class); + put(TestCaseExportOtherField.EXECUTE_RESULT.getValue(), TestCaseExportExecuteResultConverter.class); + put(TestCaseExportOtherField.REVIEW_RESULT.getValue(), TestCaseExportReviewResultConverter.class); + put(TestCaseExportOtherField.CREATOR.getValue(), TestCaseExportCreatorConverter.class); + put(TestCaseExportOtherField.CREATE_TIME.getValue(), TestCaseExportCreateTimeConverter.class); + put(TestCaseExportOtherField.UPDATE_TIME.getValue(), TestCaseExportUpdateTimeConverter.class); + }}; + } +} diff --git a/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportCreateTimeConverter.java b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportCreateTimeConverter.java new file mode 100644 index 0000000000..6f32437f2e --- /dev/null +++ b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportCreateTimeConverter.java @@ -0,0 +1,12 @@ +package io.metersphere.excel.converter; + +import io.metersphere.commons.utils.DateUtils; +import io.metersphere.track.dto.TestCaseDTO; + +public class TestCaseExportCreateTimeConverter implements TestCaseExportConverter { + + @Override + public String parse(TestCaseDTO testCase) { + return DateUtils.getTimeString(testCase.getCreateTime()); + } +} diff --git a/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportCreatorConverter.java b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportCreatorConverter.java new file mode 100644 index 0000000000..1e7f99a947 --- /dev/null +++ b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportCreatorConverter.java @@ -0,0 +1,27 @@ +package io.metersphere.excel.converter; + +import io.metersphere.base.domain.User; +import io.metersphere.commons.utils.CommonBeanFactory; +import io.metersphere.commons.utils.SessionUtils; +import io.metersphere.service.UserService; +import io.metersphere.track.dto.TestCaseDTO; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TestCaseExportCreatorConverter implements TestCaseExportConverter { + + private Map userMap = new HashMap<>(); + + public TestCaseExportCreatorConverter() { + UserService userService = CommonBeanFactory.getBean(UserService.class); + List memberOption = userService.getProjectMemberOption(SessionUtils.getCurrentProjectId()); + memberOption.forEach(option -> userMap.put(option.getId(), option.getName())); + } + + @Override + public String parse(TestCaseDTO testCase) { + return getFromMapOfNullable(userMap, testCase.getCreateUser()); + } +} diff --git a/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportExecuteResultConverter.java b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportExecuteResultConverter.java new file mode 100644 index 0000000000..f4728a6d17 --- /dev/null +++ b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportExecuteResultConverter.java @@ -0,0 +1,25 @@ +package io.metersphere.excel.converter; + +import io.metersphere.commons.constants.TestPlanTestCaseStatus; +import io.metersphere.track.dto.TestCaseDTO; + +import java.util.HashMap; +import java.util.Map; + +public class TestCaseExportExecuteResultConverter implements TestCaseExportConverter { + + private Map planCaseStatusMap = new HashMap<>(); + + public TestCaseExportExecuteResultConverter() { + planCaseStatusMap.put(TestPlanTestCaseStatus.Pass.name(), "execute_pass"); + planCaseStatusMap.put(TestPlanTestCaseStatus.Underway.name(), "test_case_status_prepare"); + planCaseStatusMap.put(TestPlanTestCaseStatus.Blocking.name(), "plan_case_status_blocking"); + planCaseStatusMap.put(TestPlanTestCaseStatus.Failure.name(), "test_case_status_error"); + planCaseStatusMap.put(TestPlanTestCaseStatus.Skip.name(), "plan_case_status_skip"); + } + + @Override + public String parse(TestCaseDTO testCase) { + return getFromMapOfNullableWithTranslate(planCaseStatusMap, testCase.getLastExecuteResult()); + } +} diff --git a/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportReviewResultConverter.java b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportReviewResultConverter.java new file mode 100644 index 0000000000..6af9d6a8d3 --- /dev/null +++ b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportReviewResultConverter.java @@ -0,0 +1,23 @@ +package io.metersphere.excel.converter; + +import io.metersphere.commons.constants.TestReviewCaseStatus; +import io.metersphere.track.dto.TestCaseDTO; + +import java.util.HashMap; +import java.util.Map; + +public class TestCaseExportReviewResultConverter implements TestCaseExportConverter { + + private Map reviewCaseStatusMap = new HashMap<>(); + + public TestCaseExportReviewResultConverter() { + reviewCaseStatusMap.put(TestReviewCaseStatus.Prepare.name(), "test_case_status_prepare"); + reviewCaseStatusMap.put(TestReviewCaseStatus.Pass.name(), "execute_pass"); + reviewCaseStatusMap.put(TestReviewCaseStatus.UnPass.name(), "execute_not_pass"); + } + + @Override + public String parse(TestCaseDTO testCase) { + return getFromMapOfNullableWithTranslate(reviewCaseStatusMap, testCase.getReviewStatus()); + } +} diff --git a/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportUpdateTimeConverter.java b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportUpdateTimeConverter.java new file mode 100644 index 0000000000..884a5aca22 --- /dev/null +++ b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportUpdateTimeConverter.java @@ -0,0 +1,12 @@ +package io.metersphere.excel.converter; + +import io.metersphere.commons.utils.DateUtils; +import io.metersphere.track.dto.TestCaseDTO; + +public class TestCaseExportUpdateTimeConverter implements TestCaseExportConverter { + + @Override + public String parse(TestCaseDTO testCase) { + return DateUtils.getTimeString(testCase.getUpdateTime()); + } +} diff --git a/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportVersionConverter.java b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportVersionConverter.java new file mode 100644 index 0000000000..0894c69e4e --- /dev/null +++ b/backend/src/main/java/io/metersphere/excel/converter/TestCaseExportVersionConverter.java @@ -0,0 +1,27 @@ +package io.metersphere.excel.converter; + +import io.metersphere.commons.utils.CommonBeanFactory; +import io.metersphere.commons.utils.SessionUtils; +import io.metersphere.dto.ProjectVersionDTO; +import io.metersphere.service.ProjectVersionService; +import io.metersphere.track.dto.TestCaseDTO; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TestCaseExportVersionConverter implements TestCaseExportConverter { + + private Map versionMap = new HashMap<>(); + + public TestCaseExportVersionConverter() { + ProjectVersionService projectVersionService = CommonBeanFactory.getBean(ProjectVersionService.class); + List projectVersions = projectVersionService.getProjectVersions(SessionUtils.getCurrentProjectId()); + projectVersions.forEach(i -> versionMap.put(i.getId(), i.getName())); + } + + @Override + public String parse(TestCaseDTO testCase) { + return getFromMapOfNullable(versionMap, testCase.getVersionId()); + } +} diff --git a/backend/src/main/java/io/metersphere/excel/domain/TestCaseExcelData.java b/backend/src/main/java/io/metersphere/excel/domain/TestCaseExcelData.java index f65ac76d98..ebc1c02459 100644 --- a/backend/src/main/java/io/metersphere/excel/domain/TestCaseExcelData.java +++ b/backend/src/main/java/io/metersphere/excel/domain/TestCaseExcelData.java @@ -54,6 +54,8 @@ public class TestCaseExcelData { List mergeStepDesc; @ExcelIgnore List mergeStepResult; + @ExcelIgnore + Map otherFields; public List> getHead(boolean needNum, List customFields) { return new ArrayList<>(); diff --git a/backend/src/main/java/io/metersphere/excel/handler/FunctionCaseMergeWriteHandler.java b/backend/src/main/java/io/metersphere/excel/handler/FunctionCaseMergeWriteHandler.java index 21561c8a8f..b467707e8f 100644 --- a/backend/src/main/java/io/metersphere/excel/handler/FunctionCaseMergeWriteHandler.java +++ b/backend/src/main/java/io/metersphere/excel/handler/FunctionCaseMergeWriteHandler.java @@ -24,9 +24,9 @@ public class FunctionCaseMergeWriteHandler implements RowWriteHandler { for (int i = 0; i < headList.size(); i++) { List list = headList.get(i); for (String head : list) { - if (TestCaseImportFiled.STEP_DESC.getFiledLangMap().values().contains(head)) { + if (TestCaseImportFiled.STEP_DESC.containsHead(head)) { stepDescRowIndex = i; - } else if (TestCaseImportFiled.STEP_RESULT.getFiledLangMap().values().contains(head)) { + } else if (TestCaseImportFiled.STEP_RESULT.containsHead(head)) { stepResultRowIndex = i; } } diff --git a/backend/src/main/java/io/metersphere/excel/handler/FunctionCaseTemplateWriteHandler.java b/backend/src/main/java/io/metersphere/excel/handler/FunctionCaseTemplateWriteHandler.java index 74b96044ee..38de24f059 100644 --- a/backend/src/main/java/io/metersphere/excel/handler/FunctionCaseTemplateWriteHandler.java +++ b/backend/src/main/java/io/metersphere/excel/handler/FunctionCaseTemplateWriteHandler.java @@ -1,37 +1,45 @@ package io.metersphere.excel.handler; import com.alibaba.excel.util.BooleanUtils; +import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.handler.context.RowWriteHandlerContext; -import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; -import com.alibaba.excel.write.metadata.holder.WriteTableHolder; -import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy; import com.alibaba.fastjson.JSONArray; +import io.metersphere.excel.constants.TestCaseImportFiled; import io.metersphere.i18n.Translator; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Comment; import org.apache.poi.ss.usermodel.Drawing; -import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFRichTextString; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @author song.tianyang * @Date 2021/5/7 2:17 下午 * @Description */ -public class FunctionCaseTemplateWriteHandler extends AbstractRowHeightStyleStrategy { +public class FunctionCaseTemplateWriteHandler implements RowWriteHandler { private boolean isNeedId; - Map rowDispseIndexMap; + Map rowDisposeIndexMap; Map> caseLevelAndStatusValueMap; + private Integer idIndex; + private Integer moduleIndex; + private Integer maintainerIndex; + private Integer priorityIndex; + private Integer tagIndex; + private Integer statusIndex; + private Integer stepModelIndex; + public FunctionCaseTemplateWriteHandler(boolean isNeedId, List> headList, Map> caseLevelAndStatusValueMap) { this.isNeedId = isNeedId; - rowDispseIndexMap = this.buildFiledMap(headList); + rowDisposeIndexMap = this.buildFiledMap(headList); this.caseLevelAndStatusValueMap = caseLevelAndStatusValueMap; } @@ -41,20 +49,20 @@ public class FunctionCaseTemplateWriteHandler extends AbstractRowHeightStyleStra int index = 0; for (List list : headList) { for (String head : list) { - if (StringUtils.equalsAnyIgnoreCase(head, "id")) { - returnMap.put("ID", index); - } else if (StringUtils.equalsAnyIgnoreCase(head, "所属模块", "所屬模塊", "Module")) { - returnMap.put("Module", index); - } else if (StringUtils.equalsAnyIgnoreCase(head, "责任人(ID)", "維護人(ID)", "Maintainer(ID)")) { - returnMap.put("Maintainer", index); - } else if (StringUtils.equalsAnyIgnoreCase(head, "用例等级", "用例等級", "Priority")) { - returnMap.put("Priority", index); - } else if (StringUtils.equalsAnyIgnoreCase(head, "标签", "標簽", "Tag")) { - returnMap.put("Tag", index); - } else if (StringUtils.equalsAnyIgnoreCase(head, "用例状态", "用例狀態", "Case status")) { - returnMap.put("Status", index); - } else if (StringUtils.equalsAnyIgnoreCase(head, "编辑模式", "編輯模式", "Edit Model")) { - returnMap.put("StepModel", index); + if (TestCaseImportFiled.ID.containsHead(head)) { + idIndex = index; + } else if (TestCaseImportFiled.MODULE.containsHead(head)) { + moduleIndex = index; + } else if (TestCaseImportFiled.MAINTAINER.containsHead(head)) { + maintainerIndex = index; + } else if (TestCaseImportFiled.PRIORITY.containsHead(head)) { + priorityIndex = index; + } else if (TestCaseImportFiled.TAG.containsHead(head)) { + tagIndex = index; + } else if (TestCaseImportFiled.STATUS.containsHead(head)) { + statusIndex = index; + } else if (TestCaseImportFiled.STEP_MODEL.containsHead(head)) { + stepModelIndex = index; } index++; } @@ -62,14 +70,6 @@ public class FunctionCaseTemplateWriteHandler extends AbstractRowHeightStyleStra return returnMap; } - @Override - public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer rowIndex, Integer relativeRowIndex, Boolean isHead) { - } - - @Override - public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { - } - @Override public void afterRowDispose(RowWriteHandlerContext context) { @@ -77,68 +77,43 @@ public class FunctionCaseTemplateWriteHandler extends AbstractRowHeightStyleStra Sheet sheet = context.getWriteSheetHolder().getSheet(); Drawing drawingPatriarch = sheet.createDrawingPatriarch(); - if (rowDispseIndexMap != null) { + if (rowDisposeIndexMap != null) { if (isNeedId) { - Integer idIndex = rowDispseIndexMap.get("ID"); - if(idIndex != null){ - Comment comment1 = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, idIndex, 0, idIndex + 3, 1)); - comment1.setString(new XSSFRichTextString(Translator.get("do_not_modify_header_order")+","+Translator.get("id_required"))); - sheet.getRow(0).getCell(1).setCellComment(comment1); - } + setComment(sheet, drawingPatriarch, idIndex, Translator.get("do_not_modify_header_order") + "," + Translator.get("id_required")); } - for (Map.Entry entry : rowDispseIndexMap.entrySet()) { - String coloum = entry.getKey(); - Integer index = entry.getValue(); - if(StringUtils.equalsAnyIgnoreCase(coloum,"Module")){ - Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3 , 1)); - comment.setString(new XSSFRichTextString(Translator.get("module_created_automatically"))); - sheet.getRow(0).getCell(1).setCellComment(comment); - }else if(StringUtils.equalsAnyIgnoreCase(coloum,"Maintainer")){ - Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1)); - comment.setString(new XSSFRichTextString(Translator.get("please_input_project_member"))); - sheet.getRow(0).getCell(1).setCellComment(comment); - }else if(StringUtils.equalsAnyIgnoreCase(coloum,"Priority")){ - Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1)); - List list = new ArrayList<>(); - if (caseLevelAndStatusValueMap != null && caseLevelAndStatusValueMap.containsKey("caseLevel")) { - list = caseLevelAndStatusValueMap.get("caseLevel"); - } - if (CollectionUtils.isEmpty(list)) { - comment.setString(new XSSFRichTextString(Translator.get("options") + "(P0、P1、P2、P3)")); - } else { - comment.setString(new XSSFRichTextString(Translator.get("options") + JSONArray.toJSONString(list))); - } - sheet.getRow(0).getCell(1).setCellComment(comment); - }else if(StringUtils.equalsAnyIgnoreCase(coloum,"Tag")){ - Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1)); - comment.setString(new XSSFRichTextString(Translator.get("tag_tip_pattern"))); - sheet.getRow(0).getCell(1).setCellComment(comment); - } else if (StringUtils.equalsAnyIgnoreCase(coloum, "Status")) { - List list = new ArrayList<>(); - if (caseLevelAndStatusValueMap != null && caseLevelAndStatusValueMap.containsKey("caseStatus")) { - list = caseLevelAndStatusValueMap.get("caseStatus"); - } - if (!CollectionUtils.isEmpty(list)) { - Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1)); - comment.setString(new XSSFRichTextString(Translator.get("options") + JSONArray.toJSONString(list))); - sheet.getRow(0).getCell(1).setCellComment(comment); - } - } else if (StringUtils.equalsAnyIgnoreCase(coloum, "StepModel")) { - Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1)); - comment.setString(new XSSFRichTextString(Translator.get("step_model_tip"))); - sheet.getRow(0).getCell(1).setCellComment(comment); - } + setComment(sheet, drawingPatriarch, moduleIndex, Translator.get("module_created_automatically")); + setComment(sheet, drawingPatriarch, maintainerIndex, Translator.get("please_input_project_member")); + setComment(sheet, drawingPatriarch, tagIndex, Translator.get("tag_tip_pattern")); + setComment(sheet, drawingPatriarch, stepModelIndex, Translator.get("step_model_tip")); + + List list = new ArrayList<>(); + if (caseLevelAndStatusValueMap != null && caseLevelAndStatusValueMap.containsKey("caseLevel")) { + list = caseLevelAndStatusValueMap.get("caseLevel"); + } + if (CollectionUtils.isEmpty(list)) { + setComment(sheet, drawingPatriarch, priorityIndex, Translator.get("options") + "(P0、P1、P2、P3)"); + } else { + setComment(sheet, drawingPatriarch, priorityIndex, Translator.get("options") + JSONArray.toJSONString(list)); + } + + list.clear(); + if (caseLevelAndStatusValueMap != null && caseLevelAndStatusValueMap.containsKey("caseStatus")) { + list = caseLevelAndStatusValueMap.get("caseStatus"); + } + if (CollectionUtils.isNotEmpty(list)) { + setComment(sheet, drawingPatriarch, statusIndex, Translator.get("options") + JSONArray.toJSONString(list)); } } } } - @Override - protected void setHeadColumnHeight(Row row, int relativeRowIndex) { - } - - @Override - protected void setContentColumnHeight(Row row, int relativeRowIndex) { + private void setComment(Sheet sheet, Drawing drawingPatriarch, Integer index, String text) { + if (index == null) { + return; + } + Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1)); + comment.setString(new XSSFRichTextString(text)); + sheet.getRow(0).getCell(1).setCellComment(comment); } } diff --git a/backend/src/main/java/io/metersphere/track/constants/TestCaseExportOtherField.java b/backend/src/main/java/io/metersphere/track/constants/TestCaseExportOtherField.java new file mode 100644 index 0000000000..67c122499e --- /dev/null +++ b/backend/src/main/java/io/metersphere/track/constants/TestCaseExportOtherField.java @@ -0,0 +1,21 @@ +package io.metersphere.track.constants; + +public enum TestCaseExportOtherField { + VERSION("version"), + COMMEND("commend"), + EXECUTE_RESULT("executeResult"), + REVIEW_RESULT("reviewResult"), + CREATOR("creator"), + CREATE_TIME("createTime"), + UPDATE_TIME("updateTime"); + + private String value; + + TestCaseExportOtherField(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java b/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java index c114a34123..8a134fba7a 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java @@ -287,7 +287,7 @@ public class TestCaseController { @PostMapping("/export/testcase") @RequiresPermissions(PermissionConstants.PROJECT_TRACK_CASE_READ_EXPORT) @MsAuditLog(module = OperLogModule.TRACK_TEST_CASE, type = OperLogConstants.EXPORT, sourceId = "#request.id", title = "#request.name", project = "#request.projectId") - public void testCaseExport(HttpServletResponse response, @RequestBody TestCaseBatchRequest request) { + public void testCaseExport(HttpServletResponse response, @RequestBody TestCaseExportRequest request) { testCaseService.testCaseExport(response, request); } diff --git a/backend/src/main/java/io/metersphere/track/dto/TestCaseDTO.java b/backend/src/main/java/io/metersphere/track/dto/TestCaseDTO.java index a7a700c1a6..dcaf4598b1 100644 --- a/backend/src/main/java/io/metersphere/track/dto/TestCaseDTO.java +++ b/backend/src/main/java/io/metersphere/track/dto/TestCaseDTO.java @@ -18,7 +18,6 @@ public class TestCaseDTO extends TestCaseWithBLOBs { private String lastResultId; private String projectName; private String createName; - private String lastExecuteResult; private String versionName; private List fields; private List caseTags = new ArrayList<>(); diff --git a/backend/src/main/java/io/metersphere/track/request/testcase/TestCaseExportRequest.java b/backend/src/main/java/io/metersphere/track/request/testcase/TestCaseExportRequest.java new file mode 100644 index 0000000000..d2254a03b0 --- /dev/null +++ b/backend/src/main/java/io/metersphere/track/request/testcase/TestCaseExportRequest.java @@ -0,0 +1,21 @@ +package io.metersphere.track.request.testcase; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class TestCaseExportRequest extends TestCaseBatchRequest { + private List baseHeaders; + private List customHeaders; + private List otherHeaders; + + @Getter + @Setter + public static class TestCaseExportHeader { + private String id; + private String name; + } +} diff --git a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java index 81605c7c25..8d7d3d2dd9 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java @@ -31,6 +31,8 @@ import io.metersphere.controller.request.ResetOrderRequest; import io.metersphere.controller.request.member.QueryMemberRequest; import io.metersphere.dto.*; import io.metersphere.excel.constants.TestCaseImportFiled; +import io.metersphere.excel.converter.TestCaseExportConverter; +import io.metersphere.excel.converter.TestCaseExportConverterFactory; import io.metersphere.excel.domain.*; import io.metersphere.excel.handler.FunctionCaseMergeWriteHandler; import io.metersphere.excel.handler.FunctionCaseTemplateWriteHandler; @@ -63,6 +65,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; +import org.jetbrains.annotations.NotNull; import org.mybatis.spring.SqlSessionUtils; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -1326,38 +1329,73 @@ public class TestCaseService { return list; } - - - public void testCaseExport(HttpServletResponse response, TestCaseBatchRequest request) { + public void testCaseExport(HttpServletResponse response, TestCaseExportRequest request) { String projectId = request.getProjectId(); request.getCondition().setStatusIsNot(CommonConstants.TrashStatus); - List testCaseList = getExportData(request); - testCaseExport(response, projectId, testCaseList, true); - } + List testCases = getExportData(request); + List> headList = getTestcaseExportHeads(request); - public void testCaseExport(HttpServletResponse response, String projectId, List testCaseList, boolean needIdCol) { - TestCaseExcelData testCaseExcelData = new TestCaseExcelDataFactory().getTestCaseExcelDataLocal(); Map rowMergeInfo = new HashMap<>(); - TestCaseTemplateDao testCaseTemplate = testCaseTemplateService.getTemplate(projectId); - List customFields = Optional.ofNullable(testCaseTemplate.getCustomFields()).orElse(new ArrayList<>()); - List> headList = testCaseExcelData.getHead(needIdCol, customFields); FunctionCaseMergeWriteHandler writeHandler = new FunctionCaseMergeWriteHandler(rowMergeInfo, headList); boolean isUseCustomId = projectService.useCustomNum(projectId); Map> caseLevelAndStatusValueMap = testCaseTemplateService.getCaseLevelAndStatusMapByProjectId(projectId); - FunctionCaseTemplateWriteHandler handler = new FunctionCaseTemplateWriteHandler(needIdCol, headList, caseLevelAndStatusValueMap); + FunctionCaseTemplateWriteHandler handler = new FunctionCaseTemplateWriteHandler(true, headList, caseLevelAndStatusValueMap); - List excelData = parseCaseData2ExcelData(testCaseList, rowMergeInfo, isUseCustomId); + List excelData = parseCaseData2ExcelData(testCases, rowMergeInfo, isUseCustomId, request.getOtherHeaders()); List> data = parseExcelData2List(headList, excelData); - new EasyExcelExporter(testCaseExcelData.getClass()) + new EasyExcelExporter(new TestCaseExcelDataFactory().getTestCaseExcelDataLocal().getClass()) .exportByCustomWriteHandler(response, headList, data, Translator.get("test_case_import_template_name"), Translator.get("test_case_import_template_sheet"), handler, writeHandler); } + @NotNull + private List> getTestcaseExportHeads(TestCaseExportRequest request) { + List> headList = new ArrayList<>() {{ + addAll(request.getBaseHeaders() + .stream() + .map(item -> Arrays.asList(item.getName())) + .collect(Collectors.toList())); + addAll(request.getCustomHeaders() + .stream() + .map(item -> Arrays.asList(item.getName())) + .collect(Collectors.toList())); + addAll(request.getOtherHeaders() + .stream() + .map(item -> Arrays.asList(item.getName())) + .collect(Collectors.toList())); + }}; + return headList; + } + public void testCaseTemplateExport(String projectId, String importType, HttpServletResponse response) { //导入更新 or 开启使用自定义ID时,导出ID列 boolean needIdCol = projectService.useCustomNum(projectId) || StringUtils.equals(importType, FunctionCaseImportEnum.Update.name()); - testCaseExport(response, projectId, generateExportData(projectId), needIdCol); + + List> heads = getExportTemplateHeads(projectId, needIdCol); + + TestCaseExcelData testCaseExcelData = new TestCaseExcelDataFactory().getTestCaseExcelDataLocal(); + Map rowMergeInfo = new HashMap<>(); + + FunctionCaseMergeWriteHandler writeHandler = new FunctionCaseMergeWriteHandler(rowMergeInfo, heads); + boolean isUseCustomId = projectService.useCustomNum(projectId); + + Map> caseLevelAndStatusValueMap = testCaseTemplateService.getCaseLevelAndStatusMapByProjectId(projectId); + FunctionCaseTemplateWriteHandler handler = new FunctionCaseTemplateWriteHandler(needIdCol, heads, caseLevelAndStatusValueMap); + + List excelData = parseCaseData2ExcelData(generateExportData(projectId), + rowMergeInfo, isUseCustomId, null); + List> data = parseExcelData2List(heads, excelData); + new EasyExcelExporter(testCaseExcelData.getClass()) + .exportByCustomWriteHandler(response, heads, data, Translator.get("test_case_import_template_name"), + Translator.get("test_case_import_template_sheet"), handler, writeHandler); + } + + private List> getExportTemplateHeads(String projectId, boolean needIdCol) { + TestCaseTemplateDao testCaseTemplate = testCaseTemplateService.getTemplate(projectId); + List customFields = Optional.ofNullable(testCaseTemplate.getCustomFields()).orElse(new ArrayList<>()); + List> heads = new TestCaseExcelDataFactory().getTestCaseExcelDataLocal().getHead(needIdCol, customFields); + return heads; } @@ -1419,27 +1457,33 @@ public class TestCaseService { } } + TestCaseImportFiled[] importFields = TestCaseImportFiled.values(); + + for (TestCaseExcelData model : data) { List fields = new ArrayList<>(); - Map customDataMaps = Optional.ofNullable(model.getCustomDatas()).orElse(new HashMap<>()); - TestCaseImportFiled[] importFields = TestCaseImportFiled.values(); - + Map customDataMaps = Optional.ofNullable(model.getCustomDatas()) + .orElse(new HashMap<>()); + Map otherFieldMaps = Optional.ofNullable(model.getOtherFields()) + .orElse(new HashMap<>()); for (String head : headList) { boolean isSystemField = false; for (TestCaseImportFiled importFiled : importFields) { - if (importFiled.getFiledLangMap().values().contains(head)) { + if (importFiled.containsHead(head)) { fields.add(importFiled.parseExcelDataValue(model)); isSystemField = true; } } if (!isSystemField) { String value = customDataMaps.get(head); + if (value == null) { + value = otherFieldMaps.get(head); + } if (value == null) { value = ""; } fields.add(value); } - } result.add(fields); } @@ -1467,8 +1511,8 @@ public class TestCaseService { return testCaseList; } - private List parseCaseData2ExcelData(List testCaseList, - Map rowMergeInfo, Boolean isUseCustomId) { + private List parseCaseData2ExcelData(List testCaseList, Map rowMergeInfo, + Boolean isUseCustomId, List otherHeaders) { if (CollectionUtils.isEmpty(testCaseList)) { return new ArrayList<>(); } @@ -1491,41 +1535,18 @@ public class TestCaseService { TestCaseDTO t = testCaseList.get(rowIndex); List stepDescList = new ArrayList<>(); List stepResultList = new ArrayList<>(); + TestCaseExcelData data = new TestCaseExcelData(); setExportSystemField(t, customNameMap, customSelectValueMap); - TestCaseExcelData data = new TestCaseExcelData(); BeanUtils.copyBean(data, t); - if (isUseCustomId) { - data.setCustomNum(t.getCustomNum()); - } else { - if (t.getNum() == null) { - data.setCustomNum(""); - } else { - data.setCustomNum(String.valueOf(t.getNum())); - } - } + buildExportCustomNum(isUseCustomId, t, data); buildExportStep(t, stepDescList, stepResultList, data); buildExportCustomField(customSelectValueMap, customNameMap, t, data); + buildExportOtherField(data, t, otherHeaders); if (CollectionUtils.isNotEmpty(stepDescList)) { // 如果有多条步骤则添加多条数据,之后合并单元格 - for (int i = 0; i < stepDescList.size(); i++) { - TestCaseExcelData excelData; - if (i == 0) { - // 第一行存全量元素 - excelData = data; - if (stepDescList.size() > 1) { - // 保存合并单元格的下标和数量 - rowMergeInfo.put(list.size() + 1, stepDescList.size()); - } - } else { - // 之后的行只存步骤 - excelData = new TestCaseExcelData(); - } - excelData.setStepDesc(stepDescList.get(i)); - excelData.setStepResult(stepResultList.get(i)); - list.add(excelData); - } + buildExportMergeData(rowMergeInfo, list, stepDescList, stepResultList, data); } else { list.add(data); } @@ -1533,6 +1554,61 @@ public class TestCaseService { return list; } + private void buildExportOtherField(TestCaseExcelData data, TestCaseDTO t, List otherHeaders) { + if (CollectionUtils.isEmpty(otherHeaders)) { + return; + } + List keys = otherHeaders.stream() + .map(TestCaseExportRequest.TestCaseExportHeader::getId) + .collect(Collectors.toList()); + Map converterMaps = TestCaseExportConverterFactory.getConverters(keys); + HashMap otherFields = new HashMap<>(); + otherHeaders.forEach(header -> { + TestCaseExportConverter converter = converterMaps.get(header.getId()); + if (converter != null) { + otherFields.put(header.getName(), converter.parse(t)); + } else { + otherFields.put(header.getName(), ""); + } + }); + data.setOtherFields(otherFields); + } + + private void buildExportCustomNum(Boolean isUseCustomId, TestCaseDTO t, TestCaseExcelData data) { + if (isUseCustomId) { + data.setCustomNum(t.getCustomNum()); + } else { + if (t.getNum() == null) { + data.setCustomNum(""); + } else { + data.setCustomNum(String.valueOf(t.getNum())); + } + } + } + + @NotNull + private void buildExportMergeData(Map rowMergeInfo, + List list, List stepDescList, + List stepResultList, TestCaseExcelData data) { + for (int i = 0; i < stepDescList.size(); i++) { + TestCaseExcelData excelData; + if (i == 0) { + // 第一行存全量元素 + excelData = data; + if (stepDescList.size() > 1) { + // 保存合并单元格的下标和数量 + rowMergeInfo.put(list.size() + 1, stepDescList.size()); + } + } else { + // 之后的行只存步骤 + excelData = new TestCaseExcelData(); + } + excelData.setStepDesc(stepDescList.get(i)); + excelData.setStepResult(stepResultList.get(i)); + list.add(excelData); + } + } + private void buildExportCustomField(Map> customSelectValueMap, Map customNameMap, TestCaseDTO t, TestCaseExcelData data) { try { List fields = customFieldTestCaseService.getByResourceId(t.getId()); diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index 3eec2eb12b..ec17abdbd8 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -318,6 +318,12 @@ 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 +test_case_comment_template=[comment:%s %s %s(%s)]\n%s\n +test_case_comment=Case +test_case_plan_comment=Execute +test_case_review_comment=Review +plan_case_status_blocking=Blocking +plan_case_status_skip=Skip # mock mock_warning=No matching Mock expectation was found zentao_test_type_error=invalid Zentao request diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index e7fbdffb16..162e71d8b8 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -317,6 +317,12 @@ create_user=创建人 test_case_status=用例状态 id_not_rightful=ID 不合法 project_reference_multiple_plateform=项目指向多个第三方平台 +test_case_comment_template=【评论:%s %s %s(%s)】\n%s\n +test_case_comment=用例 +test_case_plan_comment=执行 +test_case_review_comment=评审 +plan_case_status_blocking=阻塞 +plan_case_status_skip=跳过 # mock mock_warning=未找到匹配的Mock期望 zentao_test_type_error=无效的 Zentao 请求 diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index eb4c54a500..ab53bdcc85 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -316,6 +316,12 @@ create_user=創建人 test_case_status=用例狀態 id_not_rightful=ID 不合法 project_reference_multiple_plateform=項目指向多個第三方平臺 +test_case_comment_template=【評論:%s %s %s(%s)】\n%s\n +test_case_comment=用例 +test_case_plan_comment=執行 +test_case_review_comment=評審 +plan_case_status_blocking=阻塞 +plan_case_status_skip=跳過 # mock mock_warning=未找到匹配的Mock期望 zentao_test_type_error=請求方式錯誤 diff --git a/frontend/src/business/components/track/case/TestCase.vue b/frontend/src/business/components/track/case/TestCase.vue index 390afb3a22..f54a324f6b 100644 --- a/frontend/src/business/components/track/case/TestCase.vue +++ b/frontend/src/business/components/track/case/TestCase.vue @@ -107,6 +107,7 @@ :public-enable="false" :current-version="currentVersion" :version-enable="versionEnable" + @closeExport="closeExport" @refreshTable="refresh" @testCaseEdit="editTestCase" @testCaseCopy="copyTestCase" @@ -584,12 +585,15 @@ export default { this.activeName = "default"; } }, - exportTestCase(type) { + exportTestCase(type, param) { if (this.activeDom !== 'left') { this.$warning(this.$t('test_track.case.export.export_tip')); return; } - this.$refs.testCaseList.exportTestCase(type); + this.$refs.testCaseList.exportTestCase(type, param); + }, + closeExport() { + this.$refs.nodeTree.closeExport(); }, init(route) { let path = route.path; diff --git a/frontend/src/business/components/track/case/components/TestCaseExport.vue b/frontend/src/business/components/track/case/components/TestCaseExport.vue deleted file mode 100644 index 57d4b89e72..0000000000 --- a/frontend/src/business/components/track/case/components/TestCaseExport.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - diff --git a/frontend/src/business/components/track/case/components/TestCaseList.vue b/frontend/src/business/components/track/case/components/TestCaseList.vue index 5a1bbef26e..dd682283ee 100644 --- a/frontend/src/business/components/track/case/components/TestCaseList.vue +++ b/frontend/src/business/components/track/case/components/TestCaseList.vue @@ -222,7 +222,6 @@ import MsTableHeaderSelectPopover from "@/business/components/common/components/table/MsTableHeaderSelectPopover"; import TestCaseImport from './import/TestCaseImport'; -import TestCaseExport from '../components/TestCaseExport'; import MsTablePagination from '../../../../components/common/pagination/TablePagination'; import NodeBreadcrumb from '../../common/NodeBreadcrumb'; import MsTableHeader from '../../../../components/common/components/MsTableHeader'; @@ -310,7 +309,6 @@ export default { TypeTableItem, PriorityTableItem, TestCaseImport, - TestCaseExport, MsTablePagination, NodeBreadcrumb, MsTableHeader, @@ -1016,12 +1014,13 @@ export default { } this.$refs.testCaseImport.open(); }, - exportTestCase(exportType) { + exportTestCase(exportType, fieldParam) { if (!this.projectId) { this.$warning(this.$t('commons.check_project_tip')); return; } - + let param = buildBatchParam(this, this.$refs.table.selectIds); + Object.assign(param, fieldParam); let config = {}; let fileNameSuffix = ""; if (exportType === 'xmind') { @@ -1029,7 +1028,7 @@ export default { url: '/test/case/export/testcase/xmind', method: 'post', responseType: 'blob', - data: buildBatchParam(this, this.$refs.table.selectIds) + data: param }; fileNameSuffix = ".xmind"; } else { @@ -1037,7 +1036,7 @@ export default { url: '/test/case/export/testcase', method: 'post', responseType: 'blob', - data: buildBatchParam(this, this.$refs.table.selectIds) + data: param }; fileNameSuffix = ".xlsx"; } @@ -1056,8 +1055,10 @@ export default { aTag.href = URL.createObjectURL(blob); aTag.click(); URL.revokeObjectURL(aTag.href); + this.$emit('closeExport'); } else { navigator.msSaveBlob(blob, filename); + this.$emit('closeExport'); } }); }, diff --git a/frontend/src/business/components/track/case/components/export/TestCaseExport.vue b/frontend/src/business/components/track/case/components/export/TestCaseExport.vue new file mode 100644 index 0000000000..158bee6006 --- /dev/null +++ b/frontend/src/business/components/track/case/components/export/TestCaseExport.vue @@ -0,0 +1,94 @@ + + + + + + + diff --git a/frontend/src/business/components/track/case/components/export/TestCaseExportFieldList.vue b/frontend/src/business/components/track/case/components/export/TestCaseExportFieldList.vue new file mode 100644 index 0000000000..1c008a007e --- /dev/null +++ b/frontend/src/business/components/track/case/components/export/TestCaseExportFieldList.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/frontend/src/business/components/track/case/components/export/TestCaseExportFieldSelect.vue b/frontend/src/business/components/track/case/components/export/TestCaseExportFieldSelect.vue new file mode 100644 index 0000000000..31a6848f57 --- /dev/null +++ b/frontend/src/business/components/track/case/components/export/TestCaseExportFieldSelect.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/frontend/src/business/components/track/case/components/export/TestCaseExportFieldSelectItem.vue b/frontend/src/business/components/track/case/components/export/TestCaseExportFieldSelectItem.vue new file mode 100644 index 0000000000..c86f96852a --- /dev/null +++ b/frontend/src/business/components/track/case/components/export/TestCaseExportFieldSelectItem.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/frontend/src/business/components/track/module/TestCaseNodeTree.vue b/frontend/src/business/components/track/module/TestCaseNodeTree.vue index 0da2dde429..4722168efa 100644 --- a/frontend/src/business/components/track/module/TestCaseNodeTree.vue +++ b/frontend/src/business/components/track/module/TestCaseNodeTree.vue @@ -62,7 +62,7 @@ import NodeEdit from "../common/NodeEdit"; import MsNodeTree from "../common/NodeTree"; import TestCaseCreate from "@/business/components/track/case/components/TestCaseCreate"; import TestCaseImport from "@/business/components/track/case/components/import/TestCaseImport"; -import TestCaseExport from "@/business/components/track/case/components/TestCaseExport"; +import TestCaseExport from "@/business/components/track/case/components/export/TestCaseExport"; import MsSearchBar from "@/business/components/common/components/search/MsSearchBar"; import {buildTree} from "../../api/definition/model/NodeTree"; import {buildNodePath} from "@/business/components/api/definition/model/NodeTree"; @@ -244,8 +244,8 @@ export default { } this.$refs.testCaseExport.open(); }, - exportTestCase(type){ - this.$emit('exportTestCase',type); + exportTestCase(type, param){ + this.$emit('exportTestCase', type, param); }, remove(nodeIds) { this.$post("/case/node/delete", nodeIds, () => { @@ -290,6 +290,9 @@ export default { }, changeConfirm(isSave) { this.$emit('importChangeConfirm', isSave); + }, + closeExport() { + this.$refs.testCaseExport.close(); } } }; diff --git a/frontend/src/i18n/en-US.js b/frontend/src/i18n/en-US.js index f1ad049348..4412aa646e 100644 --- a/frontend/src/i18n/en-US.js +++ b/frontend/src/i18n/en-US.js @@ -1,3 +1,5 @@ +import test_track from "./track/en-US"; + export default { commons: { project_permission: 'Please add the project permission first', @@ -93,6 +95,7 @@ export default { input_password: 'Please enter password', test: 'Test', create_time: 'Created Time', + creator: 'Creator', update_user_id: 'Updater ID', update_time: 'Updated Time', delete_time: 'Delete Time', @@ -2063,511 +2066,7 @@ export default { please_search: "Please Search", date: "Date" }, - test_track: { - sync_add_api_load: 'Synchronously add associated api and load tests', - next: 'Next', - total_size: 'Total {0}', - related_requirements: 'Related requirements', - please_related_requirements: 'Please select the requirements to associate', - please_select_the_test_to_associate: "Please select the test to associate", - person_responsible: "Person Responsible", - test_track: "Track", - confirm: "Confirm", - cancel: "Cancel", - planning_execution: "Planning&Execution", - project: "Project", - save: "Save", - return: "Return", - length_less_than: "The length less than", - recent_plan: "My recent plan", - recent_case: "My recent case", - recent_review: "My recent review", - pass_rate: "Pass Rate", - execution_result: ": Please select the execution result", - actual_result: ": The actual result is empty", - cancel_relevance_success: "Unlinked successfully", - switch_project: "Project", - functional_test_case: "Functional Case", - api_test_case: "Api Case", - ui_test_case: "UI Case", - performance_test_case: "Performance Case", - scenario_test_case: "Scenario Case", - ui_scenario_test_case: "UI Scenario Case", - report_statistics: "Report Statistics", - sort: 'Sort', - demand: { - id: 'Demand ID', - name: 'Demand Name', - batch_relate: 'Bulk Association Requirements', - relate_is_null_warn: 'The associated requirement cannot be empty!', - relate_name_is_null_warn: 'Requirement name cannot be empty!', - third_platform_demand: "Third platform demand", - other_demand: "Other demand" - }, - step_model: 'Step Model', - automatic_status_update: "Automatic Status Update", - case: { - list: "List", - minder: "Minder", - step_info: "Step Info", - other_info: "Other Info", - step_describe: "Step Describe", - step_describe_tip: "Applicable to every step of the test scenario, there are clear test steps, expected results", - text_describe: "Text Describe", - text_describe_tip: "For simple test scenarios, there are no clear test steps", - change_type: "Change Type", - minder_create_tip: "failed, unable to create its parent module in minder", - minder_issue_delete_tip: "Successfully cancel the defect association", - check_select: "Please check the case", - export_all_cases: 'Are you sure you want to export all use cases?', - minder_tem_node_tip: "Cannot create case {0} under the temporary node", - minder_is_module_tip: "{0} is a module and cannot be modified as a use ca", - minder_not_module_tip: "Module {0}, cannot be created under a non-module node", - minder_all_module_tip: 'All case are virtual modules. Please create use cases in other modules', - minder_save_confirm_title: 'Please save the minder', - minder_save_confirm_tip: 'The minder is not saved. Are you sure to save?', - minder_import_save_confirm_tip: 'Will the minder be refreshed after successful import and confirm to save minder?', - input_test_case: 'Please enter the associated case name', - test_name: 'TestName', - other: '--Other--', - test_case: "Case", - move: "Move case", - case_list: "Test case list", - create_case: "Create case", - edit_case: "Edit case", - view_case: "Test case", - no_project: "There is no project in this workspace, please create the project first", - priority: "Priority", - type: "Type", - method: "Method", - auto: "Auto", - manual: "Manual", - create: "Create test case", - case_type: "Case Type", - name: "Test Case Name", - module: "Module", - project: 'Project', - maintainer: "Maintainer", - steps: "Steps", - number: "Number", - prerequisite: "Prerequisite", - step_desc: "Case step", - expected_results: "Expected results", - input_name: "Please enter name", - input_module: "Please select module", - input_maintainer: "Please select maintainer", - input_priority: "Please select priority", - input_type: "Please select type", - input_method: "Please select method", - input_prerequisite: "Please select prerequisite", - input_demand_name: "Please input demand id or name", - delete_confirm: "Confirm delete test case", - delete: "Delete case", - save_create_continue: "Save and create continue", - save_add_public: "Save and add public", - please_create_project: "No project available, please create the project first", - create_module_first: "Please create module first", - relate_test: "Relate test", - relate_issue: "Relate Issue", - demand_name_id: "Demand ID/Name", - please_select_relate_test: "Please select the test to associate", - relate_test_not_find: 'The associated test does not exist, please check the test case', - other_relate_test_not_find: 'Associated test name, please go to the third party platform to execute', - batch_handle: 'Batch processing (select {0} items)', - batch_update: 'Update the attributes of {0} cases', - select_catalog: 'Please select use case catalog', - updated_attr_value: 'The updated attribute value', - batch_operate: 'Batch operation', - please_select_attr: 'Please select attributes', - please_select_attr_value: 'Please select the value corresponding to the attribute', - batch_edit_case: 'Batch editing', - batch_move_case: 'Batch move', - batch_copy: 'Batch copy', - batch_add_public: 'Batch add public', - batch_link_demand: 'Bulk Association Requirements', - public_warning: 'The public library configuration is not enabled', - generate_dependencies: 'Generate dependencies', - generate_dependencies_warning: 'For a better experience, it is recommended to check the data below 100', - batch_delete_case: 'Batch delete', - batch_unlink: 'Batch Unlink', - unlink: 'Unlink', - project_name: "Project", - status: 'Review Status', - status_prepare: 'Prepare', - status_running: 'Underway', - status_finished: 'Completed', - status_pass: 'Pass', - status_un_pass: 'UnPass', - cancel_relevance_project: "Disassociating the project will also cancel the associated test cases under the project", - img_loading_fail: "Image failed to load", - pdf_loading_fail: "PDF loading failed", - upload_tip: "file size limit[0-500MB]", - add_attachment: "Add", - attachment: "Attachment", - upload_time: "Upload Time", - total: "Total Case", - node_id: "Node ID", - node_path: "Node Path", - match_rule: "Test Case Match Rule", - import: { - import: "Import test case", - case_import: "Import test case", - case_export: "Export test case", - download_template: "Download template", - click_upload: "Upload", - upload_limit: "Only XLS/XLSX/XMIND files can be uploaded, and no more than 100M", - upload_xmind_format: "Upload files can only be .xmind format", - upload_xmind: "Only xmind files can be uploaded, and no more than 800", - upload_limit_count: "Only one file can be uploaded at a time", - upload_limit_format: "Upload files can only be XLS, XLSX format!", - upload_limit_size: "Upload file size cannot exceed 100MB!", - upload_limit_other_size: "Upload file size cannot exceed", - success: "Import success!", - importing: "Importing...", - excel_title: "Excel ", - xmind_title: "Xmind", - import_desc: "Import instructions", - import_file: "upload files", - ignore_error: "Ignore errors ", - continue_upload: "Upload continue", - import_create: "Import Create", - import_update: "Import Update", - import_tip1: "The ID is required when the \"Test Case Custom ID\" switch is turned on in the project settings", - import_tip2: "ID is required when importing and updating", - import_file_tips: "Please upload the file first!", - }, - export: { - export: "Export cases", - export_tip: "Switch to Case List and check Use Case Export" - }, - case_desc: "Case Desc", - passing_rate: 'Case Pass Rate', - exists_multiple_prerequisite_node: "Exists multiple precondition node", - exists_multiple_remark_node: "Exists multiple remark node", - }, - plan: { - test_plan: "Plan", - test_plan_id: 'Plan ID', - create_plan: "Create test plan", - edit_plan: "Edit test plan", - plan_name: "Name", - plan_project: "Project", - related_project: "Related Project", - related_tip: "After linking the project, you can add test cases under the linking project to the test plan list", - plan_stage: "Stage", - follow_people: "Follow", - plan_status: "Status", - smoke_test: "Smoke test", - functional_test: "Functional test", - integration_testing: "Integration test", - system_test: "System test", - regression_test: "Regression test", - version_validation: "Version validation", - plan_principal: "Principal", - input_plan_name: "Please input plan name", - input_plan_principal: "Please select principal", - input_plan_project: "Please select project", - input_related_project: "Please Related project", - input_plan_stage: "Please select stage", - plan_status_prepare: "Not started", - plan_status_running: "Starting", - plan_status_finished: "Finished", - plan_status_completed: "Completed", - plan_status_archived: "Archived", - plan_status_trash: "Trashed", - planned_start_time: "Start Time", - planned_end_time: "End Time", - actual_start_time: "Actual Start Time", - actual_end_time: "Actual End Time", - plan_delete_confirm: "All use cases under this plan will be deleted,confirm delete test plan: ", - plan_delete_tip: "The test plan is under way, please confirm and delete it!", - plan_delete: "Delete test plan", - api_case: "Api case", - scenario_case: "Scenario case", - execute_result: "Execute Result", - execute_time: 'Execute Time', - is_api_case_executing: "Api Case Executing", - is_scenario_executing: 'Scenario Executing', - is_performance_executing: 'Performance Executing', - test_plan_test_case_count: "Track Case Count", - test_plan_api_case_count: "Api Case Count", - test_plan_api_scenario_count: "Scenario Case Count", - test_plan_ui_scenario_count: "Ui Scenario Case Count", - test_plan_load_case_count: "Load Case Count", - test_plan_component_case_count: "Component Case Count", - data_name: "Data Name", - test_plan_batch_switch: "batch on/off scheduled tasks", - batch_update_schedule_enable: 'update the scheduled task status of {0} test plans', - batch_update_schedule_enable_alert: 'note: only test plans with scheduled tasks can be updated', - next_run_time: 'next running time', - schedule_enabled: 'enabled', - check_schedule_enabled: 'the data you checked has detected {0} scheduled tasks that can be modified', - no_check_schedule_enabled: 'the data you checked does not detect a scheduled task', - load_case: { - case: "Load Case", - execution_status: "Execution status", - report: "report", - view_report: "View report", - unlink_in_bulk: "Unlink in bulk", - batch_exec_cases: "Batch execution use cases", - exec: "Executing....", - error: "Use case execution error, please debug this use case separately!", - report_not_found: "Report does not exist", - content_empty: "Content empty", - } - }, - review: { - test_review: "Review", - create_review: "Create Review", - edit_review: "Edit Review", - review_name: "Name", - reviewer: "Reviewer", - review_project: "Project", - review_creator: "Creator", - review_follow_people: "Follow", - review_status: "Status", - related_project: "Related Project", - related_tip: "After the project is associated, you can add test cases under the associated project to the review list", - end_time: "EndTime", - delete: "Delete", - input_review_name: "Please enter the name of the review", - input_review_project: "Please select the project", - input_reviewer: "Please select reviewer", - no_link_case: "No associated use cases!", - prepare: "Prepare", - pass: "Pass", - un_pass: "UnPass", - comment: "Comment", - my_review: "My Review", - my_create: "My Create", - reviewed_by_me: "Review By Me", - creator: "Creator", - done: "Commented use cases", - result_distribution: "Result Distribution", - deadline_cannot_early_tips: "Deadline cannot be earlier than current time!", - }, - comment: { - no_comment: "No Comment", - send_comment: "Post a comment (Ctrl + Enter to send)", - send: "Confirm", - description_is_null: "Comment content cannot be empty!", - send_success: "Comment successful!", - }, - review_view: { - review: "Review", - all_case: "All case", - start_review: "Start Review", - relevance_case: "Relevance Case", - last_page: "It's the end!", - execute_result: "Result", - cannot_edit: "Cannot edit this comment!", - cannot_delete: "Cannot delete this comment!", - submit_description: "please submit comments first!", - }, - module: { - id: 'Module ID', - search: "Search module", - rename: "Rename", - add_submodule: "Add submodule", - add_module: "Add module", - name: "Name", - delete_confirm: "Confirm delete module:", - delete_all_resource: "and all submodules and test cases under the module", - delete_batch_confirm: "Steps to confirm batch deletion of selected scenarios?", - module: "Module", - title: "Title", - describe: "Describe", - status: "Status", - current_owner: "Current Owner", - creation_time: "Creation time", - project_name: "Project" - }, - home: { - recent_test: "Recent Test", - my_plan: "My Plan", - test_rate: "Test Rate", - tested_case: "Tested Case", - review_progress: "Review Progress", - case_count: "Statistics of the number of use cases", - relevance_case: "Related Case", - case_maintenance: "Use case person responsible distribution", - bug_count: "Statistics of remaining defects", - case_review: "Use case review", - review_rate: "Reviewed", - coverage: "Coverage", - function_case_count: "Functional Case Count", - relevance_case_count: "Related Case Count", - serial_number: "Index", - test_plan_name: "Plan Name", - case_size: "Case Count", - bug_size: "Bug Count", - passing_rate: "Pass Rate", - percentage: "Percentage" - }, - plan_view: { - plan: "Plan", - relevance_test_case: "Relevance case", - cancel_all_relevance: "Unlink all", - executor: "Executor", - executor_match_rule: "Executor Match Rule", - execute_result: "Result", - pass: "Pass", - not_pass: "UnPass", - failure: "Failure", - blocking: "Blocking", - stop: "Stop", - skip: "Skip", - actual_result: "Actual result", - step_result: "Step result", - my_case: "My case", - all_case: "All case", - pre_case: "The last case", - next_case: "The next case", - change_execution_results: "Change results", - change_executor: "Change executor", - select_executor: "Select executor", - select_execute_result: "Select execute result", - cancel_relevance: "Cancel relevance", - confirm_cancel_relevance: "Confirm cancel relevance", - select_manipulate: "Select the data you want to manipulate", - select_template: "Select template", - step: "Step", - submit_issues: "Commit issues", - operate_step: "Operate step", - edit_component: "Edit component", - component: "component", - base_info: "Base info", - mock_info: "Mock service", - test_result: "Test result", - result_distribution: "Result distribution", - custom_component: "Custom", - create_report: "Create report", - defect_list: "Defect list", - view_report: "View report", - component_library: "Component library", - component_library_tip: "Drag and drop the component from the component library, add to the right, preview the report effect, only one can be added per system component.", - delete_component_tip: "Please reserve at least one component", - input_template_name: "Input template name", - template_special_characters: 'Template name does not support special characters', - case_count: "Case count", - issues_count: "Issues count", - result_statistics: "Result statistics", - result_statistics_chart: "Result statistics chart", - create_template: "Create template", - report_template: "Report template", - test_detail: "Test detail", - failure_case: "Failure case", - export_report: "Export Report", - share_report: "Share Report", - no_case_relevance: "No related use cases", - automatically_update_status: "Auto update status", - allow_associated_repetitive_cases: "Repetitive Case", - automatically_update_status_tip: "When the interface or performance use case associated with the functional use case is executed in the test plan, the status of the functional use case is automatically updated", - allow_associated_repetitive_cases_tip: "Whether to allow the same use case to be associated multiple times in the same test plan", - performance_case_count: "Performance Case Count", - running: "Running", - please_choose_test_case: "please select a test case!", - execute_tip: "The step execution result contains a Failed result, and the use case cannot be marked as Passed!" - }, - issue: { - issue: "Issue", - issue_management: "Issue", - platform_status: "Platform Status", - issue_resource: "Issue Source", - create_issue: "Create Issue", - add_issue: "Add Issue", - issue_list: "Issue List", - search_name: "Search for title", - platform_tip: "Integrated defect management platform in the system setting-workspace-service integration can submit defects to the designated defect management platform", - input_title: "Please enter title", - id: "Issue ID", - title: "Issue Title", - description: "Issue Describe", - status: "Issue Status", - platform: "Platform", - issue_project: "Project", - operate: "Operate", - close: "Close", - delete: "Delete", - title_description_required: "Title and description are required", - close_success: "Closed successfully", - delete_warning: "The cancellation will affect the statistics related to the test plan. Confirm whether to confirm or not", - preview: "Preview", - status_new: 'new', - status_resolved: 'resolved', - status_closed: 'closed', - status_active: 'active', - status_delete: 'delete', - status_in_progress: 'in_progress', - status_rejected: 'rejected', - status_upcoming: 'upcoming', - status_reopened: 'reopened', - please_choose_current_owner: "Please choose current owner", - tapd_current_owner: "Tapd Current Owner", - zentao_bug_build: "Zentao Impact version", - zentao_bug_assigned: "Zentao handler", - third_party_integrated: "Third-party Platform", - use_third_party: "Enable Jira Issue Template", - update_third_party_bugs: "Update the defects of third-party platforms", - sync_bugs: "Synchronization Issue", - sync_complete: "Synchronization complete", - issue_sync_tip: "The current project is synchronizing defects, please wait!", - save_before_open_comment: "Please save issue before comment", - delete_tip: "Confirm Delete Issue:", - check_id_exist: "Check", - save_project_first: "Please save the project first", - tapd_status_new: "New", - tapd_status_in_progress: "Acceptance/Processing", - tapd_status_reopened: "Opened", - tapd_status_rejected: "Refused", - tapd_status_verified: "Authenticated", - tapd_status_closed: "Closed", - tapd_status_resolved: "Resolved", - please_choose_platform_status: "Please select platform status", - }, - report: { - name: "Test Plan Report", - list: { - name: "name", - test_plan: "Test plan", - creator: "Creator", - create_time: "Create Time", - trigger_mode: "Trigger Mode", - run_time: "run time(s)", - pass_rate: "pass rate", - status: "Status", - operation: "Operation", - }, - trigger_mode: { - manual: "Manual", - automation: "Automation", - }, - overview: "Overview", - testing_time: "Testing time", - total_number_tests: "Total", - exacutive_rate: "Exacutive rate", - exacutive_rate_tip: "Use cases executed/all use cases * 100%", - passing_rate: "Passing rate", - passing_rate_tip: "Execute passed use cases/all use cases * 100%", - content: "Content", - report_summary: "Summary", - analysis_functional: "Analysis Functional", - analysis_api: "Analysis Api", - analysis_ui: "Analysis Ui", - analysis_load: "Analysis Performance", - valid_for_24_hours: "Valid for 24 hours", - configuration: "Config", - share: "Share", - template_configuration: "Template configuration", - test_result: "Test Result", - fail_case: "Fail Case", - issue_list: "Issue List", - all_case: "All Case", - }, - reporter: 'Reporter', - lastmodify: 'Last Modify', - sync_to_new_version: "Copy to latest version", - }, + test_track, test_resource_pool: { id: 'Resource Pool ID', type: 'type', diff --git a/frontend/src/i18n/track/en-US.js b/frontend/src/i18n/track/en-US.js new file mode 100644 index 0000000000..ad7d79ebaa --- /dev/null +++ b/frontend/src/i18n/track/en-US.js @@ -0,0 +1,512 @@ +export default { + sync_add_api_load: 'Synchronously add associated api and load tests', + next: 'Next', + total_size: 'Total {0}', + related_requirements: 'Related requirements', + please_related_requirements: 'Please select the requirements to associate', + please_select_the_test_to_associate: "Please select the test to associate", + person_responsible: "Person Responsible", + test_track: "Track", + confirm: "Confirm", + cancel: "Cancel", + planning_execution: "Planning&Execution", + project: "Project", + save: "Save", + return: "Return", + length_less_than: "The length less than", + recent_plan: "My recent plan", + recent_case: "My recent case", + recent_review: "My recent review", + pass_rate: "Pass Rate", + execution_result: ": Please select the execution result", + actual_result: ": The actual result is empty", + cancel_relevance_success: "Unlinked successfully", + switch_project: "Project", + functional_test_case: "Functional Case", + api_test_case: "Api Case", + ui_test_case: "UI Case", + performance_test_case: "Performance Case", + scenario_test_case: "Scenario Case", + ui_scenario_test_case: "UI Scenario Case", + report_statistics: "Report Statistics", + sort: 'Sort', + demand: { + id: 'Demand ID', + name: 'Demand Name', + batch_relate: 'Bulk Association Requirements', + relate_is_null_warn: 'The associated requirement cannot be empty!', + relate_name_is_null_warn: 'Requirement name cannot be empty!', + third_platform_demand: "Third platform demand", + other_demand: "Other demand" + }, + step_model: 'Step Model', + automatic_status_update: "Automatic Status Update", + case: { + list: "List", + minder: "Minder", + step_info: "Step Info", + other_info: "Other Info", + step_describe: "Step Describe", + step_describe_tip: "Applicable to every step of the test scenario, there are clear test steps, expected results", + text_describe: "Text Describe", + text_describe_tip: "For simple test scenarios, there are no clear test steps", + change_type: "Change Type", + minder_create_tip: "failed, unable to create its parent module in minder", + minder_issue_delete_tip: "Successfully cancel the defect association", + check_select: "Please check the case", + export_all_cases: 'Are you sure you want to export all use cases?', + minder_tem_node_tip: "Cannot create case {0} under the temporary node", + minder_is_module_tip: "{0} is a module and cannot be modified as a use ca", + minder_not_module_tip: "Module {0}, cannot be created under a non-module node", + minder_all_module_tip: 'All case are virtual modules. Please create use cases in other modules', + minder_save_confirm_title: 'Please save the minder', + minder_save_confirm_tip: 'The minder is not saved. Are you sure to save?', + minder_import_save_confirm_tip: 'Will the minder be refreshed after successful import and confirm to save minder?', + input_test_case: 'Please enter the associated case name', + test_name: 'TestName', + other: '--Other--', + test_case: "Case", + move: "Move case", + case_list: "Test case list", + create_case: "Create case", + edit_case: "Edit case", + view_case: "Test case", + no_project: "There is no project in this workspace, please create the project first", + priority: "Priority", + type: "Type", + method: "Method", + auto: "Auto", + manual: "Manual", + create: "Create test case", + case_type: "Case Type", + name: "Test Case Name", + module: "Module", + project: 'Project', + maintainer: "Maintainer", + steps: "Steps", + number: "Number", + prerequisite: "Prerequisite", + step_desc: "Case step", + expected_results: "Expected results", + input_name: "Please enter name", + input_module: "Please select module", + input_maintainer: "Please select maintainer", + input_priority: "Please select priority", + input_type: "Please select type", + input_method: "Please select method", + input_prerequisite: "Please select prerequisite", + input_demand_name: "Please input demand id or name", + delete_confirm: "Confirm delete test case", + delete: "Delete case", + save_create_continue: "Save and create continue", + save_add_public: "Save and add public", + please_create_project: "No project available, please create the project first", + create_module_first: "Please create module first", + relate_test: "Relate test", + relate_issue: "Relate Issue", + demand_name_id: "Demand ID/Name", + please_select_relate_test: "Please select the test to associate", + relate_test_not_find: 'The associated test does not exist, please check the test case', + other_relate_test_not_find: 'Associated test name, please go to the third party platform to execute', + batch_handle: 'Batch processing (select {0} items)', + batch_update: 'Update the attributes of {0} cases', + select_catalog: 'Please select use case catalog', + updated_attr_value: 'The updated attribute value', + batch_operate: 'Batch operation', + please_select_attr: 'Please select attributes', + please_select_attr_value: 'Please select the value corresponding to the attribute', + batch_edit_case: 'Batch editing', + batch_move_case: 'Batch move', + batch_copy: 'Batch copy', + batch_add_public: 'Batch add public', + batch_link_demand: 'Bulk Association Requirements', + public_warning: 'The public library configuration is not enabled', + generate_dependencies: 'Generate dependencies', + generate_dependencies_warning: 'For a better experience, it is recommended to check the data below 100', + batch_delete_case: 'Batch delete', + batch_unlink: 'Batch Unlink', + unlink: 'Unlink', + project_name: "Project", + status: 'Review Status', + status_prepare: 'Prepare', + status_running: 'Underway', + status_finished: 'Completed', + status_pass: 'Pass', + status_un_pass: 'UnPass', + cancel_relevance_project: "Disassociating the project will also cancel the associated test cases under the project", + img_loading_fail: "Image failed to load", + pdf_loading_fail: "PDF loading failed", + upload_tip: "file size limit[0-500MB]", + add_attachment: "Add", + attachment: "Attachment", + upload_time: "Upload Time", + total: "Total Case", + node_id: "Node ID", + node_path: "Node Path", + match_rule: "Test Case Match Rule", + import: { + import: "Import test case", + case_import: "Import test case", + case_export: "Export test case", + download_template: "Download template", + click_upload: "Upload", + upload_limit: "Only XLS/XLSX/XMIND files can be uploaded, and no more than 100M", + upload_xmind_format: "Upload files can only be .xmind format", + upload_xmind: "Only xmind files can be uploaded, and no more than 800", + upload_limit_count: "Only one file can be uploaded at a time", + upload_limit_format: "Upload files can only be XLS, XLSX format!", + upload_limit_size: "Upload file size cannot exceed 100MB!", + upload_limit_other_size: "Upload file size cannot exceed", + success: "Import success!", + importing: "Importing...", + excel_title: "Excel ", + xmind_title: "Xmind", + import_desc: "Import instructions", + import_file: "upload files", + ignore_error: "Ignore errors ", + continue_upload: "Upload continue", + import_create: "Import Create", + import_update: "Import Update", + import_tip1: "The ID is required when the \"Test Case Custom ID\" switch is turned on in the project settings", + import_tip2: "ID is required when importing and updating", + import_file_tips: "Please upload the file first!", + import_format: "Import Format", + select_import_field: "Select Field", + select_import_all_field: "Select All", + base_field: "Base Field", + custom_field: "Custom Field", + other_field: "Other Field", + other_field_tip: "Note: For other fields, import is not supported after export", + }, + export: { + export: "Export cases", + export_tip: "Switch to Case List and check Use Case Export" + }, + case_desc: "Case Desc", + passing_rate: 'Case Pass Rate', + exists_multiple_prerequisite_node: "Exists multiple precondition node", + exists_multiple_remark_node: "Exists multiple remark node", + }, + plan: { + test_plan: "Plan", + test_plan_id: 'Plan ID', + create_plan: "Create test plan", + edit_plan: "Edit test plan", + plan_name: "Name", + plan_project: "Project", + related_project: "Related Project", + related_tip: "After linking the project, you can add test cases under the linking project to the test plan list", + plan_stage: "Stage", + follow_people: "Follow", + plan_status: "Status", + smoke_test: "Smoke test", + functional_test: "Functional test", + integration_testing: "Integration test", + system_test: "System test", + regression_test: "Regression test", + version_validation: "Version validation", + plan_principal: "Principal", + input_plan_name: "Please input plan name", + input_plan_principal: "Please select principal", + input_plan_project: "Please select project", + input_related_project: "Please Related project", + input_plan_stage: "Please select stage", + plan_status_prepare: "Not started", + plan_status_running: "Starting", + plan_status_finished: "Finished", + plan_status_completed: "Completed", + plan_status_archived: "Archived", + plan_status_trash: "Trashed", + planned_start_time: "Start Time", + planned_end_time: "End Time", + actual_start_time: "Actual Start Time", + actual_end_time: "Actual End Time", + plan_delete_confirm: "All use cases under this plan will be deleted,confirm delete test plan: ", + plan_delete_tip: "The test plan is under way, please confirm and delete it!", + plan_delete: "Delete test plan", + api_case: "Api case", + scenario_case: "Scenario case", + execute_result: "Execute Result", + execute_time: 'Execute Time', + is_api_case_executing: "Api Case Executing", + is_scenario_executing: 'Scenario Executing', + is_performance_executing: 'Performance Executing', + test_plan_test_case_count: "Track Case Count", + test_plan_api_case_count: "Api Case Count", + test_plan_api_scenario_count: "Scenario Case Count", + test_plan_ui_scenario_count: "Ui Scenario Case Count", + test_plan_load_case_count: "Load Case Count", + test_plan_component_case_count: "Component Case Count", + data_name: "Data Name", + test_plan_batch_switch: "batch on/off scheduled tasks", + batch_update_schedule_enable: 'update the scheduled task status of {0} test plans', + batch_update_schedule_enable_alert: 'note: only test plans with scheduled tasks can be updated', + next_run_time: 'next running time', + schedule_enabled: 'enabled', + check_schedule_enabled: 'the data you checked has detected {0} scheduled tasks that can be modified', + no_check_schedule_enabled: 'the data you checked does not detect a scheduled task', + load_case: { + case: "Load Case", + execution_status: "Execution status", + report: "report", + view_report: "View report", + unlink_in_bulk: "Unlink in bulk", + batch_exec_cases: "Batch execution use cases", + exec: "Executing....", + error: "Use case execution error, please debug this use case separately!", + report_not_found: "Report does not exist", + content_empty: "Content empty", + } + }, + review: { + test_review: "Review", + create_review: "Create Review", + edit_review: "Edit Review", + review_name: "Name", + reviewer: "Reviewer", + review_project: "Project", + review_creator: "Creator", + review_follow_people: "Follow", + review_status: "Status", + related_project: "Related Project", + related_tip: "After the project is associated, you can add test cases under the associated project to the review list", + end_time: "EndTime", + delete: "Delete", + input_review_name: "Please enter the name of the review", + input_review_project: "Please select the project", + input_reviewer: "Please select reviewer", + no_link_case: "No associated use cases!", + prepare: "Prepare", + pass: "Pass", + un_pass: "UnPass", + comment: "Comment", + my_review: "My Review", + my_create: "My Create", + reviewed_by_me: "Review By Me", + creator: "Creator", + done: "Commented use cases", + result_distribution: "Result Distribution", + deadline_cannot_early_tips: "Deadline cannot be earlier than current time!", + }, + comment: { + no_comment: "No Comment", + send_comment: "Post a comment (Ctrl + Enter to send)", + send: "Confirm", + description_is_null: "Comment content cannot be empty!", + send_success: "Comment successful!", + }, + review_view: { + review: "Review", + all_case: "All case", + start_review: "Start Review", + relevance_case: "Relevance Case", + last_page: "It's the end!", + execute_result: "Result", + cannot_edit: "Cannot edit this comment!", + cannot_delete: "Cannot delete this comment!", + submit_description: "please submit comments first!", + }, + module: { + id: 'Module ID', + search: "Search module", + rename: "Rename", + add_submodule: "Add submodule", + add_module: "Add module", + name: "Name", + delete_confirm: "Confirm delete module:", + delete_all_resource: "and all submodules and test cases under the module", + delete_batch_confirm: "Steps to confirm batch deletion of selected scenarios?", + module: "Module", + title: "Title", + describe: "Describe", + status: "Status", + current_owner: "Current Owner", + creation_time: "Creation time", + project_name: "Project" + }, + home: { + recent_test: "Recent Test", + my_plan: "My Plan", + test_rate: "Test Rate", + tested_case: "Tested Case", + review_progress: "Review Progress", + case_count: "Statistics of the number of use cases", + relevance_case: "Related Case", + case_maintenance: "Use case person responsible distribution", + bug_count: "Statistics of remaining defects", + case_review: "Use case review", + review_rate: "Reviewed", + coverage: "Coverage", + function_case_count: "Functional Case Count", + relevance_case_count: "Related Case Count", + serial_number: "Index", + test_plan_name: "Plan Name", + case_size: "Case Count", + bug_size: "Bug Count", + passing_rate: "Pass Rate", + percentage: "Percentage" + }, + plan_view: { + plan: "Plan", + relevance_test_case: "Relevance case", + cancel_all_relevance: "Unlink all", + executor: "Executor", + executor_match_rule: "Executor Match Rule", + execute_result: "Result", + pass: "Pass", + not_pass: "UnPass", + failure: "Failure", + blocking: "Blocking", + stop: "Stop", + skip: "Skip", + actual_result: "Actual result", + step_result: "Step result", + my_case: "My case", + all_case: "All case", + pre_case: "The last case", + next_case: "The next case", + change_execution_results: "Change results", + change_executor: "Change executor", + select_executor: "Select executor", + select_execute_result: "Select execute result", + cancel_relevance: "Cancel relevance", + confirm_cancel_relevance: "Confirm cancel relevance", + select_manipulate: "Select the data you want to manipulate", + select_template: "Select template", + step: "Step", + submit_issues: "Commit issues", + operate_step: "Operate step", + edit_component: "Edit component", + component: "component", + base_info: "Base info", + mock_info: "Mock service", + test_result: "Test result", + result_distribution: "Result distribution", + custom_component: "Custom", + create_report: "Create report", + defect_list: "Defect list", + view_report: "View report", + component_library: "Component library", + component_library_tip: "Drag and drop the component from the component library, add to the right, preview the report effect, only one can be added per system component.", + delete_component_tip: "Please reserve at least one component", + input_template_name: "Input template name", + template_special_characters: 'Template name does not support special characters', + case_count: "Case count", + issues_count: "Issues count", + result_statistics: "Result statistics", + result_statistics_chart: "Result statistics chart", + create_template: "Create template", + report_template: "Report template", + test_detail: "Test detail", + failure_case: "Failure case", + export_report: "Export Report", + share_report: "Share Report", + no_case_relevance: "No related use cases", + automatically_update_status: "Auto update status", + allow_associated_repetitive_cases: "Repetitive Case", + automatically_update_status_tip: "When the interface or performance use case associated with the functional use case is executed in the test plan, the status of the functional use case is automatically updated", + allow_associated_repetitive_cases_tip: "Whether to allow the same use case to be associated multiple times in the same test plan", + performance_case_count: "Performance Case Count", + running: "Running", + please_choose_test_case: "please select a test case!", + execute_tip: "The step execution result contains a Failed result, and the use case cannot be marked as Passed!" + }, + issue: { + issue: "Issue", + issue_management: "Issue", + platform_status: "Platform Status", + issue_resource: "Issue Source", + create_issue: "Create Issue", + add_issue: "Add Issue", + issue_list: "Issue List", + search_name: "Search for title", + platform_tip: "Integrated defect management platform in the system setting-workspace-service integration can submit defects to the designated defect management platform", + input_title: "Please enter title", + id: "Issue ID", + title: "Issue Title", + description: "Issue Describe", + status: "Issue Status", + platform: "Platform", + issue_project: "Project", + operate: "Operate", + close: "Close", + delete: "Delete", + title_description_required: "Title and description are required", + close_success: "Closed successfully", + delete_warning: "The cancellation will affect the statistics related to the test plan. Confirm whether to confirm or not", + preview: "Preview", + status_new: 'new', + status_resolved: 'resolved', + status_closed: 'closed', + status_active: 'active', + status_delete: 'delete', + status_in_progress: 'in_progress', + status_rejected: 'rejected', + status_upcoming: 'upcoming', + status_reopened: 'reopened', + please_choose_current_owner: "Please choose current owner", + tapd_current_owner: "Tapd Current Owner", + zentao_bug_build: "Zentao Impact version", + zentao_bug_assigned: "Zentao handler", + third_party_integrated: "Third-party Platform", + use_third_party: "Enable Jira Issue Template", + update_third_party_bugs: "Update the defects of third-party platforms", + sync_bugs: "Synchronization Issue", + sync_complete: "Synchronization complete", + issue_sync_tip: "The current project is synchronizing defects, please wait!", + save_before_open_comment: "Please save issue before comment", + delete_tip: "Confirm Delete Issue:", + check_id_exist: "Check", + save_project_first: "Please save the project first", + tapd_status_new: "New", + tapd_status_in_progress: "Acceptance/Processing", + tapd_status_reopened: "Opened", + tapd_status_rejected: "Refused", + tapd_status_verified: "Authenticated", + tapd_status_closed: "Closed", + tapd_status_resolved: "Resolved", + please_choose_platform_status: "Please select platform status", + }, + report: { + name: "Test Plan Report", + list: { + name: "name", + test_plan: "Test plan", + creator: "Creator", + create_time: "Create Time", + trigger_mode: "Trigger Mode", + run_time: "run time(s)", + pass_rate: "pass rate", + status: "Status", + operation: "Operation", + }, + trigger_mode: { + manual: "Manual", + automation: "Automation", + }, + overview: "Overview", + testing_time: "Testing time", + total_number_tests: "Total", + exacutive_rate: "Exacutive rate", + exacutive_rate_tip: "Use cases executed/all use cases * 100%", + passing_rate: "Passing rate", + passing_rate_tip: "Execute passed use cases/all use cases * 100%", + content: "Content", + report_summary: "Summary", + analysis_functional: "Analysis Functional", + analysis_api: "Analysis Api", + analysis_ui: "Analysis Ui", + analysis_load: "Analysis Performance", + valid_for_24_hours: "Valid for 24 hours", + configuration: "Config", + share: "Share", + template_configuration: "Template configuration", + test_result: "Test Result", + fail_case: "Fail Case", + issue_list: "Issue List", + all_case: "All Case", + }, + reporter: 'Reporter', + lastmodify: 'Last Modify', + sync_to_new_version: "Copy to latest version" +}; diff --git a/frontend/src/i18n/track/zh-CN.js b/frontend/src/i18n/track/zh-CN.js new file mode 100644 index 0000000000..10c3f0e10d --- /dev/null +++ b/frontend/src/i18n/track/zh-CN.js @@ -0,0 +1,514 @@ +export default { + sync_add_api_load: '同步添加关联的接口和性能测试', + next: '下一条', + total_size: '共 {0} 条', + related_requirements: '关联需求', + please_related_requirements: '请选择要关联的需求', + please_select_the_test_to_associate: "请选择需要关联的测试", + person_responsible: "责任人", + test_track: "测试跟踪", + planning_execution: "规划&执行", + confirm: "确 定", + cancel: "取 消", + project: "项目", + save: "保 存", + return: "返 回", + length_less_than: "长度必须小于", + recent_plan: "我最近的计划", + recent_case: "我最近的用例", + recent_review: "我最近的评审", + pass_rate: "通过率", + execution_result: ": 请选择执行结果", + actual_result: ": 实际结果为空", + cancel_relevance_success: "取消关联成功", + switch_project: "切换项目", + functional_test_case: "功能测试用例", + api_test_case: "接口测试用例", + ui_test_case: "UI 测试用例", + performance_test_case: "性能测试用例", + scenario_test_case: "场景测试用例", + ui_scenario_test_case: "UI 测试用例", + report_statistics: "报告统计", + sort: '种类', + automatic_status_update: "自动状态更新", + case: { + list: "列表", + minder: "脑图", + step_info: "步骤信息", + other_info: "其他信息", + step_describe: "步骤描述", + step_describe_tip: "适用于需要每一个步骤进行测试的场景,有明确的测试步骤、预期结果", + text_describe: "文本描述", + text_describe_tip: "使用于简单的测试场景,没有明确的测试步骤", + change_type: "更改类型", + minder_create_tip: "失败, 无法在脑图创建其父模块", + minder_tem_node_tip: "无法在临时节点{0}下创建用例", + minder_is_module_tip: "{0}是模块,不能修改为用例", + minder_not_module_tip: "模块{0},不能创建在非模块节点下", + minder_all_module_tip: "全部用例为虚拟模块,请在其他模块创建用例", + minder_issue_delete_tip: "取消缺陷关联成功", + + minder_save_confirm_title: '请保存脑图', + minder_save_confirm_tip: '脑图未保存,确认保存脑图吗?', + minder_import_save_confirm_tip: '导入成功后会刷新脑图,确认保存脑图吗?', + + check_select: "请勾选用例", + export_all_cases: '确定要导出全部用例吗?', + input_test_case: '请输入关联用例名称', + test_name: '测试名称', + other: "--其他--", + test_case: "功能用例", + move: "移动用例", + case_list: "用例列表", + create_case: "创建用例", + edit_case: "编辑用例", + view_case: "查看用例", + no_project: "该工作空间下无项目,请先创建项目", + priority: "用例等级", + type: "类型", + method: "测试方式", + auto: "自动", + manual: "手动", + create: "新建用例", + case_type: "用例类型", + name: "用例名称", + module: "所属模块", + project: '所属项目', + maintainer: "维护人", + steps: "执行步骤", + number: "编号", + prerequisite: "前置条件", + step_desc: "用例步骤", + step_model: "编辑模式", + expected_results: "预期结果", + input_name: "请输入名称", + input_module: "请选择模块", + input_maintainer: "请选择维护人", + input_priority: "请选择用例等级", + input_type: "请选择用例类型", + input_method: "请选择测试方式", + input_prerequisite: "请输入前置条件", + input_demand_name: "请输入需求ID或名称", + delete_confirm: "确认删除测试用例", + delete: "删除用例", + save_create_continue: "保存并继续创建", + save_add_public: "保存并添加到公共用例库", + please_create_project: "暂无项目,请先创建项目", + create_module_first: "请先新建模块", + relate_test: "关联测试", + relate_issue: "关联缺陷", + demand_name_id: "需求ID/名称", + please_select_relate_test: "请选择要关联的测试", + relate_test_not_find: '关联的测试不存在,请检查用例', + other_relate_test_not_find: '关联的测试名,请前往第三方平台执行', + batch_handle: '批量处理 (选中{0}项)', + batch_update: '更新{0}个用例的属性', + select_catalog: '请选择用例目录', + updated_attr_value: '更新后属性值为', + batch_operate: '批量操作', + please_select_attr: '请选择属性', + please_select_attr_value: '请选择属性对应的值', + batch_edit_case: '批量编辑', + batch_move_case: '批量移动', + batch_delete_case: '批量删除', + batch_copy: '批量复制', + batch_add_public: '批量添加到公共用例库', + batch_link_demand: '批量关联需求', + public_warning: '未开启公共用例库配置', + generate_dependencies: '生成依赖关系', + generate_dependencies_warning: '为了更好的体验,建议勾选一百条以下的数据', + batch_unlink: '批量取消关联', + unlink: '取消关联', + project_name: '所属项目', + status: '评审结果', + status_prepare: '未开始', + status_running: '进行中', + status_finished: '已完成', + cancel_relevance_project: "取消项目关联会同时取消该项目下已关联的测试用例", + img_loading_fail: "图片加载失败", + pdf_loading_fail: "PDF加载失败", + upload_tip: "文件大小限制[0-500MB]", + add_attachment: "添加", + attachment: "附件", + upload_time: "上传时间", + total: "用例总数", + node_id: "节点ID", + node_path: "节点路径", + match_rule: "测试用例匹配规则", + import: { + import: "导入用例", + case_import: "导入测试用例", + case_export: "导出测试用例", + download_template: "下载模版", + click_upload: "点击上传", + upload_limit: "只能上传xls/xlsx文件,且不超过100M", + upload_xmind: "支持文件类型:.xmind;一次至多导入800 条用例", + upload_xmind_format: "上传文件只能是 .xmind 格式", + upload_limit_other_size: "上传文件大小不能超过", + upload_limit_count: "一次只能上传一个文件", + upload_limit_format: "上传文件只能是 xls、xlsx格式!", + upload_limit_size: "上传文件大小不能超过 100MB!", + success: "导入成功!", + importing: "导入中...", + excel_title: "表格文件", + xmind_title: "思维导图", + import_desc: "导入说明", + import_file: "上传文件", + ignore_error: "忽略错误", + continue_upload: "继续上传", + import_create: "导入新建", + import_update: "导入更新", + import_tip1: "项目设置中“测试用例自定义ID” 开关开启时ID为必填项", + import_tip2: "导入更新时ID为必填项", + import_file_tips: "请先上传文件!", + import_format: "导入格式", + select_import_field: "选择导出字段", + select_import_all_field: "选择所有字段", + base_field: "基础字段", + custom_field: "自定义字段", + other_field: "其他字段", + other_field_tip: "注意:其他字段,导出后不支持导入", + }, + export: { + export: "导出用例", + export_tip: "请切换成用例列表勾选用例导出!" + }, + case_desc: "用例描述", + passing_rate: '用例通过率', + version: "版本", + sync_to_new_version: "复制以下信息到新版本", + exists_multiple_prerequisite_node: "下存在多个前置条件", + exists_multiple_remark_node: "下存在多个备注", + }, + plan: { + test_plan: "测试计划", + test_plan_id: '测试计划Id', + create_plan: "创建测试计划", + edit_plan: "编辑测试计划", + plan_name: "计划名称", + plan_project: "所属项目", + related_project: "关联项目", + related_tip: "关联项目后可以添加关联项目下的测试用例到测试计划列表", + plan_stage: "测试阶段", + follow_people: "关注人", + plan_status: "状态", + smoke_test: "冒烟测试", + functional_test: "功能测试", + regression_test: "回归测试", + integration_testing: "集成测试", + system_test: "系统测试", + version_validation: "版本验证", + plan_principal: "责任人", + input_plan_name: "请输入测试计划名称", + input_plan_principal: "请选择负责人", + input_plan_project: "请选择所属项目", + input_related_project: "请选择关联项目", + input_plan_stage: "请选择测试阶段", + plan_status_prepare: "未开始", + plan_status_running: "进行中", + plan_status_finished: "已结束", + plan_status_completed: "已完成", + plan_status_archived: "已归档", + plan_status_trash: "废弃", + planned_start_time: "计划开始", + planned_end_time: "计划结束", + actual_start_time: "实际开始", + actual_end_time: "实际结束", + plan_delete_confirm: "将删除该测试计划下所有用例,确认删除测试计划: ", + plan_delete_tip: "该测试计划正在进行中,请确认再删除!", + plan_delete: "删除计划", + api_case: "接口测试用例", + scenario_case: "场景测试用例", + execute_result: "执行结果", + execute_time: '执行时间', + is_api_case_executing: "是否执行接口用例", + is_scenario_executing: '是否执行场景', + is_performance_executing: '是否执行性能', + test_plan_test_case_count: "功能用例数", + test_plan_api_case_count: "接口用例数", + test_plan_api_scenario_count: "场景用例数", + test_plan_ui_scenario_count: "UI 场景用例数", + test_plan_load_case_count: "性能用例数", + test_plan_component_case_count: "步骤用例数", + data_name: "数据名称", + test_plan_batch_switch: "批量开/关定时任务", + batch_update_schedule_enable: '更新{0}个测试计划的定时任务状态为', + batch_update_schedule_enable_alert: '注意:只能更新已设置了定时任务的测试计划', + next_run_time: '下次运行时间', + schedule_enabled: '已开启', + check_schedule_enabled: '您勾选的数据检测到有{0}条定时任务可以修改', + no_check_schedule_enabled: '您勾选的数据没有检测到定时任务', + load_case: { + case: "性能用例", + execution_status: "执行状态", + report: "报告", + view_report: "查看报告", + unlink_in_bulk: "批量取消关联", + batch_exec_cases: "批量执行用例", + exec: "正在执行....", + error: "用例执行错误,请单独调试该用例!", + report_not_found: "报告不存在", + content_empty: "内容为空", + } + }, + demand: { + id: '需求ID', + name: '需求名称', + batch_relate: '批量关联需求', + relate_is_null_warn: '关联需求不能为空!', + relate_name_is_null_warn: '需求名称不能为空!', + third_platform_demand: "三方平台需求", + other_demand: "其他需求" + }, + step_model: '步骤模型', + review: { + test_review: "用例评审", + create_review: "创建用例评审", + edit_review: "编辑用例评审", + review_name: "评审名称", + reviewer: "评审人", + review_project: "所属项目", + related_project: "关联项目", + related_tip: "关联项目后可以添加关联项目下的测试用例到评审列表", + review_creator: "发起人", + review_follow_people: "关注人", + review_status: "状态", + end_time: "截止时间", + delete: "删除评审", + input_review_name: "请输入评审名称", + input_review_project: "请选择所属项目", + input_reviewer: "请选择评审人", + no_link_case: "没有关联用例!", + pass: "通过", + un_pass: "未通过", + prepare: '未评审', + comment: "评论", + my_review: "我的评审", + my_create: "我创建的评审", + reviewed_by_me: "待我评审", + creator: "创建人", + done: "已评用例", + result_distribution: "结果分布", + deadline_cannot_early_tips: "截止时间不能早于当前时间!", + }, + comment: { + no_comment: "暂无评论", + send_comment: "发表评论(Ctrl+Enter发送)", + send: "确定", + description_is_null: "评论内容不能为空!", + send_success: "评论成功!", + cannot_edit: "无法编辑此评论!", + cannot_delete: "无法删除此评论!", + submit_description: "请先提交评论!", + }, + review_view: { + review: "评审", + all_case: "全部用例", + start_review: "开始评审", + relevance_case: "关联用例", + last_page: "已经到底了!", + execute_result: "评审结果", + }, + module: { + id: '模块ID', + search: "搜索模块", + rename: "重命名", + add_submodule: "添加子模块", + add_module: "添加模块", + name: "模块名称", + delete_confirm: "确认删除模块: ", + delete_batch_confirm: "确认批量删除勾选的场景步骤?", + delete_all_resource: "以及模块下所有子模块和测试用例", + module: "模块", + title: "标题", + status: "状态", + describe: "描述", + current_owner: "处理人", + creation_time: "创建时间", + project_name: "所属项目" + }, + home: { + recent_test: "最近测试", + my_plan: "我的计划", + test_rate: "测试进度", + tested_case: "已测用例", + review_progress: "评审进度", + case_count: "用例数量统计", + relevance_case: "关联用例数量统计", + case_maintenance: "用例责任人分布", + bug_count: "遗留缺陷统计", + case_review: "用例评审", + review_rate: "评审率", + coverage: "覆盖率", + function_case_count: "功能用例数", + relevance_case_count: "关联用例数", + serial_number: "序号", + test_plan_name: "测试计划名称", + case_size: "用例数", + bug_size: "缺陷数", + passing_rate: "通过率", + percentage: "占比" + }, + plan_view: { + plan: "计划", + relevance_test_case: "关联测试用例", + cancel_all_relevance: "取消全部关联", + executor: "执行人", + executor_match_rule: "执行者匹配规则", + execute_result: "执行结果", + pass: "通过", + not_pass: "不通过", + failure: "失败", + blocking: "阻塞", + stop: "停止", + skip: "跳过", + actual_result: "实际结果", + step_result: "步骤执行结果", + my_case: "我的用例", + all_case: "全部用例", + pre_case: "上一条用例", + next_case: "下一条用例", + change_execution_results: "更改执行结果", + change_executor: "更改执行人", + select_executor: "请选择执行人", + select_execute_result: "选择执行结果", + cancel_relevance: "取消用例关联", + confirm_cancel_relevance: "确认取消关联", + select_manipulate: "请选择需要操作的数据", + select_template: "选择模版", + step: "步骤", + submit_issues: "提缺陷", + operate_step: "操作步骤", + edit_component: "编辑组件", + component: "组件", + base_info: "基础信息", + mock_info: "Mock服务", + test_result: "测试结果", + result_distribution: "测试结果分布", + custom_component: "自定义模块", + defect_list: "缺陷列表", + create_report: "创建测试报告", + view_report: "查看测试报告", + component_library: "组件库", + component_library_tip: "拖拽组件库中组件,添加至右侧,预览报告效果,每个系统组件只能添加一个。", + delete_component_tip: "请至少保留一个组件", + input_template_name: "输入模版名称", + template_special_characters: '模版名称不支持特殊字符', + case_count: "用例数", + issues_count: "缺陷数", + result_statistics: "测试结果统计", + result_statistics_chart: "测试结果统计图", + create_template: "新建模版", + report_template: "测试报告模版", + test_detail: "测试详情", + failure_case: "失败用例", + export_report: "导出报告", + share_report: "分享报告", + no_case_relevance: "没有关联用例", + automatically_update_status: "自动更新状态", + automatically_update_status_tip: "当功能用例关联的接口或性能用例在测试计划执行后,自动更新功能用例的状态", + allow_associated_repetitive_cases: "允许关联重复用例", + allow_associated_repetitive_cases_tip: "是否允许同一个测试计划中多次关联相同用例", + performance_case_count: "性能测试用例数", + running: "运行中", + please_choose_test_case: "请选择测试用例!", + execute_tip: "步骤执行结果中含有 失败 结果,无法标记该用例为 通过 状态!" + }, + issue: { + issue: "缺陷", + issue_management: "缺陷管理", + platform_status: "平台状态", + issue_resource: "缺陷来源", + create_issue: "创建缺陷", + add_issue: "添加缺陷", + issue_list: "缺陷列表", + search_name: "根据标题搜索", + platform_tip: "在系统设置-工作空间-服务集成中集成缺陷管理平台可以提交缺陷到指定缺陷管理平台", + input_title: "请输入标题", + id: "缺陷ID", + title: "缺陷标题", + description: "缺陷描述", + status: "缺陷状态", + issue_project: "所属项目", + platform: "平台", + operate: "操作", + close: "关闭缺陷", + delete: "删除缺陷", + title_description_required: "标题和描述必填", + close_success: "关闭成功", + delete_warning: "解除会影响测试计划相关统计,是否确认", + preview: "预览", + status_new: '新建', + status_resolved: '已解决', + status_closed: '已关闭', + status_active: '激活', + status_delete: '删除', + status_in_progress: '接受/处理', + status_rejected: '拒绝', + status_upcoming: '待办', + status_reopened: '重新打开', + please_choose_current_owner: "请选择处理人", + tapd_current_owner: "Tapd 处理人", + zentao_bug_build: "禅道 影响版本", + zentao_bug_assigned: "禅道 处理人", + third_party_integrated: "集成第三方平台", + use_third_party: "使用 Jira 缺陷模板", + update_third_party_bugs: "更新第三方平台的缺陷", + sync_bugs: "同步缺陷", + sync_complete: "同步完成", + issue_sync_tip: "当前项目正在同步缺陷, 请稍等!", + save_before_open_comment: "请先保存缺陷再添加评论", + delete_tip: "确认删除缺陷:", + check_id_exist: "检查", + save_project_first: "请先保存项目", + tapd_status_new: "新", + tapd_status_in_progress: "接受/处理", + tapd_status_reopened: "重新打开", + tapd_status_rejected: "已拒绝", + tapd_status_verified: "已验证", + tapd_status_closed: "已关闭", + tapd_status_resolved: "已解决", + please_choose_platform_status: "请选择平台状态" + }, + report: { + name: "测试计划报告", + list: { + name: "名称", + test_plan: "测试计划名称", + creator: "创建人", + create_time: "创建时间", + trigger_mode: "触发方式", + run_time: "运行耗时(s)", + pass_rate: "成功率", + status: "状态", + operation: "操作", + }, + trigger_mode: { + manual: "手动触发", + automation: "自动触发", + }, + overview: "概览", + testing_time: "测试时间", + total_number_tests: "测试总数", + exacutive_rate: "执行率", + exacutive_rate_tip: "执行过的用例/所有用例 * 100%", + passing_rate: "通过率", + passing_rate_tip: "执行通过用例/所有用例 * 100%", + content: "目录", + report_summary: "报告总结", + analysis_functional: "功能用例统计分析", + analysis_api: "接口用例统计分析", + analysis_ui: "UI 用例统计分析", + analysis_load: "性能用例统计分析", + valid_for_24_hours: "24小时有效", + configuration: "配置", + share: "分享", + template_configuration: "模板配置", + test_result: "测试结果", + fail_case: "失败用例", + issue_list: "缺陷列表", + all_case: "所有用例", + }, + reporter: '报告人', + lastmodify: '最后更改' +}; diff --git a/frontend/src/i18n/track/zh-TW.js b/frontend/src/i18n/track/zh-TW.js new file mode 100644 index 0000000000..0d90f34e71 --- /dev/null +++ b/frontend/src/i18n/track/zh-TW.js @@ -0,0 +1,514 @@ +export default { + sync_add_api_load: '同步添加關聯的接口和性能測試', + next: '下一條', + total_size: '共 {0} 條', + related_requirements: '關聯需求', + please_related_requirements: '請選擇要關聯的需求', + please_select_the_test_to_associate: "請選擇需要關聯的測試", + person_responsible: "責任人", + test_track: "測試跟蹤", + planning_execution: "規劃&執行", + confirm: "確 定", + cancel: "取 消", + project: "項目", + save: "保 存", + return: "返 回", + length_less_than: "長度必須小於", + recent_plan: "我最近的計劃", + recent_case: "我最近的用例", + recent_review: "我最近的評審", + pass_rate: "通過率", + execution_result: ": 請選擇執行結果", + actual_result: ": 實際結果為空", + cancel_relevance_success: "取消關聯成功", + switch_project: "切換項目", + functional_test_case: "功能測試用例", + api_test_case: "接口測試用例", + ui_test_case: "UI 測試用例", + performance_test_case: "性能測試用例", + scenario_test_case: "場景測試用例", + ui_scenario_test_case: "UI 測試用例", + report_statistics: "報告統計", + sort: '種類', + automatic_status_update: "自動狀態更新", + case: { + list: "列錶", + minder: "腦圖", + step_info: "步驟信息", + other_info: "其他信息", + step_describe: "步驟描述", + step_describe_tip: "適用於需要每一個步驟進行測試的場景,有明確的測試步驟、預期結果", + text_describe: "文本描述", + text_describe_tip: "使用於簡單的測試場景,沒有明確的測試步驟", + change_type: "更改類型", + minder_create_tip: "失敗, 無法在腦圖創建其父模塊", + minder_tem_node_tip: "無法在臨時節點{0}下創建用例", + minder_is_module_tip: "{0}是模塊,不能修改為用例", + minder_not_module_tip: "模塊{0},不能創建在非模塊節點下", + minder_all_module_tip: "全部用例為虛擬模塊,請在其他模塊創建用例", + minder_issue_delete_tip: "取消缺陷關聯成功", + + minder_save_confirm_title: '請保存腦圖', + minder_save_confirm_tip: '腦圖未保存,確認保存腦圖嗎?', + minder_import_save_confirm_tip: '導入成功後會刷新腦圖,確認保存腦圖嗎?', + + check_select: "請勾選用例", + export_all_cases: '確定要導出全部用例嗎?', + input_test_case: '請輸入關聯用例名稱', + test_name: '測試名稱', + other: "--其他--", + test_case: "功能用例", + move: "移動用例", + case_list: "用例列錶", + create_case: "創建用例", + edit_case: "編輯用例", + view_case: "查看用例", + no_project: "該工作空間下無項目,請先創建項目", + priority: "用例等級", + type: "類型", + method: "測試方式", + auto: "自動", + manual: "手動", + create: "新建用例", + case_type: "用例類型", + name: "用例名稱", + module: "所屬模塊", + project: '所屬項目', + maintainer: "維護人", + steps: "執行步驟", + number: "編號", + prerequisite: "前置條件", + step_desc: "用例步驟", + step_model: "編輯模式", + expected_results: "預期結果", + input_name: "請輸入名稱", + input_module: "請選擇模塊", + input_maintainer: "請選擇維護人", + input_priority: "請選擇用例等級", + input_type: "請選擇用例類型", + input_method: "請選擇測試方式", + input_prerequisite: "請輸入前置條件", + input_demand_name: "請輸入需求ID或名稱", + delete_confirm: "確認刪除測試用例", + delete: "刪除用例", + save_create_continue: "保存併繼續創建", + save_add_public: "保存併添加到公共用例庫", + please_create_project: "暫無項目,請先創建項目", + create_module_first: "請先新建模塊", + relate_test: "關聯測試", + relate_issue: "關聯缺陷", + demand_name_id: "需求ID/名稱", + please_select_relate_test: "請選擇要關聯的測試", + relate_test_not_find: '關聯的測試不存在,請檢查用例', + other_relate_test_not_find: '關聯的測試名,請前往第三方平臺執行', + batch_handle: '批量處理 (選中{0}項)', + batch_update: '更新{0}個用例的屬性', + select_catalog: '請選擇用例目錄', + updated_attr_value: '更新後屬性值為', + batch_operate: '批量操作', + please_select_attr: '請選擇屬性', + please_select_attr_value: '請選擇屬性對應的值', + batch_edit_case: '批量編輯', + batch_move_case: '批量移動', + batch_delete_case: '批量刪除', + batch_copy: '批量復制', + batch_add_public: '批量添加到公共用例庫', + batch_link_demand: '批量關聯需求', + public_warning: '未開啟公共用例庫配置', + generate_dependencies: '生成依賴關繫', + generate_dependencies_warning: '為了更好的體驗,建議勾選一百條以下的數據', + batch_unlink: '批量取消關聯', + unlink: '取消關聯', + project_name: '所屬項目', + status: '評審結果', + status_prepare: '未開始', + status_running: '進行中', + status_finished: '已完成', + cancel_relevance_project: "取消項目關聯會同時取消該項目下已關聯的測試用例", + img_loading_fail: "圖片加載失敗", + pdf_loading_fail: "PDF加載失敗", + upload_tip: "文件大小限制[0-500MB]", + add_attachment: "添加", + attachment: "附件", + upload_time: "上傳時間", + total: "用例總數", + node_id: "節點ID", + node_path: "節點路徑", + match_rule: "測試用例匹配規則", + import: { + import: "導入用例", + case_import: "導入測試用例", + case_export: "導出測試用例", + download_template: "下載模版", + click_upload: "點擊上傳", + upload_limit: "只能上傳xls/xlsx文件,且不超過100M", + upload_xmind: "支持文件類型:.xmind;一次至多導入800 條用例", + upload_xmind_format: "上傳文件只能是 .xmind 格式", + upload_limit_other_size: "上傳文件大小不能超過", + upload_limit_count: "一次只能上傳一個文件", + upload_limit_format: "上傳文件只能是 xls、xlsx格式!", + upload_limit_size: "上傳文件大小不能超過 100MB!", + success: "導入成功!", + importing: "導入中...", + excel_title: "錶格文件", + xmind_title: "思維導圖", + import_desc: "導入說明", + import_file: "上傳文件", + ignore_error: "忽略錯誤", + continue_upload: "繼續上傳", + import_create: "導入新建", + import_update: "導入更新", + import_tip1: "項目設置中“測試用例自定義ID” 開關開啟時ID為必填項", + import_tip2: "導入更新時ID為必填項", + import_file_tips: "請先上傳文件!", + import_format: "導入格式", + select_import_field: "選擇導出字段", + select_import_all_field: "選擇所有字段", + base_field: "基礎字段", + custom_field: "自定義字段", + other_field: "其他字段", + other_field_tip: "註意:其他字段,導出後不支持導入", + }, + export: { + export: "導出用例", + export_tip: "請切換成用例列錶勾選用例導出!" + }, + case_desc: "用例描述", + passing_rate: '用例通過率', + version: "版本", + sync_to_new_version: "復制以下信息到新版本", + exists_multiple_prerequisite_node: "下存在多個前置條件", + exists_multiple_remark_node: "下存在多個備註", + }, + plan: { + test_plan: "測試計劃", + test_plan_id: '測試計劃Id', + create_plan: "創建測試計劃", + edit_plan: "編輯測試計劃", + plan_name: "計劃名稱", + plan_project: "所屬項目", + related_project: "關聯項目", + related_tip: "關聯項目後可以添加關聯項目下的測試用例到測試計劃列錶", + plan_stage: "測試階段", + follow_people: "關註人", + plan_status: "狀態", + smoke_test: "冒煙測試", + functional_test: "功能測試", + regression_test: "回歸測試", + integration_testing: "集成測試", + system_test: "繫統測試", + version_validation: "版本驗證", + plan_principal: "責任人", + input_plan_name: "請輸入測試計劃名稱", + input_plan_principal: "請選擇負責人", + input_plan_project: "請選擇所屬項目", + input_related_project: "請選擇關聯項目", + input_plan_stage: "請選擇測試階段", + plan_status_prepare: "未開始", + plan_status_running: "進行中", + plan_status_finished: "已結束", + plan_status_completed: "已完成", + plan_status_archived: "已歸檔", + plan_status_trash: "廢棄", + planned_start_time: "計劃開始", + planned_end_time: "計劃結束", + actual_start_time: "實際開始", + actual_end_time: "實際結束", + plan_delete_confirm: "將刪除該測試計劃下所有用例,確認刪除測試計劃: ", + plan_delete_tip: "該測試計劃正在進行中,請確認再刪除!", + plan_delete: "刪除計劃", + api_case: "接口測試用例", + scenario_case: "場景測試用例", + execute_result: "執行結果", + execute_time: '執行時間', + is_api_case_executing: "是否執行接口用例", + is_scenario_executing: '是否執行場景', + is_performance_executing: '是否執行性能', + test_plan_test_case_count: "功能用例數", + test_plan_api_case_count: "接口用例數", + test_plan_api_scenario_count: "場景用例數", + test_plan_ui_scenario_count: "UI 場景用例數", + test_plan_load_case_count: "性能用例數", + test_plan_component_case_count: "步驟用例數", + data_name: "數據名稱", + test_plan_batch_switch: "批量開/關定時任務", + batch_update_schedule_enable: '更新{0}個測試計劃的定時任務狀態為', + batch_update_schedule_enable_alert: '註意:只能更新已設置了定時任務的測試計劃', + next_run_time: '下次運行時間', + schedule_enabled: '已開啟', + check_schedule_enabled: '您勾選的數據檢測到有{0}條定時任務可以修改', + no_check_schedule_enabled: '您勾選的數據沒有檢測到定時任務', + load_case: { + case: "性能用例", + execution_status: "執行狀態", + report: "報告", + view_report: "查看報告", + unlink_in_bulk: "批量取消關聯", + batch_exec_cases: "批量執行用例", + exec: "正在執行....", + error: "用例執行錯誤,請單獨調試該用例!", + report_not_found: "報告不存在", + content_empty: "內容為空", + } + }, + demand: { + id: '需求ID', + name: '需求名稱', + batch_relate: '批量關聯需求', + relate_is_null_warn: '關聯需求不能為空!', + relate_name_is_null_warn: '需求名稱不能為空!', + third_platform_demand: "三方平臺需求", + other_demand: "其他需求" + }, + step_model: '步驟模型', + review: { + test_review: "用例評審", + create_review: "創建用例評審", + edit_review: "編輯用例評審", + review_name: "評審名稱", + reviewer: "評審人", + review_project: "所屬項目", + related_project: "關聯項目", + related_tip: "關聯項目後可以添加關聯項目下的測試用例到評審列錶", + review_creator: "發起人", + review_follow_people: "關註人", + review_status: "狀態", + end_time: "截止時間", + delete: "刪除評審", + input_review_name: "請輸入評審名稱", + input_review_project: "請選擇所屬項目", + input_reviewer: "請選擇評審人", + no_link_case: "沒有關聯用例!", + pass: "通過", + un_pass: "未通過", + prepare: '未評審', + comment: "評論", + my_review: "我的評審", + my_create: "我創建的評審", + reviewed_by_me: "待我評審", + creator: "創建人", + done: "已評用例", + result_distribution: "結果分佈", + deadline_cannot_early_tips: "截止時間不能早於當前時間!", + }, + comment: { + no_comment: "暫無評論", + send_comment: "發錶評論(Ctrl+Enter發送)", + send: "確定", + description_is_null: "評論內容不能為空!", + send_success: "評論成功!", + cannot_edit: "無法編輯此評論!", + cannot_delete: "無法刪除此評論!", + submit_description: "請先提交評論!", + }, + review_view: { + review: "評審", + all_case: "全部用例", + start_review: "開始評審", + relevance_case: "關聯用例", + last_page: "已經到底了!", + execute_result: "評審結果", + }, + module: { + id: '模塊ID', + search: "搜索模塊", + rename: "重命名", + add_submodule: "添加子模塊", + add_module: "添加模塊", + name: "模塊名稱", + delete_confirm: "確認刪除模塊: ", + delete_batch_confirm: "確認批量刪除勾選的場景步驟?", + delete_all_resource: "以及模塊下所有子模塊和測試用例", + module: "模塊", + title: "標題", + status: "狀態", + describe: "描述", + current_owner: "處理人", + creation_time: "創建時間", + project_name: "所屬項目" + }, + home: { + recent_test: "最近測試", + my_plan: "我的計劃", + test_rate: "測試進度", + tested_case: "已測用例", + review_progress: "評審進度", + case_count: "用例數量統計", + relevance_case: "關聯用例數量統計", + case_maintenance: "用例責任人分佈", + bug_count: "遺留缺陷統計", + case_review: "用例評審", + review_rate: "評審率", + coverage: "覆蓋率", + function_case_count: "功能用例數", + relevance_case_count: "關聯用例數", + serial_number: "序號", + test_plan_name: "測試計劃名稱", + case_size: "用例數", + bug_size: "缺陷數", + passing_rate: "通過率", + percentage: "佔比" + }, + plan_view: { + plan: "計劃", + relevance_test_case: "關聯測試用例", + cancel_all_relevance: "取消全部關聯", + executor: "執行人", + executor_match_rule: "執行者匹配規則", + execute_result: "執行結果", + pass: "通過", + not_pass: "不通過", + failure: "失敗", + blocking: "阻塞", + stop: "停止", + skip: "跳過", + actual_result: "實際結果", + step_result: "步驟執行結果", + my_case: "我的用例", + all_case: "全部用例", + pre_case: "上一條用例", + next_case: "下一條用例", + change_execution_results: "更改執行結果", + change_executor: "更改執行人", + select_executor: "請選擇執行人", + select_execute_result: "選擇執行結果", + cancel_relevance: "取消用例關聯", + confirm_cancel_relevance: "確認取消關聯", + select_manipulate: "請選擇需要操作的數據", + select_template: "選擇模版", + step: "步驟", + submit_issues: "提缺陷", + operate_step: "操作步驟", + edit_component: "編輯組件", + component: "組件", + base_info: "基礎信息", + mock_info: "Mock服務", + test_result: "測試結果", + result_distribution: "測試結果分佈", + custom_component: "自定義模塊", + defect_list: "缺陷列錶", + create_report: "創建測試報告", + view_report: "查看測試報告", + component_library: "組件庫", + component_library_tip: "拖拽組件庫中組件,添加至右側,預覽報告效果,每個繫統組件只能添加一個。", + delete_component_tip: "請至少保留一個組件", + input_template_name: "輸入模版名稱", + template_special_characters: '模版名稱不支持特殊字符', + case_count: "用例數", + issues_count: "缺陷數", + result_statistics: "測試結果統計", + result_statistics_chart: "測試結果統計圖", + create_template: "新建模版", + report_template: "測試報告模版", + test_detail: "測試詳情", + failure_case: "失敗用例", + export_report: "導出報告", + share_report: "分享報告", + no_case_relevance: "沒有關聯用例", + automatically_update_status: "自動更新狀態", + automatically_update_status_tip: "當功能用例關聯的接口或性能用例在測試計劃執行後,自動更新功能用例的狀態", + allow_associated_repetitive_cases: "允許關聯重復用例", + allow_associated_repetitive_cases_tip: "是否允許同一個測試計劃中多次關聯相同用例", + performance_case_count: "性能測試用例數", + running: "運行中", + please_choose_test_case: "請選擇測試用例!", + execute_tip: "步驟執行結果中含有 失敗 結果,無法標記該用例為 通過 狀態!" + }, + issue: { + issue: "缺陷", + issue_management: "缺陷管理", + platform_status: "平臺狀態", + issue_resource: "缺陷來源", + create_issue: "創建缺陷", + add_issue: "添加缺陷", + issue_list: "缺陷列錶", + search_name: "根據標題搜索", + platform_tip: "在繫統設置-工作空間-服務集成中集成缺陷管理平臺可以提交缺陷到指定缺陷管理平臺", + input_title: "請輸入標題", + id: "缺陷ID", + title: "缺陷標題", + description: "缺陷描述", + status: "缺陷狀態", + issue_project: "所屬項目", + platform: "平臺", + operate: "操作", + close: "關閉缺陷", + delete: "刪除缺陷", + title_description_required: "標題和描述必填", + close_success: "關閉成功", + delete_warning: "解除會影響測試計劃相關統計,是否確認", + preview: "預覽", + status_new: '新建', + status_resolved: '已解決', + status_closed: '已關閉', + status_active: '激活', + status_delete: '刪除', + status_in_progress: '接受/處理', + status_rejected: '拒絕', + status_upcoming: '待辦', + status_reopened: '重新打開', + please_choose_current_owner: "請選擇處理人", + tapd_current_owner: "Tapd 處理人", + zentao_bug_build: "禪道 影響版本", + zentao_bug_assigned: "禪道 處理人", + third_party_integrated: "集成第三方平臺", + use_third_party: "使用 Jira 缺陷模闆", + update_third_party_bugs: "更新第三方平臺的缺陷", + sync_bugs: "同步缺陷", + sync_complete: "同步完成", + issue_sync_tip: "當前項目正在同步缺陷, 請稍等!", + save_before_open_comment: "請先保存缺陷再添加評論", + delete_tip: "確認刪除缺陷:", + check_id_exist: "檢查", + save_project_first: "請先保存項目", + tapd_status_new: "新", + tapd_status_in_progress: "接受/處理", + tapd_status_reopened: "重新打開", + tapd_status_rejected: "已拒絕", + tapd_status_verified: "已驗證", + tapd_status_closed: "已關閉", + tapd_status_resolved: "已解決", + please_choose_platform_status: "請選擇平臺狀態" + }, + report: { + name: "測試計劃報告", + list: { + name: "名稱", + test_plan: "測試計劃名稱", + creator: "創建人", + create_time: "創建時間", + trigger_mode: "觸發方式", + run_time: "運行耗時(s)", + pass_rate: "成功率", + status: "狀態", + operation: "操作", + }, + trigger_mode: { + manual: "手動觸發", + automation: "自動觸發", + }, + overview: "概覽", + testing_time: "測試時間", + total_number_tests: "測試總數", + exacutive_rate: "執行率", + exacutive_rate_tip: "執行過的用例/所有用例 * 100%", + passing_rate: "通過率", + passing_rate_tip: "執行通過用例/所有用例 * 100%", + content: "目錄", + report_summary: "報告總結", + analysis_functional: "功能用例統計分析", + analysis_api: "接口用例統計分析", + analysis_ui: "UI 用例統計分析", + analysis_load: "性能用例統計分析", + valid_for_24_hours: "24小時有效", + configuration: "配置", + share: "分享", + template_configuration: "模闆配置", + test_result: "測試結果", + fail_case: "失敗用例", + issue_list: "缺陷列錶", + all_case: "所有用例", + }, + reporter: '報告人', + lastmodify: '最後更改' +}; diff --git a/frontend/src/i18n/zh-CN.js b/frontend/src/i18n/zh-CN.js index e1f3428971..a3233b0237 100644 --- a/frontend/src/i18n/zh-CN.js +++ b/frontend/src/i18n/zh-CN.js @@ -1,3 +1,5 @@ +import test_track from "./track/zh-CN"; + export default { commons: { project_permission: '请先添加该项目权限', @@ -94,6 +96,7 @@ export default { input_password: '请输入密码', test: '测试', create_time: '创建时间', + creator: '创建人', update_user_id: '更新人ID', update_time: '更新时间', delete_time: '删除时间', @@ -2071,512 +2074,7 @@ export default { please_search: "请搜索", date: "日期" }, - test_track: { - sync_add_api_load: '同步添加关联的接口和性能测试', - next: '下一条', - total_size: '共 {0} 条', - related_requirements: '关联需求', - please_related_requirements: '请选择要关联的需求', - please_select_the_test_to_associate: "请选择需要关联的测试", - person_responsible: "责任人", - test_track: "测试跟踪", - planning_execution: "规划&执行", - confirm: "确 定", - cancel: "取 消", - project: "项目", - save: "保 存", - return: "返 回", - length_less_than: "长度必须小于", - recent_plan: "我最近的计划", - recent_case: "我最近的用例", - recent_review: "我最近的评审", - pass_rate: "通过率", - execution_result: ": 请选择执行结果", - actual_result: ": 实际结果为空", - cancel_relevance_success: "取消关联成功", - switch_project: "切换项目", - functional_test_case: "功能测试用例", - api_test_case: "接口测试用例", - ui_test_case: "UI 测试用例", - performance_test_case: "性能测试用例", - scenario_test_case: "场景测试用例", - ui_scenario_test_case: "UI 测试用例", - report_statistics: "报告统计", - sort: '种类', - automatic_status_update: "自动状态更新", - case: { - list: "列表", - minder: "脑图", - step_info: "步骤信息", - other_info: "其他信息", - step_describe: "步骤描述", - step_describe_tip: "适用于需要每一个步骤进行测试的场景,有明确的测试步骤、预期结果", - text_describe: "文本描述", - text_describe_tip: "使用于简单的测试场景,没有明确的测试步骤", - change_type: "更改类型", - minder_create_tip: "失败, 无法在脑图创建其父模块", - minder_tem_node_tip: "无法在临时节点{0}下创建用例", - minder_is_module_tip: "{0}是模块,不能修改为用例", - minder_not_module_tip: "模块{0},不能创建在非模块节点下", - minder_all_module_tip: "全部用例为虚拟模块,请在其他模块创建用例", - minder_issue_delete_tip: "取消缺陷关联成功", - - minder_save_confirm_title: '请保存脑图', - minder_save_confirm_tip: '脑图未保存,确认保存脑图吗?', - minder_import_save_confirm_tip: '导入成功后会刷新脑图,确认保存脑图吗?', - - check_select: "请勾选用例", - export_all_cases: '确定要导出全部用例吗?', - input_test_case: '请输入关联用例名称', - test_name: '测试名称', - other: "--其他--", - test_case: "功能用例", - move: "移动用例", - case_list: "用例列表", - create_case: "创建用例", - edit_case: "编辑用例", - view_case: "查看用例", - no_project: "该工作空间下无项目,请先创建项目", - priority: "用例等级", - type: "类型", - method: "测试方式", - auto: "自动", - manual: "手动", - create: "新建用例", - case_type: "用例类型", - name: "用例名称", - module: "所属模块", - project: '所属项目', - maintainer: "维护人", - steps: "执行步骤", - number: "编号", - prerequisite: "前置条件", - step_desc: "用例步骤", - expected_results: "预期结果", - input_name: "请输入名称", - input_module: "请选择模块", - input_maintainer: "请选择维护人", - input_priority: "请选择用例等级", - input_type: "请选择用例类型", - input_method: "请选择测试方式", - input_prerequisite: "请输入前置条件", - input_demand_name: "请输入需求ID或名称", - delete_confirm: "确认删除测试用例", - delete: "删除用例", - save_create_continue: "保存并继续创建", - save_add_public: "保存并添加到公共用例库", - please_create_project: "暂无项目,请先创建项目", - create_module_first: "请先新建模块", - relate_test: "关联测试", - relate_issue: "关联缺陷", - demand_name_id: "需求ID/名称", - please_select_relate_test: "请选择要关联的测试", - relate_test_not_find: '关联的测试不存在,请检查用例', - other_relate_test_not_find: '关联的测试名,请前往第三方平台执行', - batch_handle: '批量处理 (选中{0}项)', - batch_update: '更新{0}个用例的属性', - select_catalog: '请选择用例目录', - updated_attr_value: '更新后属性值为', - batch_operate: '批量操作', - please_select_attr: '请选择属性', - please_select_attr_value: '请选择属性对应的值', - batch_edit_case: '批量编辑', - batch_move_case: '批量移动', - batch_delete_case: '批量删除', - batch_copy: '批量复制', - batch_add_public: '批量添加到公共用例库', - batch_link_demand: '批量关联需求', - public_warning: '未开启公共用例库配置', - generate_dependencies: '生成依赖关系', - generate_dependencies_warning: '为了更好的体验,建议勾选一百条以下的数据', - batch_unlink: '批量取消关联', - unlink: '取消关联', - project_name: '所属项目', - status: '评审结果', - status_prepare: '未开始', - status_running: '进行中', - status_finished: '已完成', - cancel_relevance_project: "取消项目关联会同时取消该项目下已关联的测试用例", - img_loading_fail: "图片加载失败", - pdf_loading_fail: "PDF加载失败", - upload_tip: "文件大小限制[0-500MB]", - add_attachment: "添加", - attachment: "附件", - upload_time: "上传时间", - total: "用例总数", - node_id: "节点ID", - node_path: "节点路径", - match_rule: "测试用例匹配规则", - import: { - import: "导入用例", - case_import: "导入测试用例", - case_export: "导出测试用例", - download_template: "下载模版", - click_upload: "点击上传", - upload_limit: "只能上传xls/xlsx文件,且不超过100M", - upload_xmind: "支持文件类型:.xmind;一次至多导入800 条用例", - upload_xmind_format: "上传文件只能是 .xmind 格式", - upload_limit_other_size: "上传文件大小不能超过", - upload_limit_count: "一次只能上传一个文件", - upload_limit_format: "上传文件只能是 xls、xlsx格式!", - upload_limit_size: "上传文件大小不能超过 100MB!", - success: "导入成功!", - importing: "导入中...", - excel_title: "表格文件", - xmind_title: "思维导图", - import_desc: "导入说明", - import_file: "上传文件", - ignore_error: "忽略错误", - continue_upload: "继续上传", - import_create: "导入新建", - import_update: "导入更新", - import_tip1: "项目设置中“测试用例自定义ID” 开关开启时ID为必填项", - import_tip2: "导入更新时ID为必填项", - import_file_tips: "请先上传文件!", - }, - export: { - export: "导出用例", - export_tip: "请切换成用例列表勾选用例导出!" - }, - case_desc: "用例描述", - passing_rate: '用例通过率', - version: "版本", - sync_to_new_version: "复制以下信息到新版本", - exists_multiple_prerequisite_node: "下存在多个前置条件", - exists_multiple_remark_node: "下存在多个备注", - }, - plan: { - test_plan: "测试计划", - test_plan_id: '测试计划Id', - create_plan: "创建测试计划", - edit_plan: "编辑测试计划", - plan_name: "计划名称", - plan_project: "所属项目", - related_project: "关联项目", - related_tip: "关联项目后可以添加关联项目下的测试用例到测试计划列表", - plan_stage: "测试阶段", - follow_people: "关注人", - plan_status: "状态", - smoke_test: "冒烟测试", - functional_test: "功能测试", - regression_test: "回归测试", - integration_testing: "集成测试", - system_test: "系统测试", - version_validation: "版本验证", - plan_principal: "责任人", - input_plan_name: "请输入测试计划名称", - input_plan_principal: "请选择负责人", - input_plan_project: "请选择所属项目", - input_related_project: "请选择关联项目", - input_plan_stage: "请选择测试阶段", - plan_status_prepare: "未开始", - plan_status_running: "进行中", - plan_status_finished: "已结束", - plan_status_completed: "已完成", - plan_status_archived: "已归档", - plan_status_trash: "废弃", - planned_start_time: "计划开始", - planned_end_time: "计划结束", - actual_start_time: "实际开始", - actual_end_time: "实际结束", - plan_delete_confirm: "将删除该测试计划下所有用例,确认删除测试计划: ", - plan_delete_tip: "该测试计划正在进行中,请确认再删除!", - plan_delete: "删除计划", - api_case: "接口测试用例", - scenario_case: "场景测试用例", - execute_result: "执行结果", - execute_time: '执行时间', - is_api_case_executing: "是否执行接口用例", - is_scenario_executing: '是否执行场景', - is_performance_executing: '是否执行性能', - test_plan_test_case_count: "功能用例数", - test_plan_api_case_count: "接口用例数", - test_plan_api_scenario_count: "场景用例数", - test_plan_ui_scenario_count: "UI 场景用例数", - test_plan_load_case_count: "性能用例数", - test_plan_component_case_count: "步骤用例数", - data_name: "数据名称", - test_plan_batch_switch: "批量开/关定时任务", - batch_update_schedule_enable: '更新{0}个测试计划的定时任务状态为', - batch_update_schedule_enable_alert: '注意:只能更新已设置了定时任务的测试计划', - next_run_time: '下次运行时间', - schedule_enabled: '已开启', - check_schedule_enabled: '您勾选的数据检测到有{0}条定时任务可以修改', - no_check_schedule_enabled: '您勾选的数据没有检测到定时任务', - load_case: { - case: "性能用例", - execution_status: "执行状态", - report: "报告", - view_report: "查看报告", - unlink_in_bulk: "批量取消关联", - batch_exec_cases: "批量执行用例", - exec: "正在执行....", - error: "用例执行错误,请单独调试该用例!", - report_not_found: "报告不存在", - content_empty: "内容为空", - } - }, - demand: { - id: '需求ID', - name: '需求名称', - batch_relate: '批量关联需求', - relate_is_null_warn: '关联需求不能为空!', - relate_name_is_null_warn: '需求名称不能为空!', - third_platform_demand: "三方平台需求", - other_demand: "其他需求" - }, - step_model: '步骤模型', - review: { - test_review: "用例评审", - create_review: "创建用例评审", - edit_review: "编辑用例评审", - review_name: "评审名称", - reviewer: "评审人", - review_project: "所属项目", - related_project: "关联项目", - related_tip: "关联项目后可以添加关联项目下的测试用例到评审列表", - review_creator: "发起人", - review_follow_people: "关注人", - review_status: "状态", - end_time: "截止时间", - delete: "删除评审", - input_review_name: "请输入评审名称", - input_review_project: "请选择所属项目", - input_reviewer: "请选择评审人", - no_link_case: "没有关联用例!", - pass: "通过", - un_pass: "未通过", - prepare: '未评审', - comment: "评论", - my_review: "我的评审", - my_create: "我创建的评审", - reviewed_by_me: "待我评审", - creator: "创建人", - done: "已评用例", - result_distribution: "结果分布", - deadline_cannot_early_tips: "截止时间不能早于当前时间!", - }, - comment: { - no_comment: "暂无评论", - send_comment: "发表评论(Ctrl+Enter发送)", - send: "确定", - description_is_null: "评论内容不能为空!", - send_success: "评论成功!", - cannot_edit: "无法编辑此评论!", - cannot_delete: "无法删除此评论!", - submit_description: "请先提交评论!", - }, - review_view: { - review: "评审", - all_case: "全部用例", - start_review: "开始评审", - relevance_case: "关联用例", - last_page: "已经到底了!", - execute_result: "评审结果", - }, - module: { - id: '模块ID', - search: "搜索模块", - rename: "重命名", - add_submodule: "添加子模块", - add_module: "添加模块", - name: "模块名称", - delete_confirm: "确认删除模块: ", - delete_batch_confirm: "确认批量删除勾选的场景步骤?", - delete_all_resource: "以及模块下所有子模块和测试用例", - module: "模块", - title: "标题", - status: "状态", - describe: "描述", - current_owner: "处理人", - creation_time: "创建时间", - project_name: "所属项目" - }, - home: { - recent_test: "最近测试", - my_plan: "我的计划", - test_rate: "测试进度", - tested_case: "已测用例", - review_progress: "评审进度", - case_count: "用例数量统计", - relevance_case: "关联用例数量统计", - case_maintenance: "用例责任人分布", - bug_count: "遗留缺陷统计", - case_review: "用例评审", - review_rate: "评审率", - coverage: "覆盖率", - function_case_count: "功能用例数", - relevance_case_count: "关联用例数", - serial_number: "序号", - test_plan_name: "测试计划名称", - case_size: "用例数", - bug_size: "缺陷数", - passing_rate: "通过率", - percentage: "占比" - }, - plan_view: { - plan: "计划", - relevance_test_case: "关联测试用例", - cancel_all_relevance: "取消全部关联", - executor: "执行人", - executor_match_rule: "执行者匹配规则", - execute_result: "执行结果", - pass: "通过", - not_pass: "不通过", - failure: "失败", - blocking: "阻塞", - stop: "停止", - skip: "跳过", - actual_result: "实际结果", - step_result: "步骤执行结果", - my_case: "我的用例", - all_case: "全部用例", - pre_case: "上一条用例", - next_case: "下一条用例", - change_execution_results: "更改执行结果", - change_executor: "更改执行人", - select_executor: "请选择执行人", - select_execute_result: "选择执行结果", - cancel_relevance: "取消用例关联", - confirm_cancel_relevance: "确认取消关联", - select_manipulate: "请选择需要操作的数据", - select_template: "选择模版", - step: "步骤", - submit_issues: "提缺陷", - operate_step: "操作步骤", - edit_component: "编辑组件", - component: "组件", - base_info: "基础信息", - mock_info: "Mock服务", - test_result: "测试结果", - result_distribution: "测试结果分布", - custom_component: "自定义模块", - defect_list: "缺陷列表", - create_report: "创建测试报告", - view_report: "查看测试报告", - component_library: "组件库", - component_library_tip: "拖拽组件库中组件,添加至右侧,预览报告效果,每个系统组件只能添加一个。", - delete_component_tip: "请至少保留一个组件", - input_template_name: "输入模版名称", - template_special_characters: '模版名称不支持特殊字符', - case_count: "用例数", - issues_count: "缺陷数", - result_statistics: "测试结果统计", - result_statistics_chart: "测试结果统计图", - create_template: "新建模版", - report_template: "测试报告模版", - test_detail: "测试详情", - failure_case: "失败用例", - export_report: "导出报告", - share_report: "分享报告", - no_case_relevance: "没有关联用例", - automatically_update_status: "自动更新状态", - automatically_update_status_tip: "当功能用例关联的接口或性能用例在测试计划执行后,自动更新功能用例的状态", - allow_associated_repetitive_cases: "允许关联重复用例", - allow_associated_repetitive_cases_tip: "是否允许同一个测试计划中多次关联相同用例", - performance_case_count: "性能测试用例数", - running: "运行中", - please_choose_test_case: "请选择测试用例!", - execute_tip: "步骤执行结果中含有 失败 结果,无法标记该用例为 通过 状态!" - }, - issue: { - issue: "缺陷", - issue_management: "缺陷管理", - platform_status: "平台状态", - issue_resource: "缺陷来源", - create_issue: "创建缺陷", - add_issue: "添加缺陷", - issue_list: "缺陷列表", - search_name: "根据标题搜索", - platform_tip: "在系统设置-工作空间-服务集成中集成缺陷管理平台可以提交缺陷到指定缺陷管理平台", - input_title: "请输入标题", - id: "缺陷ID", - title: "缺陷标题", - description: "缺陷描述", - status: "缺陷状态", - issue_project: "所属项目", - platform: "平台", - operate: "操作", - close: "关闭缺陷", - delete: "删除缺陷", - title_description_required: "标题和描述必填", - close_success: "关闭成功", - delete_warning: "解除会影响测试计划相关统计,是否确认", - preview: "预览", - status_new: '新建', - status_resolved: '已解决', - status_closed: '已关闭', - status_active: '激活', - status_delete: '删除', - status_in_progress: '接受/处理', - status_rejected: '拒绝', - status_upcoming: '待办', - status_reopened: '重新打开', - please_choose_current_owner: "请选择处理人", - tapd_current_owner: "Tapd 处理人", - zentao_bug_build: "禅道 影响版本", - zentao_bug_assigned: "禅道 处理人", - third_party_integrated: "集成第三方平台", - use_third_party: "使用 Jira 缺陷模板", - update_third_party_bugs: "更新第三方平台的缺陷", - sync_bugs: "同步缺陷", - sync_complete: "同步完成", - issue_sync_tip: "当前项目正在同步缺陷, 请稍等!", - save_before_open_comment: "请先保存缺陷再添加评论", - delete_tip: "确认删除缺陷:", - check_id_exist: "检查", - save_project_first: "请先保存项目", - tapd_status_new: "新", - tapd_status_in_progress: "接受/处理", - tapd_status_reopened: "重新打开", - tapd_status_rejected: "已拒绝", - tapd_status_verified: "已验证", - tapd_status_closed: "已关闭", - tapd_status_resolved: "已解决", - please_choose_platform_status: "请选择平台状态" - }, - report: { - name: "测试计划报告", - list: { - name: "名称", - test_plan: "测试计划名称", - creator: "创建人", - create_time: "创建时间", - trigger_mode: "触发方式", - run_time: "运行耗时(s)", - pass_rate: "成功率", - status: "状态", - operation: "操作", - }, - trigger_mode: { - manual: "手动触发", - automation: "自动触发", - }, - overview: "概览", - testing_time: "测试时间", - total_number_tests: "测试总数", - exacutive_rate: "执行率", - exacutive_rate_tip: "执行过的用例/所有用例 * 100%", - passing_rate: "通过率", - passing_rate_tip: "执行通过用例/所有用例 * 100%", - content: "目录", - report_summary: "报告总结", - analysis_functional: "功能用例统计分析", - analysis_api: "接口用例统计分析", - analysis_ui: "UI 用例统计分析", - analysis_load: "性能用例统计分析", - valid_for_24_hours: "24小时有效", - configuration: "配置", - share: "分享", - template_configuration: "模板配置", - test_result: "测试结果", - fail_case: "失败用例", - issue_list: "缺陷列表", - all_case: "所有用例", - }, - reporter: '报告人', - lastmodify: '最后更改' - }, + test_track, test_resource_pool: { id: "测试资源池ID", type: '类型', diff --git a/frontend/src/i18n/zh-TW.js b/frontend/src/i18n/zh-TW.js index ba427f81c7..bc2c1f1dd4 100644 --- a/frontend/src/i18n/zh-TW.js +++ b/frontend/src/i18n/zh-TW.js @@ -1,3 +1,5 @@ +import test_track from "./track/zh-TW"; + export default { commons: { project_permission: '請先添加該項目權限', @@ -95,6 +97,7 @@ export default { test: '測試', create_time: '創建時間', update_user_id: '更新人ID', + creator: '創建人', update_time: '更新時間', delete_time: '刪除時間', delete_user: '刪除人', @@ -2068,509 +2071,7 @@ export default { please_search: "請搜索", date: "日期" }, - test_track: { - sync_add_api_load: '同步添加關聯的接口和性能測試', - next: '下一條', - total_size: '共 {0} 條', - related_requirements: '關聯需求', - please_related_requirements: '請選擇要關聯的需求', - please_select_the_test_to_associate: "請選擇需要關聯的測試", - person_responsible: "責任人", - test_track: "測試跟蹤", - planning_execution: "規劃&執行", - confirm: "確 定", - cancel: "取 消", - project: "項目", - save: "保 存", - return: "返 回", - length_less_than: "長度必須小於", - recent_plan: "我最近的計劃", - recent_case: "我最近的用例", - recent_review: "我最近的評審", - pass_rate: "通過率", - execution_result: ": 請選擇執行結果", - actual_result: ": 實際結果為空", - cancel_relevance_success: "取消關聯成功", - switch_project: "切換項目", - functional_test_case: "功能測試用例", - api_test_case: "接口測試用例", - ui_test_case: "UI 測試用例", - performance_test_case: "性能測試用例", - scenario_test_case: "場景測試用例", - ui_scenario_test_case: "UI 測試用例", - report_statistics: "報告統計", - sort: '種類', - automatic_status_update: "自動狀態更新", - case: { - list: "列表", - minder: "腦圖", - step_info: "步驟信息", - other_info: "其他信息", - step_describe: "步驟描述", - step_describe_tip: "適用於需要每一個步驟進行測試的場景,有明確的測試步驟、預期結果", - text_describe: "文本描述", - text_describe_tip: "使用於簡單的測試場景,沒有明確的測試步驟", - change_type: "更改類型", - minder_create_tip: "失敗, 無法在腦圖創建其父模塊", - minder_tem_node_tip: "無法在臨時節點{0}下創建用例", - minder_is_module_tip: "{0}是模塊,不能修改為用例", - minder_not_module_tip: "模塊{0},不能創建在非模塊節點下", - minder_all_module_tip: "全部用例為虛擬模塊,請在其他模塊創建用例", - minder_issue_delete_tip: "取消缺陷關聯成功", - minder_save_confirm_title: '請保存腦圖', - minder_save_confirm_tip: '腦圖未保存,確認保存腦圖嗎?', - minder_import_save_confirm_tip: '導入成功後會刷新腦圖,確認保存腦圖嗎?', - check_select: "請勾選用例", - export_all_cases: '確定要導出全部用例嗎?', - input_test_case: '請輸入關聯用例名稱', - test_name: '測試名稱', - other: "--其他--", - test_case: "功能用例", - move: "移動用例", - case_list: "用例列表", - create_case: "創建用例", - edit_case: "編輯用例", - view_case: "查看用例", - no_project: "該工作空間下無項目,請先創建項目", - priority: "用例等級", - type: "類型", - method: "測試方式", - auto: "自動", - manual: "手動", - create: "新建用例", - case_type: "用例類型", - name: "用例名稱", - module: "所屬模塊", - project: '所屬項目', - maintainer: "維護人", - steps: "執行步驟", - number: "編號", - prerequisite: "前置條件", - step_desc: "用例步驟", - expected_results: "預期結果", - input_name: "請輸入名稱", - input_module: "請選擇模塊", - input_maintainer: "請選擇維護人", - input_priority: "請選擇用例等級", - input_type: "請選擇用例類型", - input_method: "請選擇測試方式", - input_prerequisite: "請輸入前置條件", - input_demand_name: "請輸入需求ID或名稱", - delete_confirm: "確認刪除測試用例", - delete: "刪除用例", - save_create_continue: "保存並繼續創建", - save_add_public: "保存並添加到公共用例庫", - please_create_project: "暫無項目,請先創建項目", - create_module_first: "請先新建模塊", - relate_test: "關聯測試", - relate_issue: "關聯缺陷", - demand_name_id: "需求ID/名稱", - please_select_relate_test: "請選擇要關聯的測試", - relate_test_not_find: '關聯的測試不存在,請檢查用例', - other_relate_test_not_find: '關聯的測試名,請前往第三方平臺執行', - batch_handle: '批量處理 (選中{0}項)', - batch_update: '更新{0}個用例的屬性', - select_catalog: '請選擇用例目錄', - updated_attr_value: '更新後屬性值為', - batch_operate: '批量操作', - please_select_attr: '請選擇屬性', - please_select_attr_value: '請選擇屬性對應的值', - batch_edit_case: '批量編輯', - batch_move_case: '批量移動', - batch_delete_case: '批量刪除', - batch_copy: '批量復製', - batch_add_public: '批量添加到公共用例庫', - batch_link_demand: '批量關聯需求', - public_warning: '未開啟公共用例庫配置', - generate_dependencies: '生成依賴關系', - generate_dependencies_warning: '為了更好的體驗,建議勾選一百條以下的數據', - batch_unlink: '批量取消關聯', - unlink: '取消關聯', - project_name: '所屬項目', - status: '評審結果', - status_prepare: '未開始', - status_running: '進行中', - status_finished: '已完成', - cancel_relevance_project: "取消項目關聯會同時取消該項目下已關聯的測試用例", - img_loading_fail: "圖片加載失敗", - pdf_loading_fail: "PDF加載失敗", - upload_tip: "文件大小限制[0-500MB]", - add_attachment: "添加", - attachment: "附件", - upload_time: "上傳時間", - total: "用例總數", - node_id: "節點ID", - node_path: "節點路徑", - match_rule: "測試用例匹配規則", - import: { - import: "導入用例", - case_import: "導入測試用例", - case_export: "導出測試用例", - download_template: "下載模版", - click_upload: "點擊上傳", - upload_limit: "只能上傳xls/xlsx文件,且不超過100M", - upload_xmind: "支持文件類型:.xmind;一次至多導入800 條用例", - upload_xmind_format: "上傳文件只能是 .xmind 格式", - upload_limit_other_size: "上傳文件大小不能超過", - upload_limit_count: "一次只能上傳一個文件", - upload_limit_format: "上傳文件只能是 xls、xlsx格式!", - upload_limit_size: "上傳文件大小不能超過 100MB!", - success: "導入成功!", - importing: "導入中...", - excel_title: "表格文件", - xmind_title: "思維導圖", - import_desc: "導入說明", - import_file: "上傳文件", - ignore_error: "忽略錯誤", - continue_upload: "繼續上傳", - import_create: "導入新建", - import_update: "導入更新", - import_tip1: "項目設置中「測試用例自定義ID」 開關開啟時ID為必填項", - import_tip2: "導入更新時ID為必填項", - import_file_tips: "請先上傳文件!", - }, - export: { - export: "導出用例", - export_tip: "請切換成用例列表勾選用例導出!" - }, - case_desc: "用例描述", - passing_rate: '用例通過率', - sync_to_new_version: "復製以下信息到新版本", - exists_multiple_prerequisite_node: "下存在多個前置條件", - exists_multiple_remark_node: "下存在多個備註" - }, - plan: { - test_plan: "測試計劃", - test_plan_id: '測試計劃Id', - create_plan: "創建測試計劃", - edit_plan: "編輯測試計劃", - plan_name: "計劃名稱", - plan_project: "所屬項目", - related_project: "關聯項目", - related_tip: "關聯項目後可以添加關聯項目下的測試用例到測試計劃列表", - plan_stage: "測試階段", - follow_people: "關註人", - plan_status: "當前狀態", - smoke_test: "冒煙測試", - functional_test: "功能測試", - regression_test: "回歸測試", - integration_testing: "集成測試", - system_test: "系統測試", - version_validation: "版本驗證", - plan_principal: "負責人", - input_plan_name: "請輸入測試計劃名稱", - input_plan_principal: "請選擇負責人", - input_plan_project: "請選擇所屬項目", - input_related_project: "請選擇關聯項目", - input_plan_stage: "請選擇測試階段", - plan_status_prepare: "未開始", - plan_status_running: "進行中", - plan_status_finished: "已結束", - plan_status_completed: "已完成", - plan_status_archived: "已歸檔", - plan_status_trash: "廢棄", - planned_start_time: "計劃開始", - planned_end_time: "計劃結束", - actual_start_time: "實際開始", - actual_end_time: "實際結束", - plan_delete_confirm: "將刪除該測試計劃下所有用例,確認刪除測試計劃: ", - plan_delete_tip: "該測試計劃正在進行中,請確認再刪除!", - plan_delete: "刪除計劃", - api_case: "接口測試用例", - scenario_case: "場景測試用例", - execute_result: "執行結果", - execute_time: '執行時間', - is_api_case_executing: "是否執行接口用例", - is_scenario_executing: '是否執行場景', - is_performance_executing: '是否執行性能', - test_plan_test_case_count: "功能用例數", - test_plan_api_case_count: "接口用例數", - test_plan_api_scenario_count: "場景用例數", - test_plan_ui_scenario_count: "UI 場景用例數", - test_plan_load_case_count: "性能用例數", - test_plan_component_case_count: "步驟用例數", - data_name: "數據名稱", - test_plan_batch_switch: "批量開/關定時任務", - batch_update_schedule_enable: '更新{0}個測試計畫的定時任務狀態為', - batch_update_schedule_enable_alert: '注意:只能更新已設定了定時任務的測試計畫', - next_run_time: '下次運行時間', - schedule_enabled: '已開啟', - check_schedule_enabled: '您勾選的數據檢測到有{0}條定時任務可以修改', - no_check_schedule_enabled: '您勾選的數據沒有檢測到定時任務', - load_case: { - case: "性能用例", - execution_status: "執行狀態", - report: "報告", - view_report: "查看報告", - unlink_in_bulk: "批量取消關聯", - batch_exec_cases: "批量執行用例", - exec: "正在執行....", - error: "用例執行錯誤,請單獨調試該用例!", - report_not_found: "報告不存在", - content_empty: "內容為空", - } - }, - demand: { - id: '需求ID', - name: '需求名稱', - batch_relate: '批量關聯需求', - relate_is_null_warn: '關聯需求不能為空!', - relate_name_is_null_warn: '需求名稱不能為空!', - third_platform_demand: "三方平台需求", - other_demand: "其他需求" - }, - step_model: '步驟模型', - review: { - test_review: "用例評審", - create_review: "創建用例評審", - edit_review: "編輯用例評審", - review_name: "評審名稱", - reviewer: "評審人", - review_project: "所屬項目", - related_project: "關聯項目", - related_tip: "關聯項目後可以添加關聯項目下的測試用例到評審列表", - review_creator: "發起人", - review_follow_people: "關註人", - review_status: "當前狀態", - end_time: "截止時間", - delete: "刪除評審", - input_review_name: "請輸入評審名稱", - input_review_project: "請選擇所屬項目", - input_reviewer: "請選擇評審人", - no_link_case: "沒有關聯用例!", - pass: "通過", - un_pass: "未通過", - prepare: '未評審', - comment: "評論", - my_review: "我的評審", - my_create: "我創建的評審", - reviewed_by_me: "待我評審", - creator: "創建人", - done: "已評用例", - result_distribution: "結果分布", - deadline_cannot_early_tips: "截止時間不能早於當前時間!", - }, - comment: { - no_comment: "暫無評論", - send_comment: "發表評論(Ctrl+Enter發送)", - send: "確定", - description_is_null: "評論內容不能為空!", - send_success: "評論成功!", - cannot_edit: "無法編輯此評論!", - cannot_delete: "無法刪除此評論!", - submit_description: "請先提交評論!", - }, - review_view: { - review: "評審", - all_case: "全部用例", - start_review: "開始評審", - relevance_case: "關聯用例", - last_page: "已經到底了!", - execute_result: "評審結果", - }, - module: { - id: '模塊ID', - search: "搜索模塊", - rename: "重命名", - add_submodule: "添加子模塊", - add_module: "添加模塊", - name: "模塊名稱", - delete_confirm: "確認刪除模塊: ", - delete_all_resource: "以及模塊下所有子模塊和測試用例", - delete_batch_confirm: "確認批量刪除勾選的場景步驟?", - module: "模塊", - title: "標題", - status: "狀態", - describe: "描述", - current_owner: "處理人", - creation_time: "創建時間", - project_name: "所屬項目" - }, - home: { - recent_test: "最近測試", - my_plan: "我的計劃", - test_rate: "測試進度", - tested_case: "已測用例", - review_progress: "評審進度", - case_count: "用例數量統計", - relevance_case: "關聯用例數量統計", - case_maintenance: "用例責任人分布", - bug_count: "遺留缺陷統計", - case_review: "用例評審", - review_rate: "評審率", - coverage: "覆蓋率", - function_case_count: "功能用例數", - relevance_case_count: "關聯用例數", - serial_number: "序號", - test_plan_name: "測試計劃名稱", - case_size: "用例數", - bug_size: "缺陷數", - passing_rate: "通過率", - percentage: "占比" - }, - plan_view: { - plan: "計劃", - relevance_test_case: "關聯測試用例", - cancel_all_relevance: "取消全部關聯", - executor: "執行人", - executor_match_rule: "執行者匹配規則", - execute_result: "執行結果", - pass: "通過", - not_pass: "不通過", - failure: "失敗", - blocking: "阻塞", - stop: "停止", - skip: "跳過", - actual_result: "實際結果", - step_result: "步驟執行結果", - my_case: "我的用例", - all_case: "全部用例", - pre_case: "上一條用例", - next_case: "下一條用例", - change_execution_results: "更改執行結果", - change_executor: "更改執行人", - select_executor: "請選擇執行人", - select_execute_result: "選擇執行結果", - cancel_relevance: "取消用例關聯", - confirm_cancel_relevance: "確認取消關聯", - select_manipulate: "請選擇需要操作的數據", - select_template: "選擇模版", - step: "步驟", - submit_issues: "提缺陷", - operate_step: "操作步驟", - edit_component: "編輯組件", - component: "組件", - base_info: "基礎信息", - mock_info: "Mock服務", - test_result: "測試結果", - result_distribution: "測試結果分布", - custom_component: "自定義模塊", - defect_list: "缺陷列表", - create_report: "創建測試報告", - view_report: "查看測試報告", - component_library: "組件庫", - component_library_tip: "拖拽組件庫中組件,添加至右側,預覽報告效果,每個系統組件只能添加一個。", - delete_component_tip: "請至少保留一個組件", - input_template_name: "輸入模版名稱", - template_special_characters: '模版名稱不支持特殊字符', - case_count: "用例數", - issues_count: "缺陷數", - result_statistics: "測試結果統計", - result_statistics_chart: "測試結果統計圖", - create_template: "新建模版", - report_template: "測試報告模版", - test_detail: "測試詳情", - failure_case: "失敗用例", - export_report: "導出報告", - share_report: "分享報告", - no_case_relevance: "沒有關聯用例", - automatically_update_status: "自動更新狀態", - automatically_update_status_tip: "當功能用例關聯的接口或性能用例在測試計劃執行後,自動更新功能用例的狀態", - allow_associated_repetitive_cases: "允許關聯重復用例", - allow_associated_repetitive_cases_tip: "是否允許同一個測試計劃中多次關聯相同用例", - performance_case_count: "性能測試用例數", - running: "運行中", - please_choose_test_case: "请选择测试用例!", - execute_tip: "步驟執行結果中含有 失敗 結果,無法標記該用例為 通過 狀態!" - }, - issue: { - issue: "缺陷", - issue_management: "缺陷管理", - platform_status: "平臺狀態", - issue_resource: "缺陷來源", - create_issue: "創建缺陷", - add_issue: "添加缺陷", - issue_list: "缺陷列表", - search_name: "根據標題搜索", - platform_tip: "在系統設置-工作空間-服務集成中集成缺陷管理平臺可以提交缺陷到指定缺陷管理平臺", - input_title: "請輸入標題", - id: "缺陷ID", - title: "缺陷標題", - description: "缺陷描述", - status: "缺陷狀態", - issue_project: "所屬項目", - platform: "平臺", - operate: "操作", - close: "關閉缺陷", - delete: "刪除缺陷", - title_description_required: "標題和描述必填", - close_success: "關閉成功", - delete_warning: "解除會影響測試計畫相關統計,是否確認", - preview: "預覽", - status_new: '新建', - status_resolved: '已解決', - status_closed: '已關閉', - status_active: '激活', - status_delete: '刪除', - status_in_progress: '接受/處理', - status_rejected: '拒絕', - status_upcoming: '待辦', - status_reopened: '重新打開', - please_choose_current_owner: "請選擇處理人", - tapd_current_owner: "Tapd 處理人", - zentao_bug_build: "禪道 影響版本", - zentao_bug_assigned: "禪道 處理人", - third_party_integrated: "集成第三方平臺", - use_third_party: "使用 Jira 缺陷模板", - update_third_party_bugs: "更新第三方平臺的缺陷", - sync_bugs: "同步缺陷", - sync_complete: "同步完成", - issue_sync_tip: "當前項目正在同步缺陷, 請稍等!", - save_before_open_comment: "請先保存缺陷再添加評論", - delete_tip: "確認刪除缺陷:", - check_id_exist: "檢查", - save_project_first: "請先保存項目", - tapd_status_new: "新", - tapd_status_in_progress: "接受/處理", - tapd_status_reopened: "重新打開", - tapd_status_rejected: "已拒絕", - tapd_status_verified: "已驗證", - tapd_status_closed: "已關閉", - tapd_status_resolved: "已解決", - please_choose_platform_status: "請選擇平臺狀態", - }, - report: { - name: "測試計劃報告", - list: { - name: "名稱", - test_plan: "測試計劃名稱", - creator: "創建人", - create_time: "創建時間", - trigger_mode: "觸發方式", - run_time: "運行耗時(s)", - pass_rate: "成功率", - status: "狀態", - operation: "操作", - }, - trigger_mode: { - manual: "手動觸發", - automation: "自動觸發", - }, - overview: "概覽", - testing_time: "測試時間", - total_number_tests: "測試總數", - exacutive_rate: "執行率", - exacutive_rate_tip: "執行過的用例/所有用例 * 100%", - passing_rate: "通過率", - passing_rate_tip: "執行通過用例/所有用例 * 100%", - content: "目錄", - report_summary: "報告總結", - analysis_functional: "功能用例統計分析", - analysis_api: "接口用例統計分析", - analysis_ui: "UI 用例統計分析", - analysis_load: "性能用例統計分析", - valid_for_24_hours: "24小時有效", - configuration: "配置", - share: "分享", - template_configuration: "模板配置", - test_result: "測試結果", - fail_case: "失敗用例", - issue_list: "缺陷列表", - all_case: "所有用例", - }, - reporter: '報告人', - lastmodify: '最後更改', - }, + test_track, test_resource_pool: { id: "測試資源池ID", type: '類型',