内置文案语言切换
示例展示了 ProForm 内置占位符(请输入)如何跟随宿主组件库语言自动切换。
实现方式
- 通过 vant 的
Locale.use(lang)切换语言(zh-CN / zh-TW / en-US) - pro-components 内置文案自动跟随切换,无需任何额外配置
- 如需覆盖个别文案,可通过
ProComponentProvider :locale按 key 覆盖(如{ 'input.placeholder': 'Type here' })
语言切换
代码实现
vue
<script setup lang="ts">
import { h, ref, watch } from 'vue';
import { Locale, Button, Space, Radio, Checkbox } from 'vant';
import { ProComponentProvider, ProForm, useForm } from '@qin-ui/vant-pro';
import zhCN from 'vant/es/locale/lang/zh-CN';
import zhTW from 'vant/es/locale/lang/zh-TW';
import enUS from 'vant/es/locale/lang/en-US';
type FormData = {
name: string;
gender: number;
hobby: string[];
};
type Lang = 'zh-CN' | 'zh-TW' | 'en-US';
// 通过 vant 的 Locale.use 切换语言,ProForm 内置占位符(请输入)随之切换
const lang = ref<Lang>('zh-CN');
const langPacks: Record<Lang, Record<string, any>> = {
'zh-CN': zhCN,
'zh-TW': zhTW,
'en-US': enUS,
};
watch(lang, val => {
Locale.use(val, langPacks[val]);
});
const form = useForm<FormData>({}, [
{ label: '姓名', path: 'name', component: 'field' },
{
label: '性别',
path: 'gender',
component: 'radio-group',
slots: {
default: () => [
h(Radio, { name: 1 }, () => '男'),
h(Radio, { name: 2 }, () => '女'),
],
},
},
{
label: '爱好',
path: 'hobby',
component: 'checkbox-group',
slots: {
default: () => [
h(Checkbox, { name: 'reading' }, () => '阅读'),
h(Checkbox, { name: 'sports' }, () => '运动'),
],
},
},
]);
const submit = async () => {
await form.formRef.value?.validate();
console.log('表单提交数据:', { ...form.formData });
};
</script>
<template>
<div class="demo-wrapper">
<Space style="margin-bottom: 16px">
<Button
v-for="item in ['zh-CN', 'zh-TW', 'en-US'] as Lang[]"
:key="item"
:type="lang === item ? 'primary' : 'default'"
size="small"
@click="lang = item"
>
{{ item }}
</Button>
</Space>
<ProComponentProvider>
<ProForm :form="form">
<div style="margin: 16px">
<Button type="primary" native-type="submit" @click="submit">
提交
</Button>
</div>
</ProForm>
</ProComponentProvider>
</div>
</template>