惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
V
V2EX
G
Google Developers Blog
F
Full Disclosure
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
H
Hacker News: Front Page
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
NISL@THU
NISL@THU
G
GRAHAM CLULEY
V
Vulnerabilities – Threatpost
Hacker News - Newest:
Hacker News - Newest: "LLM"
A
About on SuperTechFans
The Cloudflare Blog
C
Cisco Blogs
D
DataBreaches.Net
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Vercel News
Vercel News
P
Privacy International News Feed
Microsoft Security Blog
Microsoft Security Blog
Help Net Security
Help Net Security
Recorded Future
Recorded Future
PCI Perspectives
PCI Perspectives
S
Schneier on Security
AI
AI
N
News | PayPal Newsroom
雷峰网
雷峰网
C
Cyber Attacks, Cyber Crime and Cyber Security
P
Proofpoint News Feed
The Last Watchdog
The Last Watchdog
L
LINUX DO - 最新话题
Hugging Face - Blog
Hugging Face - Blog
Apple Machine Learning Research
Apple Machine Learning Research
Schneier on Security
Schneier on Security
S
Securelist
云风的 BLOG
云风的 BLOG
Stack Overflow Blog
Stack Overflow Blog
博客园_首页
AWS News Blog
AWS News Blog
TaoSecurity Blog
TaoSecurity Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Recent Commits to openclaw:main
Recent Commits to openclaw:main
博客园 - 三生石上(FineUI控件)
C
CXSECURITY Database RSS Feed - CXSecurity.com
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Cloudbric
Cloudbric
C
Cybersecurity and Infrastructure Security Agency CISA
Project Zero
Project Zero
C
Check Point Blog
S
Security Affairs

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Локализация Apache Superset
dev-katerina · 2026-05-12 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение5 мин

Охват и читатели630

Туториал

Я работала над созданием модуля BI, в основе которого использование Apache Superset для расчета и демонстрации различных метрик. Планировалось использовать дашборды в общем интерфейсе приложения целиком, просто встроив их в интерфейс, а настройки для создания метрик и прочего спрятать в общую админку. Соответственно, появилась необходимость локализовать интерфейс Superset’а.

Готового решения найти не удалось, поэтому пришлось разбираться самостоятельно.

Сразу оговорюсь, речь пойдет о версии 6.1.0 с расширением dev, в которое включены библиотеки для работы с другими БД, помимо SQLite. В репозитории с исходным кодом есть ветка с информацией о релизах.

Для разворачивания я использую Docker.

Проблема частичной локализации

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

Итак, на пути к переводу интерфейса первое действие - изменить конфигурационный файл. Он позволяет нам указать перечень доступных для использования языков и выбрать язык по умолчанию.

Таким образом, в файле pythonpath/superset_config.py мы указываем значения для двух переменных:

LANGUAGES = {
    'ru': {'flag': 'ru', 'name': 'Russian'},
    'en': {'flag': 'us', 'name': 'English'},
    
}

BABEL_DEFAULT_LOCALE = 'ru'

В результате в интерфейсе рядом с настройками появляется кнопка переключения языка с тем количеством языков, которое вы указали. Однако тут будет переведена всего лишь часть настроек. Выглядит это так:

Частично переведенный интерфейс

Частично переведенный интерфейс

Причины и исправления

Дело в том, что в image по умолчанию не включены скомпилированные локализационные файлы для разных языков, хотя сами файлы с переводом представлены. Таким образом, первой задачей по исправлению будет компиляция файла.

Кроме того, в Superset используются две независимые системы локализации:

  • Backend (Python, Babel, .mo файлы)

  • Frontend (JavaScript, JSON словари)

Выполним локализацию в два этапа:

  1. Подготовим скомпилированные файлы перевода для python

  2. Запустим скрипт, который составит словарь для JS

Далее будет необходимость добавлять файлы в image и выполнять команды над ними. Один из удобных вариантов решения в данном случае - создание собственного image на основе официального с добавлением необходимых файлов, библиотек и выполнением действий.

Компиляция файла перевода

Начнем с компиляции файлов локализации. Они располагаются в папке superset/translations

Проверьте состав папки:

  1. файл messages.pot является шаблоном для файлов локализации, он должен быть в корне папки. Его трогать нет необходимости.

  2. в папках с <язык>/LC_MESSAGES хранятся файлы с расширением .po, в каждом файле .po есть перевод строк интерфейса для соответствующего языка. Он представляет собой заполненный словарь.

Состав папки

Состав папки

Если чего-то из этого у вас недостает, советую заглянуть в официальный репозиторий superset: https://github.com/apache/superset

Итак, мы подобрались к первой причине нашей проблемы. В папке не хватает скомпилированного файла .mo, это наш словарь, но уже для машины. Мы получаем его из файла messages.po с помощью библиотеки Babel. Я выполняла эту компиляцию локально, не в docker-контейнере.

python -m babel.messages.frontend compile -d <Абсолютный путь к папке>/translations   

Теперь, когда мы располагаем .mo файлом, большая часть интерфейса для нас переведена.

Более переведенный

Более переведенный

На данном этапе Dockerfile будет выглядеть так, вам необходимо заново собрать image, чтобы проверить это:

FROM apache/superset:6.1.0rc1-dev

USER root

RUN apt-get update && apt-get install -y \
    curl \
    gnupg \
    ca-certificates \
    && curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
    && apt-get install -y nodejs \
    && rm -rf /var/lib/apt/lists/*
COPY ./<Относительный путь к файлу>/superset_config.py /app/pythonpath/superset_config.py

COPY <Относительный путь к файлу>/ru /app/superset/translations/ru

USER superset

Создание словаря для перевода фронта

Часть интерфейса, которая переводится python, теперь располагает скомпилированным файлом локализации.

Другая же часть переводится JS. Для этого ей нужно составить собственный словарь так же на основе .po файла. Вам нужно запустить скрипт, который этот словарь составит superset/superset-frontend/scripts/po2json.sh. Для этого вам может понадобиться добавить скрипт в image, прежде чем его выполнить.

В Dockerfile добавляем следующие команды:

COPY ./<Относительный путь к папке scripts/po2json.sh> /app/superset-frontend

RUN cd /app/superset-frontend && \
    npm install --legacy-peer-deps && \
    npm run build-translation

Теперь переведен весь интерфейс:

Переведенный интерфейс

Переведенный интерфейс

Развертывание

В результате Dockerfile будет выглядеть следующим образом:

FROM apache/superset:6.1.0rc1-dev

USER root

RUN apt-get update && apt-get install -y \
    curl \
    gnupg \
    ca-certificates \
    && curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
    && apt-get install -y nodejs \
    && rm -rf /var/lib/apt/lists/*
COPY ./<Относительный путь к файлу>/superset_config.py /app/pythonpath/superset_config.py

COPY <Относительный путь к файлу>/ru /app/superset/translations/ru

COPY ./<Относительный путь к папке scripts/po2json.sh> /app/superset-frontend

RUN cd /app/superset-frontend && \
    npm install --legacy-peer-deps && \
    npm run build-translation

USER superset

Обратите внимание, сначала мы используем пользователя root, это дает нам право на установку утилит, а в конце снова переходим на пользователя superset.

Пояснение по установленным утилитам:

  • curl используется для загрузки внешних скриптов и файлов по HTTP. В данном случае — для скачивания установочного скрипта Node.js.

  • gnupg необходим для работы с GPG-ключами. Используется при добавлении внешних репозиториев (например, NodeSource), чтобы проверять их подлинность.

  • ca-certificates - набор корневых сертификатов, обеспечивающий корректную работу HTTPS. Без них curl не сможет безопасно скачивать файлы.

  • nodejs необходим для сборки фронтенда Apache Superset, включая компиляцию переводов (npm run build-translation).

После установки утилит мы копируем файл конфиг, затем папку со скомпилированным переводом, затем файл со скриптом, создающим словарь для JS.

После того, как мы все скопировали, запускаем скрипт, создающий словарь. Image готов!

Теперь переключим внимание на docker-compose.yml. По умолчанию Superset использует БД SQLite и внутренние инструменты кеширования. Подключим его вместо этого к PostgreSQL и Redis.

Для начала нам надо обозначить эти два сервиса в нашем docker-compose.yml.

  redis:
    image: redis:7
    container_name: redis
    restart: until-stopped
    networks:
      - app-network

Мы задаем сеть, внутри которой будут доступны контейнеры, и, поскольку нам не нужен доступ извне, не добавляем порты.

  db:
    image: postgres:15
    restart: always
    env_file: .env
    volumes:
      - pgdata:/var/lib/postgresql/data     
    networks:
      - app-network

При создании контейнера БД удобно добавить файл .env с основными настройами: название бд, пользователь, пароль

POSTGRES_USER=postgres
POSTGRES_PASSWORD=secret
POSTGRES_DB=superset

Для подключения superset к новым сервисам нам нужно всего лишь расширить superset_config.py, добавив туда следующие переменные:

REDIS_URL = "redis://redis:6379/0"
RATELIMIT_STORAGE_URI = REDIS_URL
SQLALCHEMY_DATABASE_URI = "postgresql+psycopg2://postgres:secret@db:5432/superset"

Сам superset мы пробрасываем наружу, не забывая при этом, что контенер должен быть в той же сети, что и остальные два, чтобы он мог к ним обращаться. В файле ./superset/.env нам нужно сохранить всего лишь одну переменную SUPERSET_SECRET_KEY - это просто случайно сгенерированная строка. Ее можно создать любым удобным способом, например, через openssl.

  superset:
    build:
      context: .
      dockerfile: superset/Dockerfile
    depends_on:
      - db
      - redis
    env_file:
      - ./superset/.env
    ports:
      - "8088:8088"
    restart: always
    networks:
      - app-network

volumes:
  pgdata:

networks:
  app-network:
    driver: bridge

После того, как вы подготовили image в Dockerfile и контейнеры в docker-compose, надо выполнить две команды сборки и запуска:

docker-compose build
docker-compose up -d