diff --git a/luci-theme-footstrap/Makefile b/luci-theme-footstrap/Makefile index 5bb21700..89ddd0fe 100644 --- a/luci-theme-footstrap/Makefile +++ b/luci-theme-footstrap/Makefile @@ -17,7 +17,7 @@ LUCI_NAME:=luci-theme-footstrap FOOTSTRAP_VERSION?= ifneq ($(FOOTSTRAP_VERSION),) PKG_VERSION:=$(FOOTSTRAP_VERSION) -PKG_RELEASE:=54 +PKG_RELEASE:=55 endif LUCI_TITLE:=Footstrap Theme diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-appearance.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-appearance.js index 5546e841..97a92892 100644 --- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-appearance.js +++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-appearance.js @@ -221,7 +221,7 @@ function colorControl(current, onPick, label, opts) { /* Build the whole form. Returns a promise for one element wire() appends to the stock page. * * Everything applies immediately and there is nothing to save: every axis is this browser's, in - * localStorage, and the page repaints under the control as it moves. Only "Save as default" writes + * localStorage, and the page repaints under the control as it moves. Only "Save to router" writes * anything, pushing the current look to the ROUTER for other browsers. That distinction is the * model (docs/design-system.md), and why this page has no Save/Reset footer of LuCI's own. */ function render() { @@ -575,17 +575,21 @@ function build() { * the scoped uci ACL). It does not change this browser — localStorage keeps overriding — so the * saved default only shows on a fresh browser. The two Reset buttons below are the escape * hatches, and they do not land in the same place. */ - const saveBtn = E('button', { 'class': 'btn cbi-button-action', 'type': 'button' }, [ _('Save as default', 'footstrap') ]); + const saveBtn = E('button', { 'class': 'btn cbi-button-action', 'type': 'button' }, [ _('Save to router', 'footstrap') ]); /* Two resets, because two things sit underneath a browser's tweaks (fs-prefs.js): "Reset to - * saved" clears them and lets every axis fall back to whatever the router holds, while "Reset - * to default" writes the theme's built-ins explicitly — the only way to say "as the theme - * ships" on a router with a saved default of its own. Neither touches - * /etc/config/footstrap. */ - const resetSavedBtn = E('button', { 'class': 'btn', 'type': 'button' }, [ _('Reset to saved', 'footstrap') ]); + * router" clears them and lets every axis fall back to whatever the router holds, while "Reset + * to built-in" writes the theme's built-ins explicitly — the only way to say "as the theme + * ships" on a router that has a look of its own. Neither touches /etc/config/footstrap. + * + * ONE word per state, and "default" is not one of them: it used to name the router's look in + * "Save as default" and the theme's in "Reset to default", while the router's look also + * answered to "saved" — three names for two states, asked about on the forum (topic 251930, + * post 92). The row now reads as one save and two resets, over `router` and `built-in`. */ + const resetSavedBtn = E('button', { 'class': 'btn', 'type': 'button' }, [ _('Reset to router', 'footstrap') ]); /* the stock destructive class, so the button discarding every local tweak is the red one - * (theme/55-buttons.css). "Reset to saved" stays neutral: it steps back to the shared state + * (theme/55-buttons.css). "Reset to router" stays neutral: it steps back to the shared state * rather than discarding. */ - const resetBtn = E('button', { 'class': 'btn cbi-button-negative', 'type': 'button' }, [ _('Reset to default', 'footstrap') ]); + const resetBtn = E('button', { 'class': 'btn cbi-button-negative', 'type': 'button' }, [ _('Reset to built-in', 'footstrap') ]); /* Save's only visible failure surface. The realistic failure is the rpc rejecting — an expired * session (403), a missing ACL, ubus down. A DELETED config is not caught: rpcd stages the set * in the session and commit then no-ops without writing the file, returning success (measured @@ -603,14 +607,14 @@ function build() { function refreshSave() { if (prefs.storageBroken()) { saveBtn.disabled = false; - saveBtn.textContent = _('Save as default', 'footstrap'); + saveBtn.textContent = _('Save to router', 'footstrap'); saveErr.textContent = _('This browser is not storing preferences (site data is blocked), so a change here lasts until you reload. Saving as default still works and applies to every browser.', 'footstrap'); saveErr.hidden = false; return; } const saved = axes.matchesSavedDefault(); saveBtn.disabled = saved; - saveBtn.textContent = saved ? _('Saved as default', 'footstrap') : _('Save as default', 'footstrap'); + saveBtn.textContent = saved ? _('Saved to router', 'footstrap') : _('Save to router', 'footstrap'); } saveBtn.addEventListener('click', () => { saveBtn.disabled = true; @@ -651,8 +655,8 @@ function build() { location.reload(); }); } - twoClick(resetSavedBtn, _('Reset to saved', 'footstrap'), axes.resetToSaved); - twoClick(resetBtn, _('Reset to default', 'footstrap'), axes.resetToBuiltin); + twoClick(resetSavedBtn, _('Reset to router', 'footstrap'), axes.resetToSaved); + twoClick(resetBtn, _('Reset to built-in', 'footstrap'), axes.resetToBuiltin); refreshSave(); /* correct label and enabled state before the first paint */ const versionLink = E('a', { @@ -664,12 +668,31 @@ function build() { 'rel': 'noreferrer' }, [ ver.label() ]); + /* One clause per button, in LuCI's own help-sentence idiom and under the buttons themselves, + * because that is where the question is asked: with all three named "save"/"reset" and two of + * them resets, the row does not say which state each lands in (forum topic 251930, post 90 — + * "what is the difference on 'reset to saved' and 'reset to default'?"). Three lines rather + * than a paragraph: three parts want a list, and each is read on its own. + * + * Text nodes separated by
, NOT a child per line: `.cbi-value-field *` in + * theme/60-inputs.css hands mono to every descendant and excludes `.cbi-value-description` + * itself, so a wrapped line becomes a descendant that the exclusion does not reach — measured, + * all three lines came out monospace. Text nodes inherit the sans face from the container, and + * one container also means one `?` glyph with every line aligned under it. */ + const buttonHelp = E('div', { 'class': 'cbi-value-description' }, [ + _('Save to router — store this look on the router. Browsers with a look of their own keep it.', 'footstrap'), + E('br'), + _('Reset to router — drop this browser\'s changes and follow the router.', 'footstrap'), + E('br'), + _('Reset to built-in — go back to the look the theme ships with.', 'footstrap') + ]); + const defaults = [ /* the one row whose control is a pair of buttons, each named by its own text, so `make` * ignores the caption rather than re-using it as an aria-label */ - group(_('Router default', 'footstrap'), - () => E('div', { 'class': 'fs-ap-actrow' }, [ saveBtn, resetSavedBtn, resetBtn ]), - { extra: saveErr }) + group(_('Saved look', 'footstrap'), + () => E('div', { 'class': 'fs-ap-actrow' }, [ saveBtn, E('span', { 'class': 'fs-ap-actgap', 'aria-hidden': 'true' }), resetSavedBtn, resetBtn ]), + { extra: [ buttonHelp, saveErr ] }) ]; @@ -768,8 +791,8 @@ function build() { * the misreading happens before anyone scrolls to Defaults. A bare `.alert-message`: * theme/35-alerts.css keeps the tinted variants for a STATUS and a flat panel for a note. */ const note = E('div', { 'class': 'alert-message fs-ap-note' }, [ - E('p', {}, [ _('Changes apply at once and live in this browser.', 'footstrap') ]), - E('p', {}, [ _('To keep them on the router, use Save as default under Defaults — not Save & Apply at the foot of the page.', 'footstrap') ]) + E('p', {}, [ _('Footstrap theme settings apply at once and are stored permanently in this browser.', 'footstrap') ]), + E('p', {}, [ _('Save & Apply at the foot of the page belongs to the System form and does not store them.', 'footstrap') ]) ]); /* Colours and Surfaces are one fold: the same job, split into two headings only because a @@ -781,7 +804,7 @@ function build() { colours.concat([ E('div', { 'class': 'fs-ap-head fs-ap-sub' }, [ E('h4', {}, [ _('Surfaces', 'footstrap') ]) ]) ], surfaces), 'fs-ui-colours'), foldable(_('Background', 'footstrap'), wallpaper, 'fs-ui-background'), - section(_('Defaults', 'footstrap'), defaults) + section(_('Saving', 'footstrap'), defaults) ]); /* The first fill, deferred one microtask so the tree above is finished. It does not wait for diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-axes.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-axes.js index 2ce4c64c..78b0cbff 100644 --- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-axes.js +++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-axes.js @@ -378,7 +378,7 @@ function resetToBuiltin() { * 0, which is "the palette's own". * * Stated as calls rather than carried in AXES: a fourth column of thunks measured 297 B against - * this list, and a wrong value here is what the Save button's "Reset to default" shows on the + * this list, and a wrong value here is what the Save button's "Reset to built-in" shows on the * first click — the one state no static gate can see and the live check does. */ prefs.applyLayout('top'); prefs.applyMode('auto'); diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-prefs.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-prefs.js index c6c65694..264e910a 100644 --- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-prefs.js +++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-prefs.js @@ -12,7 +12,7 @@ * * ---- three layers, and the browser always wins ---- * Every axis resolves as localStorage ?? router-default ?? built-in. The router default is - * Appearance -> Save as default (written to /etc/config/footstrap, read back into window.__fsSD); + * Appearance -> Save to router (written to /etc/config/footstrap, read back into window.__fsSD); * the built-in is a bare :root. A new browser inherits the router default; this browser's own * choice overrides it in either direction. * @@ -24,7 +24,7 @@ /* A browser can refuse storage outright (blocked cookies, dom.storage.enabled=false, a partitioned * WebView) and then every access throws. The helpers below swallow it, because an axis that cannot * be remembered must still APPLY, but they record it: otherwise current*() reads null, falls back - * to the router default, and the Save button sits disabled reading "Saved as default" over a page + * to the router's look, and the Save button sits disabled reading "Saved to router" over a page * painted in axes the router default does not carry. */ let _lsBroken = false; function storageBroken() { return _lsBroken; } @@ -331,7 +331,7 @@ function currentRail() { return document.documentElement.getAttribute('data-rail') === 'true'; } -/* ---- Save as default: write the current effective axes to /etc/config/footstrap ---- +/* ---- Save to router: write the current effective axes to /etc/config/footstrap ---- * The scoped rpcd ACL (config 'footstrap' only) lets the admin's session set and commit those * options; rpcd validates the config/section/option names, so no value reaches a shell. The server * reads them back on the next load and head.ut's sanitiser clamps each before it becomes diff --git a/luci-theme-footstrap/po/es/footstrap.po b/luci-theme-footstrap/po/es/footstrap.po index 29d6a50f..494ddff2 100644 --- a/luci-theme-footstrap/po/es/footstrap.po +++ b/luci-theme-footstrap/po/es/footstrap.po @@ -35,7 +35,7 @@ msgctxt "footstrap" msgid "Auto-collapse" msgstr "Colapso automático" -#: htdocs/luci-static/resources/fs-appearance.js:783 +#: htdocs/luci-static/resources/fs-appearance.js:806 msgctxt "footstrap" msgid "Background" msgstr "Fondo" @@ -55,11 +55,6 @@ msgctxt "footstrap" msgid "Cards" msgstr "Tarjetas" -#: htdocs/luci-static/resources/fs-appearance.js:771 -msgctxt "footstrap" -msgid "Changes apply at once and live in this browser." -msgstr "Los cambios se aplican al instante y viven en este navegador." - #: htdocs/luci-static/resources/fs-appearance.js:454 msgctxt "footstrap" msgid "Choose SVG" @@ -81,7 +76,7 @@ msgid "Collapse menu" msgstr "Contraer menú" #: htdocs/luci-static/resources/fs-appearance.js:465 -#: htdocs/luci-static/resources/fs-appearance.js:780 +#: htdocs/luci-static/resources/fs-appearance.js:803 msgctxt "footstrap" msgid "Colours" msgstr "Colores" @@ -91,7 +86,7 @@ msgctxt "footstrap" msgid "Compact" msgstr "Compacto" -#: htdocs/luci-static/resources/fs-appearance.js:644 +#: htdocs/luci-static/resources/fs-appearance.js:648 msgctxt "footstrap" msgid "Confirm reset" msgstr "Confirmar restablecimiento" @@ -111,7 +106,7 @@ msgctxt "footstrap" msgid "Could not process the image." msgstr "No se pudo procesar la imagen." -#: htdocs/luci-static/resources/fs-appearance.js:624 +#: htdocs/luci-static/resources/fs-appearance.js:628 msgctxt "footstrap" msgid "Could not save the default. Reload the page and try again." msgstr "" @@ -128,11 +123,6 @@ msgctxt "footstrap" msgid "Dark" msgstr "Oscuro" -#: htdocs/luci-static/resources/fs-appearance.js:784 -msgctxt "footstrap" -msgid "Defaults" -msgstr "Predeterminados" - #: htdocs/luci-static/resources/fs-appearance.js:349 msgctxt "footstrap" msgid "Density" @@ -160,11 +150,20 @@ msgstr "Archivo" #: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3 msgid "" -"Footstrap Appearance router-wide defaults (Save as default) and the login " +"Footstrap Appearance router-wide look (Save to router) and the login " "background and pattern uploads" msgstr "" -"Valores predeterminados de Apariencia de Footstrap para el router (Guardar " -"como predeterminado) y subida del fondo de inicio de sesión y del patrón" +"Aspecto de Footstrap para todo el router («Guardar en el router») y subida de " +"la imagen de fondo y del patrón" + +#: htdocs/luci-static/resources/fs-appearance.js:794 +msgctxt "footstrap" +msgid "" +"Footstrap theme settings apply at once and are stored permanently in this " +"browser." +msgstr "" +"Los ajustes del tema Footstrap se aplican al instante y se guardan de forma " +"permanente en este navegador." #: ucode/template/themes/footstrap/partials/notices.ut:24 msgid "Go to firmware upgrade..." @@ -184,7 +183,7 @@ msgctxt "footstrap" msgid "Hard to read %s — large text only" msgstr "Se lee mal %s: solo texto grande" -#: htdocs/luci-static/resources/fs-appearance.js:779 +#: htdocs/luci-static/resources/fs-appearance.js:802 msgctxt "footstrap" msgid "Interface" msgstr "Interfaz" @@ -208,7 +207,7 @@ msgid "Large" msgstr "Grande" #: htdocs/luci-static/resources/fs-appearance.js:328 -#: htdocs/luci-static/resources/fs-appearance.js:700 +#: htdocs/luci-static/resources/fs-appearance.js:723 msgctxt "footstrap" msgid "Layout" msgstr "Diseño" @@ -314,39 +313,76 @@ msgctxt "footstrap" msgid "Remove" msgstr "Eliminar" -#: htdocs/luci-static/resources/fs-appearance.js:588 -#: htdocs/luci-static/resources/fs-appearance.js:655 +#: htdocs/luci-static/resources/fs-appearance.js:592 +#: htdocs/luci-static/resources/fs-appearance.js:659 msgctxt "footstrap" -msgid "Reset to default" -msgstr "Restablecer a valores predeterminados" +msgid "Reset to built-in" +msgstr "Restablecer al integrado" -#: htdocs/luci-static/resources/fs-appearance.js:584 -#: htdocs/luci-static/resources/fs-appearance.js:654 +#: htdocs/luci-static/resources/fs-appearance.js:687 msgctxt "footstrap" -msgid "Reset to saved" -msgstr "Restablecer a lo guardado" +msgid "Reset to built-in — go back to the look the theme ships with." +msgstr "" +"«Restablecer al integrado»: vuelve al aspecto con el que se distribuye el " +"tema." + +#: htdocs/luci-static/resources/fs-appearance.js:588 +#: htdocs/luci-static/resources/fs-appearance.js:658 +msgctxt "footstrap" +msgid "Reset to router" +msgstr "Restablecer al del router" + +#: htdocs/luci-static/resources/fs-appearance.js:685 +msgctxt "footstrap" +msgid "Reset to router — drop this browser's changes and follow the router." +msgstr "" +"«Restablecer al del router»: descarta los cambios de este navegador y sigue " +"al router." #: htdocs/luci-static/resources/fs-appearance.js:355 msgctxt "footstrap" msgid "Rounding" msgstr "Redondeo" -#: htdocs/luci-static/resources/fs-appearance.js:670 +#: htdocs/luci-static/resources/fs-appearance.js:795 msgctxt "footstrap" -msgid "Router default" -msgstr "Configuración predeterminada del enrutador" +msgid "" +"Save & Apply at the foot of the page belongs to the System form and does not " +"store them." +msgstr "" +"El botón «Guardar y aplicar» al pie de la página pertenece al formulario del " +"Sistema y no los guarda." #: htdocs/luci-static/resources/fs-appearance.js:578 -#: htdocs/luci-static/resources/fs-appearance.js:606 -#: htdocs/luci-static/resources/fs-appearance.js:613 +#: htdocs/luci-static/resources/fs-appearance.js:610 +#: htdocs/luci-static/resources/fs-appearance.js:617 msgctxt "footstrap" -msgid "Save as default" -msgstr "Guardar como predeterminado" +msgid "Save to router" +msgstr "Guardar en el router" -#: htdocs/luci-static/resources/fs-appearance.js:613 +#: htdocs/luci-static/resources/fs-appearance.js:683 msgctxt "footstrap" -msgid "Saved as default" -msgstr "Guardado como predeterminado" +msgid "" +"Save to router — store this look on the router. Browsers with a look of " +"their own keep it." +msgstr "" +"«Guardar en el router»: guarda este aspecto en el router. Los navegadores con " +"un aspecto propio lo conservan." + +#: htdocs/luci-static/resources/fs-appearance.js:693 +msgctxt "footstrap" +msgid "Saved look" +msgstr "Aspecto guardado" + +#: htdocs/luci-static/resources/fs-appearance.js:617 +msgctxt "footstrap" +msgid "Saved to router" +msgstr "Guardado en el router" + +#: htdocs/luci-static/resources/fs-appearance.js:807 +msgctxt "footstrap" +msgid "Saving" +msgstr "Guardado" #: htdocs/luci-static/resources/fs-appearance.js:463 msgctxt "footstrap" @@ -402,7 +438,7 @@ msgctxt "footstrap" msgid "Submenus" msgstr "Submenús" -#: htdocs/luci-static/resources/fs-appearance.js:781 +#: htdocs/luci-static/resources/fs-appearance.js:804 msgctxt "footstrap" msgid "Surfaces" msgstr "Superficies" @@ -471,7 +507,7 @@ msgstr "" "Este enrutador no tiene contraseña. Configure una contraseña de " "administrador para proteger la interfaz web." -#: htdocs/luci-static/resources/fs-appearance.js:607 +#: htdocs/luci-static/resources/fs-appearance.js:611 msgctxt "footstrap" msgid "" "This browser is not storing preferences (site data is blocked), so a change " @@ -482,7 +518,7 @@ msgstr "" "bloqueados), así que un cambio aquí dura hasta que recargues. Guardar como " "predeterminado sigue funcionando y se aplica a todos los navegadores." -#: htdocs/luci-static/resources/fs-appearance.js:702 +#: htdocs/luci-static/resources/fs-appearance.js:725 msgctxt "footstrap" msgid "This theme is not translated on this router yet." msgstr "Este tema aún no está traducido en este router." @@ -497,15 +533,6 @@ msgctxt "footstrap" msgid "Tint strength" msgstr "Intensidad del tinte" -#: htdocs/luci-static/resources/fs-appearance.js:772 -msgctxt "footstrap" -msgid "" -"To keep them on the router, use Save as default under Defaults — not Save & " -"Apply at the foot of the page." -msgstr "" -"Para guardarlos en el router, usa «Guardar como predeterminado» en " -"Predeterminados, no «Guardar y aplicar» al pie de la página." - #: htdocs/luci-static/resources/fs-appearance.js:190 msgctxt "footstrap" msgid "Too faint to read %s" @@ -572,15 +599,33 @@ msgid "" "the uploaded file could not be removed either; it is still on the router." msgstr "tampoco se pudo eliminar el archivo subido; sigue en el router." +#~ msgctxt "footstrap" +#~ msgid "Defaults" +#~ msgstr "Predeterminados" + +#~ msgctxt "footstrap" +#~ msgid "Reset to saved" +#~ msgstr "Restablecer a lo guardado" + +#~ msgctxt "footstrap" +#~ msgid "Router default" +#~ msgstr "Configuración predeterminada del enrutador" + +#~ msgctxt "footstrap" +#~ msgid "Save as default" +#~ msgstr "Guardar como predeterminado" + +#~ msgctxt "footstrap" +#~ msgid "Saved as default" +#~ msgstr "Guardado como predeterminado" + #~ msgctxt "footstrap" #~ msgid "" -#~ "Everything here applies the moment you change it and is remembered in " -#~ "this browser only — the Save & Apply button at the foot of the page " -#~ "belongs to the System form and does not store it." +#~ "To keep them on the router, use Save as default under Defaults — not Save " +#~ "& Apply at the foot of the page." #~ msgstr "" -#~ "Todo lo de aquí se aplica en el momento en que lo cambias y se recuerda " -#~ "solo en este navegador: el botón «Guardar y aplicar» del pie de la página " -#~ "pertenece al formulario del Sistema y no lo guarda." +#~ "Para guardarlos en el router, usa «Guardar como predeterminado» en " +#~ "Predeterminados, no «Guardar y aplicar» al pie de la página." #~ msgctxt "footstrap" #~ msgid "" diff --git a/luci-theme-footstrap/po/ru/footstrap.po b/luci-theme-footstrap/po/ru/footstrap.po index 7f983a71..911a89c8 100644 --- a/luci-theme-footstrap/po/ru/footstrap.po +++ b/luci-theme-footstrap/po/ru/footstrap.po @@ -31,7 +31,7 @@ msgctxt "footstrap" msgid "Auto-collapse" msgstr "Сворачивать" -#: htdocs/luci-static/resources/fs-appearance.js:783 +#: htdocs/luci-static/resources/fs-appearance.js:806 msgctxt "footstrap" msgid "Background" msgstr "Фон" @@ -51,11 +51,6 @@ msgctxt "footstrap" msgid "Cards" msgstr "Карточки" -#: htdocs/luci-static/resources/fs-appearance.js:771 -msgctxt "footstrap" -msgid "Changes apply at once and live in this browser." -msgstr "Изменения применяются сразу и живут в этом браузере." - #: htdocs/luci-static/resources/fs-appearance.js:454 msgctxt "footstrap" msgid "Choose SVG" @@ -77,7 +72,7 @@ msgid "Collapse menu" msgstr "Свернуть меню" #: htdocs/luci-static/resources/fs-appearance.js:465 -#: htdocs/luci-static/resources/fs-appearance.js:780 +#: htdocs/luci-static/resources/fs-appearance.js:803 msgctxt "footstrap" msgid "Colours" msgstr "Цвета" @@ -87,7 +82,7 @@ msgctxt "footstrap" msgid "Compact" msgstr "Компактно" -#: htdocs/luci-static/resources/fs-appearance.js:644 +#: htdocs/luci-static/resources/fs-appearance.js:648 msgctxt "footstrap" msgid "Confirm reset" msgstr "Подтвердить сброс" @@ -107,7 +102,7 @@ msgctxt "footstrap" msgid "Could not process the image." msgstr "Не удалось обработать изображение." -#: htdocs/luci-static/resources/fs-appearance.js:624 +#: htdocs/luci-static/resources/fs-appearance.js:628 msgctxt "footstrap" msgid "Could not save the default. Reload the page and try again." msgstr "Не удалось сохранить умолчание. Обновите страницу и повторите." @@ -122,11 +117,6 @@ msgctxt "footstrap" msgid "Dark" msgstr "Тёмная" -#: htdocs/luci-static/resources/fs-appearance.js:784 -msgctxt "footstrap" -msgid "Defaults" -msgstr "Умолчания" - #: htdocs/luci-static/resources/fs-appearance.js:349 msgctxt "footstrap" msgid "Density" @@ -154,11 +144,20 @@ msgstr "Файл" #: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3 msgid "" -"Footstrap Appearance router-wide defaults (Save as default) and the login " +"Footstrap Appearance router-wide look (Save to router) and the login " "background and pattern uploads" msgstr "" -"Общие настройки внешнего вида Footstrap для роутера (Сохранить как " -"умолчание), загрузка фонового изображения и узора" +"Общий для роутера вид Footstrap («Сохранить на роутер»), а также загрузка " +"фонового изображения и узора" + +#: htdocs/luci-static/resources/fs-appearance.js:794 +msgctxt "footstrap" +msgid "" +"Footstrap theme settings apply at once and are stored permanently in this " +"browser." +msgstr "" +"Настройки темы Footstrap применяются сразу и сохраняются в этом браузере " +"навсегда." #: ucode/template/themes/footstrap/partials/notices.ut:24 msgid "Go to firmware upgrade..." @@ -178,7 +177,7 @@ msgctxt "footstrap" msgid "Hard to read %s — large text only" msgstr "Плохо читается %s — только крупный текст" -#: htdocs/luci-static/resources/fs-appearance.js:779 +#: htdocs/luci-static/resources/fs-appearance.js:802 msgctxt "footstrap" msgid "Interface" msgstr "Интерфейс" @@ -202,7 +201,7 @@ msgid "Large" msgstr "Крупно" #: htdocs/luci-static/resources/fs-appearance.js:328 -#: htdocs/luci-static/resources/fs-appearance.js:700 +#: htdocs/luci-static/resources/fs-appearance.js:723 msgctxt "footstrap" msgid "Layout" msgstr "Раскладка" @@ -307,39 +306,75 @@ msgctxt "footstrap" msgid "Remove" msgstr "Убрать" -#: htdocs/luci-static/resources/fs-appearance.js:588 -#: htdocs/luci-static/resources/fs-appearance.js:655 +#: htdocs/luci-static/resources/fs-appearance.js:592 +#: htdocs/luci-static/resources/fs-appearance.js:659 msgctxt "footstrap" -msgid "Reset to default" -msgstr "Сбросить к умолчанию" +msgid "Reset to built-in" +msgstr "Сбросить к встроенному" -#: htdocs/luci-static/resources/fs-appearance.js:584 -#: htdocs/luci-static/resources/fs-appearance.js:654 +#: htdocs/luci-static/resources/fs-appearance.js:687 msgctxt "footstrap" -msgid "Reset to saved" -msgstr "Сбросить к сохранённым" +msgid "Reset to built-in — go back to the look the theme ships with." +msgstr "" +"«Сбросить к встроенному» — вернуть вид, с которым поставляется тема." + +#: htdocs/luci-static/resources/fs-appearance.js:588 +#: htdocs/luci-static/resources/fs-appearance.js:658 +msgctxt "footstrap" +msgid "Reset to router" +msgstr "Сбросить к виду роутера" + +#: htdocs/luci-static/resources/fs-appearance.js:685 +msgctxt "footstrap" +msgid "Reset to router — drop this browser's changes and follow the router." +msgstr "" +"«Сбросить к виду роутера» — отменить правки этого браузера и следовать " +"роутеру." #: htdocs/luci-static/resources/fs-appearance.js:355 msgctxt "footstrap" msgid "Rounding" msgstr "Скругление" -#: htdocs/luci-static/resources/fs-appearance.js:670 +#: htdocs/luci-static/resources/fs-appearance.js:795 msgctxt "footstrap" -msgid "Router default" -msgstr "По умолчанию для роутера" +msgid "" +"Save & Apply at the foot of the page belongs to the System form and does not " +"store them." +msgstr "" +"Кнопка «Сохранить и применить» внизу страницы принадлежит форме «Система» и " +"их не сохраняет." #: htdocs/luci-static/resources/fs-appearance.js:578 -#: htdocs/luci-static/resources/fs-appearance.js:606 -#: htdocs/luci-static/resources/fs-appearance.js:613 +#: htdocs/luci-static/resources/fs-appearance.js:610 +#: htdocs/luci-static/resources/fs-appearance.js:617 msgctxt "footstrap" -msgid "Save as default" -msgstr "Сохранить по умолчанию" +msgid "Save to router" +msgstr "Сохранить на роутер" -#: htdocs/luci-static/resources/fs-appearance.js:613 +#: htdocs/luci-static/resources/fs-appearance.js:683 msgctxt "footstrap" -msgid "Saved as default" -msgstr "Сохранено по умолчанию" +msgid "" +"Save to router — store this look on the router. Browsers with a look of " +"their own keep it." +msgstr "" +"«Сохранить на роутер» — записать этот вид на роутер. Браузеры со своим видом " +"его сохранят." + +#: htdocs/luci-static/resources/fs-appearance.js:693 +msgctxt "footstrap" +msgid "Saved look" +msgstr "Сохранённый вид" + +#: htdocs/luci-static/resources/fs-appearance.js:617 +msgctxt "footstrap" +msgid "Saved to router" +msgstr "Сохранено на роутере" + +#: htdocs/luci-static/resources/fs-appearance.js:807 +msgctxt "footstrap" +msgid "Saving" +msgstr "Сохранение" #: htdocs/luci-static/resources/fs-appearance.js:463 msgctxt "footstrap" @@ -395,7 +430,7 @@ msgctxt "footstrap" msgid "Submenus" msgstr "Подменю" -#: htdocs/luci-static/resources/fs-appearance.js:781 +#: htdocs/luci-static/resources/fs-appearance.js:804 msgctxt "footstrap" msgid "Surfaces" msgstr "Поверхности" @@ -464,7 +499,7 @@ msgstr "" "На этом роутере не задан пароль. Установите пароль root, чтобы защитить веб-" "интерфейс." -#: htdocs/luci-static/resources/fs-appearance.js:607 +#: htdocs/luci-static/resources/fs-appearance.js:611 msgctxt "footstrap" msgid "" "This browser is not storing preferences (site data is blocked), so a change " @@ -475,7 +510,7 @@ msgstr "" "изменение здесь действует до перезагрузки страницы. «Сохранить как " "умолчание» по-прежнему работает и применяется ко всем браузерам." -#: htdocs/luci-static/resources/fs-appearance.js:702 +#: htdocs/luci-static/resources/fs-appearance.js:725 msgctxt "footstrap" msgid "This theme is not translated on this router yet." msgstr "Тема ещё не переведена на этом роутере." @@ -490,15 +525,6 @@ msgctxt "footstrap" msgid "Tint strength" msgstr "Насыщенность оттенка" -#: htdocs/luci-static/resources/fs-appearance.js:772 -msgctxt "footstrap" -msgid "" -"To keep them on the router, use Save as default under Defaults — not Save & " -"Apply at the foot of the page." -msgstr "" -"Чтобы сохранить их на роутере, нажмите «Сохранить по умолчанию» в разделе «По " -"умолчанию», а не «Сохранить и применить» внизу страницы." - #: htdocs/luci-static/resources/fs-appearance.js:190 msgctxt "footstrap" msgid "Too faint to read %s" @@ -565,15 +591,33 @@ msgid "" "the uploaded file could not be removed either; it is still on the router." msgstr "загруженный файл тоже не удалось удалить — он остался на роутере." +#~ msgctxt "footstrap" +#~ msgid "Defaults" +#~ msgstr "Умолчания" + +#~ msgctxt "footstrap" +#~ msgid "Reset to saved" +#~ msgstr "Сбросить к сохранённым" + +#~ msgctxt "footstrap" +#~ msgid "Router default" +#~ msgstr "По умолчанию для роутера" + +#~ msgctxt "footstrap" +#~ msgid "Save as default" +#~ msgstr "Сохранить по умолчанию" + +#~ msgctxt "footstrap" +#~ msgid "Saved as default" +#~ msgstr "Сохранено по умолчанию" + #~ msgctxt "footstrap" #~ msgid "" -#~ "Everything here applies the moment you change it and is remembered in " -#~ "this browser only — the Save & Apply button at the foot of the page " -#~ "belongs to the System form and does not store it." +#~ "To keep them on the router, use Save as default under Defaults — not Save " +#~ "& Apply at the foot of the page." #~ msgstr "" -#~ "Всё на этой странице применяется в момент изменения и запоминается только " -#~ "в этом браузере — кнопка «Сохранить и применить» внизу страницы " -#~ "принадлежит форме «Система» и настройки внешнего вида не сохраняет." +#~ "Чтобы сохранить их на роутере, нажмите «Сохранить по умолчанию» в разделе " +#~ "«По умолчанию», а не «Сохранить и применить» внизу страницы." #~ msgctxt "footstrap" #~ msgid "" diff --git a/luci-theme-footstrap/po/templates/footstrap.pot b/luci-theme-footstrap/po/templates/footstrap.pot index faa73eae..f4e82f57 100644 --- a/luci-theme-footstrap/po/templates/footstrap.pot +++ b/luci-theme-footstrap/po/templates/footstrap.pot @@ -25,7 +25,7 @@ msgctxt "footstrap" msgid "Auto-collapse" msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:783 +#: htdocs/luci-static/resources/fs-appearance.js:806 msgctxt "footstrap" msgid "Background" msgstr "" @@ -45,11 +45,6 @@ msgctxt "footstrap" msgid "Cards" msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:771 -msgctxt "footstrap" -msgid "Changes apply at once and live in this browser." -msgstr "" - #: htdocs/luci-static/resources/fs-appearance.js:454 msgctxt "footstrap" msgid "Choose SVG" @@ -71,7 +66,7 @@ msgid "Collapse menu" msgstr "" #: htdocs/luci-static/resources/fs-appearance.js:465 -#: htdocs/luci-static/resources/fs-appearance.js:780 +#: htdocs/luci-static/resources/fs-appearance.js:803 msgctxt "footstrap" msgid "Colours" msgstr "" @@ -81,7 +76,7 @@ msgctxt "footstrap" msgid "Compact" msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:644 +#: htdocs/luci-static/resources/fs-appearance.js:648 msgctxt "footstrap" msgid "Confirm reset" msgstr "" @@ -101,7 +96,7 @@ msgctxt "footstrap" msgid "Could not process the image." msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:624 +#: htdocs/luci-static/resources/fs-appearance.js:628 msgctxt "footstrap" msgid "Could not save the default. Reload the page and try again." msgstr "" @@ -116,11 +111,6 @@ msgctxt "footstrap" msgid "Dark" msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:784 -msgctxt "footstrap" -msgid "Defaults" -msgstr "" - #: htdocs/luci-static/resources/fs-appearance.js:349 msgctxt "footstrap" msgid "Density" @@ -148,10 +138,17 @@ msgstr "" #: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3 msgid "" -"Footstrap Appearance router-wide defaults (Save as default) and the login " +"Footstrap Appearance router-wide look (Save to router) and the login " "background and pattern uploads" msgstr "" +#: htdocs/luci-static/resources/fs-appearance.js:794 +msgctxt "footstrap" +msgid "" +"Footstrap theme settings apply at once and are stored permanently in this " +"browser." +msgstr "" + #: ucode/template/themes/footstrap/partials/notices.ut:24 msgid "Go to firmware upgrade..." msgstr "" @@ -170,7 +167,7 @@ msgctxt "footstrap" msgid "Hard to read %s — large text only" msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:779 +#: htdocs/luci-static/resources/fs-appearance.js:802 msgctxt "footstrap" msgid "Interface" msgstr "" @@ -194,7 +191,7 @@ msgid "Large" msgstr "" #: htdocs/luci-static/resources/fs-appearance.js:328 -#: htdocs/luci-static/resources/fs-appearance.js:700 +#: htdocs/luci-static/resources/fs-appearance.js:723 msgctxt "footstrap" msgid "Layout" msgstr "" @@ -297,16 +294,26 @@ msgctxt "footstrap" msgid "Remove" msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:588 -#: htdocs/luci-static/resources/fs-appearance.js:655 +#: htdocs/luci-static/resources/fs-appearance.js:592 +#: htdocs/luci-static/resources/fs-appearance.js:659 msgctxt "footstrap" -msgid "Reset to default" +msgid "Reset to built-in" msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:584 -#: htdocs/luci-static/resources/fs-appearance.js:654 +#: htdocs/luci-static/resources/fs-appearance.js:687 msgctxt "footstrap" -msgid "Reset to saved" +msgid "Reset to built-in — go back to the look the theme ships with." +msgstr "" + +#: htdocs/luci-static/resources/fs-appearance.js:588 +#: htdocs/luci-static/resources/fs-appearance.js:658 +msgctxt "footstrap" +msgid "Reset to router" +msgstr "" + +#: htdocs/luci-static/resources/fs-appearance.js:685 +msgctxt "footstrap" +msgid "Reset to router — drop this browser's changes and follow the router." msgstr "" #: htdocs/luci-static/resources/fs-appearance.js:355 @@ -314,21 +321,40 @@ msgctxt "footstrap" msgid "Rounding" msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:670 +#: htdocs/luci-static/resources/fs-appearance.js:795 msgctxt "footstrap" -msgid "Router default" +msgid "" +"Save & Apply at the foot of the page belongs to the System form and does not " +"store them." msgstr "" #: htdocs/luci-static/resources/fs-appearance.js:578 -#: htdocs/luci-static/resources/fs-appearance.js:606 -#: htdocs/luci-static/resources/fs-appearance.js:613 +#: htdocs/luci-static/resources/fs-appearance.js:610 +#: htdocs/luci-static/resources/fs-appearance.js:617 msgctxt "footstrap" -msgid "Save as default" +msgid "Save to router" msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:613 +#: htdocs/luci-static/resources/fs-appearance.js:683 msgctxt "footstrap" -msgid "Saved as default" +msgid "" +"Save to router — store this look on the router. Browsers with a look of " +"their own keep it." +msgstr "" + +#: htdocs/luci-static/resources/fs-appearance.js:693 +msgctxt "footstrap" +msgid "Saved look" +msgstr "" + +#: htdocs/luci-static/resources/fs-appearance.js:617 +msgctxt "footstrap" +msgid "Saved to router" +msgstr "" + +#: htdocs/luci-static/resources/fs-appearance.js:807 +msgctxt "footstrap" +msgid "Saving" msgstr "" #: htdocs/luci-static/resources/fs-appearance.js:463 @@ -385,7 +411,7 @@ msgctxt "footstrap" msgid "Submenus" msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:781 +#: htdocs/luci-static/resources/fs-appearance.js:804 msgctxt "footstrap" msgid "Surfaces" msgstr "" @@ -451,7 +477,7 @@ msgid "" "protect the web interface." msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:607 +#: htdocs/luci-static/resources/fs-appearance.js:611 msgctxt "footstrap" msgid "" "This browser is not storing preferences (site data is blocked), so a change " @@ -459,7 +485,7 @@ msgid "" "every browser." msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:702 +#: htdocs/luci-static/resources/fs-appearance.js:725 msgctxt "footstrap" msgid "This theme is not translated on this router yet." msgstr "" @@ -474,13 +500,6 @@ msgctxt "footstrap" msgid "Tint strength" msgstr "" -#: htdocs/luci-static/resources/fs-appearance.js:772 -msgctxt "footstrap" -msgid "" -"To keep them on the router, use Save as default under Defaults — not Save & " -"Apply at the foot of the page." -msgstr "" - #: htdocs/luci-static/resources/fs-appearance.js:190 msgctxt "footstrap" msgid "Too faint to read %s" diff --git a/luci-theme-footstrap/root/usr/share/rpcd/acl.d/luci-theme-footstrap.json b/luci-theme-footstrap/root/usr/share/rpcd/acl.d/luci-theme-footstrap.json index ca6fc85e..cb4dfa96 100644 --- a/luci-theme-footstrap/root/usr/share/rpcd/acl.d/luci-theme-footstrap.json +++ b/luci-theme-footstrap/root/usr/share/rpcd/acl.d/luci-theme-footstrap.json @@ -1,6 +1,6 @@ { "luci-theme-footstrap": { - "description": "Footstrap Appearance router-wide defaults (Save as default) and the login background and pattern uploads", + "description": "Footstrap Appearance router-wide look (Save to router) and the login background and pattern uploads", "read": { "uci": [ "footstrap" diff --git a/luci-theme-footstrap/styles/pages/80-appearance.css b/luci-theme-footstrap/styles/pages/80-appearance.css index ed7db1c5..4753b96a 100644 --- a/luci-theme-footstrap/styles/pages/80-appearance.css +++ b/luci-theme-footstrap/styles/pages/80-appearance.css @@ -100,6 +100,10 @@ * an item that cannot fit moves to the next line instead of hanging past the edge, which on a * flex row is silent. */ .fs-ap-actrow { display: flex; flex-wrap: wrap; gap: var(--fs-space-2); } + /* Save and the two resets differ by one word and sit in one row, which is the shape a + * destructive click lands on by accident. The gap says they are two groups; both resets also + * ask for a second click. Zero-width, so it costs no height when the row wraps on a phone. */ + .fs-ap-actgap { flex: 0 0 var(--fs-space-4); } .fs-ap-actrow .btn { font-size: var(--fs-type); padding: var(--fs-space-2) var(--fs-space-2-5); cursor: pointer; } .fs-ap-actrow .btn:disabled { cursor: default; } /* the primed Reset (second click confirms) reads as the destructive action it is */ diff --git a/luci-theme-footstrap/ucode/template/themes/footstrap/header.ut b/luci-theme-footstrap/ucode/template/themes/footstrap/header.ut index 2ea4bac2..461553f4 100644 --- a/luci-theme-footstrap/ucode/template/themes/footstrap/header.ut +++ b/luci-theme-footstrap/ucode/template/themes/footstrap/header.ut @@ -33,8 +33,8 @@ already loaded. */ const fsd = uci.get_all('footstrap', 'settings') ?? {}; /* Every option saveAsDefault() writes, listed once and read back in a loop. A hand-written - * literal with one line per axis drops an axis silently: Save as default reports success, the - * file on disk is correct, and "Reset to saved" lands on the BUILT-IN default because the value + * literal with one line per axis drops an axis silently: Save to router reports success, the + * file on disk is correct, and "Reset to router" lands on the BUILT-IN look because the value * the server hands the client was never there. tools/axes.mjs checks this list against * snapshotAxes(). * diff --git a/wwand/Makefile b/wwand/Makefile index 86deed4a..07c3de3c 100644 --- a/wwand/Makefile +++ b/wwand/Makefile @@ -43,11 +43,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=wwand -PKG_RELEASE:=19 +PKG_RELEASE:=20 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/ddimension/wwand.git -PKG_SOURCE_VERSION:=fb4a8ff34967a5ae1d6e882dcd78b8339f5f99d1 +PKG_SOURCE_VERSION:=6ed882e3b53544c9e42f2cc681780d99205141eb PKG_SOURCE_DATE:=2026-09-02 PKG_MIRROR_HASH:=skip @@ -300,8 +300,18 @@ define Package/wwand-ncm TITLE:=NCM/ECM backend for wwand # +kmod-usb-net-rndis: the RNDIS datapath (rndis_host) used by e.g. the # Fibocom FM350-GL (MediaTek T700) — same AT-driven backend, RNDIS netdev. - DEPENDS:=+wwand +USB_SUPPORT:kmod-usb-net-cdc-ncm \ - +USB_SUPPORT:kmod-usb-net-cdc-ether +USB_SUPPORT:kmod-usb-net-rndis + # These three stay UNCONDITIONAL, unlike the USB kmods of wwand-qmi and + # wwand-mbim. Those two have a non-USB transport behind them — QMI keeps + # +kmod-rmnet unconditional and reaches a modem over MHI, MBIM gets + # kmod-mhi-wwan-mbim through wwand-mhi — so gating their USB kmod still + # leaves a package that works on a PCIe-only target. NCM has no such path: + # it drives a single cdc_ncm/cdc_ether netdev and the only variant it + # recognises is rndis_host, all USB. Gating these on USB_SUPPORT would leave + # the package selectable on a !USB_SUPPORT target while pulling no datapath + # driver at all — installable and inert. The hard dependency is what keeps it + # unselectable there. (Raised in review on openwrt/packages#30185.) + DEPENDS:=+wwand +kmod-usb-net-cdc-ncm +kmod-usb-net-cdc-ether \ + +kmod-usb-net-rndis # coexists with the stock OpenWrt NCM stack (netifd `ncm` proto, package # comgt-ncm): wwand drives an AT/NCM modem only once its interface has been # migrated to `proto wwand` (LuCI modem list / migrate CLI), so both stacks can @@ -446,6 +456,15 @@ define Package/wwand-datapath-rmnet_nss/description moment it creates each child, so a module loaded afterwards leaves them without an NSS context; that case is logged and shown on the status page. + That constraint belongs to the STOCK driver, not to NSS itself: the single + nss_create() attempt can be turned into a bounded delayed-work retry, and the + child then attaches whenever the NSS data plane comes up, in any order. If you + build the vendor driver yourself, kuncy7/aw1000-nss-builder carries such a + patch (package-patches/quectel-qmi-wwan/950-rmnet-nss-deferred-attach.patch). + It is a change to the quectel-qmi-wwan kernel module, not to wwand, so nothing + here can apply it for you — but it removes the ordering requirement at its + source rather than working around it. + Install it on a box with the vendor qmi_wwan_q driver; anywhere else it probes false and changes nothing. endef