gt-sanity@3.0.0
Descripción general
gt-sanity v3 refuerza su apuesta por el comportamiento nativo de Sanity. La localización a nivel de campo ahora está impulsada por sanity-plugin-internationalized-array —el plugin de referencia de Sanity— en lugar de una interfaz de usuario de Studio creada por GT, y los campos ahora pueden excluirse de la traducción directamente en tu schema con el mismo patrón basado en options que usan los plugins estándar de localización de Sanity.
El objetivo: gt-sanity organiza los plugins que el ecosistema de Sanity ya mantiene (@sanity/document-internationalization para el nivel de documento, sanity-plugin-internationalized-array para el nivel de campo) y añade encima el flujo de trabajo de traducción. Tu Studio nunca se comporta de forma distinta por tener GT instalado.
Qué hay de nuevo
La localización a nivel de campo ahora usa el plugin de referencia
Al habilitar fieldLevelLocalization (o su alias internationalizedArray), ahora se configura automáticamente sanity-plugin-internationalized-array a partir de tu sourceLocale y locales. El plugin nativo gestiona los tipos de esquema internationalizedArray* y la interfaz de usuario de edición de Studio —botones para añadir por idioma, etiquetas de idioma y acciones de campo—, por lo que el comportamiento de Studio siempre coincide con lo que los usuarios de Sanity ya conocen, y las actualizaciones del plugin llegan tan pronto como se publican upstream.
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'fr', 'ja'],
translateDocuments: [{ type: 'post' }],
fieldLevelLocalization: { enabled: true },
translationLevel: 'internationalizedArray',
});No cambió nada en los datos almacenados: los elementos siguen siendo { _key, _type, language, value }, por lo que el contenido existente no requiere migración. La config también incorporó opciones nativas de passthrough: defaultLanguages, buttonLocations, buttonAddAll, languageDisplay y apiVersion.
Usa tu propia instancia del plugin
Si ya registras sanity-plugin-internationalized-array por tu cuenta, mantén esa configuración. La detección de traducciones se basa en la estructura: lee y escribe los datos almacenados, sin importar quién haya registrado los tipos de esquema. Deja fieldLevelLocalization desactivado para que los tipos se registren solo una vez, y habilita la traducción a nivel de campo en los documentos con translationLevel:
plugins: [
internationalizedArray({
languages: [
{ id: 'en', title: 'English' },
{ id: 'es', title: 'Spanish' },
],
fieldTypes: ['string'],
}),
gtPlugin({
sourceLocale: 'en',
locales: ['es'],
translateDocuments: [{ type: 'post' }],
translationLevel: 'internationalizedArray',
}),
],gt-sanity reexporta internationalizedArray, internationalizedArrayLanguageFilter e isInternationalizedArrayItemType para usarlos directamente.
Excluye campos de la traducción en tu schema
Marca un campo — o un tipo completo — en el schema, en lugar de mantener una lista paralela en la config del plugin:
defineField({
name: 'internalNotes',
type: 'string',
options: { gt: { exclude: true } },
});El serializador también respeta las opciones de exclusión de los plugins estándar de localización de Sanity, por lo que un solo patrón lo cubre todo:
options.gt.exclude— el espacio de nombres propio de GToptions.documentInternationalization.exclude—@sanity/document-internationalizationoptions.aiAssist.exclude—@sanity/assist
La exclusión se aplica a cualquier nivel de anidamiento, y configurarla en las options de la definición de un tipo personalizado excluye todas las apariciones de ese tipo, en línea con la semántica nativa de “campo o tipo” de los plugins. options.gt está completamente tipado mediante fusión de declaraciones, y las opciones del plugin ignoreFields / skipFields / dedupeFields basadas en id siguen disponibles para reglas entre documentos, como la deduplicación de slug.
Cambios incompatibles
Se elimina la interfaz de usuario de Studio a nivel de campo de GT
La exportación createInternationalizedArrayTypes y el tipo FieldLevelUIComponents desaparecen, junto con las opciones typePrefix, includeCompatibilityTypes y components de GTFieldLevelLocalizationConfig; ninguna tiene un equivalente nativo. Al pasar una opción eliminada, se registra una advertencia y se ignora. Los datos creados con un typePrefix personalizado ya no se detectan; los datos estándar internationalizedArray* no se ven afectados.
Aplicación más rigurosa de localize: false
La exclusión (las opciones del schema y el localize: false legacy) ahora también se aplica a los subcampos de los campos de objeto de nivel superior, que antes no se filtraban. El contenido que antes se enviaba por error para su traducción deja de enviarse; si parece que un campo "desaparece" de las traducciones después de actualizar, comprueba si tiene una marca de exclusión.