更新记录
2.0.0(2026-07-08) 下载此版本
- feat: 全面支持 uni-app(JS/TS 环境),两端 API 完全一致
- feat: 新增
te、tm、rt方法,与 vue-i18n 对齐 - feat: 新增
addModifier、addPluralRule方法,支持自定义修饰符和复数规则 - feat: 新增
availableLocales响应式计算属性 - feat: 新增
useScope选项,支持 global/parent/local 作用域 - feat: 新增
inheritLocale选项,子 Composer 自动继承根实例语言 - feat: 新增
useStorage选项,支持语言设置持久化 - feat: 重构为 ComposerClass 统一返回,所有方法支持默认参数省略
- feat: 目录重构
common/→uvue/,与vue/对应 - fix: 修复 compile 函数 listIndex 变量遮蔽 bug
- fix: 修复 fetchChoice 数组越界问题
- fix: 修复 install 在 APP-ANDROID 端需 definePlugin 包装的问题
- fix: 修复 t() 缺失翻译时返回空字符串,改为返回 key 本身
- fix: 删除无用的 errors.uts 和 warnings.uts
0.1.6(2026-03-12) 下载此版本
- fix: 修复在小程序无法读取locale问题
0.1.5(2026-02-03) 下载此版本
- 重构为class实现
平台兼容性
uni-app(5.13)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | √ | √ | √ | √ | - | 5.0 | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ | - | - | - |
uni-app x(4.61)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | 5.0 | √ | √ | √ |
lime-i18n 国际化插件
参考 vue-i18n 实现的国际化插件,同时支持 uni-app x(UTS 环境) 和 uni-app(JS/TS 环境),两端 API 完全一致。提供多语言切换、文本格式化、复数处理、日期时间本地化、数字格式化、TabBar 国际化等功能。
插件依赖:lime-shared
::: tip vue-i18n 优先 uni-app x 的 App 端原本不支持 vue-i18n,但升级到蒸汽模式(Vapor Mode)后已全面支持。建议优先使用 vue-i18n,获得完整的生态支持降低学习门槛。lime-i18n 作为 vue-i18n 的轻量替代。 :::
安装方法
- 在 uni-app 插件市场中搜索并导入
lime-i18n - 导入后可能需要重新编译项目
::: tip 注意 lime-i18n 通过条件编译自动选择对应实现,用户无需关心底层差异:
- uni-app x →
uvue/(UTS 强类型) - uni-app →
vue/(JS/TS) :::
代码演示
基础使用
1. 创建 i18n 实例
// locales/index.uts
import { createI18n } from '@/uni_modules/lime-i18n'
import zhCN from './zh-CN.json'
import enUS from './en-US.json'
const i18n = createI18n({
locale: 'zh-CN',
fallbackLocale: 'en-US',
useStorage: true, // 开启语言持久化
messages: {
'zh-CN': zhCN,
'en-US': enUS
}
})
export default i18n
2. 在应用中注册(可选)
// main.uts
import i18n from './locales'
export function createApp() {
const app = createSSRApp(App)
// 非 Vapor 模式下注册全局属性($t/$tc/$d/$n)
// Vapor 模式下不需要 app.use,但 import 不能省略
// app.use(i18n)
return { app }
}
3. 在组件中使用
import { useI18n } from '@/uni_modules/lime-i18n'
const i18n = useI18n()
// 简单翻译
const title = i18n.t('page.title')
// 带插值翻译
const welcome = i18n.t('message.welcome', { name: '张三' })
// 复数翻译
const appleCount = i18n.tc('apple', 10)
// 切换语言
i18n.locale.value = 'en-US'
在模板中:
<template>
<view>
<text>{{ i18n.t('page.title') }}</text>
<text>{{ i18n.tc('apple', 10) }}</text>
</view>
</template>
文本格式化
具名插值
// 语言包:{ message: { hello: '{msg} world' } }
i18n.t('message.hello', { msg: 'hello' }) // "hello world"
列表插值
// 语言包:{ message: { hello: '{0} world' } }
i18n.t('message.hello', ['hello']) // "hello world"
链接消息
// 语言包:{ the_world: 'the world', dio: 'DIO:', linked: '@:message.dio @:message.the_world !!!!' }
i18n.t('message.linked') // "DIO: the world !!!!"
内置修饰符
| 修饰符 | 说明 | 示例 |
|---|---|---|
@.upper: |
转大写 | @.upper:message.home → "HOME" |
@.lower: |
转小写 | @.lower:message.home → "home" |
@.capitalize: |
首字母大写 | @.capitalize:message.home → "Home" |
复数处理
// 语言包:{ car: 'car | cars', apple: 'no apples | one apple | {count} apples' }
i18n.tc('car', 1) // "car"
i18n.tc('car', 2) // "cars"
i18n.tc('apple', 0) // "no apples"
// 带插值
i18n.tc('apple', 10, { count: 10 }) // "10 apples"
日期时间格式化
const i18n = createI18n({
datetimeFormats: {
'en-US': {
short: { year: 'numeric', month: 'short', day: 'numeric' },
long: { year: 'numeric', month: 'short', day: 'numeric', weekday: 'short', hour: 'numeric', minute: 'numeric' }
}
}
})
i18n.d(new Date()) // 默认格式
i18n.d(new Date(), 'short') // 指定格式
i18n.d(new Date(), 'long', 'zh-CN') // 指定语言
数字格式化
const i18n = createI18n({
numberFormats: {
'en-US': {
currency: { style: 'currency', currency: 'USD' },
percent: { style: 'percent', useGrouping: false }
}
}
})
i18n.n(10000) // 默认格式
i18n.n(10000, 'currency') // 货币格式
i18n.n(0.99123, 'percent') // 百分比格式
TabBar 国际化
const i18n = useI18n()
// 设置 TabBar 文本
i18n.setTabBar('zh-CN', ['首页', '分类', '我的'])
i18n.setTabBar('en-US', ['Home', 'Category', 'Me'])
// 切换语言时自动更新 TabBar
i18n.locale.value = 'en-US'
延迟加载语言包
const i18n = useI18n()
setTimeout(() => {
i18n.setLocaleMessage('ja-JP', jaJP)
}, 5000)
自定义修饰符
// 两端通用方式(推荐)
i18n.addModifier('snakeCase', (str: string): string => str.split(' ').join('_'))
// uni-app(JS/TS)也可直接在 options 中传入
const i18n = createI18n({
modifiers: {
snakeCase: (str: string): string => str.split(' ').join('_')
}
})
自定义复数规则
function customRule(choice: number, choicesLength: number): number {
if (choice == 0) return 0
const teen = choice > 10 && choice < 20
const endsWithOne = choice % 10 == 1
if (!teen && endsWithOne) return 1
if (!teen && choice % 10 >= 2 && choice % 10 <= 4) return 2
return choicesLength < 4 ? 2 : 3
}
// 两端通用方式(推荐)
i18n.addPluralRule('ru', customRule)
// uni-app(JS/TS)也可直接在 options 中传入
const i18n = createI18n({
pluralizationRules: { ru: customRule }
})
API 文档
createI18n(options)
创建 i18n 实例,返回 UvueI18n。
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
|---|---|---|---|---|
| locale | 默认语言 | string | 'en-US' |
— |
| fallbackLocale | 回退语言 | string | string[] | — | — |
| messages | 语言包 | object | {} |
— |
| datetimeFormats | 日期时间格式 | object | {} |
— |
| numberFormats | 数字格式 | object | {} |
— |
| tabBars | TabBar 国际化文本 | object | {} |
— |
| modifiers | 自定义修饰符 | object | {} |
— |
| pluralizationRules | 自定义复数规则 | object | {} |
— |
| useStorage | 是否持久化语言设置 | boolean | false |
true / false |
| inheritLocale | 是否继承根实例语言 | boolean | true |
true / false |
| formatter | 自定义格式化器 | BaseFormatter | — | — |
useI18n(options)
获取 Composer 实例,返回 ComposerClass。
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
|---|---|---|---|---|
| useScope | 作用域 | string | 'global' |
'global' / 'parent' / 'local' |
注意: 请勿解构返回值,直接通过实例调用方法(
i18n.t('key')),解构会丢失this绑定。
ComposerClass 方法
翻译方法
| 方法 | 说明 | 参数 |
|---|---|---|
| t(key, values?, locale?) | 翻译 | key: 翻译键,values: 插值对象/数组,locale: 指定语言 |
| tc(key, choice?, values?, locale?) | 复数翻译 | key: 翻译键,choice: 选择值,values: 插值对象,locale: 指定语言 |
| te(key, locale?) | 翻译是否存在 | key: 翻译键,locale: 指定语言 |
| tm(key) | 获取翻译消息原始值 | key: 翻译键 |
| rt(message, values?) | 渲染消息字符串 | message: 消息字符串,values: 插值对象 |
格式化方法
| 方法 | 说明 | 参数 |
|---|---|---|
| d(date, key?, locale?, options?) | 日期格式化 | date: 日期,key: 格式键,locale: 语言,options: Intl 选项 |
| n(number, key?, locale?, options?) | 数字格式化 | number: 数字,key: 格式键,locale: 语言,options: Intl 选项 |
语言包管理
| 方法 | 说明 | 参数 |
|---|---|---|
| setLocaleMessage(locale, message) | 设置语言包(替换) | locale: 语言,message: 消息对象 |
| getLocaleMessage(locale) | 获取语言包 | locale: 语言 |
| mergeLocaleMessage(locale, message) | 合并语言包 | locale: 语言,message: 消息对象 |
格式管理
| 方法 | 说明 | 参数 |
|---|---|---|
| setDateTimeFormat(locale, format) | 设置日期格式 | locale: 语言,format: 格式对象 |
| getDateTimeFormat(locale) | 获取日期格式 | locale: 语言 |
| mergeDateTimeFormat(locale, format) | 合并日期格式 | locale: 语言,format: 格式对象 |
| setNumberFormat(locale, format) | 设置数字格式 | locale: 语言,format: 格式对象 |
| getNumberFormat(locale) | 获取数字格式 | locale: 语言 |
| mergeNumberFormat(locale, format) | 合并数字格式 | locale: 语言,format: 格式对象 |
TabBar 管理
| 方法 | 说明 | 参数 |
|---|---|---|
| setTabBar(locale, tabbar) | 设置 TabBar 文本 | locale: 语言,tabbar: 文本数组 |
| getTabBar(locale) | 获取 TabBar 文本 | locale: 语言 |
自定义规则
| 方法 | 说明 | 参数 |
|---|---|---|
| addModifier(name, fn) | 注册自定义修饰符 | name: 名称,fn: (str: string) => string |
| addPluralRule(locale, fn) | 注册自定义复数规则 | locale: 语言,fn: (choice: number, choicesLength: number) => number |
UvueI18n 实例
| 属性/方法 | 说明 | 类型 |
|---|---|---|
| global | 全局 Composer 实例 | ComposerClass |
| availableLocales | 可用语言列表 | string[] |
| mode | 模式 | 'composition' |
| install(app) | Vue 插件安装方法 | — |
| $t / $tc / $d / $n | 快捷翻译方法 | — |
与 vue-i18n 的关系
uni-app x App 端原本不支持 vue-i18n,升级到蒸汽模式后已全面支持。现在只要启用了蒸汽模式,所有端都可以直接使用 vue-i18n。 lime-i18n 与 vue-i18n 的关键差异:
| 特性 | lime-i18n | vue-i18n |
|---|---|---|
| 蒸汽模式 | ✅ 支持 | ✅ 支持 |
| uni-app(Web/小程序) | ✅ 内置支持 | ✅ 蒸汽模式下支持 |
| TabBar 国际化 | ✅ 内置 | ❌ 无 |
| useStorage 持久化 | ✅ 内置 | ❌ 无 |
| useI18n 返回 | ComposerClass 实例(不解构) |
Composer type(可解构) |
| 消息编译器 | 简单 {name}/{0} 插值 | 完整 ICU 消息编译 |
| provide/inject | 全局变量 | ✅ 完整 |
| 多实例 | ❌ 单例 | ✅ 支持 |
| DevTools | ❌ 无 | ✅ 支持 |
| 内置组件 I18nT/I18nN/I18nD | ❌ 无 | ✅ 支持 |
建议优先选择 vue-i18n:
- 已启用蒸汽模式,所有端均可直接使用
- 获得完整的消息编译器、DevTools、SSR 等生态支持
- 已有 vue-i18n 使用经验,零学习成本
选择 lime-i18n 的场景:
- 需要 TabBar 国际化、useStorage 持久化等 uni-app 特有功能
- 尚未启用蒸汽模式的项目
Vue2 使用说明
插件使用了组合式 API,如需在 Vue2 项目中使用,请按照官方教程配置。
// vue2
import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)
快速预览
导入插件后,可以直接使用以下标签查看演示效果:
<!-- 代码位于 uni_modules/lime-i18n/components/lime-i18n/ -->
<lime-i18n />
插件标签说明
| 标签类型 | 示例 | 说明 |
|---|---|---|
| 组件标签 | lime-i18n |
演示组件,查看完整功能演示 |
文档链接
📚 组件详细文档请访问以下站点:
注意事项
- APP 端(uni-app x 原生) 不支持
Intl.DateTimeFormat和Intl.NumberFormat,日期和数字格式化功能受限;uni-app(Web/小程序)完整支持 - UTS 环境下
options.modifiers和options.pluralizationRules不会生效(UTSJSONObject 无法携带函数),请使用addModifier/addPluralRule方法 - Vapor 模式下
app.config.globalProperties不再有效,模板中无法使用$t()等,请使用useI18n()组合式 API - 不要解构
useI18n()返回值,直接通过实例调用方法 import i18n from './locales'不能省略,即使不调用app.use(i18n),也需要 import 以确保createI18n()被执行
useScope 说明
| 值 | 行为 |
|---|---|
'global'(默认) |
使用全局 Composer |
'local' |
创建独立 Composer,通过 inheritLocale(默认 true)继承根实例语言 |
'parent' |
等同于 'global'(不依赖 inject/provide,Vapor 兼容) |
平台差异
| 特性 | uni-app x(UTS) | uni-app(JS/TS) |
|---|---|---|
| 实现目录 | uvue/ |
vue/ |
| options 传函数 | ❌ UTSJSONObject 无法携带 | ✅ 直接传入 |
| Intl 格式化 | ❌ APP 端不可用 | ✅ Web/小程序可用 |
| 模板 $t/$tc/$d/$n | 仅非 Vapor 模式 | ✅ 支持 |
| useI18n 组合式 API | ✅ | ✅ |
| TabBar 国际化 | ✅ | ✅ |
| useStorage 持久化 | ✅ | ✅ |
| 自定义修饰符 | 通过 addModifier | options 或 addModifier |
| 自定义复数规则 | 通过 addPluralRule | options 或 addPluralRule |
支持与赞赏
如果你觉得本插件解决了你的问题,可以考虑支持作者:
| 支付宝赞助 | 微信赞助 |
|---|---|
![]() |
![]() |

收藏人数:
下载插件并导入HBuilderX
赞赏(37)


下载 73180
赞赏 586
下载 12432783
赞赏 1934
赞赏
京公网安备:11010802035340号