tmui-cli 1.3.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -82
- package/data/components.json +637 -0
- package/data/config.json +169 -0
- package/data/doc-index.json +61 -0
- package/data/docs/alert.md +79 -0
- package/data/docs/avatar-group.md +73 -0
- package/data/docs/badge.md +62 -0
- package/data/docs/between-time.md +76 -0
- package/data/docs/button.md +114 -0
- package/data/docs/calendar-multiple.md +90 -0
- package/data/docs/cell.md +91 -0
- package/data/docs/checkbox-group.md +62 -0
- package/data/docs/checkbox.md +74 -0
- package/data/docs/circle-progress.md +74 -0
- package/data/docs/code-input.md +77 -0
- package/data/docs/col.md +57 -0
- package/data/docs/collapse-item.md +76 -0
- package/data/docs/collapse.md +59 -0
- package/data/docs/countdown.md +79 -0
- package/data/docs/date-view.md +65 -0
- package/data/docs/drawer.md +94 -0
- package/data/docs/dropdown-item.md +68 -0
- package/data/docs/dropdown-menu.md +70 -0
- package/data/docs/echart.md +69 -0
- package/data/docs/float-drawer.md +79 -0
- package/data/docs/form-item.md +67 -0
- package/data/docs/form.md +68 -0
- package/data/docs/html.md +70 -0
- package/data/docs/icon.md +67 -0
- package/data/docs/image.md +73 -0
- package/data/docs/input.md +126 -0
- package/data/docs/modal.md +92 -0
- package/data/docs/money.md +70 -0
- package/data/docs/more.md +69 -0
- package/data/docs/navbar.md +82 -0
- package/data/docs/picker-date.md +75 -0
- package/data/docs/picker-selected.md +75 -0
- package/data/docs/picker-time.md +77 -0
- package/data/docs/picker-view.md +70 -0
- package/data/docs/picker.md +76 -0
- package/data/docs/popover.md +68 -0
- package/data/docs/progress.md +72 -0
- package/data/docs/pull-refresh.md +73 -0
- package/data/docs/radio-group.md +61 -0
- package/data/docs/radio.md +74 -0
- package/data/docs/rate.md +72 -0
- package/data/docs/row.md +61 -0
- package/data/docs/sheet.md +72 -0
- package/data/docs/sign-board.md +61 -0
- package/data/docs/skeleton.md +60 -0
- package/data/docs/sku.md +69 -0
- package/data/docs/slider-double.md +71 -0
- package/data/docs/slider-menu.md +78 -0
- package/data/docs/slider.md +71 -0
- package/data/docs/stepper.md +76 -0
- package/data/docs/steps-item.md +71 -0
- package/data/docs/steps.md +73 -0
- package/data/docs/sticky-header.md +57 -0
- package/data/docs/sticky.md +55 -0
- package/data/docs/switch-slider.md +82 -0
- package/data/docs/switch.md +68 -0
- package/data/docs/tabbar.md +83 -0
- package/data/docs/tabs.md +84 -0
- package/data/docs/tag.md +78 -0
- package/data/docs/text.md +69 -0
- package/data/docs/upload-photo.md +86 -0
- package/data/docs/upload-video.md +86 -0
- package/data/docs//346/250/241/346/235/277.md +47 -0
- package/data/examples/alert.vue +39 -0
- package/data/examples/avatar-group.vue +97 -0
- package/data/examples/badge.vue +87 -0
- package/data/examples/between-time.vue +39 -0
- package/data/examples/button.vue +70 -0
- package/data/examples/calendar-multiple.vue +57 -0
- package/data/examples/cell.vue +39 -0
- package/data/examples/checkbox.vue +71 -0
- package/data/examples/circle-progress.vue +69 -0
- package/data/examples/code-input.vue +36 -0
- package/data/examples/collapse.vue +76 -0
- package/data/examples/countdown.vue +39 -0
- package/data/examples/drawer.vue +138 -0
- package/data/examples/dropdown-menu.vue +59 -0
- package/data/examples/echart.vue +91 -0
- package/data/examples/float-drawer.vue +45 -0
- package/data/examples/form.vue +147 -0
- package/data/examples/html.vue +53 -0
- package/data/examples/icon.vue +65 -0
- package/data/examples/image.vue +38 -0
- package/data/examples/input.vue +66 -0
- package/data/examples/modal.vue +122 -0
- package/data/examples/money.vue +60 -0
- package/data/examples/more.vue +47 -0
- package/data/examples/navbar.vue +68 -0
- package/data/examples/picker-date.vue +53 -0
- package/data/examples/picker-selected.vue +35 -0
- package/data/examples/picker-time.vue +46 -0
- package/data/examples/picker-view.vue +35 -0
- package/data/examples/picker.vue +101 -0
- package/data/examples/popover.vue +130 -0
- package/data/examples/progress.vue +57 -0
- package/data/examples/pull-refresh.vue +41 -0
- package/data/examples/radio.vue +61 -0
- package/data/examples/rate.vue +35 -0
- package/data/examples/row.vue +52 -0
- package/data/examples/sheet.vue +36 -0
- package/data/examples/sign-board.vue +43 -0
- package/data/examples/skeleton.vue +45 -0
- package/data/examples/sku.vue +106 -0
- package/data/examples/slider-menu.vue +65 -0
- package/data/examples/slider.vue +51 -0
- package/data/examples/stepper.vue +44 -0
- package/data/examples/steps.vue +77 -0
- package/data/examples/sticky.vue +46 -0
- package/data/examples/switch-slider.vue +113 -0
- package/data/examples/switch.vue +62 -0
- package/data/examples/tabbar.vue +41 -0
- package/data/examples/tabs.vue +46 -0
- package/data/examples/tag.vue +69 -0
- package/data/examples/text.vue +38 -0
- package/data/examples/upload-photo.vue +39 -0
- package/data/examples/upload-video.vue +29 -0
- package/data/guides/cli.md +110 -0
- package/data/guides//344/273/213/347/273/215.md +34 -0
- package/data/guides//345/205/274/345/256/271/346/200/247.md +41 -0
- package/data/guides//345/215/225/344/275/215/346/240/207/347/255/276/350/257/264/346/230/216.md +22 -0
- package/data/guides//345/233/275/351/231/205/345/214/226.md +454 -0
- package/data/guides//345/256/211/350/243/205.md +103 -0
- package/data/guides//345/260/217/347/250/213/345/272/217/345/210/206/344/272/253.md +34 -0
- package/data/guides//345/270/270/350/247/201/351/227/256/351/242/230.md +102 -0
- package/data/guides//345/277/253/351/200/237/344/270/212/346/211/213.md +191 -0
- package/data/guides//346/233/264/346/226/260/346/227/245/345/277/227.md +155 -0
- package/data/guides//350/264/241/347/214/256/350/200/205.md +97 -0
- package/dist/main.mjs +93 -0
- package/package.json +54 -50
- package/bin/cmdTool.js +0 -229
- package/bin/createTmui.js +0 -383
- package/bin/dirTool.js +0 -152
- package/bin/hooks.js +0 -233
- package/bin/net.js +0 -139
- package/bin/selectedDir.js +0 -28
- package/bin/tmui.js +0 -28
- package/dist/tmui.js +0 -1
- package/webpack.config.js +0 -17
- package/website/css/app.fa961c8f.css +0 -1
- package/website/css/chunk-vendors.4ad1cdb5.css +0 -2
- package/website/favicon.ico +0 -0
- package/website/index.html +0 -1
- package/website/js/app.b68ad484.js +0 -2
- package/website/js/app.b68ad484.js.map +0 -1
- package/website/js/chunk-vendors.d9ea5cfa.js +0 -15
- package/website/js/chunk-vendors.d9ea5cfa.js.map +0 -1
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 关于tmUi3.0的介绍
|
|
3
|
+
---
|
|
4
|
+
<script setup>
|
|
5
|
+
import webview from '../components/mobileWebview.vue'
|
|
6
|
+
import headertips from '../components/headertips.vue'
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<headertips></headertips>
|
|
10
|
+
|
|
11
|
+
##### 关于我 tmui.design
|
|
12
|
+
|
|
13
|
+
# 国际化 (i18n) 使用文档
|
|
14
|
+
|
|
15
|
+
## 概述
|
|
16
|
+
|
|
17
|
+
国际化插件是一个专为 uni-app 设计的多语言解决方案,由于直接安装Vuei18n,在app上是无法使用插值的,因为本插件主要实现的目标是为了全平台统一使用体验。
|
|
18
|
+
|
|
19
|
+
## 快速开始
|
|
20
|
+
|
|
21
|
+
### 1. 安装和配置
|
|
22
|
+
|
|
23
|
+
建议直接导入语言包比如:`ko.json`文件,而不是使用ts模块。最好是json文件包。
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
// main.ts
|
|
27
|
+
import { createApp } from 'vue'
|
|
28
|
+
import App from './App.vue'
|
|
29
|
+
import tmui from '@/uni_modules/tm-ui'
|
|
30
|
+
|
|
31
|
+
const app = createApp(App)
|
|
32
|
+
|
|
33
|
+
// 配置 TMUI
|
|
34
|
+
app.use(tmui, {
|
|
35
|
+
i18n: {
|
|
36
|
+
locale: 'zh-Hans',
|
|
37
|
+
fallbackLocale: 'en',
|
|
38
|
+
messages: {
|
|
39
|
+
'zh-Hans': {
|
|
40
|
+
welcome: '欢迎使用 TMUI',
|
|
41
|
+
hello: '你好,{name}!',
|
|
42
|
+
count: '你有 {count} 条消息 | 你有 {count} 条消息'
|
|
43
|
+
},
|
|
44
|
+
'en': {
|
|
45
|
+
welcome: 'Welcome to TMUI',
|
|
46
|
+
hello: 'Hello, {name}!',
|
|
47
|
+
count: 'You have {count} message | You have {count} messages'
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
app.mount('#app')
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 2. 基本使用
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import {$i18n} from "@/uni_modules/tm-ui"
|
|
60
|
+
// 在任何组件中使用
|
|
61
|
+
export default {
|
|
62
|
+
mounted() {
|
|
63
|
+
// 基础翻译
|
|
64
|
+
console.log($i18n.t('welcome'))
|
|
65
|
+
|
|
66
|
+
// 带参数的翻译
|
|
67
|
+
console.log($i18n.t('hello', { name: 'World' }))
|
|
68
|
+
|
|
69
|
+
// 复数形式
|
|
70
|
+
console.log($i18n.t('count', 1)) // 单数
|
|
71
|
+
console.log($i18n.t('count', 5)) // 复数
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## API 参考
|
|
77
|
+
|
|
78
|
+
### 核心方法
|
|
79
|
+
|
|
80
|
+
#### `t(key, ...args)` - 翻译方法
|
|
81
|
+
|
|
82
|
+
主要的翻译方法,支持多种参数格式:
|
|
83
|
+
|
|
84
|
+
导入:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import {$i18n} from "@/uni_modules/tm-ui"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// 基础翻译
|
|
92
|
+
$i18n.t('welcome')
|
|
93
|
+
|
|
94
|
+
// 带插值参数
|
|
95
|
+
$i18n.t('hello', { name: 'Alice' })
|
|
96
|
+
|
|
97
|
+
// 复数形式
|
|
98
|
+
$i18n.t('count', 1) // 单数
|
|
99
|
+
$i18n.t('count', 5) // 复数
|
|
100
|
+
|
|
101
|
+
// 指定语言
|
|
102
|
+
$i18n.t('welcome', 'en')
|
|
103
|
+
|
|
104
|
+
// 复数 + 插值参数
|
|
105
|
+
$i18n.t('count', 3, { count: 3 })
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
#### `n(value, formatName?, options?)` - 数字格式化
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
// 基础数字格式化
|
|
112
|
+
$i18n.n(1234.56) // "1234.56"
|
|
113
|
+
|
|
114
|
+
// 货币格式化
|
|
115
|
+
$i18n.n(1234.56, null, {
|
|
116
|
+
style: 'currency',
|
|
117
|
+
currency: 'CNY',
|
|
118
|
+
local: 'zh-CN'
|
|
119
|
+
}) // "¥1,234.56"
|
|
120
|
+
|
|
121
|
+
// 百分比格式化
|
|
122
|
+
$i18n.n(0.1234, null, {
|
|
123
|
+
style: 'percent',
|
|
124
|
+
local: 'zh-CN'
|
|
125
|
+
}) // "12.34%"
|
|
126
|
+
|
|
127
|
+
// 使用预定义格式
|
|
128
|
+
$i18n.n(1234.56, 'currency') // 使用预定义的货币格式
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### `d(value, formatName?, options?)` - 日期时间格式化
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// 基础日期格式化
|
|
135
|
+
$i18n.d(new Date()) // "2025-1-15"
|
|
136
|
+
|
|
137
|
+
// 使用预定义样式
|
|
138
|
+
$i18n.d(new Date(), null, {
|
|
139
|
+
dateStyle: 'full',
|
|
140
|
+
local: 'zh-CN'
|
|
141
|
+
}) // "2025年1月15日 星期三"
|
|
142
|
+
|
|
143
|
+
// 自定义格式
|
|
144
|
+
$i18n.d(new Date(), null, {
|
|
145
|
+
year: 'numeric',
|
|
146
|
+
month: 'long',
|
|
147
|
+
day: 'numeric',
|
|
148
|
+
local: 'zh-CN'
|
|
149
|
+
}) // "2025年一月15日"
|
|
150
|
+
|
|
151
|
+
// 时间格式化
|
|
152
|
+
$i18n.d(new Date(), null, {
|
|
153
|
+
hour: '2-digit',
|
|
154
|
+
minute: '2-digit',
|
|
155
|
+
second: '2-digit',
|
|
156
|
+
local: 'zh-CN'
|
|
157
|
+
}) // "14:30:25"
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
#### `rt(timeValue, unit?, locale?)` - 相对时间
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
// 相对时间格式化
|
|
164
|
+
$i18n.rt(Date.now() - 60000, 'minute') // "1分钟前"
|
|
165
|
+
$i18n.rt(Date.now() + 3600000, 'hour') // "1小时后"
|
|
166
|
+
|
|
167
|
+
// 智能单位选择
|
|
168
|
+
$i18n.rt(Date.now() - 7200000) // 自动选择最合适的单位
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 语言管理
|
|
172
|
+
|
|
173
|
+
#### `setLocale(locale)` - 设置语言
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
// 切换语言
|
|
177
|
+
$i18n.setLocale('en')
|
|
178
|
+
$i18n.setLocale('zh-Hans')
|
|
179
|
+
$i18n.setLocale('ja')
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
#### `getLocale()` - 获取当前语言
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
const currentLang = $i18n.getLocale()
|
|
186
|
+
console.log(currentLang) // "zh-Hans"
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
#### `mergeLocaleMessage(locale, messages)` - 动态添加语言
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
// 动态添加新的翻译内容
|
|
193
|
+
$i18n.mergeLocaleMessage('zh-Hans', {
|
|
194
|
+
newKey: '新的翻译内容',
|
|
195
|
+
nested: {
|
|
196
|
+
key: '嵌套的翻译'
|
|
197
|
+
}
|
|
198
|
+
})
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
#### `te(key, locale?)` - 检查翻译键是否存在
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
// 检查翻译键是否存在
|
|
205
|
+
if ($i18n.te('welcome')) {
|
|
206
|
+
console.log('翻译键存在')
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// 检查特定语言的翻译键
|
|
210
|
+
if ($i18n.te('welcome', 'en')) {
|
|
211
|
+
console.log('英文翻译键存在')
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
#### `availableLocales()` - 获取可用语言列表
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
const locales = $i18n.availableLocales()
|
|
219
|
+
console.log(locales) // ["zh-Hans", "en", "ja"]
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## 高级功能
|
|
223
|
+
|
|
224
|
+
### 复数规则
|
|
225
|
+
|
|
226
|
+
支持自定义复数规则:
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
// 在配置中设置复数规则
|
|
230
|
+
app.use(tmui, {
|
|
231
|
+
i18n: {
|
|
232
|
+
pluralRule: (choice, choicesLength) => {
|
|
233
|
+
// 中文复数规则
|
|
234
|
+
if (choice === 0) return 0
|
|
235
|
+
if (choice === 1) return 1
|
|
236
|
+
return 2
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
// 使用复数
|
|
242
|
+
const message = $i18n.t('count', 0) // 零
|
|
243
|
+
const message = $i18n.t('count', 1) // 单数
|
|
244
|
+
const message = $i18n.t('count', 5) // 复数
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### 字符串插值
|
|
248
|
+
|
|
249
|
+
支持多种插值方式:
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
// 命名插值
|
|
253
|
+
$i18n.t('hello', { name: 'Alice', age: 25 })
|
|
254
|
+
|
|
255
|
+
// 位置插值
|
|
256
|
+
$i18n.t('welcome', ['World', 'TMUI'])
|
|
257
|
+
|
|
258
|
+
// 混合使用
|
|
259
|
+
$i18n.t('info', { name: 'Alice' })
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### 数字格式化选项
|
|
263
|
+
|
|
264
|
+
完整的数字格式化配置:
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
$i18n.n(1234.56, null, {
|
|
268
|
+
style: 'currency', // 样式:decimal, currency, percent
|
|
269
|
+
currency: 'CNY', // 货币代码
|
|
270
|
+
local: 'zh-CN', // 语言代码
|
|
271
|
+
currencyDisplay: 'symbol', // 货币显示方式
|
|
272
|
+
useGrouping: true, // 使用千分位分隔符
|
|
273
|
+
minimumIntegerDigits: 1, // 最小整数位数
|
|
274
|
+
minimumFractionDigits: 2, // 最小小数位数
|
|
275
|
+
maximumFractionDigits: 2 // 最大小数位数
|
|
276
|
+
})
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### 日期时间格式化选项
|
|
280
|
+
|
|
281
|
+
丰富的日期时间格式化配置:
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
$i18n.d(new Date(), null, {
|
|
285
|
+
local: 'zh-CN', // 语言代码
|
|
286
|
+
calendar: 'gregory', // 日历系统
|
|
287
|
+
timeZone: 'Asia/Shanghai', // 时区
|
|
288
|
+
hour12: false, // 12小时制
|
|
289
|
+
dateStyle: 'full', // 日期样式
|
|
290
|
+
timeStyle: 'medium', // 时间样式
|
|
291
|
+
weekday: 'long', // 星期显示
|
|
292
|
+
year: 'numeric', // 年份显示
|
|
293
|
+
month: 'long', // 月份显示
|
|
294
|
+
day: 'numeric', // 日期显示
|
|
295
|
+
hour: '2-digit', // 小时显示
|
|
296
|
+
minute: '2-digit', // 分钟显示
|
|
297
|
+
second: '2-digit' // 秒显示
|
|
298
|
+
})
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## 配置选项
|
|
302
|
+
|
|
303
|
+
### 完整配置示例
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
app.use(tmui, {
|
|
307
|
+
language: 'zh-Hans',
|
|
308
|
+
i18n: {
|
|
309
|
+
locale: 'zh-Hans', // 当前语言
|
|
310
|
+
fallbackLocale: 'en', // 回退语言
|
|
311
|
+
messages: {}, // 翻译消息
|
|
312
|
+
datetimeFormats: new Map(), // 日期时间格式
|
|
313
|
+
numberFormats: new Map(), // 数字格式
|
|
314
|
+
modifiers: new Map(), // 字符串修饰器
|
|
315
|
+
pluralRules: new Map(), // 复数规则
|
|
316
|
+
missing: null, // 缺失翻译处理函数
|
|
317
|
+
missingWarn: true, // 缺失翻译警告
|
|
318
|
+
fallbackWarn: true, // 回退语言警告
|
|
319
|
+
fallbackRoot: true, // 回退到根实例
|
|
320
|
+
fallbackFormat: false, // 回退格式化
|
|
321
|
+
unresolving: true, // 允许未解析的翻译键
|
|
322
|
+
postTranslation: null, // 翻译后处理函数
|
|
323
|
+
warnHtmlMessage: true, // HTML消息警告
|
|
324
|
+
escapeParameter: true, // 转义参数
|
|
325
|
+
inheritLocale: true, // 继承父级语言设置
|
|
326
|
+
warnHandler: (msg, err) => {}, // 警告处理器
|
|
327
|
+
pluralRule: null, // 默认复数规则
|
|
328
|
+
globalInjection: true, // 全局注入
|
|
329
|
+
allowComposition: true, // 允许组合式API
|
|
330
|
+
legacy: true // 遗留模式
|
|
331
|
+
}
|
|
332
|
+
})
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
## 最佳实践
|
|
336
|
+
|
|
337
|
+
### 1. 语言文件组织
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
// 按模块组织翻译文件
|
|
341
|
+
const messages = {
|
|
342
|
+
'zh-Hans': {
|
|
343
|
+
common: {
|
|
344
|
+
confirm: '确认',
|
|
345
|
+
cancel: '取消',
|
|
346
|
+
save: '保存'
|
|
347
|
+
},
|
|
348
|
+
user: {
|
|
349
|
+
profile: '个人资料',
|
|
350
|
+
settings: '设置'
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### 2. 动态语言切换
|
|
357
|
+
|
|
358
|
+
```typescript
|
|
359
|
+
// 语言切换函数
|
|
360
|
+
function changeLanguage(locale: string) {
|
|
361
|
+
$i18n.setLocale(locale)
|
|
362
|
+
// 保存到本地存储
|
|
363
|
+
uni.setStorageSync('language', locale)
|
|
364
|
+
// 触发页面刷新或重新渲染
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### 3. 错误处理
|
|
369
|
+
|
|
370
|
+
```typescript
|
|
371
|
+
// 自定义缺失翻译处理
|
|
372
|
+
app.use(tmui, {
|
|
373
|
+
i18n: {
|
|
374
|
+
missing: (locale, key) => {
|
|
375
|
+
console.warn(`Missing translation: ${locale}.${key}`)
|
|
376
|
+
return `[${key}]` // 返回键名作为占位符
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
})
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### 4. 性能优化
|
|
383
|
+
|
|
384
|
+
```typescript
|
|
385
|
+
// 预加载语言包
|
|
386
|
+
const preloadLanguages = ['en', 'ja', 'ko']
|
|
387
|
+
preloadLanguages.forEach(locale => {
|
|
388
|
+
// 异步加载语言包
|
|
389
|
+
import(`./locales/${locale}.json`).then(messages => {
|
|
390
|
+
$i18n.mergeLocaleMessage(locale, messages.default)
|
|
391
|
+
})
|
|
392
|
+
})
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## 常见问题
|
|
396
|
+
|
|
397
|
+
### Q: 如何支持新的语言?
|
|
398
|
+
|
|
399
|
+
A: 使用 `mergeLocaleMessage` 方法动态添加:
|
|
400
|
+
|
|
401
|
+
```typescript
|
|
402
|
+
$i18n.mergeLocaleMessage('fr', {
|
|
403
|
+
welcome: 'Bienvenue',
|
|
404
|
+
hello: 'Bonjour, {name}!'
|
|
405
|
+
})
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Q: 如何处理复数形式的翻译?
|
|
409
|
+
|
|
410
|
+
A: 使用 `|` 分隔符:
|
|
411
|
+
|
|
412
|
+
```typescript
|
|
413
|
+
// 翻译文件
|
|
414
|
+
{
|
|
415
|
+
"count": "你有 {count} 条消息 | 你有 {count} 条消息"
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// 使用
|
|
419
|
+
$i18n.t('count', 1) // "你有 1 条消息"
|
|
420
|
+
$i18n.t('count', 5) // "你有 5 条消息"
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Q: 如何格式化货币?
|
|
424
|
+
|
|
425
|
+
A: 使用 `n` 方法配合货币选项:
|
|
426
|
+
|
|
427
|
+
```typescript
|
|
428
|
+
$i18n.n(1234.56, null, {
|
|
429
|
+
style: 'currency',
|
|
430
|
+
currency: 'CNY',
|
|
431
|
+
local: 'zh-CN'
|
|
432
|
+
})
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Q: 如何获取相对时间?
|
|
436
|
+
|
|
437
|
+
A: 使用 `rt` 方法:
|
|
438
|
+
|
|
439
|
+
```typescript
|
|
440
|
+
$i18n.rt(Date.now() - 60000, 'minute') // "1分钟前"
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
## 更新日志
|
|
444
|
+
|
|
445
|
+
- **v1.0.0** - 初始版本,支持基础翻译功能
|
|
446
|
+
|
|
447
|
+
## 技术支持
|
|
448
|
+
|
|
449
|
+
如有问题或建议,请访问:
|
|
450
|
+
- 官方网站:https://tmui.design
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
*本文档基于 TMUI4x v1.3.0 版本编写*
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# TMUI3.2Vue版
|
|
2
|
+
|
|
3
|
+
## uniappx混合开发使用
|
|
4
|
+
|
|
5
|
+
详见[混合开发指南](https://xui.tmui.design/70.混合开发/07.TMUI3.2组件库.md);
|
|
6
|
+
|
|
7
|
+
内置了tmuijssdk.js插件可轻松调用uniappx中的方法。
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## vue项目中使用
|
|
11
|
+
|
|
12
|
+
仅作为你web vue 移动端使用。
|
|
13
|
+
|
|
14
|
+
一、复制tmui3.2 vue组件
|
|
15
|
+
|
|
16
|
+
从demo代码仓库中下载好tm-ui vue组件包。复制到你的项目目录`根目录/src/components/tm-ui`位置即可。
|
|
17
|
+
|
|
18
|
+
二、引用
|
|
19
|
+
|
|
20
|
+
在你的`src/main.ts`中如下配置
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
|
|
24
|
+
import { createApp } from 'vue'
|
|
25
|
+
// @ts-ignore
|
|
26
|
+
import './style.css'
|
|
27
|
+
import App from './App.vue'
|
|
28
|
+
//必须安装
|
|
29
|
+
import { createPinia } from 'pinia'
|
|
30
|
+
//必须安装
|
|
31
|
+
import router from './router'
|
|
32
|
+
// 引入组件包
|
|
33
|
+
import tmui from './components/tm-ui'
|
|
34
|
+
|
|
35
|
+
const app = createApp(App)
|
|
36
|
+
app.use(createPinia())
|
|
37
|
+
app.use(router)
|
|
38
|
+
// 最后引用安装好。
|
|
39
|
+
app.use(tmui)
|
|
40
|
+
app.mount('#app')
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
三、配置tsconfig
|
|
46
|
+
|
|
47
|
+
为了有类型提示,你还需要配置tsconfig来获得类型提示
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
|
|
51
|
+
{
|
|
52
|
+
...
|
|
53
|
+
"compilerOptions": {
|
|
54
|
+
...
|
|
55
|
+
// 包含类型定义文件
|
|
56
|
+
"typeRoots": ["./components/tm-ui"],
|
|
57
|
+
...
|
|
58
|
+
},
|
|
59
|
+
"include": [
|
|
60
|
+
"components/tm-ui/*.ts",
|
|
61
|
+
"components/tm-ui/**/*.ts",
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
四、配置vite.config.ts
|
|
69
|
+
|
|
70
|
+
为了让组件内可以使用view,rpx,uni.方法标签你需要配置我开发的vite插件以此来适配。tmui3.2
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import { defineConfig } from 'vite'
|
|
74
|
+
import vue from '@vitejs/plugin-vue'
|
|
75
|
+
//引入tmui中的插件
|
|
76
|
+
import tmuiVitePlugin from './src/components/tm-ui/vitePlugin'
|
|
77
|
+
|
|
78
|
+
// https://vite.dev/config/
|
|
79
|
+
export default defineConfig({
|
|
80
|
+
server:{
|
|
81
|
+
port:3000,
|
|
82
|
+
},
|
|
83
|
+
plugins: [
|
|
84
|
+
vue(),
|
|
85
|
+
// 配置插件,兼容rpx,view标签或者单位。
|
|
86
|
+
muiVitePlugin()
|
|
87
|
+
],
|
|
88
|
+
resolve: {
|
|
89
|
+
alias: {
|
|
90
|
+
// 配置 Vue 别名为包含模板编译器的版本,主要是兼容编译tmui3.2
|
|
91
|
+
'vue': 'vue/dist/vue.esm-bundler.js'
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 自带的全局方法
|
|
100
|
+
|
|
101
|
+
可以在引用组件库后可全局使用
|
|
102
|
+
|
|
103
|
+
```uni.方法```使用有关方法,只是部分映射了,注意里面有两个方法是特殊的。
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 关于3.0小程序分享
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
##### 开发指南 tmui.design
|
|
6
|
+
|
|
7
|
+
# 小程序分享 <Badge type="danger" text="v3.0.63+" vertical="middle" />
|
|
8
|
+
本UI框架,已经自定义混洧了分享函数在默认的hook中,默认是关闭的。可以通过全局的配置设置```shareDisable:false```来开启全局分享功能。
|
|
9
|
+
开启后无法修改分享内容。如果想修改分享内容见下方配置。
|
|
10
|
+
|
|
11
|
+
## 阻止分享
|
|
12
|
+
|
|
13
|
+
全局的配置设置```shareDisable:true```
|
|
14
|
+
|
|
15
|
+
## 自定分享内容
|
|
16
|
+
要自定分享,请先关闭全局的分享设置(默认已经关闭)
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import {onLoad } from "@dcloudio/uni-app";
|
|
20
|
+
import { share } from "@/tmui/tool/lib/share";
|
|
21
|
+
const { onShareAppMessage, setShareApp, setShareTime, onShareTimeline } = share();
|
|
22
|
+
onShareAppMessage();
|
|
23
|
+
onShareTimeline()
|
|
24
|
+
//config是分享配置,可以不填写。如果填写了配置分享时的配置将以你的自定义为主。
|
|
25
|
+
//请注意一定要在onReady或者onLoad中使用,切不可直接在setup中调用,会无法修改的.
|
|
26
|
+
//请参见:https://github.com/dcloudio/uni-app/issues/3990
|
|
27
|
+
onLoad(() => {
|
|
28
|
+
//可以在任何异步中设置,不一定要在onload中。分享是可以返回Promise的。
|
|
29
|
+
setShareApp(config)
|
|
30
|
+
setShareTime(config)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 关于3.0 常见问题
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
##### 开发指南 tmui.design
|
|
6
|
+
|
|
7
|
+
## 微信小程序样式问题
|
|
8
|
+
|
|
9
|
+
mainset.json中
|
|
10
|
+
各个平台比如:mp-weixin,mp-alipay节点下加入:
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
scopedSlotsCompiler:true,
|
|
15
|
+
mergeVirtualHostAttributes:true,
|
|
16
|
+
slotMultipleInstance:true,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
这样就解决了样式的问题了,主要是这样配置可以减少组件节点数量,让样式可以穿透到组件根节点上。
|
|
21
|
+
|
|
22
|
+
## 常见问题
|
|
23
|
+
这里列举了经常遇到的uniapp的常见问题,可能不是我框架的问题。而是uniapp自身兼容问题,亦或者是你自身知识储备问题,对uniapp开发不够了解造成的。
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
::: details 编译到app时,提示sdk版本不一致?
|
|
27
|
+
1、如果喜欢hbx编译。按照教程,创建hbx项目,然后编译的时候,自动使用hbx的内置sdk。这样hbx和sdk版本号自动对齐。
|
|
28
|
+
2、坚持使用cli的版本号,但用hbx编译的。检查hbx版本号,依照提示你是正式版本418。但sdk是默认的alpha 313。解决方案是升级sdk 至350把hbx升级到350 alpha再编译。
|
|
29
|
+
:::
|
|
30
|
+
|
|
31
|
+
::: details 按照教程cli运行不起来?
|
|
32
|
+
运行不起来的原因有很多,我只列举你可能出现的问题!<br>
|
|
33
|
+
1、电脑是否安装了nodejs npm环境。我目前默认的是node14.18.2 npm6.14.15,[下载node](https://mirrors.aliyun.com/nodejs-release/v14.18.2/),[安装nodejs教程](https://blog.csdn.net/Small_Yogurt/article/details/104968169)<br>
|
|
34
|
+
2、你的hbx版本是否是3.4.15+<br>
|
|
35
|
+
3、下载完cli后,是否在根目录执行了npm install<br>
|
|
36
|
+
:::
|
|
37
|
+
|
|
38
|
+
::: details NVUE编译是提示break-wrod
|
|
39
|
+
因uniapp条件编译中无法区分安卓还是苹果系统。但break-word断行样式是除安卓下都支持。因为此编译警告提示,无法消除,除非你不用断行这个功能。
|
|
40
|
+
:::
|
|
41
|
+
|
|
42
|
+
::: details 支付宝小程序不支持动态修改主题和暗黑
|
|
43
|
+
因为目前截止3.5.0 sdk官方还未支持在支付宝中使用pinia插件。因此支付宝中无法使用动态修改功能。但
|
|
44
|
+
我们可以有其它方法实现:修改后热重启下应用即可实现。其它的静态设置主题不受影响。
|
|
45
|
+
:::
|
|
46
|
+
|
|
47
|
+
::: details 部分安卓机在nvue原生渲染时非常缓慢
|
|
48
|
+
经过实际测试,确实有部分手机缓慢。究其原因是这部分手机对于在nvue上渲染icon图标性能不稳定造成。解决方案是字体图标改成图片图标。
|
|
49
|
+
:::
|
|
50
|
+
|
|
51
|
+
::: details HBX不能创建TS项目
|
|
52
|
+
截止目前版本3.5.0,官方还未能添加可视化创建ts项目的nvue项目功能。因此请按照我的教程创建项目。
|
|
53
|
+
:::
|
|
54
|
+
|
|
55
|
+
::: details HBX编译至内置浏览器不显示且空白
|
|
56
|
+
这是因为截止目前版本3.5.0版本,hbx内置浏览器内核版本过于老旧,不支持原生的ejs module造成的,请编译至外部edge,chrome浏览器等预览
|
|
57
|
+
:::
|
|
58
|
+
|
|
59
|
+
::: details 编译布局错乱
|
|
60
|
+
目前使用3.5.0版本编译错乱,请更新版本至3.6.2+以上,解决。原因是uni此版本sdk自身bug造成。<br>
|
|
61
|
+
有时开发编译时,时而正常时而不正常。这是编译缓存问题,强制关闭基座,重启即可。或者重新编译下。
|
|
62
|
+
:::
|
|
63
|
+
|
|
64
|
+
::: details 按照教程安装后编译时提示isCustomElement等错误
|
|
65
|
+
因为我的组件库默认是需要自己引入组件到页面。请检查是否引入组件。你也可以全局引入组件,免去单个引入(方法见安装步骤中的教程)
|
|
66
|
+
:::
|
|
67
|
+
|
|
68
|
+
::: details 编译后console报...?,?.等错误
|
|
69
|
+
这是因为你的浏览器不支持es6,请把你的浏览器更新至最新版本。建议chrome,edge。
|
|
70
|
+
:::
|
|
71
|
+
|
|
72
|
+
::: details 用flex布局,想要一排显示,固定一个宽度,另一个自动100%宽度?
|
|
73
|
+
请使用标准的布局方法如下:
|
|
74
|
+
```ts
|
|
75
|
+
<view class="flex flex-row">
|
|
76
|
+
<view style="width:100rpx"><text>1</text></view>
|
|
77
|
+
<view class="flex-1" style="width:0px"><text>2</text></view>
|
|
78
|
+
</view>
|
|
79
|
+
```
|
|
80
|
+
:::
|
|
81
|
+
|
|
82
|
+
::: details 怎么布局100%宽度?
|
|
83
|
+
因在nvue中默认是flex布局,默认就100%的宽度。但如果你row中想100%,如下:
|
|
84
|
+
```ts
|
|
85
|
+
<view class="flex flex-row">
|
|
86
|
+
<view class="flex-1"><text>这会占据一行的100%</text></view>
|
|
87
|
+
</view>
|
|
88
|
+
```
|
|
89
|
+
:::
|
|
90
|
+
|
|
91
|
+
::: details 怎么布局100%高度?
|
|
92
|
+
因在nvue中默认是flex布局,默认就100%的宽度。但如果你row中想100%,如下:
|
|
93
|
+
```ts
|
|
94
|
+
<view class="flex flex-col" style="height:100rpx">
|
|
95
|
+
<view class="flex-1"><text>这里的元素的高度自动撑开到父的高度100%</text></view>
|
|
96
|
+
</view>
|
|
97
|
+
```
|
|
98
|
+
:::
|
|
99
|
+
|
|
100
|
+
::: details 为什么我文本各平台显示不一致?
|
|
101
|
+
任何地方要显示文本请使用tm-text组件,以此在各平台表现一致的效果。
|
|
102
|
+
:::
|