@liujitcn/kratos-uni-app-core 0.0.20 → 0.0.23
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 +1 -1
- package/dist/module.mjs +780 -4
- package/dist/vite.mjs +5 -3
- package/package.json +1 -1
- package/src/api/base/language.ts +25 -0
- package/src/bootstrap.ts +21 -0
- package/src/components/BootstrapStatus.vue +4 -1
- package/src/index.ts +1 -0
- package/src/locales/README.md +15 -0
- package/src/locales/en-US.json +107 -0
- package/src/locales/es-ES.json +107 -0
- package/src/locales/fr-FR.json +107 -0
- package/src/locales/generated.ts +22 -0
- package/src/locales/index.ts +216 -0
- package/src/locales/ja-JP.json +107 -0
- package/src/locales/ko-KR.json +107 -0
- package/src/locales/zh-CN.json +107 -0
- package/src/locales/zh-TW.json +107 -0
- package/src/module.ts +7 -0
- package/src/navigation.ts +58 -27
- package/src/pages.ts +3 -3
- package/src/rpc/base/v1/config.ts +14 -1
- package/src/rpc/base/v1/language.ts +31 -0
- package/src/rpc/base/v1/login.ts +14 -1
- package/src/stores/index.ts +1 -0
- package/src/stores/modules/locale.ts +28 -0
- package/src/stores/modules/setting.ts +11 -6
- package/src/utils/file.ts +19 -26
- package/src/utils/http.ts +12 -6
- package/src/utils/passwordCrypto.ts +17 -16
- package/src/views/pages/index/index.vue +16 -14
- package/src/views/pages/login/login.vue +125 -57
- package/src/views/pages/login/protocal.vue +5 -3
- package/src/views/pages/status/index.vue +16 -18
- package/src/views/pages/webview/webview.vue +6 -4
- package/src/vite.ts +4 -3
- package/src/rpc/base/v1/enum.ts +0 -54
- package/src/rpc/system/common/v1/enum.ts +0 -80
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* uni-app 国际化运行时:合并 core 和业务模块语言包,并向 Vue 页面、请求工具暴露统一翻译入口。
|
|
3
|
+
* 各语言 JSON 由模块定义文件导入,不能在 JSON 文件内添加注释。
|
|
4
|
+
*/
|
|
5
|
+
import { readonly, ref } from 'vue'
|
|
6
|
+
import type { KratosAppModule } from '../module'
|
|
7
|
+
import type { OptionLanguageResponse } from '../rpc/base/v1/language'
|
|
8
|
+
import {
|
|
9
|
+
DEFAULT_LOCALE as GENERATED_DEFAULT_LOCALE,
|
|
10
|
+
SUPPORTED_LOCALES as GENERATED_SUPPORTED_LOCALES,
|
|
11
|
+
type GeneratedLocale,
|
|
12
|
+
} from './generated'
|
|
13
|
+
|
|
14
|
+
/** 移动端已打包的语言区域;运行时可切换列表由 base_language 接口决定。 */
|
|
15
|
+
export const SUPPORTED_LOCALES = GENERATED_SUPPORTED_LOCALES
|
|
16
|
+
/** 移动端支持的语言区域类型。 */
|
|
17
|
+
export type SupportedLocale = GeneratedLocale
|
|
18
|
+
/** 单个模块的扁平语言包。 */
|
|
19
|
+
export type LocaleMessages = Record<string, string>
|
|
20
|
+
/** 翻译插值参数。 */
|
|
21
|
+
export type LocaleParams = Record<string, string | number>
|
|
22
|
+
|
|
23
|
+
/** 运行时语言选项。 */
|
|
24
|
+
export interface LocaleOption {
|
|
25
|
+
/** 标准语言代码。 */
|
|
26
|
+
language_code: SupportedLocale
|
|
27
|
+
/** 本地语言名称。 */
|
|
28
|
+
native_name: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const DEFAULT_LOCALE: SupportedLocale = GENERATED_DEFAULT_LOCALE
|
|
32
|
+
const LOCALE_STORAGE_KEY = 'kratos-app:locale'
|
|
33
|
+
const localeMessages = new Map<SupportedLocale, LocaleMessages>()
|
|
34
|
+
const localeChangeHandlers = new Set<() => void | Promise<void>>()
|
|
35
|
+
const mutableLocaleState = ref<SupportedLocale>(DEFAULT_LOCALE)
|
|
36
|
+
const mutableLanguageOptions = ref<LocaleOption[]>([])
|
|
37
|
+
|
|
38
|
+
/** 响应式当前语言区域。 */
|
|
39
|
+
export const localeState = readonly(mutableLocaleState)
|
|
40
|
+
|
|
41
|
+
/** 规范化语言区域到应用白名单。 */
|
|
42
|
+
export function normalizeLocale(value?: string): SupportedLocale {
|
|
43
|
+
return parseSupportedLocale(value) ?? DEFAULT_LOCALE
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** 将接口或系统语言代码解析为已打包的语言区域。 */
|
|
47
|
+
function parseSupportedLocale(value?: string): SupportedLocale | undefined {
|
|
48
|
+
const normalized = String(value || '')
|
|
49
|
+
.replace('_', '-')
|
|
50
|
+
.toLowerCase()
|
|
51
|
+
if (!normalized) return undefined
|
|
52
|
+
const alias =
|
|
53
|
+
normalized.startsWith('zh-hk') || normalized.startsWith('zh-mo') ? 'zh-tw' : normalized
|
|
54
|
+
const exact = SUPPORTED_LOCALES.find((locale) => locale.toLowerCase() === alias)
|
|
55
|
+
if (exact) return exact
|
|
56
|
+
const language = alias.split('-', 1)[0]
|
|
57
|
+
return SUPPORTED_LOCALES.find((locale) => locale.toLowerCase().split('-', 1)[0] === language)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** 初始化持久化语言偏好。 */
|
|
61
|
+
export function initializeLocale(): SupportedLocale {
|
|
62
|
+
const stored = uni.getStorageSync(LOCALE_STORAGE_KEY) as string | undefined
|
|
63
|
+
const systemLanguage = uni.getSystemInfoSync().language
|
|
64
|
+
mutableLocaleState.value = normalizeLocale(stored || systemLanguage)
|
|
65
|
+
if (typeof uni.setLocale === 'function') uni.setLocale(mutableLocaleState.value)
|
|
66
|
+
return mutableLocaleState.value
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** 应用后端语言配置,并在当前语言不可用时回退到接口第一项。 */
|
|
70
|
+
export function applyLanguageConfig(response: OptionLanguageResponse): void {
|
|
71
|
+
const options = response.languages.reduce<LocaleOption[]>((items, item) => {
|
|
72
|
+
const languageCode = parseSupportedLocale(item.language_code)
|
|
73
|
+
if (!languageCode || items.some((option) => option.language_code === languageCode)) return items
|
|
74
|
+
items.push({
|
|
75
|
+
language_code: languageCode,
|
|
76
|
+
native_name: item.native_name || languageCode,
|
|
77
|
+
})
|
|
78
|
+
return items
|
|
79
|
+
}, [])
|
|
80
|
+
mutableLanguageOptions.value = options.length ? options : getFallbackLanguageOptions()
|
|
81
|
+
const availableLocales = getSupportedLocales()
|
|
82
|
+
if (!availableLocales.includes(mutableLocaleState.value)) {
|
|
83
|
+
const locale = availableLocales[0] ?? DEFAULT_LOCALE
|
|
84
|
+
mutableLocaleState.value = locale
|
|
85
|
+
if (typeof uni.setLocale === 'function') uni.setLocale(locale)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** 获取当前接口配置的语言选项。 */
|
|
90
|
+
export function getLanguageOptions(): LocaleOption[] {
|
|
91
|
+
return mutableLanguageOptions.value.length
|
|
92
|
+
? mutableLanguageOptions.value
|
|
93
|
+
: getFallbackLanguageOptions()
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** 获取当前可切换的语言区域。 */
|
|
97
|
+
export function getSupportedLocales(): SupportedLocale[] {
|
|
98
|
+
return getLanguageOptions().map((item) => item.language_code)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** 注册所有模块贡献的语言包并校验语言键集合。 */
|
|
102
|
+
export function registerLocaleMessages(modules: KratosAppModule[]): void {
|
|
103
|
+
localeMessages.clear()
|
|
104
|
+
SUPPORTED_LOCALES.forEach((locale) => localeMessages.set(locale, {}))
|
|
105
|
+
modules.forEach((module) => {
|
|
106
|
+
const expectedKeys = requiredLocaleKeys(module.messages?.[DEFAULT_LOCALE] || {})
|
|
107
|
+
SUPPORTED_LOCALES.forEach((locale) => {
|
|
108
|
+
const messages = module.messages?.[locale]
|
|
109
|
+
if (!messages) throw new Error(`${module.name} 缺少 ${locale} 语言包`)
|
|
110
|
+
const keys = requiredLocaleKeys(messages)
|
|
111
|
+
if (keys.join('\u0000') !== expectedKeys.join('\u0000')) {
|
|
112
|
+
throw new Error(`${module.name} 的 ${locale} 语言包键集合不一致`)
|
|
113
|
+
}
|
|
114
|
+
const target = localeMessages.get(locale) as LocaleMessages
|
|
115
|
+
Object.keys(messages).forEach((key) => {
|
|
116
|
+
if (!key.startsWith('common.') && !key.startsWith('core.') && !key.startsWith('system.')) {
|
|
117
|
+
throw new Error(`${module.name} 的语言键命名空间无效: ${key}`)
|
|
118
|
+
}
|
|
119
|
+
if (Object.prototype.hasOwnProperty.call(target, key)) {
|
|
120
|
+
throw new Error(`${locale} 语言键重复: ${key}`)
|
|
121
|
+
}
|
|
122
|
+
assertLocalePlaceholders(
|
|
123
|
+
module.name,
|
|
124
|
+
key,
|
|
125
|
+
messages[key],
|
|
126
|
+
module.messages?.[DEFAULT_LOCALE]?.[key] || '',
|
|
127
|
+
)
|
|
128
|
+
target[key] = messages[key]
|
|
129
|
+
})
|
|
130
|
+
})
|
|
131
|
+
})
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** 获取当前语言区域。 */
|
|
135
|
+
export function getCurrentLocale(): SupportedLocale {
|
|
136
|
+
return mutableLocaleState.value
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** 获取请求需要携带的语言头。 */
|
|
140
|
+
export function getLocaleRequestHeaders(): Record<'Accept-Language', SupportedLocale> {
|
|
141
|
+
return { 'Accept-Language': getCurrentLocale() }
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** 切换当前语言并通知需要刷新动态本地化数据的模块。 */
|
|
145
|
+
export async function setCurrentLocale(value: SupportedLocale): Promise<void> {
|
|
146
|
+
const locale = normalizeLocale(value)
|
|
147
|
+
if (!getSupportedLocales().includes(locale)) return
|
|
148
|
+
if (locale === mutableLocaleState.value) return
|
|
149
|
+
mutableLocaleState.value = locale
|
|
150
|
+
uni.setStorageSync(LOCALE_STORAGE_KEY, locale)
|
|
151
|
+
if (typeof uni.setLocale === 'function') uni.setLocale(locale)
|
|
152
|
+
for (const handler of localeChangeHandlers) await handler()
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** 注册语言切换后的动态数据刷新处理器。 */
|
|
156
|
+
export function registerLocaleChangeHandler(handler: () => void | Promise<void>): () => void {
|
|
157
|
+
localeChangeHandlers.add(handler)
|
|
158
|
+
return () => localeChangeHandlers.delete(handler)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** 翻译稳定语言键,缺失时回退中文且不展示裸键。 */
|
|
162
|
+
export function t(key: string, params: LocaleParams = {}): string {
|
|
163
|
+
const message =
|
|
164
|
+
localeMessages.get(getCurrentLocale())?.[key] || localeMessages.get(DEFAULT_LOCALE)?.[key]
|
|
165
|
+
if (!message) return localeMessages.get(DEFAULT_LOCALE)?.['common.message.unknown'] || ''
|
|
166
|
+
return message.replace(/\{([A-Za-z0-9_]+)\}/g, (_, name: string) =>
|
|
167
|
+
String(params[name] ?? `{${name}}`),
|
|
168
|
+
)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** 在 Vue 页面中使用响应式国际化能力。 */
|
|
172
|
+
export function useI18n() {
|
|
173
|
+
return {
|
|
174
|
+
locale: localeState,
|
|
175
|
+
setLocale: setCurrentLocale,
|
|
176
|
+
t,
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function assertLocalePlaceholders(
|
|
181
|
+
moduleName: string,
|
|
182
|
+
key: string,
|
|
183
|
+
message: string,
|
|
184
|
+
sourceMessage: string,
|
|
185
|
+
): void {
|
|
186
|
+
const placeholders = (value: string) =>
|
|
187
|
+
[...value.matchAll(/\{([A-Za-z0-9_]+)\}/g)].map((match) => match[1]).sort()
|
|
188
|
+
if (placeholders(message).join('\u0000') !== placeholders(sourceMessage).join('\u0000')) {
|
|
189
|
+
throw new Error(`${moduleName} 的 ${key} 占位符集合不一致`)
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function requiredLocaleKeys(messages: LocaleMessages): string[] {
|
|
194
|
+
return Object.keys(messages)
|
|
195
|
+
.filter((key) => !key.startsWith('common.language.'))
|
|
196
|
+
.sort()
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function getFallbackLanguageOptions(): LocaleOption[] {
|
|
200
|
+
return SUPPORTED_LOCALES.map((languageCode) => ({
|
|
201
|
+
language_code: languageCode,
|
|
202
|
+
native_name: fallbackNativeLanguageName(languageCode),
|
|
203
|
+
}))
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function fallbackNativeLanguageName(languageCode: SupportedLocale): string {
|
|
207
|
+
return {
|
|
208
|
+
'zh-CN': '简体中文',
|
|
209
|
+
'zh-TW': '繁體中文',
|
|
210
|
+
'en-US': 'English',
|
|
211
|
+
'ja-JP': '日本語',
|
|
212
|
+
'ko-KR': '한국어',
|
|
213
|
+
'fr-FR': 'Français',
|
|
214
|
+
'es-ES': 'Español',
|
|
215
|
+
}[languageCode]
|
|
216
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
{
|
|
2
|
+
"common.action.cancel": "キャンセル",
|
|
3
|
+
"common.action.confirm": "確認",
|
|
4
|
+
"common.action.delete": "削除",
|
|
5
|
+
"common.action.login": "ログイン",
|
|
6
|
+
"common.action.logout": "ログアウト",
|
|
7
|
+
"common.action.new": "新規",
|
|
8
|
+
"common.action.open_in_new_window": "新しいウィンドウで開く",
|
|
9
|
+
"common.action.save": "保存",
|
|
10
|
+
"common.field.language": "言語",
|
|
11
|
+
"common.language.en-US": "英語",
|
|
12
|
+
"common.language.ja-JP": "日本語",
|
|
13
|
+
"common.language.zh-CN": "簡体字中国語",
|
|
14
|
+
"common.language.zh-TW": "繁体字中国語",
|
|
15
|
+
"common.language.ko-KR": "韓国語",
|
|
16
|
+
"common.language.fr-FR": "フランス語",
|
|
17
|
+
"common.language.es-ES": "スペイン語",
|
|
18
|
+
"common.message.loading": "読み込み中",
|
|
19
|
+
"common.message.network_error": "ネットワークエラーです。接続を確認して再試行してください。",
|
|
20
|
+
"common.message.request_error": "リクエストに失敗しました",
|
|
21
|
+
"common.message.unknown": "リクエストを処理できません。しばらくしてから再試行してください。",
|
|
22
|
+
"common.title.notice": "お知らせ",
|
|
23
|
+
"core.auth.login_again": "再度ログイン",
|
|
24
|
+
"core.auth.session_expired": "セッションの有効期限が切れました。再度ログインしてください。",
|
|
25
|
+
"core.config.missing": "アプリ設定がありません:{names}",
|
|
26
|
+
"core.crypto.base64_decode_unsupported": "この環境ではBase64デコードをサポートしていません",
|
|
27
|
+
"core.crypto.base64_encode_unsupported": "この環境ではBase64エンコードをサポートしていません",
|
|
28
|
+
"core.crypto.encrypt_failed": "パスワードの暗号化に失敗しました",
|
|
29
|
+
"core.crypto.password_required": "パスワードは必須です",
|
|
30
|
+
"core.crypto.password_too_long": "パスワードが対応可能な長さを超えています",
|
|
31
|
+
"core.crypto.public_key_invalid": "公開鍵が無効です",
|
|
32
|
+
"core.crypto.random_failed": "ランダムデータの生成に失敗しました",
|
|
33
|
+
"core.crypto.unsupported": "この環境ではパスワード暗号化をサポートしていません",
|
|
34
|
+
"core.file.upload_failed": "アップロードに失敗しました",
|
|
35
|
+
"core.home.account_capability": "アカウント機能",
|
|
36
|
+
"core.home.account_capability_description": "プロフィール、アプリ設定、AIアシスタントを利用できます",
|
|
37
|
+
"core.home.cross_platform": "クロスプラットフォームページ",
|
|
38
|
+
"core.home.cross_platform_description": "1つのコードベースでH5とWeChatミニプログラムに対応",
|
|
39
|
+
"core.home.demo_scope": "デモ範囲",
|
|
40
|
+
"core.home.framework": "アプリケーションフレームワーク",
|
|
41
|
+
"core.home.language": "言語",
|
|
42
|
+
"core.home.main_title": "アプリケーションフレームワークの例",
|
|
43
|
+
"core.home.state_management": "状態管理",
|
|
44
|
+
"core.home.static_home": "静的ホーム",
|
|
45
|
+
"core.home.static_home_description": "このページでは業務APIを使わずにフレームワーク情報を表示します",
|
|
46
|
+
"core.home.style_solution": "スタイル",
|
|
47
|
+
"core.home.sub_title": "共通ナビゲーションとアカウント体験",
|
|
48
|
+
"core.home.tech_stack": "技術スタック",
|
|
49
|
+
"core.login.agree_prefix": "以下に同意します:",
|
|
50
|
+
"core.login.agree_separator": "および",
|
|
51
|
+
"core.login.behavior_click": "文字を順番にクリックしてください",
|
|
52
|
+
"core.login.behavior_loading": "読み込み中...",
|
|
53
|
+
"core.login.behavior_puzzle": "スライダーをドラッグしてパズルを完成させてください",
|
|
54
|
+
"core.login.behavior_rotate": "スライダーをドラッグして内側の画像を正しい向きにしてください",
|
|
55
|
+
"core.login.bind_wechat": "ログインしてWeChatを連携",
|
|
56
|
+
"core.login.captcha": "認証コードを入力してください",
|
|
57
|
+
"core.login.captcha_load_failed": "認証コードの読み込みに失敗しました",
|
|
58
|
+
"core.login.captcha_type_missing": "認証方式が設定されていません",
|
|
59
|
+
"core.login.captcha_type_name": "ログイン認証方式",
|
|
60
|
+
"core.login.captcha_type_response_missing": "認証レスポンスに種類がありません",
|
|
61
|
+
"core.login.captcha_write_failed": "認証画像の保存に失敗しました",
|
|
62
|
+
"core.login.default_sub_title": "ようこそ",
|
|
63
|
+
"core.login.login_success": "ログインしました",
|
|
64
|
+
"core.login.password": "パスワードを入力してください",
|
|
65
|
+
"core.login.privacy": "プライバシーポリシー",
|
|
66
|
+
"core.login.protocol_missing": "利用規約とプライバシーポリシーが設定されていません",
|
|
67
|
+
"core.login.protocol_prompt": "先に規約を読み、同意してください。確認すると同意して続行します。",
|
|
68
|
+
"core.login.service": "利用規約",
|
|
69
|
+
"core.login.tenant": "テナントコードを入力してください",
|
|
70
|
+
"core.login.user_name": "ユーザー名を入力してください",
|
|
71
|
+
"core.login.user_name_mobile": "ユーザー名または携帯電話番号を入力してください",
|
|
72
|
+
"core.login.user_name_password": "ユーザー名とパスワードを入力してください",
|
|
73
|
+
"core.login.wechat": "WeChatで続行",
|
|
74
|
+
"core.login.wechat_bind_tip": "このWeChatアカウントは未連携です。既存のアカウントにログインして連携してください。",
|
|
75
|
+
"core.login.wechat_failed": "WeChatログインに失敗しました。後でもう一度お試しください。",
|
|
76
|
+
"core.navigation.home": "ホーム",
|
|
77
|
+
"core.navigation.error.access": "メニューのアクセスモードが無効です:{access}",
|
|
78
|
+
"core.navigation.error.child_tab": "アプリの2階層目のメニューのみタブにできます:{name}",
|
|
79
|
+
"core.navigation.error.cycle": "メニューの親子関係に循環があります:{name}",
|
|
80
|
+
"core.navigation.error.identity": "メニューのid、name、またはapp/パスが無効です",
|
|
81
|
+
"core.navigation.error.item_object": "メニュー項目がオブジェクトではありません",
|
|
82
|
+
"core.navigation.error.list_missing": "メニューのレスポンスにフラットリストがありません",
|
|
83
|
+
"core.navigation.error.name_prefix": "メニュー名はAppで始める必要があります:{name}",
|
|
84
|
+
"core.navigation.error.parent_invalid": "メニューの親idが無効です:{name}",
|
|
85
|
+
"core.navigation.error.parent_missing": "メニューの親idがありません:{name}",
|
|
86
|
+
"core.navigation.error.parent_not_found": "メニューの親が見つかりません:{name}",
|
|
87
|
+
"core.navigation.error.response_object": "メニューのレスポンスがオブジェクトではありません",
|
|
88
|
+
"core.navigation.error.root_tab": "アプリの2階層目メニューはタブである必要があります:{name}",
|
|
89
|
+
"core.navigation.error.tab_count": "tabBarには0個または2~5個の項目を設定してください",
|
|
90
|
+
"core.navigation.error.unique": "メニューのid、name、pathは一意である必要があります",
|
|
91
|
+
"core.navigation.error.view_key": "未登録のviewKeyです:{viewKey}",
|
|
92
|
+
"core.navigation.my": "マイアカウント",
|
|
93
|
+
"core.navigation.protocol": "規約",
|
|
94
|
+
"core.protocol.load_failed": "アプリ設定の読み込みに失敗しました",
|
|
95
|
+
"core.protocol.not_configured": "{title}は未設定のため表示できません",
|
|
96
|
+
"core.protocol.privacy": "プライバシーポリシー",
|
|
97
|
+
"core.protocol.service": "利用規約",
|
|
98
|
+
"core.status.CONFIG_ERROR": "ナビゲーション設定が無効です",
|
|
99
|
+
"core.status.forbidden": "アクセスが拒否されました",
|
|
100
|
+
"core.status.NOT_FOUND": "ページが見つかりません",
|
|
101
|
+
"core.status.offline": "ネットワークに接続できません",
|
|
102
|
+
"core.status.page_unavailable": "ページは一時的に利用できません",
|
|
103
|
+
"core.status.loading": "読み込み中",
|
|
104
|
+
"core.webview.embed_blocked": "遷移先がH5への埋め込みを拒否する場合があります",
|
|
105
|
+
"core.webview.invalid_url": "有効なリンクが指定されていません",
|
|
106
|
+
"core.webview.open_failed": "リンクを開けません"
|
|
107
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
{
|
|
2
|
+
"common.action.cancel": "취소",
|
|
3
|
+
"common.action.confirm": "확인",
|
|
4
|
+
"common.action.delete": "삭제",
|
|
5
|
+
"common.action.login": "로그인",
|
|
6
|
+
"common.action.logout": "로그아웃",
|
|
7
|
+
"common.action.new": "새로 만들기",
|
|
8
|
+
"common.action.open_in_new_window": "새 창에서 열기",
|
|
9
|
+
"common.action.save": "저장",
|
|
10
|
+
"common.field.language": "언어",
|
|
11
|
+
"common.language.en-US": "영어",
|
|
12
|
+
"common.language.ja-JP": "일본어",
|
|
13
|
+
"common.language.zh-CN": "중국어 간체",
|
|
14
|
+
"common.language.zh-TW": "중국어 번체",
|
|
15
|
+
"common.language.ko-KR": "한국어",
|
|
16
|
+
"common.language.fr-FR": "프랑스어",
|
|
17
|
+
"common.language.es-ES": "스페인어",
|
|
18
|
+
"common.message.loading": "로드 중",
|
|
19
|
+
"common.message.network_error": "네트워크 오류입니다. 연결을 확인한 후 다시 시도하세요.",
|
|
20
|
+
"common.message.request_error": "요청에 실패했습니다",
|
|
21
|
+
"common.message.unknown": "요청을 처리할 수 없습니다. 잠시 후 다시 시도하세요.",
|
|
22
|
+
"common.title.notice": "알림",
|
|
23
|
+
"core.auth.login_again": "다시 로그인",
|
|
24
|
+
"core.auth.session_expired": "세션이 만료되었습니다. 다시 로그인하세요.",
|
|
25
|
+
"core.config.missing": "앱 구성이 없습니다: {names}",
|
|
26
|
+
"core.crypto.base64_decode_unsupported": "현재 환경에서는 Base64 디코딩을 지원하지 않습니다",
|
|
27
|
+
"core.crypto.base64_encode_unsupported": "현재 환경에서는 Base64 인코딩을 지원하지 않습니다",
|
|
28
|
+
"core.crypto.encrypt_failed": "비밀번호 암호화에 실패했습니다",
|
|
29
|
+
"core.crypto.password_required": "비밀번호는 필수입니다",
|
|
30
|
+
"core.crypto.password_too_long": "비밀번호가 지원 길이를 초과했습니다",
|
|
31
|
+
"core.crypto.public_key_invalid": "공개 키가 올바르지 않습니다",
|
|
32
|
+
"core.crypto.random_failed": "무작위 데이터를 생성하지 못했습니다",
|
|
33
|
+
"core.crypto.unsupported": "현재 환경에서는 비밀번호 암호화를 지원하지 않습니다",
|
|
34
|
+
"core.file.upload_failed": "업로드에 실패했습니다",
|
|
35
|
+
"core.home.account_capability": "계정 기능",
|
|
36
|
+
"core.home.account_capability_description": "프로필, 앱 설정 및 AI 어시스턴트에 접근할 수 있습니다",
|
|
37
|
+
"core.home.cross_platform": "크로스 플랫폼 페이지",
|
|
38
|
+
"core.home.cross_platform_description": "하나의 코드베이스로 H5와 WeChat 미니 프로그램을 지원합니다",
|
|
39
|
+
"core.home.demo_scope": "데모 범위",
|
|
40
|
+
"core.home.framework": "앱 프레임워크",
|
|
41
|
+
"core.home.language": "언어",
|
|
42
|
+
"core.home.main_title": "애플리케이션 프레임워크 예시",
|
|
43
|
+
"core.home.state_management": "상태 관리",
|
|
44
|
+
"core.home.static_home": "정적 홈",
|
|
45
|
+
"core.home.static_home_description": "이 페이지는 비즈니스 API 없이 프레임워크 정보를 보여줍니다",
|
|
46
|
+
"core.home.style_solution": "스타일",
|
|
47
|
+
"core.home.sub_title": "공통 탐색 및 계정 경험",
|
|
48
|
+
"core.home.tech_stack": "기술 스택",
|
|
49
|
+
"core.login.agree_prefix": "다음에 동의합니다:",
|
|
50
|
+
"core.login.agree_separator": "및",
|
|
51
|
+
"core.login.behavior_click": "문자를 순서대로 클릭하세요",
|
|
52
|
+
"core.login.behavior_loading": "로드 중...",
|
|
53
|
+
"core.login.behavior_puzzle": "슬라이더를 끌어 퍼즐을 완성하세요",
|
|
54
|
+
"core.login.behavior_rotate": "슬라이더를 끌어 안쪽 이미지를 올바른 방향으로 맞추세요",
|
|
55
|
+
"core.login.bind_wechat": "로그인하여 WeChat 연결",
|
|
56
|
+
"core.login.captcha": "인증 코드를 입력하세요",
|
|
57
|
+
"core.login.captcha_load_failed": "인증 코드 로드에 실패했습니다",
|
|
58
|
+
"core.login.captcha_type_missing": "인증 방식이 설정되지 않았습니다",
|
|
59
|
+
"core.login.captcha_type_name": "로그인 인증 방식",
|
|
60
|
+
"core.login.captcha_type_response_missing": "인증 응답에 유형이 없습니다",
|
|
61
|
+
"core.login.captcha_write_failed": "인증 이미지를 저장하지 못했습니다",
|
|
62
|
+
"core.login.default_sub_title": "환영합니다",
|
|
63
|
+
"core.login.login_success": "로그인했습니다",
|
|
64
|
+
"core.login.password": "비밀번호를 입력하세요",
|
|
65
|
+
"core.login.privacy": "개인정보 보호정책",
|
|
66
|
+
"core.login.protocol_missing": "서비스 약관 및 개인정보 보호정책이 설정되지 않았습니다",
|
|
67
|
+
"core.login.protocol_prompt": "먼저 약관을 읽고 동의하세요. 확인을 누르면 동의하고 계속합니다.",
|
|
68
|
+
"core.login.service": "서비스 약관",
|
|
69
|
+
"core.login.tenant": "테넌트 코드를 입력하세요",
|
|
70
|
+
"core.login.user_name": "사용자 이름을 입력하세요",
|
|
71
|
+
"core.login.user_name_mobile": "사용자 이름 또는 휴대폰 번호를 입력하세요",
|
|
72
|
+
"core.login.user_name_password": "사용자 이름과 비밀번호를 입력하세요",
|
|
73
|
+
"core.login.wechat": "WeChat으로 계속",
|
|
74
|
+
"core.login.wechat_bind_tip": "이 WeChat 계정은 연결되지 않았습니다. 기존 계정으로 로그인하여 연결하세요.",
|
|
75
|
+
"core.login.wechat_failed": "WeChat 로그인에 실패했습니다. 잠시 후 다시 시도하세요.",
|
|
76
|
+
"core.navigation.home": "홈",
|
|
77
|
+
"core.navigation.error.access": "메뉴 접근 모드가 올바르지 않습니다: {access}",
|
|
78
|
+
"core.navigation.error.child_tab": "앱의 2단계 메뉴만 탭으로 사용할 수 있습니다: {name}",
|
|
79
|
+
"core.navigation.error.cycle": "메뉴 상위 관계에 순환이 있습니다: {name}",
|
|
80
|
+
"core.navigation.error.identity": "메뉴 id, name 또는 app/ 경로가 올바르지 않습니다",
|
|
81
|
+
"core.navigation.error.item_object": "메뉴 항목이 객체가 아닙니다",
|
|
82
|
+
"core.navigation.error.list_missing": "메뉴 응답에 평면 목록이 없습니다",
|
|
83
|
+
"core.navigation.error.name_prefix": "메뉴 이름은 App으로 시작해야 합니다: {name}",
|
|
84
|
+
"core.navigation.error.parent_invalid": "메뉴 상위 id가 올바르지 않습니다: {name}",
|
|
85
|
+
"core.navigation.error.parent_missing": "메뉴 상위 id가 없습니다: {name}",
|
|
86
|
+
"core.navigation.error.parent_not_found": "메뉴 상위를 찾을 수 없습니다: {name}",
|
|
87
|
+
"core.navigation.error.response_object": "메뉴 응답이 객체가 아닙니다",
|
|
88
|
+
"core.navigation.error.root_tab": "앱의 2단계 메뉴는 탭이어야 합니다: {name}",
|
|
89
|
+
"core.navigation.error.tab_count": "tabBar에는 0개 또는 2~5개의 항목이 있어야 합니다",
|
|
90
|
+
"core.navigation.error.unique": "메뉴 id, name, path는 고유해야 합니다",
|
|
91
|
+
"core.navigation.error.view_key": "등록되지 않은 viewKey입니다: {viewKey}",
|
|
92
|
+
"core.navigation.my": "내 계정",
|
|
93
|
+
"core.navigation.protocol": "약관",
|
|
94
|
+
"core.protocol.load_failed": "앱 구성 로드에 실패했습니다",
|
|
95
|
+
"core.protocol.not_configured": "{title}이(가) 설정되지 않아 볼 수 없습니다",
|
|
96
|
+
"core.protocol.privacy": "개인정보 보호정책",
|
|
97
|
+
"core.protocol.service": "서비스 약관",
|
|
98
|
+
"core.status.CONFIG_ERROR": "탐색 구성이 올바르지 않습니다",
|
|
99
|
+
"core.status.forbidden": "접근이 거부되었습니다",
|
|
100
|
+
"core.status.NOT_FOUND": "페이지를 찾을 수 없습니다",
|
|
101
|
+
"core.status.offline": "네트워크를 사용할 수 없습니다",
|
|
102
|
+
"core.status.page_unavailable": "페이지를 일시적으로 사용할 수 없습니다",
|
|
103
|
+
"core.status.loading": "로드 중",
|
|
104
|
+
"core.webview.embed_blocked": "대상 사이트가 H5 삽입을 차단할 수 있습니다",
|
|
105
|
+
"core.webview.invalid_url": "유효한 링크가 제공되지 않았습니다",
|
|
106
|
+
"core.webview.open_failed": "링크를 열 수 없습니다"
|
|
107
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
{
|
|
2
|
+
"common.action.cancel": "取消",
|
|
3
|
+
"common.action.confirm": "确定",
|
|
4
|
+
"common.action.delete": "删除",
|
|
5
|
+
"common.action.login": "登录",
|
|
6
|
+
"common.action.logout": "退出登录",
|
|
7
|
+
"common.action.new": "新建",
|
|
8
|
+
"common.action.open_in_new_window": "新窗口打开",
|
|
9
|
+
"common.action.save": "保存",
|
|
10
|
+
"common.field.language": "语言",
|
|
11
|
+
"common.language.en-US": "English",
|
|
12
|
+
"common.language.ja-JP": "日本語",
|
|
13
|
+
"common.language.zh-CN": "简体中文",
|
|
14
|
+
"common.language.zh-TW": "繁体中文",
|
|
15
|
+
"common.language.ko-KR": "韩语",
|
|
16
|
+
"common.language.fr-FR": "法语",
|
|
17
|
+
"common.language.es-ES": "西班牙语",
|
|
18
|
+
"common.message.loading": "正在加载",
|
|
19
|
+
"common.message.network_error": "网络错误,换个网络试试",
|
|
20
|
+
"common.message.request_error": "请求错误",
|
|
21
|
+
"common.message.unknown": "暂时无法处理,请稍后重试",
|
|
22
|
+
"common.title.notice": "提示",
|
|
23
|
+
"core.auth.login_again": "重新登录",
|
|
24
|
+
"core.auth.session_expired": "当前页面已失效,请重新登录",
|
|
25
|
+
"core.config.missing": "移动端配置缺失:{names}",
|
|
26
|
+
"core.crypto.base64_decode_unsupported": "当前环境不支持 Base64 解码",
|
|
27
|
+
"core.crypto.base64_encode_unsupported": "当前环境不支持 Base64 编码",
|
|
28
|
+
"core.crypto.encrypt_failed": "密码加密失败",
|
|
29
|
+
"core.crypto.password_required": "密码不能为空",
|
|
30
|
+
"core.crypto.password_too_long": "密码长度超出限制",
|
|
31
|
+
"core.crypto.public_key_invalid": "公钥格式无效",
|
|
32
|
+
"core.crypto.random_failed": "随机数生成失败",
|
|
33
|
+
"core.crypto.unsupported": "当前环境不支持密码加密",
|
|
34
|
+
"core.file.upload_failed": "上传失败",
|
|
35
|
+
"core.home.account_capability": "账户能力",
|
|
36
|
+
"core.home.account_capability_description": "个人资料、应用设置与智能助手入口已保留",
|
|
37
|
+
"core.home.cross_platform": "跨端页面",
|
|
38
|
+
"core.home.cross_platform_description": "同一套页面代码适配 H5 和微信小程序",
|
|
39
|
+
"core.home.demo_scope": "演示范围",
|
|
40
|
+
"core.home.framework": "应用框架",
|
|
41
|
+
"core.home.language": "开发语言",
|
|
42
|
+
"core.home.main_title": "应用框架示例",
|
|
43
|
+
"core.home.state_management": "状态管理",
|
|
44
|
+
"core.home.static_home": "静态首页",
|
|
45
|
+
"core.home.static_home_description": "当前首页用于展示框架信息,不依赖业务接口",
|
|
46
|
+
"core.home.style_solution": "样式方案",
|
|
47
|
+
"core.home.sub_title": "保留通用导航与个人中心体验",
|
|
48
|
+
"core.home.tech_stack": "当前技术栈",
|
|
49
|
+
"core.login.agree_prefix": "我已阅读并同意",
|
|
50
|
+
"core.login.agree_separator": "和",
|
|
51
|
+
"core.login.behavior_click": "请按顺序点击文字",
|
|
52
|
+
"core.login.behavior_loading": "加载中...",
|
|
53
|
+
"core.login.behavior_puzzle": "请拖动滑块完成拼图",
|
|
54
|
+
"core.login.behavior_rotate": "拖动滑块,将内圈图片转正",
|
|
55
|
+
"core.login.bind_wechat": "登录并绑定微信",
|
|
56
|
+
"core.login.captcha": "请输入验证码",
|
|
57
|
+
"core.login.captcha_load_failed": "验证码加载失败",
|
|
58
|
+
"core.login.captcha_type_missing": "登录验证码类型未配置",
|
|
59
|
+
"core.login.captcha_type_name": "登录验证码类型",
|
|
60
|
+
"core.login.captcha_type_response_missing": "验证码接口未返回类型",
|
|
61
|
+
"core.login.captcha_write_failed": "验证码图片写入失败",
|
|
62
|
+
"core.login.default_sub_title": "欢迎使用本应用",
|
|
63
|
+
"core.login.login_success": "登录成功",
|
|
64
|
+
"core.login.password": "请输入密码",
|
|
65
|
+
"core.login.privacy": "《隐私协议》",
|
|
66
|
+
"core.login.protocol_missing": "服务条款和隐私协议未配置",
|
|
67
|
+
"core.login.protocol_prompt": "请先阅读并勾选协议内容,点击确定后将自动勾选并继续登录",
|
|
68
|
+
"core.login.service": "《服务条款》",
|
|
69
|
+
"core.login.tenant": "请输入租户编号",
|
|
70
|
+
"core.login.user_name": "请输入用户名或手机号",
|
|
71
|
+
"core.login.user_name_mobile": "请输入用户名/手机号码",
|
|
72
|
+
"core.login.user_name_password": "请输入用户名和密码",
|
|
73
|
+
"core.login.wechat": "微信一键登录",
|
|
74
|
+
"core.login.wechat_bind_tip": "该微信尚未绑定,请登录已有账号完成绑定",
|
|
75
|
+
"core.login.wechat_failed": "微信登录失败,请稍后重试",
|
|
76
|
+
"core.navigation.home": "首页",
|
|
77
|
+
"core.navigation.error.access": "菜单访问模式无效:{access}",
|
|
78
|
+
"core.navigation.error.child_tab": "只有移动端二级菜单可以作为 tab:{name}",
|
|
79
|
+
"core.navigation.error.cycle": "移动端菜单存在循环父级:{name}",
|
|
80
|
+
"core.navigation.error.identity": "菜单 id、name 或 app/ 路径无效",
|
|
81
|
+
"core.navigation.error.item_object": "菜单项不是对象",
|
|
82
|
+
"core.navigation.error.list_missing": "菜单响应缺少扁平列表",
|
|
83
|
+
"core.navigation.error.name_prefix": "菜单名称必须使用 App 前缀:{name}",
|
|
84
|
+
"core.navigation.error.parent_invalid": "移动端菜单父级编号无效:{name}",
|
|
85
|
+
"core.navigation.error.parent_missing": "菜单缺少父级编号:{name}",
|
|
86
|
+
"core.navigation.error.parent_not_found": "移动端菜单父级不存在:{name}",
|
|
87
|
+
"core.navigation.error.response_object": "菜单响应不是对象",
|
|
88
|
+
"core.navigation.error.root_tab": "移动端二级菜单必须作为 tab:{name}",
|
|
89
|
+
"core.navigation.error.tab_count": "tabBar 只能配置 0 或 2-5 项",
|
|
90
|
+
"core.navigation.error.unique": "菜单 id、name、path 必须唯一",
|
|
91
|
+
"core.navigation.error.view_key": "未注册 viewKey:{viewKey}",
|
|
92
|
+
"core.navigation.my": "我的",
|
|
93
|
+
"core.navigation.protocol": "协议详情",
|
|
94
|
+
"core.protocol.load_failed": "移动端配置加载失败",
|
|
95
|
+
"core.protocol.not_configured": "{title}未配置,暂时无法查看",
|
|
96
|
+
"core.protocol.privacy": "隐私协议",
|
|
97
|
+
"core.protocol.service": "服务条款",
|
|
98
|
+
"core.status.CONFIG_ERROR": "导航配置无效",
|
|
99
|
+
"core.status.forbidden": "暂无访问权限",
|
|
100
|
+
"core.status.NOT_FOUND": "页面不存在",
|
|
101
|
+
"core.status.offline": "网络不可用",
|
|
102
|
+
"core.status.page_unavailable": "页面暂不可用",
|
|
103
|
+
"core.status.loading": "正在加载",
|
|
104
|
+
"core.webview.embed_blocked": "当前 H5 页面可能被目标站点限制嵌入",
|
|
105
|
+
"core.webview.invalid_url": "缺少有效链接地址",
|
|
106
|
+
"core.webview.open_failed": "链接无法打开"
|
|
107
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
{
|
|
2
|
+
"common.action.cancel": "取消",
|
|
3
|
+
"common.action.confirm": "確定",
|
|
4
|
+
"common.action.delete": "刪除",
|
|
5
|
+
"common.action.login": "登入",
|
|
6
|
+
"common.action.logout": "退出登入",
|
|
7
|
+
"common.action.new": "新建",
|
|
8
|
+
"common.action.open_in_new_window": "新視窗開啟",
|
|
9
|
+
"common.action.save": "儲存",
|
|
10
|
+
"common.field.language": "語言",
|
|
11
|
+
"common.language.en-US": "English",
|
|
12
|
+
"common.language.ja-JP": "日本語",
|
|
13
|
+
"common.language.zh-CN": "簡體中文",
|
|
14
|
+
"common.language.zh-TW": "繁體中文",
|
|
15
|
+
"common.language.ko-KR": "韓語",
|
|
16
|
+
"common.language.fr-FR": "法語",
|
|
17
|
+
"common.language.es-ES": "西班牙語",
|
|
18
|
+
"common.message.loading": "正在載入",
|
|
19
|
+
"common.message.network_error": "網路錯誤,換個網路試試",
|
|
20
|
+
"common.message.request_error": "請求錯誤",
|
|
21
|
+
"common.message.unknown": "暫時無法處理,請稍後重試",
|
|
22
|
+
"common.title.notice": "提示",
|
|
23
|
+
"core.auth.login_again": "重新登入",
|
|
24
|
+
"core.auth.session_expired": "當前頁面已失效,請重新登入",
|
|
25
|
+
"core.config.missing": "移動端配置缺失:{names}",
|
|
26
|
+
"core.crypto.base64_decode_unsupported": "當前環境不支援 Base64 解碼",
|
|
27
|
+
"core.crypto.base64_encode_unsupported": "當前環境不支援 Base64 編碼",
|
|
28
|
+
"core.crypto.encrypt_failed": "密碼加密失敗",
|
|
29
|
+
"core.crypto.password_required": "密碼不能為空",
|
|
30
|
+
"core.crypto.password_too_long": "密碼長度超出限制",
|
|
31
|
+
"core.crypto.public_key_invalid": "公鑰格式無效",
|
|
32
|
+
"core.crypto.random_failed": "隨機數生成失敗",
|
|
33
|
+
"core.crypto.unsupported": "當前環境不支援密碼加密",
|
|
34
|
+
"core.file.upload_failed": "上傳失敗",
|
|
35
|
+
"core.home.account_capability": "賬戶能力",
|
|
36
|
+
"core.home.account_capability_description": "個人資料、應用設定與智慧助手入口已保留",
|
|
37
|
+
"core.home.cross_platform": "跨端頁面",
|
|
38
|
+
"core.home.cross_platform_description": "同一套頁面程式碼適配 H5 和微信小程式",
|
|
39
|
+
"core.home.demo_scope": "演示範圍",
|
|
40
|
+
"core.home.framework": "應用框架",
|
|
41
|
+
"core.home.language": "開發語言",
|
|
42
|
+
"core.home.main_title": "應用框架示例",
|
|
43
|
+
"core.home.state_management": "狀態管理",
|
|
44
|
+
"core.home.static_home": "靜態首頁",
|
|
45
|
+
"core.home.static_home_description": "當前首頁用於展示框架資訊,不依賴業務介面",
|
|
46
|
+
"core.home.style_solution": "樣式方案",
|
|
47
|
+
"core.home.sub_title": "保留通用導航與個人中心體驗",
|
|
48
|
+
"core.home.tech_stack": "當前技術棧",
|
|
49
|
+
"core.login.agree_prefix": "我已閱讀並同意",
|
|
50
|
+
"core.login.agree_separator": "和",
|
|
51
|
+
"core.login.behavior_click": "請按順序點選文字",
|
|
52
|
+
"core.login.behavior_loading": "載入中...",
|
|
53
|
+
"core.login.behavior_puzzle": "請拖動滑塊完成拼圖",
|
|
54
|
+
"core.login.behavior_rotate": "拖動滑塊,將內圈圖片轉正",
|
|
55
|
+
"core.login.bind_wechat": "登入並繫結微信",
|
|
56
|
+
"core.login.captcha": "請輸入驗證碼",
|
|
57
|
+
"core.login.captcha_load_failed": "驗證碼載入失敗",
|
|
58
|
+
"core.login.captcha_type_missing": "登入驗證碼型別未配置",
|
|
59
|
+
"core.login.captcha_type_name": "登入驗證碼型別",
|
|
60
|
+
"core.login.captcha_type_response_missing": "驗證碼介面未返回型別",
|
|
61
|
+
"core.login.captcha_write_failed": "驗證碼圖片寫入失敗",
|
|
62
|
+
"core.login.default_sub_title": "歡迎使用本應用",
|
|
63
|
+
"core.login.login_success": "登入成功",
|
|
64
|
+
"core.login.password": "請輸入密碼",
|
|
65
|
+
"core.login.privacy": "《隱私協議》",
|
|
66
|
+
"core.login.protocol_missing": "服務條款和隱私協議未配置",
|
|
67
|
+
"core.login.protocol_prompt": "請先閱讀並勾選協議內容,點選確定後將自動勾選並繼續登入",
|
|
68
|
+
"core.login.service": "《服務條款》",
|
|
69
|
+
"core.login.tenant": "請輸入租戶編號",
|
|
70
|
+
"core.login.user_name": "請輸入使用者名稱或手機號",
|
|
71
|
+
"core.login.user_name_mobile": "請輸入使用者名稱/手機號碼",
|
|
72
|
+
"core.login.user_name_password": "請輸入使用者名稱和密碼",
|
|
73
|
+
"core.login.wechat": "微信一鍵登入",
|
|
74
|
+
"core.login.wechat_bind_tip": "該微信尚未繫結,請登入已有賬號完成繫結",
|
|
75
|
+
"core.login.wechat_failed": "微信登入失敗,請稍後重試",
|
|
76
|
+
"core.navigation.home": "首頁",
|
|
77
|
+
"core.navigation.error.access": "選單訪問模式無效:{access}",
|
|
78
|
+
"core.navigation.error.child_tab": "只有移動端二級選單可以作為 tab:{name}",
|
|
79
|
+
"core.navigation.error.cycle": "移動端選單存在迴圈父級:{name}",
|
|
80
|
+
"core.navigation.error.identity": "選單 id、name 或 app/ 路徑無效",
|
|
81
|
+
"core.navigation.error.item_object": "選單項不是物件",
|
|
82
|
+
"core.navigation.error.list_missing": "選單響應缺少扁平列表",
|
|
83
|
+
"core.navigation.error.name_prefix": "選單名稱必須使用 App 字首:{name}",
|
|
84
|
+
"core.navigation.error.parent_invalid": "移動端選單父級編號無效:{name}",
|
|
85
|
+
"core.navigation.error.parent_missing": "選單缺少父級編號:{name}",
|
|
86
|
+
"core.navigation.error.parent_not_found": "移動端選單父級不存在:{name}",
|
|
87
|
+
"core.navigation.error.response_object": "選單響應不是物件",
|
|
88
|
+
"core.navigation.error.root_tab": "移動端二級選單必須作為 tab:{name}",
|
|
89
|
+
"core.navigation.error.tab_count": "tabBar 只能配置 0 或 2-5 項",
|
|
90
|
+
"core.navigation.error.unique": "選單 id、name、path 必須唯一",
|
|
91
|
+
"core.navigation.error.view_key": "未註冊 viewKey:{viewKey}",
|
|
92
|
+
"core.navigation.my": "我的",
|
|
93
|
+
"core.navigation.protocol": "協議詳情",
|
|
94
|
+
"core.protocol.load_failed": "移動端配置載入失敗",
|
|
95
|
+
"core.protocol.not_configured": "{title}未配置,暫時無法檢視",
|
|
96
|
+
"core.protocol.privacy": "隱私協議",
|
|
97
|
+
"core.protocol.service": "服務條款",
|
|
98
|
+
"core.status.CONFIG_ERROR": "導航配置無效",
|
|
99
|
+
"core.status.forbidden": "暫無訪問許可權",
|
|
100
|
+
"core.status.NOT_FOUND": "頁面不存在",
|
|
101
|
+
"core.status.offline": "網路不可用",
|
|
102
|
+
"core.status.page_unavailable": "頁面暫不可用",
|
|
103
|
+
"core.status.loading": "正在載入",
|
|
104
|
+
"core.webview.embed_blocked": "當前 H5 頁面可能被目標站點限制嵌入",
|
|
105
|
+
"core.webview.invalid_url": "缺少有效連結地址",
|
|
106
|
+
"core.webview.open_failed": "連結無法開啟"
|
|
107
|
+
}
|