์ด ํ์ด์ง์ ์ํ๋ AI ์ด์์คํดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ฝํฉ๋๋ค
๋ฒ์ ๊ธฐ๋ก
- "Init history"v9.0.02026. 6. 5.
์ด ํ์ด์ง์ ์ฝํ ์ธ ๋ AI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ๋์์ต๋๋ค.
์์ด ์๋ณธ ๋ด์ฉ์ ์ต์ ๋ฒ์ ์ ๋ณด๊ธฐ์ด ๋ฌธ์๋ฅผ ๊ฐ์ ํ ์์ด๋์ด๊ฐ ์์ผ์๋ฉด GitHub์ ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ์ฌ ์์ ๋กญ๊ฒ ๊ธฐ์ฌํด ์ฃผ์ธ์.
๋ฌธ์์ ๋ํ GitHub ๋งํฌ๋ฌธ์์ Markdown์ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
i18next์์ Intlayer๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ
์ i18next์์ Intlayer๋ก ๋ง์ด๊ทธ๋ ์ด์ ํด์ผ ํ๋์?
๊ฑฐ๋ํ JSON ํ์ผ์ ํ์ด์ง์ ๋ถ๋ฌ์ค๋ ๋์ , ํ์ํ ์ฝํ ์ธ ๋ง ๋ถ๋ฌ์ต๋๋ค. Intlayer๋ ๋ฒ๋ค ๋ฐ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ต๋ 50%๊น์ง ์ค์ด๋๋ก ๋์์ค๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ฝํ ์ธ ์ ์ค์ฝํ๋ฅผ ๋๋๋ฉด ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋๋ค. ์ ์ฒด ์ฝํ ์ธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฒํ ํ ํ์ ์์ด ๊ธฐ๋ฅ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ณต์ ํ๊ฑฐ๋ ์ญ์ ํ ์ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ Intlayer๋ ์ฝํ ์ธ ์ ์ ํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ํ์ ์ด ์ ์ฉ๋์ด ์์ต๋๋ค.
Intlayer๋ i18n ์ํ๊ณ์์ ๊ฐ์ฅ ํ๋ฐํ๊ฒ ๊ฐ๋ฐ๋๋ ์๋ฃจ์ ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ฌธ์ ๊ฐ ์ ์ํ ํด๊ฒฐ๋๊ณ ์๋ก์ด ํ๋ ์์ํฌ ์ด๋ํฐ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์ถ๊ฐ๋๋ฉฐ, ์ค์ ์ด์ ํ๊ฒฝ์ ํผ๋๋ฐฑ์ ๊ธฐ๋ฐ์ผ๋ก ํต์ฌ API๊ฐ ์ง์์ ์ผ๋ก ๊ฐ์ ๋ฉ๋๋ค.
์ฝํ ์ธ ์ ์์น๋ฅผ ํต์ผ(Colocation)ํ๋ฉด ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM)์ ํ์ํ ์ปจํ ์คํธ๊ฐ ์ค์ด๋ญ๋๋ค. Intlayer์๋ ๋๋ฝ๋ ๋ฒ์ญ์ ํ ์คํธํ๊ธฐ ์ํ CLI, LSP, MCP ๋ฐ agent skills ๋ฑ ์ผ๋ จ์ ๋๊ตฌ๊ฐ ์์ด AI ์์ด์ ํธ๋ฅผ ์ํ ๊ฐ๋ฐ์ ๊ฒฝํ(DX)์ด ํจ์ฌ ๋งค๋๋ฌ์์ง๋๋ค.
AI ์ ๊ณต ์ ์ฒด์ ๋น์ฉ๋ง์ผ๋ก ์ํ๋ LLM์ ์ฌ์ฉํ์ฌ CI/CD ํ์ดํ๋ผ์ธ์์ ๋ฒ์ญ์ ์๋ํํ์ธ์. Intlayer๋ ์ฝํ ์ธ ์ถ์ถ์ ์๋ํํ๊ธฐ ์ํ ์ปดํ์ผ๋ฌ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฒ์ญ์ ์ง์ํ๋ ์น ํ๋ซํผ๋ ์ ๊ณตํฉ๋๋ค.
๊ฑฐ๋ํ JSON ํ์ผ์ ์ปดํฌ๋ํธ์ ์ฐ๊ฒฐํ๋ฉด ์ฑ๋ฅ ๋ฐ ๋ฐ์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. Intlayer๋ ๋น๋ ์๊ฐ์ ์ฝํ ์ธ ๋ฅผ ๋ถ๋ฌ์ค๋๋ก ์ต์ ํํฉ๋๋ค.
Intlayer๋ ๋จ์ํ i18n ์๋ฃจ์ ์ ๋์ด, ์์ฒด ํธ์คํ ์ด ๊ฐ๋ฅํ ์๊ฐ์ ์๋ํฐ์ ๋ค๊ตญ์ด ์ฝํ ์ธ ๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ ํ CMS๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฒ์ญ๊ฐ, ์นดํผ๋ผ์ดํฐ ๋ฐ ๊ธฐํ ํ ๊ตฌ์ฑ์๊ณผ ์ํํ๊ฒ ํ์ ํ ์ ์์ต๋๋ค. ์ฝํ ์ธ ๋ ๋ก์ปฌ ๋ฐ/๋๋ ์๊ฒฉ์ผ๋ก ์ ์ฅ๋ ์ ์์ต๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต
i18next์์ Intlayer๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ธฐ ์ํ ๋ ๊ฐ์ง ๋ณด์์ ์ ๋ต์ด ์์ต๋๋ค:
ํธํ์ฑ ์ด๋ํฐ (๊ธฐ์กด ์ฑ์ ๊ถ์ฅ) โ
@intlayer/i18next๋ฅผ ์ค์นํ์ธ์. ์ด ํจํค์ง๋i18next์ ์ ํํ ๋์ผํ API๋ฅผ ์ ๊ณตํ๋ฉด์ ๋ชจ๋ ๋ฒ์ญ ์์ ์ Intlayer์ ์์ํฉ๋๋ค.i18next.t(),i18next.changeLanguage()๋ฐcreateInstance()์ ๋ํ ๊ธฐ์กด ํธ์ถ์ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ ธ์ค๊ธฐ ๊ฒฝ๋ก์ ์ด๊ธฐํ๋ฟ์ ๋๋ค.์ ์ฒด ๋ง์ด๊ทธ๋ ์ด์ โ
i18nextAPI๋ฅผ ์ ์ง์ ์ผ๋ก ๊ธฐ๋ณธ Intlayer ๋๊ตฌ๋ก ๊ต์ฒดํ๊ณ ์ปดํฌ๋ํธ์ ํจ๊ป.content.tsํ์ผ ๋ด์ ์ฝํ ์ธ ๋ฅผ ๋ฐฐ์นํฉ๋๋ค.
์ด ๊ฐ์ด๋์์๋ ๋จผ์ ์ ๋ต 1 (์ฝ๊ฒ ๋์ ํ ์ ์๋ ํธํ์ฑ ์ด๋ํฐ)์ ๋ํด ์ค๋ช ํ๊ณ , ์ ํ ์ฌํญ์ธ ์ ์ฒด ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ํด ์์๋ด ๋๋ค.
๋ชฉ์ฐจ
๋น ๋ฅธ ๋ง์ด๊ทธ๋ ์ด์
๋ค์ ๋จ๊ณ๋ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ธฐ์กด i18next ์ฑ์ Intlayer์์ ์คํํ๊ธฐ ์ํด ํ์ํ ์ต์ํ์ ์์
์
๋๋ค.
์์กด์ฑ ์ค์น
Intlayer ํต์ฌ ํจํค์ง์ ํธํ์ฑ ์ด๋ํฐ๋ฅผ ์ค์นํฉ๋๋ค:
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
--interactiveํ๋๊ทธ๋ ์ ํ ์ฌํญ์ ๋๋ค. AI ์์ด์ ํธ์ธ ๊ฒฝ์ฐintlayer-cli init๋ฅผ ์ฌ์ฉํ์ธ์.์ด ๋ช ๋ น์ ํ๊ฒฝ์ ๊ฐ์งํ๊ณ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
i18next๋ฅผ ๊ณ์ ์ค์นํด ๋ ์ ์์ต๋๋ค โ ํธํ์ฑ ์ด๋ํฐ๋ TypeScript ํ์ ์ ์ํด ์ด๋ฅผdevDependency/peerDependency๋ก ์ฌ์ฉํฉ๋๋ค.Intlayer ์ค์
intlayer init๋ช ๋ น์ด๋ ์ด๊ธฐintlayer.config.tsํ์ผ์ ๋ง๋ญ๋๋ค. ๊ธฐ์กด ๋ก์ผ์ผ(์ธ์ด)๊ณผ ์ผ์นํ๋๋ก ์ ๋ฐ์ดํธํ๊ณsyncJSONํ๋ฌ๊ทธ์ธ์ด ๋ฉ์์ง ํ์ผ์ ๊ฐ๋ฆฌํค๋๋ก ์ค์ ํ์ธ์:intlayer.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
import { Locales, type IntlayerConfig } from "intlayer"; import { syncJSON } from "@intlayer/sync-json-plugin"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // ๊ธฐ์กด์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ก์ผ์ผ์ ์ฌ๊ธฐ์ ์ถ๊ฐํ์ธ์ ], defaultLocale: Locales.ENGLISH, }, plugins: [ syncJSON({ // i18next ํ๋ ์ด์คํ๋ ๊ตฌ๋ฌธ์ธ {{name}}๊ณผ ์ผ์น์ํต๋๋ค. format: "i18next", source: ({ locale }) => `./src/locales/${locale}.json`, location: "src/locales", }), ], }; export default config;source๋ ๋ก์ผ์ผ์ ํด๋น JSON ํ์ผ ๊ฒฝ๋ก๋ก ๋งคํํฉ๋๋ค.location์ Intlayer ๊ด์ฐฐ์(Watcher)์๊ฒ ๋ณ๊ฒฝ ์ฌํญ์ ๋ชจ๋ํฐ๋งํ ํด๋๋ฅผ ์๋ ค์ค๋๋ค.format: 'i18next'์ต์ ์{{name}}๊ณผ ๊ฐ์ ํ๋ ์ด์คํ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ถ์๋๋๋ก ๋ณด์ฅํฉ๋๋ค.๋ฒ๋ค๋ฌ ๋ณ์นญ ์ ๋ฐ์ดํธ (์ ํ ์ฌํญ)
๋ฒ๋ค๋ฌ(Vite, Webpack, esbuild)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ณ์นญ์ ์ฝ์ ํ์ฌ
import ... from 'i18next'๊ฐ ์๋์ผ๋ก@intlayer/i18next๋ก ํ์ธ๋๊ฒ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์์ ๊ฐ์ ธ์ค๊ธฐ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ๋ณ๊ฒฝํ์ง ์์๋ ๋ฉ๋๋ค.Vite์ ๊ฒฝ์ฐ:
vite.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
import { defineConfig } from "vite"; import i18nextVitePlugin from "@intlayer/i18next/plugin"; export default defineConfig({ plugins: [i18nextVitePlugin()], });i18nextVitePlugin()์vite-intlayer์intlayer()ํ๋ฌ๊ทธ์ธ์ ๋ํํ๋ฉฐ,i18nextโ@intlayer/i18next๋ณ์นญ์ ์๋์ผ๋ก ์ถ๊ฐํฉ๋๋ค. ์ผ๋ฐ์ ์ธvite-intlayer์intlayer()ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ์ฌ์ ์ ์ปดํ์ผ๋์ง๋ง ๋ณ์นญ์ ์ถ๊ฐ๋์ง ์์ต๋๋ค โ ์ด ๊ฒฝ์ฐ ์๋์ผ๋ก@intlayer/i18next๋ฅผ ์ฐธ์กฐํ๋๋ก ๊ฐ์ ธ์ค๊ธฐ ๊ฒฝ๋ก๋ฅผ ์ด๋ฆ์ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค(๋ค์ ๋จ๊ณ ์ฐธ๊ณ ).
์ด๊ฒ์ผ๋ก ๋น ๋ฅธ ๋ง์ด๊ทธ๋ ์ด์
์ด ์๋ฃ๋์์ต๋๋ค. ์ด์ ์ฑ์ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ์ i18next API๋ฅผ ๊ทธ๋๋ก ์ ์งํ ์ฑ Intlayer์์ ์๋ํฉ๋๋ค.
์ ์ฒด ๋ง์ด๊ทธ๋ ์ด์
์๋ ๋จ๊ณ๋ ์ ํ ์ฌํญ์ด๋ฉฐ ์ ์ง์ ์ผ๋ก ์ํํ ์ ์์ต๋๋ค. ์ด๋ ์๊ฐ์ ์๋ํฐ, CMS, ํ์ ์ด ์๋ ์ฝํ ์ธ ํ์ผ, AI ์ง์ ๋ฒ์ญ ์๋ํ ๋ฑ Intlayer์ ์ ์ฒด ๊ธฐ๋ฅ์ ์ด์ด์ค๋๋ค.
๋ช ์์ ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ์ด๋ฆ ๋ณ๊ฒฝ (์ ํ ์ฌํญ)
์ ํ์ฌํญ์์ค ํ์ผ์์ ๋ช ์์ ์ผ๋ก ์์กด์ฑ์ ๋ํ๋ด๊ณ ์ถ๊ฑฐ๋, ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋ณ์นญ ์ง์ ํ๋ ๋ฒ๋ค๋ฌ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์๋์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค:
ํ ์ด๋ธ์ ๋ชจ๋ ๋ด์ฉ ํ์ํ ์ด๋ธ์ ๋ชจ๋ฌ๋ก ์ด์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ช ํํ๊ฒ ํ์ธ
๋ณ๊ฒฝ ์ ๋ณ๊ฒฝ ํ import i18next from 'i18next'import i18next from '@intlayer/i18next'import { createInstance } from 'i18next'import { createInstance } from '@intlayer/i18next'import { t } from 'i18next'import { t } from '@intlayer/i18next'์ด๋ ๋๋กญ์ธ ๊ต์ฒด(Drop-in replacements)์ด๋ฏ๋ก ํจ์ ํธ์ถ ์๊ทธ๋์ฒ, ๋งค๊ฐ๋ณ์, ๋ฐํ ํ์ ์ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค.
AI ๊ธฐ๋ฐ ๋ฒ์ญ ์๋ํ ํ์ฑํ
์ ํ์ฌํญIntlayer ์ค์ ์ด ์๋ฃ๋๋ฉด, CLI๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฝ๋ ๋ฒ์ญ์ ์๋์ผ๋ก ์ฑ์ธ ์ ์์ต๋๋ค:
bash์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
AI ๊ตฌ์ฑ์
intlayer.config.ts์ ์ถ๊ฐํ์ธ์:intlayer.config.ts์ฝ๋ ๋ณต์ฌ์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
import { Locales, type IntlayerConfig } from "intlayer"; import { syncJSON } from "@intlayer/sync-json-plugin"; const config: IntlayerConfig = { internationalization: { locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], defaultLocale: Locales.ENGLISH, }, plugins: [ syncJSON({ format: "i18next", source: ({ locale }) => `./src/locales/${locale}.json`, location: "src/locales", }), ], ai: { apiKey: process.env.OPENAI_API_KEY, // provider: "openai", // ๊ธฐ๋ณธ๊ฐ // model: "gpt-4o-mini", // ๊ธฐ๋ณธ๊ฐ }, }; export default config;์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์ต์ ์ Intlayer CLI ๋ฌธ์์์ ํ์ธํ์ธ์.
๋ง์ด๊ทธ๋ ์ด์ ํ ์ญ์ ํ ์ ์๋ ํญ๋ชฉ
ํธํ์ฑ ์ด๋ํฐ๊ฐ ์ ์๋ฆฌ์ ๋ฐฐ์น๋๋ฉด ๊ธฐ์กด์ ์ฌ์ฉํ๋ ํ์ค i18next ์์ฉ๊ตฌ๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค:
ํ ์ด๋ธ์ ๋ชจ๋ฌ๋ก ์ด์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ช ํํ๊ฒ ํ์ธ
| ํ์ผ / ํจํด | ๋ ์ด์ ํ์ ์๋ ์ด์ |
|---|---|
i18next.init() ํธ์ถ | Intlayer๋ ๋ชจ๋ ๊ฒ์ ์๋์ผ๋ก ์ด๊ธฐํํ๋ฉฐ ๋ฐํ์์ ๋ถ๋ฌ์ค๋ ๋จ๊ณ๊ฐ ์์ต๋๋ค. |
i18next.use(...) | Intlayer๋ i18next ํ๋ฌ๊ทธ์ธ, ๋ฐฑ์๋ ๋๋ ์ธ์ด ํ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. |
JSON ์ธ์ด ๋ฒ๋ค (locales/*.json) | JSON ๋ฒ๋ค์ syncJSON ํ๋ฌ๊ทธ์ธ์ ์ฌ์ ํ ์ฌ์ฉํ ๋๋ง ํ์ํฉ๋๋ค. .content.ts ํ์ผ๋ก ์ด์ ์ ์๋ฃํ๋ฉด JSON ํด๋๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค. |
ํ ๋จ๊ณ ๋ ๋์๊ฐ ์ค๋น๊ฐ ๋๋ฉด Intlayer๋ ์ฝ๋๋ฒ ์ด์ค ๋ด์ ๋ชจ๋ .content.ts ๋ฐ .content.json ํ์ผ์ ์๋์ผ๋ก ๊ฐ์งํฉ๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ./src ๋ด์ ์ด๋ ๊ณณ์์๋ ). ๋ก์ง ํ์ผ ๋ฐ๋ก ์์ my-component.content.ts ํ์ผ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด Intlayer๋ ๋ณ๋ ์ค์ ์์ด ์ปดํ์ผ ํ์์ ์ด๋ฅผ ๊ฐ์งํฉ๋๋ค โ ๊ฐ์ ธ์ค๊ธฐ, ๋ฑ๋ก, ์ค์ ์ธ๋ฑ์ค ํ์ผ์ด ํ์ ์์ต๋๋ค. ๋ฒ์ญ์ ์์น ํต์ผ์ด ๋งค์ฐ ๋งค๋๋ฌ์์ง๋๋ค.
TypeScript ์ค์
Intlayer๋ ๋ฒ์ญ ํค์ ๋ํด ์ ์ฒด TypeScript IntelliSense(์๋ ์์ฑ)๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ชจ๋ ํ์ฅ์ ์ฌ์ฉํฉ๋๋ค. tsconfig.json ํ์ผ์ ์๋์ผ๋ก ์์ฑ๋ ํ์
์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ์ธ์:
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
Git ์ค์
Intlayer๊ฐ ์์ฑํ ๋๋ ํ ๋ฆฌ๋ฅผ .gitignore์ ์ถ๊ฐํ์ธ์:
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋ ์์๋ณด๊ธฐ
- ์๊ฐ์ ์๋ํฐ โ ๋ธ๋ผ์ฐ์ ์์ ์๊ฐ์ ์ผ๋ก ๋ฒ์ญ์ ๊ด๋ฆฌํ์ธ์: Intlayer ์๊ฐ์ ์๋ํฐ
- CMS โ ์ฝํ ์ธ ๋ฅผ ์ธ๋ถ๋ก ๋ถ๋ฆฌํ๊ณ ์๊ฒฉ์ผ๋ก ๊ด๋ฆฌํ์ธ์: Intlayer CMS
- VS Code ํ์ฅ โ ์ค์๊ฐ ๋ฒ์ญ ์๋ ์์ฑ ๋ฐ ์ค๋ฅ ๊ฐ์ง๋ฅผ ๊ฒฝํํ์ธ์: Intlayer VS Code ํ์ฅ
- CLI ๋ ํผ๋ฐ์ค โ ์ฌ์ฉ ๊ฐ๋ฅํ CLI ๋ช ๋ น์ด ๋ชฉ๋ก: Intlayer CLI
