โพ i18n ์์ํ๊ธฐ
์น์ฌ์ดํธ ํน์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ์ธ์ด๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
์๋์ ๊ณต์ ์น ํ์ด์ง๋ฅผ ๋ณด๋ฉด ๋ ๋ง์ ์ด์ผ๊ธฐ๋ฅผ ํ์ธํ ์ ์๋ค. ๊ฐ๋จํ๊ฒ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง๋ง ์ ๋ฆฌํด ๋ณผ ์์ ์ด๋ค.
๊ณต์ ์นํ์ด์ง ๐ https://react.i18next.com/getting-started
์ค์นํ๊ธฐ
npm install react-i18next i18next --save
โพ ์ ์ฉํ๊ธฐ
๋ณดํต ํ์ผ ํ๋์ ๋ค ์ ์ ๊ฐ๋จํ ์์ ๋ค์ด ๋ง์์ ์กฐ๊ธ ํค๋งธ๋๋ฐ, ์ฐ์ ๋๋ถ๋ถ ํ๋ก์ ํธ์ ์ ์ฉํ ๋ ํ์ผ์ ๋ฐ๋ก ๋นผ์ ๋ถ๋ฆฌํด๋๊ธฐ ๋๋ฌธ์ ๋๋ ๊ทธ๋ ๊ฒ ํ๋ค. src ํด๋ ์๋์ language ๋ผ๋ ํด๋๋ฅผ ๋ง๋ค์ด์ i18n.js๋ฅผ ๋ง๋ค์๋ค.
์์ด๋ฒ์ ผํ๊ณ ํ๊ตญ์ด ๋ฒ์ ผ๋ง ์์ผ๋ฉด ๋๊ธฐ๋๋ฌธ์ ๋ฒ์ญ ์คํฌ๋ฆฝํธ๋ en.json / kr.json์ผ๋ก ๋ถ๋ฆฌํด๋์๋ค.
i18n.js
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import en from "./en.json";
import kr from "./kr.json";
const resource = {
en: {
translation: en,
},
kr: {
translation: kr,
},
};
i18n.use(initReactI18next).init({
resources: resource,
lng: "kr",
fallbackLng: "kr",
debug: true,
keySeparator: false,
interpolation: { escapeValue: false },
});
export default i18n;
resource ๋ถ๋ถ์ ๋ํ๊ณ ์ถ์ ์ธ์ด๋ค์ ๋ํด์ฃผ๋ฉด ๋๋ค. translation์ ์ ํ kr๊ณผ en์ json ํ์ผ์ด๋ค.
init ๋ถ๋ถ์ ๋ค์ด๊ฐ์๋ ๊ฑด default ๊ฐ์ผ๋ก ์ฐ๊ณ ์ถ์ ์ธ์ด๋ค.
์ ๊ธฐ์ ์ต์ ์ ๋ ๋ฃ์ด์ค ์ ์๋๋ฐ, 'ns'๋ผ๊ณ ๊ณต๊ฐ์ผ ๋๋์ด์ฃผ๋๊ฒ ์๋ค. ํ์ง๋ง ๋ ๋ฑํ ํ์์์ด์ ์๋ต!
kr.json
{
"title1" : "๋๋ Netflix Original Series์ ๋ํด์ ์ผ๋ง๋ ์๊ณ ์์๊น?",
"title2" : "๋์ ๋๋ ฅ์?!",
"title3" : "{{people}}๋ช
์ ์ฌ์ฉ์๊ฐ ํ๋ ์ดํ์ต๋๋ค.",
"scoreTtitle" : "Netflix Original Series ํด์ฆ์ ๋ํ",
"score" : "{{name}} ๋์ ์ ์๋",
"yourscore" : "์ ์
๋๋ค!",
"comment" : "ํ ๋ง๋ ๋จ๊ธฐ๊ธฐ",
"leaveComment" : "{{name}} ์๊ฒ ๋จ๊ธฐ๋ ํ๋ง๋",
"checkRank" : "๋ญํน ๋ณด๋ฌ๊ฐ๊ธฐ",
"ranktitle" : "{{people}} ๋ช
์ค์ ๋น์ ์ ๋ญํน์?",
"rank" : "๋ฑ",
"retry" : "์ฌ๋์ ํ๊ธฐ"
}
์ด๊ฑด ํ๊ตญ์ด ๋ฒ์ ผ์ด์ง๋ง ์ด๊ฒ๊ณผ ๋๊ฐ์ด ์์ด๋ฒ์ ผ๋ en.json์ผ๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค. ์ค๊ฐ์ {} ๊ดํธ ์ฒ๋ฆฌ๊ฐ ๋ ๊ฒ์ ๋ณ์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ ์ฉํ ์์ ์ด๊ธฐ ๋๋ฌธ~~
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๊ณ ๋ ์ด์ ๋์ด๊ฐ์ ์ฝ๋๋ฅผ ์ ์ฉ์์ผ์ฃผ๋ฉด ๋๋ค!
์ ์ฉํ ํ์ด์ง.js
import React, { useRef, useEffect } from "react";
import i18n from "i18next";
import { useTranslation, Trans } from "react-i18next";
const Start = () => {
const { t } = useTranslation();
const people = userInfo.length;
return (
<Wrapper>
<Lng>
<button onClick={() => {i18n.changeLanguage("en")}}>ENG</button>
<button onClick={() => {i18n.changeLanguage("kr")}}>KOR</button>
</Lng>
<Title>
<Trans i18nKey = "title1">
hello
</Trans>
<p>{t("title2")}</p>
<p>{t("title3", { people })}</p>
</Title>
///์๋ต...
์ค์ ๋ก ์ ์ฉํ๋ ์ฝ๋์ธ๋ฐ, ๋ง์ ๋ถ๋ถ์ ์ง์๋ด๊ณ i18n์ ์ ์ฉํ ๋ถ๋ถ๋ง ๋จ๊ฒจ๋ ์ผ๋ถ๋ค.
Trans ๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ์จ์ key๋ก ๊ฐ์ ๊ฐ์ ธ์์ ์ ์ฉํ ์ ์๊ณ ,
useTranslation์ ์ฌ์ฉํด t๋ก ๊ฐ์ ๊ฐ์ ธ์์ ์ ์ฉ ํ ์ ์๋ค.
Trans์ ๊ฒฝ์ฐ์๋ ์ hello ๊ฐ์ด kr ์ํ์ default ์ด๊ณ en์ ๋๋ฅด๋ฉด title1์ ํด๋นํ๋ ์์ด ๊ฐ์ผ๋ก ๋ฐ๋๋ค.
{ people } ์ด๋ผ๋ ๋ณ์๋ ํด๋น ์ปดํฌ๋ํธ์์ ์ ์ธํด์ค ๊ฐ์ผ๋ก en์ด์ฌ๋ kr์ด์ฌ๋ ๋ณํจ์์ด ๋์จ๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ผ ์ค์ํ๊ฑฐ!!!!!!
index.js์์ ๊ผญ!! i18n.js์ import ํด์ค์ผํ๋ค. ์ด๊ฑฐ ์ ํด์ ใ ใ ... ์ฝ๋ ์ ๋ชป ์จ์ ์๋๋ ์ค... ใ ใ
'๊ฐ๋ฐ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฆฌ์กํธ] useRef ์ฌ์ฉํ๊ธฐ - ๋ฆฌ์กํธ์์ ํน์ DOM์ ์ ๊ทผํ๊ธฐ (0) | 2022.11.15 |
---|---|
React Testing Library ์ฌ์ฉํ๊ธฐ (from Scratch) - 1 (0) | 2022.04.29 |
[React] React-Query ๋? (0) | 2022.03.28 |
[React] React Custom Hooks (0) | 2022.03.23 |
[React] useEffect ์ useLayoutEffect ์ ์ฐจ์ด์ (0) | 2022.03.22 |