/*
 * 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 const zhCN = {
  success: '成功',
  saved_successfully: '保存成功',
  same_name_tips: '同级文件存在相同名字',
  delete: '删除',
  delete_tips: '你确定要删除{name}吗？',
  empty_name_tips: '请输入名字',
  rename: '重命名',
  save: '保存',
  run: '运行',
  stop: '停止',
  close_tips: '关闭提示',
  close_content:
    '文件被修改，尚未保存，若强制关闭将丢失已编辑的内容，关闭标签前是否需要进行保存',
  force_close: '强制关闭',
  cannel: '取消',
  confirm: '确认',
  run_log: '运行日志',
  close: '关闭',
  empty_tab_tips: '请双击左侧文件列表中的文件名打开一个文件'
}
