diff --git a/README.md b/README.md index faac7b8..79c6c60 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,8 @@ npm run check Смена сценария и сброс обнуляют симуляцию, сохраняя конфигурацию, выбранную скорость и состояние воспроизведения. По завершении заданной смены симуляция останавливается; по умолчанию смена длится восемь часов. Обновление страницы публичного стенда возвращает конфигурацию тестового кейса. В серверном режиме конфигурация живёт до удаления сессии. Межсменный перенос НЗП пока не моделируется. +Настройки RU / KZ / ENG, тёмная тема и управление камерой: [docs/INTERFACE.md](docs/INTERFACE.md). + ## Разработка | Область | Назначение | diff --git a/apps/web/index.html b/apps/web/index.html index 1f747c2..22f49f0 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -3,7 +3,7 @@ - + + DriveIndUI — Drive Industrial UI diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 88c9ec5..f295571 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -1,3 +1,4 @@ +import { t } from './i18n'; import { useEffect, useRef, useState } from 'react'; import { ArrowUpRight } from 'lucide-react'; import { ControlBar } from './components/ControlBar'; @@ -17,8 +18,11 @@ import { OverviewPage } from './components/OverviewPage'; import { AiWorkspace } from './components/AiWorkspace'; import { WORKSPACES, pageFromHash, pageHref, type WorkspacePage } from './navigation'; import './workspaces.css'; +import './appearance.css'; +import { usePreferences } from './preferences'; export default function App() { + const { language } = usePreferences(); const session = useSession(); const { snapshot, connection } = session; const [page, setPage] = useState(() => pageFromHash(window.location.hash)); @@ -48,33 +52,33 @@ export default function App() { return () => window.removeEventListener('hashchange', change); }, []); useEffect(() => { - document.title = `${meta.label} · DriveIndUI`; - heading.current?.focus({ preventScroll: true }); - }, [page, meta.label]); + document.title = `${t(meta.label)} · DriveIndUI`; + }, [page, meta.label, language]); + useEffect(() => { heading.current?.focus({ preventScroll: true }); }, [page]); return
- { event.preventDefault(); heading.current?.focus(); }}>К содержимому + { event.preventDefault(); heading.current?.focus(); }}>{t("К содержимому")}
-

{meta.number} / {meta.caption}

{meta.title}

- {page === 'overview' && Открыть цех } +

{t(meta.number)} / {t(meta.caption)}

{t(meta.title)}

+ {page === 'overview' && {t("Открыть цех ")}}
{!snapshot ? (stale ? : ) : <> {stale && } {page !== 'data' && } - {page === 'data' && session.controlError &&

{session.controlError}

} + {page === 'data' && session.controlError &&

{t(session.controlError)}

} {page === 'overview' && { selectStation(id); setStationFocus(value => value + 1); navigate('factory'); }} />}