[TIL] 다국어 처리 react-i18next

공지애·2022년 5월 20일
0

이번 프로젝트는 외국인 유저도 있을 거로 생각했기 때문에, 다국어 처리를 하게 되었다. 다국어 처리는 react- i18next를 이용해서 진행했다.

먼저, language 폴더를 하나 생성해서 그 안에 i18n.js 파일과 각 언어 별 json 파일을 만들어 주었다.

{
  "language": "언어"
}
{
  "language": "言語"
}
{
  "language": "Language"
}

언어 파일은 이런 식으로 "key값" : "대치 될 단어 또는 문장"으로 만들어준다.

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

import translationEn from './translation.en';
import translationKo from './translation.ko';
import translationJa from './translation.ja';

const resource = {
  en: {
    translation: translationEn,
  },
  ko: {
    translation: translationKo,
  },
  ja: {
    translation: translationJa,
  },
};

i18n
  .use(initReactI18next) // passes i18n down to react-i18next
  .init({
    resources: resource,
    lng: 'en', // 초기 설정 언어
    fallbackLng: 'en',
    ns: ['translation'],
    defaultNS: 'translation',
    debug: true,
    keySeparator: false, // we do not use keys in form messages.welcome
    interpolation: {
      escapeValue: false, // react already safes from xss
    },
  });

export default i18n;

i18n.js 파일은 튜토리얼을 참고해서 작성했다. 초기 설정 언어는 영어로 했다. 만든 파일은 index.js에 import 해준다.

import './shared/language/i18n';

이번 프로젝트에서는 Header에서 언어 설정을 할 수 있는 탭을 만들어서 변경될 수 있도록 했다.

import { useTranslation } from 'react-i18next';

Header에서 이렇게 useTranslation을 import 하고, 언어 변경을 할 함수를 작성한다.

const { i18n } = useTranslation();
  const changeLanguageEn = () => {
    i18n.changeLanguage('en');
  };
  const changeLanguageKo = () => {
    i18n.changeLanguage('ko');
  };
  const changeLanguageJa = () => {
    i18n.changeLanguage('ja');
  };

각 함수를 onClick 시 실행할 수 있도록 해주면 된다. 그런데 이렇게 했을 때, 페이지가 변경되는 경우 다시 초기 언어로 돌아오는 경우가 있어서 설정된 값을 localStorage에 저장해주었다.

const { i18n } = useTranslation();
  const changeLanguageEn = () => {
    i18n.changeLanguage('en');
    localStorage.setItem('language', 'en');
  };
  const changeLanguageKo = () => {
    i18n.changeLanguage('ko');
    localStorage.setItem('language', 'ko');
  };
  const changeLanguageJa = () => {
    i18n.changeLanguage('ja');
    localStorage.setItem('language', 'ja');
  };

그러면 이제 노가다 시작이다!

  const { t } = useTranslation();
  <p>{t('language')}</p>

이렇게 { t }를 선언해주고, t('key값') 이런 식으로 모든 텍스트를 대치시켜주면 된다.

0개의 댓글