跳到主要内容

国际化 (i18n)

概述

@bdky/aaas-pilot-kit 从 v1.1.2 开始支持国际化(i18n),基于 ICU MessageFormat 标准实现,内置支持 中文、英文、日文、韩文 4 种语言。

v1.1.2+ 统一配置

从 v1.1.2 开始,locale 成为语言配置的统一入口,同时控制:

  • SDK UI 界面文本的语言
  • ASR 语音识别TTS 语音合成的语言

只需设置 locale,无需分别配置 lang

核心特性

  • ICU MessageFormat 标准:使用 @messageformat/core 实现,支持复数、性别、日期等高级格式化
  • Source-as-Key 模式:中文作为 key,代码可读性更高
  • 编译缓存优化:自动缓存编译结果,避免重复编译
  • 自定义语言包:支持覆盖内置翻译或添加新语言
  • 动态切换:运行时切换语言,立即生效
  • 统一语言配置locale 同时控制 UI 和语音服务语言

快速开始

1. 初始化时设置语言(最简配置)

只需设置 locale,界面和语音服务都会使用相同语言:

import {createAaaSPilotKit} from '@bdky/aaas-pilot-kit';

const kit = createAaaSPilotKit({
// ... 其他配置
locale: 'en', // 界面和语音都用英文
});

2. 使用 Language 枚举(推荐)

Language 枚举可用于 locale,提供更好的代码提示:

import {createAaaSPilotKit, Language} from '@bdky/aaas-pilot-kit';

const kit = createAaaSPilotKit({
// ... 其他配置
locale: Language.ENGLISH, // 等同于 'en'
});

3. 界面与语音使用不同语言

当需要界面和语音服务使用不同语言时,可通过 asr.config.lang 覆盖:

const kit = createAaaSPilotKit({
locale: 'zh', // 界面用中文
asr: {
provider: 'baidu',
config: {
lang: 'en' // 语音服务用英文
}
}
});

4. 运行时切换语言

// 切换到日文
kit.setLocale('ja');

// 获取当前语言
const currentLocale = kit.getLocale(); // 'ja'

// 支持链式调用
kit.setLocale('ko').start();

支持的语言

界面语言(i18n 内置)

语言代码语言名称状态
zh中文(简体)内置(默认)
enEnglish内置
ja日本語内置
ko한국어内置
自定义任意语言通过 messages 参数

语音服务语言(ASR/TTS)

代码语言Language 枚举
zh中文(普通话)Language.CHINESE
en英语Language.ENGLISH
ja日语Language.JAPANESE
ko韩语Language.KOREAN
es西班牙语Language.SPANISH
ru俄语Language.RUSSIAN
vi越南语Language.VIETNAMESE
de德语Language.GERMAN
id印尼语Language.INDONESIAN
th泰语Language.THAI

API 参考

初始化配置

locale

类型: 'zh' | 'en' | 'ja' | 'ko' | string 默认值: 'zh' 描述: 设置 SDK 界面语言

createAaaSPilotKit({
locale: 'en', // 使用内置英文
});

messages

类型: Partial<I18nMessages> 描述: 自定义/覆盖翻译消息

查找优先级:

  1. 自定义 messages
  2. 当前 locale 对应的内置语言包
  3. 中文回退(zh
  4. key 本身(中文原文)
createAaaSPilotKit({
locale: 'en',
messages: {
// 覆盖内置翻译
'网络连接错误': 'Custom network error message',
},
});

运行时 API

setLocale(locale: string)

描述: 动态切换 SDK 界面语言 返回值: IAaaSPilotKitController(支持链式调用) 生效时机: 立即生效,影响所有使用 i18n 的组件

// 切换到英文
kit.setLocale('en');

// 链式调用
kit.setLocale('ja').start();

getLocale()

描述: 获取当前 SDK 界面语言 返回值: string(当前语言代码)

const currentLocale = kit.getLocale(); // 'zh'

使用场景

场景 1: 根据浏览器语言自动适配

// 获取浏览器语言
const browserLang = navigator.language.split('-')[0]; // 'en', 'zh', 'ja', 'ko'

const kit = createAaaSPilotKit({
locale: ['zh', 'en', 'ja', 'ko'].includes(browserLang) ? browserLang : 'zh',
});

场景 2: 用户手动切换语言

// React 示例
function LanguageSwitcher() {
const kit = useAaaSPilotKit();

const handleLanguageChange = (lang: string) => {
kit.setLocale(lang);
};

return (
<select onChange={(e) => handleLanguageChange(e.target.value)}>
<option value="zh">中文</option>
<option value="en">English</option>
<option value="ja">日本語</option>
<option value="ko">한국어</option>
</select>
);
}

场景 3: 添加自定义语言(法语示例)

import {zhMessages} from '@bdky/aaas-pilot-kit';

// 基于中文语言包翻译所有 key
const frMessages = {
'发生未知错误': 'Une erreur inconnue s\'est produite',
'网络连接错误': 'Erreur de connexion réseau',
'请求超时': 'Délai d\'attente de la requête',
// ... 翻译所有 key
};

const kit = createAaaSPilotKit({
locale: 'fr',
messages: frMessages,
});

场景 4: 覆盖部分内置翻译

const kit = createAaaSPilotKit({
locale: 'en',
messages: {
// 只覆盖需要自定义的消息
'ASR权限被拒绝': 'Microphone access denied. Please enable it in browser settings.',
},
});

导出的语言包

SDK 导出了所有内置语言包,供外部翻译参考:

import {
zhMessages, // 中文语言包
enMessages, // 英文语言包
jaMessages, // 日文语言包
koMessages, // 韩文语言包
} from '@bdky/aaas-pilot-kit';

// 查看所有可翻译的 key
console.log(Object.keys(zhMessages));

高级特性

ICU MessageFormat 插值

SDK 支持 ICU MessageFormat 标准的参数插值:

// 内置示例(中文)
'请求超时,已重试 {count} 次'

// 英文翻译
'Request timeout, retried {count} times'

// SDK 内部使用
i18n.t('请求超时,已重试 {count} 次', {count: 3});
// 输出: "请求超时,已重试 3 次"

编译缓存

SDK 自动缓存编译结果,避免重复编译:

  • 缓存 key: ${locale}:${messageKey}
  • 切换语言时自动清空缓存
  • 设置自定义消息时自动清空缓存

注意事项

  1. t() 方法不对外暴露 t() 方法仅供 SDK 内部使用,外部无法直接调用。SDK 会自动根据当前 locale 翻译所有内部消息。

  2. 语言切换立即生效 调用 setLocale() 后,所有使用 i18n 的组件会立即使用新语言。

  3. 自定义语言包需完整翻译 如果添加新语言,建议基于 zhMessages 翻译所有 key,否则未翻译的消息会回退到中文。

  4. ICU 格式错误会回退 如果消息模板包含无效的 ICU 格式,SDK 会自动回退到简单插值({key} 替换)。

locale 统一配置(v1.1.2+)

从 v1.1.2 开始,locale 成为统一入口,同时控制界面语言和语音服务语言。

如需界面和语音使用不同语言,可通过 asr.config.lang 覆盖语音服务语言。


迁移指南

lang 迁移到 locale

// ❌ 旧写法(已废弃)
const kit = createAaaSPilotKit({
lang: 'en',
});

// ✅ 新写法
const kit = createAaaSPilotKit({
locale: 'en',
});

lang 迁移到 asr.config.lang

如果只需要设置语音服务语言而不影响界面:

// ❌ 旧写法(已废弃)
const kit = createAaaSPilotKit({
lang: 'en',
});

// ✅ 新写法(仅语音服务)
const kit = createAaaSPilotKit({
locale: 'zh', // 界面保持中文
asr: {
provider: 'baidu',
config: { lang: 'en' }
}
});

优先级规则

语音服务语言的最终取值遵循以下优先级:

  1. asr.config.lang(如果配置了)
  2. locale 自动推导
  3. 默认 'zh'
asr.config.lang > locale → 自动推导 > 默认 'zh'

边界情况

使用非内置 i18n 语言

locale 设置为语音服务支持但 i18n 不内置的语言时:

const kit = createAaaSPilotKit({
locale: Language.SPANISH, // 'es'
});

行为

  • 界面语言:fallback 到中文(i18n 不内置西班牙语)
  • 语音服务:正常使用西班牙语

解决方案:通过 messages 参数提供自定义语言包:

const kit = createAaaSPilotKit({
locale: 'es',
messages: {
'发生未知错误': 'Error desconocido',
'网络连接错误': 'Error de conexión de red',
// ... 其他翻译
}
});

完整示例

import {createAaaSPilotKit, zhMessages} from '@bdky/aaas-pilot-kit';

// 1. 基于浏览器语言初始化
const browserLang = navigator.language.split('-')[0];
const supportedLangs = ['zh', 'en', 'ja', 'ko'];
const initialLocale = supportedLangs.includes(browserLang) ? browserLang : 'zh';

// 2. 创建 Kit 实例
const kit = createAaaSPilotKit({
// ... 其他配置
locale: initialLocale,
messages: {
// 可选:覆盖部分翻译
'ASR权限被拒绝': 'Custom permission denied message',
},
});

// 3. 运行时切换语言
document.getElementById('lang-zh')?.addEventListener('click', () => {
kit.setLocale('zh');
});

document.getElementById('lang-en')?.addEventListener('click', () => {
kit.setLocale('en');
});

// 4. 获取当前语言
console.log('Current locale:', kit.getLocale());

相关链接