์ž‘๊ฐ€:
    ์ƒ์„ฑ:2026-06-05๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ:2026-06-05

    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๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๋ณด์™„์  ์ „๋žต์ด ์žˆ์Šต๋‹ˆ๋‹ค:

    1. ํ˜ธํ™˜์„ฑ ์–ด๋Œ‘ํ„ฐ (๊ธฐ์กด ์•ฑ์— ๊ถŒ์žฅ) โ€” @intlayer/i18next๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”. ์ด ํŒจํ‚ค์ง€๋Š” i18next์™€ ์ •ํ™•ํžˆ ๋™์ผํ•œ API๋ฅผ ์ œ๊ณตํ•˜๋ฉด์„œ ๋ชจ๋“  ๋ฒˆ์—ญ ์ž‘์—…์„ Intlayer์— ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค. i18next.t(), i18next.changeLanguage() ๋ฐ createInstance()์— ๋Œ€ํ•œ ๊ธฐ์กด ํ˜ธ์ถœ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ์™€ ์ดˆ๊ธฐํ™”๋ฟ์ž…๋‹ˆ๋‹ค.

    2. ์ „์ฒด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ โ€” i18next API๋ฅผ ์ ์ง„์ ์œผ๋กœ ๊ธฐ๋ณธ Intlayer ๋„๊ตฌ๋กœ ๊ต์ฒดํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ .content.ts ํŒŒ์ผ ๋‚ด์— ์ฝ˜ํ…์ธ ๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

    ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ๋จผ์ € ์ „๋žต 1 (์‰ฝ๊ฒŒ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ธํ™˜์„ฑ ์–ด๋Œ‘ํ„ฐ)์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ , ์„ ํƒ ์‚ฌํ•ญ์ธ ์ „์ฒด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.


    ๋ชฉ์ฐจ


    ๋น ๋ฅธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

    ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด i18next ์•ฑ์„ Intlayer์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

    1. ์˜์กด์„ฑ ์„ค์น˜

      Intlayer ํ•ต์‹ฌ ํŒจํ‚ค์ง€์™€ ํ˜ธํ™˜์„ฑ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค:

      bash
      npx intlayer init --interactive
      
      --interactive ํ”Œ๋ž˜๊ทธ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. AI ์—์ด์ „ํŠธ์ธ ๊ฒฝ์šฐ intlayer-cli init๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
      ์ด ๋ช…๋ น์€ ํ™˜๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
      bash
      npm install intlayer @intlayer/i18next @intlayer/sync-json-plugin
      
      i18next๋ฅผ ๊ณ„์† ์„ค์น˜ํ•ด ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ํ˜ธํ™˜์„ฑ ์–ด๋Œ‘ํ„ฐ๋Š” TypeScript ํƒ€์ž…์„ ์œ„ํ•ด ์ด๋ฅผ devDependency / peerDependency๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    2. 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}}๊ณผ ๊ฐ™์€ ํ”Œ๋ ˆ์ด์Šคํ™€๋”๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ถ„์„๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
    3. ๋ฒˆ๋“ค๋Ÿฌ ๋ณ„์นญ ์—…๋ฐ์ดํŠธ (์„ ํƒ ์‚ฌํ•ญ)

      ๋ฒˆ๋“ค๋Ÿฌ(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์˜ ์ „์ฒด ๊ธฐ๋Šฅ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค.

    1. ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์ด๋ฆ„ ๋ณ€๊ฒฝ (์„ ํƒ ์‚ฌํ•ญ)

      ์„ ํƒ์‚ฌํ•ญ

      ์†Œ์Šค ํŒŒ์ผ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์˜์กด์„ฑ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ๊ฑฐ๋‚˜, ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ณ„์นญ ์ง€์ •ํ•˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ˆ˜๋™์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

      ๋ณ€๊ฒฝ ์ „ ๋ณ€๊ฒฝ ํ›„
      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)์ด๋ฏ€๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ๊ทธ๋‹ˆ์ฒ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

    2. AI ๊ธฐ๋ฐ˜ ๋ฒˆ์—ญ ์ž๋™ํ™” ํ™œ์„ฑํ™”

      ์„ ํƒ์‚ฌํ•ญ

      Intlayer ์„ค์ •์ด ์™„๋ฃŒ๋˜๋ฉด, CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ˆ„๋ฝ๋œ ๋ฒˆ์—ญ์„ ์ž๋™์œผ๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

      bash
      # ๋ˆ„๋ฝ๋œ ๋ฒˆ์—ญ ํ…Œ์ŠคํŠธ (CI์— ์ถ”๊ฐ€)
      npx intlayer test
      
      # AI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ˆ„๋ฝ๋œ ๋ฒˆ์—ญ ์ฑ„์šฐ๊ธฐ
      npx intlayer fill
      

      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 ํŒŒ์ผ์— ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”:

    tsconfig.json
    {
      // ... ๊ธฐ์กด TypeScript ์„ค์ •
      "include": [
        // ... ๊ธฐ์กด TypeScript ์„ค์ •
        ".intlayer/**/*.ts", // ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ํƒ€์ž… ํฌํ•จ
      ],
    }
    

    Git ์„ค์ •

    Intlayer๊ฐ€ ์ƒ์„ฑํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ .gitignore์— ์ถ”๊ฐ€ํ•˜์„ธ์š”:

    .gitignore
    # Intlayer์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ ๋ฌด์‹œ
    .intlayer
    

    ๋” ์•Œ์•„๋ณด๊ธฐ

    • ์‹œ๊ฐ์  ์—๋””ํ„ฐ โ€” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹œ๊ฐ์ ์œผ๋กœ ๋ฒˆ์—ญ์„ ๊ด€๋ฆฌํ•˜์„ธ์š”: Intlayer ์‹œ๊ฐ์  ์—๋””ํ„ฐ
    • CMS โ€” ์ฝ˜ํ…์ธ ๋ฅผ ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์›๊ฒฉ์œผ๋กœ ๊ด€๋ฆฌํ•˜์„ธ์š”: Intlayer CMS
    • VS Code ํ™•์žฅ โ€” ์‹ค์‹œ๊ฐ„ ๋ฒˆ์—ญ ์ž๋™ ์™„์„ฑ ๋ฐ ์˜ค๋ฅ˜ ๊ฐ์ง€๋ฅผ ๊ฒฝํ—˜ํ•˜์„ธ์š”: Intlayer VS Code ํ™•์žฅ
    • CLI ๋ ˆํผ๋Ÿฐ์Šค โ€” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ CLI ๋ช…๋ น์–ด ๋ชฉ๋ก: Intlayer CLI