#!/bin/bash # Syncs Crowdin translations from develop to version-16-hotfix. # Merge logic: see merge_po_files.py. # Env: GH_TOKEN, PR_REVIEWER, GITHUB_WORKSPACE (all set by Actions). set -e cd ~ || exit echo "=== Setting up bench ===" pip install frappe-bench bench -v init frappe-bench --skip-assets --skip-redis-config-generation --python "$(which python)" cd ./frappe-bench || exit bench get-app --skip-assets erpnext "${GITHUB_WORKSPACE}" echo "=== Fetching develop's .po files ===" mkdir -p /tmp/develop-po git -C "${GITHUB_WORKSPACE}" fetch origin develop git -C "${GITHUB_WORKSPACE}" archive origin/develop erpnext/locale/ \ | tar -xf - -C /tmp/develop-po/ po_count=$(find /tmp/develop-po/erpnext/locale -name "*.po" | wc -l) if [ "${po_count}" -eq 0 ]; then echo "ERROR: No .po files found in develop's archive. Aborting." >&2 exit 1 fi echo "Extracted ${po_count} .po file(s) from develop." echo "=== Merging and reconciling ===" env/bin/python "${GITHUB_WORKSPACE}/.github/helper/merge_po_files.py" bench update-po-files --app erpnext cd ./apps/erpnext || exit git config user.email "developers@erpnext.com" git config user.name "frappe-pr-bot" git remote set-url upstream https://github.com/frappe/erpnext.git if git diff --quiet erpnext/locale/; then echo "Translations are already up to date. No PR needed." exit 0 fi echo "Changed files:" git diff --name-only erpnext/locale/ echo "=== Committing and pushing ===" git checkout -B translations_hotfix git add erpnext/locale/ git commit -m "fix: sync translations to version-16-hotfix" gh auth setup-git git push -u upstream translations_hotfix --force echo "=== Opening PR (if not already open) ===" existing_pr=$(gh pr list \ --base "version-16-hotfix" \ --head "translations_hotfix" \ --state open \ --json number \ --jq 'length' \ -R frappe/erpnext) if [ "${existing_pr}" -gt 0 ]; then echo "PR already open — branch updated in place. No new PR needed." exit 0 fi gh pr create \ --base "version-16-hotfix" \ --head "translations_hotfix" \ --title "fix: sync translations to version-16-hotfix" \ --body "Automated sync of Crowdin translations from \`develop\` to \`version-16-hotfix\`. A 3-way merge is performed per language, then \`bench update-po-files\` reconciles each \`.po\` against hotfix's \`main.pot\`: | Case | Condition | Result | |------|-----------|--------| | **a** | \`msgid\` in hotfix's \`main.pot\`, **not** in develop's \`.po\` | Hotfix's existing \`msgstr\` is **preserved** (string removed from develop but still needed in hotfix) | | **b** | \`msgid\` **not** in hotfix's \`main.pot\` | **Dropped** from hotfix's \`.po\` | | **c** | \`msgid\` in both hotfix's \`main.pot\` and develop's \`.po\` | Develop's \`msgstr\` is used (Crowdin translation wins) | Generated by the \`sync-hotfix-translations\` workflow." \ --label "translation" \ --label "skip-release-notes" \ --reviewer "${PR_REVIEWER}" \ -R frappe/erpnext