uni-app x的国际化,即多语言,分2种情况:
1. 固定一种外语:这种方式很简单,自己直接写就可以
2. 动态切换语言:内置多种语言,根据条件动态切换。这种略微复杂,需要仔细读下文。
首先需要分清楚,一个应用分为开发者的代码,和uni-app x框架代码2部分。它们都涉及国际化。
- 开发者代码:即开发者自己的代码里涉及的界面部分
- 框架部分:即uni-app x内置组件和API涉及界面的部分
## 开发者代码的国际化
这里的国际化指动态切换语言。如果是写死一种语言,直接在代码里写就好了。
### App平台
i18n这个vue插件库还没有适配uts,但自己实现一个语言替换机制也不难。
推荐使用这个插件来解决动态语言切换,[lime-i18n](https://ext.dcloud.net.cn/plugin?id=18954)
### Web平台
Web平台可以使用标准的vue-i18n插件。
main.uts 引入并初始化 VueI18n。(注意写条件编译,避免App平台报错)
```js
// 国际化 json 文件,文件内容详见下面的示例
import en from './en.json'
import zhHans from './zh-Hans.json'
import zhHant from './zh-Hant.json'
const messages = {
en,
'zh-Hans': zhHans,
'zh-Hant': zhHant
}
let i18nConfig = {
locale: uni.getLocale(),// 获取已设置的语言
messages
}
import { createSSRApp } from 'vue'
import { createI18n } from 'vue-i18n'// v9.x
const i18n = createI18n(i18nConfig)
export function createApp() {
const app = createSSRApp(App)
app.use(i18n)
return {
app
}
}
```
国际化json文件内容
```json
{
"index.title": "Hello i18n"
}
```
页面模板中使用 `$t()` 获取,并传递国际化json文件中定义的key,js中使用 `this.$t('')`
```html
{{$t('index.title')}}
```
注意:页面中设置语言后需要调用 `this.$i18n.locale = 'zh-Hans'` 后生效
## pages.json 国际化@pages
Web平台和App平台,可以通过设置tabbar和navigationbar的API来设置文字。
Web平台还额外支持如下使用方式:
项目根目录的locale目录下配置语言json文件,locale/`语言地区代码`.json,如:en.json,zh-Hans.json,zh-Hant.json
```
├── locale
│ ├── en.json
│ ├── zh-Hans.json
│ └── zh-Hant.json
```
语言文件示例(zh-Hans.json)
```json
{
"app.name": "Hello uni-app",
"index.title": "首页"
}
```
pages.json 示例
```json
{
"pages": [
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "%index.title%" // locale目录下 语言地区代码.json 文件中定义的 key,使用 %% 占位
}
}
],
"tabBar": {
"list": [{
"pagePath": "pages/index/index",
"text": "%index.home%"
}
]
}
}
```
pages.json 支持以下属性配置国际化信息
- navigationBarTitleText
- titleNView->titleText
- titleNView->searchInput->placeholder
- tabBar->list->text
## 框架内置组件和API国际化
uni-app x 的部分组件和API涉及界面,框架内置支持的国际化语言,如果手机os或浏览器语言在这些内置国际化语言列表中会自适应。如果不在5种内,会默认为英文。
- app-Android平台
* 中文简体
* 中文繁体
* 英语
- app-iOS平台
* 中文简体
- web平台
* 中文简体
* 中文繁体
* 英语
* 法语
* 西班牙语
涉及界面的组件和API包括:
- [uni.showModal](./api/prompt.md#showmodal):默认的确定和取消按钮文字,会根据os和浏览器的语言自适应。也可以在API中通过参数自己指定文字。
- [uni.showActionSheet](./api/prompt.md#showactionsheet):取消按钮文字,会根据os和浏览器的语言自适应。
- [uni.chooseImage](./api/choose-image.md#chooseimage) 和 [uni.chooseVideo](./api/choose-video.md#chooseVideo):
+ app平台弹出的`拍摄`和`从相册选择`选择框不支持国际化,可以设置`sourceType`参数值为单项自己实现选择框来处理。
* `拍摄` 打开的是系统相机界面,在app平台跟随系统语言,不受uni-app x内置国际化语言列表限制
* `从相册选择` 打开的是平台实现的界面,受uni-app x内置国际化语言列表限制
+ web平台打开的是浏览器界面,不受uni-app x内置国际化语言列表限制
### 自定义国际化内容@uni-framework
> 仅web平台支持
如果自动适配语言不满足你的需求,比如需要预置的5种语言外的更多语言。那么可以使用自定义方案。在指定目录创建指定文件,用同名词条来替换,语言地区代码请遵循 BCP47 规范。
项目根目录支持 `locale` 目录,locale/uni-app.`语言地区代码`.json,如:uni-app.en.json,uni-app.zh-Hans.json,uni-app.zh-Hant.json
```
├── locale
│ ├── uni-app.en.json
│ ├── uni-app.zh-Hans.json
│ └── uni-app.zh-Hant.json
```
uni-app.zh-Hans.json 文件
```json
{
"common": {
"uni.async.error": "连接服务器超时,点击屏幕重试",
"uni.showActionSheet.cancel": "取消",
"uni.showModal.cancel": "取消",
"uni.showModal.confirm": "确定",
"uni.chooseImage.cancel": "取消",
"uni.chooseImage.sourceType.album": "从相册选择",
"uni.chooseImage.sourceType.camera": "拍摄",
"uni.chooseVideo.cancel": "取消",
"uni.chooseVideo.sourceType.album": "从相册选择",
"uni.chooseVideo.sourceType.camera": "拍摄",
"uni.setClipboardData.success": "内容已复制",
},
"ios": {},
"android": {}
}
```
## manifest.json 国际化@manifest
云打包暂不支持动态调整应用名称的语言。目前只能写死一种语言。
App平台离线打包可自行在原生工程中配置应用的国际化名称。
## info.plist国际化
info.plist中涉及隐私信息访问的许可描述提示文字。
云打包暂时不支持配置许可描述提示文字的国际化配置,后续会提供方法配置。
离线打包可自行在原生XCode工程中配置。
## uniCloud国际化
注:大陆以外的终端用户访问uniCloud,开通阿里云的海外加速后可以提高访问速度。[详见](https://doc.dcloud.net.cn/uniCloud/faq.html#global-accelerate)
### DB Schema 国际化@schema
uniCloud的 DB Schema 中涉及字段的显示名称、错误格式提示语,这些也需要国际化。
在项目根目录 uniCloud/database/locale/{数据库表名}/`语言地区代码`.json 文件,然后在 `*.schema.json` 文件中使用 %% 占位
```
├─uniCloud
│ ├─cloudfunctions
│ └─database
│ │ hello.schema.json
│ └─locale
│ └─hello
│ en.json
│ zh-Hans.json
```
hello.schema.json 文件内容
```json
// 文档教程: https://doc.dcloud.net.cn/uniCloud/schema
{
"bsonType": "object",
"required": [],
"permission": {
"read": false,
"create": false,
"update": false,
"delete": false
},
"properties": {
"_id": {
"description": "ID"
},
"name": {
"bsonType": "string",
"label": "%name%",
"errorMessage": {
"format": "{label}%name.format%"
}
}
}
}
```
en.json 文件内容
```json
{
"name": "Name",
"name.format": " invalid format"
}
```
zh-Hans 文件内容
```json
{
"name": "姓名",
"name.format": "格式无效"
}
```
## App第三方SDK界面的国际化
Web平台 内置支持Google地图。
其他如海外的支付、登录等app sdk,需自行开发插件或去插件市场搜索。
## 语言API
uni-app内置获取os或浏览器语言的API。
- [uni.getSystemInfo](./api/get-system-info.md)
- [uni.getDeviceInfo](./api/get-device-info.md)
Web平台还支持以下更多功能。
Web平台注意要区分系统语言和应用语言的概念。
可以得到设备OS的语言、运行宿主host的语言以及应用自身的语言。
- [uni.getLocale](/api/ui/locale?id=getlocale)
获取应用当前使用的语言
- [uni.setLocale](/api/ui/locale?id=setlocale)
设置应用语言
- [uni.onLocaleChange](/api/ui/locale?id=onlocalechange)
当前应用语言发生变化时,触发回调。也就是`uni.setLocale`执行时。
## 语言代码
语言代码通常为两个或三个字母,参考[ISO 639](https://zh.wikipedia.org/wiki/ISO_639-1%E4%BB%A3%E7%A0%81%E8%A1%A8)规范
语言代码-地区代码,地区代码为两个字母,参考[ISO 3166-2](https://zh.wikipedia.org/wiki/ISO_3166-2)规范