gt-sanity@3.0.0
Обзор
gt-sanity v3 ещё сильнее опирается на нативное поведение Sanity. Локализация на уровне полей теперь реализована через sanity-plugin-internationalized-array — эталонный плагин Sanity, — а не через UI Studio, созданный GT, и теперь поля можно исключать из перевода прямо в схеме, используя тот же паттерн на основе options, что и стандартные плагины локализации Sanity.
Идея проста: gt-sanity координирует плагины, которые уже поддерживает экосистема Sanity (@sanity/document-internationalization для локализации на уровне документа и sanity-plugin-internationalized-array для локализации на уровне полей), и добавляет поверх них процесс перевода. Studio не меняет своё поведение только потому, что у вас установлен GT.
Что нового
Локализация на уровне полей теперь работает через эталонный плагин
При включении fieldLevelLocalization (или его алиаса internationalizedArray) sanity-plugin-internationalized-array теперь автоматически настраивается на основе ваших sourceLocale и locales. Нативный плагин отвечает за типы схем internationalizedArray* и UI редактирования в Studio — кнопки добавления для отдельных языков, языковые метки, действия с полями — поэтому поведение Studio всегда соответствует привычному для пользователей Sanity, а обновления плагина приходят сразу после их выпуска в upstream.
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'fr', 'ja'],
translateDocuments: [{ type: 'post' }],
fieldLevelLocalization: { enabled: true },
translationLevel: 'internationalizedArray',
});В хранимых данных ничего не изменилось: элементы по-прежнему имеют вид { _key, _type, language, value }, поэтому существующему контенту не требуется миграция. В config также появились встроенные параметры сквозной передачи: defaultLanguages, buttonLocations, buttonAddAll, languageDisplay и apiVersion.
Используйте собственный экземпляр плагина
Если вы уже сами регистрируете sanity-plugin-internationalized-array, оставьте текущую настройку. Определение перевода основано на структуре данных — оно читает и записывает сохранённые данные независимо от того, кто зарегистрировал типы схем. Оставьте fieldLevelLocalization отключённым, чтобы типы регистрировались только один раз, и включайте для документов перевод на уровне полей с помощью 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 реэкспортирует internationalizedArray, internationalizedArrayLanguageFilter и isInternationalizedArrayItemType для непосредственного использования.
Исключите поля из перевода в своей схеме
Отмечайте поле — или целый тип, — вместо того чтобы вести отдельный список в config плагина:
defineField({
name: 'internalNotes',
type: 'string',
options: { gt: { exclude: true } },
});Сериализатор также учитывает параметры исключения стандартных плагинов локализации Sanity, поэтому одного шаблона достаточно для всего:
options.gt.exclude— собственное пространство имён GToptions.documentInternationalization.exclude—@sanity/document-internationalizationoptions.aiAssist.exclude—@sanity/assist
Исключение действует на любом уровне вложенности, а если задать его в options определения пользовательского типа, будут исключены все вхождения этого типа — в соответствии с семантикой нативных плагинов «поле или тип». options.gt полностью типизирован через declaration merging, а параметры плагина ignoreFields / skipFields / dedupeFields, основанные на id, по-прежнему используются для междокументных правил, таких как устранение дубликатов slug.
Несовместимые изменения
UI Studio GT на уровне полей удалён
Экспорт createInternationalizedArrayTypes и тип FieldLevelUIComponents удалены, как и параметры typePrefix, includeCompatibilityTypes и components в GTFieldLevelLocalizationConfig — нативного эквивалента для них нет. При передаче удалённого параметра в журнал записывается предупреждение, а сам параметр игнорируется. Данные, созданные с пользовательским typePrefix, больше не распознаются; стандартные данные internationalizedArray* это не затрагивает.
Более строгое применение localize: false
Исключение (параметры схема и устаревший localize: false) теперь также применяется к полям объектов верхнего уровня, которые раньше не отфильтровывались. Контент, который ранее по ошибке отправлялся на перевод, больше не отправляется — если после обновления кажется, что какое-то поле «пропало» из переводов, проверьте, не помечено ли оно как исключённое.