diff --git a/bun.lockb b/bun.lockb index 1eb9c18..b1afe10 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 34de339..d0a5356 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,13 @@ "dependencies": { "basic-styled": "^0.0.8", "firebase": "^10.14.0", + "i18next": "^23.16.6", + "i18next-browser-languagedetector": "^8.0.0", + "i18next-http-backend": "^2.6.2", "react": "^18.3.1", "react-dom": "^18.3.1", "react-helmet-async": "^2.0.5", + "react-i18next": "^15.1.1", "react-router-dom": "^6.26.2", "zustand": "^5.0.0-rc.2" }, diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json new file mode 100644 index 0000000..a57f87f --- /dev/null +++ b/public/locales/en/translation.json @@ -0,0 +1,4 @@ +{ + "title": "Plandy | Reminders & Calendar", + "intro_text": "Simple and easy task Manager" +} diff --git a/public/locales/ja/translation.json b/public/locales/ja/translation.json new file mode 100644 index 0000000..602db17 --- /dev/null +++ b/public/locales/ja/translation.json @@ -0,0 +1,4 @@ +{ + "title": "Plandy: \u30EA\u30DE\u30A4\u30F3\u30C0\u30FC\u0020\uFF06\u0020\u30AB\u30EC\u30F3\u30C0\u30FC", + "intro_text": "\u30B7\u30F3\u30D7\u30EB\u3067\u7C21\u5358\u306A\u30BF\u30B9\u30AF\u7BA1\u7406" +} diff --git a/public/locales/ko/translation.json b/public/locales/ko/translation.json new file mode 100644 index 0000000..b3dfcd2 --- /dev/null +++ b/public/locales/ko/translation.json @@ -0,0 +1,4 @@ +{ + "title": "Plandy | \uB9AC\uB9C8\uC778\uB354\u0020\u0026\u0020\uB2EC\uB825", + "intro_text": "\uBE60\uB974\uACE0\u0020\uAC04\uD3B8\uD55C\u0020\uC77C\uC815\uACFC\u0020\uD560\uC77C\u0020\uAD00\uB9AC" +} diff --git a/src/components/molecules/Header/Header.tsx b/src/components/molecules/Header/Header.tsx index 3d8929d..3e9b5fa 100644 --- a/src/components/molecules/Header/Header.tsx +++ b/src/components/molecules/Header/Header.tsx @@ -9,6 +9,8 @@ import Select, { Option } from "@components/atoms/Select"; import useThemeStore from "@stores/theme"; import { GoogleAnalytics } from "@utils/google-analytics"; +import i18n from "@utils/i18n"; + import { Adornment, HeaderInner, Logo, StyledHeader } from "./Header.styles"; function Header() { @@ -16,7 +18,7 @@ function Header() { const updateTrigger = useThemeStore((state) => state.updateTrigger); const updateMode = useThemeStore((state) => state.updateMode); - const [language, setLanguage] = useState("english"); + const [language, setLanguage] = useState(i18n.language); const handleClick = () => { updateTrigger("manual"); @@ -24,7 +26,10 @@ function Header() { handleLogEvent("theme"); }; - const handleChange = (newValue?: string) => setLanguage(newValue || "english"); + const handleChangeLang = (newLang?: string) => { + i18n.changeLanguage(newLang); + setLanguage(newLang || "en"); + }; const handleLogEvent = (label: string) => { GoogleAnalytics.logEvent("click_top_nav", { @@ -58,15 +63,18 @@ function Header() { data-testid="language-button" aria-label={language} size="small" - onChange={handleChange} + onChange={handleChangeLang} value={language} endIcon={} > - + -