From a4837037d30addd4d88c61fd3cc5bb0013a553c6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 15:30:58 +0000 Subject: [PATCH 1/5] Initial plan From c4afcd1686f07bce7721f8ea993714b38194b1a8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 15:37:05 +0000 Subject: [PATCH 2/5] Remove emotional language from markdown and YAML files Co-authored-by: nielsdrost7 <47660417+nielsdrost7@users.noreply.github.com> --- .github/CHECKLIST.md | 2 +- .github/THEMES.md | 2 +- .github/workflows/release.yml | 8 ++++---- README.md | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/CHECKLIST.md b/.github/CHECKLIST.md index a8fe3a41a..d86b8a408 100644 --- a/.github/CHECKLIST.md +++ b/.github/CHECKLIST.md @@ -18,7 +18,7 @@ Maybe I'll do the *settings* per module as a separate row in this checklist. ## Test Coverage -| Module | Submodule | Index (happy) | Specials (happy) | Create (happy) | Update (happy) | Delete (happy) | Translations | +| Module | Submodule | Index | Specials | Create | Update | Delete | Translations | |-----------|------------------|:-------------:|:----------------:|:--------------:|:--------------:|:--------------:|:------------:| | clients | | | | | | | | | | user_clients | | | | | | | diff --git a/.github/THEMES.md b/.github/THEMES.md index eceff8a57..fd99a373e 100644 --- a/.github/THEMES.md +++ b/.github/THEMES.md @@ -42,7 +42,7 @@ Based on the popular Nord color palette, this theme features cool, arctic-inspir - Warning: #ebcb8b (yellow) - Success: #a3be8c (green) -**Best For:** Developers who love the Nord color scheme, or anyone preferring a cool, calming interface +**Best For:** Developers who prefer the Nord color scheme, or anyone preferring a cool, calming interface ### 4. Orange **File:** `orange.css` diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 40a8fc07a..4985c1882 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -444,22 +444,22 @@ jobs: echo "=========================================" | tee -a "$LOG_FILE" # Add to GitHub Actions summary - echo "## 🎉 Release Build Complete" >> $GITHUB_STEP_SUMMARY + echo "## Release Build Complete" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Version:** \`${{ env.NEW_TAG }}\`" >> $GITHUB_STEP_SUMMARY echo "**Type:** ${{ env.RELEASE_TYPE }}" >> $GITHUB_STEP_SUMMARY echo "**Package:** \`${{ env.RELEASE_FILE }}\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📦 Download" >> $GITHUB_STEP_SUMMARY + echo "### Download" >> $GITHUB_STEP_SUMMARY echo "- Artifact: \`ip-${{ env.NEW_VERSION }}\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔐 Checksums" >> $GITHUB_STEP_SUMMARY + echo "### Checksums" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY echo "SHA256: ${{ env.SHA256_HASH }}" >> $GITHUB_STEP_SUMMARY echo "MD5: ${{ env.MD5_HASH }}" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps" >> $GITHUB_STEP_SUMMARY + echo "### Next Steps" >> $GITHUB_STEP_SUMMARY echo "1. Review the draft release in GitHub" >> $GITHUB_STEP_SUMMARY echo "2. Test the package if needed" >> $GITHUB_STEP_SUMMARY echo "3. Publish the release when ready" >> $GITHUB_STEP_SUMMARY diff --git a/README.md b/README.md index ad31ba225..0798dfee9 100644 --- a/README.md +++ b/README.md @@ -195,4 +195,4 @@ Special thanks to all our [contributors](https://github.com/InvoicePlane/Invoice --- -**Made with by the InvoicePlane community** +**Developed by the InvoicePlane community** From 2e46628731f99e16c6668e095d26ea6c0dc842f6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 15:39:24 +0000 Subject: [PATCH 3/5] Add Crowdin translation sync workflow and update documentation Co-authored-by: nielsdrost7 <47660417+nielsdrost7@users.noreply.github.com> --- .github/MAINTENANCE.md | 24 ++++++++ .github/workflows/README.md | 26 ++++++++ .github/workflows/crowdin-sync.yml | 95 ++++++++++++++++++++++++++++++ .junie/guidelines.md | 2 +- 4 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/crowdin-sync.yml diff --git a/.github/MAINTENANCE.md b/.github/MAINTENANCE.md index 5e953c659..42f77728f 100644 --- a/.github/MAINTENANCE.md +++ b/.github/MAINTENANCE.md @@ -256,6 +256,30 @@ These workflows can be triggered manually or on a schedule to: - Run tests - Create pull requests with updates +### Crowdin Translation Sync + +InvoicePlane v2 includes a GitHub Actions workflow for automated translation management: + +- **Crowdin Sync Workflow** - `.github/workflows/crowdin-sync.yml` + +This workflow can be triggered manually with three action types: + +1. **upload-sources** - Upload source translation files to Crowdin +2. **download-translations** - Download translated files from Crowdin (default) +3. **sync-bidirectional** - Upload sources and download translations + +The workflow runs automatically on a weekly schedule (Sundays at 2:00 AM UTC) to download new translations and create pull requests. + +**Required Secrets:** +- `CROWDIN_PROJECT_ID` - Your Crowdin project ID +- `CROWDIN_PERSONAL_TOKEN` - Your Crowdin personal access token + +**Manual Trigger:** +```bash +# Go to Actions tab → Crowdin Translation Sync → Run workflow +# Select desired action type +``` + See: `.github/workflows/` directory for workflow details. --- diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 28f3bd84b..3ea0dd808 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -152,6 +152,32 @@ Tests Docker Compose configuration. Provides a quick setup for development environments. +### 9. Crowdin Translation Sync (`crowdin-sync.yml`) + +**Trigger:** +- Scheduled: Weekly on Sundays at 2:00 AM UTC +- Manual dispatch with action type selection + +**Purpose:** Automates translation synchronization with Crowdin + +**What it does:** +1. **Uploads source files** - Pushes English translation files to Crowdin +2. **Downloads translations** - Retrieves translated files from Crowdin +3. **Creates pull request** - Automated PR with translation updates + +**Action Types:** +- `upload-sources` - Upload source translation files only +- `download-translations` - Download translated files only (default) +- `sync-bidirectional` - Both upload and download + +**Required Secrets:** +- `CROWDIN_PROJECT_ID` - Your Crowdin project ID +- `CROWDIN_PERSONAL_TOKEN` - Your Crowdin personal access token + +**Required Permissions:** +- `contents: write` - For creating branches and commits +- `pull-requests: write` - For creating pull requests + ## Dependency Management ### GitHub Dependabot diff --git a/.github/workflows/crowdin-sync.yml b/.github/workflows/crowdin-sync.yml new file mode 100644 index 000000000..5d56b44fd --- /dev/null +++ b/.github/workflows/crowdin-sync.yml @@ -0,0 +1,95 @@ +name: Crowdin Translation Sync + +on: + workflow_dispatch: + inputs: + action: + description: 'Action to perform' + required: true + type: choice + options: + - upload-sources + - download-translations + - sync-bidirectional + default: 'download-translations' + schedule: + # Run weekly on Sundays at 2:00 AM UTC + - cron: '0 2 * * 0' + +permissions: + contents: write + pull-requests: write + +jobs: + crowdin-sync: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Upload sources to Crowdin + if: github.event.inputs.action == 'upload-sources' || github.event.inputs.action == 'sync-bidirectional' + uses: crowdin/github-action@v2 + with: + upload_sources: true + upload_translations: false + download_translations: false + localization_branch_name: master + config: 'crowdin.yml' + env: + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + + - name: Download translations from Crowdin + if: github.event.inputs.action == 'download-translations' || github.event.inputs.action == 'sync-bidirectional' || github.event_name == 'schedule' + uses: crowdin/github-action@v2 + with: + upload_sources: false + upload_translations: false + download_translations: true + localization_branch_name: master + create_pull_request: true + pull_request_title: 'chore(i18n): update translations from Crowdin' + pull_request_body: | + ## Translation Update + + This PR updates translations downloaded from Crowdin. + + **Triggered by:** ${{ github.event_name }} + **Action:** ${{ github.event.inputs.action || 'download-translations' }} + + ### Review Checklist + + - [ ] Review translation changes for accuracy + - [ ] Check for any formatting issues + - [ ] Verify no code is affected + - [ ] Test translations in UI if possible + + --- + + *This PR was automatically created by the Crowdin Sync workflow.* + pull_request_labels: | + i18n + translations + crowdin + automated-pr + config: 'crowdin.yml' + env: + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Workflow summary + run: | + echo "## Crowdin Sync Complete" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Action:** ${{ github.event.inputs.action || 'download-translations' }}" >> $GITHUB_STEP_SUMMARY + echo "**Triggered by:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### Next Steps" >> $GITHUB_STEP_SUMMARY + echo "- Review the created pull request (if any)" >> $GITHUB_STEP_SUMMARY + echo "- Verify translation changes" >> $GITHUB_STEP_SUMMARY + echo "- Merge when ready" >> $GITHUB_STEP_SUMMARY diff --git a/.junie/guidelines.md b/.junie/guidelines.md index 3fc02b98b..c73466b35 100644 --- a/.junie/guidelines.md +++ b/.junie/guidelines.md @@ -532,7 +532,7 @@ This document should be updated as: - Best practices evolve - Performance optimizations discovered -**Last Updated:** 2025-11-13 +**Last Updated:** 2025-12-29 --- From 225fb2fdbe8191f3365efe8332657c25fa7245b6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 15:53:39 +0000 Subject: [PATCH 4/5] Restore 'happy' in CHECKLIST.md and add GitHub secrets setup instructions Co-authored-by: nielsdrost7 <47660417+nielsdrost7@users.noreply.github.com> --- .github/CHECKLIST.md | 2 +- .github/MAINTENANCE.md | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/CHECKLIST.md b/.github/CHECKLIST.md index d86b8a408..a8fe3a41a 100644 --- a/.github/CHECKLIST.md +++ b/.github/CHECKLIST.md @@ -18,7 +18,7 @@ Maybe I'll do the *settings* per module as a separate row in this checklist. ## Test Coverage -| Module | Submodule | Index | Specials | Create | Update | Delete | Translations | +| Module | Submodule | Index (happy) | Specials (happy) | Create (happy) | Update (happy) | Delete (happy) | Translations | |-----------|------------------|:-------------:|:----------------:|:--------------:|:--------------:|:--------------:|:------------:| | clients | | | | | | | | | | user_clients | | | | | | | diff --git a/.github/MAINTENANCE.md b/.github/MAINTENANCE.md index 42f77728f..b1306e45b 100644 --- a/.github/MAINTENANCE.md +++ b/.github/MAINTENANCE.md @@ -271,8 +271,17 @@ This workflow can be triggered manually with three action types: The workflow runs automatically on a weekly schedule (Sundays at 2:00 AM UTC) to download new translations and create pull requests. **Required Secrets:** -- `CROWDIN_PROJECT_ID` - Your Crowdin project ID -- `CROWDIN_PERSONAL_TOKEN` - Your Crowdin personal access token + +To configure GitHub secrets for the Crowdin workflow: + +1. Go to your repository on GitHub +2. Navigate to **Settings** → **Secrets and variables** → **Actions** +3. Click **New repository secret** +4. Add the following secrets: + - `CROWDIN_PROJECT_ID` - Your Crowdin project ID + - `CROWDIN_PERSONAL_TOKEN` - Your Crowdin personal access token + +Direct URL: `https://github.com/InvoicePlane/InvoicePlane-v2/settings/secrets/actions` **Manual Trigger:** ```bash From f20d4a5010e38995e863a9b8f4c16708d8d4c7de Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 15:55:32 +0000 Subject: [PATCH 5/5] Make GitHub secrets URL generic for reusability Co-authored-by: nielsdrost7 <47660417+nielsdrost7@users.noreply.github.com> --- .github/MAINTENANCE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/MAINTENANCE.md b/.github/MAINTENANCE.md index b1306e45b..728d41251 100644 --- a/.github/MAINTENANCE.md +++ b/.github/MAINTENANCE.md @@ -281,7 +281,7 @@ To configure GitHub secrets for the Crowdin workflow: - `CROWDIN_PROJECT_ID` - Your Crowdin project ID - `CROWDIN_PERSONAL_TOKEN` - Your Crowdin personal access token -Direct URL: `https://github.com/InvoicePlane/InvoicePlane-v2/settings/secrets/actions` +Direct URL format: `https://github.com/OWNER/REPO/settings/secrets/actions` **Manual Trigger:** ```bash