React, Next에서 i18next를 사용해서 언어셋 설정하기

Explanation

시간이 흐르고 흘러 어느덧 10월의 마지막 주 주말입니다. 올해도 얼마 남지 않았네요(두렵다..)
날이 많이 쌀쌀해지고 있어요 다들 건강 조심하세요.
오늘은!! react와 next에서 i18next를 사용해서 언어셋을 설정하는 방법을 간단하게 적어보려 합니다.

작성된 코드는 https://github.com/falsy/blog-post-example/tree/master/i18next-react-next 에서 확인하실 수 있습니다!

1. React

우선 필요한 패키지를 설치해 줍니다.

다음으로 간단하게 한국어과 영어로 언어셋을 만들어 줄게요.

다음으로 i18n 설정도 간단하게,

그럼 이제 설정한걸 적용해 볼까요?

끝! 엄청 간단하네요!

2. Next

역시, 우선 패키지 먼저 설치해 줄게요.

react 에서는 src/locales 에 있던 언어셋을 public 에 아래와 같이 넣어줄게요.

(React에서 했을때랑 디렉토리명, 파일명 다 조금씩 달라졌어요.)

다음으로 next-i18next.config.js를 만들어서 next.config.js에 적용해줍니다.

이제 _app 파일로 가서, appWithTranslation로 감싸주고

그럼 이제 적용해 볼까요?

next-i18next는 도메인에 첫번째 패스에 언어를 넣는 구성으로 사용이되는 거 같아요.
그래서 언어 변경을 할때, 저는 예시로 간단하게 정규표현식으로 언어 부분의 패스를 바꿔주었어요.

여기서 common은 아까 만든 언어셋 파일명이랍니다(common.json). 생략해도 되지만 그러면 사용할때 ‘common.’ 으로 시작해야 해요.

3. Next (App Directory)

작성하는 김에, 마지막으로! Next의 앱 디랙토리 구조에서의 적용도 해볼게요.

우선 i8n 설정을 먼저 해줄게요.
아까와 같이 언어셋을 app 디랙토리 안에 i18n 폴더를 만들고 그안에 위치해줄게요.

그리고 설정파일을 만들어줄게요.

다음 useTranslation를 만들어 줄게요.

이제 페이지 디랙토리를 구성해볼까요?

그런데 이렇게 되면, / 패스로 접근하게 되면 404가 뜨기 때문에 middleware를 만들어 줍니다.

조건문 그대로 URI의 패스가 제가 등록한 언어 이름으로 시작하지 않으면 fallbackLng으로 리다이렉트 시키도록 합니다. 위에 config는, 미들웨어가 실행되는 매칭 기준?? 을 설정하는 거에요.
(api, static, image, assets, favicon, sw이 호출 될때는 아래 미들웨어가 실행되지 않도록)

참고.
* https://react.i18next.com/getting-started
* https://locize.com/blog/next-i18n-static/
* https://locize.com/blog/next-13-app-dir-i18n/
* https://github.com/i18next/next-13-app-dir-i18next-example/tree/main