# Example: CI/CD Integration This example demonstrates how to automatically translate i18n files in a CI/CD pipeline whenever the source file changes. ## Scenario Team maintains a multilingual web application. When developers update `en.json`, the CI/CD pipeline should automatically: 1. Detect the change 2. Translate to all target languages 3. Commit the translations back to the repository ## User Request > "Set up automatic translation in our GitHub Actions when en.json changes" ## Claude's Workflow ### Step 1: Understand Requirements Claude recognizes: - **Platform**: GitHub Actions (CI/CD) - **Trigger**: Changes to en.json - **Target languages**: Multiple (need to confirm with user) - **Mode**: Incremental (to save costs) ### Step 2: Confirm Configuration Claude asks: ``` To set up automatic translation, I need to know: 1. What languages do you want to translate to? 2. Where is your source file? (e.g., locales/en.json) 3. Do you have an OPENAI_API_KEY secret set in GitHub? ``` User responds: > "Translate to Chinese, Japanese, Korean, Spanish, and French. Source is `locales/en.json`. Yes, we have OPENAI_API_KEY in GitHub secrets." ### Step 3: Create GitHub Actions Workflow ```bash # Create workflow directory if it doesn't exist mkdir -p .github/workflows ``` Create workflow file: ```yaml # .github/workflows/translate-i18n.yml name: Auto-translate i18n files on: push: branches: - main - develop paths: - 'locales/en.json' jobs: translate: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 # Full history for proper git operations - name: Install Jta run: | curl -L https://github.com/hikanner/jta/releases/latest/download/jta-linux-amd64 -o jta chmod +x jta sudo mv jta /usr/local/bin/ jta --version - name: Translate to all languages env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} run: | # Use incremental mode to only translate changes # Non-interactive mode (-y) for CI/CD jta locales/en.json --to zh,ja,ko,es,fr --incremental -y - name: Check for translation changes id: check_changes run: | # Check if any translation files were modified if [[ -n $(git status -s locales/*.json) ]]; then echo "changes=true" >> $GITHUB_OUTPUT echo "Translation files were updated" else echo "changes=false" >> $GITHUB_OUTPUT echo "No translation changes" fi - name: Commit and push translations if: steps.check_changes.outputs.changes == 'true' run: | git config user.name "Translation Bot" git config user.email "bot@example.com" git add locales/*.json git add .jta/ # Include terminology updates git commit -m "chore: auto-translate i18n files - Updated translations for Chinese, Japanese, Korean, Spanish, French - Triggered by changes to en.json - Translated using Jta with incremental mode 🤖 Generated automatically by GitHub Actions" git push - name: Comment on commit (optional) if: steps.check_changes.outputs.changes == 'true' uses: actions/github-script@v7 with: script: | github.rest.repos.createCommitComment({ owner: context.repo.owner, repo: context.repo.repo, commit_sha: context.sha, body: '✅ Translations updated automatically by Jta' }) ``` ### Step 4: Set Up GitHub Secret Create instructions for the user: ```bash # In GitHub repository settings: # 1. Go to Settings → Secrets and variables → Actions # 2. Click "New repository secret" # 3. Name: OPENAI_API_KEY # 4. Value: your OpenAI API key (sk-...) # 5. Click "Add secret" ``` ### Step 5: Create Pre-commit Hook (Optional) For local development, create a pre-commit hook: ```bash # .git/hooks/pre-commit #!/bin/bash # Check if en.json was modified if git diff --cached --name-only | grep -q "locales/en.json"; then echo "🔍 en.json modified, checking translations..." # Check if API key exists if [[ -z "$OPENAI_API_KEY" ]]; then echo "⚠️ Warning: OPENAI_API_KEY not set. Translations will be updated in CI." else echo "🤖 Running incremental translation..." jta locales/en.json --to zh,ja,ko,es,fr --incremental -y # Stage updated translations git add locales/*.json .jta/ echo "✅ Translations updated and staged" fi fi exit 0 ``` Make it executable: ```bash chmod +x .git/hooks/pre-commit ``` ## Claude's Response to User ``` ✅ CI/CD auto-translation setup complete! I've created a GitHub Actions workflow that will automatically translate your i18n files. **What I created:** 1. `.github/workflows/translate-i18n.yml` - GitHub Actions workflow 2. Instructions for setting up the API key secret **How it works:** 1. When you push changes to `locales/en.json` (on main or develop branches) 2. GitHub Actions automatically: - Installs Jta - Translates to Chinese, Japanese, Korean, Spanish, French - Uses incremental mode (only translates new/changed keys) - Commits translations back to the repository **Configuration:** - Target languages: zh, ja, ko, es, fr - Mode: Incremental (saves ~90% API cost on updates) - Trigger: Changes to locales/en.json on main/develop - API key: Uses OPENAI_API_KEY from GitHub secrets **Next steps:** 1. Ensure `OPENAI_API_KEY` is set in your GitHub repository secrets 2. Commit and push the workflow file 3. Test by making a change to `locales/en.json` **Optional enhancement:** I can also create a pre-commit hook for local development, so translations run automatically before you commit. Would you like that? **Cost estimation:** - First run (full translation): ~$1.50 for 100 keys × 5 languages - Subsequent runs (incremental): ~$0.15-0.30 for typical updates - The incremental mode will save significant costs over time ``` ## Workflow Visualization ```mermaid sequenceDiagram participant Dev as Developer participant Git as Git Repository participant GHA as GitHub Actions participant Jta as Jta participant AI as AI Provider Dev->>Git: Push changes to en.json Git->>GHA: Trigger workflow GHA->>GHA: Checkout repository GHA->>GHA: Install Jta GHA->>Jta: Run translation (incremental) Jta->>AI: Translate changed keys AI-->>Jta: Return translations Jta->>Jta: Merge with existing translations Jta-->>GHA: Translation complete GHA->>Git: Commit translated files Git-->>Dev: Translations available ``` ## Testing the Workflow ### Test 1: Add New Keys ```bash # Add new keys to en.json vim locales/en.json ``` Add: ```json { "new": { "feature": "New Feature", "description": "This is a new feature" } } ``` Commit and push: ```bash git add locales/en.json git commit -m "feat: add new feature translations" git push ``` **Expected result:** - GitHub Actions triggers - Translates 2 new keys to 5 languages (10 translations total) - Commits translations back - Total time: ~30 seconds ### Test 2: Modify Existing Keys ```bash # Modify existing translation vim locales/en.json ``` Change: ```json { "app": { "welcome": "Welcome to our amazing platform!" } } ``` Commit and push: ```bash git add locales/en.json git commit -m "fix: improve welcome message" git push ``` **Expected result:** - GitHub Actions triggers - Updates 1 modified key in 5 languages - Preserves all other translations - Total time: ~15 seconds ## Advanced Configuration ### Multi-Environment Setup ```yaml name: Auto-translate i18n files on: push: branches: - main - develop paths: - 'locales/en.json' jobs: translate: runs-on: ubuntu-latest strategy: matrix: environment: [staging, production] steps: # ... (installation steps) - name: Translate env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} run: | if [[ "${{ matrix.environment }}" == "production" ]]; then # Use highest quality for production jta locales/en.json --to zh,ja,ko,es,fr \ --provider anthropic \ --model claude-sonnet-4-5 \ --incremental -y else # Use faster/cheaper for staging jta locales/en.json --to zh,ja,ko,es,fr \ --incremental -y fi ``` ### With Approval Step ```yaml jobs: translate: runs-on: ubuntu-latest environment: name: translation-approval # Requires manual approval before running steps: # ... (translation steps) ``` ### With Slack Notifications ```yaml - name: Notify Slack if: steps.check_changes.outputs.changes == 'true' uses: slackapi/slack-github-action@v1 with: webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }} payload: | { "text": "✅ Translations updated for commit ${{ github.sha }}", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*Translations Updated*\nCommit: <${{ github.event.head_commit.url }}|${{ github.event.head_commit.message }}>" } } ] } ``` ## Best Practices 1. **Use incremental mode** in CI/CD to save costs 2. **Non-interactive mode** (`-y`) for automation 3. **Commit terminology** (`.jta/`) for consistency 4. **Set up branch protection** to require CI checks 5. **Monitor API usage** and costs 6. **Use caching** for jta binary to speed up workflow ## Cost Optimization ### Before (Manual Translation) - Developer time: ~2 hours per update - Inconsistent quality - Often delayed or forgotten ### After (Automated with Jta) - Developer time: 0 (fully automated) - Consistent high quality (Agentic reflection) - Instant updates - API cost: ~$0.15-0.30 per update (incremental) ### Annual Savings Example Assuming: - 50 updates to en.json per year - 5 target languages - ~$0.20 per update (incremental) **Cost:** - API: $10/year - Developer time saved: 100 hours/year - ROI: Massive (100+ hours saved vs $10 API cost) ## Troubleshooting ### Workflow Fails: "API key not found" **Solution:** ```bash # Ensure secret is set correctly in GitHub # Settings → Secrets → Actions → OPENAI_API_KEY ``` ### Workflow Fails: "Permission denied" **Solution:** Add write permissions to workflow: ```yaml permissions: contents: write # Allow pushing commits ``` ### Rate Limiting **Solution:** Add retry logic or reduce concurrency: ```yaml - name: Translate with retry env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} run: | for i in {1..3}; do jta locales/en.json --to zh,ja,ko,es,fr \ --incremental \ --batch-size 10 \ --concurrency 1 \ -y && break echo "Retry $i/3 after rate limit..." sleep 60 done ```