Electron IMKit 多语言
IMKit 的多语言分为两部分:可翻译文案(键值资源)与格式化结果(时间分割、未读角标、已读人数、发送状态)。IDL 只约束组件行为,本页给出跨端一致的键名约定与格式化函数映射。
键名约定
IDL 不定义 i18n 资源;为保证多端一致,建议统一使用 imkit.<component>.<key> 命名,并以内置 zh-CN / en-US 为基线。
资源键约定
| 键(建议) | 中文基线 | 说明 |
|---|---|---|
conversationList.empty | 暂无会话 | 可由宿主资源覆盖 |
conversationList.loading | 加载中 | 可由宿主资源覆盖 |
chatView.inputPlaceholder | 输入消息 | 可由宿主资源覆盖 |
chatView.noMore | 没有更多消息 | 可由宿主资源覆盖 |
chatView.recalled | 消息已撤回 | 可由宿主资源覆盖 |
messageStatus.sending | 发送中 | 可由宿主资源覆盖 |
messageStatus.sent | 已发送 | 可由宿主资源覆盖 |
messageStatus.delivered | 已送达 | 可由宿主资源覆盖 |
messageStatus.read | 已读 | 可由宿主资源覆盖 |
messageStatus.failed | 发送失败 | 可由宿主资源覆盖 |
common.retry | 重试 | 可由宿主资源覆盖 |
common.cancel | 取消 | 可由宿主资源覆盖 |
common.confirm | 确定 | 可由宿主资源覆盖 |
格式化函数(跨端一致)
| 能力 | Web | Flutter | Android | Native | 规则 |
|---|---|---|---|---|---|
| 时间分割 | formatTime(timestamp, now, locale) | TimeSeparator.formatTime(ts, nowMs:) | IMKitTimeFormatter.format(context, ts, now) | im_kit_format_time(ts, now, out, len) | 当天 HH:mm;昨天;7 天内周X;更早日期 |
| 未读角标 | unreadBadgeText(count) | UnreadBadge.formatCount(count) | UnreadBadgeFormatter.format(unread, mention) | im_kit_unread_badge_text(count, out, len) | 0 隐藏;>99 显示 99+;免打扰灰点 |
| 已读文案 | messageStatusText(...) | MessageStatusIndicator.readText(...) | ReadCountFormatter.format(read, total) | im_kit_message_status_text(json, read, total, out, len) | 单聊 已读/未读;群聊 n/m |
| 发送状态 | messageStatusText(status) | MessageStatusIndicator 状态常量 | SendState 枚举 | im_kit_message_status_text(...) | 发送中 / 已发送 / 已送达 / 已读 / 失败 |
按端接入
| 平台 | locale 入口 | 资源覆盖 |
|---|---|---|
| Android | res/values/strings.xml / values-en/ | XML 资源覆盖;IMKitTimeFormatter 可注入 |
| Web | IMKit.setup({ locale: "en-US" }) | 文案键可通过宿主 i18n 框架注入;格式化函数支持 locale 参数 |
| Electron | 宿主 React i18n(如 i18next) | 组件 props 传入已翻译文案 / 格式化后的时间 |
| Flutter | MaterialApp(locale: ...) + localizationsDelegates | 使用 Flutter 本地化体系;格式化函数提供静态方法 |
| Native | im_kit_set_utc_offset_minutes + 宿主资源 | C ABI 输出格式化后的文案,翻译由宿主完成 |
| iOS | IMPTimeSeparator.formattedText() / NSLocalizedString | Bundle 本地化资源,随系统区域 |
| HarmonyOS | TimeSeparator.formattedText(),见 HarmonyOS 分区 | ArkUI 资源 |
格式化示例
JavaScript / TypeScript
// Electron:组件只接收宿主格式化后的文案 / 时间戳;
// 宿主 React 应用可用 i18next + Intl 统一处理
const label = new Intl.DateTimeFormat('zh-CN', { hour: '2-digit', minute: '2-digit' })
.format(timestamp);
const badge = count > 99 ? '99+' : count > 0 ? String(count) : '';
// 或直接让 TimeSeparator 组件按时间戳渲染(内部按中文规则格式化)提示:时间格式化函数均支持注入 now / now_ms,便于单元测试与固定时区。