diff --git a/public/locales/de-DE/application.json b/public/locales/de-DE/application.json index e9b8bb5..fd5587c 100644 --- a/public/locales/de-DE/application.json +++ b/public/locales/de-DE/application.json @@ -51,7 +51,8 @@ "logout": "Abmelden", "signingOut": "Wird abgemeldet...", "loggedOut": "Sie wurden abgemeldet", - "clickToRefresh": "Klicken Sie, um das CAPTCHA zu aktualisieren" + "clickToRefresh": "Klicken Sie, um das CAPTCHA zu aktualisieren", + "switchLanguage": "Sprache wechseln" }, "navbar": { "notBefore": "Nicht vor", diff --git a/public/locales/en-US/application.json b/public/locales/en-US/application.json index 9742574..1cf0598 100644 --- a/public/locales/en-US/application.json +++ b/public/locales/en-US/application.json @@ -51,7 +51,8 @@ "logout": "Sign out", "signingOut": "Signing out...", "loggedOut": "You are signed out now.", - "clickToRefresh": "Click to refresh" + "clickToRefresh": "Click to refresh", + "switchLanguage": "Switch Language" }, "navbar": { "notBefore": "Not before", diff --git a/public/locales/es-ES/application.json b/public/locales/es-ES/application.json index 858fda1..e736412 100644 --- a/public/locales/es-ES/application.json +++ b/public/locales/es-ES/application.json @@ -51,7 +51,8 @@ "logout": "Cerrar sesión", "signingOut": "Cerrando sesión...", "loggedOut": "Has cerrado sesión", - "clickToRefresh": "Haz clic para actualizar el código de verificación" + "clickToRefresh": "Haz clic para actualizar el código de verificación", + "switchLanguage": "Cambiar idioma" }, "navbar": { "notBefore": "No antes de", diff --git a/public/locales/fr-FR/application.json b/public/locales/fr-FR/application.json index 540fb47..c50d7c0 100644 --- a/public/locales/fr-FR/application.json +++ b/public/locales/fr-FR/application.json @@ -51,7 +51,8 @@ "logout": "Se déconnecter", "signingOut": "Déconnexion en cours...", "loggedOut": "Vous êtes maintenant déconnecté.", - "clickToRefresh": "Cliquez pour actualiser" + "clickToRefresh": "Cliquez pour actualiser", + "switchLanguage": "Changer de langue" }, "navbar": { "notBefore": "Pas avant", diff --git a/public/locales/it-IT/application.json b/public/locales/it-IT/application.json index 63a29c0..303cc44 100644 --- a/public/locales/it-IT/application.json +++ b/public/locales/it-IT/application.json @@ -51,7 +51,8 @@ "logout": "Logout", "signingOut": "Logout in corso...", "loggedOut": "Sei stato disconnesso", - "clickToRefresh": "Clicca per aggiornare il CAPTCHA" + "clickToRefresh": "Clicca per aggiornare il CAPTCHA", + "switchLanguage": "Cambia lingua" }, "navbar": { "notBefore": "Non prima di", diff --git a/public/locales/ja-JP/application.json b/public/locales/ja-JP/application.json index 8bc58a7..f8cc802 100644 --- a/public/locales/ja-JP/application.json +++ b/public/locales/ja-JP/application.json @@ -51,7 +51,8 @@ "logout": "ログアウト", "signingOut": "ログアウト中...", "loggedOut": "ログアウトしました", - "clickToRefresh": "CAPTCHAを再読み込み" + "clickToRefresh": "CAPTCHAを再読み込み", + "switchLanguage": "言語を切り替え" }, "navbar": { "notBefore": "~より前", diff --git a/public/locales/ko-KR/application.json b/public/locales/ko-KR/application.json index 8ab5dfd..206b5c2 100644 --- a/public/locales/ko-KR/application.json +++ b/public/locales/ko-KR/application.json @@ -51,7 +51,8 @@ "logout": "로그아웃", "signingOut": "로그아웃 중...", "loggedOut": "로그아웃되었습니다", - "clickToRefresh": "클릭하여 보안문자 새로고침" + "clickToRefresh": "클릭하여 보안문자 새로고침", + "switchLanguage": "언어 전환" }, "navbar": { "notBefore": "이전 아님", diff --git a/public/locales/pt-BR/application.json b/public/locales/pt-BR/application.json index c251f19..9c8b863 100644 --- a/public/locales/pt-BR/application.json +++ b/public/locales/pt-BR/application.json @@ -51,7 +51,8 @@ "logout": "Sair", "signingOut": "Saindo...", "loggedOut": "Você saiu da conta", - "clickToRefresh": "Clique para atualizar o código" + "clickToRefresh": "Clique para atualizar o código", + "switchLanguage": "Mudar idioma" }, "navbar": { "notBefore": "Não antes de", diff --git a/public/locales/ru-RU/application.json b/public/locales/ru-RU/application.json index ee40f56..087f806 100644 --- a/public/locales/ru-RU/application.json +++ b/public/locales/ru-RU/application.json @@ -51,7 +51,8 @@ "logout": "Выйти", "signingOut": "Выход из системы...", "loggedOut": "Вы вышли из системы", - "clickToRefresh": "Нажмите для обновления капчи" + "clickToRefresh": "Нажмите для обновления капчи", + "switchLanguage": "Сменить язык" }, "navbar": { "notBefore": "Не раньше", diff --git a/public/locales/zh-CN/application.json b/public/locales/zh-CN/application.json index c9ab89a..6d54248 100644 --- a/public/locales/zh-CN/application.json +++ b/public/locales/zh-CN/application.json @@ -51,7 +51,8 @@ "logout": "退出登录", "signingOut": "正在退出登录...", "loggedOut": "您已退出登录", - "clickToRefresh": "点击刷新验证码" + "clickToRefresh": "点击刷新验证码", + "switchLanguage": "切换语言" }, "navbar": { "notBefore": "不早于", diff --git a/public/locales/zh-TW/application.json b/public/locales/zh-TW/application.json index 8312762..4397360 100644 --- a/public/locales/zh-TW/application.json +++ b/public/locales/zh-TW/application.json @@ -51,7 +51,8 @@ "logout": "退出登入", "signingOut": "正在退出登入...", "loggedOut": "您已退出登入", - "clickToRefresh": "點選重新整理驗證碼" + "clickToRefresh": "點選重新整理驗證碼", + "switchLanguage": "切換語言" }, "navbar": { "notBefore": "不早於", diff --git a/src/component/Common/LanguageSwitcher.tsx b/src/component/Common/LanguageSwitcher.tsx new file mode 100644 index 0000000..c3006f0 --- /dev/null +++ b/src/component/Common/LanguageSwitcher.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import i18next from "i18next"; +import { languages } from "../../i18n"; +import { useTranslation } from "react-i18next"; +import { IconButton, Menu, MenuItem, Tooltip } from "@mui/material"; +import TranslateIcon from "@mui/icons-material/Translate"; + +const LanguageSwitcher: React.FC = () => { + const { t } = useTranslation(); + const [anchorEl, setAnchorEl] = React.useState(null); + const open = Boolean(anchorEl); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + return ( + <> + + + + + + + {languages.map((lang) => ( + { + i18next.changeLanguage(lang.code); + handleClose(); + }} + sx={{ fontSize: 14 }} + > + {lang.displayName} + + ))} + + + ); +}; + +export default LanguageSwitcher; diff --git a/src/component/Frame/HeadlessFrame.tsx b/src/component/Frame/HeadlessFrame.tsx index 53e3e61..e7a09db 100644 --- a/src/component/Frame/HeadlessFrame.tsx +++ b/src/component/Frame/HeadlessFrame.tsx @@ -4,6 +4,7 @@ import { useAppDispatch, useAppSelector } from "../../redux/hooks.ts"; import AutoHeight from "../Common/AutoHeight.tsx"; import CircularProgress from "../Common/CircularProgress.tsx"; import Logo from "../Common/Logo.tsx"; +import LanguageSwitcher from "../Common/LanguageSwitcher.tsx"; import PoweredBy from "./PoweredBy.tsx"; const Loading = () => { @@ -54,13 +55,23 @@ const HeadlessFrame = () => { padding: (theme) => `${theme.spacing(2)} ${theme.spacing(3)} ${theme.spacing(3)}`, }} > - + > + + {/* 语言切换按钮 */} + +