Skip to content

Language

Choose your language

Switch to the same page in another language.

EnglishEnglishenAfrikaansAfrikaansafአማርኛAmharicamالعربيةArabicarঅসমীয়াAssameseasAzərbaycanAzerbaijaniazБашҡортBashkirbaБългарскиBulgarianbgभोजपुरीBhojpuribhoবাংলাBanglabnབོད་སྐད་Tibetanboबड़ोBodobrxBosanskiBosnianbsCatalàCatalancaČeštinaCzechcsCymraegWelshcyDanskDanishdaDeutschGermandeडोगरीDogridoiDolnoserbšćinaLower SorbiandsbދިވެހިބަސްDivehidvΕλληνικάGreekelEspañolSpanishesEestiEstonianetEuskaraBasqueeuفارسیPersianfaSuomiFinnishfiFilipinoFilipinofilVakavitiFijianfjFøroysktFaroesefoFrançaisFrenchfrFrançais (Canada)French (Canada)fr-CAGaeilgeIrishgaGalegoGalicianglकोंकणीKonkanigomગુજરાતીGujaratiguHausaHausahaעבריתHebrewheहिन्दीHindihiछत्तीसगढ़ीChhattisgarhihneHrvatskiCroatianhrHornjoserbsceUpper SorbianhsbHaitian CreoleHaitian CreolehtMagyarHungarianhuՀայերենArmenianhyIndonesiaIndonesianidÌgbòIgboigInuinnaqtunInuinnaqtuniktÍslenskaIcelandicisItalianoItalianitᐃᓄᒃᑎᑐᑦInuktitutiuInuktitut (Latin)Inuktitut (Latin)iu-Latn日本語JapanesejaქართულიGeorgiankaҚазақ ТіліKazakhkkខ្មែរKhmerkmKurmancîKurdish (Northern)kmrಕನ್ನಡKannadakn한국어KoreankoكٲشُرKashmiriksکوردیی ناوەندیKurdish (Central)kuКыргызчаKyrgyzkyLëtzebuergeschLuxembourgishlbLingálaLingalalnລາວLaoloLietuviųLithuanianltLugandaGandalugLatviešuLatvianlv中文 (文言文)Chinese (Literary)lzhमैथिलीMaithilimaiMalagasyMalagasymgTe Reo MāoriMāorimiМакедонскиMacedonianmkമലയാളംMalayalammlМонгол хэлMongolian (Cyrillic)mn-Cyrlᠮᠣᠩᠭᠣᠯ ᠬᠡᠯᠡMongolian (Traditional)mn-MongমৈতৈলোনManipurimniमराठीMarathimrMelayuMalaymsMaltiMaltesemtHmong DawHmong Dawmwwမြန်မာMyanmar (Burmese)myNorsk BokmålNorwegian BokmålnbनेपालीNepalineNederlandsDutchnlSesotho sa LeboaSesotho sa LeboansoChinyanjaChichewanyaଓଡ଼ିଆOdiaorHñähñuQuerétaro OtomiotqਪੰਜਾਬੀPunjabipaPolskiPolishplدریDariprsپښتوPashtopsPortuguês (Brasil)Portuguese (Brazil)ptPortuguês (Portugal)Portuguese (Portugal)pt-PTRomânăRomanianroРусскийRussianruIkirundiRundirunKinyarwandaKinyarwandarwسنڌيSindhisdසිංහලSinhalasiSlovenčinaSlovakskSlovenščinaSlovenianslGagana SāmoaSamoansmchiShonaShonasnSoomaaliSomalisoShqipAlbaniansqСрпски (ћирилица)Serbian (Cyrillic)sr-CyrlSrpski (latinica)Serbian (Latin)sr-LatnSesothoSesothostSvenskaSwedishsvKiswahiliSwahiliswதமிழ்TamiltaతెలుగుTeluguteไทยThaithትግርTigrinyatiTürkmen DiliTurkmentkLea fakatongaTongantoTürkçeTurkishtrТатарTatarttReo TahitiTahitiantyئۇيغۇرچەUyghurugУкраїнськаUkrainianukاردوUrduurUzbek (Latin)Uzbek (Latin)uzTiếng ViệtVietnameseviisiXhosaisiXhosaxhÈdè YorùbáYorubayoYucatec MayaYucatec Mayayua粵語Cantonese (Traditional)yue中文 (简体)Chinese Simplifiedzh-Hans中文 (繁體)Chinese Traditionalzh-HantisiZuluisiZuluzu

Translate the diff, not the catalog.

Three secrets, one workflow, and smart change detection is on by default for every future push.

Feature tour playing
Source

One source key changes

Smart detection isolates the delta before any provider call.

One source key changes

Supports

0 npm-audit issues
240+ tests
Azure / AWS / GoogleNode 20 / 22 / 24

Built for shipping

Translation as a workflow, not a chore.

Drop the action into your existing CI, point it at Azure, AWS, or Google, and let smart change detection keep provider calls focused on the keys that actually need work.

Default in v3.2

Smart change detection

A compact .github/resource-translator-state.json tracks parser keys, source hashes, and translation-affecting settings. The action skips stable keys, preserves manual target edits, and logs every decision with rule codes. Use snapshotOnly to bootstrap existing translations without a provider call.

Most runs translate only the changed keys

Six file formats

Round-trips .resx, .xliff, .po, .json, .ini, and .restext with byte-stable formatting.

Repo-level config

Drop a .github/resource-translator.yml file for include globs, glossaries, and Custom Translator categories.

Glossary-aware

Lock brand names and product terms with smart word-boundary regex that handles C++, .NET, and friends.

Snapshot bootstrap

Already have localized files? Seed the manifest from disk without provider calls, then let future runs translate only the delta.

PR-friendly outputs

summary-title, summary-details, and has-new-translations slot directly into create-pull-request.

Azure, AWS & Google

Pick one provider per run. Each is driven by its official SDK (@azure-rest/ai-translation-text, @aws-sdk/client-translate, @google-cloud/translate) with automatic retries on 408/429/5xx and no hand-rolled HTTP. esbuild-bundled, audit-clean.

Copy. Paste. Translate.

Resource Translator opens machine-translated pull requests using Azure, AWS, or Google. Its default smart change detection sends only new, missing, or changed keys to your provider.

Get started
.github/workflows/translate.yml
name: translate
on:
push:
paths: ["**/*.en.resx", "**/*.en.json"]
permissions:
contents: write
pull-requests: write
jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- id: translator
uses: IEvangelist/resource-translator@v3
with:
sourceLocale: en
provider: |
azure:
subscriptionKey: ${{ secrets.KEY }}
endpoint: ${{ secrets.ENDPOINT }}
region: ${{ secrets.REGION }}
toLocales: '["fr","de","es","ja"]'
- uses: peter-evans/create-pull-request@v7
with:
title: Update translations

Ready to localize on autopilot?

One provider key for Azure, AWS, or Google, plus one workflow file. Resource Translator handles the rest without retranslating stable strings over and over.

Get started