Перейти к содержанию

Локализация — Администрирование

Документ описывает администрирование локализации в 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, перевести и загрузить обратно.

Выгрузка:

  1. Выбрать язык файла локализации (например, русский)
  2. Отметить категории или типы сущностей для локализации
  3. Нажать «Выгрузить файл» → Excel с колонками: EntityType, EntityId, LanguageId, Value

Загрузка:

  1. Перевести значения в Excel. LanguageId должен соответствовать Languages.ID в БД
  2. Загрузить файл через форму "Загрузить файл"
  3. Система объединяет переводы для каждой строки

Подробнее: Системные настройки.

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 вместо прямой записи

Связанные документы: