v0.26.0Un server MCP per agenti di codifica

Pubblica la tua app in every language.

Ogni stringa hardcoded nella tua app web, mobile o desktop, trovata e tradotta con il contesto della tua app. Una pull request da revisionare e unire, da un comando CLI o ad ogni push.

$npx localize-dev run
import { useTranslation } from 'react-i18next';

export function Inbox({ user, unread }) {
  const { t } = useTranslation();
  return (
    <section>
      <h1>{t('inbox.welcome_heading', { name: user.name })}</h1>
      <p>{t('inbox.unread_summary', { unread })}</p>
      <input placeholder={t('inbox.search_placeholder')} />
      <button>{unread ? t('inbox.mark_all_read') : t('inbox.refresh')}</button>
    </section>
  );
}

19 framework, da React e Flutter a Rails, Android e iOS, e gli strumenti correlati

Perché localize.dev

Cinque passaggi manuali, eseguiti in un'unica esecuzione

Il lavoro che ripeti ad ogni rilascio, fatto in un'unica passata e revisionato come qualsiasi altra modifica al codice.

  1. Trova

    Di solito:Scansiona il codebase per le stringhe, file per file

    Ora:Ogni stringa trovata sull'AST, inclusi attributi, ternari e template literal

  2. Nome

    Di solito:Inventare una chiave per ciascuno e sperare che rimanga coerente

    Ora:Chiavi semantiche dal contesto del componente; le copie identiche riutilizzano la stessa chiave

  3. Traduci

    Di solito:Esporta un foglio di calcolo, aspetta i traduttori, incolla tutto di nuovo

    Ora:Ogni lingua di destinazione tradotta in un'unica passata

  4. Verifica

    Di solito:Scopri il {placeholder} rotto in produzione

    Ora:Segnaposto verificati prima che venga scritto qualcosa

  5. Pubblica

    Di solito:Farlo di nuovo nella prossima versione

    Ora:Una pull request ad ogni push, così il nuovo testo non viene mai pubblicato non tradotto

5 passaggi di consegne il modo solito

1 pull request con localize.dev

Provalo sul tuo codice

Come funziona

Dalla copia hardcoded a una pull request localizzata

Quattro passaggi deterministici, con il modello che interviene solo dove serve giudizio: nominare le chiavi e tradurre. Scorri per seguire un componente attraverso tutti e quattro.

01 / 04

Scansiona l'AST

Ogni componente e pagina viene analizzato: JSX, template Vue e Svelte o HTML. Vengono estratti testo, attributi visibili all'utente e le stringhe che il tuo codice renderizza. Vengono saltati URL, nomi di classi e campioni di codice.

src/checkout/Summary.tsx
4<aside className="riepilogo">class · ignorato
5 <h2>Riepilogo dell'ordine</h2>
6

Ciao {user.name}, hai {count} articoli</p>
7 Codice sconto" />
8 <button>Effettua ordine</button>
9 <Link href="/cart/edit">Modifica carrello</Link>URL · ignorato
10</aside>

5

stringhe trovate

2

ignorato dalla regola

1

componente

Traduzione consapevole del contesto

Tradotto per dove si trova ogni stringa

La traduzione parola per parola si rompe non appena una parola ha due significati. localize.dev traduce ogni stringa tenendo conto di cosa dice il tuo progetto e di cosa si aspetta la lingua di destinazione.

Legge il tuo progetto

Una stringa viene tradotta insieme al suo contesto: il file, il componente e l'elemento in cui si trova. Ad esempio, un'etichetta di pulsante, un titolo e un placeholder ottengono il significato corretto. Il glossario e le note di stile mantengono i termini del prodotto e il tono uniformi in ogni file.

  • Percorso del file
  • Componente
  • Elemento e attributo
  • Termini del glossario
  • Nomi da non tradurre
  • Tono e forma di indirizzo

"Post" → it

src/feed/Composer.tsx · dentro <Button>Veröffentlichen
src/feed/PostCard.tsx · dentro <CardTitle>Beitrag

Scrive per ogni lingua

I plurali ottengono ogni forma di cui la locale ha bisogno, anche con due conteggi in una frase, il 1° e il 2° seguono gli ordinali propri di ogni lingua, i link e il testo in grassetto si spostano dove la grammatica li colloca, e la forma di attacco corrisponde alla voce scelta per ogni mercato.

  • Regole plurali CLDR
  • Ordinali
  • Ordine delle parole
  • Tu formale o informale
  • Formulazione UI breve

"{count} file" → pl

1 fileone
3 filefew
5 di filemany

Imposta i termini del glossario, i nomi da mantenere e le note di stile per progetto nel dashboard. Ogni esecuzione su quel repository utilizza queste impostazioni.

Localizzazione continua

Ogni push rimane localizzato

Aggiungi l'Azione GitHub e la nuova copia non verrà mai inviata senza traduzione. Ogni esecuzione aggiorna la stessa branch e la pull request, quindi non finirai mai con una pila di PR o conflitti tra esecuzioni.

  • Nuovo commit con componenti e tutti i file delle lingue
  • Imposta la libreria i18n del tuo framework se non ce n’è ancora una
  • Il corpo R elenca ogni sostituzione e ogni stringa saltata
  • Recupera le traduzioni revisionate da Crowdin, Phrase, Lokalise o Transifex
  • Ogni esecuzione si apre sulla scheda Revisione del progetto
  • Controllo che fallisce le pull request con testo non tradotto aggiunto
Configura l'Azione

Localizza: 12 nuove stringhe in 4 localizzazioni

localize-dev/mainmain

esfrdeja Segnaposto verificati
.github/workflows/localize.yml
name: Localize

on:
  push:
    branches: [main]
  pull_request:
    types: [opened, synchronize]
  workflow_dispatch: # "Run workflow" button in the Actions tab

permissions:
  contents: write # push the localize-dev/<branch> branch
  pull-requests: write # open or update the localization PR

# One run per branch at a time; a newer push supersedes the running one.
concurrency:
  group: localize-${{ github.head_ref || github.ref_name }}
  cancel-in-progress: true

jobs:
  localize:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    # Skip localize.dev's own branches, and fork PRs (their token is read-only).
    if: >-
      !startsWith(github.head_ref || github.ref_name, 'localize-dev/') &&
      (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository)
    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          # On PRs, scan the branch itself rather than the merge commit.
          ref: ${{ github.head_ref || github.ref_name }}

      - name: Localize
        uses: ufortstephen/autolocalize-action@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          api_key: ${{ secrets.LOCALIZEDEV_API_KEY }}
          target_locales: 'es,fr,de,ja'
          # src_dir: 'src' # default: your framework's (src, app/views, resources/views, lib…)
          # locales_path: 'public/locales/{locale}/common.json' # default: your framework's
          # working_directory: 'apps/web' # monorepo: localize just this app

Revisione umana

I madrelingua approvano e le loro correzioni rimangono

Le traduzioni automatiche sono una prima bozza. Ogni lingua ha il proprio revisore, e ogni correzione viene ricordata per la prossima volta.

  • Il modello evidenzia le traduzioni di cui non è sicuro, insieme alla ragione, quindi i revisori possono iniziare da lì
  • un revisore per lingua, email inviato una volta per ru
  • Approva o modifica, incluse le forme plurali, con un link al file originale
  • Bozze sono committe nella pull request aperta
  • Note per il prossimo revisore e termini del glossario suggeriti dalle correzioni ripetute
Come funziona la revisione

12 nuove traduzioni in spagnolo da revisionare

Inviato al revisore spagnolo del progetto al termine dell'esecuzione

Revisione · es1 di 3 approvati
  • Effettua ordine

    checkout.place_order

    Effettua ordine

    Approvato
  • {{count}} articoli nel tuo carrello

    checkout.items

    {{count}} articoli nel tuo carrello

    Approva
  • Cassa

    checkout.heading

    Pagamento

    Modificato

I revisori continuano a cambiare checkout a pago.

Aggiungi al glossario

Prima del rilascio

Individua i problemi prima che lo facciano i tuoi utenti.

Provalo sul tuo codice, individua layout che si rompono con testi più lunghi o in direzione da destra a sinistra, ferma le traduzioni non aggiornate o non tradotte alla pull request, indirizza i revisori alle traduzioni necessarie e porta con te la documentazione.

Vederlo nel tuo codice prima

Collega un repository e ottieni una richiesta di pull preview: fino a 200 stringhe dal tuo branch predefinito, localizzate dal nostro lato. Nessun workflow, chiave o checkout.

anteprima di localize.dev: 184 stringhe in es

localize-dev/previewmain

Come funziona l'anteprima

Un controllo che mantiene le cose così

Il controllo di localize-dev fallisce una pull request che aggiunge testo codificato direttamente, lascia indietro una lingua o modifica l'inglese senza che le traduzioni siano aggiornate, e indica la riga. Esegue in CI senza chiave API.

controllo i18n fallito

src/Cart.tsx:7 "Spedizione gratuita oggi" non è tradotto
locales/de.json 3 messaggi non hanno traduzione in tedesco
locales/en.json cart.pay è cambiato dopo la traduzione

Aggiungi il controllo

Trova layout che si rompono, prima di tradurre

localize-dev run --pseudo genera una lingua pseudo allungata e con accenti. I pulsanti tagliati vengono visualizzati, così come il testo ancora codificato direttamente. Gratis, senza modello.

Effettua ordine[Þļáçé öŕðéŕ one two]en-XA: ~35% più lungo, come il tedesco
Prova la pseudo-localizzazione

Rivedi prima quelli dubbi

Il modello segnala le traduzioni di cui non è sicuro, con il relativo motivo. La scheda Revisione si apre su quelle; approva il resto in un clic.

Prenota → Reservares

Da rivedere: una prenotazione o un romanzo? Ho ipotizzato prenotazione dal pulsante.

Come funziona la revisione

Layout da destra a sinistra, controllati prima del rilascio

Con arabo o ebraico nelle tue lingue, i margini e gli allineamenti delle liste di controllo sono fissati su un lato, e localize-dev rtl --fix scambia quelli sicuri con quelli logici che si capovolgono da soli.

- ml-4 text-left rounded-l-lg

+ ms-4 text-start rounded-s-lg

Come funziona da destra a sinistra

I tuoi documenti, anche in ogni lingua

Il contenuto di localize-dev traduce documenti Markdown e MDX, post di blog e pagine legali in una copia per lingua. Codice, link e componenti rimangono esattamente come scritti; solo i documenti modificati vengono rifatti.

docs/intro.mdintro.es.mdintro.fr.mdintro.de.md
Traduci i tuoi documenti

Funziona ovunque tu sviluppi

Un motore per web, mobile e desktop

Siti web e app server-side, app iOS e Android, app desktop e le librerie di componenti condivise. Ognuna utilizza la libreria i18n prevista dal framework.

01 / 04

App web

React · Next.js · Angular · Vue · SvelteKit · Astro

acmegoods.com/en

Free shipping on orders over $50

Acme Goods2
The weekend editPieces for slow mornings and long trips.Shop now
Canvas Weekender
New arrivalsView all
Studio Headphones
Studio Headphones$189
Essential Tee
Essential Tee$32
Parlour Palm
Parlour Palm$38
Minimal Watch
Minimal Watch$149

Integrazioni

Il tuo framework, i tuoi strumenti

Ogni framework ha la propria libreria di internazionalizzazione, configurata per te. Le traduzioni arrivano fino alla richiesta pull, alla tua piattaforma di traduzione o ai file di localizzazione che già possiedi.

Dal tuo terminale

Vedi ogni cambiamento prima che avvenga

Esegui prima una prova locale. Il comando --dry-run stampa ogni sostituzione e ogni stringa saltata con la motivazione, così nulla ti sorprenderà nella revisione.

localize-dev scanlocalize-dev run --dry-runlocalize-dev run --pseudolocalize-dev checklocalize-dev prlocalize-dev translate
Riferimento CLI
~/acme/storefront

$ npx localize-dev run -l es,fr,de

🔍 Scansione di src/ (localizzazioni di destinazione: es, fr, de)

src/checkout/Summary.tsx

Riepilogo ordine → {t('checkout.order_summary_heading') }

Codice sconto → {t('checkout.discount_code_placeholder') }

Conferma ordine → {t('checkout.place_order_button') }

src/legacy/PromoBanner.tsx:9 saltato "Spedizione gratuita oltre 50 $": componente di classe

✅ Stringhe localizzate in 3 file(s) (3 nuove chiavi, 0 riutilizzate). 5 file scritti.

$

Come funziona l'ingranaggio

Le regole eseguono la riscrittura. Il modello si occupa solo di nominare le chiavi e tradurre.

Differenze minime

Le modifiche vengono inserite con precisione agli offset dell'AST. La formattazione e l'ordine delle importazioni rimangono invariati, così i revisori vedono solo le righe modificate.

- <button>Effettua ordine</button>
+ <button>{t('checkout.place_order')}</button>
<a href="/terms">…

Frasi intere

Testo, espressioni, link e testo in grassetto si fondono in un unico messaggio, in modo che i traduttori vedano l'intera frase invece di frammenti.

Ciao {name}, hai {count} articoli

Salta ciò che non può modificare in modo sicuro

Le stringhe che il motore non può riscrivere in sicurezza, come quelle nei componenti di classe o al di fuori di un Composable, vengono lasciate così come sono e segnalate con il motivo.

Idempotente

Eseguilo su ogni push. Le stringhe avvolte rimangono intatte e la copia identica riutilizza la chiave esistente.

Niente da ospitare

La traduzione avviene sul modello ospitato di localize.dev per ogni piano. Non servono GPU, prompt o chiavi dei fornitori. Una chiave API è sufficiente.

Nessun vincolo di permanenza

L'output è la libreria i18n che il tuo framework utilizza già, con file di locazione semplici nel tuo repository. Smetti di usare localize.dev domani e la tua app continua a funzionare, traduzioni incluse.

  • react-i18next
  • vue-i18n
  • ngx-translate
  • svelte-i18n
  • ember-intl
  • Rails I18n
  • gettext
  • strings.xml
  • Flutter ARB

Date, numeri e denaro pure

toLocaleDateString('en-US'), i formattatori Intl e `$${{price}}` vengono riscritti per seguire la lingua dell'app, quindi 1.234,50 $ viene visualizzato come 1.234,50 € per un visitatore tedesco.

Sicurezza e privacy

Cosa lascia il tuo dispositivo

Solo le stringhe in traduzione vengono inviate all'API. I file sorgente rimangono sul tuo dispositivo o nel runner CI.

  • Stringhe, non il codice sorgente

    Solo le stringhe estratte vengono inviate, insieme al percorso del file per contesto. I file interi non lasciano mai la tua macchina.

  • Locale quando vuoi

    Le scansioni e le esecuzioni offline avvengono sulla tua macchina senza chiavi API e senza chiamate di rete, e non consumano il tuo limite.

  • Chiavi API hash

    Viene memorizzato solo l'hash di ogni chiave. I segreti vengono mostrati una volta e la revoca ha effetto immediato.

  • Tutto o niente

    Se un'esecuzione supererebbe il tuo piano, si ferma prima di scrivere qualcosa, quindi il tuo codice non viene mai lasciato parzialmente riscritto.

Prezzi

Inizia gratis. Aggiorna quando il tuo progetto cresce.

Free

$0per sempre

Tutto ciò che ti serve per localizzare un progetto secondario o provarlo su una codebase reale.

  • 1000 stringhe / mese
  • 3 lingue di destinazione
  • CLI and GitHub Action
  • La modalità offline e le scansioni non utilizzano mai la tua quota

Pro

Più popolare

$100/anno

Fatturato annualmente

Per prodotti distribuiti in diversi mercati.

  • Stringhe illimitate
  • 5 lingue di destinazione
  • Pull request su ogni push
  • Dashboard di utilizzo e chiavi API multiple

Team

$200/anno

Fatturato annualmente

Include 3 membri · +50 USD/anno per membro aggiuntivo

Per team di prodotto presenti in molti mercati.

  • Stringhe illimitate
  • Lingue di destinazione illimitate
  • 3 membri inclusi, poi 50 USD/anno ciascuno
  • Spazi di lavoro illimitati, condivisione del piano
  • Progetti, chiavi e utilizzo condivisi
  • Supporto prioritario

Confronta i piani nei dettagli

FAQ

Domande che le squadre fanno per prime

È solo per app web React?+

No. Funziona su React e Next.js, React Native e Expo, Flutter, Angular, Vue e Nuxt, Svelte e SvelteKit, Astro, Solid, Qwik, Lit, Ember, Electron e Tauri, siti HTML semplici, modelli Rails, Django e Laravel, layout Android, Jetpack Compose e codice View, e app iOS e macOS in SwiftUI e UIKit. Configura la libreria i18n corrispondente per ciascuna: react-i18next, ngx-translate, vue-i18n o @nuxtjs/i18n, svelte-i18n, ember-intl, gen-l10n di Flutter, Rails I18n, gettext di Django, risorse stringa Android, o uno script per pagine statiche.

Abbiamo già configurato i18n. È ancora utile?+

Sì. localize-dev translate riempie le traduzioni mancanti nei file di localizzazione già esistenti, in qualsiasi stack: JSON (i18next, react-intl, vue-i18n, ngx-translate), YAML di Rails, gettext .po, Flutter .arb, Android strings.xml, Cataloghi di Stringhe Apple e .strings, e messaggi di estensione browser. Il codice non viene modificato, le traduzioni esistenti non cambiano, e in CI apre una pull request ogni volta che vengono aggiunte nuove chiavi.

Il mio codice lascia la mia macchina?+

Solo le stringhe che vengono tradotte vengono inviate all'API di localize.dev, con il loro percorso file e la loro posizione (il componente e l'elemento come un pulsante o un'intestazione) come contesto. I file interi non vengono mai inviati. La riscrittura avviene localmente (o sul tuo CI runner), e le scansioni e le esecuzioni offline non toccano mai la rete.

Le traduzioni automatiche sono abbastanza buone da pubblicare?+

Sono una prima bozza solida con placeholder corretti e chiavi coerenti. Per testi regolamentati o critici per il brand, assegna un revisore per lingua: ricevono un'email quando un'esecuzione termina, approvano o correggono ogni traduzione nella scheda Revisione, e le correzioni vengono inserite nella pull request aperta e in ogni esecuzione successiva. Le correzioni che continuano a presentarsi diventano termini del glossario con un clic. Il modello segnala anche le traduzioni di cui non è sicuro, con il motivo, in modo che i revisori inizino da quelle.

Cosa succede se smettiamo di usare localize.dev?+

La tua app continua a funzionare. Il risultato è la libreria di internazionalizzazione che il tuo framework utilizza già (react-i18next, vue-i18n, ngx-translate, Rails I18n, gettext, risorse stringhe Android, Apple String Catalogs…) con file di localizzazione semplici nel tuo repository. Non c'è bisogno di rimuovere alcuna runtime, SDK o proxy di localize.dev.

Incolla un componente o una pagina. Vedilo in due lingue.

Nessun account necessario. Il playground esegue lo stesso motore della CLI.