์ด ํ์ด์ง์๋ ์ ํ๋ฆฌ์ผ์ด์ ํ ํ๋ฆฟ์ด ์ ๊ณต๋ฉ๋๋ค.
์ด ํ์ด์ง๋ ํ ํ๋ฆฟ์ ๋ผ์ด๋ธ ๋ฐ๋ชจ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ด ํ์ด์ง์ ์ํ๋ AI ์ด์์คํดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ฝํฉ๋๋ค
๋ฒ์ ๊ธฐ๋ก
- "Solid useIntlayer API ์ฌ์ฉ๋ฒ์ ์ง์ ์์ฑ ์ก์ธ์ค๋ก ์
๋ฐ์ดํธ"v8.9.02026. 5. 4.
- "Astro + Lit๋ฅผ ์ํ ์ด๊ธฐ ๋ฌธ์"v8.7.72026. 4. 24.
์ด ํ์ด์ง์ ์ฝํ ์ธ ๋ AI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ๋์์ต๋๋ค.
์์ด ์๋ณธ ๋ด์ฉ์ ์ต์ ๋ฒ์ ์ ๋ณด๊ธฐ์ด ๋ฌธ์๋ฅผ ๊ฐ์ ํ ์์ด๋์ด๊ฐ ์์ผ์๋ฉด GitHub์ ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ์ฌ ์์ ๋กญ๊ฒ ๊ธฐ์ฌํด ์ฃผ์ธ์.
๋ฌธ์์ ๋ํ GitHub ๋งํฌ๋ฌธ์์ Markdown์ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Intlayer๋ฅผ ์ฌ์ฉํ์ฌ Astro + Lit ์ฌ์ดํธ ๋ฒ์ญํ๊ธฐ | ๊ตญ์ ํ (i18n)
๋ชฉ์ฐจ
๋์๋ณด๋ค Intlayer๋ฅผ ์ ํํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
'astro-i18n' ๋๋ 'i18next'์ ๊ฐ์ ์ฃผ์ ์๋ฃจ์ ๊ณผ ๋น๊ตํ ๋ Intlayer๋ ๋ค์๊ณผ ๊ฐ์ ํตํฉ ์ต์ ํ๊ฐ ์ ๊ณต๋๋ ์๋ฃจ์ ์ ๋๋ค.
Intlayer๋ ๋ค๊ตญ์ด ๋ผ์ฐํ , ์ฌ์ดํธ๋งต ๋ฐ ๊ตญ์ ํ ํ์ฅ(i18n)์ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ Astro์ ์๋ฒฝํ๊ฒ ์๋ํ๋๋ก ์ต์ ํ๋์ด ์์ต๋๋ค.
๋์ฉ๋ JSON ํ์ผ์ ํ์ด์ง์ ๋ก๋ํ๋ ๋์ ํ์ํ ์ฝํ ์ธ ๋ง ๋ก๋ํ์ธ์. Intlayer๋ ๋ฒ๋ค ๋ฐ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ต๋ 50% ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ฝํ ์ธ ์ ๋ฒ์๋ฅผ ์ง์ ํ๋ฉด ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฉ์ดํด์ง๋๋ค. ์ ์ฒด ์ฝํ ์ธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฒํ ํด์ผ ํ๋ ์ ์ ์ ๋ถ๋ด ์์ด ๋จ์ผ ๊ธฐ๋ฅ ํด๋๋ฅผ ๋ณต์ ํ๊ฑฐ๋ ์ญ์ ํ ์ ์์ต๋๋ค. ๋ํ Intlayer๋ ์์ ํ ์ ํ๋์ด ์ฝํ ์ธ ์ ์ ํ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
์ฝํ ์ธ ๋ฅผ ๊ฐ์ ์์น์ ๋ฐฐ์นํ๋ฉด LLM(๋ํ ์ธ์ด ๋ชจ๋ธ)์ ํ์ํ ์ปจํ ์คํธ๊ฐ ์ค์ด๋ญ๋๋ค. Intlayer์๋ ๋๋ฝ๋ ๋ฒ์ญ์ ํ ์คํธํ๊ธฐ ์ํ CLI, LSP, MCP ๋ฐ agent skills, AI ์์ด์ ํธ๋ฅผ ์ํ ๊ฐ๋ฐ์ ๊ฒฝํ(DX)์ ๋์ฑ ์ํํ๊ฒ ๋ง๋ญ๋๋ค.
AI ๊ณต๊ธ์์ ๋น์ฉ์ผ๋ก ์ ํํ LLM์ ์ฌ์ฉํ์ฌ CI/CD ํ์ดํ๋ผ์ธ์ ๋ฒ์ญํ๋ ค๋ฉด ์๋ํ๋ฅผ ์ฌ์ฉํ์ธ์. Intlayer๋ ๋ํ ์ฝํ ์ธ ์ถ์ถ์ ์๋ํํ๋ ์ปดํ์ผ๋ฌ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฒ์ญ์ ๋๋ ์น ํ๋ซํผ์ ์ ๊ณตํฉ๋๋ค.
๋๊ท๋ชจ JSON ํ์ผ์ ๊ตฌ์ฑ ์์์ ์ฐ๊ฒฐํ๋ฉด ์ฑ๋ฅ ๋ฐ ๋ฐ์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. Intlayer๋ ๋น๋ ์ ์ฝํ ์ธ ๋ก๋ฉ์ ์ต์ ํํฉ๋๋ค.
Intlayer๋ ๋จ์ํ i18n ์๋ฃจ์ ๊ทธ ์ด์์ผ๋ก ๊ด๋ฆฌ์ ๋์์ด ๋๋ ์์ฒด ํธ์คํ ๋น์ฃผ์ผ ํธ์ง๊ธฐ ๋ฐ ์ ์ฒด CMS๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค๊ตญ์ด ์ฝํ ์ธ ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ๊ณตํ์ฌ ๋ฒ์ญ๊ฐ, ์นดํผ๋ผ์ดํฐ, ๊ธฐํ ํ์๊ณผ ์ํํ๊ฒ ํ์ ํ ์ ์์ต๋๋ค. ์ฝํ ์ธ ๋ ๋ก์ปฌ ๋ฐ/๋๋ ์๊ฒฉ์ผ๋ก ์ ์ฅ๋ ์ ์์ต๋๋ค.
Astro + Lit์์ Intlayer ์ค์ ์ ์ํ ๋จ๊ณ๋ณ ๊ฐ์ด๋
GitHub์์ ์ ํ๋ฆฌ์ผ์ด์ ํ ํ๋ฆฟ ๋ณด๊ธฐ.
์ข ์์ฑ ์ค์น
์ ํธํ๋ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค:
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
alt,title,href,aria-label๋ฑ๊ณผ ๊ฐ์๋ฌธ์์ด์์ฑ์์ ์ฝํ ์ธ ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํจ์์ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
intlayer ์ค์ ๊ด๋ฆฌ, ๋ฒ์ญ, ์ฝํ ์ธ ์ ์ธ, ํธ๋์คํ์ผ ๋ฐ CLI ๋ช ๋ น์ด๋ฅผ ์ํ ๊ตญ์ ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ ํต์ฌ ํจํค์ง์ ๋๋ค.
astro-intlayer Intlayer๋ฅผ Vite ๋ฒ๋ค๋ฌ์ ํตํฉํ๊ธฐ ์ํ Astro ํตํฉ ํ๋ฌ๊ทธ์ธ๊ณผ ์ฌ์ฉ์์ ์ ํธ ๋ก์ผ์ผ์ ๊ฐ์งํ๊ณ ์ฟ ํค๋ฅผ ๊ด๋ฆฌํ๋ฉฐ URL ๋ฆฌ๋๋ ์ ์ ์ฒ๋ฆฌํ๋ ๋ฏธ๋ค์จ์ด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
lit ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์ด ์น ์ปดํฌ๋ํธ๋ฅผ ๋น๋ํ๊ธฐ ์ํ ํต์ฌ Lit ํจํค์ง์ ๋๋ค.
lit-intlayer Intlayer๋ฅผ Lit ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํตํฉํ๋ ํจํค์ง์ ๋๋ค. ์ธ์ด ๋ณ๊ฒฝ ์ LitElement๋ฅผ ์๋์ผ๋ก ๋ค์ ๋ ๋๋งํ๊ธฐ ์ํด
ReactiveController๊ธฐ๋ฐ ํ (useIntlayer,useLocale๋ฑ)์ ์ ๊ณตํฉ๋๋ค.@astrojs/lit Astro ํ์ด์ง์์ Lit ์ปค์คํ ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ณต์ Astro ํตํฉ ๋๊ตฌ์ ๋๋ค.
ํ๋ก์ ํธ ์ค์
์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ์ด๋ฅผ ์ค์ ํ๊ธฐ ์ํ ์ค์ ํ์ผ์ ์์ฑํฉ๋๋ค:
intlayer.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ด ์ค์ ํ์ผ์ ํตํด ๋ก์ปฌ๋ผ์ด์ฆ๋ URL, ๋ฏธ๋ค์จ์ด ๋ฆฌ๋๋ ์ , ์ฟ ํค ์ด๋ฆ, ์ฝํ ์ธ ์ ์ธ ์์น ๋ฐ ํ์ฅ์ ์ค์ , ์ฝ์์ Intlayer ๋ก๊ทธ ๋นํ์ฑํ ๋ฑ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ผ๋ฏธํฐ์ ์ ์ฒด ๋ชฉ๋ก์ ์ค์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
Astro ์ค์ ์ Intlayer ํตํฉ
Astro ์ค์ ์ intlayer ํ๋ฌ๊ทธ์ธ๊ณผ Lit ํตํฉ์ ์ถ๊ฐํฉ๋๋ค.
astro.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
intlayer()ํตํฉ ํ๋ฌ๊ทธ์ธ์ Intlayer๋ฅผ Astro์ ํตํฉํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฝํ ์ธ ์ ์ธ ํ์ผ์ ๋น๋๋ฅผ ๋ณด์ฅํ๊ณ ๊ฐ๋ฐ ๋ชจ๋์์ ์ด๋ฅผ ๊ฐ์ํฉ๋๋ค. Astro ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ Intlayer ํ๊ฒฝ ๋ณ์๋ฅผ ์ ์ํ๋ฉฐ, ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์์ผ๋ฆฌ์ด์ค(alias)๋ฅผ ์ ๊ณตํฉ๋๋ค.lit()ํตํฉ์ Astro ํ์ด์ง ๋ด์์ Lit ์ปค์คํ ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.์ฝํ ์ธ ์ ์ธ
๋ฒ์ญ์ ์ ์ฅํ๊ธฐ ์ํด ์ฝํ ์ธ ์ ์ธ์ ์์ฑํ๊ณ ๊ด๋ฆฌํฉ๋๋ค:
src/components/lit/app.content.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ฝํ ์ธ ์ ์ธ์
contentDir(๊ธฐ๋ณธ๊ฐ./src)์ ํฌํจ๋์ด ์๊ณ ์ฝํ ์ธ ์ ์ธ ํ์ผ ํ์ฅ์(๊ธฐ๋ณธ๊ฐ.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})์ ์ผ์นํ๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด๋์์๋ ์ ์ํ ์ ์์ต๋๋ค.์์ธํ ๋ด์ฉ์ ์ฝํ ์ธ ์ ์ธ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
Astro์์ ์ฝํ ์ธ ์ฌ์ฉ
intlayer์์ ๋ด๋ณด๋ธ ํต์ฌ ํฌํผ๋ฅผ ์ฌ์ฉํ์ฌ.astroํ์ผ์์ ์ง์ ์ฌ์ ์ ์๋นํ ์ ์์ต๋๋ค. ๋ํ ๊ฐ ํ์ด์ง์ hreflang ๋ฐ canonical ๋งํฌ์ ๊ฐ์ SEO ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. Lit ์ปค์คํ ์๋ฆฌ๋จผํธ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋<script>๋ฅผ ํตํด ์ํฌํธ๋์ด body์ ๋ฐฐ์น๋ฉ๋๋ค.src/pages/[...locale]/index.astro์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
string์์ฑ(์:alt,title,href,aria-label๋ฑ)์์ ์ฝํ ์ธ ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํจ์์ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค:tsx์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋ผ์ฐํ ์ค์ ์ ๊ดํ ์ฐธ๊ณ ์ฌํญ: ์ฌ์ฉํ๋ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋
intlayer.config.ts์middleware.routing์ค์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค:prefix-no-default(๊ธฐ๋ณธ๊ฐ): ๋ฃจํธ(ํ๋ ํฝ์ค ์์)์ ๊ธฐ๋ณธ ์ธ์ด๋ฅผ ์ ์งํ๊ณ ๋๋จธ์ง์ ํ๋ ํฝ์ค๋ฅผ ๋ถ์ ๋๋ค. ๋ชจ๋ ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด[...locale]์ ์ฌ์ฉํ์ธ์.prefix-all: ๋ชจ๋ URL์ ์ธ์ด ํ๋ ํฝ์ค๊ฐ ๋ถ์ต๋๋ค. ๋ฃจํธ๋ฅผ ๋ถ๋ฆฌํด์ ์ฒ๋ฆฌํ ํ์๊ฐ ์๋ค๋ฉด ํ์ค[locale]์ ์ฌ์ฉํ ์ ์์ต๋๋ค.search-param๋๋no-prefix: ๋ก์ผ์ผ ํด๋๊ฐ ํ์ ์์ต๋๋ค. ๋ก์ผ์ผ์ ๊ฒ์ ํ๋ผ๋ฏธํฐ๋ ์ฟ ํค๋ฅผ ํตํด ์ฒ๋ฆฌ๋ฉ๋๋ค.
Lit ์ปค์คํ ์๋ฆฌ๋จผํธ ์์ฑ
Lit ์ปค์คํ ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํฉ๋๋ค. ํด๋ผ์ด์ธํธ์์ Intlayer ์ฑ๊ธํค์ ์ด๊ธฐํํ๊ธฐ ์ํด ์๋ฒ์์ ๊ฐ์ง๋
localeํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌconnectedCallback์์installIntlayer๋ฅผ ํธ์ถํฉ๋๋ค.src/components/lit/LitDemo.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
localeํ๋กญ์ Astro ํ์ด์ง(์๋ฒ ๊ฐ์ง)์์ ์ ๋ฌ๋์ดconnectedCallback์์installIntlayer๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์ด๋ก ์ธํด ์๋ฆฌ๋จผํธ ๋ด ๋ชจ๋ReactiveControllerํ ์ ์ด๊ธฐ ๋ก์ผ์ผ์ด ๊ฒฐ์ ๋ฉ๋๋ค.useIntlayer๋ReactiveController๋ก ๋ฑ๋ก๋ฉ๋๋ค. ์ธ์ด๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋ฆฌ๋จผํธ๊ฐ ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง๋๋ฏ๋ก ์ถ๊ฐ ์ค์ ์ด ํ์ ์์ต๋๋ค.์ธ์ด ์ ํ๊ธฐ ์ถ๊ฐ
์ธ์ด ์ ํ ๊ธฐ๋ฅ์ Lit ์ปค์คํ ์๋ฆฌ๋จผํธ์
render()๋ฉ์๋(6๋จ๊ณ ์ฐธ์กฐ)์ ์ง์ ํตํฉ๋์ด ์์ต๋๋ค.lit-intlayer์useLocale์ ์ฌ์ฉํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ ์ธ์ด๋ฅผ ์ ํํ ๋ ๋ก์ปฌ๋ผ์ด์ฆ๋ URL๋ก ์ด๋ํฉ๋๋ค:src/components/lit/LitDemo.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Lit ๋ฐ์์ฑ์ ๊ดํ ์ฐธ๊ณ ์ฌํญ:
useLocale์ReactiveController๋ฅผ ๋ฐํํฉ๋๋ค.setLocale์ด ํธ์ถ๋๋ฉด ์ปจํธ๋กค๋ฌ๊ฐ ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง์ ์์ฝํ๋ฏ๋ก ๋ณ๋์ DOM ์กฐ์ ์์ด๋ ํ์ฑ ๋ฒํผ ์ํ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.์์์ฑ์ ๊ดํ ์ฐธ๊ณ ์ฌํญ:
window.location.href๋ฅผ ํตํ ๋ฆฌ๋๋ ์ ์ ์ํดonLocaleChange๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ธ์ด URL์ด ํ์คํ ๋ฐฉ๋ฌธ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด Intlayer ๋ฏธ๋ค์จ์ด๊ฐ ์ธ์ด ์ฟ ํค๋ฅผ ์ค์ ํ๊ณ ํฅํ ๋ฐฉ๋ฌธ ์ ์ฌ์ฉ์์ ์ ํธ๋๋ฅผ ๊ธฐ์ตํ ์ ์์ต๋๋ค.Sitemap ๋ฐ Robots.txt
Intlayer๋ ๋์ ์ผ๋ก ๋ก์ปฌ๋ผ์ด์ฆ๋ ์ฌ์ดํธ๋งต๊ณผ robots.txt ํ์ผ์ ์์ฑํ๊ธฐ ์ํ ์ ํธ๋ฆฌํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฌ์ดํธ๋งต
Intlayer๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ดํธ๋งต์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ ๋ด์ฅ ์ฌ์ดํธ๋งต ์์ฑ๊ธฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ก์ปฌ๋ผ์ด์ฆ๋ ๊ฒฝ๋ก๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ฒ์ ์์ง์ ํ์ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
Intlayer์์ ์์ฑํ ์ฌ์ดํธ๋งต์
xhtml:link๋ค์์คํ์ด์ค(Hreflang XML ํ์ฅ)๋ฅผ ์ง์ํฉ๋๋ค. ์์ URL๋ง ๋์ดํ๋ ๊ธฐ๋ณธ ์ฌ์ดํธ๋งต ์์ฑ๊ธฐ์ ๋ฌ๋ฆฌ, Intlayer๋ ํ์ด์ง์ ๋ชจ๋ ์ธ์ด ๋ฒ์ (์:/about,/about?lang=fr,/about?lang=es) ๊ฐ์ ํ์ํ ์ํญํฅ ๋งํฌ๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฒ์ ์์ง์ด ์ฌ๋ฐ๋ฅธ ์ธ์ด ๋ฒ์ ์ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ์์๊ฒ ์์ธํํ๊ณ ์ ๊ณตํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.๋ชจ๋ ๋ก์ปฌ๋ผ์ด์ฆ๋ ๊ฒฝ๋ก๋ฅผ ํฌํจํ๋ ์ฌ์ดํธ๋งต์ ์์ฑํ๊ธฐ ์ํด
src/pages/sitemap.xml.ts๋ฅผ ์์ฑํฉ๋๋ค.src/pages/sitemap.xml.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Robots.txt
๊ฒ์ ์์ง ํฌ๋กค๋ง์ ์ ์ดํ๊ธฐ ์ํด
src/pages/robots.txt.ts๋ฅผ ์์ฑํฉ๋๋ค.src/pages/robots.txt.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ปดํฌ๋ํธ์์ ์ฝํ ์ธ ์ถ์ถ
์ ํ์ฌํญ๊ธฐ์กด 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๋intlayerplugin์ ํฌํจ๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋์ผ๋ก ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค.vite.config.ts๋ฅผ ์ ๋ฐ์ดํธํ์ฌintlayerCompilerํ๋ฌ๊ทธ์ธ์ ํฌํจํฉ๋๋ค:vite.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
TypeScript ์ค์
Intlayer๋ ๋ชจ๋ ์ฆ๊ฐ(module augmentation)์ ์ฌ์ฉํ์ฌ TypeScript์ ์ด์ ์ ํ์ฉํจ์ผ๋ก์จ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ ๊ฒฌ๊ณ ํ๊ฒ ๋ง๋ญ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Lit์์ experimentalDecorators๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค.


TypeScript ์ค์ ์ ์๋ ์์ฑ๋ ํ์ ์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ์ธ์.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Git ์ค์
Intlayer๊ฐ ์์ฑํ ํ์ผ์ ๋ฌด์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฅผ ํตํด Git ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ปค๋ฐ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๋ฌด์ํ๋ ค๋ฉด .gitignore ํ์ผ์ ๋ค์ ์ง์นจ์ ์ถ๊ฐํ์ธ์:
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
VS Code ํ์ฅ ํ๋ก๊ทธ๋จ
Intlayer ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ฐ์ ํ๊ธฐ ์ํด ๊ณต์ Intlayer VS Code ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ค์นํ ์ ์์ต๋๋ค.
VS Code Marketplace์์ ์ค์น
์ด ํ์ฅ ํ๋ก๊ทธ๋จ์ ๋ค์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค:
- ๋ฒ์ญ ํค ์๋ ์์ฑ.
- ๋๋ฝ๋ ๋ฒ์ญ์ ๋ํ ์ค์๊ฐ ์ค๋ฅ ๊ฐ์ง.
- ๋ฒ์ญ๋ ์ฝํ ์ธ ์ ์ธ๋ผ์ธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ.
- ๋ฒ์ญ์ ์ฝ๊ฒ ์์ฑํ๊ณ ์ ๋ฐ์ดํธํ ์ ์๋ ๋น ๋ฅธ ์์ (Quick Actions).
ํ์ฅ ํ๋ก๊ทธ๋จ ์ฌ์ฉ์ ๋ํ ์์ธํ ๋ด์ฉ์ Intlayer VS Code ํ์ฅ ํ๋ก๊ทธ๋จ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ ์์๋ณด๊ธฐ
๋ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด ๋น์ฃผ์ผ ์๋ํฐ๋ฅผ ๊ตฌํํ๊ฑฐ๋ CMS๋ฅผ ์ฌ์ฉํ์ฌ ์ฝํ ์ธ ๋ฅผ ์ธ๋ถํํ ์ ์์ต๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Astro์ ๋ด์ฅ i18n ์ต์
์ ๋ก์ผ์ผ ์ ๋์ฌ์ ๋ฆฌ๋๋ ์
๋ง ์ฒ๋ฆฌํ ๋ฟ ์ฝํ
์ธ ์์ฒด๋ ๊ด๋ฆฌํ์ง ์์ผ๋ฏ๋ก ๋ฉ์์ง ๋ ์ด์ด๊ฐ ํ์ํ๋ฉฐ, ์์ผ๋๋ ๊ตฌ์กฐ๋ก ์ธํด ๋ ๋ฒ์งธ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค: ์์ผ๋๋๋ Astro๊ฐ ์๋ Lit์ผ๋ก ์คํ๋๋ค๋ ์ ์
๋๋ค.
- Astro
i18n๊ณผ ์ง์ ์์ฑํ ์ฌ์ , ๊ทธ๋ฆฌ๊ณ ์์ผ๋๋ ๋ด๋ถ์@lit/localize: ๋๊ธฐํํด์ผ ํ ๋ ๊ฐ์ ์ฝํ ์ธ ์์ค๊ฐ ์๊ธฐ๊ณ , ๋ ์ฌ์ด์ ๊ณต์ ๋ ํ์ ์์ ์ฑ์ด ์์ต๋๋ค. Intlayer: ๋ ๋ชจ๋๋ฅผ ์ํ ๋จ์ผ ์ฝํ ์ธ ๋ ์ด์ด์ ๋๋ค.astro-intlayer๋.astroํ์ด์ง๋ฅผ ๋ค๋ฃจ๊ณlit-intlayer๋ Lit ์์ผ๋๋๋ฅผ ๋ค๋ฃจ๋ฉฐ, ๋ ๋ค ๋์ผํ ์ ์ธ์ ์ฝ์ต๋๋ค.
๋ผ๋ฒจ์ ํ ๋ฒ๋ง ์ ์ธํ๊ณ ์ ์ ํ์ด์ง์ ์ธํฐ๋ํฐ๋ธ ์์ผ๋๋ ์์ชฝ์์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ด ์ฌ๊ธฐ์ ๋จ์ผ ์ฝํ ์ธ ๋ ์ด์ด๋ฅผ ์ ํํ๋ ํต์ฌ ์ด์ ์ ๋๋ค. ์ Intlayer์ธ๊ฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ค์์คํ์ด์ค ๊ธฐ๋ฐ ์ค์ ๋ณด๋ค ํจ์ฌ ์ ์ต๋๋ค. ํ์ด์ง๋ ๋ ๋๋งํ์ง ์๋ ์ธ์ด์ ์นดํ๋ก๊ทธ๋ฅผ ์ ๋ ๋ค์ด๋ก๋ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. Astro ํ์ด์ง๋ ๋น๋ ํ์์ ๋ ๋๋ง๋๋ฏ๋ก ๋ฒ์ญ๋ HTML๋ง ์ ์กํ๊ณ ์ฌ์ ์ ์ ํ ์ ์กํ์ง ์์ผ๋ฉฐ, ์ค์ง ์์ผ๋๋๋ง ์ฌ์ ์ ์ ๋ฌ๋ฐ์ต๋๋ค. ๋น๋ ํ์ ์ปดํ์ผ๋ฌ๋ ์ฝํ ์ธ ํธ์ถ์ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉํ๋ ์ ํํ ํญ๋ชฉ์ผ๋ก ํ์ธํ๊ณ , ๋์ ์ฌ์ ์ ํตํด ๋ก์ผ์ผ๋ณ๋ก ๋ถํ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋์๋ค๊ณผ ๋น๊ตํ์ ๋ Intlayer๋ ๋ฒ๋ค ๋ฐ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ต๋ 50%๊น์ง ์ค์ฌ์ค๋๋ค. ๋ฒ๋ค ์ต์ ํ์ ๋ฒค์น๋งํฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋๋ถ๋ถ ๊ฐ๋ฅํฉ๋๋ค. ์ฝํ ์ธ ๋ฅผ ์ด์ ํ๋ ค๋ฉด ํธํ ์ด๋ํฐ(compat adapters) ๊ฐ์๋ฅผ ๋ฐ๋ฅด์ธ์. ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์๋ ์์ต๋๋ค: 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๋ง ๊ฒํ ํ๋ฉด ๋ฉ๋๋ค. ์ด ๊ฐ์ด๋์ 15๋จ๊ณ๋ฅผ ํ์ธํ์ธ์.
์์ ์๋ํ๋ ํ์ดํ๋ผ์ธ์ ์ํด Intlayer ์ปดํ์ผ๋ฌ๋ ๋น๋ ํ์์ JSX, TSX, Vue ๋ฐ Svelte ์์ค์์ ๋์ผํ ์์ ์ ์ํํ์ฌ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฌ์ ์ ์์ฑํ๊ณ HMR์ ํตํด ๋๊ธฐํํ๋ฏ๋ก ์๋์ผ๋ก ํค๋ฅผ ๊ด๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.
์ปดํ์ผ๋ฌ๋ฅผ ์ผ๊ธฐ ์ ์ ์์๋์ด์ผ ํ ๋ ๊ฐ์ง ์ ํ ์ฌํญ์ด ์์ต๋๋ค. ์ ์ ๋ถ์์ผ๋ก ์๋ํ๋ฏ๋ก API ์ค๋ฅ ์ฝ๋๋ CMS ํ๋์ ๊ฐ์ด ๋ฐํ์์๋ง ์กด์ฌํ๋ ๋ฌธ์์ด์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ํ ํฐ ์ฝ๋๋ฒ ์ด์ค์์ ๋ช ๊ฐ์ง ์ด๋
ธํ
์ด์
์ด ํ์ํ className="active" ๋๋ ์ํ ์ฝ๋์ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง๊ณผ ์ฌ์ฉ์ ๋๋ฉด ํ
์คํธ๋ฅผ ๊ตฌ๋ถํด์ผ ํฉ๋๋ค. extract ๋ช
๋ น์ ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ดํ ์ ์๋๋ก ํ์ฌ ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ชจ๋ ๋ฐฉ์งํฉ๋๋ค.
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๊ท์น์ผ๋ก ํ๋์ฝ๋ฉ๋ ๋ฌธ์์ด์ ํ์ํ๊ณ , ์ ์ ์ฌ์ ํค ๋ฐ ์ฌ์ฉ๋์ง ์๋ ์ฝํ ์ธ ์ ๋ํ ์ถ๊ฐ ๊ท์น์ ์ ๊ณตํฉ๋๋ค.
