next.js μΉ μμ©νλ‘κ·Έλ¨μ΄ λ€κ΅μ΄λ₯Ό μ§μνκΈ° μν΄ next-i18next λ₯Ό μ¬μ©νλ μμ μ λν μ€λͺ μ λλ€.
baseURL νμ κ²½λ‘λ₯Ό μ¬μ©ν΄μ μΈμ΄λ³ λΌμ°νΈκ° ꡬνλ©λλ€.
http://myapp.com <- κΈ°λ³Έ μΈμ΄
http://myapp.com/en <- μμ΄
http://myapp.com/ru <- λ¬μμμ΄
μμ‘΄ ν¨ν€μ§
κ΄λ ¨ μμ‘΄ ν¨ν€μ§λ μλμ κ°μ΅λλ€.
- next 12.0.4
- next-i18next 9.1.0
- react 17.0.2
- react-dom 17.0.2
$ npm install --save react react-dom next next-i18next
$ npm install --save-dev typescript @types/react @types/react-dom
κ΅¬μ± νμΌ
νλ‘μ νΈ λ£¨νΈ λλ ν°λ¦¬μ next.config.js
, next-i18next.config.js
νμΌμ μΆκ°ν©λλ€.
next.config.js
νμΌκ³Όnext-i18next.config.js
νμΌμ νλ‘μ νΈ λ£¨νΈμμ μμ±λμ΄μΌ νκ³ , νμΌμ΄λ¦μ μ§μ λ μ΄λ¦μ μ¬μ©ν΄μΌ μ§νμ λ¬Έμ κ° λ°μνμ§ μμ΅λλ€.
next-i18next.config.js νμΌ
μμΈν λ΄μ©μ GitHub: next-i18next μ μ₯μμμ μ°ΎμΌμ€ μ μμ΅λλ€.
const config = {
i18n: {
defaultLocale: 'ko',
locales: ['ko', 'en', 'ru'],
defaultNS: 'common',
localeDetection: false,
},
};
module.exports = config;
defaultLocale
μ μΈμ΄ κ²½λ‘λ₯Ό ν¬ν¨νμ§ μλ μΈμ΄λ₯Ό μ§μ ν©λλ€. locales
λ μ§μνλ μΈμ΄λ₯Ό λͺ¨λ μμ±ν©λλ€. defaultNS
λ λ²μ νμΌμ νμΌμ΄λ¦μ μμ±ν©λλ€. (κΈ°λ³Έκ°μ common μ
λλ€.) localeDetection
μ μΉμλ²μ μμ²μ μμ² ν€λμ accept-language λ₯Ό μ¬μ©ν΄μ μΈμ΄λ₯Ό μ§μ ν μ§λ₯Ό κ²°μ ν©λλ€. (false λ‘ μ§μ λλ κ²½μ° accept-language κ°μ 무μν©λλ€.)
next.config.js νμΌ
μμΈν λ΄μ©μ next.js Internationalized routing νμ΄μ§μμ μ°ΎμΌμ€ μ μμ΅λλ€.
const { i18n } = require('./next-i18next.config');
/**
* @type {import('next').NextConfig}
*/
const nextConfig = {
/* config options here */
i18n,
};
module.exports = nextConfig;
next-i18next.config.js
νμΌμμ μμ±ν ꡬμ±μ next.config.js
νμΌμμ next configμ i18n μμ±μΌλ‘ μ¬μ©ν©λλ€.
λ²μ νμΌ
νλ‘μ νΈ λ£¨νΈμ public λλ ν°λ¦¬λ₯Ό μμ±ν©λλ€. public λλ ν°λ¦¬μ locales λλ ν°λ¦¬λ₯Ό μμ±ν©λλ€. locales λλ ν°λ¦¬μ μΈμ΄λ³ λλ ν°λ¦¬λ₯Ό μμ±ν©λλ€. locales λλ ν°λ¦¬μ μΈμ΄λ³ λλ ν°λ¦¬μ common.json νμΌμ μμ±ν©λλ€.
locales λλ ν°λ¦¬μ μΈμ΄λ³ λλ ν°λ¦¬μ μ΄λ¦μ next-i18next.config.js νμΌμ locales μ μ λ ₯λλ λ¬Έμμ΄ λ°°μ΄μ νλͺ©λ€μ μ΄λ¦μΌλ‘ λλ ν°λ¦¬ μ΄λ¦μ κ²°μ ν©λλ€.
ββββpublic
β ββββlocales
β ββββen
β ββββko
β ββββru
common.json νμΌμ λ΄μ©μ μλμ κ°μ΄ μ ν¨ν json νμμΌλ‘ μμ±ν©λλ€.
{
"global": {
"title": "next-i18next μμ "
},
"index": {
"title": "μλ
νμΈμ! π"
},
"about": {
"title": "μκ°ν©λλ€! π "
},
"debug": {
"title": "λλ²κ·Έ"
},
"navigator": {
"link": "Link μ»΄ν¬λνΈ μ¬μ©",
"router": "Router μ¬μ©"
}
}
λ²μνμΌμ λ΄μ©μ μ¬μ©ν λλ μλμ κ°μ΄ μμ±ν©λλ€.
import { useTranslation } from 'next-i18next'
const Compo = () => {
const { i18n, t } = useTranslation('common');
return (
<div>
<p>{t('global.title')}</p> {/* νκ΅μ΄μΈ κ²½μ° "next-i18next μμ " μΆλ ₯ */}
</div>
);
};
νμΈ
μ΄λ κ² κ΅¬μ±ν ν μ°κ²°λλ κ²½μ° next.js μ κΈ°λ₯μ΄ i18n κ³Ό μ°λλμ΄ λμν©λλ€.
νμΈλ κΈ°λ₯μ μλμ κ°μ΅λλ€.
next.jsμ μλ λ κΈ°λ₯μ locale μ μ§μ νμ§ μμΌλ©΄, νμ¬ i18n.language κ°μ locale λ‘ μ§μ λμ΄ λμν©λλ€.
- Link μ»΄ν¬λνΈ
next/link
- Router
next/router
next/link
Anchor λ locale μ μ§μ νμ§ μμΌλ©΄ νμ¬ i18n.language μ κ°μ μ¬μ©ν©λλ€.
// import Link from 'next/link';
<Link href={href}>
<a>
{label}
</a>
</Link>
next/router
router λ locale μ μ§μ νμ§ μμΌλ©΄ i18n.language κ°μ μ¬μ©ν©λλ€.
import React from 'react'
import { useRouter } from 'next/router'
const Compo = () => {
const router = useRouter()
const handleClick = () => {
router.push('/somepath');
}
return (
<button onClick={handleClick}>{label}</button>
);
};
Change language
μ¬μ©μκ° μΈμ΄λ₯Ό λ³κ²½νλ κΈ°λ₯μ μ§μνλ €λ©΄ μλμ μ μ¬νκ² i18n.changeLanguage()
λ₯Ό μ¬μ©ν©λλ€.
i18n.changeLanguage(languageCode, () => {
const { pathname, query, asPath } = router;
// κ° νμΈμ© μ½μ μΆλ ₯
console.group('i18n.changeLanguage -> callback');
console.info('language', languageCode);
console.info(
'pathname, query, asPath',
pathname,
query,
asPath,
);
console.groupEnd();
router.push({ pathname, query }, asPath, {
locale: languageCode,
});
});
i18n.changeLanguage() μ€ν μμΉλ₯Ό μ£Όμν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄ _app.tsx μ μ μ½λλ₯Ό μ¬μ©ν λ, i18n.changeLanguage() μ€ν ν i18n.language μ λ³κ²½μ΄ μμ μ»΄ν¬λνΈμμ μ ννκ² μ²λ¦¬λλμ§ νμΈν΄μΌ ν©λλ€. _app.tsx μμ μ¬μ©νλ κ²λ³΄λ€ μμ μ»΄ν¬λνΈμμ μ¬μ©νλ κ²μ΄ λ μ’λ€κ³ μκ°λ©λλ€. μ΄ κ²½μ° λ¬Έμ μμ΄ λμνλ κ²μΌλ‘ νμΈλμμ΅λλ€.
μμ°
sample-next-i18next.vercel.app νμ΄μ§μμ λμμ νμΈν μ μμ΅λλ€.
μ°Έμ‘°
GitHub: sample-next-i18next μ μ₯μμμ μ½λλ₯Ό νμΈν μ μμ΅λλ€.