poe-svelte-ui-lib 1.57.0 → 1.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/WidgetDeviceInfo/README.md +1 -1
- package/dist/WidgetMap/README.md +4 -0
- package/dist/WidgetMap/mapWrapper/MapLibre.svelte +23 -14
- package/dist/WidgetRGBStrip/ColorPicker.svelte +1 -1
- package/dist/WidgetRGBStrip/README.md +1 -1
- package/dist/WidgetStackInfo/README.md +1 -1
- package/dist/WidgetWiFi/WidgetWiFi.svelte +1 -1
- package/dist/locales/i18n.d.ts +1 -0
- package/dist/locales/i18n.js +17 -1
- package/dist/locales/translations.js +8 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,6 +57,8 @@ npm install poe-svelte-ui-lib
|
|
|
57
57
|
|
|
58
58
|
**Поверхности — четыре ступени, заметные в обеих темах:** фон страницы `--bg-body` → панель `--back-color` → блок внутри панели `--container-color` → поле `--field-color` (в тёмной теме поле темнее блока — «утоплено»). Готовые рецепты — классы `ui-panel` (блок прямо на фоне страницы: карточка, шапка раздела, холст, область чата — заливка панели, волосяная рамка, лёгкая тень) и `ui-inset` (блок внутри панели: группа полей, шапка карточки, подложка сообщения). Отступы и скругление задаёт страница классами Tailwind. Панели не делаются полупрозрачными (`bg-(--back-color)/50` сливается с фоном): выпадающие меню и всплывающие блоки — `ui-panel` с тенью `--elevation-3`, свои сообщения в чатах — `--accent-soft`, чужие — `--container-color`.
|
|
59
59
|
|
|
60
|
+
**Названия смарт-виджетов** — в словаре библиотеки на всех языках (WiFi, «Об устройстве», «Файловая система», «Стек и задачи», «RGB лента», «Пилотажный дисплей», «Карта»); пустой `label.name` показывает название на языке пользователя, `widgetTitle(type)` отдаёт его сразу на всех языках `{ ru, en, zh }` — так конструктор заполняет заголовок нового виджета.
|
|
61
|
+
|
|
60
62
|
**Подсказки смарт-виджетов** — `hints.ts`: у каждого виджета своя кнопка «?» в правом краю шапки (`WidgetHeader` с пропом `hints`), по умолчанию подсказки выключены, выбор оператора запоминается в браузере для виджетов этого типа (`hintsSetting("WidgetPFD")`, ключ `localStorage` `WidgetHints.<тип>`, пишется только по нажатию «?»), глобального переключателя нет. Элемент получает подсказку действием `use:hint={{ text, enabled: $hints }}` — всплывающее окно в стиле темы над элементом; тексты — в словаре библиотеки (`widget.*.hint.*`), только там, где смысл поля не очевиден.
|
|
61
63
|
|
|
62
64
|
**Предпросмотр темы** — вкладка «Тема» на главной витрины (`src/routes/ThemePreview.svelte`): палитра токенов и состояния, затем все компоненты и виджеты в порядке меню витрины — каждый тип в своём разделе с живыми демо-данными (графики, видео, полёт для PFD и карты), в конце типографика и Markdown; тема переключается кнопкой в шапке витрины. Правьте `theme.css` и смотрите результат там.
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
| ---------------- | ----------------------------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
40
40
|
| `wrapperClass` | `string` | `""` | CSS-классы для обёртки компонента |
|
|
41
41
|
| `componentClass` | `string` | `""` | "Мастер-цвет" виджета — роль вида `"bg-red"` (см. `optionsStore.COLOR_OPTIONS`) |
|
|
42
|
-
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой —
|
|
42
|
+
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой — «Об устройстве» на текущем языке |
|
|
43
43
|
| `value` | `IWidgetDeviceInfoConfig` | внутренний дефолт | Текущая информация об устройстве |
|
|
44
44
|
| `collapsed` | `boolean` | `false` | Свёрнуто ли тело виджета (заголовок остаётся); поддерживает двустороннее связывание (`$bindable`) |
|
|
45
45
|
| `persistKey` | `string` | `undefined` | Ключ для сохранения состояния `collapsed` в `localStorage` — при заданном ключе состояние сворачивания переживает перезагрузку страницы |
|
package/dist/WidgetMap/README.md
CHANGED
|
@@ -99,3 +99,7 @@ Telemetry_SendObject(g_telemetry_stream, g_mcfg.DevSN, "Data", dev, sizeof(dev)
|
|
|
99
99
|
### Подсказки
|
|
100
100
|
|
|
101
101
|
Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetMap` в браузере (`hintsSetting("WidgetMap")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
|
|
102
|
+
|
|
103
|
+
### Подпись источников карты
|
|
104
|
+
|
|
105
|
+
Условия CARTO и OpenStreetMap требуют указывать источник подложки, поэтому подпись не убирается: она компактная — кнопка «i» в углу карты, свёрнутая при открытии (`attributionControl: { compact: true }`, сворачивание один раз после появления подписи в `mapWrapper/MapLibre.svelte`); полный текст раскрывается по нажатию.
|
|
@@ -30,19 +30,37 @@
|
|
|
30
30
|
|
|
31
31
|
const mapCtx = prepareMapContext()
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
/* Подпись источников карты (CARTO, OpenStreetMap) обязательна по их условиям — оставляем её компактной кнопкой «i», свёрнутой при открытии */
|
|
34
|
+
/* Подпись появляется, когда загрузятся стиль и источники, — сворачиваем один раз, дальше её открывает и закрывает оператор */
|
|
35
|
+
const collapseAttribution = (target: maplibregl.Map) => {
|
|
36
|
+
const tryCollapse = () => {
|
|
37
|
+
const attrib = container?.querySelector(".maplibregl-ctrl-attrib.maplibregl-compact")
|
|
38
|
+
if (!attrib) return
|
|
39
|
+
attrib.classList.remove("maplibregl-compact-show")
|
|
40
|
+
attrib.removeAttribute("open")
|
|
41
|
+
target.off("styledata", tryCollapse)
|
|
42
|
+
target.off("sourcedata", tryCollapse)
|
|
43
|
+
}
|
|
44
|
+
target.on("styledata", tryCollapse)
|
|
45
|
+
target.on("sourcedata", tryCollapse)
|
|
46
|
+
}
|
|
36
47
|
|
|
48
|
+
const createMap = () => {
|
|
49
|
+
if (!window.maplibregl || map || !container) return
|
|
37
50
|
map = new window.maplibregl.Map({
|
|
38
51
|
container,
|
|
39
52
|
style,
|
|
40
53
|
zoom,
|
|
41
54
|
center,
|
|
42
55
|
maxPitch,
|
|
56
|
+
attributionControl: { compact: true },
|
|
43
57
|
})
|
|
58
|
+
collapseAttribution(map)
|
|
44
59
|
mapCtx.map = map
|
|
45
|
-
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Инициализация карты
|
|
63
|
+
$effect(createMap)
|
|
46
64
|
|
|
47
65
|
$effect(() => {
|
|
48
66
|
if (map && style) {
|
|
@@ -61,16 +79,7 @@
|
|
|
61
79
|
hasConnection = await loadMapLibre()
|
|
62
80
|
isLoading = false
|
|
63
81
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
map = new window.maplibregl.Map({
|
|
67
|
-
container,
|
|
68
|
-
style,
|
|
69
|
-
zoom,
|
|
70
|
-
center,
|
|
71
|
-
maxPitch,
|
|
72
|
-
})
|
|
73
|
-
mapCtx.map = map
|
|
82
|
+
createMap()
|
|
74
83
|
})
|
|
75
84
|
</script>
|
|
76
85
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- $lib/WidgetRGBStrip/ColorPicker.svelte — внутренняя палитра виджета
|
|
1
|
+
<!-- $lib/WidgetRGBStrip/ColorPicker.svelte — внутренняя палитра виджета «RGB лента» (HSV + белый), отдельным компонентом библиотеки не экспортируется -->
|
|
2
2
|
<script lang="ts">
|
|
3
3
|
import { twMerge } from "tailwind-merge"
|
|
4
4
|
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
| `id` | `string` | `undefined` | Префикс группы ленты (`"LST"`), используется вызывающим кодом |
|
|
54
54
|
| `wrapperClass` | `string` | `""` | CSS-классы обёртки |
|
|
55
55
|
| `componentClass` | `string` | `""` | «Мастер-цвет» виджета — роль вида `"bg-red"`, перекрашивает весь виджет |
|
|
56
|
-
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой —
|
|
56
|
+
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой — «RGB лента» на текущем языке |
|
|
57
57
|
| `value` | `Partial<IWidgetRGBStripConfig>` | `undefined` | Поля группы `LST` |
|
|
58
58
|
| `keys` | `Partial<Record<keyof IWidgetRGBStripConfig, string>>` | `undefined` | Переопределение имён полей устройства |
|
|
59
59
|
| `collapsed` | `boolean` | `false` | Свёрнуто ли тело виджета (`$bindable`) |
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
| ---------------- | ------------------------ | ------------ | ------------------------------------------------------------------------- |
|
|
47
47
|
| `wrapperClass` | `string` | `""` | CSS-классы обёртки |
|
|
48
48
|
| `componentClass` | `string` | `""` | «Мастер-цвет» виджета — роль вида `"bg-red"`, перекрашивает весь виджет |
|
|
49
|
-
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой —
|
|
49
|
+
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой — «Стек и задачи» на текущем языке |
|
|
50
50
|
| `value` | `IWidgetStackInfo` | `undefined` | Снимок `StackInfo`; без него — «Нет данных» |
|
|
51
51
|
| `keys` | `{ StackInfo?: string }` | `undefined` | Переопределение имени объекта ответа, по умолчанию `StackInfo` |
|
|
52
52
|
| `argument` | `string` | `undefined` | Аргумент запроса, по умолчанию `"StackInfo"` (используется вызывающим) |
|
|
@@ -144,7 +144,7 @@
|
|
|
144
144
|
style={accentStyle}
|
|
145
145
|
>
|
|
146
146
|
<!-- Заголовок и переключатель режима -->
|
|
147
|
-
<WidgetHeader icon={WifiIcon} label={label?.name || "
|
|
147
|
+
<WidgetHeader icon={WifiIcon} label={label?.name || $T("widget.wifi.title")} bind:collapsed {hints}>
|
|
148
148
|
{#snippet right()}
|
|
149
149
|
<div class="w-full sm:w-72" use:hint={{ text: $T("widget.wifi.hint.mode"), enabled: $hints }}>
|
|
150
150
|
<UI.Select
|
package/dist/locales/i18n.d.ts
CHANGED
|
@@ -15,3 +15,4 @@ export type Translator = (key: string, params?: TranslateParams) => string;
|
|
|
15
15
|
export declare const translate: (dictionary: Translations, locale: string, key: string, params?: TranslateParams) => string;
|
|
16
16
|
export declare const createTranslator: (dictionary: Translations) => Readable<Translator>;
|
|
17
17
|
export declare const T: Readable<Translator>;
|
|
18
|
+
export declare const widgetTitle: (type: string) => Partial<Record<LanguageCode, string>>;
|
package/dist/locales/i18n.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { derived, get, writable } from "svelte/store";
|
|
2
2
|
import translations from "./translations.js";
|
|
3
|
-
import { DEFAULT_LANGUAGE, LANGUAGES, isLanguageCode, resolveLanguage } from "./languages.js";
|
|
3
|
+
import { DEFAULT_LANGUAGE, LANGUAGES, LANGUAGE_CODES, isLanguageCode, resolveLanguage } from "./languages.js";
|
|
4
4
|
/* Язык и механизм перевода — общие для библиотеки и приложений: приложение берёт отсюда Language/setLanguage/LOCALES и строит свой $T
|
|
5
5
|
из своего словаря через createTranslator (см. README «Языки»); переключение языка одним setLanguage меняет и компоненты, и приложение */
|
|
6
6
|
/*
|
|
@@ -56,3 +56,19 @@ export const translate = (dictionary, locale, key, params) => {
|
|
|
56
56
|
export const createTranslator = (dictionary) => derived(Language, ($lang) => (key, params) => translate(dictionary, $lang, key, params));
|
|
57
57
|
/* $T самой библиотеки */
|
|
58
58
|
export const T = createTranslator(translations);
|
|
59
|
+
/* Названия смарт-виджетов по умолчанию — ключи словаря библиотеки */
|
|
60
|
+
const WIDGET_TITLE_KEYS = {
|
|
61
|
+
WidgetWiFi: "widget.wifi.title",
|
|
62
|
+
WidgetDeviceInfo: "widget.info.title",
|
|
63
|
+
WidgetFileSystem: "widget.fs.title",
|
|
64
|
+
WidgetStackInfo: "widget.stack.title",
|
|
65
|
+
WidgetRGBStrip: "widget.rgb.title",
|
|
66
|
+
WidgetPFD: "pfd.title",
|
|
67
|
+
WidgetMap: "widget.map.title",
|
|
68
|
+
};
|
|
69
|
+
/* Название виджета сразу на всех языках { ru, en, zh, ... } — конструктор заполняет им заголовок нового виджета,
|
|
70
|
+
переводы видны и правятся в «Тексты и переводы»; для неизвестного типа — пустой объект */
|
|
71
|
+
export const widgetTitle = (type) => {
|
|
72
|
+
const entry = translations[WIDGET_TITLE_KEYS[type] ?? ""];
|
|
73
|
+
return entry ? Object.fromEntries(LANGUAGE_CODES.filter((lang) => entry[lang]).map((lang) => [lang, entry[lang]])) : {};
|
|
74
|
+
};
|
|
@@ -124,8 +124,8 @@ const translations = {
|
|
|
124
124
|
},
|
|
125
125
|
"component.info.WidgetMap": {
|
|
126
126
|
ru: "🎯 **Назначение**\nКарта объектов в реальном времени: положение, курс и траектория каждого объекта.\n\n📦 **Пакет данных**\n- Поля групп устройства, по группе на объект: по умолчанию `MAV`, несколько — через пробел (`MAV GNSS`); привязывать переменные не нужно\n- Поток телеметрии: координаты — раз в 0.5–1 с, имя и серийный номер — реже\n- Только отображение, ничего не отправляет\n\n🔑 **Ключи**\n- `Lat` — число, °: широта, обязательный; `Lat` и `Lon` = 0 — нет фикса, объект не рисуется\n- `Lon` — число, °: долгота, обязательный\n- `Alt` — число, м: высота\n- `Heading` — число, 0–360°: курс, поворачивает маркер\n- `Sat` — число спутников\n- `DevName` — строка: имя объекта, подпись маркера; без него — имя группы\n- `DevSN` — строка: серийный номер\n\n✨ **Особенности**\n- Ключи общие с «Пилотажным дисплеем» и «Об устройстве» — один пакет питает несколько виджетов\n- Клик по объекту — карточка со всеми значениями, кнопки «Копировать» и «Скрыть»\n- Траекторию, число её точек и таймаут маркеров оператор переключает на карте; объект без новых данных краснеет, ещё через таймаут скрывается\n- «Показать все» в шапке вписывает объекты в экран; сама карта вид не меняет\n- В шапке — сколько объектов на связи из заданных\n- Только 2D: правой кнопкой мыши карта поворачивается, компас под зумом возвращает её на север\n\n⚙️ **Настройки**\n- Группы полей, мастер-цвет\n- Высота карты `S`/`M`/`L`/`XL`, иконка маркера\n- Начальные значения: траектория и число её точек",
|
|
127
|
-
en: '🎯 **Purpose**\nA real-time map of objects: position, heading and track of each object.\n\n📦 **Data packet**\n- Device field groups, one group per object: `MAV` by default, several separated by spaces (`MAV GNSS`); no variable binding needed\n- Telemetry stream: coordinates every 0.5–1 s, name and serial number less often\n- Display only, sends nothing\n\n🔑 **Keys**\n- `Lat` — number, °: latitude, required; `Lat` and `Lon` = 0 — no fix, the object is not drawn\n- `Lon` — number, °: longitude, required\n- `Alt` — number, m: altitude\n- `Heading` — number, 0–360°: heading, rotates the marker\n- `Sat` — satellite count\n- `DevName` — string: object name, the marker label; without it — the group name\n- `DevSN` — string: serial number\n\n✨ **Features**\n- Keys are shared with the "Flight
|
|
128
|
-
zh: "🎯 **用途**\n实时对象地图:每个对象的位置、航向和轨迹。\n\n📦 **数据包**\n- 设备字段分组,每个分组一个对象:默认 `MAV`,多个用空格分隔(`MAV GNSS`);无需绑定变量\n- 遥测流:坐标每 0.5–1 秒一次,名称和序列号频率更低\n- 仅显示,不发送任何数据\n\n🔑 **键**\n- `Lat` —— 数字,°:纬度,必需;`Lat` 和 `Lon` 为 0 —— 无定位,不绘制对象\n- `Lon` —— 数字,°:经度,必需\n- `Alt` —— 数字,m:高度\n- `Heading` —— 数字,0–360°:航向,旋转标记\n- `Sat` —— 卫星数\n- `DevName` —— 字符串:对象名称,标记标签;缺省时为分组名\n- `DevSN` —— 字符串:序列号\n\n✨ **特点**\n-
|
|
127
|
+
en: '🎯 **Purpose**\nA real-time map of objects: position, heading and track of each object.\n\n📦 **Data packet**\n- Device field groups, one group per object: `MAV` by default, several separated by spaces (`MAV GNSS`); no variable binding needed\n- Telemetry stream: coordinates every 0.5–1 s, name and serial number less often\n- Display only, sends nothing\n\n🔑 **Keys**\n- `Lat` — number, °: latitude, required; `Lat` and `Lon` = 0 — no fix, the object is not drawn\n- `Lon` — number, °: longitude, required\n- `Alt` — number, m: altitude\n- `Heading` — number, 0–360°: heading, rotates the marker\n- `Sat` — satellite count\n- `DevName` — string: object name, the marker label; without it — the group name\n- `DevSN` — string: serial number\n\n✨ **Features**\n- Keys are shared with the "Flight Display" and "About Device" — one packet feeds several widgets\n- Click an object — a card with all values, "Copy" and "Hide" buttons\n- The operator switches the track, its point count and marker timeout on the map; an object without new data turns red, after one more timeout it is hidden\n- "Show all" in the header fits all objects into view; the map never moves by itself\n- The header shows how many of the configured objects are online\n- 2D only: the right mouse button rotates the map, the compass under the zoom returns it to north\n\n⚙️ **Settings**\n- Field groups, master color\n- Map height `S`/`M`/`L`/`XL`, marker icon\n- Defaults: track and its point count',
|
|
128
|
+
zh: "🎯 **用途**\n实时对象地图:每个对象的位置、航向和轨迹。\n\n📦 **数据包**\n- 设备字段分组,每个分组一个对象:默认 `MAV`,多个用空格分隔(`MAV GNSS`);无需绑定变量\n- 遥测流:坐标每 0.5–1 秒一次,名称和序列号频率更低\n- 仅显示,不发送任何数据\n\n🔑 **键**\n- `Lat` —— 数字,°:纬度,必需;`Lat` 和 `Lon` 为 0 —— 无定位,不绘制对象\n- `Lon` —— 数字,°:经度,必需\n- `Alt` —— 数字,m:高度\n- `Heading` —— 数字,0–360°:航向,旋转标记\n- `Sat` —— 卫星数\n- `DevName` —— 字符串:对象名称,标记标签;缺省时为分组名\n- `DevSN` —— 字符串:序列号\n\n✨ **特点**\n- 键与「飞行显示器」和「关于设备」通用 —— 一个数据包可供多个组件使用\n- 点击对象 —— 显示所有值的卡片,带「复制」和「隐藏」按钮\n- 操作员在地图上切换轨迹、轨迹点数和标记超时;无新数据的对象变红,再过一个超时后隐藏\n- 标题栏中的「显示全部」将对象纳入视野;地图本身不会自动移动\n- 标题栏显示已配置对象中在线的数量\n- 仅 2D:按住鼠标右键旋转地图,缩放按钮下方的指南针将其恢复为正北\n\n⚙️ **设置**\n- 字段分组、主色\n- 地图高度 `S`/`M`/`L`/`XL`、标记图标\n- 默认值:轨迹及其点数",
|
|
129
129
|
},
|
|
130
130
|
"component.info.WidgetStackInfo": {
|
|
131
131
|
ru: '🎯 **Назначение**\nОтладка прошивки: свободная память и запас стека задач.\n\n📦 **Пакет данных**\n- Один объект `StackInfo` из ответа на `GET StackInfo`, привязывать переменные не нужно\n- Запрос — кнопкой «Обновить» или автоопросом\n\n🔑 **Ключи**\n- `Heap` — массив `[{ "Name", "Total", "Free", "MinFree" }]`, байт: кучи памяти — `Internal` встроенная и `PSRAM` внешняя ОЗУ у ESP, `Heap` у STM, в виджете понятными подписями; `MinFree` — минимум свободного с момента старта\n- `Tasks` — массив `[{ "Name", "State", "Prio", "Core", "FreeMin" }]`: задачи; `State` — `0` выполняется, `1` готова, `2` ждёт, `3` приостановлена, `4` удалена; `Core` — ядро (только ESP32, `-1` без привязки); `FreeMin` — минимальный запас стека, байт\n\n✨ **Особенности**\n- Светлая часть полосы кучи — пик занятости\n- Задачи отсортированы по запасу стека — самые рискованные сверху\n- Свёрнутый виджет не опрашивает устройство\n\n⚙️ **Настройки**\n- Порог запаса стека: меньше порога — красным, меньше удвоенного — оранжевым\n- Автоопрос: выкл / 1 / 5 / 10 с; мастер-цвет',
|
|
@@ -475,7 +475,7 @@ const translations = {
|
|
|
475
475
|
"widget.wifi.allowed_modes": { ru: "Разрешённые режимы", en: "Allowed modes", zh: "允许的模式" },
|
|
476
476
|
"widget.wifi.ap_confirm": { ru: "Подтверждение при включении AP", en: "Confirm when enabling AP", zh: "启用 AP 时确认" },
|
|
477
477
|
"widget.wifi.scan_command": { ru: "Команда сканирования", en: "Scan command", zh: "扫描命令" },
|
|
478
|
-
"widget.info.title": { ru: "
|
|
478
|
+
"widget.info.title": { ru: "Об устройстве", en: "About Device", zh: "关于设备" },
|
|
479
479
|
"widget.info.restart": { ru: "Перезагрузить", en: "Restart", zh: "重启" },
|
|
480
480
|
"widget.info.sn": { ru: "Серийный номер", en: "Serial number", zh: "序列号" },
|
|
481
481
|
"widget.info.id": { ru: "ID устройства", en: "Device ID", zh: "设备 ID" },
|
|
@@ -489,7 +489,7 @@ const translations = {
|
|
|
489
489
|
"widget.info.web_user": { ru: "Пользователь Web", en: "Web user", zh: "Web 用户" },
|
|
490
490
|
"widget.info.web_psw": { ru: "Пароль Web", en: "Web password", zh: "Web 密码" },
|
|
491
491
|
"widget.info.restart_command": { ru: "Команда перезагрузки", en: "Restart command", zh: "重启命令" },
|
|
492
|
-
"widget.stack.title": { ru: "
|
|
492
|
+
"widget.stack.title": { ru: "Стек и задачи", en: "Stack and Tasks", zh: "堆栈与任务" },
|
|
493
493
|
"widget.stack.off": { ru: "Выкл", en: "Off", zh: "关" },
|
|
494
494
|
"widget.stack.sec": { ru: "{n} с", en: "{n} s", zh: "{n} 秒" },
|
|
495
495
|
"widget.stack.state.running": { ru: "Работает", en: "Running", zh: "运行" },
|
|
@@ -548,6 +548,7 @@ const translations = {
|
|
|
548
548
|
en: 'Auto polling — how often to request data from the device; "Refresh" — request now',
|
|
549
549
|
zh: "自动轮询——向设备请求数据的频率;“刷新”——立即请求",
|
|
550
550
|
},
|
|
551
|
+
"widget.wifi.title": { ru: "WiFi", en: "WiFi", zh: "WiFi" },
|
|
551
552
|
"widget.wifi.static": { ru: "Статический", en: "Static", zh: "静态" },
|
|
552
553
|
"widget.wifi.hint.mode": {
|
|
553
554
|
ru: "Режим Wi-Fi: клиент — устройство подключается к роутеру, точка — создаёт свою сеть, оба — одновременно; выключено — Wi-Fi не работает",
|
|
@@ -702,7 +703,7 @@ const translations = {
|
|
|
702
703
|
"widget.stack.period": { ru: "Автоопрос по умолчанию, мс (0 — выкл)", en: "Default auto-poll, ms (0 — off)", zh: "默认自动轮询, 毫秒 (0 — 关)" },
|
|
703
704
|
"widget.stack.response": { ru: "Объект ответа", en: "Response object", zh: "响应对象" },
|
|
704
705
|
"widget.stack.request": { ru: "Аргумент запроса", en: "Request argument", zh: "请求参数" },
|
|
705
|
-
"widget.fs.title": { ru: "Файловая система", en: "File
|
|
706
|
+
"widget.fs.title": { ru: "Файловая система", en: "File System", zh: "文件系统" },
|
|
706
707
|
"widget.fs.path": { ru: "Путь", en: "Path", zh: "路径" },
|
|
707
708
|
"widget.fs.size": { ru: "Размер", en: "Size", zh: "大小" },
|
|
708
709
|
"widget.fs.name_too_long": { ru: "Имя файла длиннее {n} символов", en: "File name is longer than {n} characters", zh: "文件名超过 {n} 个字符" },
|
|
@@ -717,7 +718,7 @@ const translations = {
|
|
|
717
718
|
"widget.fs.max_name": { ru: "Максимальная длина имени", en: "Maximum name length", zh: "最大名称长度" },
|
|
718
719
|
"widget.fs.state_field": { ru: "Поле состояния ФС", en: "File system state field", zh: "文件系统状态字段" },
|
|
719
720
|
"widget.fs.command_arg": { ru: "Аргумент команд", en: "Command argument", zh: "命令参数" },
|
|
720
|
-
"widget.rgb.title": { ru: "
|
|
721
|
+
"widget.rgb.title": { ru: "RGB лента", en: "RGB Strip", zh: "RGB 灯带" },
|
|
721
722
|
"widget.rgb.effect.static": { ru: "Статичный", en: "Static", zh: "静态" },
|
|
722
723
|
"widget.rgb.effect.rainbow": { ru: "Радуга", en: "Rainbow", zh: "彩虹" },
|
|
723
724
|
"widget.rgb.effect.breath": { ru: "Дыхание", en: "Breathing", zh: "呼吸" },
|
|
@@ -771,7 +772,7 @@ const translations = {
|
|
|
771
772
|
en: "Select the bit range within the global variable for this component.",
|
|
772
773
|
zh: "为此组件选择全局变量中的位范围。",
|
|
773
774
|
},
|
|
774
|
-
"pfd.title": { ru: "Пилотажный дисплей", en: "Flight
|
|
775
|
+
"pfd.title": { ru: "Пилотажный дисплей", en: "Flight Display", zh: "飞行显示器" },
|
|
775
776
|
"pfd.fix.none": { ru: "нет", en: "none", zh: "无" },
|
|
776
777
|
"pfd.sev.0": { ru: "АВАРИЯ", en: "EMERGENCY", zh: "紧急" },
|
|
777
778
|
"pfd.sev.1": { ru: "ТРЕВОГА", en: "ALERT", zh: "警报" },
|