-
User List
+
{t('userList')}
- Manage your users and their roles here.
+ {t('description')}
diff --git a/src/i18n/index.ts b/src/i18n/index.ts
new file mode 100644
index 0000000000..8f5b8a5001
--- /dev/null
+++ b/src/i18n/index.ts
@@ -0,0 +1,64 @@
+import i18n from 'i18next'
+import { initReactI18next } from 'react-i18next'
+
+// Import all locale files
+import enCommon from './locales/en/common.json'
+import enSidebar from './locales/en/sidebar.json'
+import enDashboard from './locales/en/dashboard.json'
+import enAuth from './locales/en/auth.json'
+import enSettings from './locales/en/settings.json'
+import enErrors from './locales/en/errors.json'
+import enTasks from './locales/en/tasks.json'
+import enUsers from './locales/en/users.json'
+import enApps from './locales/en/apps.json'
+import enChats from './locales/en/chats.json'
+
+import zhCommon from './locales/zh/common.json'
+import zhSidebar from './locales/zh/sidebar.json'
+import zhDashboard from './locales/zh/dashboard.json'
+import zhAuth from './locales/zh/auth.json'
+import zhSettings from './locales/zh/settings.json'
+import zhErrors from './locales/zh/errors.json'
+import zhTasks from './locales/zh/tasks.json'
+import zhUsers from './locales/zh/users.json'
+import zhApps from './locales/zh/apps.json'
+import zhChats from './locales/zh/chats.json'
+
+export const defaultNS = 'common'
+
+i18n.use(initReactI18next).init({
+ resources: {
+ en: {
+ common: enCommon,
+ sidebar: enSidebar,
+ dashboard: enDashboard,
+ auth: enAuth,
+ settings: enSettings,
+ errors: enErrors,
+ tasks: enTasks,
+ users: enUsers,
+ apps: enApps,
+ chats: enChats,
+ },
+ zh: {
+ common: zhCommon,
+ sidebar: zhSidebar,
+ dashboard: zhDashboard,
+ auth: zhAuth,
+ settings: zhSettings,
+ errors: zhErrors,
+ tasks: zhTasks,
+ users: zhUsers,
+ apps: zhApps,
+ chats: zhChats,
+ },
+ },
+ lng: 'en',
+ fallbackLng: 'en',
+ defaultNS,
+ interpolation: {
+ escapeValue: false, // React already escapes
+ },
+})
+
+export default i18n
diff --git a/src/i18n/locales/en/apps.json b/src/i18n/locales/en/apps.json
new file mode 100644
index 0000000000..a2fe6e8bfa
--- /dev/null
+++ b/src/i18n/locales/en/apps.json
@@ -0,0 +1,12 @@
+{
+ "title": "App Integrations",
+ "description": "Here's a list of your apps for the integration!",
+ "connected": "Connected",
+ "notConnected": "Not Connected",
+ "connect": "Connect",
+ "disconnect": "Disconnect",
+ "allApps": "All Apps",
+ "filterApps": "Filter apps...",
+ "ascending": "Ascending",
+ "descending": "Descending"
+}
diff --git a/src/i18n/locales/en/auth.json b/src/i18n/locales/en/auth.json
new file mode 100644
index 0000000000..463a462899
--- /dev/null
+++ b/src/i18n/locales/en/auth.json
@@ -0,0 +1,49 @@
+{
+ "signInTitle": "Sign in",
+ "signInDesc1": "Enter your email and password below to",
+ "signInDesc2": "log into your account",
+ "signInAgreement": "By clicking sign in, you agree to our",
+ "termsOfService": "Terms of Service",
+ "and": "and",
+ "privacyPolicy": "Privacy Policy",
+ "emailRequired": "Please enter your email",
+ "passwordRequired": "Please enter your password",
+ "passwordMinLength": "Password must be at least 7 characters long",
+ "signingIn": "Signing in...",
+ "welcomeBack": "Welcome back, {{email}}!",
+ "emailLabel": "Email",
+ "emailPlaceholder": "name@example.com",
+ "passwordLabel": "Password",
+ "passwordPlaceholder": "********",
+ "forgotPasswordLink": "Forgot password?",
+ "signInButton": "Sign in",
+ "orContinueWith": "Or continue with",
+ "createAccountTitle": "Create an account",
+ "createAccountDesc": "Enter your email and password to create an account.",
+ "alreadyHaveAccount": "Already have an account?",
+ "signInLink": "Sign In",
+ "createAccountAgreement": "By creating an account, you agree to our",
+ "confirmPasswordLabel": "Confirm Password",
+ "confirmPasswordPlaceholder": "********",
+ "confirmPasswordRequired": "Please confirm your password",
+ "passwordsDontMatch": "Passwords don't match.",
+ "createAccountButton": "Create Account",
+ "forgotPasswordTitle": "Forgot Password",
+ "forgotPasswordDesc1": "Enter your registered email and",
+ "forgotPasswordDesc2": "we will send you a link to reset your password.",
+ "dontHaveAccount": "Don't have an account?",
+ "signUpLink": "Sign up",
+ "sendingEmail": "Sending email...",
+ "emailSent": "Email sent to {{email}}",
+ "continueButton": "Continue",
+ "otpTitle": "Two-factor Authentication",
+ "otpDesc1": "Please enter the authentication code.",
+ "otpDesc2": "We have sent the authentication code to your email.",
+ "havenReceived": "Haven't received it?",
+ "resendCode": "Resend a new code.",
+ "otpRequired": "Please enter the 6-digit code.",
+ "otpLabel": "One-Time Password",
+ "verifyButton": "Verify",
+ "signUpTitle": "Sign up",
+ "error": "Error"
+}
diff --git a/src/i18n/locales/en/chats.json b/src/i18n/locales/en/chats.json
new file mode 100644
index 0000000000..8b018afc38
--- /dev/null
+++ b/src/i18n/locales/en/chats.json
@@ -0,0 +1,17 @@
+{
+ "title": "Inbox",
+ "searchLabel": "Search",
+ "searchPlaceholder": "Search chat...",
+ "youPrefix": "You: ",
+ "messageBoxLabel": "Chat Text Box",
+ "messagePlaceholder": "Type your messages...",
+ "send": "Send",
+ "emptyTitle": "Your messages",
+ "emptyDesc": "Send a message to start a chat.",
+ "emptyButton": "Send message",
+ "newMessage": "New message",
+ "to": "To:",
+ "searchPeople": "Search people...",
+ "noPeopleFound": "No people found.",
+ "chatButton": "Chat"
+}
diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json
new file mode 100644
index 0000000000..4c4b5c6bf1
--- /dev/null
+++ b/src/i18n/locales/en/common.json
@@ -0,0 +1,79 @@
+{
+ "toggleTheme": "Toggle theme",
+ "switchLanguage": "Switch language",
+ "light": "Light",
+ "dark": "Dark",
+ "system": "System",
+ "english": "English",
+ "chinese": "中文",
+ "search": "Search",
+ "searchPlaceholder": "Type a command or search...",
+ "noResults": "No results found.",
+ "theme": "Theme",
+ "cancel": "Cancel",
+ "continue": "Continue",
+ "confirm": "Confirm",
+ "delete": "Delete",
+ "save": "Save",
+ "reset": "Reset",
+ "edit": "Edit",
+ "add": "Add",
+ "close": "Close",
+ "back": "Back",
+ "next": "Next",
+ "previous": "Previous",
+ "loading": "Loading...",
+ "error": "Error",
+ "success": "Success",
+ "warning": "Warning",
+ "yes": "Yes",
+ "no": "No",
+ "ok": "OK",
+ "skipToMain": "Skip to Main",
+ "teams": "Teams",
+ "addTeam": "Add team",
+ "upgradeToPro": "Upgrade to Pro",
+ "account": "Account",
+ "billing": "Billing",
+ "notifications": "Notifications",
+ "signOut": "Sign out",
+ "signOutTitle": "Sign out",
+ "signOutConfirm": "Are you sure you want to sign out? You will need to sign in again to access your account.",
+ "profile": "Profile",
+ "settings": "Settings",
+ "newTeam": "New Team",
+ "comingSoon": "Coming Soon!",
+ "comingSoonDesc": "This page has not been created yet.",
+ "comingSoonStayTuned": "Stay tuned though!",
+ "themeSettings": "Theme Settings",
+ "themeSettingsDesc": "Adjust the appearance and layout to suit your preferences.",
+ "resetTooltip": "Reset all settings to default values",
+ "themeSection": "Theme",
+ "themeDescription": "Choose between system preference, light mode, or dark mode",
+ "sidebarSection": "Sidebar",
+ "inset": "Inset",
+ "floating": "Floating",
+ "sidebarDescription": "Choose between inset, floating, or standard sidebar layout",
+ "layoutSection": "Layout",
+ "default": "Default",
+ "compact": "Compact",
+ "fullLayout": "Full layout",
+ "layoutDescription": "Choose between default expanded, compact icon-only, or full layout mode",
+ "directionSection": "Direction",
+ "ltr": "Left to Right",
+ "rtl": "Right to Left",
+ "directionDescription": "Choose between left-to-right or right-to-left site direction",
+ "selectOption": "Select {{option}}",
+ "optionPreview": "{{option}} option preview",
+ "page": "Page {{current}} of {{total}}",
+ "rowsPerPage": "Rows per page",
+ "selected": "{{count}} selected",
+ "clearFilters": "Clear filters",
+ "filterBy": "Filter by {{column}}",
+ "noResultsFound": "No results found.",
+ "toggleColumns": "Toggle columns",
+ "view": "View",
+ "contentNotModified": "Content not modified!",
+ "sessionExpired": "Session expired!",
+ "internalServerError": "Internal Server Error!"
+}
diff --git a/src/i18n/locales/en/dashboard.json b/src/i18n/locales/en/dashboard.json
new file mode 100644
index 0000000000..1a9e39dc96
--- /dev/null
+++ b/src/i18n/locales/en/dashboard.json
@@ -0,0 +1,52 @@
+{
+ "title": "Dashboard",
+ "download": "Download",
+ "overview": "Overview",
+ "analytics": "Analytics",
+ "reports": "Reports",
+ "notifications": "Notifications",
+ "totalRevenue": "Total Revenue",
+ "totalRevenueDesc": "+20.1% from last month",
+ "subscriptions": "Subscriptions",
+ "subscriptionsDesc": "+180.1% from last month",
+ "sales": "Sales",
+ "salesDesc": "+19% from last month",
+ "activeNow": "Active Now",
+ "activeNowDesc": "+201 since last hour",
+ "recentSales": "Recent Sales",
+ "recentSalesDesc": "You made 265 sales this month.",
+ "trafficOverview": "Traffic Overview",
+ "trafficOverviewDesc": "Weekly clicks and unique visitors",
+ "totalClicks": "Total Clicks",
+ "totalClicksDelta": "+12.4% vs last week",
+ "uniqueVisitors": "Unique Visitors",
+ "uniqueVisitorsDelta": "+5.8% vs last week",
+ "bounceRate": "Bounce Rate",
+ "bounceRateDelta": "-3.2% vs last week",
+ "avgSession": "Avg. Session",
+ "avgSessionDelta": "+18s vs last week",
+ "referrers": "Referrers",
+ "referrersDesc": "Top sources driving traffic",
+ "direct": "Direct",
+ "devices": "Devices",
+ "devicesDesc": "How users access your app",
+ "desktop": "Desktop",
+ "mobile": "Mobile",
+ "tablet": "Tablet",
+ "topNavOverview": "Overview",
+ "topNavCustomers": "Customers",
+ "topNavProducts": "Products",
+ "topNavSettings": "Settings",
+ "jan": "Jan",
+ "feb": "Feb",
+ "mar": "Mar",
+ "apr": "Apr",
+ "may": "May",
+ "jun": "Jun",
+ "jul": "Jul",
+ "aug": "Aug",
+ "sep": "Sep",
+ "oct": "Oct",
+ "nov": "Nov",
+ "dec": "Dec"
+}
diff --git a/src/i18n/locales/en/errors.json b/src/i18n/locales/en/errors.json
new file mode 100644
index 0000000000..ccb79fdaf4
--- /dev/null
+++ b/src/i18n/locales/en/errors.json
@@ -0,0 +1,20 @@
+{
+ "unauthorizedTitle": "Unauthorized Access",
+ "unauthorizedDesc1": "Please log in with the appropriate credentials",
+ "unauthorizedDesc2": "to access this resource.",
+ "forbiddenTitle": "Access Forbidden",
+ "forbiddenDesc1": "You don't have necessary permission",
+ "forbiddenDesc2": "to view this resource.",
+ "notFoundTitle": "Oops! Page Not Found!",
+ "notFoundDesc1": "It seems like the page you're looking for",
+ "notFoundDesc2": "does not exist or might have been removed.",
+ "serverErrorTitle": "Oops! Something went wrong",
+ "serverErrorDesc1": "We apologize for the inconvenience.",
+ "serverErrorDesc2": "Please try again later.",
+ "maintenanceTitle": "Website is under maintenance!",
+ "maintenanceDesc1": "The site is not available at the moment.",
+ "maintenanceDesc2": "We'll be back online shortly.",
+ "goBack": "Go Back",
+ "backToHome": "Back to Home",
+ "learnMore": "Learn more"
+}
diff --git a/src/i18n/locales/en/settings.json b/src/i18n/locales/en/settings.json
new file mode 100644
index 0000000000..6893ef0940
--- /dev/null
+++ b/src/i18n/locales/en/settings.json
@@ -0,0 +1,98 @@
+{
+ "title": "Settings",
+ "description": "Manage your account settings and set e-mail preferences.",
+ "profile": "Profile",
+ "account": "Account",
+ "appearance": "Appearance",
+ "notifications": "Notifications",
+ "display": "Display",
+ "profileTitle": "Profile",
+ "profileDesc": "Update your profile information.",
+ "username": "Username",
+ "usernameDesc": "This is your public display name.",
+ "usernamePlaceholder": "shadcn",
+ "usernameRequired": "Username is required.",
+ "usernameMinLength": "Username must be at least 2 characters.",
+ "usernameMaxLength": "Username must not be longer than 30 characters.",
+ "email": "Email",
+ "emailDesc": "Your email address for notifications.",
+ "emailRequired": "Please enter a valid email address.",
+ "emailSelectPlaceholder": "Select a verified email to display",
+ "emailSettingsDesc": "You can manage verified email addresses in your",
+ "emailSettingsLink": "email settings",
+ "bio": "Bio",
+ "bioPlaceholder": "Tell us a little bit about yourself",
+ "bioDesc": "You can @mention other users and organizations to link to them.",
+ "bioRequired": "Bio is required.",
+ "bioMinLength": "Bio must be at least 4 characters.",
+ "bioMaxLength": "Bio must not exceed 160 characters.",
+ "urls": "URLs",
+ "urlsDesc": "Add links to your website, blog, or social media profiles.",
+ "addUrl": "Add URL",
+ "urlInvalid": "Please enter a valid URL.",
+ "selectItem": "You have to select at least one item.",
+ "password": "Password",
+ "passwordDesc": "Change your password.",
+ "currentPassword": "Current password",
+ "currentPasswordRequired": "Current password is required.",
+ "newPassword": "New password",
+ "newPasswordRequired": "New password is required.",
+ "newPasswordMinLength": "Password must be at least 8 characters.",
+ "confirmPassword": "Confirm password",
+ "confirmPasswordRequired": "Please confirm your password.",
+ "passwordsDontMatch": "Passwords don't match.",
+ "updateProfile": "Update profile",
+ "accountTitle": "Account",
+ "accountDesc": "Update your account settings.",
+ "name": "Name",
+ "nameDesc": "This is the name that will be displayed on your profile.",
+ "nameRequired": "Name is required.",
+ "nameMinLength": "Name must be at least 2 characters.",
+ "nameMaxLength": "Name must not be longer than 30 characters.",
+ "namePlaceholder": "John Doe",
+ "dateOfBirth": "Date of birth",
+ "dobDesc": "Your date of birth is used to calculate your age.",
+ "dobPlaceholder": "Pick a date",
+ "dobRequired": "Date of birth is required.",
+ "language": "Language",
+ "languageDesc": "This is the language that will be used in the dashboard.",
+ "languagePlaceholder": "Select a language",
+ "languageRequired": "Please select a language.",
+ "updateAccount": "Update account",
+ "appearanceTitle": "Appearance",
+ "appearanceDesc": "Customize the appearance of the app.",
+ "font": "Font",
+ "fontDesc": "Set the font you want to use in the dashboard.",
+ "fontPlaceholder": "Select a font",
+ "fontRequired": "Please select a font.",
+ "themeLabel": "Theme",
+ "themeDesc": "Select the theme for the dashboard.",
+ "updatePreferences": "Update preferences",
+ "notificationsTitle": "Notifications",
+ "notificationsDesc": "Configure how you receive notifications.",
+ "notifyAbout": "Notify me about...",
+ "allNewMessages": "All new messages",
+ "directMessages": "Direct messages and mentions",
+ "nothing": "Nothing",
+ "emailNotifications": "Email Notifications",
+ "communicationEmails": "Communication emails",
+ "communicationEmailsDesc": "Receive emails about your account activity.",
+ "marketingEmails": "Marketing emails",
+ "marketingEmailsDesc": "Receive emails about new products, features, and more.",
+ "socialEmails": "Social emails",
+ "socialEmailsDesc": "Receive emails for friend requests, follows, and more.",
+ "mobilePushNotifications": "Mobile Push Notifications",
+ "mobilePushDesc": "Receive push notifications on mobile.",
+ "mobilePushLabel": "Everything",
+ "sameAsEmail": "Same as email",
+ "mobilePushNothing": "Nothing",
+ "updateNotifications": "Update notifications",
+ "displayTitle": "Display",
+ "displayDesc": "Turn items on or off to control what's displayed in the app.",
+ "sidebarLabel": "Sidebar",
+ "sidebarDesc": "Choose which items to show in the sidebar.",
+ "updateDisplay": "Update display",
+ "selectThemePlaceholder": "Select a theme",
+ "light": "Light",
+ "dark": "Dark"
+}
diff --git a/src/i18n/locales/en/sidebar.json b/src/i18n/locales/en/sidebar.json
new file mode 100644
index 0000000000..82129e9924
--- /dev/null
+++ b/src/i18n/locales/en/sidebar.json
@@ -0,0 +1,31 @@
+{
+ "general": "General",
+ "pages": "Pages",
+ "other": "Other",
+ "dashboard": "Dashboard",
+ "tasks": "Tasks",
+ "apps": "Apps",
+ "chats": "Chats",
+ "users": "Users",
+ "securedByClerk": "Secured by Clerk",
+ "signIn": "Sign In",
+ "signIn2Col": "Sign In (2 Col)",
+ "signUp": "Sign Up",
+ "forgotPassword": "Forgot Password",
+ "otp": "OTP",
+ "userManagement": "User Management",
+ "auth": "Auth",
+ "errors": "Errors",
+ "unauthorized": "Unauthorized",
+ "forbidden": "Forbidden",
+ "notFound": "Not Found",
+ "internalServerError": "Internal Server Error",
+ "maintenanceError": "Maintenance Error",
+ "settings": "Settings",
+ "profile": "Profile",
+ "account": "Account",
+ "appearance": "Appearance",
+ "notifications": "Notifications",
+ "display": "Display",
+ "helpCenter": "Help Center"
+}
diff --git a/src/i18n/locales/en/tasks.json b/src/i18n/locales/en/tasks.json
new file mode 100644
index 0000000000..a26961949e
--- /dev/null
+++ b/src/i18n/locales/en/tasks.json
@@ -0,0 +1,89 @@
+{
+ "title": "Tasks",
+ "description": "Here's a list of your tasks for this month!",
+ "addTask": "Add Task",
+ "create": "Create",
+ "editTask": "Edit Task",
+ "import": "Import",
+ "columns": "Columns",
+ "task": "Task",
+ "taskTitle": "Title",
+ "titleColumn": "Title",
+ "status": "Status",
+ "priority": "Priority",
+ "actions": "Actions",
+ "selectAll": "Select all",
+ "selectRow": "Select row",
+ "toggleColumns": "Toggle columns",
+ "view": "View",
+ "clearFilters": "Clear filters",
+ "noResults": "No results.",
+ "noResultsFound": "No results found.",
+ "filterByStatus": "Filter by status...",
+ "filterByPriority": "Filter by priority...",
+ "filterByTitleOrId": "Filter by title or ID...",
+ "openMenu": "Open menu",
+ "makeCopy": "Make a copy",
+ "favorite": "Favorite",
+ "labelsMenu": "Labels",
+ "deleteTasksTitle": "Are you absolutely sure?",
+ "deleteTasksDesc": "This will permanently delete {{count}} task(s).",
+ "deleteTaskTitle": "Delete task",
+ "deleteTaskDesc": "Are you sure you want to delete this task? This action cannot be undone.",
+ "importTitle": "Import Tasks",
+ "importDesc": "Import tasks quickly from a CSV file.",
+ "importFileLabel": "File",
+ "importPlaceholder": "Paste CSV data here...",
+ "importButton": "Import",
+ "importSuccessMsg": "You have imported the following file:",
+ "createTitle": "Create Task",
+ "createDesc": "Add a new task by providing necessary info. Click save when you're done.",
+ "editTitle": "Update Task",
+ "editDesc": "Update the task by providing necessary info. Click save when you're done.",
+ "titleLabel": "Title",
+ "titlePlaceholder": "Enter a title",
+ "statusLabel": "Status",
+ "statusPlaceholder": "Select a status",
+ "labelLabel": "Label",
+ "priorityLabel": "Priority",
+ "priorityPlaceholder": "Select a priority",
+ "selectDropdown": "Select dropdown",
+ "saveTask": "Save changes",
+ "updateTask": "Save changes",
+ "labelBacklog": "Backlog",
+ "labelTodo": "Todo",
+ "labelInProgress": "In Progress",
+ "labelDone": "Done",
+ "labelCanceled": "Canceled",
+ "labelLow": "Low",
+ "labelMedium": "Medium",
+ "labelHigh": "High",
+ "labelCritical": "Critical",
+ "labelBug": "Bug",
+ "labelFeature": "Feature",
+ "labelEnhancement": "Enhancement",
+ "labelDocumentation": "Documentation",
+ "titleRequired": "Title is required.",
+ "statusRequired": "Please select a status.",
+ "labelRequired": "Please select a label.",
+ "priorityRequired": "Please choose a priority.",
+ "fileRequired": "Please upload a file",
+ "fileFormatError": "Please upload csv format.",
+ "exportTasks": "Export tasks",
+ "updatingStatus": "Updating status...",
+ "statusUpdated": "Status updated to \"{{status}}\" for {{count}} task(s).",
+ "updatingPriority": "Updating priority...",
+ "priorityUpdated": "Priority updated to \"{{priority}}\" for {{count}} task(s).",
+ "exportingTasks": "Exporting tasks...",
+ "exportedTasks": "Exported {{count}} task(s) to CSV.",
+ "updateStatus": "Update status",
+ "updatePriority": "Update priority",
+ "deleteSelectedTasks": "Delete selected tasks",
+ "deleteConfirmPrompt": "Please type \"{{word}}\" to confirm.",
+ "typeToConfirm": "Type \"{{word}}\" to confirm.",
+ "confirmWarning": "Please be careful, this operation can not be rolled back.",
+ "deletingTasks": "Deleting tasks...",
+ "deletedTasks": "Deleted {{count}} task(s)",
+ "fileUploadSuccess": "You have imported the following file:",
+ "warning": "Warning!"
+}
diff --git a/src/i18n/locales/en/users.json b/src/i18n/locales/en/users.json
new file mode 100644
index 0000000000..a275948340
--- /dev/null
+++ b/src/i18n/locales/en/users.json
@@ -0,0 +1,94 @@
+{
+ "title": "Users",
+ "description": "Manage your users and their roles here.",
+ "userList": "User List",
+ "addUser": "Add User",
+ "editUser": "Edit User",
+ "deleteUser": "Delete User",
+ "inviteUserButton": "Invite User",
+ "username": "Username",
+ "name": "Name",
+ "email": "Email",
+ "phoneNumber": "Phone Number",
+ "status": "Status",
+ "role": "Role",
+ "actions": "Actions",
+ "selectAll": "Select all",
+ "selectRow": "Select row",
+ "toggleColumns": "Toggle columns",
+ "filterByStatus": "Filter by status...",
+ "filterByRole": "Filter by role...",
+ "filterUsers": "Filter users...",
+ "noResults": "No results.",
+ "noResultsFound": "No results found.",
+ "clearFilters": "Clear filters",
+ "inviteUser": "Invite User",
+ "inviteDesc": "Invite new user to join your team by sending them an email invitation. Assign a role to define their access level.",
+ "firstName": "First Name",
+ "firstNamePlaceholder": "John",
+ "firstNameRequired": "First Name is required.",
+ "lastName": "Last Name",
+ "lastNamePlaceholder": "Doe",
+ "lastNameRequired": "Last Name is required.",
+ "usernameRequired": "Username is required.",
+ "phoneNumberRequired": "Phone number is required.",
+ "emailLabel": "Email",
+ "emailPlaceholder": "eg: john.doe@gmail.com",
+ "emailRequired": "Email is required.",
+ "roleLabel": "Role",
+ "rolePlaceholder": "Select a role",
+ "roleRequired": "Role is required.",
+ "statusLabel": "Status",
+ "passwordLabel": "Password",
+ "passwordPlaceholder": "e.g., S3cur3P@ssw0rd",
+ "passwordRequired": "Password is required.",
+ "passwordMinLength": "Password must be at least 8 characters long.",
+ "passwordLowercase": "Password must contain at least one lowercase letter.",
+ "passwordNumber": "Password must contain at least one number.",
+ "passwordsDontMatch": "Passwords don't match.",
+ "confirmPasswordLabel": "Confirm Password",
+ "descriptionOptional": "Description (optional)",
+ "descriptionPlaceholder": "Add a personal note to your invitation (optional)",
+ "sendInvitation": "Invite",
+ "deleteUserTitle": "Delete User",
+ "deleteUserDesc": "Are you sure you want to delete {{username}}? This action will permanently remove the user with the role of {{role}} from the system. This cannot be undone.",
+ "deleteUsersTitle": "Delete {{count}} user(s)",
+ "deleteUsersDesc": "Are you sure you want to delete the selected users? This action cannot be undone.",
+ "editUserTitle": "Edit User",
+ "editUserDesc": "Update the user here. Click save when you're done.",
+ "addUserTitle": "Add New User",
+ "addUserDesc": "Create new user here. Click save when you're done.",
+ "saveChanges": "Save changes",
+ "saveUser": "Save User",
+ "updateUser": "Update User",
+ "warning": "Warning!",
+ "confirmWarning": "Please be careful, this operation can not be rolled back.",
+ "deleteConfirmPrompt": "Please type \"{{word}}\" to confirm.",
+ "typeToConfirm": "Type \"{{word}}\" to confirm.",
+ "enterUsernameConfirm": "Enter username to confirm deletion.",
+ "labelActive": "Active",
+ "labelInactive": "Inactive",
+ "labelInvited": "Invited",
+ "labelSuspended": "Suspended",
+ "labelSuperadmin": "Superadmin",
+ "labelAdmin": "Admin",
+ "labelManager": "Manager",
+ "labelCashier": "Cashier",
+ "labelUser": "User",
+ "openMenu": "Open menu",
+ "inviteSelectedUsers": "Invite selected users",
+ "activateSelectedUsers": "Activate selected users",
+ "deactivateSelectedUsers": "Deactivate selected users",
+ "deleteSelectedUsers": "Delete selected users",
+ "activatingUsers": "Activating users...",
+ "deactivatingUsers": "Deactivating users...",
+ "activatedUsers": "Activated {{count}} user(s)",
+ "deactivatedUsers": "Deactivated {{count}} user(s)",
+ "invitingUsers": "Inviting users...",
+ "invitedUsers": "Invited {{count}} user(s)",
+ "deletingUsers": "Deleting users...",
+ "deletedUsers": "Deleted {{count}} user(s)",
+ "errorActivating": "Error activating users",
+ "errorDeactivating": "Error deactivating users",
+ "errorInviting": "Error inviting users"
+}
diff --git a/src/i18n/locales/zh/apps.json b/src/i18n/locales/zh/apps.json
new file mode 100644
index 0000000000..04e32ead84
--- /dev/null
+++ b/src/i18n/locales/zh/apps.json
@@ -0,0 +1,12 @@
+{
+ "title": "应用集成",
+ "description": "这是您的应用集成列表!",
+ "connected": "已连接",
+ "notConnected": "未连接",
+ "connect": "连接",
+ "disconnect": "断开连接",
+ "allApps": "所有应用",
+ "filterApps": "筛选应用...",
+ "ascending": "升序",
+ "descending": "降序"
+}
diff --git a/src/i18n/locales/zh/auth.json b/src/i18n/locales/zh/auth.json
new file mode 100644
index 0000000000..5b7c73e12e
--- /dev/null
+++ b/src/i18n/locales/zh/auth.json
@@ -0,0 +1,49 @@
+{
+ "signInTitle": "登录",
+ "signInDesc1": "请在下方输入您的邮箱和密码",
+ "signInDesc2": "登录您的账户",
+ "signInAgreement": "点击登录即表示您同意我们的",
+ "termsOfService": "服务条款",
+ "and": "和",
+ "privacyPolicy": "隐私政策",
+ "emailRequired": "请输入您的邮箱",
+ "passwordRequired": "请输入您的密码",
+ "passwordMinLength": "密码长度至少为 7 个字符",
+ "signingIn": "正在登录...",
+ "welcomeBack": "欢迎回来,{{email}}!",
+ "emailLabel": "邮箱",
+ "emailPlaceholder": "name@example.com",
+ "passwordLabel": "密码",
+ "passwordPlaceholder": "********",
+ "forgotPasswordLink": "忘记密码?",
+ "signInButton": "登录",
+ "orContinueWith": "或通过以下方式继续",
+ "createAccountTitle": "创建账户",
+ "createAccountDesc": "输入您的邮箱和密码以创建账户。",
+ "alreadyHaveAccount": "已有账户?",
+ "signInLink": "登录",
+ "createAccountAgreement": "创建账户即表示您同意我们的",
+ "confirmPasswordLabel": "确认密码",
+ "confirmPasswordPlaceholder": "********",
+ "confirmPasswordRequired": "请确认您的密码",
+ "passwordsDontMatch": "两次输入的密码不一致。",
+ "createAccountButton": "创建账户",
+ "forgotPasswordTitle": "忘记密码",
+ "forgotPasswordDesc1": "请输入您的注册邮箱,",
+ "forgotPasswordDesc2": "我们将向您发送密码重置链接。",
+ "dontHaveAccount": "还没有账户?",
+ "signUpLink": "注册",
+ "sendingEmail": "正在发送邮件...",
+ "emailSent": "邮件已发送至 {{email}}",
+ "continueButton": "继续",
+ "otpTitle": "两步验证",
+ "otpDesc1": "请输入验证码。",
+ "otpDesc2": "我们已将验证码发送到您的邮箱。",
+ "havenReceived": "没有收到?",
+ "resendCode": "重新发送验证码。",
+ "otpRequired": "请输入 6 位验证码。",
+ "otpLabel": "一次性密码",
+ "verifyButton": "验证",
+ "signUpTitle": "注册",
+ "error": "错误"
+}
diff --git a/src/i18n/locales/zh/chats.json b/src/i18n/locales/zh/chats.json
new file mode 100644
index 0000000000..5520e70b7b
--- /dev/null
+++ b/src/i18n/locales/zh/chats.json
@@ -0,0 +1,17 @@
+{
+ "title": "收件箱",
+ "searchLabel": "搜索",
+ "searchPlaceholder": "搜索聊天...",
+ "youPrefix": "你:",
+ "messageBoxLabel": "聊天输入框",
+ "messagePlaceholder": "输入消息...",
+ "send": "发送",
+ "emptyTitle": "您的消息",
+ "emptyDesc": "发送消息开始聊天。",
+ "emptyButton": "发送消息",
+ "newMessage": "新消息",
+ "to": "发送给:",
+ "searchPeople": "搜索联系人...",
+ "noPeopleFound": "未找到联系人。",
+ "chatButton": "聊天"
+}
diff --git a/src/i18n/locales/zh/common.json b/src/i18n/locales/zh/common.json
new file mode 100644
index 0000000000..40c71e10a5
--- /dev/null
+++ b/src/i18n/locales/zh/common.json
@@ -0,0 +1,79 @@
+{
+ "toggleTheme": "切换主题",
+ "switchLanguage": "切换语言",
+ "light": "浅色",
+ "dark": "深色",
+ "system": "跟随系统",
+ "english": "English",
+ "chinese": "中文",
+ "search": "搜索",
+ "searchPlaceholder": "输入命令或搜索...",
+ "noResults": "未找到结果。",
+ "theme": "主题",
+ "cancel": "取消",
+ "continue": "继续",
+ "confirm": "确认",
+ "delete": "删除",
+ "save": "保存",
+ "reset": "重置",
+ "edit": "编辑",
+ "add": "添加",
+ "close": "关闭",
+ "back": "返回",
+ "next": "下一页",
+ "previous": "上一页",
+ "loading": "加载中...",
+ "error": "错误",
+ "success": "成功",
+ "warning": "警告",
+ "yes": "是",
+ "no": "否",
+ "ok": "确定",
+ "skipToMain": "跳转到主要内容",
+ "teams": "团队",
+ "addTeam": "添加团队",
+ "upgradeToPro": "升级到 Pro",
+ "account": "账户",
+ "billing": "账单",
+ "notifications": "通知",
+ "signOut": "退出登录",
+ "signOutTitle": "退出登录",
+ "signOutConfirm": "确定要退出登录吗?您需要重新登录才能访问您的账户。",
+ "profile": "个人资料",
+ "settings": "设置",
+ "newTeam": "新建团队",
+ "comingSoon": "即将推出!",
+ "comingSoonDesc": "此页面尚未创建。",
+ "comingSoonStayTuned": "敬请期待!",
+ "themeSettings": "主题设置",
+ "themeSettingsDesc": "调整外观和布局以符合您的偏好。",
+ "resetTooltip": "将所有设置重置为默认值",
+ "themeSection": "主题",
+ "themeDescription": "在跟随系统、浅色模式或深色模式之间选择",
+ "sidebarSection": "侧边栏",
+ "inset": "内嵌",
+ "floating": "浮动",
+ "sidebarDescription": "在内嵌、浮动或标准侧边栏布局之间选择",
+ "layoutSection": "布局",
+ "default": "默认",
+ "compact": "紧凑",
+ "fullLayout": "完整布局",
+ "layoutDescription": "在默认展开、紧凑图标或完整布局模式之间选择",
+ "directionSection": "方向",
+ "ltr": "从左到右",
+ "rtl": "从右到左",
+ "directionDescription": "在从左到右或从右到左方向之间选择",
+ "selectOption": "选择{{option}}",
+ "optionPreview": "{{option}}选项预览",
+ "page": "第 {{current}} / {{total}} 页",
+ "rowsPerPage": "每页行数",
+ "selected": "已选择 {{count}} 项",
+ "clearFilters": "清除筛选",
+ "filterBy": "按{{column}}筛选",
+ "noResultsFound": "未找到结果。",
+ "toggleColumns": "切换列",
+ "view": "视图",
+ "contentNotModified": "内容未修改!",
+ "sessionExpired": "会话已过期!",
+ "internalServerError": "服务器内部错误!"
+}
diff --git a/src/i18n/locales/zh/dashboard.json b/src/i18n/locales/zh/dashboard.json
new file mode 100644
index 0000000000..c6e2b32544
--- /dev/null
+++ b/src/i18n/locales/zh/dashboard.json
@@ -0,0 +1,52 @@
+{
+ "title": "仪表盘",
+ "download": "下载",
+ "overview": "概览",
+ "analytics": "分析",
+ "reports": "报告",
+ "notifications": "通知",
+ "totalRevenue": "总收入",
+ "totalRevenueDesc": "较上月增长 +20.1%",
+ "subscriptions": "订阅",
+ "subscriptionsDesc": "较上月增长 +180.1%",
+ "sales": "销售额",
+ "salesDesc": "较上月增长 +19%",
+ "activeNow": "当前活跃",
+ "activeNowDesc": "较上小时增加 +201",
+ "recentSales": "最近销售",
+ "recentSalesDesc": "本月您完成了 265 笔销售。",
+ "trafficOverview": "流量概览",
+ "trafficOverviewDesc": "每周点击量和独立访客",
+ "totalClicks": "总点击量",
+ "totalClicksDelta": "较上周 +12.4%",
+ "uniqueVisitors": "独立访客",
+ "uniqueVisitorsDelta": "较上周 +5.8%",
+ "bounceRate": "跳出率",
+ "bounceRateDelta": "较上周 -3.2%",
+ "avgSession": "平均会话",
+ "avgSessionDelta": "较上周 +18秒",
+ "referrers": "来源",
+ "referrersDesc": "主要流量来源",
+ "direct": "直接访问",
+ "devices": "设备",
+ "devicesDesc": "用户访问方式",
+ "desktop": "桌面端",
+ "mobile": "移动端",
+ "tablet": "平板端",
+ "topNavOverview": "概览",
+ "topNavCustomers": "客户",
+ "topNavProducts": "产品",
+ "topNavSettings": "设置",
+ "jan": "1月",
+ "feb": "2月",
+ "mar": "3月",
+ "apr": "4月",
+ "may": "5月",
+ "jun": "6月",
+ "jul": "7月",
+ "aug": "8月",
+ "sep": "9月",
+ "oct": "10月",
+ "nov": "11月",
+ "dec": "12月"
+}
diff --git a/src/i18n/locales/zh/errors.json b/src/i18n/locales/zh/errors.json
new file mode 100644
index 0000000000..560be27342
--- /dev/null
+++ b/src/i18n/locales/zh/errors.json
@@ -0,0 +1,20 @@
+{
+ "unauthorizedTitle": "未授权访问",
+ "unauthorizedDesc1": "请使用适当的凭据登录",
+ "unauthorizedDesc2": "以访问此资源。",
+ "forbiddenTitle": "访问被禁止",
+ "forbiddenDesc1": "您没有必要的权限",
+ "forbiddenDesc2": "来查看此资源。",
+ "notFoundTitle": "哎呀!页面未找到!",
+ "notFoundDesc1": "您查找的页面",
+ "notFoundDesc2": "不存在或可能已被删除。",
+ "serverErrorTitle": "哎呀!出错了",
+ "serverErrorDesc1": "对于给您带来的不便,我们深表歉意。",
+ "serverErrorDesc2": "请稍后再试。",
+ "maintenanceTitle": "网站正在维护中!",
+ "maintenanceDesc1": "网站暂时不可用。",
+ "maintenanceDesc2": "我们很快会恢复上线。",
+ "goBack": "返回",
+ "backToHome": "返回首页",
+ "learnMore": "了解更多"
+}
diff --git a/src/i18n/locales/zh/settings.json b/src/i18n/locales/zh/settings.json
new file mode 100644
index 0000000000..85ef58dd59
--- /dev/null
+++ b/src/i18n/locales/zh/settings.json
@@ -0,0 +1,98 @@
+{
+ "title": "设置",
+ "description": "管理您的账户设置和电子邮件偏好。",
+ "profile": "个人资料",
+ "account": "账户",
+ "appearance": "外观",
+ "notifications": "通知",
+ "display": "显示",
+ "profileTitle": "个人资料",
+ "profileDesc": "更新您的个人信息。",
+ "username": "用户名",
+ "usernameDesc": "这是您的公开显示名称。",
+ "usernamePlaceholder": "shadcn",
+ "usernameRequired": "用户名为必填项。",
+ "usernameMinLength": "用户名长度至少为 2 个字符。",
+ "usernameMaxLength": "用户名长度不能超过 30 个字符。",
+ "email": "邮箱",
+ "emailDesc": "用于接收通知的邮箱地址。",
+ "emailRequired": "请输入有效的邮箱地址。",
+ "emailSelectPlaceholder": "选择要显示的已验证邮箱",
+ "emailSettingsDesc": "您可以在以下位置管理已验证邮箱地址:",
+ "emailSettingsLink": "邮箱设置",
+ "bio": "简介",
+ "bioPlaceholder": "介绍一下您自己",
+ "bioDesc": "您可以 @提及 其他用户和组织来链接到它们。",
+ "bioRequired": "简介为必填项。",
+ "bioMinLength": "简介长度至少为 4 个字符。",
+ "bioMaxLength": "简介长度不能超过 160 个字符。",
+ "urls": "链接",
+ "urlsDesc": "添加您的网站、博客或社交媒体资料的链接。",
+ "addUrl": "添加链接",
+ "urlInvalid": "请输入有效的 URL。",
+ "selectItem": "您必须至少选择一项。",
+ "password": "密码",
+ "passwordDesc": "更改您的密码。",
+ "currentPassword": "当前密码",
+ "currentPasswordRequired": "当前密码为必填项。",
+ "newPassword": "新密码",
+ "newPasswordRequired": "新密码为必填项。",
+ "newPasswordMinLength": "密码长度至少为 8 个字符。",
+ "confirmPassword": "确认密码",
+ "confirmPasswordRequired": "请确认您的密码。",
+ "passwordsDontMatch": "两次输入的密码不一致。",
+ "updateProfile": "更新个人资料",
+ "accountTitle": "账户",
+ "accountDesc": "更新您的账户设置。",
+ "name": "姓名",
+ "nameDesc": "这是将显示在您个人资料上的名称。",
+ "nameRequired": "姓名为必填项。",
+ "nameMinLength": "姓名长度至少为 2 个字符。",
+ "nameMaxLength": "姓名长度不能超过 30 个字符。",
+ "namePlaceholder": "张三",
+ "dateOfBirth": "出生日期",
+ "dobDesc": "您的出生日期用于计算您的年龄。",
+ "dobPlaceholder": "选择日期",
+ "dobRequired": "出生日期为必填项。",
+ "language": "语言",
+ "languageDesc": "这是在仪表盘中使用的语言。",
+ "languagePlaceholder": "选择语言",
+ "languageRequired": "请选择语言。",
+ "updateAccount": "更新账户",
+ "appearanceTitle": "外观",
+ "appearanceDesc": "自定义应用的外观。",
+ "font": "字体",
+ "fontDesc": "设置您想在仪表盘中使用的字体。",
+ "fontPlaceholder": "选择字体",
+ "fontRequired": "请选择字体。",
+ "themeLabel": "主题",
+ "themeDesc": "选择仪表盘的主题。",
+ "updatePreferences": "更新偏好设置",
+ "notificationsTitle": "通知",
+ "notificationsDesc": "配置您接收通知的方式。",
+ "notifyAbout": "通知我关于...",
+ "allNewMessages": "所有新消息",
+ "directMessages": "私信和@提及",
+ "nothing": "不通知",
+ "emailNotifications": "邮件通知",
+ "communicationEmails": "通讯邮件",
+ "communicationEmailsDesc": "接收有关您账户活动的邮件。",
+ "marketingEmails": "营销邮件",
+ "marketingEmailsDesc": "接收有关新产品、功能等的邮件。",
+ "socialEmails": "社交邮件",
+ "socialEmailsDesc": "接收好友请求、关注等的邮件。",
+ "mobilePushNotifications": "移动推送通知",
+ "mobilePushDesc": "在移动端接收推送通知。",
+ "mobilePushLabel": "全部",
+ "sameAsEmail": "与邮件相同",
+ "mobilePushNothing": "不推送",
+ "updateNotifications": "更新通知设置",
+ "displayTitle": "显示",
+ "displayDesc": "打开或关闭项目以控制应用中显示的内容。",
+ "sidebarLabel": "侧边栏",
+ "sidebarDesc": "选择在侧边栏中显示哪些项目。",
+ "updateDisplay": "更新显示",
+ "selectThemePlaceholder": "选择主题",
+ "light": "浅色",
+ "dark": "深色"
+}
diff --git a/src/i18n/locales/zh/sidebar.json b/src/i18n/locales/zh/sidebar.json
new file mode 100644
index 0000000000..c94383f5a9
--- /dev/null
+++ b/src/i18n/locales/zh/sidebar.json
@@ -0,0 +1,31 @@
+{
+ "general": "常规",
+ "pages": "页面",
+ "other": "其他",
+ "dashboard": "仪表盘",
+ "tasks": "任务",
+ "apps": "应用",
+ "chats": "聊天",
+ "users": "用户",
+ "securedByClerk": "Clerk 安全认证",
+ "signIn": "登录",
+ "signIn2Col": "登录(双列)",
+ "signUp": "注册",
+ "forgotPassword": "忘记密码",
+ "otp": "验证码",
+ "userManagement": "用户管理",
+ "auth": "认证",
+ "errors": "错误",
+ "unauthorized": "未授权",
+ "forbidden": "禁止访问",
+ "notFound": "页面未找到",
+ "internalServerError": "服务器内部错误",
+ "maintenanceError": "维护错误",
+ "settings": "设置",
+ "profile": "个人资料",
+ "account": "账户",
+ "appearance": "外观",
+ "notifications": "通知",
+ "display": "显示",
+ "helpCenter": "帮助中心"
+}
diff --git a/src/i18n/locales/zh/tasks.json b/src/i18n/locales/zh/tasks.json
new file mode 100644
index 0000000000..6aee3f2873
--- /dev/null
+++ b/src/i18n/locales/zh/tasks.json
@@ -0,0 +1,89 @@
+{
+ "title": "任务",
+ "description": "这是您本月的任务列表!",
+ "addTask": "添加任务",
+ "create": "创建",
+ "editTask": "编辑任务",
+ "import": "导入",
+ "columns": "列",
+ "task": "任务",
+ "taskTitle": "标题",
+ "titleColumn": "标题",
+ "status": "状态",
+ "priority": "优先级",
+ "actions": "操作",
+ "selectAll": "全选",
+ "selectRow": "选择行",
+ "toggleColumns": "切换列",
+ "view": "视图",
+ "clearFilters": "清除筛选",
+ "noResults": "无结果。",
+ "noResultsFound": "未找到结果。",
+ "filterByStatus": "按状态筛选...",
+ "filterByPriority": "按优先级筛选...",
+ "filterByTitleOrId": "按标题或ID筛选...",
+ "openMenu": "打开菜单",
+ "makeCopy": "创建副本",
+ "favorite": "收藏",
+ "labelsMenu": "标签",
+ "deleteTasksTitle": "您确定要删除吗?",
+ "deleteTasksDesc": "这将永久删除 {{count}} 个任务。",
+ "deleteTaskTitle": "删除任务",
+ "deleteTaskDesc": "确定要删除此任务吗?此操作无法撤销。",
+ "importTitle": "导入任务",
+ "importDesc": "从 CSV 文件快速导入任务。",
+ "importFileLabel": "文件",
+ "importPlaceholder": "在此粘贴 CSV 数据...",
+ "importButton": "导入",
+ "importSuccessMsg": "您已导入以下文件:",
+ "createTitle": "创建任务",
+ "createDesc": "通过提供必要信息添加新任务。完成后点击保存。",
+ "editTitle": "更新任务",
+ "editDesc": "通过提供必要信息更新任务。完成后点击保存。",
+ "titleLabel": "标题",
+ "titlePlaceholder": "输入标题",
+ "statusLabel": "状态",
+ "statusPlaceholder": "选择状态",
+ "labelLabel": "标签",
+ "priorityLabel": "优先级",
+ "priorityPlaceholder": "选择优先级",
+ "selectDropdown": "选择下拉",
+ "saveTask": "保存更改",
+ "updateTask": "保存更改",
+ "labelBacklog": "待处理",
+ "labelTodo": "待办",
+ "labelInProgress": "进行中",
+ "labelDone": "已完成",
+ "labelCanceled": "已取消",
+ "labelLow": "低",
+ "labelMedium": "中",
+ "labelHigh": "高",
+ "labelCritical": "紧急",
+ "labelBug": "缺陷",
+ "labelFeature": "功能",
+ "labelEnhancement": "优化",
+ "labelDocumentation": "文档",
+ "titleRequired": "标题为必填项。",
+ "statusRequired": "请选择状态。",
+ "labelRequired": "请选择标签。",
+ "priorityRequired": "请选择优先级。",
+ "fileRequired": "请上传文件",
+ "fileFormatError": "请上传 CSV 格式。",
+ "exportTasks": "导出任务",
+ "updatingStatus": "正在更新状态...",
+ "statusUpdated": "已将 {{count}} 个任务的状态更新为\"{{status}}\"。",
+ "updatingPriority": "正在更新优先级...",
+ "priorityUpdated": "已将 {{count}} 个任务的优先级更新为\"{{priority}}\"。",
+ "exportingTasks": "正在导出任务...",
+ "exportedTasks": "已导出 {{count}} 个任务到 CSV。",
+ "updateStatus": "更新状态",
+ "updatePriority": "更新优先级",
+ "deleteSelectedTasks": "删除已选任务",
+ "deleteConfirmPrompt": "请输入\"{{word}}\"以确认。",
+ "typeToConfirm": "输入\"{{word}}\"以确认。",
+ "confirmWarning": "请注意,此操作无法回退。",
+ "deletingTasks": "正在删除任务...",
+ "deletedTasks": "已删除 {{count}} 个任务",
+ "fileUploadSuccess": "您已导入以下文件:",
+ "warning": "警告!"
+}
diff --git a/src/i18n/locales/zh/users.json b/src/i18n/locales/zh/users.json
new file mode 100644
index 0000000000..002428ce46
--- /dev/null
+++ b/src/i18n/locales/zh/users.json
@@ -0,0 +1,94 @@
+{
+ "title": "用户",
+ "description": "在此管理您的用户及其角色。",
+ "userList": "用户列表",
+ "addUser": "添加用户",
+ "editUser": "编辑用户",
+ "deleteUser": "删除用户",
+ "inviteUserButton": "邀请用户",
+ "username": "用户名",
+ "name": "姓名",
+ "email": "邮箱",
+ "phoneNumber": "电话号码",
+ "status": "状态",
+ "role": "角色",
+ "actions": "操作",
+ "selectAll": "全选",
+ "selectRow": "选择行",
+ "toggleColumns": "切换列",
+ "filterByStatus": "按状态筛选...",
+ "filterByRole": "按角色筛选...",
+ "filterUsers": "筛选用户...",
+ "noResults": "无结果。",
+ "noResultsFound": "未找到结果。",
+ "clearFilters": "清除筛选",
+ "inviteUser": "邀请用户",
+ "inviteDesc": "通过发送电子邮件邀请新用户加入您的团队。分配角色以定义其访问权限。",
+ "firstName": "名",
+ "firstNamePlaceholder": "John",
+ "firstNameRequired": "名为必填项。",
+ "lastName": "姓",
+ "lastNamePlaceholder": "Doe",
+ "lastNameRequired": "姓为必填项。",
+ "usernameRequired": "用户名为必填项。",
+ "phoneNumberRequired": "电话号码为必填项。",
+ "emailLabel": "邮箱",
+ "emailPlaceholder": "例如:john.doe@gmail.com",
+ "emailRequired": "邮箱为必填项。",
+ "roleLabel": "角色",
+ "rolePlaceholder": "选择角色",
+ "roleRequired": "角色为必填项。",
+ "statusLabel": "状态",
+ "passwordLabel": "密码",
+ "passwordPlaceholder": "例如:S3cur3P@ssw0rd",
+ "passwordRequired": "密码为必填项。",
+ "passwordMinLength": "密码长度必须至少为8个字符。",
+ "passwordLowercase": "密码必须包含至少一个小写字母。",
+ "passwordNumber": "密码必须包含至少一个数字。",
+ "passwordsDontMatch": "密码不匹配。",
+ "confirmPasswordLabel": "确认密码",
+ "descriptionOptional": "描述(可选)",
+ "descriptionPlaceholder": "为您的邀请添加个人备注(可选)",
+ "sendInvitation": "邀请",
+ "deleteUserTitle": "删除用户",
+ "deleteUserDesc": "确定要删除 {{username}} 吗?此操作将永久删除角色为 {{role}} 的用户。此操作无法撤销。",
+ "deleteUsersTitle": "删除 {{count}} 个用户",
+ "deleteUsersDesc": "确定要删除所选用户吗?此操作无法撤销。",
+ "editUserTitle": "编辑用户",
+ "editUserDesc": "在此更新用户。完成后点击保存。",
+ "addUserTitle": "添加新用户",
+ "addUserDesc": "在此创建新用户。完成后点击保存。",
+ "saveChanges": "保存更改",
+ "saveUser": "保存用户",
+ "updateUser": "更新用户",
+ "warning": "警告!",
+ "confirmWarning": "请注意,此操作无法回退。",
+ "deleteConfirmPrompt": "请输入\"{{word}}\"以确认。",
+ "typeToConfirm": "输入\"{{word}}\"以确认。",
+ "enterUsernameConfirm": "输入用户名以确认删除。",
+ "labelActive": "活跃",
+ "labelInactive": "未激活",
+ "labelInvited": "已邀请",
+ "labelSuspended": "已暂停",
+ "labelSuperadmin": "超级管理员",
+ "labelAdmin": "管理员",
+ "labelManager": "经理",
+ "labelCashier": "收银员",
+ "labelUser": "用户",
+ "openMenu": "打开菜单",
+ "inviteSelectedUsers": "邀请已选用户",
+ "activateSelectedUsers": "激活已选用户",
+ "deactivateSelectedUsers": "停用已选用户",
+ "deleteSelectedUsers": "删除已选用户",
+ "activatingUsers": "正在激活用户...",
+ "deactivatingUsers": "正在停用用户...",
+ "activatedUsers": "已激活 {{count}} 个用户",
+ "deactivatedUsers": "已停用 {{count}} 个用户",
+ "invitingUsers": "正在邀请用户...",
+ "invitedUsers": "已邀请 {{count}} 个用户",
+ "deletingUsers": "正在删除用户...",
+ "deletedUsers": "已删除 {{count}} 个用户",
+ "errorActivating": "激活用户时出错",
+ "errorDeactivating": "停用用户时出错",
+ "errorInviting": "邀请用户时出错"
+}
diff --git a/src/main.tsx b/src/main.tsx
index b2f4edc26d..b15720d93f 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -12,7 +12,10 @@ import { useAuthStore } from '@/stores/auth-store'
import { handleServerError } from '@/lib/handle-server-error'
import { DirectionProvider } from './context/direction-provider'
import { FontProvider } from './context/font-provider'
+import { LanguageProvider } from './context/language-provider'
import { ThemeProvider } from './context/theme-provider'
+// i18n
+import i18n from './i18n'
// Generated Routes
import { routeTree } from './routeTree.gen'
// Styles
@@ -42,7 +45,7 @@ const queryClient = new QueryClient({
if (error instanceof AxiosError) {
if (error.response?.status === 304) {
- toast.error('Content not modified!')
+ toast.error(i18n.t('common:contentNotModified'))
}
}
},
@@ -52,13 +55,13 @@ const queryClient = new QueryClient({
onError: (error) => {
if (error instanceof AxiosError) {
if (error.response?.status === 401) {
- toast.error('Session expired!')
+ toast.error(i18n.t('common:sessionExpired'))
useAuthStore.getState().auth.reset()
const redirect = `${router.history.location.href}`
router.navigate({ to: '/sign-in', search: { redirect } })
}
if (error.response?.status === 500) {
- toast.error('Internal Server Error!')
+ toast.error(i18n.t('common:internalServerError'))
router.navigate({ to: '/500' })
}
if (error.response?.status === 403) {
@@ -92,11 +95,13 @@ if (!rootElement.innerHTML) {
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/routes/_authenticated/errors/$error.tsx b/src/routes/_authenticated/errors/$error.tsx
index 1d2283cf0d..f59f60a6bd 100644
--- a/src/routes/_authenticated/errors/$error.tsx
+++ b/src/routes/_authenticated/errors/$error.tsx
@@ -3,6 +3,7 @@ import { ConfigDrawer } from '@/components/config-drawer'
import { Header } from '@/components/layout/header'
import { ProfileDropdown } from '@/components/profile-dropdown'
import { Search } from '@/components/search'
+import { LanguageSwitch } from '@/components/language-switch'
import { ThemeSwitch } from '@/components/theme-switch'
import { ForbiddenError } from '@/features/errors/forbidden'
import { GeneralError } from '@/features/errors/general-error'
@@ -32,6 +33,7 @@ function RouteComponent() {
diff --git a/src/routes/clerk/_authenticated/user-management.tsx b/src/routes/clerk/_authenticated/user-management.tsx
index 549c14252d..b0461ff561 100644
--- a/src/routes/clerk/_authenticated/user-management.tsx
+++ b/src/routes/clerk/_authenticated/user-management.tsx
@@ -13,6 +13,7 @@ import { Header } from '@/components/layout/header'
import { Main } from '@/components/layout/main'
import { LearnMore } from '@/components/learn-more'
import { Search } from '@/components/search'
+import { LanguageSwitch } from '@/components/language-switch'
import { ThemeSwitch } from '@/components/theme-switch'
import { UsersDialogs } from '@/features/users/components/users-dialogs'
import { UsersPrimaryButtons } from '@/features/users/components/users-primary-buttons'
@@ -51,6 +52,7 @@ function UserManagement() {
+
diff --git a/src/routes/clerk/route.tsx b/src/routes/clerk/route.tsx
index e262f8a6cc..5d05372a8b 100644
--- a/src/routes/clerk/route.tsx
+++ b/src/routes/clerk/route.tsx
@@ -7,6 +7,7 @@ import { SidebarTrigger } from '@/components/ui/sidebar'
import { ConfigDrawer } from '@/components/config-drawer'
import { AuthenticatedLayout } from '@/components/layout/authenticated-layout'
import { Main } from '@/components/layout/main'
+import { LanguageSwitch } from '@/components/language-switch'
import { ThemeSwitch } from '@/components/theme-switch'
export const Route = createFileRoute('/clerk')({
@@ -44,6 +45,7 @@ function MissingClerkPubKey() {
+