์ด ํ์ด์ง์๋ ์ ํ๋ฆฌ์ผ์ด์ ํ ํ๋ฆฟ์ด ์ ๊ณต๋ฉ๋๋ค.
์ด ํ์ด์ง๋ ํ ํ๋ฆฟ์ ๋ผ์ด๋ธ ๋ฐ๋ชจ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ด ํ์ด์ง์ ์ํ๋ AI ์ด์์คํดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ฝํฉ๋๋ค
๋ฒ์ ๊ธฐ๋ก
- "Solid useIntlayer API ์ฌ์ฉ๋ฒ์ ์ง์ ์์ฑ ์ก์ธ์ค๋ก ์
๋ฐ์ดํธ"v8.9.02026. 5. 4.
- "init ๋ช
๋ น์ด ์ถ๊ฐ"v7.5.92025. 12. 30.
- "๋ฌธ์ ์
๋ฐ์ดํธ"v6.1.52025. 10. 3.
- "React Router v7 ์ง์ ์ถ๊ฐ"v5.8.22025. 9. 4.
์ด ํ์ด์ง์ ์ฝํ ์ธ ๋ AI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ๋์์ต๋๋ค.
์์ด ์๋ณธ ๋ด์ฉ์ ์ต์ ๋ฒ์ ์ ๋ณด๊ธฐ์ด ๋ฌธ์๋ฅผ ๊ฐ์ ํ ์์ด๋์ด๊ฐ ์์ผ์๋ฉด GitHub์ ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ์ฌ ์์ ๋กญ๊ฒ ๊ธฐ์ฌํด ์ฃผ์ธ์.
๋ฌธ์์ ๋ํ GitHub ๋งํฌ๋ฌธ์์ Markdown์ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Intlayer๋ก React Router v7 ๋ฒ์ญํ๊ธฐ | ๊ตญ์ ํ(i18n)
์ด ๊ฐ์ด๋๋ React Router v7 ํ๋ก์ ํธ์์ ๋ก์ผ์ผ ์ธ์ ๋ผ์ฐํ , TypeScript ์ง์ ๋ฐ ์ต์ ๊ฐ๋ฐ ๋ฐฉ์์ ํ์ฉํ์ฌ Intlayer๋ฅผ ํตํฉํด ์ํํ ๊ตญ์ ํ(i18n)๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ ์ ๊ฒฝ์ฐ Intlayer์ React Router v7 ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ชฉ์ฐจ
๋์๋ณด๋ค Intlayer๋ฅผ ์ ํํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
'react-i18next' ๋๋ 'i18next'์ ๊ฐ์ ์ฃผ์ ์๋ฃจ์ ๊ณผ ๋น๊ตํ ๋ Intlayer๋ ๋ค์๊ณผ ๊ฐ์ ํตํฉ ์ต์ ํ๊ฐ ์ ๊ณต๋๋ ์๋ฃจ์ ์ ๋๋ค.
Intlayer๋ ๋ก์ผ์ผ ์ธ์ ๋ผ์ฐํ , ๋ก์ผ์ผ ๊ฐ์ง๋ฅผ ์ํ ๋ฏธ๋ค์จ์ด ๋ฐ ๊ตญ์ ํ ํ์ฅ(i18n)์ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ React Router์ ์๋ฒฝํ๊ฒ ์๋ํ๋๋ก ์ต์ ํ๋์์ต๋๋ค.
๋์ฉ๋ JSON ํ์ผ์ ํ์ด์ง์ ๋ก๋ํ๋ ๋์ ํ์ํ ์ฝํ ์ธ ๋ง ๋ก๋ํ์ธ์. Intlayer๋ ๋ฒ๋ค ๋ฐ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ต๋ 50% ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ฝํ ์ธ ์ ๋ฒ์๋ฅผ ์ง์ ํ๋ฉด ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฉ์ดํด์ง๋๋ค. ์ ์ฒด ์ฝํ ์ธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฒํ ํด์ผ ํ๋ ์ ์ ์ ๋ถ๋ด ์์ด ๋จ์ผ ๊ธฐ๋ฅ ํด๋๋ฅผ ๋ณต์ ํ๊ฑฐ๋ ์ญ์ ํ ์ ์์ต๋๋ค. ๋ํ Intlayer๋ ์์ ํ ์ ํ๋์ด ์ฝํ ์ธ ์ ์ ํ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
์ฝํ ์ธ ๋ฅผ ๊ฐ์ ์์น์ ๋ฐฐ์นํ๋ฉด LLM(๋ํ ์ธ์ด ๋ชจ๋ธ)์ ํ์ํ ์ปจํ ์คํธ๊ฐ ์ค์ด๋ญ๋๋ค. Intlayer์๋ ๋๋ฝ๋ ๋ฒ์ญ์ ํ ์คํธํ๊ธฐ ์ํ CLI, LSP, MCP ๋ฐ agent skills, AI ์์ด์ ํธ๋ฅผ ์ํ ๊ฐ๋ฐ์ ๊ฒฝํ(DX)์ ๋์ฑ ์ํํ๊ฒ ๋ง๋ญ๋๋ค.
AI ๊ณต๊ธ์์ ๋น์ฉ์ผ๋ก ์ ํํ LLM์ ์ฌ์ฉํ์ฌ CI/CD ํ์ดํ๋ผ์ธ์ ๋ฒ์ญํ๋ ค๋ฉด ์๋ํ๋ฅผ ์ฌ์ฉํ์ธ์. Intlayer๋ ๋ํ ์ฝํ ์ธ ์ถ์ถ์ ์๋ํํ๋ ์ปดํ์ผ๋ฌ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฒ์ญ์ ๋๋ ์น ํ๋ซํผ์ ์ ๊ณตํฉ๋๋ค.
๋๊ท๋ชจ JSON ํ์ผ์ ๊ตฌ์ฑ ์์์ ์ฐ๊ฒฐํ๋ฉด ์ฑ๋ฅ ๋ฐ ๋ฐ์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. Intlayer๋ ๋น๋ ์ ์ฝํ ์ธ ๋ก๋ฉ์ ์ต์ ํํฉ๋๋ค.
Intlayer๋ ๋จ์ํ i18n ์๋ฃจ์ ๊ทธ ์ด์์ผ๋ก ๊ด๋ฆฌ์ ๋์์ด ๋๋ ์์ฒด ํธ์คํ ๋น์ฃผ์ผ ํธ์ง๊ธฐ ๋ฐ ์ ์ฒด CMS๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค๊ตญ์ด ์ฝํ ์ธ ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ๊ณตํ์ฌ ๋ฒ์ญ๊ฐ, ์นดํผ๋ผ์ดํฐ, ๊ธฐํ ํ์๊ณผ ์ํํ๊ฒ ํ์ ํ ์ ์์ต๋๋ค. ์ฝํ ์ธ ๋ ๋ก์ปฌ ๋ฐ/๋๋ ์๊ฒฉ์ผ๋ก ์ ์ฅ๋ ์ ์์ต๋๋ค.
React Router v7 ์ ํ๋ฆฌ์ผ์ด์ ์์ Intlayer ์ค์ ๋จ๊ณ๋ณ ๊ฐ์ด๋
์์กด์ฑ ์ค์น
์ ํธํ๋ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํ์ธ์:
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
</Tab> </Tabs>
--interactiveํ๋๊ทธ๋ ์ ํ ์ฌํญ์ ๋๋ค. AI ์์ด์ ํธ์ธ ๊ฒฝ์ฐintlayer-cli init๋ฅผ ์ฌ์ฉํ์ธ์.์ด ๋ช ๋ น์ ํ๊ฒฝ์ ๊ฐ์งํ๊ณ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
intlayer
intlayer
๊ตฌ์ฑ ๊ด๋ฆฌ, ๋ฒ์ญ, ์ฝํ ์ธ ์ ์ธ, ํธ๋์คํ์ผ๋ง ๋ฐ CLI ๋ช ๋ น์ด๋ฅผ ์ํ ๊ตญ์ ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ ํต์ฌ ํจํค์ง์ ๋๋ค.react-intlayer
Intlayer๋ฅผ React ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํตํฉํ๋ ํจํค์ง๋ก, React ๊ตญ์ ํ๋ฅผ ์ํ ์ปจํ ์คํธ ์ ๊ณต์์ ํ ์ ์ ๊ณตํฉ๋๋ค.vite-intlayer
Intlayer๋ฅผ Vite ๋ฒ๋ค๋ฌ์ ํตํฉํ๊ธฐ ์ํ Vite ํ๋ฌ๊ทธ์ธ๊ณผ, ์ฌ์ฉ์์ ์ ํธ ๋ก์ผ์ผ ๊ฐ์ง, ์ฟ ํค ๊ด๋ฆฌ, URL ๋ฆฌ๋๋ ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฏธ๋ค์จ์ด๋ฅผ ํฌํจํฉ๋๋ค.@react-router/fs-routes React Router v7์ ์ํ ํ์ผ ์์คํ ๊ธฐ๋ฐ ๋ผ์ฐํ ์ ํ์ฑํํ๋ ํจํค์ง์ ๋๋ค.
ํ๋ก์ ํธ ๊ตฌ์ฑ
์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ์ด๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ config ํ์ผ์ ์์ฑํฉ๋๋ค:
intlayer.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
import { type IntlayerConfig, Locales } from "intlayer"; const config: IntlayerConfig = { internationalization: { defaultLocale: Locales.ENGLISH, locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], }, }; export default config;์ด ๊ตฌ์ฑ ํ์ผ์ ํตํด ๋ก์ปฌ๋ผ์ด์ฆ๋ URL, ๋ฏธ๋ค์จ์ด ๋ฆฌ๋ค์ด๋ ์ , ์ฟ ํค ์ด๋ฆ, ์ฝํ ์ธ ์ ์ธ์ ์์น ๋ฐ ํ์ฅ์, Intlayer ๋ก๊ทธ ๋นํ์ฑํ ๋ฑ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๋งค๊ฐ๋ณ์์ ์ ์ฒด ๋ชฉ๋ก์ ๊ตฌ์ฑ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
Vite ์ค์ ์ Intlayer ํตํฉ
intlayer ํ๋ฌ๊ทธ์ธ์ ์ค์ ์ ์ถ๊ฐํ์ธ์:
vite.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
intlayer()Vite ํ๋ฌ๊ทธ์ธ์ Intlayer๋ฅผ Vite์ ํตํฉํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฝํ ์ธ ์ ์ธ ํ์ผ์ ๋น๋๋ฅผ ๋ณด์ฅํ๊ณ ๊ฐ๋ฐ ๋ชจ๋์์ ์ด๋ฅผ ๋ชจ๋ํฐ๋งํฉ๋๋ค. Vite ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ Intlayer ํ๊ฒฝ ๋ณ์๋ฅผ ์ ์ํฉ๋๋ค. ๋ํ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ๋ณ์นญ์ ์ ๊ณตํฉ๋๋ค.React Router v7 ํ์ผ ์์คํ ๋ผ์ฐํธ ๊ตฌ์ฑ
ํ์ผ ์์คํ ๊ธฐ๋ฐ ๋ผ์ฐํธ๋ฅผ
flatRoutes๋ก ์ฌ์ฉํ๋๋ก ๋ผ์ฐํ ๊ตฌ์ฑ์ ์ค์ ํฉ๋๋ค:app/routes.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
@react-router/fs-routes์flatRoutesํจ์๋ ํ์ผ ์์คํ ๊ธฐ๋ฐ ๋ผ์ฐํ ์ ํ์ฑํํ๋ฉฐ,routes/๋๋ ํ ๋ฆฌ์ ํ์ผ ๊ตฌ์กฐ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ๋ก๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.ignoredRouteFiles์ต์ ์ Intlayer ์ฝํ ์ธ ์ ์ธ ํ์ผ(.content.ts๋ฑ)์ด ๋ผ์ฐํธ ํ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์๋๋ก ํฉ๋๋ค.๋ ์ด์์ ์ปดํฌ๋ํธ ์์ฑ
ํ์ผ ์์คํ ๋ผ์ฐํ ์ ์ฌ์ฉํ ๋๋ ํํํ ๋ช ๋ช ๊ท์น์ ์ฌ์ฉํ๋ฉฐ, ์ฌ๊ธฐ์ ์ (
.)์ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ๋ฅผ ๋ํ๋ด๊ณ ๊ดํธ()๋ ์ ํ์ ์ธ๊ทธ๋จผํธ๋ฅผ ๋ํ๋ ๋๋ค.app/routes/๋๋ ํ ๋ฆฌ์ ๋ค์ ํ์ผ๋ค์ ์์ฑํ์ธ์:ํ์ผ ๊ตฌ์กฐ
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋ช ๋ช ๊ท์น:
($locale)- ๋ก์ผ์ผ ํ๋ผ๋ฏธํฐ๋ฅผ ์ํ ์ ํ์ ๋์ ์ธ๊ทธ๋จผํธ_layout- ์์ ๊ฒฝ๋ก๋ฅผ ๋ํํ๋ ๋ ์ด์์ ๊ฒฝ๋ก_index- ์ธ๋ฑ์ค ๊ฒฝ๋ก (๋ถ๋ชจ ๊ฒฝ๋ก์์ ๋ ๋๋ง).(์ ) - ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ ๊ตฌ๋ถ (์:($locale).aboutโ/:locale?/about)
Layout ์ปดํฌ๋ํธ
app/root.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋ฃจํธ ๋ ์ด์์
app/components/localized-link.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
ํ์งํ๋ ํ ํ์ด์ง
app/routes/[lang]/page.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ฝํ ์ธ ์ ์ธ
์ฝํ ์ธ ์ ์ธ์ ์์ฑํ๊ณ ๊ด๋ฆฌํ์ฌ ๋ฒ์ญ์ ์ ์ฅํฉ๋๋ค. ์ฝํ ์ธ ํ์ผ์ ๊ฒฝ๋ก ํ์ผ ์์ ๋ฐฐ์นํฉ๋๋ค:
app/routes/($locale)._index.content.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
app/routes/($locale).about.content.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ฝํ ์ธ ์ ์ธ์
contentDir๋๋ ํ ๋ฆฌ์ ํฌํจ๋๋ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ ๊ณณ์๋ ์ ์ํ ์ ์์ต๋๋ค(๊ธฐ๋ณธ๊ฐ:./app). ๊ทธ๋ฆฌ๊ณ ์ฝํ ์ธ ์ ์ธ ํ์ผ ํ์ฅ์์ ์ผ์นํด์ผ ํฉ๋๋ค(๊ธฐ๋ณธ๊ฐ:.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).useIntlayerํ ์ ๋ํด ๋ ์์๋ณด๋ ค๋ฉด ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.๊ธฐ์กด ์ฑ์ด ์๋ ๊ฒฝ์ฐ Intlayer Compiler ๋ฐ extract command๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ํ ๋ฒ์ ๋ณํํ ์ ์์ต๋๋ค.
๋ก์ผ์ผ ์ธ์ ์ปดํฌ๋ํธ ์์ฑ
๋ก์ผ์ผ ์ธ์ ๋ค๋น๊ฒ์ด์ ์ ์ํ
LocalizedLink์ปดํฌ๋ํธ๋ฅผ ์์ฑํฉ๋๋ค:app/components/localized-link.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋ก์ปฌ๋ผ์ด์ฆ๋ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ค๋ฉด
useLocalizedNavigatehook์ ์ฌ์ฉํ ์ ์์ต๋๋ค:app/hooks/useLocalizedNavigate.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋ก์ผ์ผ ์ค์์ฒ ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
์ฌ์ฉ์๊ฐ ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ง๋์ธ์:
app/components/locale-switcher.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
useLocaleํ ์ ๋ํด ๋ ์์๋ณด๋ ค๋ฉด ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.HTML ์์ฑ ๊ด๋ฆฌ ์ถ๊ฐ (์ ํ ์ฌํญ)
์ ํ์ฌํญHTML์ lang ๋ฐ dir ์์ฑ์ ๊ด๋ฆฌํ๋ ํ ์ ๋ง๋ญ๋๋ค:
app/hooks/useI18nHTMLAttributes.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ด hook์ ์ด๋ฏธ Step 5์์ ๋ณด์ฌ์ง ๋ ์ด์์ ์ปดํฌ๋ํธ(
($locale)._layout.tsx)์์ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.๋ฏธ๋ค์จ์ด ์ถ๊ฐ
intlayerProxy๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ ์ธก ๋ผ์ฐํ ์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค. ์ด ํ๋ฌ๊ทธ์ธ์ URL์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ๋ก์ผ์ผ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ์ ์ ํ ๋ก์ผ์ผ ์ฟ ํค๋ฅผ ์ค์ ํฉ๋๋ค. ๋ก์ผ์ผ์ด ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ธ์ด ๊ธฐ๋ณธ ์ค์ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ฅ ์ ์ ํ ๋ก์ผ์ผ์ ๊ฒฐ์ ํฉ๋๋ค. ๋ก์ผ์ผ์ด ๊ฐ์ง๋์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๋ก์ผ์ผ๋ก ๋ฆฌ๋๋ ์ ๋ฉ๋๋ค.intlayerProxy๋ฅผ ํ๋ก๋์ ์์ ์ฌ์ฉํ๋ ค๋ฉดvite-intlayerํจํค์ง๋ฅผdevDependencies์์dependencies๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.๊ทธ๋ฐ ๋ค์ ๋ฃจํธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ์ธ์:
app/routes/layout.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ปดํฌ๋ํธ์์ ์ฝํ ์ธ ์ถ์ถ
์ ํ์ฌํญ๊ธฐ์กด codebase๊ฐ ์๋ ๊ฒฝ์ฐ, ์์ฒ ๊ฐ์ ํ์ผ์ ๋ณํํ๋ ๊ฒ์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
์ด ๊ณผ์ ์ ์ฝ๊ฒ ํ๊ธฐ ์ํด Intlayer๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณํํ๊ณ ์ฝํ ์ธ ๋ฅผ ์ถ์ถํ๊ธฐ ์ํ compiler / extractor๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด๋ฅผ ์ค์ ํ๋ ค๋ฉด
intlayer.config.tsํ์ผ์compiler์น์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค:intlayer.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
import { type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { // ... Rest of your config compiler: { /** * ์ปดํ์ผ๋ฌ๋ฅผ ํ์ฑํํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. */ enabled: true, /** * ์ถ๋ ฅ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค. */ output: ({ fileName, extension }) => `./${fileName}${extension}`, /** * ๋ณํ๋ ํ ์ปดํฌ๋ํธ๋ฅผ ์ ์ฅํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. * * - `true`์ธ ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๋ ์ปดํฌ๋ํธ ํ์ผ์ ๋์คํฌ์ ๋ค์ ์์ฑํฉ๋๋ค. ๋ฐ๋ผ์ ๋ณํ์ด ์๊ตฌ์ ์ด๋ฉฐ, ์ปดํ์ผ๋ฌ๋ ๋ค์ ํ๋ก์ธ์ค์์ ๋ณํ์ ๊ฑด๋๋๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์ฑ์ ๋ณํํ ์ ์์ผ๋ฉฐ, ๊ทธ ํ ์ ๊ฑฐํ ์ ์์ต๋๋ค. * * - `false`์ธ ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๋ `useIntlayer()` ํจ์ ํธ์ถ์ ๋น๋ ์ถ๋ ฅ์ ์ฝ๋์๋ง ์ฃผ์ ํ๊ณ ๊ธฐ๋ณธ codebase๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ๋ณํ์ ๋ฉ๋ชจ๋ฆฌ์์๋ง ์ํ๋ฉ๋๋ค. */ saveComponents: false, /** * ๋์ ๋๋ฆฌ ํค ์ ๋์ฌ */ dictionaryKeyPrefix: "", }, }; export default config;extractor๋ฅผ ์คํํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ณํํ๊ณ ์ฝํ ์ธ ๋ฅผ ์ถ์ถํฉ๋๋ค
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
v9 ์ดํ๋ก,
intlayerCompiler๊ฐintlayerํ๋ฌ๊ทธ์ธ์ ํฌํจ๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋์ผ๋ก ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค.vite.config.ts๋ฅผ ์ ๋ฐ์ดํธํ์ฌintlayerCompilerํ๋ฌ๊ทธ์ธ์ ํฌํจํ์ธ์:vite.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Configure TypeScript
Intlayer uses module augmentation to get benefits of TypeScript and make your codebase stronger.
Ensure your TypeScript configuration includes the autogenerated types:
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Git Configuration
It is recommended to ignore the files generated by Intlayer. This allows you to avoid committing them to your Git repository.
To do this, you can add the following instructions to your .gitignore file:
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
VS Code Extension
To improve your development experience with Intlayer, you can install the official Intlayer VS Code Extension.
Install from the VS Code Marketplace
This extension provides:
- Autocompletion for translation keys.
- Real-time error detection for missing translations.
- Inline previews of translated content.
- Quick actions to easily create and update translations.
For more details on how to use the extension, refer to the Intlayer VS Code Extension documentation.
Go Further
To go further, you can implement the visual editor or externalize your content using the CMS.
๋ฌธ์ ์ฐธ์กฐ
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ Intlayer๋ฅผ React Router v7๊ณผ ํตํฉํ์ฌ ๋ก์ผ์ผ ์ธ์ ๋ผ์ฐํ ๊ณผ TypeScript ์ง์์ด ํฌํจ๋ ์์ ํ ๊ตญ์ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ ๊ณตํฉ๋๋ค.
