From 180ec83a174e28426e400d354cfef8bc4ac75fbd Mon Sep 17 00:00:00 2001 From: ArsFy Date: Wed, 30 Oct 2024 11:22:03 +0800 Subject: [PATCH] login i18n & chart loading & fix forgot pass page (#236) Co-authored-by: hank --- beszel/site/bun.lockb | Bin 158133 -> 157685 bytes beszel/site/package.json | 1 - .../site/src/components/login/auth-form.tsx | 13 +- .../src/components/login/forgot-pass-form.tsx | 13 +- beszel/site/src/components/login/login.tsx | 9 +- beszel/site/src/components/router.tsx | 1 + beszel/site/src/components/routes/system.tsx | 28 +- beszel/site/src/components/spinner.tsx | 7 +- beszel/site/src/lib/i18n.ts | 27 +- beszel/site/src/locales/de/translation.json | 18 +- beszel/site/src/locales/en/translation.json | 367 +++++++++--------- beszel/site/src/locales/es/translation.json | 18 +- beszel/site/src/locales/fr/translation.json | 18 +- beszel/site/src/locales/ru/translation.json | 18 +- .../site/src/locales/zh-CN/translation.json | 18 +- .../site/src/locales/zh-HK/translation.json | 18 +- 16 files changed, 369 insertions(+), 205 deletions(-) diff --git a/beszel/site/bun.lockb b/beszel/site/bun.lockb index 8505c998df6df4c6ce2ef99828302e3ca738e795..6d9583e3d7b5a6e2f40609076c5af17036ee2169 100755 GIT binary patch delta 27175 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 const [isOauthLoading, setIsOauthLoading] = useState(false) const [errors, setErrors] = useState>({}) @@ -224,7 +227,7 @@ export function UserAuthForm({ ) : ( )} - {isFirstRun ? 'Create account' : 'Sign in'} + {isFirstRun ? t('auth.create_account') : t('auth.sign_in')} @@ -317,16 +320,16 @@ export function UserAuthForm({ OAuth 2 / OIDC support
-

Beszel supports OpenID Connect and many OAuth2 authentication providers.

+

{t('auth.openid_des')}

- Please view the{' '} + {t('please_view_the')}{' '} GitHub README {' '} - for instructions. + {t('for_instructions')}

@@ -338,7 +341,7 @@ export function UserAuthForm({ href="/forgot-password" className="text-sm mx-auto hover:text-brand underline underline-offset-4 opacity-70 hover:opacity-100 transition-opacity" > - Forgot password? + {t('auth.forgot_password')} )} diff --git a/beszel/site/src/components/login/forgot-pass-form.tsx b/beszel/site/src/components/login/forgot-pass-form.tsx index 111cdca..9e173d3 100644 --- a/beszel/site/src/components/login/forgot-pass-form.tsx +++ b/beszel/site/src/components/login/forgot-pass-form.tsx @@ -8,6 +8,7 @@ import { cn } from '@/lib/utils' import { pb } from '@/lib/stores' import { Dialog, DialogHeader } from '../ui/dialog' import { DialogContent, DialogTrigger, DialogTitle } from '../ui/dialog' +import { useTranslation } from 'react-i18next' const showLoginFaliedToast = () => { toast({ @@ -18,6 +19,7 @@ const showLoginFaliedToast = () => { } export default function ForgotPassword() { + const { t } = useTranslation() const [isLoading, setIsLoading] = useState(false) const [email, setEmail] = useState('') @@ -72,26 +74,25 @@ export default function ForgotPassword() { ) : ( )} - Reset password + {t('auth.reset_password')} - Command line instructions + {t('auth.command_line_instructions')}

- If you've lost the password to your admin account, you may reset it using the following - command. + {t('auth.command_1')}

- Then log into the backend and reset your user account password in the users table. + {t('auth.command_2')}

beszel admin update youremail@example.com newpassword diff --git a/beszel/site/src/components/login/login.tsx b/beszel/site/src/components/login/login.tsx index 0d05168..ee20c8a 100644 --- a/beszel/site/src/components/login/login.tsx +++ b/beszel/site/src/components/login/login.tsx @@ -6,8 +6,11 @@ import { useStore } from '@nanostores/react' import ForgotPassword from './forgot-pass-form' import { $router } from '../router' import { AuthMethodsList } from 'pocketbase' +import { useTranslation } from 'react-i18next' export default function () { + const { t } = useTranslation() + const page = useStore($router) const [isFirstRun, setFirstRun] = useState(false) const [authMethods, setAuthMethods] = useState() @@ -30,11 +33,11 @@ export default function () { const subtitle = useMemo(() => { if (isFirstRun) { - return 'Please create an admin account' + return t('auth.create') } else if (page?.path === '/forgot-password') { - return 'Enter email address to reset password' + return t('auth.reset') } else { - return 'Please sign in to your account' + return t('auth.login') } }, [isFirstRun, page]) diff --git a/beszel/site/src/components/router.tsx b/beszel/site/src/components/router.tsx index a77d7e9..486ba8b 100644 --- a/beszel/site/src/components/router.tsx +++ b/beszel/site/src/components/router.tsx @@ -5,6 +5,7 @@ export const $router = createRouter( home: '/', server: '/system/:name', settings: '/settings/:name?', + forgot_password: '/forgot-password', }, { links: false } ) diff --git a/beszel/site/src/components/routes/system.tsx b/beszel/site/src/components/routes/system.tsx index 56271d1..d5e03b8 100644 --- a/beszel/site/src/components/routes/system.tsx +++ b/beszel/site/src/components/routes/system.tsx @@ -112,6 +112,7 @@ export default function SystemDetail({ name }: { name: string }) { const netCardRef = useRef(null) const [containerFilterBar, setContainerFilterBar] = useState(null as null | JSX.Element) const [bottomSpacing, setBottomSpacing] = useState(0) + const [chartLoading, setChartLoading] = useState(false) const isLongerChart = chartTime !== '1h' useEffect(() => { @@ -178,10 +179,15 @@ export default function SystemDetail({ name }: { name: string }) { if (!system.id || !chartTime) { return } + // loading: true + setChartLoading(true) Promise.allSettled([ getStats('system_stats', system, chartTime), getStats('container_stats', system, chartTime), ]).then(([systemStats, containerStats]) => { + // loading: false + setChartLoading(false) + const { expectedInterval } = chartTimeData[chartTime] // make new system stats const ss_cache_key = `${system.id}_${chartTime}_system_stats` @@ -291,6 +297,9 @@ export default function SystemDetail({ name }: { name: string }) { return null } + // if no data, show empty state + const dataEmpty = !chartLoading && chartData.systemStats.length === 0; + return ( <>
@@ -375,6 +384,7 @@ export default function SystemDetail({ name }: { name: string }) { {/* main charts */}
)} - + : null} @@ -460,6 +475,7 @@ export default function SystemDetail({ name }: { name: string }) { })} > 0 && ( - + )} {systemStats.at(-1)?.stats.t && ( - + )} @@ -490,6 +506,7 @@ export default function SystemDetail({ name }: { name: string }) { return (
- {} + {} {isIntersecting && children}
diff --git a/beszel/site/src/components/spinner.tsx b/beszel/site/src/components/spinner.tsx index 9b396fe..b66da08 100644 --- a/beszel/site/src/components/spinner.tsx +++ b/beszel/site/src/components/spinner.tsx @@ -1,9 +1,12 @@ import { LoaderCircleIcon } from 'lucide-react' +import { useTranslation } from 'react-i18next' -export default function () { +export default function (props: { empty?: boolean }) { + const { t } = useTranslation() return ( -
+
+ {props.empty &&

{t('monitor.waiting_for')}

}
) } diff --git a/beszel/site/src/lib/i18n.ts b/beszel/site/src/lib/i18n.ts index ef4f6d4..9bf3029 100644 --- a/beszel/site/src/lib/i18n.ts +++ b/beszel/site/src/lib/i18n.ts @@ -1,6 +1,5 @@ import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; import en from '../locales/en/translation.json'; import es from '../locales/es/translation.json'; @@ -10,8 +9,32 @@ import ru from '../locales/ru/translation.json'; import zhHans from '../locales/zh-CN/translation.json'; import zhHant from '../locales/zh-HK/translation.json'; +// Custom language detector to use localStorage +const languageDetector: any = { + type: 'languageDetector', + async: true, + detect: (callback: (lng: string) => void) => { + const savedLanguage = localStorage.getItem('i18nextLng'); + const fallbackLanguage = (()=>{ + switch (navigator.language) { + case 'zh-CN': case 'zh-SG': case 'zh-MY': case 'zh': case 'zh-Hans': + return 'zh-CN'; + case 'zh-HK': case 'zh-TW': case 'zh-MO': case 'zh-Hant': + return 'zh-HK'; + default: + return navigator.language; + } + })(); + callback(savedLanguage || fallbackLanguage); + }, + init: () => {}, + cacheUserLanguage: (lng: string) => { + localStorage.setItem('i18nextLng', lng); + } +}; + i18n - .use(LanguageDetector) + .use(languageDetector) .use(initReactI18next) .init({ resources: { diff --git a/beszel/site/src/locales/de/translation.json b/beszel/site/src/locales/de/translation.json index 68a2876..da092a5 100644 --- a/beszel/site/src/locales/de/translation.json +++ b/beszel/site/src/locales/de/translation.json @@ -173,6 +173,22 @@ "temperature_des": "Temperaturen der System-Sensoren", "usage": "Nutzung", "disk_usage_of": "Festplattennutzung von", - "throughput_of": "Durchsatz von" + "throughput_of": "Durchsatz von", + "waiting_for": "Warten auf genügend Datensätze zur Anzeige" + }, + "auth": { + "login": "Bitte melden Sie sich bei Ihrem Konto an", + "reset": "E-Mail-Adresse eingeben, um das Passwort zurückzusetzen", + "create": "Bitte erstellen Sie ein Administratorkonto", + "create_account": "Konto erstellen", + "sign_in": "Anmelden", + "openid_des": "Beszel unterstützt OpenID Connect und viele OAuth2-Authentifizierungsanbieter.", + "please_view_the": "Bitte sehen Sie sich die", + "for_instructions": "für Anweisungen an.", + "forgot_password": "Passwort vergessen?", + "reset_password": "Passwort zurücksetzen", + "command_line_instructions": "Befehlszeilenanweisungen", + "command_1": "Wenn Sie das Passwort für Ihr Administratorkonto verloren haben, können Sie es mit dem folgenden Befehl zurücksetzen.", + "command_2": "Melden Sie sich dann im Backend an und setzen Sie das Passwort Ihres Benutzerkontos in der Benutzertabelle zurück." } } \ No newline at end of file diff --git a/beszel/site/src/locales/en/translation.json b/beszel/site/src/locales/en/translation.json index 5db9249..9a901a2 100644 --- a/beszel/site/src/locales/en/translation.json +++ b/beszel/site/src/locales/en/translation.json @@ -1,178 +1,193 @@ { - "all_systems": "All Systems", - "filter": "Filter...", - "copy": "Copy", - "add": "Add", - "system": "System", - "systems": "Systems", - "cancel": "Cancel", - "continue": "Continue", - "home": { - "active_alerts": "Active Alerts", - "active_des": "Exceeds {{value}}{{unit}} average in last {{minutes}} min", - "subtitle_1": "Updated in real time. Click on a system to view information.", - "subtitle_2": "to open the command palette." - }, - "systems_table": { - "system": "System", - "memory": "Memory", - "cpu": "CPU", - "disk": "Disk", - "net": "Net", - "agent": "Agent", - "no_systems_found": "No systems found.", - "open_menu": "Open menu", - "resume": "Resume", - "pause": "Pause", - "copy_host": "Copy host", - "delete": "Delete", - "delete_confirm": "Are you sure you want to delete {{name}}?", - "delete_confirm_des_1": "This action cannot be undone. This will permanently delete all current records for", - "delete_confirm_des_2": "from the database." - }, - "alerts": { - "title": "Alerts", - "subtitle_1": "See", - "notification_settings": "notification settings", - "subtitle_2": "to configure how you receive alerts.", - "overwrite_existing_alerts": "Overwrite existing alerts", - "info": { - "status": "Status", - "status_des": "Triggers when status switches between up and down.", - "cpu_usage": "CPU Usage", - "cpu_usage_des": "Triggers when CPU usage exceeds a threshold.", - "memory_usage": "Memory Usage", - "memory_usage_des": "Triggers when memory usage exceeds a threshold.", - "disk_usage": "Disk Usage", - "disk_usage_des": "Triggers when usage of any disk exceeds a threshold.", - "bandwidth": "Bandwidth", - "bandwidth_des": "Triggers when combined up/down exceeds a threshold.", - "temperature": "Temperature", - "temperature_des": "Triggers when any sensor exceeds a threshold." - }, - "average_exceeds": "Average exceeds", - "for": "For", - "minute": "minute", - "minutes": "minutes" - }, - "settings": { - "settings": "Settings", - "subtitle": "Manage display and notification preferences.", - "save_settings": "Save Settings", - "export_configuration": "Export configuration", - "general": { - "title": "General", - "subtitle": "Change general application options.", - "language": { - "title": "Language", - "subtitle_1": "Want to help us make our translations even better? Check out", - "subtitle_2": "for more details.", - "preferred_language": "Preferred Language" - }, - "chart_options": { - "title": "Chart options", - "subtitle": "Adjust display options for charts.", - "default_time_period": "Default time period", - "default_time_period_des": "Sets the default time range for charts when a system is viewed." - } - }, - "notifications": { - "title": "Notifications", - "subtitle_1": "Configure how you receive alert notifications.", - "subtitle_2": "Looking instead for where to create alerts? Click the bell", - "subtitle_3": "icons in the systems table.", - "email": { - "title": "Email notifications", - "please": "Please", - "configure_an_SMTP_server": "configure an SMTP server", - "to_ensure_alerts_are_delivered": "to ensure alerts are delivered.", - "to_email_s": "To email(s)", - "enter_email_address": "Enter email address...", - "des": "Save address using enter key or comma. Leave blank to disable email notifications." - }, - "webhook_push": { - "title": "Webhook / Push notifications", - "des_1": "Beszel uses", - "des_2": "to integrate with popular notification services.", - "add_url": "Add URL" - } - }, - "yaml_config": { - "short_title": "YAML Config", - "title": "YAML Configuration", - "subtitle": "Export your current systems configuration.", - "des_1": "Systems may be managed in a", - "des_2": "file inside your data directory.", - "des_3": "On each restart, systems in the database will be updated to match the systems defined in the file.", - "alert": { - "title": "Caution - potential data loss", - "des_1": "Existing systems not defined in", - "des_2": "will be deleted. Please make regular backups." - } - }, - "language": "Language" - }, - "user_dm": { - "users": "Users", - "logs": "Logs", - "backups": "Backups", - "auth_providers": "Auth Providers", - "log_out": "Log Out" - }, - "themes": { - "toggle_theme": "Toggle theme", - "light": "Light", - "dark": "Dark", - "system": "System" - }, - "add_system": { - "add_new_system": "Add New System", - "binary": "Binary", - "dialog_des_1": "The agent must be running on the system to connect. Copy the", - "dialog_des_2": "for the agent below.", - "name": "Name", - "host_ip": "Host / IP", - "port": "Port", - "public_key": "Public Key", - "click_to_copy": "Click to copy", - "command": "command", - "add_system": "Add system" - }, - "command": { - "search": "Search for systems or settings...", - "pages_settings": "Pages / Settings", - "dashboard": "Dashboard", - "documentation": "Documentation", - "SMTP_settings": "SMTP settings", - "page": "Page", - "admin": "Admin" - }, - "monitor": { - "toggle_grid": "Toggle grid", - "average": "Average", - "max_1_min": "Max 1 min ", - "total_cpu_usage": "Total CPU Usage", - "cpu_des": "system-wide CPU utilization", - "docker_cpu_usage": "Docker CPU Usage", - "docker_cpu_des": "Average CPU utilization of containers", - "total_memory_usage": "Total Memory Usage", - "memory_des": "Precise utilization at the recorded time", - "docker_memory_usage": "Docker Memory Usage", - "docker_memory_des": "Memory usage of docker containers", - "disk_space": "Disk Space", - "disk_des": "Usage of root partition", - "disk_io": "Disk I/O", - "disk_io_des": "Throughput of root filesystem", - "bandwidth": "Bandwidth", - "bandwidth_des": "Network traffic of public interfaces", - "docker_network_io": "Docker Network I/O", - "docker_network_io_des": "Network traffic of docker containers", - "swap_usage": "Swap Usage", - "swap_des": "Swap space used by the system", - "temperature": "Temperature", - "temperature_des": "Temperatures of system sensors", - "usage": "Usage", - "disk_usage_of": "Disk usage of", - "throughput_of": "Throughput of" - } + "all_systems": "All Systems", + "filter": "Filter...", + "copy": "Copy", + "add": "Add", + "system": "System", + "systems": "Systems", + "cancel": "Cancel", + "continue": "Continue", + "home": { + "active_alerts": "Active Alerts", + "active_des": "Exceeds {{value}}{{unit}} average in last {{minutes}} minutes", + "subtitle_1": "Updated in real time. Click on a system to view information.", + }, + "systems_table": { + "system": "System", + "memory": "Memory", + "cpu": "CPU", + "disk": "Disk", + "net": "Net", + "agent": "Agent", + "no_systems_found": "No systems found.", + "open_menu": "Open menu", + "resume": "Resume", + "pause": "Pause", + "copy_host": "Copy host", + "delete": "Delete", + "delete_confirm": "Are you sure you want to delete {{name}}?", + "delete_confirm_des_1": "This action cannot be undone. This will permanently delete all current records for", + "delete_confirm_des_2": "from the database." + }, + "alerts": { + "title": "Alerts", + "subtitle_1": "See", + "notification_settings": "notification settings", + "subtitle_2": "to configure how you receive alerts.", + "overwrite_existing_alerts": "Overwrite existing alerts", + "info": { + "status": "Status", + "status_des": "Triggers when status switches between up and down.", + "cpu_usage": "CPU Usage", + "cpu_usage_des": "Triggers when CPU usage exceeds a threshold.", + "memory_usage": "Memory Usage", + "memory_usage_des": "Triggers when memory usage exceeds a threshold.", + "disk_usage": "Disk Usage", + "disk_usage_des": "Triggers when usage of any disk exceeds a threshold.", + "bandwidth": "Bandwidth", + "bandwidth_des": "Triggers when combined up/down exceeds a threshold.", + "temperature": "Temperature", + "temperature_des": "Triggers when any sensor exceeds a threshold." + }, + "average_exceeds": "Average exceeds", + "for": "For", + "minute": "minute", + "minutes": "minutes" + }, + "settings": { + "settings": "Settings", + "subtitle": "Manage display and notification preferences.", + "save_settings": "Save Settings", + "export_configuration": "Export configuration", + "general": { + "title": "General", + "subtitle": "Change general application options.", + "language": { + "title": "Language", + "subtitle_1": "Want to help us make our translations even better? Check out", + "subtitle_2": "for more details.", + "preferred_language": "Preferred Language" + }, + "chart_options": { + "title": "Chart options", + "subtitle": "Adjust display options for charts.", + "default_time_period": "Default time period", + "default_time_period_des": "Sets the default time range for charts when a system is viewed." + } + }, + "notifications": { + "title": "Notifications", + "subtitle_1": "Configure how you receive alert notifications.", + "subtitle_2": "Looking instead for where to create alerts? Click the bell", + "subtitle_3": "icons in the systems table.", + "email": { + "title": "Email notifications", + "please": "Please", + "configure_an_SMTP_server": "configure an SMTP server", + "to_ensure_alerts_are_delivered": "to ensure alerts are delivered.", + "to_email_s": "To email(s)", + "enter_email_address": "Enter email address...", + "des": "Save address using enter key or comma. Leave blank to disable email notifications." + }, + "webhook_push": { + "title": "Webhook / Push notifications", + "des_1": "Beszel uses", + "des_2": "to integrate with popular notification services.", + "add_url": "Add URL" + } + }, + "yaml_config": { + "short_title": "YAML Config", + "title": "YAML Configuration", + "subtitle": "Export your current systems configuration.", + "des_1": "Systems may be managed in a", + "des_2": "file inside your data directory.", + "des_3": "On each restart, systems in the database will be updated to match the systems defined in the file.", + "alert": { + "title": "Caution - potential data loss", + "des_1": "Existing systems not defined in", + "des_2": "will be deleted. Please make regular backups." + } + }, + "language": "Language" + }, + "user_dm": { + "users": "Users", + "logs": "Logs", + "backups": "Backups", + "auth_providers": "Auth Providers", + "log_out": "Log Out" + }, + "themes": { + "toggle_theme": "Toggle theme", + "light": "Light", + "dark": "Dark", + "system": "System" + }, + "add_system": { + "add_new_system": "Add New System", + "binary": "Binary", + "dialog_des_1": "The agent must be running on the system to connect. Copy the", + "dialog_des_2": "for the agent below.", + "name": "Name", + "host_ip": "Host / IP", + "port": "Port", + "public_key": "Public Key", + "click_to_copy": "Click to copy", + "command": "command", + "add_system": "Add system" + }, + "command": { + "search": "Search for systems or settings...", + "pages_settings": "Pages / Settings", + "dashboard": "Dashboard", + "documentation": "Documentation", + "SMTP_settings": "SMTP settings", + "page": "Page", + "admin": "Admin" + }, + "monitor": { + "toggle_grid": "Toggle grid", + "average": "Average", + "max_1_min": "Max 1 min ", + "total_cpu_usage": "Total CPU Usage", + "cpu_des": "system-wide CPU utilization", + "docker_cpu_usage": "Docker CPU Usage", + "docker_cpu_des": "Average CPU utilization of containers", + "total_memory_usage": "Total Memory Usage", + "memory_des": "Precise utilization at the recorded time", + "docker_memory_usage": "Docker Memory Usage", + "docker_memory_des": "Memory usage of docker containers", + "disk_space": "Disk Space", + "disk_des": "Usage of root partition", + "disk_io": "Disk I/O", + "disk_io_des": "Throughput of root filesystem", + "bandwidth": "Bandwidth", + "bandwidth_des": "Network traffic of public interfaces", + "docker_network_io": "Docker Network I/O", + "docker_network_io_des": "Network traffic of docker containers", + "swap_usage": "Swap Usage", + "swap_des": "Swap space used by the system", + "temperature": "Temperature", + "temperature_des": "Temperatures of system sensors", + "usage": "Usage", + "disk_usage_of": "Disk usage of", + "throughput_of": "Throughput of", + "waiting_for": "Waiting for enough records to display" + }, + "auth": { + "login": "Please sign in to your account", + "reset": "Enter email address to reset password", + "create": "Please create an admin account", + "create_account": "Create account", + "sign_in": "Sign in", + "openid_des": "Beszel supports OpenID Connect and many OAuth2 authentication providers.", + "please_view_the": "Please view the", + "for_instructions": "for instructions.", + "forgot_password": "Forgot password?", + "reset_password": "Reset Password", + "command_line_instructions": "Command line instructions", + "command_1": "If you've lost the password to your admin account, you may reset it using the following command.", + "command_2": "Then log into the backend and reset your user account password in the users table." + } } diff --git a/beszel/site/src/locales/es/translation.json b/beszel/site/src/locales/es/translation.json index 5ba9b64..37c9da7 100644 --- a/beszel/site/src/locales/es/translation.json +++ b/beszel/site/src/locales/es/translation.json @@ -173,6 +173,22 @@ "temperature_des": "Temperaturas de los sensores del sistema", "usage": "Uso", "disk_usage_of": "Uso de disco de", - "throughput_of": "Rendimiento de" + "throughput_of": "Rendimiento de", + "waiting_for": "Esperando suficientes registros para mostrar" + }, + "auth": { + "login": "Por favor, inicie sesión en su cuenta", + "reset": "Ingrese la dirección de correo electrónico para restablecer la contraseña", + "create": "Por favor, cree una cuenta de administrador", + "create_account": "Crear cuenta", + "sign_in": "Iniciar sesión", + "openid_des": "Beszel admite OpenID Connect y muchos proveedores de autenticación OAuth2.", + "please_view_the": "Por favor, consulte el", + "for_instructions": "para obtener instrucciones.", + "forgot_password": "¿Olvidó su contraseña?", + "reset_password": "Restablecer contraseña", + "command_line_instructions": "Instrucciones de línea de comandos", + "command_1": "Si ha perdido la contraseña de su cuenta de administrador, puede restablecerla usando el siguiente comando.", + "command_2": "Luego inicie sesión en el backend y restablezca la contraseña de su cuenta de usuario en la tabla de usuarios." } } \ No newline at end of file diff --git a/beszel/site/src/locales/fr/translation.json b/beszel/site/src/locales/fr/translation.json index 2116ba4..ee73ea8 100644 --- a/beszel/site/src/locales/fr/translation.json +++ b/beszel/site/src/locales/fr/translation.json @@ -173,6 +173,22 @@ "temperature_des": "Températures des capteurs du système", "usage": "Utilisation", "disk_usage_of": "Utilisation du disque de", - "throughput_of": "Débit de" + "throughput_of": "Débit de", + "waiting_for": "En attente de suffisamment d'enregistrements pour afficher" + }, + "auth": { + "login": "Veuillez vous connecter à votre compte", + "reset": "Entrez l'adresse e-mail pour réinitialiser le mot de passe", + "create": "Veuillez créer un compte administrateur", + "create_account": "Créer un compte", + "sign_in": "Se connecter", + "openid_des": "Beszel prend en charge OpenID Connect et de nombreux fournisseurs d'authentification OAuth2.", + "please_view_the": "Veuillez consulter le", + "for_instructions": "pour les instructions.", + "forgot_password": "Mot de passe oublié ?", + "reset_password": "Réinitialiser le mot de passe", + "command_line_instructions": "Instructions en ligne de commande", + "command_1": "Si vous avez perdu le mot de passe de votre compte administrateur, vous pouvez le réinitialiser en utilisant la commande suivante.", + "command_2": "Ensuite, connectez-vous au backend et réinitialisez le mot de passe de votre compte utilisateur dans la table des utilisateurs." } } \ No newline at end of file diff --git a/beszel/site/src/locales/ru/translation.json b/beszel/site/src/locales/ru/translation.json index 281b1f4..7b889dc 100644 --- a/beszel/site/src/locales/ru/translation.json +++ b/beszel/site/src/locales/ru/translation.json @@ -173,6 +173,22 @@ "temperature_des": "Температуры датчиков системы", "usage": "Использование", "disk_usage_of": "Использование диска", - "throughput_of": "Пропускная способность" + "throughput_of": "Пропускная способность", + "waiting_for": "Ожидание достаточного количества записей для отображения" + }, + "auth": { + "login": "Пожалуйста, войдите в свою учетную запись", + "reset": "Введите адрес электронной почты для сброса пароля", + "create": "Пожалуйста, создайте учетную запись администратора", + "create_account": "Создать учетную запись", + "sign_in": "Войти", + "openid_des": "Beszel поддерживает OpenID Connect и многих поставщиков аутентификации OAuth2.", + "please_view_the": "Пожалуйста, ознакомьтесь с", + "for_instructions": "для получения инструкций.", + "forgot_password": "Забыли пароль?", + "reset_password": "Сбросить пароль", + "command_line_instructions": "Инструкции по командной строке", + "command_1": "Если вы потеряли пароль от своей учетной записи администратора, вы можете сбросить его, используя следующую команду.", + "command_2": "Затем войдите в бэкэнд и сбросьте пароль своей учетной записи пользователя в таблице пользователей." } } \ No newline at end of file diff --git a/beszel/site/src/locales/zh-CN/translation.json b/beszel/site/src/locales/zh-CN/translation.json index 673f30c..cea4a99 100644 --- a/beszel/site/src/locales/zh-CN/translation.json +++ b/beszel/site/src/locales/zh-CN/translation.json @@ -173,6 +173,22 @@ "temperature_des": "系统传感器的温度", "usage": "使用率", "disk_usage_of": "的磁盘使用率", - "throughput_of": "的吞吐量" + "throughput_of": "的吞吐量", + "waiting_for": "等待足够的记录以显示" + }, + "auth": { + "login": "请登入你的账户", + "reset": "输入邮箱来重设密码", + "create": "请创建管理员账户", + "create_account": "创建账户", + "sign_in": "登入", + "openid_des": "Beszel 支持 OpenID Connect 和许多 OAuth2 认证提供商。", + "please_view_the": "请检视", + "for_instructions": "以获取更多信息。", + "forgot_password": "忘记密码?", + "reset_password": "重设密码", + "command_line_instructions": "了解命令行指令", + "command_1": "如果您忘记了管理员账户的密码,可以使用以下命令重置。", + "command_2": "然后登录到后台,在用户表中重置您的用户账户密码。" } } \ No newline at end of file diff --git a/beszel/site/src/locales/zh-HK/translation.json b/beszel/site/src/locales/zh-HK/translation.json index b52984e..35e79ba 100644 --- a/beszel/site/src/locales/zh-HK/translation.json +++ b/beszel/site/src/locales/zh-HK/translation.json @@ -173,6 +173,22 @@ "temperature_des": "系統感應器的溫度", "usage": "使用率", "disk_usage_of": "的磁碟使用率", - "throughput_of": "的吞吐量" + "throughput_of": "的吞吐量", + "waiting_for": "等待足夠的記錄以顯示" + }, + "auth": { + "login": "請登入你的賬戶", + "reset": "輸入電郵來重設密碼", + "create": "請創建管理員賬戶", + "create_account": "創建賬戶", + "sign_in": "登入", + "openid_des": "Beszel 支持 OpenID Connect 和許多 OAuth2 認證提供商。", + "please_view_the": "請檢視", + "for_instructions": "以獲取更多信息。", + "forgot_password": "忘記密碼?", + "reset_password": "重設密碼", + "command_line_instructions": "了解命令行指令", + "command_1": "如果您忘記了管理員賬戶的密碼,可以使用以下命令重置。", + "command_2": "然後登入到後台,在用戶表中重置您的用戶賬戶密碼。" } } \ No newline at end of file