@liujitcn/kratos-admin-core 0.0.19 → 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.
Files changed (110) hide show
  1. package/README.md +2 -2
  2. package/dist/package/declarations/src/api/base/language.d.ts +8 -0
  3. package/dist/package/declarations/src/components/Dialog/ProDialog.vue.d.ts +1 -0
  4. package/dist/package/declarations/src/components/LocaleSwitch/index.vue.d.ts +3 -0
  5. package/dist/package/declarations/src/index.d.ts +2 -0
  6. package/dist/package/declarations/src/locales/index.d.ts +63 -0
  7. package/dist/package/declarations/src/modules/index.d.ts +7 -2
  8. package/dist/package/declarations/src/request.d.ts +1 -0
  9. package/dist/package/declarations/src/routers/modules/staticRouter.d.ts +1 -0
  10. package/dist/package/declarations/src/rpc/base/v1/config.d.ts +2 -0
  11. package/dist/package/declarations/src/rpc/base/v1/language.d.ts +26 -0
  12. package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +79 -0
  13. package/dist/package/declarations/src/rpc/system/admin/v1/base_translation.d.ts +102 -0
  14. package/dist/package/declarations/src/stores/interface/index.d.ts +2 -0
  15. package/dist/package/declarations/src/stores/runtime.d.ts +1 -0
  16. package/dist/package/declarations/src/utils/dict.d.ts +2 -2
  17. package/dist/package/declarations/src/utils/index.d.ts +1 -1
  18. package/dist/package/declarations/src/utils/oauthProvider.d.ts +2 -0
  19. package/dist/package/declarations/src/utils/passwordStrength.d.ts +0 -7
  20. package/dist/package/src/App.vue +10 -1
  21. package/dist/package/src/api/base/language.ts +20 -0
  22. package/dist/package/src/api/base/oauth.ts +0 -1
  23. package/dist/package/src/api/system/auth.ts +0 -1
  24. package/dist/package/src/bootstrap.ts +57 -2
  25. package/dist/package/src/components/CronExpression/index.vue +80 -82
  26. package/dist/package/src/components/Dialog/FormDialog.vue +9 -4
  27. package/dist/package/src/components/Dialog/ProDialog.vue +10 -4
  28. package/dist/package/src/components/Dict/index.vue +5 -2
  29. package/dist/package/src/components/ECharts/config/index.ts +6 -1
  30. package/dist/package/src/components/ErrorMessage/index.vue +3 -1
  31. package/dist/package/src/components/ImportExcel/index.vue +29 -18
  32. package/dist/package/src/components/LocaleSwitch/index.vue +28 -0
  33. package/dist/package/src/components/PasswordStrength/index.vue +8 -5
  34. package/dist/package/src/components/ProForm/components/DynamicList.vue +8 -3
  35. package/dist/package/src/components/ProForm/components/KvList.vue +14 -6
  36. package/dist/package/src/components/ProTable/components/ColSetting.vue +7 -5
  37. package/dist/package/src/components/ProTable/components/TableColumn.vue +2 -1
  38. package/dist/package/src/components/ProTable/index.vue +36 -11
  39. package/dist/package/src/components/SearchForm/components/SearchFormItem.vue +9 -4
  40. package/dist/package/src/components/SearchForm/index.vue +6 -3
  41. package/dist/package/src/components/SelectFilter/index.vue +4 -1
  42. package/dist/package/src/components/SelectIcon/index.vue +8 -4
  43. package/dist/package/src/components/TreeFilter/index.vue +14 -6
  44. package/dist/package/src/components/Upload/File.vue +18 -13
  45. package/dist/package/src/components/Upload/Files.vue +22 -15
  46. package/dist/package/src/components/Upload/Img.vue +14 -11
  47. package/dist/package/src/components/Upload/Imgs.vue +15 -12
  48. package/dist/package/src/components/WangEditor/index.vue +12 -4
  49. package/dist/package/src/directives/modules/copy.ts +2 -1
  50. package/dist/package/src/hooks/useDownload.ts +3 -2
  51. package/dist/package/src/hooks/useHandleData.ts +5 -4
  52. package/dist/package/src/hooks/useTheme.ts +2 -1
  53. package/dist/package/src/hooks/useTime.ts +11 -2
  54. package/dist/package/src/index.ts +2 -0
  55. package/dist/package/src/layouts/components/Header/ToolBarRight.vue +2 -0
  56. package/dist/package/src/layouts/components/Header/components/AssemblySize.vue +8 -6
  57. package/dist/package/src/layouts/components/Header/components/Avatar.vue +11 -9
  58. package/dist/package/src/layouts/components/Header/components/Breadcrumb.vue +10 -2
  59. package/dist/package/src/layouts/components/Header/components/Fullscreen.vue +4 -2
  60. package/dist/package/src/layouts/components/Header/components/InfoDialog.vue +6 -3
  61. package/dist/package/src/layouts/components/Header/components/PasswordDialog.vue +6 -3
  62. package/dist/package/src/layouts/components/Header/components/SearchMenu.vue +5 -3
  63. package/dist/package/src/layouts/components/Header/components/ThemeSetting.vue +3 -1
  64. package/dist/package/src/layouts/components/Tabs/components/MoreButton.vue +9 -7
  65. package/dist/package/src/layouts/components/ThemeDrawer/index.vue +27 -24
  66. package/dist/package/src/locales/README.md +15 -0
  67. package/dist/package/src/locales/en-US.json +258 -0
  68. package/dist/package/src/locales/es-ES.json +258 -0
  69. package/dist/package/src/locales/fr-FR.json +258 -0
  70. package/dist/package/src/locales/index.ts +223 -0
  71. package/dist/package/src/locales/ja-JP.json +258 -0
  72. package/dist/package/src/locales/ko-KR.json +258 -0
  73. package/dist/package/src/locales/zh-CN.json +258 -0
  74. package/dist/package/src/locales/zh-TW.json +258 -0
  75. package/dist/package/src/modules/index.ts +7 -2
  76. package/dist/package/src/modules/kratosAdmin.ts +19 -1
  77. package/dist/package/src/request.ts +8 -1
  78. package/dist/package/src/routers/index.ts +4 -1
  79. package/dist/package/src/routers/modules/dynamicRouter.ts +3 -2
  80. package/dist/package/src/routers/modules/staticRouter.ts +8 -4
  81. package/dist/package/src/rpc/base/v1/config.ts +2 -0
  82. package/dist/package/src/rpc/base/v1/language.ts +37 -0
  83. package/dist/package/src/rpc/system/admin/v1/base_dict.ts +81 -0
  84. package/dist/package/src/rpc/system/admin/v1/base_translation.ts +117 -0
  85. package/dist/package/src/stores/interface/index.ts +2 -0
  86. package/dist/package/src/stores/modules/config.ts +5 -1
  87. package/dist/package/src/stores/modules/user.ts +2 -1
  88. package/dist/package/src/stores/runtime.ts +1 -0
  89. package/dist/package/src/utils/color.ts +5 -4
  90. package/dist/package/src/utils/dict.ts +27 -4
  91. package/dist/package/src/utils/eleValidate.ts +3 -2
  92. package/dist/package/src/utils/errorHandler.ts +9 -8
  93. package/dist/package/src/utils/index.ts +7 -6
  94. package/dist/package/src/utils/oauthProvider.ts +15 -10
  95. package/dist/package/src/utils/passwordCrypto.ts +3 -2
  96. package/dist/package/src/utils/passwordStrength.ts +1 -16
  97. package/dist/package/src/utils/request.ts +13 -8
  98. package/dist/package/src/views/error/403.vue +3 -1
  99. package/dist/package/src/views/error/404.vue +3 -1
  100. package/dist/package/src/views/error/500.vue +3 -1
  101. package/dist/package/src/views/error/pending.vue +5 -2
  102. package/dist/package/src/views/login/components/LoginForm.vue +53 -27
  103. package/dist/package/src/views/login/index.scss +6 -0
  104. package/dist/package/src/views/login/index.vue +2 -0
  105. package/dist/package/types/generated/auto-imports.d.ts +129 -111
  106. package/dist/package/types/generated/components.d.ts +67 -67
  107. package/package.json +3 -1
  108. package/types/generated/auto-imports.d.ts +129 -111
  109. package/types/generated/components.d.ts +67 -67
  110. package/vite.config.ts +8 -0
@@ -0,0 +1,223 @@
1
+ /**
2
+ * 管理端国际化运行时:合并 core 和业务模块语言包,并为 Vue I18n、组件和请求层提供统一入口。
3
+ * 各语言 JSON 由对应模块定义文件导入,不能在 JSON 文件内添加注释。
4
+ */
5
+ import dayjs from "dayjs";
6
+ import "dayjs/locale/en";
7
+ import "dayjs/locale/ja";
8
+ import "dayjs/locale/zh-cn";
9
+ import "dayjs/locale/zh-tw";
10
+ import "dayjs/locale/ko";
11
+ import "dayjs/locale/fr";
12
+ import "dayjs/locale/es";
13
+ import { computed, readonly, ref } from "vue";
14
+ import { createI18n } from "vue-i18n";
15
+ import type { AdminModule } from "../modules";
16
+ import type { GetLanguageResponse } from "../rpc/base/v1/language";
17
+
18
+ /** 管理端支持的语言区域。 */
19
+ export const SUPPORTED_LOCALES = ["zh-CN", "zh-TW", "en-US", "ja-JP", "ko-KR", "fr-FR", "es-ES"] as const;
20
+ /** 管理端支持的语言区域类型。 */
21
+ export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];
22
+ /** 单个模块的扁平语言包。 */
23
+ export type LocaleMessages = Record<string, string>;
24
+ /** 翻译插值参数。 */
25
+ export type LocaleParams = Record<string, string | number>;
26
+
27
+ /** 运行时语言选项。 */
28
+ export interface LocaleOption {
29
+ /** 标准语言代码。 */
30
+ language_code: SupportedLocale;
31
+ /** 语言名称。 */
32
+ language_name: string;
33
+ /** 本地语言名称。 */
34
+ native_name: string;
35
+ /** 排序值。 */
36
+ sort: number;
37
+ }
38
+
39
+ export const DEFAULT_LOCALE: SupportedLocale = "zh-CN";
40
+ export const LOCALE_STORAGE_KEY = "kratos-admin:locale";
41
+
42
+ const mutableLocale = ref<SupportedLocale>(DEFAULT_LOCALE);
43
+ const mutableLanguageOptions = ref<LocaleOption[]>([]);
44
+ const localeChangeHandlers = new Set<() => void | Promise<void>>();
45
+
46
+ /** 管理端 Vue I18n 实例。 */
47
+ export const adminI18n = createI18n({
48
+ legacy: false,
49
+ locale: DEFAULT_LOCALE,
50
+ fallbackLocale: DEFAULT_LOCALE,
51
+ flatJson: true,
52
+ messages: {},
53
+ missingWarn: false,
54
+ fallbackWarn: false
55
+ });
56
+
57
+ /** 规范化任意语言输入到管理端白名单。 */
58
+ export function normalizeLocale(value?: string): SupportedLocale {
59
+ const normalized = String(value ?? "")
60
+ .replace("_", "-")
61
+ .toLowerCase();
62
+ if (normalized.startsWith("ja")) return "ja-JP";
63
+ if (normalized.startsWith("en")) return "en-US";
64
+ if (normalized.startsWith("zh-tw") || normalized.startsWith("zh-hk") || normalized.startsWith("zh-mo")) return "zh-TW";
65
+ if (normalized.startsWith("ko")) return "ko-KR";
66
+ if (normalized.startsWith("fr")) return "fr-FR";
67
+ if (normalized.startsWith("es")) return "es-ES";
68
+ return DEFAULT_LOCALE;
69
+ }
70
+
71
+ /** 将接口或系统语言代码解析为已打包的语言区域。 */
72
+ function parseSupportedLocale(value?: string): SupportedLocale | undefined {
73
+ const normalized = String(value ?? "").replace("_", "-").toLowerCase();
74
+ if (normalized.startsWith("zh-tw") || normalized.startsWith("zh-hk") || normalized.startsWith("zh-mo")) return "zh-TW";
75
+ if (normalized.startsWith("zh")) return "zh-CN";
76
+ if (normalized.startsWith("en")) return "en-US";
77
+ if (normalized.startsWith("ja")) return "ja-JP";
78
+ if (normalized.startsWith("ko")) return "ko-KR";
79
+ if (normalized.startsWith("fr")) return "fr-FR";
80
+ if (normalized.startsWith("es")) return "es-ES";
81
+ return undefined;
82
+ }
83
+
84
+ /** 注册模块语言包并校验七语键、占位符和命名空间。 */
85
+ export function registerLocaleMessages(modules: AdminModule[]): void {
86
+ const merged = new Map<SupportedLocale, LocaleMessages>(SUPPORTED_LOCALES.map(locale => [locale, {}]));
87
+
88
+ modules.forEach(module => {
89
+ if (!module.messages) return;
90
+ const expectedKeys = Object.keys(module.messages[DEFAULT_LOCALE] ?? {}).sort();
91
+ SUPPORTED_LOCALES.forEach(locale => {
92
+ const messages = module.messages?.[locale];
93
+ if (!messages) throw new Error(`${module.name} 缺少 ${locale} 语言包`);
94
+ const keys = Object.keys(messages).sort();
95
+ if (keys.join("\u0000") !== expectedKeys.join("\u0000")) {
96
+ throw new Error(`${module.name} 的 ${locale} 语言包键集合不一致`);
97
+ }
98
+
99
+ const target = merged.get(locale) as LocaleMessages;
100
+ keys.forEach(key => {
101
+ assertLocaleKeyNamespace(module.name, key);
102
+ if (Object.prototype.hasOwnProperty.call(target, key)) {
103
+ throw new Error(`${locale} 语言键重复: ${key}`);
104
+ }
105
+ assertLocalePlaceholders(module.name, key, messages[key], module.messages?.[DEFAULT_LOCALE]?.[key] ?? "");
106
+ target[key] = messages[key];
107
+ });
108
+ });
109
+ });
110
+
111
+ SUPPORTED_LOCALES.forEach(locale => adminI18n.global.setLocaleMessage(locale, merged.get(locale) ?? {}));
112
+ }
113
+
114
+ /** 初始化持久化语言偏好并同步日期库。 */
115
+ export function initializeLocale(): SupportedLocale {
116
+ const stored = window.localStorage.getItem(LOCALE_STORAGE_KEY) ?? "";
117
+ const preferred = stored || window.navigator.languages?.[0] || window.navigator.language;
118
+ applyLocale(normalizeLocale(preferred));
119
+ return mutableLocale.value;
120
+ }
121
+
122
+ /** 应用后端语言配置,并在当前语言不可用时回退到接口主语言。 */
123
+ export function applyLanguageConfig(response: GetLanguageResponse): void {
124
+ const options = response.languages.reduce<LocaleOption[]>((items, item) => {
125
+ const languageCode = parseSupportedLocale(item.language_code);
126
+ if (!languageCode || items.some((option) => option.language_code === languageCode)) return items;
127
+ items.push({
128
+ language_code: languageCode,
129
+ language_name: item.language_name || t(`common.language.${languageCode}`),
130
+ native_name: item.native_name || item.language_name || languageCode,
131
+ sort: item.sort,
132
+ });
133
+ return items;
134
+ }, []);
135
+ mutableLanguageOptions.value = options.length ? options.sort((left, right) => left.sort - right.sort) : getFallbackLanguageOptions();
136
+ const availableLocales = getSupportedLocales();
137
+ const primaryLocale = parseSupportedLocale(response.primary_language_code);
138
+ if (!availableLocales.includes(mutableLocale.value)) {
139
+ applyLocale(primaryLocale && availableLocales.includes(primaryLocale) ? primaryLocale : availableLocales[0] ?? DEFAULT_LOCALE);
140
+ }
141
+ }
142
+
143
+ /** 获取当前接口配置的语言选项。 */
144
+ export function getLanguageOptions(): LocaleOption[] {
145
+ return mutableLanguageOptions.value.length ? mutableLanguageOptions.value : getFallbackLanguageOptions();
146
+ }
147
+
148
+ /** 获取当前可切换的语言区域。 */
149
+ export function getSupportedLocales(): SupportedLocale[] {
150
+ return getLanguageOptions().map((item) => item.language_code);
151
+ }
152
+
153
+ /** 获取当前规范语言区域。 */
154
+ export function getCurrentLocale(): SupportedLocale {
155
+ return mutableLocale.value;
156
+ }
157
+
158
+ /** 获取非 Axios 请求统一使用的语言头。 */
159
+ export function getLocaleRequestHeaders(): Record<"Accept-Language", SupportedLocale> {
160
+ return { "Accept-Language": getCurrentLocale() };
161
+ }
162
+
163
+ /** 切换语言并刷新动态本地化数据。 */
164
+ export async function setCurrentLocale(value: SupportedLocale): Promise<void> {
165
+ const locale = normalizeLocale(value);
166
+ if (!getSupportedLocales().includes(locale)) return;
167
+ if (locale === mutableLocale.value) return;
168
+ applyLocale(locale);
169
+ window.localStorage.setItem(LOCALE_STORAGE_KEY, locale);
170
+ for (const handler of localeChangeHandlers) await handler();
171
+ }
172
+
173
+ /** 注册语言切换后的动态数据刷新处理器。 */
174
+ export function registerLocaleChangeHandler(handler: () => void | Promise<void>): () => void {
175
+ localeChangeHandlers.add(handler);
176
+ return () => localeChangeHandlers.delete(handler);
177
+ }
178
+
179
+ /** 在非组件代码中翻译稳定语言键。 */
180
+ export function t(key: string, params: LocaleParams = {}): string {
181
+ return String(adminI18n.global.t(key, params));
182
+ }
183
+
184
+ /** 管理端响应式语言状态。 */
185
+ export function useLocaleStore() {
186
+ return {
187
+ locale: readonly(mutableLocale),
188
+ localeIndex: computed(() => Math.max(0, getSupportedLocales().indexOf(mutableLocale.value))),
189
+ languageOptions: computed(() => getLanguageOptions()),
190
+ supportedLocales: computed(() => getSupportedLocales()),
191
+ setLocale: setCurrentLocale,
192
+ t
193
+ };
194
+ }
195
+
196
+ function getFallbackLanguageOptions(): LocaleOption[] {
197
+ return SUPPORTED_LOCALES.map((languageCode, sort) => ({
198
+ language_code: languageCode,
199
+ language_name: t(`common.language.${languageCode}`),
200
+ native_name: languageCode,
201
+ sort,
202
+ }));
203
+ }
204
+
205
+ function applyLocale(locale: SupportedLocale): void {
206
+ mutableLocale.value = locale;
207
+ adminI18n.global.locale.value = locale;
208
+ dayjs.locale({ "zh-CN": "zh-cn", "zh-TW": "zh-tw", "en-US": "en", "ja-JP": "ja", "ko-KR": "ko", "fr-FR": "fr", "es-ES": "es" }[locale]);
209
+ document.documentElement.lang = locale;
210
+ }
211
+
212
+ function assertLocaleKeyNamespace(moduleName: string, key: string): void {
213
+ const valid =
214
+ moduleName === "kratos-admin" ? key.startsWith("common.") || key.startsWith("core.") : key.startsWith(`${moduleName}.`);
215
+ if (!valid) throw new Error(`${moduleName} 的语言键命名空间无效: ${key}`);
216
+ }
217
+
218
+ function assertLocalePlaceholders(moduleName: string, key: string, message: string, sourceMessage: string): void {
219
+ const placeholders = (value: string) => [...value.matchAll(/\{([A-Za-z0-9_]+)\}/g)].map(match => match[1]).sort();
220
+ if (placeholders(message).join("\u0000") !== placeholders(sourceMessage).join("\u0000")) {
221
+ throw new Error(`${moduleName} 的 ${key} 占位符集合不一致`);
222
+ }
223
+ }
@@ -0,0 +1,258 @@
1
+ {
2
+ "common.action.back": "戻る",
3
+ "common.action.cancel": "キャンセル",
4
+ "common.action.close": "閉じる",
5
+ "common.action.confirm": "確認",
6
+ "common.action.create": "新規作成",
7
+ "common.action.delete": "削除",
8
+ "common.action.download": "ダウンロード",
9
+ "common.action.edit": "編集",
10
+ "common.action.expand": "展開",
11
+ "common.action.collapse": "折りたたむ",
12
+ "common.action.login": "ログイン",
13
+ "common.action.logout": "ログアウト",
14
+ "common.action.reset": "リセット",
15
+ "common.action.retry": "再試行",
16
+ "common.action.save": "保存",
17
+ "common.action.search": "検索",
18
+ "common.action.upload": "アップロード",
19
+ "common.action.view": "表示",
20
+ "common.field.endTime": "終了日時",
21
+ "common.field.language": "言語",
22
+ "common.field.operation": "操作",
23
+ "common.field.parameterName": "パラメーター名",
24
+ "common.field.parameterValue": "パラメーター値",
25
+ "common.field.phone": "携帯電話番号",
26
+ "common.field.startTime": "開始日時",
27
+ "common.language.en-US": "English",
28
+ "common.language.ja-JP": "日本語",
29
+ "common.language.zh-CN": "简体中文",
30
+ "common.language.zh-TW": "繁体字中国語",
31
+ "common.language.ko-KR": "韓国語",
32
+ "common.language.fr-FR": "フランス語",
33
+ "common.language.es-ES": "スペイン語",
34
+ "common.message.loading": "読み込み中",
35
+ "common.message.noData": "データがありません",
36
+ "common.message.operationSuccess": "操作が完了しました",
37
+ "common.message.systemError": "システムエラー",
38
+ "common.message.unknown": "現在処理できません。しばらくしてから再試行してください。",
39
+ "common.validation.phoneInvalid": "正しい携帯電話番号を入力してください",
40
+ "common.validation.phoneRequired": "携帯電話番号を入力してください",
41
+ "common.title.notice": "お知らせ",
42
+ "common.title.warning": "確認",
43
+ "common.placeholder.input": "入力してください",
44
+ "common.placeholder.inputContent": "内容を入力してください",
45
+ "common.placeholder.select": "選択してください",
46
+ "common.status.disabled": "無効",
47
+ "common.status.enabled": "有効",
48
+ "common.value.female": "女性",
49
+ "common.value.male": "男性",
50
+ "common.value.all": "すべて",
51
+ "core.auth.loginAgain": "再ログイン",
52
+ "core.auth.refreshTokenMissing": "リフレッシュトークンがありません",
53
+ "core.auth.sessionExpired": "セッションの有効期限が切れました。再度ログインしてください。",
54
+ "core.auth.noMenuPermission": "このアカウントにはメニュー権限がありません。管理者にお問い合わせください。",
55
+ "core.auth.noPermission": "アクセス権限がありません",
56
+ "core.clipboard.success": "コピーしました",
57
+ "core.cron.cycleUnit.day": "日",
58
+ "core.cron.cycleUnit.hour": "時間",
59
+ "core.cron.cycleUnit.minute": "分",
60
+ "core.cron.cycleUnit.month": "か月",
61
+ "core.cron.cycleUnit.second": "秒",
62
+ "core.cron.cycleUnit.year": "年",
63
+ "core.cron.description.every": "毎{unit}",
64
+ "core.cron.description.range": "{segment}:{start}から{end}",
65
+ "core.cron.description.specific": "{segment}:{values}",
66
+ "core.cron.description.step": "{start}{unit}から開始し、{step}{cycleUnit}ごとに実行",
67
+ "core.cron.description.unspecified": "{segment}は指定なし",
68
+ "core.cron.description.weekday": "今月{day}日に最も近い平日",
69
+ "core.cron.descriptionSeparator": "、",
70
+ "core.cron.edit": "式を編集",
71
+ "core.cron.everyUnit": "毎{unit}",
72
+ "core.cron.expression": "Cron式",
73
+ "core.cron.from": "開始",
74
+ "core.cron.lastDay": "今月の最終日",
75
+ "core.cron.nearestWorkday": "日に最も近い平日",
76
+ "core.cron.notConfigured": "実行ルールが設定されていません",
77
+ "core.cron.placeholder": "Cron式を入力してください",
78
+ "core.cron.preset.dailyEight": "毎日午前8時に実行",
79
+ "core.cron.preset.dailyMidnight": "毎日0時に実行",
80
+ "core.cron.preset.everyFiveMinutes": "5分ごとに実行",
81
+ "core.cron.preset.everyHour": "毎時実行",
82
+ "core.cron.preset.everyMinute": "毎分実行",
83
+ "core.cron.preset.monthlyFirst": "毎月1日の0時に実行",
84
+ "core.cron.preset.nextYearDaily": "来年、毎日0時に実行",
85
+ "core.cron.presets": "よく使う式",
86
+ "core.cron.range": "範囲",
87
+ "core.cron.repeat": "繰り返し",
88
+ "core.cron.runOnce": "{unit}ごとに実行",
89
+ "core.cron.segment.day": "日",
90
+ "core.cron.segment.hour": "時",
91
+ "core.cron.segment.minute": "分",
92
+ "core.cron.segment.month": "月",
93
+ "core.cron.segment.second": "秒",
94
+ "core.cron.segment.year": "年",
95
+ "core.cron.specific": "指定",
96
+ "core.cron.startEvery": "{unit}から、",
97
+ "core.cron.thisMonth": "今月",
98
+ "core.cron.title": "スケジュール式を編集",
99
+ "core.cron.to": "まで",
100
+ "core.cron.unit.day": "日",
101
+ "core.cron.unit.hour": "時",
102
+ "core.cron.unit.minute": "分",
103
+ "core.cron.unit.month": "月",
104
+ "core.cron.unit.second": "秒",
105
+ "core.cron.unit.year": "年",
106
+ "core.cron.unspecified": "指定なし",
107
+ "core.cron.valueSeparator": "、",
108
+ "core.cron.valueWithUnit": "{value}{unit}",
109
+ "core.cron.workday": "平日",
110
+ "core.data.confirmAction": "{action}してもよろしいですか?",
111
+ "core.data.operationSuccess": "{action}しました",
112
+ "core.download.largeFileNotice": "データ量が多い場合、ダウンロードに時間がかかります。しばらくお待ちください。",
113
+ "core.error.403.detail": "このページにアクセスする権限がありません。",
114
+ "core.error.403.title": "アクセスできません",
115
+ "core.error.404.detail": "指定されたページは存在しません。",
116
+ "core.error.404.title": "ページが見つかりません",
117
+ "core.error.500.detail": "サーバーでエラーが発生しました。",
118
+ "core.error.500.title": "サーバーエラー",
119
+ "core.error.pending.detail": "この機能は現在準備中です。",
120
+ "core.error.pending.title": "準備中",
121
+ "core.error.javascript.eval": "Eval の使用エラー",
122
+ "core.error.javascript.internal": "JavaScriptエンジンの内部エラー",
123
+ "core.error.javascript.range": "パラメーターが範囲外です",
124
+ "core.error.javascript.reference": "オブジェクトが見つかりません",
125
+ "core.error.javascript.syntax": "構文エラー",
126
+ "core.error.javascript.type": "型またはオブジェクトが正しくありません",
127
+ "core.error.javascript.unknown": "不明なエラー",
128
+ "core.error.javascript.uri": "URIエラー",
129
+ "core.header.fullscreen": "全画面",
130
+ "core.header.fullscreenExit": "全画面を終了",
131
+ "core.header.fullscreenUnsupported": "このブラウザーは全画面表示に対応していません",
132
+ "core.header.language": "言語を変更",
133
+ "core.header.menuSearch": "メニュー検索",
134
+ "core.header.menuSearchEmpty": "メニューがありません",
135
+ "core.header.menuSearchPlaceholder": "メニュー名またはパスで検索",
136
+ "core.header.size.default": "標準",
137
+ "core.header.size.large": "大",
138
+ "core.header.size.small": "小",
139
+ "core.header.sizeSelect": "コンポーネントサイズ",
140
+ "core.header.theme": "テーマ設定",
141
+ "core.icon.empty": "該当するアイコンがありません",
142
+ "core.icon.placeholder": "アイコンを選択してください",
143
+ "core.icon.search": "アイコンを検索",
144
+ "core.layout.departmentUnassigned": "部署未設定",
145
+ "core.layout.home": "ホーム",
146
+ "core.layout.info": "個人情報",
147
+ "core.layout.passwordChange": "パスワードを変更",
148
+ "core.layout.unnamedMenu": "名称未設定のメニュー",
149
+ "core.layout.logoutConfirm": "ログアウトしますか?",
150
+ "core.layout.logoutSuccess": "ログアウトしました",
151
+ "core.layout.notSet": "未設定",
152
+ "core.layout.profile": "プロフィール",
153
+ "core.layout.roleUnassigned": "ロール未設定",
154
+ "core.login.behaviorClick": "文字を順番にクリックしてください",
155
+ "core.login.behaviorConfirm": "確認",
156
+ "core.login.behaviorPuzzle": "スライダーを動かしてパズルを完成してください",
157
+ "core.login.behaviorRotate": "スライダーを動かして内側の画像を正位置にしてください",
158
+ "core.login.captcha": "認証コードを入力してください",
159
+ "core.login.captchaAlt": "認証コード",
160
+ "core.login.greeting.afternoon": "こんにちは",
161
+ "core.login.greeting.evening": "こんばんは",
162
+ "core.login.greeting.morning": "おはようございます",
163
+ "core.login.greeting.night": "こんばんは",
164
+ "core.login.greeting.noon": "こんにちは",
165
+ "core.login.otherMethods": "その他のログイン方法",
166
+ "core.login.password": "パスワードを入力してください",
167
+ "core.login.tenantCode": "テナントコードを入力してください",
168
+ "core.login.userName": "ユーザー名を入力してください",
169
+ "core.login.welcome": "管理コンソールへようこそ",
170
+ "core.oauth.dingtalk": "DingTalk",
171
+ "core.oauth.feishu": "Feishu",
172
+ "core.oauth.wechat": "WeChat",
173
+ "core.oauth.wechatmp": "WeChat公式アカウント",
174
+ "core.oauth.wechatwork": "WeCom",
175
+ "core.oauth.unknown": "不明なプロバイダー",
176
+ "core.password.error": "パスワードは8文字以上で、大文字、小文字、数字、特殊文字をすべて含めてください",
177
+ "core.password.cryptoUnsupported": "この環境はパスワード暗号化に対応していません",
178
+ "core.password.required": "パスワードを入力してください",
179
+ "core.password.strength": "パスワード強度",
180
+ "core.password.strength.empty": "未入力",
181
+ "core.password.strength.high": "高",
182
+ "core.password.strength.low": "低",
183
+ "core.password.strength.medium": "中",
184
+ "core.password.tip": "8文字以上で、大文字、小文字、数字、特殊文字をすべて含めてください。強度が「高」になると送信できます。",
185
+ "core.theme.accordion": "アコーディオンメニュー",
186
+ "core.theme.asideInverted": "ダークサイドバー",
187
+ "core.theme.asideInvertedTip": "サイドバーをダーク配色にします",
188
+ "core.theme.breadcrumb": "パンくずリスト",
189
+ "core.theme.breadcrumbIcon": "パンくずアイコン",
190
+ "core.theme.color": "テーマカラー",
191
+ "core.theme.dark": "ダークモード",
192
+ "core.theme.footer": "フッター",
193
+ "core.theme.global": "グローバルテーマ",
194
+ "core.theme.grey": "グレースケールモード",
195
+ "core.theme.headerInverted": "ダークヘッダー",
196
+ "core.theme.headerInvertedTip": "ヘッダーをダーク配色にします",
197
+ "core.theme.interface": "画面設定",
198
+ "core.theme.layout": "レイアウト",
199
+ "core.theme.layout.classic": "クラシック",
200
+ "core.theme.layout.columns": "カラム",
201
+ "core.theme.layout.transverse": "横型",
202
+ "core.theme.layout.vertical": "縦型",
203
+ "core.theme.menuCollapse": "メニューを折りたたむ",
204
+ "core.theme.primaryReset": "テーマカラーを {color} にリセットしました",
205
+ "core.theme.settings": "レイアウト設定",
206
+ "core.theme.tabs": "タブバー",
207
+ "core.theme.tabsIcon": "タブアイコン",
208
+ "core.theme.watermark": "透かし",
209
+ "core.theme.weak": "色覚サポートモード",
210
+ "core.theme.colorHexInvalid": "正しい16進数カラーを入力してください",
211
+ "core.theme.colorRgbInvalid": "正しいRGBカラーを入力してください",
212
+ "core.route.forbidden": "403 ページ",
213
+ "core.route.login": "ログイン",
214
+ "core.route.notFound": "404 ページ",
215
+ "core.route.serverError": "500 ページ",
216
+ "core.tabs.closeAll": "すべて閉じる",
217
+ "core.tabs.closeCurrent": "現在のタブを閉じる",
218
+ "core.tabs.closeLeft": "左側を閉じる",
219
+ "core.tabs.closeOther": "他を閉じる",
220
+ "core.tabs.closeRight": "右側を閉じる",
221
+ "core.tabs.maximize": "最大化",
222
+ "core.tabs.refresh": "現在のページを更新",
223
+ "core.table.collapseAll": "すべて折りたたむ",
224
+ "core.table.columnName": "列名",
225
+ "core.table.columnSetting": "列設定",
226
+ "core.table.expandAll": "すべて展開",
227
+ "core.table.hideSearch": "検索を非表示",
228
+ "core.table.noConfigurableColumns": "設定可能な列はありません",
229
+ "core.table.refresh": "データを更新",
230
+ "core.table.show": "表示",
231
+ "core.table.showSearch": "検索を表示",
232
+ "core.table.sort": "並べ替え",
233
+ "core.tree.filterPlaceholder": "キーワードを入力して絞り込み",
234
+ "core.tree.resetSelection": "選択をリセット",
235
+ "core.upload.action": "ファイルをアップロード",
236
+ "core.upload.batchAdd": "{resource}を一括追加",
237
+ "core.upload.batchFailed": "{resource}の一括追加に失敗しました。再度アップロードしてください。",
238
+ "core.upload.batchSuccess": "{resource}を一括追加しました",
239
+ "core.upload.click": "クリックしてアップロード",
240
+ "core.upload.dataCover": "データを上書き",
241
+ "core.upload.dragOrClick": "ファイルをここにドロップするか、",
242
+ "core.upload.excelFormat": "{size} MB 以下の標準 .xls / .xlsx ファイルをアップロードしてください",
243
+ "core.upload.file": "ファイルアップロード",
244
+ "core.upload.fileFailed": "ファイルのアップロードに失敗しました。再試行してください。",
245
+ "core.upload.fileFormatInvalid": "対応していないファイル形式です",
246
+ "core.upload.fileSizeExceeded": "ファイルサイズは {size} MB 以下にしてください",
247
+ "core.upload.fileSuccess": "ファイルをアップロードしました",
248
+ "core.upload.imageFailed": "画像のアップロードに失敗しました。再試行してください。",
249
+ "core.upload.imageFormatInvalid": "対応していない画像形式です",
250
+ "core.upload.imageLimitExceeded": "画像は最大 {limit} 件です。既存の画像を削除してからアップロードしてください。",
251
+ "core.upload.imageSizeExceeded": "画像サイズは {size} MB 以下にしてください",
252
+ "core.upload.imageSuccess": "画像をアップロードしました",
253
+ "core.upload.limitExceeded": "ファイルは最大 {limit} 件です。既存のファイルを削除してからアップロードしてください。",
254
+ "core.upload.singleFileOnly": "アップロードできるファイルは1件のみです",
255
+ "core.upload.template": "{resource}テンプレート",
256
+ "core.upload.templateDownload": "テンプレートをダウンロード",
257
+ "core.upload.unnamedFile": "無題のファイル"
258
+ }