Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
25c3452
feat: add start offset and post_import_sanitize
wackerow Nov 26, 2025
85a6784
feat: update to using gemini prompt
wackerow Nov 26, 2025
888eb37
feat: adaptive pre-translate polling + timeouts
wackerow Nov 26, 2025
7918f6b
feat(i18n): add qa_check, workflow inputs
wackerow Nov 26, 2025
ed59f54
patch: revert QA prompt to pre_translate endpoint
wackerow Nov 27, 2025
aaf41e2
feat: add Crowdin QA completions + env cleanup
wackerow Nov 27, 2025
be02aa7
debug: QA check endpoint
wackerow Nov 27, 2025
837d6fd
debug: completions check
wackerow Nov 27, 2025
f54fc54
fix: chunk requests by file, 500 at a time
wackerow Nov 27, 2025
e6b3fa0
refactor: modularize script
wackerow Nov 27, 2025
6235601
feat: initialize trust tiers for LLM-language quality
wackerow Nov 29, 2025
c859ca5
feat: chunk trust-tiers into separate PRs
wackerow Nov 29, 2025
754c364
refactor: accept internal lang codes
wackerow Nov 29, 2025
5aba5dc
fix: json punctuation sanitization
wackerow Nov 29, 2025
6071764
feat: implement supabase glossary/TM sync
wackerow Nov 30, 2025
09a370c
feat: commit initial pre-translate prompt
wackerow Dec 1, 2025
1351ba6
update(i18n): pre-translate prompt
wackerow Dec 1, 2025
68d4e39
feat: use in-repo prompt as canonical
wackerow Dec 1, 2025
135c8eb
Merge branch 'dev' into i18n-offset-sanitizer
wackerow Dec 3, 2025
de3117e
refactor: streamline i18n automation pipeline to MVP
wackerow Dec 11, 2025
fde7697
feat(i18n): fix MDX build failures from Crowdin translations
wackerow Dec 12, 2025
3d325af
fix(i18n): constrain sanitizer to only translated files
wackerow Dec 12, 2025
9352f47
fix(i18n): remove content sanitization, only fix syntax
wackerow Dec 12, 2025
8ab1788
fix(i18n): sanitizer uses in-memory content
wackerow Dec 12, 2025
983dd11
fix(i18n): sanitizer handles inline tags & restores blank lines
wackerow Dec 12, 2025
ffe02a4
fix(i18n): remove commas from PR file list
wackerow Dec 12, 2025
135af19
feat(i18n): enable JSX attribute translation with configurable update…
wackerow Dec 13, 2025
153f8a4
patch: translateAttributes parser options
wackerow Dec 15, 2025
7c208fe
revert(i18n): remove parser option changes
wackerow Dec 15, 2025
b8841c4
fix(i18n): list all translated files & diagnose AI model
wackerow Dec 15, 2025
bc04456
chore(i18n): fetch crowdin user dynamically
wackerow Dec 15, 2025
0f0a5c3
feat(i18n): add SKIP_PR_CREATION flag to workflow and gate PR step
wackerow Dec 15, 2025
67c1c84
fix: stop workflow on invalid paths
wackerow Dec 15, 2025
df29901
Merge branch 'dev' into i18n-automation-mvp
wackerow Dec 15, 2025
72e87d3
feat: add blank language input support
wackerow Dec 16, 2025
0ddcad3
feat: add dynamic PR title formatting
wackerow Dec 16, 2025
efe6e54
feat: add syntax validation & PR formatting
wackerow Dec 16, 2025
2a9433a
refactor: add workflow types and shared utilities
wackerow Dec 16, 2025
5cfef56
refactor: extract initialization workflow
wackerow Dec 16, 2025
6714217
refactor: extract file preparation workflow
wackerow Dec 16, 2025
3317ab3
refactor: extract pre-translation workflow
wackerow Dec 16, 2025
1b82bc5
refactor: extract translation download workflow
wackerow Dec 16, 2025
02aba1a
refactor: extract PR creation workflow
wackerow Dec 16, 2025
80b3f77
refactor: extract validation workflow
wackerow Dec 16, 2025
a464ef3
refactor: simplify main.ts orchestration
wackerow Dec 16, 2025
9f9c200
fix: export validation result types
wackerow Dec 16, 2025
37d25a0
refactor(i18n): consolidate delay() utility
wackerow Dec 17, 2025
8d259a6
refactor(i18n): consolidate loadExcludedPaths() utility
wackerow Dec 17, 2025
1dd31e3
refactor(i18n): define QaLevel locally
wackerow Dec 17, 2025
0b8f911
feat(i18n): add JSX attribute extraction types
wackerow Dec 17, 2025
cca3022
feat(i18n): add JSX attribute extraction logic
wackerow Dec 17, 2025
44fb557
feat(i18n): add JSX attribute reinsertion logic
wackerow Dec 17, 2025
cdc13c5
feat(i18n): add JSX attributes module exports
wackerow Dec 17, 2025
8b1d350
feat(i18n): add Gemini AI translation module
wackerow Dec 17, 2025
231f60c
feat(i18n): add standalone JSX translation orchestrator
wackerow Dec 17, 2025
b1adb81
feat(i18n): add JSX attribute validation
wackerow Dec 17, 2025
65abc66
feat(i18n): add geminiSkipped flag to PR body
wackerow Dec 17, 2025
3777c6f
feat(i18n): integrate JSX translation into main workflow
wackerow Dec 17, 2025
be7f821
ci(i18n): add standalone JSX attribute translation workflow
wackerow Dec 17, 2025
2bfe955
docs(i18n): add v0.2.0 roadmap
wackerow Dec 17, 2025
59ed0db
ci(i18n): add GEMINI_API_KEY to crowdin-ai-import workflow
wackerow Dec 17, 2025
f527074
fix(i18n): improve JSX attribute and heading validation
wackerow Dec 17, 2025
29547a3
refactor(i18n): extract JSX translation and sanitization into modules
wackerow Dec 17, 2025
26c251b
fix(i18n): exclude 'text' from translatable attributes
wackerow Dec 17, 2025
f975454
refactor(i18n): DRY code consolidation
wackerow Dec 17, 2025
cad2863
refactor(i18n): use i18n.config.json for language names in Gemini
wackerow Dec 18, 2025
020078b
fix(i18n): normalize ButtonLink formatting from English
wackerow Dec 19, 2025
3e7f837
fix(i18n): improve error handling and logging in file processing
wackerow Dec 19, 2025
891d1f2
feat(i18n): add exclude_path and skip_await workflow options
wackerow Dec 19, 2025
e41149b
feat(i18n): add supabase glossary module
wackerow Dec 20, 2025
4f7606f
feat(i18n): integrate glossary into workflow
wackerow Dec 20, 2025
67cdde9
feat(i18n): inject glossary into Crowdin prompt
wackerow Dec 20, 2025
248a5bc
feat(i18n): inject glossary into Gemini JSX prompt
wackerow Dec 20, 2025
d97e0cb
fix: crowdin env var name
wackerow Dec 20, 2025
0723e89
feat(i18n): add prompt ID and workflow link to PR body
wackerow Dec 20, 2025
f381eea
feat(i18n): use ephemeral prompts for glossary injection
wackerow Dec 20, 2025
1c2948f
revert: artifact writing
wackerow Dec 20, 2025
aec9dc8
refactor(i18n): DRY verbose logging with debugLog utility
wackerow Dec 20, 2025
fa5f9ae
fix(i18n): clean up PR body metadata
wackerow Dec 20, 2025
2c6ad11
fix(i18n): copy AI provider settings to ephemeral prompts
wackerow Dec 20, 2025
289b3a1
feat(i18n): enhance post_import_sanitize with additional fixes
wackerow Dec 21, 2025
b19a1a6
refactor: do-not-translate path list
wackerow Dec 22, 2025
7f9356b
feat(i18n): add auto-fix for common translation issues
wackerow Jan 8, 2026
811a43f
update: excluded-paths to include terms-and-conditions
wackerow Jan 8, 2026
beb8885
feat(i18n): add href and component line break fixes
wackerow Jan 9, 2026
5be8450
refactor(i18n): improve regex safety and code style
wackerow Jan 9, 2026
5ce97dd
feat(i18n): use paragraph-scoped href matching for safer fixes
wackerow Jan 12, 2026
d3432f3
Merge branch 'dev' into i18n-automation-mvp
wackerow Jan 13, 2026
c836325
fix: unused arg
wackerow Jan 13, 2026
6849700
merge: integrate i18n-glossary-integration branch
wackerow Jan 13, 2026
dd91f71
refactor(i18n): remove dead code and production-harden workflow
wackerow Jan 13, 2026
e6d4518
patch: logs and pr body details
wackerow Jan 14, 2026
c004ee1
fix(i18n): handle "created" status for queued jobs
wackerow Jan 15, 2026
e0a8d76
refactor(i18n): per-language pre-translation jobs
wackerow Jan 15, 2026
c498f8a
feat(i18n): support comma-separated resume IDs
wackerow Jan 15, 2026
938c750
refactor(i18n): adapt download for multi-response results
wackerow Jan 15, 2026
a52be9d
feat(i18n): add SPLIT_PRS option for per-language PRs
wackerow Jan 15, 2026
c374cbe
fix: add SKIP_PRS boolean as action input
wackerow Jan 15, 2026
865f5c0
refactor(i18n): batch commits per phase via Git Data API
wackerow Jan 15, 2026
23c325f
update(i18n): canonical llm language list
wackerow Jan 15, 2026
fdd3c96
fix(i18n): add rate limiting to prevent GitHub API abuse
wackerow Jan 20, 2026
c3746b3
Merge branch 'dev' into i18n-automation-mvp
wackerow Jan 22, 2026
03dce0c
refactor: use i18n.config.json as canonical language list
wackerow Jan 22, 2026
a742514
Merge branch 'dev' into i18n-automation-mvp
wackerow Feb 4, 2026
f982de6
revert: .gitignore artifacts addition
wackerow Feb 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 49 additions & 8 deletions .github/workflows/crowdin-ai-import.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,52 @@ name: Import Crowdin AI Translations
on:
workflow_dispatch:
inputs:
file_limit:
description: "Number of files to process (default: 100, use 1-10 for testing)"
target_path:
description: "File or directory path to translate (e.g., public/content/developers/index.md or public/content/developers or blank for all files)"
required: false
type: string
exclude_path:
description: "Path to exclude from this job (e.g., public/content/developers/tutorials)"
required: false
default: "100"
type: string
target_languages:
description: "Comma-separated Crowdin language codes (default: es-EM)"
description: "Comma-separated internal language codes (blank for all locales)"
required: false
default: "es-EM"
type: string
base_branch:
description: "Base branch to create PR against (default: dev)"
description: "Base branch to create PR against"
required: false
default: "dev"
type: string
pretranslation_id:
description: "Pre-translation ID(s) to resume from, comma-separated for multiple (leave empty to start new)"
required: false
type: string
split_prs:
description: "Create one PR per language instead of one combined PR?"
required: false
default: false
type: boolean
pre_translate_prompt_id:
description: "AI prompt ID for pre_translate (default: 326942)"
required: false
default: "326942"
type: string
skip_pr:
description: "Skip PR creation?"
required: false
default: false
type: boolean
skip_await:
description: "Exit after dispatching pre-translation (resume later with ID)"
required: false
default: false
type: boolean
verbose:
description: "Enable verbose logging?"
required: false
default: "false"
type: boolean

jobs:
import_translations:
Expand All @@ -41,9 +72,19 @@ jobs:
- name: Run Crowdin AI translation import
run: npx ts-node -O '{"module":"commonjs"}' ./src/scripts/i18n/main.ts
env:
I18N_CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }}
I18N_CROWDIN_API_KEY: ${{ secrets.CROWDIN_WORKFLOW_API_KEY }}
I18N_GITHUB_API_KEY: ${{ secrets.I18N_GITHUB_TOKEN }}
FILE_LIMIT: ${{ github.event.inputs.file_limit }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.SUPABASE_SERVICE_ROLE_KEY }}
PRETRANSLATION_ID: ${{ github.event.inputs.pretranslation_id }}
TARGET_PATH: ${{ github.event.inputs.target_path }}
EXCLUDE_PATH: ${{ github.event.inputs.exclude_path }}
TARGET_LANGUAGES: ${{ github.event.inputs.target_languages }}
BASE_BRANCH: ${{ github.event.inputs.base_branch }}
PRE_TRANSLATE_PROMPT_ID: ${{ github.event.inputs.pre_translate_prompt_id }}
VERBOSE: ${{ github.event.inputs.verbose }}
SKIP_PR_CREATION: ${{ github.event.inputs.skip_pr }}
SKIP_AWAIT: ${{ github.event.inputs.skip_await }}
SPLIT_PRS: ${{ github.event.inputs.split_prs }}
GITHUB_REPOSITORY: ${{ github.repository }}
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@
"devDependencies": {
"@chromatic-com/playwright": "^0.12.4",
"@chromatic-com/storybook": "1.5.0",
"@google/generative-ai": "^0.24.1",
"@netlify/plugin-nextjs": "^5.15.5",
"@playwright/test": "^1.52.0",
"@storybook/addon-essentials": "8.6.14",
Expand Down
9 changes: 9 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

118 changes: 0 additions & 118 deletions src/scripts/i18n/check-translation-status.ts

This file was deleted.

Loading