Skip to content

国际化 ​

组件库内置 zh-CN 与 en-US 两套语言包,所有面向用户展示的文案(含 aria-label 等无障碍标注)都取自语言包,不在组件里硬编码。

切换语言 ​

用 ConfigProvider 包裹应用即可,两种写法等价:

vue
<template>
  <!-- 传内置包名 -->
  <KbConfigProvider locale="en-US">
    <App />
  </KbConfigProvider>

  <!-- 或直接传语言包对象 -->
  <KbConfigProvider :locale="enUS">
    <App />
  </KbConfigProvider>
</template>

<script setup lang="ts">
import { KbConfigProvider, enUS } from 'kb-ui-vue'
</script>

语言是响应式的,运行时切换 locale 会立即生效:

vue
<script setup lang="ts">
import { ref } from 'vue'
const locale = ref<'zh-CN' | 'en-US'>('zh-CN')
</script>

<template>
  <KbConfigProvider :locale="locale">
    <button @click="locale = locale === 'zh-CN' ? 'en-US' : 'zh-CN'">切换语言</button>
    <KbTable :columns="columns" :data="rows" />
  </KbConfigProvider>
</template>

文案优先级 ​

组件的内置文案遵循「显式 prop > 语言包 > 默认语言包」的取值顺序:

vue
<!-- 未传 description,用语言包中的 empty.description -->
<KbEmpty />

<!-- 传了 description,忽略语言包 -->
<KbEmpty description="这里空空如也" />

<!-- 传 null / '' 之外的假值时按未传处理(走语言包) -->
<KbEmpty :description="undefined" />

因此已有的显式传参代码不受切换语言影响,可以渐进式迁移。

自定义语言包 ​

传入一个与 ProjectLocale 同构的对象即可。缺字段会自动回退到默认语言包,不必抄全量:

ts
import { KbConfigProvider, type ProjectLocale } from 'kb-ui-vue'

const jaJP: ProjectLocale = {
  name: 'ja-JP',
  // 只覆盖需要翻译的部分,其余回退到 zh-CN
  empty: { description: 'データがありません' },
  popconfirm: { confirmText: 'OK', cancelText: 'キャンセル' },
} as ProjectLocale
vue
<KbConfigProvider :locale="jaJP">
  <App />
</KbConfigProvider>

由于 TypeScript 会校验 ProjectLocale 的完整性,部分覆盖时需要 as ProjectLocale 断言。运行时缺字段的兜底是安全的。

在自定义组件中使用 ​

vue
<script setup lang="ts">
import { computed } from 'vue'
import { useLocale } from 'kb-ui-vue'

const { t, locale } = useLocale()

// t() 支持 %s 占位符,按入参顺序替换
const tip = computed(() => t('pagination.total', 42)) // 共 42 条
// locale 是 ref,读取具体字段用 locale.value
const week = computed(() => locale.value.calendar.weekShorts)
</script>

语言包字段一览 ​

路径中文英文
common.confirm确定Confirm
common.cancel取消Cancel
common.clear清空Clear
common.loading加载中Loading…
empty.description暂无数据No data
list.empty暂无数据No data
table.emptyText暂无数据No data
cascader.placeholder请选择Please select
cascader.loading加载中…Loading…
cascader.leafTag可选Selectable
cascader.panel级联选择Cascader panel
cascader.level第 %s 级Level %s
calendar.prevMonth上一月Previous month
calendar.nextMonth下一月Next month
calendar.title%s 年 %s 月%s/%s
calendar.weekShorts一…日(7 项)Mon…Sun(7 项)
datePicker.separator至~
datePicker.selectedCount已选 %s 个日期%s dates selected
datePicker.panel选择日期Select date
datePicker.panelRange选择日期范围Select date range
datePicker.panelMultiple选择日期(可多选)Select dates
dialog.panel对话框Dialog
form.required%s 为必填项%s is required
form.pattern%s 格式不正确%s is malformed
form.invalid%s 不合法%s is invalid
carousel.prev上一张Previous slide
carousel.next下一张Next slide
carousel.indicator第 %s 张Slide %s
colorPicker.pick选择颜色 %sPick color %s
inputPassword.show显示密码Show password
inputPassword.hide隐藏密码Hide password
pagination.prev上一页Previous page
pagination.next下一页Next page
pagination.pageSize每页 %s 条%s / page
pagination.total共 %s 条%s items
popconfirm.confirmText确定Confirm
popconfirm.cancelText取消Cancel
search.placeholder搜索…Search…
search.action搜索Search
transfer.titles待选 / 已选Source / Target
transfer.filterPlaceholder请输入搜索内容Search
transfer.noMatch无匹配数据No matches
transfer.prevPage上一页Previous page
transfer.nextPage下一页Next page
upload.chooseFile选择文件Choose file
upload.remove删除Remove
upload.uploading上传中 %s%Uploading %s%
upload.uploaded已上传Uploaded
upload.failed上传失败Upload failed