Indietro

gt-sanity@2.1.0

Brian Lou avatarBrian Lou
gt-sanityv2.1.0sanitycmstranslationminor

Panoramica

gt-sanity v2.1 aggiunge la localizzazione a livello di campo: invece di creare un documento separato per ogni impostazione regionale, ora puoi memorizzare il valore di ogni lingua nello stesso documento usando array internazionalizzati. Il plugin genera automaticamente i tipi di schema, offre un'interfaccia di modifica inline per ogni impostazione regionale e gestisce la traduzione tramite lo stesso workflow di GT che già usi: i valori tradotti vengono reinseriti in-place nel documento sorgente.

La struttura dei dati corrisponde a sanity-plugin-internationalized-array ([{ _key, _type, language, value }]), quindi i contenuti esistenti con array internazionalizzati funzionano senza alcuna migrazione.


Novità

Localizzazione a livello di campo (array internazionalizzato)

La traduzione a livello di documento rimane l'impostazione predefinita: ogni impostazione regionale ha il proprio documento, collegato tramite @sanity/document-internationalization. Questo modello è adatto ai documenti in cui tutto varia a seconda della lingua.

Il nuovo modello a livello di campo mantiene un unico documento e localizza i singoli campi direttamente al suo interno:

{
  _id: 'post-123',
  _type: 'post',
  title: [
    { _key: 'x1', _type: 'internationalizedArrayStringValue', language: 'en', value: 'Hello' },
    { _key: 'x2', _type: 'internationalizedArrayStringValue', language: 'es', value: 'Hola' },
  ],
}

Attivalo con la nuova opzione internationalizedArray (o con il relativo alias descrittivo, fieldLevelLocalization):

import { defineConfig } from 'sanity';
import { gtPlugin } from 'gt-sanity';

export default defineConfig({
  plugins: [
    gtPlugin({
      sourceLocale: 'en',
      locales: ['es', 'fr', 'ja'],
      translateDocuments: [{ type: 'post' }],
      internationalizedArray: { enabled: true },
      translationLevel: 'internationalizedArray',
    }),
  ],
});

Tipi di schema generati

Quando è abilitato, il plugin genera tipi di schema internationalizedArray* (ad es. internationalizedArrayString, internationalizedArrayText) a partire dagli stessi sourceLocale / locales che passi già a gtPlugin — l'identità dell’impostazione regionale viene definita una sola volta. Usali nei tuoi schemi come qualsiasi altro tipo:

defineField({
  name: 'title',
  type: 'internationalizedArrayString',
});

fieldTypes controlla quali tipi vengono generati. Per impostazione predefinita è ['string', 'text'], accetta 'block' per Portable Text e definizioni di oggetti personalizzati per strutture di valore arbitrarie:

internationalizedArray: {
  enabled: true,
  fieldTypes: [
    'string',
    'text',
    'block',
    { name: 'seo', type: 'seoFields' }, // genera internationalizedArraySeo
  ],
},

Puoi anche personalizzare i nomi dei tipi generati con typePrefix (gli alias di compatibilità con i nomi standard internationalizedArray* vengono mantenuti per impostazione predefinita) e le etichette delle lingue mostrate nello Studio con languageTitles o getLanguageTitle.

Interfaccia di modifica inline per impostazione regionale

I tipi generati includono un input di Studio progettato appositamente: ogni lingua viene visualizzata come un editor inline etichettato (senza righe di oggetti compresse né dialog di modifica), con pulsanti di aggiunta e rimozione per ogni impostazione regionale. La lingua sorgente non può essere rimossa.

Se invece preferisci usare una tua interfaccia, l'opzione components ti consente di sovrascrivere gli slot input, item e field — oppure di passare false per tornare al rendering predefinito di Sanity. In entrambi i casi, la traduzione non cambia, poiché agisce sui dati archiviati anziché sui componenti.

translationLevel e modalità mista

La generazione dello schema e il routing della traduzione sono indipendenti: abilitare internationalizedArray aggiunge solo tipi di campo modificabili. La nuova opzione translationLevel controlla come vengono tradotti i documenti corrispondenti:

  • 'document' (predefinito) — traduzione dell'intero documento con documenti separati per ogni impostazione regionale, invariata rispetto alla v2.0.
  • 'internationalizedArray' — tutti i documenti corrispondenti vengono localizzati in-place tramite array internazionalizzati.
  • 'mixed' — i tipi di documento elencati in fieldLevelDocuments usano la strategia basata su array; tutto il resto resta a livello di documento.
gtPlugin({
  sourceLocale: 'en',
  locales: ['es', 'fr'],
  translateDocuments: [{ type: 'post' }, { type: 'siteSettings' }],
  internationalizedArray: { enabled: true },
  translationLevel: 'mixed',
  fieldLevelDocuments: [{ type: 'siteSettings' }], // localizzato in-place
});

I tipi di documento localizzati in-place sono automaticamente esclusi da @sanity/document-internationalization, quindi non ricevono badge di lingua né modelli di documento per impostazione regionale.

Importazione in-place

I documenti a livello di campo seguono lo stesso workflow di GT che usi già. Al momento dell'importazione, i valori tradotti vengono reinseriti nello stesso documento: viene aggiornata solo l'impostazione regionale di destinazione, mentre tutte le altre lingue — comprese le modifiche apportate mentre la traduzione era in corso — restano invariate.

Anche gli stati delle traduzioni nello Studio ora restano corretti dopo le importazioni in-place e i ricaricamenti della pagina, invece di mostrare le traduzioni completate come "non iniziata".