i18n.md 7.8 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 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 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 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 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
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国际化

uni-app x 的部分组件和API涉及界面,框架内置如下5种语言,如果手机os或浏览器语言在这5种内,会自适应。如果不在5种内,会默认为英文。
* 中文简体
* 中文繁体
* 英语
* 法语
* 西班牙语

涉及界面的组件和API包括:
- showModal:默认的确定和取消按钮文字。会根据os和浏览器的语言自适应。也可以在API中通过参数自己指定文字。
- showActionSheet:取消按钮文字。会根据os和浏览器的语言自适应。
- chooseImage和chooseVideo:
	* 打开的相机时是系统相机,跟随系统语言,不受uni-app x内置的5种语言限制。
	* 打开相册时,web平台是浏览器界面,不受uni-app x内置5种语言限制;app平台内置中英文,在这2种中自适应。


### 自定义国际化内容@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

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

离线打包可自行在离线打包工程中配置。

## info.plist国际化

info.plist中涉及隐私弹框时的提示文字。

云打包文档待补充。

离线打包可自行在离线打包工程中配置。

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