Локализация — Администрирование¶
Документ описывает администрирование локализации в 1Форме: управление языками в таблице Languages, поштучную и пакетную локализацию сущностей, автоперевод через Azure Translate, строки интерфейса LocalizationResources, встроенную локализацию в контроллерах и SQL-диагностику.
1. Управление языками¶
Таблица Languages. Администратор может добавлять/удалять языки. Ограничения:
- Ровно один язык с
IsDefault=1(уникальный filtered index) - Ровно один язык с
IsInternational=1(уникальный filtered index) LangAliasуникален (unique index)- Удаление языка каскадно удаляет все значения в
LocalizedBusinessObjectValuesиLocalizedDataObjectValues(CASCADE DELETE)
Поля для настройки:
- LangAlias — код языка (rus, eng, de, fr, cn)
- LangDescr — отображаемое имя
- culture — .NET culture code для форматирования дат/чисел (ru-RU, en-US)
- LanguageCode — ISO-код для Azure Translate API
- StatesOnSignPrefix — префикс для подписей на этом языке
2. Локализация сущностей: поштучно и пакетно¶
Рядом с названием каждой локализуемой сущности (категория, статус, ДП, кнопка перехода и т.д.) отображается значок локализации. При клике открывается форма ввода значений для каждого языка.
Сохранение: POST app/v2/api/localization/{entityType}/{entityId} с массивом {LanguageId, Value}.
Чтение: GET app/v2/api/localization/{entityType}/{entityId} — возвращает значения для всех языков.
Раздел админки для массовой локализации позволяет выгрузить названия в Excel, перевести и загрузить обратно.
Выгрузка:
- Выбрать язык файла локализации (например, русский)
- Отметить категории или типы сущностей для локализации
- Нажать «Выгрузить файл» → Excel с колонками: EntityType, EntityId, LanguageId, Value
Загрузка:
- Перевести значения в Excel.
LanguageIdдолжен соответствоватьLanguages.IDв БД - Загрузить файл через форму "Загрузить файл"
- Система объединяет переводы для каждой строки
Подробнее: Системные настройки.
3. Azure Translate¶
Автоматический перевод при создании/обновлении конфигурационных сущностей.
Как работает
При создании или обновлении сущности: 1. Определяются языки, для которых нет значения 2. Асинхронно запускается перевод недостающих значений 3. Azure Translate API переводит текст на недостающие языки 4. Результат сохраняется
Где применяется
- Создание/переименование категории
- Создание/переименование статуса
- Создание/изменение опции ДП
Лог
Все вызовы Azure Translate логируются в AzureTranslationLog: время, пользователь, исходный и целевой языки, переведённый текст.
Конфигурация
Ключ Azure Translate API хранится в настройках системы. Если ключ не настроен, автоперевод не выполняется — значения остаются только для языка по умолчанию.
4. LocalizationResources и встроенная локализация¶
Таблица LocalizationResources содержит статические строки интерфейса (метки, названия, подписи). Двуязычная структура: RussianValue + EnglishValue.
- Кешируется в памяти приложения
- Группировка по
BlockName(напримерEntityNames) - Используется интерфейсом для отображения на выбранном языке
Для добавления/изменения строк: прямая правка в БД или миграции. Отдельной формы в интерфейсе для администрирования нет.
Помимо отдельного Localization API, локализация встроена в контроллеры соответствующих сущностей. При обновлении категории, статуса, ДП через Admin API автоматически обновляются локализованные значения (включая автоперевод через Azure Translate).
5. Диагностика локализации¶
Проверка наличия локализации у сущности
-- Business-объект (например категория)
SELECT s.SubcatID, s.Description, s.LocalizedDescriptionId,
bov.LanguageId, bov.Value
FROM Subcategories s
LEFT JOIN LocalizedBusinessObjectValues bov
ON bov.LocalizationId = s.LocalizedDescriptionId
WHERE s.SubcatID = @id
-- Data-объект (например пользователь)
SELECT u.UserID, u.LastName, u.LocalizedLastNameId,
dov.LanguageId, dov.Value
FROM Users u
LEFT JOIN LocalizedDataObjectValues dov
ON dov.LocalizationId = u.LocalizedLastNameId
WHERE u.UserID = @id
Проверка языков
SELECT ID, LangAlias, LangDescr, IsDefault, IsInternational, culture, LanguageCode
FROM Languages
ORDER BY ID
Кеш не обновился после прямой записи в БД
Прямая запись в LocalizedXxxObjectValues через SQL не инвалидирует кеш. Решения:
1. Рестарт AppPool
2. Использовать API вместо прямой записи
Связанные документы:
- Системные настройки — пакетный перевод