์ด ํ์ด์ง์๋ ์ ํ๋ฆฌ์ผ์ด์ ํ ํ๋ฆฟ์ด ์ ๊ณต๋ฉ๋๋ค.
์ด ํ์ด์ง๋ ํ ํ๋ฆฟ์ ๋ผ์ด๋ธ ๋ฐ๋ชจ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ด ํ์ด์ง์ ์ํ๋ AI ์ด์์คํดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ฝํฉ๋๋ค
๋ฒ์ ๊ธฐ๋ก
- "Solid useIntlayer API ์ฌ์ฉ๋ฒ์ ์ง์ ์์ฑ ์ก์ธ์ค๋ก ์
๋ฐ์ดํธ"v8.9.02026. 5. 4.
- "init ๋ช
๋ น์ด ์ถ๊ฐ"v8.0.02025. 12. 30.
- "ํ์คํ ๋ฆฌ ์ด๊ธฐํ"v5.5.102025. 6. 29.
์ด ํ์ด์ง์ ์ฝํ ์ธ ๋ AI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ๋์์ต๋๋ค.
์์ด ์๋ณธ ๋ด์ฉ์ ์ต์ ๋ฒ์ ์ ๋ณด๊ธฐ์ด ๋ฌธ์๋ฅผ ๊ฐ์ ํ ์์ด๋์ด๊ฐ ์์ผ์๋ฉด GitHub์ ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ์ฌ ์์ ๋กญ๊ฒ ๊ธฐ์ฌํด ์ฃผ์ธ์.
๋ฌธ์์ ๋ํ GitHub ๋งํฌ๋ฌธ์์ Markdown์ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Intlayer๋ฅผ ์ฌ์ฉํ์ฌ Angular 19 (Webpack) ์น์ฌ์ดํธ ๋ฒ์ญํ๊ธฐ | ๊ตญ์ ํ (i18n)
๋ชฉ์ฐจ
๋์๋ณด๋ค Intlayer๋ฅผ ์ ํํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
'ngx-translate' ๋๋ 'angular-l10n'๊ณผ ๊ฐ์ ์ฃผ์ ์๋ฃจ์ ๊ณผ ๋น๊ตํ ๋ Intlayer๋ ๋ค์๊ณผ ๊ฐ์ ํตํฉ ์ต์ ํ๊ฐ ์ ๊ณต๋๋ ์๋ฃจ์ ์ ๋๋ค.
Intlayer๋ ๊ตฌ์ฑ ์์ ์์ค ์ฝํ ์ธ ๋ฒ์ ์ง์ , ์ง์ฐ ๋ก๋ ๋ฒ์ญ ๋ฐ ๊ตญ์ ํ ํ์ฅ(i18n)์ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ Angular์ ์๋ฒฝํ๊ฒ ์๋ํ๋๋ก ์ต์ ํ๋์์ต๋๋ค.
๋์ฉ๋ JSON ํ์ผ์ ํ์ด์ง์ ๋ก๋ํ๋ ๋์ ํ์ํ ์ฝํ ์ธ ๋ง ๋ก๋ํ์ธ์. Intlayer๋ ๋ฒ๋ค ๋ฐ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ต๋ 50% ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ฝํ ์ธ ์ ๋ฒ์๋ฅผ ์ง์ ํ๋ฉด ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฉ์ดํด์ง๋๋ค. ์ ์ฒด ์ฝํ ์ธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฒํ ํด์ผ ํ๋ ์ ์ ์ ๋ถ๋ด ์์ด ๋จ์ผ ๊ธฐ๋ฅ ํด๋๋ฅผ ๋ณต์ ํ๊ฑฐ๋ ์ญ์ ํ ์ ์์ต๋๋ค. ๋ํ Intlayer๋ ์์ ํ ์ ํ๋์ด ์ฝํ ์ธ ์ ์ ํ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
์ฝํ ์ธ ๋ฅผ ๊ฐ์ ์์น์ ๋ฐฐ์นํ๋ฉด LLM(๋ํ ์ธ์ด ๋ชจ๋ธ)์ ํ์ํ ์ปจํ ์คํธ๊ฐ ์ค์ด๋ญ๋๋ค. Intlayer์๋ ๋๋ฝ๋ ๋ฒ์ญ์ ํ ์คํธํ๊ธฐ ์ํ CLI, LSP, MCP ๋ฐ agent skills, AI ์์ด์ ํธ๋ฅผ ์ํ ๊ฐ๋ฐ์ ๊ฒฝํ(DX)์ ๋์ฑ ์ํํ๊ฒ ๋ง๋ญ๋๋ค.
AI ๊ณต๊ธ์์ ๋น์ฉ์ผ๋ก ์ ํํ LLM์ ์ฌ์ฉํ์ฌ CI/CD ํ์ดํ๋ผ์ธ์ ๋ฒ์ญํ๋ ค๋ฉด ์๋ํ๋ฅผ ์ฌ์ฉํ์ธ์. Intlayer๋ ๋ํ ์ฝํ ์ธ ์ถ์ถ์ ์๋ํํ๋ ์ปดํ์ผ๋ฌ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฒ์ญ์ ๋๋ ์น ํ๋ซํผ์ ์ ๊ณตํฉ๋๋ค.
๋๊ท๋ชจ JSON ํ์ผ์ ๊ตฌ์ฑ ์์์ ์ฐ๊ฒฐํ๋ฉด ์ฑ๋ฅ ๋ฐ ๋ฐ์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. Intlayer๋ ๋น๋ ์ ์ฝํ ์ธ ๋ก๋ฉ์ ์ต์ ํํฉ๋๋ค.
Intlayer๋ ๋จ์ํ i18n ์๋ฃจ์ ๊ทธ ์ด์์ผ๋ก ๊ด๋ฆฌ์ ๋์์ด ๋๋ ์์ฒด ํธ์คํ ๋น์ฃผ์ผ ํธ์ง๊ธฐ ๋ฐ ์ ์ฒด CMS๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค๊ตญ์ด ์ฝํ ์ธ ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ๊ณตํ์ฌ ๋ฒ์ญ๊ฐ, ์นดํผ๋ผ์ดํฐ, ๊ธฐํ ํ์๊ณผ ์ํํ๊ฒ ํ์ ํ ์ ์์ต๋๋ค. ์ฝํ ์ธ ๋ ๋ก์ปฌ ๋ฐ/๋๋ ์๊ฒฉ์ผ๋ก ์ ์ฅ๋ ์ ์์ต๋๋ค.
Angular ์ ํ๋ฆฌ์ผ์ด์ ์์ Intlayer๋ฅผ ์ค์ ํ๊ธฐ ์ํ ๋จ๊ณ๋ณ ๊ฐ์ด๋
GitHub์์ ์ ํ๋ฆฌ์ผ์ด์ ํ ํ๋ฆฟ์ ํ์ธํ์ธ์.
์ข ์์ฑ ์ค์น
npm์ ์ฌ์ฉํ์ฌ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค:
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
--interactiveํ๋๊ทธ๋ ์ ํ ์ฌํญ์ ๋๋ค. AI ์์ด์ ํธ์ธ ๊ฒฝ์ฐintlayer-cli init๋ฅผ ์ฌ์ฉํ์ธ์.์ด ๋ช ๋ น์ ํ๊ฒฝ์ ๊ฐ์งํ๊ณ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
intlayer
๊ตฌ์ฑ ๊ด๋ฆฌ, ๋ฒ์ญ, ์ฝํ ์ธ ์ ์ธ, ํธ๋์คํ์ผ ๋ฐ CLI ๋ช ๋ น์ด๋ฅผ ์ํ ๊ตญ์ ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ ํต์ฌ ํจํค์ง์ ๋๋ค.
angular-intlayer Intlayer๋ฅผ Angular ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํตํฉํ๋ ํจํค์ง์ ๋๋ค. Angular ๊ตญ์ ํ๋ฅผ ์ํ ์ปจํ ์คํธ ๊ณต๊ธ์์ ํ ์ ์ ๊ณตํฉ๋๋ค.
@angular-builders/custom-webpack Angular CLI์ Webpack ๊ตฌ์ฑ์ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐ ํ์ํฉ๋๋ค.
ํ๋ก์ ํธ ๊ตฌ์ฑ
์ํคํ ์ฒ
์ด ์ํคํ ์ฒ์์
angular-intlayer๋provideIntlayer()๋ฅผ ์ ๊ณตํ๋ฉฐ,src/app/app.config.ts์ ๋ฑ๋ก๋์ด ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐuseIntlayer์๊ทธ๋์ ํตํด ์ฝํ ์ธ ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค. Angular CLI๋ ์ปค์คํ Webpack ๋น๋๋ก ์ ํ๋๋ฉฐ,webpack.config.ts๋ Intlayer ํ๋ฌ๊ทธ์ธ์ ๋น๋์ ๋ณํฉํ์ฌ ์ฝํ ์ธ ์ ์ธ์ ๊ฐ์ํ๊ณ ๋ค์ ๋น๋ํฉ๋๋ค. ์ฝํ ์ธ ์ ์ธ์src/app/์ ์ปดํฌ๋ํธ์ ํจ๊ป ๋ฐฐ์น๋ฉ๋๋ค.bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ค์
์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ์ด๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ ์ค์ ํ์ผ์ ์์ฑํฉ๋๋ค:
intlayer.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // ๊ธฐํ ๋ก์ผ์ผ ], defaultLocale: Locales.ENGLISH, }, }; export default config;์ด ๊ตฌ์ฑ ํ์ผ์ ํตํด ๋ก์ปฌ๋ผ์ด์ฆ๋ URL, ๋ฏธ๋ค์จ์ด ๋ฆฌ๋ค์ด๋ ์ , ์ฟ ํค ์ด๋ฆ, ์ฝํ ์ธ ์ ์ธ์ ์์น ๋ฐ ํ์ฅ์, ์ฝ์์์์ Intlayer ๋ก๊ทธ ๋นํ์ฑํ ๋ฑ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ๋งค๊ฐ๋ณ์์ ์ ์ฒด ๋ชฉ๋ก์ ๊ตฌ์ฑ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
Angular ๊ตฌ์ฑ์ Intlayer ํตํฉ
Intlayer๋ฅผ Angular CLI์ ํตํฉํ๋ ค๋ฉด ์ฌ์ฉ์ ์ ์ ๋น๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ Webpack(๋๋ถ๋ถ์ Angular ํ๋ก์ ํธ์ ๊ธฐ๋ณธ๊ฐ)์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋จผ์ ,
angular.json์ ์์ ํ์ฌ ์ฌ์ฉ์ ์ ์ Webpack ๋น๋๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค.build๋ฐserve๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํ์ธ์:angular.json์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
angular.json์์your-app-name์ ์ค์ ํ๋ก์ ํธ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ์ธ์.๋ค์์ผ๋ก, ํ๋ก์ ํธ ๋ฃจํธ์
webpack.config.tsํ์ผ์ ์์ฑํฉ๋๋ค:webpack.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
mergeConfigํจ์๋ Intlayer๋ก Webpack์ ๊ตฌ์ฑํฉ๋๋ค.IntlayerPlugin(์ฝํ ์ธ ์ ์ธ ํ์ผ ์ฒ๋ฆฌ์ฉ)์ ์ฃผ์ ํ๊ณ ์ต์ ์ ์ฑ๋ฅ์ ์ํ ๋ณ์นญ(alias)์ ์ค์ ํฉ๋๋ค.์ฝํ ์ธ ์ ์ธ
๋ฒ์ญ์ ์ ์ฅํ๊ธฐ ์ํด ์ฝํ ์ธ ์ ์ธ์ ์์ฑํ๊ณ ๊ด๋ฆฌํฉ๋๋ค:
์ฝํ ์ธ ์ ์ธ์
contentDir๋๋ ํ ๋ฆฌ(๊ธฐ๋ณธ๊ฐ./src)์ ํฌํจ๋์ด ์๊ณ ์ฝํ ์ธ ์ ์ธ ํ์ผ ํ์ฅ์(๊ธฐ๋ณธ๊ฐ.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})์ ์ผ์นํ๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด๋์์๋ ์ ์ํ ์ ์์ต๋๋ค.์์ธํ ๋ด์ฉ์ ์ฝํ ์ธ ์ ์ธ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
์ฝ๋์์ Intlayer ํ์ฉ
Angular ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ Intlayer์ ๊ตญ์ ํ ๊ธฐ๋ฅ์ ํ์ฉํ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ์ Intlayer๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
src/app/app.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๊ทธ๋ฐ ๋ค์, ๋ชจ๋ ์ปดํฌ๋ํธ ๋ด์์
useIntlayerํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.src/app/app.component.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๊ทธ๋ฆฌ๊ณ ํ ํ๋ฆฟ์์:
src/app/app.component.html์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Intlayer ์ฝํ ์ธ ๋
Signal๋ก ๋ฐํ๋๋ฏ๋ก ์๊ทธ๋์ ํธ์ถํ์ฌ ๊ฐ์ ์ก์ธ์คํฉ๋๋ค:content().title.์ฝํ ์ธ ์ธ์ด ๋ณ๊ฒฝ
์ ํ์ฌํญ์ฝํ ์ธ ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด
useLocaleํจ์์์ ์ ๊ณตํ๋setLocaleํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก์ผ์ผ์ ์ค์ ํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ฝํ ์ธ ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.์ธ์ด๋ฅผ ์ ํํ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํฉ๋๋ค:
src/app/locale-switcher.component.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๊ทธ๋ฐ ๋ค์,
app.component.ts์์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค:src/app/app.component.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
TypeScript ๊ตฌ์ฑ
Intlayer๋ TypeScript์ ์ด์ ์ ํ์ฉํ๊ณ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋์ฑ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ชจ๋ ๋ณด๊ฐ(module augmentation)์ ์ฌ์ฉํฉ๋๋ค.


TypeScript ๊ตฌ์ฑ์ ์๋ ์์ฑ๋ ํ์ ์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ์ธ์.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Git ๊ตฌ์ฑ
Intlayer์์ ์์ฑ๋ ํ์ผ์ ๋ฌด์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฅผ ํตํด Git ์ ์ฅ์์ ์ปค๋ฐ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ ค๋ฉด .gitignore ํ์ผ์ ๋ค์ ์ง์นจ์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค:
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
VS Code ํ์ฅ ํ๋ก๊ทธ๋จ
Intlayer ๊ฐ๋ฐ ๊ฒฝํ์ ๊ฐ์ ํ๊ธฐ ์ํด ๊ณต์ Intlayer VS Code Extension์ ์ค์นํ ์ ์์ต๋๋ค.
VS Code ๋ง์ผํ๋ ์ด์ค์์ ์ค์น
์ด ํ์ฅ ํ๋ก๊ทธ๋จ์ ๋ค์์ ์ ๊ณตํฉ๋๋ค:
- ๋ฒ์ญ ํค์ ๋ํ ์๋ ์์ฑ.
- ๋๋ฝ๋ ๋ฒ์ญ์ ๋ํ ์ค์๊ฐ ์ค๋ฅ ๊ฐ์ง.
- ๋ฒ์ญ๋ ์ฝํ ์ธ ์ ์ธ๋ผ์ธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ.
- ๋ฒ์ญ์ ์ฝ๊ฒ ์์ฑํ๊ณ ์ ๋ฐ์ดํธํ ์ ์๋ ๋น ๋ฅธ ์์ .
ํ์ฅ ํ๋ก๊ทธ๋จ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ Intlayer VS Code Extension ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ ์์๋ณด๊ธฐ
๋ ์์ธํ ์์๋ณด๋ ค๋ฉด ๋น์ฃผ์ผ ์๋ํฐ๋ฅผ ๊ตฌํํ๊ฑฐ๋ CMS๋ฅผ ์ฌ์ฉํ์ฌ ์ฝํ ์ธ ๋ฅผ ์ธ๋ถํํ ์ ์์ต๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
@angular/localize(๋ด์ฅ i18n): ๋ฉ์์ง๊ฐ XLIFF๋ก ์ถ์ถ๋๊ณ ๊ฐ ๋ก์ผ์ผ์ด ์์ฒด ๋น๋๋ก ์ปดํ์ผ๋๋ฏ๋ก ์ธ์ด๋น ํ๋์ ๋ฐฐํฌ ๊ฒฐ๊ณผ๋ฌผ์ด ์์ฑ๋๊ณ ๋ฐํ์ ๋ก์ผ์ผ ์ ํ์ด ์ง์๋์ง ์์ต๋๋ค.ngx-translate๋ฐTransloco: ์๋น์ค๋ฅผ ํตํด ๋ก๋๋๋ ๋ฐํ์ JSON ์นดํ๋ก๊ทธ ๋ฐฉ์์ผ๋ก ๋ก์ผ์ผ ์ ํ์ ๊ฐ๋ฅํ์ง๋ง ๋น๋ ํ์ ํ์ ์์ ์ฑ์ด ๋ถ์กฑํฉ๋๋ค.Intlayer: ๊ฐ์ฅ ์ง๋ณด๋ ์๋ฃจ์ ์ ๋๋ค. ์ฝ๋๋ฒ ์ด์ค ์ด๋์๋ ์ฝํ ์ธ ๋ฅผ ์ ์ธํ ์ ์์ผ๋ฉฐ(๊ฐ ์ปดํฌ๋ํธ ์ ๋๋ ์ค์ ์ง์ค์), ๋น๋ ํ์์ ์ปดํ์ผ๋๊ณ , ์์ ํ ํ์ ์์ ์ฑ์ ์ ๊ณตํ๋ฉฐ ๋ฐํ์ ๋ก์ผ์ผ ์ ํ, AI ๋ฒ์ญ, ๋น์ฃผ์ผ ์๋ํฐ ๋ฐ CMS๋ฅผ ์ง์ํฉ๋๋ค.
์ด ๊ฐ์ด๋๋ Angular 19๋ฅผ ๋ค๋ฃน๋๋ค. Angular 21 ์ด์์ Angular ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์. ์ Intlayer์ธ๊ฐ๋ ํ์ธํ์ธ์.
๋ค์์คํ์ด์ค ๊ธฐ๋ฐ ์ค์ ๋ณด๋ค ํจ์ฌ ์ ์ต๋๋ค. ํ์ด์ง๋ ๋ ๋๋งํ์ง ์๋ ์ธ์ด์ ์นดํ๋ก๊ทธ๋ฅผ ์ ๋ ๋ค์ด๋ก๋ํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋น๋ ํ์ ์ปดํ์ผ๋ฌ๋ useIntlayer ํธ์ถ์ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉํ๋ ์ ํํ ์ฌ์ ํญ๋ชฉ์ผ๋ก ๋์ฒดํ๋ฏ๋ก ์ฌ์ฉ๋์ง ์๋ ํค์ ์ธ์ด๋ ์ ๊ฑฐ๋๊ณ , ๋์ ์ฌ์ ์ ํตํด ๋ก์ผ์ผ๋ณ๋ก ๋ถํ ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋์๋ค๊ณผ ๋น๊ตํ์ ๋ Intlayer๋ ๋ฒ๋ค ๋ฐ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ต๋ 50%๊น์ง ์ค์ฌ์ค๋๋ค. ๋ฒ๋ค ์ต์ ํ์ ๋ฒค์น๋งํฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋๋ถ๋ถ ๊ฐ๋ฅํฉ๋๋ค. ์ฝํ ์ธ ๋ฅผ ์ด์ ํ๋ ค๋ฉด ngx-translate ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋ ๋๋ Transloco ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋๋ฅผ ๋ฐ๋ฅด์ธ์. ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์๋ ์์ต๋๋ค: sync JSON ํ๋ฌ๊ทธ์ธ์ ๊ธฐ์กด JSON ์นดํ๋ก๊ทธ๋ฅผ ๋จ์ผ ์ง์ค ๊ณต๊ธ์(source of truth)์ผ๋ก ์ ์งํ๋ฉด์ Intlayer ์ฌ์ ์ ์์ฑํ๋ฏ๋ก ํ ํ๋ฆฟ์ ํ๋์ฉ ์ด์ ํ๋ ๋์ ๋ ๊ณ์ธต์ ๋๊ธฐํ๊ฐ ์ ์ง๋ฉ๋๋ค.
๋ค. sync JSON ํ๋ฌ๊ทธ์ธ์ /messages/{locale}/{namespace}.json ํ์ผ์ ๋จ์ผ ์ง์ค ๊ณต๊ธ์(source of truth)์ผ๋ก ์ ์งํ๋ฉด์ ์๋ฐฉํฅ์ผ๋ก Intlayer ์ฌ์ ์ ์์ฑํฉ๋๋ค. sync PO ํ๋ฌ๊ทธ์ธ์ gettext ์นดํ๋ก๊ทธ์ ๋ํด ๋์ผํ ์์
์ ์ํํ๋ฉฐ, ๋ก์ผ์ผ๋ณ ํ์ผ์ ํตํด ๋ก์ผ์ผ์ ํ ํ์ผ์ ๋ชจ์ผ๋ ๋์ ์ธ์ด๋ณ๋ก ์ฝํ
์ธ ๋ฅผ ๋ถํ ํ ์๋ ์์ต๋๋ค.
์๋๋๋ค. npx intlayer extract๋ฅผ ์คํํ๋ฉด Intlayer๊ฐ ์์ค ํ์ผ์ ์ฝ๊ณ ์ฌ์ฉ์ ๋๋ฉด ๋ฌธ์์ด์ ์ถ์ถํ์ฌ ๊ฐ ์ปดํฌ๋ํธ ์์ .content ํ์ผ์ ์์ฑํ๋ฏ๋ก ์นดํ๋ก๊ทธ์ ์ผ์ผ์ด ๋ณต์ฌํ ํ์ ์์ด diff๋ง ๊ฒํ ํ๋ฉด ๋ฉ๋๋ค. extract ๋ช
๋ น์ ์ฐธ์กฐํ์ธ์.
์์ ์๋ํ๋ ํ์ดํ๋ผ์ธ์ ์ํด Intlayer ์ปดํ์ผ๋ฌ๋ ๋น๋ ํ์์ JSX, TSX, Vue ๋ฐ Svelte ์์ค์์ ๋์ผํ ์์ ์ ์ํํ์ฌ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฌ์ ์ ์์ฑํ๋ฏ๋ก ์๋์ผ๋ก ํค๋ฅผ ๊ด๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ ๋ถ์์ผ๋ก ์๋ํ๋ฏ๋ก ๋ฐํ์์๋ง ์กด์ฌํ๋ ๋ฌธ์์ด์ ์ ์ธ๋๋ฉฐ, ์ฌ์ฉ์ ํ ์คํธ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ๊ตฌ๋ถํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ฃผ์์ด ํ์ํฉ๋๋ค.
5๊ฐ์ง ๋๊ตฌ๊ฐ ๋ชจ๋ ์ ํ ์ฌํญ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค:
- VS Code ํ์ฅ ํ๋ก๊ทธ๋จ:
useIntlayerํค์์ ์ด๋ฅผ ์ ์ธํ ์ฝํ ์ธ ํ์ผ๋ก ๋ฐ๋ก ์ด๋ํ๊ณ , ์ปดํฌ๋ํธ์์ ์ฝํ ์ธ ๋ฅผ ์ถ์ถํ๋ฉฐ, ๋ช ๋ น ํ๋ ํธ๋ ์ ์ฉ Intlayer ํญ์์ build, fill, test, push, pull์ ์คํํ ์ ์์ต๋๋ค. - LSP ์๋ฒ: LSP๋ฅผ ์ง์ํ๋ ๋ชจ๋ ์๋ํฐ์์ ์ ์๋ก ์ด๋, ๋ชจ๋ ์ฐธ์กฐ ์ฐพ๊ธฐ, ๋ฒ์ญ ๊ฐ ๋ง์ฐ์ค ์ค๋ฒ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ํค ๋ฐ ํ๋ ์๋ ์์ฑ, ์ ์ธ๋์ง ์์ ํค์ ๋ํ ๊ฒฝ๊ณ ๋ฑ ๋์ผํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ํ
i18next,react-i18next,next-intl,use-intlํธ์ถ๋ ํด์ํ๋ฏ๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ์ฉํฉ๋๋ค. - MCP ์๋ฒ: Cursor, VS Code, Claude Desktop, Claude Code, ChatGPT์ Intlayer ๋ฌธ์์ CLI๋ฅผ ๋
ธ์ถํ์ฌ AI ์ด์์คํดํธ๊ฐ ์ต์ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํํ ๋ต๋ณํ๊ณ
intlayer fill๋ฑ์ ๋ช ๋ น์ ์ง์ ์คํํ ์ ์๊ฒ ํฉ๋๋ค. - Agent Skills:
intlayer-config,intlayer-cli,intlayer-content๋ฐ ๊ฐ ํ๋ ์์ํฌ ์ ์ฉ ์คํฌ์ ํตํด AI ์์ด์ ํธ์๊ฒ ๋ผ์ฐํ ์ค์ ๊ณผ ์ฝํ ์ธ ๋ ธ๋ ํ์ ์ ํ์ต์ํต๋๋ค. - ESLint ํ๋ฌ๊ทธ์ธ:
no-raw-text๊ท์น์ผ๋ก ํ๋์ฝ๋ฉ๋ ๋ฌธ์์ด์ ํ์ํ๊ณ , ์ ์ ์ฌ์ ํค ๋ฐ ์ฌ์ฉ๋์ง ์๋ ์ฝํ ์ธ ์ ๋ํ ์ถ๊ฐ ๊ท์น์ ์ ๊ณตํฉ๋๋ค.
