Compare commits

...

5 Commits

Author SHA1 Message Date
GitHub Action
75097c3b8f chore: crowdin locale sync 2026-02-01 03:38:08 +00:00
Michael Genson
2987cf8ba6 dev: Allow locale sync path in auto merge (#6974) 2026-01-31 21:37:31 -06:00
Michael Genson
46b46978ff dev: Increase locale merge limit to 300 and allow PRs from Mealie bot (#6972) 2026-01-31 21:31:52 -06:00
Michael Genson
12857883a9 dev: Fix token vars (#6970) 2026-01-31 21:24:58 -06:00
Michael Genson
60fff3b5b8 dev: Switch to bot token for locale sync (#6969) 2026-01-31 21:21:07 -06:00
3 changed files with 63 additions and 43 deletions

View File

@@ -25,8 +25,12 @@ jobs:
env: env:
AUTHOR: ${{ github.event.pull_request.user.login }} AUTHOR: ${{ github.event.pull_request.user.login }}
run: | run: |
if [[ "$AUTHOR" != "hay-kot" && "$AUTHOR" != "github-actions[bot]" ]]; then if [[
echo "::error::PR author must be hay-kot or github-actions[bot] for auto-merge (got: $AUTHOR)" "$AUTHOR" != "hay-kot" &&
"$AUTHOR" != "github-actions[bot]" &&
"$AUTHOR" != "mealie-actions[bot]"
]]; then
echo "::error::PR author must be hay-kot, github-actions[bot], or mealie-actions[bot] for auto-merge (got: $AUTHOR)"
exit 1 exit 1
fi fi
echo "Author validated: $AUTHOR" echo "Author validated: $AUTHOR"
@@ -43,8 +47,8 @@ jobs:
echo "PR changes: +$ADDITIONS -$DELETIONS (total: $TOTAL lines)" echo "PR changes: +$ADDITIONS -$DELETIONS (total: $TOTAL lines)"
if [ "$TOTAL" -gt 200 ]; then if [ "$TOTAL" -gt 400 ]; then
echo "::error::PR exceeds 200 line change limit ($TOTAL lines)" echo "::error::PR exceeds 400 line change limit ($TOTAL lines)"
exit 1 exit 1
fi fi
@@ -57,11 +61,20 @@ jobs:
FILES=$(gh pr view "$PR_NUMBER" --repo "$REPO" --json files --jq '.files[].path') FILES=$(gh pr view "$PR_NUMBER" --repo "$REPO" --json files --jq '.files[].path')
for file in $FILES; do for file in $FILES; do
if [[ ! "$file" =~ ^frontend/lang/ ]] && [[ ! "$file" =~ ^mealie/repos/seed/resources/[^/]+/locales/ ]]; then # Check if file matches any allowed path
echo "::error::Invalid file path: $file" if [[ "$file" == "frontend/composables/use-locales/available-locales.ts" ]] || \
echo "Only files in frontend/lang/ or mealie/repos/seed/resources/*/locales/ are allowed" [[ "$file" =~ ^frontend/lang/ ]] || \
exit 1 [[ "$file" =~ ^mealie/repos/seed/resources/[^/]+/locales/ ]]; then
continue
fi fi
# File doesn't match allowed paths
echo "::error::Invalid file path: $file"
echo "Only the following paths are allowed:"
echo " - frontend/composables/use-locales/available-locales.ts"
echo " - frontend/lang/"
echo " - mealie/repos/seed/resources/*/locales/"
exit 1
done done
echo "All files are in allowed paths" echo "All files are in allowed paths"

View File

@@ -15,10 +15,17 @@ jobs:
sync-locales: sync-locales:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Generate GitHub App Token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.COMMIT_BOT_APP_ID }}
private-key: ${{ secrets.COMMIT_BOT_APP_PRIVATE_KEY }}
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ steps.app-token.outputs.token }}
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v5 uses: actions/setup-python@v5
@@ -105,7 +112,7 @@ jobs:
- Updated frontend locale files - Updated frontend locale files
- Generated from latest translation sources" \ - Generated from latest translation sources" \
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ steps.app-token.outputs.token }}
- name: No changes detected - name: No changes detected
if: steps.changes.outputs.has_changes == 'false' if: steps.changes.outputs.has_changes == 'false'

View File

@@ -21,19 +21,19 @@ export const LOCALES = [
{ {
name: "Українська (Ukrainian)", name: "Українська (Ukrainian)",
value: "uk-UA", value: "uk-UA",
progress: 100, progress: 83,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Türkçe (Turkish)", name: "Türkçe (Turkish)",
value: "tr-TR", value: "tr-TR",
progress: 41, progress: 40,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Svenska (Swedish)", name: "Svenska (Swedish)",
value: "sv-SE", value: "sv-SE",
progress: 68, progress: 61,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -45,55 +45,55 @@ export const LOCALES = [
{ {
name: "Slovenščina (Slovenian)", name: "Slovenščina (Slovenian)",
value: "sl-SI", value: "sl-SI",
progress: 41, progress: 40,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Slovenčina (Slovak)", name: "Slovenčina (Slovak)",
value: "sk-SK", value: "sk-SK",
progress: 46, progress: 47,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Pусский (Russian)", name: "Pусский (Russian)",
value: "ru-RU", value: "ru-RU",
progress: 46, progress: 44,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Română (Romanian)", name: "Română (Romanian)",
value: "ro-RO", value: "ro-RO",
progress: 45, progress: 44,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Português (Portuguese)", name: "Português (Portuguese)",
value: "pt-PT", value: "pt-PT",
progress: 40, progress: 39,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Português do Brasil (Brazilian Portuguese)", name: "Português do Brasil (Brazilian Portuguese)",
value: "pt-BR", value: "pt-BR",
progress: 49, progress: 46,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Polski (Polish)", name: "Polski (Polish)",
value: "pl-PL", value: "pl-PL",
progress: 53, progress: 49,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Norsk (Norwegian)", name: "Norsk (Norwegian)",
value: "no-NO", value: "no-NO",
progress: 43, progress: 42,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Nederlands (Dutch)", name: "Nederlands (Dutch)",
value: "nl-NL", value: "nl-NL",
progress: 59, progress: 54,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -105,13 +105,13 @@ export const LOCALES = [
{ {
name: "Lietuvių (Lithuanian)", name: "Lietuvių (Lithuanian)",
value: "lt-LT", value: "lt-LT",
progress: 31, progress: 30,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "한국어 (Korean)", name: "한국어 (Korean)",
value: "ko-KR", value: "ko-KR",
progress: 39, progress: 38,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -123,73 +123,73 @@ export const LOCALES = [
{ {
name: "Italiano (Italian)", name: "Italiano (Italian)",
value: "it-IT", value: "it-IT",
progress: 52, progress: 49,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Íslenska (Icelandic)", name: "Íslenska (Icelandic)",
value: "is-IS", value: "is-IS",
progress: 46, progress: 43,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Magyar (Hungarian)", name: "Magyar (Hungarian)",
value: "hu-HU", value: "hu-HU",
progress: 48, progress: 46,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Hrvatski (Croatian)", name: "Hrvatski (Croatian)",
value: "hr-HR", value: "hr-HR",
progress: 29, progress: 30,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "עברית (Hebrew)", name: "עברית (Hebrew)",
value: "he-IL", value: "he-IL",
progress: 72, progress: 64,
dir: "rtl", dir: "rtl",
}, },
{ {
name: "Galego (Galician)", name: "Galego (Galician)",
value: "gl-ES", value: "gl-ES",
progress: 39, progress: 38,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Français (French)", name: "Français (French)",
value: "fr-FR", value: "fr-FR",
progress: 74, progress: 67,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Français canadien (Canadian French)", name: "Français canadien (Canadian French)",
value: "fr-CA", value: "fr-CA",
progress: 99, progress: 83,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Belge (Belgian)", name: "Belge (Belgian)",
value: "fr-BE", value: "fr-BE",
progress: 40, progress: 39,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Suomi (Finnish)", name: "Suomi (Finnish)",
value: "fi-FI", value: "fi-FI",
progress: 41, progress: 40,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Eesti (Estonian)", name: "Eesti (Estonian)",
value: "et-EE", value: "et-EE",
progress: 47, progress: 44,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Español (Spanish)", name: "Español (Spanish)",
value: "es-ES", value: "es-ES",
progress: 47, progress: 45,
dir: "ltr", dir: "ltr",
}, },
{ {
@@ -201,43 +201,43 @@ export const LOCALES = [
{ {
name: "British English", name: "British English",
value: "en-GB", value: "en-GB",
progress: 45, progress: 42,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Ελληνικά (Greek)", name: "Ελληνικά (Greek)",
value: "el-GR", value: "el-GR",
progress: 42, progress: 41,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Deutsch (German)", name: "Deutsch (German)",
value: "de-DE", value: "de-DE",
progress: 98, progress: 83,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Dansk (Danish)", name: "Dansk (Danish)",
value: "da-DK", value: "da-DK",
progress: 66, progress: 63,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Čeština (Czech)", name: "Čeština (Czech)",
value: "cs-CZ", value: "cs-CZ",
progress: 45, progress: 43,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Català (Catalan)", name: "Català (Catalan)",
value: "ca-ES", value: "ca-ES",
progress: 41, progress: 40,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Български (Bulgarian)", name: "Български (Bulgarian)",
value: "bg-BG", value: "bg-BG",
progress: 51, progress: 49,
dir: "ltr", dir: "ltr",
}, },
{ {