Назад

gt-sanity@3.0.0

Brian Lou avatarBrian Lou
gt-sanityv3.0.0sanitycmstranslationmajor

Обзор

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 — собственное пространство имён GT
  • options.documentInternationalization.exclude@sanity/document-internationalization
  • options.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) теперь также применяется к полям объектов верхнего уровня, которые раньше не отфильтровывались. Контент, который ранее по ошибке отправлялся на перевод, больше не отправляется — если после обновления кажется, что какое-то поле «пропало» из переводов, проверьте, не помечено ли оно как исключённое.


Ссылки