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

Compare commits

..

27 Commits

Author SHA1 Message Date
6bd809222c fixup! Update Bootstrap library to version 5.3.x 2024-04-23 15:24:50 +02:00
c008d7bcc7 Update Bootstrap library to version 5.3.x 2024-04-19 16:09:03 +02:00
96785f0774 Merge branch 'fix-fullscreen-spinner' into 'dev'
Update Spinner.css styles for better positioning and responsiveness

See merge request turris/reforis/foris-js!216
2024-04-10 15:35:27 +02:00
7823bff6d9 Update Spinner.css styles for better positioning and responsiveness 2024-04-10 14:46:18 +02:00
0fd7c08188 Merge branch 'update-dependencies' into 'dev'
Bump v5.6.1

See merge request turris/reforis/foris-js!213
2024-01-19 19:33:46 +01:00
32630601c2 Bump v5.6.1
* Added & updated Weblate translations
* Fixed loading state & button's layout
* Updated bootstrap library to version 4.6.2
* Used custom reforis-image in GitLab CI/CD
* NPM audit fix
2024-01-19 21:15:50 +03:00
03aad5498a gitlab-ci: Use custom reforis-image 2024-01-19 21:15:50 +03:00
2f2b812ddb NPM audit fix 2024-01-19 21:02:04 +03:00
c0bcd46b2b Update bootstrap library to version 4.6.2 2024-01-19 20:49:13 +03:00
68ea8cf460 Merge branch 'update-translations' into 'dev'
Add & update Weblate translations

See merge request turris/reforis/foris-js!214
2024-01-19 18:41:57 +01:00
79fe68dba3 Translated using Weblate (Dutch)
Currently translated at 26.0% (18 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/nl/
2024-01-04 22:08:39 +01:00
683a8736a6 Translated using Weblate (German)
Currently translated at 100.0% (69 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/de/
2024-01-04 22:08:39 +01:00
6631d4847b Translated using Weblate (Czech)
Currently translated at 100.0% (69 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/cs/
2023-11-23 17:03:52 +01:00
8887d0d68e Translated using Weblate (Czech)
Currently translated at 100.0% (69 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/cs/
2023-09-26 11:59:23 +00:00
390e4bdce8 Merge branch 'translations-september-2023' into 'master' 2023-09-25 14:52:27 +02:00
5232b55cf6 Translated using Weblate (Swedish)
Currently translated at 57.9% (40 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/sv/
2023-09-22 21:00:08 +00:00
5823012c6e Translated using Weblate (German)
Currently translated at 98.5% (68 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/de/
2023-08-13 12:47:51 +02:00
e907a3a21f Translated using Weblate (German)
Currently translated at 63.7% (44 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/de/
2023-04-24 16:49:38 +02:00
9e4cb4b417 Translated using Weblate (Czech)
Currently translated at 76.8% (53 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/cs/
2023-04-16 15:52:11 +02:00
55f4d2ff15 Translated using Weblate (Polish)
Currently translated at 36.2% (25 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/pl/
2023-03-07 17:37:51 +01:00
6b464783ed Translated using Weblate (Czech)
Currently translated at 72.4% (50 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/cs/
2023-03-03 14:40:04 +01:00
85ba270135 Translated using Weblate (Norwegian Bokmål)
Currently translated at 73.9% (51 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/nb_NO/
2023-03-02 12:40:09 +01:00
80619fab3c Merge branch 'fix-button-spinner' into 'dev'
Button: Fix loading state & button's layout

See merge request turris/reforis/foris-js!211
2023-02-15 18:55:02 +01:00
a1a47e0d0f Update Snapshots 2023-01-24 19:41:54 +01:00
d49ff0150c Button: Fix loading state & button's layout 2023-01-24 19:41:53 +01:00
a0f42906f5 Translated using Weblate (Slovak)
Currently translated at 100.0% (69 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/sk/
2023-01-17 23:51:47 +01:00
bc1b6e7877 Translated using Weblate (Italian)
Currently translated at 4.3% (3 of 69 strings)

Translation: Turris/Foris JS
Translate-URL: https://hosted.weblate.org/projects/turris/foris-js/it/
2023-01-01 00:48:44 +01:00
34 changed files with 1069 additions and 1060 deletions

View File

@ -1,4 +1,4 @@
image: node:16-alpine
image: registry.nic.cz/turris/reforis/reforis/reforis-image
stages:
- test
@ -6,7 +6,7 @@ stages:
- publish
before_script:
- apk add make
- apt-get update && apt-get install -y make
- npm install
test:

1350
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "foris",
"version": "5.6.0",
"version": "5.6.1",
"description": "Foris JS library is a set of components and utils for reForis application and plugins.",
"author": "CZ.NIC, z.s.p.o.",
"repository": {
@ -22,7 +22,7 @@
"react-uid": "^2.2.0"
},
"peerDependencies": {
"bootstrap": "4.4.1",
"bootstrap": "^5.3.3",
"prop-types": "15.8.1",
"react": "16.9.0",
"react-dom": "16.9.0",
@ -34,11 +34,11 @@
"@babel/plugin-transform-runtime": "^7.9.0",
"@babel/preset-env": "^7.9.0",
"@babel/preset-react": "^7.9.4",
"@fortawesome/fontawesome-free": "^5.13.0",
"@fortawesome/fontawesome-free": "^6.5.2",
"@testing-library/react": "^8.0.9",
"babel-loader": "^8.1.0",
"babel-polyfill": "^6.26.0",
"bootstrap": "^4.5.0",
"bootstrap": "^5.3.3",
"css-loader": "^5.2.4",
"eslint": "^6.8.0",
"eslint-config-prettier": "^6.11.0",

View File

@ -38,16 +38,17 @@ Alert.defaultProps = {
export function Alert({ type, onDismiss, children }) {
return (
<div
className={`alert ${
className={`alert alert-${type} ${
onDismiss ? "alert-dismissible" : ""
} alert-${type}`}
}`.trim()}
>
{onDismiss ? (
<button type="button" className="close" onClick={onDismiss}>
&times;
</button>
) : (
false
{onDismiss && (
<button
type="button"
className="btn-close"
onClick={onDismiss}
aria-label={_("Close")}
/>
)}
{children}
</div>

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/)
* Copyright (C) 2019-2023 CZ.NIC z.s.p.o. (https://www.nic.cz/)
*
* This is free software, licensed under the GNU General Public License v3.
* See /LICENSE for more information.
@ -31,24 +31,25 @@ export function Button({
children,
...props
}) {
let buttonClass = className ? `btn ${className}` : "btn btn-primary ";
let buttonClass = className ? `btn ${className}` : "btn btn-primary";
if (forisFormSize) {
buttonClass = `${buttonClass} col-sm-12 col-md-3 col-lg-2`;
buttonClass = `${buttonClass} col-12 col-md-3 col-lg-2`;
}
const span = loading ? (
<span
className="spinner-border spinner-border-sm"
role="status"
aria-hidden="true"
/>
) : null;
return (
<button type="button" className={buttonClass} {...props}>
{span}
{span ? " " : null}
{children}
<button
type="button"
className={`${buttonClass} d-inline-flex justify-content-center align-items-center`}
{...props}
>
{loading && (
<span
className="spinner-border spinner-border-sm me-1"
role="status"
aria-hidden="true"
/>
)}
<span>{children}</span>
</button>
);
}

View File

@ -24,25 +24,24 @@ CheckBox.defaultProps = {
export function CheckBox({ label, helpText, disabled, ...props }) {
const uid = useUID();
return (
<div className="form-group">
<div className="custom-control custom-checkbox ">
<input
className="custom-control-input"
type="checkbox"
id={uid}
disabled={disabled}
{...props}
/>
<label className="custom-control-label" htmlFor={uid}>
{label}
{helpText && (
<small className="form-text text-muted">
{helpText}
</small>
)}
</label>
</div>
<div className="mb-3 form-check">
<input
className="form-check-input"
type="checkbox"
id={uid}
disabled={disabled}
{...props}
/>
<label className="form-check-label" htmlFor={uid}>
{label}
</label>
{helpText && (
<div className="form-text">
<small>{helpText}</small>
</div>
)}
</div>
);
}

View File

@ -27,18 +27,21 @@ export const Input = forwardRef(
) => {
const uid = useUID();
const inputClassName = `form-control ${className || ""} ${
const inputClassName = `${className || ""} ${
error ? "is-invalid" : ""
}`.trim();
return (
<div className="form-group">
<label className={labelClassName} htmlFor={uid}>
<div className="mb-3">
<label
className={`form-label ${labelClassName || ""}`.trim()}
htmlFor={uid}
>
{label}
</label>
<div className={`input-group ${groupClassName || ""}`.trim()}>
<input
className={inputClassName}
className={`form-control ${inputClassName}`.trim()}
type={type}
id={uid}
ref={ref}
@ -46,10 +49,12 @@ export const Input = forwardRef(
/>
{children}
</div>
{error ? <div className="invalid-feedback">{error}</div> : null}
{helpText ? (
<small className="form-text text-muted">{helpText}</small>
) : null}
{error && <div className="invalid-feedback">{error}</div>}
{helpText && (
<div className="form-text">
<small>{helpText}</small>
</div>
)}
</div>
);
}

View File

@ -92,11 +92,10 @@ export function ModalHeader({ setShown, title }) {
<h5 className="modal-title">{title}</h5>
<button
type="button"
className="close"
className="btn-close"
onClick={() => setShown(false)}
>
<span aria-hidden="true">&times;</span>
</button>
aria-label={_("Close")}
/>
</div>
);
}

View File

@ -23,7 +23,7 @@ NumberInput.propTypes = {
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
/** Function called when value changes. */
onChange: PropTypes.func.isRequired,
/** Additional description dispaled to the right of input value. */
/** Additional description displayed to the right of input value. */
inlineText: PropTypes.string,
};
@ -49,27 +49,27 @@ export function NumberInput({ onChange, inlineText, value, ...props }) {
return (
<Input type="number" onChange={onChange} value={value} {...props}>
<div className="input-group-append">
{inlineText && <p className="input-group-text">{inlineText}</p>}
<button
type="button"
className="btn btn-outline-secondary"
onMouseDown={() => enableIncrease(true)}
onMouseUp={() => enableIncrease(false)}
aria-label="Increase"
>
<i className="fas fa-plus" />
</button>
<button
type="button"
className="btn btn-outline-secondary"
onMouseDown={() => enableDecrease(true)}
onMouseUp={() => enableDecrease(false)}
aria-label="Decrease"
>
<i className="fas fa-minus" />
</button>
</div>
{inlineText && (
<span className="input-group-text">{inlineText}</span>
)}
<button
type="button"
className="btn btn-outline-secondary"
onMouseDown={() => enableIncrease(true)}
onMouseUp={() => enableIncrease(false)}
aria-label="Increase"
>
<i className="fas fa-plus" />
</button>
<button
type="button"
className="btn btn-outline-secondary"
onMouseDown={() => enableDecrease(true)}
onMouseUp={() => enableDecrease(false)}
aria-label="Decrease"
>
<i className="fas fa-minus" />
</button>
</Input>
);
}

View File

@ -34,24 +34,20 @@ export function PasswordInput({ withEye, newPass, ...props }) {
autoComplete={newPass ? "new-password" : "current-password"}
{...props}
>
{withEye ? (
<div className="input-group-append">
<button
type="button"
className="input-group-text"
onClick={(e) => {
e.preventDefault();
setHidden((shouldBeHidden) => !shouldBeHidden);
}}
>
<i
className={`fa ${
isHidden ? "fa-eye" : "fa-eye-slash"
}`}
/>
</button>
</div>
) : null}
{withEye && (
<button
type="button"
className="input-group-text"
onClick={(e) => {
e.preventDefault();
setHidden((shouldBeHidden) => !shouldBeHidden);
}}
>
<i
className={`fa ${isHidden ? "fa-eye" : "fa-eye-slash"}`}
/>
</button>
)}
</Input>
);
}

View File

@ -17,7 +17,7 @@ RadioSet.propTypes = {
/** Choices . */
choices: PropTypes.arrayOf(
PropTypes.shape({
/** Choice lable . */
/** Choice label . */
label: PropTypes.oneOfType([
PropTypes.string,
PropTypes.element,
@ -64,7 +64,7 @@ export function RadioSet({
});
return (
<div className="form-group">
<div className="mb-3">
{label && (
<label htmlFor={uid} className="d-block">
{label}
@ -72,7 +72,9 @@ export function RadioSet({
)}
{radios}
{helpText && (
<small className="form-text text-muted">{helpText}</small>
<div className="form-text">
<small>{helpText}</small>
</div>
)}
</div>
);
@ -94,24 +96,24 @@ export function Radio({ label, id, helpText, inline, ...props }) {
return (
<>
<div
className={`custom-control custom-radio ${
inline ? "custom-control-inline" : ""
className={`mb-2 ${
inline ? "form-check form-check-inline" : ""
}`.trim()}
>
<input
id={id}
className="custom-control-input"
className="form-check-input me-2"
type="radio"
{...props}
/>
<label className="custom-control-label" htmlFor={id}>
<label className="form-check-label" htmlFor={id}>
{label}
{helpText && (
<div className="form-text">
<small>{helpText}</small>
</div>
)}
</label>
{helpText && (
<small className="form-text text-muted mt-0 mb-3">
{helpText}
</small>
)}
</div>
</>
);

View File

@ -30,14 +30,18 @@ export function Select({ label, choices, helpText, ...props }) {
));
return (
<div className="form-group">
<label htmlFor={uid}>{label}</label>
<select className="custom-select" id={uid} {...props}>
<div className="mb-3">
<label className="form-label" htmlFor={uid}>
{label}
</label>
<select className="form-select" id={uid} {...props}>
{options}
</select>
{helpText ? (
<small className="form-text text-muted">{helpText}</small>
) : null}
{helpText && (
<div className="form-text">
<small>{helpText}</small>
</div>
)}
</div>
);
}

View File

@ -1,3 +1,11 @@
.spinner-fs-wrapper {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 1101; /* increase z-index by 1 to ensure it's on top of spinner-fs-background */
}
.spinner-wrapper .spinner-border {
width: 4rem;
height: 4rem;
@ -7,10 +15,8 @@
.spinner-fs-background {
background-color: rgba(2, 2, 2, 0.5);
color: rgb(230, 230, 230);
position: fixed;
width: 100%;
height: 100%;
top: 0;
width: 100vw;
height: 100vh;
display: flex;
align-items: center;
@ -31,3 +37,7 @@
.spinner-fs-wrapper .spinner-text {
margin: 1rem;
}
.spinner-border-sm {
min-width: 16px;
}

View File

@ -16,7 +16,7 @@ Spinner.propTypes = {
PropTypes.arrayOf(PropTypes.node),
PropTypes.node,
]),
/** Render component with full-screen mode (using apropriate `.css` styles) */
/** Render component with full-screen mode (using appropriate `.css` styles) */
fullScreen: PropTypes.bool.isRequired,
className: PropTypes.string,
};

View File

@ -22,28 +22,30 @@ Switch.propTypes = {
export function Switch({ label, helpText, switchHeading, ...props }) {
const uid = useUID();
return (
<div className={`form-group ${switchHeading ? "switch" : ""}`.trim()}>
<div
className={`custom-control custom-switch ${
!helpText ? "custom-control-inline" : ""
} ${switchHeading ? "switch-heading" : ""}`.trim()}
>
<input
type="checkbox"
className="custom-control-input"
id={uid}
{...props}
/>
<label className="custom-control-label" htmlFor={uid}>
{label}
</label>
{helpText && (
<small className="form-text text-muted mt-0 mb-3">
{helpText}
</small>
)}
</div>
<div
className={`form-check form-switch mb-3 ${
switchHeading ? "d-flex align-items-center" : null
}`.trim()}
>
<input
type="checkbox"
className={`form-check-input ${
switchHeading ? "me-2" : ""
}`.trim()}
role="switch"
id={uid}
{...props}
/>
<label className="form-check-label" htmlFor={uid}>
{label}
</label>
{helpText && (
<div className="form-text">
<small>{helpText}</small>
</div>
)}
</div>
);
}

0
src/bootstrap/Tooltip.js Normal file
View File

View File

@ -2,33 +2,38 @@
exports[`<Button /> Render button correctly 1`] = `
<button
class="btn btn-primary "
class="btn btn-primary d-inline-flex justify-content-center align-items-center"
type="button"
>
Test Button
<span>
Test Button
</span>
</button>
`;
exports[`<Button /> Render button with custom classes 1`] = `
<button
class="btn one two three"
class="btn one two three d-inline-flex justify-content-center align-items-center"
type="button"
>
Test Button
<span>
Test Button
</span>
</button>
`;
exports[`<Button /> Render button with spinner 1`] = `
<button
class="btn btn-primary "
class="btn btn-primary d-inline-flex justify-content-center align-items-center"
type="button"
>
<span
aria-hidden="true"
class="spinner-border spinner-border-sm"
class="spinner-border spinner-border-sm me-1"
role="status"
/>
Test Button
<span>
Test Button
</span>
</button>
`;

View File

@ -58,7 +58,7 @@ export function ResetWiFiSettings({ ws, endpoint }) {
"If a number of wireless cards doesn't match, you may try to reset the Wi-Fi settings. Note that this will remove the current Wi-Fi configuration and restore the default values."
)}
</p>
<div className="text-right">
<div className="text-end">
<Button
className="btn-primary"
forisFormSize

View File

@ -92,7 +92,7 @@ function DeviceForm({
return (
<>
<Switch
label={<h2>{_(`Wi-Fi ${deviceID + 1}`)}</h2>}
label={<h2 className="mb-0">{_(`Wi-Fi ${deviceID + 1}`)}</h2>}
checked={formData.enabled}
onChange={setFormValue((value) => ({
devices: {
@ -119,12 +119,10 @@ function DeviceForm({
}))}
{...props}
>
<div className="input-group-append">
<WiFiQRCode
SSID={formData.SSID}
password={formData.password}
/>
</div>
<WiFiQRCode
SSID={formData.SSID}
password={formData.password}
/>
</TextInput>
<PasswordInput

View File

@ -87,7 +87,7 @@ function QRCodeModal({ shown, setShown, SSID, password }) {
createAndDownloadPdf(SSID, password);
}}
>
<i className="fas fa-arrow-down mr-2" />
<i className="fas fa-file-download me-2" />
{_("Download PDF")}
</Button>
</ModalFooter>

View File

@ -298,13 +298,15 @@ exports[`<WiFiSettings/> Snapshot both modules disabled. 1`] = `
</div>
</div>
<div
class="text-right"
class="text-end"
>
<button
class="btn btn-primary col-sm-12 col-md-3 col-lg-2"
class="btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center"
type="submit"
>
Save
<span>
Save
</span>
</button>
</div>
</form>
@ -319,13 +321,15 @@ exports[`<WiFiSettings/> Snapshot both modules disabled. 1`] = `
If a number of wireless cards doesn't match, you may try to reset the Wi-Fi settings. Note that this will remove the current Wi-Fi configuration and restore the default values.
</p>
<div
class="text-right"
class="text-end"
>
<button
class="btn btn-primary col-sm-12 col-md-3 col-lg-2"
class="btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center"
type="button"
>
Reset Wi-Fi Settings
<span>
Reset Wi-Fi Settings
</span>
</button>
</div>
</div>
@ -432,16 +436,16 @@ exports[`<WiFiSettings/> Snapshot guest network. 1`] = `
<div
@@ -551,10 +633,11 @@
<div
class=\\"text-right\\"
class=\\"text-end\\"
>
<button
class=\\"btn btn-primary col-sm-12 col-md-3 col-lg-2\\"
class=\\"btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center\\"
+ disabled=\\"\\"
type=\\"submit\\"
>
Save
</button>
</div>"
<span>
Save
</span>"
`;
exports[`<WiFiSettings/> Snapshot one module enabled. 1`] = `

View File

@ -46,16 +46,20 @@ exports[`<RebootButton/> Render modal. 1`] = `
class="modal-footer"
>
<button
class="btn btn-primary "
class="btn btn-primary d-inline-flex justify-content-center align-items-center"
type="button"
>
Cancel
<span>
Cancel
</span>
</button>
<button
class="btn btn-danger"
class="btn btn-danger d-inline-flex justify-content-center align-items-center"
type="button"
>
Confirm reboot
<span>
Confirm reboot
</span>
</button>
</div>
</div>
@ -63,10 +67,12 @@ exports[`<RebootButton/> Render modal. 1`] = `
</div>
</div>
<button
class="btn btn-danger"
class="btn btn-danger d-inline-flex justify-content-center align-items-center"
type="button"
>
Reboot
<span>
Reboot
</span>
</button>
</div>
`;
@ -77,10 +83,12 @@ exports[`<RebootButton/> Render. 1`] = `
id="modal-container"
/>
<button
class="btn btn-danger"
class="btn btn-danger d-inline-flex justify-content-center align-items-center"
type="button"
>
Reboot
<span>
Reboot
</span>
</button>
</div>
`;

View File

@ -3,17 +3,18 @@
exports[`<SubmitButton/> Render load 1`] = `
<div>
<button
class="btn btn-primary col-sm-12 col-md-3 col-lg-2"
class="btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center"
disabled=""
type="submit"
>
<span
aria-hidden="true"
class="spinner-border spinner-border-sm"
class="spinner-border spinner-border-sm me-1"
role="status"
/>
Load settings
<span>
Load settings
</span>
</button>
</div>
`;
@ -21,10 +22,12 @@ exports[`<SubmitButton/> Render load 1`] = `
exports[`<SubmitButton/> Render ready 1`] = `
<div>
<button
class="btn btn-primary col-sm-12 col-md-3 col-lg-2"
class="btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center"
type="submit"
>
Save
<span>
Save
</span>
</button>
</div>
`;
@ -32,17 +35,18 @@ exports[`<SubmitButton/> Render ready 1`] = `
exports[`<SubmitButton/> Render saving 1`] = `
<div>
<button
class="btn btn-primary col-sm-12 col-md-3 col-lg-2"
class="btn btn-primary col-sm-12 col-md-3 col-lg-2 d-inline-flex justify-content-center align-items-center"
disabled=""
type="submit"
>
<span
aria-hidden="true"
class="spinner-border spinner-border-sm"
class="spinner-border spinner-border-sm me-1"
role="status"
/>
Updating
<span>
Updating
</span>
</button>
</div>
`;

View File

@ -190,7 +190,7 @@ export function ForisForm({
<Prompt message={getMessageOnLeavingPage} />
<form onSubmit={onSubmit} ref={formReference}>
{childrenWithFormProps}
<div className="text-right">
<div className="text-end">
<SubmitButton
state={getSubmitButtonState()}
disabled={submitButtonIsDisabled}

View File

@ -69,7 +69,7 @@ export {
withErrorMessage,
} from "./utils/conditionalHOCs";
export { ErrorMessage } from "./utils/ErrorMessage";
export { useClickOutside } from "./utils/hooks";
export { useClickOutside, useTooltip } from "./utils/hooks";
export { toLocaleDateString } from "./utils/datetime";
export { displayCard } from "./utils/displayCard";
export { isPluginInstalled } from "./utils/isPluginInstalled";

View File

@ -5,7 +5,8 @@
* See /LICENSE for more information.
*/
import { useState, useEffect } from "react";
import { useState, useEffect, useRef } from "react";
import { Tooltip } from "bootstrap/dist/js/bootstrap.bundle.min.js";
/** Execute callback when condition is set to true. */
export function useConditionalTimeout(
@ -40,3 +41,21 @@ export function useClickOutside(element, callback) {
};
});
}
export function useTooltip(description, placement = "top", trigger = "hover") {
const tooltipRef = useRef();
useEffect(() => {
const tooltip = new Tooltip(tooltipRef.current, {
title: description,
placement: placement,
trigger: trigger,
});
return () => {
tooltip.dispose();
};
});
return tooltipRef;
}

View File

@ -8,15 +8,16 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
"PO-Revision-Date: 2022-03-15 22:41+0000\n"
"Last-Translator: Koli <lukas.koluch@gmail.com>\n"
"PO-Revision-Date: 2023-11-23 16:03+0000\n"
"Last-Translator: Lukas Jelinek <lukas.jelinek@nic.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/turris/foris-js/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"
"Content-Type: text/plain; charset=utf-8\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.2.1-rc\n"
"Generated-By: Babel 2.11.0\n"
#: src/api/utils.js:61
@ -37,11 +38,11 @@ msgstr "Došlo k neznámé chybě v aplikačním programovém rozhraní."
#: src/bootstrap/CopyInput.js:55
msgid "Copied!"
msgstr ""
msgstr "Zkopírováno!"
#: src/bootstrap/CopyInput.js:55
msgid "Copy"
msgstr ""
msgstr "Kopírovat"
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
@ -61,7 +62,7 @@ msgstr "Opravdu chcete router restartovat?"
#: src/common/RebootButton.js:71
msgid "Cancel"
msgstr "Storno"
msgstr "Zrušit"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
@ -78,7 +79,7 @@ msgstr "Nastavení Wi-Fi jsou uvedena do výchozího stavu."
#: src/common/WiFiSettings/ResetWiFiSettings.js:55
#: src/common/WiFiSettings/ResetWiFiSettings.js:69
msgid "Reset Wi-Fi Settings"
msgstr "Resetovat nastavení Wi-Fi"
msgstr "Reset nastavení Wi-Fi"
#: src/common/WiFiSettings/ResetWiFiSettings.js:57
msgid ""
@ -86,6 +87,9 @@ msgid ""
"Fi settings. Note that this will remove the current Wi-Fi configuration "
"and restore the default values."
msgstr ""
"Pokud se počet bezdrátových karet neshoduje, můžete zkusit obnovit nastavení "
"Wi-Fi. Je třeba upozornit, že se tím odstraní aktuální konfigurace Wi-Fi a "
"obnoví se výchozí hodnoty."
#: src/common/WiFiSettings/WiFiForm.js:95
msgid "Wi-Fi ${deviceID + 1}"
@ -101,9 +105,8 @@ msgid "Hide SSID"
msgstr "Skrýt SSID"
#: src/common/WiFiSettings/WiFiForm.js:186
#, fuzzy
msgid "802.11n/ac/ax mode"
msgstr "Režim 802.11n/ac"
msgstr "Režim 802.11n/ac/ax"
#: src/common/WiFiSettings/WiFiForm.js:199
msgid "Channel"
@ -115,22 +118,23 @@ msgstr "Šifrování"
#: src/common/WiFiSettings/WiFiForm.js:226
msgid "Disable Management Frame Protection"
msgstr ""
msgstr "Vypnout Management Frame Protection"
#: src/common/WiFiSettings/WiFiForm.js:227
msgid ""
"In case you have trouble connecting to WiFi Access Point, try disabling "
"Management Frame Protection."
msgstr ""
"Máte-li problémy při připojování k přístupovému bodu Wi-Fi, zkuste vypnout "
"Management Frame Protection."
#: src/common/WiFiSettings/WiFiForm.js:262
msgid "auto"
msgstr "automaticky"
#: src/common/WiFiSettings/WiFiForm.js:303
#, fuzzy
msgid "Custom"
msgstr "automaticky"
msgstr "Uživatelsky určené"
#: src/common/WiFiSettings/WiFiGuestForm.js:42
msgid "Enable Guest Wi-Fi"
@ -166,9 +170,8 @@ msgstr "Je třeba, aby heslo obsahovalo alespoň 8 znaků"
#: src/common/WiFiSettings/WiFiSettings.js:90
#: src/common/WiFiSettings/WiFiSettings.js:109
#, fuzzy
msgid "Password must not contain more than 63 symbols"
msgstr "Je třeba, aby heslo obsahovalo alespoň 8 znaků"
msgstr "Heslo nesmí obsahovat více než 63 znaků"
#: src/common/WiFiSettings/constants.js:9
msgid "Disabled"
@ -199,24 +202,20 @@ msgid "802.11ac - 160 MHz wide channel"
msgstr "802.11ac kanál šíře 160 MHz"
#: src/common/WiFiSettings/constants.js:16
#, fuzzy
msgid "802.11ax - 20 MHz wide channel"
msgstr "802.11ac kanál šíře 20 MHz"
msgstr "802.11ax kanál šíře 20 MHz"
#: src/common/WiFiSettings/constants.js:17
#, fuzzy
msgid "802.11ax - 40 MHz wide channel"
msgstr "802.11ac kanál šíře 40 MHz"
msgstr "802.11ax kanál šíře 40 MHz"
#: src/common/WiFiSettings/constants.js:18
#, fuzzy
msgid "802.11ax - 80 MHz wide channel"
msgstr "802.11ac kanál šíře 80 MHz"
msgstr "802.11ax kanál šíře 80 MHz"
#: src/common/WiFiSettings/constants.js:19
#, fuzzy
msgid "802.11ax - 160 MHz wide channel"
msgstr "802.11ac kanál šíře 160 MHz"
msgstr "802.11ax kanál šíře 160 MHz"
#: src/common/WiFiSettings/constants.js:26
msgid "WPA3 only"
@ -224,7 +223,7 @@ msgstr "pouze WPA3"
#: src/common/WiFiSettings/constants.js:27
msgid "WPA3 with WPA2 as fallback (default)"
msgstr ""
msgstr "WPA3, nouzově WPA2 (výchozí)"
#: src/common/WiFiSettings/constants.js:28
msgid "WPA2 only"
@ -239,13 +238,8 @@ msgstr ""
"problémy."
#: src/common/WiFiSettings/constants.js:34
#, fuzzy
msgid "WPA2/3 pre-shared key, that is required to connect to the network."
msgstr ""
"\n"
" WPA2 předsdílený klíč, který je vyžadován pro připojení se k "
"síti.\n"
" "
msgstr "Předsdílený klíč WPA2/3, který je vyžadován pro připojení se k síti."
#: src/common/WiFiSettings/constants.js:37
msgid "If set, network is not visible when scanning for available networks."
@ -254,38 +248,29 @@ msgstr ""
"vyhledávat dostupné sítě."
#: src/common/WiFiSettings/constants.js:40
#, fuzzy
msgid ""
"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."
msgstr ""
"\n"
" Pásmo 2,4 GHz je v klientských zařízeních podporováno nejčastěji,"
" ale bývá více zarušené. Pásmo 5 GHz je\n"
" novější standard a nemusí být podporováno všemi vámi používanými "
"zařízeními. Obvykle bývá méně zarušené,\n"
" ale signál se hůře šíři uvnitř budov."
"Pásmo 2,4 GHz je v klientských zařízeních podporováno nejčastěji, bývá ale "
"více zarušené. Pásmo 5 GHz je novější standard a nemusí být podporováno "
"všemi vámi používanými zařízeními. Obvykle bývá méně zarušené, signál se ale "
"hůře šíří uvnitř budov."
#: src/common/WiFiSettings/constants.js:43
#, fuzzy
msgid ""
"Change this to adjust 802.11n/ac/ax mode of operation. 802.11n with 40 "
"MHz wide channels can yield higher throughput but can cause more "
"interference in the network. If you don't know what to choose, use the "
"default option with 20 MHz wide channel."
msgstr ""
"\n"
" Změna tohoto upraví režim fungování 802.11n/ac. 802.11n s kanály "
"o šíři 40 MHz kanály může pomoci k vyšší\n"
" propustnosti, ale je náchylnější na rušení. Pokud nevíte co "
"zvolit, použijte výchozí volbu s kanálem šíře\n"
" 20 MHz.\n"
" "
"Změna tohoto parametru upraví režim fungování 802.11n/ac. 802.11n s kanály o "
"šíři 40 MHz může pomoci k vyšší propustnosti, je ale náchylnější na rušení. "
"Pokud nevíte co zvolit, použijte výchozí volbu s kanálem šíře 20 MHz."
#: src/common/WiFiSettings/constants.js:46
#, fuzzy
msgid ""
"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 "
@ -293,14 +278,10 @@ msgid ""
"router. Parameters of the guest network can be set in the Guest network "
"tab."
msgstr ""
"\n"
" Zapíná Wi-Fi pro hosty, která je oddělená od místní sítě (LAN). "
"Zařízením připojeným k této síti je umožněn\n"
" přístup do Internetu, ale už ne na ostatní zařízení a k rozhraní "
"pro nastavování směrovače.\n"
" Parametry sítě pro hosty je možné nastavit na panelu „Síť pro "
"hosty“.\n"
" "
"Zapíná Wi-Fi pro hosty, která je oddělená od místní sítě (LAN). Zařízením "
"připojeným k této síti je umožněn přístup do Internetu, ale už ne na ostatní "
"zařízení a k rozhraní pro nastavování směrovače. Parametry sítě pro hosty je "
"možné nastavit na panelu „Síť pro hosty“."
#: src/common/WiFiSettings/constants.js:49
msgid ""
@ -309,6 +290,10 @@ msgid ""
"without WPA3 support require older WPA2. If you experience issues with "
"connecting older devices, try to enable WPA2."
msgstr ""
"Standard WPA3 je nová nejbezpečnější metoda, již se doporučuje používat se "
"všemi zařízeními, která ji podporují. Starší zařízení bez podpory WPA3 "
"potřebují starší WPA2. Zaznamenáte-li problémy s připojováním starších "
"zařízení, zkuste zapnout WPA2."
#: src/form/components/ForisForm.js:121
msgid "Settings saved successfully"
@ -353,7 +338,6 @@ msgid "This is not a valid domain name."
msgstr "Toto není platné doménové jméno."
#: src/utils/validations.js:17
#, fuzzy
msgid "This is not a valid hostname."
msgstr "Toto není platné doménové jméno."
@ -394,4 +378,3 @@ msgstr "Neobsahuje seznam e-mailů oddělených čárkou."
#~ "ale, že\n"
#~ "se tím odstraní aktuální konfigurace a vrátí se výchozí hodnoty.\n"
#~ " "

View File

@ -8,15 +8,16 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
"PO-Revision-Date: 2021-09-24 19:38+0000\n"
"Last-Translator: CryptKid <CryptKiddie@chaospott.de>\n"
"PO-Revision-Date: 2024-01-04 21:08+0000\n"
"Last-Translator: Erik Pfannenstein <debianignatz@gmx.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/turris/foris-js/"
"de/>\n"
"Language: de\n"
"Language-Team: German <https://hosted.weblate.org/projects/turris/foris-"
"js/de/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.4-dev\n"
"Generated-By: Babel 2.11.0\n"
#: src/api/utils.js:61
@ -37,11 +38,11 @@ msgstr "Ein unbekannter API-Fehler ist aufgetreten."
#: src/bootstrap/CopyInput.js:55
msgid "Copied!"
msgstr ""
msgstr "Kopiert!"
#: src/bootstrap/CopyInput.js:55
msgid "Copy"
msgstr ""
msgstr "Kopieren"
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
@ -88,6 +89,9 @@ msgid ""
"Fi settings. Note that this will remove the current Wi-Fi configuration "
"and restore the default values."
msgstr ""
"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-Konfiguration mit den Werkseinstellungen überschrieben wird."
#: src/common/WiFiSettings/WiFiForm.js:95
msgid "Wi-Fi ${deviceID + 1}"
@ -103,9 +107,8 @@ msgid "Hide SSID"
msgstr "SSID verbergen"
#: src/common/WiFiSettings/WiFiForm.js:186
#, fuzzy
msgid "802.11n/ac/ax mode"
msgstr "802.11n/ac Modus"
msgstr "802.11n/ac/ax-Modus"
#: src/common/WiFiSettings/WiFiForm.js:199
msgid "Channel"
@ -113,26 +116,27 @@ msgstr "Kanal"
#: src/common/WiFiSettings/WiFiForm.js:211
msgid "Encryption"
msgstr ""
msgstr "Verschlüsselung"
#: src/common/WiFiSettings/WiFiForm.js:226
msgid "Disable Management Frame Protection"
msgstr ""
msgstr "Management Frame Protection abschalten"
#: src/common/WiFiSettings/WiFiForm.js:227
msgid ""
"In case you have trouble connecting to WiFi Access Point, try disabling "
"Management Frame Protection."
msgstr ""
"Falls Sie beim Verbinden mit dem WiFi-Access-Point Probleme haben, schalten "
"Sie testweise die Management Frame Protection ab."
#: src/common/WiFiSettings/WiFiForm.js:262
msgid "auto"
msgstr "automatisch"
#: src/common/WiFiSettings/WiFiForm.js:303
#, fuzzy
msgid "Custom"
msgstr "automatisch"
msgstr "Benutzerdefiniert"
#: src/common/WiFiSettings/WiFiGuestForm.js:42
msgid "Enable Guest Wi-Fi"
@ -149,17 +153,17 @@ msgstr "PDF herunterladen"
#: src/common/WiFiSettings/WiFiSettings.js:82
#: src/common/WiFiSettings/WiFiSettings.js:98
msgid "SSID can't be longer than 32 symbols"
msgstr "SSID darf nicht länger als 32 Symbole sein"
msgstr "Die SSID darf nicht länger als 32 Zeichen sein"
#: src/common/WiFiSettings/WiFiSettings.js:83
#: src/common/WiFiSettings/WiFiSettings.js:100
msgid "SSID can't be empty"
msgstr "SSID darf nicht leer sein"
msgstr "Die SSID darf nicht leer sein"
#: src/common/WiFiSettings/WiFiSettings.js:85
#: src/common/WiFiSettings/WiFiSettings.js:102
msgid "SSID can't be longer than 32 bytes"
msgstr "SSID darf nicht länger als 32 Symbole sein"
msgstr "Die SSID darf nicht länger als 32 Bytes sein"
#: src/common/WiFiSettings/WiFiSettings.js:88
#: src/common/WiFiSettings/WiFiSettings.js:105
@ -168,9 +172,8 @@ msgstr "Das Passwort muss mindestens 8 Zeichen enthalten"
#: src/common/WiFiSettings/WiFiSettings.js:90
#: src/common/WiFiSettings/WiFiSettings.js:109
#, fuzzy
msgid "Password must not contain more than 63 symbols"
msgstr "Das Passwort muss mindestens 8 Zeichen enthalten"
msgstr "Das Passwort darf höchstens 63 Zeichen enthalten"
#: src/common/WiFiSettings/constants.js:9
msgid "Disabled"
@ -197,56 +200,48 @@ msgid "802.11ac - 80 MHz wide channel"
msgstr "802.11ac - 80 MHz breiter Kanal"
#: src/common/WiFiSettings/constants.js:15
#, fuzzy
msgid "802.11ac - 160 MHz wide channel"
msgstr "802.11ac - 80 MHz breiter Kanal"
msgstr "802.11ac - 160 MHz breiter Kanal"
#: src/common/WiFiSettings/constants.js:16
#, fuzzy
msgid "802.11ax - 20 MHz wide channel"
msgstr "802.11ac - 20 MHz breiter Kanal"
msgstr "802.11ax - 20 MHz breiter Kanal"
#: src/common/WiFiSettings/constants.js:17
#, fuzzy
msgid "802.11ax - 40 MHz wide channel"
msgstr "802.11ac - 40 MHz breiter Kanal"
msgstr "802.11ax - 40 MHz breiter Kanal"
#: src/common/WiFiSettings/constants.js:18
#, fuzzy
msgid "802.11ax - 80 MHz wide channel"
msgstr "802.11ac - 80 MHz breiter Kanal"
msgstr "802.11ax - 80 MHz breiter Kanal"
#: src/common/WiFiSettings/constants.js:19
#, fuzzy
msgid "802.11ax - 160 MHz wide channel"
msgstr "802.11ac - 80 MHz breiter Kanal"
msgstr "802.11ax - 160 MHz breiter Kanal"
#: src/common/WiFiSettings/constants.js:26
msgid "WPA3 only"
msgstr ""
msgstr "Nur WPA3"
#: src/common/WiFiSettings/constants.js:27
msgid "WPA3 with WPA2 as fallback (default)"
msgstr ""
msgstr "WPA3 mit WPA2 als Ausweichmöglichkeit (Voreinstellung)"
#: src/common/WiFiSettings/constants.js:28
msgid "WPA2 only"
msgstr ""
msgstr "Nur WPA2"
#: src/common/WiFiSettings/constants.js:31
msgid ""
"SSID which contains non-standard characters could cause problems on some "
"devices."
msgstr ""
"SSIDs, die nicht standardmäßige Zeichen enthalten, können auf manchen "
"Geräten Probleme verursachen."
#: src/common/WiFiSettings/constants.js:34
#, fuzzy
msgid "WPA2/3 pre-shared key, that is required to connect to the network."
msgstr ""
"\n"
" WPA2 Pre-Shared Key, der für die Verbindung mit dem Netzwerk "
"benötigt wird.\n"
" "
msgstr "WPA2/3 Pre-Shard Key, der zum Verbinden mit dem Netzwerk notwendig ist."
#: src/common/WiFiSettings/constants.js:37
msgid "If set, network is not visible when scanning for available networks."
@ -255,39 +250,31 @@ msgstr ""
"drahtlosen Netzwerke angezeigt."
#: src/common/WiFiSettings/constants.js:40
#, fuzzy
msgid ""
"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."
msgstr ""
"\n"
" Das 2,4 GHz-Band wird stärker von Clients unterstützt, hat aber "
"tendenziell mehr Interferenzen. Das 5-GHz-Band ist ein\n"
" neuerer Standard und wird möglicherweise nicht von allen Geräten "
"unterstützt. Es hat in der Regel weniger Interferenzen, aber das Signal\n"
" trägt nicht so gut drinnen."
"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 Standard, "
"der möglicherweise nicht von allen Ihren Geräten unterstützt wird. Es hat in "
"der Regel weniger Interferenzen, aber das Signal trägt nicht so gut in "
"Innenräumen."
#: src/common/WiFiSettings/constants.js:43
#, fuzzy
msgid ""
"Change this to adjust 802.11n/ac/ax mode of operation. 802.11n with 40 "
"MHz wide channels can yield higher throughput but can cause more "
"interference in the network. If you don't know what to choose, use the "
"default option with 20 MHz wide channel."
msgstr ""
"\n"
" Ändern Sie diese Option, um den Betriebsmodus 802.11n/ac "
"anzupassen. 802.11n mit 40 MHz breiten Kanälen können höhere\n"
" durchsatz, kann jedoch zu mehr Interferenzen im Netzwerk führen. "
"Wenn Sie nicht wissen, was Sie wählen sollen, verwenden Sie die "
"Standardeinstellung\n"
" Option mit 20 MHz breitem Kanal.\n"
" "
"Ändern Sie diese Option, um den 802.11n/ac/ax-Betriebsmodus anzupassen. 40 "
"MHz breite Kanäle können bei 802.11n mehr Daten transportieren, jedoch zu "
"mehr Interferenzen im Netzwerk führen. Wenn Sie nicht wissen, was Sie wählen "
"sollen, verwenden Sie die Voreinstellung mit 20 MHz Kanalbreite."
#: src/common/WiFiSettings/constants.js:46
#, fuzzy
msgid ""
"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 "
@ -295,14 +282,11 @@ msgid ""
"router. Parameters of the guest network can be set in the Guest network "
"tab."
msgstr ""
"\n"
" Ermöglicht Wi-Fi für Gäste, das vom LAN-Netzwerk getrennt ist. "
"Geräte, die mit diesem Netzwerk verbunden sind, dürfen\n"
" auf das Internet zugreifen, dürfen aber nicht auf andere Geräte "
"und die Konfigurationsschnittstelle des Routers zugreifen.\n"
" Die Parameter des Gastnetzwerks können in der Registerkarte "
"Gastnetzwerk eingestellt werden.\n"
" "
"Ermöglicht ein Wi-Fi für Gäste, das vom LAN-Netzwerk getrennt ist. Geräte, "
"die mit diesem Netzwerk verbunden sind, dürfen auf das Internet zugreifen, "
"nicht jedoch auf andere Geräte oder die Konfigurationsschnittstelle des "
"Routers. Die Parameter des Gastnetzwerks können auf der Gastnetzwerk-"
"Registerkarte eingestellt werden."
#: src/common/WiFiSettings/constants.js:49
msgid ""
@ -311,6 +295,11 @@ msgid ""
"without WPA3 support require older WPA2. If you experience issues with "
"connecting older devices, try to enable WPA2."
msgstr ""
"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 "
"ältere Geräte, bei denen das noch nicht der Fall ist, müssen auf das ältere "
"WPA2 ausweichen. Falls Sie Probleme dabei haben, ältere Geräte mit dem WLAN "
"zu verbinden, schalten Sie versuchsweise WPA2 ein."
#: src/form/components/ForisForm.js:121
msgid "Settings saved successfully"
@ -319,6 +308,8 @@ msgstr "Einstellungen erfolgreich gespeichert"
#: src/form/components/ForisForm.js:183
msgid "Changes you made may not be saved. Are you sure you want to leave?"
msgstr ""
"Änderungen, die Sie vorgenommen haben, werden möglicherweise nicht "
"gespeichert. Möchten Sie wirklich gehen?"
#: src/form/components/SubmitButton.js:31
msgid "Updating"
@ -334,11 +325,11 @@ msgstr "Speichern"
#: src/utils/ErrorMessage.js:16
msgid "An error occurred while fetching data."
msgstr ""
msgstr "Beim Abruf der Daten ist ein Fehler aufgetreten."
#: src/utils/validations.js:13
msgid "This is not a valid IPv4 address."
msgstr "Dies ist keine gültige IPv4-Adresse."
msgstr "Das ist keine gültige IPv4 Adresse."
#: src/utils/validations.js:14
msgid "This is not a valid IPv6 address."
@ -353,9 +344,8 @@ msgid "This is not a valid domain name."
msgstr "Dies ist kein gültiger Domainname."
#: src/utils/validations.js:17
#, fuzzy
msgid "This is not a valid hostname."
msgstr "Dies ist kein gültiger Domainname."
msgstr "Dies ist kein gültiger Hostname."
#: src/utils/validations.js:18
msgid "This is not a valid DUID."
@ -387,4 +377,3 @@ msgstr "Enthält keine Liste von E-Mails, die durch Kommas getrennt sind."
#~ "current Wi-Fi configuration and restore the default values.\n"
#~ " "
#~ msgstr ""

View File

@ -8,19 +8,21 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
"PO-Revision-Date: 2019-02-19 13:34+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2022-12-31 23:48+0000\n"
"Last-Translator: Anselmo <anselmo@casinadicornia.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/turris/foris-js/"
"it/>\n"
"Language: it\n"
"Language-Team: it <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15.1-dev\n"
"Generated-By: Babel 2.11.0\n"
#: src/api/utils.js:61
msgid "The session is expired. Please log in again."
msgstr ""
msgstr "Sessione scaduta. Ripetere l'accesso."
#: src/api/utils.js:66
msgid "Timeout error occurred."
@ -93,7 +95,7 @@ msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:132
#: src/common/WiFiSettings/WiFiGuestForm.js:80
msgid "Password"
msgstr ""
msgstr "Password"
#: src/common/WiFiSettings/WiFiForm.js:146
msgid "Hide SSID"
@ -295,7 +297,7 @@ msgstr ""
#: src/utils/validations.js:13
msgid "This is not a valid IPv4 address."
msgstr ""
msgstr "Indirizzo IPv4 non valido."
#: src/utils/validations.js:14
msgid "This is not a valid IPv6 address."
@ -414,4 +416,3 @@ msgstr ""
#~ " default option with 20 MHz wide "
#~ "channel."
#~ msgstr ""

View File

@ -8,15 +8,16 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
"PO-Revision-Date: 2022-10-26 07:01+0000\n"
"PO-Revision-Date: 2023-03-02 11:40+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/turris/"
"foris-js/nb_NO/>\n"
"Language: nb_NO\n"
"Language-Team: Norwegian Bokmål "
"<https://hosted.weblate.org/projects/turris/foris-js/nb_NO/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.16.2-dev\n"
"Generated-By: Babel 2.11.0\n"
#: src/api/utils.js:61
@ -121,14 +122,18 @@ msgid "Encryption"
msgstr "Kryptering"
#: src/common/WiFiSettings/WiFiForm.js:226
#, fuzzy
msgid "Disable Management Frame Protection"
msgstr ""
msgstr "Skru av håndtering av rammebeskyttelse"
#: src/common/WiFiSettings/WiFiForm.js:227
#, fuzzy
msgid ""
"In case you have trouble connecting to WiFi Access Point, try disabling "
"Management Frame Protection."
msgstr ""
"I fall du har problemer med å koble til Wi-Fi-tilgangspunkt, kan du skru av "
"håndtering av rammebeskyttelse."
#: src/common/WiFiSettings/WiFiForm.js:262
msgid "auto"
@ -388,4 +393,3 @@ msgstr "Inneholder ikke en kommainndelt liste med e-postadresser."
#~ "\n"
#~ "gjeldende Wi-Fi-oppsett og tilbakestiller forvalgte verdier.\n"
#~ " "

View File

@ -8,15 +8,16 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
"PO-Revision-Date: 2020-11-29 19:29+0000\n"
"Last-Translator: Johan van de Wetering <mail@jvdwetering.nl>\n"
"PO-Revision-Date: 2024-01-04 21:08+0000\n"
"Last-Translator: powerburner-nl <peter.mulder.1981@gmail.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/turris/foris-js/nl/"
">\n"
"Language: nl\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/turris/foris-"
"js/nl/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.4-dev\n"
"Generated-By: Babel 2.11.0\n"
#: src/api/utils.js:61
@ -54,19 +55,19 @@ msgstr "Opnieuw opstarten"
#: src/common/RebootButton.js:66
msgid "Warning!"
msgstr ""
msgstr "Waarschuwing!"
#: src/common/RebootButton.js:68
msgid "Are you sure you want to restart the router?"
msgstr ""
msgstr "Weet u zeker dat u de router opnieuw wilt opstarten?"
#: src/common/RebootButton.js:71
msgid "Cancel"
msgstr ""
msgstr "Annuleren"
#: src/common/RebootButton.js:73
msgid "Confirm reboot"
msgstr ""
msgstr "Opnieuw opstarten bevestigen"
#: src/common/WiFiSettings/ResetWiFiSettings.js:38
msgid "An error occurred during resetting Wi-Fi settings."
@ -418,4 +419,3 @@ msgstr "Bevat geen lijst met e-mails gescheiden door komma's."
#~ " default option with 20 MHz wide "
#~ "channel."
#~ msgstr ""

View File

@ -8,16 +8,17 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
"PO-Revision-Date: 2022-09-27 15:19+0000\n"
"Last-Translator: Orest Worhacz <areyouloco@paranoici.org>\n"
"PO-Revision-Date: 2023-03-07 16:37+0000\n"
"Last-Translator: Arusekk <arek_koz@o2.pl>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/turris/foris-js/"
"pl/>\n"
"Language: pl\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/turris/foris-"
"js/pl/>\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && "
"(n%100<10 || n%100>=20) ? 1 : 2;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.16.2-dev\n"
"Generated-By: Babel 2.11.0\n"
#: src/api/utils.js:61
@ -57,9 +58,8 @@ msgid "Warning!"
msgstr "Ostrzeżenie!"
#: src/common/RebootButton.js:68
#, fuzzy
msgid "Are you sure you want to restart the router?"
msgstr "Czy jesteś pewien/pewna, że chcesz zrestartować router?"
msgstr "Czy na pewno zrestartować router?"
#: src/common/RebootButton.js:71
msgid "Cancel"
@ -130,7 +130,7 @@ msgstr ""
#: src/common/WiFiSettings/WiFiForm.js:303
msgid "Custom"
msgstr ""
msgstr "Własny"
#: src/common/WiFiSettings/WiFiGuestForm.js:42
msgid "Enable Guest Wi-Fi"
@ -171,7 +171,7 @@ msgstr ""
#: src/common/WiFiSettings/constants.js:9
msgid "Disabled"
msgstr ""
msgstr "Wyłączone"
#: src/common/WiFiSettings/constants.js:10
msgid "802.11n - 20 MHz wide channel"
@ -417,4 +417,3 @@ msgstr "Nie zawiera listy e-maili oddzielonych przecinkami."
#~ " default option with 20 MHz wide "
#~ "channel."
#~ msgstr ""

View File

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
"PO-Revision-Date: 2022-12-05 16:48+0000\n"
"PO-Revision-Date: 2023-01-17 22:51+0000\n"
"Last-Translator: Atec <dr.atec@gmail.com>\n"
"Language-Team: Slovak <https://hosted.weblate.org/projects/turris/foris-js/"
"sk/>\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 4.15-dev\n"
"X-Generator: Weblate 4.15.1-dev\n"
"Generated-By: Babel 2.11.0\n"
#: src/api/utils.js:61

View File

@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-12-02 15:54+0100\n"
"PO-Revision-Date: 2021-09-26 03:39+0000\n"
"Last-Translator: Kristoffer Grundström "
"<swedishsailfishosuser@tutanota.com>\n"
"PO-Revision-Date: 2023-09-22 21:00+0000\n"
"Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/turris/foris-js/"
"sv/>\n"
"Language: sv\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/turris/foris-"
"js/sv/>\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.1-dev\n"
"Generated-By: Babel 2.11.0\n"
#: src/api/utils.js:61
@ -30,19 +30,19 @@ msgstr ""
#: src/api/utils.js:69
msgid "No response received."
msgstr ""
msgstr "Inget svar togs emot."
#: src/api/utils.js:79
msgid "An unknown API error occurred."
msgstr ""
msgstr "Ett okänt API-fel inträffade."
#: src/bootstrap/CopyInput.js:55
msgid "Copied!"
msgstr ""
msgstr "Kopierades!"
#: src/bootstrap/CopyInput.js:55
msgid "Copy"
msgstr ""
msgstr "Kopiera"
#: src/common/RebootButton.js:27
msgid "Reboot request failed."
@ -70,11 +70,11 @@ msgstr "Bekräfta omstart"
#: src/common/WiFiSettings/ResetWiFiSettings.js:38
msgid "An error occurred during resetting Wi-Fi settings."
msgstr ""
msgstr "Ett fel inträffade under återställningen av Wi-Fi-inställningarna."
#: src/common/WiFiSettings/ResetWiFiSettings.js:41
msgid "Wi-Fi settings are set to defaults."
msgstr ""
msgstr "Wi-Fi-inställningarna har ställts in standardinställningarna."
#: src/common/WiFiSettings/ResetWiFiSettings.js:55
#: src/common/WiFiSettings/ResetWiFiSettings.js:69
@ -87,6 +87,9 @@ msgid ""
"Fi settings. Note that this will remove the current Wi-Fi configuration "
"and restore the default values."
msgstr ""
"Om ett antal trådlösa kort inte matchar så kan du prova att återställa Wi-Fi-"
"inställningarna. Notera att det här kommer att ta bort den nuvarande Wi-Fi-"
"konfigurationen och återställa till standardvärdena."
#: src/common/WiFiSettings/WiFiForm.js:95
msgid "Wi-Fi ${deviceID + 1}"
@ -99,11 +102,11 @@ msgstr "Lösenord"
#: src/common/WiFiSettings/WiFiForm.js:146
msgid "Hide SSID"
msgstr ""
msgstr "Göm SSID"
#: src/common/WiFiSettings/WiFiForm.js:186
msgid "802.11n/ac/ax mode"
msgstr ""
msgstr "802.11n/ac/ax-läge"
#: src/common/WiFiSettings/WiFiForm.js:199
#, fuzzy
@ -112,7 +115,7 @@ msgstr "Avbryt"
#: src/common/WiFiSettings/WiFiForm.js:211
msgid "Encryption"
msgstr ""
msgstr "Kryptering"
#: src/common/WiFiSettings/WiFiForm.js:226
msgid "Disable Management Frame Protection"
@ -221,7 +224,7 @@ msgstr "802.11ac - 160 MHz bred kanal"
#: src/common/WiFiSettings/constants.js:26
msgid "WPA3 only"
msgstr ""
msgstr "Endast WPA3"
#: src/common/WiFiSettings/constants.js:27
msgid "WPA3 with WPA2 as fallback (default)"
@ -229,13 +232,15 @@ msgstr ""
#: src/common/WiFiSettings/constants.js:28
msgid "WPA2 only"
msgstr ""
msgstr "Endast WPA2"
#: src/common/WiFiSettings/constants.js:31
msgid ""
"SSID which contains non-standard characters could cause problems on some "
"devices."
msgstr ""
"SSID som innehåller icke-standardiserade tecken kan orsaka problem i en del "
"enheter."
#: src/common/WiFiSettings/constants.js:34
msgid "WPA2/3 pre-shared key, that is required to connect to the network."
@ -424,4 +429,3 @@ msgstr ""
#~ " default option with 20 MHz wide "
#~ "channel."
#~ msgstr ""