From 3f0a741e6c0352c975f60f6c7a9a0b572035b00d Mon Sep 17 00:00:00 2001 From: Yang Luo Date: Sat, 18 Feb 2023 17:35:36 +0800 Subject: [PATCH] Improve i18n languages --- conf/app.conf | 2 +- i18n/generate_test.go | 10 +- i18n/locales/vi/data.json | 147 ++++++ object/init.go | 2 +- web/src/OrganizationListPage.js | 2 +- web/src/Setting.js | 3 +- web/src/i18n.js | 32 +- web/src/locales/vi/data.json | 804 ++++++++++++++++++++++++++++++++ 8 files changed, 982 insertions(+), 20 deletions(-) create mode 100644 i18n/locales/vi/data.json create mode 100644 web/src/locales/vi/data.json diff --git a/conf/app.conf b/conf/app.conf index 6a3bcd59..efc24c97 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -20,5 +20,5 @@ staticBaseUrl = "https://cdn.casbin.org" isDemoMode = false batchSize = 100 ldapServerPort = 389 -languages = en,zh,es,fr,de,ja,ko,ru +languages = en,zh,es,fr,de,ja,ko,ru,vi quota = {"organization": -1, "user": -1, "application": -1, "provider": -1} diff --git a/i18n/generate_test.go b/i18n/generate_test.go index f37b452b..824112c4 100644 --- a/i18n/generate_test.go +++ b/i18n/generate_test.go @@ -30,24 +30,26 @@ func TestGenerateI18nFrontend(t *testing.T) { enData := parseEnData("frontend") writeI18nFile("frontend", "en", enData) - applyToOtherLanguage("frontend", "de", enData) + applyToOtherLanguage("frontend", "zh", enData) applyToOtherLanguage("frontend", "es", enData) applyToOtherLanguage("frontend", "fr", enData) + applyToOtherLanguage("frontend", "de", enData) applyToOtherLanguage("frontend", "ja", enData) applyToOtherLanguage("frontend", "ko", enData) applyToOtherLanguage("frontend", "ru", enData) - applyToOtherLanguage("frontend", "zh", enData) + applyToOtherLanguage("frontend", "vi", enData) } func TestGenerateI18nBackend(t *testing.T) { enData := parseEnData("backend") writeI18nFile("backend", "en", enData) - applyToOtherLanguage("backend", "de", enData) + applyToOtherLanguage("backend", "zh", enData) applyToOtherLanguage("backend", "es", enData) applyToOtherLanguage("backend", "fr", enData) + applyToOtherLanguage("backend", "de", enData) applyToOtherLanguage("backend", "ja", enData) applyToOtherLanguage("backend", "ko", enData) applyToOtherLanguage("backend", "ru", enData) - applyToOtherLanguage("backend", "zh", enData) + applyToOtherLanguage("backend", "vi", enData) } diff --git a/i18n/locales/vi/data.json b/i18n/locales/vi/data.json new file mode 100644 index 00000000..4b14cbb5 --- /dev/null +++ b/i18n/locales/vi/data.json @@ -0,0 +1,147 @@ +{ + "account": { + "Email: %s": "Email: %s", + "Get init score failed, error: %w": "Get init score failed, error: %w", + "Invalid information": "Invalid information", + "Phone: %s": "Phone: %s", + "Please sign out first before signing in": "Please sign out first before signing in", + "Please sign out first before signing up": "Please sign out first before signing up", + "The application does not allow to sign up new account": "The application does not allow to sign up new account" + }, + "auth": { + "Challenge method should be S256": "Challenge method should be S256", + "Failed to create user, user information is invalid: %s": "Failed to create user, user information is invalid: %s", + "Failed to login in: %s": "Failed to login in: %s", + "Invalid token": "Invalid token", + "State expected: %s, but got: %s": "State expected: %s, but got: %s", + "The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account via %%s, please use another way to sign up": "The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account via %%s, please use another way to sign up", + "The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support", + "The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)", + "The application: %s does not exist": "The application: %s does not exist", + "The login method: login with password is not enabled for the application": "The login method: login with password is not enabled for the application", + "The provider type: %s is not supported": "The provider type: %s is not supported", + "The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application", + "The user is forbidden to sign in, please contact the administrator": "The user is forbidden to sign in, please contact the administrator", + "Turing test failed.": "Turing test failed.", + "Unauthorized operation": "Unauthorized operation", + "Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s" + }, + "cas": { + "Service %s and %s do not match": "Service %s and %s do not match" + }, + "check": { + "Affiliation cannot be blank": "Affiliation cannot be blank", + "DisplayName cannot be blank": "DisplayName cannot be blank", + "DisplayName is not valid real name": "DisplayName is not valid real name", + "Email already exists": "Email already exists", + "Email cannot be empty": "Email cannot be empty", + "Email is invalid": "Email is invalid", + "Empty username.": "Empty username.", + "FirstName cannot be blank": "FirstName cannot be blank", + "LastName cannot be blank": "LastName cannot be blank", + "Ldap user name or password incorrect": "Ldap user name or password incorrect", + "Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server", + "Organization does not exist": "Organization does not exist", + "Password must have at least 6 characters": "Password must have at least 6 characters", + "Phone already exists": "Phone already exists", + "Phone cannot be empty": "Phone cannot be empty", + "Phone number is invalid": "Phone number is invalid", + "Session outdated, please login again": "Session outdated, please login again", + "The user is forbidden to sign in, please contact the administrator": "The user is forbidden to sign in, please contact the administrator", + "The username may only contain alphanumeric characters, underlines or hyphens, cannot have consecutive hyphens or underlines, and cannot begin or end with a hyphen or underline.": "The username may only contain alphanumeric characters, underlines or hyphens, cannot have consecutive hyphens or underlines, and cannot begin or end with a hyphen or underline.", + "Username already exists": "Username already exists", + "Username cannot be an email address": "Username cannot be an email address", + "Username cannot contain white spaces": "Username cannot contain white spaces", + "Username cannot start with a digit": "Username cannot start with a digit", + "Username is too long (maximum is 39 characters).": "Username is too long (maximum is 39 characters).", + "Username must have at least 2 characters": "Username must have at least 2 characters", + "You have entered the wrong password or code too many times, please wait for %d minutes and try again": "You have entered the wrong password or code too many times, please wait for %d minutes and try again", + "Your region is not allow to signup by phone": "Your region is not allow to signup by phone", + "password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances", + "unsupported password type: %s": "unsupported password type: %s" + }, + "general": { + "Missing parameter": "Missing parameter", + "Please login first": "Please login first", + "The user: %s doesn't exist": "The user: %s doesn't exist", + "don't support captchaProvider: ": "don't support captchaProvider: " + }, + "ldap": { + "Ldap server exist": "Ldap server exist" + }, + "link": { + "Please link first": "Please link first", + "This application has no providers": "This application has no providers", + "This application has no providers of type": "This application has no providers of type", + "This provider can't be unlinked": "This provider can't be unlinked", + "You are not the global admin, you can't unlink other users": "You are not the global admin, you can't unlink other users", + "You can't unlink yourself, you are not a member of any application": "You can't unlink yourself, you are not a member of any application" + }, + "organization": { + "Only admin can modify the %s.": "Only admin can modify the %s.", + "The %s is immutable.": "The %s is immutable.", + "Unknown modify rule %s.": "Unknown modify rule %s." + }, + "provider": { + "Invalid application id": "Invalid application id", + "the provider: %s does not exist": "the provider: %s does not exist" + }, + "resource": { + "User is nil for tag: avatar": "User is nil for tag: avatar", + "Username or fullFilePath is empty: username = %s, fullFilePath = %s": "Username or fullFilePath is empty: username = %s, fullFilePath = %s" + }, + "saml": { + "Application %s not found": "Application %s not found" + }, + "saml_sp": { + "provider %s's category is not SAML": "provider %s's category is not SAML" + }, + "service": { + "Empty parameters for emailForm: %v": "Empty parameters for emailForm: %v", + "Invalid Email receivers: %s": "Invalid Email receivers: %s", + "Invalid phone receivers: %s": "Invalid phone receivers: %s" + }, + "storage": { + "The objectKey: %s is not allowed": "The objectKey: %s is not allowed", + "The provider type: %s is not supported": "The provider type: %s is not supported" + }, + "token": { + "Empty clientId or clientSecret": "Empty clientId or clientSecret", + "Grant_type: %s is not supported in this application": "Grant_type: %s is not supported in this application", + "Invalid application or wrong clientSecret": "Invalid application or wrong clientSecret", + "Invalid client_id": "Invalid client_id", + "Redirect URI: %s doesn't exist in the allowed Redirect URI list": "Redirect URI: %s doesn't exist in the allowed Redirect URI list", + "Token not found, invalid accessToken": "Token not found, invalid accessToken" + }, + "user": { + "Display name cannot be empty": "Display name cannot be empty", + "New password cannot contain blank space.": "New password cannot contain blank space.", + "New password must have at least 6 characters": "New password must have at least 6 characters" + }, + "user_upload": { + "Failed to import users": "Failed to import users" + }, + "util": { + "No application is found for userId: %s": "No application is found for userId: %s", + "No provider for category: %s is found for application: %s": "No provider for category: %s is found for application: %s", + "The provider: %s is not found": "The provider: %s is not found" + }, + "verification": { + "Code has not been sent yet!": "Code has not been sent yet!", + "Email is invalid": "Email is invalid", + "Invalid captcha provider.": "Invalid captcha provider.", + "Organization does not exist": "Organization does not exist", + "Phone number is invalid in your region %s": "Phone number is invalid in your region %s", + "Turing test failed.": "Turing test failed.", + "Unable to get the email modify rule.": "Unable to get the email modify rule.", + "Unable to get the phone modify rule.": "Unable to get the phone modify rule.", + "Unknown type": "Unknown type", + "Wrong parameter": "Wrong parameter", + "You should verify your code in %d min!": "You should verify your code in %d min!", + "the user does not exist, please sign up first": "the user does not exist, please sign up first" + }, + "webauthn": { + "Found no credentials for this user": "Found no credentials for this user", + "Please call WebAuthnSigninBegin first": "Please call WebAuthnSigninBegin first" + } +} diff --git a/object/init.go b/object/init.go index 9c3944a1..bd9d4885 100644 --- a/object/init.go +++ b/object/init.go @@ -56,7 +56,7 @@ func initBuiltInOrganization() bool { CountryCodes: []string{"CN"}, DefaultAvatar: fmt.Sprintf("%s/img/casbin.svg", conf.GetConfigString("staticBaseUrl")), Tags: []string{}, - Languages: []string{"en", "zh", "es", "fr", "de", "ja", "ko", "ru"}, + Languages: []string{"en", "zh", "es", "fr", "de", "ja", "ko", "ru", "vi"}, InitScore: 2000, AccountItems: []*AccountItem{ {Name: "Organization", Visible: true, ViewRule: "Public", ModifyRule: "Admin"}, diff --git a/web/src/OrganizationListPage.js b/web/src/OrganizationListPage.js index f6f7ef23..acfba5d4 100644 --- a/web/src/OrganizationListPage.js +++ b/web/src/OrganizationListPage.js @@ -37,7 +37,7 @@ class OrganizationListPage extends BaseListPage { defaultAvatar: `${Setting.StaticBaseUrl}/img/casbin.svg`, defaultApplication: "", tags: [], - languages: ["en", "zh", "es", "fr", "de", "ja", "ko", "ru"], + languages: ["en", "zh", "es", "fr", "de", "ja", "ko", "ru", "vi"], masterPassword: "", enableSoftDeletion: false, isProfilePublic: true, diff --git a/web/src/Setting.js b/web/src/Setting.js index 485fb5b1..bbb11833 100644 --- a/web/src/Setting.js +++ b/web/src/Setting.js @@ -32,13 +32,14 @@ export const ServerUrl = ""; export const StaticBaseUrl = "https://cdn.casbin.org"; export const Countries = [{label: "English", key: "en", country: "US", alt: "English"}, - {label: "简体中文", key: "zh", country: "CN", alt: "简体中文"}, + {label: "中文", key: "zh", country: "CN", alt: "中文"}, {label: "Español", key: "es", country: "ES", alt: "Español"}, {label: "Français", key: "fr", country: "FR", alt: "Français"}, {label: "Deutsch", key: "de", country: "DE", alt: "Deutsch"}, {label: "日本語", key: "ja", country: "JP", alt: "日本語"}, {label: "한국어", key: "ko", country: "KR", alt: "한국어"}, {label: "Русский", key: "ru", country: "RU", alt: "Русский"}, + {label: "TiếngViệt", key: "vi", country: "VI", alt: "TiếngViệt"}, ]; export function getThemeData(organization, application) { diff --git a/web/src/i18n.js b/web/src/i18n.js index 0df87a86..01e1a863 100644 --- a/web/src/i18n.js +++ b/web/src/i18n.js @@ -13,26 +13,28 @@ // limitations under the License. import i18n from "i18next"; -import zh from "./locales/zh/data.json"; import en from "./locales/en/data.json"; +import zh from "./locales/zh/data.json"; +import es from "./locales/es/data.json"; import fr from "./locales/fr/data.json"; import de from "./locales/de/data.json"; +import ja from "./locales/ja/data.json"; import ko from "./locales/ko/data.json"; import ru from "./locales/ru/data.json"; -import ja from "./locales/ja/data.json"; -import es from "./locales/es/data.json"; +import vi from "./locales/vi/data.json"; import * as Conf from "./Conf"; import {initReactI18next} from "react-i18next"; const resources = { en: en, - es: es, zh: zh, + es: es, fr: fr, de: de, + ja: ja, ko: ko, ru: ru, - ja: ja, + vi: vi, }; function initLanguage() { @@ -43,17 +45,20 @@ function initLanguage() { } else { const userLanguage = navigator.language; switch (userLanguage) { + case "en": + language = "en"; + break; + case "en-US": + language = "en"; + break; case "zh-CN": language = "zh"; break; case "zh": language = "zh"; break; - case "en": - language = "en"; - break; - case "en-US": - language = "en"; + case "es": + language = "es"; break; case "fr": language = "fr"; @@ -61,14 +66,17 @@ function initLanguage() { case "de": language = "de"; break; + case "ja": + language = "ja"; + break; case "ko": language = "ko"; break; case "ru": language = "ru"; break; - case "ja": - language = "ja"; + case "vi": + language = "vi"; break; default: language = Conf.DefaultLanguage; diff --git a/web/src/locales/vi/data.json b/web/src/locales/vi/data.json new file mode 100644 index 00000000..92824501 --- /dev/null +++ b/web/src/locales/vi/data.json @@ -0,0 +1,804 @@ +{ + "account": { + "Logout": "Logout", + "My Account": "My Account", + "Sign Up": "Sign Up" + }, + "adapter": { + "Edit Adapter": "Edit Adapter", + "Failed to sync policies": "Failed to sync policies", + "New Adapter": "New Adapter", + "Policies": "Policies", + "Policies - Tooltip": "Policies - Tooltip", + "Repeated policy rules": "Repeated policy rules", + "Sync": "Sync", + "Sync policies successfully": "Sync policies successfully" + }, + "application": { + "Always": "Always", + "Auto signin": "Auto signin", + "Auto signin - Tooltip": "Auto signin - Tooltip", + "Background URL": "Background URL", + "Background URL - Tooltip": "Background URL - Tooltip", + "Center": "Center", + "Copy SAML metadata URL": "Copy SAML metadata URL", + "Copy prompt page URL": "Copy prompt page URL", + "Copy signin page URL": "Copy signin page URL", + "Copy signup page URL": "Copy signup page URL", + "Edit Application": "Edit Application", + "Enable SAML compress": "Enable SAML compress", + "Enable SAML compress - Tooltip": "Enable SAML compress - Tooltip", + "Enable WebAuthn signin": "Enable WebAuthn signin", + "Enable WebAuthn signin - Tooltip": "Enable WebAuthn signin - Tooltip", + "Enable code signin": "Enable code signin", + "Enable code signin - Tooltip": "Enable code signin - Tooltip", + "Enable link accounts that with the same email": "Enable link accounts that with the same email", + "Enable link accounts that with the same email - Tooltip": "Enable link accounts that with the same email - Tooltip", + "Enable side panel": "Enable side panel", + "Enable signin session - Tooltip": "Enable signin session - Tooltip", + "Enable signup": "Enable signup", + "Enable signup - Tooltip": "Enable signup - Tooltip", + "Failed to sign in": "Failed to sign in", + "File uploaded successfully": "File uploaded successfully", + "Follow organization theme": "Follow organization theme", + "Form CSS": "Form CSS", + "Form CSS - Edit": "Form CSS - Edit", + "Form CSS - Tooltip": "Form CSS - Tooltip", + "Form position": "Form position", + "Form position - Tooltip": "Form position - Tooltip", + "Grant types": "Grant types", + "Grant types - Tooltip": "Grant types - Tooltip", + "Left": "Left", + "Logged in successfully": "Logged in successfully", + "Logged out successfully": "Logged out successfully", + "New Application": "New Application", + "None": "None", + "Password ON": "Password ON", + "Password ON - Tooltip": "Password ON - Tooltip", + "Please input your application!": "Please input your application!", + "Please input your organization!": "Please input your organization!", + "Please select a HTML file": "Please select a HTML file", + "Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser", + "Redirect URL": "Redirect URL", + "Redirect URL (Assertion Consumer Service POST Binding URL) - Tooltip": "Redirect URL (Assertion Consumer Service POST Binding URL) - Tooltip", + "Redirect URLs": "Redirect URLs", + "Redirect URLs - Tooltip": "Redirect URLs - Tooltip", + "Refresh token expire": "Refresh token expire", + "Refresh token expire - Tooltip": "Refresh token expire - Tooltip", + "Right": "Right", + "Rule": "Rule", + "SAML Reply URL": "SAML Reply URL", + "SAML metadata": "SAML metadata", + "SAML metadata - Tooltip": "SAML metadata - Tooltip", + "SAML metadata URL copied to clipboard successfully": "SAML metadata URL copied to clipboard successfully", + "Side panel HTML": "Side panel HTML", + "Side panel HTML - Edit": "Side panel HTML - Edit", + "Side panel HTML - Tooltip": "Side panel HTML - Tooltip", + "Sign Up Error": "Sign Up Error", + "Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser", + "Signin session": "Signin session", + "Signup items": "Signup items", + "Signup items - Tooltip": "Signup items - Tooltip", + "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser", + "The application does not allow to sign up new account": "The application does not allow to sign up new account", + "Token expire": "Token expire", + "Token expire - Tooltip": "Token expire - Tooltip", + "Token format": "Token format", + "Token format - Tooltip": "Token format - Tooltip", + "You are unexpected to see this prompt page": "You are unexpected to see this prompt page" + }, + "cert": { + "Bit size": "Bit size", + "Bit size - Tooltip": "Bit size - Tooltip", + "Certificate": "Certificate", + "Certificate - Tooltip": "Certificate - Tooltip", + "Certificate copied to clipboard successfully": "Certificate copied to clipboard successfully", + "Copy certificate": "Copy certificate", + "Copy private key": "Copy private key", + "Crypto algorithm": "Crypto algorithm", + "Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip", + "Download certificate": "Download certificate", + "Download private key": "Download private key", + "Edit Cert": "Edit Cert", + "Expire in years": "Expire in years", + "Expire in years - Tooltip": "Expire in years - Tooltip", + "New Cert": "New Cert", + "Private key": "Private key", + "Private key - Tooltip": "Private key - Tooltip", + "Private key copied to clipboard successfully": "Private key copied to clipboard successfully", + "Scope": "Scope", + "Scope - Tooltip": "Scope - Tooltip", + "Type": "Type", + "Type - Tooltip": "Type - Tooltip" + }, + "code": { + "Code You Received": "Code You Received", + "Email code": "Email code", + "Empty Code": "Empty Code", + "Enter your code": "Enter your code", + "Phone code": "Phone code", + "Please input your phone verification code!": "Please input your phone verification code!", + "Please input your verification code!": "Please input your verification code!", + "Send Code": "Send Code", + "Sending Code": "Sending Code", + "Submit and complete": "Submit and complete" + }, + "forget": { + "Account": "Account", + "Change Password": "Change Password", + "Choose email or phone": "Choose email or phone", + "Confirm": "Confirm", + "Next Step": "Next Step", + "Password": "Password", + "Please input your username!": "Please input your username!", + "Reset": "Reset", + "Retrieve password": "Retrieve password", + "Unknown forget type: ": "Unknown forget type: ", + "Verify": "Verify" + }, + "general": { + "Action": "Action", + "Adapter": "Adapter", + "Adapter - Tooltip": "Adapter - Tooltip", + "Adapters": "Adapters", + "Add": "Add", + "Affiliation URL": "Affiliation URL", + "Affiliation URL - Tooltip": "Affiliation URL - Tooltip", + "Application": "Application", + "Applications": "Applications", + "Applications that require authentication": "Applications that require authentication", + "Avatar": "Avatar", + "Avatar - Tooltip": "Avatar - Tooltip", + "Back Home": "Back Home", + "Cancel": "Cancel", + "Captcha": "Captcha", + "Cert": "Cert", + "Cert - Tooltip": "Cert - Tooltip", + "Certs": "Certs", + "Click to Upload": "Click to Upload", + "Client IP": "Client IP", + "Close": "Close", + "Created time": "Created time", + "Default application": "Default application", + "Default application - Tooltip": "Default application - Tooltip", + "Default avatar": "Default avatar", + "Default avatar - Tooltip": "Default avatar - Tooltip", + "Delete": "Delete", + "Description": "Description", + "Description - Tooltip": "Description - Tooltip", + "Display name": "Display name", + "Display name - Tooltip": "Display name - Tooltip", + "Down": "Down", + "Edit": "Edit", + "Email": "Email", + "Email - Tooltip": "Email - Tooltip", + "Failed to add": "Failed to add", + "Failed to connect to server": "Failed to connect to server", + "Failed to delete": "Failed to delete", + "Failed to save": "Failed to save", + "Favicon": "Favicon", + "Favicon - Tooltip": "Favicon - Tooltip", + "First name": "First name", + "Forget URL": "Forget URL", + "Forget URL - Tooltip": "Forget URL - Tooltip", + "Go to writable demo site?": "Go to writable demo site?", + "Home": "Home", + "Home - Tooltip": "Home - Tooltip", + "ID": "ID", + "ID - Tooltip": "ID - Tooltip", + "Is enabled": "Is enabled", + "Is enabled - Tooltip": "Is enabled - Tooltip", + "LDAPs": "LDAPs", + "LDAPs - Tooltip": "LDAPs - Tooltip", + "Languages": "Languages", + "Languages - Tooltip": "Languages - Tooltip", + "Last name": "Last name", + "Logo": "Logo", + "Logo - Tooltip": "Logo - Tooltip", + "Master password": "Master password", + "Master password - Tooltip": "Master password - Tooltip", + "Menu": "Menu", + "Method": "Method", + "Model": "Model", + "Model - Tooltip": "Model - Tooltip", + "Models": "Models", + "Name": "Name", + "Name - Tooltip": "Name - Tooltip", + "OAuth providers": "OAuth providers", + "Organization": "Organization", + "Organization - Tooltip": "Organization - Tooltip", + "Organizations": "Organizations", + "Password": "Password", + "Password - Tooltip": "Password - Tooltip", + "Password salt": "Password salt", + "Password salt - Tooltip": "Password salt - Tooltip", + "Password type": "Password type", + "Password type - Tooltip": "Password type - Tooltip", + "Payments": "Payments", + "Permissions": "Permissions", + "Permissions - Tooltip": "Permissions - Tooltip", + "Phone": "Phone", + "Phone - Tooltip": "Phone - Tooltip", + "Preview": "Preview", + "Preview - Tooltip": "Preview - Tooltip", + "Products": "Products", + "Provider": "Provider", + "Provider - Tooltip": "Provider - Tooltip", + "Providers": "Providers", + "Providers - Tooltip": "Providers - Tooltip", + "Real name": "Real name", + "Records": "Records", + "Request URI": "Request URI", + "Resources": "Resources", + "Roles": "Roles", + "Roles - Tooltip": "Roles - Tooltip", + "Save": "Save", + "Save & Exit": "Save & Exit", + "Session ID": "Session ID", + "Sessions": "Sessions", + "Signin URL": "Signin URL", + "Signin URL - Tooltip": "Signin URL - Tooltip", + "Signup URL": "Signup URL", + "Signup URL - Tooltip": "Signup URL - Tooltip", + "Signup application": "Signup application", + "Signup application - Tooltip": "Signup application - Tooltip", + "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", + "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", + "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", + "State": "State", + "State - Tooltip": "State - Tooltip", + "Successfully added": "Successfully added", + "Successfully deleted": "Successfully deleted", + "Successfully saved": "Successfully saved", + "Supported country code": "Supported country code", + "Supported country code - Tooltip": "Supported country code - Tooltip", + "Swagger": "Swagger", + "Sync": "Sync", + "Syncers": "Syncers", + "SysInfo": "SysInfo", + "This is a read-only demo site!": "This is a read-only demo site!", + "Timestamp": "Timestamp", + "Tokens": "Tokens", + "URL": "URL", + "URL - Tooltip": "URL - Tooltip", + "Up": "Up", + "User": "User", + "User - Tooltip": "User - Tooltip", + "User containers": "User containers", + "User type": "User type", + "User type - Tooltip": "User type - Tooltip", + "Users": "Users", + "Users under all organizations": "Users under all organizations", + "Webhooks": "Webhooks", + "{total} in total": "{total} in total" + }, + "ldap": { + "Address": "Address", + "Admin": "Admin", + "Admin - Tooltip": "Admin - Tooltip", + "Admin Password": "Admin Password", + "Admin Password - Tooltip": "Admin Password - Tooltip", + "Auto Sync": "Auto Sync", + "Auto Sync - Tooltip": "Auto Sync - Tooltip", + "Base DN": "Base DN", + "Base DN - Tooltip": "Base DN - Tooltip", + "CN": "CN", + "Edit LDAP": "Edit LDAP", + "Email": "Email", + "Group Id": "Group Id", + "ID": "ID", + "Last Sync": "Last Sync", + "Phone": "Phone", + "Server": "Server", + "Server Host": "Server Host", + "Server Host - Tooltip": "Server Host - Tooltip", + "Server Name": "Server Name", + "Server Name - Tooltip": "Server Name - Tooltip", + "Server Port": "Server Port", + "Server Port - Tooltip": "Server Port - Tooltip", + "Sync": "Sync", + "The Auto Sync option will sync all users to specify organization": "The Auto Sync option will sync all users to specify organization", + "UidNumber / Uid": "UidNumber / Uid" + }, + "login": { + "Auto sign in": "Auto sign in", + "Continue with": "Continue with", + "Email or phone": "Email or phone", + "Forgot password?": "Forgot password?", + "Loading": "Loading", + "Logging out...": "Logging out...", + "No account?": "No account?", + "Or sign in with another account": "Or sign in with another account", + "Password": "Password", + "Password - Tooltip": "Password - Tooltip", + "Please input your Email or Phone!": "Please input your Email or Phone!", + "Please input your code!": "Please input your code!", + "Please input your password!": "Please input your password!", + "Please input your password, at least 6 characters!": "Please input your password, at least 6 characters!", + "Redirecting, please wait.": "Redirecting, please wait.", + "Sign In": "Sign In", + "Sign in with WebAuthn": "Sign in with WebAuthn", + "Sign in with {type}": "Sign in with {type}", + "Signing in...": "Signing in...", + "Successfully logged in with webauthn credentials": "Successfully logged in with webauthn credentials", + "The input is not valid Email or Phone!": "The input is not valid Email or Phone!", + "To access": "To access", + "Verification Code": "Verification Code", + "WebAuthn": "WebAuthn", + "sign up now": "sign up now", + "username, Email or phone": "username, Email or phone" + }, + "model": { + "Edit Model": "Edit Model", + "Model text": "Model text", + "Model text - Tooltip": "Model text - Tooltip", + "New Model": "New Model" + }, + "organization": { + "Account items": "Account items", + "Account items - Tooltip": "Account items - Tooltip", + "Default avatar": "Default avatar", + "Edit Organization": "Edit Organization", + "Favicon": "Favicon", + "Follow global theme": "Follow global theme", + "InitScore": "InitScore", + "Is profile public": "Is profile public", + "Is profile public - Tooltip": "Is profile public - Tooltip", + "Modify rule": "Modify rule", + "New Organization": "New Organization", + "Soft deletion": "Soft deletion", + "Soft deletion - Tooltip": "Soft deletion - Tooltip", + "Tags": "Tags", + "Tags - Tooltip": "Tags - Tooltip", + "The user's initScore - Tooltip": "The user's initScore - Tooltip", + "View rule": "View rule", + "Visible": "Visible", + "Website URL": "Website URL", + "Website URL - Tooltip": "Website URL - Tooltip" + }, + "payment": { + "Confirm your invoice information": "Confirm your invoice information", + "Currency": "Currency", + "Currency - Tooltip": "Currency - Tooltip", + "Download Invoice": "Download Invoice", + "Edit Payment": "Edit Payment", + "Individual": "Individual", + "Invoice URL": "Invoice URL", + "Invoice URL - Tooltip": "Invoice URL - Tooltip", + "Invoice actions": "Invoice actions", + "Invoice actions - Tooltip": "Invoice actions - Tooltip", + "Invoice remark": "Invoice remark", + "Invoice remark - Tooltip": "Invoice remark - Tooltip", + "Invoice tax ID": "Invoice tax ID", + "Invoice tax ID - Tooltip": "Invoice tax ID - Tooltip", + "Invoice title": "Invoice title", + "Invoice title - Tooltip": "Invoice title - Tooltip", + "Invoice type": "Invoice type", + "Invoice type - Tooltip": "Invoice type - Tooltip", + "Issue Invoice": "Issue Invoice", + "Message": "Message", + "Message - Tooltip": "Message - Tooltip", + "New Payment": "New Payment", + "Organization": "Organization", + "Person Email": "Person Email", + "Person Email - Tooltip": "Person Email - Tooltip", + "Person ID card": "Person ID card", + "Person ID card - Tooltip": "Person ID card - Tooltip", + "Person name": "Person name", + "Person name - Tooltip": "Person name - Tooltip", + "Person phone": "Person phone", + "Person phone - Tooltip": "Person phone - Tooltip", + "Please carefully check your invoice information. Once the invoice is issued, it cannot be withdrawn or modified.": "Please carefully check your invoice information. Once the invoice is issued, it cannot be withdrawn or modified.", + "Please click the below button to return to the original website": "Please click the below button to return to the original website", + "Please pay the order first!": "Please pay the order first!", + "Price": "Price", + "Price - Tooltip": "Price - Tooltip", + "Processing...": "Processing...", + "Product": "Product", + "Product - Tooltip": "Product - Tooltip", + "Result": "Result", + "Return to Website": "Return to Website", + "State": "State", + "State - Tooltip": "State - Tooltip", + "The payment has failed": "The payment has failed", + "The payment is still under processing": "The payment is still under processing", + "Type": "Type", + "Type - Tooltip": "Type - Tooltip", + "You have successfully completed the payment": "You have successfully completed the payment", + "please wait for a few seconds...": "please wait for a few seconds...", + "the current state is": "the current state is" + }, + "permission": { + "Actions": "Actions", + "Actions - Tooltip": "Actions - Tooltip", + "Admin": "Admin", + "Allow": "Allow", + "Approve time": "Approve time", + "Approve time - Tooltip": "Approve time - Tooltip", + "Approved": "Approved", + "Approver": "Approver", + "Approver - Tooltip": "Approver - Tooltip", + "Deny": "Deny", + "Edit Permission": "Edit Permission", + "Effect": "Effect", + "Effect - Tooltip": "Effect - Tooltip", + "New Permission": "New Permission", + "Pending": "Pending", + "Read": "Read", + "Resource type": "Resource type", + "Resource type - Tooltip": "Resource type - Tooltip", + "Resources": "Resources", + "Resources - Tooltip": "Resources - Tooltip", + "State": "State", + "State - Tooltip": "State - Tooltip", + "Submitter": "Submitter", + "Submitter - Tooltip": "Submitter - Tooltip", + "TreeNode": "TreeNode", + "Write": "Write" + }, + "product": { + "Alipay": "Alipay", + "Buy": "Buy", + "Buy Product": "Buy Product", + "CNY": "CNY", + "Currency": "Currency", + "Currency - Tooltip": "Currency - Tooltip", + "Description": "Description", + "Description - Tooltip": "Description - Tooltip", + "Detail": "Detail", + "Detail - Tooltip": "Detail - Tooltip", + "Edit Product": "Edit Product", + "I have completed the payment": "I have completed the payment", + "Image": "Image", + "Image - Tooltip": "Image - Tooltip", + "New Product": "New Product", + "Pay": "Pay", + "Payment providers": "Payment providers", + "Payment providers - Tooltip": "Payment providers - Tooltip", + "Paypal": "Paypal", + "Placing order...": "Placing order...", + "Please provide your username in the remark": "Please provide your username in the remark", + "Please scan the QR code to pay": "Please scan the QR code to pay", + "Price": "Price", + "Price - Tooltip": "Price - Tooltip", + "Quantity": "Quantity", + "Quantity - Tooltip": "Quantity - Tooltip", + "Return URL": "Return URL", + "Return URL - Tooltip": "Return URL - Tooltip", + "SKU": "SKU", + "Sold": "Sold", + "Sold - Tooltip": "Sold - Tooltip", + "Tag": "Tag", + "Tag - Tooltip": "Tag - Tooltip", + "Test buy page..": "Test buy page..", + "There is no payment channel for this product.": "There is no payment channel for this product.", + "This product is currently not in sale.": "This product is currently not in sale.", + "USD": "USD", + "WeChat Pay": "WeChat Pay" + }, + "provider": { + "Access key": "Access key", + "Access key - Tooltip": "Access key - Tooltip", + "Agent ID": "Agent ID", + "Agent ID - Tooltip": "Agent ID - Tooltip", + "App ID": "App ID", + "App ID - Tooltip": "App ID - Tooltip", + "App key": "App key", + "App key - Tooltip": "App key - Tooltip", + "App secret": "App secret", + "AppSecret - Tooltip": "AppSecret - Tooltip", + "Auth URL": "Auth URL", + "Auth URL - Tooltip": "Auth URL - Tooltip", + "Bucket": "Bucket", + "Bucket - Tooltip": "Bucket - Tooltip", + "Can not parse Metadata": "Can not parse Metadata", + "Can signin": "Can signin", + "Can signup": "Can signup", + "Can unlink": "Can unlink", + "Category": "Category", + "Category - Tooltip": "Category - Tooltip", + "Channel No.": "Channel No.", + "Channel No. - Tooltip": "Channel No. - Tooltip", + "Client ID": "Client ID", + "Client ID - Tooltip": "Client ID - Tooltip", + "Client ID 2": "Client ID 2", + "Client ID 2 - Tooltip": "Client ID 2 - Tooltip", + "Client secret": "Client secret", + "Client secret - Tooltip": "Client secret - Tooltip", + "Client secret 2": "Client secret 2", + "Client secret 2 - Tooltip": "Client secret 2 - Tooltip", + "Copy": "Copy", + "Disable SSL": "Disable SSL", + "Disable SSL - Tooltip": "Disable SSL - Tooltip", + "Domain": "Domain", + "Domain - Tooltip": "Domain - Tooltip", + "Edit Provider": "Edit Provider", + "Email Content": "Email Content", + "Email Content - Tooltip": "Email Content - Tooltip", + "Email Title": "Email Title", + "Email Title - Tooltip": "Email Title - Tooltip", + "Enable QR code": "Enable QR code", + "Enable QR code - Tooltip": "Enable QR code - Tooltip", + "Endpoint": "Endpoint", + "Endpoint (Intranet)": "Endpoint (Intranet)", + "Host": "Host", + "Host - Tooltip": "Host - Tooltip", + "IdP": "IdP", + "IdP certificate": "IdP certificate", + "Issuer URL": "Issuer URL", + "Issuer URL - Tooltip": "Issuer URL - Tooltip", + "Link copied to clipboard successfully": "Link copied to clipboard successfully", + "Metadata": "Metadata", + "Metadata - Tooltip": "Metadata - Tooltip", + "Method": "Method", + "Method - Tooltip": "Method - Tooltip", + "Name": "Name", + "New Provider": "New Provider", + "Parse": "Parse", + "Parse Metadata successfully": "Parse Metadata successfully", + "Path prefix": "Path prefix", + "Please use WeChat and scan the QR code to sign in": "Please use WeChat and scan the QR code to sign in", + "Port": "Port", + "Port - Tooltip": "Port - Tooltip", + "Prompted": "Prompted", + "Provider URL": "Provider URL", + "Provider URL - Tooltip": "Provider URL - Tooltip", + "Region ID": "Region ID", + "Region ID - Tooltip": "Region ID - Tooltip", + "Region endpoint for Internet": "Region endpoint for Internet", + "Region endpoint for Intranet": "Region endpoint for Intranet", + "Required": "Required", + "SAML 2.0 Endpoint (HTTP)": "SAML 2.0 Endpoint (HTTP)", + "SMS account": "SMS account", + "SMS account - Tooltip": "SMS account - Tooltip", + "SP ACS URL": "SP ACS URL", + "SP ACS URL - Tooltip": "SP ACS URL - Tooltip", + "SP Entity ID": "SP Entity ID", + "Scene": "Scene", + "Scene - Tooltip": "Scene - Tooltip", + "Scope": "Scope", + "Scope - Tooltip": "Scope - Tooltip", + "Secret access key": "Secret access key", + "Secret key": "Secret key", + "Secret key - Tooltip": "Secret key - Tooltip", + "SecretAccessKey - Tooltip": "SecretAccessKey - Tooltip", + "Send Test Email": "Send Test Email", + "Sign Name": "Sign Name", + "Sign Name - Tooltip": "Sign Name - Tooltip", + "Sign request": "Sign request", + "Sign request - Tooltip": "Sign request - Tooltip", + "Signin HTML": "Signin HTML", + "Signin HTML - Edit": "Signin HTML - Edit", + "Signin HTML - Tooltip": "Signin HTML - Tooltip", + "Signup HTML": "Signup HTML", + "Signup HTML - Edit": "Signup HTML - Edit", + "Signup HTML - Tooltip": "Signup HTML - Tooltip", + "Site key": "Site key", + "Site key - Tooltip": "Site key - Tooltip", + "Sub type": "Sub type", + "Sub type - Tooltip": "Sub type - Tooltip", + "Template Code": "Template Code", + "Template Code - Tooltip": "Template Code - Tooltip", + "Terms of Use": "Terms of Use", + "Terms of Use - Tooltip": "Terms of Use - Tooltip", + "Test Connection": "Test Connection", + "Test Email": "Test Email", + "Test Email - Tooltip": "Test Email - Tooltip", + "The prefix path of the file - Tooltip": "The prefix path of the file - Tooltip", + "Token URL": "Token URL", + "Token URL - Tooltip": "Token URL - Tooltip", + "Type": "Type", + "Type - Tooltip": "Type - Tooltip", + "UserInfo URL": "UserInfo URL", + "UserInfo URL - Tooltip": "UserInfo URL - Tooltip", + "Visible": "Visible", + "admin (share)": "admin (share)", + "alertType": "alertType" + }, + "record": { + "Is Triggered": "Is Triggered" + }, + "resource": { + "Application": "Application", + "Copy Link": "Copy Link", + "File name": "File name", + "File size": "File size", + "Format": "Format", + "Link copied to clipboard successfully": "Link copied to clipboard successfully", + "Parent": "Parent", + "Tag": "Tag", + "Type": "Type", + "Upload a file...": "Upload a file...", + "User": "User" + }, + "role": { + "Edit Role": "Edit Role", + "New Role": "New Role", + "Sub domains": "Sub domains", + "Sub domains - Tooltip": "Sub domains - Tooltip", + "Sub roles": "Sub roles", + "Sub roles - Tooltip": "Sub roles - Tooltip", + "Sub users": "Sub users", + "Sub users - Tooltip": "Sub users - Tooltip" + }, + "signup": { + "Accept": "Accept", + "Agreement": "Agreement", + "Confirm": "Confirm", + "Decline": "Decline", + "Have account?": "Have account?", + "Please accept the agreement!": "Please accept the agreement!", + "Please click the below button to sign in": "Please click the below button to sign in", + "Please confirm your password!": "Please confirm your password!", + "Please input the correct ID card number!": "Please input the correct ID card number!", + "Please input your Email!": "Please input your Email!", + "Please input your ID card number!": "Please input your ID card number!", + "Please input your address!": "Please input your address!", + "Please input your affiliation!": "Please input your affiliation!", + "Please input your display name!": "Please input your display name!", + "Please input your first name!": "Please input your first name!", + "Please input your last name!": "Please input your last name!", + "Please input your phone number!": "Please input your phone number!", + "Please input your real name!": "Please input your real name!", + "Please select your country code!": "Please select your country code!", + "Please select your country/region!": "Please select your country/region!", + "Terms of Use": "Terms of Use", + "The input is not invoice Tax ID!": "The input is not invoice Tax ID!", + "The input is not invoice title!": "The input is not invoice title!", + "The input is not valid Email!": "The input is not valid Email!", + "The input is not valid Phone!": "The input is not valid Phone!", + "Username": "Username", + "Username - Tooltip": "Username - Tooltip", + "Your account has been created!": "Your account has been created!", + "Your confirmed password is inconsistent with the password!": "Your confirmed password is inconsistent with the password!", + "sign in now": "sign in now" + }, + "syncer": { + "Affiliation table": "Affiliation table", + "Affiliation table - Tooltip": "Affiliation table - Tooltip", + "Avatar base URL": "Avatar base URL", + "Avatar base URL - Tooltip": "Avatar base URL - Tooltip", + "Casdoor column": "Casdoor column", + "Column name": "Column name", + "Column type": "Column type", + "Database": "Database", + "Database - Tooltip": "Database - Tooltip", + "Database type": "Database type", + "Database type - Tooltip": "Database type - Tooltip", + "Edit Syncer": "Edit Syncer", + "Error text": "Error text", + "Error text - Tooltip": "Error text - Tooltip", + "Is hashed": "Is hashed", + "New Syncer": "New Syncer", + "Sync interval": "Sync interval", + "Sync interval - Tooltip": "Sync interval - Tooltip", + "Table": "Table", + "Table - Tooltip": "Table - Tooltip", + "Table columns": "Table columns", + "Table columns - Tooltip": "Table columns - Tooltip", + "Table primary key": "Table primary key", + "Table primary key - Tooltip": "Table primary key - Tooltip" + }, + "system": { + "About Casdoor": "About Casdoor", + "An Identity and Access Management (IAM) / Single-Sign-On (SSO) platform with web UI supporting OAuth 2.0, OIDC, SAML and CAS": "An Identity and Access Management (IAM) / Single-Sign-On (SSO) platform with web UI supporting OAuth 2.0, OIDC, SAML and CAS", + "CPU Usage": "CPU Usage", + "Community": "Community", + "Get CPU Usage Failed": "Get CPU Usage Failed", + "Get Memory Usage Failed": "Get Memory Usage Failed", + "Memory Usage": "Memory Usage", + "Official Website": "Official Website", + "Unknown Version": "Unknown Version", + "Version": "Version" + }, + "theme": { + "Blossom": "Blossom", + "Border radius": "Border radius", + "Compact": "Compact", + "Customize theme": "Customize theme", + "Dark": "Dark", + "Default": "Default", + "Document": "Document", + "Is compact": "Is compact", + "Primary color": "Primary color", + "Theme": "Theme", + "Theme - Tooltip": "Theme - Tooltip" + }, + "token": { + "Access token": "Access token", + "Authorization code": "Authorization code", + "Edit Token": "Edit Token", + "Expires in": "Expires in", + "New Token": "New Token", + "Scope": "Scope", + "Token type": "Token type" + }, + "user": { + "\" + destType + \" reset": "\" + destType + \" reset", + "3rd-party logins": "3rd-party logins", + "3rd-party logins - Tooltip": "3rd-party logins - Tooltip", + "Address": "Address", + "Address - Tooltip": "Address - Tooltip", + "Affiliation": "Affiliation", + "Affiliation - Tooltip": "Affiliation - Tooltip", + "Bio": "Bio", + "Bio - Tooltip": "Bio - Tooltip", + "Cancel": "Cancel", + "Captcha Verify Failed": "Captcha Verify Failed", + "Captcha Verify Success": "Captcha Verify Success", + "Code Sent": "Code Sent", + "Country code": "Country code", + "Country/Region": "Country/Region", + "Country/Region - Tooltip": "Country/Region - Tooltip", + "Edit User": "Edit User", + "Email cannot be empty": "Email cannot be empty", + "Empty input!": "Empty input!", + "Homepage": "Homepage", + "Homepage - Tooltip": "Homepage - Tooltip", + "ID card": "ID card", + "Input your email": "Input your email", + "Input your phone number": "Input your phone number", + "Is admin": "Is admin", + "Is admin - Tooltip": "Is admin - Tooltip", + "Is deleted": "Is deleted", + "Is deleted - Tooltip": "Is deleted - Tooltip", + "Is forbidden": "Is forbidden", + "Is forbidden - Tooltip": "Is forbidden - Tooltip", + "Is global admin": "Is global admin", + "Is global admin - Tooltip": "Is global admin - Tooltip", + "Keys": "Keys", + "Link": "Link", + "Location": "Location", + "Location - Tooltip": "Location - Tooltip", + "Managed accounts": "Managed accounts", + "Modify password...": "Modify password...", + "New Email": "New Email", + "New Password": "New Password", + "New User": "New User", + "New phone": "New phone", + "OK": "OK", + "Old Password": "Old Password", + "Password": "Password", + "Password Set": "Password Set", + "Phone cannot be empty": "Phone cannot be empty", + "Please select avatar from resources": "Please select avatar from resources", + "Properties": "Properties", + "Properties - Tooltip": "Properties - Tooltip", + "Re-enter New": "Re-enter New", + "Reset Email...": "Reset Email...", + "Reset Phone...": "Reset Phone...", + "Select a photo...": "Select a photo...", + "Set Password": "Set Password", + "Set new profile picture": "Set new profile picture", + "Set password...": "Set password...", + "Tag": "Tag", + "Tag - Tooltip": "Tag - Tooltip", + "Title": "Title", + "Title - Tooltip": "Title - Tooltip", + "Two passwords you typed do not match.": "Two passwords you typed do not match.", + "Unlink": "Unlink", + "Upload (.xlsx)": "Upload (.xlsx)", + "Upload a photo": "Upload a photo", + "Values": "Values", + "WebAuthn credentials": "WebAuthn credentials", + "input password": "input password" + }, + "webhook": { + "Content type": "Content type", + "Content type - Tooltip": "Content type - Tooltip", + "Edit Webhook": "Edit Webhook", + "Events": "Events", + "Events - Tooltip": "Events - Tooltip", + "Headers": "Headers", + "Headers - Tooltip": "Headers - Tooltip", + "Is user extended": "Is user extended", + "Is user extended - Tooltip": "Is user extended - Tooltip", + "Method": "Method", + "Method - Tooltip": "Method - Tooltip", + "Name": "Name", + "New Webhook": "New Webhook", + "URL": "URL", + "URL - Tooltip": "URL - Tooltip", + "Value": "Value" + } +}