name: Update Translations on: push: paths: - 'install.sh' - 'fail2ban_manager.sh' - 'file_manager.sh' - 'translate.py' branches: - main workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: update-translations: runs-on: ubuntu-latest steps: - name: Check running workflows uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} - uses: actions/checkout@v4 with: persist-credentials: true - name: Restore translation cache id: cache-translations uses: actions/cache@v3 with: path: po/cache_*.json key: ${{ runner.os }}-translations-${{ hashFiles('po/*.po') }} restore-keys: | ${{ runner.os }}-translations- - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y gettext python3 python3-pip i18nspector pip3 install googletrans-py langdetect openai - name: Cache Python dependencies uses: actions/cache@v3 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-googletrans-py-langdetect-openai restore-keys: | ${{ runner.os }}-pip- - name: Setup directories run: | mkdir -p po mkdir -p languages/{en,fa,ru,zh_CN,ko,fr}/LC_MESSAGES - name: Extract strings from specified scripts run: | echo "install.sh" > po/POTFILES.in echo "fail2ban_manager.sh" >> po/POTFILES.in echo "file_manager.sh" >> po/POTFILES.in xgettext \ --files-from=po/POTFILES.in \ --from-code=UTF-8 \ --language=Shell \ --keyword=gettext \ --package-name=xray_install \ --package-version=1.0 \ --msgid-bugs-address=https://github.com/hello-yunshu/Xray_bash_onekey/issues \ --copyright-holder="yunshu" \ --output=po/xray_install.pot - name: Update/Create PO files run: | rm -f po/*.po for lang in zh_CN en fa ru ko fr; do msginit --no-translator --locale=$lang --input=po/xray_install.pot --output=po/$lang.po done - name: Auto translate run: python3 translate.py env: AI_API_KEY: ${{ secrets.AI_API_KEY }} - name: Compile MO files if necessary run: | needs_compile=false for lang in en fa ru ko fr; do if [ ! -f "po/${lang}.po.no-update" ]; then needs_compile=true if ! msgfmt --check -v --statistics -o languages/${lang}/LC_MESSAGES/xray_install.mo po/${lang}.po; then echo "Error in ${lang}.po file:" cat po/${lang}.po fi fi done if [ "$needs_compile" = false ]; then echo "No translations were updated. Skipping MO file compilation." fi - name: Run i18nspector checks on PO files run: | i18nspector check po/ - name: Run i18nspector checks on MO files if compiled run: | for lang in en fa ru ko fr; do if [ ! -f "po/${lang}.po.no-update" ] && [ -f "languages/${lang}/LC_MESSAGES/xray_install.mo" ]; then i18nspector check-binary languages/${lang}/LC_MESSAGES/xray_install.mo fi done - name: Save translation cache if: always() uses: actions/cache@v3 with: path: po/cache_*.json key: ${{ runner.os }}-translations-${{ hashFiles('po/*.po') }} - name: Pull changes run: | git pull origin main - name: Commit changes if necessary run: | needs_commit=false for lang in en fa ru ko fr; do if [ ! -f "po/${lang}.po.no-update" ]; then needs_commit=true break else rm po/${lang}.po.no-update fi done if [ "$needs_commit" = true ]; then git config --local user.email "action@github.com" git config --local user.name "GitHub Action" git add po/ languages/ git commit -m "Update translations for all languages [$(date +%Y-%m-%d)]" || echo "No changes to commit" git push else echo "No translations were updated. Skipping commit and push." fi