Migrare Localizable.strings a uno String Catalog (.xcstrings)

Aggiornato il · LocalePilot

Da Xcode 15, Apple spinge tutti verso gli String Catalog: un solo file JSON per tutte le lingue, con plurali e varianti per dispositivo. La migrazione richiede due clic, poi il diff che produce va controllato con attenzione.

Hai fretta? Converti file .strings isolati in un catalogo direttamente nel browser: gratis, senza registrazione, niente viene caricato.

Prima di migrare

Due precauzioni che evitano la maggior parte delle brutte sorprese:

  • Un albero Git pulito, su un branch dedicato. Tutto ciò che va controllato dopo è nel diff, quindi vuoi quel diff isolato.
  • Una build che passa prima della migrazione. Xcode riempie il catalogo analizzando il codice durante la build. Se il progetto non compila, il catalogo resta incompleto e non saprai perché.

La migrazione vera e propria

Nel navigatore di progetto, clic destro su Localizable.strings, poi Migrate to String Catalog. Xcode elenca i file e i target coinvolti; la formulazione esatta può cambiare tra le versioni di Xcode, il principio no.

I file fr.lproj/Localizable.strings, de.lproj/Localizable.strings… vengono sostituiti da un unico Localizable.xcstrings che contiene tutte le lingue. I commenti dei file .strings diventano il commento di ogni chiave.

Com'è fatto il file

Uno String Catalog è JSON. Una chiave semplice:

{
  "sourceLanguage" : "en",
  "strings" : {
    "welcome_user" : {
      "comment" : "Home screen greeting",
      "localizations" : {
        "fr" : {
          "stringUnit" : {
            "state" : "translated",
            "value" : "Bon retour, %@ !"
          }
        }
      }
    }
  },
  "version" : "1.0"
}

E un plurale, memorizzato sotto variations:

"items_left" : {
  "localizations" : {
    "fr" : {
      "variations" : {
        "plural" : {
          "one" : { "stringUnit" : { "state" : "translated", "value" : "%lld article restant" } },
          "other" : { "stringUnit" : { "state" : "translated", "value" : "%lld articles restants" } }
        }
      }
    }
  }
}

Nota la formattazione: uno spazio prima di ogni due punti, come lo scrive Xcode. Uno strumento che riscrive il file come JSON "standard" produrrà un diff enorme senza cambiare una sola traduzione.

Cosa controllare nel diff

Chiavi marcate Stale. Dopo una build, Xcode segnala le chiavi che non trova più nel codice. Non sono per forza morte: una chiave costruita a runtime (NSLocalizedString(variable, comment: ""), una chiave letta da un file di configurazione) è invisibile all'analisi. Verifica prima di eliminare.

Nuove chiavi estratte dal codice. La build può aggiungere stringhe che non hai mai messo in Localizable.strings, tipicamente i letterali SwiftUI Text("…"), localizzabili per impostazione predefinita. Arrivano non tradotte, quindi la percentuale che Xcode mostra per ogni lingua scende: è normale.

Stati. Ogni valore ha uno stato: translated, needs_review, o new per una stringa che nessuno ha ancora tradotto. Fra tre mesi, è così che saprai cosa è stato davvero revisionato.

Specificatori di formato. Una stringa SwiftUI come Text("\(count) items left") produce la chiave %lld items left. Se il vecchio .strings usava %d per la stessa frase, ora hai due chiavi quasi duplicate; tieni quella che il codice usa davvero.

E le versioni di iOS precedenti?

Non serve iOS 17. Il catalogo è un formato sorgente: durante la build, Xcode lo compila in normali file .strings all'interno del bundle dell'app. Il deployment target non cambia.

Modificare il catalogo fuori da Xcode

L'editor di Xcode va bene per poche stringhe. Per revisionare un'intera lingua, tradurre in blocco o controllare i placeholder, uno strumento dedicato aiuta. LocalePilot apre i file .xcstrings e li riscrive nello stile di Xcode: un catalogo non modificato resta identico byte per byte, una modifica cambia solo le proprie righe, e un valore modificato passa allo stato translated. Plurali e varianti per dispositivo sono modificabili; le chiavi con sostituzioni (%#@count@) e quelle marcate shouldTranslate: false vengono conservate così come sono, da modificare in Xcode.

Domande frequenti

Gli String Catalog richiedono iOS 17?

No. Xcode compila il catalogo in normali file di localizzazione al momento della build; il deployment target della tua app non cambia.

Cosa significa Stale in uno String Catalog?

Xcode non ha trovato la chiave nel codice durante l'ultima build. Verifica che non venga costruita a runtime prima di eliminarla.

Come annullo la migrazione?

Migra su un branch dedicato con un commit subito prima: un revert in Git riporta i file .strings.