浏览代码

完善指标管理的多语言处理

yanglzh 1 月之前
父节点
当前提交
cbad8099b4

+ 0 - 1
src/api/datahub/index.ts

@@ -121,7 +121,6 @@ export default {
   },
   indicator: {
     getList: (params: object) => get('/indicator/list', params),
-    data: (params: object) => get('/indicator/data', params),
     getData: (params: object) => get('/indicator/getData', params),
     detail: (code: string) => get('/indicator/detail', { code }),
     add: (data: object) => post('/indicator/add', data),

+ 99 - 0
src/i18n/pages/dateCenter/en.ts

@@ -416,5 +416,104 @@ export default {
       },
       exportFileNameSuffix: 'Indicator Data Export.xlsx',
     },
+    list: {
+      confirmDelete: 'This will permanently delete indicator: {name} ({code}). Continue?',
+      tip: 'Tip',
+      exportFileName: 'Indicator List Export.xlsx',
+    },
+    edit: {
+      dialogTitleAdd: 'Create Indicator',
+      dialogTitleEdit: 'Edit Indicator',
+      tabs: {
+        base: 'Basic Info',
+        formula: 'Formula',
+        dimension: 'Dimensions',
+      },
+      labels: {
+        code: 'Indicator Code',
+        name: 'Indicator Name',
+        type: 'Indicator Type',
+        unit: 'Unit',
+        dataTemplateKey: 'Modeling KEY',
+        computeStrategy: 'Compute Strategy',
+        calculationMode: 'Calculation Mode',
+        calculationSchedule: 'Schedule',
+        description: 'Indicator Description',
+        formula: 'Formula',
+        formulaParams: 'Formula Params',
+        dimensions: 'Dimensions',
+        dimensionName: 'Dimension Name',
+        dimensionCode: 'Dimension Code',
+        dimensionValueType: 'Value Type',
+        dimensionDescription: 'Dimension Description',
+      },
+      placeholders: {
+        inputCode: 'Enter unique code, e.g. IND001',
+        inputName: 'Enter indicator name',
+        selectType: 'Select indicator type',
+        inputUnit: 'Enter unit (e.g. mg/L, %)',
+        inputDataTemplateKey: 'Enter data modeling KEY',
+        selectComputeStrategy: 'Select compute strategy',
+        inputSchedule: 'Enter cron or expression',
+        inputDescription: 'Enter indicator description',
+        inputFormula: 'Enter formula, e.g. COD = (V1 - V2) × C × 8 × 1000 / V',
+        inputParamName: 'Enter parameter name',
+        inputParamCode: 'Enter parameter code',
+        inputParamValue: 'Enter parameter value',
+        inputParamDesc: 'Enter parameter description',
+        inputDimName: 'Enter dimension name',
+        inputDimCode: 'Enter dimension code, e.g. time, location',
+        selectDimValueType: 'Select value type',
+        inputDimDesc: 'Enter dimension description',
+      },
+      calculationModes: {
+        demand: 'On-demand',
+        schedule: 'Scheduled',
+      },
+      computeStrategies: {
+        aggregation: 'Aggregation',
+        accumulation: 'Accumulation',
+        mathematical: 'Mathematical',
+      },
+      valueTypes: {
+        int: 'Integer',
+        long: 'Long',
+        double: 'Double',
+        text: 'String',
+        date: 'Date',
+        string: 'String',
+        number: 'Number',
+        boolean: 'Boolean',
+        datetime: 'Datetime',
+      },
+      table: {
+        index: 'No.',
+        paramName: 'Param Name',
+        paramCode: 'Param Code',
+        paramValue: 'Param Value',
+        paramDesc: 'Param Description',
+        action: 'Action',
+      },
+      emptyTips: {
+        params: 'No parameters yet, please add formula parameters',
+        dimensions: 'No dimensions yet, please add analysis dimensions',
+      },
+      buttons: {
+        addParam: 'Add Param',
+        addDimension: 'Add Dimension',
+        cancel: 'Cancel',
+        save: 'Save',
+        edit: 'Edit',
+        delete: 'Delete',
+        add: 'Add',
+      },
+      messages: {
+        saved: 'Saved successfully',
+      },
+      dialogs: {
+        addParam: 'Add Parameter',
+        addDimension: 'Add Dimension',
+      },
+    },
   },
 };

+ 99 - 0
src/i18n/pages/dateCenter/zh-cn.ts

@@ -416,5 +416,104 @@ export default {
       },
       exportFileNameSuffix: '指标数据导出.xlsx',
     },
+    list: {
+      confirmDelete: '此操作将永久删除指标:{name}({code}),是否继续?',
+      tip: '提示',
+      exportFileName: '指标管理列表导出.xlsx',
+    },
+    edit: {
+      dialogTitleAdd: '新增指标',
+      dialogTitleEdit: '编辑指标',
+      tabs: {
+        base: '基本信息',
+        formula: '计算公式',
+        dimension: '维度设置',
+      },
+      labels: {
+        code: '指标编码',
+        name: '指标名称',
+        type: '指标类型',
+        unit: '单位',
+        dataTemplateKey: '数据建模KEY',
+        computeStrategy: '计算策略',
+        calculationMode: '计算模式',
+        calculationSchedule: '计算周期',
+        description: '指标描述',
+        formula: '计算公式',
+        formulaParams: '公式参数',
+        dimensions: '维度列表',
+        dimensionName: '维度名称',
+        dimensionCode: '维度标识',
+        dimensionValueType: '维度值类型',
+        dimensionDescription: '维度描述',
+      },
+      placeholders: {
+        inputCode: '请输入唯一编码,如 IND001',
+        inputName: '请输入指标名称',
+        selectType: '请选择指标类型',
+        inputUnit: '请输入计量单位(如 mg/L、%)',
+        inputDataTemplateKey: '请输入数据建模KEY',
+        selectComputeStrategy: '请选择计算策略',
+        inputSchedule: '请输入cron或表达式',
+        inputDescription: '请输入指标描述',
+        inputFormula: '请输入计算公式,例如:COD = (V1 - V2) × C × 8 × 1000 / V',
+        inputParamName: '请输入参数名称',
+        inputParamCode: '请输入参数编码',
+        inputParamValue: '请输入参数值',
+        inputParamDesc: '请输入参数描述',
+        inputDimName: '请输入维度名称',
+        inputDimCode: '请输入维度标识,如 time, location',
+        selectDimValueType: '请选择值类型',
+        inputDimDesc: '请输入维度描述',
+      },
+      calculationModes: {
+        demand: '按需计算',
+        schedule: '定时计算',
+      },
+      computeStrategies: {
+        aggregation: '聚合计算',
+        accumulation: '累计计算',
+        mathematical: '数学计算',
+      },
+      valueTypes: {
+        int: '整数',
+        long: '长整数',
+        double: '双精度浮点数',
+        text: '字符串',
+        date: '日期',
+        string: '字符串',
+        number: '数值',
+        boolean: '布尔',
+        datetime: '时间',
+      },
+      table: {
+        index: '序号',
+        paramName: '参数名称',
+        paramCode: '参数编码',
+        paramValue: '参数值',
+        paramDesc: '参数描述',
+        action: '操作',
+      },
+      emptyTips: {
+        params: '暂无参数,请添加公式参数',
+        dimensions: '暂无维度,请添加分析维度',
+      },
+      buttons: {
+        addParam: '添加参数',
+        addDimension: '添加维度',
+        cancel: '取消',
+        save: '保存',
+        edit: '编辑',
+        delete: '删除',
+        add: '添加',
+      },
+      messages: {
+        saved: '保存成功',
+      },
+      dialogs: {
+        addParam: '添加参数',
+        addDimension: '添加维度',
+      },
+    },
   },
 };

+ 99 - 0
src/i18n/pages/dateCenter/zh-tw.ts

@@ -416,5 +416,104 @@ export default {
       },
       exportFileNameSuffix: '指標資料匯出.xlsx',
     },
+    list: {
+      confirmDelete: '此操作將永久刪除指標:{name}({code}),是否繼續?',
+      tip: '提示',
+      exportFileName: '指標管理清單匯出.xlsx',
+    },
+    edit: {
+      dialogTitleAdd: '新增指標',
+      dialogTitleEdit: '編輯指標',
+      tabs: {
+        base: '基本資訊',
+        formula: '計算公式',
+        dimension: '維度設定',
+      },
+      labels: {
+        code: '指標編碼',
+        name: '指標名稱',
+        type: '指標類型',
+        unit: '單位',
+        dataTemplateKey: '資料建模 KEY',
+        computeStrategy: '計算策略',
+        calculationMode: '計算模式',
+        calculationSchedule: '計算週期',
+        description: '指標描述',
+        formula: '計算公式',
+        formulaParams: '公式參數',
+        dimensions: '維度列表',
+        dimensionName: '維度名稱',
+        dimensionCode: '維度標識',
+        dimensionValueType: '維度值型別',
+        dimensionDescription: '維度描述',
+      },
+      placeholders: {
+        inputCode: '請輸入唯一編碼,如 IND001',
+        inputName: '請輸入指標名稱',
+        selectType: '請選擇指標類型',
+        inputUnit: '請輸入計量單位(如 mg/L、%)',
+        inputDataTemplateKey: '請輸入資料建模 KEY',
+        selectComputeStrategy: '請選擇計算策略',
+        inputSchedule: '請輸入 cron 或表示式',
+        inputDescription: '請輸入指標描述',
+        inputFormula: '請輸入計算公式,例如:COD = (V1 - V2) × C × 8 × 1000 / V',
+        inputParamName: '請輸入參數名稱',
+        inputParamCode: '請輸入參數編碼',
+        inputParamValue: '請輸入參數值',
+        inputParamDesc: '請輸入參數描述',
+        inputDimName: '請輸入維度名稱',
+        inputDimCode: '請輸入維度標識,如 time, location',
+        selectDimValueType: '請選擇值型別',
+        inputDimDesc: '請輸入維度描述',
+      },
+      calculationModes: {
+        demand: '按需計算',
+        schedule: '定時計算',
+      },
+      computeStrategies: {
+        aggregation: '聚合計算',
+        accumulation: '累計計算',
+        mathematical: '數學計算',
+      },
+      valueTypes: {
+        int: '整數',
+        long: '長整數',
+        double: '雙精度浮點數',
+        text: '字串',
+        date: '日期',
+        string: '字串',
+        number: '數值',
+        boolean: '布林',
+        datetime: '時間',
+      },
+      table: {
+        index: '序號',
+        paramName: '參數名稱',
+        paramCode: '參數編碼',
+        paramValue: '參數值',
+        paramDesc: '參數描述',
+        action: '操作',
+      },
+      emptyTips: {
+        params: '暫無參數,請添加公式參數',
+        dimensions: '暫無維度,請添加分析維度',
+      },
+      buttons: {
+        addParam: '添加參數',
+        addDimension: '添加維度',
+        cancel: '取消',
+        save: '儲存',
+        edit: '編輯',
+        delete: '刪除',
+        add: '添加',
+      },
+      messages: {
+        saved: '儲存成功',
+      },
+      dialogs: {
+        addParam: '添加參數',
+        addDimension: '添加維度',
+      },
+    },
   },
 };

+ 94 - 91
src/views/system/datahub/indicator/component/edit.vue

@@ -1,167 +1,167 @@
 <template>
   <div class="indicator-edit">
-    <el-dialog v-model="visible" :title="isEdit ? '编辑指标' : '新增指标'" width="800px" :close-on-click-modal="false" destroy-on-close>
+    <el-dialog v-model="visible" :title="isEdit ? t('message.dateCenter.indicator.edit.dialogTitleEdit') : t('message.dateCenter.indicator.edit.dialogTitleAdd')" width="800px" :close-on-click-modal="false" destroy-on-close>
       <div v-if="visible">
         <el-tabs v-model="activeTab">
-          <el-tab-pane label="基本信息" name="base">
-            <el-form ref="formRef" :model="form" :rules="rules" label-width="110px" class="pt10">
+          <el-tab-pane :label="t('message.dateCenter.indicator.edit.tabs.base')" name="base">
+            <el-form ref="formRef" :model="form" :rules="rules" label-width="150px" class="pt10">
               <div class="row">
-                <el-form-item label="指标编码" prop="code" class="flex1">
-                  <el-input v-model.trim="form.code" :disabled="isEdit" placeholder="请输入唯一编码,如 IND001" clearable />
+                <el-form-item :label="t('message.dateCenter.indicator.edit.labels.code')" prop="code" class="flex1">
+                  <el-input v-model.trim="form.code" :disabled="isEdit" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputCode')" clearable />
                 </el-form-item>
-                <el-form-item label="指标名称" prop="name" class="flex1">
-                  <el-input v-model.trim="form.name" placeholder="请输入指标名称" clearable />
+                <el-form-item :label="t('message.dateCenter.indicator.edit.labels.name')" prop="name" class="flex1">
+                  <el-input v-model.trim="form.name" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputName')" clearable />
                 </el-form-item>
               </div>
               <div class="row">
-                <el-form-item label="指标类型" prop="type" class="flex1">
-                  <el-cascader :options="typeOptions" :props="{ checkStrictly: true, emitPath: false, value: 'code', label: 'name' }" placeholder="请选择指标类型" clearable class="w100" v-model="form.type">
+                <el-form-item :label="t('message.dateCenter.indicator.edit.labels.type')" prop="type" class="flex1">
+                  <el-cascader :options="typeOptions" :props="{ checkStrictly: true, emitPath: false, value: 'code', label: 'name' }" :placeholder="t('message.dateCenter.indicator.edit.placeholders.selectType')" clearable class="w100" v-model="form.type">
                     <template #default="{ node, data }">
                       <span>{{ data.name }}</span>
                       <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
                     </template>
                   </el-cascader>
                 </el-form-item>
-                <el-form-item label="单位" prop="unit" class="flex1">
-                  <el-input v-model.trim="form.unit" placeholder="请输入计量单位(如 mg/L、%)" clearable />
+                <el-form-item :label="t('message.dateCenter.indicator.edit.labels.unit')" prop="unit" class="flex1">
+                  <el-input v-model.trim="form.unit" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputUnit')" clearable />
                 </el-form-item>
               </div>
               <div class="row">
-                <el-form-item label="数据建模KEY" prop="dataTemplateKey" class="flex1">
-                  <el-input v-model.trim="form.dataTemplateKey" placeholder="请输入数据建模KEY" clearable />
+                <el-form-item :label="t('message.dateCenter.indicator.edit.labels.dataTemplateKey')" prop="dataTemplateKey" class="flex1">
+                  <el-input v-model.trim="form.dataTemplateKey" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputDataTemplateKey')" clearable />
                 </el-form-item>
-                <el-form-item label="计算策略" prop="computeStrategy" class="flex1">
-                  <el-select v-model="form.computeStrategy" placeholder="请选择计算策略" clearable style="width: 100%">
-                    <el-option label="聚合计算" value="aggregation" />
-                    <el-option label="累计计算" value="accumulation" />
-                    <el-option label="数学计算" value="mathematical" />
+                <el-form-item :label="t('message.dateCenter.indicator.edit.labels.computeStrategy')" prop="computeStrategy" class="flex1">
+                  <el-select v-model="form.computeStrategy" :placeholder="t('message.dateCenter.indicator.edit.placeholders.selectComputeStrategy')" clearable style="width: 100%">
+                    <el-option :label="t('message.dateCenter.indicator.edit.computeStrategies.aggregation')" value="aggregation" />
+                    <el-option :label="t('message.dateCenter.indicator.edit.computeStrategies.accumulation')" value="accumulation" />
+                    <el-option :label="t('message.dateCenter.indicator.edit.computeStrategies.mathematical')" value="mathematical" />
                   </el-select>
                 </el-form-item>
               </div>
               <div class="row">
-                <el-form-item label="计算模式" prop="calculationMode" class="flex1">
+                <el-form-item :label="t('message.dateCenter.indicator.edit.labels.calculationMode')" prop="calculationMode" class="flex1">
                   <el-radio-group v-model="form.calculationMode">
-                    <el-radio label="demand">按需计算</el-radio>
-                    <el-radio label="schedule">定时计算</el-radio>
+                    <el-radio label="demand">{{ t('message.dateCenter.indicator.edit.calculationModes.demand') }}</el-radio>
+                    <el-radio label="schedule">{{ t('message.dateCenter.indicator.edit.calculationModes.schedule') }}</el-radio>
                   </el-radio-group>
                 </el-form-item>
-                <el-form-item v-if="form.calculationMode === 'schedule'" label="计算周期" prop="calculationSchedule" class="flex1">
-                  <el-input v-model.trim="form.calculationSchedule" placeholder="请输入cron或表达式" clearable />
+                <el-form-item v-if="form.calculationMode === 'schedule'" :label="t('message.dateCenter.indicator.edit.labels.calculationSchedule')" prop="calculationSchedule" class="flex1">
+                  <el-input v-model.trim="form.calculationSchedule" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputSchedule')" clearable />
                 </el-form-item>
               </div>
-              <el-form-item label="指标描述" prop="description">
-                <el-input v-model.trim="form.description" type="textarea" :rows="3" placeholder="请输入指标描述" />
+              <el-form-item :label="t('message.dateCenter.indicator.edit.labels.description')" prop="description">
+                <el-input v-model.trim="form.description" type="textarea" :rows="3" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputDescription')" />
               </el-form-item>
             </el-form>
           </el-tab-pane>
 
-          <el-tab-pane label="计算公式" name="formula">
-            <div class="section-title">计算公式</div>
-            <el-input v-model="form.formula" type="textarea" :rows="4" placeholder="请输入计算公式,例如:COD = (V1 - V2) × C × 8 × 1000 / V" />
-            <div class="mt10 text-gray">支持数学运算符(+、-、×、÷)、括号、函数等,系统会自动识别公式中的参数</div>
+          <el-tab-pane :label="t('message.dateCenter.indicator.edit.tabs.formula')" name="formula">
+            <div class="section-title">{{ t('message.dateCenter.indicator.edit.labels.formula') }}</div>
+            <el-input v-model="form.formula" type="textarea" :rows="4" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputFormula')" />
+            <div class="mt10 text-gray">{{ t('message.dateCenter.indicator.edit.placeholders.inputFormula') }}</div>
 
             <div class="section-title mt20 flex-between">
-              <span>公式参数</span>
-              <el-button type="success" @click="openParamDialog()">+ 添加参数</el-button>
+              <span>{{ t('message.dateCenter.indicator.edit.labels.formulaParams') }}</span>
+              <el-button type="success" @click="openParamDialog()">+ {{ t('message.dateCenter.indicator.edit.buttons.addParam') }}</el-button>
             </div>
 
             <el-table :data="form.formulaParams" border style="width: 100%">
-              <el-table-column type="index" label="序号" width="60" align="center" />
-              <el-table-column label="参数名称" prop="name" align="center" />
-              <el-table-column label="参数编码" prop="code" align="center" />
-              <el-table-column label="参数值" prop="values" align="center" />
-              <el-table-column label="参数描述" prop="description" align="center" />
-              <el-table-column label="操作" width="120" align="center">
+              <el-table-column type="index" :label="t('message.dateCenter.indicator.edit.table.index')" width="60" align="center" />
+              <el-table-column :label="t('message.dateCenter.indicator.edit.table.paramName')" prop="name" align="center" />
+              <el-table-column :label="t('message.dateCenter.indicator.edit.table.paramCode')" prop="code" align="center" />
+              <el-table-column :label="t('message.dateCenter.indicator.edit.table.paramValue')" prop="values" align="center" />
+              <el-table-column :label="t('message.dateCenter.indicator.edit.table.paramDesc')" prop="description" align="center" />
+              <el-table-column :label="t('message.dateCenter.indicator.columns.action')" width="120" align="center">
                 <template #default="scope">
-                  <el-button size="small" text type="primary" @click="openParamDialog(scope.row, scope.$index)">编辑</el-button>
-                  <el-button size="small" text type="danger" @click="removeParam(scope.$index)">删除</el-button>
+                  <el-button size="small" text type="primary" @click="openParamDialog(scope.row, scope.$index)">{{ t('message.dateCenter.indicator.actions.edit') }}</el-button>
+                  <el-button size="small" text type="danger" @click="removeParam(scope.$index)">{{ t('message.dateCenter.indicator.actions.delete') }}</el-button>
                 </template>
               </el-table-column>
             </el-table>
-            <div v-if="!form.formulaParams.length" class="empty-tip">暂无参数,请添加公式参数</div>
+            <div v-if="!form.formulaParams.length" class="empty-tip">{{ t('message.dateCenter.indicator.edit.emptyTips.params') }}</div>
           </el-tab-pane>
 
-          <el-tab-pane label="维度设置" name="dimension">
+          <el-tab-pane :label="t('message.dateCenter.indicator.edit.tabs.dimension')" name="dimension">
             <div class="section-title flex-between">
-              <span>维度列表</span>
-              <el-button type="success" @click="openDimDialog()">+ 添加维度</el-button>
+              <span>{{ t('message.dateCenter.indicator.edit.labels.dimensions') }}</span>
+              <el-button type="success" @click="openDimDialog()">+ {{ t('message.dateCenter.indicator.edit.buttons.addDimension') }}</el-button>
             </div>
 
             <el-table :data="form.dimensions" border style="width: 100%">
-              <el-table-column type="index" label="序号" width="60" align="center" />
-              <el-table-column label="维度名称" prop="name" align="center" />
-              <el-table-column label="维度标识" prop="code" align="center" />
-              <el-table-column label="维度值类型" prop="valueType" align="center">
+              <el-table-column type="index" :label="t('message.dateCenter.indicator.edit.table.index')" width="60" align="center" />
+              <el-table-column :label="t('message.dateCenter.indicator.edit.labels.dimensionName')" prop="name" align="center" />
+              <el-table-column :label="t('message.dateCenter.indicator.edit.labels.dimensionCode')" prop="code" align="center" />
+              <el-table-column :label="t('message.dateCenter.indicator.edit.labels.dimensionValueType')" prop="valueType" align="center">
                 <template #default="scope">{{ formatValueType(scope.row.valueType) }}</template>
               </el-table-column>
-              <el-table-column label="维度描述" prop="description" align="center" />
-              <el-table-column label="操作" width="120" align="center">
+              <el-table-column :label="t('message.dateCenter.indicator.edit.labels.dimensionDescription')" prop="description" align="center" />
+              <el-table-column :label="t('message.dateCenter.indicator.columns.action')" width="120" align="center">
                 <template #default="scope">
-                  <el-button size="small" text type="primary" @click="openDimDialog(scope.row, scope.$index)">编辑</el-button>
-                  <el-button size="small" text type="danger" @click="removeDim(scope.$index)">删除</el-button>
+                  <el-button size="small" text type="primary" @click="openDimDialog(scope.row, scope.$index)">{{ t('message.dateCenter.indicator.actions.edit') }}</el-button>
+                  <el-button size="small" text type="danger" @click="removeDim(scope.$index)">{{ t('message.dateCenter.indicator.actions.delete') }}</el-button>
                 </template>
               </el-table-column>
             </el-table>
-            <div v-if="!form.dimensions.length" class="empty-tip">暂无维度,请添加分析维度</div>
+            <div v-if="!form.dimensions.length" class="empty-tip">{{ t('message.dateCenter.indicator.edit.emptyTips.dimensions') }}</div>
           </el-tab-pane>
         </el-tabs>
       </div>
 
       <template #footer>
         <span class="dialog-footer">
-          <el-button @click="onCancel">取消</el-button>
-          <el-button type="primary" @click="onSave">保存</el-button>
+          <el-button @click="onCancel">{{ t('message.dateCenter.indicator.edit.buttons.cancel') }}</el-button>
+          <el-button type="primary" @click="onSave">{{ t('message.dateCenter.indicator.edit.buttons.save') }}</el-button>
         </span>
       </template>
     </el-dialog>
 
     <!-- 添加/编辑 参数 -->
-    <el-dialog v-model="paramDialog.visible" title="添加参数" width="520px" :close-on-click-modal="false">
-      <el-form :model="paramDialog.form" ref="paramFormRef" :rules="paramRules" label-width="90px">
-        <el-form-item label="参数名称" prop="name">
-          <el-input v-model.trim="paramDialog.form.name" placeholder="请输入参数名称" />
+    <el-dialog v-model="paramDialog.visible" :title="t('message.dateCenter.indicator.edit.dialogs.addParam')" width="520px" :close-on-click-modal="false">
+      <el-form :model="paramDialog.form" ref="paramFormRef" :rules="paramRules" label-width="130px">
+        <el-form-item :label="t('message.dateCenter.indicator.edit.table.paramName')" prop="name">
+          <el-input v-model.trim="paramDialog.form.name" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputParamName')" />
         </el-form-item>
-        <el-form-item label="参数编码" prop="code">
-          <el-input v-model.trim="paramDialog.form.code" placeholder="请输入参数编码" />
+        <el-form-item :label="t('message.dateCenter.indicator.edit.table.paramCode')" prop="code">
+          <el-input v-model.trim="paramDialog.form.code" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputParamCode')" />
         </el-form-item>
-        <el-form-item label="参数值" prop="values">
-          <el-input v-model.trim="paramDialog.form.values" placeholder="请输入参数值" />
+        <el-form-item :label="t('message.dateCenter.indicator.edit.table.paramValue')" prop="values">
+          <el-input v-model.trim="paramDialog.form.values" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputParamValue')" />
         </el-form-item>
-        <el-form-item label="参数描述" prop="description">
-          <el-input v-model.trim="paramDialog.form.description" type="textarea" placeholder="请输入参数描述" />
+        <el-form-item :label="t('message.dateCenter.indicator.edit.table.paramDesc')" prop="description">
+          <el-input v-model.trim="paramDialog.form.description" type="textarea" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputParamDesc')" />
         </el-form-item>
       </el-form>
       <template #footer>
-        <el-button @click="paramDialog.visible = false">取消</el-button>
-        <el-button type="primary" @click="confirmParam">添加</el-button>
+        <el-button @click="paramDialog.visible = false">{{ t('message.dateCenter.indicator.edit.buttons.cancel') }}</el-button>
+        <el-button type="primary" @click="confirmParam">{{ t('message.dateCenter.indicator.edit.buttons.add') }}</el-button>
       </template>
     </el-dialog>
 
     <!-- 添加/编辑 维度 -->
-    <el-dialog v-model="dimDialog.visible" title="添加维度" width="520px" :close-on-click-modal="false">
-      <el-form :model="dimDialog.form" ref="dimFormRef" :rules="dimRules" label-width="100px">
-        <el-form-item label="维度名称" prop="name">
-          <el-input v-model.trim="dimDialog.form.name" placeholder="请输入维度名称" />
+    <el-dialog v-model="dimDialog.visible" :title="t('message.dateCenter.indicator.edit.dialogs.addDimension')" width="520px" :close-on-click-modal="false">
+      <el-form :model="dimDialog.form" ref="dimFormRef" :rules="dimRules" label-width="160px">
+        <el-form-item :label="t('message.dateCenter.indicator.edit.labels.dimensionName')" prop="name">
+          <el-input v-model.trim="dimDialog.form.name" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputDimName')" />
         </el-form-item>
-        <el-form-item label="维度标识" prop="code">
-          <el-input v-model.trim="dimDialog.form.code" placeholder="请输入维度标识,如 time, location" />
+        <el-form-item :label="t('message.dateCenter.indicator.edit.labels.dimensionCode')" prop="code">
+          <el-input v-model.trim="dimDialog.form.code" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputDimCode')" />
         </el-form-item>
-        <el-form-item label="维度值类型" prop="valueType">
-          <el-select v-model="dimDialog.form.valueType" placeholder="请选择值类型" style="width: 100%">
-            <el-option label="整数" value="int" />
-            <el-option label="长整数" value="long" />
-            <el-option label="双精度浮点数" value="double" />
-            <el-option label="字符串" value="text" />
-            <el-option label="日期" value="date" />
+        <el-form-item :label="t('message.dateCenter.indicator.edit.labels.dimensionValueType')" prop="valueType">
+          <el-select v-model="dimDialog.form.valueType" :placeholder="t('message.dateCenter.indicator.edit.placeholders.selectDimValueType')" style="width: 100%">
+            <el-option :label="t('message.dateCenter.indicator.edit.valueTypes.int')" value="int" />
+            <el-option :label="t('message.dateCenter.indicator.edit.valueTypes.long')" value="long" />
+            <el-option :label="t('message.dateCenter.indicator.edit.valueTypes.double')" value="double" />
+            <el-option :label="t('message.dateCenter.indicator.edit.valueTypes.text')" value="text" />
+            <el-option :label="t('message.dateCenter.indicator.edit.valueTypes.date')" value="date" />
           </el-select>
         </el-form-item>
-        <el-form-item label="维度描述" prop="description">
-          <el-input v-model.trim="dimDialog.form.description" type="textarea" placeholder="请输入维度描述" />
+        <el-form-item :label="t('message.dateCenter.indicator.edit.labels.dimensionDescription')" prop="description">
+          <el-input v-model.trim="dimDialog.form.description" type="textarea" :placeholder="t('message.dateCenter.indicator.edit.placeholders.inputDimDesc')" />
         </el-form-item>
       </el-form>
       <template #footer>
-        <el-button @click="dimDialog.visible = false">取消</el-button>
-        <el-button type="primary" @click="confirmDim">添加</el-button>
+        <el-button @click="dimDialog.visible = false">{{ t('message.dateCenter.indicator.edit.buttons.cancel') }}</el-button>
+        <el-button type="primary" @click="confirmDim">{{ t('message.dateCenter.indicator.edit.buttons.add') }}</el-button>
       </template>
     </el-dialog>
   </div>
@@ -169,10 +169,13 @@
 
 <script lang="ts" setup>
 import { reactive, ref } from "vue";
+import { useI18n } from "vue-i18n";
 import { ElMessage } from "element-plus";
 import api from "/@/api/datahub";
 import apiSystem from "/@/api/system";
 
+const { t } = useI18n();
+
 const emit = defineEmits(["update"]);
 
 const visible = ref(false);
@@ -199,12 +202,12 @@ const form = reactive({
 });
 
 const rules = {
-  code: [{ required: true, message: "请输入指标编码", trigger: "blur" }],
-  name: [{ required: true, message: "请输入指标名称", trigger: "blur" }],
-  type: [{ required: true, message: "请选择指标类型", trigger: "change" }],
-  unit: [{ required: true, message: "请输入单位", trigger: "blur" }],
-  calculationMode: [{ required: true, message: "请选择计算模式", trigger: "change" }],
-  calculationSchedule: [{ validator: (_: any, v: string, cb: any) => (form.calculationMode === "schedule" && !v ? cb(new Error("请输入计算周期")) : cb()), trigger: "blur" }],
+  code: [{ required: true, message: t('message.dateCenter.indicator.edit.placeholders.inputCode'), trigger: "blur" }],
+  name: [{ required: true, message: t('message.dateCenter.indicator.edit.placeholders.inputName'), trigger: "blur" }],
+  type: [{ required: true, message: t('message.dateCenter.indicator.edit.placeholders.selectType'), trigger: "change" }],
+  unit: [{ required: true, message: t('message.dateCenter.indicator.edit.placeholders.inputUnit'), trigger: "blur" }],
+  calculationMode: [{ required: true, message: t('message.dateCenter.indicator.edit.labels.calculationMode'), trigger: "change" }],
+  calculationSchedule: [{ validator: (_: any, v: string, cb: any) => (form.calculationMode === "schedule" && !v ? cb(new Error(t('message.dateCenter.indicator.edit.placeholders.inputSchedule'))) : cb()), trigger: "blur" }],
 };
 
 const typeOptions = ref([]);
@@ -298,7 +301,7 @@ function onSave() {
     const payload = JSON.parse(JSON.stringify(form));
     const apiFn = isEdit.value ? api.indicator.edit : api.indicator.add;
     apiFn(payload).then(() => {
-      ElMessage.success("保存成功");
+      ElMessage.success(t('message.dateCenter.indicator.edit.messages.saved'));
       visible.value = false;
       emit("update");
     });
@@ -355,7 +358,7 @@ function removeDim(i: number) {
 }
 
 function formatValueType(v: string) {
-  const map: any = { string: "字符串", number: "数值", boolean: "布尔", datetime: "时间" };
+  const map: any = { string: t('message.dateCenter.indicator.edit.valueTypes.string'), number: t('message.dateCenter.indicator.edit.valueTypes.number'), boolean: t('message.dateCenter.indicator.edit.valueTypes.boolean'), datetime: t('message.dateCenter.indicator.edit.valueTypes.datetime') };
   return map[v] || v || "-";
 }
 

+ 33 - 31
src/views/system/datahub/indicator/index.vue

@@ -3,10 +3,10 @@
     <el-card shadow="never">
       <el-form :model="params" inline ref="queryRef" @keyup.enter="getList">
         <el-form-item>
-          <el-input v-model="params.name" placeholder="输入指标名称、编码或描述" style="width: 300px" clearable />
+          <el-input v-model="params.name" :placeholder="t('message.dateCenter.indicator.placeholders.searchByNameOrCodeOrDesc')" style="width: 300px" clearable />
         </el-form-item>
         <el-form-item>
-          <el-cascader :options="typeOptions" :props="{ checkStrictly: true, emitPath: false, value: 'code', label: 'name' }" placeholder="请选择指标类型" clearable class="w100" v-model="params.type">
+          <el-cascader :options="typeOptions" :props="{ checkStrictly: true, emitPath: false, value: 'code', label: 'name' }" :placeholder="t('message.dateCenter.indicator.columns.type')" clearable class="w100" v-model="params.type">
             <template #default="{ node, data }">
               <span>{{ data.name }}</span>
               <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
@@ -14,60 +14,60 @@
           </el-cascader>
         </el-form-item>
         <el-form-item>
-          <el-select v-model="params.status" placeholder="全部状态" clearable style="width: 160px">
-            <el-option value="-1" label="全部状态" />
-            <el-option value="0" label="未发布" />
-            <el-option value="1" label="已发布" />
+          <el-select v-model="params.status" :placeholder="t('message.dateCenter.indicator.status.all')" clearable style="width: 160px">
+            <el-option value="-1" :label="t('message.dateCenter.indicator.status.all')" />
+            <el-option value="0" :label="t('message.dateCenter.indicator.status.unpublished')" />
+            <el-option value="1" :label="t('message.dateCenter.indicator.status.published')" />
           </el-select>
         </el-form-item>
         <el-form-item>
           <el-button type="primary" class="ml10" @click="getList">
             <el-icon><ele-Search /></el-icon>
-            查询
+            {{ t("message.dateCenter.indicator.actions.search") }}
           </el-button>
           <el-button type="primary" class="ml10" @click="addOrEdit()" v-auth="'add'">
             <el-icon><ele-FolderAdd /></el-icon>
-            新增指标
+            {{ t("message.dateCenter.indicator.actions.add") }}
           </el-button>
           <el-button class="ml10" @click="exportData()" :loading="exportLoading" v-auth="'download'">
             <el-icon><ele-Download /></el-icon>
-            导出
+            {{ t("message.dateCenter.indicator.actions.export") }}
           </el-button>
         </el-form-item>
       </el-form>
 
       <el-table :data="tableData" style="width: 100%" row-key="code" v-loading="loading">
-        <el-table-column label="指标编号" v-col="'id'" align="left" min-width="200">
+        <el-table-column :label="t('message.dateCenter.indicator.columns.code')" v-col="'id'" align="left" min-width="200">
           <template #default="scope">
             <el-link type="primary" :underline="false">{{ scope.row.code }}</el-link>
           </template>
         </el-table-column>
-        <el-table-column label="指标名称" v-col="'name'" prop="name" min-width="200" show-overflow-tooltip />
-        <el-table-column label="指标类型" v-col="'type'" prop="type" width="120" align="center">
+        <el-table-column :label="t('message.dateCenter.indicator.columns.name')" v-col="'name'" prop="name" min-width="200" show-overflow-tooltip />
+        <el-table-column :label="t('message.dateCenter.indicator.columns.type')" v-col="'type'" prop="type" width="120" align="center">
           <template #default="scope">
             <el-tag size="small">{{ scope.row.tagInfo?.[0]?.name || "-" }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="单位" v-col="'unit'" prop="unit" width="100" align="center" />
-        <el-table-column label="维度数" v-col="'dimensions'" align="center" width="100">
+        <el-table-column :label="t('message.dateCenter.indicator.columns.unit')" v-col="'unit'" prop="unit" width="100" align="center" />
+        <el-table-column :label="t('message.dateCenter.indicator.detail.labels.dimensionCount')" v-col="'dimensions'" align="center" width="140">
           <template #default="scope">
             <el-tag size="small" type="info">{{ scope.row.dimensions?.length || 0 }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="状态" v-col="'status'" prop="status" width="100" align="center">
+        <el-table-column :label="t('message.dateCenter.indicator.columns.status')" v-col="'status'" prop="status" width="110" align="center">
           <template #default="scope">
-            <el-tag size="small" :type="scope.row.status == '1' ? 'success' : 'danger'">{{ scope.row.status == "1" ? "已发布" : "未发布" }}</el-tag>
+            <el-tag size="small" :type="scope.row.status == '1' ? 'success' : 'danger'">{{ scope.row.status == "1" ? t("message.dateCenter.indicator.status.published") : t("message.dateCenter.indicator.status.unpublished") }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column v-col="'createdAt'" prop="createdAt" label="创建时间" align="center" width="180" />
-        <el-table-column label="操作" align="center" width="220" fixed="right" v-col="'handle'">
+        <el-table-column v-col="'createdAt'" prop="createdAt" :label="t('message.dateCenter.indicator.columns.createdAt')" align="center" width="180" />
+        <el-table-column :label="t('message.dateCenter.indicator.columns.action')" align="center" width="250" fixed="right" v-col="'handle'">
           <template #default="scope">
-            <el-button size="small" text type="primary" v-if="scope.row.status == '0'" @click="publish(scope.row)" v-auth="'publish'">发布</el-button>
-            <el-button size="small" text type="warning" v-else @click="unpublish(scope.row)" v-auth="'publish'">取消发布</el-button>
-            <el-button size="small" text type="primary" @click="openDetail(scope.row)" v-auth="'detail'">详情</el-button>
-            <el-button size="small" text type="success" @click="openData(scope.row)" v-auth="'data'">数据</el-button>
-            <el-button size="small" text type="primary" @click="addOrEdit(scope.row)" v-auth="'edit'">编辑</el-button>
-            <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-auth="'del'">删除</el-button>
+            <el-button size="small" text type="primary" v-if="scope.row.status == '0'" @click="publish(scope.row)" v-auth="'publish'">{{ t("message.dateCenter.indicator.actions.publish") }}</el-button>
+            <el-button size="small" text type="warning" v-else @click="unpublish(scope.row)" v-auth="'publish'">{{ t("message.dateCenter.indicator.actions.unpublish") }}</el-button>
+            <el-button size="small" text type="primary" @click="openDetail(scope.row)" v-auth="'detail'">{{ t("message.dateCenter.indicator.actions.detail") }}</el-button>
+            <el-button size="small" text type="success" @click="openData(scope.row)" v-auth="'data'">{{ t("message.dateCenter.indicator.actions.data") }}</el-button>
+            <el-button size="small" text type="primary" @click="addOrEdit(scope.row)" v-auth="'edit'">{{ t("message.dateCenter.indicator.actions.edit") }}</el-button>
+            <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-auth="'del'">{{ t("message.dateCenter.indicator.actions.delete") }}</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -83,6 +83,7 @@
 
 <script lang="ts" setup>
 import { ref } from "vue";
+import { useI18n } from "vue-i18n";
 import { ElMessageBox, ElMessage } from "element-plus";
 import api from "/@/api/datahub";
 import { useSearch } from "/@/hooks/useCommon";
@@ -97,6 +98,7 @@ const detailRef = ref();
 const dataRef = ref();
 const queryRef = ref();
 const exportLoading = ref(false);
+const { t } = useI18n();
 
 const typeOptions = ref([]);
 
@@ -117,14 +119,14 @@ getList();
 
 const publish = (row?: any) => {
   api.indicator.publish(row.code).then(() => {
-    ElMessage.success("发布成功");
+    ElMessage.success(t("message.dateCenter.indicator.messages.opSuccess"));
     getList();
   });
 };
 
 const unpublish = (row?: any) => {
   api.indicator.unpublish(row.code).then(() => {
-    ElMessage.success("取消发布成功");
+    ElMessage.success(t("message.dateCenter.indicator.messages.opSuccess"));
     getList();
   });
 };
@@ -140,13 +142,13 @@ const openData = (row: any) => {
 };
 
 const onRowDel = (row: any) => {
-  ElMessageBox.confirm(`此操作将永久删除指标:${row.name}(${row.code}),是否继续?`, "提示", {
-    confirmButtonText: "删除",
-    cancelButtonText: "取消",
+  ElMessageBox.confirm(t("message.dateCenter.indicator.list.confirmDelete", { name: row.name, code: row.code }), t("message.dateCenter.indicator.list.tip"), {
+    confirmButtonText: t("message.dateCenter.indicator.actions.delete"),
+    cancelButtonText: t("message.dateCenter.indicator.actions.cancel"),
     type: "warning",
   }).then(() => {
     api.indicator.del(row.code).then(() => {
-      ElMessage.success("删除成功");
+      ElMessage.success(t("message.dateCenter.indicator.messages.opSuccess"));
       getList();
     });
   });
@@ -156,7 +158,7 @@ const exportData = () => {
   exportLoading.value = true;
   api.indicator
     .export(params)
-    .then((res: any) => downloadFile(res, "指标管理列表导出.xlsx"))
+    .then((res: any) => downloadFile(res, t("message.dateCenter.indicator.list.exportFileName")))
     .finally(() => {
       exportLoading.value = false;
     });