/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

export default {
  common: {
    home: '主页',
    menuData: [
      {
        title: '治理',
        child: [
          {
            title: '注册中心',
            href: '/registry-center'
          },
          {
            title: '配置管理',
            href: '/rule-config'
          },
          {
            title: '运行状态',
            href: '/runtime-status'
          },
        ]
      },
      {
        title: '数据扩容',
        href: '/data-scaling'
      }
    ],
    connect: '已连接',
    connection: '连接',
    del: '删除',
    notify: {
      title: '提示',
      addSucMessage: '添加成功',
      editSucMessage: '修改成功',
      conSucMessage: '连接成功',
      conFailMessage: '连接失败',
      delSucMessage: '删除成功',
      delFailMessage: '删除失败',
      updateCompletedMessage: '更新成功',
      updateFaildMessage: '更新失败',
      confirmDelOperator: '确认删除'
    },
    loginOut: '退出登录',
    dropdownList: [
      {
        title: '中文',
        command: 'Chinese'
      },
      {
        title: 'English',
        command: 'English'
      }
    ]
  },
  login: {
    btnTxt: '登录',
    labelUserName: '用户名',
    labelPassword: '密码'
  },
  btn: {
    submit: '提交',
    reset: '重置',
    cancel: '取消',
    confirm: '确定'
  },
  input: {
    pUserName: '请输入用户名',
    pPaasword: '请输入密码'
  },
  registryCenter: {
    btnTxt: '添加',
    registDialog: {
      title: '添加注册中心',
      editTitle: '编辑注册中心',
      name: '注册中心名称',
      centerType: '注册中心类型',
      additionalCenterType: '扩展配置中心类型',
      additionalAddress: '扩展配置中心地址',
      address: '注册中心地址',
      governanceName: '治理实例名称',
      namespaces: '命名空间',
      digest: '登录凭证',
      btnConfirmTxt: '确定',
      btnCancelTxt: '取消'
    },
    table: {
      operate: '操作',
      operateConnect: '连接',
      operateConnected: '已激活',
      operateDel: '删除',
      operateEdit: '编辑'
    },
    rules: {
      name: '请输入注册中心名称',
      centerType: '请选择注册中心类型',
      namespaces: '请输入命名空间',
      address: '请输入注册中心地址',
      governanceName: '请输入治理实例名称',
      digest: '请输入登录凭证'
    }
  },
  runtimeStatus: {
    serviceNode: '服务节点',
    slaveDataSourceName: '从库信息',
    dataSource: {
      schema: '逻辑库名',
      masterDataSourceName: '主库名',
      slaveDataSourceName: '从库名'
    },
    instance: {
      instanceId: '节点标识',
      serverIp: '服务ip'
    }
  },
  ruleConfig: {
    form: {
      inputPlaceholder: '请输入内容'
    },
    schema: {
      title: '添加Schema',
      name: '名称',
      ruleConfig: '分片配置规则',
      dataSourceConfig: '数据源配置规则'
    },
    schemaRules: {
      name: '请输入名称',
      ruleConfig: '请输入数据分片配置规则',
      dataSourceConfig: '请输入数据源配置规则'
    },
    radioBtn: {
      schema: '数据源',
      authentication: '认证信息',
      props: '属性配置'
    }
  },
  dataScaling: {
    btnTxt: '添加',
    tableList: {
      jobId: '任务Id',
      jobName: '任务名称',
      status: '状态',
      operate: '操作',
      operateStop: '停止',
      operateSee: '查看'
    },
    registDialog: {
      title: '添加一个任务',
      source: '源',
      target: '目标',
      jobCount: '任务数量',
      jobCountPlaceholder: '请输入任务数量',
      username: '用户名',
      usernamePlaceholder: '请输入用户名',
      password: '密码',
      passwordPlaceholder: '请输入密码',
      url: '地址',
      urlPlaceholder: '请输入 url',
      btnConfirmTxt: '确认',
      btnCancelTxt: '取消'
    },
    rules: {
      source: '请选择注册中心的来源',
      target: '请选择目标',
      serviceUrl: '服务地址必填'
    },
    notify: {
      title: '提示',
      conSucMessage: '添加成功',
      conFailMessage: '添加失败',
      delSucMessage: '删除成功',
      delFailMessage: '删除失败'
    },
    serviceDialog: {
      title: '数据扩容配置',
      serviceName: '服务名称',
      serviceUrl: '服务地址',
      serviceNamePlaceholder: '请输入服务名称',
      serviceUrlPlaceholder: '请输入服务地址'
    }
  }
}
