Локализация — Администрирование¶
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 Выгрузка¶
- Выбрать язык файла локализации (например, русский)
- Отметить категории или типы сущностей для локализации
- Нажать "Выгрузить файл" -> Excel с колонками: EntityType, EntityId, LanguageId, Value
3.2 Загрузка¶
- Перевести значения в Excel.
LanguageIdдолжен соответствоватьLanguages.IDв БД - Загрузить файл через форму "Загрузить файл"
- Система вызывает
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 endpointsdatabase.md— DDL таблицdata-flow.md— сценарии создания и обновленияbusiness.md— бизнес-правила../system/admin.md— пакетный перевод