Skip to main content

การตรวจสอบคำแปลใน CI : ทำให้การตรวจ i18n ในไปป์ไลน์เป็นอัตโนมัติ

ข้อบกพร่องคำแปลมองไม่เห็นในการตรวจโค้ด คีย์ที่หาย ตัวยึดตำแหน่งเสียหาย หรือพหูพจน์ผิดรูปไม่ปรากฏในส่วนต่าง การตรวจระดับ CI จะจับก่อนถึงระบบจริง

1

เหตุใดข้อบกพร่องคำแปลจึงหลุดผ่านการตรวจโค้ด

นักพัฒนาเพิ่ม 10 คีย์ใน en.json และอัปเดตโค้ด ผู้ตรวจ PR ตรวจโค้ดกับอังกฤษแล้วอนุมัติ แต่ไม่มีใครเปรียบเทียบอีก 14 ภาษา ข้อบกพร่องสามรายการเข้าสู่ระบบจริง : de.json ขาด 2 คีย์ ผู้ใช้เยอรมันเห็นพาธดิบ, fr.json มีตัวยึด {count} เสีย ผู้ใช้เห็น {count} ตามตัวอักษร และ ja.json มีพหูพจน์ ICU ผิดรูปจนแอปหยุด ทั้งหมดป้องกันได้ด้วยการตรวจ CI 30 วินาที

ข้อบกพร่องคำแปลมีลักษณะเฉพาะ คือผู้พัฒนาและผู้ตรวจมองไม่เห็น มีเพียงผู้ใช้ภาษาเฉพาะที่เห็น การตรวจ CI เป็นวิธีเดียวที่เชื่อถือได้ในการจับก่อนระบบจริง
2

ติดตั้ง i18n-validate

เพิ่ม i18n-validate เป็นการพึ่งพาสำหรับพัฒนา รองรับ JSON, YAML, PO, XLIFF และ ARB ให้ทันที โดยไม่ต้องกำหนดค่าสำหรับการใช้พื้นฐาน

Terminal
npm install --save-dev @anthropic/i18n-validate
3

การเชื่อมต่อ GitHub Actions

เพิ่ม i18n-validate เป็นขั้นตอนในเวิร์กโฟลว์ pull request เครื่องมือจบด้วยโค้ด 1 เมื่อพบข้อผิดพลาดจึงทำให้การตรวจ PR ล้มเหลว ใช้ผล JUnit XML กับ test reporter เพื่อรับคำอธิบายโดยตรงบนส่วนต่าง PR

.github/workflows/i18n-validate.yml
# .github/workflows/i18n-validate.yml
name: Validate Translations

on:
  pull_request:
    paths:
      - 'src/locales/**'
      - 'public/locales/**'

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Install dependencies
        run: npm ci

      - name: Validate translation files
        run: npx i18n-validate \
          --source src/locales/en.json \
          --targets 'src/locales/*.json' \
          --check-missing \
          --check-unused \
          --check-placeholders \
          --check-plurals \
          --min-coverage 95 \
          --junit-output reports/i18n.xml

      - name: Upload report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: i18n-validation-report
          path: reports/i18n.xml
ตรึงเวอร์ชัน i18n-validate ในเวิร์กโฟลว์เพื่อหลีกเลี่ยงการเสียหายจากกฎใหม่ ใช้ @latest เฉพาะระหว่างพัฒนา
4

การเชื่อมต่อ GitLab CI

เพิ่มงานตรวจคำแปลในไปป์ไลน์ .gitlab-ci.yml GitLab รองรับอาร์ติแฟกต์ JUnit XML โดยตรง อัปโหลดรายงานแล้วข้อผิดพลาดจะปรากฏในแท็บ Test ของ merge request

.gitlab-ci.yml
# .gitlab-ci.yml
i18n-validate:
  stage: test
  image: node:20
  script:
    - npm ci
    - npx i18n-validate \
        --source src/locales/en.json \
        --targets 'src/locales/*.json' \
        --check-missing \
        --check-unused \
        --check-placeholders \
        --min-coverage 95 \
        --junit-output reports/i18n.xml
  artifacts:
    reports:
      junit: reports/i18n.xml
  only:
    changes:
      - src/locales/**/*
5

ฮุก Pre-Commit

เพื่อรับผลเร็วขึ้น ให้รันการตรวจเป็นฮุก pre-commit จับปัญหาก่อนถึง CI ประหยัดเวลาไปป์ไลน์และลดวงจรผลตอบกลับ ใช้ Husky (JS) หรือ pre-commit (Python) จัดการฮุก

.husky/pre-commit
# .husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

# Only validate if translation files changed
CHANGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '(locales|i18n|translations)/')

if [ -n "$CHANGED_FILES" ]; then
  echo "Translation files changed, validating..."
  npx i18n-validate \
    --source src/locales/en.json \
    --targets 'src/locales/*.json' \
    --check-missing \
    --check-placeholders
fi
ฮุก pre-commit รันทุกคอมมิตจึงต้องเร็ว ใช้แฟล็ก --locales ตรวจเฉพาะภาษาที่เปลี่ยนในคอมมิตปัจจุบันแทนทุกภาษา ทำให้โปรเจกต์ส่วนใหญ่รันต่ำกว่า 2 วินาที
6

การกำหนดค่าและระดับความรุนแรง

ปรับพฤติกรรมด้วย .i18n-validate.toml ตั้งระดับกฎ (error, warning, off) กำหนดภาษาที่คาดหวัง ไม่รวมภาษาที่กำลังทำ และตั้งรูปแบบผลลัพธ์ ใน CI เฉพาะ error ทำให้ไปป์ไลน์ล้ม ส่วน warning แสดงในรายงานแต่ไม่บล็อก

i18n-validate.config.json
// i18n-validate.config.json
{
  "source": "src/locales/en.json",
  "targets": "src/locales/*.json",
  "checks": {
    "missing": true,         // Keys in source missing from target
    "unused": true,          // Keys in target not in source
    "placeholders": true,    // Mismatched {variables}
    "plurals": true,         // Missing CLDR plural forms
    "icu": true,             // ICU syntax validation
    "emptyValues": true,     // Empty string values
    "duplicateValues": false // Same value as source (untranslated)
  },
  "minCoverage": 95,
  "exclude": [
    "src/locales/pseudo.json"
  ],
  "junitOutput": "reports/i18n.xml",
  "format": "json"          // json | yaml | po | xliff
}

ลองใช้ i18n Agent ตอนนี้

ลากและวางไฟล์แปลของคุณที่นี่

JSON, YAML, PO, XML, CSV, Markdown, Properties

หรือคลิกเพื่อเลือกไฟล์

ภาษาเป้าหมาย

ไม่ต้องลงทะเบียนประเมินราคาได้ทันที

คำถามที่พบบ่อยเกี่ยวกับการตรวจคำแปลใน CI