0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-04-07 23:01:25 -05:00

feat(phrases): add zh-HK and zh-TW translation

This commit is contained in:
Gao Sun 2023-03-30 01:01:59 +08:00
parent f9ca7cc495
commit 5c50957a95
No known key found for this signature in database
GPG key ID: 13EBE123E4773688
121 changed files with 3078 additions and 1 deletions

View file

@ -0,0 +1,6 @@
---
"@logto/phrases": minor
"@logto/phrases-ui": minor
---
add zh-HK and zh-TW translation

View file

@ -14,6 +14,8 @@ import ptPT from './locales/pt-pt/index.js';
import ru from './locales/ru/index.js';
import trTR from './locales/tr-tr/index.js';
import zhCN from './locales/zh-cn/index.js';
import zhHK from './locales/zh-hk/index.js';
import zhTW from './locales/zh-tw/index.js';
import type { LocalePhrase } from './types.js';
export type { LocalePhrase } from './types.js';
@ -32,6 +34,8 @@ export const builtInLanguages = [
'ru',
'tr-TR',
'zh-CN',
'zh-HK',
'zh-TW',
] as const;
export const builtInLanguageOptions = builtInLanguages.map((languageTag) => ({
@ -57,6 +61,8 @@ const resource: Resource = {
ru,
'tr-TR': trTR,
'zh-CN': zhCN,
'zh-HK': zhHK,
'zh-TW': zhTW,
};
export const getDefaultLanguageTag = (language: string): LanguageTag =>

View file

@ -0,0 +1,29 @@
const action = {
sign_in: '登錄',
continue: '繼續',
create_account: '註冊',
create_account_without_linking: '註冊新的帳號',
create: '註冊',
enter_passcode: '輸入驗證碼',
cancel: '取消',
confirm: '確認',
save_password: '保存密碼',
bind: '綁定到 {{address}}',
bind_and_continue: '綁定並繼續',
back: '返回',
nav_back: '返回',
agree: '同意',
got_it: '知道了',
sign_in_with: '通過 {{name}} 繼續',
forgot_password: '忘記密碼?',
switch_to: '切換到{{method}}',
sign_in_via_passcode: '用驗證碼登錄',
sign_in_via_password: '密碼登錄',
change: '更改{{method}}',
link_another_email: '綁定其他電子郵件',
link_another_phone: '綁定其他手機',
link_another_email_or_phone: '綁定電子郵件或手機號碼',
show_password: '顯示密碼',
};
export default action;

View file

@ -0,0 +1,5 @@
const demo_app = {
notification: '提示:先注冊一個賬號,再測試登入體驗。',
};
export default demo_app;

View file

@ -0,0 +1,54 @@
const description = {
email: '郵箱',
phone_number: '手機號',
username: '用戶名',
reminder: '提示',
not_found: '404 頁面不存在',
agree_with_terms: '我已閱讀並同意 ',
agree_with_terms_modal: '請先同意 <link></link> 以繼續',
terms_of_use: '使用條款',
sign_in: '登錄',
privacy_policy: '隱私政策',
create_account: '創建帳號',
or: '或',
and: '和',
enter_passcode: '驗證碼已經發送至你的{{ address }} {{target}}',
passcode_sent: '驗證碼已經發送',
resend_after_seconds: '在 <span>{{ seconds }}</span> 秒後重發',
resend_passcode: '重發驗證碼',
create_account_id_exists: '{{type}}為 {{value}} 的帳號已存在,你要登錄嗎?',
link_account_id_exists: ' {{type}}為 {{value}} 的帳號已註冊,你要綁定至這個帳號嗎?',
sign_in_id_does_not_exist: '{{type}}為 {{value}} 的帳號不存在,你要創建一個新帳號嗎?',
sign_in_id_does_not_exist_alert: '{{type}}為 {{value}} 的帳號不存在。',
create_account_id_exists_alert: '{{type}} {{value}} 已綁定其他帳號。請嘗試其他{{type}}。',
social_identity_exist: ' {{type}} {{value}} 已綁定其他帳號。請嘗試其他{{type}}',
bind_account_title: '綁定或註冊帳號',
social_create_account: '你可以註冊一個新的帳號。',
social_link_email: '你可以綁定其他郵箱',
social_link_phone: '你可以綁定其他手機號',
social_link_email_or_phone: '你可以綁定其他郵箱或手機號',
social_bind_with_existing: '找到了一個已註冊的帳號,你可以直接綁定。',
reset_password: '忘記密碼',
reset_password_description: '輸入{{types, list(type: disjunction;)}},獲取驗證碼以重設密碼。',
new_password: '新密碼',
set_password: '設定密碼',
password_changed: '已重置密碼!',
no_account: '還沒有帳號?',
have_account: ' 已有帳號?',
enter_password: '輸入密碼',
enter_password_for: '輸入{{method}} {{value}} 對應的密碼進行登錄',
enter_username: '設定用戶名',
enter_username_description: '用戶名可以用來進行登錄。用戶名僅可以包含字母、數字和下劃線。',
link_email: '綁定郵箱',
link_phone: '綁定手機',
link_email_or_phone: '綁定郵箱或手機號',
link_email_description: '綁定郵箱以保障你的帳號安全',
link_phone_description: '綁定手機號以保障你的帳號安全',
link_email_or_phone_description: '綁定郵箱或手機號以保障你的帳號安全',
continue_with_more_information: '為保障你的帳號安全,需要你補充以下信息。',
create_your_account: '註冊你的帳號',
sign_in_to_your_account: '登錄你的帳號',
no_region_code_found: '沒有找到區域碼',
};
export default description;

View file

@ -0,0 +1,22 @@
const error = {
general_required: '{{types, list(type: disjunction;)}}必填',
general_invalid: '無效的{{types, list(type: disjunction;)}}',
username_required: '用戶名必填',
password_required: '密碼必填',
username_exists: '用戶名已存在',
username_should_not_start_with_number: '用戶名不能以數字開頭',
username_invalid_charset: '用戶名只能包含英文字母、數字或下劃線。',
invalid_email: '無效的電子郵件',
invalid_phone: '無效的手機號碼',
password_min_length: '密碼最少需要 {{min}} 個字符',
passwords_do_not_match: '兩次輸入的密碼不一致,請重試。',
invalid_password: '密碼至少需要 {{min}} 個字符,並包含字母、數字和符號的組合。',
invalid_passcode: '無效的驗證碼',
invalid_connector_auth: '登錄失敗',
invalid_connector_request: '無效的登錄請求',
unknown: '未知錯誤,請稍後重試。',
invalid_session: '未找到會話,請返回並重新登錄。',
timeout: '請求超時,請稍後重試。',
};
export default error;

View file

@ -0,0 +1,21 @@
import { type LocalePhrase } from '../../types.js';
import action from './action.js';
import demo_app from './demo-app.js';
import description from './description.js';
import error from './error.js';
import input from './input.js';
import secondary from './secondary.js';
const zhHK: LocalePhrase = Object.freeze({
translation: {
input,
secondary,
action,
description,
error,
demo_app,
},
});
export default zhHK;

View file

@ -0,0 +1,10 @@
const input = {
username: '用戶名',
password: '密碼',
email: '電郵',
phone_number: '手機號碼',
confirm_password: '確認密碼',
search_region_code: '搜索區域碼',
};
export default input;

View file

@ -0,0 +1,6 @@
const secondary = {
social_bind_with:
'綁定到已有帳戶? 使用 {{methods, list(type: disjunction;), zhOrSpaces}} 登入並綁定。',
};
export default secondary;

View file

@ -0,0 +1,29 @@
const action = {
sign_in: '登錄',
continue: '繼續',
create_account: '註冊',
create_account_without_linking: '註冊新的帳號',
create: '註冊',
enter_passcode: '輸入驗證碼',
cancel: '取消',
confirm: '確認',
save_password: '保存密碼',
bind: '綁定到 {{address}}',
bind_and_continue: '綁定並繼續',
back: '返回',
nav_back: '返回',
agree: '同意',
got_it: '知道了',
sign_in_with: '通過 {{name}} 繼續',
forgot_password: '忘記密碼?',
switch_to: '切換到{{method}}',
sign_in_via_passcode: '用驗證碼登錄',
sign_in_via_password: '密碼登錄',
change: '更改{{method}}',
link_another_email: '綁定其他郵箱',
link_another_phone: '綁定其他手機',
link_another_email_or_phone: '綁定郵箱或手機號',
show_password: '顯示密碼',
};
export default action;

View file

@ -0,0 +1,5 @@
const demo_app = {
notification: '提示:先註冊一個帳號,再測試登錄體驗。',
};
export default demo_app;

View file

@ -0,0 +1,54 @@
const description = {
email: '郵箱',
phone_number: '手機號碼',
username: '用戶名',
reminder: '提示',
not_found: '404 頁面不存在',
agree_with_terms: '我已閱讀並同意 ',
agree_with_terms_modal: '請先同意 <link></link> 以繼續',
terms_of_use: '使用條款',
sign_in: '登錄',
privacy_policy: '隱私政策',
create_account: '創建帳號',
or: '或',
and: '和',
enter_passcode: '驗證碼已經發送至你的{{ address }} {{target}}',
passcode_sent: '驗證碼已經發送',
resend_after_seconds: '在 <span>{{ seconds }}</span> 秒後重新發送',
resend_passcode: '重新發送驗證碼',
create_account_id_exists: '{{type}}為 {{value}} 的帳號已存在,你要登錄嗎?',
link_account_id_exists: ' {{type}}為 {{value}} 的帳號已註冊,你要綁定至這個帳號嗎?',
sign_in_id_does_not_exist: '{{type}}為 {{value}} 的帳號不存在,你要創建一個新帳號嗎?',
sign_in_id_does_not_exist_alert: '{{type}}為 {{value}} 的帳號不存在。',
create_account_id_exists_alert: '{{type}} {{value}} 已綁定其他帳號。請嘗試其他{{type}}。',
social_identity_exist: ' {{type}} {{value}} 已綁定其他帳號。請嘗試其他{{type}}',
bind_account_title: '綁定或註冊帳號',
social_create_account: '你可以註冊一個新的帳號。',
social_link_email: '你可以綁定其他郵箱',
social_link_phone: '你可以綁定其他手機號碼',
social_link_email_or_phone: '你可以綁定其他郵箱或手機號碼',
social_bind_with_existing: '找到了一個已註冊的帳號,你可以直接綁定。',
reset_password: '忘記密碼',
reset_password_description: '輸入{{types, list(type: disjunction;)}},獲取驗證碼以重設密碼。',
new_password: '新密碼',
set_password: '設置密碼',
password_changed: '已重置密碼!',
no_account: '還沒有帳號?',
have_account: ' 已有帳號?',
enter_password: '輸入密碼',
enter_password_for: '輸入{{method}} {{value}} 對應的密碼進行登錄',
enter_username: '設置用戶名',
enter_username_description: '用戶名可以用來進行登錄。用戶名僅可以包含字母、數字和下劃線。',
link_email: '綁定郵箱',
link_phone: '綁定手機',
link_email_or_phone: '綁定郵箱或手機號碼',
link_email_description: '綁定郵箱以保障你的帳號安全',
link_phone_description: '綁定手機號碼以保障你的帳號安全',
link_email_or_phone_description: '綁定郵箱或手機號碼以保障你的帳號安全',
continue_with_more_information: '為保障你的帳號安全,需要你補充以下信息。',
create_your_account: '註冊你的帳號',
sign_in_to_your_account: '登錄你的帳號',
no_region_code_found: '沒有找到區域碼',
};
export default description;

View file

@ -0,0 +1,22 @@
const error = {
general_required: '{{types, list(type: disjunction;)}}必填',
general_invalid: '無效的{{types, list(type: disjunction;)}}',
username_required: '使用者名稱必填',
password_required: '密碼必填',
username_exists: '使用者名稱已存在',
username_should_not_start_with_number: '使用者名稱不能以數字開頭',
username_invalid_charset: '使用者名稱只能包含英文字母、數字或下劃線。',
invalid_email: '無效的郵箱',
invalid_phone: '無效的手機號',
password_min_length: '密碼最少需要 {{min}} 個字符',
passwords_do_not_match: '兩次輸入的密碼不一致,請重試。',
invalid_password: '密碼至少需要 {{min}} 個字符,並包含字母、數字和符號的組合。',
invalid_passcode: '無效的驗證碼',
invalid_connector_auth: '登錄失敗',
invalid_connector_request: '無效的登錄請求',
unknown: '未知錯誤,請稍後重試。',
invalid_session: '未找到會話,請返回並重新登錄。',
timeout: '請求超時,請稍後重試。',
};
export default error;

View file

@ -0,0 +1,21 @@
import { type LocalePhrase } from '../../types.js';
import action from './action.js';
import demo_app from './demo-app.js';
import description from './description.js';
import error from './error.js';
import input from './input.js';
import secondary from './secondary.js';
const zhTW: LocalePhrase = Object.freeze({
translation: {
input,
secondary,
action,
description,
error,
demo_app,
},
});
export default zhTW;

View file

@ -0,0 +1,10 @@
const input = {
username: '用戶名',
password: '密碼',
email: '電子郵件',
phone_number: '手機號碼',
confirm_password: '確認密碼',
search_region_code: '搜尋區域碼',
};
export default input;

View file

@ -0,0 +1,6 @@
const secondary = {
social_bind_with:
'綁定到已有帳戶?使用 {{methodslist(typedisjunction;)zhOrSpaces}} 登入並綁定。',
};
export default secondary;

View file

@ -14,6 +14,8 @@ import ptPT from './locales/pt-pt/index.js';
import ru from './locales/ru/index.js';
import trTR from './locales/tr-tr/index.js';
import zhCN from './locales/zh-cn/index.js';
import zhHK from './locales/zh-hk/index.js';
import zhTW from './locales/zh-tw/index.js';
import type { LocalePhrase } from './types.js';
export type { LocalePhrase } from './types.js';
@ -32,6 +34,8 @@ export const builtInLanguages = [
'ru',
'tr-TR',
'zh-CN',
'zh-HK',
'zh-TW',
] as const;
export const builtInLanguageOptions = builtInLanguages.map((languageTag) => ({
@ -62,13 +66,15 @@ const resource: Resource = {
en,
es,
fr,
ja,
ko,
'pt-BR': ptBR,
'pt-PT': ptPT,
ru,
'tr-TR': trTR,
'zh-CN': zhCN,
ja,
'zh-HK': zhHK,
'zh-TW': zhTW,
};
export default resource;

View file

@ -0,0 +1,11 @@
const auth = {
authorization_header_missing: 'Authorization 請求頭缺失。',
authorization_token_type_not_supported: 'Authorization token 類型不支援',
unauthorized: '未經授權。請檢查憑證及其範圍。',
forbidden: '禁止訪問。請檢查用戶 role 與權限。',
expected_role_not_found: '未找到期望的 role。請檢查用戶 role 與權限。',
jwt_sub_missing: 'JWT 缺失 `sub`',
require_re_authentication: '需要重新認證以進行受保護操作。',
};
export default auth;

View file

@ -0,0 +1,32 @@
const connector = {
general: '連接器發生錯誤:{{errorDescription}}',
not_found: '找不到可用的 {{type}} 型別的連接器',
not_enabled: '連接器尚未啟用',
invalid_metadata: '連接器 metadata 參數錯誤',
invalid_config_guard: '連接器配置 guard 錯誤',
unexpected_type: '連接器型別錯誤',
insufficient_request_parameters: '請求參數缺失',
invalid_request_parameters: '請求參數錯誤',
invalid_config: '連接器配置錯誤',
invalid_response: '連接器錯誤響應',
template_not_found: '無法從連接器配置中找到對應的模板',
not_implemented: '方法 {{method}} 尚未實現',
social_invalid_access_token: '當前連接器的 access_token 無效',
invalid_auth_code: '當前連接器的授權碼無效',
social_invalid_id_token: '當前連接器的 id_token 無效',
authorization_failed: '用戶授權流程失敗',
social_auth_code_invalid: '無法獲取 access_token請檢查授權 code 是否有效',
more_than_one_sms: '同時存在超過 1 個短信連接器',
more_than_one_email: '同時存在超過 1 個郵件連接器',
more_than_one_connector_factory: '找到多個連接器工廠id 為 {{connectorIds}}),請刪除多餘項目。',
db_connector_type_mismatch: '資料庫中存在一個型別不匹配的連接。',
not_found_with_connector_id: '找不到所給 connector id 對應的連接器',
multiple_instances_not_supported: '你選擇的連接器不支援創建多實例。',
invalid_type_for_syncing_profile: '只有社交連接器可以開啟用戶檔案同步。',
can_not_modify_target: '不可修改連接器 target。',
should_specify_target: '你需要聲明 target 的值。',
multiple_target_with_same_platform: '同一平台上,多個社交連接器不能重複使用相同的 “Target”。',
cannot_overwrite_metadata_for_non_standard_connector: '不可覆蓋該連接器的 metadata 參數。',
};
export default connector;

View file

@ -0,0 +1,8 @@
const entity = {
create_failed: '創建 {{name}} 失敗',
not_exists: '該 {{name}} 不存在',
not_exists_with_id: 'ID 為 `{{id}}` 的 {{name}} 不存在',
not_found: '該資源不存在',
};
export default entity;

View file

@ -0,0 +1,9 @@
const guard = {
invalid_input: '請求中 {{type}} 無效',
invalid_pagination: '分頁參數無效',
can_not_get_tenant_id: '無法從請求中獲取租戶 ID。',
file_size_exceeded: '文件大小超過限制。',
mime_type_not_allowed: '不允許使用此 MIME 類型。',
};
export default guard;

View file

@ -0,0 +1,39 @@
import auth from './auth.js';
import connector from './connector.js';
import entity from './entity.js';
import guard from './guard.js';
import localization from './localization.js';
import log from './log.js';
import oidc from './oidc.js';
import password from './password.js';
import request from './request.js';
import role from './role.js';
import scope from './scope.js';
import session from './session.js';
import sign_in_experiences from './sign-in-experiences.js';
import storage from './storage.js';
import swagger from './swagger.js';
import user from './user.js';
import verification_code from './verification-code.js';
const errors = {
request,
auth,
guard,
oidc,
user,
password,
session,
connector,
verification_code,
sign_in_experiences,
localization,
swagger,
entity,
log,
role,
scope,
storage,
};
export default errors;

View file

@ -0,0 +1,6 @@
const localization = {
cannot_delete_default_language: '你已設置 {{languageTag}} 為你的預設語言,你無法刪除預設語言。',
invalid_translation_structure: '無效的資料格式,請檢查你的輸入並重試。',
};
export default localization;

View file

@ -0,0 +1,5 @@
const log = {
invalid_type: '日誌類型無效。',
};
export default log;

View file

@ -0,0 +1,19 @@
const oidc = {
aborted: '用戶終止了交互。',
invalid_scope: '不支持的 scope: {{scopes}}',
invalid_scope_plural: '不支持的 scope: {{scopes}}',
invalid_token: 'Token 無效',
invalid_client_metadata: '無效的客戶端元數據',
insufficient_scope: '請求 token 缺少權限: {{scopes}}',
invalid_request: '請求無效',
invalid_grant: '授權請求無效',
invalid_redirect_uri: '無效返回鏈接, 該 redirect_uri 未被此應用注冊。',
access_denied: '拒絶訪問',
invalid_target: '請求資源無效',
unsupported_grant_type: '不支持的 grant_type',
unsupported_response_mode: '不支持的 response_mode',
unsupported_response_type: '不支持的 response_type',
provider_error: 'OIDC 內部錯誤: {{message}}',
};
export default oidc;

View file

@ -0,0 +1,6 @@
const password = {
unsupported_encryption_method: '不支持的加密方法 {{name}}',
pepper_not_found: '密碼 pepper 未找到。請檢查 core 的環境變量。',
};
export default password;

View file

@ -0,0 +1,6 @@
const request = {
invalid_input: '輸入無效。{{details}}',
general: '發生請求錯誤。',
};
export default request;

View file

@ -0,0 +1,10 @@
const role = {
name_in_use: '此角色名稱 {{name}} 已被使用',
scope_exists: '作用域 ID {{scopeId}} 已添加到此角色',
user_exists: '用戶 ID {{userId}} 已添加到此角色',
default_role_missing: '某些默認角色名稱在數據庫中不存在,請確保先創建角色',
internal_role_violation:
'你可能正在嘗試更新或刪除 Logto 禁止的內部角色。如果你要創建新角色,請嘗試使用不以“#internal:”開頭的名稱。',
};
export default role;

View file

@ -0,0 +1,6 @@
const scope = {
name_exists: '此作用域名稱 {{name}} 已被使用',
name_with_space: '作用域名稱不能包含任何空格。',
};
export default scope;

View file

@ -0,0 +1,20 @@
const session = {
not_found: '未找到會話。請返回並重新登錄。',
invalid_credentials: '賬號或密碼錯誤,請重新輸入。',
invalid_sign_in_method: '當前登錄方式不可用',
invalid_connector_id: '找不到 ID 為 {{connectorId}} 的可用連接器。',
insufficient_info: '登錄信息缺失,請檢查你的輸入。',
connector_id_mismatch: '傳入的連接器 ID 與 session 中保存的記錄不一致',
connector_session_not_found: '無法找到連接器登錄信息,請嘗試重新登錄。',
verification_session_not_found: '驗證失敗,請重新驗證。',
verification_expired: '當前頁面已超時。為確保你的賬號安全,請重新驗證。',
unauthorized: '請先登錄',
unsupported_prompt_name: '不支持的 prompt name',
forgot_password_not_enabled: '忘記密碼功能沒有開啟。',
verification_failed: '驗證失敗,請重新驗證。',
connector_validation_session_not_found: '找不到連接器用於驗證 token 的信息。',
identifier_not_found: '找不到用戶標識符。請返回並重新登錄。',
interaction_not_found: '找不到互動會話。請返回並重新開始會話。',
};
export default session;

View file

@ -0,0 +1,16 @@
const sign_in_experiences = {
empty_content_url_of_terms_of_use: '你啟用咗「使用條款」,請加入使用條款 URL。',
empty_social_connectors: '你啟用咗社交登錄嘅方式。請至少揀一個社交連接器。',
enabled_connector_not_found: '未搵到咗已啟用嘅 {{type}} 連接器',
not_one_and_only_one_primary_sign_in_method:
'主要嘅登錄方式一定要有並且只有一個,請檢查你嘅輸入。',
username_requires_password: '必須為用戶名註冊標識符啟用設置密碼。',
passwordless_requires_verify: '必須為電郵/電話註冊標識符啟用驗證。',
miss_sign_up_identifier_in_sign_in: '登錄方法一定要包含註冊標識符。',
password_sign_in_must_be_enabled: '必須喺註冊中要求設置密碼時啟用密碼登錄。',
code_sign_in_must_be_enabled: '必須喺註冊中唔要求設置密碼時啟用驗證碼登錄。',
unsupported_default_language: '{{language}} 無法選擇做默認語言。',
at_least_one_authentication_factor: '至少要揀一個登錄要素',
};
export default sign_in_experiences;

View file

@ -0,0 +1,7 @@
const storage = {
not_configured: '未配置存儲提供程序。',
missing_parameter: '存儲提供程序缺少參數 {{parameter}}。',
upload_error: '無法將文件上載到存儲提供程序。',
};
export default storage;

View file

@ -0,0 +1,6 @@
const swagger = {
invalid_zod_type: '無效的 Zod 類型,請檢查路由 guard 配置。',
not_supported_zod_type_for_params: '請求參數不支援的 Zod 類型,請檢查路由 guard 配置。',
};
export default swagger;

View file

@ -0,0 +1,32 @@
const user = {
username_already_in_use: '該使用者名稱已被使用。',
email_already_in_use: '該電子郵件地址已被使用。',
phone_already_in_use: '該手機號碼已被使用。',
invalid_email: '電子郵件地址不正確。',
invalid_phone: '手機號碼不正確。',
email_not_exist: '電子郵件地址尚未註冊。',
phone_not_exist: '手機號碼尚未註冊。',
identity_not_exist: '該社交帳號尚未註冊。',
identity_already_in_use: '該社交帳號已被註冊。',
social_account_exists_in_profile: '你已綁定當前社交帳號,無需重複操作。',
cannot_delete_self: '無法刪除自己的帳戶。',
sign_up_method_not_enabled: '註冊方式尚未啟用。',
sign_in_method_not_enabled: '登錄方式尚未啟用。',
same_password: '為確保帳戶安全,新密碼不能與舊密碼一致。',
password_required_in_profile: '請設置登錄密碼。',
new_password_required_in_profile: '請設置新密碼。',
password_exists_in_profile: '當前使用者已設置密碼,無需重複操作。',
username_required_in_profile: '請設置使用者名稱。',
username_exists_in_profile: '當前使用者已設置使用者名稱,無需重複操作。',
email_required_in_profile: '請綁定電子郵件地址',
email_exists_in_profile: '當前使用者已綁定電子郵件,無需重複操作。',
phone_required_in_profile: '請綁定手機號碼。',
phone_exists_in_profile: '當前使用者已綁定手機號碼,無需重複操作。',
email_or_phone_required_in_profile: '請綁定電子郵件地址或手機號碼。',
suspended: '帳戶已被禁用。',
user_not_exist: '未找到與 {{identifier}} 相關聯的使用者。',
missing_profile: '請於登錄時提供必要的使用者補充資訊。',
role_exists: '角色 ID {{roleId}} 已添加到此使用者',
};
export default user;

View file

@ -0,0 +1,11 @@
const verification_code = {
phone_email_empty: '手機號碼與電子郵件地址均為空',
not_found: '驗證碼不存在,請先請求發送驗證碼',
phone_mismatch: '手機號碼不匹配,請嘗試請求新的驗證碼。',
email_mismatch: '電子郵件地址不匹配,請嘗試請求新的驗證碼。',
code_mismatch: '驗證碼不正確',
expired: '驗證碼已過期,請嘗試請求新的驗證碼。',
exceed_max_try: '超過最大驗證次數,請嘗試請求新的驗證碼。',
};
export default verification_code;

View file

@ -0,0 +1,11 @@
import type { LocalePhrase } from '../../types.js';
import errors from './errors/index.js';
import translation from './translation/index.js';
const zhHK: LocalePhrase = Object.freeze({
translation,
errors,
});
export default zhHK;

View file

@ -0,0 +1,31 @@
const api_resource_details = {
page_title: 'API 資源詳情',
back_to_api_resources: '返回 API 資源',
settings_tab: '設置',
permissions_tab: '權限',
settings: '設置',
settings_description:
'API 資源,又稱資源指示器,表示要請求的目標服務或資源,通常是表示資源身份的 URI 格式變數。',
token_expiration_time_in_seconds: 'Token 過期時間(秒)',
token_expiration_time_in_seconds_placeholder: '請輸入你的 token 過期時間',
delete_description:
'本操作會永久性地刪除該 API 資源,且不可撤銷。輸入 API 資源名稱 <span>{{name}}</span> 確認。',
enter_your_api_resource_name: '輸入 API 資源名稱',
api_resource_deleted: ' API 資源 {{name}} 已刪除.',
permission: {
create_button: '創建權限',
create_title: '創建權限',
create_subtitle: '定義此 API 所需的權限 (scope)。',
confirm_create: '創建權限',
name: '權限名稱',
name_placeholder: 'read:resource',
forbidden_space_in_name: '權限名稱不能包含空格。',
description: '描述',
description_placeholder: '能夠讀取資源',
permission_created: '權限 "{{name}}" 已成功創建',
delete_description: '如果刪除此權限,擁有該權限的用戶將失去由此權限授予的訪問權限。',
deleted: '成功刪除權限 "{{name}}"',
},
};
export default api_resource_details;

View file

@ -0,0 +1,15 @@
const api_resources = {
page_title: 'API 資源',
title: 'API 資源',
subtitle: '定義可以從已授權的應用程序中使用的 API',
create: '創建 API 資源',
api_name: 'API 名稱',
api_name_placeholder: '輸入 API 名稱',
api_identifier: 'API Identifier',
api_identifier_placeholder: 'https://your-api-identifier/',
api_identifier_tip:
'對於 API 資源的唯一標識符。它必須是一個絕對 URI 並沒有 fragment (#) 組件。等價於 OAuth 2.0 中的 <a>resource parameter</a>。',
api_resource_created: ' API 資源 {{name}} 已成功創建!',
};
export default api_resources;

View file

@ -0,0 +1,48 @@
const application_details = {
page_title: '應用程式詳情',
back_to_applications: '返回全部應用程式',
check_guide: '查看指南',
settings: '設定',
settings_description: '應用程式用於在 Logto OIDC、登入體驗、審計日誌等方面識別你的應用程式。',
advanced_settings: '高級設定',
advanced_settings_description:
'高級設定包括 OIDC 相關術語。你可以查看 Token Endpoint 以獲取更多資訊。',
application_name: '應用程式名稱',
application_name_placeholder: '我的應用程式',
description: '描述',
description_placeholder: '請輸入應用程式描述',
authorization_endpoint: '授權端點',
authorization_endpoint_tip: '進行驗證和授權的端點。用於 OpenID Connect 中的<a> 驗證 </a> 流程。',
application_id: '應用程式 ID',
application_id_tip:
'應用程式的唯一標識,通常由 Logto 生成。等價於 OpenID Connect 中的<a> client_id </a>。',
application_secret: '應用程式密鑰',
redirect_uri: '重定向 URI',
redirect_uris: '重定向 URIs',
redirect_uri_placeholder: 'https://your.website.com/app',
redirect_uri_placeholder_native: 'io.logto://callback',
redirect_uri_tip:
'在使用者登入完成(不論成功與否)後重定向的目標 URI。參見 OpenID Connect <a> AuthRequest </a> 以瞭解更多。',
post_sign_out_redirect_uri: '登出後重定向 URI',
post_sign_out_redirect_uris: '登出後重定向 URIs',
post_sign_out_redirect_uri_placeholder: 'https://your.website.com/home',
post_sign_out_redirect_uri_tip:
'在使用者登出後重定向的目標 URI可選。在某些應用程式類型中可能無實質作用。',
cors_allowed_origins: 'CORS 允許的來源',
cors_allowed_origins_placeholder: 'https://your.website.com',
cors_allowed_origins_tip:
'所有重定向 URI 的來源將預設被允許。通常不需要對此欄位進行操作。參見 <a>MDN 文檔</a> 以瞭解更多。',
id_token_expiration: 'ID Token 過期時間',
refresh_token_expiration: 'Refresh Token 過期時間',
token_endpoint: 'Token Endpoint',
user_info_endpoint: '用戶信息端點',
enable_admin_access: '啟用管理訪問',
enable_admin_access_label:
'啟用或禁用對管理 API 的訪問。啟用後,你可以使用訪問權杖代表該應用程式調用管理 API。',
delete_description: '本操作會永久性地刪除該應用,且不可撤銷。輸入 <span>{{name}}</span> 確認。',
enter_your_application_name: '輸入你的應用程式名稱',
application_deleted: '應用 {{name}} 成功刪除。',
redirect_uri_required: '至少需要輸入一個重定向 URL。',
};
export default application_details;

View file

@ -0,0 +1,49 @@
const applications = {
page_title: '全部應用',
title: '全部應用',
subtitle: '創建一個移動、單頁、machine to machine 或傳統 web 應用程序,並通過 Logto 進行身份驗證',
create: '創建應用',
application_name: '應用名稱',
application_name_placeholder: '我的應用',
application_description: '應用描述',
application_description_placeholder: '請輸入應用描述',
select_application_type: '選擇應用類型',
no_application_type_selected: '你還沒有選擇應用類型',
application_created: '應用 {{name}} 成功創建! \n現在請完成你的應用設置。',
app_id: 'App ID',
type: {
native: {
title: '原生應用',
subtitle: '在原生環境中運行的應用程序',
description: '例如 iOS appAndroid app',
},
spa: {
title: '單頁應用',
subtitle: '在瀏覽器中運行並動態更新數據的應用程序',
description: '例如 React DOM appVue app',
},
traditional: {
title: '傳統網頁應用',
subtitle: '僅由 Web 服務器渲染和更新的應用程序',
description: '例如 Next.js, PHP',
},
machine_to_machine: {
title: '機器對機器',
subtitle: '直接與資源對話的應用程序(通常是服務)',
description: '例如,後端服務',
},
},
guide: {
get_sample_file: '獲取示例',
header_description:
'參考如下教程,將 Logto 集成到你的應用中。你也可以點擊右側按鈕,獲取我們為你準備好的示例工程。',
title: '應用創建成功',
subtitle: '參考以下步驟完成你的應用設置。首先,選擇你要使用的 SDK 類型:',
description_by_sdk: '本教程向你演示如何在 {{sdk}} 應用中集成 Logto 登錄功能',
},
placeholder_title: '選擇應用程序類型以繼續',
placeholder_description:
'Logto 使用 OIDC 的應用程序實體來幫助識別你的應用程序、管理登錄和創建審計日誌等任務。',
};
export default applications;

View file

@ -0,0 +1,113 @@
const cloud = {
welcome: {
page_title: '歡迎',
title: '歡迎來到 Logto Cloud預覽版讓我們一起創建獨屬於你的體驗',
description:
'無論你是開源用戶還是雲用戶,都可以在展示中了解 Logto 的全部價值。Cloud 預覽版也是 Logto Cloud 的初步版本。',
project_field: '我使用 Logto 是為了',
project_options: {
personal: '個人專案',
company: '公司專案',
},
deployment_type_field: '你偏愛開源還是雲?',
deployment_type_options: {
open_source: '開源',
cloud: '雲',
},
},
about: {
page_title: '關於你',
title: '關於你的一些信息',
description: '通過更好地了解你,我們可以使你的 Logto 體驗更加個性化。你的信息是安全的。',
title_field: '你的頭銜',
title_options: {
developer: '開發人員',
team_lead: '團隊負責人',
ceo: 'CEO',
cto: 'CTO',
product: '產品',
others: '其他',
},
company_name_field: '公司名稱',
company_name_placeholder: 'Acme.co',
company_size_field: '你的公司規模如何?',
company_options: {
size_1: '1',
size_2_49: '2-49',
size_50_199: '50-199',
size_200_999: '200-999',
size_1000_plus: '1000+',
},
reason_field: '我註冊的原因是',
reason_options: {
passwordless: '尋找無需密碼身份驗證和 UI 工具包',
efficiency: '尋找即插即用的身份基礎架構',
access_control: '基於角色和責任控制用戶訪問',
multi_tenancy: '尋求面向多租戶產品的策略',
enterprise: '為產品更方便企業使用尋找 SSO 解決方案',
others: '其他',
},
},
congrats: {
page_title: '獲得早鳥驚喜',
title: '好消息!你有資格獲得 Logto Cloud 的早鳥驚喜。',
description:
'別錯過:立即聯繫 Logto 團隊,了解更多信息,獲得 Logto Cloud 正式版 <strong>60 天</strong> 的免費試用機會!',
check_out_button: '查看實時預覽',
reserve_title: '與 Logto 團隊預定時間',
reserve_description: '驗證後僅有一次領取資格。',
book_button: '現在預定',
join_description: '加入我們的公開<a>{{link}}</a>,與其他開發人員連接和聊天。',
discord_link: 'Discord 頻道',
enter_admin_console: '進入 Logto Cloud 預覽',
},
gift: {
title: '免費使用 Logto Cloud 60 天,立即成為嚐鮮會員!',
description: '預定與我們團隊的一對一會話,以獲取早鳥驚喜。',
reserve_title: '與 Logto 團隊預定時間',
reserve_description: '評估後僅有一次領取資格。',
book_button: '預定',
},
sie: {
page_title: '定制登錄體驗',
title: '讓我們輕鬆定制你的登錄體驗',
inspire: {
title: '創建引人入勝的示例',
description: '對登錄體驗不確定嗎?只需點擊“啟發我”,讓魔法發生!',
inspire_me: '來點靈感',
},
logo_field: '應用商標',
color_field: '品牌顏色',
identifier_field: '標識符',
identifier_options: {
email: '電子郵件',
phone: '電話',
user_name: '用戶名',
},
authn_field: '身份驗證',
authn_options: {
password: '密碼',
verification_code: '驗證碼',
},
social_field: '社交登錄',
finish_and_done: '完成並完成',
preview: {
mobile_tab: '移動端',
web_tab: '網頁端',
},
connectors: {
unlocked_later: '稍後解鎖',
unlocked_later_tip: '完成入門流程並進入產品後,你將獲得訪問更多社交登錄方式的權限。',
notice:
'請勿將演示連接器用於生產目的。完成測試後,請刪除演示連接器並使用你的憑證設置自己的連接器。',
},
},
broadcast: '📣 你正在使用 Logto Cloud預覽版',
socialCallback: {
title: '你已成功登錄',
description:
'你已成功使用社交帳戶登錄。為確保與 Logto 的無縫集成並獲得所有功能的訪問權限,我們建議你繼續配置自己的社交連接器。',
},
};
export default cloud;

View file

@ -0,0 +1,14 @@
const components = {
uploader: {
action_description: '拖放或瀏覽上傳',
uploading: '上傳中...',
image_limit:
'上傳圖片大小不能超過 {{size, number}}KB只支援 {{extensions, list(style: narrow; type: conjunction;)}} 格式的檔案。',
error_upload: '哎呀,出了些問題。檔案上傳失敗。',
error_file_size: '檔案太大了,請上傳小於 {{size, number}}KB 的檔案。',
error_file_type:
'不支援該檔案格式,只支援 {{extensions, list(style: narrow; type: conjunction;)}} 格式的檔案。',
},
};
export default components;

View file

@ -0,0 +1,34 @@
const connector_details = {
page_title: '連接器詳情',
back_to_connectors: '返回連接器',
check_readme: '查看 README',
settings: '通用設置',
settings_description:
'連接器在 Logto 中扮演著至關重要的角色。借助它們的幫助Logto 使終端用戶能夠使用無密碼註冊或登錄的功能以及使用社交帳戶登錄的功能。',
parameter_configuration: '參數配置',
test_connection: '連接測試',
save_error_empty_config: '請輸入配置內容',
send: '發送',
send_error_invalid_format: '無效輸入',
edit_config_label: '請在此輸入你的 JSON 配置',
test_email_sender: '測試你的郵件連接器',
test_sms_sender: '測試你的短信連接器',
test_email_placeholder: 'john.doe@example.com',
test_sms_placeholder: '+86 131 1234 5678',
test_message_sent: '測試信息已發送',
test_sender_description:
'Logto 使用 "Generic" 模板進行測試。如果你的連接器正確配置,你將收到一條消息。',
options_change_email: '更換郵件連接器',
options_change_sms: '更換短信連接器',
connector_deleted: '成功刪除連接器',
type_email: '郵件連接器',
type_sms: '短信連接器',
type_social: '社交連接器',
in_used_social_deletion_description:
'你的登錄體驗正在使用這個連接器。刪除後,<name/> 登錄體驗將在登錄體驗設置中被刪除,再次添加需重新配置。',
in_used_passwordless_deletion_description:
'你的登錄體驗正在使用 {{name}} 連接器。刪除後,你的登錄體驗將無法正常工作,直到你解決衝突,再次添加需重新配置。',
deletion_description: '你將刪除此連接器。此操作不可撤銷,再次添加需重新配置。',
};
export default connector_details;

View file

@ -0,0 +1,82 @@
const connectors = {
page_title: '連接器',
title: '連接器',
subtitle: '設置連接器,啟動無密碼和社交登錄',
create: '添加社交連接器',
config_sie_notice: '你已經配置了社交連接器,記得在<a>{{link}}</a>上添加使之生效。',
config_sie_link_text: '登錄體驗',
tab_email_sms: '短信和郵件連接器',
tab_social: '社交連接器',
connector_name: '連接器名稱',
demo_tip: '演示連接器僅用於演示且最多只能發送 100 條消息,不建議在生產環境中部署。',
social_demo_tip: '演示連接器僅用於演示目的,不建議在生產環境中部署。',
connector_type: '類型',
connector_status: '登錄體驗',
connector_status_in_use: '使用中',
connector_status_not_in_use: '未使用',
not_in_use_tip: {
content: '未使用意味著你的登錄體驗並沒有使用這個登錄方式。<a>{{link}}</a>去添加。',
go_to_sie: '前往登錄體驗',
},
placeholder_title: '社交連接器',
placeholder_description:
'Logto 提供了許多廣泛使用的社交登錄連接器,同時你還可以使用標準協議創建自己的連接器。',
save_and_done: '保存並完成',
type: {
email: '郵件連接器',
sms: '短信連接器',
social: '社交連接器',
},
setup_title: {
email: '設置郵件連接器',
sms: '設置短信連接器',
social: '添加社交連接器',
},
guide: {
subtitle: '參考以下步驟完成你的連接器設置',
general_setting: '通用設置',
parameter_configuration: '參數配置',
test_connection: '連接測試',
name: '社交登錄按鈕的名稱',
name_placeholder: '輸入社交登錄按鈕的名稱',
name_tip: '按鈕上將展示「通過 {{name}} 繼續」。名字不宜過長而導致信息無法展示完整。',
logo: '社交登錄按鈕的 Logo 圖片鏈接',
logo_placeholder: 'https://your.cdn.domain/logo.png',
logo_tip: '該圖片將用於連接器的展示。獲取圖片鏈接後粘貼在此處。',
logo_dark: '社交登錄按鈕的 Logo 圖片鏈接(深色模式)',
logo_dark_placeholder: 'https://your.cdn.domain/logo.png',
logo_dark_tip: '在管理控制台的登錄體驗中啟用“深色模式”後,可設置此連接器 Logo 用於深色模式。',
logo_dark_collapse: '收起',
logo_dark_show: '展開深色模式 Logo 設置',
target: '身份提供商名稱',
target_placeholder: '輸入身份提供商的名稱',
target_tip:
'在“身份供應商名稱”字段中輸入唯一的標識符字符串,用於區分社交身份來源。注意,在連接器創建成功後,無法再次修改此設置。',
target_tooltip:
'Logto 社交連接器的「target」指的是社交身份的「來源」。在 Logto 的設計裡我們不允許某一平臺的連接器中有相同的「target」以避免身份的衝突。在添加連接器時你需要格外小心我們「不允許」用戶在創建之後更改「target」的值。<a>了解更多</a>',
target_conflict:
'此「身份供應商名稱」值與現有的 <span>name</span> 連接器相同。使用相同的身份提供商名稱會導致不符合預期的登錄行為,用戶可能通過兩個不同的連接器訪問同一個帳戶。',
target_conflict_line2:
'如果你想替換當前的連接器並連接相同的身份提供商IdP以便先前的用戶可以直接登錄而無需重新註冊請先刪除 <span>name</span> 連接器,再創建一個新的連接器並使用相同的「身份供應商名稱」值。',
target_conflict_line3: '如果你想連接一個新的身份驗證提供程序,請修改「身份供應商名稱」並繼續。',
config: '粘貼你的 JSON 代碼',
sync_profile: '開啟用戶資料同步',
sync_profile_only_at_sign_up: '首次註冊時同步',
sync_profile_each_sign_in: '每次登錄時同步',
sync_profile_tip: '同步用戶的用戶名、頭像等個人資料信息',
callback_uri: 'Callback URI',
callback_uri_description:
'也稱為重定向 URI在社交授權後用戶將被發送回 Logto 的 URI復制並粘貼到社交提供者的配置頁面中。',
},
platform: {
universal: '通用',
web: '網頁',
native: '原生',
},
add_multi_platform: '支持多平台,選擇一個平台繼續',
drawer_title: '連接器配置指南',
drawer_subtitle: '參考以下步驟完善或修改你的連接器設置',
unknown: '未知連接器',
};
export default connectors;

View file

@ -0,0 +1,21 @@
const contact = {
title: '聯繫我們',
description: '加入我們的社區,在這裡你可以給我們提供產品建議,尋求幫助或和其他開發者交流心得',
discord: {
title: 'Discord 頻道',
description: '加入我們的公共頻道,和其他開發者一起交流使用經驗',
button: '立即加入',
},
github: {
title: 'GitHub',
description: '通過 GitHub 給我們提一個 issue',
button: '前往頁面',
},
email: {
title: '郵件聯繫',
description: '通過郵件聯繫獲取信息或尋求幫助',
button: '發送郵件',
},
};
export default contact;

View file

@ -0,0 +1,19 @@
const dashboard = {
page_title: '儀表板',
title: '儀表板',
description: '查看所有應用的數據概況',
total_users: '總用戶',
total_users_tip: '總用戶',
new_users_today: '今日新增',
new_users_today_tip: '今日註冊到你應用上的新用戶數',
new_users_7_days: '7 日新增',
new_users_7_days_tip: '最近 7 日註冊到你應用上的新用戶數',
daily_active_users: '日活用戶',
daily_active_users_tip: '今日在你的應用上交換過 token 的獨立用戶數',
weekly_active_users: '周活用戶',
weekly_active_users_tip: '最近 7 日在你的應用上交換過 token 的獨立用戶數',
monthly_active_users: '月活用戶',
monthly_active_users_tip: '最近 30 日在你的應用上交換過 token 的獨立用戶數',
};
export default dashboard;

View file

@ -0,0 +1,23 @@
const errors = {
something_went_wrong: '哎呀,出錯了!',
page_not_found: '找不到頁面',
unknown_server_error: '伺服器發生未知錯誤',
empty: '沒有數據',
missing_total_number: '無法從返回的標頭信息中找到 Total-Number',
invalid_uri_format: '無效的 URI 格式',
invalid_origin_format: '無效的 URI origin 格式',
invalid_json_format: '無效的 JSON 格式',
invalid_error_message_format: '非法的錯誤信息格式',
required_field_missing: '請輸入{{field}}',
required_field_missing_plural: '至少需要輸入一個{{field}}',
more_details: '查看詳情',
username_pattern_error: '用戶名只能包含英文字母、數字或下劃線,且不以數字開頭。',
password_pattern_error: '密碼至少需要 {{min}} 個字符,且必須包含字母、數字和符號。',
insecure_contexts: '不支持不安全的上下文(非 HTTPS。',
unexpected_error: '發生未知錯誤',
not_found: '404 找不到資源',
create_internal_role_violation:
'你正在創建一個被 Logto 禁止內部角色。嘗試使用不以 "#internal:" 開頭的其他名稱。',
};
export default errors;

View file

@ -0,0 +1,55 @@
const general = {
placeholder: '占位符',
skip: '跳過',
next: '下一步',
back: '上一步',
retry: '重試',
done: '完成',
search: '搜索',
search_placeholder: '搜索',
clear_result: '清除結果',
save: '儲存',
save_changes: '儲存變更',
saved: '已儲存!',
discard: '放棄',
loading: '讀取中...',
redirecting: '頁面跳轉中...',
add: '添加',
added: '已添加',
cancel: '取消',
confirm: '確認',
check_out: '查看',
create: '創建',
set_up: '配置',
customize: '自定義',
enable: '啟用',
reminder: '提示',
delete: '刪除',
more_options: '更多選項',
close: '關閉',
copy: '複製',
copying: '複製中',
copied: '已複製',
required: '必填',
add_another: '新增',
deletion_confirmation: '你確定要刪除這個 {{title}} 嗎?',
settings_nav: '設置',
unsaved_changes_warning: '還有未儲存的變更, 確定要離開嗎?',
leave_page: '離開此頁',
stay_on_page: '留在此頁',
type_to_search: '輸入搜索',
got_it: '知道了',
continue: '繼續',
page_info: '{{min, number}}-{{max, number}} 共 {{total, number}} 條',
learn_more: '了解更多',
tab_errors: '{{count, number}} 個錯誤',
skip_for_now: '先跳過',
remove: '移除',
visit: '訪問',
join: '加入',
try_now: '現在試試',
multiple_form_field: '(多選)',
demo: '演示',
};
export default general;

View file

@ -0,0 +1,28 @@
const get_started = {
page_title: '開始上手',
progress: '開始上手: {{completed}}/{{total}}',
progress_dropdown_title: '一些快速上手的操作',
title: '成功開發身份方案,我們先來探索一番',
subtitle_part1: '下列是一些可以快速上手的操作,通過這些,你可以更好地感受 Logto 的價值',
subtitle_part2: '我已經完成了這些設置。',
hide_this: '隱藏引導',
confirm_message: '你確認要隱藏該頁面嗎? 本操作將無法恢復。',
check_preview_title: '查看實時預覽',
check_preview_subtitle: '來體驗 Logto 登錄吧',
integration_title: '創建和集成你的應用程序',
integration_subtitle: '為你的本地、單頁、機器對機器或傳統應用程序設置 Logto 身份驗證',
custom_sie_title: '自定義登錄體驗',
custom_sie_subtitle: '使用高級設置解鎖各種場景',
passwordless_title: '通過添加自己的連接器來擴展無密碼登錄',
passwordless_subtitle: '嘗試無密碼登錄,並為你的客戶提供安全和無摩擦的體驗',
community_title: '加入我們的 Discord 社區',
community_subtitle: '加入我們的公共頻道與其他開發人員交流',
management_api_title: '與管理 API 交互',
management_api_subtitle: '直接將你的身份驗證系統連接到我們的管理 API',
further_readings_title: '進一步閱讀',
further_readings_subtitle: '查看我們的逐步、基於場景的文檔,避免繁瑣的概念',
add_rbac_title: '添加基於角色的訪問控制以保護你的資源',
add_rbac_subtitle: '通過可擴展的角色授權控制你的資源,以適應各種用例。',
};
export default get_started;

View file

@ -0,0 +1,62 @@
import api_resource_details from './api-resource-details.js';
import api_resources from './api-resources.js';
import application_details from './application-details.js';
import applications from './applications.js';
import cloud from './cloud.js';
import components from './components.js';
import connector_details from './connector-details.js';
import connectors from './connectors.js';
import contact from './contact.js';
import dashboard from './dashboard.js';
import errors from './errors.js';
import general from './general.js';
import get_started from './get-started.js';
import log_details from './log-details.js';
import logs from './logs.js';
import menu from './menu.js';
import permissions from './permissions.js';
import profile from './profile.js';
import role_details from './role-details.js';
import roles from './roles.js';
import session_expired from './session-expired.js';
import sign_in_exp from './sign-in-exp/index.js';
import tab_sections from './tab-sections.js';
import tabs from './tabs.js';
import user_details from './user-details.js';
import users from './users.js';
import welcome from './welcome.js';
const admin_console = {
title: '管理控制台',
admin_user: '管理員',
system_app: '系統應用',
menu,
general,
errors,
tab_sections,
tabs,
applications,
application_details,
api_resources,
api_resource_details,
connectors,
connector_details,
get_started,
users,
user_details,
contact,
sign_in_exp,
dashboard,
logs,
log_details,
session_expired,
welcome,
roles,
role_details,
permissions,
cloud,
profile,
components,
};
export default admin_console;

View file

@ -0,0 +1,18 @@
const log_details = {
page_title: '審計日誌詳情',
back_to_logs: '返回審計日誌',
back_to_user: '返回 {{name}}',
success: '成功',
failed: '失敗',
event_key: '事件 Key',
application: '應用',
ip_address: 'IP 地址',
user: '用戶',
log_id: '日誌 ID',
time: '時間',
user_agent: '用戶代理',
tab_details: '詳細',
raw_data: '原始數據',
};
export default log_details;

View file

@ -0,0 +1,12 @@
const logs = {
page_title: '審計日誌',
title: '審計日誌',
subtitle: '查看用戶行為和事件',
event: '事件',
user: '用戶',
application: '應用',
time: '時間',
filter_by: '過濾',
};
export default logs;

View file

@ -0,0 +1,13 @@
const menu = {
profile: '帳戶管理',
language: '語言',
appearance: {
label: '主題',
light: '淺色模式',
dark: '深色模式',
system: '跟隨系統',
},
sign_out: '退出登錄',
};
export default menu;

View file

@ -0,0 +1,11 @@
const permissions = {
search_placeholder: '通過 API 或權限名稱搜索',
search_placeholder_without_api: '通過權限名稱搜索',
name_column: '權限',
description_column: '描述',
api_column: 'API',
placeholder_title: '權限',
placeholder_description: '權限是指訪問資源的授權(我們稱其為 API 資源)。',
};
export default permissions;

View file

@ -0,0 +1,77 @@
const profile = {
page_title: '賬戶管理',
title: '賬戶管理',
description: '在這裡,你可以修改賬戶設置和管理個人信息,以確保賬戶安全。',
settings: {
title: '賬戶設置',
profile_information: '個人信息',
avatar: '頭像',
name: '姓名',
username: '用戶名',
},
link_account: {
title: '關聯賬戶',
email_sign_in: '郵件登錄',
email: '郵件',
social_sign_in: '社交賬號登錄',
link_email: '綁定郵箱',
link_email_subtitle: '綁定郵箱以便登錄或幫助恢復賬戶。',
email_required: '郵箱不能為空',
invalid_email: '無效的郵箱地址',
identical_email_address: '輸入的郵箱地址與當前郵箱地址相同',
anonymous: '匿名',
},
password: {
title: '密碼與安全',
password: '密碼',
password_setting: '密碼設置',
new_password: '新密碼',
confirm_password: '確認密碼',
enter_password: '輸入密碼',
enter_password_subtitle: '為確保你的賬戶安全,請進行身份驗證。',
set_password: '設置密碼',
verify_via_password: '通過密碼驗證',
show_password: '顯示密碼',
required: '密碼不能為空',
min_length: '密碼最少需要{{min}}個字符',
do_not_match: '密碼不匹配,請重新輸入。',
},
code: {
enter_verification_code: '輸入驗證碼',
enter_verification_code_subtitle: '驗證碼已發送至 <strong>{{target}}</strong>',
verify_via_code: '通過郵箱驗證碼驗證',
resend: '重新發送驗證碼',
resend_countdown: '在 {{countdown}} 秒後重新發送',
},
delete_account: {
title: '刪除賬戶',
label: '刪除賬戶',
description: '刪除賬戶將會刪除所有個人信息、用戶數據和配置。此操作無法撤銷。',
button: '刪除賬戶',
dialog_paragraph_1:
'很抱歉聽到你想要刪除你的帳戶。刪除你的帳戶將永久刪除所有數據,包括用戶信息、日誌和設置,此操作無法撤銷。因此,請確保在繼續之前備份任何重要數據。',
dialog_paragraph_2:
'要繼續刪除帳戶的刪除過程,請通過 <a>mail</a> 向我們的支持團隊發送主題為“帳戶刪除請求”的郵件。我們將協助你並確保所有數據都已從我們的系統中正確刪除。',
dialog_paragraph_3:
'感謝你選擇 Logto Cloud。如果你有任何進一步的問題或疑慮請隨時與我們聯繫。',
},
set: '設置',
change: '修改',
link: '關聯',
unlink: '取消關聯',
not_set: '未設置',
change_avatar: '修改頭像',
change_name: '修改姓名',
change_username: '修改用戶名',
set_name: '設置姓名',
email_changed: '已成功綁定郵箱!',
password_changed: '已重置密碼!',
updated: '{{target}}更改成功!',
linked: '{{target}}賬號綁定成功!',
unlinked: '{{target}}賬號解綁成功!',
email_exists_reminder: '該郵箱 {{email}} 已被其他賬號綁定,請更換郵箱。',
unlink_confirm_text: '確定解綁',
unlink_reminder: '解綁後,用戶將無法使用該 <span></span> 賬號進行登錄。確定要解綁嗎?',
};
export default profile;

View file

@ -0,0 +1,46 @@
const role_details = {
back_to_roles: '返回角色',
identifier: '標識符',
delete_description:
'這樣做將從受影響的用戶中刪除與該角色關聯的權限,並刪除角色、用戶和權限之間的映射關係。',
role_deleted: '{{name}} 已成功刪除!',
settings_tab: '設置',
users_tab: '用戶',
permissions_tab: '權限',
settings: '設置',
settings_description:
'角色是一組權限,可以分配給用戶。它們還提供了一種聚合不同 API 定義的權限的方法,使得添加、刪除或調整權限比將其單獨分配給用戶更有效率。',
field_name: '名稱',
field_description: '描述',
permission: {
assign_button: '分配權限',
assign_title: '分配權限',
assign_subtitle: '將權限分配給此角色。角色將獲得添加的權限,具有此角色的用戶將繼承這些權限。',
assign_form_field: '分配權限',
added_text_one: '添加了 {{count, number}} 個權限',
added_text_other: '添加了 {{count, number}} 個權限',
api_permission_count_one: '{{count, number}} 個權限',
api_permission_count_other: '{{count, number}} 個權限',
confirm_assign: '分配權限',
permission_assigned: '所選的權限已成功分配給此角色',
deletion_description: '如果刪除此權限,則具有此角色的受影響用戶將失去此權限授予的訪問權限。',
permission_deleted: '權限 {{name}} 已成功從此角色中刪除',
empty: '無可用權限',
},
users: {
assign_button: '分配用戶',
name_column: '用戶',
app_column: '應用',
latest_sign_in_column: '最近登錄',
delete_description: '它將保留在你的用戶池中,但失去此角色的授權。',
deleted: '{{name}} 已成功從此角色中刪除',
assign_title: '分配用戶',
assign_subtitle: '將用戶分配給此角色。通過搜索名稱、電子郵件、電話或用戶 ID 查找適當的用戶。',
assign_users_field: '分配用戶',
confirm_assign: '分配用戶',
users_assigned: '所選的用戶已成功分配給此角色',
empty: '無可用用戶',
},
};
export default role_details;

View file

@ -0,0 +1,22 @@
const roles = {
page_title: '角色',
title: '角色',
subtitle:
'RBAC 是一種訪問控制方法,它使用角色來決定用戶可以做什麼事情,包括授予用戶訪問特定資源的權限。',
create: '創建角色',
role_name: '角色名稱',
role_description: '描述',
role_name_placeholder: '輸入你的角色名稱',
role_description_placeholder: '輸入你的角色描述',
assigned_users: '已分配的用戶',
assign_permissions: '分配權限',
create_role_title: '創建角色',
create_role_description: '為你的應用程式創建和管理角色。角色包含權限集合,並可以分配給用戶。',
create_role_button: '創建角色',
role_created: '角色 {{name}} 已成功創建。',
search: '按角色名稱、描述或 ID 搜索',
placeholder_title: '角色',
placeholder_description: '角色是可以分配給用戶的權限分組。在創建角色之前,請確保先添加權限。',
};
export default roles;

View file

@ -0,0 +1,7 @@
const session_expired = {
title: '會話已過期',
subtitle: '會話可能已過期,你已被退出登錄。請點擊下方按鈕重新登錄到管理控制台。',
button: '重新登錄',
};
export default session_expired;

View file

@ -0,0 +1,82 @@
import others from './others.js';
import sign_up_and_sign_in from './sign-up-and-sign-in.js';
const sign_in_exp = {
page_title: '登錄體驗',
title: '登錄體驗',
description: '自定義登錄界面,並實時預覽真實效果',
tabs: {
branding: '品牌',
sign_up_and_sign_in: '註冊與登錄',
others: '其他',
},
welcome: {
title: '自定義登錄體驗',
description: '通過首次登錄設置快速入門。本指南將帶領您完成所有必要的設置。',
get_started: '開始',
apply_remind: '請注意,登錄體驗將會應用到當前帳戶下的所有應用。',
},
color: {
title: '顏色',
primary_color: '品牌顏色',
dark_primary_color: '品牌顏色 (深色)',
dark_mode: '開啟深色模式',
dark_mode_description:
'基於品牌顏色和 Logto 的算法,應用將會有一個自動生成的深色模式。當然,您可以自定義和修改。',
dark_mode_reset_tip: '基於品牌顏色,重新生成深色模式顏色。',
reset: '重新生成',
},
branding: {
title: '品牌定制區',
ui_style: '樣式',
favicon: '瀏覽器地址欄圖標',
logo_image_url: 'Logo 圖片 URL',
logo_image_url_placeholder: 'https://your.cdn.domain/logo.png',
dark_logo_image_url: 'Logo 圖片 URL (深色)',
dark_logo_image_url_placeholder: 'https://your.cdn.domain/logo-dark.png',
logo_image: 'Logo 圖片',
dark_logo_image: 'Logo 圖片(深色)',
logo_image_error: '應用 Logo{{error}}',
favicon_error: 'Favicon{{error}}',
},
custom_css: {
title: '自定義 CSS',
css_code_editor_title: '自定義 CSS 個性化您的用戶界面',
css_code_editor_description1: '查看自定義 CSS 的例子。',
css_code_editor_description2: '<a>{{link}}</a>',
css_code_editor_description_link_content: '了解更多',
css_code_editor_content_placeholder:
'輸入 CSS 代碼,修改顏色、字體、組件樣式、佈局,定制您的登錄、註冊、忘記密碼等頁面。充分發揮創造力,讓您的用戶界面脫穎而出。',
},
setup_warning: {
no_connector_sms:
'尚未設置 SMS 短信連接器。在完成該配置前,用戶將無法通過此登錄方式登錄。<a>{{link}}</a>連接器。',
no_connector_email:
'尚未設置電子郵件連接器。在完成該配置前,用戶將無法通過此登錄方式登錄。<a>{{link}}</a>連接器。',
no_connector_social:
'尚未設置社交連接器。在完成該配置前,用戶將無法通過此登錄方式登錄。<a>{{link}}</a>連接器。',
no_added_social_connector: '你已經成功設置了一些社交連接器。點按「+」添加一些到您的登錄體驗。',
setup_link: '立即設置',
},
save_alert: {
description:
'您正在進行登錄註冊設置的變更。當前您的所有用戶會受到新設置的影響。確認保存該設置嗎?',
before: '設置前',
after: '設置後',
sign_up: '註冊',
sign_in: '登錄',
social: '社交',
},
preview: {
title: '登錄預覽',
live_preview: '實時預覽',
live_preview_tip: '保存以預覽更改',
native: '移動原生',
desktop_web: '桌面網頁',
mobile_web: '移動網頁',
},
others,
sign_up_and_sign_in,
};
export default sign_in_exp;

View file

@ -0,0 +1,46 @@
const others = {
terms_of_use: {
title: '條款',
terms_of_use: '使用條款 URL',
terms_of_use_placeholder: 'https://your.terms.of.use/',
privacy_policy: '隱私政策 URL',
privacy_policy_placeholder: 'https://your.privacy.policy/',
},
languages: {
title: '語言',
enable_auto_detect: '開啟語言自動適配',
description:
'基於用戶自身的語言設定,產品將展示最符合用戶使用習慣的語言。你可以為產品添加翻譯內容、選擇語言代碼和設定自定義語言,來延展產品的本地化需求。',
manage_language: '管理語言',
default_language: '默認語言',
default_language_description_auto:
'語言自動適配已開啟,當用戶設定的語言無法匹配時,他們將看到默認語言。',
default_language_description_fixed:
'語言自動適配已關閉,你的應用將只展示默認語言。開啟自動適配即可定制語言。',
},
manage_language: {
title: '管理語言',
subtitle: '你可以為產品添加翻譯內容、選擇語言代碼和設定自定義語言,來延展產品的本地化需求。',
add_language: '添加語言',
logto_provided: 'Logto 提供',
key: '鍵名',
logto_source_values: 'Logto 源語言',
custom_values: '翻譯文本',
clear_all_tip: '清空',
unsaved_description: '離開頁面前,記得保存你本次做的內容修改。',
deletion_tip: '刪除',
deletion_title: '你確定你要刪除新加的語言嗎?',
deletion_description: '刪除後,你的用戶將無法使用該語言查看內容。',
default_language_deletion_title: '你無法刪除默認語言',
default_language_deletion_description:
'你已設置{{language}}為你的默認語言,你無法刪除默認語言。',
},
advanced_options: {
title: '高級選項',
enable_user_registration: '啟用用戶註冊',
enable_user_registration_description:
'開啟或關閉用戶註冊功能。一旦關閉,用戶將無法通過登錄界面自行註冊帳號,但管理員仍可通過管理控制台添加用戶。',
},
};
export default others;

View file

@ -0,0 +1,52 @@
const sign_up_and_sign_in = {
identifiers_email: '郵件地址',
identifiers_phone: '手機號碼',
identifiers_username: '用戶名',
identifiers_email_or_sms: '郵件地址或手機號碼',
identifiers_none: '無',
and: '與',
or: '或',
sign_up: {
title: '註冊',
sign_up_identifier: '註冊標識',
identifier_description: '創建帳戶時你需要設定註冊標識。這些信息在用戶登錄時,屬於必選項。',
sign_up_authentication: '註冊身份認證設置',
authentication_description: '註冊時,你的用戶將要完成以下所有勾選的任務。',
set_a_password_option: '創建密碼',
verify_at_sign_up_option: '註冊時驗證身份',
social_only_creation_description: '(僅對社交註冊用戶適用)',
},
sign_in: {
title: '登錄',
sign_in_identifier_and_auth: '登錄標識和身份認證設置',
description: '用戶可以使用任何可用的選項進行登錄。拖拽選項即可調整頁面佈局。',
add_sign_in_method: '添加登錄方式',
password_auth: '密碼',
verification_code_auth: '驗證碼',
auth_swap_tip: '交換以下選項的位置即可設定它們在用戶登錄流程中出現的先後。',
require_auth_factor: '請至少選擇一種認證方式。',
},
social_sign_in: {
title: '社交登錄',
social_sign_in: '社交登錄',
description: '你已設定特定的標識。用戶在通過社交連接器註冊時可能會被要求提供一個對應的標識。',
add_social_connector: '添加社交連接器',
set_up_hint: {
not_in_list: '沒有你想要的連接器?',
set_up_more: '立即設置',
go_to: '其他社交連接器。',
},
},
tip: {
set_a_password: '啟用用戶名註冊,必須設置密碼。',
verify_at_sign_up:
'我們目前僅支持經過驗證的郵件地址登錄。如果沒有驗證,你的用戶信息中可能出現大量無效電子郵件地址。',
password_auth: '因註冊設置裏你啟用了用戶名密碼標識。這個信息在用戶登錄時,屬於必選項。',
verification_code_auth:
'因註冊設置裏你啟用了驗證碼標識,驗證碼屬於用戶必選項。開啟密碼註冊後,你可以選擇關閉驗證碼登錄。',
delete_sign_in_method:
'因註冊設置裏你啟用了{{identifier}}標識。這些信息在用戶登錄時,屬於必選項。',
},
};
export default sign_up_and_sign_in;

View file

@ -0,0 +1,9 @@
const tab_sections = {
overview: '概觀',
resource_management: '資源管理',
user_management: '用戶管理',
access_control: '訪問控制',
help_and_support: '幫助與支援',
};
export default tab_sections;

View file

@ -0,0 +1,16 @@
const tabs = {
get_started: '開始上手',
dashboard: '儀表板',
applications: '全部應用',
api_resources: 'API 資源',
sign_in_experience: '登錄體驗',
connectors: '連接器',
users: '用戶管理',
audit_logs: '審計日誌',
roles: '角色',
docs: '文檔',
contact_us: '聯繫我們',
settings: '設置',
};
export default tabs;

View file

@ -0,0 +1,61 @@
const user_details = {
page_title: '用戶詳情',
back_to_users: '返回用戶管理',
created_title: '用戶創建成功',
created_guide: '你可以將以下登錄信息發送給用戶',
created_username: '用戶名:',
created_password: '密碼:',
menu_delete: '刪除用戶',
delete_description: '本操作將永久刪除該用戶,且無法撤銷。',
deleted: '用戶已成功刪除!',
reset_password: {
reset_password: '重置密碼',
title: '確定要重置密碼?',
content: '本操作不可撤銷,將會重置用戶的登錄信息。',
congratulations: '該用戶已被重置',
new_password: '新密碼:',
},
tab_settings: '設置',
tab_roles: '角色',
tab_logs: '用戶日誌',
settings: '設置',
settings_description:
'每個用戶都有一個包含所有用戶信息的個人資料。它由基本數據、社交身份和自定義數據組成。',
field_email: '主要電子郵箱',
field_phone: '主要手機號碼',
field_username: '用戶名',
field_name: '姓名',
field_avatar: '頭像圖片鏈接',
field_avatar_placeholder: 'https://your.cdn.domain/avatar.png',
field_custom_data: '自定義數據',
field_custom_data_tip: '預定義屬性之外的用戶信息,例如用戶偏好的顏色和語言。',
field_connectors: '社交帳號',
custom_data_invalid: '自定義數據必須是有效的 JSON 對象',
connectors: {
connectors: '連接器',
user_id: '用戶ID',
remove: '刪除',
not_connected: '該用戶還沒有綁定社交帳號',
deletion_confirmation: '你在正要刪除現有的 <name /> 身份,是否確認?',
},
suspended: '已禁用',
roles: {
name_column: '角色名稱',
description_column: '描述',
assign_button: '分配角色',
delete_description: '此操作將從此用戶中刪除此角色。角色本身仍將存在,但不再與此用戶相關聯。',
deleted: '已成功將 {{name}} 從此用戶中刪除。',
assign_title: '將角色分配給 {{name}}',
assign_subtitle: '為 {{name}} 授權一個或多個角色',
assign_role_field: '分配角色',
role_search_placeholder: '按角色名稱搜索',
added_text: '添加了 {{value, number}} 個',
assigned_user_count: '{{value, number}} 個用戶',
confirm_assign: '分配角色',
role_assigned: '已成功分配角色',
search: '按角色名稱、描述或 ID 搜索',
empty: '無可用角色',
},
};
export default user_details;

View file

@ -0,0 +1,20 @@
const users = {
page_title: '用戶管理',
title: '用戶管理',
subtitle: '管理你的用戶,包括創建新用戶,編輯用戶資料,查看用戶日誌,以及重新設置密碼和刪除用戶',
create: '添加用戶',
user_name: '用戶',
application_name: '註冊應用',
latest_sign_in: '最後登錄',
create_form_username: '用戶名',
create_form_password: '密碼',
create_form_name: '姓名',
unnamed: '未命名',
search: '按姓名、電子郵件、電話或用戶名搜索',
check_user_detail: '查看用戶詳情',
placeholder_title: '用戶管理',
placeholder_description:
'每個用戶都有一個包含所有用戶信息的個人資料。它由基本數據、社交身份和自定義數據組成。',
};
export default users;

View file

@ -0,0 +1,8 @@
const welcome = {
title: '歡迎來到管理控制台',
description:
'管理控制台是一個無需代碼操作的應用。你可以用它來管理登錄體驗。讓我們首先創建一個帳號。你可以用它以個人或公司的身份管理 Logto。',
create_account: '創建帳號',
};
export default welcome;

View file

@ -0,0 +1,13 @@
const demo_app = {
title: '你已成功登錄實時預覽!',
subtitle: '以下是本次登錄的用戶信息:',
username: '用戶名:',
user_id: '用戶 ID',
sign_out: '退出實時預覽',
continue_explore: '或繼續探索',
customize_sign_in_experience: '自定義登錄體驗',
enable_passwordless: '啟用無密碼登錄',
add_social_connector: '添加社交連接器',
};
export default demo_app;

View file

@ -0,0 +1,11 @@
import admin_console from './admin-console/index.js';
import demo_app from './demo-app.js';
import oidc from './oidc.js';
const translation = {
admin_console,
demo_app,
oidc,
};
export default translation;

View file

@ -0,0 +1,5 @@
const oidc = {
logout_success: '你已經成功登出。',
};
export default oidc;

View file

@ -0,0 +1,11 @@
const auth = {
authorization_header_missing: 'Authorization 請求頭缺失。',
authorization_token_type_not_supported: 'Authorization token 類型不支持',
unauthorized: '未經授權。請檢查憑證及其範圍。',
forbidden: '禁止訪問。請檢查用戶 role 與權限。',
expected_role_not_found: '未找到期望的 role。請檢查用戶 role 與權限。',
jwt_sub_missing: 'JWT 缺失 `sub`',
require_re_authentication: '需要重新認證以進行受保護操作。',
};
export default auth;

View file

@ -0,0 +1,32 @@
const connector = {
general: '連接器發生錯誤:{{errorDescription}}',
not_found: '找不到可用的 {{type}} 類型的連接器',
not_enabled: '連接器尚未啟用',
invalid_metadata: '連接器 metadata 參數錯誤',
invalid_config_guard: '連接器配置 guard 錯誤',
unexpected_type: '連接器類型錯誤',
insufficient_request_parameters: '請求參數缺失',
invalid_request_parameters: '請求參數錯誤',
invalid_config: '連接器配置錯誤',
invalid_response: '連接器錯誤響應',
template_not_found: '無法從連接器配置中找到對應的模板',
not_implemented: '方法 {{method}} 尚未實現',
social_invalid_access_token: '當前連接器的 access_token 無效',
invalid_auth_code: '當前連接器的授權碼無效',
social_invalid_id_token: '當前連接器的 id_token 無效',
authorization_failed: '用戶授權流程失敗',
social_auth_code_invalid: '無法獲取 access_token請檢查授權 code 是否有效',
more_than_one_sms: '同時存在超過 1 個短信連接器',
more_than_one_email: '同時存在超過 1 個郵件連接器',
more_than_one_connector_factory: '找到多個連接器工廠id 為 {{connectorIds}}),請刪除多餘項。',
db_connector_type_mismatch: '數據庫中存在一個類型不匹配的連接。',
not_found_with_connector_id: '找不到所給 connector id 對應的連接器',
multiple_instances_not_supported: '你選擇的連接器不支持創建多實例。',
invalid_type_for_syncing_profile: '只有社交連接器可以開啟用戶檔案同步。',
can_not_modify_target: '不可修改連接器 target。',
should_specify_target: '你需要聲明 target 的值。',
multiple_target_with_same_platform: '同一平台上,多個社交連接器不能重複使用相同的 “Target”。',
cannot_overwrite_metadata_for_non_standard_connector: '不可覆蓋該連接器的 metadata 參數。',
};
export default connector;

View file

@ -0,0 +1,8 @@
const entity = {
create_failed: '建立 {{name}} 失敗。',
not_exists: '{{name}} 不存在。',
not_exists_with_id: 'ID 為 `{{id}}` 的 {{name}} 不存在。',
not_found: '資源不存在。',
};
export default entity;

View file

@ -0,0 +1,9 @@
const guard = {
invalid_input: '請求中 {{type}} 無效',
invalid_pagination: '分頁參數無效',
can_not_get_tenant_id: '無法從請求中獲取租戶 ID。',
file_size_exceeded: '文件大小超過限制。',
mime_type_not_allowed: '不允許使用此 MIME 類型。',
};
export default guard;

View file

@ -0,0 +1,39 @@
import auth from './auth.js';
import connector from './connector.js';
import entity from './entity.js';
import guard from './guard.js';
import localization from './localization.js';
import log from './log.js';
import oidc from './oidc.js';
import password from './password.js';
import request from './request.js';
import role from './role.js';
import scope from './scope.js';
import session from './session.js';
import sign_in_experiences from './sign-in-experiences.js';
import storage from './storage.js';
import swagger from './swagger.js';
import user from './user.js';
import verification_code from './verification-code.js';
const errors = {
request,
auth,
guard,
oidc,
user,
password,
session,
connector,
verification_code,
sign_in_experiences,
localization,
swagger,
entity,
log,
role,
scope,
storage,
};
export default errors;

View file

@ -0,0 +1,6 @@
const localization = {
cannot_delete_default_language: '你已設置 {{languageTag}} 為你的預設語言,你無法刪除預設語言。',
invalid_translation_structure: '無效的數據格式,請檢查你的輸入並重試。',
};
export default localization;

View file

@ -0,0 +1,5 @@
const log = {
invalid_type: '日誌類型無效。',
};
export default log;

View file

@ -0,0 +1,19 @@
const oidc = {
aborted: '使用者終止了互動。',
invalid_scope: '不支援的 scope: {{scopes}}',
invalid_scope_plural: '不支援的 scope: {{scopes}}',
invalid_token: 'Token 無效',
invalid_client_metadata: '無效的用戶端元數據',
insufficient_scope: '請求 token 缺少權限: {{scopes}}',
invalid_request: '請求無效',
invalid_grant: '授權請求無效',
invalid_redirect_uri: '無效返回連結, 该 redirect_uri 未被此應用註冊。',
access_denied: '拒絕訪問',
invalid_target: '請求資源無效',
unsupported_grant_type: '不支援的 grant_type',
unsupported_response_mode: '不支援的 response_mode',
unsupported_response_type: '不支援的 response_type',
provider_error: 'OIDC 內部錯誤: {{message}}',
};
export default oidc;

View file

@ -0,0 +1,6 @@
const password = {
unsupported_encryption_method: '不支持的加密方法 {{name}}',
pepper_not_found: '密碼 pepper 未找到。請檢查 core 的環境變數。',
};
export default password;

View file

@ -0,0 +1,6 @@
const request = {
invalid_input: '輸入無效。{{details}}',
general: '發生請求錯誤。',
};
export default request;

View file

@ -0,0 +1,10 @@
const role = {
name_in_use: '此角色名稱 {{name}} 已被使用',
scope_exists: '作用域 ID {{scopeId}} 已添加到此角色',
user_exists: '用戶 ID {{userId}} 已添加到此角色',
default_role_missing: '某些預設角色名稱在資料庫中不存在,請確保先創建角色',
internal_role_violation:
'你可能正在嘗試更新或刪除 Logto 禁止的內部角色。如果你要創建新角色,請嘗試使用不以“#internal:”開頭的名稱。',
};
export default role;

View file

@ -0,0 +1,6 @@
const scope = {
name_exists: '此作用域名稱 {{name}} 已被使用',
name_with_space: '作用域名稱不能包含任何空格。',
};
export default scope;

View file

@ -0,0 +1,20 @@
const session = {
not_found: '未找到會話。請返回並重新登錄。',
invalid_credentials: '帳號或密碼錯誤,請重新輸入。',
invalid_sign_in_method: '當前登錄方式不可用',
invalid_connector_id: '找不到 ID 為 {{connectorId}} 的可用連接器。',
insufficient_info: '登錄信息缺失,請檢查你的輸入。',
connector_id_mismatch: '傳入的連接器 ID 與 session 中保存的記錄不一致',
connector_session_not_found: '無法找到連接器登錄信息,請嘗試重新登錄。',
verification_session_not_found: '驗證失敗,請重新驗證。',
verification_expired: '當前頁面已超時。為確保你的帳號安全,請重新驗證。',
unauthorized: '請先登錄',
unsupported_prompt_name: '不支援的 prompt name',
forgot_password_not_enabled: '忘記密碼功能沒有開啟。',
verification_failed: '驗證失敗,請重新驗證。',
connector_validation_session_not_found: '找不到連接器用於驗證 token 的資訊。',
identifier_not_found: '找不到使用者標識符。請返回並重新登錄。',
interaction_not_found: '找不到交互會話。請返回並重新開始會話。',
};
export default session;

View file

@ -0,0 +1,15 @@
const sign_in_experiences = {
empty_content_url_of_terms_of_use: '你啟用了“使用條款”,請添加使用條款 URL。',
empty_social_connectors: '你啟用了社交登錄的方式。請至少選擇一個社交連接器。',
enabled_connector_not_found: '未找到已啟用的 {{type}} 連接器',
not_one_and_only_one_primary_sign_in_method: '主要的登錄方式必須有且僅有一個,請檢查你的輸入。',
username_requires_password: '必須為用戶名註冊識別符啟用設置密碼。',
passwordless_requires_verify: '必須為電子郵件/電話註冊識別符啟用驗證。',
miss_sign_up_identifier_in_sign_in: '登錄方法必須包含註冊識別符。',
password_sign_in_must_be_enabled: '必須在註冊中要求設置密碼時啟用密碼登錄。',
code_sign_in_must_be_enabled: '必須在註冊中不要求設置密碼時啟用驗證碼登錄。',
unsupported_default_language: '{{language}} 無法選擇為默認語言。',
at_least_one_authentication_factor: '至少要選擇一個登錄要素',
};
export default sign_in_experiences;

View file

@ -0,0 +1,7 @@
const storage = {
not_configured: '未配置存儲提供程序。',
missing_parameter: '存儲提供程序缺少參數 {{parameter}}。',
upload_error: '無法將檔案上傳到存儲提供程序。',
};
export default storage;

View file

@ -0,0 +1,6 @@
const swagger = {
invalid_zod_type: '無效的 Zod 類型,請檢查路由 guard 配置。',
not_supported_zod_type_for_params: '請求參數不支持的 Zod 類型,請檢查路由 guard 配置。',
};
export default swagger;

View file

@ -0,0 +1,32 @@
const user = {
username_already_in_use: '該用戶名已被使用。',
email_already_in_use: '該電子郵件地址已被使用。',
phone_already_in_use: '該手機號碼已被使用。',
invalid_email: '電子郵件地址不正確。',
invalid_phone: '手機號碼不正確。',
email_not_exist: '電子郵件地址尚未註冊。',
phone_not_exist: '手機號碼尚未註冊。',
identity_not_exist: '該社交帳號尚未註冊。',
identity_already_in_use: '該社交帳號已被註冊。',
social_account_exists_in_profile: '你已綁定當前社交帳號,無需重複操作。',
cannot_delete_self: '無法刪除自己的帳戶。',
sign_up_method_not_enabled: '註冊方式尚未啟用。',
sign_in_method_not_enabled: '登錄方式尚未啟用。',
same_password: '為確保帳戶安全,新密碼不能與舊密碼一致。',
password_required_in_profile: '請設置登錄密碼。',
new_password_required_in_profile: '請設置新密碼。',
password_exists_in_profile: '當前用戶已設置密碼,無需重複操作。',
username_required_in_profile: '請設置用戶名。',
username_exists_in_profile: '當前用戶已設置用戶名,無需重複操作。',
email_required_in_profile: '請綁定電子郵件地址',
email_exists_in_profile: '當前用戶已綁定電子郵件,無需重複操作。',
phone_required_in_profile: '請綁定手機號碼。',
phone_exists_in_profile: '當前用戶已綁定手機號碼,無需重複操作。',
email_or_phone_required_in_profile: '請綁定電子郵件地址或手機號碼。',
suspended: '帳戶已被禁用。',
user_not_exist: '未找到與 {{identifier}} 相關聯的用戶。',
missing_profile: '請於登錄時提供必要的用戶補充信息。',
role_exists: '角色 ID {{roleId}} 已添加到此用戶',
};
export default user;

View file

@ -0,0 +1,11 @@
const verification_code = {
phone_email_empty: '手機號與電子郵件地址均為空',
not_found: '驗證碼不存在,請先請求發送驗證碼',
phone_mismatch: '手機號碼不匹配,請嘗試請求新的驗證碼。',
email_mismatch: '電子郵件地址不匹配,請嘗試請求新的驗證碼。',
code_mismatch: '驗證碼不正確',
expired: '驗證碼已過期,請嘗試請求新的驗證碼。',
exceed_max_try: '超過最大驗證次數,請嘗試請求新的驗證碼。',
};
export default verification_code;

View file

@ -0,0 +1,11 @@
import type { LocalePhrase } from '../../types.js';
import errors from './errors/index.js';
import translation from './translation/index.js';
const zhTW: LocalePhrase = Object.freeze({
translation,
errors,
});
export default zhTW;

View file

@ -0,0 +1,31 @@
const api_resource_details = {
page_title: 'API 資源詳情',
back_to_api_resources: '返回 API 資源',
settings_tab: '設定',
permissions_tab: '權限',
settings: '設定',
settings_description:
'API 資源,又稱資源指標,表示要請求的目標服務或資源,通常是表示資源身份的 URI 格式變數。',
token_expiration_time_in_seconds: 'Token 過期時間(秒)',
token_expiration_time_in_seconds_placeholder: '請輸入你的 token 過期時間',
delete_description:
'本操作會永久性地刪除該 API 資源,且不可撤銷。輸入 API 資源名稱 <span>{{name}}</span> 確認。',
enter_your_api_resource_name: '輸入 API 資源名稱',
api_resource_deleted: ' API 資源 {{name}} 已刪除.',
permission: {
create_button: '建立權限',
create_title: '建立權限',
create_subtitle: '定義此 API 所需的權限 (scope)。',
confirm_create: '建立權限',
name: '權限名稱',
name_placeholder: 'read:resource',
forbidden_space_in_name: '權限名稱不能包含空格。',
description: '描述',
description_placeholder: '能夠讀取資源',
permission_created: '權限 "{{name}}" 已成功建立',
delete_description: '如果刪除此權限,擁有該權限的使用者將失去由此權限授予的存取權限。',
deleted: '成功刪除權限 "{{name}}"',
},
};
export default api_resource_details;

View file

@ -0,0 +1,15 @@
const api_resources = {
page_title: 'API 資源',
title: 'API 資源',
subtitle: '定義可以從已授權的應用程序中使用的 API',
create: '創建 API 資源',
api_name: 'API 名稱',
api_name_placeholder: '輸入API名稱',
api_identifier: 'API Identifier',
api_identifier_placeholder: 'https://your-api-identifier/',
api_identifier_tip:
'對於 API 資源的唯一標識符。它必須是一個絕對 URI並沒有 fragment (#) 組件。等價於 OAuth 2.0 中的 <a>resource parameter</a>。',
api_resource_created: ' API 資源 {{name}} 已成功創建!',
};
export default api_resources;

View file

@ -0,0 +1,49 @@
const application_details = {
page_title: '應用詳細資料',
back_to_applications: '返回全部應用',
check_guide: '查看指南',
settings: '設置',
settings_description: '應用程式用於在 Logto OIDC、登錄體驗、審計日誌等方面識別你的應用程式。',
advanced_settings: '高級設置',
advanced_settings_description:
'高級設置包括 OIDC 相關術語。你可以查看 Token Endpoint 以獲取更多信息。',
application_name: '應用程式姓名',
application_name_placeholder: '我的應用程式',
description: '說明',
description_placeholder: '請輸入應用程式說明',
authorization_endpoint: '授權端點',
authorization_endpoint_tip: '進行驗證與授權的端點。用於 OpenID Connect 中的 <a>驗證</a> 流程。',
application_id: '應用程式 ID',
application_id_tip:
'應用程式的唯一標識,通常由 Logto 生成。相當於 OpenID Connect 中的 <a>client_id</a>。',
application_secret: '應用程式密鑰',
redirect_uri: '重定向 URI',
redirect_uris: '重定向 URIs',
redirect_uri_placeholder: 'https://your.website.com/app',
redirect_uri_placeholder_native: 'io.logto://callback',
redirect_uri_tip:
'在用戶登錄完成(不論成功與否)後,重新導向的目標 URI。參見 OpenID Connect <a>AuthRequest</a> 以了解更多。',
post_sign_out_redirect_uri: '登出後重定向的 URI',
post_sign_out_redirect_uris: '登出後重定向的 URIs',
post_sign_out_redirect_uri_placeholder: 'https://your.website.com/home',
post_sign_out_redirect_uri_tip:
'在用戶登出後,重新導向的目標 URI可選。在某些應用程式類型中可能無實質作用。',
cors_allowed_origins: 'CORS 允許的來源',
cors_allowed_origins_placeholder: 'https://your.website.com',
cors_allowed_origins_tip:
'所有重新導向 URI 的來源都將默認被允許。通常不需要對此欄位進行操作。參見 <a>MDN 文件</a> 以了解更多。',
id_token_expiration: 'ID Token 過期時間',
refresh_token_expiration: 'Refresh Token 過期時間',
token_endpoint: 'Token Endpoint',
user_info_endpoint: '用戶信息端點',
enable_admin_access: '啟用管理訪問',
enable_admin_access_label:
'啟用或禁用對管理 API 的訪問。啟用後,你可以使用訪問令牌代表該應用程式調用管理 API。',
delete_description:
'本操作會永久性地刪除該應用程式,且不可撤銷。輸入 <span>{{name}}</span> 確認。',
enter_your_application_name: '輸入你的應用程式姓名',
application_deleted: '應用 {{name}} 成功刪除。',
redirect_uri_required: '至少需要輸入一個重定向 URL。',
};
export default application_details;

View file

@ -0,0 +1,49 @@
const applications = {
page_title: '全部應用',
title: '全部應用',
subtitle: '創建一個移動、單頁、machine to machine 或傳統 web 應用程序,並通過 Logto 進行身份驗證',
create: '創建應用',
application_name: '應用名稱',
application_name_placeholder: '我的應用',
application_description: '應用描述',
application_description_placeholder: '請輸入應用描述',
select_application_type: '選擇應用類型',
no_application_type_selected: '你還沒有選擇應用類型',
application_created: '應用 {{name}} 成功創建! \n現在請完成你的應用設置。',
app_id: 'App ID',
type: {
native: {
title: '原生應用',
subtitle: '在原生環境中運行的應用程序',
description: '例如 iOS appAndroid app',
},
spa: {
title: '單頁應用',
subtitle: '在瀏覽器中運行並動態更新數據的應用程序',
description: '例如 React DOM appVue app',
},
traditional: {
title: '傳統網頁應用',
subtitle: '僅由 Web 伺服器渲染和更新的應用程序',
description: '例如 Next.js, PHP',
},
machine_to_machine: {
title: '機器對機器',
subtitle: '直接與資源對話的應用程序(通常是服務)',
description: '例如,後端服務',
},
},
guide: {
get_sample_file: '獲取示例',
header_description:
'參考如下教程,將 Logto 集成到你的應用中。你也可以點擊右側按鈕,獲取我們為你準備好的示例工程。',
title: '應用創建成功',
subtitle: '參考以下步驟完成你的應用設置。首先,選擇你要使用的 SDK 類型:',
description_by_sdk: '本教程向你演示如何在 {{sdk}} 應用中集成 Logto 登入功能',
},
placeholder_title: '選擇應用程序類型以繼續',
placeholder_description:
'Logto 使用 OIDC 的應用程序實體來幫助識別你的應用程序、管理登入和創建審計日誌等任務。',
};
export default applications;

View file

@ -0,0 +1,113 @@
const cloud = {
welcome: {
page_title: '歡迎',
title: '歡迎來到 Logto Cloud預覽版讓我們一起創建獨屬於你的體驗',
description:
'無論你是開源用戶還是雲用戶,都可以在展示中了解 Logto 的全部價值。Cloud 預覽版也是 Logto Cloud 的初步版本。',
project_field: '我使用 Logto 是為了',
project_options: {
personal: '個人專案',
company: '公司專案',
},
deployment_type_field: '你偏愛開源還是雲?',
deployment_type_options: {
open_source: '開源',
cloud: '雲',
},
},
about: {
page_title: '關於你',
title: '關於你的一些信息',
description: '通過更好地了解你,我們可以使你的 Logto 體驗更加個性化。你的信息是安全的。',
title_field: '你的頭銜',
title_options: {
developer: '開發人員',
team_lead: '團隊負責人',
ceo: 'CEO',
cto: 'CTO',
product: '產品',
others: '其他',
},
company_name_field: '公司名稱',
company_name_placeholder: 'Acme.co',
company_size_field: '你的公司規模如何?',
company_options: {
size_1: '1',
size_2_49: '2-49',
size_50_199: '50-199',
size_200_999: '200-999',
size_1000_plus: '1000+',
},
reason_field: '我註冊的原因是',
reason_options: {
passwordless: '尋找無需密碼身份驗證和 UI 工具包',
efficiency: '尋找即插即用的身份基礎架構',
access_control: '基於角色和責任控制用戶訪問',
multi_tenancy: '尋求面向多租戶產品的策略',
enterprise: '為產品更方便企業使用尋找 SSO 解決方案',
others: '其他',
},
},
congrats: {
page_title: '獲得早鳥驚喜',
title: '好消息!你有資格獲得 Logto Cloud 的早鳥驚喜。',
description:
'別錯過:立即聯繫 Logto 團隊,了解更多信息,獲得 Logto Cloud 正式版 <strong>60 天</strong> 的免費試用機會!',
check_out_button: '查看實時預覽',
reserve_title: '與 Logto 團隊預定時間',
reserve_description: '驗證後僅有一次領取資格。',
book_button: '現在預定',
join_description: '加入我們的公開 <a>{{link}}</a>,與其他開發人員連接和聊天。',
discord_link: 'Discord 頻道',
enter_admin_console: '進入 Logto Cloud 預覽',
},
gift: {
title: '免費使用 Logto Cloud 60 天,立即成為尝鮮會員!',
description: '預定與我們團隊的一對一會話,以獲取早鳥驚喜。',
reserve_title: '與 Logto 團隊預定時間',
reserve_description: '評估後僅有一次領取資格。',
book_button: '預定',
},
sie: {
page_title: '定制登錄體驗',
title: '讓我們輕鬆定制你的登錄體驗',
inspire: {
title: '創建引人入勝的示例',
description: '對登錄體驗不確定嗎?只需點擊“啓發我”,讓魔法發生!',
inspire_me: '來點靈感',
},
logo_field: '應用商標',
color_field: '品牌顏色',
identifier_field: '標識符',
identifier_options: {
email: '電子郵件',
phone: '電話',
user_name: '用戶名',
},
authn_field: '身份驗證',
authn_options: {
password: '密碼',
verification_code: '驗證碼',
},
social_field: '社交登錄',
finish_and_done: '完成並完成',
preview: {
mobile_tab: '移動端',
web_tab: '網頁端',
},
connectors: {
unlocked_later: '稍後解鎖',
unlocked_later_tip: '完成入門流程並進入產品後,你將獲得訪問更多社交登錄方式的權限。',
notice:
'請勿將演示連接器用於生產目的。完成測試後,請刪除演示連接器並使用你的憑證設置自己的連接器。',
},
},
broadcast: '📣 你正在使用 Logto Cloud預覽版',
socialCallback: {
title: '你已成功登錄',
description:
'你已成功使用社交帳戶登錄。為確保與 Logto 的無縫集成並獲得所有功能的訪問權限,我們建議你繼續配置自己的社交連接器。',
},
};
export default cloud;

View file

@ -0,0 +1,14 @@
const components = {
uploader: {
action_description: '拖放或瀏覽上傳',
uploading: '上傳中...',
image_limit:
'上傳圖片大小不能超過 {{size, number}}KB只支持 {{extensions, list(style: narrow; type: conjunction;)}} 格式的文件。',
error_upload: '哎呀,出了些問題。文件上傳失敗。',
error_file_size: '文件太大了,請上傳小於 {{size, number}}KB 的文件。',
error_file_type:
'不支持該文件類型。只支持 {{extensions, list(style: narrow; type: conjunction;)}} 格式的文件。',
},
};
export default components;

View file

@ -0,0 +1,34 @@
const connector_details = {
page_title: '連接器詳情',
back_to_connectors: '返回連接器',
check_readme: '檢視 README',
settings: '通用設定',
settings_description:
'連接器在 Logto 中扮演著至關重要的角色。借助它們的幫助Logto 使終端用戶能夠使用無密碼註冊或登錄的功能以及使用社交帳戶登錄的功能。',
parameter_configuration: '參數配置',
test_connection: '連接測試',
save_error_empty_config: '請輸入配置內容',
send: '傳送',
send_error_invalid_format: '無效輸入',
edit_config_label: '請在此輸入您的 JSON 配置',
test_email_sender: '測試您的郵件連接器',
test_sms_sender: '測試您的短信連接器',
test_email_placeholder: 'john.doe@example.com',
test_sms_placeholder: '+86 131 1234 5678',
test_message_sent: '測試訊息已傳送',
test_sender_description:
'Logto 使用 "Generic" 模板進行測試。如果您的連接器正確配置,您將收到一條訊息。',
options_change_email: '更換郵件連接器',
options_change_sms: '更換短信連接器',
connector_deleted: '成功刪除連接器',
type_email: '郵件連接器',
type_sms: '短信連接器',
type_social: '社交連接器',
in_used_social_deletion_description:
'您的登錄體驗正在使用這個連接器。刪除後,<name/> 登錄體驗將在登錄體驗設定中被刪除,再次添加需重新配置。',
in_used_passwordless_deletion_description:
'您的登錄體驗正在使用 {{name}} 連接器。刪除後,您的登錄體驗將無法正常工作,直到您解決衝突,再次添加需重新配置。',
deletion_description: '您將刪除此連接器。此操作不可撤銷,再次添加需重新配置。',
};
export default connector_details;

View file

@ -0,0 +1,82 @@
const connectors = {
page_title: '連接器',
title: '連接器',
subtitle: '設置連接器,啟用無密碼和社交登錄',
create: '添加社交連接器',
config_sie_notice: '你已經配置了社交連接器,記得在<a>{{link}}</a>上添加使之生效。',
config_sie_link_text: '登錄體驗',
tab_email_sms: '短信和郵件連接器',
tab_social: '社交連接器',
connector_name: '連接器名稱',
demo_tip: '演示連接器僅用於演示且最多只能發送 100 條消息,不建議在生產環境中部署。',
social_demo_tip: '演示連接器僅用於演示目的,不建議在生產環境中部署。',
connector_type: '類型',
connector_status: '登錄體驗',
connector_status_in_use: '使用中',
connector_status_not_in_use: '未使用',
not_in_use_tip: {
content: '未使用意味著你的登錄體驗並沒有使用這個登錄方式。<a>{{link}}</a>去添加。',
go_to_sie: '前往登錄體驗',
},
placeholder_title: '社交連接器',
placeholder_description:
'Logto 提供了許多廣泛使用的社交登錄連接器,同時你還可以使用標準協議創建自己的連接器。',
save_and_done: '保存並完成',
type: {
email: '郵件連接器',
sms: '短信連接器',
social: '社交連接器',
},
setup_title: {
email: '設置郵件連接器',
sms: '設置短信連接器',
social: '添加社交連接器',
},
guide: {
subtitle: '參考以下步驟完成你的連接器設置',
general_setting: '通用設置',
parameter_configuration: '參數配置',
test_connection: '連接測試',
name: '社交登錄按鈕的名稱',
name_placeholder: '輸入社交登錄按鈕的名稱',
name_tip: '按鈕上將展示「通過 {{name}} 繼續」。名字不宜過長而導致信息無法展示完整。',
logo: '社交登錄按鈕的 Logo 圖片鏈接',
logo_placeholder: 'https://your.cdn.domain/logo.png',
logo_tip: '該圖片將用於連接器的展示。獲取圖片鏈接後粘貼在此處。',
logo_dark: '社交登錄按鈕的 Logo 圖片鏈接(深色模式)',
logo_dark_placeholder: 'https://your.cdn.domain/logo.png',
logo_dark_tip: '在管理控制台的登錄體驗中啟用“深色模式”後,可設置此連接器 Logo 用於深色模式。',
logo_dark_collapse: '收起',
logo_dark_show: '展開深色模式 Logo 設置',
target: '身份提供商名稱',
target_placeholder: '輸入身份提供商的名稱',
target_tip:
'在“身份供應商名稱”字段中輸入唯一的標識符字符串,用於區分社交身份來源。注意,在連接器創建成功後,無法再次修改此設置。',
target_tooltip:
'Logto 社交連接器的「target」指的是社交身份的「來源」。在 Logto 的設計裡我們不允許某一平台的連接器中有相同的「target」以避免身份的衝突。在添加連接器時你需要格外小心我們「不允許」用戶在創建之後更改「target」的值。 <a>了解更多</a>',
target_conflict:
'此「身份供應商名稱」值與現有的 <span>name</span> 連接器相同。使用相同的身份供應商名稱會導致不符合預期的登錄行為,用戶可能通過兩個不同的連接器訪問同一個帳戶。',
target_conflict_line2:
'如果你想替換當前的連接器並連接相同的身份提供商IdP以便先前的用戶可以直接登錄而無需重新註冊請先刪除 <span>name</span> 連接器,再創建一個新的連接器並使用相同的「身份供應商名稱」值。',
target_conflict_line3: '如果你想連接一個新的身份驗證提供程序,請修改「身份供應商名稱」並繼續。',
config: '粘貼你的 JSON 代碼',
sync_profile: '開啟用戶資料同步',
sync_profile_only_at_sign_up: '首次註冊時同步',
sync_profile_each_sign_in: '每次登錄時同步',
sync_profile_tip: '同步用戶的用戶名、頭像等個人資料信息',
callback_uri: 'Callback URI',
callback_uri_description:
'也稱為重定向 URI在社交授權後用戶將被發送回 Logto 的 URI複製並粘貼到社交提供者的配置頁面中。',
},
platform: {
universal: '通用',
web: '網頁',
native: '原生',
},
add_multi_platform: '支持多平臺,選擇一個平臺繼續',
drawer_title: '連接器配置指南',
drawer_subtitle: '參考以下步驟完善或修改你的連接器設置',
unknown: '未知連接器',
};
export default connectors;

View file

@ -0,0 +1,21 @@
const contact = {
title: '聯繫我們',
description: '加入我們的社群,在這裡您可以提供產品建議、尋求幫助或和其他開發者交流心得',
discord: {
title: 'Discord 頻道',
description: '加入我們的公共頻道,和其他開發者一起交流使用經驗',
button: '立即加入',
},
github: {
title: 'GitHub',
description: '透過 GitHub 給我們提一個 issue',
button: '前往頁面',
},
email: {
title: '郵件聯繫',
description: '透過郵件聯繫獲取資訊或尋求幫助',
button: '發送郵件',
},
};
export default contact;

View file

@ -0,0 +1,19 @@
const dashboard = {
page_title: '儀表板',
title: '儀表板',
description: '查看所有應用的數據概況',
total_users: '總用戶',
total_users_tip: '總用戶',
new_users_today: '今日新增',
new_users_today_tip: '今日註冊到你應用上的新用戶數',
new_users_7_days: '7 日新增',
new_users_7_days_tip: '最近 7 日註冊到你應用上的新用戶數',
daily_active_users: '日活用戶',
daily_active_users_tip: '今日在你的應用上交換過 token 的獨立用戶數',
weekly_active_users: '周活用戶',
weekly_active_users_tip: '最近 7 日在你的應用上交換過 token 的獨立用戶數',
monthly_active_users: '月活用戶',
monthly_active_users_tip: '最近 30 日在你的應用上交換過 token 的獨立用戶數',
};
export default dashboard;

View file

@ -0,0 +1,23 @@
const errors = {
something_went_wrong: '哎呀,出錯了!',
page_not_found: '找不到頁面',
unknown_server_error: '伺服器發生未知錯誤',
empty: '沒有資料',
missing_total_number: '無法從返回的頭部訊息中找到 Total-Number',
invalid_uri_format: '無效的 URI 格式',
invalid_origin_format: '無效的 URI origin 格式',
invalid_json_format: '無效的 JSON 格式',
invalid_error_message_format: '非法的錯誤訊息格式',
required_field_missing: '請輸入{{field}}',
required_field_missing_plural: '至少需要輸入一個{{field}}',
more_details: '查看詳情',
username_pattern_error: '用戶名只能包含英文字母、數字或下劃線,且不以數字開頭。',
password_pattern_error: '密碼至少需要{{min}}個字符,且必須包含字母、數字和符號。',
insecure_contexts: '不支援不安全的上下文(非 HTTPS。',
unexpected_error: '發生未知錯誤',
not_found: '404 找不到資源',
create_internal_role_violation:
'你正在創建一個被 Logto 禁止的內部角色。嘗試使用不以 "#internal:" 開頭的其他名稱。',
};
export default errors;

View file

@ -0,0 +1,55 @@
const general = {
placeholder: '占位符',
skip: '跳過',
next: '下一步',
back: '上一步',
retry: '重試',
done: '完成',
search: '搜索',
search_placeholder: '搜索',
clear_result: '清除結果',
save: '儲存',
save_changes: '儲存更改',
saved: '儲存成功!',
discard: '放棄',
loading: '讀取中...',
redirecting: '頁面跳轉中...',
add: '新增',
added: '已新增',
cancel: '取消',
confirm: '確認',
check_out: '查看',
create: '建立',
set_up: '設置',
customize: '自定義',
enable: '啟用',
reminder: '提示',
delete: '刪除',
more_options: '更多選項',
close: '關閉',
copy: '複製',
copying: '複製中',
copied: '已複製',
required: '必填',
add_another: '新增',
deletion_confirmation: '你確定要刪除這個 {{title}} 嗎?',
settings_nav: '設置',
unsaved_changes_warning: '還有未儲存的變更, 確定要離開嗎?',
leave_page: '離開此頁',
stay_on_page: '留在此頁',
type_to_search: '輸入搜尋',
got_it: '知道了',
continue: '繼續',
page_info: '{{min, number}}-{{max, number}} 共 {{total, number}} 條',
learn_more: '了解更多',
tab_errors: '{{count, number}} 個錯誤',
skip_for_now: '先跳過',
remove: '移除',
visit: '訪問',
join: '加入',
try_now: '現在試試',
multiple_form_field: '(多選)',
demo: '演示',
};
export default general;

Some files were not shown because too many files have changed in this diff Show more