使用 Cursor CLI 自動管理國際化翻譯鍵值。這個工作流程會偵測 pull request 中新增或變更的 i18n 鍵值,並補齊缺失的翻譯,同時不會覆蓋現有翻譯。
name: Auto Translate Keys

on:
  pull_request:
    types: [opened, synchronize, reopened, ready_for_review]

permissions:
  contents: write
  pull-requests: write

jobs:
  i18n:
    if: ${{ !startsWith(github.head_ref, 'translate/') }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install Cursor CLI
        run: |
          curl https://cursor.com/install -fsS | bash
          echo "$HOME/.cursor/bin" >> $GITHUB_PATH

      - name: Configure git identity
        run: |
          git config user.name "Cursor Agent"
          git config user.email "cursoragent@cursor.com"

      - name: Propose i18n updates
        env:
          CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
          MODEL: gpt-5
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          BRANCH_PREFIX: translate
        run: |
          cursor-agent -p "你正在 GitHub Actions runner 中運行。

          GitHub CLI 可透過 `gh` 使用並透過 `GH_TOKEN` 進行身份驗證。Git 可用。你有專案內容的寫入權限,可以對 pull request 進行評論,但不能直接建立或編輯 PR。

          # 背景:
          - 專案:${{ github.repository }}
          - PR 編號:${{ github.event.pull_request.number }}
          - Head Ref:${{ github.head_ref }}
          - 翻譯分支前綴:${{ env.BRANCH_PREFIX }}

          # 目標:
          - 偵測 PR 中新增或變更的 i18n 鍵值,並僅補齊訊息檔案中缺失的語系。絕不覆蓋現有翻譯。

          # 要求:
          1) 透過檢查 PR diff(原始檔案和訊息檔案)來確定變更的鍵值。
          2) 使用來源/標準語系作為基準,計算每個語系缺失的鍵值。
          3) 僅為缺失的鍵值新增項目。保持所有現有值不變。
          4) 驗證 JSON 格式和結構。
          5) 使用背景中的翻譯分支前綴為此 PR head 維護一個持久的翻譯分支。如果缺失則建立,否則更新,並將變更推送到 origin。
          6) 在原始 PR 上發布或更新一個用自然語言撰寫的 PR 評論(1-2 句話),簡要說明更新了什麼以及原因,並包含一個內聯比較連結以快速建立 PR。
          7) 避免重複評論;如果存在先前的機器人評論,則更新它。
          8) 如果不需要變更,則不進行提交且不發布評論。

          # 輸入和慣例:
          - 使用 `gh pr diff` 和 git 歷史來偵測變更。

          # 發生更新時的交付項目:
          - 推送提交到此 PR head 的持久翻譯分支。
          - 在原始 PR 上發布一個自然語言 PR 評論,包含上述比較連結。
          " --force --model "$MODEL" --output-format=text