В Kepler.gl механизм поддержки языков построен вокруг системы интернационализации интерфейса (i18n), интегрированной в React-архитектуру библиотеки и связанной с Redux-состоянием приложения. Локализация охватывает текстовые элементы UI, форматирование чисел и дат, а также частично затрагивает отображение подписей на карте через Mapbox GL стили.
Система языков в Kepler.gl опирается на словарную модель сообщений, где каждый текстовый элемент интерфейса представлен ключом и соответствующим переводом. Эти словари передаются в компонент верхнего уровня и далее распространяются через контекст приложения.
Основные характеристики:
Интерфейс не содержит жёстко зашитых строк, что позволяет изменять язык без модификации исходного кода библиотеки.
Основная точка настройки языка — свойство locale,
передаваемое в компонент KeplerGl. Оно содержит объект
переводов, где ключи соответствуют идентификаторам текстовых ресурсов
интерфейса.
import KeplerGl from 'kepler.gl';
const messages = {
panel: {
dataCatalog: 'Каталог данных',
addData: 'Добавить данные'
},
toolbar: {
select: 'Выбор',
polygon: 'Полигон'
}
};
<KeplerGl
id="map"
width={800}
height={600}
mapboxApiAccessToken={MAPBOX_TOKEN}
locale={messages}
/>
Структура объекта locale повторяет иерархию
UI-компонентов. При отсутствии ключа используется значение по умолчанию
из встроенного английского словаря.
Локализационные файлы Kepler.gl организованы в виде вложенных объектов:
panel — панели управления слоями и даннымиtoolbar — инструменты взаимодействия с картойcommon — общие элементы интерфейсаmap — элементы карты и подсказкиdataset — операции с даннымиКаждый ключ представляет стабильный идентификатор, который не зависит от языка отображения.
Пример структуры:
const locale = {
map: {
mapLayers: 'Слои карты',
baseMap: 'Подложка'
},
dataset: {
title: 'Набор данных',
add: 'Добавить'
},
common: {
cancel: 'Отмена',
confirm: 'Подтвердить'
}
};
Встроенные переводы Kepler.gl поставляются в виде стандартного набора сообщений (обычно английский язык). Механизм расширения реализован через глубокое объединение объектов.
При совпадении ключей новые значения заменяют исходные, при отсутствии — добавляются поверх базового словаря.
const customLocale = {
toolbar: {
save: 'Сохранить проект',
exportImage: 'Экспорт изображения'
}
};
Такая модель позволяет частично локализовать интерфейс без необходимости полного перевода всех строк.
Kepler.gl хранит часть локализационной информации в Redux-слое, что обеспечивает синхронизацию языка между различными компонентами приложения.
Основные моменты:
locale может быть частью глобального
storeПример структуры состояния:
{
keplerGl: {
map: {
locale: {
toolbar: {
select: 'Выбор'
}
}
}
}
}
Такая организация позволяет централизованно управлять языком в приложениях с несколькими картами или разными экземплярами KeplerGl.
Механизм переключения языка реализуется через замену объекта
locale в состоянии или через обновление пропсов
компонента.
При изменении объекта переводов происходит повторный рендер интерфейса без перезагрузки карты.
Ключевые особенности:
При работе через Redux изменение языка обычно осуществляется через dispatch соответствующего action, обновляющего часть state с переводами.
Локализация Kepler.gl затрагивает не только текст, но и форматирование значений, связанных с отображением данных.
Используются стандартные механизмы JavaScript Internationalization API:
Intl.NumberFormat для чиселIntl.DateTimeFormat для датЭто влияет на:
Пример различий:
, vs .)Отдельный слой языковой поддержки связан с картографической подложкой Mapbox GL. Kepler.gl не управляет напрямую переводом географических подписей, но использует Mapbox стили, где возможно включение локализованных названий.
В Mapbox GL поддерживаются выражения вида:
"text-field": "{name_ru}"
или динамический выбор языка:
"text-field": [
"coalesce",
["get", "name_ru"],
["get", "name_en"]
]
Это позволяет синхронизировать язык интерфейса Kepler.gl с языком карты, но реализуется на уровне стиля Mapbox, а не самой библиотеки.
Пользовательские переводы могут формироваться как отдельные модули и импортироваться в приложение.
Типичная структура:
const ruLocale = {
toolbar: {
select: 'Выделение',
pan: 'Перемещение'
},
layer: {
add: 'Добавить слой',
remove: 'Удалить слой'
}
};
Далее словарь объединяется с базовой локализацией:
import { LOCALE_EN } from 'kepler.gl/localization';
const locale = {
...LOCALE_EN,
...ruLocale
};
Такой подход обеспечивает постепенную локализацию без потери неизменённых частей интерфейса.
В архитектуре Kepler.gl возможно одновременное хранение нескольких языковых наборов. Это актуально для приложений с переключением интерфейса в реальном времени.
Структура обычно выглядит следующим образом:
const locales = {
en: englishLocale,
ru: russianLocale,
de: germanLocale
};
const currentLocale = locales[activeLanguage];
При изменении активного языка происходит перерасчёт props или обновление Redux state.
Система языков в Kepler.gl имеет ряд архитектурных ограничений:
Дополнительно важно учитывать, что глубина ключей в словарях должна строго соответствовать внутренней структуре библиотеки, иначе часть переводов не применяется.
Локализация представлена в виде JSON-совместимых объектов. Основные требования к структуре:
Такая структура обеспечивает предсказуемое объединение словарей при инициализации приложения и во время runtime-обновлений.