From 68f083a6d169ec523fa9d46b7cc40addb1e4ffbe Mon Sep 17 00:00:00 2001 From: opgl Date: Sun, 16 Mar 2025 09:52:43 +0100 Subject: [PATCH] CI: Automatically synchronize translations with CrowdIn --- .../workflows/fetch_crowdin_translations.yml | 64 +++++++++++++++++++ .../workflows/push_crowdin_translations.yml | 42 ++++++++++++ src/Tools/updatecrowdin.py | 19 +++--- 3 files changed, 117 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/fetch_crowdin_translations.yml create mode 100644 .github/workflows/push_crowdin_translations.yml diff --git a/.github/workflows/fetch_crowdin_translations.yml b/.github/workflows/fetch_crowdin_translations.yml new file mode 100644 index 0000000000..c9ed848ab4 --- /dev/null +++ b/.github/workflows/fetch_crowdin_translations.yml @@ -0,0 +1,64 @@ +name: Fetch Crowdin Translations + +on: + workflow_dispatch: + schedule: + - cron: "0 0 * * 1" + +jobs: + update-crowdin: + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Qt ≥ 6.8 + uses: jurplel/install-qt-action@v3 + with: + aqtversion: "==3.1.*" + version: "6.8.3" + host: "linux" + target: "desktop" + arch: "linux_gcc_64" + + - name: Setup Python & dependencies + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install Python packages + run: | + python3 -m pip install --upgrade pip + pip install pyside6 + + - name: Gather translations from crowdin + run: | + ./updatecrowdin.py build + while ./updatecrowdin.py build-status | grep -q "status: inProgress"; do sleep 10; done + ./updatecrowdin.py download + ./updatecrowdin.py install + working-directory: ./src/Tools + env: + CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }} + CROWDIN_PROJECT_ID: freecad + + - name: Commit changes + run: | + git config --global user.name "github-actions" + git config --global user.email "github-actions@github.com" + git add -A + git commit -m "Update translations from Crowdin" || echo "No changes to commit" + + - name: Push changes to a new branch + run: | + git branch update-crowdin-translations + git push origin update-crowdin-translations --force + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v6 + with: + branch: update-crowdin-translations + title: "Update translations from Crowdin" + body: "Automatic Crowdin update." + labels: "translations, automated" diff --git a/.github/workflows/push_crowdin_translations.yml b/.github/workflows/push_crowdin_translations.yml new file mode 100644 index 0000000000..693d9af565 --- /dev/null +++ b/.github/workflows/push_crowdin_translations.yml @@ -0,0 +1,42 @@ +name: Push Crowdin Translations + +on: + workflow_dispatch: + schedule: + - cron: "0 0 * * 1" + +jobs: + update-crowdin: + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Qt ≥ 6.8 + uses: jurplel/install-qt-action@v3 + with: + aqtversion: "==3.1.*" + version: "6.8.3" + host: "linux" + target: "desktop" + arch: "linux_gcc_64" + + - name: Setup Python & dependencies + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install Python packages + run: | + python3 -m pip install --upgrade pip + pip install pyside6 + + - name: Push translations to Crowdin + run: | + ./updatecrowdin.py gather + ./updatecrowdin.py upload + working-directory: ./src/Tools + env: + CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }} + CROWDIN_PROJECT_ID: freecad diff --git a/src/Tools/updatecrowdin.py b/src/Tools/updatecrowdin.py index af2be286d0..3d1ac1a720 100755 --- a/src/Tools/updatecrowdin.py +++ b/src/Tools/updatecrowdin.py @@ -325,12 +325,15 @@ class CrowdinUpdater: def load_token(): - # load API token stored in ~/.crowdin-freecad-token - config_file = os.path.expanduser("~") + os.sep + ".crowdin-freecad-token" + # try to read token from ~/.crowdin-freecad-token + config_file = os.path.join(os.path.expanduser("~"), ".crowdin-freecad-token") if os.path.exists(config_file): - with open(config_file) as file: - return file.read().strip() - return None + with open(config_file, "r") as file: + token = file.read().strip() + if token: + return token + # if file does'nt exists read from CROWDIN_TOKEN + return os.environ.get("CROWDIN_TOKEN") def updateqrc(qrcpath, lncode): @@ -522,9 +525,9 @@ if __name__ == "__main__": project_identifier = os.environ.get("CROWDIN_PROJECT_ID") if not project_identifier: - project_identifier = "freecad" - # print('CROWDIN_PROJECT_ID env var must be set') - # sys.exit() + # project_identifier = "freecad" + print("CROWDIN_PROJECT_ID env var must be set") + sys.exit() updater = CrowdinUpdater(token, project_identifier)