В данном разделе описаны механизмы локализации системы и способы их использования через SDK.
В систему уже встроены механизмы локализации текстовых ресурсов, дат и чисел, с поддержкой следующих языков:
Вся необходимая функциональность для работы с локализацией находится в пространстве Universe.Platform.Locale и предоставляет следующие возможности:
На текущий момент, гарантии обратной совместимости не распространяются на содержимое встроенных файлов локализации. Любые ключи ко встроенным текстам могут быть изменены без предупреждения. Если есть требования к длительной поддержке локализации, то следует добавить и использовать собственные пользовательские тексты.
Тексты локализации, встроенные в систему, хранятся в отдельных json-файлах в дистрибутиве приложения, в директории
<app-root>/react-resources/locale-global. Все тексты разбиты на три основных пространства:
Для каждого из пространств задан свой файл локализации:
<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