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={}
>
-
+
-