diff --git a/web/src/components/core/InstallButton.jsx b/web/src/components/core/InstallButton.jsx index b996a884b6..9735bb21ca 100644 --- a/web/src/components/core/InstallButton.jsx +++ b/web/src/components/core/InstallButton.jsx @@ -40,24 +40,17 @@ const InstallConfirmationPopup = ({ hasIssues, onAccept, onClose }) => { ); }; + // TRANSLATORS: the installer reports some errors, + // the part in curly brackets {} is a clickable link + const [msgStart, msgLink, msgEnd] = _("There are some reported issues. \ +Please, check {the list of issues} \ +before proceeding with the installation.").split(/[{}]/); + return (

- { - // TRANSLATORS: the installer reports some errors, - // the beginning (1/3) - _("There are some reported issues. Please, check") - } - - { - // TRANSLATORS: the installer reports some errors, - // the end (3/3) - _("before proceeding with the installation.") - } + {msgStart} + + {msgEnd}

); }; diff --git a/web/src/components/overview/L10nSection.jsx b/web/src/components/overview/L10nSection.jsx index e72a771304..ce8c47c111 100644 --- a/web/src/components/overview/L10nSection.jsx +++ b/web/src/components/overview/L10nSection.jsx @@ -24,6 +24,7 @@ import { Text } from "@patternfly/react-core"; import { Em, Section, SectionSkeleton } from "~/components/core"; import { useCancellablePromise } from "~/utils"; import { useInstallerClient } from "~/context/installer"; +import { _ } from "~/i18n"; const initialState = { busy: true, @@ -64,9 +65,12 @@ export default function L10nSection({ showErrors }) { const selected = languages.find(lang => lang.id === language); + // TRANSLATORS: %s will be replaced by a language name and code, + // example: "English (en_US.UTF-8)" + const [msg1, msg2] = _("The system will use %s as its default language.").split("%s"); return ( - The system will use {`${selected.name} (${selected.id})`} as its default language. + {msg1}{`${selected.name} (${selected.id})`}{msg2} ); }; @@ -74,7 +78,8 @@ export default function L10nSection({ showErrors }) { return (
[ConnectionTypes.WIFI, ConnectionTypes.ETHERNET].includes(c.type)); - if (activeConnections.length === 0) return "No network connections detected"; + if (activeConnections.length === 0) return _("No network connections detected"); const summary = activeConnections.map(connection => ( {connection.name} - {connection.addresses.map(formatIp)} )); + const msg = format( + // TRANSLATORS: header for the list of active network connections, + // %d is replaced by the number of active connections + n_("%d connection set:", "%d connections set:", activeConnections.length), + activeConnections.length + ); + return ( <> -
{activeConnections.length} connection(s) set:
+
{msg}
{summary}
); @@ -88,7 +98,8 @@ export default function NetworkSection() { return (
{ @@ -114,8 +115,11 @@ export default function SoftwareSection({ showErrors }) { const UsedSize = () => { if (state.size === "" || state.size === "0 B") return null; + // TRANSLATORS: %s will be replaced by the estimated installation size, + // example: "728.8 MiB" + const [msg1, msg2] = _("Installation will take %s").split("%s"); return ( - <>Installation will take {state.size} + <>{msg1}{state.size}{msg2} ); }; @@ -137,7 +141,8 @@ export default function SoftwareSection({ showErrors }) { icon={} onClick={probe} > - Refresh the repositories + {/* TRANSLATORS: clickable link label */} + {_("Refresh the repositories")} } ); @@ -146,7 +151,8 @@ export default function SoftwareSection({ showErrors }) { return (
{ const { result } = proposal; - if (result === undefined) return Device not selected yet; + if (result === undefined) return {_("Device not selected yet")}; const [candidateDevice] = result.candidateDevices; const device = proposal.availableDevices.find(d => d.name === candidateDevice); const label = device ? deviceLabel(device) : candidateDevice; + // TRANSLATORS: %s will be replaced by the device name and its size, + // example: "/dev/sda, 20 GiB" + const [msg1, msg2] = _("Install using device %s and deleting all its content").split("%s"); return ( - Install using device {label} and deleting all its content + {msg1}{label}{msg2} ); }; @@ -49,7 +53,7 @@ const initialState = { busy: true, proposal: undefined, errors: [], - progress: { message: "Probing storage devices", current: 0, total: 0 } + progress: { message: _("Probing storage devices"), current: 0, total: 0 } }; const reducer = (state, action) => { @@ -156,7 +160,8 @@ export default function StorageSection({ showErrors = false }) { return (
{ return (
User {state.user.userName} will be created} - else={<>No user defined yet} + then={<>{msg1}{state.user.userName}{msg2}} + else={<>{_("No user defined yet")}} />
); @@ -95,10 +98,10 @@ export default function UsersSection({ showErrors }) { return (
- Root authentication set for using both, password and public SSH Key} /> - No root authentication method defined} /> - Root authentication set for using password} /> - Root authentication set for using public SSH Key} /> + {_("Root authentication set for using both, password and public SSH Key")}} /> + {_("No root authentication method defined")}} /> + {_("Root authentication set for using password")}} /> + {_("Root authentication set for using public SSH Key")}} />
); }; @@ -113,7 +116,8 @@ export default function UsersSection({ showErrors }) { return (