홈페이지에 버튼 클릭으로
다국어를 지원하는 코드입니다.
리액트 기반이며 라이브러리로 i18next 사용했습니다.
위 이미지처럼 클릭시 언어가 변경 됩니다.
폴더 구조 입니다.
😎 src > utiles > i18n > locales > en-US > index.js
import page from './page.json'
export default{
page
}
😎 src > utiles > i18n > locales > en-US > page.json
{
"소개":"Intro",
"인사말":"Greeting",
"사업 소개":"BusinessInfo",
"참여 기관":"Agency",
"데이터":"Data",
"안심":"Safe",
"분석":"Analysis",
"구역":"Zone",
"마켓":"Market",
"공지사항":"Notice",
"회원가입":"SignUp",
"로그인":"Login",
"로그아웃":"Logout"
}
제이슨 파일에 번역할 언어들을 작성합니다.
영문 한국어 각각 작성해야합니다.
{
"소개":"소개",
"인사말":"인사말",
"사업 소개":"사업 소개",
"참여 기관":"참여 기관",
"데이터":"데이터",
"안심":"안심",
"분석":"분석",
"구역":"구역",
"마켓":"마켓",
"공지사항":"공지사항",
"회원가입":"회원가입",
"로그인":"로그인",
"로그아웃":"로그아웃"
}
ex) '로그인' 이라는 단어가 kr일때, en 일때 어떤 단어로 출력할지 관리하는것 입니다.
😎 src > utiles > i18n > index.js
import i18n from "i18next";
// npm install react-i18next i18next --save
import { initReactI18next } from "react-i18next";
// # if you'd like to detect user language and load translation
// npm install i18next-http-backend i18next-browser-languagedetector --save
import detector from "i18next-browser-languagedetector";
import Backend from "i18next-http-backend";
import en from './locales/en-US';
import ko from './locales/ko-KR';
import cn from './locales/zh-CN';
i18n
// .use(Backend) //백엔드에서 리소스 가져올시
.use(detector) //사용자 언어 감지 : https://github.com/i18next/i18next-browser-languageDetect
.use(initReactI18next) // passes i18n down to react-i18next
.init({
// the translations
// (tip move them in a JSON file and import them,
// or even better, manage them via a UI: https://react.i18next.com/guides/multiple-translation-files#manage-your-translations-with-a-management-gui)
// for all options read: https://www.i18next.com/overview/configuration-options
resources: {
ko:ko,
en:en,
cn:cn
},
// lng: "ko", //언어 감지기를 상요하는 경우 옵션 정의 X
fallbackLng: "en",
detection: { // languagedetector option
order: ['querystring', 'htmlTag', 'cookie'], // detect 우선순위
lookupQueryString: 'lang', // ?lang=
lookupCookie: 'i18n_lang' // cookie name
},
debug: true,
saveMissing: true, //변환되지않는 키를 엔드포인트로 보냅니다.
// keySeparator: false, //메세지 형식에서 키를 사용하지 않습니다.
// ns:['pageKo','pageEn','pageCn'], //ns는 namespace로 label, button, menu 등 구분해서 관리할 경우 필요
interpolation: {
escapeValue: false
}
}, function(err) {
if(err) console.error(err);
});
export default i18n
플로그인을 use 할수 있습니다.
위 이미지 처럼 화면 최상단에 다국어 버튼을 넣어줍니다.
저의 navi는 appHeader 입니다.
import React, {useEffect, useRef, useState} from 'react'
import { useTranslation } from 'react-i18next'
import { Link, withRouter } from 'react-router-dom'
import { COMMON_LANG_TYPE } from '../modules/action/actionTypes';
const AppHeader = (props) => {
const { t, i18n } = useTranslation(['page']);
const langInfo = useSelector(state => state.common.Common_Lang_Type)
const onChangeLang = () => {
if(langInfo==='ko'){
dispatch({ type: COMMON_LANG_TYPE, Common_Lang_Type: 'en'})
}else if(langInfo==='en'){
dispatch({ type: COMMON_LANG_TYPE, Common_Lang_Type: 'ko'})
}
}
useEffect( () => {
if(langInfo === undefined){
dispatch({ type: COMMON_LANG_TYPE, Common_Lang_Type: 'ko'})
}else {
i18n.changeLanguage(langInfo)
}
},[langInfo])
return (
<Link to="/auth/login">{t('로그인')}</Link>
<Link to="#" className="lang" onClick={onChangeLang}>{langInfo ==='ko'? 'KR' :'EN' }</Link>
)
}
export default withRouter(AppHeader)
다국어 버튼 클릭시 전역적으로 state에 넣어 단어를 트랜스 해줍니다.
//다국어
import { useTranslation } from 'react-i18next'
//다국어
const { t, i18n } = useTranslation(['page']);
다른 페이지 에서 다국어 적용시
위 코드 두줄 추가해주셔야합니다
<div className="mtit">{t('데이터')} {t('현황')}</div>
단어의 경우
{t('데이터')}
이러한 형식으로 감싸줍니다
728x90
반응형
'Front-end > React' 카테고리의 다른 글
[React] 페이지 별 체크박스 - 전체/개별 체크박스 페이지 이동해도 checked 저장 (0) | 2022.12.23 |
---|---|
[React] client IP / userAgent 정보 받기 (2) | 2022.10.06 |
[React-spinner] loading spinner 적용하기 axios interseptor (1) | 2022.09.27 |
[React] Canvas 사이즈에 맞춰 이미지의 원본 비율로 출력하기 (1) | 2022.09.23 |
[React] Canvas 레이아웃 2개 겹치기 (0) | 2022.09.23 |
댓글