Юниверс DG SDK UI
v2.15.0

Локализация

В данном разделе описаны механизмы локализации системы и способы их использования через SDK.

В систему уже встроены механизмы локализации текстовых ресурсов, дат и чисел, с поддержкой следующих языков:

  • Русский
  • Английский

Вся необходимая функциональность для работы с локализацией находится в пространстве Universe.Platform.Locale и предоставляет следующие возможности:

  • Переопределение встроенных текстов локализации
  • Добавление пользовательских текстов локализации
  • Получение локализованных текстов и дат, в зависимости от языковых настроек пользователя
Предупреждение

На текущий момент, гарантии обратной совместимости не распространяются на содержимое встроенных файлов локализации. Любые ключи ко встроенным текстам могут быть изменены без предупреждения. Если есть требования к длительной поддержке локализации, то следует добавить и использовать собственные пользовательские тексты.

Тексты локализации, встроенные в систему, хранятся в отдельных json-файлах в дистрибутиве приложения, в директории <app-root>/react-resources/locale-global. Все тексты разбиты на три основных пространства:

  • common — базовые тексты, используемые повсеместно
  • default — прочие тексты, специфичные для отдельных модулей
  • wiki — тексты и ссылки для локализации переходов к пользовательской документации

Для каждого из пространств задан свой файл локализации:

  • <app-root>/react-resources/locale-global/{{lang}}/{{lang}}-common.json
  • <app-root>/react-resources/locale-global/{{lang}}/{{lang}}-default.json
  • <app-root>/react-resources/locale-global/{{lang}}/{{lang}}-wiki.json

Где <app-root> - это корневая директория приложения в дистрибутиве. Для docker-контейнера, это директория /usr/share/nginx/html.

Получить встроенный локализованный текст можно, используя метод Universe.Platform.Locale.I18n.t, указав пространство и ключ этого текста в пространстве:

console.log(Universe.Platform.Locale.i18n.t('common:yes'));  // 'Да'
console.log(Universe.Platform.Locale.i18n.t('common:no')); // 'Нет'

Для получения текстов из пространства default допускается не указывать имя пространства:


const text1 = Universe.Platform.Locale.i18n.t('default:app.locales>ru');
const text2 = Universe.Platform.Locale.i18n.t('app.locales>ru');
console.log(text1 === text2); // true

Переопределить тот или иной ключ в пространстве можно с помощью метода Universe.Platform.Locale.I18n.addResourceBundle:

Universe.Platform.Locale.i18n.addResourceBundle(
Universe.Platform.Locale.Locales.Ru,
{yes: 'YES'},
'common'
);

console.log(Universe.Platform.Locale.i18n.t('common:yes')); // 'YES'

При необходимости можно целиком переопределить встроенные файлы с локализациями. Для docker-контейнера это можно сделать следующим образом:

docker run repository.universe-data.ru/dis/unidata-dg/frontend:v2.15.0 \
-p '80:80' \
-v ./custom-locale/ru/ru-common.json:/usr/share/nginx/html/react-resources/locale-global/ru/ru-common.json \
-v ./custom-locale/ru/ru-default.json:/usr/share/nginx/html/react-resources/locale-global/ru/ru-default.json \
-v ./custom-locale/ru/ru-wiki.json:/usr/share/nginx/html/react-resources/locale-global/ru/ru-wiki.json \
-e BACKEND_ADDRESS=$BACKEND_ADDRESS

Возможно добавить собственные тексты локализации, используя метод Universe.Platform.Locale.I18n.addResourceBundle. Для каждого поддерживаемого языка нужно определить свой набор текстов. Тексты можно группировать иерархически:

Universe.Platform.Locale.i18n.addResourceBundle(Universe.Platform.Locale.Locales.Ru, {
foo: {
bar: {
greeting: 'Привет!'
}
}
});

Universe.Platform.Locale.i18n.addResourceBundle(Universe.Platform.Locale.Locales.En, {
foo: {
bar: {
greeting: 'Hello!'
}
}
});

console.log(Universe.Platform.Locale.i18n.t('foo>bar>greeting')); // 'Привет!'

За локализацию дат и чисел отвечает менеджер Universe.Platform.Locale.userLocale. Он предоставляет все необходимые параметры для корректного отображения локализованных дат и чисел.

const date = Universe.Vendor.Moment(new Date('01-01-2000'));

console.log(date.format(Universe.Platform.Locale.userLocale.getTimeFormat())); // '00:00:00'
console.log(date.format(Universe.Platform.Locale.userLocale.getTimeMillsFormat())); // '00:00:00.000'

console.log(date.format(Universe.Platform.Locale.userLocale.getDateFormat())); // '01.01.2000'
console.log(date.format(Universe.Platform.Locale.userLocale.getDateHoursMinutesFormat())); // '01.01.2000 00:00'
console.log(date.format(Universe.Platform.Locale.userLocale.getDateTimeFormat())); // '01.01.2000 00:00:00'
console.log(date.format(Universe.Platform.Locale.userLocale.getDateTimeMillsFormat())); // '01.01.2000 00:00:00.000'

console.log(date.format(Universe.Platform.Locale.userLocale.getServerDateFormat())); // '2000-01-01'
console.log(date.format(Universe.Platform.Locale.userLocale.getServerTimeFormat())); // '00:00:00'
console.log(date.format(Universe.Platform.Locale.userLocale.getServerTimestampFormat())); // '2000-01-01T00:00:00.000'
<Universe.Platform.Uikit.Input.Number
value={1000.55}
decimalSeparator={Universe.Platform.Locale.userLocale.getDecimalSeparator()}
/>

// Отобразит:
// Ru: 1000,55
// En: 1000.55