@liujitcn/kratos-taro-app-core 0.0.20 → 0.0.21
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/dist/build.mjs +3 -3
- package/package.json +1 -1
- package/src/api/base/file.ts +9 -4
- package/src/api/base/language.ts +21 -0
- package/src/bootstrap.ts +15 -1
- package/src/components/BootstrapStatus.tsx +3 -1
- package/src/components/KratosPageFrame.tsx +3 -1
- package/src/index.ts +18 -0
- package/src/locales/README.md +15 -0
- package/src/locales/en-US.json +113 -0
- package/src/locales/es-ES.json +113 -0
- package/src/locales/fr-FR.json +113 -0
- package/src/locales/index.ts +211 -0
- package/src/locales/ja-JP.json +113 -0
- package/src/locales/ko-KR.json +113 -0
- package/src/locales/zh-CN.json +113 -0
- package/src/locales/zh-TW.json +113 -0
- package/src/module.ts +4 -0
- package/src/navigation.ts +48 -23
- package/src/pages.ts +3 -3
- package/src/rpc/base/v1/config.ts +2 -0
- package/src/rpc/base/v1/language.ts +37 -0
- package/src/stores/setting.ts +9 -4
- package/src/utils/file.ts +7 -2
- package/src/utils/http.ts +29 -10
- package/src/utils/passwordCrypto.ts +13 -12
- package/src/views/pages/index/index.tsx +13 -11
- package/src/views/pages/login/login.tsx +71 -48
- package/src/views/pages/login/protocal.tsx +5 -3
- package/src/views/pages/status/index.tsx +4 -10
- package/src/views/pages/webview/webview.tsx +6 -4
package/dist/build.mjs
CHANGED
|
@@ -8,11 +8,11 @@ var corePages = {
|
|
|
8
8
|
style: {
|
|
9
9
|
navigationStyle: "custom",
|
|
10
10
|
navigationBarTextStyle: "white",
|
|
11
|
-
navigationBarTitleText: "
|
|
11
|
+
navigationBarTitleText: ""
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
-
"pages/login/login": { style: { navigationBarTitleText: "
|
|
15
|
-
"pages/login/protocal": { style: { navigationBarTitleText: "
|
|
14
|
+
"pages/login/login": { style: { navigationBarTitleText: "" } },
|
|
15
|
+
"pages/login/protocal": { style: { navigationBarTitleText: "" } },
|
|
16
16
|
"pages/webview/webview": { style: { navigationBarTitleText: "" } },
|
|
17
17
|
"pages/status/index": {
|
|
18
18
|
style: {
|
package/package.json
CHANGED
package/src/api/base/file.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
MultiUploadFileResponse,
|
|
6
6
|
} from '../../rpc/base/v1/file'
|
|
7
7
|
import { uploadFile, uploadFileList } from '../../utils/file'
|
|
8
|
+
import { getLocaleRequestHeaders, t } from '../../locales'
|
|
8
9
|
import { getRequestAccessToken, requestBaseURL } from '../../utils/http'
|
|
9
10
|
|
|
10
11
|
const FILE_URL = '/v1/base/file'
|
|
@@ -14,7 +15,7 @@ export class FileServiceImpl {
|
|
|
14
15
|
/** 上传多个浏览器文件。 */
|
|
15
16
|
async MultiUploadFile(files: File[], fileType: string): Promise<MultiUploadFileResponse> {
|
|
16
17
|
if (process.env.TARO_ENV !== 'h5') {
|
|
17
|
-
throw new Error('
|
|
18
|
+
throw new Error(t('core.file.temporaryPathRequired'))
|
|
18
19
|
}
|
|
19
20
|
const paths = files.map((file) => URL.createObjectURL(file))
|
|
20
21
|
try {
|
|
@@ -27,7 +28,7 @@ export class FileServiceImpl {
|
|
|
27
28
|
/** 上传单个浏览器文件。 */
|
|
28
29
|
async UploadFile(file: File, fileType: string): Promise<FileInfo> {
|
|
29
30
|
if (process.env.TARO_ENV !== 'h5') {
|
|
30
|
-
throw new Error('
|
|
31
|
+
throw new Error(t('core.file.temporaryPathRequired'))
|
|
31
32
|
}
|
|
32
33
|
const path = URL.createObjectURL(file)
|
|
33
34
|
try {
|
|
@@ -46,9 +47,13 @@ export class FileServiceImpl {
|
|
|
46
47
|
const token = await getRequestAccessToken()
|
|
47
48
|
const response = await Taro.downloadFile({
|
|
48
49
|
url: `${requestBaseURL}${FILE_URL}?${query}`,
|
|
49
|
-
header: {
|
|
50
|
+
header: {
|
|
51
|
+
...getLocaleRequestHeaders(),
|
|
52
|
+
Authorization: token,
|
|
53
|
+
'source-client': 'miniapp',
|
|
54
|
+
},
|
|
50
55
|
})
|
|
51
|
-
if (response.statusCode !== 200) throw new Error('
|
|
56
|
+
if (response.statusCode !== 200) throw new Error(t('core.file.downloadFailed'))
|
|
52
57
|
await Taro.openDocument({ filePath: response.tempFilePath, showMenu: true })
|
|
53
58
|
}
|
|
54
59
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { http } from '../../utils/http'
|
|
2
|
+
import type { GetLanguageRequest, GetLanguageResponse, LanguageService } from '../../rpc/base/v1/language'
|
|
3
|
+
|
|
4
|
+
const LANGUAGE_URL = '/v1/base/language'
|
|
5
|
+
|
|
6
|
+
/** 语言公共服务。 */
|
|
7
|
+
export class LanguageServiceImpl implements LanguageService {
|
|
8
|
+
/** 查询当前支持的语言和主语言。 */
|
|
9
|
+
GetLanguage(request: GetLanguageRequest): Promise<GetLanguageResponse> {
|
|
10
|
+
return http<GetLanguageResponse>({
|
|
11
|
+
url: LANGUAGE_URL,
|
|
12
|
+
method: 'GET',
|
|
13
|
+
authMode: 'none',
|
|
14
|
+
data: request,
|
|
15
|
+
header: { Authorization: 'no-auth' },
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** 主语言公共服务。 */
|
|
21
|
+
export const defLanguageService = new LanguageServiceImpl()
|
package/src/bootstrap.ts
CHANGED
|
@@ -7,7 +7,9 @@ import {
|
|
|
7
7
|
registerUserStoreExtension,
|
|
8
8
|
startUserStoreEventBridge,
|
|
9
9
|
useUserStore,
|
|
10
|
-
} from './stores'
|
|
10
|
+
useSettingStore } from './stores'
|
|
11
|
+
import { applyLanguageConfig, initializeLocale, registerLocaleChangeHandler, registerLocaleMessages } from './locales'
|
|
12
|
+
import { defLanguageService } from './api/base/language'
|
|
11
13
|
|
|
12
14
|
/** Taro 应用启动参数。 */
|
|
13
15
|
export interface KratosTaroBootstrapOptions {
|
|
@@ -20,8 +22,20 @@ let bootstrapped = false
|
|
|
20
22
|
/** 注册模块、认证生命周期和导航运行时。 */
|
|
21
23
|
export function bootstrapKratosTaroApp(options: KratosTaroBootstrapOptions): void {
|
|
22
24
|
registerKratosTaroModules(options.modules)
|
|
25
|
+
registerLocaleMessages(options.modules)
|
|
26
|
+
initializeLocale()
|
|
27
|
+
void defLanguageService
|
|
28
|
+
.GetLanguage({})
|
|
29
|
+
.then((response) => {
|
|
30
|
+
applyLanguageConfig(response)
|
|
31
|
+
})
|
|
32
|
+
.catch(() => {
|
|
33
|
+
// 语言公共接口失败时继续使用静态语言包和系统语言。
|
|
34
|
+
})
|
|
23
35
|
if (bootstrapped) return
|
|
24
36
|
bootstrapped = true
|
|
37
|
+
registerLocaleChangeHandler(initializeAppNavigation)
|
|
38
|
+
registerLocaleChangeHandler(() => useSettingStore.getState().loadData())
|
|
25
39
|
startUserStoreEventBridge()
|
|
26
40
|
registerUserStoreExtension({
|
|
27
41
|
onLogin: initializeAppNavigation,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Image, Text, View } from '@tarojs/components'
|
|
2
2
|
import './BootstrapStatus.scss'
|
|
3
|
+
import { useI18n } from '../locales'
|
|
3
4
|
|
|
4
5
|
/** 启动状态组件参数。 */
|
|
5
6
|
export interface BootstrapStatusProps {
|
|
@@ -9,6 +10,7 @@ export interface BootstrapStatusProps {
|
|
|
9
10
|
|
|
10
11
|
/** 全屏启动状态。 */
|
|
11
12
|
export function BootstrapStatus({ title, detail }: BootstrapStatusProps) {
|
|
13
|
+
const { t } = useI18n()
|
|
12
14
|
return (
|
|
13
15
|
<View className='bootstrap-status'>
|
|
14
16
|
<Image
|
|
@@ -16,7 +18,7 @@ export function BootstrapStatus({ title, detail }: BootstrapStatusProps) {
|
|
|
16
18
|
src='/static/images/logo_icon.png'
|
|
17
19
|
mode='aspectFit'
|
|
18
20
|
/>
|
|
19
|
-
<Text className='bootstrap-status__title'>{title || '
|
|
21
|
+
<Text className='bootstrap-status__title'>{title || t('core.status.loading')}</Text>
|
|
20
22
|
{detail ? <Text className='bootstrap-status__detail'>{detail}</Text> : null}
|
|
21
23
|
</View>
|
|
22
24
|
)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Text, View } from '@tarojs/components'
|
|
2
2
|
import Taro from '@tarojs/taro'
|
|
3
3
|
import type { ReactNode } from 'react'
|
|
4
|
+
import { useI18n } from '../locales'
|
|
4
5
|
import { homeTabPage } from '../utils/navigation'
|
|
5
6
|
import './KratosPageFrame.scss'
|
|
6
7
|
|
|
@@ -21,6 +22,7 @@ export function KratosPageFrame({
|
|
|
21
22
|
navigationBarBackgroundColor,
|
|
22
23
|
navigationBarTextStyle,
|
|
23
24
|
}: KratosPageFrameProps) {
|
|
25
|
+
const { t } = useI18n()
|
|
24
26
|
if (process.env.TARO_ENV !== 'h5' || navigationStyle === 'custom') return children
|
|
25
27
|
|
|
26
28
|
const color = navigationBarTextStyle === 'white' ? '#fff' : '#000'
|
|
@@ -38,7 +40,7 @@ export function KratosPageFrame({
|
|
|
38
40
|
className='kratos-page-frame__navigation'
|
|
39
41
|
style={{ backgroundColor: navigationBarBackgroundColor, color }}
|
|
40
42
|
>
|
|
41
|
-
<View className='kratos-page-frame__back' aria-label='
|
|
43
|
+
<View className='kratos-page-frame__back' aria-label={t('common.action.back')} onClick={() => void goBack()}>
|
|
42
44
|
<View className='kratos-page-frame__back-icon' />
|
|
43
45
|
</View>
|
|
44
46
|
<Text className='kratos-page-frame__title'>{navigationBarTitleText}</Text>
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
// Core 语言包在本文件的 coreModule 中注册,供 Taro 公共页面、请求工具和业务模块复用。
|
|
1
2
|
import { corePages } from './pages'
|
|
2
3
|
import { defineKratosTaroModule } from './module'
|
|
4
|
+
import coreEnUS from './locales/en-US.json'
|
|
5
|
+
import coreJaJP from './locales/ja-JP.json'
|
|
6
|
+
import coreZhCN from './locales/zh-CN.json'
|
|
7
|
+
import coreZhTW from './locales/zh-TW.json'
|
|
8
|
+
import coreKoKR from './locales/ko-KR.json'
|
|
9
|
+
import coreFrFR from './locales/fr-FR.json'
|
|
10
|
+
import coreEsES from './locales/es-ES.json'
|
|
3
11
|
|
|
4
12
|
/** core 内置模块。 */
|
|
5
13
|
export const coreModule = defineKratosTaroModule({
|
|
@@ -23,11 +31,21 @@ export const coreModule = defineKratosTaroModule({
|
|
|
23
31
|
USER_DEFAULT: 'static/tabs/user_default.png',
|
|
24
32
|
USER_SELECTED: 'static/tabs/user_selected.png',
|
|
25
33
|
},
|
|
34
|
+
messages: {
|
|
35
|
+
'zh-CN': coreZhCN,
|
|
36
|
+
'zh-TW': coreZhTW,
|
|
37
|
+
'ko-KR': coreKoKR,
|
|
38
|
+
'fr-FR': coreFrFR,
|
|
39
|
+
'es-ES': coreEsES,
|
|
40
|
+
'en-US': coreEnUS,
|
|
41
|
+
'ja-JP': coreJaJP,
|
|
42
|
+
},
|
|
26
43
|
})
|
|
27
44
|
|
|
28
45
|
export * from './module'
|
|
29
46
|
export * from './bootstrap'
|
|
30
47
|
export * from './navigation'
|
|
48
|
+
export * from './locales'
|
|
31
49
|
export * from './stores'
|
|
32
50
|
export * from './utils/auth'
|
|
33
51
|
export * from './utils/file'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Taro Core 语言包
|
|
2
|
+
|
|
3
|
+
本目录提供 Taro 应用底座和公共页面使用的稳定文案,包括登录、启动状态、导航、认证、文件处理和网络错误提示。语言包由 `../index.ts` 的 `coreModule` 导入并注册,应用启动时由 `bootstrapKratosTaroApp` 调用 `registerLocaleMessages` 合并;页面、hooks、请求工具通过 `useI18n()` 或 `t()` 使用。
|
|
4
|
+
|
|
5
|
+
| 文件 | 用途 | 使用位置 |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| `zh-CN.json` | 简体中文固定 UI 默认语言包,也是七语键集合和占位符校验基准。 | Taro 固定文案默认语言及缺失翻译回退。 |
|
|
8
|
+
| `zh-TW.json` | 繁体中文 Core 语言包。 | Taro 切换为繁体中文时使用。 |
|
|
9
|
+
| `en-US.json` | 英文 Core 语言包。 | Taro 切换为英文时使用。 |
|
|
10
|
+
| `ja-JP.json` | 日文 Core 语言包。 | Taro 切换为日文时使用。 |
|
|
11
|
+
| `ko-KR.json` | 韩语 Core 语言包。 | Taro 切换为韩语时使用。 |
|
|
12
|
+
| `fr-FR.json` | 法语 Core 语言包。 | Taro 切换为法语时使用。 |
|
|
13
|
+
| `es-ES.json` | 西班牙语 Core 语言包。 | Taro 切换为西班牙语时使用。 |
|
|
14
|
+
|
|
15
|
+
语言包是标准 JSON,不能在文件内直接写注释;公共键使用 `common.` 或 `core.` 命名空间。
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
{
|
|
2
|
+
"common.action.back": "Back",
|
|
3
|
+
"common.action.cancel": "Cancel",
|
|
4
|
+
"common.action.confirm": "Confirm",
|
|
5
|
+
"common.action.delete": "Delete",
|
|
6
|
+
"common.action.login": "Log in",
|
|
7
|
+
"common.action.logout": "Log out",
|
|
8
|
+
"common.action.new": "New",
|
|
9
|
+
"common.action.openInNewWindow": "Open in new window",
|
|
10
|
+
"common.action.retry": "Retry",
|
|
11
|
+
"common.action.save": "Save",
|
|
12
|
+
"common.action.search": "Search",
|
|
13
|
+
"common.field.language": "Language",
|
|
14
|
+
"common.language.en-US": "English",
|
|
15
|
+
"common.language.ja-JP": "日本語",
|
|
16
|
+
"common.language.zh-CN": "简体中文",
|
|
17
|
+
"common.language.zh-TW": "Traditional Chinese",
|
|
18
|
+
"common.language.ko-KR": "Korean",
|
|
19
|
+
"common.language.fr-FR": "French",
|
|
20
|
+
"common.language.es-ES": "Spanish",
|
|
21
|
+
"common.message.loading": "Loading",
|
|
22
|
+
"common.message.networkError": "Network error. Check your connection and try again.",
|
|
23
|
+
"common.message.requestError": "Request failed",
|
|
24
|
+
"common.message.unknown": "Unable to process this request. Try again later.",
|
|
25
|
+
"common.title.notice": "Notice",
|
|
26
|
+
"core.auth.loginAgain": "Log in again",
|
|
27
|
+
"core.auth.sessionExpired": "Your session has expired. Please log in again.",
|
|
28
|
+
"core.config.missing": "Missing app configuration: {names}",
|
|
29
|
+
"core.crypto.base64DecodeUnsupported": "Base64 decoding is not supported in this environment",
|
|
30
|
+
"core.crypto.base64EncodeUnsupported": "Base64 encoding is not supported in this environment",
|
|
31
|
+
"core.crypto.encryptFailed": "Password encryption failed",
|
|
32
|
+
"core.crypto.passwordRequired": "Password is required",
|
|
33
|
+
"core.crypto.passwordTooLong": "Password exceeds the supported length",
|
|
34
|
+
"core.crypto.publicKeyInvalid": "Invalid public key",
|
|
35
|
+
"core.crypto.randomFailed": "Failed to generate random data",
|
|
36
|
+
"core.crypto.unsupported": "Password encryption is not supported in this environment",
|
|
37
|
+
"core.file.downloadFailed": "Download failed",
|
|
38
|
+
"core.file.temporaryPathRequired": "Use a temporary file path when uploading from a Mini Program",
|
|
39
|
+
"core.file.uploadFailed": "Upload failed",
|
|
40
|
+
"core.home.accountCapability": "Account features",
|
|
41
|
+
"core.home.accountCapabilityDescription": "Profile, app settings, and AI assistant access are included",
|
|
42
|
+
"core.home.crossPlatform": "Cross-platform pages",
|
|
43
|
+
"core.home.crossPlatformDescription": "One codebase for H5 and WeChat Mini Program",
|
|
44
|
+
"core.home.demoScope": "Demo scope",
|
|
45
|
+
"core.home.framework": "App framework",
|
|
46
|
+
"core.home.language": "Language",
|
|
47
|
+
"core.home.mainTitle": "Application Framework",
|
|
48
|
+
"core.home.stateManagement": "State management",
|
|
49
|
+
"core.home.staticHome": "Static home",
|
|
50
|
+
"core.home.staticHomeDescription": "This page presents framework details without business APIs",
|
|
51
|
+
"core.home.styleSolution": "Styling",
|
|
52
|
+
"core.home.subTitle": "Shared navigation and account experience",
|
|
53
|
+
"core.home.techStack": "Technology stack",
|
|
54
|
+
"core.login.agreePrefix": "I have read and agree to the",
|
|
55
|
+
"core.login.agreeSeparator": "and",
|
|
56
|
+
"core.login.behaviorClick": "Click the characters in order",
|
|
57
|
+
"core.login.behaviorLoading": "Loading...",
|
|
58
|
+
"core.login.behaviorPuzzle": "Drag the slider to complete the puzzle",
|
|
59
|
+
"core.login.behaviorRotate": "Drag the slider to rotate the inner image upright",
|
|
60
|
+
"core.login.bindWechat": "Log in and link WeChat",
|
|
61
|
+
"core.login.captcha": "Enter verification code",
|
|
62
|
+
"core.login.captchaLoadFailed": "Failed to load verification code",
|
|
63
|
+
"core.login.captchaTypeMissing": "Verification method is not configured",
|
|
64
|
+
"core.login.captchaTypeName": "Login verification method",
|
|
65
|
+
"core.login.captchaTypeResponseMissing": "Verification response did not include a type",
|
|
66
|
+
"core.login.captchaWriteFailed": "Failed to save verification image",
|
|
67
|
+
"core.login.defaultSubTitle": "Welcome",
|
|
68
|
+
"core.login.loginFailed": "Login failed. Try again.",
|
|
69
|
+
"core.login.loginSuccess": "Logged in",
|
|
70
|
+
"core.login.password": "Enter password",
|
|
71
|
+
"core.login.privacy": "Privacy Policy",
|
|
72
|
+
"core.login.protocolMissing": "Terms of Service and Privacy Policy are not configured",
|
|
73
|
+
"core.login.protocolPrompt": "Read and accept the agreements first. Confirm to accept and continue.",
|
|
74
|
+
"core.login.service": "Terms of Service",
|
|
75
|
+
"core.login.tenant": "Enter tenant code",
|
|
76
|
+
"core.login.userName": "Enter username or mobile number",
|
|
77
|
+
"core.login.userNameMobile": "Enter username or mobile number",
|
|
78
|
+
"core.login.userNamePassword": "Enter username and password",
|
|
79
|
+
"core.login.wechat": "Continue with WeChat",
|
|
80
|
+
"core.login.wechatBindTip": "This WeChat account is not linked. Log in to an existing account to link it.",
|
|
81
|
+
"core.login.wechatFailed": "WeChat login failed. Try again later.",
|
|
82
|
+
"core.navigation.home": "Home",
|
|
83
|
+
"core.navigation.error.access": "Invalid menu access mode: {access}",
|
|
84
|
+
"core.navigation.error.childTab": "Only second-level app menus can be tabs: {name}",
|
|
85
|
+
"core.navigation.error.cycle": "Menu parent cycle detected: {name}",
|
|
86
|
+
"core.navigation.error.identity": "Menu id, name, or app/ path is invalid",
|
|
87
|
+
"core.navigation.error.itemObject": "Menu item is not an object",
|
|
88
|
+
"core.navigation.error.listMissing": "Menu response does not contain a flat list",
|
|
89
|
+
"core.navigation.error.namePrefix": "Menu name must start with App: {name}",
|
|
90
|
+
"core.navigation.error.parentInvalid": "Menu parent id is invalid: {name}",
|
|
91
|
+
"core.navigation.error.parentMissing": "Menu parent id is missing: {name}",
|
|
92
|
+
"core.navigation.error.parentNotFound": "Menu parent was not found: {name}",
|
|
93
|
+
"core.navigation.error.responseObject": "Menu response is not an object",
|
|
94
|
+
"core.navigation.error.rootTab": "Second-level app menu must be a tab: {name}",
|
|
95
|
+
"core.navigation.error.tabCount": "tabBar must contain 0 or 2-5 items",
|
|
96
|
+
"core.navigation.error.unique": "Menu id, name, and path must be unique",
|
|
97
|
+
"core.navigation.error.viewKey": "Unregistered viewKey: {viewKey}",
|
|
98
|
+
"core.navigation.my": "My Account",
|
|
99
|
+
"core.navigation.protocol": "Agreement",
|
|
100
|
+
"core.protocol.loadFailed": "Failed to load app configuration",
|
|
101
|
+
"core.protocol.notConfigured": "{title} is not configured and cannot be viewed",
|
|
102
|
+
"core.protocol.privacy": "Privacy Policy",
|
|
103
|
+
"core.protocol.service": "Terms of Service",
|
|
104
|
+
"core.status.CONFIG_ERROR": "Invalid navigation configuration",
|
|
105
|
+
"core.status.FORBIDDEN": "Access denied",
|
|
106
|
+
"core.status.NOT_FOUND": "Page not found",
|
|
107
|
+
"core.status.OFFLINE": "Network unavailable",
|
|
108
|
+
"core.status.PAGE_UNAVAILABLE": "Page temporarily unavailable",
|
|
109
|
+
"core.status.loading": "Loading",
|
|
110
|
+
"core.webview.embedBlocked": "The destination may block embedding on H5",
|
|
111
|
+
"core.webview.invalidUrl": "No valid link was provided",
|
|
112
|
+
"core.webview.openFailed": "Unable to open link"
|
|
113
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
{
|
|
2
|
+
"common.action.back": "Regresar",
|
|
3
|
+
"common.action.cancel": "Cancelar",
|
|
4
|
+
"common.action.confirm": "Aceptar",
|
|
5
|
+
"common.action.delete": "Eliminar",
|
|
6
|
+
"common.action.login": "Iniciar sesión",
|
|
7
|
+
"common.action.logout": "Cerrar sesión",
|
|
8
|
+
"common.action.new": "Nuevo",
|
|
9
|
+
"common.action.openInNewWindow": "Se abre una nueva ventana",
|
|
10
|
+
"common.action.retry": "Inténtalo de nuevo",
|
|
11
|
+
"common.action.save": "Guardar",
|
|
12
|
+
"common.action.search": "Buscar",
|
|
13
|
+
"common.field.language": "Idioma",
|
|
14
|
+
"common.language.en-US": "Inglés",
|
|
15
|
+
"common.language.ja-JP": "Japonés",
|
|
16
|
+
"common.language.zh-CN": "Chino simplificado",
|
|
17
|
+
"common.language.zh-TW": "Chino tradicional",
|
|
18
|
+
"common.language.ko-KR": "Coreano",
|
|
19
|
+
"common.language.fr-FR": "Francés",
|
|
20
|
+
"common.language.es-ES": "Español",
|
|
21
|
+
"common.message.loading": "se está cargando",
|
|
22
|
+
"common.message.networkError": "Error de red, prueba con otra red",
|
|
23
|
+
"common.message.requestError": "Error de solicitud",
|
|
24
|
+
"common.message.unknown": "No se puede procesar en este momento, inténtalo de nuevo más tarde",
|
|
25
|
+
"common.title.notice": "Consejos",
|
|
26
|
+
"core.auth.loginAgain": "Inicia sesión nuevamente",
|
|
27
|
+
"core.auth.sessionExpired": "La página actual no es válida, inicie sesión nuevamente",
|
|
28
|
+
"core.config.missing": "Falta la configuración del terminal móvil: {names}",
|
|
29
|
+
"core.crypto.base64DecodeUnsupported": "El entorno actual no admite la decodificación Base64",
|
|
30
|
+
"core.crypto.base64EncodeUnsupported": "El entorno actual no admite la codificación Base64",
|
|
31
|
+
"core.crypto.encryptFailed": "Falló el cifrado de contraseña",
|
|
32
|
+
"core.crypto.passwordRequired": "La contraseña no puede estar vacía",
|
|
33
|
+
"core.crypto.passwordTooLong": "La longitud de la contraseña excede el límite",
|
|
34
|
+
"core.crypto.publicKeyInvalid": "El formato de clave pública no es válido",
|
|
35
|
+
"core.crypto.randomFailed": "Falló la generación de números aleatorios",
|
|
36
|
+
"core.crypto.unsupported": "El entorno actual no admite el cifrado de contraseña",
|
|
37
|
+
"core.file.downloadFailed": "Falló la descarga",
|
|
38
|
+
"core.file.temporaryPathRequired": "Utilice la ruta del archivo temporal para cargar el miniprograma.",
|
|
39
|
+
"core.file.uploadFailed": "Falló la carga",
|
|
40
|
+
"core.home.accountCapability": "Capacidades de la cuenta",
|
|
41
|
+
"core.home.accountCapabilityDescription": "Se han reservado la información personal, la configuración de la aplicación y la entrada del asistente inteligente",
|
|
42
|
+
"core.home.crossPlatform": "Página cruzada",
|
|
43
|
+
"core.home.crossPlatformDescription": "El mismo conjunto de códigos de página se adapta a los mini programas H5 y WeChat",
|
|
44
|
+
"core.home.demoScope": "Alcance de demostración",
|
|
45
|
+
"core.home.framework": "Marco de aplicación",
|
|
46
|
+
"core.home.language": "Lenguaje de desarrollo",
|
|
47
|
+
"core.home.mainTitle": "Ejemplo de marco de aplicación",
|
|
48
|
+
"core.home.stateManagement": "Gestión de estados",
|
|
49
|
+
"core.home.staticHome": "Página de inicio estática",
|
|
50
|
+
"core.home.staticHomeDescription": "La página de inicio actual se utiliza para mostrar información del marco y no depende de interfaces comerciales.",
|
|
51
|
+
"core.home.styleSolution": "esquema de estilo",
|
|
52
|
+
"core.home.subTitle": "Preservar la navegación universal y la experiencia del centro personal",
|
|
53
|
+
"core.home.techStack": "Pila de tecnología actual",
|
|
54
|
+
"core.login.agreePrefix": "He leído y acepto",
|
|
55
|
+
"core.login.agreeSeparator": "y",
|
|
56
|
+
"core.login.behaviorClick": "Por favor haga clic en el texto en orden",
|
|
57
|
+
"core.login.behaviorLoading": "Cargando...",
|
|
58
|
+
"core.login.behaviorPuzzle": "Arrastre el control deslizante para completar el rompecabezas",
|
|
59
|
+
"core.login.behaviorRotate": "Arrastre el control deslizante para corregir la imagen del círculo interior",
|
|
60
|
+
"core.login.bindWechat": "Inicie sesión y vincule WeChat",
|
|
61
|
+
"core.login.captcha": "Por favor ingresa el código de verificación",
|
|
62
|
+
"core.login.captchaLoadFailed": "Error al cargar el código de verificación",
|
|
63
|
+
"core.login.captchaTypeMissing": "El tipo de código de verificación de inicio de sesión no está configurado",
|
|
64
|
+
"core.login.captchaTypeName": "Tipo de código de verificación de inicio de sesión",
|
|
65
|
+
"core.login.captchaTypeResponseMissing": "La interfaz del código de verificación no devuelve el tipo",
|
|
66
|
+
"core.login.captchaWriteFailed": "Error al escribir la imagen del código de verificación",
|
|
67
|
+
"core.login.defaultSubTitle": "Bienvenido a esta aplicación",
|
|
68
|
+
"core.login.loginFailed": "Error al iniciar sesión, inténtelo de nuevo",
|
|
69
|
+
"core.login.loginSuccess": "Inicio de sesión exitoso",
|
|
70
|
+
"core.login.password": "Por favor ingrese la contraseña",
|
|
71
|
+
"core.login.privacy": "\"Acuerdo de Privacidad\"",
|
|
72
|
+
"core.login.protocolMissing": "Los términos de servicio y el acuerdo de privacidad no están configurados",
|
|
73
|
+
"core.login.protocolPrompt": "Primero lea y verifique el contenido del acuerdo. Después de hacer clic en Aceptar, comprobará automáticamente y continuará iniciando sesión.",
|
|
74
|
+
"core.login.service": "\"Términos de servicio\"",
|
|
75
|
+
"core.login.tenant": "Por favor ingrese el número de inquilino",
|
|
76
|
+
"core.login.userName": "Por favor ingrese su nombre de usuario o número de teléfono móvil",
|
|
77
|
+
"core.login.userNameMobile": "Por favor ingrese el nombre de usuario/número de teléfono móvil",
|
|
78
|
+
"core.login.userNamePassword": "Por favor ingrese nombre de usuario y contraseña",
|
|
79
|
+
"core.login.wechat": "Inicio de sesión con un clic en WeChat",
|
|
80
|
+
"core.login.wechatBindTip": "Esta cuenta de WeChat aún no ha sido vinculada. Inicie sesión en su cuenta existente para completar el enlace.",
|
|
81
|
+
"core.login.wechatFailed": "Error al iniciar sesión en WeChat, inténtelo de nuevo más tarde.",
|
|
82
|
+
"core.navigation.home": "Inicio",
|
|
83
|
+
"core.navigation.error.access": "Modo de acceso al menú no válido: {access}",
|
|
84
|
+
"core.navigation.error.childTab": "Sólo se puede utilizar como pestaña el menú secundario del móvil: {name}",
|
|
85
|
+
"core.navigation.error.cycle": "Hay un bucle principal en el menú móvil: {name}",
|
|
86
|
+
"core.navigation.error.identity": "ID de menú, nombre o aplicación/ruta no válidos",
|
|
87
|
+
"core.navigation.error.itemObject": "El elemento del menú no es un objeto",
|
|
88
|
+
"core.navigation.error.listMissing": "Falta lista plana de respuesta del menú",
|
|
89
|
+
"core.navigation.error.namePrefix": "El nombre del menú debe usar el prefijo de la aplicación: {name}",
|
|
90
|
+
"core.navigation.error.parentInvalid": "El número principal del menú móvil no es válido: {name}",
|
|
91
|
+
"core.navigation.error.parentMissing": "Al menú le falta el número principal: {name}",
|
|
92
|
+
"core.navigation.error.parentNotFound": "El menú móvil principal no existe: {name}",
|
|
93
|
+
"core.navigation.error.responseObject": "La respuesta del menú no es un objeto",
|
|
94
|
+
"core.navigation.error.rootTab": "El menú secundario del móvil debe usarse como pestaña: {name}",
|
|
95
|
+
"core.navigation.error.tabCount": "tabBar solo puede configurar 0 o 2-5 elementos",
|
|
96
|
+
"core.navigation.error.unique": "La identificación del menú, el nombre y la ruta deben ser únicos",
|
|
97
|
+
"core.navigation.error.viewKey": "Clave de vista no registrada: {viewKey}",
|
|
98
|
+
"core.navigation.my": "Mío",
|
|
99
|
+
"core.navigation.protocol": "Detalles del acuerdo",
|
|
100
|
+
"core.protocol.loadFailed": "Error al cargar la configuración móvil",
|
|
101
|
+
"core.protocol.notConfigured": "{title} no está configurado y no se puede ver temporalmente.",
|
|
102
|
+
"core.protocol.privacy": "Acuerdo de privacidad",
|
|
103
|
+
"core.protocol.service": "Términos de servicio",
|
|
104
|
+
"core.status.CONFIG_ERROR": "Configuración de navegación no válida",
|
|
105
|
+
"core.status.FORBIDDEN": "Aún no hay acceso",
|
|
106
|
+
"core.status.NOT_FOUND": "la página no existe",
|
|
107
|
+
"core.status.OFFLINE": "Red no disponible",
|
|
108
|
+
"core.status.PAGE_UNAVAILABLE": "la página no está disponible temporalmente",
|
|
109
|
+
"core.status.loading": "se está cargando",
|
|
110
|
+
"core.webview.embedBlocked": "La página H5 actual puede estar restringida por el sitio de destino para su inserción.",
|
|
111
|
+
"core.webview.invalidUrl": "Falta una dirección de enlace válida",
|
|
112
|
+
"core.webview.openFailed": "El enlace no se puede abrir"
|
|
113
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
{
|
|
2
|
+
"common.action.back": "Retour",
|
|
3
|
+
"common.action.cancel": "Annuler",
|
|
4
|
+
"common.action.confirm": "OK",
|
|
5
|
+
"common.action.delete": "Supprimer",
|
|
6
|
+
"common.action.login": "Connexion",
|
|
7
|
+
"common.action.logout": "Se déconnecter",
|
|
8
|
+
"common.action.new": "Nouveau",
|
|
9
|
+
"common.action.openInNewWindow": "Une nouvelle fenêtre s'ouvre",
|
|
10
|
+
"common.action.retry": "Réessayez",
|
|
11
|
+
"common.action.save": "Enregistrer",
|
|
12
|
+
"common.action.search": "Rechercher",
|
|
13
|
+
"common.field.language": "Langue",
|
|
14
|
+
"common.language.en-US": "Anglais",
|
|
15
|
+
"common.language.ja-JP": "Japonais",
|
|
16
|
+
"common.language.zh-CN": "Chinois simplifié",
|
|
17
|
+
"common.language.zh-TW": "Chinois traditionnel",
|
|
18
|
+
"common.language.ko-KR": "coréen",
|
|
19
|
+
"common.language.fr-FR": "Français",
|
|
20
|
+
"common.language.es-ES": "espagnol",
|
|
21
|
+
"common.message.loading": "est en cours de chargement",
|
|
22
|
+
"common.message.networkError": "Erreur réseau, essayez un autre réseau",
|
|
23
|
+
"common.message.requestError": "Erreur de demande",
|
|
24
|
+
"common.message.unknown": "Traitement impossible pour le moment, veuillez réessayer plus tard",
|
|
25
|
+
"common.title.notice": "Conseils",
|
|
26
|
+
"core.auth.loginAgain": "Connectez-vous à nouveau",
|
|
27
|
+
"core.auth.sessionExpired": "La page actuelle n'est pas valide, veuillez vous reconnecter",
|
|
28
|
+
"core.config.missing": "La configuration du terminal mobile est manquante : {names}",
|
|
29
|
+
"core.crypto.base64DecodeUnsupported": "L'environnement actuel ne prend pas en charge le décodage Base64",
|
|
30
|
+
"core.crypto.base64EncodeUnsupported": "L'environnement actuel ne prend pas en charge l'encodage Base64",
|
|
31
|
+
"core.crypto.encryptFailed": "Échec du cryptage du mot de passe",
|
|
32
|
+
"core.crypto.passwordRequired": "Le mot de passe ne peut pas être vide",
|
|
33
|
+
"core.crypto.passwordTooLong": "La longueur du mot de passe dépasse la limite",
|
|
34
|
+
"core.crypto.publicKeyInvalid": "Le format de la clé publique n'est pas valide",
|
|
35
|
+
"core.crypto.randomFailed": "Échec de la génération de nombres aléatoires",
|
|
36
|
+
"core.crypto.unsupported": "L'environnement actuel ne prend pas en charge le cryptage des mots de passe",
|
|
37
|
+
"core.file.downloadFailed": "Échec du téléchargement",
|
|
38
|
+
"core.file.temporaryPathRequired": "Veuillez utiliser le chemin du fichier temporaire pour télécharger le mini-programme.",
|
|
39
|
+
"core.file.uploadFailed": "Échec du téléchargement",
|
|
40
|
+
"core.home.accountCapability": "Capacités du compte",
|
|
41
|
+
"core.home.accountCapabilityDescription": "Les informations personnelles, les paramètres de l'application et l'accès à l'assistant intelligent ont été réservés",
|
|
42
|
+
"core.home.crossPlatform": "Page croisée",
|
|
43
|
+
"core.home.crossPlatformDescription": "Le même ensemble de codes de page s'adapte aux mini programmes H5 et WeChat",
|
|
44
|
+
"core.home.demoScope": "Portée de la démonstration",
|
|
45
|
+
"core.home.framework": "Cadre d'application",
|
|
46
|
+
"core.home.language": "Langage de développement",
|
|
47
|
+
"core.home.mainTitle": "Exemple de framework d'application",
|
|
48
|
+
"core.home.stateManagement": "Gestion des statuts",
|
|
49
|
+
"core.home.staticHome": "Page d'accueil statique",
|
|
50
|
+
"core.home.staticHomeDescription": "La page d'accueil actuelle est utilisée pour afficher les informations du cadre et ne repose pas sur des interfaces métier\nSchéma de style",
|
|
51
|
+
"core.home.styleSolution": "Styling",
|
|
52
|
+
"core.home.subTitle": "Préserver la navigation universelle et l'expérience du centre personnel",
|
|
53
|
+
"core.home.techStack": "Pile technologique actuelle",
|
|
54
|
+
"core.login.agreePrefix": "J'ai lu et j'accepte",
|
|
55
|
+
"core.login.agreeSeparator": "et",
|
|
56
|
+
"core.login.behaviorClick": "Veuillez cliquer sur le texte dans l'ordre",
|
|
57
|
+
"core.login.behaviorLoading": "Chargement...",
|
|
58
|
+
"core.login.behaviorPuzzle": "Veuillez faire glisser le curseur pour terminer le puzzle",
|
|
59
|
+
"core.login.behaviorRotate": "Faites glisser le curseur pour corriger l'image du cercle intérieur",
|
|
60
|
+
"core.login.bindWechat": "Connectez-vous et liez WeChat",
|
|
61
|
+
"core.login.captcha": "Veuillez saisir le code de vérification",
|
|
62
|
+
"core.login.captchaLoadFailed": "Échec du chargement du code de vérification",
|
|
63
|
+
"core.login.captchaTypeMissing": "Le type de code de vérification de connexion n'est pas configuré",
|
|
64
|
+
"core.login.captchaTypeName": "Type de code de vérification de connexion",
|
|
65
|
+
"core.login.captchaTypeResponseMissing": "L'interface du code de vérification ne renvoie pas le type",
|
|
66
|
+
"core.login.captchaWriteFailed": "Échec de l'écriture de l'image du code de vérification",
|
|
67
|
+
"core.login.defaultSubTitle": "Bienvenue sur cette application",
|
|
68
|
+
"core.login.loginFailed": "Échec de la connexion, veuillez réessayer",
|
|
69
|
+
"core.login.loginSuccess": "Connexion réussie",
|
|
70
|
+
"core.login.password": "Veuillez saisir le mot de passe",
|
|
71
|
+
"core.login.privacy": "\"Accord de confidentialité\"",
|
|
72
|
+
"core.login.protocolMissing": "Les conditions d'utilisation et l'accord de confidentialité ne sont pas configurés",
|
|
73
|
+
"core.login.protocolPrompt": "Veuillez d'abord lire et vérifier le contenu de l'accord. Après avoir cliqué sur OK, vous vérifierez automatiquement et continuerez à vous connecter.",
|
|
74
|
+
"core.login.service": "\"Conditions d'utilisation\"",
|
|
75
|
+
"core.login.tenant": "Veuillez saisir le numéro de locataire",
|
|
76
|
+
"core.login.userName": "Veuillez saisir votre nom d'utilisateur ou votre numéro de téléphone portable",
|
|
77
|
+
"core.login.userNameMobile": "Veuillez saisir votre nom d'utilisateur/numéro de téléphone portable",
|
|
78
|
+
"core.login.userNamePassword": "Veuillez saisir votre nom d'utilisateur et votre mot de passe",
|
|
79
|
+
"core.login.wechat": "Connexion WeChat en un clic",
|
|
80
|
+
"core.login.wechatBindTip": "Ce compte WeChat n'a pas encore été lié. Veuillez vous connecter à votre compte existant pour terminer la liaison.",
|
|
81
|
+
"core.login.wechatFailed": "La connexion à WeChat a échoué, veuillez réessayer plus tard.",
|
|
82
|
+
"core.navigation.home": "Accueil",
|
|
83
|
+
"core.navigation.error.access": "Mode d'accès au menu invalide : {access}",
|
|
84
|
+
"core.navigation.error.childTab": "Seul le menu secondaire mobile peut être utilisé comme onglet : {name}",
|
|
85
|
+
"core.navigation.error.cycle": "Il y a un parent de boucle dans le menu mobile : {name}",
|
|
86
|
+
"core.navigation.error.identity": "Identifiant de menu, nom ou application/chemin non valide",
|
|
87
|
+
"core.navigation.error.itemObject": "L'élément de menu n'est pas un objet",
|
|
88
|
+
"core.navigation.error.listMissing": "Réponse du menu liste plate manquante",
|
|
89
|
+
"core.navigation.error.namePrefix": "Le nom du menu doit utiliser le préfixe de l'application : {name}",
|
|
90
|
+
"core.navigation.error.parentInvalid": "Le numéro parent du menu mobile n'est pas valide : {name}",
|
|
91
|
+
"core.navigation.error.parentMissing": "Il manque le numéro de parent dans le menu : {name}",
|
|
92
|
+
"core.navigation.error.parentNotFound": "Le menu parent du mobile n'existe pas : {name}",
|
|
93
|
+
"core.navigation.error.responseObject": "La réponse du menu n'est pas un objet",
|
|
94
|
+
"core.navigation.error.rootTab": "Le menu secondaire mobile doit être utilisé comme onglet : {name}",
|
|
95
|
+
"core.navigation.error.tabCount": "tabBar ne peut configurer que 0 ou 2 à 5 éléments",
|
|
96
|
+
"core.navigation.error.unique": "L'identifiant, le nom et le chemin du menu doivent être uniques",
|
|
97
|
+
"core.navigation.error.viewKey": "ViewKey non enregistré : {viewKey}",
|
|
98
|
+
"core.navigation.my": "Le mien",
|
|
99
|
+
"core.navigation.protocol": "Détails de l'accord",
|
|
100
|
+
"core.protocol.loadFailed": "Échec du chargement de la configuration mobile",
|
|
101
|
+
"core.protocol.notConfigured": "{title} n'est pas configuré et ne peut pas être affiché temporairement.",
|
|
102
|
+
"core.protocol.privacy": "Accord de confidentialité",
|
|
103
|
+
"core.protocol.service": "Conditions d'utilisation",
|
|
104
|
+
"core.status.CONFIG_ERROR": "Configuration de navigation invalide",
|
|
105
|
+
"core.status.FORBIDDEN": "Pas encore d'accès\nLa page",
|
|
106
|
+
"core.status.NOT_FOUND": "n'existe pas",
|
|
107
|
+
"core.status.OFFLINE": "Réseau indisponible\nLa page",
|
|
108
|
+
"core.status.PAGE_UNAVAILABLE": "est temporairement indisponible",
|
|
109
|
+
"core.status.loading": "est en cours de chargement",
|
|
110
|
+
"core.webview.embedBlocked": "La page H5 actuelle peut être restreinte par le site cible pour l'intégration",
|
|
111
|
+
"core.webview.invalidUrl": "Adresse de lien valide manquante",
|
|
112
|
+
"core.webview.openFailed": "Le lien ne peut pas être ouvert"
|
|
113
|
+
}
|