Author:
    Creation:2026-09-02Last update:2026-09-02

    рдЦрд░рд╛рдм рдХреЙрдкреА рднреЗрдЬреЗ рдмрд┐рдирд╛ CI/CD рдореЗрдВ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛

    рдореИрдиреНрдпреБрдЕрд▓ рдЕрдиреБрд╡рд╛рдж рд░рд┐рд▓реАрдЬрд╝ рдХреА рддреЗрдЬрд╝ рдЧрддрд┐ рдХреЗ рд╕рд╛рдордиреЗ рдЯрд┐рдХ рдирд╣реАрдВ рдкрд╛рддрд╛ред рдХреЛрдИ рд╢реБрдХреНрд░рд╡рд╛рд░ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдирд┐рд░реНрдпрд╛рдд рдЕрдЧрд▓реЗ рд╕реНрдкреНрд░рд┐рдВрдЯ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рддрдм рддрдХ рддреАрди рдФрд░ рднрд╛рд╖рд╛рдПрдБ рдкреАрдЫреЗ рдЫреВрдЯ рдЬрд╛рддреА рд╣реИрдВред рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рд╕реАрдзрд╛ рд╣реИред рдмрд┐рдирд╛ рд╕рдореАрдХреНрд╖рд╛ рдХрд┐рдП рдорд╢реАрди рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЪреБрдкрдЪрд╛рдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪрд╛рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рд╣реА рд╡рд┐рдЪрд╛рд░рдгреАрдп рд╡рд┐рд╖рдп рд╣реИред

    рд╡рд┐рд╖рдп рд╕реВрдЪреА

    рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

    рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЖрдХрд╛рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА-рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рд╣реИрдВ, рдФрд░ рдЯреВрд▓рд┐рдВрдЧ рднреА рд╡реИрд╕реА рд╣реА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рд╕рдВрджреЗрд╢ i18next, next-intl, react-intl, vue-i18n рдпрд╛ next-translate рдХреЗ рд▓рд┐рдП JSON рдХреИрдЯрд▓реЙрдЧ рд╣реИрдВ, рддреЛ Sync JSON рдкреНрд▓рдЧрдЗрди рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реАрдзреЗ рдкрдврд╝рддрд╛ рдФрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ:

    intlayer.config.ts
    import { syncJSON } from "@intlayer/sync-json-plugin";
    
    const config = {
      plugins: [
        syncJSON({
          source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
          format: "i18next", // рдпрд╛ next-intl / react-intl рдХреЗ рд▓рд┐рдП "icu"
        }),
      ],
    };
    
    export default config;
    

    рдЖрдкрдХрд╛ рдРрдк рд╡рд╣реА рдЖрдпрд╛рдд рдХрд░рддрд╛ рд░рд╣рддрд╛ рд╣реИ рдЬреЛ рд╡рд╣ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП CI рдЬреЙрдмреНрд╕ рдЖрдкрдХреЗ рдореМрдЬреВрджрд╛ рдХреИрдЯрд▓реЙрдЧ рдХреЛ рднрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╕рдореАрдХреНрд╖рдХ рдЬреЛ рдбрд┐рдл рджреЗрдЦрддрд╛ рд╣реИ рд╡рд╣ locales/fr/checkout.json рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реИ, рди рдХрд┐ рдХреЛрдИ рдорд╛рдЗрдЧреНрд░реЗрд╢рдиред gettext рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдПрдХ Sync PO рдкреНрд▓рдЧрдЗрди рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рд░рдирдЯрд╛рдЗрдо API рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХрдореНрдкреИрдЯ рдПрдбреЙрдкреНрдЯрд░ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

    рдЧреЗрдЯ (Gate) рдХреЛ рднрд░рд╛рд╡ (Fill) рд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВ

    рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рдПрдХ рдЧреЗрдЯ (Gate) рдПрдХ рдРрд╕реА рдЬрд╛рдВрдЪ рд╣реИ рдЬреЛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд┐рд▓реНрдб рдХреЛ рд╢рд┐рдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЖрд╡рд╢реНрдпрдХ рд▓реЛрдХреЗрд▓ рдЧрд╛рдпрдм рд╣реИрдВред рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИред

    рдПрдХ рдлрд┐рд▓ (Fill) рдПрдХ рдореНрдпреВрдЯреЗрд╢рди рд╣реИред рдпрд╣ рдЧрд╛рдпрдм рдЕрдиреБрд╡рд╛рдж рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдорд┐рдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрднреА рднреА рдмрд┐рд▓реНрдб рдХреЛ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

    рдХреЗрд╡рд▓ рдлрд┐рд▓ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдХрднреА рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдорд╢реАрди рдЖрдЙрдЯрдкреБрдЯ рдмрд┐рдирд╛ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЧреЗрдЯ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрд┐рд▓реНрдб рд▓рд╛рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ рдХрд┐рд╕реА рдЗрдВрд╕рд╛рди рдХреЛ рдЗрд╕реЗ рдЕрдирдмреНрд▓реЙрдХ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреАрдореЗрдВ рджреЛрдиреЛрдВ рдЪрд╛рд╣рддреА рд╣реИрдВ, рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреНрд░рд┐рдЧрд░реНрд╕ рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрдВ: рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкрд░ рдлрд┐рд▓, рд░рд┐рд▓реАрдЬрд╝ рд╢рд╛рдЦрд╛ рдореЗрдВ рдорд░реНрдЬ рдкрд░ рдЧреЗрдЯред

    рд╕реНрд╡рдЪрд╛рд▓рди рдХрд╣рд╛рдБ рд░рд╣ рд╕рдХрддрд╛ рд╣реИ

    рдЪрд░рдгрдЯреНрд░рд┐рдЧрд░рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИрд▓рд╛рдЧрдд
    Pre-push рд╣реБрдХрд▓реЛрдХрд▓ рдЧрд┐рдЯрддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, рдХреЛрдИ CI рдорд┐рдирдЯ рдирд╣реАрдВрдбреЗрд╡рд▓рдкрд░ рдХреА рдорд╢реАрди рдФрд░ рдЙрдирдХреА API рдХреБрдВрдЬреА рдкрд░ рдЪрд▓рддрд╛ рд╣реИ
    Pull requestCI рдЬреЙрдмрдорд░реНрдЬ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдореАрдХреНрд╖рд╛, рд░рд╣рд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рдиCI рдорд┐рдирдЯ рдФрд░ рдкреНрд░рддрд┐ PR рдореЙрдбрд▓ рдХреЙрд▓
    рд░рд┐рд▓реАрдЬрд╝ рд╢рд╛рдЦрд╛CI рдЬреЙрдмрдХрд╡рд░реЗрдЬ рдкрд░ рдХрдбрд╝рд╛ рдЧреЗрдЯрд╕рд╕реНрддрд╛, рдХреЛрдИ рдореЙрдбрд▓ рдХреЙрд▓ рдирд╣реАрдВ
    рд░рдирдЯрд╛рдЗрдоCMSрдмрд┐рдирд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рдордЧреНрд░реА рдкрд░рд┐рд╡рд░реНрддрдирд╣реЛрд╕реНрдЯ рдХреА рдЧрдИ рдирд┐рд░реНрднрд░рддрд╛

    Pre-push: рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд▓реВрдк

    Husky рдХреЛрдб рдХреЗ рдорд╢реАрди рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд┐рд▓ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдиреБрд╡рд╛рдж рдЙрд╕реА рдкреБрд╢ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

    .husky/pre-push
    npx intlayer build
    npx intlayer fill --unpushed --mode complete
    

    --unpushed рдХрд╛рд░реНрдп рдХреЛ рдЙрд╕ рд╕рд╛рдордЧреНрд░реА рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрднреА рддрдХ рдкреБрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рд╣рд░ рдкреБрд╢ рдкрд░ рдПрдХ рдорд┐рдирдЯ рд▓реЗрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред --mode complete рдЬреЛ рдЧрд╛рдпрдм рд╣реИ рдЙрд╕реЗ рдмрд┐рдирд╛ рдЙрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рджреЛрдмрд╛рд░рд╛ рд▓рд┐рдЦреЗ рднрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рдореАрдХреНрд╖рд┐рдд рдЕрдиреБрд╡рд╛рдж рдХрднреА рднреА рдЪреБрдкрдЪрд╛рдк рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

    рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдРрдк рдХрд╛ рджрд╛рдпрд░рд╛ рддрдп рдХрд░реЗрдВ:

    .husky/pre-push
    npx intlayer build --base-dir ./app1
    npx intlayer fill --base-dir ./app1 --unpushed --mode complete
    npx intlayer build --base-dir ./app2
    npx intlayer fill --base-dir ./app2 --unpushed --mode complete
    

    рдиреБрдХрд╕рд╛рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдХ API рдХреБрдВрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд▓рд╛рдЧрдд рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдкрд░ рдЖрддреА рд╣реИ рдЬреЛ рдкреБрд╢ рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреАрдореЗрдВ рдХреБрдЫ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ CI рдореЗрдВ рд▓реЗ рдЬрд╛рддреА рд╣реИрдВред

    Pull request: рдЬрд╣рд╛рдБ рд╕рдореАрдХреНрд╖рд╛ рд╣реИ рд╡рд╣рд╛рдБ рднрд░реЗрдВ

    GitHub Actions рдореЗрдВ рд╡рд╣реА рдХрд╛рдо, рдбрд┐рдл рддрдХ рд╕реАрдорд┐рдд:

    .github/workflows/intlayer-translate.yml
    name: Intlayer Auto-Fill
    on:
      pull_request:
        branches: ["main"]
    
    permissions:
      contents: write
      pull-requests: write
    
    concurrency:
      group: "autofill-${{ github.ref }}"
      cancel-in-progress: true
    
    jobs:
      autofill:
        runs-on: ubuntu-latest
        env:
          AI_PROVIDER: openai
          AI_MODEL: gpt-5-mini
          AI_API_KEY: ${{ secrets.AI_API_KEY }}
        steps:
          - uses: actions/checkout@v4
            with:
              persist-credentials: true
              fetch-depth: 0
          - uses: actions/setup-node@v4
            with:
              node-version: 20
          - run: npm install
          - run: npx intlayer build
          - run: npx intlayer fill --git-diff --mode complete --provider $AI_PROVIDER --model $AI_MODEL --api-key $AI_API_KEY
          - name: Commit
            run: |
              if [ -n "$(git status --porcelain)" ]; then
                git config --local user.email "action@github.com"
                git config --local user.name "GitHub Action"
                git add .
                git commit -m "chore: auto-fill missing translations [skip ci]"
                git push origin HEAD:${{ github.head_ref }}
              fi
    

    рд╡рд╣рд╛рдБ рдЪрд╛рд░ рд╡рд┐рд╡рд░рдг рд▓реЛрдб-рдЕрд╕рд░ рд╡рд╛рд▓реЗ рд╣реИрдВ:

    • fetch-depth: 0 --git-diff рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрдХ рдЙрдерд▓реЗ рдХреНрд▓реЛрди рдХреЗ рдкрд╛рд╕ рдбрд┐рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрдзрд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд▓ рдЪреБрдкрдЪрд╛рдк рдХреБрдЫ рднреА рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
    • рдХрдорд┐рдЯ рд╕рдВрджреЗрд╢ рдореЗрдВ [skip ci] рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рдЦреБрдж рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЬреЙрдм рдХрдорд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд░рди рдЦреЛрд▓рддрд╛ рд╣реИ, рдЬреЛ рдлрд┐рд░ рд╕реЗ рдХрдорд┐рдЯ рдХрд░рддрд╛ рд╣реИред рд░рд╛рддреЛрдВ-рд░рд╛рдд CI рдмрдЬрдЯ рдЬрд▓рд╛рдиреЗ рдХрд╛ рдпрд╣ рдХреНрд▓рд╛рд╕рд┐рдХ рддрд░реАрдХрд╛ рд╣реИред
    • cancel-in-progress рдХреЗ рд╕рд╛рде concurrency рджреЛ рдкреБрд╢ рдХреЛ рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред
    • --git-diff рдлрд┐рд▓ рдХреЛ PR рдореЗрдВ рдмрджрд▓реЗ рдЧрдП рд╣рд┐рд╕реНрд╕реЗ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ рдЖрдк рд╣рд░ рд░рди рдкрд░ рдкреВрд░реЗ рдХреИрдЯрд▓реЙрдЧ рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВред

    рдЕрдиреБрд╡рд╛рдж PR рд╢рд╛рдЦрд╛ рдкрд░ рдПрдХ рдХрдорд┐рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдПрдХ рд╕рдореАрдХреНрд╖рдХ рдЙрдиреНрд╣реЗрдВ рдбрд┐рдл рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реИред рдорд░реНрдЬ рдХреЗ рдмрд╛рдж рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдпрд╣рд╛рдБ рдХрд░рдиреЗ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдпрд╣реА рд╣реИред

    рд░рд┐рд▓реАрдЬрд╝ рд╢рд╛рдЦрд╛: рдЧреЗрдЯ

    рдЧреЗрдЯ рдХреЛ рдХрд┐рд╕реА рдореЙрдбрд▓ рдПрдХреНрд╕реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рддреЗрдЬрд╝ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

    .github/workflows/ci.yml
    - run: npm run test:i18n
    

    CLI рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдмрдЬрд╛рдп рдХрд╡рд░реЗрдЬ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд:

    i18n.test.ts
    import { listMissingTranslations } from "intlayer/cli";
    
    test("has no missing required locales", async () => {
      const result = await listMissingTranslations();
      if (result.missingRequiredLocales.length > 0) {
        console.log(result.missingTranslations);
      }
      expect(result.missingRequiredLocales).toHaveLength(0);
    });
    

    npx intlayer content test рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╢реВрдиреНрдп рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░реЛрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; CI рдореЗрдВ рдЕрд╕рд░реНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЕрдиреБрдкрд╕реНрдерд┐рдд рдЕрдиреБрд╡рд╛рджреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореЗрдВ рдЕрдВрддрд░ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИред

    requiredLocales рд╡рд╣ рд╣реИ рдЬреЛ рдЧреЗрдЯ рдХреЛ рдЬреАрд╡рд┐рдд рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИ

    рд╕рднреА рдЕрдард╛рд░рд╣ рд▓реЛрдХреЗрд▓ рдХреА рдорд╛рдВрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЧреЗрдЯ рд╕рдмрд╕реЗ рдзреАрдореА рднрд╛рд╖рд╛ рдХреЗ рдЖрдиреЗ рддрдХ рд╣рд░ рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдорд╣реАрдиреЗ рдХреЗ рднреАрддрд░ рдЕрдХреНрд╖рдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
        requiredLocales: [Locales.ENGLISH],
        defaultLocale: Locales.ENGLISH,
      },
    };
    
    export default config;
    

    рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдХреЗрд▓ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ, рдЙрди рд▓реЛрдХреЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд░рдЦреЗрдВ рдЬреЛ рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред рдмрд╛рдХреА рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рднрд░реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрднреА рднреА рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдореЗрдВ рджреЗрд░реА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

    рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реЗрдкреЛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛

    рджреВрд╕рд░рд╛ рдореЙрдбрд▓ рдХреЛрдб рдореЗрдВ рдПрдХ рд▓реЛрдХреЗрд▓ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдФрд░ рдмрд╛рдХреА рдХреЛ рд▓рд╛рдЗрд╡ рд╕рд┐рдВрдХ рдХреЗ рд╕рд╛рде CMS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╣реИред рддрдм рд╕рд╛рдордЧреНрд░реА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХреЙрдкреА рдЧрддрд┐ рдХреЛ рдбрд┐рдкреНрд▓реЙрдп рдЧрддрд┐ рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред

    intlayer.config.ts
    const config: IntlayerConfig = {
      internationalization: {
        locales: [Locales.ENGLISH, Locales.SPANISH, Locales.FRENCH],
        requiredLocales: [Locales.ENGLISH],
        defaultLocale: Locales.ENGLISH,
      },
      editor: {
        clientId: process.env.INTLAYER_CLIENT_ID,
        clientSecret: process.env.INTLAYER_CLIENT_SECRET,
        liveSync: true,
      },
    };
    
    export default config;
    

    рдпрд╣ рдЙрди рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬрд╣рд╛рдБ рдЧреИрд░-рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЙрдкреА рдХреЗ рдорд╛рд▓рд┐рдХ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡реНрдпрд╛рдкрд╛рд░ рд╣реИ, рдЕрдкрдЧреНрд░реЗрдб рдирд╣реАрдВ: рдЖрдк рд╕рдВрдкрд╛рджрдХ рд╕реНрд╡рд╛рдпрддреНрддрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЧрд┐рдЯ рдЪреЗрдХрдЖрдЙрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдРрдк рдХреНрдпрд╛ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИред CMS рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд╡рд┐рд╡рд░рдгред

    рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ clientSecret рдПрдХ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╣реИред рдпрд╣ CI рд░рд╣рд╕реНрдпреЛрдВ рдФрд░ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ, рдХрднреА рднреА рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдирд╣реАрдВ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдВрдбрд▓ рддрдХ рдкрд╣реБрдБрдЪрддреА рд╣реИред

    рдИрдорд╛рдирджрд╛рд░ рд╕реАрдорд╛

    рдКрдкрд░ рд╕рдм рдХреБрдЫ рдХрд╡рд░реЗрдЬ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рдирд╣реАрдВред рдПрдХ рдорд╢реАрди рднрд░рд╛рд╡ рдПрдХ рджреГрд╢реНрдпрдорд╛рди рдЕрдВрддрд░ рдХреЛ рдПрдХ рдЕрджреГрд╢реНрдп рдЕрдВрддрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ: рдСрдбрд┐рдЯ рд╣рд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдВрдЬреА рдХрд╛ рдЕрдм рдПрдХ рдорд╛рди рд╣реИ, рдФрд░ рдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ рдкрдврд╝рд╛ рдирд╣реАрдВ рд╣реИред

    рдпрд╣ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдг, рдПрдХ рдЪреЗрдВрдЬрд▓реЙрдЧ рдпрд╛ рдПрдХ рдмреАрдЯрд╛ рд▓реЛрдХреЗрд▓ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдпрд╣ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рдг, рдХрд╛рдиреВрдиреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐, рднреБрдЧрддрд╛рди рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ, рдпрд╛ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЧреНрд░рд╛рд╣рдХ рддрдп рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрдврд╝рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдПрдХ рдорд╛рдирд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реВрдЯ рдХрд░реЗрдВ, рдФрд░ рд╣рд░ рдЬрдЧрд╣ --mode complete рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдПрдХ рд╕рдореАрдХреНрд╖рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрднреА рднреА рдмрд╛рдж рдХреЗ рд░рди рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рди рд╣реЛред

    рдореЙрдбрд▓ рдХреЛ рд╕рдВрджрд░реНрдн рджреЗрдВ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрдо рд╕реЗ рдХрдо рд╕реБрд╕рдВрдЧрдд рд╣реЛ:

    ts
    ai: {
      applicationContext: "B2B рдЗрдирд╡реЙрдЗрд╕рд┐рдВрдЧ рдРрдкред рдФрдкрдЪрд╛рд░рд┐рдХ рд░рдЬрд┐рд╕реНрдЯрд░ред рдЙрддреНрдкрд╛рдж рдХреЗ рдирд╛рдо рдХрд╛ рдХрднреА рдЕрдиреБрд╡рд╛рдж рди рдХрд░реЗрдВред",
    }
    

    рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддрд┐рдпрд╛рдБ

    • рдСрдЯреЛ-рдХрдорд┐рдЯ рдкрд░ рдХреЛрдИ [skip ci] рдирд╣реАрдВред рдХрд╛рдо рдПрдХ рд▓реВрдк рдореЗрдВ рдЦреБрдж рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
    • --git-diff рдХреЗ рд╕рд╛рде рдЙрдерд▓рд╛ рдХреНрд▓реЛрдиред рдбрд┐рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрдзрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рднреА рднрд░рд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
    • рд╣рд░ рд░рди рдкрд░ рдкреВрд░реЗ рдХреИрдЯрд▓реЙрдЧ рдХреЛ рднрд░рдирд╛ред --git-diff рдпрд╛ --unpushed рдХреЗ рд╕рд╛рде рд╕реНрдХреЛрдк рдХрд░реЗрдВ рдпрд╛ рдмрд┐рд▓ рджреЗрдЦреЗрдВред
    • рдЧреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ CLI рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдпрд╣ рд╢реВрдиреНрдп рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред
    • рдкреНрд░рддреНрдпреЗрдХ рд▓реЛрдХреЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ред рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рдпрд╣ рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рддреЛ рдЧреЗрдЯ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
    • рдмрд┐рдирд╛ рдЧреЗрдЯ рд╡рд╛рд▓рд╛ рдлрд┐рд▓ рдЬреЙрдмред рдХреБрдЫ рднреА рдХрднреА рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд╢реАрди рдХреЙрдкреА рдмрд┐рдирд╛ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдЙрддреНрдкрд╛рджрди рддрдХ рдкрд╣реБрдБрдЪрддреА рд╣реИред
    • рд░реЗрдкреЛ рдореЗрдВ рдореЙрдбрд▓ API рдХреБрдВрдЬрд┐рдпрд╛рдБред рд╡реЗ CI рд░рд╣рд╕реНрдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдЬреИрд╕реЗ clientSecretред

    рдЖрдЧреЗ рдкрдврд╝реЗрдВ

    рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

    рдЕрднреА рддрдХ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВред рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдмрдиреЗрдВред

    рд╕рдВрдмрдВрдзрд┐рдд рдкреЛрд╕реНрдЯ

    рдирд╡реАрдирддрдо рдкреЛрд╕реНрдЯ