tang-ui-x 1.1.1 → 1.1.2
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 +1003 -0
- package/components/TActionSheet/index.uvue +15 -2
- package/components/TCollapse/index.uvue +1 -1
- package/components/TCollapse/type.uts +3 -1
- package/components/TCollapseItem/index.uvue +22 -26
- package/components/TDialog/index.uvue +19 -4
- package/components/TEmpty/index.uvue +28 -14
- package/components/TForm/index.uvue +30 -9
- package/components/TForm/type.uts +4 -0
- package/components/TInput/index.uvue +24 -5
- package/components/TInput/type.uts +10 -0
- package/components/TPicker/index.uvue +26 -6
- package/components/TSearchBar/index.uvue +19 -4
- package/composables/i18n/error.uts +82 -0
- package/composables/i18n/index.uts +188 -0
- package/composables/i18n/manager-demo.uts +104 -0
- package/composables/i18n/manager.test.uts +182 -0
- package/composables/i18n/manager.uts +336 -0
- package/composables/i18n/register-demo.uts +125 -0
- package/composables/i18n/task22-verification.uts +198 -0
- package/composables/i18n/task23-verification.uts +343 -0
- package/composables/i18n/task8-demo.uts +93 -0
- package/composables/i18n/task8-verification.uts +98 -0
- package/composables/i18n/test-task23.uts +9 -0
- package/composables/i18n/types.uts +46 -0
- package/composables/i18n/useI18n-verification.uts +105 -0
- package/composables/i18n/validation-demo.uts +45 -0
- package/composables/i18n/validation-test.uts +106 -0
- package/composables/useI18n.uts +77 -0
- package/index.uts +23 -0
- package/locales/cross-platform-verification.uts +510 -0
- package/locales/en-US/actionSheet.json +3 -0
- package/locales/en-US/common.json +10 -0
- package/locales/en-US/dialog.json +5 -0
- package/locales/en-US/empty.json +5 -0
- package/locales/en-US/errorState.json +5 -0
- package/locales/en-US/examplePages.json +1236 -0
- package/locales/en-US/examples.json +218 -0
- package/locales/en-US/form.json +11 -0
- package/locales/en-US/input.json +3 -0
- package/locales/en-US/list.json +5 -0
- package/locales/en-US/loading.json +3 -0
- package/locales/en-US/navBar.json +4 -0
- package/locales/en-US/noticeBar.json +3 -0
- package/locales/en-US/picker.json +5 -0
- package/locales/en-US/searchBar.json +4 -0
- package/locales/en-US/textarea.json +3 -0
- package/locales/en-US/toast.json +6 -0
- package/locales/index.uts +79 -0
- package/locales/init-verification.uts +101 -0
- package/locales/loader.uts +251 -0
- package/locales/run-verification.uts +16 -0
- package/locales/zh-CN/actionSheet.json +3 -0
- package/locales/zh-CN/common.json +10 -0
- package/locales/zh-CN/dialog.json +5 -0
- package/locales/zh-CN/empty.json +5 -0
- package/locales/zh-CN/errorState.json +5 -0
- package/locales/zh-CN/examplePages.json +1236 -0
- package/locales/zh-CN/examples.json +218 -0
- package/locales/zh-CN/form.json +11 -0
- package/locales/zh-CN/input.json +3 -0
- package/locales/zh-CN/list.json +5 -0
- package/locales/zh-CN/loading.json +3 -0
- package/locales/zh-CN/navBar.json +4 -0
- package/locales/zh-CN/noticeBar.json +3 -0
- package/locales/zh-CN/picker.json +5 -0
- package/locales/zh-CN/searchBar.json +4 -0
- package/locales/zh-CN/textarea.json +3 -0
- package/locales/zh-CN/toast.json +6 -0
- package/locales/zh-TW/actionSheet.json +3 -0
- package/locales/zh-TW/common.json +8 -0
- package/locales/zh-TW/dialog.json +5 -0
- package/locales/zh-TW/empty.json +5 -0
- package/locales/zh-TW/errorState.json +5 -0
- package/locales/zh-TW/examplePages.json +705 -0
- package/locales/zh-TW/examples.json +218 -0
- package/locales/zh-TW/form.json +11 -0
- package/locales/zh-TW/input.json +3 -0
- package/locales/zh-TW/list.json +5 -0
- package/locales/zh-TW/loading.json +3 -0
- package/locales/zh-TW/navBar.json +4 -0
- package/locales/zh-TW/noticeBar.json +3 -0
- package/locales/zh-TW/picker.json +5 -0
- package/locales/zh-TW/searchBar.json +4 -0
- package/locales/zh-TW/textarea.json +3 -0
- package/locales/zh-TW/toast.json +6 -0
- package/package.json +2 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON 结构验证演示
|
|
3
|
+
* 展示 validateMessages 方法的工作原理
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { registerLocale, registerLocaleWithMode, replaceLocale } from './index.uts'
|
|
7
|
+
import type { ModularLocaleMessages } from './types.uts'
|
|
8
|
+
|
|
9
|
+
console.log('=== JSON 结构验证演示 ===\n')
|
|
10
|
+
|
|
11
|
+
// 示例 1: 有效的语言包
|
|
12
|
+
console.log('1. 注册有效的语言包')
|
|
13
|
+
const validMessages: ModularLocaleMessages = {
|
|
14
|
+
common: {
|
|
15
|
+
confirm: '确定',
|
|
16
|
+
cancel: '取消'
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
registerLocale('demo-valid', validMessages)
|
|
20
|
+
console.log('✓ 成功\n')
|
|
21
|
+
|
|
22
|
+
// 示例 2: 无效的语言包(null)
|
|
23
|
+
console.log('2. 尝试注册 null')
|
|
24
|
+
registerLocale('demo-null', null as any)
|
|
25
|
+
console.log('✗ 应该被拒绝\n')
|
|
26
|
+
|
|
27
|
+
// 示例 3: 无效的模块
|
|
28
|
+
console.log('3. 尝试注册无效模块')
|
|
29
|
+
const invalidModule: any = {
|
|
30
|
+
common: 'not an object'
|
|
31
|
+
}
|
|
32
|
+
registerLocale('demo-invalid-module', invalidModule)
|
|
33
|
+
console.log('✗ 应该被拒绝\n')
|
|
34
|
+
|
|
35
|
+
// 示例 4: 无效的键值
|
|
36
|
+
console.log('4. 尝试注册无效键值')
|
|
37
|
+
const invalidValue: any = {
|
|
38
|
+
common: {
|
|
39
|
+
confirm: 123
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
registerLocale('demo-invalid-value', invalidValue)
|
|
43
|
+
console.log('✗ 应该被拒绝\n')
|
|
44
|
+
|
|
45
|
+
console.log('=== 演示完成 ===')
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 验证 JSON 结构验证功能
|
|
3
|
+
* 测试 validateMessages 方法的各种场景
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { I18nManager } from './manager.uts'
|
|
7
|
+
import type { ModularLocaleMessages } from './types.uts'
|
|
8
|
+
|
|
9
|
+
console.log('=== JSON 结构验证测试 ===\n')
|
|
10
|
+
|
|
11
|
+
const manager = I18nManager.getInstance()
|
|
12
|
+
|
|
13
|
+
// 测试 1: 有效的语言包结构
|
|
14
|
+
console.log('测试 1: 有效的语言包结构')
|
|
15
|
+
const validMessages: ModularLocaleMessages = {
|
|
16
|
+
common: {
|
|
17
|
+
confirm: '确定',
|
|
18
|
+
cancel: '取消'
|
|
19
|
+
},
|
|
20
|
+
dialog: {
|
|
21
|
+
title: '提示'
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
manager.registerMessages('test-valid', validMessages)
|
|
25
|
+
console.log('✓ 有效语言包注册成功')
|
|
26
|
+
console.log('可用语言:', manager.getAvailableLocales().value)
|
|
27
|
+
console.log('')
|
|
28
|
+
|
|
29
|
+
// 测试 2: 无效的语言包(null)
|
|
30
|
+
console.log('测试 2: 无效的语言包(null)')
|
|
31
|
+
try {
|
|
32
|
+
manager.registerMessages('test-null', null as any)
|
|
33
|
+
console.log('✗ 应该拒绝 null 语言包')
|
|
34
|
+
} catch (e) {
|
|
35
|
+
console.log('✓ 正确拒绝 null 语言包')
|
|
36
|
+
}
|
|
37
|
+
console.log('')
|
|
38
|
+
|
|
39
|
+
// 测试 3: 无效的语言包(数组)
|
|
40
|
+
console.log('测试 3: 无效的语言包(数组)')
|
|
41
|
+
manager.registerMessages('test-array', [] as any)
|
|
42
|
+
console.log('检查是否注册:', manager.hasLocale('test-array'))
|
|
43
|
+
console.log('')
|
|
44
|
+
|
|
45
|
+
// 测试 4: 无效的模块(不是对象)
|
|
46
|
+
console.log('测试 4: 无效的模块(不是对象)')
|
|
47
|
+
const invalidModule: any = {
|
|
48
|
+
common: 'not an object'
|
|
49
|
+
}
|
|
50
|
+
manager.registerMessages('test-invalid-module', invalidModule)
|
|
51
|
+
console.log('检查是否注册:', manager.hasLocale('test-invalid-module'))
|
|
52
|
+
console.log('')
|
|
53
|
+
|
|
54
|
+
// 测试 5: 无效的键值(不是字符串)
|
|
55
|
+
console.log('测试 5: 无效的键值(不是字符串)')
|
|
56
|
+
const invalidValue: any = {
|
|
57
|
+
common: {
|
|
58
|
+
confirm: 123, // 数字而非字符串
|
|
59
|
+
cancel: '取消'
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
manager.registerMessages('test-invalid-value', invalidValue)
|
|
63
|
+
console.log('检查是否注册:', manager.hasLocale('test-invalid-value'))
|
|
64
|
+
console.log('')
|
|
65
|
+
|
|
66
|
+
// 测试 6: 部分有效的语言包(应该完全拒绝)
|
|
67
|
+
console.log('测试 6: 部分有效的语言包')
|
|
68
|
+
const partiallyValid: any = {
|
|
69
|
+
common: {
|
|
70
|
+
confirm: '确定',
|
|
71
|
+
cancel: '取消'
|
|
72
|
+
},
|
|
73
|
+
dialog: {
|
|
74
|
+
title: '提示',
|
|
75
|
+
invalid: { nested: 'object' } // 嵌套对象而非字符串
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
manager.registerMessages('test-partial', partiallyValid)
|
|
79
|
+
console.log('检查是否注册:', manager.hasLocale('test-partial'))
|
|
80
|
+
console.log('')
|
|
81
|
+
|
|
82
|
+
// 测试 7: 替换模式也应该验证
|
|
83
|
+
console.log('测试 7: 替换模式验证')
|
|
84
|
+
manager.registerMessagesWithMode('test-replace', invalidValue, 'replace')
|
|
85
|
+
console.log('检查是否注册:', manager.hasLocale('test-replace'))
|
|
86
|
+
console.log('')
|
|
87
|
+
|
|
88
|
+
// 测试 8: 空对象是有效的
|
|
89
|
+
console.log('测试 8: 空对象是有效的')
|
|
90
|
+
manager.registerMessages('test-empty', {})
|
|
91
|
+
console.log('✓ 空对象注册成功')
|
|
92
|
+
console.log('检查是否注册:', manager.hasLocale('test-empty'))
|
|
93
|
+
console.log('')
|
|
94
|
+
|
|
95
|
+
// 测试 9: 空模块是有效的
|
|
96
|
+
console.log('测试 9: 空模块是有效的')
|
|
97
|
+
const emptyModule: ModularLocaleMessages = {
|
|
98
|
+
common: {}
|
|
99
|
+
}
|
|
100
|
+
manager.registerMessages('test-empty-module', emptyModule)
|
|
101
|
+
console.log('✓ 空模块注册成功')
|
|
102
|
+
console.log('检查是否注册:', manager.hasLocale('test-empty-module'))
|
|
103
|
+
console.log('')
|
|
104
|
+
|
|
105
|
+
console.log('=== 测试完成 ===')
|
|
106
|
+
console.log('最终可用语言列表:', manager.getAvailableLocales().value)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useI18n Composable
|
|
3
|
+
* 为组件提供响应式的 i18n 功能
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { computed } from 'vue'
|
|
7
|
+
import type { ComputedRef } from 'vue'
|
|
8
|
+
import { I18nManager } from './i18n/manager.uts'
|
|
9
|
+
import type { TranslateParams } from './i18n/types.uts'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* useI18n 返回类型
|
|
13
|
+
*/
|
|
14
|
+
export interface UseI18nReturn {
|
|
15
|
+
/** 翻译函数 */
|
|
16
|
+
$t: (key: string, params?: TranslateParams) => string
|
|
17
|
+
/** 当前语言(响应式) */
|
|
18
|
+
locale: ComputedRef<string>
|
|
19
|
+
/** 可用语言列表(响应式) */
|
|
20
|
+
availableLocales: ComputedRef<string[]>
|
|
21
|
+
/** 设置语言 */
|
|
22
|
+
setLocale: (locale: string) => boolean
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* useI18n Composable 函数
|
|
27
|
+
* 提供响应式的多语言功能
|
|
28
|
+
*
|
|
29
|
+
* @returns i18n 功能对象
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const { $t, locale, setLocale, availableLocales } = useI18n()
|
|
34
|
+
*
|
|
35
|
+
* // 翻译文本
|
|
36
|
+
* const title = $t('common.confirm')
|
|
37
|
+
*
|
|
38
|
+
* // 带参数的翻译
|
|
39
|
+
* const greeting = $t('common.hello', { name: '张三' })
|
|
40
|
+
*
|
|
41
|
+
* // 切换语言
|
|
42
|
+
* setLocale('en-US')
|
|
43
|
+
*
|
|
44
|
+
* // 获取当前语言
|
|
45
|
+
* console.log(locale.value)
|
|
46
|
+
*
|
|
47
|
+
* // 获取可用语言列表
|
|
48
|
+
* console.log(availableLocales.value)
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export function useI18n(): UseI18nReturn {
|
|
52
|
+
// 获取 I18nManager 单例实例
|
|
53
|
+
const manager = I18nManager.getInstance()
|
|
54
|
+
|
|
55
|
+
// 翻译函数:调用 manager.translate()
|
|
56
|
+
const $t = (key: string, params?: TranslateParams): string => {
|
|
57
|
+
return manager.translate(key, params)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// 当前语言(响应式 computed)
|
|
61
|
+
const locale = computed<string>(() => manager.currentLocale.value)
|
|
62
|
+
|
|
63
|
+
// 可用语言列表(响应式 computed)
|
|
64
|
+
const availableLocales = manager.getAvailableLocales()
|
|
65
|
+
|
|
66
|
+
// 设置语言方法
|
|
67
|
+
const setLocale = (locale: string): boolean => {
|
|
68
|
+
return manager.setLocale(locale)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
$t,
|
|
73
|
+
locale,
|
|
74
|
+
availableLocales,
|
|
75
|
+
setLocale
|
|
76
|
+
}
|
|
77
|
+
}
|
package/index.uts
CHANGED
|
@@ -30,6 +30,29 @@ export { useTheme } from './composables/useTheme.uts'
|
|
|
30
30
|
export { useToast } from './composables/useToast.uts'
|
|
31
31
|
export { useModal } from './composables/useModal.uts'
|
|
32
32
|
|
|
33
|
+
// 导出 i18n composable
|
|
34
|
+
export { useI18n } from './composables/useI18n.uts'
|
|
35
|
+
export type { UseI18nReturn } from './composables/useI18n.uts'
|
|
36
|
+
|
|
37
|
+
// 导出 i18n 全局函数
|
|
38
|
+
export {
|
|
39
|
+
setLanguage,
|
|
40
|
+
registerLocale,
|
|
41
|
+
registerLocaleWithMode,
|
|
42
|
+
replaceLocale,
|
|
43
|
+
getCurrentLocale,
|
|
44
|
+
getAvailableLocales
|
|
45
|
+
} from './composables/i18n/index.uts'
|
|
46
|
+
|
|
47
|
+
// 导出 i18n 类型定义
|
|
48
|
+
export type {
|
|
49
|
+
LocaleMessages,
|
|
50
|
+
ModularLocaleMessages,
|
|
51
|
+
LocaleCode,
|
|
52
|
+
I18nConfig,
|
|
53
|
+
TranslateParams
|
|
54
|
+
} from './composables/i18n/types.uts'
|
|
55
|
+
|
|
33
56
|
// 版本信息
|
|
34
57
|
export const version: string = '1.0.5'
|
|
35
58
|
|