i18next react에서 사용하기
1탄에서 열심히 json 파일 자동화 시켰으니까 이제 사용하는 프로젝트에 연동하면 됩니다.
기본 골자는 아래와 같습니다.
1. i18n.js 파일 만들기
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import LanguageDetector from "i18next-browser-languagedetector";
// LanguageDetector 는 다양한 방법으로 사용자 pc에서 기본 언어를 감지해 설정한다
// 자세한 내용은 아래에 후술하겠음
import translationEN from "../locale/en/en.json";
import translationKO from "../locale/ko/ko.json";
// 위처럼 그냥 json 가져와도 잘 읽힌다
const resources = {
en: {
translation: translationEN,
},
ko: {
translation: translationKO,
},
};
i18n
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources,
fallbackLng: "ko", // 번역 파일에서 찾을 수 없는 경우 기본 언어
interpolation: {
escapeValue: false,
},
});
export default i18n;
2.최상위 파일에서 i18n.js 빌드하기
import React from 'react'
import App from './App.jsx'
import "./locale/i18n.js" // 최상위 파일에서 build 해준다
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<App />
</React.StrictMode>,
)
3. 다국어 지원을 할 컴포넌트에서 사용
import { useTranslation } from "react-i18next";
export default function I18nTest() {
const { t, i18n } = useTranslation();
// 언어 변경하기
const changeLanguage = (lang) => {
i18n.changeLanguage(lang);
};
return (
<div>
<div>
<button onClick={() => changeLanguage("ko")}>한국어</button>
<button onClick={() => changeLanguage("en")}>English</button>
</div>
<h1>{t(`auto-translation`)}</h1> // json 파일에 설정했던 key 값으로 불러온다
<div>{t(`new-jeans`)}</div> // json 파일에 설정했던 key 값으로 불러온다
</div>
)
}
이번에 조금 더 딥하게 공부하면서 i18next의 디테일에 놀란 부분이 몇개 있다
첫번째는 i18next-browser-languagedetector 의 기능
무려 5가지 방법을 통해 사용자 언어를 감지해준다 그리고 i18n.changeLanguage() 로 언어를 변경하면 마지막으로 변경한
언어를 기억해서 다시 접속하면 해당 언어를 default로 보여준다.
(electron 으로 개발할 때는 브라우저랑 좀 달라서 그런지 마지막 변경 기억을 안해줘서 따로 코드로 구현했었음..)
1. 쿼리 문자열
- URL의 쿼리 문자열에서 언어를 감지. 예를 들어, ?lng=en과 같은 형식으로 언어를 지정.
2. 로컬 스토리지
- 로컬 스토리지에서 언어를 감지. 쿠키와 유사하게 사용자 언어 설정을 저장하고 나중에 불러오는데 사용.
3. 쿠키
- 이전에 설정된 언어를 쿠키에서 감지. 사용자가 이전에 선택한 언어 설정을 기억
4. 세선 스토리지
- 세선 스토리지에서 언어 감지
5. 브라우저 설정
- 브라우저 navigator.language 또는 navigator.languages 속성을 통해 사용자의 기본 언어를 감지.
나의 경우는 i18n.changeLanguage() 메서드로 언어를 변경할때마다 localStorage에 저장되고 있었다.
두번째는 useTranslation 훅
언어가 변경될 때마다 useTranslation 훅을 가진 컴포넌트를 리랜더링 해주는게 신기해서 안을 좀 까봤다.
useTranslation 안에 아래 useState로 상태관리를 해주고 있었고
const [t, setT] = react.useState(getT);
ns(언어) 가 변경되는걸 트리거로 useEffect 에서 setter 함수로 state 변경해서 랜더링 해주고 있었다.
react.useEffect(() => {
// 생략
// 이전 ns 과 현재 ns 가 다른 경우에 setter 해주고 있음
if (ready && previousJoinedNS && previousJoinedNS !== joinedNS && isMounted.current) {
setT(getNewT);
}
// 생략
}, [i18n, joinedNS]); // ns 로 트리거
docs 도 깔끔하고 커스텀해서 사용하기도 좋고 왜 많이 쓰는지 다시한번 납득할수 있었다
'OpenAPI' 카테고리의 다른 글
구글 스프레드시트를 통한 다국어 번역 자동화하기 -1 (0) | 2024.08.07 |
---|