๋์ ๋ฐฐ๊ฒฝ
ํ์ฌ์์ react-i18next๋ก ๋ค๊ตญ์ด๋ฅผ ์ ์ฉํ๊ณ ์๋๋ฐ, ๋ฌธ์ ๋ ๋ชจ๋ ๋ฌธ๊ตฌ๊ฐ ํค ๊ธฐ๋ฐ์ผ๋ก๋ง ๊ด๋ฆฌ๋๊ณ ์์๋ค.
์ปดํฌ๋ํธ์์๋ t("SOME_KEY") ํํ๋ก๋ง ์ฐ์ด๋ค ๋ณด๋, ์ค์ ํ
์คํธ๋ฅผ ํ์ธํ๋ ค๋ฉด ํค๋ฅผ ๊ฒ์ํด JSON ํ์ผ์์ ๊ฐ์ ์ฐพ์์ผ ํ๋ค. ์ฝ๋๋ง ๋ณด๊ณ ๋ ์ด๋ค ๋ฌธ๊ตฌ์ธ์ง ๋ฐ๋ก ์ ์ ์์๊ณ , ๋งฅ๋ฝ์ ํ์
ํ๋ ๋ฐ ๋ถํ์ํ ๋น์ฉ์ด ๊ณ์ ๋ฐ์ํ๋ค. ๋, ์๋ก์ด ๋ฌธ๊ตฌ๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค ๊ฐ ์ธ์ด๋ณ JSON์ ํค๋ฅผ ๋ง๋ค๊ณ ์ง์ ๊ฐ์ ์
๋ ฅํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์๋ ์์๋ค. ์จ๋ณด๋ฉ ์ดํ ๋งก์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ๊ด๋ จ ์ํฝ์์๋ ๊ฐ์ ๋ถํธ์ด ์์๊ณ , ์์ผ๋ก ๋ฒ์ญ ๋ฌธ๊ตฌ๊ฐ ๋์ด๋๋ฉด ํ ์ ์ฒด๊ฐ ๊ฒช์ ๋ฌธ์ ๋ผ๊ณ ํ๋จํ๋ค. ๊ทธ๋์ ๋น ๋ฅด๊ฒ ์ ์ฉํ ์ ์๋ ๋์์ ์ฐพ์ ํ์ ์ ์ํ๊ฒ ๋์๋ค.
i18next-parser ๋์
๋ชจ๋ ธ๋ ํฌ ํ๊ฒฝ์์์ ์ฌ์ฉ
ํ์ฌ ์ฌ๋ฌ ์ฑ์ด ์๋ ๋ชจ๋ ธ๋ ํฌ ๊ตฌ์กฐ๋ฅผ ์ฐ๊ณ ์๋๋ฐ, i18next-parser๋ CLI๋ก ์คํํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ณ๋ก ๋ ๋ฆฝ ์ค์ ์ ๋๊ณ , ํ์ํ ์ํฌ์คํ์ด์ค์์๋ง ์คํํ ์ ์๋ค. (ํน๋ณํ ๋ณต์กํ ํ์ดํ๋ผ์ธ ์ค์ ์์ด๋ ๋ฐ๋ก ์ ์ฉํ ์ ์์!)
๊ธฐ์กด ๋ก์ผ์ผ ๊ตฌ์กฐ ์ ์ง
๊ธฐ์กด์ ์ฐ๋ ๋ก์ผ์ผ ๊ตฌ์กฐ๋ ๊ทธ๋๋ก ๋๊ณ ์๋ํ๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
src/utils/i18n/locales/
โโโ ko-KR/ko-KR.json
โโโ ja-JP/ja-JP.json
์ค์ ์์ ์ถ๋ ฅ ๊ฒฝ๋ก๋ง ๋ง์ถฐ์ฃผ๋ฉด ๋๋ค.
์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ๋ฅ
keepRemoved: true ๋ก ์ค์ ํด ์ฃผ๋ฉด ๊ธฐ์กด ํค๋ ์ ์ง๋๊ณ , ์ ๋ฌธ์์ด์ ์๋์ผ๋ก ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์, ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ด ๊ฐ๋ฅํ๋ค.
// ๊ธฐ์กด
t("BUTTON_SUBMIT")
// ์๋ก์ด
t("์ ์ถํ๊ธฐ")
++ ์ ์ฌ ๋๊ตฌ์ธ i18next-scanner๋ Gulp ๋ฑ ํ์ดํ๋ผ์ธ์ ์น๊ธฐ ์ข๊ณ , i18next-parser๋ CLI๋ก ๋จ์ํ๊ฒ ์นดํ๋ก๊ทธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ข๋ค๊ณ ํ๋ค. ์ฐ๋ฆฌ ํ๊ฒฝ์์๋ ๋น๋ ์ฒด์ธ ๊ฒฐํฉ์ด ํ์ ์์ด์ parser๊ฐ ๋ ์ ํฉํด ๋ณด์๋ค.
์ค์
// i18next-parser.config.cjs
module.exports = {
input: ['src/**/*.{ts,tsx,js,jsx}', '!src/utils/i18n/locales/**'],
output: // ํ์ผ ๊ฒฝ๋ก,
locales: ['ko-KR', 'ja-JP'],
defaultNamespace: 'translation',
keySeparator: false,
namespaceSeparator: false,
defaultValue: (locale, _ns, key) =>
locale === 'ko-KR' ? key : `[๋ฒ์ญํ์] ${key}`,
keepRemoved: true,
sort: false,
...
};
์๋ํ ์ ํ๊ตญ์ด๊ฐ ์๋ ๊ฒฝ์ฐ์๋ [๋ฒ์ญํ์] prefix๋ฅผ ๋ถ์ฌ, ๋ฒ์ญ๋์ง ์์ ๋ถ๋ถ์ ํ๋์ ํ์ธํ ์ ์๋๋ก ํ๋ค. ์ด์ ๋ ํ๊ตญ์ด ์๋ฌธ์ ๊ทธ๋๋ก ์ฝ๋์ ์์ฑํ๊ณ yarn i18n:extract๋ง ์คํํ๋ฉด ์๋ ๋ฐ์๋๋ค.
์ฌ์ฉ ๋ฐฉ์
t('๋ก๊ทธ์ธ')
t('์ ์ฅ {{value}}ํ', { value })
t('์ ์ฅ๋์์ต๋๋ค')
<Trans i18nKey="greeting">
์๋
ํ์ธ์, <strong>{{name}}</strong>๋!
</Trans>
ํ์๊ฐ ๋ฌธ์์ด์ ์ถ์ถํด ko-KR/translation.json, ja-JP/translation.json์ ๋ฐ์ํ๊ฒ ๋๊ณ , ์๋์ ๊ฐ์ด ์ถ๊ฐ๋๋ค.
{
"๋ก๊ทธ์ธ": "[๋ฒ์ญํ์] ๋ก๊ทธ์ธ",
"์ ์ฅ {{value}}ํ": "[๋ฒ์ญํ์] ์ ์ฅ {{value}}ํ",
"์ ์ฅ๋์์ต๋๋ค": "[๋ฒ์ญํ์] ์ ์ฅ๋์์ต๋๋ค"
}
++ ๊ฐ์ ๋ฐฉํฅ์ ์ ๋ฆฌํด์ ํ์๋ถ๋ค๊ป ๊ณต์ ๋๋ ธ๊ณ , ๋คํํ ํ์ฌ์ ๋ถํธํจ์ ๋ค๋ค ๊ณต๊ฐํด ์ฃผ์ ์ ๋์ ํ ์ ์๊ฒ ๋์๋ค!

'๐ WIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์ด๋ฏธ์ง ํ๋ฆฌ๋ก๋ฉ์ ๊ตฌํํ๋ฉฐ ์๊ฒ ๋ ๊ฒ๋ค (4) | 2025.10.25 |
|---|---|
| @property (1) | 2025.10.18 |
| Storybook v8 preset ์๋ฌ ํธ๋ฌ๋ธ์ํ (0) | 2025.08.31 |
| Tailwind v4 ๋ง์ด๊ทธ๋ ์ด์ : Dynamic spacing utilities (0) | 2025.08.24 |
| ๋ฃจํธ ๋จ์ผ ์ค์น vs ์ํฌ์คํ์ด์ค ์ค์น (3) | 2025.08.17 |