🎉 Sync 2026-09-03 10:41:43

This commit is contained in:
github-actions[bot] committed 2026-09-03 10:41:43 +08:00
1 parent 4ee3788dd4
commit ea628602ac
11 files changed
+335 -181

No files matched your search

+1 -1
View File
@@ -17,7 +17,7 @@ LUCI_NAME:=luci-theme-footstrap
FOOTSTRAP_VERSION?= FOOTSTRAP_VERSION?=
ifneq ($(FOOTSTRAP_VERSION),) ifneq ($(FOOTSTRAP_VERSION),)
PKG_VERSION:=$(FOOTSTRAP_VERSION) PKG_VERSION:=$(FOOTSTRAP_VERSION)
PKG_RELEASE:=54 PKG_RELEASE:=55
endif endif
LUCI_TITLE:=Footstrap Theme LUCI_TITLE:=Footstrap Theme
@@ -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. /* 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 * 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 * 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. */ * model (docs/design-system.md), and why this page has no Save/Reset footer of LuCI's own. */
function render() { function render() {
@@ -575,17 +575,21 @@ function build() {
* the scoped uci ACL). It does not change this browser — localStorage keeps overriding — so the * 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 * 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. */ * 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 /* 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 * router" 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 * to built-in" 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 * ships" on a router that has a look of its own. Neither touches /etc/config/footstrap.
* /etc/config/footstrap. */ *
const resetSavedBtn = E('button', { 'class': 'btn', 'type': 'button' }, [ _('Reset to saved', '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 /* 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. */ * 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 /* 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 * 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 * in the session and commit then no-ops without writing the file, returning success (measured
@@ -603,14 +607,14 @@ function build() {
function refreshSave() { function refreshSave() {
if (prefs.storageBroken()) { if (prefs.storageBroken()) {
saveBtn.disabled = false; 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.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; saveErr.hidden = false;
return; return;
} }
const saved = axes.matchesSavedDefault(); const saved = axes.matchesSavedDefault();
saveBtn.disabled = saved; 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.addEventListener('click', () => {
saveBtn.disabled = true; saveBtn.disabled = true;
@@ -651,8 +655,8 @@ function build() {
location.reload(); location.reload();
}); });
} }
twoClick(resetSavedBtn, _('Reset to saved', 'footstrap'), axes.resetToSaved); twoClick(resetSavedBtn, _('Reset to router', 'footstrap'), axes.resetToSaved);
twoClick(resetBtn, _('Reset to default', 'footstrap'), axes.resetToBuiltin); twoClick(resetBtn, _('Reset to built-in', 'footstrap'), axes.resetToBuiltin);
refreshSave(); /* correct label and enabled state before the first paint */ refreshSave(); /* correct label and enabled state before the first paint */
const versionLink = E('a', { const versionLink = E('a', {
@@ -664,12 +668,31 @@ function build() {
'rel': 'noreferrer' 'rel': 'noreferrer'
}, [ ver.label() ]); }, [ 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 <br>, 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 = [ const defaults = [
/* the one row whose control is a pair of buttons, each named by its own text, so `make` /* 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 */ * ignores the caption rather than re-using it as an aria-label */
group(_('Router default', 'footstrap'), group(_('Saved look', 'footstrap'),
() => E('div', { 'class': 'fs-ap-actrow' }, [ saveBtn, resetSavedBtn, resetBtn ]), () => E('div', { 'class': 'fs-ap-actrow' }, [ saveBtn, E('span', { 'class': 'fs-ap-actgap', 'aria-hidden': 'true' }), resetSavedBtn, resetBtn ]),
{ extra: saveErr }) { extra: [ buttonHelp, saveErr ] })
]; ];
@@ -768,8 +791,8 @@ function build() {
* the misreading happens before anyone scrolls to Defaults. A bare `.alert-message`: * 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. */ * 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' }, [ const note = E('div', { 'class': 'alert-message fs-ap-note' }, [
E('p', {}, [ _('Changes apply at once and live in this browser.', 'footstrap') ]), E('p', {}, [ _('Footstrap theme settings apply at once and are stored permanently 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', {}, [ _('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 /* 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), colours.concat([ E('div', { 'class': 'fs-ap-head fs-ap-sub' }, [ E('h4', {}, [ _('Surfaces', 'footstrap') ]) ]) ], surfaces),
'fs-ui-colours'), 'fs-ui-colours'),
foldable(_('Background', 'footstrap'), wallpaper, 'fs-ui-background'), 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 /* The first fill, deferred one microtask so the tree above is finished. It does not wait for
@@ -378,7 +378,7 @@ function resetToBuiltin() {
* 0, which is "the palette's own". * 0, which is "the palette's own".
* *
* Stated as calls rather than carried in AXES: a fourth column of thunks measured 297 B against * 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. */ * first click — the one state no static gate can see and the live check does. */
prefs.applyLayout('top'); prefs.applyLayout('top');
prefs.applyMode('auto'); prefs.applyMode('auto');
@@ -12,7 +12,7 @@
* *
* ---- three layers, and the browser always wins ---- * ---- three layers, and the browser always wins ----
* Every axis resolves as localStorage ?? router-default ?? built-in. The router default is * 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 * the built-in is a bare :root. A new browser inherits the router default; this browser's own
* choice overrides it in either direction. * choice overrides it in either direction.
* *
@@ -24,7 +24,7 @@
/* A browser can refuse storage outright (blocked cookies, dom.storage.enabled=false, a partitioned /* 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 * 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 * 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. */ * painted in axes the router default does not carry. */
let _lsBroken = false; let _lsBroken = false;
function storageBroken() { return _lsBroken; } function storageBroken() { return _lsBroken; }
@@ -331,7 +331,7 @@ function currentRail() {
return document.documentElement.getAttribute('data-rail') === 'true'; 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 * 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 * 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 * reads them back on the next load and head.ut's sanitiser clamps each before it becomes
+100 -55
View File
@@ -35,7 +35,7 @@ msgctxt "footstrap"
msgid "Auto-collapse" msgid "Auto-collapse"
msgstr "Colapso automático" msgstr "Colapso automático"
#: htdocs/luci-static/resources/fs-appearance.js:783 #: htdocs/luci-static/resources/fs-appearance.js:806
msgctxt "footstrap" msgctxt "footstrap"
msgid "Background" msgid "Background"
msgstr "Fondo" msgstr "Fondo"
@@ -55,11 +55,6 @@ msgctxt "footstrap"
msgid "Cards" msgid "Cards"
msgstr "Tarjetas" 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 #: htdocs/luci-static/resources/fs-appearance.js:454
msgctxt "footstrap" msgctxt "footstrap"
msgid "Choose SVG" msgid "Choose SVG"
@@ -81,7 +76,7 @@ msgid "Collapse menu"
msgstr "Contraer menú" msgstr "Contraer menú"
#: htdocs/luci-static/resources/fs-appearance.js:465 #: 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" msgctxt "footstrap"
msgid "Colours" msgid "Colours"
msgstr "Colores" msgstr "Colores"
@@ -91,7 +86,7 @@ msgctxt "footstrap"
msgid "Compact" msgid "Compact"
msgstr "Compacto" msgstr "Compacto"
#: htdocs/luci-static/resources/fs-appearance.js:644 #: htdocs/luci-static/resources/fs-appearance.js:648
msgctxt "footstrap" msgctxt "footstrap"
msgid "Confirm reset" msgid "Confirm reset"
msgstr "Confirmar restablecimiento" msgstr "Confirmar restablecimiento"
@@ -111,7 +106,7 @@ msgctxt "footstrap"
msgid "Could not process the image." msgid "Could not process the image."
msgstr "No se pudo procesar la imagen." 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" msgctxt "footstrap"
msgid "Could not save the default. Reload the page and try again." msgid "Could not save the default. Reload the page and try again."
msgstr "" msgstr ""
@@ -128,11 +123,6 @@ msgctxt "footstrap"
msgid "Dark" msgid "Dark"
msgstr "Oscuro" msgstr "Oscuro"
#: htdocs/luci-static/resources/fs-appearance.js:784
msgctxt "footstrap"
msgid "Defaults"
msgstr "Predeterminados"
#: htdocs/luci-static/resources/fs-appearance.js:349 #: htdocs/luci-static/resources/fs-appearance.js:349
msgctxt "footstrap" msgctxt "footstrap"
msgid "Density" msgid "Density"
@@ -160,11 +150,20 @@ msgstr "Archivo"
#: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3 #: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3
msgid "" 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" "background and pattern uploads"
msgstr "" msgstr ""
"Valores predeterminados de Apariencia de Footstrap para el router (Guardar " "Aspecto de Footstrap para todo el router («Guardar en el router») y subida de "
"como predeterminado) y subida del fondo de inicio de sesión y del patrón" "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 #: ucode/template/themes/footstrap/partials/notices.ut:24
msgid "Go to firmware upgrade..." msgid "Go to firmware upgrade..."
@@ -184,7 +183,7 @@ msgctxt "footstrap"
msgid "Hard to read %s — large text only" msgid "Hard to read %s — large text only"
msgstr "Se lee mal %s: solo texto grande" 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" msgctxt "footstrap"
msgid "Interface" msgid "Interface"
msgstr "Interfaz" msgstr "Interfaz"
@@ -208,7 +207,7 @@ msgid "Large"
msgstr "Grande" msgstr "Grande"
#: htdocs/luci-static/resources/fs-appearance.js:328 #: 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" msgctxt "footstrap"
msgid "Layout" msgid "Layout"
msgstr "Diseño" msgstr "Diseño"
@@ -314,39 +313,76 @@ msgctxt "footstrap"
msgid "Remove" msgid "Remove"
msgstr "Eliminar" msgstr "Eliminar"
#: htdocs/luci-static/resources/fs-appearance.js:588 #: htdocs/luci-static/resources/fs-appearance.js:592
#: htdocs/luci-static/resources/fs-appearance.js:655 #: htdocs/luci-static/resources/fs-appearance.js:659
msgctxt "footstrap" msgctxt "footstrap"
msgid "Reset to default" msgid "Reset to built-in"
msgstr "Restablecer a valores predeterminados" msgstr "Restablecer al integrado"
#: htdocs/luci-static/resources/fs-appearance.js:584 #: htdocs/luci-static/resources/fs-appearance.js:687
#: htdocs/luci-static/resources/fs-appearance.js:654
msgctxt "footstrap" msgctxt "footstrap"
msgid "Reset to saved" msgid "Reset to built-in — go back to the look the theme ships with."
msgstr "Restablecer a lo guardado" 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 #: htdocs/luci-static/resources/fs-appearance.js:355
msgctxt "footstrap" msgctxt "footstrap"
msgid "Rounding" msgid "Rounding"
msgstr "Redondeo" msgstr "Redondeo"
#: htdocs/luci-static/resources/fs-appearance.js:670 #: htdocs/luci-static/resources/fs-appearance.js:795
msgctxt "footstrap" msgctxt "footstrap"
msgid "Router default" msgid ""
msgstr "Configuración predeterminada del enrutador" "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:578
#: htdocs/luci-static/resources/fs-appearance.js:606 #: htdocs/luci-static/resources/fs-appearance.js:610
#: htdocs/luci-static/resources/fs-appearance.js:613 #: htdocs/luci-static/resources/fs-appearance.js:617
msgctxt "footstrap" msgctxt "footstrap"
msgid "Save as default" msgid "Save to router"
msgstr "Guardar como predeterminado" msgstr "Guardar en el router"
#: htdocs/luci-static/resources/fs-appearance.js:613 #: htdocs/luci-static/resources/fs-appearance.js:683
msgctxt "footstrap" msgctxt "footstrap"
msgid "Saved as default" msgid ""
msgstr "Guardado como predeterminado" "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 #: htdocs/luci-static/resources/fs-appearance.js:463
msgctxt "footstrap" msgctxt "footstrap"
@@ -402,7 +438,7 @@ msgctxt "footstrap"
msgid "Submenus" msgid "Submenus"
msgstr "Submenús" msgstr "Submenús"
#: htdocs/luci-static/resources/fs-appearance.js:781 #: htdocs/luci-static/resources/fs-appearance.js:804
msgctxt "footstrap" msgctxt "footstrap"
msgid "Surfaces" msgid "Surfaces"
msgstr "Superficies" msgstr "Superficies"
@@ -471,7 +507,7 @@ msgstr ""
"Este enrutador no tiene contraseña. Configure una contraseña de " "Este enrutador no tiene contraseña. Configure una contraseña de "
"administrador para proteger la interfaz web." "administrador para proteger la interfaz web."
#: htdocs/luci-static/resources/fs-appearance.js:607 #: htdocs/luci-static/resources/fs-appearance.js:611
msgctxt "footstrap" msgctxt "footstrap"
msgid "" msgid ""
"This browser is not storing preferences (site data is blocked), so a change " "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 " "bloqueados), así que un cambio aquí dura hasta que recargues. Guardar como "
"predeterminado sigue funcionando y se aplica a todos los navegadores." "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" msgctxt "footstrap"
msgid "This theme is not translated on this router yet." msgid "This theme is not translated on this router yet."
msgstr "Este tema aún no está traducido en este router." msgstr "Este tema aún no está traducido en este router."
@@ -497,15 +533,6 @@ msgctxt "footstrap"
msgid "Tint strength" msgid "Tint strength"
msgstr "Intensidad del tinte" 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 #: htdocs/luci-static/resources/fs-appearance.js:190
msgctxt "footstrap" msgctxt "footstrap"
msgid "Too faint to read %s" 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." "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." 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" #~ msgctxt "footstrap"
#~ msgid "" #~ msgid ""
#~ "Everything here applies the moment you change it and is remembered in " #~ "To keep them on the router, use Save as default under Defaults — not Save "
#~ "this browser only — the Save & Apply button at the foot of the page " #~ "& Apply at the foot of the page."
#~ "belongs to the System form and does not store it."
#~ msgstr "" #~ msgstr ""
#~ "Todo lo de aquí se aplica en el momento en que lo cambias y se recuerda " #~ "Para guardarlos en el router, usa «Guardar como predeterminado» en "
#~ "solo en este navegador: el botón «Guardar y aplicar» del pie de la página " #~ "Predeterminados, no «Guardar y aplicar» al pie de la página."
#~ "pertenece al formulario del Sistema y no lo guarda."
#~ msgctxt "footstrap" #~ msgctxt "footstrap"
#~ msgid "" #~ msgid ""
+99 -55
View File
@@ -31,7 +31,7 @@ msgctxt "footstrap"
msgid "Auto-collapse" msgid "Auto-collapse"
msgstr "Сворачивать" msgstr "Сворачивать"
#: htdocs/luci-static/resources/fs-appearance.js:783 #: htdocs/luci-static/resources/fs-appearance.js:806
msgctxt "footstrap" msgctxt "footstrap"
msgid "Background" msgid "Background"
msgstr "Фон" msgstr "Фон"
@@ -51,11 +51,6 @@ msgctxt "footstrap"
msgid "Cards" msgid "Cards"
msgstr "Карточки" 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 #: htdocs/luci-static/resources/fs-appearance.js:454
msgctxt "footstrap" msgctxt "footstrap"
msgid "Choose SVG" msgid "Choose SVG"
@@ -77,7 +72,7 @@ msgid "Collapse menu"
msgstr "Свернуть меню" msgstr "Свернуть меню"
#: htdocs/luci-static/resources/fs-appearance.js:465 #: 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" msgctxt "footstrap"
msgid "Colours" msgid "Colours"
msgstr "Цвета" msgstr "Цвета"
@@ -87,7 +82,7 @@ msgctxt "footstrap"
msgid "Compact" msgid "Compact"
msgstr "Компактно" msgstr "Компактно"
#: htdocs/luci-static/resources/fs-appearance.js:644 #: htdocs/luci-static/resources/fs-appearance.js:648
msgctxt "footstrap" msgctxt "footstrap"
msgid "Confirm reset" msgid "Confirm reset"
msgstr "Подтвердить сброс" msgstr "Подтвердить сброс"
@@ -107,7 +102,7 @@ msgctxt "footstrap"
msgid "Could not process the image." msgid "Could not process the image."
msgstr "Не удалось обработать изображение." msgstr "Не удалось обработать изображение."
#: htdocs/luci-static/resources/fs-appearance.js:624 #: htdocs/luci-static/resources/fs-appearance.js:628
msgctxt "footstrap" msgctxt "footstrap"
msgid "Could not save the default. Reload the page and try again." msgid "Could not save the default. Reload the page and try again."
msgstr "Не удалось сохранить умолчание. Обновите страницу и повторите." msgstr "Не удалось сохранить умолчание. Обновите страницу и повторите."
@@ -122,11 +117,6 @@ msgctxt "footstrap"
msgid "Dark" msgid "Dark"
msgstr "Тёмная" msgstr "Тёмная"
#: htdocs/luci-static/resources/fs-appearance.js:784
msgctxt "footstrap"
msgid "Defaults"
msgstr "Умолчания"
#: htdocs/luci-static/resources/fs-appearance.js:349 #: htdocs/luci-static/resources/fs-appearance.js:349
msgctxt "footstrap" msgctxt "footstrap"
msgid "Density" msgid "Density"
@@ -154,11 +144,20 @@ msgstr "Файл"
#: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3 #: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3
msgid "" 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" "background and pattern uploads"
msgstr "" 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 #: ucode/template/themes/footstrap/partials/notices.ut:24
msgid "Go to firmware upgrade..." msgid "Go to firmware upgrade..."
@@ -178,7 +177,7 @@ msgctxt "footstrap"
msgid "Hard to read %s — large text only" msgid "Hard to read %s — large text only"
msgstr "Плохо читается %s — только крупный текст" msgstr "Плохо читается %s — только крупный текст"
#: htdocs/luci-static/resources/fs-appearance.js:779 #: htdocs/luci-static/resources/fs-appearance.js:802
msgctxt "footstrap" msgctxt "footstrap"
msgid "Interface" msgid "Interface"
msgstr "Интерфейс" msgstr "Интерфейс"
@@ -202,7 +201,7 @@ msgid "Large"
msgstr "Крупно" msgstr "Крупно"
#: htdocs/luci-static/resources/fs-appearance.js:328 #: 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" msgctxt "footstrap"
msgid "Layout" msgid "Layout"
msgstr "Раскладка" msgstr "Раскладка"
@@ -307,39 +306,75 @@ msgctxt "footstrap"
msgid "Remove" msgid "Remove"
msgstr "Убрать" msgstr "Убрать"
#: htdocs/luci-static/resources/fs-appearance.js:588 #: htdocs/luci-static/resources/fs-appearance.js:592
#: htdocs/luci-static/resources/fs-appearance.js:655 #: htdocs/luci-static/resources/fs-appearance.js:659
msgctxt "footstrap" msgctxt "footstrap"
msgid "Reset to default" msgid "Reset to built-in"
msgstr "Сбросить к умолчанию" msgstr "Сбросить к встроенному"
#: htdocs/luci-static/resources/fs-appearance.js:584 #: htdocs/luci-static/resources/fs-appearance.js:687
#: htdocs/luci-static/resources/fs-appearance.js:654
msgctxt "footstrap" msgctxt "footstrap"
msgid "Reset to saved" msgid "Reset to built-in — go back to the look the theme ships with."
msgstr "Сбросить к сохранённым" 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 #: htdocs/luci-static/resources/fs-appearance.js:355
msgctxt "footstrap" msgctxt "footstrap"
msgid "Rounding" msgid "Rounding"
msgstr "Скругление" msgstr "Скругление"
#: htdocs/luci-static/resources/fs-appearance.js:670 #: htdocs/luci-static/resources/fs-appearance.js:795
msgctxt "footstrap" msgctxt "footstrap"
msgid "Router default" msgid ""
msgstr "По умолчанию для роутера" "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:578
#: htdocs/luci-static/resources/fs-appearance.js:606 #: htdocs/luci-static/resources/fs-appearance.js:610
#: htdocs/luci-static/resources/fs-appearance.js:613 #: htdocs/luci-static/resources/fs-appearance.js:617
msgctxt "footstrap" msgctxt "footstrap"
msgid "Save as default" msgid "Save to router"
msgstr "Сохранить по умолчанию" msgstr "Сохранить на роутер"
#: htdocs/luci-static/resources/fs-appearance.js:613 #: htdocs/luci-static/resources/fs-appearance.js:683
msgctxt "footstrap" msgctxt "footstrap"
msgid "Saved as default" msgid ""
msgstr "Сохранено по умолчанию" "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 #: htdocs/luci-static/resources/fs-appearance.js:463
msgctxt "footstrap" msgctxt "footstrap"
@@ -395,7 +430,7 @@ msgctxt "footstrap"
msgid "Submenus" msgid "Submenus"
msgstr "Подменю" msgstr "Подменю"
#: htdocs/luci-static/resources/fs-appearance.js:781 #: htdocs/luci-static/resources/fs-appearance.js:804
msgctxt "footstrap" msgctxt "footstrap"
msgid "Surfaces" msgid "Surfaces"
msgstr "Поверхности" msgstr "Поверхности"
@@ -464,7 +499,7 @@ msgstr ""
"На этом роутере не задан пароль. Установите пароль root, чтобы защитить веб-" "На этом роутере не задан пароль. Установите пароль root, чтобы защитить веб-"
"интерфейс." "интерфейс."
#: htdocs/luci-static/resources/fs-appearance.js:607 #: htdocs/luci-static/resources/fs-appearance.js:611
msgctxt "footstrap" msgctxt "footstrap"
msgid "" msgid ""
"This browser is not storing preferences (site data is blocked), so a change " "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" msgctxt "footstrap"
msgid "This theme is not translated on this router yet." msgid "This theme is not translated on this router yet."
msgstr "Тема ещё не переведена на этом роутере." msgstr "Тема ещё не переведена на этом роутере."
@@ -490,15 +525,6 @@ msgctxt "footstrap"
msgid "Tint strength" msgid "Tint strength"
msgstr "Насыщенность оттенка" 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 #: htdocs/luci-static/resources/fs-appearance.js:190
msgctxt "footstrap" msgctxt "footstrap"
msgid "Too faint to read %s" 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." "the uploaded file could not be removed either; it is still on the router."
msgstr "загруженный файл тоже не удалось удалить — он остался на роутере." 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" #~ msgctxt "footstrap"
#~ msgid "" #~ msgid ""
#~ "Everything here applies the moment you change it and is remembered in " #~ "To keep them on the router, use Save as default under Defaults — not Save "
#~ "this browser only — the Save & Apply button at the foot of the page " #~ "& Apply at the foot of the page."
#~ "belongs to the System form and does not store it."
#~ msgstr "" #~ msgstr ""
#~ "Всё на этой странице применяется в момент изменения и запоминается только " #~ "Чтобы сохранить их на роутере, нажмите «Сохранить по умолчанию» в разделе "
#~ "в этом браузере — кнопка «Сохранить и применить» внизу страницы " #~ "«По умолчанию», а не «Сохранить и применить» внизу страницы."
#~ "принадлежит форме «Система» и настройки внешнего вида не сохраняет."
#~ msgctxt "footstrap" #~ msgctxt "footstrap"
#~ msgid "" #~ msgid ""
+59 -40
View File
@@ -25,7 +25,7 @@ msgctxt "footstrap"
msgid "Auto-collapse" msgid "Auto-collapse"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:783 #: htdocs/luci-static/resources/fs-appearance.js:806
msgctxt "footstrap" msgctxt "footstrap"
msgid "Background" msgid "Background"
msgstr "" msgstr ""
@@ -45,11 +45,6 @@ msgctxt "footstrap"
msgid "Cards" msgid "Cards"
msgstr "" 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 #: htdocs/luci-static/resources/fs-appearance.js:454
msgctxt "footstrap" msgctxt "footstrap"
msgid "Choose SVG" msgid "Choose SVG"
@@ -71,7 +66,7 @@ msgid "Collapse menu"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:465 #: 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" msgctxt "footstrap"
msgid "Colours" msgid "Colours"
msgstr "" msgstr ""
@@ -81,7 +76,7 @@ msgctxt "footstrap"
msgid "Compact" msgid "Compact"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:644 #: htdocs/luci-static/resources/fs-appearance.js:648
msgctxt "footstrap" msgctxt "footstrap"
msgid "Confirm reset" msgid "Confirm reset"
msgstr "" msgstr ""
@@ -101,7 +96,7 @@ msgctxt "footstrap"
msgid "Could not process the image." msgid "Could not process the image."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:624 #: htdocs/luci-static/resources/fs-appearance.js:628
msgctxt "footstrap" msgctxt "footstrap"
msgid "Could not save the default. Reload the page and try again." msgid "Could not save the default. Reload the page and try again."
msgstr "" msgstr ""
@@ -116,11 +111,6 @@ msgctxt "footstrap"
msgid "Dark" msgid "Dark"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:784
msgctxt "footstrap"
msgid "Defaults"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:349 #: htdocs/luci-static/resources/fs-appearance.js:349
msgctxt "footstrap" msgctxt "footstrap"
msgid "Density" msgid "Density"
@@ -148,10 +138,17 @@ msgstr ""
#: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3 #: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3
msgid "" 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" "background and pattern uploads"
msgstr "" 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 #: ucode/template/themes/footstrap/partials/notices.ut:24
msgid "Go to firmware upgrade..." msgid "Go to firmware upgrade..."
msgstr "" msgstr ""
@@ -170,7 +167,7 @@ msgctxt "footstrap"
msgid "Hard to read %s — large text only" msgid "Hard to read %s — large text only"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:779 #: htdocs/luci-static/resources/fs-appearance.js:802
msgctxt "footstrap" msgctxt "footstrap"
msgid "Interface" msgid "Interface"
msgstr "" msgstr ""
@@ -194,7 +191,7 @@ msgid "Large"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:328 #: 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" msgctxt "footstrap"
msgid "Layout" msgid "Layout"
msgstr "" msgstr ""
@@ -297,16 +294,26 @@ msgctxt "footstrap"
msgid "Remove" msgid "Remove"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:588 #: htdocs/luci-static/resources/fs-appearance.js:592
#: htdocs/luci-static/resources/fs-appearance.js:655 #: htdocs/luci-static/resources/fs-appearance.js:659
msgctxt "footstrap" msgctxt "footstrap"
msgid "Reset to default" msgid "Reset to built-in"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:584 #: htdocs/luci-static/resources/fs-appearance.js:687
#: htdocs/luci-static/resources/fs-appearance.js:654
msgctxt "footstrap" 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 "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:355 #: htdocs/luci-static/resources/fs-appearance.js:355
@@ -314,21 +321,40 @@ msgctxt "footstrap"
msgid "Rounding" msgid "Rounding"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:670 #: htdocs/luci-static/resources/fs-appearance.js:795
msgctxt "footstrap" 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 "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:578 #: htdocs/luci-static/resources/fs-appearance.js:578
#: htdocs/luci-static/resources/fs-appearance.js:606 #: htdocs/luci-static/resources/fs-appearance.js:610
#: htdocs/luci-static/resources/fs-appearance.js:613 #: htdocs/luci-static/resources/fs-appearance.js:617
msgctxt "footstrap" msgctxt "footstrap"
msgid "Save as default" msgid "Save to router"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:613 #: htdocs/luci-static/resources/fs-appearance.js:683
msgctxt "footstrap" 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 "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:463 #: htdocs/luci-static/resources/fs-appearance.js:463
@@ -385,7 +411,7 @@ msgctxt "footstrap"
msgid "Submenus" msgid "Submenus"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:781 #: htdocs/luci-static/resources/fs-appearance.js:804
msgctxt "footstrap" msgctxt "footstrap"
msgid "Surfaces" msgid "Surfaces"
msgstr "" msgstr ""
@@ -451,7 +477,7 @@ msgid ""
"protect the web interface." "protect the web interface."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:607 #: htdocs/luci-static/resources/fs-appearance.js:611
msgctxt "footstrap" msgctxt "footstrap"
msgid "" msgid ""
"This browser is not storing preferences (site data is blocked), so a change " "This browser is not storing preferences (site data is blocked), so a change "
@@ -459,7 +485,7 @@ msgid ""
"every browser." "every browser."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:702 #: htdocs/luci-static/resources/fs-appearance.js:725
msgctxt "footstrap" msgctxt "footstrap"
msgid "This theme is not translated on this router yet." msgid "This theme is not translated on this router yet."
msgstr "" msgstr ""
@@ -474,13 +500,6 @@ msgctxt "footstrap"
msgid "Tint strength" msgid "Tint strength"
msgstr "" 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 #: htdocs/luci-static/resources/fs-appearance.js:190
msgctxt "footstrap" msgctxt "footstrap"
msgid "Too faint to read %s" msgid "Too faint to read %s"
@@ -1,6 +1,6 @@
{ {
"luci-theme-footstrap": { "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": { "read": {
"uci": [ "uci": [
"footstrap" "footstrap"
@@ -100,6 +100,10 @@
* an item that cannot fit moves to the next line instead of hanging past the edge, which on a * an item that cannot fit moves to the next line instead of hanging past the edge, which on a
* flex row is silent. */ * flex row is silent. */
.fs-ap-actrow { display: flex; flex-wrap: wrap; gap: var(--fs-space-2); } .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 { font-size: var(--fs-type); padding: var(--fs-space-2) var(--fs-space-2-5); cursor: pointer; }
.fs-ap-actrow .btn:disabled { cursor: default; } .fs-ap-actrow .btn:disabled { cursor: default; }
/* the primed Reset (second click confirms) reads as the destructive action it is */ /* the primed Reset (second click confirms) reads as the destructive action it is */
@@ -33,8 +33,8 @@
already loaded. */ already loaded. */
const fsd = uci.get_all('footstrap', 'settings') ?? {}; const fsd = uci.get_all('footstrap', 'settings') ?? {};
/* Every option saveAsDefault() writes, listed once and read back in a loop. A hand-written /* 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 * literal with one line per axis drops an axis silently: Save to router reports success, the
* file on disk is correct, and "Reset to saved" lands on the BUILT-IN default because the value * 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 * the server hands the client was never there. tools/axes.mjs checks this list against
* snapshotAxes(). * snapshotAxes().
* *
+23 -4
View File
@@ -43,11 +43,11 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=wwand PKG_NAME:=wwand
PKG_RELEASE:=19 PKG_RELEASE:=20
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/ddimension/wwand.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_SOURCE_DATE:=2026-09-02
PKG_MIRROR_HASH:=skip PKG_MIRROR_HASH:=skip
@@ -300,8 +300,18 @@ define Package/wwand-ncm
TITLE:=NCM/ECM backend for wwand TITLE:=NCM/ECM backend for wwand
# +kmod-usb-net-rndis: the RNDIS datapath (rndis_host) used by e.g. the # +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. # Fibocom FM350-GL (MediaTek T700) — same AT-driven backend, RNDIS netdev.
DEPENDS:=+wwand +USB_SUPPORT:kmod-usb-net-cdc-ncm \ # These three stay UNCONDITIONAL, unlike the USB kmods of wwand-qmi and
+USB_SUPPORT:kmod-usb-net-cdc-ether +USB_SUPPORT:kmod-usb-net-rndis # 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 # 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 # 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 # 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 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. 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 Install it on a box with the vendor qmi_wwan_q driver; anywhere else it probes
false and changes nothing. false and changes nothing.
endef endef