How does the action talk to Azure?
Through Microsoft's official @azure-rest/ai-translation-text SDK, layered on @azure/core-rest-pipeline. That gets you automatic retries on 408/429/5xx, typed request and response models, and authentication header handling for free — everything that used to be a hand-rolled axios call. The public action surface (inputs, outputs, file outputs) is unchanged.
Why are translations sometimes off-brand or off-tone?
Machine translation defaults to a general-purpose model. Three knobs help: a glossary for hard term overrides, a Custom Translator category for fine-tuned models trained on your tone and vocabulary, and profanityAction to scrub or flag profane terms.
How do I avoid translating the same file twice?
Trigger the workflow on paths that match your source-locale files only, e.g. **/*.en.resx. The action also includes its own per-trigger file filter when GITHUB_TOKEN is set, narrowing work to files in the latest commit.
Can I run the action offline?
Not exactly — Azure AI Translator is the runtime brain. But you can run with dryRun: true to validate parsing and config without making any HTTP requests for translation.
What Node version does the action run on?
v3 runs on the GitHub Actions node24 runtime. The bundled JavaScript is compatible with Node 20, 22, and 24, which is what CI tests.
Where does the bundled dist/ come from?
GitHub JS actions ship their compiled JS in the repository. The dist-build workflow rebuilds it after every merge to main if it would drift, and dist-check blocks PRs that would land out-of-date output.
What about other resource formats?
Today: .resx, .xliff, .po, .json, .ini, .restext. Open an issue if you need another — the parser interface is small (parse → map → apply translations → format) and contributions are welcome.