jineecode

react 위에서 i18next 적용하기 본문

JS/react

react 위에서 i18next 적용하기

지니코딩 2021. 9. 1. 17:48

 

1. 라이브러리 설치

npm install i18next --save //i18next
npm install react-i18next i18next --save //react용 i18next
npm install i18next-browser-languagedetector //브라우저에서 사용자 언어를 감지

 

2. 각각의 언어 text를 담아줄 json 파일 만들어주기

src/asset/lang.en.json
src/asset/lang.ko.json

 

3. src/asset/i18n.js

i18n 초기 설정

import i18n from "i18next";
import { initReactI18next } from "react-i18next";

import langEn from "./lang.en.json";
import langKo from "./lang.ko.json";

import LanguageDetector from "i18next-browser-languagedetector";

const resources = {
  en: langEn,
  ko: langKo,
};

i18n
  .use(LanguageDetector)
  .use(initReactI18next)
  .init({
    resources,
    whitelist: ["ko", "en"],
    fallbackLng: "en",
    debug: false,
    ns: ["translations"],
    defaultNS: "translations",
    interpolation: {
      escapeValue: false,
    },
    detection: {
      order: ["path", "navigator"],
    },
    react: {
      useSuspense: false,
    },
  });

export default i18n;

 

4. 초기 세팅이 끝났으면 .json 파일에 key, value를 적어준다.

 

key 는 jsx 안에 들어갈 값이고, value는 언어 상태에 따른 내용이다.

 

src/asset/lang.en.json

{
  "translations": {
    "nav": {
      "home": "About us",
      "service": "Our service",
      "recruit": "Career",
      "inquiry": "Support"
    },
}

src/asset/lang.ko.json

{
  "translations": {
    "nav": {
      "home": "회사 소개",
      "service": "서비스 소개",
      "recruit": "채용",
      "inquiry": "고객 문의"
    },
}

 

4-1) 이제 jsx 위에서 이렇게 적용한다

import { useTranslation, withTranslation } from "react-i18next";

const NavBar = (props) => {
	const { i18n } = useTranslation();
    
    return(
    	...
              <Nav.Link>
                {i18n.t("nav.inquiry")}
              </Nav.Link>
          
        ...
    
    )
}


export default withTranslation()(NavBar);

 

5. 라우터와 연동 시 (참고)

const NavBar = (props) => {

  const changeLanguage = (lng) => {
      i18n.changeLanguage(lng, () => {
        const newUrl = `/${lng}/${menuActive}`;
        // debugger;
        props.history.push(newUrl);
      });
    };
  
  ...
 return ( 
 ...
      <Nav.Link
        className="languageActive"
        onClick={() => changeLanguage("ko")}
        eventKey="ko"
      >
        KOR
      </Nav.Link>
      <div> | </div>
      <Nav.Link
        className="languageActive"
        onClick={() => changeLanguage("en")}
        eventKey="en"
      >
        ENG
      </Nav.Link>

      ...
   );
};

 

 

번외: 한영 어순이 다를 때.

 

<Trans> 컴포넌트를 사용하는 것을 권장하는 것 같지만 이걸 알았을 땐 돌이킬 수 없을 정도로 많은 유지 보수가 필요한 것 같아서 급한대로 삼항 연산자를 썼다. 최대한 낱말을 쪼개서 조건문에 따라 어순을 바꾸거나, 그것으로도 안 된다면 각 한영 json이 지니고 있는 key 값을 다르게 적용하여 따로 처리하는 방향으로 갔다.

 

...


	<div data-aos="fade-up" data-aos-duration="2000">
            {i18n.language === "ko" ? (
              <>
                <div className={styles.jumbotronTitle}>
                  <h1>
                    {i18n.t("companyInfo.jumboTitleFirst")}
                    <br></br>
                    <strong>{i18n.t("companyInfo.jumboTitleStrong")}</strong>
                    {i18n.t("companyInfo.jumboTitleLast")}
                  </h1>
                </div>
              </>
            ) : (
              <>
                <div className={styles.jumbotronTitleEng}>
                  <h1 className={styles.companyInfoTitleEng}>
                    {i18n.t("companyInfo.jumboTitleFirst")}
                    <br></br>
                    <strong>{i18n.t("companyInfo.jumboTitleStrong")}</strong>
                    {i18n.t("companyInfo.jumboTitleLast")}
                  </h1>
                </div>
              </>
            )}
          </div>


...

'JS > react' 카테고리의 다른 글

next 위에서 i18next 적용하기  (1) 2021.11.17
concat 활용하기  (0) 2021.11.08
SPA 환경에서 구글 태그 관리자 넣기  (0) 2021.09.01
React Native 기본 원리  (0) 2021.06.19
import, export  (0) 2021.05.28
Comments