i18n.md 8.5 KB
Newer Older
W
wanganxp 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
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
<template>
  <view class="container">
    <view class="title">{{$t('index.title')}}</view>
  </view>
</template>

<script>
  export default {
    data() {
      return {
      }
    }
  }
</script>
```

注意:页面中设置语言后需要调用 `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国际化

141 142 143 144 145 146 147 148 149 150 151 152 153
uni-app x 的部分组件和API涉及界面,框架内置支持的国际化语言,如果手机os或浏览器语言在这些内置国际化语言列表中会自适应。如果不在5种内,会默认为英文。  
- app-Android平台  
	* 中文简体
	* 中文繁体
	* 英语
- app-iOS平台  
	* 中文简体
- web平台  
	* 中文简体
	* 中文繁体
	* 英语
	* 法语
	* 西班牙语
W
wanganxp 已提交
154 155

涉及界面的组件和API包括:
156 157 158 159 160 161 162
- [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内置国际化语言列表限制
W
wanganxp 已提交
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194


### 自定义国际化内容@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.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": "拍摄",
H
hdx 已提交
195
    "uni.setClipboardData.success": "内容已复制"
W
wanganxp 已提交
196 197
  },
  "ios": {},
H
hdx 已提交
198 199 200 201
  "android": {},
  "web": {
    "uni.async.error": "连接服务器超时,点击屏幕重试"
  }
W
wanganxp 已提交
202 203 204 205 206 207 208 209 210
}
```



## manifest.json 国际化@manifest

云打包暂不支持动态调整应用名称的语言。目前只能写死一种语言。

211
App平台离线打包可自行在原生工程中配置应用的国际化名称。
W
wanganxp 已提交
212 213 214

## info.plist国际化

DCloud-yyl's avatar
DCloud-yyl 已提交
215
info.plist中涉及隐私信息访问的许可描述提示文字。
W
wanganxp 已提交
216

DCloud-yyl's avatar
DCloud-yyl 已提交
217
云打包暂时不支持配置许可描述提示文字的国际化配置,后续会提供方法配置。
W
wanganxp 已提交
218

DCloud-yyl's avatar
DCloud-yyl 已提交
219
离线打包可自行在原生XCode工程中配置。
W
wanganxp 已提交
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325

## 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)规范

DCloud-yyl's avatar
DCloud-yyl 已提交
326
语言代码-地区代码,地区代码为两个字母,参考[ISO 3166-2](https://zh.wikipedia.org/wiki/ISO_3166-2)规范