Если вы какое-то время работали с Optimizely CMS, вы знаете, что управление локализацией с помощью XML-файлов может быть утомительным. Имена типов контента, заголовки свойств, названия вкладок, подсказки редактора — все это нуждается в переводе, а организовывать эти XML-файлы на нескольких языках — занятие неинтересное.
Я твердо верю, что переводы должны принадлежать партнеру и управляться системой контроля версий. Тем не менее, я полностью понимаю необходимость быстрого исправления локализации в среде DXP без необходимости развертывания кода. Редактор ресурсов был создан для обработки обоих сценариев: редактирование и сохранение файлов XML во время разработки, а также применение переопределений во время выполнения через DDS (динамическое хранилище данных), когда вам нужно быстрое исправление в рабочей среде.
Этот инструмент начинался как небольшая идея, но он значительно разросся по мере того, как я продолжал добавлять функции. Он построен на основе Blazor Server и MudBlazor, упакованных в виде библиотеки классов Razor, на которую вы можете ссылаться в своем проекте Optimizely.
TL;DR: Редактор ресурсов — это инструмент администрирования на базе Blazor для Optimizely CMS, который заменяет ручное редактирование XML для локализации. Он предоставляет визуальные редакторы названий типов контента, свойств, вкладок, каналов отображения, подсказок редактора и переводов интерфейса — и все это с поддержкой нескольких языков. Функции включают в себя панель мониторинга полноты, переопределение времени выполнения через DDS (развертывание не требуется), автоматический перевод на базе DeepL на уровне поля/элемента/массового уровня, импорт/экспорт CSV и управляемый переход из устаревших форматов XML.
Начиная
public void ConfigureServices(IServiceCollection services)
{
services.AddServerSideBlazor();
services.AddMudServices();
// Optional: Add DeepL translation (must be registered before AddResourceEditor)
services.AddDeepLTranslation(_configuration);
// Register Resource Editor services
services.AddResourceEditor(_configuration);
}
Конфигурация выполняется через appsettings.json:
{
"ResourceEditor": {
"TranslationFolder": "Resources/Translations",
"EnableFileSaving": true,
"EnableOverrides": true,
"ShowOverridesUI": true,
"EnableAutomatedTranslation": true,
"DeepL": {
"ApiKey": "your-api-key",
"UseFreeApi": true
}
}
}
В зависимости от того, как вы хотите визуализировать инструмент, вам также понадобится страница CSHTML для размещения компонента Blazor. Инструмент работает как полностраничное приложение Blazor без стандартного макета Optimizely:
@using Nergard.ResourceEditor.Components
@using Microsoft.AspNetCore.Components.Web
@model PageViewModel
@{ Layout = null; }
Resource Editor
@Html.AntiForgeryToken()
Создайте тип страницы в Optimizely, настройте контроллер и представление, и все готово.
Панель управления
Когда вы открываете Редактор ресурсов, вы попадаете на панель управления. Он дает вам обзор полноты перевода на всех настроенных вами языках. На каждой языковой карточке отображается прогресс для типов контента, свойств и вкладок, поэтому вы можете быстро увидеть, где отсутствуют переводы.
На панели мониторинга также отображаются файлы перевода представления/интерфейса с собственным статусом завершения.
Щелкнув карточку языка, вы перейдете непосредственно к обзору языка для этого языка. Подробнее об этом ниже в посте.
Редактор типов контента
Вероятно, именно здесь вы проведете большую часть своего времени. Редактор позволяет вам управлять переводами для всех типов контента, организованных в три раздела: «Страницы», «Блоки» и «Медиа».
Для каждого типа контента вы можете редактировать имя и описание на всех языках. Разверните тип контента, и вы получите доступ ко всем его свойствам, где вы сможете редактировать как заголовок (метку), так и текст справки.
Редактор обнаруживает общие свойства — свойства, существующие в нескольких типах контента, — и выделяет их. Это полезно, поскольку общие свойства в Optimizely используют резервный механизм через icontentdata, поэтому изменение перевода общего свойства может повлиять на несколько типов контента. Базовым типом в сохраненных XML-файлах будет icontentdata, поскольку я считаю, что свойства с одинаковыми именами должны быть единообразными во всем решении.
Вы можете фильтровать по языку, если хотите сосредоточиться только на одном языке за раз. Инструмент поддерживает автоматический перевод, но не поддерживает основной язык, которым необходимо управлять вручную.

Редактор вкладок
Редактор вкладок занимается локализацией имен групп свойств (вкладок). Это ярлыки вкладок, которые редакторы видят в пользовательском интерфейсе редактирования контента.
Он работает так же, как редактор типов контента — выберите вкладку, отредактируйте имя на всех настроенных языках, сохраните.

Отображение каналов и подсказки редактора
Два редактора меньшего размера обрабатывают имена каналов отображения и имена подсказок редактора. Та же схема – выберите элемент, отредактируйте переводы, сохраните. Они менее востребованы, но их приятно иметь в виду.

Просмотр / Переводы внешнего интерфейса
Редактор ресурсов также обрабатывает файлы перевода представлений.
Эти файлы используют многоязычный формат, в котором все языки находятся в одном XML-файле. Редактор представляет их в виде древовидной структуры с возможностью навигации, в которой вы можете редактировать значения для каждого языка, добавлять новые разделы и добавлять новые ключи.
Шаблон файла настраивается с помощью опции ViewFilePattern (по умолчанию — view_*.xml).

Обзор языка
Обзор языка дает вам четкое представление об одном языке. Он показывает все типы контента и их свойства с индикаторами статуса перевода, чтобы вы могли систематически работать с отсутствующими переводами.
Здесь же находится кнопка массового перевода — переводите все незаполненные поля на язык в один клик.
Примечание! Автоматические переводы предназначены только для неосновных языков. Поэтому, приложив усилия для создания хороших текстов локализации для основного языка, вы сможете получить выгоду и для других языков.

Переопределения
Именно эта функция позволяет редактору ресурсов хорошо работать в средах DXP. Переопределения хранятся в хранилище динамических данных и имеют приоритет над преобразованиями XML во время выполнения — развертывание не требуется.
Система переопределения работает через специальный «LocalizationProvider», который автоматически регистрируется в позиции 0 в цепочке поставщиков. Когда Optimizely разрешает ключ локализации, поставщик переопределения сначала проверяет DDS. Если переопределения не существует, оно передается стандартным поставщикам на основе XML.
**Известная проблема.** В настоящее время существует известная проблема, из-за которой Optimizely может неправильно распознавать переопределенные заголовки типов контента (имена), в то время как переопределения справочного текста работают должным образом. У меня есть постоянный запрос в службу поддержки Optimizely для расследования.
Встроенные переопределения
Когда ShowOverridesUI включен, каждое текстовое поле в редакторах получает небольшую кнопку переопределения. Нажмите на нее, и вы сможете создать переопределение для этого конкретного поля и языка. Изменение сохраняется в DDS и вступает в силу немедленно.

Переопределить менеджер
- Просмотр всех активных переопределений с указанием языка и значения.
- Фильтрация по языку и поиск по названию свойства.
- Добавлять, редактировать и удалять отдельные переопределения.
- **Экспорт в CSV** для документации или резервного копирования.
- **Импорт из CSV** для массовых операций.
- **Сохранить в XML**, чтобы перенести переопределение в постоянный файл перевода.
- Очистить все переопределения

Автоматические переводы с DeepL
Если вы включите автоматический перевод и зарегистрируете службу DeepL, Редактор ресурсов предоставит вам помощь в переводе на трех уровнях:
1. **Уровень поля** — каждое текстовое поле имеет кнопку перевода, которая переводит с языка по умолчанию.
2. **Уровень элемента**. Кнопка «Перевести отсутствующее» в заголовке каждого редактора переводит все пустые поля для текущего элемента.
3. **Массовый уровень** – в обзоре языка переведите все незаполненные поля для всего языка.
Переводы заполняют поля, но не сохраняются автоматически — вы просматриваете и сохраняете их, когда будете довольны результатами.
Чтобы включить его, зарегистрируйтесь на бесплатном уровне DeepL, а затем зарегистрируйте сервис DeepL перед редактором ресурсов:
services.AddDeepLTranslation(_configuration);
services.AddResourceEditor(_configuration);
Служба перевода является подключаемой. Если вы хотите использовать поставщика, отличного от DeepL, реализуйте ITranslationService и зарегистрируйте его перед вызовом AddResourceEditor().

XML-миграция
Если у вас есть сайт с переводами в классический формат Alloy XML (отдельные файлы, такие как «ContentTypeNames.xml», «PropertyNames.xml», «GroupNames.xml»), редактор ресурсов обнаруживает это автоматически и предлагает управляемый переход на собственный формат. Миграция выполняется шаг за шагом с отслеживанием хода выполнения и отчетами об ошибках.

Варианты конфигурации
Вот краткий обзор всех вариантов конфигурации:
| Option | Default | Description |
|--------|---------|-------------|
| `TranslationFolder` | `Resources/Translations` | Path to translation XML files |
| `EnableFileSaving` | `true` | Allow saving to XML files. Set to `false` on DXP |
| `EnableOverrides` | `true` | Enable DDS-based runtime overrides |
| `ShowOverridesUI` | `true` | Show inline override buttons in editors |
| `EnableAutomatedTranslation` | `false` | Enable automated translation features |
| `ViewFilePattern` | `views_*.xml` | Glob pattern for view translation files |
Типичная конфигурация DXP будет выглядеть так:
{
"ResourceEditor": {
"EnableFileSaving": false,
"EnableOverrides": true,
"ShowOverridesUI": true
}
}
Исходный код и лицензия
23 февраля 2026 г.
Читайте также

