1
0
mirror of https://gitlab.nic.cz/turris/reforis/foris-js.git synced 2025-06-16 13:46:16 +02:00

Compare commits

...

39 Commits

Author SHA1 Message Date
ede4fb0212 Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!271
2025-02-20 12:56:13 +01:00
33add77704 Merge branch 'bump-version-662' into 'dev'
Bump v6.6.2

See merge request turris/reforis/foris-js!270
2025-02-20 12:53:59 +01:00
456cbcfeec Bump v6.6.2
* Enhance SubmitButton component to accept a custom label prop
* Refactor RichTable component to remove forwardRef and simplify data handling
2025-02-20 12:42:10 +01:00
bf0b2ce70c Merge branch 'refactor-richtable' into 'dev'
Refactor RichTable

See merge request turris/reforis/foris-js!269
2025-02-19 16:20:47 +01:00
1441f6ff5a Enhance SubmitButton component to accept a custom label prop and update copyright year 2025-02-19 16:17:05 +01:00
c7d0655771 Refactor RichTable component to remove forwardRef and simplify data handling 2025-02-19 16:17:04 +01:00
7197813cc9 Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!268
2025-02-17 16:16:10 +01:00
31cb8e2ae0 Merge branch 'bump-version-661' into 'dev'
Bump v6.6.1

See merge request turris/reforis/foris-js!267
2025-02-17 16:12:27 +01:00
0a75f24a04 Bump v6.6.1
* Refactor RichTable component to use forwardRef
2025-02-17 16:07:50 +01:00
230ae8e35b Merge branch 'improve-richtable' into 'dev'
Refactor RichTable component to use forwardRef and useImperativeHandle for improved data handling

See merge request turris/reforis/foris-js!266
2025-02-17 15:42:41 +01:00
eb4ffb0651 Refactor RichTable component to use forwardRef
And useImperativeHandle for improved data handling.
2025-02-13 16:30:23 +01:00
2f249ce3dc Merge branch 'dev' into 'master'
Dev

See merge request turris/reforis/foris-js!265
2025-02-07 14:46:24 +01:00
74722b8ff3 Merge branch 'bump-version-660' into 'dev'
Bump v6.6.0

See merge request turris/reforis/foris-js!264
2025-02-07 14:43:20 +01:00
a2f9b3bfab Bump v6.6.0
* Added & updated Weblate translations
* Added Wi-Fi and LAN settings URLs to ForisURLs
* Added Wi-Fi modes VHT/HE 80+80
* Added encryption selection to WiFiGuestForm
* Added optional close button to ModalHeader component
* Updated Wi-Fi API
* Enhanced NumberInput component with keyboard & touch accessibility
* Refactored pagination condition in RichTable component
2025-02-07 14:41:13 +01:00
2ab65be0bf Merge branch 'sync-master-dev' into 'dev'
Add Wi-Fi and LAN settings URLs to ForisURLs

See merge request turris/reforis/foris-js!262
2025-02-07 13:50:13 +01:00
36a7b4dfda Add Wi-Fi and LAN settings URLs to ForisURLs 2025-02-07 13:45:13 +01:00
9fb0871cfc Merge branch 'update-translations' into 'dev'
Add & update Weblate translations

See merge request turris/reforis/foris-js!263
2025-02-07 13:39:10 +01:00
c7087eabf2 Merge branch 'feature/add-wifi-ht-modes-80-80' into 'dev'
Add wifi modes VHT/HE 80+80

See merge request turris/reforis/foris-js!260
2025-01-21 14:36:23 +01:00
b315ea2fd0 Add wifi modes VHT/HE 80+80 2025-01-21 16:33:02 +03:00
d46629a1bd Translated using Weblate (Greek)
Currently translated at 8.5% (7 of 82 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/el/
2025-01-18 12:00:39 +01:00
8ddb590ba8 Translated using Weblate (Greek)
Currently translated at 7.3% (6 of 82 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/el/
2025-01-17 11:02:24 +01:00
1c2a4518d3 Translated using Weblate (Greek)
Currently translated at 6.0% (5 of 82 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/el/
2025-01-17 10:53:06 +01:00
b6312075d2 Translated using Weblate (Slovak)
Currently translated at 100.0% (82 of 82 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/sk/
2024-12-14 10:00:19 +00:00
2feedec8d1 Translated using Weblate (French)
Currently translated at 78.0% (64 of 82 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/fr/
2024-12-14 10:00:19 +00:00
dff5f87e91 Merge branch 'refactor-number-input' into 'dev'
Enhance NumberInput component with keyboard & touch accessibility

See merge request turris/reforis/foris-js!259
2024-12-12 16:49:51 +01:00
38de792390 Update Snapshots 2024-12-12 18:47:38 +03:00
c23616811a Fix tests 2024-12-12 18:47:33 +03:00
f1132c6b22 Enhance NumberInput component with keyboard & touch accessibility 2024-12-12 18:44:21 +03:00
e8e81b36dc Translated using Weblate (French)
Currently translated at 68.2% (56 of 82 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/fr/
2024-12-11 10:24:36 +01:00
53c7bb1a10 Translated using Weblate (Czech)
Currently translated at 100.0% (82 of 82 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/cs/
2024-12-11 10:24:35 +01:00
fb1f79c6c1 Translated using Weblate (German)
Currently translated at 100.0% (71 of 71 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/de/
2024-12-11 10:24:34 +01:00
eafbc01c73 Merge branch 'feature/wifi-API-update' into 'master'
WiFi API update

See merge request turris/reforis/foris-js!252
2024-12-11 10:24:28 +01:00
73819809f4 WiFi API update
Deprecated option `hwmode=11g/11a` was replaced by `band=2g/5g/6g`
2024-12-11 10:10:23 +01:00
ffa1121d39 Merge branch 'add-encryption-selection-to-guest-form' into 'dev'
Add encryption selection to WiFiGuestForm

Closes #27

See merge request turris/reforis/foris-js!258
2024-12-09 16:59:57 +01:00
ee6865e3bb Update Snapshots 2024-12-09 16:52:51 +01:00
6352060da3 Add encryption selection to WiFiGuestForm 2024-12-09 16:52:50 +01:00
a63b5bfa4e Merge branch 'refactor-modal' into 'dev'
Add optional close button to ModalHeader component

See merge request turris/reforis/foris-js!257
2024-12-04 15:12:07 +01:00
4b2e47f8f9 Refactor pagination condition in RichTable component 2024-12-04 14:02:52 +01:00
66f83b24bd Add optional close button to ModalHeader component 2024-12-04 14:02:35 +01:00
21 changed files with 550 additions and 440 deletions

View File

@ -8,6 +8,35 @@ and this project adheres to
## [Unreleased] ## [Unreleased]
## [6.6.2] - 2025-02-20
### Changed
- Enhanced SubmitButton component to accept a custom label prop
- Refactored RichTable component to remove forwardRef and simplify data handling
## [6.6.1] - 2025-02-17
### Changed
- Refactored RichTable component to use forwardRef
## [6.6.0] - 2025-02-07
### Added
- Added & updated Weblate translations
- Added Wi-Fi and LAN settings URLs to ForisURLs
- Added Wi-Fi modes VHT/HE 80+80
- Added encryption selection to WiFiGuestForm
- Added optional close button to ModalHeader component
### Changed
- Updated Wi-Fi API
- Enhanced NumberInput component with keyboard & touch accessibility
- Refactored pagination condition in RichTable component
## [6.5.0] - 2024-11-13 ## [6.5.0] - 2024-11-13
### Added ### Added
@ -419,7 +448,10 @@ and this project adheres to
## [0.0.7] - 2019-09-02 ## [0.0.7] - 2019-09-02
[unreleased]: [unreleased]:
https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.5.0...dev https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.6.2...dev
[6.6.2]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.6.1...v6.6.2
[6.6.1]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.6.0...v6.6.1
[6.6.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.5.0...v6.6.0
[6.5.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.4.0...v6.5.0 [6.5.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.4.0...v6.5.0
[6.4.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.3.0...v6.4.0 [6.4.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.3.0...v6.4.0
[6.3.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.2.1...v6.3.0 [6.3.0]: https://gitlab.nic.cz/turris/reforis/foris-js/-/compare/v6.2.1...v6.3.0

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "foris", "name": "foris",
"version": "6.5.0", "version": "6.6.2",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "foris", "name": "foris",
"version": "6.5.0", "version": "6.6.2",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.6.0", "@fortawesome/fontawesome-svg-core": "^6.6.0",

View File

@ -1,6 +1,6 @@
{ {
"name": "foris", "name": "foris",
"version": "6.5.0", "version": "6.6.2",
"description": "Foris JS library is a set of components and utils for reForis application and plugins.", "description": "Foris JS library is a set of components and utils for reForis application and plugins.",
"author": "CZ.NIC, z.s.p.o.", "author": "CZ.NIC, z.s.p.o.",
"repository": { "repository": {

View File

@ -88,18 +88,21 @@ export function Modal({ shown, setShown, scrollable, size, children }) {
ModalHeader.propTypes = { ModalHeader.propTypes = {
setShown: PropTypes.func.isRequired, setShown: PropTypes.func.isRequired,
title: PropTypes.string.isRequired, title: PropTypes.string.isRequired,
showCloseButton: PropTypes.bool,
}; };
export function ModalHeader({ setShown, title }) { export function ModalHeader({ setShown, title, showCloseButton = true }) {
return ( return (
<div className="modal-header"> <div className="modal-header">
<h1 className="modal-title fs-5">{title}</h1> <h1 className="modal-title fs-5">{title}</h1>
{showCloseButton && (
<button <button
type="button" type="button"
className="btn-close" className="btn-close"
onClick={() => setShown(false)} onClick={() => setShown(false)}
aria-label={_("Close")} aria-label={_("Close")}
/> />
)}
</div> </div>
); );
} }

View File

@ -50,6 +50,20 @@ function NumberInput({ onChange, inlineText, value, ...props }) {
-1 -1
); );
function handleKeyDown(event, enableFunction) {
if (event.key === "Enter" || event.key === " ") {
event.preventDefault();
enableFunction(true);
}
}
function handleKeyUp(event, enableFunction) {
if (event.key === "Enter" || event.key === " ") {
event.preventDefault();
enableFunction(false);
}
}
return ( return (
<Input type="number" onChange={onChange} value={value} {...props}> <Input type="number" onChange={onChange} value={value} {...props}>
{inlineText && ( {inlineText && (
@ -60,7 +74,15 @@ function NumberInput({ onChange, inlineText, value, ...props }) {
className="btn btn-outline-secondary" className="btn btn-outline-secondary"
onMouseDown={() => enableIncrease(true)} onMouseDown={() => enableIncrease(true)}
onMouseUp={() => enableIncrease(false)} onMouseUp={() => enableIncrease(false)}
aria-label="Increase" onMouseLeave={() => enableIncrease(false)}
onTouchStart={() => enableIncrease(true)}
onTouchEnd={() => enableIncrease(false)}
onTouchCancel={() => enableIncrease(false)}
onKeyDown={(event) => handleKeyDown(event, enableIncrease)}
onKeyUp={(event) => handleKeyUp(event, enableIncrease)}
onBlur={() => enableIncrease(false)}
title={_("Increase value. Hint: Hold to increase faster.")}
aria-label={_("Increase value. Hint: Hold to increase faster.")}
> >
<FontAwesomeIcon icon={faPlus} /> <FontAwesomeIcon icon={faPlus} />
</button> </button>
@ -69,7 +91,15 @@ function NumberInput({ onChange, inlineText, value, ...props }) {
className="btn btn-outline-secondary" className="btn btn-outline-secondary"
onMouseDown={() => enableDecrease(true)} onMouseDown={() => enableDecrease(true)}
onMouseUp={() => enableDecrease(false)} onMouseUp={() => enableDecrease(false)}
aria-label="Decrease" onMouseLeave={() => enableDecrease(false)}
onTouchStart={() => enableDecrease(true)}
onTouchEnd={() => enableDecrease(false)}
onTouchCancel={() => enableDecrease(false)}
onKeyDown={(event) => handleKeyDown(event, enableDecrease)}
onKeyUp={(event) => handleKeyUp(event, enableDecrease)}
onBlur={() => enableDecrease(false)}
title={_("Decrease value. Hint: Hold to decrease faster.")}
aria-label={_("Decrease value. Hint: Hold to decrease faster.")}
> >
<FontAwesomeIcon icon={faMinus} /> <FontAwesomeIcon icon={faMinus} />
</button> </button>

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/) * Copyright (C) 2019-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
* *
* This is free software, licensed under the GNU General Public License v3. * This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information. * See /LICENSE for more information.
@ -32,7 +32,7 @@ describe("<NumberInput/>", () => {
}); });
it("Increase number with button", async () => { it("Increase number with button", async () => {
const increaseButton = getByLabelText(componentContainer, "Increase"); const increaseButton = getByLabelText(componentContainer, /Increase/);
fireEvent.mouseDown(increaseButton); fireEvent.mouseDown(increaseButton);
await wait(() => await wait(() =>
expect(onChangeMock).toHaveBeenCalledWith({ target: { value: 2 } }) expect(onChangeMock).toHaveBeenCalledWith({ target: { value: 2 } })
@ -40,7 +40,7 @@ describe("<NumberInput/>", () => {
}); });
it("Decrease number with button", async () => { it("Decrease number with button", async () => {
const decreaseButton = getByLabelText(componentContainer, "Decrease"); const decreaseButton = getByLabelText(componentContainer, /Decrease/);
fireEvent.mouseDown(decreaseButton); fireEvent.mouseDown(decreaseButton);
await wait(() => await wait(() =>
expect(onChangeMock).toHaveBeenCalledWith({ target: { value: 0 } }) expect(onChangeMock).toHaveBeenCalledWith({ target: { value: 0 } })

View File

@ -20,8 +20,9 @@ exports[`<NumberInput/> Render number input 1`] = `
value="1" value="1"
/> />
<button <button
aria-label="Increase" aria-label="Increase value. Hint: Hold to increase faster."
class="btn btn-outline-secondary" class="btn btn-outline-secondary"
title="Increase value. Hint: Hold to increase faster."
type="button" type="button"
> >
<i <i
@ -29,8 +30,9 @@ exports[`<NumberInput/> Render number input 1`] = `
/> />
</button> </button>
<button <button
aria-label="Decrease" aria-label="Decrease value. Hint: Hold to decrease faster."
class="btn btn-outline-secondary" class="btn btn-outline-secondary"
title="Decrease value. Hint: Hold to decrease faster."
type="button" type="button"
> >
<i <i

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2019-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/) * Copyright (C) 2019-2025 CZ.NIC z.s.p.o. (https://www.nic.cz/)
* *
* This is free software, licensed under the GNU General Public License v3. * This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information. * See /LICENSE for more information.
@ -20,22 +20,20 @@ import RichTableBody from "./RichTableBody";
import RichTableHeader from "./RichTableHeader"; import RichTableHeader from "./RichTableHeader";
import RichTablePagination from "./RichTablePagination"; import RichTablePagination from "./RichTablePagination";
const fallbackData = [];
RichTable.propTypes = { RichTable.propTypes = {
/** Columns to be displayed in the table */ /** Columns to be displayed in the table */
columns: PropTypes.array.isRequired, columns: PropTypes.array.isRequired,
/** Data to be displayed in the table */ /** Data to be displayed in the table, must be passed as a stable reference, for example, useState */
data: PropTypes.array.isRequired, data: PropTypes.array.isRequired,
/** Whether to display pagination */ /** Whether to display pagination */
withPagination: PropTypes.bool, withPagination: PropTypes.bool,
/** Number of rows per page */ /** Number of rows per page, the default is 5 */
pageSize: PropTypes.number, pageSize: PropTypes.number,
/** Index of the current page */ /** Index of the current page */
pageIndex: PropTypes.number, pageIndex: PropTypes.number,
}; };
function RichTable({ export default function RichTable({
columns, columns,
data, data,
withPagination, withPagination,
@ -43,7 +41,6 @@ function RichTable({
pageIndex = 0, pageIndex = 0,
}) { }) {
const tableColumns = useMemo(() => columns, [columns]); const tableColumns = useMemo(() => columns, [columns]);
const [tableData] = useState(data ?? fallbackData);
const [sorting, setSorting] = useState([]); const [sorting, setSorting] = useState([]);
const [pagination, setPagination] = useState({ const [pagination, setPagination] = useState({
pageIndex, pageIndex,
@ -51,7 +48,7 @@ function RichTable({
}); });
const table = useReactTable({ const table = useReactTable({
data: tableData, data,
columns: tableColumns, columns: tableColumns,
getCoreRowModel: getCoreRowModel(), getCoreRowModel: getCoreRowModel(),
getSortedRowModel: getSortedRowModel(), getSortedRowModel: getSortedRowModel(),
@ -64,21 +61,21 @@ function RichTable({
}, },
}); });
const paginationIsNeeded = data.length > pageSize && withPagination;
return ( return (
<div className="table-responsive"> <div className="table-responsive">
<table className="table table-hover text-nowrap"> <table className="table table-hover text-nowrap">
<RichTableHeader table={table} flexRender={flexRender} /> <RichTableHeader table={table} flexRender={flexRender} />
<RichTableBody table={table} flexRender={flexRender} /> <RichTableBody table={table} flexRender={flexRender} />
</table> </table>
{withPagination && ( {paginationIsNeeded && (
<RichTablePagination <RichTablePagination
table={table} table={table}
tablePageSize={pageSize} tablePageSize={pageSize}
allRows={tableData.length} allRows={data.length}
/> />
)} )}
</div> </div>
); );
} }
export default RichTable;

View File

@ -9,7 +9,7 @@ import React from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { HELP_TEXTS, HTMODES, HWMODES, ENCRYPTIONMODES } from "./constants"; import { HELP_TEXTS, HTMODES, BANDS, ENCRYPTIONMODES } from "./constants";
import WifiGuestForm from "./WiFiGuestForm"; import WifiGuestForm from "./WiFiGuestForm";
import WiFiQRCode from "./WiFiQRCode"; import WiFiQRCode from "./WiFiQRCode";
import PasswordInput from "../../bootstrap/PasswordInput"; import PasswordInput from "../../bootstrap/PasswordInput";
@ -60,7 +60,7 @@ DeviceForm.propTypes = {
SSID: PropTypes.string.isRequired, SSID: PropTypes.string.isRequired,
password: PropTypes.string.isRequired, password: PropTypes.string.isRequired,
hidden: PropTypes.bool.isRequired, hidden: PropTypes.bool.isRequired,
hwmode: PropTypes.string.isRequired, band: PropTypes.string.isRequired,
htmode: PropTypes.string.isRequired, htmode: PropTypes.string.isRequired,
channel: PropTypes.string.isRequired, channel: PropTypes.string.isRequired,
guest_wifi: PropTypes.object.isRequired, guest_wifi: PropTypes.object.isRequired,
@ -155,26 +155,26 @@ function DeviceForm({
/> />
<RadioSet <RadioSet
name={`hwmode-${deviceID}`} name={`band-${deviceID}`}
label="GHz" label={_("Band")}
choices={getHwmodeChoices(formData)} choices={getBandChoices(formData)}
value={formData.hwmode} value={formData.band}
helpText={HELP_TEXTS.hwmode} helpText={HELP_TEXTS.band}
inline inline
onChange={setFormValue((value) => { onChange={setFormValue((value) => {
// Get the last item in an array of available HT modes // Find the selected band
const [best2] = bnds[0].available_htmodes.slice(-1); const selectedBand = bnds.find(
const [best5] = bnds[1].available_htmodes.slice(-1); (band) => band.band === value
);
// Get the last item in the available HT modes for the selected band
const bestHtmode =
selectedBand.available_htmodes.slice(-1)[0];
return { return {
devices: { devices: {
[deviceIndex]: { [deviceIndex]: {
hwmode: { $set: value }, band: { $set: value },
channel: { $set: "0" }, channel: { $set: "0" },
htmode: { htmode: { $set: bestHtmode },
$set:
// Set HT mode depending on checked frequency
value === "11a" ? best5 : best2,
},
}, },
}, },
}; };
@ -263,7 +263,7 @@ function getChannelChoices(device) {
}; };
device.available_bands.forEach((availableBand) => { device.available_bands.forEach((availableBand) => {
if (availableBand.hwmode !== device.hwmode) return; if (availableBand.band !== device.band) return;
availableBand.available_channels.forEach((availableChannel) => { availableBand.available_channels.forEach((availableChannel) => {
channelChoices[availableChannel.number.toString()] = ` channelChoices[availableChannel.number.toString()] = `
@ -282,7 +282,7 @@ function getHtmodeChoices(device) {
const htmodeChoices = {}; const htmodeChoices = {};
device.available_bands.forEach((availableBand) => { device.available_bands.forEach((availableBand) => {
if (availableBand.hwmode !== device.hwmode) return; if (availableBand.band !== device.band) return;
availableBand.available_htmodes.forEach((availableHtmod) => { availableBand.available_htmodes.forEach((availableHtmod) => {
htmodeChoices[availableHtmod] = HTMODES[availableHtmod]; htmodeChoices[availableHtmod] = HTMODES[availableHtmod];
@ -291,10 +291,10 @@ function getHtmodeChoices(device) {
return htmodeChoices; return htmodeChoices;
} }
function getHwmodeChoices(device) { function getBandChoices(device) {
return device.available_bands.map((availableBand) => ({ return device.available_bands.map((availableBand) => ({
label: HWMODES[availableBand.hwmode], label: `${BANDS[availableBand.band]} GHz`,
value: availableBand.hwmode, value: availableBand.band,
})); }));
} }

View File

@ -9,9 +9,10 @@ import React from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { HELP_TEXTS } from "./constants"; import { HELP_TEXTS, ENCRYPTIONMODES } from "./constants";
import WiFiQRCode from "./WiFiQRCode"; import WiFiQRCode from "./WiFiQRCode";
import PasswordInput from "../../bootstrap/PasswordInput"; import PasswordInput from "../../bootstrap/PasswordInput";
import Select from "../../bootstrap/Select";
import Switch from "../../bootstrap/Switch"; import Switch from "../../bootstrap/Switch";
import TextInput from "../../bootstrap/TextInput"; import TextInput from "../../bootstrap/TextInput";
@ -21,6 +22,7 @@ WifiGuestForm.propTypes = {
SSID: PropTypes.string.isRequired, SSID: PropTypes.string.isRequired,
password: PropTypes.string.isRequired, password: PropTypes.string.isRequired,
enabled: PropTypes.bool.isRequired, enabled: PropTypes.bool.isRequired,
encryption: PropTypes.string.isRequired,
}), }),
formErrors: PropTypes.shape({ formErrors: PropTypes.shape({
SSID: PropTypes.string, SSID: PropTypes.string,
@ -89,6 +91,20 @@ export default function WifiGuestForm({
}))} }))}
{...props} {...props}
/> />
<Select
label={_("Encryption")}
choices={ENCRYPTIONMODES}
helpText={HELP_TEXTS.wpa3}
value={formData.encryption}
onChange={setFormValue((value) => ({
devices: {
[formData.id]: {
guest_wifi: { encryption: { $set: value } },
},
},
}))}
{...props}
/>
</> </>
) : null} ) : null}
</> </>

View File

@ -77,7 +77,7 @@ describe("<WiFiSettings/>", () => {
it("Snapshot 2.4 GHz", () => { it("Snapshot 2.4 GHz", () => {
fireEvent.click(getByText("Wi-Fi 1")); fireEvent.click(getByText("Wi-Fi 1"));
const enabledRender = asFragment(); const enabledRender = asFragment();
fireEvent.click(getAllByText("2.4")[0]); fireEvent.click(getAllByText(/2.4/)[0]);
expect(diffSnapshot(enabledRender, asFragment())).toMatchSnapshot(); expect(diffSnapshot(enabledRender, asFragment())).toMatchSnapshot();
}); });
@ -118,7 +118,7 @@ describe("<WiFiSettings/>", () => {
guest_wifi: { enabled: false }, guest_wifi: { enabled: false },
hidden: false, hidden: false,
htmode: "HT80", htmode: "HT80",
hwmode: "11a", band: "5g",
id: 0, id: 0,
password: "TestPass", password: "TestPass",
encryption: "WPA3", encryption: "WPA3",
@ -135,7 +135,7 @@ describe("<WiFiSettings/>", () => {
it("Post form: 2.4 GHz", () => { it("Post form: 2.4 GHz", () => {
fireEvent.click(getByText("Wi-Fi 1")); fireEvent.click(getByText("Wi-Fi 1"));
fireEvent.click(getAllByText("2.4")[0]); fireEvent.click(getAllByText(/2.4/)[0]);
fireEvent.click(getByText("Save")); fireEvent.click(getByText("Save"));
expect(mockAxios.post).toBeCalled(); expect(mockAxios.post).toBeCalled();
@ -148,7 +148,7 @@ describe("<WiFiSettings/>", () => {
guest_wifi: { enabled: false }, guest_wifi: { enabled: false },
hidden: false, hidden: false,
htmode: "VHT80", htmode: "VHT80",
hwmode: "11g", band: "2g",
id: 0, id: 0,
password: "TestPass", password: "TestPass",
encryption: "WPA3", encryption: "WPA3",
@ -185,7 +185,7 @@ describe("<WiFiSettings/>", () => {
}, },
hidden: false, hidden: false,
htmode: "HT80", htmode: "HT80",
hwmode: "11a", band: "5g",
id: 0, id: 0,
password: "TestPass", password: "TestPass",
encryption: "WPA3", encryption: "WPA3",

View File

@ -77,7 +77,7 @@ export function wifiSettingsFixture() {
"VHT40", "VHT40",
"VHT80", "VHT80",
], ],
hwmode: "11g", band: "2g",
}, },
{ {
available_channels: [ available_channels: [
@ -215,7 +215,7 @@ export function wifiSettingsFixture() {
"VHT40", "VHT40",
"VHT80", "VHT80",
], ],
hwmode: "11a", band: "5g",
}, },
], ],
channel: 60, channel: 60,
@ -227,7 +227,7 @@ export function wifiSettingsFixture() {
}, },
hidden: false, hidden: false,
htmode: "HT80", htmode: "HT80",
hwmode: "11a", band: "5g",
id: 0, id: 0,
password: "TestPass", password: "TestPass",
encryption: "WPA3", encryption: "WPA3",
@ -294,7 +294,7 @@ export function wifiSettingsFixture() {
}, },
], ],
available_htmodes: ["NOHT", "HT20", "HT40"], available_htmodes: ["NOHT", "HT20", "HT40"],
hwmode: "11g", band: "2g",
}, },
], ],
channel: 11, channel: 11,
@ -306,7 +306,7 @@ export function wifiSettingsFixture() {
}, },
hidden: false, hidden: false,
htmode: "HT40", htmode: "HT40",
hwmode: "11g", band: "2g",
id: 1, id: 1,
password: "TestPass", password: "TestPass",
encryption: "WPA3", encryption: "WPA3",
@ -323,7 +323,7 @@ const oneDevice = {
guest_wifi: { enabled: false }, guest_wifi: { enabled: false },
hidden: false, hidden: false,
htmode: "HT40", htmode: "HT40",
hwmode: "11a", band: "5g",
id: 0, id: 0,
password: "TestPass", password: "TestPass",
encryption: "WPA3", encryption: "WPA3",
@ -340,7 +340,7 @@ const twoDevices = {
guest_wifi: { enabled: false }, guest_wifi: { enabled: false },
hidden: false, hidden: false,
htmode: "HT40", htmode: "HT40",
hwmode: "11a", band: "5g",
id: 0, id: 0,
password: "TestPass", password: "TestPass",
encryption: "WPA3", encryption: "WPA3",
@ -352,7 +352,7 @@ const twoDevices = {
guest_wifi: { enabled: false }, guest_wifi: { enabled: false },
hidden: false, hidden: false,
htmode: "HT40", htmode: "HT40",
hwmode: "11a", band: "5g",
id: 1, id: 1,
password: "TestPass", password: "TestPass",
encryption: "WPA3", encryption: "WPA3",
@ -369,7 +369,7 @@ const threeDevices = {
guest_wifi: { enabled: false }, guest_wifi: { enabled: false },
hidden: false, hidden: false,
htmode: "HT40", htmode: "HT40",
hwmode: "11a", band: "5g",
id: 0, id: 0,
password: "TestPass", password: "TestPass",
encryption: "WPA3", encryption: "WPA3",
@ -381,7 +381,7 @@ const threeDevices = {
guest_wifi: { enabled: false }, guest_wifi: { enabled: false },
hidden: false, hidden: false,
htmode: "HT40", htmode: "HT40",
hwmode: "11a", band: "5g",
id: 1, id: 1,
password: "TestPass", password: "TestPass",
encryption: "WPA3", encryption: "WPA3",
@ -393,7 +393,7 @@ const threeDevices = {
guest_wifi: { enabled: false }, guest_wifi: { enabled: false },
hidden: false, hidden: false,
htmode: "HT40", htmode: "HT40",
hwmode: "11a", band: "5g",
id: 2, id: 2,
password: "", password: "",
encryption: "WPA3", encryption: "WPA3",

View File

@ -339,7 +339,7 @@ exports[`<WiFiSettings/> Snapshot guest network. 1`] = `
- First value - First value
+ Second value + Second value
@@ -524,10 +524,87 @@ @@ -524,10 +524,124 @@
<small> <small>
Enables Wi-Fi for guests, which is separated from LAN network. Devices connected to this network are allowed to access the internet, but aren't allowed to access other devices and the configuration interface of the router. Parameters of the guest network can be set in the Guest network tab. Enables Wi-Fi for guests, which is separated from LAN network. Devices connected to this network are allowed to access the internet, but aren't allowed to access other devices and the configuration interface of the router. Parameters of the guest network can be set in the Guest network tab.
</small> </small>
@ -421,13 +421,50 @@ exports[`<WiFiSettings/> Snapshot guest network. 1`] = `
+ WPA2/3 pre-shared key, that is required to connect to the network. + WPA2/3 pre-shared key, that is required to connect to the network.
+ </small> + </small>
+ </div> + </div>
+ </div>
+ <div
+ class="mb-3"
+ >
+ <label
+ class="form-label"
+ for="14"
+ >
+ Encryption
+ </label>
+ <select
+ class="form-select"
+ id="14"
+ >
+ <option
+ value="WPA3"
+ >
+ WPA3 only
+ </option>
+ <option
+ value="WPA2/3"
+ >
+ WPA3 with WPA2 as fallback (default)
+ </option>
+ <option
+ value="WPA2"
+ >
+ WPA2 only
+ </option>
+ </select>
+ <div
+ class="form-text"
+ >
+ <small>
+ The WPA3 standard is the new most secure encryption method that is suggested to be used with any device that supports it. The older devices without WPA3 support require older WPA2. If you experience issues with connecting older devices, try to enable WPA2.
+ </small>
+ </div>
+ </div> + </div>
<hr /> <hr />
<div <div
class="form-check form-switch mb-3 d-flex align-items-center" class="form-check form-switch mb-3 d-flex align-items-center"
> >
<input <input
@@ -550,10 +627,11 @@ @@ -550,10 +664,11 @@
<div <div
class="text-end" class="text-end"
> >
@ -555,23 +592,23 @@ exports[`<WiFiSettings/> Snapshot one module enabled. 1`] = `
+ class="d-block" + class="d-block"
+ for="6" + for="6"
+ > + >
+ GHz + Band
+ </label> + </label>
+ <div + <div
+ class="mb-3 form-check form-check-inline" + class="mb-3 form-check form-check-inline"
+ > + >
+ <input + <input
+ class="form-check-input me-2" + class="form-check-input me-2"
+ id="hwmode-0-0" + id="band-0-0"
+ name="hwmode-0" + name="band-0"
+ type="radio" + type="radio"
+ value="11g" + value="2g"
+ /> + />
+ <label + <label
+ class="form-check-label" + class="form-check-label"
+ for="hwmode-0-0" + for="band-0-0"
+ > + >
+ 2.4 + 2.4 GHz
+ </label> + </label>
+ </div> + </div>
+ <div + <div
@ -580,16 +617,16 @@ exports[`<WiFiSettings/> Snapshot one module enabled. 1`] = `
+ <input + <input
+ checked="" + checked=""
+ class="form-check-input me-2" + class="form-check-input me-2"
+ id="hwmode-0-1" + id="band-0-1"
+ name="hwmode-0" + name="band-0"
+ type="radio" + type="radio"
+ value="11a" + value="5g"
+ /> + />
+ <label + <label
+ class="form-check-label" + class="form-check-label"
+ for="hwmode-0-1" + for="band-0-1"
+ > + >
+ 5 + 5 GHz
+ </label> + </label>
+ </div> + </div>
+ <div + <div

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2019-2022 CZ.NIC z.s.p.o. (https://www.nic.cz/) * Copyright (C) 2019-2024 CZ.NIC z.s.p.o. (https://www.nic.cz/)
* *
* This is free software, licensed under the GNU General Public License v3. * This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information. * See /LICENSE for more information.
@ -12,15 +12,18 @@ export const HTMODES = {
VHT20: _("802.11ac - 20 MHz wide channel"), VHT20: _("802.11ac - 20 MHz wide channel"),
VHT40: _("802.11ac - 40 MHz wide channel"), VHT40: _("802.11ac - 40 MHz wide channel"),
VHT80: _("802.11ac - 80 MHz wide channel"), VHT80: _("802.11ac - 80 MHz wide channel"),
VHT80_80: _("802.11ac - 80+80 MHz wide channel"),
VHT160: _("802.11ac - 160 MHz wide channel"), VHT160: _("802.11ac - 160 MHz wide channel"),
HE20: _("802.11ax - 20 MHz wide channel"), HE20: _("802.11ax - 20 MHz wide channel"),
HE40: _("802.11ax - 40 MHz wide channel"), HE40: _("802.11ax - 40 MHz wide channel"),
HE80: _("802.11ax - 80 MHz wide channel"), HE80: _("802.11ax - 80 MHz wide channel"),
HE80_80: _("802.11ax - 80+80 MHz wide channel"),
HE160: _("802.11ax - 160 MHz wide channel"), HE160: _("802.11ax - 160 MHz wide channel"),
}; };
export const HWMODES = { export const BANDS = {
"11g": "2.4", "2g": "2.4",
"11a": "5", "5g": "5",
"6g": "6",
}; };
export const ENCRYPTIONMODES = { export const ENCRYPTIONMODES = {
WPA3: _("WPA3 only"), WPA3: _("WPA3 only"),
@ -37,7 +40,7 @@ export const HELP_TEXTS = {
hidden: _( hidden: _(
"If set, network is not visible when scanning for available networks." "If set, network is not visible when scanning for available networks."
), ),
hwmode: _( band: _(
"The 2.4 GHz band is more widely supported by clients, but tends to have more interference. The 5 GHz band is a newer standard and may not be supported by all your devices. It usually has less interference, but the signal does not carry so well indoors." "The 2.4 GHz band is more widely supported by clients, but tends to have more interference. The 5 GHz band is a newer standard and may not be supported by all your devices. It usually has less interference, but the signal does not carry so well indoors."
), ),
htmode: _( htmode: _(

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/) * Copyright (C) 2019-2025 CZ.NIC z.s.p.o. (https://www.nic.cz/)
* *
* This is free software, licensed under the GNU General Public License v3. * This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information. * See /LICENSE for more information.
@ -20,13 +20,15 @@ export const STATES = {
SubmitButton.propTypes = { SubmitButton.propTypes = {
disabled: PropTypes.bool, disabled: PropTypes.bool,
state: PropTypes.oneOf(Object.keys(STATES).map((key) => STATES[key])), state: PropTypes.oneOf(Object.keys(STATES).map((key) => STATES[key])),
label: PropTypes.string,
}; };
export function SubmitButton({ disabled, state, ...props }) { export function SubmitButton({ disabled, state, label, ...props }) {
const disableSubmitButton = disabled || state !== STATES.READY; const disableSubmitButton = disabled || state !== STATES.READY;
const loadingSubmitButton = state !== STATES.READY; const loadingSubmitButton = state !== STATES.READY;
let labelSubmitButton; let labelSubmitButton = label;
if (!labelSubmitButton) {
switch (state) { switch (state) {
case STATES.SAVING: case STATES.SAVING:
labelSubmitButton = _("Updating"); labelSubmitButton = _("Updating");
@ -37,6 +39,7 @@ export function SubmitButton({ disabled, state, ...props }) {
default: default:
labelSubmitButton = _("Save"); labelSubmitButton = _("Save");
} }
}
return ( return (
<Button <Button

View File

@ -38,6 +38,8 @@ export const ForisURLs = {
overview: "/overview", overview: "/overview",
notifications: "/overview#notifications", notifications: "/overview#notifications",
notificationsSettings: "/administration/notifications-settings", notificationsSettings: "/administration/notifications-settings",
wifiSettings: "/network-settings/wifi",
lanSettings: "/network-settings/lan",
approveUpdates: "/package-management/updates", approveUpdates: "/package-management/updates",
languages: "/package-management/languages", languages: "/package-management/languages",

View File

@ -8,15 +8,16 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n" "POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2024-09-25 10:15+0000\n" "PO-Revision-Date: 2024-11-15 06:01+0000\n"
"Last-Translator: Lukas Jelinek <lukas.jelinek@nic.cz>\n" "Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/turris/foris-js/cs/"
">\n"
"Language: cs\n" "Language: cs\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/turris/foris-"
"js/cs/>\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"X-Generator: Weblate 5.9-dev\n"
"Generated-By: Babel 2.16.0\n" "Generated-By: Babel 2.16.0\n"
#: src/api/utils.js:61 #: src/api/utils.js:61
@ -49,74 +50,72 @@ msgid "Copy"
msgstr "Kopírovat" msgstr "Kopírovat"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Action successful." msgid "Action successful."
msgstr "Nastavení úspěšně uložena" msgstr "Akce úspěšná."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed." msgid "Action failed."
msgstr "" msgstr "Akce se nezdařila."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel" msgid "Cancel"
msgstr "Zrušit" msgstr "Zrušit"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm" msgid "Confirm"
msgstr "Potvrdit restart" msgstr "Potvrdit"
#: src/common/RichTable/RichTableHeader.js:29 #: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending" msgid "Sort ascending"
msgstr "" msgstr "Seřadit vzestupně"
#: src/common/RichTable/RichTableHeader.js:30 #: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending" msgid "Sort descending"
msgstr "" msgstr "Seřadit sestupně"
#: src/common/RichTable/RichTableHeader.js:31 #: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort" msgid "Clear sort"
msgstr "" msgstr "Vyčistit řazení"
#: src/common/RichTable/RichTablePagination.js:65 #: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar" msgid "Pagination navigation bar"
msgstr "" msgstr "Navigační pruh stránkování"
#: src/common/RichTable/RichTablePagination.js:71 #: src/common/RichTable/RichTablePagination.js:71
msgid "First page" msgid "First page"
msgstr "" msgstr "První stránka"
#: src/common/RichTable/RichTablePagination.js:77 #: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page" msgid "Previous page"
msgstr "" msgstr "Předchozí stránka"
#: src/common/RichTable/RichTablePagination.js:83 #: src/common/RichTable/RichTablePagination.js:83
msgid "Next page" msgid "Next page"
msgstr "" msgstr "Následující stránka"
#: src/common/RichTable/RichTablePagination.js:89 #: src/common/RichTable/RichTablePagination.js:89
msgid "Last page" msgid "Last page"
msgstr "" msgstr "Poslední stránka"
#: src/common/RichTable/RichTablePagination.js:95 #: src/common/RichTable/RichTablePagination.js:95
msgid "Page" msgid "Page"
msgstr "" msgstr "Stránka"
#: src/common/RichTable/RichTablePagination.js:98 #: src/common/RichTable/RichTablePagination.js:98
msgid "of" msgid "of"
msgstr "" msgstr "z"
#: src/common/RichTable/RichTablePagination.js:106 #: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:" msgid "Rows per page:"
msgstr "" msgstr "Řádků na stránku:"
#: src/common/RichTable/RichTablePagination.js:109 #: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page" msgid "Select rows per page"
msgstr "" msgstr "Vyberte řádky na stránku"
#: src/common/RichTable/RichTablePagination.js:121 #: src/common/RichTable/RichTablePagination.js:121
msgid "All" msgid "All"
msgstr "" msgstr "Vše"
#: src/common/WiFiSettings/ResetWiFiSettings.js:39 #: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings." msgid "An error occurred during resetting Wi-Fi settings."
@ -137,9 +136,9 @@ msgid ""
"Fi settings. Note that this will remove the current Wi-Fi configuration " "Fi settings. Note that this will remove the current Wi-Fi configuration "
"and restore the default values." "and restore the default values."
msgstr "" msgstr ""
"Pokud se počet bezdrátových karet neshoduje, můžete zkusit obnovit " "Pokud se počet bezdrátových karet neshoduje, můžete zkusit obnovit nastavení "
"nastavení Wi-Fi. Je třeba upozornit, že se tím odstraní aktuální " "Wi-Fi. Je třeba upozornit, že se tím odstraní stávající nastavení Wi-Fi a "
"konfigurace Wi-Fi a obnoví se výchozí hodnoty." "obnoví se výchozí hodnoty."
#: src/common/WiFiSettings/WiFiForm.js:97 #: src/common/WiFiSettings/WiFiForm.js:97
msgid "Wi-Fi ${deviceID + 1}" msgid "Wi-Fi ${deviceID + 1}"
@ -175,7 +174,7 @@ msgid ""
"In case you have trouble connecting to WiFi Access Point, try disabling " "In case you have trouble connecting to WiFi Access Point, try disabling "
"Management Frame Protection." "Management Frame Protection."
msgstr "" msgstr ""
"Máte-li problémy při připojování k přístupovému bodu Wi-Fi, zkuste " "Pokud máte problémy při připojování k přístupovému bodu Wi-Fi, zkuste "
"vypnout Management Frame Protection." "vypnout Management Frame Protection."
#: src/common/WiFiSettings/WiFiForm.js:262 #: src/common/WiFiSettings/WiFiForm.js:262
@ -226,7 +225,7 @@ msgstr "Je třeba, aby heslo obsahovalo alespoň 8 znaků"
#: src/common/WiFiSettings/WiFiSettings.js:91 #: src/common/WiFiSettings/WiFiSettings.js:91
#: src/common/WiFiSettings/WiFiSettings.js:110 #: src/common/WiFiSettings/WiFiSettings.js:110
msgid "Password must not contain more than 63 symbols" msgid "Password must not contain more than 63 symbols"
msgstr "Heslo nesmí obsahovat více než 63 znaků" msgstr "Heslo nemůže obsahovat více než 63 znaků"
#: src/common/WiFiSettings/constants.js:9 #: src/common/WiFiSettings/constants.js:9
msgid "Disabled" msgid "Disabled"
@ -363,11 +362,11 @@ msgstr ""
#: src/form/components/SubmitButton.js:32 #: src/form/components/SubmitButton.js:32
msgid "Updating" msgid "Updating"
msgstr "Aktualizuji" msgstr "Aktualizuje se"
#: src/form/components/SubmitButton.js:35 #: src/form/components/SubmitButton.js:35
msgid "Load settings" msgid "Load settings"
msgstr "Načítám nastavení" msgstr "Načíst nastavení"
#: src/form/components/SubmitButton.js:38 #: src/form/components/SubmitButton.js:38
msgid "Save" msgid "Save"
@ -399,7 +398,7 @@ msgstr "Toto není platné doménové jméno."
#: src/utils/validations.js:18 #: src/utils/validations.js:18
msgid "This is not a valid DUID." msgid "This is not a valid DUID."
msgstr "Tohle není platné DUID." msgstr "Toto není platné DUID."
#: src/utils/validations.js:19 #: src/utils/validations.js:19
msgid "This is not a valid MAC address." msgid "This is not a valid MAC address."
@ -446,4 +445,3 @@ msgstr "Neobsahuje seznam e-mailů oddělených čárkou."
#~ msgid "Are you sure you want to restart the router?" #~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Opravdu chcete router restartovat?" #~ msgstr "Opravdu chcete router restartovat?"

View File

@ -11,8 +11,8 @@ msgstr ""
"PO-Revision-Date: 2024-01-04 21:08+0000\n" "PO-Revision-Date: 2024-01-04 21:08+0000\n"
"Last-Translator: Erik Pfannenstein <debianignatz@gmx.de>\n" "Last-Translator: Erik Pfannenstein <debianignatz@gmx.de>\n"
"Language: de\n" "Language: de\n"
"Language-Team: German <https://hosted.weblate.org/projects/turris/foris-" "Language-Team: German <https://hosted.weblate.org/projects/turris/foris-js/"
"js/de/>\n" "de/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
@ -35,16 +35,16 @@ msgstr "Keine Antwort erhalten."
msgid "An unknown API error occurred." msgid "An unknown API error occurred."
msgstr "Ein unbekannter API-Fehler ist aufgetreten." msgstr "Ein unbekannter API-Fehler ist aufgetreten."
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101 #: src/bootstrap/Alert.js:57 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89 #: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close" msgid "Close"
msgstr "" msgstr "Schließen"
#: src/bootstrap/CopyInput.js:56 #: src/bootstrap/CopyInput.js:56 src/bootstrap/CopyInput.js:57
msgid "Copied!" msgid "Copied!"
msgstr "Kopiert!" msgstr "Kopiert!"
#: src/bootstrap/CopyInput.js:56 #: src/bootstrap/CopyInput.js:56 src/bootstrap/CopyInput.js:57
msgid "Copy" msgid "Copy"
msgstr "Kopieren" msgstr "Kopieren"
@ -58,6 +58,7 @@ msgid "Action failed."
msgstr "" msgstr ""
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
#: src/common/RebootButton.js:71
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
@ -121,8 +122,7 @@ msgstr ""
#: src/common/WiFiSettings/ResetWiFiSettings.js:39 #: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings." msgid "An error occurred during resetting Wi-Fi settings."
msgstr "" msgstr ""
"Ein Fehler ist während der Zurücksetzung der WLAN-Einstellungen " "Ein Fehler ist während der Zurücksetzung der WLAN-Einstellungen aufgetreten."
"aufgetreten."
#: src/common/WiFiSettings/ResetWiFiSettings.js:42 #: src/common/WiFiSettings/ResetWiFiSettings.js:42
msgid "Wi-Fi settings are set to defaults." msgid "Wi-Fi settings are set to defaults."
@ -135,9 +135,9 @@ msgstr "WLAN-Einstellungen zurücksetzen"
#: src/common/WiFiSettings/ResetWiFiSettings.js:58 #: src/common/WiFiSettings/ResetWiFiSettings.js:58
msgid "" msgid ""
"If a number of wireless cards doesn't match, you may try to reset the Wi-" "If a number of wireless cards doesn't match, you may try to reset the Wi-Fi "
"Fi settings. Note that this will remove the current Wi-Fi configuration " "settings. Note that this will remove the current Wi-Fi configuration and "
"and restore the default values." "restore the default values."
msgstr "" msgstr ""
"Falls die Anzahl der WLAN-Karten nicht korrekt ist, könnte es helfen, die " "Falls die Anzahl der WLAN-Karten nicht korrekt ist, könnte es helfen, die "
"WLAN-Einstellungen zurückzusetzen. Beachten Sie, dass dabei die aktuelle " "WLAN-Einstellungen zurückzusetzen. Beachten Sie, dass dabei die aktuelle "
@ -177,8 +177,8 @@ msgid ""
"In case you have trouble connecting to WiFi Access Point, try disabling " "In case you have trouble connecting to WiFi Access Point, try disabling "
"Management Frame Protection." "Management Frame Protection."
msgstr "" msgstr ""
"Falls Sie beim Verbinden mit dem WiFi-Access-Point Probleme haben, " "Falls Sie beim Verbinden mit dem WiFi-Access-Point Probleme haben, schalten "
"schalten Sie testweise die Management Frame Protection ab." "Sie testweise die Management Frame Protection ab."
#: src/common/WiFiSettings/WiFiForm.js:262 #: src/common/WiFiSettings/WiFiForm.js:262
msgid "auto" msgid "auto"
@ -194,9 +194,8 @@ msgstr "Gast-WLAN aktivieren"
#: src/common/WiFiSettings/WiFiQRCode.js:43 #: src/common/WiFiSettings/WiFiQRCode.js:43
#: src/common/WiFiSettings/WiFiQRCode.js:44 #: src/common/WiFiSettings/WiFiQRCode.js:44
#, fuzzy
msgid "Show QR code" msgid "Show QR code"
msgstr "WLAN QR-Code" msgstr "QR-Code anzeigen"
#: src/common/WiFiSettings/WiFiQRCode.js:70 #: src/common/WiFiSettings/WiFiQRCode.js:70
msgid "Wi-Fi QR Code" msgid "Wi-Fi QR Code"
@ -297,7 +296,8 @@ msgstr ""
#: src/common/WiFiSettings/constants.js:34 #: src/common/WiFiSettings/constants.js:34
msgid "WPA2/3 pre-shared key, that is required to connect to the network." msgid "WPA2/3 pre-shared key, that is required to connect to the network."
msgstr "WPA2/3 Pre-Shard Key, der zum Verbinden mit dem Netzwerk notwendig ist." msgstr ""
"WPA2/3 Pre-Shard Key, der zum Verbinden mit dem Netzwerk notwendig ist."
#: src/common/WiFiSettings/constants.js:37 #: src/common/WiFiSettings/constants.js:37
msgid "If set, network is not visible when scanning for available networks." msgid "If set, network is not visible when scanning for available networks."
@ -307,55 +307,54 @@ msgstr ""
#: src/common/WiFiSettings/constants.js:40 #: src/common/WiFiSettings/constants.js:40
msgid "" msgid ""
"The 2.4 GHz band is more widely supported by clients, but tends to have " "The 2.4 GHz band is more widely supported by clients, but tends to have more "
"more interference. The 5 GHz band is a newer standard and may not be " "interference. The 5 GHz band is a newer standard and may not be supported by "
"supported by all your devices. It usually has less interference, but the " "all your devices. It usually has less interference, but the signal does not "
"signal does not carry so well indoors." "carry so well indoors."
msgstr "" msgstr ""
"Das 2,4 GHz-Band wird von allen Geräten unterstützt, ist aber tendenziell " "Das 2,4 GHz-Band wird von allen Geräten unterstützt, ist aber tendenziell "
" stärker mit Interferenzen belastet. Das 5-GHz-Band ist ein neuerer " "stärker mit Interferenzen belastet. Das 5-GHz-Band ist ein neuerer Standard, "
"Standard, der möglicherweise nicht von allen Ihren Geräten unterstützt " "der möglicherweise nicht von allen Ihren Geräten unterstützt wird. Es hat in "
"wird. Es hat in der Regel weniger Interferenzen, aber das Signal trägt " "der Regel weniger Interferenzen, aber das Signal trägt nicht so gut in "
"nicht so gut in Innenräumen." "Innenräumen."
#: src/common/WiFiSettings/constants.js:43 #: src/common/WiFiSettings/constants.js:43
msgid "" msgid ""
"Change this to adjust 802.11n/ac/ax mode of operation. 802.11n with 40 " "Change this to adjust 802.11n/ac/ax mode of operation. 802.11n with 40 MHz "
"MHz wide channels can yield higher throughput but can cause more " "wide channels can yield higher throughput but can cause more interference in "
"interference in the network. If you don't know what to choose, use the " "the network. If you don't know what to choose, use the default option with "
"default option with 20 MHz wide channel." "20 MHz wide channel."
msgstr "" msgstr ""
"Ändern Sie diese Option, um den 802.11n/ac/ax-Betriebsmodus anzupassen. " "Ändern Sie diese Option, um den 802.11n/ac/ax-Betriebsmodus anzupassen. 40 "
"40 MHz breite Kanäle können bei 802.11n mehr Daten transportieren, jedoch" "MHz breite Kanäle können bei 802.11n mehr Daten transportieren, jedoch zu "
" zu mehr Interferenzen im Netzwerk führen. Wenn Sie nicht wissen, was Sie" "mehr Interferenzen im Netzwerk führen. Wenn Sie nicht wissen, was Sie wählen "
" wählen sollen, verwenden Sie die Voreinstellung mit 20 MHz Kanalbreite." "sollen, verwenden Sie die Voreinstellung mit 20 MHz Kanalbreite."
#: src/common/WiFiSettings/constants.js:46 #: src/common/WiFiSettings/constants.js:46
msgid "" msgid ""
"Enables Wi-Fi for guests, which is separated from LAN network. Devices " "Enables Wi-Fi for guests, which is separated from LAN network. Devices "
"connected to this network are allowed to access the internet, but aren't " "connected to this network are allowed to access the internet, but aren't "
"allowed to access other devices and the configuration interface of the " "allowed to access other devices and the configuration interface of the "
"router. Parameters of the guest network can be set in the Guest network " "router. Parameters of the guest network can be set in the Guest network tab."
"tab."
msgstr "" msgstr ""
"Ermöglicht ein Wi-Fi für Gäste, das vom LAN-Netzwerk getrennt ist. " "Ermöglicht ein Wi-Fi für Gäste, das vom LAN-Netzwerk getrennt ist. Geräte, "
"Geräte, die mit diesem Netzwerk verbunden sind, dürfen auf das Internet " "die mit diesem Netzwerk verbunden sind, dürfen auf das Internet zugreifen, "
"zugreifen, nicht jedoch auf andere Geräte oder die " "nicht jedoch auf andere Geräte oder die Konfigurationsschnittstelle des "
"Konfigurationsschnittstelle des Routers. Die Parameter des Gastnetzwerks " "Routers. Die Parameter des Gastnetzwerks können auf der Gastnetzwerk-"
"können auf der Gastnetzwerk-Registerkarte eingestellt werden." "Registerkarte eingestellt werden."
#: src/common/WiFiSettings/constants.js:49 #: src/common/WiFiSettings/constants.js:49
msgid "" msgid ""
"The WPA3 standard is the new most secure encryption method that is " "The WPA3 standard is the new most secure encryption method that is suggested "
"suggested to be used with any device that supports it. The older devices " "to be used with any device that supports it. The older devices without WPA3 "
"without WPA3 support require older WPA2. If you experience issues with " "support require older WPA2. If you experience issues with connecting older "
"connecting older devices, try to enable WPA2." "devices, try to enable WPA2."
msgstr "" msgstr ""
"Der WPA3-Standard ist die neue Verschlüsselungsmethode mit der besten " "Der WPA3-Standard ist die neue Verschlüsselungsmethode mit der besten "
"Sicherheit. Er empfiehlt sich für jedes Gerät, das ihn unterstützt, aber " "Sicherheit. Er empfiehlt sich für jedes Gerät, das ihn unterstützt, aber "
"ältere Geräte, bei denen das noch nicht der Fall ist, müssen auf das " "ältere Geräte, bei denen das noch nicht der Fall ist, müssen auf das ältere "
"ältere WPA2 ausweichen. Falls Sie Probleme dabei haben, ältere Geräte mit" "WPA2 ausweichen. Falls Sie Probleme dabei haben, ältere Geräte mit dem WLAN "
" dem WLAN zu verbinden, schalten Sie versuchsweise WPA2 ein." "zu verbinden, schalten Sie versuchsweise WPA2 ein."
#: src/form/components/ForisForm.js:121 #: src/form/components/ForisForm.js:121
msgid "Settings saved successfully" msgid "Settings saved successfully"
@ -415,34 +414,25 @@ msgstr "Dies ist keine gültige MAC-Adresse."
msgid "Doesn't contain a list of emails separated by commas." msgid "Doesn't contain a list of emails separated by commas."
msgstr "Enthält keine Liste von E-Mails, die durch Kommas getrennt sind." msgstr "Enthält keine Liste von E-Mails, die durch Kommas getrennt sind."
#~ msgid "An unknown error occurred. Check the console for more info." #: src/common/RebootButton.js:27
#~ msgstr "" msgid "Reboot request failed."
msgstr "Neustart-Einleitung fehlgeschlagen."
#~ msgid "Reboot confirmation" #: src/common/RebootButton.js:51
#~ msgstr "" msgid "Reboot"
msgstr "Systemneustart"
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr "Warnung!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr "Sind Sie sicher, dass Sie den Router neu starten wollen?"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr "Neustart bestätigen"
#~ msgid "Enable" #~ msgid "Enable"
#~ msgstr "Aktivieren" #~ msgstr "Aktivieren"
#~ msgid ""
#~ "\n"
#~ "If a number of wireless cards "
#~ "doesn't match, you may try to "
#~ "reset the Wi-Fi settings. Note "
#~ "that this will remove the\n"
#~ "current Wi-Fi configuration and restore the default values.\n"
#~ " "
#~ msgstr ""
#~ msgid "Reboot request failed."
#~ msgstr "Neustart-Einleitung fehlgeschlagen."
#~ msgid "Reboot"
#~ msgstr "Systemneustart"
#~ msgid "Warning!"
#~ msgstr "Warnung!"
#~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Sind Sie sicher, dass Sie den Router neu starten wollen?"

View File

@ -8,15 +8,16 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n" "POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2021-02-09 16:50+0000\n" "PO-Revision-Date: 2025-01-18 11:00+0000\n"
"Last-Translator: Michalis <michalisntovas@yahoo.gr>\n" "Last-Translator: Thanasis <thanasakis11mail@gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/turris/foris-js/el/"
">\n"
"Language: el\n" "Language: el\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/turris/foris-"
"js/el/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10-dev\n"
"Generated-By: Babel 2.16.0\n" "Generated-By: Babel 2.16.0\n"
#: src/api/utils.js:61 #: src/api/utils.js:61
@ -38,7 +39,7 @@ msgstr ""
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101 #: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89 #: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close" msgid "Close"
msgstr "" msgstr "Κλείσιμο"
#: src/bootstrap/CopyInput.js:56 #: src/bootstrap/CopyInput.js:56
msgid "Copied!" msgid "Copied!"
@ -179,7 +180,7 @@ msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:303 #: src/common/WiFiSettings/WiFiForm.js:303
msgid "Custom" msgid "Custom"
msgstr "" msgstr "Προσαρμοσμένο"
#: src/common/WiFiSettings/WiFiGuestForm.js:43 #: src/common/WiFiSettings/WiFiGuestForm.js:43
msgid "Enable Guest Wi-Fi" msgid "Enable Guest Wi-Fi"
@ -225,7 +226,7 @@ msgstr ""
#: src/common/WiFiSettings/constants.js:9 #: src/common/WiFiSettings/constants.js:9
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr "Απενεργοποιημένο"
#: src/common/WiFiSettings/constants.js:10 #: src/common/WiFiSettings/constants.js:10
msgid "802.11n - 20 MHz wide channel" msgid "802.11n - 20 MHz wide channel"
@ -483,4 +484,3 @@ msgstr ""
#~ msgid "Are you sure you want to restart the router?" #~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Είστε βέβαιοι ότι θέλετε να κάνετε επανεκκίνηση του δρομολογητή;" #~ msgstr "Είστε βέβαιοι ότι θέλετε να κάνετε επανεκκίνηση του δρομολογητή;"

View File

@ -8,15 +8,16 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n" "POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2024-07-27 01:09+0000\n" "PO-Revision-Date: 2024-12-14 10:00+0000\n"
"Last-Translator: Moha684 <nahil82466@gmail.com>\n" "Last-Translator: ButterflyOfFire <boffire@users.noreply.hosted.weblate.org>\n"
"Language-Team: French <https://hosted.weblate.org/projects/turris/foris-js/"
"fr/>\n"
"Language: fr\n" "Language: fr\n"
"Language-Team: French <https://hosted.weblate.org/projects/turris/foris-"
"js/fr/>\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.9-rc\n"
"Generated-By: Babel 2.16.0\n" "Generated-By: Babel 2.16.0\n"
#: src/api/utils.js:61 #: src/api/utils.js:61
@ -38,7 +39,7 @@ msgstr "Une erreur dAPI inconnue sest produite."
#: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101 #: src/bootstrap/Alert.js:73 src/bootstrap/Modal.js:101
#: src/common/WiFiSettings/WiFiQRCode.js:89 #: src/common/WiFiSettings/WiFiQRCode.js:89
msgid "Close" msgid "Close"
msgstr "" msgstr "Fermer"
#: src/bootstrap/CopyInput.js:56 #: src/bootstrap/CopyInput.js:56
msgid "Copied!" msgid "Copied!"
@ -49,13 +50,12 @@ msgid "Copy"
msgstr "Copier" msgstr "Copier"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Action successful." msgid "Action successful."
msgstr "Paramètres enregistrés avec succès" msgstr "Paramètres enregistrés avec succès."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed." msgid "Action failed."
msgstr "" msgstr "L'enregistrement des paramètres a échoué."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel" msgid "Cancel"
@ -84,39 +84,39 @@ msgstr ""
#: src/common/RichTable/RichTablePagination.js:71 #: src/common/RichTable/RichTablePagination.js:71
msgid "First page" msgid "First page"
msgstr "" msgstr "Première page"
#: src/common/RichTable/RichTablePagination.js:77 #: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page" msgid "Previous page"
msgstr "" msgstr "Page précédente"
#: src/common/RichTable/RichTablePagination.js:83 #: src/common/RichTable/RichTablePagination.js:83
msgid "Next page" msgid "Next page"
msgstr "" msgstr "Page suivante"
#: src/common/RichTable/RichTablePagination.js:89 #: src/common/RichTable/RichTablePagination.js:89
msgid "Last page" msgid "Last page"
msgstr "" msgstr "Dernière page"
#: src/common/RichTable/RichTablePagination.js:95 #: src/common/RichTable/RichTablePagination.js:95
msgid "Page" msgid "Page"
msgstr "" msgstr "Page"
#: src/common/RichTable/RichTablePagination.js:98 #: src/common/RichTable/RichTablePagination.js:98
msgid "of" msgid "of"
msgstr "" msgstr "de"
#: src/common/RichTable/RichTablePagination.js:106 #: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:" msgid "Rows per page:"
msgstr "" msgstr "Lignes par page :"
#: src/common/RichTable/RichTablePagination.js:109 #: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page" msgid "Select rows per page"
msgstr "" msgstr "Sélectionnez les lignes par page"
#: src/common/RichTable/RichTablePagination.js:121 #: src/common/RichTable/RichTablePagination.js:121
msgid "All" msgid "All"
msgstr "" msgstr "Tout"
#: src/common/WiFiSettings/ResetWiFiSettings.js:39 #: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings." msgid "An error occurred during resetting Wi-Fi settings."
@ -473,4 +473,3 @@ msgstr ""
#~ msgid "Are you sure you want to restart the router?" #~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Voulez-vous vraiment redémarrer le routeur ?" #~ msgstr "Voulez-vous vraiment redémarrer le routeur ?"

View File

@ -8,15 +8,16 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-11-13 14:06+0100\n" "POT-Creation-Date: 2024-11-13 14:06+0100\n"
"PO-Revision-Date: 2024-09-09 18:09+0000\n" "PO-Revision-Date: 2024-12-14 10:00+0000\n"
"Last-Translator: Atec <dr.atec@gmail.com>\n" "Last-Translator: Atec <dr.atec@gmail.com>\n"
"Language-Team: Slovak <https://hosted.weblate.org/projects/turris/foris-js/"
"sk/>\n"
"Language: sk\n" "Language: sk\n"
"Language-Team: Slovak <https://hosted.weblate.org/projects/turris/foris-"
"js/sk/>\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"X-Generator: Weblate 5.9-rc\n"
"Generated-By: Babel 2.16.0\n" "Generated-By: Babel 2.16.0\n"
#: src/api/utils.js:61 #: src/api/utils.js:61
@ -49,74 +50,72 @@ msgid "Copy"
msgstr "Kopírovať" msgstr "Kopírovať"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:60
#, fuzzy
msgid "Action successful." msgid "Action successful."
msgstr "Nastavenia boli úspešne uložené" msgstr "Akcia úspešná."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:65
msgid "Action failed." msgid "Action failed."
msgstr "" msgstr "Akcia neúspešná."
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:125
msgid "Cancel" msgid "Cancel"
msgstr "Zrušiť" msgstr "Zrušiť"
#: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128 #: src/common/ActionButtonWithModal/ActionButtonWithModal.js:128
#, fuzzy
msgid "Confirm" msgid "Confirm"
msgstr "Potvrdiť reštart" msgstr "Potvrdiť"
#: src/common/RichTable/RichTableHeader.js:29 #: src/common/RichTable/RichTableHeader.js:29
msgid "Sort ascending" msgid "Sort ascending"
msgstr "" msgstr "Zoradiť vzostupne"
#: src/common/RichTable/RichTableHeader.js:30 #: src/common/RichTable/RichTableHeader.js:30
msgid "Sort descending" msgid "Sort descending"
msgstr "" msgstr "Zoradiť zostupne"
#: src/common/RichTable/RichTableHeader.js:31 #: src/common/RichTable/RichTableHeader.js:31
msgid "Clear sort" msgid "Clear sort"
msgstr "" msgstr "Vymazať zoradenie"
#: src/common/RichTable/RichTablePagination.js:65 #: src/common/RichTable/RichTablePagination.js:65
msgid "Pagination navigation bar" msgid "Pagination navigation bar"
msgstr "" msgstr "Navigačný pás stránkovania"
#: src/common/RichTable/RichTablePagination.js:71 #: src/common/RichTable/RichTablePagination.js:71
msgid "First page" msgid "First page"
msgstr "" msgstr "Prvá strana"
#: src/common/RichTable/RichTablePagination.js:77 #: src/common/RichTable/RichTablePagination.js:77
msgid "Previous page" msgid "Previous page"
msgstr "" msgstr "Predchádzajúca strana"
#: src/common/RichTable/RichTablePagination.js:83 #: src/common/RichTable/RichTablePagination.js:83
msgid "Next page" msgid "Next page"
msgstr "" msgstr "Nasledujúca strana"
#: src/common/RichTable/RichTablePagination.js:89 #: src/common/RichTable/RichTablePagination.js:89
msgid "Last page" msgid "Last page"
msgstr "" msgstr "Posledná strana"
#: src/common/RichTable/RichTablePagination.js:95 #: src/common/RichTable/RichTablePagination.js:95
msgid "Page" msgid "Page"
msgstr "" msgstr "Strana"
#: src/common/RichTable/RichTablePagination.js:98 #: src/common/RichTable/RichTablePagination.js:98
msgid "of" msgid "of"
msgstr "" msgstr "z"
#: src/common/RichTable/RichTablePagination.js:106 #: src/common/RichTable/RichTablePagination.js:106
msgid "Rows per page:" msgid "Rows per page:"
msgstr "" msgstr "Počet riadkov na stranu:"
#: src/common/RichTable/RichTablePagination.js:109 #: src/common/RichTable/RichTablePagination.js:109
msgid "Select rows per page" msgid "Select rows per page"
msgstr "" msgstr "Vyberte počet riadkov na stranu"
#: src/common/RichTable/RichTablePagination.js:121 #: src/common/RichTable/RichTablePagination.js:121
msgid "All" msgid "All"
msgstr "" msgstr "Všetky"
#: src/common/WiFiSettings/ResetWiFiSettings.js:39 #: src/common/WiFiSettings/ResetWiFiSettings.js:39
msgid "An error occurred during resetting Wi-Fi settings." msgid "An error occurred during resetting Wi-Fi settings."
@ -447,4 +446,3 @@ msgstr "Neobsahuje zoznam e-mailov oddelených čiarkami."
#~ msgid "Are you sure you want to restart the router?" #~ msgid "Are you sure you want to restart the router?"
#~ msgstr "Naozaj sa má router reštartovať?" #~ msgstr "Naozaj sa má router reštartovať?"