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

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

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} — возвращает значения для всех языков.

3. Пакетный перевод сущностей

Раздел админки для массовой локализации. Позволяет выгрузить названия в Excel, перевести и загрузить обратно.

3.1 Выгрузка

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

3.2 Загрузка

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

Документация: ../system/admin.md.

4. Azure Translate

Автоматический перевод при создании/обновлении конфигурационных сущностей.

4.1 Как работает

При вызове UpdateForDefaultLanguageAndTranslate: 1. Определяются языки, для которых нет значения 2. Асинхронно вызывается TranslationService.TranslateLocalizationValues 3. Azure Translate API переводит текст на недостающие языки 4. Результат записывается через Merge

4.2 Где применяется

  • Создание/переименование категории (AdminCategories)
  • Создание/переименование статуса (StatesService)
  • Создание/изменение опции ДП (ExtParamOptions)

4.3 Лог

Все вызовы Azure Translate логируются в AzureTranslationLog: время, пользователь, исходный и целевой языки, переведённый текст.

4.4 Конфигурация

Ключ Azure Translate API хранится в настройках системы. Если ключ не настроен, автоперевод не выполняется — значения остаются только для языка по умолчанию.

5. LocalizationResources — строки интерфейса

Таблица LocalizationResources содержит статические строки UI (метки, названия, подписи). Двуязычная структура: RussianValue + EnglishValue.

  • Кешируется в LocalizationResourcesCache (in-memory, singleton)
  • Группировка по BlockName (например EntityNames)
  • Используется фронтендом для отображения интерфейса на выбранном языке

Для добавления/изменения строк: прямая правка в БД или миграции. Нет UI-формы для администрирования.

6. Встроенная локализация в контроллерах сущностей

Помимо отдельного Localization API, локализация встроена в контроллеры соответствующих сущностей. При обновлении категории, статуса, ДП через Admin API автоматически обновляются локализованные значения (включая автоперевод через Azure Translate).

7. Диагностика

7.1 Проверка наличия локализации у сущности

-- 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

7.2 Проверка языков

SELECT ID, LangAlias, LangDescr, IsDefault, IsInternational, culture, LanguageCode
FROM Languages
ORDER BY ID

7.3 Кеш не обновился после прямой записи в БД

Прямая запись в LocalizedXxxObjectValues через SQL не инвалидирует кеш. Решения: 1. Рестарт AppPool 2. Использовать API вместо прямой записи

Перекрёстные ссылки

  • backend.md — сервисы, API endpoints
  • database.md — DDL таблиц
  • data-flow.md — сценарии создания и обновления
  • business.md — бизнес-правила
  • ../system/admin.md — пакетный перевод