diff --git a/live/root/etc/systemd/system/agama-certificate-issue.service b/live/root/etc/systemd/system/agama-certificate-issue.service index 5623d363de..245aba998f 100644 --- a/live/root/etc/systemd/system/agama-certificate-issue.service +++ b/live/root/etc/systemd/system/agama-certificate-issue.service @@ -1,6 +1,5 @@ [Unit] Description=Generate issue file for Agama SSL certificate -Before=systemd-user-sessions.service [Service] Type=oneshot diff --git a/live/root/etc/systemd/system/agama-certificate-wait.service b/live/root/etc/systemd/system/agama-certificate-wait.service new file mode 100644 index 0000000000..7eddd03474 --- /dev/null +++ b/live/root/etc/systemd/system/agama-certificate-wait.service @@ -0,0 +1,27 @@ +[Unit] +Description=Postpone login prompt after the SSL fingerprint issue is generated + +After=agama-web-server.service + +# copied from YaST2-Second-Stage.service +Before=getty@tty1.service +Before=getty@tty2.service +Before=getty@tty3.service +Before=getty@tty4.service +Before=getty@tty5.service +Before=getty@tty6.service +Before=serial-getty@hvc0.service +Before=serial-getty@sclp_line0.service +Before=serial-getty@ttyAMA0.service +Before=serial-getty@ttyS0.service +Before=serial-getty@ttyS1.service +Before=serial-getty@ttyS2.service +Before=serial-getty@ttysclp0.service + +[Service] +Type=oneshot +# wait at most 15 seconds to not block +ExecStart=agama-issue-generator --wait-for-ssl 15 + +[Install] +WantedBy=default.target diff --git a/live/root/etc/systemd/system/live-password-dialog.service b/live/root/etc/systemd/system/live-password-dialog.service index 2e120642ca..f463684ce1 100644 --- a/live/root/etc/systemd/system/live-password-dialog.service +++ b/live/root/etc/systemd/system/live-password-dialog.service @@ -22,21 +22,28 @@ Before=serial-getty@ttyS1.service Before=serial-getty@ttyS2.service Before=serial-getty@ttysclp0.service -# start at the end to avoid overwriting the screen with systemd messages -After=agama.service -After=modprobe@drm.service - # kernel command line option ConditionKernelCommandLine=live.password_dialog [Service] Type=oneshot Environment=TERM=linux + +# disable the kernel output on the console ExecStartPre=dmesg --console-off +# disable the systemd status messages on the console +ExecStartPre=kill -SIGRTMIN+21 1 + ExecStart=live-password --dialog + +# reset the console state after closing the dialog otherwise the dialog +# content would stay on the screen +ExecStartPost=reset +# enable back the kernel output on the console ExecStartPost=dmesg --console-on -TTYReset=yes -TTYVHangup=yes +# enable back the systemd status messages on the console +ExecStartPost=kill -SIGRTMIN+20 1 + StandardInput=tty RemainAfterExit=true TimeoutSec=0 diff --git a/live/root/etc/systemd/system/live-password-systemd.service b/live/root/etc/systemd/system/live-password-systemd.service index 444d1ce9c1..eb81bae6c3 100644 --- a/live/root/etc/systemd/system/live-password-systemd.service +++ b/live/root/etc/systemd/system/live-password-systemd.service @@ -22,18 +22,24 @@ Before=serial-getty@ttyS1.service Before=serial-getty@ttyS2.service Before=serial-getty@ttysclp0.service -# start at the end to avoid overwriting the screen with systemd messages -After=agama.service -After=modprobe@drm.service - # kernel command line option ConditionKernelCommandLine=live.password_systemd [Service] Type=oneshot + +# disable the kernel output on the console ExecStartPre=dmesg --console-off +# disable the systemd status messages on the console +ExecStartPre=kill -SIGRTMIN+21 1 + ExecStart=live-password --systemd + +# enable back the kernel output on the console ExecStartPost=dmesg --console-on +# enable back the systemd status messages on the console +ExecStartPost=kill -SIGRTMIN+20 1 + StandardOutput=tty RemainAfterExit=true TimeoutSec=0 diff --git a/live/root/usr/bin/agama-issue-generator b/live/root/usr/bin/agama-issue-generator index 107b47de58..0f4b8dc357 100755 --- a/live/root/usr/bin/agama-issue-generator +++ b/live/root/usr/bin/agama-issue-generator @@ -149,6 +149,14 @@ generate_network_url() { fi } +# wait until the SSL fingreprint issue is create, but at most 10 seconds +wait_for_ssl_issue() { + for i in $(seq 1 "$1"); do + [ -f "$CERT_ISSUE" ] && exit 0 + sleep 1 + done +} + # make sure the parent directory for the issues exists mkdir -p /run/issue.d @@ -159,6 +167,8 @@ elif [ "$1" = "--ssh" ]; then generate_ssh_fingerprints elif [ "$1" = "--ssl" ]; then generate_certificate_fingerprints +elif [ "$1" = "--wait-for-ssl" ]; then + wait_for_ssl_issue "$2" elif [ "$1" = "--network" ]; then generate_network_url "$2" "$3" elif [ "$1" = "--watch-avahi" ]; then diff --git a/live/root/usr/bin/live-password b/live/root/usr/bin/live-password index 1d3f0b4ae6..76ebf390d9 100755 --- a/live/root/usr/bin/live-password +++ b/live/root/usr/bin/live-password @@ -16,22 +16,23 @@ TITLE="Set Login Password" # functions for entering the password in an interactive dialog confirm_exit() { - if dialog --backtitle "$BTITLE" --defaultno --yesno "Are you sure you want to cancel?" 5 40; then + # --keep-tite is not a misspelling of "title" + if dialog --keep-tite --backtitle "$BTITLE" --defaultno --yesno "Are you sure you want to cancel?" 5 40; then exit 1 fi } msg_box() { - dialog --backtitle "$BTITLE" --msgbox "$1" 6 30 + dialog --keep-tite --backtitle "$BTITLE" --msgbox "$1" 6 30 } ask_password() { - if ! PWD1=$(dialog --title "$TITLE" --backtitle "$BTITLE" --stdout --insecure --passwordbox "Password:" 8 40); then + if ! PWD1=$(dialog --keep-tite --title "$TITLE" --backtitle "$BTITLE" --stdout --insecure --passwordbox "Password:" 8 40); then confirm_exit ask_password fi - if ! PWD2=$(dialog --title "$TITLE" --backtitle "$BTITLE" --stdout --insecure --passwordbox "Verify Password:" 8 40); then + if ! PWD2=$(dialog --keep-tite --title "$TITLE" --backtitle "$BTITLE" --stdout --insecure --passwordbox "Verify Password:" 8 40); then confirm_exit ask_password fi diff --git a/live/src/config.sh b/live/src/config.sh index 69ff8b0d06..4286912cf7 100644 --- a/live/src/config.sh +++ b/live/src/config.sh @@ -29,6 +29,7 @@ systemctl enable agama-auto.service systemctl enable agama-hostname.service systemctl enable agama-proxy-setup.service systemctl enable agama-certificate-issue.path +systemctl enable agama-certificate-wait.service systemctl enable agama-welcome-issue.service systemctl enable agama-avahi-issue.service systemctl enable agama-ssh-issue.service diff --git a/products.d/tumbleweed.yaml b/products.d/tumbleweed.yaml index 767081178b..ca7fade155 100644 --- a/products.d/tumbleweed.yaml +++ b/products.d/tumbleweed.yaml @@ -213,3 +213,4 @@ storage: - ext3 - ext4 - xfs + - vfat diff --git a/rust/agama-cli/src/config.rs b/rust/agama-cli/src/config.rs index 1f97056616..538d05b886 100644 --- a/rust/agama-cli/src/config.rs +++ b/rust/agama-cli/src/config.rs @@ -1,17 +1,23 @@ -use std::io::{self, Read}; - -use crate::{ - error::CliError, - printers::{print, Format}, +use std::{ + io::{self, Read}, + path::PathBuf, + process::Command, }; + +use crate::show_progress; use agama_lib::{ auth::AuthToken, connection, install_settings::InstallSettings, Store as SettingsStore, }; +use anyhow::anyhow; use clap::Subcommand; +use std::io::Write; +use tempfile::Builder; + +const DEFAULT_EDITOR: &str = "/usr/bin/vi"; #[derive(Subcommand, Debug)] pub enum ConfigCommands { - /// Generates an installation profile with the current settings. + /// Generate an installation profile with the current settings. /// /// It is possible that many configuration settings do not have a value. Those settings /// are not included in the output. @@ -19,16 +25,23 @@ pub enum ConfigCommands { /// The output of command can be used as input for the "agama config load". Show, - /// Reads and loads a profile from the standard input. + /// Read and load a profile from the standard input. Load, -} -pub enum ConfigAction { - Show, - Load, + /// Edit and update installation option using an external editor. + /// + /// The changes are not applied if the editor exits with an error code. + /// + /// If an editor is not specified, it honors the EDITOR environment variable. It falls back to + /// `/usr/bin/vi` as a last resort. + Edit { + /// Editor command (including additional arguments if needed) + #[arg(short, long)] + editor: Option, + }, } -pub async fn run(subcommand: ConfigCommands, format: Format) -> anyhow::Result<()> { +pub async fn run(subcommand: ConfigCommands) -> anyhow::Result<()> { let Some(token) = AuthToken::find() else { println!("You need to login for generating a valid token"); return Ok(()); @@ -37,26 +50,68 @@ pub async fn run(subcommand: ConfigCommands, format: Format) -> anyhow::Result<( let client = agama_lib::http_client(token.as_str())?; let store = SettingsStore::new(connection().await?, client).await?; - let command = parse_config_command(subcommand)?; - match command { - ConfigAction::Show => { + match subcommand { + ConfigCommands::Show => { let model = store.load().await?; - print(model, std::io::stdout(), format)?; + let json = serde_json::to_string_pretty(&model)?; + println!("{}", json); Ok(()) } - ConfigAction::Load => { + ConfigCommands::Load => { let mut stdin = io::stdin(); let mut contents = String::new(); stdin.read_to_string(&mut contents)?; let result: InstallSettings = serde_json::from_str(&contents)?; Ok(store.store(&result).await?) } + ConfigCommands::Edit { editor } => { + let model = store.load().await?; + let editor = editor + .or_else(|| std::env::var("EDITOR").ok()) + .unwrap_or(DEFAULT_EDITOR.to_string()); + let result = edit(&model, &editor)?; + tokio::spawn(async move { + show_progress().await.unwrap(); + }); + store.store(&result).await?; + Ok(()) + } } } -fn parse_config_command(subcommand: ConfigCommands) -> Result { - match subcommand { - ConfigCommands::Show => Ok(ConfigAction::Show), - ConfigCommands::Load => Ok(ConfigAction::Load), +/// Edit the installation settings using an external editor. +/// +/// If the editor does not return a successful error code, it returns an error. +/// +/// * `model`: current installation settings. +/// * `editor`: editor command. +fn edit(model: &InstallSettings, editor: &str) -> anyhow::Result { + let content = serde_json::to_string_pretty(model)?; + let mut file = Builder::new().suffix(".json").tempfile()?; + let path = PathBuf::from(file.path()); + write!(file, "{}", content)?; + + let mut command = editor_command(&editor); + let status = command.arg(path.as_os_str()).status()?; + if status.success() { + return Ok(InstallSettings::from_file(path)?); } + + Err(anyhow!( + "Ignoring the changes becase the editor was closed with an error code." + )) +} + +/// Return the Command to run the editor. +/// +/// Separate the program and the arguments and build a Command struct. +/// +/// * `command`: command to run as editor. +fn editor_command(command: &str) -> Command { + let mut parts = command.split_whitespace(); + let program = parts.next().unwrap_or(DEFAULT_EDITOR); + + let mut command = Command::new(program); + command.args(parts.collect::>()); + command } diff --git a/rust/agama-cli/src/main.rs b/rust/agama-cli/src/main.rs index 87cf6ba4bc..e3bde3f913 100644 --- a/rust/agama-cli/src/main.rs +++ b/rust/agama-cli/src/main.rs @@ -5,7 +5,6 @@ mod commands; mod config; mod error; mod logs; -mod printers; mod profile; mod progress; mod questions; @@ -18,7 +17,6 @@ use auth::run as run_auth_cmd; use commands::Commands; use config::run as run_config_cmd; use logs::run as run_logs_cmd; -use printers::Format; use profile::run as run_profile_cmd; use progress::InstallerProgress; use questions::run as run_questions_cmd; @@ -39,10 +37,6 @@ use std::{ struct Cli { #[command(subcommand)] pub command: Commands, - - /// Format output - #[arg(value_enum, short, long, default_value_t = Format::Json)] - pub format: Format, } async fn probe() -> anyhow::Result<()> { @@ -129,7 +123,7 @@ async fn run_command(cli: Cli) -> anyhow::Result<()> { Commands::Config(subcommand) => { let manager = build_manager().await?; wait_for_services(&manager).await?; - run_config_cmd(subcommand, cli.format).await + run_config_cmd(subcommand).await } Commands::Probe => { let manager = build_manager().await?; diff --git a/rust/agama-cli/src/printers.rs b/rust/agama-cli/src/printers.rs deleted file mode 100644 index 4fe28e9c8a..0000000000 --- a/rust/agama-cli/src/printers.rs +++ /dev/null @@ -1,74 +0,0 @@ -use serde::Serialize; -use std::fmt::Debug; -use std::io::Write; - -/// Prints the content using the given format -/// -/// # Example -/// -///```rust -/// use agama_lib::users; -/// use agama_cli::printers::{print, Format}; -/// use std::io; -/// -/// let user = users::User { login: "jane doe".to_string() }; -/// print(user, io::stdout(), Some(Format::Json)) -/// .expect("Something went wrong!") -/// ``` -pub fn print(content: T, writer: W, format: Format) -> anyhow::Result<()> -where - T: serde::Serialize + Debug, - W: Write, -{ - let printer: Box> = match format { - Format::Json => Box::new(JsonPrinter { content, writer }), - Format::Yaml => Box::new(YamlPrinter { content, writer }), - _ => Box::new(TextPrinter { content, writer }), - }; - printer.print() -} - -/// Supported output formats -#[derive(clap::ValueEnum, Clone)] -pub enum Format { - Json, - Yaml, - Text, -} - -pub trait Printer { - fn print(self: Box) -> anyhow::Result<()>; -} - -pub struct JsonPrinter { - content: T, - writer: W, -} - -impl Printer for JsonPrinter { - fn print(mut self: Box) -> anyhow::Result<()> { - let json = serde_json::to_string(&self.content)?; - Ok(writeln!(self.writer, "{}", json)?) - } -} -pub struct TextPrinter { - content: T, - writer: W, -} - -impl Printer for TextPrinter { - fn print(mut self: Box) -> anyhow::Result<()> { - Ok(writeln!(self.writer, "{:?}", &self.content)?) - } -} - -pub struct YamlPrinter { - content: T, - writer: W, -} - -impl Printer for YamlPrinter { - fn print(self: Box) -> anyhow::Result<()> { - Ok(serde_yaml::to_writer(self.writer, &self.content)?) - } -} diff --git a/rust/agama-lib/src/progress.rs b/rust/agama-lib/src/progress.rs index ab9bd5aa89..d693ade1cb 100644 --- a/rust/agama-lib/src/progress.rs +++ b/rust/agama-lib/src/progress.rs @@ -54,6 +54,7 @@ use zbus::Connection; /// Represents the progress for an Agama service. #[derive(Clone, Default, Debug, Serialize)] +#[serde(rename_all = "camelCase")] pub struct Progress { /// Current step pub current_step: u32, diff --git a/rust/agama-lib/src/proxies.rs b/rust/agama-lib/src/proxies.rs index 5a64753915..d7e5944bbd 100644 --- a/rust/agama-lib/src/proxies.rs +++ b/rust/agama-lib/src/proxies.rs @@ -23,6 +23,10 @@ trait Progress { /// TotalSteps property #[dbus_proxy(property)] fn total_steps(&self) -> zbus::Result; + + /// Steps property + #[dbus_proxy(property)] + fn steps(&self) -> zbus::Result>; } #[dbus_proxy( diff --git a/rust/agama-lib/src/storage/model.rs b/rust/agama-lib/src/storage/model.rs index 67e586bc54..3ef15cafa3 100644 --- a/rust/agama-lib/src/storage/model.rs +++ b/rust/agama-lib/src/storage/model.rs @@ -264,6 +264,7 @@ pub struct ProposalSettings { pub target_pv_devices: Option>, pub configure_boot: bool, pub boot_device: String, + pub default_boot_device: String, pub encryption_password: String, pub encryption_method: String, #[serde(rename = "encryptionPBKDFunction")] @@ -283,6 +284,7 @@ impl TryFrom> for ProposalSettings { target_pv_devices: get_optional_property(&hash, "TargetPVDevices")?, configure_boot: get_property(&hash, "ConfigureBoot")?, boot_device: get_property(&hash, "BootDevice")?, + default_boot_device: get_property(&hash, "DefaultBootDevice")?, encryption_password: get_property(&hash, "EncryptionPassword")?, encryption_method: get_property(&hash, "EncryptionMethod")?, encryption_pbkd_function: get_property(&hash, "EncryptionPBKDFunction")?, @@ -373,7 +375,7 @@ pub struct VolumeOutline { support_auto_size: bool, adjust_by_ram: bool, snapshots_configurable: bool, - snaphosts_affect_sizes: bool, + snapshots_affect_sizes: bool, size_relevant_volumes: Vec, } @@ -388,7 +390,7 @@ impl TryFrom> for VolumeOutline { support_auto_size: get_property(&mvalue, "SupportAutoSize")?, adjust_by_ram: get_property(&mvalue, "AdjustByRam")?, snapshots_configurable: get_property(&mvalue, "SnapshotsConfigurable")?, - snaphosts_affect_sizes: get_property(&mvalue, "SnapshotsAffectSizes")?, + snapshots_affect_sizes: get_property(&mvalue, "SnapshotsAffectSizes")?, size_relevant_volumes: get_property(&mvalue, "SizeRelevantVolumes")?, }; diff --git a/rust/agama-server/src/web/common.rs b/rust/agama-server/src/web/common.rs index b7e88d0686..814a811811 100644 --- a/rust/agama-server/src/web/common.rs +++ b/rust/agama-server/src/web/common.rs @@ -165,10 +165,22 @@ struct ProgressState<'a> { proxy: ProgressProxy<'a>, } -async fn progress(State(state): State>) -> Result, Error> { +/// Information about the current progress sequence. +#[derive(Clone, Default, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ProgressSequence { + /// Sequence steps if known in advance + steps: Vec, + #[serde(flatten)] + progress: Progress, +} + +async fn progress(State(state): State>) -> Result, Error> { let proxy = state.proxy; let progress = Progress::from_proxy(&proxy).await?; - Ok(Json(progress)) + let steps = proxy.steps().await?; + let sequence = ProgressSequence { steps, progress }; + Ok(Json(sequence)) } #[pin_project] diff --git a/rust/package/agama.changes b/rust/package/agama.changes index 0c53fd5a17..1d22b9a3a5 100644 --- a/rust/package/agama.changes +++ b/rust/package/agama.changes @@ -3,6 +3,21 @@ Thu Jun 21 15:00:00 UTC 2024 - Clemens Famulla-Conrad - Add tun/tap model (gh#openSUSE/agama#1353) +------------------------------------------------------------------- +Thu Jun 20 12:58:32 UTC 2024 - Imobach Gonzalez Sosa + +- Add a new "config edit" command allows editing installation + settings using an external editor (gh#openSUSE/agama#1360). +- Remove the "--format" option (gh#openSUSE/agama#1360). + +------------------------------------------------------------------- +Thu Jun 20 05:32:42 UTC 2024 - Imobach Gonzalez Sosa + +- Add support for progress sequences with pre-defined descriptions + (gh#openSUSE/agama#1356). +- Fix the "Progress" signal to use camelCase + (gh#openSUSE/agama#1356). + ------------------------------------------------------------------- Fri Jun 14 06:17:52 UTC 2024 - Imobach Gonzalez Sosa diff --git a/service/lib/agama/dbus/interfaces/progress.rb b/service/lib/agama/dbus/interfaces/progress.rb index 88f556e003..104952910f 100644 --- a/service/lib/agama/dbus/interfaces/progress.rb +++ b/service/lib/agama/dbus/interfaces/progress.rb @@ -78,6 +78,15 @@ def progress_finished backend.progress.finished? end + # Returns the known step descriptions + # + # @return [Array] + def progress_steps + return [] unless backend.progress + + backend.progress.descriptions + end + # D-Bus properties of the Progress interface # # @return [Hash] @@ -104,6 +113,7 @@ def self.included(base) dbus_reader :progress_total_steps, "u", dbus_name: "TotalSteps" dbus_reader :progress_current_step, "(us)", dbus_name: "CurrentStep" dbus_reader :progress_finished, "b", dbus_name: "Finished" + dbus_reader :progress_steps, "as", dbus_name: "Steps" end end end diff --git a/service/lib/agama/manager.rb b/service/lib/agama/manager.rb index 90326e0b83..956f46c5b0 100644 --- a/service/lib/agama/manager.rb +++ b/service/lib/agama/manager.rb @@ -84,9 +84,11 @@ def config_phase service_status.busy installation_phase.config - start_progress(2) - progress.step(_("Probing Storage")) { storage.probe } - progress.step(_("Probing Software")) { software.probe } + start_progress_with_descriptions( + _("Analyze disks"), _("Configure software") + ) + progress.step { storage.probe } + progress.step { software.probe } logger.info("Config phase done") rescue StandardError => e @@ -102,11 +104,15 @@ def config_phase def install_phase service_status.busy installation_phase.install - start_progress(7) + start_progress_with_descriptions( + _("Prepare disks"), + _("Install software"), + _("Configure the system") + ) Yast::Installation.destdir = "/mnt" - progress.step(_("Partitioning")) do + progress.step do storage.install proxy.propose # propose software after /mnt is already separated, so it uses proper @@ -114,14 +120,15 @@ def install_phase software.propose end - progress.step(_("Installing Software")) { software.install } - - on_target do - progress.step(_("Writing Users")) { users.write } - progress.step(_("Writing Network Configuration")) { network.install } - progress.step(_("Saving Language Settings")) { language.finish } - progress.step(_("Writing repositories information")) { software.finish } - progress.step(_("Finishing storage configuration")) { storage.finish } + progress.step { software.install } + progress.step do + on_target do + users.write + network.install + language.finish + software.finish + storage.finish + end end logger.info("Install phase done") diff --git a/service/lib/agama/progress.rb b/service/lib/agama/progress.rb index 6a71b511ec..797ecda71b 100644 --- a/service/lib/agama/progress.rb +++ b/service/lib/agama/progress.rb @@ -24,9 +24,15 @@ module Agama # # It allows to configure callbacks to be called on each step and also when the progress finishes. # + # In most cases all steps are known in advance (e.g., "probing software", "probing storage", etc.) + # but, in some situations, only the number of steps is known (e.g., "Installing package X"). + # + # Use the Progress.with_descriptions to initialize a progress with known step descriptions and + # Progress.with_size when only the number of steps is known + # # @example # - # progress = Progress.new(3) # 3 steps + # progress = Progress.with_size(3) # 3 steps # progress.on_change { puts progress.message } # configures callbacks # progress.on_finish { puts "finished" } # configures callbacks # @@ -45,6 +51,14 @@ module Agama # # progress.finished? #=> true # progress.current_step #=> nil + # + # @example Progress with known step descriptions + # + # progress = Progress.with_descriptions(["Partitioning", "Installing", "Finishing"]) + # progress.step { partitioning } # next step + # progress.current_step.description #=> "Partitioning" + # progress.step("Installing packages") { installing } # overwrite the description + # progress.current_step.description # "Installing packages" class Progress # Step of the progress class Step @@ -73,11 +87,30 @@ def initialize(id, description) # @return [Integer] attr_reader :total_steps + # Step descriptions in case they are known + # + # @return [Array] + attr_reader :descriptions + + class << self + def with_size(size) + new(size: size) + end + + def with_descriptions(descriptions) + new(descriptions: descriptions) + end + end + # Constructor # - # @param total_steps [Integer] total number of steps - def initialize(total_steps) - @total_steps = total_steps + # @param descriptions [Array] Steps of the progress sequence. This argument + # has precedence over the `size` + # @param size [Integer] total number of steps of the progress sequence + def initialize(descriptions: [], size: nil) + @descriptions = descriptions || [] + @total_steps = descriptions.size unless descriptions.empty? + @total_steps ||= size @current_step = nil @counter = 0 @finished = false @@ -99,15 +132,16 @@ def current_step # It calls the `on_change` callbacks and then runs the given block, if any. It also calls # `on_finish` callbacks after the last step. # - # @param description [String] description of the step + # @param description [String, nil] description of the step # @param block [Proc] # # @return [Object, nil] result of the given block or nil if no block is given - def step(description, &block) + def step(description = nil, &block) return if finished? @counter += 1 - @current_step = Step.new(@counter, description) + step_description = description || description_for(@counter) + @current_step = Step.new(@counter, step_description) @on_change_callbacks.each(&:call) result = block_given? ? block.call : nil @@ -154,5 +188,11 @@ def to_s "#{current_step.description} (#{@counter}/#{total_steps})" end + + private + + def description_for(step) + @descriptions[step - 1] || "" + end end end diff --git a/service/lib/agama/software/callbacks/progress.rb b/service/lib/agama/software/callbacks/progress.rb index 04a32f5a3e..60ebb3f77f 100644 --- a/service/lib/agama/software/callbacks/progress.rb +++ b/service/lib/agama/software/callbacks/progress.rb @@ -41,8 +41,8 @@ def initialize(pkg_count, progress) end def setup - Yast::Pkg.CallbackDonePackage( - fun_ref(method(:package_installed), "string (integer, string)") + Yast::Pkg.CallbackStartPackage( + fun_ref(method(:start_package), "void (string, string, string, integer, boolean)") ) end @@ -55,12 +55,8 @@ def fun_ref(method, signature) Yast::FunRef.new(method, signature) end - # TODO: error handling - def package_installed(_error, _reason) - @installed += 1 - progress.step(msg) - - "" + def start_package(package, _file, _summary, _size, _other) + progress.step("Installing #{package}") end def msg diff --git a/service/lib/agama/software/manager.rb b/service/lib/agama/software/manager.rb index 9de17bdf1b..3a8ef6734e 100644 --- a/service/lib/agama/software/manager.rb +++ b/service/lib/agama/software/manager.rb @@ -132,11 +132,11 @@ def probe logger.info "Probing software" if repositories.empty? - start_progress(3) + start_progress_with_size(3) Yast::PackageCallbacks.InitPackageCallbacks(logger) progress.step(_("Initializing sources")) { add_base_repos } else - start_progress(2) + start_progress_with_size(2) end progress.step(_("Refreshing repositories metadata")) { repositories.load } @@ -178,7 +178,7 @@ def install Yast::Pkg.TargetLoad steps = proposal.packages_count - start_progress(steps) + start_progress_with_size(steps) Callbacks::Progress.setup(steps, progress) # TODO: error handling @@ -197,16 +197,11 @@ def install # Writes the repositories information to the installed system def finish - start_progress(1) - progress.step(_("Writing repositories to the target system")) do - Yast::Pkg.SourceSaveAll - Yast::Pkg.TargetFinish - # FIXME: Pkg.SourceCacheCopyTo works correctly only from the inst-sys - # (original target "/"), it does not work correctly when using - # "chroot" /run/agama/zypp, it needs to be reimplemented :-( - # Yast::Pkg.SourceCacheCopyTo(Yast::Installation.destdir) - registration.finish - end + Yast::Pkg.SourceSaveAll + Yast::Pkg.TargetFinish + # copy the libzypp caches to the target + copy_zypp_to_target + registration.finish end # Determine whether the given tag is provided by the selected packages @@ -503,6 +498,46 @@ def pattern_exist?(pattern_name) !Y2Packager::Resolvable.find(kind: :pattern, name: pattern_name).empty? end + # this reimplements the Pkg.SourceCacheCopyTo call which works correctly + # only from the inst-sys (it copies the data from "/" where is actually + # the Live system package manager) + # @see https://github.com/yast/yast-pkg-bindings/blob/3d314480b70070299f90da4c6e87a5574e9c890c/src/Source_Installation.cc#L213-L267 + def copy_zypp_to_target + # copy the zypp "raw" cache + cache = File.join(TARGET_DIR, "/var/cache/zypp/raw") + if Dir.exist?(cache) + target_cache = File.join(Yast::Installation.destdir, "/var/cache/zypp") + FileUtils.mkdir_p(target_cache) + FileUtils.cp_r(cache, target_cache) + end + + # copy the "solv" cache but skip the "@System" directory because it + # contains empty installed packages (there were no installed packages + # before moving the target to "/mnt") + solv_cache = File.join(TARGET_DIR, "/var/cache/zypp/solv") + target_solv = File.join(Yast::Installation.destdir, "/var/cache/zypp/solv") + solvs = Dir.entries(solv_cache) - [".", "..", "@System"] + solvs.each do |s| + FileUtils.cp_r(File.join(solv_cache, s), target_solv) + end + + # copy the zypp credentials if present + credentials = File.join(TARGET_DIR, "/etc/zypp/credentials.d") + if Dir.exist?(credentials) + target_credentials = File.join(Yast::Installation.destdir, "/etc/zypp") + FileUtils.mkdir_p(target_credentials) + FileUtils.cp_r(credentials, target_credentials) + end + + # copy the global credentials if present + glob_credentials = File.join(TARGET_DIR, "/etc/zypp/credentials.cat") + return unless File.exist?(glob_credentials) + + target_dir = File.join(Yast::Installation.destdir, "/etc/zypp") + FileUtils.mkdir_p(target_dir) + FileUtils.copy(glob_credentials, target_dir) + end + # update the zypp repositories for the new product, either delete them # or keep them untouched # @param new_product [Agama::Software::Product] the new selected product diff --git a/service/lib/agama/storage/finisher.rb b/service/lib/agama/storage/finisher.rb index bfeb3c58c4..38d9835353 100644 --- a/service/lib/agama/storage/finisher.rb +++ b/service/lib/agama/storage/finisher.rb @@ -50,7 +50,7 @@ def initialize(logger, config, security) # Execute the final storage actions, reporting the progress def run steps = possible_steps.select(&:run?) - start_progress(steps.size) + start_progress_with_size(steps.size) on_target do steps.each do |step| diff --git a/service/lib/agama/storage/manager.rb b/service/lib/agama/storage/manager.rb index af5fc39eb5..75046fb9d3 100644 --- a/service/lib/agama/storage/manager.rb +++ b/service/lib/agama/storage/manager.rb @@ -107,7 +107,7 @@ def on_probe(&block) # Probes storage devices and performs an initial proposal def probe - start_progress(4) + start_progress_with_size(4) config.pick_product(software.selected_product) check_multipath progress.step(_("Activating storage devices")) { activate_devices } @@ -120,7 +120,7 @@ def probe # Prepares the partitioning to install the system def install - start_progress(4) + start_progress_with_size(4) progress.step(_("Preparing bootloader proposal")) do # first make bootloader proposal to be sure that required packages are installed proposal = ::Bootloader::ProposalClient.new.make_proposal({}) diff --git a/service/lib/agama/storage/volume_conversion/from_y2storage.rb b/service/lib/agama/storage/volume_conversion/from_y2storage.rb index 01415a4135..0c493fe707 100644 --- a/service/lib/agama/storage/volume_conversion/from_y2storage.rb +++ b/service/lib/agama/storage/volume_conversion/from_y2storage.rb @@ -48,14 +48,22 @@ def convert # @return [Agama::Storage::ProposalSettings] attr_reader :volume + # Recovers the range of sizes used by the Y2Storage proposal, if needed. + # + # If the volume is configured to use auto sizes, then the final range of sizes used by the + # Y2Storage proposal depends on the fallback sizes (if this volume is fallback for other + # volume) and the size for snapshots (if snapshots is active). The planned device contains + # the real range of sizes used by the Y2Storage proposal. + # + # FIXME: Recovering the sizes from the planned device is done to know the range of sizes + # assigned to the volume and to present that information in the UI. But such information + # should be provided in a different way, for example as part of the proposal result + # reported on D-Bus: { success:, settings:, strategy:, computed_sizes: }. + # # @param target [Agama::Storage::Volume] def sizes_conversion(target) - # The final range of sizes used by the Y2Storage proposal depends on the fallback sizes - # (if this volume is fallback for other volume) and the size for snapshots (if snapshots - # is active). The planned device contains the real range of sizes used by the proposal. - # - # From Agama point of view, this is the way of recovering the range of sizes used by - # Y2Storage when a volume is set to have auto size. + return unless target.auto_size? + planned = planned_device_for(target.mount_path) return unless planned diff --git a/service/lib/agama/users.rb b/service/lib/agama/users.rb index 080ee30632..d85cc0459b 100644 --- a/service/lib/agama/users.rb +++ b/service/lib/agama/users.rb @@ -37,6 +37,7 @@ class Users include Yast::I18n def initialize(logger) + textdomain "agama" @logger = logger update_issues end diff --git a/service/lib/agama/with_progress.rb b/service/lib/agama/with_progress.rb index 8d81adb1fc..b3a5820aa5 100644 --- a/service/lib/agama/with_progress.rb +++ b/service/lib/agama/with_progress.rb @@ -30,22 +30,37 @@ class NotFinishedProgress < StandardError; end # @return [Progress, nil] attr_reader :progress + # Creates a new progress with a given number of steps + # + # @param size [Integer] Number of steps + def start_progress_with_size(size) + start_progress(size: size) + end + + # Creates a new progress with a given set of steps + # + # @param descriptions [Array] Steps descriptions + def start_progress_with_descriptions(*descriptions) + start_progress(descriptions: descriptions) + end + # Creates a new progress # # @raise [RuntimeError] if there is an unfinished progress. # - # @param total_steps [Integer] total number of the steps for the progress. - def start_progress(total_steps) + # @param args [*Hash] Progress constructor arguments. + def start_progress(args) raise NotFinishedProgress if progress && !progress.finished? on_change_callbacks = @on_progress_change_callbacks || [] on_finish_callbacks = @on_progress_finish_callbacks || [] - @progress = Progress.new(total_steps).tap do |progress| + @progress = Progress.new(**args).tap do |progress| progress.on_change { on_change_callbacks.each(&:call) } progress.on_finish { on_finish_callbacks.each(&:call) } end end + private :start_progress # Finishes the current progress def finish_progress diff --git a/service/package/rubygem-agama-yast.changes b/service/package/rubygem-agama-yast.changes index dfd5b661c7..fc5d6af4a9 100644 --- a/service/package/rubygem-agama-yast.changes +++ b/service/package/rubygem-agama-yast.changes @@ -1,3 +1,17 @@ +------------------------------------------------------------------- +Thu Jun 20 05:25:49 UTC 2024 - Imobach Gonzalez Sosa + +- Add support for progress sequences with pre-defined descriptions + (gh#openSUSE/agama#1356). + +------------------------------------------------------------------- +Wed Jun 19 06:04:46 UTC 2024 - Ladislav Slezák + +- Use a different libzypp target for Agama, do not use the Live + system package management (gh#openSUSE/agama#1329) +- Properly delete the libzypp cache when changing the products + (gh#openSUSE/agama#1349) + ------------------------------------------------------------------- Thu Jun 13 10:53:27 UTC 2024 - Imobach Gonzalez Sosa diff --git a/service/po/ca.po b/service/po/ca.po index be6054e629..2f565629cb 100644 --- a/service/po/ca.po +++ b/service/po/ca.po @@ -7,11 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2024-06-10 08:10+0000\n" "Last-Translator: David Medina \n" -"Language-Team: Catalan \n" +"Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -96,38 +96,30 @@ msgstr "" "La clau %{id} (%{name}) amb l'empremta digital %{fingerprint} és " "desconeguda. Voleu confiar en aquesta clau?" -#. as we use liveDVD with normal like ENV, lets temporary switch to normal to use its repos -#: service/lib/agama/software/manager.rb:134 -msgid "Initializing target repositories" -msgstr "Iniciant els repositoris de destinació" - -#: service/lib/agama/software/manager.rb:135 +#. Should an error be raised? +#: service/lib/agama/software/manager.rb:137 msgid "Initializing sources" msgstr "Iniciant les fonts" -#: service/lib/agama/software/manager.rb:140 +#: service/lib/agama/software/manager.rb:142 msgid "Refreshing repositories metadata" msgstr "Refrescant les metadades dels repositoris" -#: service/lib/agama/software/manager.rb:141 +#: service/lib/agama/software/manager.rb:143 msgid "Calculating the software proposal" msgstr "Calculant la proposta de programari" #. Writes the repositories information to the installed system -#: service/lib/agama/software/manager.rb:190 +#: service/lib/agama/software/manager.rb:201 msgid "Writing repositories to the target system" msgstr "Escrivint els repositoris al sistema de destinació" -#: service/lib/agama/software/manager.rb:196 -msgid "Restoring original repositories" -msgstr "Restaurant els repositoris originals" - #. Issues related to the software proposal. #. #. Repositories that could not be probed are reported as errors. #. #. @return [Array] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "No s'ha pogut llegir el repositori %s." @@ -135,21 +127,21 @@ msgstr "No s'ha pogut llegir el repositori %s." #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "Encara no s'ha seleccionat el producte." #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "El producte ha d'estar registrat." #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "S'han trobat %s problemes de dependències." @@ -225,3 +217,15 @@ msgstr[0] "" "El dispositiu seleccionat següent no es troba al sistema: %{devices}" msgstr[1] "" "Els dispositius seleccionats següents no es troben al sistema: %{devices}" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" + +#~ msgid "Initializing target repositories" +#~ msgstr "Iniciant els repositoris de destinació" + +#~ msgid "Restoring original repositories" +#~ msgstr "Restaurant els repositoris originals" diff --git a/service/po/cs.po b/service/po/cs.po index cb0ca9a2fe..dd2a8eab07 100644 --- a/service/po/cs.po +++ b/service/po/cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2023-12-15 16:52+0000\n" "Last-Translator: Ladislav Slezák \n" "Language-Team: Czech ] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "Nelze načíst repozitář \"%s\"" @@ -137,21 +129,21 @@ msgstr "Nelze načíst repozitář \"%s\"" #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "Není vybrán žádný produkt" #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "Produkt musí být zaregistrován" #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "Nalezeno %s problémů v závislostech." @@ -224,3 +216,15 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" msgstr[2] "" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" + +#~ msgid "Initializing target repositories" +#~ msgstr "Inicializuji cílové repozitáře" + +#~ msgid "Restoring original repositories" +#~ msgstr "Obnovují se původní repozitáře" diff --git a/service/po/de.po b/service/po/de.po index ecc9a6c49c..c4022b0190 100644 --- a/service/po/de.po +++ b/service/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2024-04-27 03:43+0000\n" "Last-Translator: Ettore Atalan \n" "Language-Team: German ] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "Repositorium „%s“ konnte nicht gelesen werden" @@ -135,21 +127,21 @@ msgstr "Repositorium „%s“ konnte nicht gelesen werden" #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "Produkt noch nicht ausgewählt" #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "Produkt muss registriert sein" #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "%s Abhängigkeitsprobleme gefunden." @@ -224,3 +216,15 @@ msgstr[0] "" "Das folgende ausgewählte Gerät wird im System nicht gefunden: %{devices}" msgstr[1] "" "Die folgenden ausgewählten Geräte werden im System nicht gefunden: %{devices}" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" + +#~ msgid "Initializing target repositories" +#~ msgstr "Ziel-Repositorien werden initialisiert" + +#~ msgid "Restoring original repositories" +#~ msgstr "Ursprüngliche Repositorien werden wiederhergestellt" diff --git a/service/po/es.po b/service/po/es.po index fbde3b6985..70ccc83de7 100644 --- a/service/po/es.po +++ b/service/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2024-05-12 21:43+0000\n" "Last-Translator: Alejandro Jiménez \n" "Language-Team: Spanish ] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "" @@ -133,21 +125,21 @@ msgstr "" #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "" #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "" #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "" @@ -218,3 +210,9 @@ msgid_plural "" "The following selected devices are not found in the system: %{devices}" msgstr[0] "" msgstr[1] "" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" diff --git a/service/po/fr.po b/service/po/fr.po index a2a1c1017b..0c42fa6358 100644 --- a/service/po/fr.po +++ b/service/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2024-04-19 23:43+0000\n" "Last-Translator: faila fail \n" "Language-Team: French ] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "Impossible de lire le dépôt \"%s\"" @@ -135,21 +127,21 @@ msgstr "Impossible de lire le dépôt \"%s\"" #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "Le produit n'est pas encore sélectionné" #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "Le produit doit être enregistré" #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "%s problème(s) de dépendance trouvé(s)." @@ -225,3 +217,15 @@ msgstr[0] "" msgstr[1] "" "Les périphériques sélectionnés suivants sont introuvables dans le système : " "%{devices}" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" + +#~ msgid "Initializing target repositories" +#~ msgstr "Initialisation des dépôts cibles" + +#~ msgid "Restoring original repositories" +#~ msgstr "Restauration des dépôts d'origine" diff --git a/service/po/id.po b/service/po/id.po index 2232d40521..03e43df1b4 100644 --- a/service/po/id.po +++ b/service/po/id.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2023-12-28 21:02+0000\n" "Last-Translator: Arif Budiman \n" "Language-Team: Indonesian ] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "Tidak dapat membaca repositori \"%s\"" @@ -135,21 +127,21 @@ msgstr "Tidak dapat membaca repositori \"%s\"" #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "Produk belum dipilih" #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "Produk harus didaftarkan" #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "Ditemukan %s masalah ketergantungan." @@ -219,3 +211,15 @@ msgid "The following selected device is not found in the system: %{devices}" msgid_plural "" "The following selected devices are not found in the system: %{devices}" msgstr[0] "" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" + +#~ msgid "Initializing target repositories" +#~ msgstr "Menginisialisasi repositori target" + +#~ msgid "Restoring original repositories" +#~ msgstr "Mengembalikan repositori asli" diff --git a/service/po/ja.po b/service/po/ja.po index 5afe51ff9f..c79ddb3690 100644 --- a/service/po/ja.po +++ b/service/po/ja.po @@ -7,11 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2024-06-10 02:24+0000\n" "Last-Translator: Yasuhiko Kamata \n" -"Language-Team: Japanese \n" +"Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -96,38 +96,30 @@ msgstr "" "鍵 %{id} (%{name}) (指紋 %{fingerprint}) の発行元が不明です。この鍵を信頼して" "よろしいですか?" -#. as we use liveDVD with normal like ENV, lets temporary switch to normal to use its repos -#: service/lib/agama/software/manager.rb:134 -msgid "Initializing target repositories" -msgstr "目的のリポジトリを準備しています" - -#: service/lib/agama/software/manager.rb:135 +#. Should an error be raised? +#: service/lib/agama/software/manager.rb:137 msgid "Initializing sources" msgstr "ソースを準備しています" -#: service/lib/agama/software/manager.rb:140 +#: service/lib/agama/software/manager.rb:142 msgid "Refreshing repositories metadata" msgstr "リポジトリのメタデータを更新しています" -#: service/lib/agama/software/manager.rb:141 +#: service/lib/agama/software/manager.rb:143 msgid "Calculating the software proposal" msgstr "ソフトウエアの提案内容を作成しています" #. Writes the repositories information to the installed system -#: service/lib/agama/software/manager.rb:190 +#: service/lib/agama/software/manager.rb:201 msgid "Writing repositories to the target system" msgstr "インストール先のシステムにリポジトリ情報を書き込んでいます" -#: service/lib/agama/software/manager.rb:196 -msgid "Restoring original repositories" -msgstr "元のリポジトリを復元しています" - #. Issues related to the software proposal. #. #. Repositories that could not be probed are reported as errors. #. #. @return [Array] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "リポジトリ\"%s\" を読み込むことができませんでした" @@ -135,21 +127,21 @@ msgstr "リポジトリ\"%s\" を読み込むことができませんでした" #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "まだ製品を選択していません" #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "製品を登録しなければなりません" #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "%s 個の依存関係の問題が見つかりました。" @@ -219,3 +211,15 @@ msgid "The following selected device is not found in the system: %{devices}" msgid_plural "" "The following selected devices are not found in the system: %{devices}" msgstr[0] "システム内には下記のデバイスが見つかりません: %{devices}" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" + +#~ msgid "Initializing target repositories" +#~ msgstr "目的のリポジトリを準備しています" + +#~ msgid "Restoring original repositories" +#~ msgstr "元のリポジトリを復元しています" diff --git a/service/po/nb_NO.po b/service/po/nb_NO.po index 301df58736..cf9e4d9434 100644 --- a/service/po/nb_NO.po +++ b/service/po/nb_NO.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2024-06-12 01:46+0000\n" "Last-Translator: Martin Hansen \n" "Language-Team: Norwegian Bokmål ] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "Kunne ikke lese pakkebrønn \"%s\"" @@ -135,21 +127,21 @@ msgstr "Kunne ikke lese pakkebrønn \"%s\"" #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "Produkt har ikke blitt valgt ennå" #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "Produkt må bli registrert" #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "Fant %s avhengighetsproblemer." @@ -220,3 +212,15 @@ msgid_plural "" "The following selected devices are not found in the system: %{devices}" msgstr[0] "Følgende valgte enhet ble ikke funnet i systemet: %{devices}" msgstr[1] "Følgende valgte enheter ble ikke funnet i systemet: %{devices}" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" + +#~ msgid "Initializing target repositories" +#~ msgstr "Initialiserer pakkebrønner" + +#~ msgid "Restoring original repositories" +#~ msgstr "Gjenoppretter de originale pakkebrønnene" diff --git a/service/po/ru.po b/service/po/ru.po index 79e2bc1619..ed24149e40 100644 --- a/service/po/ru.po +++ b/service/po/ru.po @@ -7,11 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2024-06-10 12:46+0000\n" "Last-Translator: Alex Minton \n" -"Language-Team: Russian \n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -97,38 +97,30 @@ msgstr "" "Ключ %{id} (%{name}) с отпечатком %{fingerprint} неизвестен. Хотите ли вы " "доверять этому ключу?" -#. as we use liveDVD with normal like ENV, lets temporary switch to normal to use its repos -#: service/lib/agama/software/manager.rb:134 -msgid "Initializing target repositories" -msgstr "Инициализация целевых репозиториев" - -#: service/lib/agama/software/manager.rb:135 +#. Should an error be raised? +#: service/lib/agama/software/manager.rb:137 msgid "Initializing sources" msgstr "Инициализация источников" -#: service/lib/agama/software/manager.rb:140 +#: service/lib/agama/software/manager.rb:142 msgid "Refreshing repositories metadata" msgstr "Обновление метаданных репозиториев" -#: service/lib/agama/software/manager.rb:141 +#: service/lib/agama/software/manager.rb:143 msgid "Calculating the software proposal" msgstr "Расчет предложения по программному обеспечению" #. Writes the repositories information to the installed system -#: service/lib/agama/software/manager.rb:190 +#: service/lib/agama/software/manager.rb:201 msgid "Writing repositories to the target system" msgstr "Запись репозиториев в целевую систему" -#: service/lib/agama/software/manager.rb:196 -msgid "Restoring original repositories" -msgstr "Восстановление исходных репозиториев" - #. Issues related to the software proposal. #. #. Repositories that could not be probed are reported as errors. #. #. @return [Array] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "Не удалось прочитать репозиторий \"%s\"" @@ -136,21 +128,21 @@ msgstr "Не удалось прочитать репозиторий \"%s\"" #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "Продукт еще не выбран" #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "Продукт должен быть зарегистрирован" #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "Найдено %s проблем с зависимостями." @@ -222,3 +214,15 @@ msgid_plural "" msgstr[0] "Следующее выбранное устройство не найдено в системе: %{devices}" msgstr[1] "Следующие выбранные устройства не найдены в системе: %{devices}" msgstr[2] "Следующие выбранные устройства не найдены в системе: %{devices}" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" + +#~ msgid "Initializing target repositories" +#~ msgstr "Инициализация целевых репозиториев" + +#~ msgid "Restoring original repositories" +#~ msgstr "Восстановление исходных репозиториев" diff --git a/service/po/sv.po b/service/po/sv.po index 442563e8b4..7f48ffbb8e 100644 --- a/service/po/sv.po +++ b/service/po/sv.po @@ -7,11 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2024-06-10 19:24+0000\n" "Last-Translator: Luna Jernberg \n" -"Language-Team: Swedish \n" +"Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -96,38 +96,30 @@ msgstr "" "Nyckeln %{id} (%{name}) med fingeravtrycket %{fingerprint} är okänd. Vill du " "lita på den här nyckeln?" -#. as we use liveDVD with normal like ENV, lets temporary switch to normal to use its repos -#: service/lib/agama/software/manager.rb:134 -msgid "Initializing target repositories" -msgstr "Initierar målförråd" - -#: service/lib/agama/software/manager.rb:135 +#. Should an error be raised? +#: service/lib/agama/software/manager.rb:137 msgid "Initializing sources" msgstr "Initierar källor" -#: service/lib/agama/software/manager.rb:140 +#: service/lib/agama/software/manager.rb:142 msgid "Refreshing repositories metadata" msgstr "Uppdaterar metadata för förråd" -#: service/lib/agama/software/manager.rb:141 +#: service/lib/agama/software/manager.rb:143 msgid "Calculating the software proposal" msgstr "Beräknar programvaruförslaget" #. Writes the repositories information to the installed system -#: service/lib/agama/software/manager.rb:190 +#: service/lib/agama/software/manager.rb:201 msgid "Writing repositories to the target system" msgstr "Skriver förråd till målsystemet" -#: service/lib/agama/software/manager.rb:196 -msgid "Restoring original repositories" -msgstr "Återställer ursprungliga förråd" - #. Issues related to the software proposal. #. #. Repositories that could not be probed are reported as errors. #. #. @return [Array] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "Kunde inte läsa förråd \"%s\"" @@ -135,21 +127,21 @@ msgstr "Kunde inte läsa förråd \"%s\"" #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "Produkt har inte valts ännu" #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "Produkt måste registreras" #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "Hittade %s beroendeproblem." @@ -220,3 +212,15 @@ msgid_plural "" "The following selected devices are not found in the system: %{devices}" msgstr[0] "Följande valda enhet hittades inte i systemet: %{devices}" msgstr[1] "Följande valda enheter hittades inte i systemet: %{devices}" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" + +#~ msgid "Initializing target repositories" +#~ msgstr "Initierar målförråd" + +#~ msgid "Restoring original repositories" +#~ msgstr "Återställer ursprungliga förråd" diff --git a/service/po/tr.po b/service/po/tr.po index 0b51991975..7f7e05143c 100644 --- a/service/po/tr.po +++ b/service/po/tr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2024-05-16 15:46+0000\n" "Last-Translator: Özgür Arslan \n" "Language-Team: Turkish ] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "\"%s\" deposu okunamadı" @@ -135,21 +127,21 @@ msgstr "\"%s\" deposu okunamadı" #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "Ürün henüz seçilmedi" #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "Ürün kayıtlı olmalı" #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "%s bağımlılık sorunu bulundu." @@ -220,3 +212,15 @@ msgid_plural "" "The following selected devices are not found in the system: %{devices}" msgstr[0] "Aşağıdaki seçilen cihaz sistemde bulunamadı: %{devices}" msgstr[1] "Aşağıdaki seçilen cihazlar sistemde bulunamadı: %{devices}" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" + +#~ msgid "Initializing target repositories" +#~ msgstr "Hedef depolar başlatılıyor" + +#~ msgid "Restoring original repositories" +#~ msgstr "Orijinal depoları geri yükleniyor" diff --git a/service/po/zh_Hans.po b/service/po/zh_Hans.po index b6b96a31ba..47423a5aef 100644 --- a/service/po/zh_Hans.po +++ b/service/po/zh_Hans.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-09 02:25+0000\n" +"POT-Creation-Date: 2024-06-20 09:58+0000\n" "PO-Revision-Date: 2024-04-10 09:43+0000\n" "Last-Translator: Monstorix \n" "Language-Team: Chinese (Simplified) ] -#: service/lib/agama/software/manager.rb:482 +#: service/lib/agama/software/manager.rb:468 #, c-format msgid "Could not read repository \"%s\"" msgstr "无法读取仓库 “ %s”" @@ -133,21 +125,21 @@ msgstr "无法读取仓库 “ %s”" #. Issue when a product is missing #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:492 +#: service/lib/agama/software/manager.rb:478 msgid "Product not selected yet" msgstr "尚未选择产品" #. Issue when a product requires registration but it is not registered yet. #. #. @return [Agama::Issue] -#: service/lib/agama/software/manager.rb:501 +#: service/lib/agama/software/manager.rb:487 msgid "Product must be registered" msgstr "产品必须注册" #. Returns solver error messages from the last attempt #. #. @return [Array] Error messages -#: service/lib/agama/software/proposal.rb:227 +#: service/lib/agama/software/proposal.rb:223 #, c-format msgid "Found %s dependency issues." msgstr "找到 %s 个依赖问题。" @@ -217,3 +209,15 @@ msgid "The following selected device is not found in the system: %{devices}" msgid_plural "" "The following selected devices are not found in the system: %{devices}" msgstr[0] "未在系统中找到下列已选择的设备: %{devices}" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:152 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" + +#~ msgid "Initializing target repositories" +#~ msgstr "正在初始化目标仓库" + +#~ msgid "Restoring original repositories" +#~ msgstr "正在还原初始软件仓库" diff --git a/service/test/agama/dbus/interfaces/progress_test.rb b/service/test/agama/dbus/interfaces/progress_test.rb index c5bc18fc2d..fcd0f4f280 100644 --- a/service/test/agama/dbus/interfaces/progress_test.rb +++ b/service/test/agama/dbus/interfaces/progress_test.rb @@ -59,7 +59,7 @@ class Backend context " if there is a progress" do before do - subject.backend.start_progress(2) + subject.backend.start_progress_with_size(2) end it "returns the total number of steps of the progress" do @@ -77,7 +77,7 @@ class Backend context " if there is a progress" do before do - subject.backend.start_progress(2) + subject.backend.start_progress_with_size(2) end before do @@ -99,7 +99,7 @@ class Backend context " if there is a progress" do before do - subject.backend.start_progress(2) + subject.backend.start_progress_with_size(2) end context "and the progress is not started" do @@ -132,25 +132,45 @@ class Backend end describe "#progress_properties" do - before do - subject.backend.start_progress(2) - progress.step("step 1") + context "when steps are not known in advance" do + before do + subject.backend.start_progress_with_size(2) + progress.step("step 1") + end + + it "returns de D-Bus properties of the progress interface" do + expected_properties = { + "TotalSteps" => 2, + "CurrentStep" => [1, "step 1"], + "Finished" => false, + "Steps" => [] + } + expect(subject.progress_properties).to eq(expected_properties) + end end - it "returns de D-Bus properties of the progress interface" do - expected_properties = { - "TotalSteps" => 2, - "CurrentStep" => [1, "step 1"], - "Finished" => false - } - expect(subject.progress_properties).to eq(expected_properties) + context "when steps are known in advance" do + before do + subject.backend.start_progress_with_descriptions("step 1", "step 2") + progress.step + end + + it "includes the steps" do + expected_properties = { + "TotalSteps" => 2, + "CurrentStep" => [1, "step 1"], + "Finished" => false, + "Steps" => ["step 1", "step 2"] + } + expect(subject.progress_properties).to eq(expected_properties) + end end end describe "#register_progress_callbacks" do it "register callbacks to be called when the progress changes" do subject.register_progress_callbacks - subject.backend.start_progress(2) + subject.backend.start_progress_with_size(2) expect(subject).to receive(:dbus_properties_changed) .with(progress_interface, anything, anything) @@ -160,7 +180,7 @@ class Backend it "register callbacks to be called when the progress finishes" do subject.register_progress_callbacks - subject.backend.start_progress(2) + subject.backend.start_progress_with_size(2) expect(subject).to receive(:dbus_properties_changed) .with(progress_interface, anything, anything) diff --git a/service/test/agama/dbus/software/product_test.rb b/service/test/agama/dbus/software/product_test.rb index e25c36e661..72e1ee7438 100644 --- a/service/test/agama/dbus/software/product_test.rb +++ b/service/test/agama/dbus/software/product_test.rb @@ -35,9 +35,17 @@ let(:config) { Agama::Config.new } + let(:target_dir) { Dir.mktmpdir } + before do + stub_const("Agama::Software::Manager::TARGET_DIR", target_dir) allow(config).to receive(:products).and_return(products) allow(subject).to receive(:dbus_properties_changed) + allow(Agama::ProductReader).to receive(:new).and_call_original + end + + after do + FileUtils.rm_r(target_dir) end let(:products) do diff --git a/service/test/agama/progress_test.rb b/service/test/agama/progress_test.rb index f0d0cad0c3..4688cbd86f 100644 --- a/service/test/agama/progress_test.rb +++ b/service/test/agama/progress_test.rb @@ -23,7 +23,27 @@ require "agama/progress" describe Agama::Progress do - subject { described_class.new(steps) } + subject { described_class.with_size(steps) } + + describe "when the steps are known in advance" do + subject do + described_class.with_descriptions( + ["Partitioning", "Installing", "Configuring"] + ) + end + + it "sets the total_steps to the number of steps" do + expect(subject.total_steps).to eq(3) + end + + it "uses the given descriptions" do + subject.step + expect(subject.current_step.description).to eq("Partitioning") + + subject.step + expect(subject.current_step.description).to eq("Installing") + end + end describe "#current_step" do let(:steps) { 3 } @@ -56,10 +76,30 @@ subject.step("step 3") end - it "returns nil" do + it "returns the last step" do expect(subject.current_step).to be_nil end end + + context "if the descriptions are known in advance" do + subject do + described_class.with_descriptions( + ["Partitioning", "Installing", "Configuring"] + ) + end + + it "uses the descriptions" do + subject.step + expect(subject.current_step.description).to eq("Partitioning") + end + + context "but a description is given" do + it "uses the given descriptions" do + subject.step("Finishing") + expect(subject.current_step.description).to eq("Finishing") + end + end + end end describe "#step" do diff --git a/service/test/agama/software/manager_test.rb b/service/test/agama/software/manager_test.rb index e578508766..ad2770c4ec 100644 --- a/service/test/agama/software/manager_test.rb +++ b/service/test/agama/software/manager_test.rb @@ -81,7 +81,10 @@ instance_double(Agama::DBus::Clients::Questions) end + let(:target_dir) { Dir.mktmpdir } + before do + stub_const("Agama::Software::Manager::TARGET_DIR", target_dir) allow(Yast::Pkg).to receive(:TargetInitialize) allow(Yast::Pkg).to receive(:TargetFinish) allow(Yast::Pkg).to receive(:TargetLoad) @@ -99,6 +102,14 @@ allow(Agama::Software::RepositoriesManager).to receive(:new).and_return(repositories) allow(Agama::Software::Proposal).to receive(:new).and_return(proposal) allow(Agama::ProductReader).to receive(:new).and_call_original + allow(FileUtils).to receive(:mkdir_p) + allow(FileUtils).to receive(:rm_rf) + allow(FileUtils).to receive(:cp_r) + allow(File).to receive(:exist?).and_call_original + end + + after do + FileUtils.rm_r(target_dir) end describe "#new" do @@ -352,11 +363,66 @@ describe "#finish" do it "releases the packaging system" do + allow(subject).to receive(:copy_zypp_to_target) expect(Yast::Pkg).to receive(:SourceSaveAll) expect(Yast::Pkg).to receive(:TargetFinish) subject.finish end + + it "copies the libzypp cache and credentials to the target system" do + allow(Dir).to receive(:exist?).and_call_original + allow(Dir).to receive(:entries).and_call_original + + # copying the raw cache + expect(Dir).to receive(:exist?).with( + File.join(target_dir, "/var/cache/zypp/raw") + ).and_return(true) + expect(FileUtils).to receive(:mkdir_p).with( + File.join(Yast::Installation.destdir, "/var/cache/zypp") + ) + expect(FileUtils).to receive(:cp_r).with( + File.join(target_dir, "/var/cache/zypp/raw"), + File.join(Yast::Installation.destdir, "/var/cache/zypp") + ) + + # copy the solv cache + repo_alias = "https-download.opensuse.org-94cc89aa" + expect(Dir).to receive(:entries) + .with(File.join(target_dir, "/var/cache/zypp/solv")) + .and_return([".", "..", "@System", repo_alias]) + expect(FileUtils).to receive(:cp_r).with( + File.join(target_dir, "/var/cache/zypp/solv/", repo_alias), + File.join(Yast::Installation.destdir, "/var/cache/zypp/solv") + ) + # ensure the @System cache is not copied + expect(FileUtils).to_not receive(:cp_r).with( + File.join(target_dir, "/var/cache/zypp/solv/@System"), + File.join(Yast::Installation.destdir, "/var/cache/zypp/solv") + ) + + # copying the credentials.d directory + expect(Dir).to receive(:exist?) + .with(File.join(target_dir, "/etc/zypp/credentials.d")) + .and_return(true) + expect(FileUtils).to receive(:mkdir_p) + .with(File.join(Yast::Installation.destdir, "/etc/zypp")) + expect(FileUtils).to receive(:cp_r).with( + File.join(target_dir, "/etc/zypp/credentials.d"), + File.join(Yast::Installation.destdir, "/etc/zypp") + ) + + # copying the global credentials file + expect(File).to receive(:exist?) + .with(File.join(target_dir, "/etc/zypp/credentials.cat")) + .and_return(true) + expect(FileUtils).to receive(:copy).with( + File.join(target_dir, "/etc/zypp/credentials.cat"), + File.join(Yast::Installation.destdir, "/etc/zypp") + ) + + subject.finish + end end describe "#package_installed?" do diff --git a/service/test/agama/storage/finisher_test.rb b/service/test/agama/storage/finisher_test.rb index 3f5f3eac19..17b57a7f58 100644 --- a/service/test/agama/storage/finisher_test.rb +++ b/service/test/agama/storage/finisher_test.rb @@ -53,7 +53,7 @@ end it "runs the possible steps that must be run" do - expect(subject).to receive(:start_progress).with(1) + expect(subject).to receive(:start_progress_with_size).with(1) expect(subject.progress).to receive(:step) do |label, &block| expect(label).to eql(copy_files.label) expect(copy_files).to receive(:run) diff --git a/service/test/agama/storage/volume_conversion/from_y2storage_test.rb b/service/test/agama/storage/volume_conversion/from_y2storage_test.rb index 55da4f8edb..ceecba866b 100644 --- a/service/test/agama/storage/volume_conversion/from_y2storage_test.rb +++ b/service/test/agama/storage/volume_conversion/from_y2storage_test.rb @@ -89,35 +89,59 @@ instance_double(Y2Storage::MinGuidedProposal, planned_devices: planned_devices) end - context "if there is a planned device for the volume" do - let(:planned_devices) { [planned_volume] } + let(:planned_devices) { [planned_volume] } - let(:planned_volume) do - Y2Storage::Planned::LvmLv.new("/").tap do |planned| - planned.min = Y2Storage::DiskSize.GiB(10) - planned.max = Y2Storage::DiskSize.GiB(40) + context "if the volume is configured with auto size" do + before do + volume.auto_size = true + end + + context "if there is a planned device for the volume" do + let(:planned_volume) do + Y2Storage::Planned::LvmLv.new("/").tap do |planned| + planned.min = Y2Storage::DiskSize.GiB(10) + planned.max = Y2Storage::DiskSize.GiB(40) + end + end + + it "sets the min and max sizes according to the planned device" do + result = subject.convert + + expect(result.min_size).to eq(Y2Storage::DiskSize.GiB(10)) + expect(result.max_size).to eq(Y2Storage::DiskSize.GiB(40)) end end - it "sets the min and max sizes according to the planned device" do - result = subject.convert + context "if there is no planned device for the volume" do + let(:planned_volume) do + Y2Storage::Planned::LvmLv.new("/home").tap do |planned| + planned.min = Y2Storage::DiskSize.GiB(10) + planned.max = Y2Storage::DiskSize.GiB(40) + end + end + + it "keeps the sizes of the given volume" do + result = subject.convert - expect(result.min_size).to eq(Y2Storage::DiskSize.GiB(10)) - expect(result.max_size).to eq(Y2Storage::DiskSize.GiB(40)) + expect(result.min_size).to eq(Y2Storage::DiskSize.GiB(5)) + expect(result.max_size).to eq(Y2Storage::DiskSize.GiB(20)) + end end end - context "if there is no planned device for the volume" do - let(:planned_devices) { [planned_volume] } + context "if the volume is not configured with auto size" do + before do + volume.auto_size = false + end let(:planned_volume) do - Y2Storage::Planned::LvmLv.new("/home").tap do |planned| + Y2Storage::Planned::LvmLv.new("/").tap do |planned| planned.min = Y2Storage::DiskSize.GiB(10) planned.max = Y2Storage::DiskSize.GiB(40) end end - it "sets the sizes of the given volume" do + it "keeps the sizes of the given volume" do result = subject.convert expect(result.min_size).to eq(Y2Storage::DiskSize.GiB(5)) diff --git a/service/test/agama/with_progress_examples.rb b/service/test/agama/with_progress_examples.rb index a4e463e799..89146bcef1 100644 --- a/service/test/agama/with_progress_examples.rb +++ b/service/test/agama/with_progress_examples.rb @@ -31,7 +31,7 @@ context "if a progress was started" do before do - subject.start_progress(1) + subject.start_progress_with_size(1) end it "returns the progress object" do @@ -40,27 +40,27 @@ end end - describe "#start_progress" do + describe "#start_progress_with_size" do context "if there is an unfinished progress" do before do - subject.start_progress(1) + subject.start_progress_with_size(1) end it "raises an error" do - expect { subject.start_progress(1) } + expect { subject.start_progress_with_size(1) } .to raise_error(Agama::WithProgress::NotFinishedProgress) end end context "if there is no unfinished progress" do before do - subject.start_progress(1) + subject.start_progress_with_size(1) subject.progress.finish end it "creates a new progress" do previous_progress = subject.progress - subject.start_progress(1) + subject.start_progress_with_size(1) expect(subject.progress).to_not eq(previous_progress) expect(subject.progress.finished?).to eq(false) end @@ -71,7 +71,7 @@ expect(callback).to receive(:call) - subject.start_progress(1) + subject.start_progress_with_size(1) subject.progress.step("step 1") end @@ -81,7 +81,7 @@ expect(callback).to receive(:call) - subject.start_progress(1) + subject.start_progress_with_size(1) subject.progress.finish end end @@ -90,7 +90,7 @@ describe "#finish" do context "when the current progress is not finished" do before do - subject.start_progress(1) + subject.start_progress_with_size(1) end it "finishes the current progress" do @@ -102,7 +102,7 @@ context "when the current progress is already finished" do before do - subject.start_progress(1) + subject.start_progress_with_size(1) subject.progress.step("") { nil } end diff --git a/web/package/agama-web-ui.changes b/web/package/agama-web-ui.changes index 3356e8ecdd..a862bfa63a 100644 --- a/web/package/agama-web-ui.changes +++ b/web/package/agama-web-ui.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Jun 20 05:33:29 UTC 2024 - Imobach Gonzalez Sosa + +- Adapt the installation progress screen to look like the + product selection one (gh#openSUSE/agama#1356). + ------------------------------------------------------------------- Fri Jun 14 13:55:27 UTC 2024 - David Diaz diff --git a/web/po/ca.po b/web/po/ca.po index 18765fee3b..3c1d518644 100644 --- a/web/po/ca.po +++ b/web/po/ca.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-16 02:26+0000\n" -"PO-Revision-Date: 2024-06-10 08:19+0000\n" +"POT-Creation-Date: 2024-06-20 02:20+0000\n" +"PO-Revision-Date: 2024-06-17 09:46+0000\n" "Last-Translator: David Medina \n" "Language-Team: Catalan \n" @@ -20,18 +20,16 @@ msgstr "" "X-Generator: Weblate 5.5.5\n" #: src/MainLayout.jsx:40 -#, fuzzy msgid "Agama" -msgstr "Quant a Agama" +msgstr "Agama" #: src/MainLayout.jsx:82 msgid "Change product" msgstr "Canvia el producte" #: src/components/core/About.jsx:49 -#, fuzzy msgid "About" -msgstr "Quant a Agama" +msgstr "Quant a" #: src/components/core/About.jsx:71 msgid "About Agama" @@ -107,11 +105,11 @@ msgstr "Cancel·la" msgid "Install" msgstr "Instal·la" -#: src/components/core/InstallationFinished.jsx:41 +#: src/components/core/InstallationFinished.jsx:42 msgid "TPM sealing requires the new system to be booted directly." msgstr "El segellament TPM requereix que el sistema nou s'iniciï directament." -#: src/components/core/InstallationFinished.jsx:46 +#: src/components/core/InstallationFinished.jsx:47 msgid "" "If a local media was used to run this installer, remove it before the next " "boot." @@ -119,16 +117,16 @@ msgstr "" "Si s'ha usat un mitjà local per executar aquest instal·lador, traieu-lo " "abans de la propera arrencada." -#: src/components/core/InstallationFinished.jsx:50 +#: src/components/core/InstallationFinished.jsx:51 msgid "Hide details" msgstr "Amaga els detalls" -#: src/components/core/InstallationFinished.jsx:50 +#: src/components/core/InstallationFinished.jsx:51 msgid "See more details" msgstr "Mostra'n més detalls" #. TRANSLATORS: "Trusted Platform Module" is the name of the technology and "TPM" its abbreviation -#: src/components/core/InstallationFinished.jsx:54 +#: src/components/core/InstallationFinished.jsx:55 msgid "" "The final step to configure the Trusted Platform Module (TPM) to " "automatically open encrypted devices will take place during the first boot " @@ -140,38 +138,36 @@ msgstr "" "arrencada del nou sistema. Perquè això funcioni, la màquina ha d'arrencar " "directament amb el carregador d'arrencada nou." -#: src/components/core/InstallationFinished.jsx:99 +#: src/components/core/InstallationFinished.jsx:97 msgid "Congratulations!" msgstr "Enhorabona!" -#: src/components/core/InstallationFinished.jsx:104 +#: src/components/core/InstallationFinished.jsx:102 msgid "The installation on your machine is complete." msgstr "La instal·lació a la màquina s'ha completat." -#: src/components/core/InstallationFinished.jsx:107 +#: src/components/core/InstallationFinished.jsx:105 msgid "At this point you can power off the machine." msgstr "En aquest punt, podeu aturar la màquina." -#: src/components/core/InstallationFinished.jsx:108 +#: src/components/core/InstallationFinished.jsx:106 msgid "At this point you can reboot the machine to log in to the new system." msgstr "" "En aquest punt, podeu reiniciar la màquina per iniciar sessió al sistema nou." -#: src/components/core/InstallationFinished.jsx:115 +#: src/components/core/InstallationFinished.jsx:113 msgid "Finish" msgstr "Acaba" -#: src/components/core/InstallationFinished.jsx:115 +#: src/components/core/InstallationFinished.jsx:113 msgid "Reboot" msgstr "Reinicia" #: src/components/core/InstallerOptions.jsx:57 -#, fuzzy msgid "Show installer options" -msgstr "Amaga les opcions de l'instal·lador" +msgstr "Mostra les opcions de l'instal·lador" #: src/components/core/InstallerOptions.jsx:62 -#, fuzzy msgid "Installer options" msgstr "Opcions de l'instal·lador" @@ -179,6 +175,7 @@ msgstr "Opcions de l'instal·lador" msgid "" "Before starting the installation, you need to address the following problems:" msgstr "" +"Abans de començar la instal·lació, heu de resoldre els problemes següents:" #: src/components/core/ListSearch.jsx:51 msgid "Search" @@ -206,14 +203,12 @@ msgstr "Inicieu sessió com a %s" #. it and keep the brackets. #: src/components/core/LoginPage.jsx:76 msgid "The installer requires [root] user privileges." -msgstr "" +msgstr "L'instal·lador requereix privilegis de l'usuari [root]." #: src/components/core/LoginPage.jsx:95 -#, fuzzy msgid "Please, provide its password to log in to the system." msgstr "" -"L'instal·lador requereix privilegis de l'usuari %s. Si us plau, proporcioneu-" -"ne la contrasenya per iniciar sessió al sistema." +"Si us plau, proporcioneu-ne la contrasenya per iniciar sessió al sistema." #: src/components/core/LoginPage.jsx:98 msgid "Login form" @@ -229,7 +224,7 @@ msgstr "Inicia la sessió" #: src/components/core/LoginPage.jsx:124 msgid "More about this" -msgstr "" +msgstr "Més sobre això" #: src/components/core/LogsButton.jsx:102 msgid "Collecting logs..." @@ -319,14 +314,12 @@ msgid "Keyboard" msgstr "Teclat" #: src/components/l10n/InstallerKeymapSwitcher.jsx:75 -#, fuzzy msgid "Choose a keyboard layout" -msgstr "Trieu un producte" +msgstr "Trieu una disposició de teclat" #: src/components/l10n/InstallerKeymapSwitcher.jsx:86 -#, fuzzy msgid "Cannot be changed in remote installation" -msgstr "La disposició del teclat no es pot canviar a la instal·lació remota." +msgstr "No es pot canviar a la instal·lació remota." #: src/components/l10n/InstallerLocaleSwitcher.jsx:57 #: src/components/l10n/L10nPage.jsx:67 @@ -334,23 +327,20 @@ msgid "Language" msgstr "Llengua" #: src/components/l10n/InstallerLocaleSwitcher.jsx:63 -#, fuzzy msgid "Choose a language" -msgstr "Canvia la llengua" +msgstr "Trieu la llengua" #: src/components/l10n/KeyboardSelection.jsx:45 msgid "Filter by description or keymap code" msgstr "Filtra per descripció o codi de mapa de tecles" #: src/components/l10n/KeyboardSelection.jsx:85 -#, fuzzy msgid "None of the keymaps match the filter." -msgstr "Cap dels patrons coincideix amb el filtre." +msgstr "Cap dels mapes de tecles coincideix amb el filtre." #: src/components/l10n/KeyboardSelection.jsx:92 -#, fuzzy msgid "Keyboard selection" -msgstr "Selecció de programari" +msgstr "Selecció del teclat" #: src/components/l10n/KeyboardSelection.jsx:107 #: src/components/l10n/L10nPage.jsx:71 src/components/l10n/L10nPage.jsx:82 @@ -368,9 +358,8 @@ msgstr "Localització" #: src/components/l10n/L10nPage.jsx:68 src/components/l10n/L10nPage.jsx:79 #: src/components/l10n/L10nPage.jsx:90 -#, fuzzy msgid "Not selected yet" -msgstr "Encara no s'ha seleccionat cap dispositiu." +msgstr "Encara no s'ha seleccionat." #: src/components/l10n/L10nPage.jsx:71 src/components/l10n/L10nPage.jsx:82 #: src/components/l10n/L10nPage.jsx:93 @@ -390,28 +379,24 @@ msgid "Filter by language, territory or locale code" msgstr "Filtra per llengua, territori o codi local" #: src/components/l10n/LocaleSelection.jsx:84 -#, fuzzy msgid "None of the locales match the filter." -msgstr "Cap dels patrons coincideix amb el filtre." +msgstr "Cap de les llengües coincideix amb el filtre." #: src/components/l10n/LocaleSelection.jsx:91 -#, fuzzy msgid "Locale selection" -msgstr "Selecció de programari" +msgstr "Selecció de la llengua" #: src/components/l10n/TimezoneSelection.jsx:71 msgid "Filter by territory, time zone code or UTC offset" msgstr "Filtra per territori, codi de zona horària o desplaçament d'UTC" #: src/components/l10n/TimezoneSelection.jsx:122 -#, fuzzy msgid "None of the time zones match the filter." -msgstr "Cap dels patrons coincideix amb el filtre." +msgstr "Cap de les zones horàries coincideix amb el filtre." #: src/components/l10n/TimezoneSelection.jsx:129 -#, fuzzy msgid " Timezone selection" -msgstr "Canvia la selecció" +msgstr " Selecció de la zona horària" #: src/components/layout/Loading.jsx:31 msgid "Loading installation environment, please wait." @@ -558,11 +543,11 @@ msgstr "Passarel·la" #: src/components/network/IpSettingsForm.jsx:178 msgid "Gateway can be defined only in 'Manual' mode" -msgstr "" +msgstr "La passarel·la només es pot definir en mode manual." #: src/components/network/IpSettingsForm.jsx:210 #: src/components/product/ProductRegistrationPage.jsx:89 -#: src/components/storage/BootSelection.jsx:216 +#: src/components/storage/BootSelection.jsx:215 #: src/components/storage/DeviceSelection.jsx:240 #: src/components/storage/EncryptionSettingsDialog.jsx:138 #: src/components/storage/VolumeDialog.jsx:786 @@ -604,14 +589,12 @@ msgid "Network" msgstr "Xarxa" #: src/components/network/NetworkPage.jsx:178 -#, fuzzy msgid "Wired connections" -msgstr "Oblida la connexió %s" +msgstr "Connexions amb fil" #: src/components/network/NetworkPage.jsx:185 -#, fuzzy msgid "WiFi connections" -msgstr "Edita la connexió %s" +msgstr "Connexions WiFi" #. TRANSLATORS: WiFi authentication mode #: src/components/network/WifiConnectionForm.jsx:43 @@ -702,9 +685,8 @@ msgstr "La connexió %s espera un canvi d'estat." #. TRANSLATORS: menu label, disconnect from the selected WiFi network #: src/components/network/WifiNetworkMenu.jsx:67 -#, fuzzy msgid "Disconnect" -msgstr "Desconnectat" +msgstr "Desconnecta" #. TRANSLATORS: menu label, remove the selected WiFi network settings #: src/components/network/WifiNetworkMenu.jsx:76 @@ -739,44 +721,42 @@ msgid "Software" msgstr "Programari" #: src/components/overview/OverviewPage.jsx:52 -#, fuzzy msgid "Ready for installation" -msgstr "Confirmeu la instal·lació" +msgstr "A punt per a la instal·lació" #: src/components/overview/OverviewPage.jsx:102 -#, fuzzy msgid "Installation" -msgstr "Instal·lant" +msgstr "Instal·lació" #: src/components/overview/OverviewPage.jsx:103 msgid "Before installing, please check the following problems." -msgstr "" +msgstr "Abans d'instal·lar, comproveu els problemes següents." #: src/components/overview/OverviewPage.jsx:114 -#, fuzzy msgid "" "Take your time to check your configuration before starting the installation " "process." msgstr "" -"La instal·lació configurarà les particions per arrencar al disc " -"d'instal·lació." +"Dediqueu el temps que calgui a comprovar la configuració abans de començar " +"el procés d'instal·lació." #: src/components/overview/OverviewPage.jsx:123 msgid "" "These are the most relevant installation settings. Feel free to browse the " "sections in the menu for further details." msgstr "" +"Aquests són els paràmetres d'instal·lació més rellevants. No dubteu a " +"navegar per les seccions del menú per a més detalls." #: src/components/overview/SoftwareSection.jsx:60 -#, fuzzy msgid "The installation will take" -msgstr "La instal·lació necessitarà %s" +msgstr "La instal·lació necessitarà" #. TRANSLATORS: %s will be replaced with the installation size, example: "5GiB". #: src/components/overview/SoftwareSection.jsx:67 -#, fuzzy, c-format +#, c-format msgid "The installation will take %s including:" -msgstr "La instal·lació necessitarà %s" +msgstr "La instal·lació necessitarà %s, incloent-hi el següent:" #: src/components/overview/StorageSection.jsx:53 msgid "" @@ -886,7 +866,7 @@ msgstr "" #: src/components/overview/routes.js:30 msgid "Overview" -msgstr "" +msgstr "Resum" #: src/components/product/ProductRegistrationPage.jsx:66 #, c-format @@ -906,18 +886,16 @@ msgid "Loading available products, please wait..." msgstr "Carregant els productes disponibles. Espereu, si us plau..." #: src/components/product/ProductSelectionProgress.jsx:88 -#, fuzzy msgid "Analyze disks" -msgstr "Activa els discs" +msgstr "Analitza els discs" #: src/components/product/ProductSelectionProgress.jsx:95 msgid "Configure software" -msgstr "" +msgstr "Configuració de programari" #: src/components/product/ProductSelectionProgress.jsx:156 -#, fuzzy msgid "Configuring the product, please wait ..." -msgstr "Carregant els productes disponibles. Espereu, si us plau..." +msgstr "Configurant el producte. Espereu, si us plau..." #: src/components/questions/GenericQuestion.jsx:35 #: src/components/questions/LuksActivationQuestion.jsx:60 @@ -948,9 +926,8 @@ msgstr "" "S'han seleccionat els patrons de programari següents per a la instal·lació:" #: src/components/software/SoftwarePage.jsx:165 -#, fuzzy msgid "Selected patterns" -msgstr "Seleccioneu la zona horària" +msgstr "Patrons seleccionats" #: src/components/software/SoftwarePage.jsx:168 msgid "Change selection" @@ -968,18 +945,20 @@ msgstr "Selecció de programari" #: src/components/software/SoftwarePatternsSelection.jsx:241 #: src/components/software/SoftwarePatternsSelection.jsx:242 msgid "Filter by pattern title or description" -msgstr "" +msgstr "Filtra per títol o descripció del patró" #. TRANSLATORS: %s will be replaced by the estimated installation size, #. example: "728.8 MiB" #: src/components/software/UsedSize.jsx:33 -#, fuzzy, c-format +#, c-format msgid "Installation will take %s." -msgstr "La instal·lació necessitarà %s" +msgstr "La instal·lació necessitarà %s." #: src/components/software/UsedSize.jsx:38 msgid "This space includes the base system and the selected software patterns." msgstr "" +"Aquest espai inclou el sistema de base i els patrons de programari " +"seleccionats." #: src/components/storage/BootConfigField.jsx:43 msgid "Change boot options" @@ -1002,7 +981,7 @@ msgstr "" msgid "Installation will configure partitions for booting at %s." msgstr "La instal·lació configurarà les particions per arrencar a %s." -#: src/components/storage/BootSelection.jsx:127 +#: src/components/storage/BootSelection.jsx:126 msgid "" "To ensure the new system is able to boot, the installer may need to create " "or configure some partitions in the appropriate disk." @@ -1010,44 +989,43 @@ msgstr "" "Per garantir que el sistema nou pugui arrencar, és possible que " "l'instal·lador hagi de crear o configurar algunes particions al disc adequat." -#: src/components/storage/BootSelection.jsx:133 +#: src/components/storage/BootSelection.jsx:132 msgid "Partitions to boot will be allocated at the installation disk." msgstr "Les particions per a l'arrencada s'assignaran al disc d'instal·lació." #. TRANSLATORS: %s is replaced by a device name and size (e.g., "/dev/sda, 500GiB") -#: src/components/storage/BootSelection.jsx:138 +#: src/components/storage/BootSelection.jsx:137 #, c-format msgid "Partitions to boot will be allocated at the installation disk (%s)." msgstr "" "Les particions per a l'arrencada s'assignaran al disc d'instal·lació (%s)." -#: src/components/storage/BootSelection.jsx:154 -#, fuzzy +#: src/components/storage/BootSelection.jsx:153 msgid "Select booting partition" -msgstr "Seleccioneu què voleu fer amb cada partició." +msgstr "Seleccioneu la partició d'arrencada" -#: src/components/storage/BootSelection.jsx:168 +#: src/components/storage/BootSelection.jsx:167 #: src/components/storage/iscsi/NodeStartupOptions.js:27 msgid "Automatic" msgstr "Automàtica" -#: src/components/storage/BootSelection.jsx:177 +#: src/components/storage/BootSelection.jsx:176 msgid "Select a disk" msgstr "Seleccioneu un disc" -#: src/components/storage/BootSelection.jsx:181 +#: src/components/storage/BootSelection.jsx:180 msgid "Partitions to boot will be allocated at the following device." msgstr "Les particions per a l'arrencada s'assignaran al dispositiu següent." -#: src/components/storage/BootSelection.jsx:184 +#: src/components/storage/BootSelection.jsx:183 msgid "Choose a disk for placing the boot loader" msgstr "Trieu un disc per posar-hi el carregador d'arrencada" -#: src/components/storage/BootSelection.jsx:200 +#: src/components/storage/BootSelection.jsx:199 msgid "Do not configure" msgstr "No ho configuris" -#: src/components/storage/BootSelection.jsx:203 +#: src/components/storage/BootSelection.jsx:202 msgid "" "No partitions will be automatically configured for booting. Use with caution." msgstr "" @@ -1170,9 +1148,8 @@ msgid "Remove max channel filter" msgstr "Suprimeix el filtre de canal màxim" #: src/components/storage/DeviceSelection.jsx:101 -#, fuzzy msgid "Loading data, please wait a second..." -msgstr "Carregant els productes disponibles. Espereu, si us plau..." +msgstr "Carregant dades. Espereu, si us plau..." #. TRANSLATORS: description for using plain partitions for installing the #. system, the text in the square brackets [] is displayed in bold, use only @@ -1199,24 +1176,20 @@ msgstr "" "demanda com a particions noves als dispositius seleccionats." #: src/components/storage/DeviceSelection.jsx:149 -#, fuzzy msgid "Select installation device" -msgstr "al dispositiu d'instal·lació" +msgstr "Seleccioneu el dispositiu d'instal·lació" #: src/components/storage/DeviceSelection.jsx:155 -#, fuzzy msgid "Install new system on" -msgstr "Opcions de l'instal·lador" +msgstr "Instal·la el sistema nou" #: src/components/storage/DeviceSelection.jsx:158 -#, fuzzy msgid "An existing disk" -msgstr "Encongeix les particions existents" +msgstr "un disc existent" #: src/components/storage/DeviceSelection.jsx:167 -#, fuzzy msgid "A new LVM Volume Group" -msgstr "grup de volums LVM nou" +msgstr "un grup de volums d'LVM nou" #: src/components/storage/DeviceSelection.jsx:192 msgid "Device selector for target disk" @@ -1231,7 +1204,6 @@ msgid "Prepare more devices by configuring advanced" msgstr "Prepareu més dispositius mitjançant la configuració avançada" #: src/components/storage/DeviceSelection.jsx:229 -#, fuzzy msgid "storage techs" msgstr "tecnologies d'emmagatzematge" @@ -1310,7 +1282,7 @@ msgstr "Detalls" #: src/components/storage/PartitionsField.jsx:451 #: src/components/storage/ProposalResultTable.jsx:123 #: src/components/storage/SpaceActionsTable.jsx:143 -#: src/components/storage/VolumeFields.jsx:472 +#: src/components/storage/VolumeFields.jsx:474 #: src/components/storage/VolumeLocationSelectorTable.jsx:103 msgid "Size" msgstr "Mida" @@ -1342,13 +1314,12 @@ msgid "Encryption" msgstr "Encriptació" #: src/components/storage/EncryptionField.jsx:39 -#, fuzzy msgid "" "Protection for the information stored at the device, including data, " "programs, and system files." msgstr "" -"L'encriptació de disc complet (FDE) permet protegir la informació " -"emmagatzemada al dispositiu, incloses dades, programes i fitxers del sistema." +"Protecció per a la informació emmagatzemada al dispositiu, incloses les " +"dades, els programes i els fitxers del sistema." #: src/components/storage/EncryptionField.jsx:42 msgid "disabled" @@ -1363,13 +1334,12 @@ msgid "using TPM unlocking" msgstr "usant el desblocatge de TPM" #: src/components/storage/EncryptionField.jsx:58 -#, fuzzy msgid "Enable" -msgstr "habilitada" +msgstr "Habilita" #: src/components/storage/EncryptionField.jsx:58 msgid "Modify" -msgstr "" +msgstr "Modifica" #: src/components/storage/EncryptionSettingsDialog.jsx:37 msgid "" @@ -1410,28 +1380,24 @@ msgstr "Dispositiu d'instal·lació" #. TRANSLATORS: The storage "Installation device" field's description. #: src/components/storage/InstallationDeviceField.jsx:42 -#, fuzzy msgid "Main disk or LVM Volume Group for installation." -msgstr "" -"Seleccioneu el disc principal o el grup de volums d'LVM per a la " -"instal·lació." +msgstr "Disc principal o grup de volums d'LVM per a la instal·lació." #. TRANSLATORS: %s is the installation disk (eg. "/dev/sda, 80 GiB) #: src/components/storage/InstallationDeviceField.jsx:56 -#, fuzzy, c-format +#, c-format msgid "File systems created as new partitions at %s" -msgstr "Crea una partició nova" +msgstr "Sistemes de fitxers creats com a particions noves a %s" #: src/components/storage/InstallationDeviceField.jsx:59 -#, fuzzy msgid "File systems created at a new LVM volume group" -msgstr "Selector de dispositius per al grup de volums LVM nou" +msgstr "Sistemes de fitxers creats en un nou grup de volums d'LVM" #. TRANSLATORS: %s is the disk used for the LVM physical volumes (eg. "/dev/sda, 80 GiB) #: src/components/storage/InstallationDeviceField.jsx:63 -#, fuzzy, c-format +#, c-format msgid "File systems created at a new LVM volume group on %s" -msgstr "grup de volums LVM nou a %s" +msgstr "Sistemes de fitxers creats en un nou grup de volums d'LVM a %s" #. TRANSLATORS: minimum device size, %s is replaced by size string, e.g. "17.5 GiB" #: src/components/storage/PartitionsField.jsx:73 @@ -1624,9 +1590,9 @@ msgid "Delete" msgstr "Suprimeix" #: src/components/storage/PartitionsField.jsx:449 -#: src/components/storage/VolumeFields.jsx:59 -#: src/components/storage/VolumeFields.jsx:68 -#: src/components/storage/VolumeFields.jsx:73 +#: src/components/storage/VolumeFields.jsx:61 +#: src/components/storage/VolumeFields.jsx:70 +#: src/components/storage/VolumeFields.jsx:75 msgid "Mount point" msgstr "Punt de muntatge" @@ -1658,18 +1624,16 @@ msgid "Partitions and file systems" msgstr "Particions i sistemes de fitxers" #: src/components/storage/PartitionsField.jsx:802 -#, fuzzy msgid "" "Structure of the new system, including any additional partition needed for " "booting" msgstr "" "Estructura del sistema nou, inclosa qualsevol partició addicional necessària " -"per a arrencar," +"per a arrencar" #: src/components/storage/PartitionsField.jsx:808 -#, fuzzy msgid "Show partitions and file-systems actions" -msgstr "Particions i sistemes de fitxers" +msgstr "Mostra les particions i les accions dels sistemes de fitxers" #. TRANSLATORS: show/hide toggle action, this is a clickable link #: src/components/storage/ProposalActionsDialog.jsx:62 @@ -1699,11 +1663,11 @@ msgid "Affecting" msgstr "Això afecta" #: src/components/storage/ProposalResultSection.jsx:96 -#, fuzzy, c-format +#, c-format msgid "Check the planned action" msgid_plural "Check the %d planned actions" -msgstr[0] "Marca totes les accions planificades" -msgstr[1] "Marca totes les accions planificades" +msgstr[0] "Marca l'acció planificada" +msgstr[1] "Marca les %d accions planificades" #: src/components/storage/ProposalResultSection.jsx:111 msgid "Waiting for information about storage configuration" @@ -1711,16 +1675,15 @@ msgstr "Esperant informació sobre la configuració de l'emmagatzematge" #: src/components/storage/ProposalResultSection.jsx:124 msgid "Storage proposal not possible" -msgstr "" +msgstr "La proposta d'emmagatzematge no és possible." #: src/components/storage/ProposalResultSection.jsx:188 -#, fuzzy msgid "" "During installation, some actions will be performed to configure the system " "as displayed below." msgstr "" -"Durant la instal·lació, es farà %d acció per configurar el sistema tal com " -"es mostra a continuació." +"Durant la instal·lació, es faran algunes accions per configurar el sistema " +"tal com es mostra a continuació." #: src/components/storage/ProposalResultSection.jsx:196 msgid "Planned Actions" @@ -1745,11 +1708,11 @@ msgstr "Abans: %s" msgid "Mount Point" msgstr "Punt de muntatge" -#: src/components/storage/ProposalTransactionalInfo.jsx:46 +#: src/components/storage/ProposalTransactionalInfo.jsx:45 msgid "Transactional root file system" msgstr "Sistema de fitxers d'arrel transaccional" -#: src/components/storage/ProposalTransactionalInfo.jsx:49 +#: src/components/storage/ProposalTransactionalInfo.jsx:48 #, c-format msgid "" "%s is an immutable system with atomic updates. It uses a read-only Btrfs " @@ -1897,7 +1860,7 @@ msgid "Do you want to add it?" msgstr "L'hi voleu afegir?" #. TRANSLATORS: info about possible file system types. -#: src/components/storage/VolumeFields.jsx:215 +#: src/components/storage/VolumeFields.jsx:217 msgid "" "The options for the file system type depends on the product and the mount " "point." @@ -1905,68 +1868,68 @@ msgstr "" "Les opcions per al tipus de sistema de fitxers depenen del producte i del " "punt de muntatge." -#: src/components/storage/VolumeFields.jsx:221 +#: src/components/storage/VolumeFields.jsx:223 msgid "More info for file system types" msgstr "Més informació sobre els tipus de sistemes de fitxers" #. TRANSLATORS: label for the file system selector. -#: src/components/storage/VolumeFields.jsx:232 +#: src/components/storage/VolumeFields.jsx:234 msgid "File system type" msgstr "Tipus de sistema de fitxers" #. TRANSLATORS: item which affects the final computed partition size -#: src/components/storage/VolumeFields.jsx:263 +#: src/components/storage/VolumeFields.jsx:265 msgid "the configuration of snapshots" msgstr "la configuració de les instantànies" #. TRANSLATORS: item which affects the final computed partition size #. %s is replaced by a list of mount points like "/home, /boot" -#: src/components/storage/VolumeFields.jsx:268 +#: src/components/storage/VolumeFields.jsx:270 #, c-format msgid "the presence of the file system for %s" msgstr "la presència del sistema de fitxers per a %s" #. TRANSLATORS: conjunction for merging two list items -#: src/components/storage/VolumeFields.jsx:270 +#: src/components/storage/VolumeFields.jsx:272 msgid ", " msgstr ", " #. TRANSLATORS: item which affects the final computed partition size -#: src/components/storage/VolumeFields.jsx:274 +#: src/components/storage/VolumeFields.jsx:276 msgid "the amount of RAM in the system" msgstr "la quantitat de RAM del sistema" #. TRANSLATORS: the %s is replaced by the items which affect the computed size -#: src/components/storage/VolumeFields.jsx:277 +#: src/components/storage/VolumeFields.jsx:279 #, c-format msgid "The final size depends on %s." msgstr "La mida final depèn de %s." #. TRANSLATORS: conjunction for merging two texts -#: src/components/storage/VolumeFields.jsx:279 +#: src/components/storage/VolumeFields.jsx:281 msgid " and " msgstr " i " #. TRANSLATORS: the partition size is automatically computed -#: src/components/storage/VolumeFields.jsx:284 +#: src/components/storage/VolumeFields.jsx:286 msgid "Automatically calculated size according to the selected product." msgstr "Mida calculada automàticament segons el producte seleccionat." -#: src/components/storage/VolumeFields.jsx:303 +#: src/components/storage/VolumeFields.jsx:305 msgid "Exact size for the file system." msgstr "Mida exacta per al sistema de fitxers." #. TRANSLATORS: requested partition size -#: src/components/storage/VolumeFields.jsx:316 +#: src/components/storage/VolumeFields.jsx:318 msgid "Exact size" msgstr "Mida exacta" #. TRANSLATORS: units selector (like KiB, MiB, GiB...) -#: src/components/storage/VolumeFields.jsx:333 +#: src/components/storage/VolumeFields.jsx:335 msgid "Size unit" msgstr "Unitat de mida" -#: src/components/storage/VolumeFields.jsx:361 +#: src/components/storage/VolumeFields.jsx:363 msgid "" "Limits for the file system size. The final size will be a value between the " "given minimum and maximum. If no maximum is given then the file system will " @@ -1977,45 +1940,45 @@ msgstr "" "de fitxers serà el més gros possible." #. TRANSLATORS: the minimal partition size -#: src/components/storage/VolumeFields.jsx:368 +#: src/components/storage/VolumeFields.jsx:370 msgid "Minimum" msgstr "Mínim" #. TRANSLATORS: the minium partition size -#: src/components/storage/VolumeFields.jsx:379 +#: src/components/storage/VolumeFields.jsx:381 msgid "Minimum desired size" msgstr "Mida mínima desitjada" -#: src/components/storage/VolumeFields.jsx:390 +#: src/components/storage/VolumeFields.jsx:392 msgid "Unit for the minimum size" msgstr "Unitat per a la mida mínima" #. TRANSLATORS: the maximum partition size -#: src/components/storage/VolumeFields.jsx:402 +#: src/components/storage/VolumeFields.jsx:404 msgid "Maximum" msgstr "Màxim" #. TRANSLATORS: the maximum partition size -#: src/components/storage/VolumeFields.jsx:414 +#: src/components/storage/VolumeFields.jsx:416 msgid "Maximum desired size" msgstr "Mida màxima desitjada" -#: src/components/storage/VolumeFields.jsx:424 +#: src/components/storage/VolumeFields.jsx:426 msgid "Unit for the maximum size" msgstr "Unitat per a la mida màxima" #. TRANSLATORS: radio button label, fully automatically computed partition size, no user input -#: src/components/storage/VolumeFields.jsx:442 +#: src/components/storage/VolumeFields.jsx:444 msgid "Auto" msgstr "Automàtica" #. TRANSLATORS: radio button label, exact partition size requested by user -#: src/components/storage/VolumeFields.jsx:444 +#: src/components/storage/VolumeFields.jsx:446 msgid "Fixed" msgstr "Fixa" #. TRANSLATORS: radio button label, automatically computed partition size within the user provided min and max limits -#: src/components/storage/VolumeFields.jsx:446 +#: src/components/storage/VolumeFields.jsx:448 msgid "Range" msgstr "Interval" @@ -2362,7 +2325,7 @@ msgstr "Destinacions" #: src/components/storage/routes.js:36 msgid "Proposal" -msgstr "" +msgstr "Proposta" #: src/components/storage/utils.js:64 msgid "KiB" @@ -2395,9 +2358,8 @@ msgstr "Totes les particions se suprimiran i es perdran les dades dels discs." #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space deleting current content". Keep it short #: src/components/storage/utils.js:82 -#, fuzzy msgid "deleting current content" -msgstr "Suprimeix el contingut actual" +msgstr "suprimint contingut actual." #: src/components/storage/utils.js:87 msgid "Shrink existing partitions" @@ -2412,9 +2374,8 @@ msgstr "" #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space shrinking partitions". Keep it short. #: src/components/storage/utils.js:92 -#, fuzzy msgid "shrinking partitions" -msgstr "Encongeix les particions existents" +msgstr "encongint particions existents." #: src/components/storage/utils.js:97 msgid "Use available space" @@ -2443,9 +2404,8 @@ msgstr "Seleccioneu què voleu fer amb cada partició." #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space with custom actions". Keep it short. #: src/components/storage/utils.js:112 -#, fuzzy msgid "with custom actions" -msgstr "fent un conjunt d'accions personalitzades." +msgstr "amb accions personalitzades." #: src/components/users/FirstUser.jsx:35 msgid "No user defined yet." @@ -2491,23 +2451,20 @@ msgid "Use suggested username" msgstr "Usa el nom d'usuari suggerit" #: src/components/users/FirstUserForm.jsx:140 -#, fuzzy msgid "All fields are required" -msgstr "Cal un valor de mida" +msgstr "Tots els camps són obligatoris." #: src/components/users/FirstUserForm.jsx:147 msgid "Please, try again." -msgstr "" +msgstr "Si us plau, torneu-ho a provar." #: src/components/users/FirstUserForm.jsx:197 -#, fuzzy msgid "Create user" -msgstr "Crea un compte d'usuari" +msgstr "Crea un usuari" #: src/components/users/FirstUserForm.jsx:197 -#, fuzzy msgid "Edit user" -msgstr "Edita %s" +msgstr "Edita l'usuari" #: src/components/users/FirstUserForm.jsx:214 #: src/components/users/FirstUserForm.jsx:216 @@ -2616,21 +2573,19 @@ msgstr "Neteja" #: src/components/users/UsersPage.jsx:45 msgid "First user" -msgstr "" +msgstr "Usuari primer" #: src/components/users/UsersPage.jsx:52 msgid "Root authentication" msgstr "Autenticació d'arrel" #: src/components/users/routes.js:41 -#, fuzzy msgid "Create or edit the first user" -msgstr "No es pot llegir el fitxer." +msgstr "Creeu o editeu l'usuari primer" #: src/components/users/routes.js:48 -#, fuzzy msgid "Edit first user" -msgstr "Edita el sistema de fitxers" +msgstr "Edita l'usuari primer" #~ msgid "" #~ "There are some reported issues. Please review them in the previous steps " diff --git a/web/po/cs.po b/web/po/cs.po index 30ddd03497..1b161822d9 100644 --- a/web/po/cs.po +++ b/web/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-16 02:26+0000\n" +"POT-Creation-Date: 2024-06-20 02:20+0000\n" "PO-Revision-Date: 2023-12-31 20:39+0000\n" "Last-Translator: Ladislav Slezák \n" "Language-Team: Czech \n" "Language-Team: German \n" "Language-Team: Spanish \n" "Language-Team: French \n" "Language-Team: Indonesian \n" "Language-Team: Japanese \n" @@ -20,18 +20,16 @@ msgstr "" "X-Generator: Weblate 5.5.5\n" #: src/MainLayout.jsx:40 -#, fuzzy msgid "Agama" -msgstr "Agama について" +msgstr "Agama" #: src/MainLayout.jsx:82 msgid "Change product" msgstr "製品の変更" #: src/components/core/About.jsx:49 -#, fuzzy msgid "About" -msgstr "Agama について" +msgstr "バージョン情報" #: src/components/core/About.jsx:71 msgid "About Agama" @@ -105,12 +103,12 @@ msgstr "キャンセル" msgid "Install" msgstr "インストール" -#: src/components/core/InstallationFinished.jsx:41 +#: src/components/core/InstallationFinished.jsx:42 msgid "TPM sealing requires the new system to be booted directly." msgstr "" "TPM シーリングを使用するには、新しいシステムを直接起動する必要があります。" -#: src/components/core/InstallationFinished.jsx:46 +#: src/components/core/InstallationFinished.jsx:47 msgid "" "If a local media was used to run this installer, remove it before the next " "boot." @@ -118,16 +116,16 @@ msgstr "" "このインストーラの起動に際してローカルメディアを使用している場合は、次回の再" "起動までの間にメディアを取り出しておいてください。" -#: src/components/core/InstallationFinished.jsx:50 +#: src/components/core/InstallationFinished.jsx:51 msgid "Hide details" msgstr "詳細を隠す" -#: src/components/core/InstallationFinished.jsx:50 +#: src/components/core/InstallationFinished.jsx:51 msgid "See more details" msgstr "さらに詳細を表示する" #. TRANSLATORS: "Trusted Platform Module" is the name of the technology and "TPM" its abbreviation -#: src/components/core/InstallationFinished.jsx:54 +#: src/components/core/InstallationFinished.jsx:55 msgid "" "The final step to configure the Trusted Platform Module (TPM) to " "automatically open encrypted devices will take place during the first boot " @@ -139,44 +137,42 @@ msgstr "" "は、マシンが新しいブートローダを直接起動するように設定しておく必要がありま" "す。" -#: src/components/core/InstallationFinished.jsx:99 +#: src/components/core/InstallationFinished.jsx:97 msgid "Congratulations!" msgstr "おめでとうございます!" -#: src/components/core/InstallationFinished.jsx:104 +#: src/components/core/InstallationFinished.jsx:102 msgid "The installation on your machine is complete." msgstr "お使いのマシンへのインストールが完了しました。" -#: src/components/core/InstallationFinished.jsx:107 +#: src/components/core/InstallationFinished.jsx:105 msgid "At this point you can power off the machine." msgstr "マシンの電源を切って問題ありません。" -#: src/components/core/InstallationFinished.jsx:108 +#: src/components/core/InstallationFinished.jsx:106 msgid "At this point you can reboot the machine to log in to the new system." msgstr "あとはマシンを再起動して新しいシステムにログインするだけです。" -#: src/components/core/InstallationFinished.jsx:115 +#: src/components/core/InstallationFinished.jsx:113 msgid "Finish" msgstr "完了" -#: src/components/core/InstallationFinished.jsx:115 +#: src/components/core/InstallationFinished.jsx:113 msgid "Reboot" msgstr "再起動" #: src/components/core/InstallerOptions.jsx:57 -#, fuzzy msgid "Show installer options" -msgstr "インストーラのオプションを隠す" +msgstr "インストーラのオプションを表示" #: src/components/core/InstallerOptions.jsx:62 -#, fuzzy msgid "Installer options" msgstr "インストーラのオプション" #: src/components/core/IssuesHint.jsx:34 msgid "" "Before starting the installation, you need to address the following problems:" -msgstr "" +msgstr "インストールを開始する前に、下記の問題に対応する必要があります:" #: src/components/core/ListSearch.jsx:51 msgid "Search" @@ -204,14 +200,11 @@ msgstr "%s としてログイン" #. it and keep the brackets. #: src/components/core/LoginPage.jsx:76 msgid "The installer requires [root] user privileges." -msgstr "" +msgstr "インストーラを使用するには [root] 権限が必要です。" #: src/components/core/LoginPage.jsx:95 -#, fuzzy msgid "Please, provide its password to log in to the system." -msgstr "" -"インストーラは %s ユーザ権限を必要としています。システムにログインするため、" -"パスワードを入力してください。" +msgstr "システムにログインするためのパスワードを入力してください。" #: src/components/core/LoginPage.jsx:98 msgid "Login form" @@ -227,7 +220,7 @@ msgstr "ログイン" #: src/components/core/LoginPage.jsx:124 msgid "More about this" -msgstr "" +msgstr "こちらについて詳しく" #: src/components/core/LogsButton.jsx:102 msgid "Collecting logs..." @@ -316,14 +309,12 @@ msgid "Keyboard" msgstr "キーボード" #: src/components/l10n/InstallerKeymapSwitcher.jsx:75 -#, fuzzy msgid "Choose a keyboard layout" -msgstr "製品を選択してください" +msgstr "キーボードレイアウトを選択してください" #: src/components/l10n/InstallerKeymapSwitcher.jsx:86 -#, fuzzy msgid "Cannot be changed in remote installation" -msgstr "リモートインストールの場合、キーボードレイアウトは変更できません" +msgstr "リモートインストールの場合は変更できません" #: src/components/l10n/InstallerLocaleSwitcher.jsx:57 #: src/components/l10n/L10nPage.jsx:67 @@ -331,23 +322,20 @@ msgid "Language" msgstr "言語" #: src/components/l10n/InstallerLocaleSwitcher.jsx:63 -#, fuzzy msgid "Choose a language" -msgstr "言語の変更" +msgstr "言語の選択" #: src/components/l10n/KeyboardSelection.jsx:45 msgid "Filter by description or keymap code" msgstr "説明またはキーマップコードでフィルタ" #: src/components/l10n/KeyboardSelection.jsx:85 -#, fuzzy msgid "None of the keymaps match the filter." -msgstr "フィルタに該当するパターンがありません。" +msgstr "フィルタに該当するキーマップがありません。" #: src/components/l10n/KeyboardSelection.jsx:92 -#, fuzzy msgid "Keyboard selection" -msgstr "ソフトウエア選択" +msgstr "キーボードの選択" #: src/components/l10n/KeyboardSelection.jsx:107 #: src/components/l10n/L10nPage.jsx:71 src/components/l10n/L10nPage.jsx:82 @@ -365,9 +353,8 @@ msgstr "ローカライゼーション" #: src/components/l10n/L10nPage.jsx:68 src/components/l10n/L10nPage.jsx:79 #: src/components/l10n/L10nPage.jsx:90 -#, fuzzy msgid "Not selected yet" -msgstr "まだ何もデバイスを選択していません" +msgstr "まだ何も選択していません" #: src/components/l10n/L10nPage.jsx:71 src/components/l10n/L10nPage.jsx:82 #: src/components/l10n/L10nPage.jsx:93 @@ -387,28 +374,24 @@ msgid "Filter by language, territory or locale code" msgstr "言語/地域/ロケールコードでフィルタ" #: src/components/l10n/LocaleSelection.jsx:84 -#, fuzzy msgid "None of the locales match the filter." -msgstr "フィルタに該当するパターンがありません。" +msgstr "フィルタに該当するロケールがありません。" #: src/components/l10n/LocaleSelection.jsx:91 -#, fuzzy msgid "Locale selection" -msgstr "ソフトウエア選択" +msgstr "ロケールの選択" #: src/components/l10n/TimezoneSelection.jsx:71 msgid "Filter by territory, time zone code or UTC offset" msgstr "地域/タイムゾーンコード/UTC オフセット値でフィルタ" #: src/components/l10n/TimezoneSelection.jsx:122 -#, fuzzy msgid "None of the time zones match the filter." -msgstr "フィルタに該当するパターンがありません。" +msgstr "フィルタに該当するタイムゾーンがありません。" #: src/components/l10n/TimezoneSelection.jsx:129 -#, fuzzy msgid " Timezone selection" -msgstr "選択の変更" +msgstr " タイムゾーンの選択" #: src/components/layout/Loading.jsx:31 msgid "Loading installation environment, please wait." @@ -556,11 +539,11 @@ msgstr "ゲートウエイ" #: src/components/network/IpSettingsForm.jsx:178 msgid "Gateway can be defined only in 'Manual' mode" -msgstr "" +msgstr "'手動' モードの場合にのみゲートウエイを設定できます" #: src/components/network/IpSettingsForm.jsx:210 #: src/components/product/ProductRegistrationPage.jsx:89 -#: src/components/storage/BootSelection.jsx:216 +#: src/components/storage/BootSelection.jsx:215 #: src/components/storage/DeviceSelection.jsx:240 #: src/components/storage/EncryptionSettingsDialog.jsx:138 #: src/components/storage/VolumeDialog.jsx:786 @@ -602,14 +585,12 @@ msgid "Network" msgstr "ネットワーク" #: src/components/network/NetworkPage.jsx:178 -#, fuzzy msgid "Wired connections" -msgstr "接続 %s の削除" +msgstr "有線接続" #: src/components/network/NetworkPage.jsx:185 -#, fuzzy msgid "WiFi connections" -msgstr "接続 %s の編集" +msgstr "無線接続" #. TRANSLATORS: WiFi authentication mode #: src/components/network/WifiConnectionForm.jsx:43 @@ -699,9 +680,8 @@ msgstr "接続 %s は状態の変化を待っています" #. TRANSLATORS: menu label, disconnect from the selected WiFi network #: src/components/network/WifiNetworkMenu.jsx:67 -#, fuzzy msgid "Disconnect" -msgstr "切断済み" +msgstr "切断" #. TRANSLATORS: menu label, remove the selected WiFi network settings #: src/components/network/WifiNetworkMenu.jsx:76 @@ -736,44 +716,40 @@ msgid "Software" msgstr "ソフトウエア" #: src/components/overview/OverviewPage.jsx:52 -#, fuzzy msgid "Ready for installation" -msgstr "インストールの確認" +msgstr "インストールの準備完了" #: src/components/overview/OverviewPage.jsx:102 -#, fuzzy msgid "Installation" -msgstr "インストールしています" +msgstr "インストール" #: src/components/overview/OverviewPage.jsx:103 msgid "Before installing, please check the following problems." -msgstr "" +msgstr "インストールを行う前に、下記の問題点をご確認ください。" #: src/components/overview/OverviewPage.jsx:114 -#, fuzzy msgid "" "Take your time to check your configuration before starting the installation " "process." -msgstr "" -"インストール作業でインストール先のディスクに起動用のパーティションを設定しま" -"す。" +msgstr "インストール処理を開始する前に、設定内容をよくご確認ください。" #: src/components/overview/OverviewPage.jsx:123 msgid "" "These are the most relevant installation settings. Feel free to browse the " "sections in the menu for further details." msgstr "" +"インストールにあたっての主要な項目のみを表示しています。さらに詳しい設定を確" +"認したい場合は、それぞれのセクションを開いてください。" #: src/components/overview/SoftwareSection.jsx:60 -#, fuzzy msgid "The installation will take" -msgstr "インストールを行うには %s が必要です" +msgstr "インストールで占有する容量は" #. TRANSLATORS: %s will be replaced with the installation size, example: "5GiB". #: src/components/overview/SoftwareSection.jsx:67 -#, fuzzy, c-format +#, c-format msgid "The installation will take %s including:" -msgstr "インストールを行うには %s が必要です" +msgstr "インストールを行うには、下記を含めた %s が必要です:" #: src/components/overview/StorageSection.jsx:53 msgid "" @@ -880,7 +856,7 @@ msgstr "" #: src/components/overview/routes.js:30 msgid "Overview" -msgstr "" +msgstr "概要" #: src/components/product/ProductRegistrationPage.jsx:66 #, c-format @@ -900,18 +876,16 @@ msgid "Loading available products, please wait..." msgstr "利用可能な製品を読み込んでいます。しばらくお待ちください..." #: src/components/product/ProductSelectionProgress.jsx:88 -#, fuzzy msgid "Analyze disks" -msgstr "ディスクの有効化" +msgstr "ディスクの分析" #: src/components/product/ProductSelectionProgress.jsx:95 msgid "Configure software" -msgstr "" +msgstr "ソフトウエアの設定" #: src/components/product/ProductSelectionProgress.jsx:156 -#, fuzzy msgid "Configuring the product, please wait ..." -msgstr "利用可能な製品を読み込んでいます。しばらくお待ちください..." +msgstr "製品を設定しています。しばらくお待ちください..." #: src/components/questions/GenericQuestion.jsx:35 #: src/components/questions/LuksActivationQuestion.jsx:60 @@ -941,9 +915,8 @@ msgid "The following software patterns are selected for installation:" msgstr "下記のソフトウエアパターンをインストールするよう選択しています:" #: src/components/software/SoftwarePage.jsx:165 -#, fuzzy msgid "Selected patterns" -msgstr "タイムゾーンの選択" +msgstr "パターンの選択" #: src/components/software/SoftwarePage.jsx:168 msgid "Change selection" @@ -961,18 +934,19 @@ msgstr "ソフトウエア選択" #: src/components/software/SoftwarePatternsSelection.jsx:241 #: src/components/software/SoftwarePatternsSelection.jsx:242 msgid "Filter by pattern title or description" -msgstr "" +msgstr "パターンタイトルまたは説明でフィルタ" #. TRANSLATORS: %s will be replaced by the estimated installation size, #. example: "728.8 MiB" #: src/components/software/UsedSize.jsx:33 -#, fuzzy, c-format +#, c-format msgid "Installation will take %s." -msgstr "インストールを行うには %s が必要です" +msgstr "インストールを行うには %s が必要です。" #: src/components/software/UsedSize.jsx:38 msgid "This space includes the base system and the selected software patterns." msgstr "" +"この容量はシステムの基本部分のほか、選択したソフトウエアパターンを含みます。" #: src/components/storage/BootConfigField.jsx:43 msgid "Change boot options" @@ -995,7 +969,7 @@ msgstr "" msgid "Installation will configure partitions for booting at %s." msgstr "インストール作業で %s に起動用のパーティションを設定します。" -#: src/components/storage/BootSelection.jsx:127 +#: src/components/storage/BootSelection.jsx:126 msgid "" "To ensure the new system is able to boot, the installer may need to create " "or configure some partitions in the appropriate disk." @@ -1003,44 +977,43 @@ msgstr "" "システムを起動できるようにするため、インストーラはディスク内にいくつかの追加" "パーティションを作成もしくは設定する必要があるかもしれません。" -#: src/components/storage/BootSelection.jsx:133 +#: src/components/storage/BootSelection.jsx:132 msgid "Partitions to boot will be allocated at the installation disk." msgstr "インストール先のディスク内に起動用のパーティションを割り当てます。" #. TRANSLATORS: %s is replaced by a device name and size (e.g., "/dev/sda, 500GiB") -#: src/components/storage/BootSelection.jsx:138 +#: src/components/storage/BootSelection.jsx:137 #, c-format msgid "Partitions to boot will be allocated at the installation disk (%s)." msgstr "" "インストール先のディスク (%s) 内に起動用のパーティションを割り当てます。" -#: src/components/storage/BootSelection.jsx:154 -#, fuzzy +#: src/components/storage/BootSelection.jsx:153 msgid "Select booting partition" -msgstr "パーティションの設定作業を独自に実施します。" +msgstr "起動パーティションの選択" -#: src/components/storage/BootSelection.jsx:168 +#: src/components/storage/BootSelection.jsx:167 #: src/components/storage/iscsi/NodeStartupOptions.js:27 msgid "Automatic" msgstr "自動" -#: src/components/storage/BootSelection.jsx:177 +#: src/components/storage/BootSelection.jsx:176 msgid "Select a disk" msgstr "ディスクの選択" -#: src/components/storage/BootSelection.jsx:181 +#: src/components/storage/BootSelection.jsx:180 msgid "Partitions to boot will be allocated at the following device." msgstr "下記のデバイス内に起動用パーティションを割り当てます。" -#: src/components/storage/BootSelection.jsx:184 +#: src/components/storage/BootSelection.jsx:183 msgid "Choose a disk for placing the boot loader" msgstr "ブートローダを配置するディスクを選択してください" -#: src/components/storage/BootSelection.jsx:200 +#: src/components/storage/BootSelection.jsx:199 msgid "Do not configure" msgstr "設定しない" -#: src/components/storage/BootSelection.jsx:203 +#: src/components/storage/BootSelection.jsx:202 msgid "" "No partitions will be automatically configured for booting. Use with caution." msgstr "起動用のパーティションを自動設定しません。注意してお使いください。" @@ -1161,9 +1134,8 @@ msgid "Remove max channel filter" msgstr "最大チャネルのフィルタを削除" #: src/components/storage/DeviceSelection.jsx:101 -#, fuzzy msgid "Loading data, please wait a second..." -msgstr "利用可能な製品を読み込んでいます。しばらくお待ちください..." +msgstr "データを読み込んでいます。しばらくお待ちください..." #. TRANSLATORS: description for using plain partitions for installing the #. system, the text in the square brackets [] is displayed in bold, use only @@ -1190,22 +1162,18 @@ msgstr "" "新規パーティションとして作成します。" #: src/components/storage/DeviceSelection.jsx:149 -#, fuzzy msgid "Select installation device" -msgstr "インストール先のデバイスに設定する" +msgstr "インストール先デバイスの選択" #: src/components/storage/DeviceSelection.jsx:155 -#, fuzzy msgid "Install new system on" -msgstr "インストーラのオプション" +msgstr "新しいシステムのインストール先" #: src/components/storage/DeviceSelection.jsx:158 -#, fuzzy msgid "An existing disk" -msgstr "既存のパーティションの縮小" +msgstr "既存のディスク" #: src/components/storage/DeviceSelection.jsx:167 -#, fuzzy msgid "A new LVM Volume Group" msgstr "新規 LVM ボリュームグループ" @@ -1222,7 +1190,6 @@ msgid "Prepare more devices by configuring advanced" msgstr "高度な設定でさらにデバイスを検出" #: src/components/storage/DeviceSelection.jsx:229 -#, fuzzy msgid "storage techs" msgstr "ストレージ技術" @@ -1301,7 +1268,7 @@ msgstr "詳細" #: src/components/storage/PartitionsField.jsx:451 #: src/components/storage/ProposalResultTable.jsx:123 #: src/components/storage/SpaceActionsTable.jsx:143 -#: src/components/storage/VolumeFields.jsx:472 +#: src/components/storage/VolumeFields.jsx:474 #: src/components/storage/VolumeLocationSelectorTable.jsx:103 msgid "Size" msgstr "サイズ" @@ -1333,13 +1300,12 @@ msgid "Encryption" msgstr "暗号化" #: src/components/storage/EncryptionField.jsx:39 -#, fuzzy msgid "" "Protection for the information stored at the device, including data, " "programs, and system files." msgstr "" -"完全ディスク暗号化 (Full Disk Encryption; FDE) を使用することで、データやプロ" -"グラム、システムファイルを含むデバイス内の情報保護を行うことができます。" +"データやプログラム、システムファイルを含むデバイス内の情報を保護する仕組みで" +"す。" #: src/components/storage/EncryptionField.jsx:42 msgid "disabled" @@ -1354,13 +1320,12 @@ msgid "using TPM unlocking" msgstr "TPM 解錠を使用" #: src/components/storage/EncryptionField.jsx:58 -#, fuzzy msgid "Enable" msgstr "有効" #: src/components/storage/EncryptionField.jsx:58 msgid "Modify" -msgstr "" +msgstr "修正" #: src/components/storage/EncryptionSettingsDialog.jsx:37 msgid "" @@ -1401,7 +1366,6 @@ msgstr "インストール先のデバイス" #. TRANSLATORS: The storage "Installation device" field's description. #: src/components/storage/InstallationDeviceField.jsx:42 -#, fuzzy msgid "Main disk or LVM Volume Group for installation." msgstr "" "インストール先のメインディスクもしくは LVM ボリュームグループを選択してくださ" @@ -1409,20 +1373,19 @@ msgstr "" #. TRANSLATORS: %s is the installation disk (eg. "/dev/sda, 80 GiB) #: src/components/storage/InstallationDeviceField.jsx:56 -#, fuzzy, c-format +#, c-format msgid "File systems created as new partitions at %s" -msgstr "新しいパーティションの作成" +msgstr "%s に新規のパーティションを作成し、そこにファイルシステムを作成" #: src/components/storage/InstallationDeviceField.jsx:59 -#, fuzzy msgid "File systems created at a new LVM volume group" -msgstr "新規 LVM ボリュームグループのデバイス選択" +msgstr "新規 LVM ボリュームグループにファイルシステムを作成" #. TRANSLATORS: %s is the disk used for the LVM physical volumes (eg. "/dev/sda, 80 GiB) #: src/components/storage/InstallationDeviceField.jsx:63 -#, fuzzy, c-format +#, c-format msgid "File systems created at a new LVM volume group on %s" -msgstr "%s 内の新規 LVM ボリュームグループ" +msgstr "%s 内の新規 LVM ボリュームグループにファイルシステムを作成" #. TRANSLATORS: minimum device size, %s is replaced by size string, e.g. "17.5 GiB" #: src/components/storage/PartitionsField.jsx:73 @@ -1615,9 +1578,9 @@ msgid "Delete" msgstr "削除" #: src/components/storage/PartitionsField.jsx:449 -#: src/components/storage/VolumeFields.jsx:59 -#: src/components/storage/VolumeFields.jsx:68 -#: src/components/storage/VolumeFields.jsx:73 +#: src/components/storage/VolumeFields.jsx:61 +#: src/components/storage/VolumeFields.jsx:70 +#: src/components/storage/VolumeFields.jsx:75 msgid "Mount point" msgstr "マウントポイント" @@ -1649,16 +1612,14 @@ msgid "Partitions and file systems" msgstr "パーティションとファイルシステム" #: src/components/storage/PartitionsField.jsx:802 -#, fuzzy msgid "" "Structure of the new system, including any additional partition needed for " "booting" -msgstr "起動時に必要な追加パーティションを含む、新しいシステムの構造設定です。" +msgstr "起動時に必要な追加パーティションを含む、新しいシステムの構造設定です" #: src/components/storage/PartitionsField.jsx:808 -#, fuzzy msgid "Show partitions and file-systems actions" -msgstr "パーティションとファイルシステム" +msgstr "パーティションとファイルシステムの処理を表示" #. TRANSLATORS: show/hide toggle action, this is a clickable link #: src/components/storage/ProposalActionsDialog.jsx:62 @@ -1685,10 +1646,10 @@ msgid "Affecting" msgstr "下記に影響があります:" #: src/components/storage/ProposalResultSection.jsx:96 -#, fuzzy, c-format +#, c-format msgid "Check the planned action" msgid_plural "Check the %d planned actions" -msgstr[0] "全ての処理計画を確認する" +msgstr[0] "%d 個の処理計画を確認する" #: src/components/storage/ProposalResultSection.jsx:111 msgid "Waiting for information about storage configuration" @@ -1696,16 +1657,14 @@ msgstr "ストレージ設定に関する情報を待機しています" #: src/components/storage/ProposalResultSection.jsx:124 msgid "Storage proposal not possible" -msgstr "" +msgstr "ストレージの提案が実施できません" #: src/components/storage/ProposalResultSection.jsx:188 -#, fuzzy msgid "" "During installation, some actions will be performed to configure the system " "as displayed below." msgstr "" -"インストールの際、システムの設定にあたって下記に示す %d 個の処理が実行されま" -"す" +"インストールの際、システムの設定にあたって下記に示す処理が実行されます。" #: src/components/storage/ProposalResultSection.jsx:196 msgid "Planned Actions" @@ -1730,11 +1689,11 @@ msgstr "変更前: %s" msgid "Mount Point" msgstr "マウントポイント" -#: src/components/storage/ProposalTransactionalInfo.jsx:46 +#: src/components/storage/ProposalTransactionalInfo.jsx:45 msgid "Transactional root file system" msgstr "トランザクション型のルートファイルシステム" -#: src/components/storage/ProposalTransactionalInfo.jsx:49 +#: src/components/storage/ProposalTransactionalInfo.jsx:48 #, c-format msgid "" "%s is an immutable system with atomic updates. It uses a read-only Btrfs " @@ -1883,75 +1842,75 @@ msgid "Do you want to add it?" msgstr "追加してよろしいですか?" #. TRANSLATORS: info about possible file system types. -#: src/components/storage/VolumeFields.jsx:215 +#: src/components/storage/VolumeFields.jsx:217 msgid "" "The options for the file system type depends on the product and the mount " "point." msgstr "" "ファイルシステムに対する選択肢は、製品とマウントポイントごとに異なります。" -#: src/components/storage/VolumeFields.jsx:221 +#: src/components/storage/VolumeFields.jsx:223 msgid "More info for file system types" msgstr "ファイルシステムの種類に関する詳細" #. TRANSLATORS: label for the file system selector. -#: src/components/storage/VolumeFields.jsx:232 +#: src/components/storage/VolumeFields.jsx:234 msgid "File system type" msgstr "ファイルシステムの種類" #. TRANSLATORS: item which affects the final computed partition size -#: src/components/storage/VolumeFields.jsx:263 +#: src/components/storage/VolumeFields.jsx:265 msgid "the configuration of snapshots" msgstr "スナップショットの設定" #. TRANSLATORS: item which affects the final computed partition size #. %s is replaced by a list of mount points like "/home, /boot" -#: src/components/storage/VolumeFields.jsx:268 +#: src/components/storage/VolumeFields.jsx:270 #, c-format msgid "the presence of the file system for %s" msgstr "%s に対するファイルシステムの存在" #. TRANSLATORS: conjunction for merging two list items -#: src/components/storage/VolumeFields.jsx:270 +#: src/components/storage/VolumeFields.jsx:272 msgid ", " msgstr ", " #. TRANSLATORS: item which affects the final computed partition size -#: src/components/storage/VolumeFields.jsx:274 +#: src/components/storage/VolumeFields.jsx:276 msgid "the amount of RAM in the system" msgstr "システムに搭載された RAM の量" #. TRANSLATORS: the %s is replaced by the items which affect the computed size -#: src/components/storage/VolumeFields.jsx:277 +#: src/components/storage/VolumeFields.jsx:279 #, c-format msgid "The final size depends on %s." msgstr "最終的なサイズは %s に依存します。" #. TRANSLATORS: conjunction for merging two texts -#: src/components/storage/VolumeFields.jsx:279 +#: src/components/storage/VolumeFields.jsx:281 msgid " and " msgstr " および " #. TRANSLATORS: the partition size is automatically computed -#: src/components/storage/VolumeFields.jsx:284 +#: src/components/storage/VolumeFields.jsx:286 msgid "Automatically calculated size according to the selected product." msgstr "選択した製品に合わせてサイズを自動計算します。" -#: src/components/storage/VolumeFields.jsx:303 +#: src/components/storage/VolumeFields.jsx:305 msgid "Exact size for the file system." msgstr "ファイルシステムに対して正確なサイズを設定します。" #. TRANSLATORS: requested partition size -#: src/components/storage/VolumeFields.jsx:316 +#: src/components/storage/VolumeFields.jsx:318 msgid "Exact size" msgstr "正確なサイズ" #. TRANSLATORS: units selector (like KiB, MiB, GiB...) -#: src/components/storage/VolumeFields.jsx:333 +#: src/components/storage/VolumeFields.jsx:335 msgid "Size unit" msgstr "サイズの単位" -#: src/components/storage/VolumeFields.jsx:361 +#: src/components/storage/VolumeFields.jsx:363 msgid "" "Limits for the file system size. The final size will be a value between the " "given minimum and maximum. If no maximum is given then the file system will " @@ -1962,45 +1921,45 @@ msgstr "" "きくなるように設定されます。" #. TRANSLATORS: the minimal partition size -#: src/components/storage/VolumeFields.jsx:368 +#: src/components/storage/VolumeFields.jsx:370 msgid "Minimum" msgstr "最小" #. TRANSLATORS: the minium partition size -#: src/components/storage/VolumeFields.jsx:379 +#: src/components/storage/VolumeFields.jsx:381 msgid "Minimum desired size" msgstr "最小必須サイズ" -#: src/components/storage/VolumeFields.jsx:390 +#: src/components/storage/VolumeFields.jsx:392 msgid "Unit for the minimum size" msgstr "最小サイズの単位" #. TRANSLATORS: the maximum partition size -#: src/components/storage/VolumeFields.jsx:402 +#: src/components/storage/VolumeFields.jsx:404 msgid "Maximum" msgstr "最大" #. TRANSLATORS: the maximum partition size -#: src/components/storage/VolumeFields.jsx:414 +#: src/components/storage/VolumeFields.jsx:416 msgid "Maximum desired size" msgstr "最大要求サイズ" -#: src/components/storage/VolumeFields.jsx:424 +#: src/components/storage/VolumeFields.jsx:426 msgid "Unit for the maximum size" msgstr "最大サイズの単位" #. TRANSLATORS: radio button label, fully automatically computed partition size, no user input -#: src/components/storage/VolumeFields.jsx:442 +#: src/components/storage/VolumeFields.jsx:444 msgid "Auto" msgstr "自動" #. TRANSLATORS: radio button label, exact partition size requested by user -#: src/components/storage/VolumeFields.jsx:444 +#: src/components/storage/VolumeFields.jsx:446 msgid "Fixed" msgstr "固定値" #. TRANSLATORS: radio button label, automatically computed partition size within the user provided min and max limits -#: src/components/storage/VolumeFields.jsx:446 +#: src/components/storage/VolumeFields.jsx:448 msgid "Range" msgstr "範囲" @@ -2345,7 +2304,7 @@ msgstr "ターゲット" #: src/components/storage/routes.js:36 msgid "Proposal" -msgstr "" +msgstr "提案" #: src/components/storage/utils.js:64 msgid "KiB" @@ -2380,9 +2339,8 @@ msgstr "" #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space deleting current content". Keep it short #: src/components/storage/utils.js:82 -#, fuzzy msgid "deleting current content" -msgstr "現在の内容を全て削除" +msgstr "現在の内容を削除" #: src/components/storage/utils.js:87 msgid "Shrink existing partitions" @@ -2397,9 +2355,8 @@ msgstr "" #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space shrinking partitions". Keep it short. #: src/components/storage/utils.js:92 -#, fuzzy msgid "shrinking partitions" -msgstr "既存のパーティションの縮小" +msgstr "パーティションの縮小" #: src/components/storage/utils.js:97 msgid "Use available space" @@ -2429,9 +2386,8 @@ msgstr "パーティションの設定作業を独自に実施します。" #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space with custom actions". Keep it short. #: src/components/storage/utils.js:112 -#, fuzzy msgid "with custom actions" -msgstr "独自の処理を実行します" +msgstr "独自の処理" #: src/components/users/FirstUser.jsx:35 msgid "No user defined yet." @@ -2477,23 +2433,20 @@ msgid "Use suggested username" msgstr "提案されたユーザ名を使用する" #: src/components/users/FirstUserForm.jsx:140 -#, fuzzy msgid "All fields are required" -msgstr "サイズを指定する必要があります" +msgstr "全ての項目に入力する必要があります" #: src/components/users/FirstUserForm.jsx:147 msgid "Please, try again." -msgstr "" +msgstr "やり直してください。" #: src/components/users/FirstUserForm.jsx:197 -#, fuzzy msgid "Create user" -msgstr "ユーザアカウントの作成" +msgstr "ユーザの作成" #: src/components/users/FirstUserForm.jsx:197 -#, fuzzy msgid "Edit user" -msgstr "%s の編集" +msgstr "ユーザの編集" #: src/components/users/FirstUserForm.jsx:214 #: src/components/users/FirstUserForm.jsx:216 @@ -2600,21 +2553,19 @@ msgstr "消去" #: src/components/users/UsersPage.jsx:45 msgid "First user" -msgstr "" +msgstr "最初のユーザ" #: src/components/users/UsersPage.jsx:52 msgid "Root authentication" msgstr "root の認証" #: src/components/users/routes.js:41 -#, fuzzy msgid "Create or edit the first user" -msgstr "ファイルを読み込めません" +msgstr "最初のユーザの作成または編集" #: src/components/users/routes.js:48 -#, fuzzy msgid "Edit first user" -msgstr "ファイルシステムの編集" +msgstr "最初のユーザの編集" #~ msgid "" #~ "There are some reported issues. Please review them in the previous steps " diff --git a/web/po/ka.po b/web/po/ka.po index c72c75d7c8..35f09b72f4 100644 --- a/web/po/ka.po +++ b/web/po/ka.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-16 02:26+0000\n" +"POT-Creation-Date: 2024-06-20 02:20+0000\n" "PO-Revision-Date: 2024-06-01 03:46+0000\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language-Team: Macedonian \n" "Language-Team: Norwegian Bokmål \n" @@ -20,18 +20,16 @@ msgstr "" "X-Generator: Weblate 5.5.5\n" #: src/MainLayout.jsx:40 -#, fuzzy msgid "Agama" -msgstr "Om Agama" +msgstr "Agama" #: src/MainLayout.jsx:82 msgid "Change product" msgstr "Endre produkt" #: src/components/core/About.jsx:49 -#, fuzzy msgid "About" -msgstr "Om Agama" +msgstr "Om" #: src/components/core/About.jsx:71 msgid "About Agama" @@ -105,11 +103,11 @@ msgstr "Avbryt" msgid "Install" msgstr "Installere" -#: src/components/core/InstallationFinished.jsx:41 +#: src/components/core/InstallationFinished.jsx:42 msgid "TPM sealing requires the new system to be booted directly." msgstr "TPM forsegling krever at det nye systemet startes opp direkte." -#: src/components/core/InstallationFinished.jsx:46 +#: src/components/core/InstallationFinished.jsx:47 msgid "" "If a local media was used to run this installer, remove it before the next " "boot." @@ -117,16 +115,16 @@ msgstr "" "Hvis ett lokalt media ble brukt til å kjøre dette installajonsprogrammet, så " "fjern det før neste oppstart." -#: src/components/core/InstallationFinished.jsx:50 +#: src/components/core/InstallationFinished.jsx:51 msgid "Hide details" msgstr "Skjul detaljer" -#: src/components/core/InstallationFinished.jsx:50 +#: src/components/core/InstallationFinished.jsx:51 msgid "See more details" msgstr "Se flere detaljer" #. TRANSLATORS: "Trusted Platform Module" is the name of the technology and "TPM" its abbreviation -#: src/components/core/InstallationFinished.jsx:54 +#: src/components/core/InstallationFinished.jsx:55 msgid "" "The final step to configure the Trusted Platform Module (TPM) to " "automatically open encrypted devices will take place during the first boot " @@ -138,46 +136,44 @@ msgstr "" "nye systemet. For at det skal fungere, så må maskinen starte direkte med den " "nye oppstartslasteren." -#: src/components/core/InstallationFinished.jsx:99 +#: src/components/core/InstallationFinished.jsx:97 msgid "Congratulations!" msgstr "Gratulerer!" -#: src/components/core/InstallationFinished.jsx:104 +#: src/components/core/InstallationFinished.jsx:102 msgid "The installation on your machine is complete." msgstr "Installasjonen på din maskin er fullført." -#: src/components/core/InstallationFinished.jsx:107 +#: src/components/core/InstallationFinished.jsx:105 msgid "At this point you can power off the machine." msgstr "På dette tidspunktet kan du slå av maskinen." -#: src/components/core/InstallationFinished.jsx:108 +#: src/components/core/InstallationFinished.jsx:106 msgid "At this point you can reboot the machine to log in to the new system." msgstr "" "På dette tidspunktet kan du starte om maskinen for å logge inn i det nye " "systemet." -#: src/components/core/InstallationFinished.jsx:115 +#: src/components/core/InstallationFinished.jsx:113 msgid "Finish" msgstr "Fullført" -#: src/components/core/InstallationFinished.jsx:115 +#: src/components/core/InstallationFinished.jsx:113 msgid "Reboot" msgstr "Start om" #: src/components/core/InstallerOptions.jsx:57 -#, fuzzy msgid "Show installer options" -msgstr "Skjul installasjonsalternativer" +msgstr "Vis installasjonsalternativer" #: src/components/core/InstallerOptions.jsx:62 -#, fuzzy msgid "Installer options" msgstr "Installasjonsalternativer" #: src/components/core/IssuesHint.jsx:34 msgid "" "Before starting the installation, you need to address the following problems:" -msgstr "" +msgstr "Før du starter installasjonen, må du løse følgende problemer:" #: src/components/core/ListSearch.jsx:51 msgid "Search" @@ -203,14 +199,11 @@ msgstr "Logg på som %s" #. it and keep the brackets. #: src/components/core/LoginPage.jsx:76 msgid "The installer requires [root] user privileges." -msgstr "" +msgstr "Installasjonen krever [root] bruker privilegier." #: src/components/core/LoginPage.jsx:95 -#, fuzzy msgid "Please, provide its password to log in to the system." -msgstr "" -"Installasjonsprogrammet krever %s bruker privilegier. Vennligst, opplys om " -"passord for å logge inn på systemet." +msgstr "Vennligst, oppgi passordet for å logge på systemet." #: src/components/core/LoginPage.jsx:98 msgid "Login form" @@ -226,7 +219,7 @@ msgstr "Logg inn" #: src/components/core/LoginPage.jsx:124 msgid "More about this" -msgstr "" +msgstr "Mer om dette" #: src/components/core/LogsButton.jsx:102 msgid "Collecting logs..." @@ -315,14 +308,12 @@ msgid "Keyboard" msgstr "Tastatur" #: src/components/l10n/InstallerKeymapSwitcher.jsx:75 -#, fuzzy msgid "Choose a keyboard layout" -msgstr "Velg et produkt" +msgstr "Velg et tastaturoppsett" #: src/components/l10n/InstallerKeymapSwitcher.jsx:86 -#, fuzzy msgid "Cannot be changed in remote installation" -msgstr "Tastaturoppsettet kan ikke bli endres i ekstern installasjon" +msgstr "Kan ikke endres i fjerninstallasjonen" #: src/components/l10n/InstallerLocaleSwitcher.jsx:57 #: src/components/l10n/L10nPage.jsx:67 @@ -330,23 +321,20 @@ msgid "Language" msgstr "Språk" #: src/components/l10n/InstallerLocaleSwitcher.jsx:63 -#, fuzzy msgid "Choose a language" -msgstr "Endre språk" +msgstr "Velg et språk" #: src/components/l10n/KeyboardSelection.jsx:45 msgid "Filter by description or keymap code" msgstr "Filtrer etter beskrivelse eller tastaturkode" #: src/components/l10n/KeyboardSelection.jsx:85 -#, fuzzy msgid "None of the keymaps match the filter." -msgstr "Ingen av mønstrene passer sammen med filteret." +msgstr "Ingen av tastene passer sammen med filteret." #: src/components/l10n/KeyboardSelection.jsx:92 -#, fuzzy msgid "Keyboard selection" -msgstr "Valg av programvare" +msgstr "Valg av tastatur" #: src/components/l10n/KeyboardSelection.jsx:107 #: src/components/l10n/L10nPage.jsx:71 src/components/l10n/L10nPage.jsx:82 @@ -364,9 +352,8 @@ msgstr "Lokalisering" #: src/components/l10n/L10nPage.jsx:68 src/components/l10n/L10nPage.jsx:79 #: src/components/l10n/L10nPage.jsx:90 -#, fuzzy msgid "Not selected yet" -msgstr "Ingen enhet er valgt ennå" +msgstr "Ikke valgt ennå" #: src/components/l10n/L10nPage.jsx:71 src/components/l10n/L10nPage.jsx:82 #: src/components/l10n/L10nPage.jsx:93 @@ -386,28 +373,24 @@ msgid "Filter by language, territory or locale code" msgstr "Filtrer etter språk, territorium eller lokalkode" #: src/components/l10n/LocaleSelection.jsx:84 -#, fuzzy msgid "None of the locales match the filter." -msgstr "Ingen av mønstrene passer sammen med filteret." +msgstr "Ingen av lokaliseringene passer sammen med filteret." #: src/components/l10n/LocaleSelection.jsx:91 -#, fuzzy msgid "Locale selection" -msgstr "Valg av programvare" +msgstr "Valg av lokalisering" #: src/components/l10n/TimezoneSelection.jsx:71 msgid "Filter by territory, time zone code or UTC offset" msgstr "Filtrer etter territorium, tidssonekode eller UTC forskyvning" #: src/components/l10n/TimezoneSelection.jsx:122 -#, fuzzy msgid "None of the time zones match the filter." -msgstr "Ingen av mønstrene passer sammen med filteret." +msgstr "Ingen av tidssonene passer sammen med filteret." #: src/components/l10n/TimezoneSelection.jsx:129 -#, fuzzy msgid " Timezone selection" -msgstr "Endre valg" +msgstr " Valg av tidssone" #: src/components/layout/Loading.jsx:31 msgid "Loading installation environment, please wait." @@ -554,11 +537,11 @@ msgstr "Gateway" #: src/components/network/IpSettingsForm.jsx:178 msgid "Gateway can be defined only in 'Manual' mode" -msgstr "" +msgstr "Gateway kan bare defineres i 'Manuelt' modus" #: src/components/network/IpSettingsForm.jsx:210 #: src/components/product/ProductRegistrationPage.jsx:89 -#: src/components/storage/BootSelection.jsx:216 +#: src/components/storage/BootSelection.jsx:215 #: src/components/storage/DeviceSelection.jsx:240 #: src/components/storage/EncryptionSettingsDialog.jsx:138 #: src/components/storage/VolumeDialog.jsx:786 @@ -600,14 +583,12 @@ msgid "Network" msgstr "Nettverk" #: src/components/network/NetworkPage.jsx:178 -#, fuzzy msgid "Wired connections" -msgstr "Glem tilkoblingen %s" +msgstr "Kablede tilkoblinger" #: src/components/network/NetworkPage.jsx:185 -#, fuzzy msgid "WiFi connections" -msgstr "Rediger tilkobling %s" +msgstr "WiFi tilkoblinger" #. TRANSLATORS: WiFi authentication mode #: src/components/network/WifiConnectionForm.jsx:43 @@ -697,9 +678,8 @@ msgstr "%s koblingen venter på en tilstands endring" #. TRANSLATORS: menu label, disconnect from the selected WiFi network #: src/components/network/WifiNetworkMenu.jsx:67 -#, fuzzy msgid "Disconnect" -msgstr "Koblet fra" +msgstr "Koble fra" #. TRANSLATORS: menu label, remove the selected WiFi network settings #: src/components/network/WifiNetworkMenu.jsx:76 @@ -734,44 +714,42 @@ msgid "Software" msgstr "Programvare" #: src/components/overview/OverviewPage.jsx:52 -#, fuzzy msgid "Ready for installation" -msgstr "Bekreft Installasjon" +msgstr "Klar for installasjon" #: src/components/overview/OverviewPage.jsx:102 -#, fuzzy msgid "Installation" -msgstr "Installerer" +msgstr "Installajon" #: src/components/overview/OverviewPage.jsx:103 msgid "Before installing, please check the following problems." -msgstr "" +msgstr "Før installasjon, vennligst sjekk følgende problemer." #: src/components/overview/OverviewPage.jsx:114 -#, fuzzy msgid "" "Take your time to check your configuration before starting the installation " "process." msgstr "" -"Installasjonen vil konfigurere partisjoner for oppstart på " -"installasjonsdisken." +"Ta god tid til å sjekke din konfigurasjon før du begynner installasjons " +"prosessen." #: src/components/overview/OverviewPage.jsx:123 msgid "" "These are the most relevant installation settings. Feel free to browse the " "sections in the menu for further details." msgstr "" +"Disse er de mest relevante installasjonsinnstillingene, Bla gjerne gjennom " +"seksjonene i menyen for ytterligere detaljer." #: src/components/overview/SoftwareSection.jsx:60 -#, fuzzy msgid "The installation will take" -msgstr "Installasjonen vil ta %s" +msgstr "Installasjonen vil ta" #. TRANSLATORS: %s will be replaced with the installation size, example: "5GiB". #: src/components/overview/SoftwareSection.jsx:67 -#, fuzzy, c-format +#, c-format msgid "The installation will take %s including:" -msgstr "Installasjonen vil ta %s" +msgstr "Installasjonen vil ta %s inkludert:" #: src/components/overview/StorageSection.jsx:53 msgid "" @@ -880,7 +858,7 @@ msgstr "" #: src/components/overview/routes.js:30 msgid "Overview" -msgstr "" +msgstr "Oversikt" #: src/components/product/ProductRegistrationPage.jsx:66 #, c-format @@ -900,18 +878,16 @@ msgid "Loading available products, please wait..." msgstr "Laster tilgjengelige produkter, vennligst vent..." #: src/components/product/ProductSelectionProgress.jsx:88 -#, fuzzy msgid "Analyze disks" -msgstr "Aktivere disker" +msgstr "Analyser disker" #: src/components/product/ProductSelectionProgress.jsx:95 msgid "Configure software" -msgstr "" +msgstr "Konfigurer programvare" #: src/components/product/ProductSelectionProgress.jsx:156 -#, fuzzy msgid "Configuring the product, please wait ..." -msgstr "Laster tilgjengelige produkter, vennligst vent..." +msgstr "Konfigurerer produktet, vennligst vent..." #: src/components/questions/GenericQuestion.jsx:35 #: src/components/questions/LuksActivationQuestion.jsx:60 @@ -941,9 +917,8 @@ msgid "The following software patterns are selected for installation:" msgstr "Følgende programvare mønstre er valgt for installasjon:" #: src/components/software/SoftwarePage.jsx:165 -#, fuzzy msgid "Selected patterns" -msgstr "Velg tidssone" +msgstr "Valgte mønstre" #: src/components/software/SoftwarePage.jsx:168 msgid "Change selection" @@ -961,18 +936,19 @@ msgstr "Valg av programvare" #: src/components/software/SoftwarePatternsSelection.jsx:241 #: src/components/software/SoftwarePatternsSelection.jsx:242 msgid "Filter by pattern title or description" -msgstr "" +msgstr "Filtrer etter mønstertittel eller beskrivelse" #. TRANSLATORS: %s will be replaced by the estimated installation size, #. example: "728.8 MiB" #: src/components/software/UsedSize.jsx:33 -#, fuzzy, c-format +#, c-format msgid "Installation will take %s." -msgstr "Installasjonen vil ta %s" +msgstr "Installasjonen vil ta %s." #: src/components/software/UsedSize.jsx:38 msgid "This space includes the base system and the selected software patterns." msgstr "" +"Denne plassen inkluderer basissystemet og de valgte programvaremønstrene." #: src/components/storage/BootConfigField.jsx:43 msgid "Change boot options" @@ -995,7 +971,7 @@ msgstr "" msgid "Installation will configure partitions for booting at %s." msgstr "Installasjonen vil konfigurere partisjoner for oppstart på %s." -#: src/components/storage/BootSelection.jsx:127 +#: src/components/storage/BootSelection.jsx:126 msgid "" "To ensure the new system is able to boot, the installer may need to create " "or configure some partitions in the appropriate disk." @@ -1004,43 +980,42 @@ msgstr "" "installasjonsprogrammet opprette eller konfigurere noen partisjoner på " "riktig disk." -#: src/components/storage/BootSelection.jsx:133 +#: src/components/storage/BootSelection.jsx:132 msgid "Partitions to boot will be allocated at the installation disk." msgstr "Partisjoner for oppstart vil bli tildelt på installasjonsdisken." #. TRANSLATORS: %s is replaced by a device name and size (e.g., "/dev/sda, 500GiB") -#: src/components/storage/BootSelection.jsx:138 +#: src/components/storage/BootSelection.jsx:137 #, c-format msgid "Partitions to boot will be allocated at the installation disk (%s)." msgstr "Partisjoner for oppstart vil bli tildelt på installasjonsdisken (%s)." -#: src/components/storage/BootSelection.jsx:154 -#, fuzzy +#: src/components/storage/BootSelection.jsx:153 msgid "Select booting partition" -msgstr "Velg hva som skal skje med hver partisjon." +msgstr "Velg oppstartspartisjon" -#: src/components/storage/BootSelection.jsx:168 +#: src/components/storage/BootSelection.jsx:167 #: src/components/storage/iscsi/NodeStartupOptions.js:27 msgid "Automatic" msgstr "Automatisk" -#: src/components/storage/BootSelection.jsx:177 +#: src/components/storage/BootSelection.jsx:176 msgid "Select a disk" msgstr "Velg en disk" -#: src/components/storage/BootSelection.jsx:181 +#: src/components/storage/BootSelection.jsx:180 msgid "Partitions to boot will be allocated at the following device." msgstr "Partisjoner for oppstart vil bli tildelt på følgende enhet." -#: src/components/storage/BootSelection.jsx:184 +#: src/components/storage/BootSelection.jsx:183 msgid "Choose a disk for placing the boot loader" msgstr "Velg en disk for å plassere oppstartslasteren" -#: src/components/storage/BootSelection.jsx:200 +#: src/components/storage/BootSelection.jsx:199 msgid "Do not configure" msgstr "Ikke konfigurer" -#: src/components/storage/BootSelection.jsx:203 +#: src/components/storage/BootSelection.jsx:202 msgid "" "No partitions will be automatically configured for booting. Use with caution." msgstr "" @@ -1163,9 +1138,8 @@ msgid "Remove max channel filter" msgstr "Fjern maksimal kanal filter" #: src/components/storage/DeviceSelection.jsx:101 -#, fuzzy msgid "Loading data, please wait a second..." -msgstr "Laster tilgjengelige produkter, vennligst vent..." +msgstr "Laster inn data, vennligst vent et sekund..." #. TRANSLATORS: description for using plain partitions for installing the #. system, the text in the square brackets [] is displayed in bold, use only @@ -1192,24 +1166,20 @@ msgstr "" "forespørsel som nye partisjoner på de valgte enhetene." #: src/components/storage/DeviceSelection.jsx:149 -#, fuzzy msgid "Select installation device" -msgstr "Installasjons enhet" +msgstr "Velg installasjonsenhet" #: src/components/storage/DeviceSelection.jsx:155 -#, fuzzy msgid "Install new system on" -msgstr "Installasjonsalternativer" +msgstr "Installer nytt system på" #: src/components/storage/DeviceSelection.jsx:158 -#, fuzzy msgid "An existing disk" -msgstr "Krymp eksisterende partisjoner" +msgstr "En eksisterende disk" #: src/components/storage/DeviceSelection.jsx:167 -#, fuzzy msgid "A new LVM Volume Group" -msgstr "ny LVM volumgruppe" +msgstr "En ny LVM volumgruppe" #: src/components/storage/DeviceSelection.jsx:192 msgid "Device selector for target disk" @@ -1224,7 +1194,6 @@ msgid "Prepare more devices by configuring advanced" msgstr "Forbered flere enheter for avansert konfigurering" #: src/components/storage/DeviceSelection.jsx:229 -#, fuzzy msgid "storage techs" msgstr "lagringsteknologier" @@ -1303,7 +1272,7 @@ msgstr "Detaljer" #: src/components/storage/PartitionsField.jsx:451 #: src/components/storage/ProposalResultTable.jsx:123 #: src/components/storage/SpaceActionsTable.jsx:143 -#: src/components/storage/VolumeFields.jsx:472 +#: src/components/storage/VolumeFields.jsx:474 #: src/components/storage/VolumeLocationSelectorTable.jsx:103 msgid "Size" msgstr "Størrelse" @@ -1335,13 +1304,12 @@ msgid "Encryption" msgstr "Kryptering" #: src/components/storage/EncryptionField.jsx:39 -#, fuzzy msgid "" "Protection for the information stored at the device, including data, " "programs, and system files." msgstr "" -"Full Disk Kryptering (FDE) tillater å beskytte informasjonen på lagret " -"enhet, inkludert data, programmer, og systemfiler." +"Beskyttelse for informasjonen lagret på enheten, inkludert data, programmer, " +"og systemfiler." #: src/components/storage/EncryptionField.jsx:42 msgid "disabled" @@ -1356,13 +1324,12 @@ msgid "using TPM unlocking" msgstr "ved hjelp av TPM opplåsing" #: src/components/storage/EncryptionField.jsx:58 -#, fuzzy msgid "Enable" -msgstr "aktivert" +msgstr "Aktiver" #: src/components/storage/EncryptionField.jsx:58 msgid "Modify" -msgstr "" +msgstr "Modifiser" #: src/components/storage/EncryptionSettingsDialog.jsx:37 msgid "" @@ -1403,26 +1370,24 @@ msgstr "Installasjons enhet" #. TRANSLATORS: The storage "Installation device" field's description. #: src/components/storage/InstallationDeviceField.jsx:42 -#, fuzzy msgid "Main disk or LVM Volume Group for installation." -msgstr "Velg hoveddisken eller LVM Volumgruppe for installasjon." +msgstr "Hoveddisken eller LVM Volumgruppe for installasjon." #. TRANSLATORS: %s is the installation disk (eg. "/dev/sda, 80 GiB) #: src/components/storage/InstallationDeviceField.jsx:56 -#, fuzzy, c-format +#, c-format msgid "File systems created as new partitions at %s" -msgstr "Opprett en ny partisjon" +msgstr "Filsystemer opprettes som nye partisjoner på %s" #: src/components/storage/InstallationDeviceField.jsx:59 -#, fuzzy msgid "File systems created at a new LVM volume group" -msgstr "Enhetsvelger for nye LVM volumgruppe" +msgstr "Filsystemer opprettet i en ny LVM volumgruppe" #. TRANSLATORS: %s is the disk used for the LVM physical volumes (eg. "/dev/sda, 80 GiB) #: src/components/storage/InstallationDeviceField.jsx:63 -#, fuzzy, c-format +#, c-format msgid "File systems created at a new LVM volume group on %s" -msgstr "ny LVM volumgruppe på %s" +msgstr "Filsystemer opprettet i en ny LVM volumgruppe på %s" #. TRANSLATORS: minimum device size, %s is replaced by size string, e.g. "17.5 GiB" #: src/components/storage/PartitionsField.jsx:73 @@ -1615,9 +1580,9 @@ msgid "Delete" msgstr "Slett" #: src/components/storage/PartitionsField.jsx:449 -#: src/components/storage/VolumeFields.jsx:59 -#: src/components/storage/VolumeFields.jsx:68 -#: src/components/storage/VolumeFields.jsx:73 +#: src/components/storage/VolumeFields.jsx:61 +#: src/components/storage/VolumeFields.jsx:70 +#: src/components/storage/VolumeFields.jsx:75 msgid "Mount point" msgstr "Monteringspunkt" @@ -1649,18 +1614,16 @@ msgid "Partitions and file systems" msgstr "Partisjoner og filsystemer" #: src/components/storage/PartitionsField.jsx:802 -#, fuzzy msgid "" "Structure of the new system, including any additional partition needed for " "booting" msgstr "" -"Struktur av det nye systemet, inkludert eventuell partisjon som trengs for " +"Strukturen av det nye systemet, inkludert eventuell partisjon som trengs for " "oppstart," #: src/components/storage/PartitionsField.jsx:808 -#, fuzzy msgid "Show partitions and file-systems actions" -msgstr "Partisjoner og filsystemer" +msgstr "Vis partisjoner og filsystemhandlinger" #. TRANSLATORS: show/hide toggle action, this is a clickable link #: src/components/storage/ProposalActionsDialog.jsx:62 @@ -1690,11 +1653,11 @@ msgid "Affecting" msgstr "Påvirker" #: src/components/storage/ProposalResultSection.jsx:96 -#, fuzzy, c-format +#, c-format msgid "Check the planned action" msgid_plural "Check the %d planned actions" -msgstr[0] "Sjekk alle planlagte handlinger" -msgstr[1] "Sjekk alle planlagte handlinger" +msgstr[0] "Sjekk den planlagte handlingen" +msgstr[1] "Sjekk de %d planlagte handlingene" #: src/components/storage/ProposalResultSection.jsx:111 msgid "Waiting for information about storage configuration" @@ -1702,16 +1665,15 @@ msgstr "Venter på informasjon om lagringskonfigurasjon" #: src/components/storage/ProposalResultSection.jsx:124 msgid "Storage proposal not possible" -msgstr "" +msgstr "Lagringsforslag er ikke mulig" #: src/components/storage/ProposalResultSection.jsx:188 -#, fuzzy msgid "" "During installation, some actions will be performed to configure the system " "as displayed below." msgstr "" -"Under installasjonen vil, %d handlingen bli utført for å konfigurere " -"systemet som vist nedenfor" +"Under installasjonen, vil noen handlinger bli utført for å konfigurere " +"systemet som vist nedenfor." #: src/components/storage/ProposalResultSection.jsx:196 msgid "Planned Actions" @@ -1736,11 +1698,11 @@ msgstr "Før %s" msgid "Mount Point" msgstr "Monteringspunkt" -#: src/components/storage/ProposalTransactionalInfo.jsx:46 +#: src/components/storage/ProposalTransactionalInfo.jsx:45 msgid "Transactional root file system" msgstr "Transaksjonell root filsystem" -#: src/components/storage/ProposalTransactionalInfo.jsx:49 +#: src/components/storage/ProposalTransactionalInfo.jsx:48 #, c-format msgid "" "%s is an immutable system with atomic updates. It uses a read-only Btrfs " @@ -1888,75 +1850,75 @@ msgid "Do you want to add it?" msgstr "Vil du legge til den?" #. TRANSLATORS: info about possible file system types. -#: src/components/storage/VolumeFields.jsx:215 +#: src/components/storage/VolumeFields.jsx:217 msgid "" "The options for the file system type depends on the product and the mount " "point." msgstr "" "Alternativene for filsystemtypen avhenger av produktet og monteringspunktet." -#: src/components/storage/VolumeFields.jsx:221 +#: src/components/storage/VolumeFields.jsx:223 msgid "More info for file system types" msgstr "Mer info om filsystemtyper" #. TRANSLATORS: label for the file system selector. -#: src/components/storage/VolumeFields.jsx:232 +#: src/components/storage/VolumeFields.jsx:234 msgid "File system type" msgstr "Filsystem type" #. TRANSLATORS: item which affects the final computed partition size -#: src/components/storage/VolumeFields.jsx:263 +#: src/components/storage/VolumeFields.jsx:265 msgid "the configuration of snapshots" msgstr "konfigurasjonen av øyeblikksbilder" #. TRANSLATORS: item which affects the final computed partition size #. %s is replaced by a list of mount points like "/home, /boot" -#: src/components/storage/VolumeFields.jsx:268 +#: src/components/storage/VolumeFields.jsx:270 #, c-format msgid "the presence of the file system for %s" msgstr "tilstedeværelsen av filsystemet for %s" #. TRANSLATORS: conjunction for merging two list items -#: src/components/storage/VolumeFields.jsx:270 +#: src/components/storage/VolumeFields.jsx:272 msgid ", " msgstr ", " #. TRANSLATORS: item which affects the final computed partition size -#: src/components/storage/VolumeFields.jsx:274 +#: src/components/storage/VolumeFields.jsx:276 msgid "the amount of RAM in the system" msgstr "mengden RAM i systemet" #. TRANSLATORS: the %s is replaced by the items which affect the computed size -#: src/components/storage/VolumeFields.jsx:277 +#: src/components/storage/VolumeFields.jsx:279 #, c-format msgid "The final size depends on %s." msgstr "Sluttstørrelsen avhenger av %s." #. TRANSLATORS: conjunction for merging two texts -#: src/components/storage/VolumeFields.jsx:279 +#: src/components/storage/VolumeFields.jsx:281 msgid " and " msgstr " og " #. TRANSLATORS: the partition size is automatically computed -#: src/components/storage/VolumeFields.jsx:284 +#: src/components/storage/VolumeFields.jsx:286 msgid "Automatically calculated size according to the selected product." msgstr "Automatisk kalkulert størrelse i henhold til det valgte produktet." -#: src/components/storage/VolumeFields.jsx:303 +#: src/components/storage/VolumeFields.jsx:305 msgid "Exact size for the file system." msgstr "Nøyaktig størrelse for filsystemet." #. TRANSLATORS: requested partition size -#: src/components/storage/VolumeFields.jsx:316 +#: src/components/storage/VolumeFields.jsx:318 msgid "Exact size" msgstr "Nøyaktig størrelse" #. TRANSLATORS: units selector (like KiB, MiB, GiB...) -#: src/components/storage/VolumeFields.jsx:333 +#: src/components/storage/VolumeFields.jsx:335 msgid "Size unit" msgstr "Størrelsesenhet" -#: src/components/storage/VolumeFields.jsx:361 +#: src/components/storage/VolumeFields.jsx:363 msgid "" "Limits for the file system size. The final size will be a value between the " "given minimum and maximum. If no maximum is given then the file system will " @@ -1967,45 +1929,45 @@ msgstr "" "vil filsystemet være så stor som mulig." #. TRANSLATORS: the minimal partition size -#: src/components/storage/VolumeFields.jsx:368 +#: src/components/storage/VolumeFields.jsx:370 msgid "Minimum" msgstr "Minimum" #. TRANSLATORS: the minium partition size -#: src/components/storage/VolumeFields.jsx:379 +#: src/components/storage/VolumeFields.jsx:381 msgid "Minimum desired size" msgstr "Minimum ønsket størrelse" -#: src/components/storage/VolumeFields.jsx:390 +#: src/components/storage/VolumeFields.jsx:392 msgid "Unit for the minimum size" msgstr "Enhet for minimum størrelse" #. TRANSLATORS: the maximum partition size -#: src/components/storage/VolumeFields.jsx:402 +#: src/components/storage/VolumeFields.jsx:404 msgid "Maximum" msgstr "Maksimum" #. TRANSLATORS: the maximum partition size -#: src/components/storage/VolumeFields.jsx:414 +#: src/components/storage/VolumeFields.jsx:416 msgid "Maximum desired size" msgstr "Maksimal ønsket størrelse" -#: src/components/storage/VolumeFields.jsx:424 +#: src/components/storage/VolumeFields.jsx:426 msgid "Unit for the maximum size" msgstr "Enhet for maksimal størrelse" #. TRANSLATORS: radio button label, fully automatically computed partition size, no user input -#: src/components/storage/VolumeFields.jsx:442 +#: src/components/storage/VolumeFields.jsx:444 msgid "Auto" msgstr "Auto" #. TRANSLATORS: radio button label, exact partition size requested by user -#: src/components/storage/VolumeFields.jsx:444 +#: src/components/storage/VolumeFields.jsx:446 msgid "Fixed" msgstr "Fikset" #. TRANSLATORS: radio button label, automatically computed partition size within the user provided min and max limits -#: src/components/storage/VolumeFields.jsx:446 +#: src/components/storage/VolumeFields.jsx:448 msgid "Range" msgstr "Rekkevidde" @@ -2350,7 +2312,7 @@ msgstr "Mål" #: src/components/storage/routes.js:36 msgid "Proposal" -msgstr "" +msgstr "Forslag" #: src/components/storage/utils.js:64 msgid "KiB" @@ -2383,9 +2345,8 @@ msgstr "Alle partisjoner vil bli fjernet og alle data på diskene vil gå tapt." #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space deleting current content". Keep it short #: src/components/storage/utils.js:82 -#, fuzzy msgid "deleting current content" -msgstr "Slett gjeldende innhold" +msgstr "sletter gjeldende innhold" #: src/components/storage/utils.js:87 msgid "Shrink existing partitions" @@ -2399,9 +2360,8 @@ msgstr "" #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space shrinking partitions". Keep it short. #: src/components/storage/utils.js:92 -#, fuzzy msgid "shrinking partitions" -msgstr "Krymp eksisterende partisjoner" +msgstr "Krymper partisjoner" #: src/components/storage/utils.js:97 msgid "Use available space" @@ -2431,9 +2391,8 @@ msgstr "Velg hva som skal skje med hver partisjon." #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space with custom actions". Keep it short. #: src/components/storage/utils.js:112 -#, fuzzy msgid "with custom actions" -msgstr "utfører et tilpasset sett med handlinger" +msgstr "med tilpassede handlinger" #: src/components/users/FirstUser.jsx:35 msgid "No user defined yet." @@ -2479,23 +2438,20 @@ msgid "Use suggested username" msgstr "Bruk foreslått brukernavn" #: src/components/users/FirstUserForm.jsx:140 -#, fuzzy msgid "All fields are required" -msgstr "En størrelsesverdi er nødvendig" +msgstr "Alle feltene er påkrevd" #: src/components/users/FirstUserForm.jsx:147 msgid "Please, try again." -msgstr "" +msgstr "Vennligst, prøv igjen." #: src/components/users/FirstUserForm.jsx:197 -#, fuzzy msgid "Create user" -msgstr "Opprett brukerkonto" +msgstr "Opprett bruker" #: src/components/users/FirstUserForm.jsx:197 -#, fuzzy msgid "Edit user" -msgstr "Rediger %s" +msgstr "Rediger bruker" #: src/components/users/FirstUserForm.jsx:214 #: src/components/users/FirstUserForm.jsx:216 @@ -2604,21 +2560,19 @@ msgstr "Tøm" #: src/components/users/UsersPage.jsx:45 msgid "First user" -msgstr "" +msgstr "Første bruker" #: src/components/users/UsersPage.jsx:52 msgid "Root authentication" msgstr "Root autentisering" #: src/components/users/routes.js:41 -#, fuzzy msgid "Create or edit the first user" -msgstr "Kan ikke lese filen" +msgstr "Opprett eller rediger den første brukeren" #: src/components/users/routes.js:48 -#, fuzzy msgid "Edit first user" -msgstr "Rediger filsystemet" +msgstr "Rediger første bruker" #~ msgid "" #~ "There are some reported issues. Please review them in the previous steps " diff --git a/web/po/nl.po b/web/po/nl.po index a3bb744fc5..17b1d92d1c 100644 --- a/web/po/nl.po +++ b/web/po/nl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-16 02:26+0000\n" +"POT-Creation-Date: 2024-06-20 02:20+0000\n" "PO-Revision-Date: 2024-03-13 09:42+0000\n" "Last-Translator: Natasha Ament \n" "Language-Team: Dutch \n" "Language-Team: Portuguese (Brazil) \n" +"POT-Creation-Date: 2024-06-20 02:20+0000\n" +"PO-Revision-Date: 2024-06-18 15:46+0000\n" +"Last-Translator: Alex Minton \n" "Language-Team: Russian \n" "Language: ru\n" @@ -21,16 +21,14 @@ msgstr "" "X-Generator: Weblate 5.5.5\n" #: src/MainLayout.jsx:40 -#, fuzzy msgid "Agama" -msgstr "Об Agama" +msgstr "Agama" #: src/MainLayout.jsx:82 msgid "Change product" msgstr "Изменить продукт" #: src/components/core/About.jsx:49 -#, fuzzy msgid "About" msgstr "Об Agama" @@ -108,11 +106,11 @@ msgstr "Отмена" msgid "Install" msgstr "Установить" -#: src/components/core/InstallationFinished.jsx:41 +#: src/components/core/InstallationFinished.jsx:42 msgid "TPM sealing requires the new system to be booted directly." msgstr "Запечатывание TPM требует прямой загрузки новой системы." -#: src/components/core/InstallationFinished.jsx:46 +#: src/components/core/InstallationFinished.jsx:47 msgid "" "If a local media was used to run this installer, remove it before the next " "boot." @@ -120,16 +118,16 @@ msgstr "" "Если для запуска этой программы установки использовался локальный носитель, " "извлеките его перед следующей загрузкой." -#: src/components/core/InstallationFinished.jsx:50 +#: src/components/core/InstallationFinished.jsx:51 msgid "Hide details" msgstr "Скрыть подробности" -#: src/components/core/InstallationFinished.jsx:50 +#: src/components/core/InstallationFinished.jsx:51 msgid "See more details" msgstr "См. подробнее" #. TRANSLATORS: "Trusted Platform Module" is the name of the technology and "TPM" its abbreviation -#: src/components/core/InstallationFinished.jsx:54 +#: src/components/core/InstallationFinished.jsx:55 msgid "" "The final step to configure the Trusted Platform Module (TPM) to " "automatically open encrypted devices will take place during the first boot " @@ -141,46 +139,44 @@ msgstr "" "первой загрузки новой системы. Чтобы это сработало, машина должна " "загрузиться непосредственно в новый загрузчик." -#: src/components/core/InstallationFinished.jsx:99 +#: src/components/core/InstallationFinished.jsx:97 msgid "Congratulations!" msgstr "Поздравляем!" -#: src/components/core/InstallationFinished.jsx:104 +#: src/components/core/InstallationFinished.jsx:102 msgid "The installation on your machine is complete." msgstr "Установка на ваш компьютер завершена." -#: src/components/core/InstallationFinished.jsx:107 +#: src/components/core/InstallationFinished.jsx:105 msgid "At this point you can power off the machine." msgstr "На этом этапе вы можете выключить устройство." -#: src/components/core/InstallationFinished.jsx:108 +#: src/components/core/InstallationFinished.jsx:106 msgid "At this point you can reboot the machine to log in to the new system." msgstr "" "На этом этапе вы можете перезагрузить устройство, чтобы войти в новую " "систему." -#: src/components/core/InstallationFinished.jsx:115 +#: src/components/core/InstallationFinished.jsx:113 msgid "Finish" msgstr "Завершить" -#: src/components/core/InstallationFinished.jsx:115 +#: src/components/core/InstallationFinished.jsx:113 msgid "Reboot" msgstr "Перезагрузка" #: src/components/core/InstallerOptions.jsx:57 -#, fuzzy msgid "Show installer options" -msgstr "Скрыть параметры установки" +msgstr "Показать параметры установки" #: src/components/core/InstallerOptions.jsx:62 -#, fuzzy msgid "Installer options" -msgstr "Параметры установки" +msgstr "Параметры установщика" #: src/components/core/IssuesHint.jsx:34 msgid "" "Before starting the installation, you need to address the following problems:" -msgstr "" +msgstr "До начала установки нужно устранить следующие проблемы:" #: src/components/core/ListSearch.jsx:51 msgid "Search" @@ -209,14 +205,11 @@ msgstr "Вход как %s" #. it and keep the brackets. #: src/components/core/LoginPage.jsx:76 msgid "The installer requires [root] user privileges." -msgstr "" +msgstr "Программа установки требует привилегий пользователя [root]." #: src/components/core/LoginPage.jsx:95 -#, fuzzy msgid "Please, provide its password to log in to the system." -msgstr "" -"Программа установки требует привилегий пользователя %s. Пожалуйста, укажите " -"его пароль для входа в систему." +msgstr "Пожалуйста, укажите его пароль для входа в систему." #: src/components/core/LoginPage.jsx:98 msgid "Login form" @@ -232,7 +225,7 @@ msgstr "Вход" #: src/components/core/LoginPage.jsx:124 msgid "More about this" -msgstr "" +msgstr "Подробнее об этом" #: src/components/core/LogsButton.jsx:102 msgid "Collecting logs..." @@ -322,14 +315,12 @@ msgid "Keyboard" msgstr "Клавиатура" #: src/components/l10n/InstallerKeymapSwitcher.jsx:75 -#, fuzzy msgid "Choose a keyboard layout" -msgstr "Выберите продукт" +msgstr "Выберите раскладку клавиатуры" #: src/components/l10n/InstallerKeymapSwitcher.jsx:86 -#, fuzzy msgid "Cannot be changed in remote installation" -msgstr "Раскладку клавиатуры нельзя изменить при удаленной установке" +msgstr "Нельзя изменить при удаленной установке" #: src/components/l10n/InstallerLocaleSwitcher.jsx:57 #: src/components/l10n/L10nPage.jsx:67 @@ -337,23 +328,20 @@ msgid "Language" msgstr "Язык" #: src/components/l10n/InstallerLocaleSwitcher.jsx:63 -#, fuzzy msgid "Choose a language" -msgstr "Изменить язык" +msgstr "Выберите язык" #: src/components/l10n/KeyboardSelection.jsx:45 msgid "Filter by description or keymap code" msgstr "Фильтр по описанию или коду карты клавиш" #: src/components/l10n/KeyboardSelection.jsx:85 -#, fuzzy msgid "None of the keymaps match the filter." -msgstr "Ни один из шаблонов не соответствует фильтру." +msgstr "Ни одна из карт не соответствует фильтру." #: src/components/l10n/KeyboardSelection.jsx:92 -#, fuzzy msgid "Keyboard selection" -msgstr "Выбор программного обеспечения" +msgstr "Выбор клавиатуры" #: src/components/l10n/KeyboardSelection.jsx:107 #: src/components/l10n/L10nPage.jsx:71 src/components/l10n/L10nPage.jsx:82 @@ -371,9 +359,8 @@ msgstr "Локализация" #: src/components/l10n/L10nPage.jsx:68 src/components/l10n/L10nPage.jsx:79 #: src/components/l10n/L10nPage.jsx:90 -#, fuzzy msgid "Not selected yet" -msgstr "Устройство ещё не выбрано" +msgstr "Ещё не выбрано" #: src/components/l10n/L10nPage.jsx:71 src/components/l10n/L10nPage.jsx:82 #: src/components/l10n/L10nPage.jsx:93 @@ -393,28 +380,24 @@ msgid "Filter by language, territory or locale code" msgstr "Фильтр по языку, территории или коду локали" #: src/components/l10n/LocaleSelection.jsx:84 -#, fuzzy msgid "None of the locales match the filter." -msgstr "Ни один из шаблонов не соответствует фильтру." +msgstr "Ни одна из локалей не соответствует фильтру." #: src/components/l10n/LocaleSelection.jsx:91 -#, fuzzy msgid "Locale selection" -msgstr "Выбор программного обеспечения" +msgstr "Выбор локали" #: src/components/l10n/TimezoneSelection.jsx:71 msgid "Filter by territory, time zone code or UTC offset" msgstr "Фильтр по территории, коду часового пояса или смещению UTC" #: src/components/l10n/TimezoneSelection.jsx:122 -#, fuzzy msgid "None of the time zones match the filter." -msgstr "Ни один из шаблонов не соответствует фильтру." +msgstr "Ни один из часовых поясов не соответствует фильтру." #: src/components/l10n/TimezoneSelection.jsx:129 -#, fuzzy msgid " Timezone selection" -msgstr "Изменить выбор" +msgstr " Выбор часового пояса" #: src/components/layout/Loading.jsx:31 msgid "Loading installation environment, please wait." @@ -561,11 +544,11 @@ msgstr "Шлюз" #: src/components/network/IpSettingsForm.jsx:178 msgid "Gateway can be defined only in 'Manual' mode" -msgstr "" +msgstr "Шлюз можно указать только в ручном режиме" #: src/components/network/IpSettingsForm.jsx:210 #: src/components/product/ProductRegistrationPage.jsx:89 -#: src/components/storage/BootSelection.jsx:216 +#: src/components/storage/BootSelection.jsx:215 #: src/components/storage/DeviceSelection.jsx:240 #: src/components/storage/EncryptionSettingsDialog.jsx:138 #: src/components/storage/VolumeDialog.jsx:786 @@ -606,14 +589,12 @@ msgid "Network" msgstr "Сеть" #: src/components/network/NetworkPage.jsx:178 -#, fuzzy msgid "Wired connections" -msgstr "Забыть соединение %s" +msgstr "Проводные соединения" #: src/components/network/NetworkPage.jsx:185 -#, fuzzy msgid "WiFi connections" -msgstr "Отредактировать соединение %s" +msgstr "WiFi соединения" #. TRANSLATORS: WiFi authentication mode #: src/components/network/WifiConnectionForm.jsx:43 @@ -703,9 +684,8 @@ msgstr "Соединение %s ожидает изменения состоян #. TRANSLATORS: menu label, disconnect from the selected WiFi network #: src/components/network/WifiNetworkMenu.jsx:67 -#, fuzzy msgid "Disconnect" -msgstr "Отключено" +msgstr "Отключить" #. TRANSLATORS: menu label, remove the selected WiFi network settings #: src/components/network/WifiNetworkMenu.jsx:76 @@ -740,42 +720,40 @@ msgid "Software" msgstr "Программы" #: src/components/overview/OverviewPage.jsx:52 -#, fuzzy msgid "Ready for installation" -msgstr "Подтвердить установку" +msgstr "Готов к установке" #: src/components/overview/OverviewPage.jsx:102 -#, fuzzy msgid "Installation" msgstr "Установка" #: src/components/overview/OverviewPage.jsx:103 msgid "Before installing, please check the following problems." -msgstr "" +msgstr "Проверьте следующие проблемы перед установкой." #: src/components/overview/OverviewPage.jsx:114 -#, fuzzy msgid "" "Take your time to check your configuration before starting the installation " "process." -msgstr "Установка настроит разделы для загрузки с установочного диска." +msgstr "Проверьте свои настройки до начала процесса установки." #: src/components/overview/OverviewPage.jsx:123 msgid "" "These are the most relevant installation settings. Feel free to browse the " "sections in the menu for further details." msgstr "" +"Это наиболее актуальные настройки установки. Более подробные сведения " +"приведены в разделах меню." #: src/components/overview/SoftwareSection.jsx:60 -#, fuzzy msgid "The installation will take" -msgstr "Установка займёт %s" +msgstr "Установка займёт" #. TRANSLATORS: %s will be replaced with the installation size, example: "5GiB". #: src/components/overview/SoftwareSection.jsx:67 -#, fuzzy, c-format +#, c-format msgid "The installation will take %s including:" -msgstr "Установка займёт %s" +msgstr "Установка займёт %s, в том числе:" #: src/components/overview/StorageSection.jsx:53 msgid "" @@ -887,7 +865,7 @@ msgstr "" #: src/components/overview/routes.js:30 msgid "Overview" -msgstr "" +msgstr "Обзор" #: src/components/product/ProductRegistrationPage.jsx:66 #, c-format @@ -907,18 +885,16 @@ msgid "Loading available products, please wait..." msgstr "Загрузка доступных продуктов, пожалуйста, подождите..." #: src/components/product/ProductSelectionProgress.jsx:88 -#, fuzzy msgid "Analyze disks" -msgstr "Активировать диски" +msgstr "Анализировать диски" #: src/components/product/ProductSelectionProgress.jsx:95 msgid "Configure software" -msgstr "" +msgstr "Настроить ПО" #: src/components/product/ProductSelectionProgress.jsx:156 -#, fuzzy msgid "Configuring the product, please wait ..." -msgstr "Загрузка доступных продуктов, пожалуйста, подождите..." +msgstr "Настройка продукта, пожалуйста, подождите..." #: src/components/questions/GenericQuestion.jsx:35 #: src/components/questions/LuksActivationQuestion.jsx:60 @@ -948,9 +924,8 @@ msgid "The following software patterns are selected for installation:" msgstr "Для установки выбраны следующие образцы программного обеспечения:" #: src/components/software/SoftwarePage.jsx:165 -#, fuzzy msgid "Selected patterns" -msgstr "Выберите часовой пояс" +msgstr "Выбранные шаблоны" #: src/components/software/SoftwarePage.jsx:168 msgid "Change selection" @@ -968,18 +943,18 @@ msgstr "Выбор программного обеспечения" #: src/components/software/SoftwarePatternsSelection.jsx:241 #: src/components/software/SoftwarePatternsSelection.jsx:242 msgid "Filter by pattern title or description" -msgstr "" +msgstr "Фильтр по названию или описанию шаблона" #. TRANSLATORS: %s will be replaced by the estimated installation size, #. example: "728.8 MiB" #: src/components/software/UsedSize.jsx:33 -#, fuzzy, c-format +#, c-format msgid "Installation will take %s." -msgstr "Установка займёт %s" +msgstr "Установка займёт %s." #: src/components/software/UsedSize.jsx:38 msgid "This space includes the base system and the selected software patterns." -msgstr "" +msgstr "В этот объём входят основная система и выбранные шаблоны ПО." #: src/components/storage/BootConfigField.jsx:43 msgid "Change boot options" @@ -1000,7 +975,7 @@ msgstr "Установка настроит разделы для загрузк msgid "Installation will configure partitions for booting at %s." msgstr "Установка настроит разделы для загрузки по адресу %s." -#: src/components/storage/BootSelection.jsx:127 +#: src/components/storage/BootSelection.jsx:126 msgid "" "To ensure the new system is able to boot, the installer may need to create " "or configure some partitions in the appropriate disk." @@ -1009,43 +984,42 @@ msgstr "" "потребоваться создать или настроить некоторые разделы на соответствующем " "диске." -#: src/components/storage/BootSelection.jsx:133 +#: src/components/storage/BootSelection.jsx:132 msgid "Partitions to boot will be allocated at the installation disk." msgstr "Загрузочные разделы будут выделены на установочном диске." #. TRANSLATORS: %s is replaced by a device name and size (e.g., "/dev/sda, 500GiB") -#: src/components/storage/BootSelection.jsx:138 +#: src/components/storage/BootSelection.jsx:137 #, c-format msgid "Partitions to boot will be allocated at the installation disk (%s)." msgstr "Загрузочные разделы будут выделены на установочном диске (%s)." -#: src/components/storage/BootSelection.jsx:154 -#, fuzzy +#: src/components/storage/BootSelection.jsx:153 msgid "Select booting partition" -msgstr "Выберите, что делать с каждым разделом." +msgstr "Выберите загрузочный раздел" -#: src/components/storage/BootSelection.jsx:168 +#: src/components/storage/BootSelection.jsx:167 #: src/components/storage/iscsi/NodeStartupOptions.js:27 msgid "Automatic" msgstr "Автоматически" -#: src/components/storage/BootSelection.jsx:177 +#: src/components/storage/BootSelection.jsx:176 msgid "Select a disk" msgstr "Выберите диск" -#: src/components/storage/BootSelection.jsx:181 +#: src/components/storage/BootSelection.jsx:180 msgid "Partitions to boot will be allocated at the following device." msgstr "Загрузочные разделы будут выделены на следующем устройстве." -#: src/components/storage/BootSelection.jsx:184 +#: src/components/storage/BootSelection.jsx:183 msgid "Choose a disk for placing the boot loader" msgstr "Выберите диск для размещения загрузчика" -#: src/components/storage/BootSelection.jsx:200 +#: src/components/storage/BootSelection.jsx:199 msgid "Do not configure" msgstr "Не настраивать" -#: src/components/storage/BootSelection.jsx:203 +#: src/components/storage/BootSelection.jsx:202 msgid "" "No partitions will be automatically configured for booting. Use with caution." msgstr "" @@ -1168,9 +1142,8 @@ msgid "Remove max channel filter" msgstr "Удалить фильтр по максимальному каналу" #: src/components/storage/DeviceSelection.jsx:101 -#, fuzzy msgid "Loading data, please wait a second..." -msgstr "Загрузка доступных продуктов, пожалуйста, подождите..." +msgstr "Загрузка данных, пожалуйста, подождите..." #. TRANSLATORS: description for using plain partitions for installing the #. system, the text in the square brackets [] is displayed in bold, use only @@ -1197,24 +1170,20 @@ msgstr "" "требованию как новые разделы на выбранных устройствах." #: src/components/storage/DeviceSelection.jsx:149 -#, fuzzy msgid "Select installation device" -msgstr "Устройство для установки" +msgstr "Выберите устройство для установки" #: src/components/storage/DeviceSelection.jsx:155 -#, fuzzy msgid "Install new system on" -msgstr "Параметры установки" +msgstr "Установить новую систему на" #: src/components/storage/DeviceSelection.jsx:158 -#, fuzzy msgid "An existing disk" -msgstr "Уменьшение существующих разделов" +msgstr "существующий диск" #: src/components/storage/DeviceSelection.jsx:167 -#, fuzzy msgid "A new LVM Volume Group" -msgstr "новая группа томов LVM" +msgstr "новую группу томов LVM" #: src/components/storage/DeviceSelection.jsx:192 msgid "Device selector for target disk" @@ -1229,7 +1198,6 @@ msgid "Prepare more devices by configuring advanced" msgstr "Подготовьте больше устройств, настроив расширенные" #: src/components/storage/DeviceSelection.jsx:229 -#, fuzzy msgid "storage techs" msgstr "технологии хранения" @@ -1308,7 +1276,7 @@ msgstr "Подробности" #: src/components/storage/PartitionsField.jsx:451 #: src/components/storage/ProposalResultTable.jsx:123 #: src/components/storage/SpaceActionsTable.jsx:143 -#: src/components/storage/VolumeFields.jsx:472 +#: src/components/storage/VolumeFields.jsx:474 #: src/components/storage/VolumeLocationSelectorTable.jsx:103 msgid "Size" msgstr "Размер" @@ -1340,13 +1308,12 @@ msgid "Encryption" msgstr "Шифрование" #: src/components/storage/EncryptionField.jsx:39 -#, fuzzy msgid "" "Protection for the information stored at the device, including data, " "programs, and system files." msgstr "" -"Полнодисковое шифрование (FDE) позволяет защитить информацию, хранящуюся на " -"устройстве, включая данные, программы и системные файлы." +"Защита информации, хранящейся на устройстве, включая данные, программы и " +"системные файлы." #: src/components/storage/EncryptionField.jsx:42 msgid "disabled" @@ -1361,13 +1328,12 @@ msgid "using TPM unlocking" msgstr "используя разблокировку TPM" #: src/components/storage/EncryptionField.jsx:58 -#, fuzzy msgid "Enable" -msgstr "включено" +msgstr "Включить" #: src/components/storage/EncryptionField.jsx:58 msgid "Modify" -msgstr "" +msgstr "Изменить" #: src/components/storage/EncryptionSettingsDialog.jsx:37 msgid "" @@ -1408,26 +1374,24 @@ msgstr "Устройство для установки" #. TRANSLATORS: The storage "Installation device" field's description. #: src/components/storage/InstallationDeviceField.jsx:42 -#, fuzzy msgid "Main disk or LVM Volume Group for installation." -msgstr "Выберите основной диск или группу томов LVM для установки." +msgstr "Основной диск или группа томов LVM для установки." #. TRANSLATORS: %s is the installation disk (eg. "/dev/sda, 80 GiB) #: src/components/storage/InstallationDeviceField.jsx:56 -#, fuzzy, c-format +#, c-format msgid "File systems created as new partitions at %s" -msgstr "Создать новый раздел" +msgstr "Файловые системы созданы как новые разделы на %s" #: src/components/storage/InstallationDeviceField.jsx:59 -#, fuzzy msgid "File systems created at a new LVM volume group" -msgstr "Выбор устройств для новой группы томов LVM" +msgstr "Файловые системы созданы в новой группе томов LVM" #. TRANSLATORS: %s is the disk used for the LVM physical volumes (eg. "/dev/sda, 80 GiB) #: src/components/storage/InstallationDeviceField.jsx:63 -#, fuzzy, c-format +#, c-format msgid "File systems created at a new LVM volume group on %s" -msgstr "новая группа томов LVM на %s" +msgstr "Файловые системы созданы в новой группе томов LVM на %s" #. TRANSLATORS: minimum device size, %s is replaced by size string, e.g. "17.5 GiB" #: src/components/storage/PartitionsField.jsx:73 @@ -1620,9 +1584,9 @@ msgid "Delete" msgstr "Удалить" #: src/components/storage/PartitionsField.jsx:449 -#: src/components/storage/VolumeFields.jsx:59 -#: src/components/storage/VolumeFields.jsx:68 -#: src/components/storage/VolumeFields.jsx:73 +#: src/components/storage/VolumeFields.jsx:61 +#: src/components/storage/VolumeFields.jsx:70 +#: src/components/storage/VolumeFields.jsx:75 msgid "Mount point" msgstr "Точка монтирования" @@ -1654,18 +1618,16 @@ msgid "Partitions and file systems" msgstr "Разделы и файловые системы" #: src/components/storage/PartitionsField.jsx:802 -#, fuzzy msgid "" "Structure of the new system, including any additional partition needed for " "booting" msgstr "" "Структура новой системы, включая все дополнительные разделы, необходимые для " -"загрузки," +"загрузки" #: src/components/storage/PartitionsField.jsx:808 -#, fuzzy msgid "Show partitions and file-systems actions" -msgstr "Разделы и файловые системы" +msgstr "Показать разделы и действия с файловыми системами" #. TRANSLATORS: show/hide toggle action, this is a clickable link #: src/components/storage/ProposalActionsDialog.jsx:62 @@ -1698,12 +1660,12 @@ msgid "Affecting" msgstr "Влияя на" #: src/components/storage/ProposalResultSection.jsx:96 -#, fuzzy, c-format +#, c-format msgid "Check the planned action" msgid_plural "Check the %d planned actions" -msgstr[0] "Проверить все запланированные действия" -msgstr[1] "Проверить все запланированные действия" -msgstr[2] "Проверить все запланированные действия" +msgstr[0] "Проверить %d запланированное действие" +msgstr[1] "Проверить %d запланированных действия" +msgstr[2] "Проверить %d запланированных действий" #: src/components/storage/ProposalResultSection.jsx:111 msgid "Waiting for information about storage configuration" @@ -1711,16 +1673,15 @@ msgstr "Ожидание информации о конфигурации хра #: src/components/storage/ProposalResultSection.jsx:124 msgid "Storage proposal not possible" -msgstr "" +msgstr "Не могу предложить организацию хранилища" #: src/components/storage/ProposalResultSection.jsx:188 -#, fuzzy msgid "" "During installation, some actions will be performed to configure the system " "as displayed below." msgstr "" -"Во время установки будет выполнено %d действие для настройки системы, как " -"показано ниже" +"Во время установки будут выполнены некоторые действия для настройки системы " +"как показано ниже." #: src/components/storage/ProposalResultSection.jsx:196 msgid "Planned Actions" @@ -1745,11 +1706,11 @@ msgstr "До %s" msgid "Mount Point" msgstr "Точка монтирования" -#: src/components/storage/ProposalTransactionalInfo.jsx:46 +#: src/components/storage/ProposalTransactionalInfo.jsx:45 msgid "Transactional root file system" msgstr "Транзакционная корневая файловая система" -#: src/components/storage/ProposalTransactionalInfo.jsx:49 +#: src/components/storage/ProposalTransactionalInfo.jsx:48 #, c-format msgid "" "%s is an immutable system with atomic updates. It uses a read-only Btrfs " @@ -1898,75 +1859,75 @@ msgid "Do you want to add it?" msgstr "Вы хотите добавить её?" #. TRANSLATORS: info about possible file system types. -#: src/components/storage/VolumeFields.jsx:215 +#: src/components/storage/VolumeFields.jsx:217 msgid "" "The options for the file system type depends on the product and the mount " "point." msgstr "" "Параметры типа файловой системы зависят от продукта и точки монтирования." -#: src/components/storage/VolumeFields.jsx:221 +#: src/components/storage/VolumeFields.jsx:223 msgid "More info for file system types" msgstr "Дополнительная информация о типах файловых систем" #. TRANSLATORS: label for the file system selector. -#: src/components/storage/VolumeFields.jsx:232 +#: src/components/storage/VolumeFields.jsx:234 msgid "File system type" msgstr "Тип файловой системы" #. TRANSLATORS: item which affects the final computed partition size -#: src/components/storage/VolumeFields.jsx:263 +#: src/components/storage/VolumeFields.jsx:265 msgid "the configuration of snapshots" msgstr "конфигурация моментальных снимков" #. TRANSLATORS: item which affects the final computed partition size #. %s is replaced by a list of mount points like "/home, /boot" -#: src/components/storage/VolumeFields.jsx:268 +#: src/components/storage/VolumeFields.jsx:270 #, c-format msgid "the presence of the file system for %s" msgstr "наличие файловой системы для %s" #. TRANSLATORS: conjunction for merging two list items -#: src/components/storage/VolumeFields.jsx:270 +#: src/components/storage/VolumeFields.jsx:272 msgid ", " msgstr ", " #. TRANSLATORS: item which affects the final computed partition size -#: src/components/storage/VolumeFields.jsx:274 +#: src/components/storage/VolumeFields.jsx:276 msgid "the amount of RAM in the system" msgstr "объем ОЗУ в системе" #. TRANSLATORS: the %s is replaced by the items which affect the computed size -#: src/components/storage/VolumeFields.jsx:277 +#: src/components/storage/VolumeFields.jsx:279 #, c-format msgid "The final size depends on %s." msgstr "Итоговый размер зависит от %s." #. TRANSLATORS: conjunction for merging two texts -#: src/components/storage/VolumeFields.jsx:279 +#: src/components/storage/VolumeFields.jsx:281 msgid " and " msgstr " и " #. TRANSLATORS: the partition size is automatically computed -#: src/components/storage/VolumeFields.jsx:284 +#: src/components/storage/VolumeFields.jsx:286 msgid "Automatically calculated size according to the selected product." msgstr "Автоматический расчет размера в соответствии с выбранным продуктом." -#: src/components/storage/VolumeFields.jsx:303 +#: src/components/storage/VolumeFields.jsx:305 msgid "Exact size for the file system." msgstr "Точный размер файловой системы." #. TRANSLATORS: requested partition size -#: src/components/storage/VolumeFields.jsx:316 +#: src/components/storage/VolumeFields.jsx:318 msgid "Exact size" msgstr "Точный размер" #. TRANSLATORS: units selector (like KiB, MiB, GiB...) -#: src/components/storage/VolumeFields.jsx:333 +#: src/components/storage/VolumeFields.jsx:335 msgid "Size unit" msgstr "Единица измерения" -#: src/components/storage/VolumeFields.jsx:361 +#: src/components/storage/VolumeFields.jsx:363 msgid "" "Limits for the file system size. The final size will be a value between the " "given minimum and maximum. If no maximum is given then the file system will " @@ -1977,45 +1938,45 @@ msgstr "" "то файловая система будет такой большой, на сколько это возможно." #. TRANSLATORS: the minimal partition size -#: src/components/storage/VolumeFields.jsx:368 +#: src/components/storage/VolumeFields.jsx:370 msgid "Minimum" msgstr "Минимум" #. TRANSLATORS: the minium partition size -#: src/components/storage/VolumeFields.jsx:379 +#: src/components/storage/VolumeFields.jsx:381 msgid "Minimum desired size" msgstr "Минимальный желаемый размер" -#: src/components/storage/VolumeFields.jsx:390 +#: src/components/storage/VolumeFields.jsx:392 msgid "Unit for the minimum size" msgstr "Единица для минимального размера" #. TRANSLATORS: the maximum partition size -#: src/components/storage/VolumeFields.jsx:402 +#: src/components/storage/VolumeFields.jsx:404 msgid "Maximum" msgstr "Максимум" #. TRANSLATORS: the maximum partition size -#: src/components/storage/VolumeFields.jsx:414 +#: src/components/storage/VolumeFields.jsx:416 msgid "Maximum desired size" msgstr "Максимальный желаемый размер" -#: src/components/storage/VolumeFields.jsx:424 +#: src/components/storage/VolumeFields.jsx:426 msgid "Unit for the maximum size" msgstr "Единица для максимального размера" #. TRANSLATORS: radio button label, fully automatically computed partition size, no user input -#: src/components/storage/VolumeFields.jsx:442 +#: src/components/storage/VolumeFields.jsx:444 msgid "Auto" msgstr "Автоматически" #. TRANSLATORS: radio button label, exact partition size requested by user -#: src/components/storage/VolumeFields.jsx:444 +#: src/components/storage/VolumeFields.jsx:446 msgid "Fixed" msgstr "Фиксированный" #. TRANSLATORS: radio button label, automatically computed partition size within the user provided min and max limits -#: src/components/storage/VolumeFields.jsx:446 +#: src/components/storage/VolumeFields.jsx:448 msgid "Range" msgstr "Диапазон" @@ -2361,7 +2322,7 @@ msgstr "Цели" #: src/components/storage/routes.js:36 msgid "Proposal" -msgstr "" +msgstr "Предложение" #: src/components/storage/utils.js:64 msgid "KiB" @@ -2394,9 +2355,8 @@ msgstr "Все разделы будут удалены, а все данные #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space deleting current content". Keep it short #: src/components/storage/utils.js:82 -#, fuzzy msgid "deleting current content" -msgstr "Удалить текущее содержимое" +msgstr "удаление текущего содержимого" #: src/components/storage/utils.js:87 msgid "Shrink existing partitions" @@ -2411,9 +2371,8 @@ msgstr "" #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space shrinking partitions". Keep it short. #: src/components/storage/utils.js:92 -#, fuzzy msgid "shrinking partitions" -msgstr "Уменьшение существующих разделов" +msgstr "уменьшение разделов" #: src/components/storage/utils.js:97 msgid "Use available space" @@ -2434,7 +2393,7 @@ msgstr "не изменяя ни одного раздела" #: src/components/storage/utils.js:107 msgid "Custom" -msgstr "По своему" +msgstr "По-своему" #: src/components/storage/utils.js:108 msgid "Select what to do with each partition." @@ -2443,9 +2402,8 @@ msgstr "Выберите, что делать с каждым разделом." #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space with custom actions". Keep it short. #: src/components/storage/utils.js:112 -#, fuzzy msgid "with custom actions" -msgstr "выполняя пользовательский набор действий" +msgstr "другими способами" #: src/components/users/FirstUser.jsx:35 msgid "No user defined yet." @@ -2491,23 +2449,20 @@ msgid "Use suggested username" msgstr "Используйте предложенное имя пользователя" #: src/components/users/FirstUserForm.jsx:140 -#, fuzzy msgid "All fields are required" -msgstr "Требуется значение размера" +msgstr "Все поля обязательны" #: src/components/users/FirstUserForm.jsx:147 msgid "Please, try again." -msgstr "" +msgstr "Попробуйте ещё раз." #: src/components/users/FirstUserForm.jsx:197 -#, fuzzy msgid "Create user" -msgstr "Создать учетную запись" +msgstr "Создать пользователя" #: src/components/users/FirstUserForm.jsx:197 -#, fuzzy msgid "Edit user" -msgstr "Изменить %s" +msgstr "Изменить пользователя" #: src/components/users/FirstUserForm.jsx:214 #: src/components/users/FirstUserForm.jsx:216 @@ -2616,21 +2571,19 @@ msgstr "Очистить" #: src/components/users/UsersPage.jsx:45 msgid "First user" -msgstr "" +msgstr "Первый пользователь" #: src/components/users/UsersPage.jsx:52 msgid "Root authentication" msgstr "Аутентификация root" #: src/components/users/routes.js:41 -#, fuzzy msgid "Create or edit the first user" -msgstr "Невозможно прочитать файл" +msgstr "Создать или изменить первого пользователя" #: src/components/users/routes.js:48 -#, fuzzy msgid "Edit first user" -msgstr "Изменить файловую систему" +msgstr "Изменить первого пользователя" #~ msgid "" #~ "There are some reported issues. Please review them in the previous steps " diff --git a/web/po/sv.po b/web/po/sv.po index f17d700fa8..5c1b6f831b 100644 --- a/web/po/sv.po +++ b/web/po/sv.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-16 02:26+0000\n" -"PO-Revision-Date: 2024-06-10 19:24+0000\n" +"POT-Creation-Date: 2024-06-20 02:20+0000\n" +"PO-Revision-Date: 2024-06-17 06:46+0000\n" "Last-Translator: Luna Jernberg \n" "Language-Team: Swedish \n" @@ -20,18 +20,16 @@ msgstr "" "X-Generator: Weblate 5.5.5\n" #: src/MainLayout.jsx:40 -#, fuzzy msgid "Agama" -msgstr "Om Agama" +msgstr "Agama" #: src/MainLayout.jsx:82 msgid "Change product" msgstr "Ändra produkt" #: src/components/core/About.jsx:49 -#, fuzzy msgid "About" -msgstr "Om Agama" +msgstr "Om" #: src/components/core/About.jsx:71 msgid "About Agama" @@ -105,11 +103,11 @@ msgstr "Avbryt" msgid "Install" msgstr "Installera" -#: src/components/core/InstallationFinished.jsx:41 +#: src/components/core/InstallationFinished.jsx:42 msgid "TPM sealing requires the new system to be booted directly." msgstr "TPM-försegling kräver att det nya systemet startas upp direkt." -#: src/components/core/InstallationFinished.jsx:46 +#: src/components/core/InstallationFinished.jsx:47 msgid "" "If a local media was used to run this installer, remove it before the next " "boot." @@ -117,16 +115,16 @@ msgstr "" "Om ett lokalt media användes för att köra det här installationsprogrammet, " "ta bort det före nästa uppstart." -#: src/components/core/InstallationFinished.jsx:50 +#: src/components/core/InstallationFinished.jsx:51 msgid "Hide details" msgstr "Dölj detaljer" -#: src/components/core/InstallationFinished.jsx:50 +#: src/components/core/InstallationFinished.jsx:51 msgid "See more details" msgstr "Se mer detaljer" #. TRANSLATORS: "Trusted Platform Module" is the name of the technology and "TPM" its abbreviation -#: src/components/core/InstallationFinished.jsx:54 +#: src/components/core/InstallationFinished.jsx:55 msgid "" "The final step to configure the Trusted Platform Module (TPM) to " "automatically open encrypted devices will take place during the first boot " @@ -138,46 +136,44 @@ msgstr "" "uppstarten av det nya systemet. För att det ska fungera måste maskinen " "startas direkt till den nya uppstartshanteraren." -#: src/components/core/InstallationFinished.jsx:99 +#: src/components/core/InstallationFinished.jsx:97 msgid "Congratulations!" msgstr "Grattis!" -#: src/components/core/InstallationFinished.jsx:104 +#: src/components/core/InstallationFinished.jsx:102 msgid "The installation on your machine is complete." msgstr "Installationen på din maskin har slutförts." -#: src/components/core/InstallationFinished.jsx:107 +#: src/components/core/InstallationFinished.jsx:105 msgid "At this point you can power off the machine." msgstr "Vid det här laget kan du stänga av maskinen." -#: src/components/core/InstallationFinished.jsx:108 +#: src/components/core/InstallationFinished.jsx:106 msgid "At this point you can reboot the machine to log in to the new system." msgstr "" "Vid det här laget kan du starta om maskinen för att logga in till det nya " "systemet." -#: src/components/core/InstallationFinished.jsx:115 +#: src/components/core/InstallationFinished.jsx:113 msgid "Finish" msgstr "Slutför" -#: src/components/core/InstallationFinished.jsx:115 +#: src/components/core/InstallationFinished.jsx:113 msgid "Reboot" msgstr "Starta om" #: src/components/core/InstallerOptions.jsx:57 -#, fuzzy msgid "Show installer options" -msgstr "Dölj installationsalternativ" +msgstr "Visa installationsalternativ" #: src/components/core/InstallerOptions.jsx:62 -#, fuzzy msgid "Installer options" msgstr "Installationsalternativ" #: src/components/core/IssuesHint.jsx:34 msgid "" "Before starting the installation, you need to address the following problems:" -msgstr "" +msgstr "Innan du startar installationen måste du åtgärda följande problem:" #: src/components/core/ListSearch.jsx:51 msgid "Search" @@ -203,14 +199,11 @@ msgstr "Logga in som %s" #. it and keep the brackets. #: src/components/core/LoginPage.jsx:76 msgid "The installer requires [root] user privileges." -msgstr "" +msgstr "Installationsprogrammet kräver [root] användarrättigheter." #: src/components/core/LoginPage.jsx:95 -#, fuzzy msgid "Please, provide its password to log in to the system." -msgstr "" -"Installationsprogrammet kräver %s användarrättigheter. Vänligen ange " -"lösenordet för att logga in på systemet." +msgstr "Vänligen ange lösenordet för att logga in på systemet." #: src/components/core/LoginPage.jsx:98 msgid "Login form" @@ -226,7 +219,7 @@ msgstr "Logga in" #: src/components/core/LoginPage.jsx:124 msgid "More about this" -msgstr "" +msgstr "Mer om detta" #: src/components/core/LogsButton.jsx:102 msgid "Collecting logs..." @@ -315,14 +308,12 @@ msgid "Keyboard" msgstr "Tangentbord" #: src/components/l10n/InstallerKeymapSwitcher.jsx:75 -#, fuzzy msgid "Choose a keyboard layout" -msgstr "Välj en produkt" +msgstr "Välj en tangentbordslayout" #: src/components/l10n/InstallerKeymapSwitcher.jsx:86 -#, fuzzy msgid "Cannot be changed in remote installation" -msgstr "Tangentbordslayout kan inte ändras vid fjärrinstallation" +msgstr "Kan inte ändras i fjärrinstallation" #: src/components/l10n/InstallerLocaleSwitcher.jsx:57 #: src/components/l10n/L10nPage.jsx:67 @@ -330,23 +321,20 @@ msgid "Language" msgstr "Språk" #: src/components/l10n/InstallerLocaleSwitcher.jsx:63 -#, fuzzy msgid "Choose a language" -msgstr "Ändra språk" +msgstr "Välj ett språk" #: src/components/l10n/KeyboardSelection.jsx:45 msgid "Filter by description or keymap code" msgstr "Filtrera efter beskrivning eller tangentbordskod" #: src/components/l10n/KeyboardSelection.jsx:85 -#, fuzzy msgid "None of the keymaps match the filter." -msgstr "Inget av mönstren matchar filtret." +msgstr "Ingen av tangentmapparna matchar filtret." #: src/components/l10n/KeyboardSelection.jsx:92 -#, fuzzy msgid "Keyboard selection" -msgstr "Val av programvara" +msgstr "Tangentbordsval" #: src/components/l10n/KeyboardSelection.jsx:107 #: src/components/l10n/L10nPage.jsx:71 src/components/l10n/L10nPage.jsx:82 @@ -364,9 +352,8 @@ msgstr "Lokalisering" #: src/components/l10n/L10nPage.jsx:68 src/components/l10n/L10nPage.jsx:79 #: src/components/l10n/L10nPage.jsx:90 -#, fuzzy msgid "Not selected yet" -msgstr "Ingen enhet vald ännu" +msgstr "Inte valt ännu" #: src/components/l10n/L10nPage.jsx:71 src/components/l10n/L10nPage.jsx:82 #: src/components/l10n/L10nPage.jsx:93 @@ -386,28 +373,24 @@ msgid "Filter by language, territory or locale code" msgstr "Filtrera efter språk, territorium eller lokalkod" #: src/components/l10n/LocaleSelection.jsx:84 -#, fuzzy msgid "None of the locales match the filter." -msgstr "Inget av mönstren matchar filtret." +msgstr "Inget av lokalerna matchar filtret." #: src/components/l10n/LocaleSelection.jsx:91 -#, fuzzy msgid "Locale selection" -msgstr "Val av programvara" +msgstr "Lokal val" #: src/components/l10n/TimezoneSelection.jsx:71 msgid "Filter by territory, time zone code or UTC offset" msgstr "Filtrera efter område, tidszonskod eller UTC-förskjutning" #: src/components/l10n/TimezoneSelection.jsx:122 -#, fuzzy msgid "None of the time zones match the filter." -msgstr "Inget av mönstren matchar filtret." +msgstr "Inget av tidszonerna matchar filtret." #: src/components/l10n/TimezoneSelection.jsx:129 -#, fuzzy msgid " Timezone selection" -msgstr "Ändra val" +msgstr " Tidszon val" #: src/components/layout/Loading.jsx:31 msgid "Loading installation environment, please wait." @@ -554,11 +537,11 @@ msgstr "Gateway" #: src/components/network/IpSettingsForm.jsx:178 msgid "Gateway can be defined only in 'Manual' mode" -msgstr "" +msgstr "Gateway kan endast definieras i \"Manuellt\" läge" #: src/components/network/IpSettingsForm.jsx:210 #: src/components/product/ProductRegistrationPage.jsx:89 -#: src/components/storage/BootSelection.jsx:216 +#: src/components/storage/BootSelection.jsx:215 #: src/components/storage/DeviceSelection.jsx:240 #: src/components/storage/EncryptionSettingsDialog.jsx:138 #: src/components/storage/VolumeDialog.jsx:786 @@ -600,14 +583,12 @@ msgid "Network" msgstr "Nätverk" #: src/components/network/NetworkPage.jsx:178 -#, fuzzy msgid "Wired connections" -msgstr "Glöm anslutning %s" +msgstr "Trådanslutna anslutningar" #: src/components/network/NetworkPage.jsx:185 -#, fuzzy msgid "WiFi connections" -msgstr "Redigera anslutning %s" +msgstr "WiFi anslutningar" #. TRANSLATORS: WiFi authentication mode #: src/components/network/WifiConnectionForm.jsx:43 @@ -697,9 +678,8 @@ msgstr "%s anslutningen väntar på en tillståndsändring" #. TRANSLATORS: menu label, disconnect from the selected WiFi network #: src/components/network/WifiNetworkMenu.jsx:67 -#, fuzzy msgid "Disconnect" -msgstr "Frånkopplad" +msgstr "Koppla ifrån" #. TRANSLATORS: menu label, remove the selected WiFi network settings #: src/components/network/WifiNetworkMenu.jsx:76 @@ -734,44 +714,42 @@ msgid "Software" msgstr "Programvara" #: src/components/overview/OverviewPage.jsx:52 -#, fuzzy msgid "Ready for installation" -msgstr "Bekräfta Installation" +msgstr "Redo för installation" #: src/components/overview/OverviewPage.jsx:102 -#, fuzzy msgid "Installation" -msgstr "Installerar" +msgstr "Installation" #: src/components/overview/OverviewPage.jsx:103 msgid "Before installing, please check the following problems." -msgstr "" +msgstr "Innan du installerar, vänligen kontrollera följande problem." #: src/components/overview/OverviewPage.jsx:114 -#, fuzzy msgid "" "Take your time to check your configuration before starting the installation " "process." msgstr "" -"Installationen kommer att konfigurera partitioner för uppstart på " -"installationsdisken." +"Ta dig tid att kontrollera din konfiguration innan du startar " +"installationsprocessen." #: src/components/overview/OverviewPage.jsx:123 msgid "" "These are the most relevant installation settings. Feel free to browse the " "sections in the menu for further details." msgstr "" +"Dessa är de mest relevanta installationsinställningarna. Bläddra gärna " +"igenom avsnitten i menyn för ytterligare detaljer." #: src/components/overview/SoftwareSection.jsx:60 -#, fuzzy msgid "The installation will take" -msgstr "Installationen kommer att ta upp %s" +msgstr "Installationen kommer att ta" #. TRANSLATORS: %s will be replaced with the installation size, example: "5GiB". #: src/components/overview/SoftwareSection.jsx:67 -#, fuzzy, c-format +#, c-format msgid "The installation will take %s including:" -msgstr "Installationen kommer att ta upp %s" +msgstr "Installationen kommer att ta upp %s inklusive:" #: src/components/overview/StorageSection.jsx:53 msgid "" @@ -879,7 +857,7 @@ msgstr "" #: src/components/overview/routes.js:30 msgid "Overview" -msgstr "" +msgstr "Översikt" #: src/components/product/ProductRegistrationPage.jsx:66 #, c-format @@ -899,18 +877,16 @@ msgid "Loading available products, please wait..." msgstr "Laddar tillgängliga produkter, vänligen vänta..." #: src/components/product/ProductSelectionProgress.jsx:88 -#, fuzzy msgid "Analyze disks" -msgstr "Aktivera diskar" +msgstr "Analysera diskar" #: src/components/product/ProductSelectionProgress.jsx:95 msgid "Configure software" -msgstr "" +msgstr "Konfigurera programvara" #: src/components/product/ProductSelectionProgress.jsx:156 -#, fuzzy msgid "Configuring the product, please wait ..." -msgstr "Laddar tillgängliga produkter, vänligen vänta..." +msgstr "Konfigurerar produkten, vänta..." #: src/components/questions/GenericQuestion.jsx:35 #: src/components/questions/LuksActivationQuestion.jsx:60 @@ -940,9 +916,8 @@ msgid "The following software patterns are selected for installation:" msgstr "Följande programvarumönster är valda för installation:" #: src/components/software/SoftwarePage.jsx:165 -#, fuzzy msgid "Selected patterns" -msgstr "Välj tidszon" +msgstr "Valda mönster" #: src/components/software/SoftwarePage.jsx:168 msgid "Change selection" @@ -960,18 +935,19 @@ msgstr "Val av programvara" #: src/components/software/SoftwarePatternsSelection.jsx:241 #: src/components/software/SoftwarePatternsSelection.jsx:242 msgid "Filter by pattern title or description" -msgstr "" +msgstr "Filtrera efter mönstertitel eller beskrivning" #. TRANSLATORS: %s will be replaced by the estimated installation size, #. example: "728.8 MiB" #: src/components/software/UsedSize.jsx:33 -#, fuzzy, c-format +#, c-format msgid "Installation will take %s." -msgstr "Installationen kommer att ta upp %s" +msgstr "Installationen kommer att ta %s" #: src/components/software/UsedSize.jsx:38 msgid "This space includes the base system and the selected software patterns." msgstr "" +"Detta utrymme inkluderar bassystemet och de valda programvarumönsterna." #: src/components/storage/BootConfigField.jsx:43 msgid "Change boot options" @@ -994,7 +970,7 @@ msgstr "" msgid "Installation will configure partitions for booting at %s." msgstr "Installationen kommer att konfigurera partitioner för uppstart på %s." -#: src/components/storage/BootSelection.jsx:127 +#: src/components/storage/BootSelection.jsx:126 msgid "" "To ensure the new system is able to boot, the installer may need to create " "or configure some partitions in the appropriate disk." @@ -1003,46 +979,45 @@ msgstr "" "installationsprogrammet behöva skapa eller konfigurera vissa partitioner på " "lämplig disk." -#: src/components/storage/BootSelection.jsx:133 +#: src/components/storage/BootSelection.jsx:132 msgid "Partitions to boot will be allocated at the installation disk." msgstr "" "Partitioner som ska startas upp kommer att tilldelas på installationsdisken." #. TRANSLATORS: %s is replaced by a device name and size (e.g., "/dev/sda, 500GiB") -#: src/components/storage/BootSelection.jsx:138 +#: src/components/storage/BootSelection.jsx:137 #, c-format msgid "Partitions to boot will be allocated at the installation disk (%s)." msgstr "" "Partitioner som ska startas upp kommer att tilldelas på installationsdisken " "(%s)." -#: src/components/storage/BootSelection.jsx:154 -#, fuzzy +#: src/components/storage/BootSelection.jsx:153 msgid "Select booting partition" -msgstr "Välj vad som ska göras med varje partition." +msgstr "Välj uppstartspartition" -#: src/components/storage/BootSelection.jsx:168 +#: src/components/storage/BootSelection.jsx:167 #: src/components/storage/iscsi/NodeStartupOptions.js:27 msgid "Automatic" msgstr "Automatisk" -#: src/components/storage/BootSelection.jsx:177 +#: src/components/storage/BootSelection.jsx:176 msgid "Select a disk" msgstr "Välj en disk" -#: src/components/storage/BootSelection.jsx:181 +#: src/components/storage/BootSelection.jsx:180 msgid "Partitions to boot will be allocated at the following device." msgstr "Partitioner för att uppstart kommer att tilldelas på följande enhet." -#: src/components/storage/BootSelection.jsx:184 +#: src/components/storage/BootSelection.jsx:183 msgid "Choose a disk for placing the boot loader" msgstr "Välj en disk för att placera uppstartsladdaren" -#: src/components/storage/BootSelection.jsx:200 +#: src/components/storage/BootSelection.jsx:199 msgid "Do not configure" msgstr "Konfigurera inte" -#: src/components/storage/BootSelection.jsx:203 +#: src/components/storage/BootSelection.jsx:202 msgid "" "No partitions will be automatically configured for booting. Use with caution." msgstr "" @@ -1165,9 +1140,8 @@ msgid "Remove max channel filter" msgstr "Ta bort maximum kanal filter" #: src/components/storage/DeviceSelection.jsx:101 -#, fuzzy msgid "Loading data, please wait a second..." -msgstr "Laddar tillgängliga produkter, vänligen vänta..." +msgstr "Laddar data, vänligen vänta en sekund..." #. TRANSLATORS: description for using plain partitions for installing the #. system, the text in the square brackets [] is displayed in bold, use only @@ -1194,24 +1168,20 @@ msgstr "" "som nya partitioner på de valda enheterna." #: src/components/storage/DeviceSelection.jsx:149 -#, fuzzy msgid "Select installation device" -msgstr "på installationsenheten" +msgstr "Välj installationsenhet" #: src/components/storage/DeviceSelection.jsx:155 -#, fuzzy msgid "Install new system on" -msgstr "Installationsalternativ" +msgstr "Installera nytt system på" #: src/components/storage/DeviceSelection.jsx:158 -#, fuzzy msgid "An existing disk" -msgstr "Krymp existerande partitioner" +msgstr "En existerande disk" #: src/components/storage/DeviceSelection.jsx:167 -#, fuzzy msgid "A new LVM Volume Group" -msgstr "ny LVM volymgrupp" +msgstr "En ny LVM volymgrupp" #: src/components/storage/DeviceSelection.jsx:192 msgid "Device selector for target disk" @@ -1226,7 +1196,6 @@ msgid "Prepare more devices by configuring advanced" msgstr "Förbered fler enheter genom att använda avancerad konfiguration" #: src/components/storage/DeviceSelection.jsx:229 -#, fuzzy msgid "storage techs" msgstr "lagringsteknologier" @@ -1305,7 +1274,7 @@ msgstr "Detaljer" #: src/components/storage/PartitionsField.jsx:451 #: src/components/storage/ProposalResultTable.jsx:123 #: src/components/storage/SpaceActionsTable.jsx:143 -#: src/components/storage/VolumeFields.jsx:472 +#: src/components/storage/VolumeFields.jsx:474 #: src/components/storage/VolumeLocationSelectorTable.jsx:103 msgid "Size" msgstr "Storlek" @@ -1337,13 +1306,12 @@ msgid "Encryption" msgstr "Kryptering" #: src/components/storage/EncryptionField.jsx:39 -#, fuzzy msgid "" "Protection for the information stored at the device, including data, " "programs, and system files." msgstr "" -"Heldiskkryptering (FDE) gör det möjligt att skydda informationen som lagras " -"på enheten, inklusive data, program och systemfiler." +"Skydd för informationen som lagras på enheten, inklusive data, program och " +"systemfiler." #: src/components/storage/EncryptionField.jsx:42 msgid "disabled" @@ -1358,13 +1326,12 @@ msgid "using TPM unlocking" msgstr "med hjälp av TPM-upplåsning" #: src/components/storage/EncryptionField.jsx:58 -#, fuzzy msgid "Enable" -msgstr "aktiverad" +msgstr "Aktivera" #: src/components/storage/EncryptionField.jsx:58 msgid "Modify" -msgstr "" +msgstr "Modifera" #: src/components/storage/EncryptionSettingsDialog.jsx:37 msgid "" @@ -1405,26 +1372,24 @@ msgstr "Installationsenhet" #. TRANSLATORS: The storage "Installation device" field's description. #: src/components/storage/InstallationDeviceField.jsx:42 -#, fuzzy msgid "Main disk or LVM Volume Group for installation." -msgstr "Välj huvuddisk eller LVM volymgrupp för installation." +msgstr "Huvuddisk eller LVM volymgrupp för installation." #. TRANSLATORS: %s is the installation disk (eg. "/dev/sda, 80 GiB) #: src/components/storage/InstallationDeviceField.jsx:56 -#, fuzzy, c-format +#, c-format msgid "File systems created as new partitions at %s" -msgstr "Skapa en ny partition" +msgstr "Filsystem skapade som nya partitioner på %s" #: src/components/storage/InstallationDeviceField.jsx:59 -#, fuzzy msgid "File systems created at a new LVM volume group" -msgstr "Enhetsväljare för ny LVM volymgrupp" +msgstr "Filsystem skapade som en ny LVM-volymgrupp" #. TRANSLATORS: %s is the disk used for the LVM physical volumes (eg. "/dev/sda, 80 GiB) #: src/components/storage/InstallationDeviceField.jsx:63 -#, fuzzy, c-format +#, c-format msgid "File systems created at a new LVM volume group on %s" -msgstr "ny LVM volymgrupp på %s" +msgstr "Filsystem skapade som en ny LVM-volymgrupp på %s" #. TRANSLATORS: minimum device size, %s is replaced by size string, e.g. "17.5 GiB" #: src/components/storage/PartitionsField.jsx:73 @@ -1617,9 +1582,9 @@ msgid "Delete" msgstr "Ta bort" #: src/components/storage/PartitionsField.jsx:449 -#: src/components/storage/VolumeFields.jsx:59 -#: src/components/storage/VolumeFields.jsx:68 -#: src/components/storage/VolumeFields.jsx:73 +#: src/components/storage/VolumeFields.jsx:61 +#: src/components/storage/VolumeFields.jsx:70 +#: src/components/storage/VolumeFields.jsx:75 msgid "Mount point" msgstr "Monteringspunkt" @@ -1651,18 +1616,16 @@ msgid "Partitions and file systems" msgstr "Partitioner och filsystem" #: src/components/storage/PartitionsField.jsx:802 -#, fuzzy msgid "" "Structure of the new system, including any additional partition needed for " "booting" msgstr "" "Strukturen för det nya systemet, inklusive eventuell ytterligare partition " -"som behövs för uppstart," +"som behövs för uppstart" #: src/components/storage/PartitionsField.jsx:808 -#, fuzzy msgid "Show partitions and file-systems actions" -msgstr "Partitioner och filsystem" +msgstr "Visa partitioner och filsystemåtgärder" #. TRANSLATORS: show/hide toggle action, this is a clickable link #: src/components/storage/ProposalActionsDialog.jsx:62 @@ -1692,11 +1655,11 @@ msgid "Affecting" msgstr "Påverkar" #: src/components/storage/ProposalResultSection.jsx:96 -#, fuzzy, c-format +#, c-format msgid "Check the planned action" msgid_plural "Check the %d planned actions" -msgstr[0] "Kontrollera alla planerade åtgärder" -msgstr[1] "Kontrollera alla planerade åtgärder" +msgstr[0] "Kontrollera den planerade åtgärden" +msgstr[1] "Kontrollera de %d planerade åtgärderna" #: src/components/storage/ProposalResultSection.jsx:111 msgid "Waiting for information about storage configuration" @@ -1704,16 +1667,15 @@ msgstr "Väntar på information om lagringskonfiguration" #: src/components/storage/ProposalResultSection.jsx:124 msgid "Storage proposal not possible" -msgstr "" +msgstr "Lagringsförslag är inte möjligt" #: src/components/storage/ProposalResultSection.jsx:188 -#, fuzzy msgid "" "During installation, some actions will be performed to configure the system " "as displayed below." msgstr "" -"Under installationen kommer %d åtgärd att utföras för att konfigurera " -"systemet som visas nedan" +"Under installationen kommer vissa åtgärder att utföras för att konfigurera " +"systemet som visas nedan." #: src/components/storage/ProposalResultSection.jsx:196 msgid "Planned Actions" @@ -1738,11 +1700,11 @@ msgstr "Före %s" msgid "Mount Point" msgstr "Monteringspunkt" -#: src/components/storage/ProposalTransactionalInfo.jsx:46 +#: src/components/storage/ProposalTransactionalInfo.jsx:45 msgid "Transactional root file system" msgstr "Transaktionellt root filsystem" -#: src/components/storage/ProposalTransactionalInfo.jsx:49 +#: src/components/storage/ProposalTransactionalInfo.jsx:48 #, c-format msgid "" "%s is an immutable system with atomic updates. It uses a read-only Btrfs " @@ -1890,75 +1852,75 @@ msgid "Do you want to add it?" msgstr "Vill du lägga till det?" #. TRANSLATORS: info about possible file system types. -#: src/components/storage/VolumeFields.jsx:215 +#: src/components/storage/VolumeFields.jsx:217 msgid "" "The options for the file system type depends on the product and the mount " "point." msgstr "" "Alternativen för filsystemstypen beror på produkten och monteringspunkten." -#: src/components/storage/VolumeFields.jsx:221 +#: src/components/storage/VolumeFields.jsx:223 msgid "More info for file system types" msgstr "Mer information om filsystemtyper" #. TRANSLATORS: label for the file system selector. -#: src/components/storage/VolumeFields.jsx:232 +#: src/components/storage/VolumeFields.jsx:234 msgid "File system type" msgstr "Filsystem typ" #. TRANSLATORS: item which affects the final computed partition size -#: src/components/storage/VolumeFields.jsx:263 +#: src/components/storage/VolumeFields.jsx:265 msgid "the configuration of snapshots" msgstr "konfigurationen av ögonblicksavbilder" #. TRANSLATORS: item which affects the final computed partition size #. %s is replaced by a list of mount points like "/home, /boot" -#: src/components/storage/VolumeFields.jsx:268 +#: src/components/storage/VolumeFields.jsx:270 #, c-format msgid "the presence of the file system for %s" msgstr "närvaron av filsystemet för %s" #. TRANSLATORS: conjunction for merging two list items -#: src/components/storage/VolumeFields.jsx:270 +#: src/components/storage/VolumeFields.jsx:272 msgid ", " msgstr ", " #. TRANSLATORS: item which affects the final computed partition size -#: src/components/storage/VolumeFields.jsx:274 +#: src/components/storage/VolumeFields.jsx:276 msgid "the amount of RAM in the system" msgstr "mängden RAM i systemet" #. TRANSLATORS: the %s is replaced by the items which affect the computed size -#: src/components/storage/VolumeFields.jsx:277 +#: src/components/storage/VolumeFields.jsx:279 #, c-format msgid "The final size depends on %s." msgstr "Den slutliga storleken beror på %s." #. TRANSLATORS: conjunction for merging two texts -#: src/components/storage/VolumeFields.jsx:279 +#: src/components/storage/VolumeFields.jsx:281 msgid " and " msgstr " och " #. TRANSLATORS: the partition size is automatically computed -#: src/components/storage/VolumeFields.jsx:284 +#: src/components/storage/VolumeFields.jsx:286 msgid "Automatically calculated size according to the selected product." msgstr "Automatiskt beräknad storlek enligt vald produkt." -#: src/components/storage/VolumeFields.jsx:303 +#: src/components/storage/VolumeFields.jsx:305 msgid "Exact size for the file system." msgstr "Exakt storlek för filsystemet." #. TRANSLATORS: requested partition size -#: src/components/storage/VolumeFields.jsx:316 +#: src/components/storage/VolumeFields.jsx:318 msgid "Exact size" msgstr "Exakt storlek" #. TRANSLATORS: units selector (like KiB, MiB, GiB...) -#: src/components/storage/VolumeFields.jsx:333 +#: src/components/storage/VolumeFields.jsx:335 msgid "Size unit" msgstr "Storleksenhet" -#: src/components/storage/VolumeFields.jsx:361 +#: src/components/storage/VolumeFields.jsx:363 msgid "" "Limits for the file system size. The final size will be a value between the " "given minimum and maximum. If no maximum is given then the file system will " @@ -1969,45 +1931,45 @@ msgstr "" "filsystemet att vara så stort som möjligt." #. TRANSLATORS: the minimal partition size -#: src/components/storage/VolumeFields.jsx:368 +#: src/components/storage/VolumeFields.jsx:370 msgid "Minimum" msgstr "Minst" #. TRANSLATORS: the minium partition size -#: src/components/storage/VolumeFields.jsx:379 +#: src/components/storage/VolumeFields.jsx:381 msgid "Minimum desired size" msgstr "Minsta önskade storlek" -#: src/components/storage/VolumeFields.jsx:390 +#: src/components/storage/VolumeFields.jsx:392 msgid "Unit for the minimum size" msgstr "Enhet för minsta storlek" #. TRANSLATORS: the maximum partition size -#: src/components/storage/VolumeFields.jsx:402 +#: src/components/storage/VolumeFields.jsx:404 msgid "Maximum" msgstr "Maximal" #. TRANSLATORS: the maximum partition size -#: src/components/storage/VolumeFields.jsx:414 +#: src/components/storage/VolumeFields.jsx:416 msgid "Maximum desired size" msgstr "Maximal önskad storlek" -#: src/components/storage/VolumeFields.jsx:424 +#: src/components/storage/VolumeFields.jsx:426 msgid "Unit for the maximum size" msgstr "Enhet för maximal storlek" #. TRANSLATORS: radio button label, fully automatically computed partition size, no user input -#: src/components/storage/VolumeFields.jsx:442 +#: src/components/storage/VolumeFields.jsx:444 msgid "Auto" msgstr "Auto" #. TRANSLATORS: radio button label, exact partition size requested by user -#: src/components/storage/VolumeFields.jsx:444 +#: src/components/storage/VolumeFields.jsx:446 msgid "Fixed" msgstr "Fast" #. TRANSLATORS: radio button label, automatically computed partition size within the user provided min and max limits -#: src/components/storage/VolumeFields.jsx:446 +#: src/components/storage/VolumeFields.jsx:448 msgid "Range" msgstr "Räckvidd" @@ -2351,7 +2313,7 @@ msgstr "Mål" #: src/components/storage/routes.js:36 msgid "Proposal" -msgstr "" +msgstr "Förslag" #: src/components/storage/utils.js:64 msgid "KiB" @@ -2386,9 +2348,8 @@ msgstr "" #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space deleting current content". Keep it short #: src/components/storage/utils.js:82 -#, fuzzy msgid "deleting current content" -msgstr "Radera nuvarande innehåll" +msgstr "raderar nuvarande innehåll" #: src/components/storage/utils.js:87 msgid "Shrink existing partitions" @@ -2403,9 +2364,8 @@ msgstr "" #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space shrinking partitions". Keep it short. #: src/components/storage/utils.js:92 -#, fuzzy msgid "shrinking partitions" -msgstr "Krymp existerande partitioner" +msgstr "krymper partitioner" #: src/components/storage/utils.js:97 msgid "Use available space" @@ -2435,9 +2395,8 @@ msgstr "Välj vad som ska göras med varje partition." #. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence #. would read as "Find space with custom actions". Keep it short. #: src/components/storage/utils.js:112 -#, fuzzy msgid "with custom actions" -msgstr "utför en anpassad uppsättning åtgärder" +msgstr "med anpassade åtgärder" #: src/components/users/FirstUser.jsx:35 msgid "No user defined yet." @@ -2483,23 +2442,20 @@ msgid "Use suggested username" msgstr "Använd föreslaget användarnamn" #: src/components/users/FirstUserForm.jsx:140 -#, fuzzy msgid "All fields are required" -msgstr "Ett storleksvärde krävs" +msgstr "Alla fält krävs" #: src/components/users/FirstUserForm.jsx:147 msgid "Please, try again." -msgstr "" +msgstr "Vänligen försök igen." #: src/components/users/FirstUserForm.jsx:197 -#, fuzzy msgid "Create user" -msgstr "Skapa anändarkonto" +msgstr "Skapa användare" #: src/components/users/FirstUserForm.jsx:197 -#, fuzzy msgid "Edit user" -msgstr "Redigera %s" +msgstr "Redigera användare" #: src/components/users/FirstUserForm.jsx:214 #: src/components/users/FirstUserForm.jsx:216 @@ -2608,21 +2564,19 @@ msgstr "Rensa" #: src/components/users/UsersPage.jsx:45 msgid "First user" -msgstr "" +msgstr "Första användare" #: src/components/users/UsersPage.jsx:52 msgid "Root authentication" msgstr "Rootautentisering" #: src/components/users/routes.js:41 -#, fuzzy msgid "Create or edit the first user" -msgstr "Kan inte läsa fil" +msgstr "Skapa eller redigera den första användaren" #: src/components/users/routes.js:48 -#, fuzzy msgid "Edit first user" -msgstr "Redigera filsystem" +msgstr "Redigera första användare" #~ msgid "" #~ "There are some reported issues. Please review them in the previous steps " diff --git a/web/po/tr.po b/web/po/tr.po index b458bb0972..800b777ef1 100644 --- a/web/po/tr.po +++ b/web/po/tr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-16 02:26+0000\n" +"POT-Creation-Date: 2024-06-20 02:20+0000\n" "PO-Revision-Date: 2024-05-16 14:46+0000\n" "Last-Translator: Özgür Arslan \n" "Language-Team: Turkish \n" "Language-Team: Ukrainian \n" "Language-Team: Chinese (Simplified) * @property {boolean} finished - whether the progress already finished */ +/** + * @typedef {object} ProgressSequence + * @property {string[]} steps - sequence steps if known in advance + * @property {number} total - number of steps + * @property {number} current - current step + * @property {string} message - message of the current step + * @property {boolean} finished - whether the progress already finished + */ + /** * @callback ProgressHandler * @param {Progress} progress - progress status @@ -195,7 +204,7 @@ const WithProgress = (superclass, progress_path, service_name) => /** * Returns the service progress * - * @return {Promise} an object containing the total steps, + * @return {Promise} an object containing the total steps, * the current step and whether the service finished or not. */ async getProgress() { @@ -203,17 +212,20 @@ const WithProgress = (superclass, progress_path, service_name) => if (!response.ok) { console.log("get progress failed with:", response); return { + steps: [], total: 0, current: 0, message: "Failed to get progress", finished: false, }; } else { - const { current_step, max_steps, current_title, finished } = await response.json(); + const { steps, currentStep, maxSteps, currentTitle, finished } = + await response.json(); return { - total: max_steps, - current: current_step, - message: current_title, + steps, + total: maxSteps, + current: currentStep, + message: currentTitle, finished, }; } @@ -228,11 +240,11 @@ const WithProgress = (superclass, progress_path, service_name) => onProgressChange(handler) { return this.client.onEvent("Progress", ({ service, ...progress }) => { if (service === service_name) { - const { current_step, max_steps, current_title, finished } = progress; + const { currentStep, maxSteps, currentTitle, finished } = progress; handler({ - total: max_steps, - current: current_step, - message: current_title, + total: maxSteps, + current: currentStep, + message: currentTitle, finished, }); } diff --git a/web/src/components/core/InstallationFinished.jsx b/web/src/components/core/InstallationFinished.jsx index 0c6c7e5eea..c60b2943b3 100644 --- a/web/src/components/core/InstallationFinished.jsx +++ b/web/src/components/core/InstallationFinished.jsx @@ -35,13 +35,14 @@ import { Center, Icon } from "~/components/layout"; import { EncryptionMethods } from "~/client/storage"; import { _ } from "~/i18n"; import { useInstallerClient } from "~/context/installer"; +import alignmentStyles from '@patternfly/react-styles/css/utilities/Alignment/alignment'; const TpmHint = () => { const [isExpanded, setIsExpanded] = useState(false); const title = _("TPM sealing requires the new system to be booted directly."); return ( - {title}}> + {title}}> {_("If a local media was used to run this installer, remove it before the next boot.")} 0 && encryptionMethod === EncryptionMethods.TPM); } // TODO: display the page in a loading mode while needed data is being fetched. @@ -107,7 +105,7 @@ function InstallationFinished() { ? _("At this point you can power off the machine.") : _("At this point you can reboot the machine to log in to the new system.")} - {!usingTpm && } + {usingTpm && } diff --git a/web/src/components/core/InstallationFinished.test.jsx b/web/src/components/core/InstallationFinished.test.jsx index 017ffdafc3..eef9d63afc 100644 --- a/web/src/components/core/InstallationFinished.test.jsx +++ b/web/src/components/core/InstallationFinished.test.jsx @@ -34,7 +34,7 @@ const finishInstallationFn = jest.fn(); let encryptionPassword; let encryptionMethod; -describe.skip("InstallationFinished", () => { +describe("InstallationFinished", () => { beforeEach(() => { encryptionPassword = "n0tS3cr3t"; encryptionMethod = EncryptionMethods.LUKS2; @@ -72,7 +72,7 @@ describe.skip("InstallationFinished", () => { expect(finishInstallationFn).toHaveBeenCalled(); }); - describe.skip("when TPM is set as encryption method", () => { + describe("when TPM is set as encryption method", () => { beforeEach(() => { encryptionMethod = EncryptionMethods.TPM; }); @@ -90,27 +90,15 @@ describe.skip("InstallationFinished", () => { }); it("does not show the TPM reminder", async () => { - const { user } = installerRender(); - // Forcing the test to slow down a bit with a fake user interaction - // because actually the reminder will be not rendered immediately - // making the queryAllByText to produce a false positive if triggered - // too early here. - const congratsText = screen.getByText("Congratulations!"); - await user.click(congratsText); - expect(screen.queryAllByText(/TPM/)).toHaveLength(0); + installerRender(); + screen.queryAllByText(/TPM/); }); }); }); describe("when TPM is not set as encryption method", () => { it("does not show the TPM reminder", async () => { - const { user } = installerRender(); - // Forcing the test to slow down a bit with a fake user interaction - // because actually the reminder will be not rendered immediately - // making the queryAllByText to produce a false positive if triggered - // too early here. - const congratsText = screen.getByText("Congratulations!"); - await user.click(congratsText); + installerRender(); expect(screen.queryAllByText(/TPM/)).toHaveLength(0); }); }); diff --git a/web/src/components/core/InstallationProgress.jsx b/web/src/components/core/InstallationProgress.jsx index 4dcc00ce7a..5e7c083293 100644 --- a/web/src/components/core/InstallationProgress.jsx +++ b/web/src/components/core/InstallationProgress.jsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022] SUSE LLC + * Copyright (c) [2022-2024] SUSE LLC * * All Rights Reserved. * @@ -20,26 +20,24 @@ */ import React from "react"; -import { Card, CardBody, Grid, GridItem } from "@patternfly/react-core"; -import SimpleLayout from "~/SimpleLayout"; -import ProgressReport from "./ProgressReport"; -import { Center } from "~/components/layout"; +import { useProduct } from "~/context/product"; +import { sprintf } from "sprintf-js"; import { _ } from "~/i18n"; +import ProgressReport from "./ProgressReport"; +import SimpleLayout from "~/SimpleLayout"; function InstallationProgress() { + const { selectedProduct } = useProduct(); + + if (!selectedProduct) { + return; + } + + // TRANSLATORS: %s is replaced by a product name (e.g., openSUSE Tumbleweed) + const title = sprintf(_("Installing %s, please wait ..."), selectedProduct.name); return ( - -
- - - - - - - - - -
+ + ); } diff --git a/web/src/components/core/ProgressReport.jsx b/web/src/components/core/ProgressReport.jsx index f3bf05973f..7b4cd47f08 100644 --- a/web/src/components/core/ProgressReport.jsx +++ b/web/src/components/core/ProgressReport.jsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022] SUSE LLC + * Copyright (c) [2022-2024] SUSE LLC * * All Rights Reserved. * @@ -19,70 +19,125 @@ * find current contact information at www.suse.com. */ -import React, { useState, useEffect } from "react"; -import { useCancellablePromise } from "~/utils"; +import React, { useEffect, useState } from "react"; +import { + Card, + CardBody, + Grid, + GridItem, + ProgressStepper, + ProgressStep, + Spinner, + Stack, +} from "@patternfly/react-core"; + +import { _ } from "~/i18n"; +import { Center } from "~/components/layout"; import { useInstallerClient } from "~/context/installer"; -import { Grid, GridItem, Progress, Text } from "@patternfly/react-core"; +const Progress = ({ steps, step, firstStep, detail }) => { + const variant = (index) => { + if (index < step.current) return "success"; + if (index === step.current) return "info"; + if (index > step.current) return "pending"; + }; -const ProgressReport = () => { - const client = useInstallerClient(); - const { cancellablePromise } = useCancellablePromise(); - // progress and subprogress are basically objects containing { message, step, steps } - const [progress, setProgress] = useState({}); - const [subProgress, setSubProgress] = useState(undefined); + const stepProperties = (stepNumber) => { + const properties = { + variant: variant(stepNumber), + isCurrent: stepNumber === step.current, + id: `step-${stepNumber}-id`, + titleId: `step-${stepNumber}-title`, + }; - useEffect(() => { - cancellablePromise(client.manager.getProgress()).then(({ message, current, total }) => { - setProgress({ message, step: current, steps: total }); - }); - }, [client.manager, cancellablePromise]); + if (properties.isCurrent) { + properties.icon = ; + if (detail && detail.message !== "") { + const { message, current, total } = detail; + properties.description = `${message} (${current}/${total})`; + } + } - useEffect(() => { - return client.manager.onProgressChange(({ message, current, total, finished }) => { - if (!finished) setProgress({ message, step: current, steps: total }); - }); - }, [client.manager]); + return properties; + }; + + return ( + + {firstStep && ( + + {firstStep} + + )} + {steps.map((description, idx) => { + return ( + + {description} + + ); + })} + + ); +}; + +/** + * @component + * + * Shows progress steps when a product is selected. + */ +function ProgressReport({ title, firstStep }) { + const { manager, storage, software } = useInstallerClient(); + const [steps, setSteps] = useState(); + const [step, setStep] = useState(); + const [detail, setDetail] = useState(); + + useEffect(() => software.onProgressChange(setDetail), [software, setDetail]); + useEffect(() => storage.onProgressChange(setDetail), [storage, setDetail]); useEffect(() => { - return client.software.onProgressChange(({ message, current, total, finished }) => { - if (finished) { - setSubProgress(undefined); - } else { - setSubProgress({ message, step: current, steps: total }); - } + manager.getProgress().then((progress) => { + setSteps(progress.steps); + setStep(progress); }); - }, [client.software]); - if (!progress.steps) return Waiting for progress status...; + return manager.onProgressChange(setStep); + }, [manager, setSteps]); - return ( - - - + const Content = () => { + if (!steps) { + return; + } + + return ( + + ); + }; - - - + const progressTitle = !steps ? _("Waiting for progress status...") : title; + return ( +
+ + + + + +

+ {progressTitle} +

+ +
+
+
+
+
+
); -}; +} export default ProgressReport; diff --git a/web/src/components/core/ProgressReport.test.jsx b/web/src/components/core/ProgressReport.test.jsx index c22565c604..d0fc0ed374 100644 --- a/web/src/components/core/ProgressReport.test.jsx +++ b/web/src/components/core/ProgressReport.test.jsx @@ -32,91 +32,83 @@ jest.mock("~/client"); let callbacks; let onManagerProgressChange = jest.fn(); let onSoftwareProgressChange = jest.fn(); +let onStorageProgressChange = jest.fn(); beforeEach(() => { createClient.mockImplementation(() => { return { manager: { onProgressChange: onManagerProgressChange, - getProgress: jest.fn().mockResolvedValue( - { message: "Reading repositories", current: 1, total: 10 } - ) + getProgress: jest.fn().mockResolvedValue({ + message: "Partition disks", + current: 1, + total: 10, + steps: ["Partition disks", "Install software"], + }), }, software: { - onProgressChange: onSoftwareProgressChange - } + onProgressChange: onSoftwareProgressChange, + }, + storage: { + onProgressChange: onStorageProgressChange, + }, }; }); }); describe("ProgressReport", () => { - describe("when there is not progress information available", () => { - it.skip("renders a waiting message", () => { - installerRender(); - - expect(screen.findByText(/Waiting for/i)).toBeInTheDocument(); - }); - }); - describe("when there is progress information available", () => { beforeEach(() => { const [onManagerProgress, managerCallbacks] = createCallbackMock(); const [onSoftwareProgress, softwareCallbacks] = createCallbackMock(); + const [onStorageProgress, storageCallbacks] = createCallbackMock(); onManagerProgressChange = onManagerProgress; onSoftwareProgressChange = onSoftwareProgress; - callbacks = { manager: managerCallbacks, software: softwareCallbacks }; + onStorageProgressChange = onStorageProgress; + callbacks = { + manager: managerCallbacks, + software: softwareCallbacks, + storage: storageCallbacks, + }; }); - it("shows the main progress bar", async () => { + it("shows the progress including the details from the storage service", async () => { installerRender(); await screen.findByText(/Waiting/i); - await screen.findByText(/Reading/i); + await screen.findByText(/Partition disks/i); + await screen.findByText(/Install software/i); - // NOTE: there can be more than one subscriptions to the - // manager#onProgressChange. We're interested in the latest one here. - const cb = callbacks.manager[callbacks.manager.length - 1]; + const cb = callbacks.storage[callbacks.storage.length - 1]; act(() => { - cb({ message: "Partitioning", current: 1, total: 10 }); + cb({ + message: "Doing some partitioning", + current: 1, + total: 10, + finished: false, + }); }); - await screen.findByLabelText("Partitioning"); + await screen.findByText("Doing some partitioning (1/10)"); }); - it("does not show secondary progress bar", async () => { + it("shows the progress including the details from the software service", async () => { installerRender(); await screen.findByText(/Waiting/i); + await screen.findByText(/Install software/i); - const cb = callbacks.manager[callbacks.manager.length - 1]; + const cb = callbacks.software[callbacks.software.length - 1]; act(() => { - cb({ message: "Partitioning", current: 1, total: 10 }); - }); - - await screen.findAllByRole("progressbar", { hidden: true }); - }); - - describe("when there is progress information from the software service", () => { - it("shows the secondary progress bar", async () => { - installerRender(); - - await screen.findByText(/Waiting/i); - - // NOTE: there can be more than one subscriptions to the - // manager#onChange. We're interested in the latest one here. - const cb0 = callbacks.manager[callbacks.manager.length - 1]; - act(() => { - cb0({ message: "Installing software", current: 4, total: 10 }); + cb({ + message: "Installing packages", + current: 495, + total: 500, + finished: false, }); - - const cb1 = callbacks.software[callbacks.software.length - 1]; - act(() => { - cb1({ message: "Installing YaST2", current: 256, total: 500, finished: false }); - }); - - const bars = screen.queryAllByRole("progressbar", { hidden: false }); - expect(bars.length).toEqual(2); }); + + await screen.findByText("Installing packages (495/500)"); }); }); }); diff --git a/web/src/components/core/Reminder.jsx b/web/src/components/core/Reminder.jsx deleted file mode 100644 index cd4e0943ad..0000000000 --- a/web/src/components/core/Reminder.jsx +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -// @ts-check - -import React from "react"; -import { Icon } from "~/components/layout"; - -/** - * Internal component for rendering the icon - * - * @param {object} props - * @params {string} [props.name] - The icon name. - */ -const ReminderIcon = ({ name }) => { - if (!name?.length) return; - - return ( -
- -
- ); -}; - -/** - * Internal component for rendering the title - * - * @param {object} props - * @params {JSX.Element|string} [props.children] - The title content. - */ -const ReminderTitle = ({ children }) => { - if (!children) return; - if (typeof children === "string" && !children.length) return; - - return ( -

{children}

- ); -}; - -/** - * Renders a reminder with given role, status by default - * @component - * - * @param {object} props - * @param {string} [props.icon] - The name of desired icon. - * @param {JSX.Element|string} [props.title] - The content for the title. - * @param {string} [props.role="status"] - The reminder's role, "status" by default. - * @param {("subtle")} [props.variant] - The reminder's variant, none by default. - * default. See {@link https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/status_role} - * @param {JSX.Element} [props.children] - The content for the description. - */ -export default function Reminder ({ - icon, - title, - role = "status", - variant, - children -}) { - return ( -
- -
- {title} - { children } -
-
- ); -} diff --git a/web/src/components/core/Reminder.test.jsx b/web/src/components/core/Reminder.test.jsx deleted file mode 100644 index 41ebfaf300..0000000000 --- a/web/src/components/core/Reminder.test.jsx +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) [2023] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { screen, within } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import { Reminder } from "~/components/core"; - -describe("Reminder", () => { - it("renders a status region by default", () => { - plainRender(Example); - const reminder = screen.getByRole("status"); - within(reminder).getByText("Example"); - }); - - it("renders a region with given role", () => { - plainRender(Example); - const reminder = screen.getByRole("alert"); - within(reminder).getByText("Example"); - }); - - it("renders a region with given data-variant, if any", () => { - plainRender(Example); - const reminder = screen.getByRole("alert"); - expect(reminder).toHaveAttribute("data-variant", "subtle"); - }); - - it("renders given title", () => { - plainRender( - Kindly reminder}> - Visit the settings section - - ); - screen.getByRole("heading", { name: "Kindly reminder", level: 4 }); - }); - - it("does not render a heading if title is not given", () => { - plainRender(Without title); - expect(screen.queryByRole("heading")).toBeNull(); - }); - - it("does not render a heading if title is an empty string", () => { - plainRender(Without title); - expect(screen.queryByRole("heading")).toBeNull(); - }); - - it("renders given children", () => { - plainRender( - Visit the settings section - ); - screen.getByRole("link", { name: "Visit the settings section" }); - }); -}); diff --git a/web/src/components/core/index.js b/web/src/components/core/index.js index f1e9fc2b16..f4c43161fb 100644 --- a/web/src/components/core/index.js +++ b/web/src/components/core/index.js @@ -52,7 +52,6 @@ export { default as Selector } from "./Selector"; export { default as ServerError } from "./ServerError"; export { default as ExpandableSelector } from "./ExpandableSelector"; export { default as OptionsPicker } from "./OptionsPicker"; -export { default as Reminder } from "./Reminder"; export { default as TreeTable } from "./TreeTable"; export { default as CardField } from "./CardField"; export { default as ButtonLink } from "./ButtonLink"; diff --git a/web/src/components/overview/OverviewPage.jsx b/web/src/components/overview/OverviewPage.jsx index 2011517eb1..78185b647d 100644 --- a/web/src/components/overview/OverviewPage.jsx +++ b/web/src/components/overview/OverviewPage.jsx @@ -59,12 +59,12 @@ const ReadyForInstallation = () => ( const IssuesList = ({ issues }) => { const { isEmpty, ...scopes } = issues; const list = []; - Object.entries(scopes).forEach(([scope, issues]) => { - issues.forEach((issue, idx) => { + Object.entries(scopes).forEach(([scope, issues], idx) => { + issues.forEach((issue, subIdx) => { const variant = issue.severity === "error" ? "warning" : "info"; const link = ( - + {issue.description} diff --git a/web/src/components/product/ProductSelectionProgress.jsx b/web/src/components/product/ProductSelectionProgress.jsx index ec9e40bb73..bfda9a3cc9 100644 --- a/web/src/components/product/ProductSelectionProgress.jsx +++ b/web/src/components/product/ProductSelectionProgress.jsx @@ -21,97 +21,20 @@ import React, { useEffect, useState } from "react"; import { Navigate } from "react-router-dom"; -import { - Card, CardBody, - Grid, GridItem, - ProgressStepper, ProgressStep, - Spinner, - Stack -} from "@patternfly/react-core"; - import { _ } from "~/i18n"; -import { Center } from "~/components/layout"; -import { useCancellablePromise } from "~/utils"; -import { useInstallerClient } from "~/context/installer"; import { useProduct } from "~/context/product"; +import { ProgressReport } from "~/components/core"; import { IDLE } from "~/client/status"; - -const Progress = ({ selectedProduct, storageProgress, softwareProgress }) => { - const variant = (progress) => { - if (progress.start && progress.current === 0) return "success"; - if (!progress.start) return "pending"; - if (progress.current > 0) return "info"; - }; - - const isCurrent = (progress) => progress.current > 0; - - const description = ({ message, current, total }) => { - if (!message) return ""; - - return (current === 0) ? message : `${message} (${current}/${total})`; - }; - - const stepProperties = (progress) => { - const properties = { - variant: variant(progress), - isCurrent: isCurrent(progress), - description: description(progress) - }; - - if (properties.isCurrent) properties.icon = ; - - return properties; - }; - - // Emulates progress for product selection step. - const productProgress = () => { - if (!storageProgress.start) return { start: true, current: 1 }; - - return { start: true, current: 0 }; - }; - - /** @todo Add aria-label to steps, describing its status and variant. */ - return ( - - - {selectedProduct.name} - - - {_("Analyze disks")} - - - {_("Configure software")} - - - ); -}; +import { useInstallerClient } from "~/context/installer"; /** * @component * * Shows progress steps when a product is selected. - * - * @note Some details are hardcoded (e.g., the steps, the order, etc). The progress API has to be - * improved. */ function ProductSelectionProgress() { - const { cancellablePromise } = useCancellablePromise(); - const { manager, storage, software } = useInstallerClient(); const { selectedProduct } = useProduct(); - const [storageProgress, setStorageProgress] = useState({}); - const [softwareProgress, setSoftwareProgress] = useState({}); + const { manager } = useInstallerClient(); const [status, setStatus] = useState(); useEffect(() => { @@ -119,54 +42,17 @@ function ProductSelectionProgress() { return manager.onStatusChange(setStatus); }, [manager, setStatus]); - useEffect(() => { - const updateProgress = (progress) => { - if (progress.current > 0) progress.start = true; - setStorageProgress(p => ({ ...p, ...progress })); - }; - - cancellablePromise(storage.getProgress()).then(updateProgress); - - return storage.onProgressChange(updateProgress); - }, [cancellablePromise, setStorageProgress, storage]); - - useEffect(() => { - const updateProgress = (progress) => { - if (progress.current > 0) progress.start = true; - setSoftwareProgress(p => ({ ...p, ...progress })); - // Let's assume storage was started too. - setStorageProgress(p => ({ ...p, start: progress.start })); - }; - - cancellablePromise(software.getProgress()).then(updateProgress); - - return software.onProgressChange(updateProgress); - }, [cancellablePromise, setSoftwareProgress, software]); + if (!selectedProduct) { + return; + } if (status === IDLE) return ; return ( -
- - - - - -

- {_("Configuring the product, please wait ...")} -

- { status && - } -
-
-
-
-
-
+ ); } diff --git a/web/src/components/storage/BootSelection.jsx b/web/src/components/storage/BootSelection.jsx index db1b84c295..680c1767cf 100644 --- a/web/src/components/storage/BootSelection.jsx +++ b/web/src/components/storage/BootSelection.jsx @@ -39,6 +39,8 @@ import { useCancellablePromise } from "~/utils"; import { useInstallerClient } from "~/context/installer"; import textStyles from '@patternfly/react-styles/css/utilities/Text/text'; +// FIXME: improve and rename to BootSelectionDialog + /** * @typedef {import ("~/client/storage").StorageDevice} StorageDevice */ @@ -46,7 +48,6 @@ import textStyles from '@patternfly/react-styles/css/utilities/Text/text'; const BOOT_AUTO_ID = "boot-auto"; const BOOT_MANUAL_ID = "boot-manual"; const BOOT_DISABLED_ID = "boot-disabled"; -const OPTIONS_NAME = "boot-mode"; /** * Allows the user to select the boot configuration. @@ -76,8 +77,6 @@ export default function BootSelectionDialog() { const availableDevices = await loadAvailableDevices(); const { bootDevice, configureBoot, defaultBootDevice } = settings; - console.log(settings); - if (!configureBoot) { selectedOption = BOOT_DISABLED_ID; } else if (configureBoot && bootDevice === "") { @@ -86,11 +85,13 @@ export default function BootSelectionDialog() { selectedOption = BOOT_MANUAL_ID; } + const findDevice = (name) => availableDevices.find(d => d.name === name); + setState({ load: true, - bootDevice: availableDevices.find(d => d.name === bootDevice), + bootDevice: findDevice(bootDevice) || findDevice(defaultBootDevice) || availableDevices[0], configureBoot, - defaultBootDevice, + defaultBootDevice: findDevice(defaultBootDevice), availableDevices, selectedOption }); @@ -113,8 +114,6 @@ export default function BootSelectionDialog() { bootDevice: state.selectedOption === BOOT_MANUAL_ID ? state.bootDevice.name : undefined, }; - console.log("newSettings", newSettings); - await client.proposal.calculate({ ...settings, ...newSettings }); navigate(".."); }; diff --git a/web/src/components/storage/BootSelectionDialog.test.jsx b/web/src/components/storage/BootSelection.test.jsx similarity index 87% rename from web/src/components/storage/BootSelectionDialog.test.jsx rename to web/src/components/storage/BootSelection.test.jsx index 472da2cb26..19d1688f61 100644 --- a/web/src/components/storage/BootSelectionDialog.test.jsx +++ b/web/src/components/storage/BootSelection.test.jsx @@ -24,10 +24,9 @@ import React from "react"; import { screen, within } from "@testing-library/react"; import { plainRender } from "~/test-utils"; -import { BootSelectionDialog } from "~/components/storage"; +import BootSelection from "./BootSelection"; /** - * @typedef {import("./BootSelectionDialog").BootSelectionDialogProps} BootSelectionDialogProps * @typedef {import ("~/client/storage").StorageDevice} StorageDevice */ @@ -49,7 +48,7 @@ const sda = { description: "", size: 1024, recoverableSize: 0, - systems : [], + systems: [], udevIds: ["ata-Micron_1100_SATA_512GB_12563", "scsi-0ATA_Micron_1100_SATA_512GB"], udevPaths: ["pci-0000:00-12", "pci-0000:00-12-ata"], }; @@ -72,7 +71,7 @@ const sdb = { description: "", size: 2048, recoverableSize: 0, - systems : [], + systems: [], udevIds: [], udevPaths: ["pci-0000:00-19"] }; @@ -95,15 +94,14 @@ const sdc = { description: "", size: 2048, recoverableSize: 0, - systems : [], + systems: [], udevIds: [], udevPaths: ["pci-0000:00-19"] }; -/** @type {BootSelectionDialogProps} */ let props; -describe.skip("BootSelectionDialog", () => { +describe.skip("BootSelection", () => { beforeEach(() => { props = { isOpen: true, @@ -122,18 +120,18 @@ describe.skip("BootSelectionDialog", () => { const diskSelector = () => screen.queryByRole("combobox", { name: /choose a disk/i }); it("offers an option to configure boot in the installation disk", () => { - plainRender(); + plainRender(); expect(automaticOption()).toBeInTheDocument(); }); it("offers an option to configure boot in a selected disk", () => { - plainRender(); + plainRender(); expect(selectDiskOption()).toBeInTheDocument(); expect(diskSelector()).toBeInTheDocument(); }); it("offers an option to not configure boot", () => { - plainRender(); + plainRender(); expect(notConfigureOption()).toBeInTheDocument(); }); @@ -144,7 +142,7 @@ describe.skip("BootSelectionDialog", () => { }); it("selects 'Automatic' option by default", () => { - plainRender(); + plainRender(); expect(automaticOption()).toBeChecked(); expect(selectDiskOption()).not.toBeChecked(); expect(diskSelector()).toBeDisabled(); @@ -159,7 +157,7 @@ describe.skip("BootSelectionDialog", () => { }); it("selects 'Select a disk' option by default", () => { - plainRender(); + plainRender(); expect(automaticOption()).not.toBeChecked(); expect(selectDiskOption()).toBeChecked(); expect(diskSelector()).toBeEnabled(); @@ -174,7 +172,7 @@ describe.skip("BootSelectionDialog", () => { }); it("selects 'Do not configure' option by default", () => { - plainRender(); + plainRender(); expect(automaticOption()).not.toBeChecked(); expect(selectDiskOption()).not.toBeChecked(); expect(diskSelector()).toBeDisabled(); @@ -183,7 +181,7 @@ describe.skip("BootSelectionDialog", () => { }); it("does not call onAccept on cancel", async () => { - const { user } = plainRender(); + const { user } = plainRender(); const cancel = screen.getByRole("button", { name: "Cancel" }); await user.click(cancel); @@ -198,7 +196,7 @@ describe.skip("BootSelectionDialog", () => { }); it("calls onAccept with the selected options on accept", async () => { - const { user } = plainRender(); + const { user } = plainRender(); await user.click(automaticOption()); @@ -219,7 +217,7 @@ describe.skip("BootSelectionDialog", () => { }); it("calls onAccept with the selected options on accept", async () => { - const { user } = plainRender(); + const { user } = plainRender(); await user.click(selectDiskOption()); const selector = diskSelector(); @@ -243,7 +241,7 @@ describe.skip("BootSelectionDialog", () => { }); it("calls onAccept with the selected options on accept", async () => { - const { user } = plainRender(); + const { user } = plainRender(); await user.click(notConfigureOption()); diff --git a/web/src/components/storage/ProposalPage.jsx b/web/src/components/storage/ProposalPage.jsx index 7b9708ec1d..eff3bbcfa3 100644 --- a/web/src/components/storage/ProposalPage.jsx +++ b/web/src/components/storage/ProposalPage.jsx @@ -264,12 +264,14 @@ export default function ProposalPage() { <>

{_("Storage")}

-
+ + + {description}; + return {description}; } diff --git a/web/src/components/storage/VolumeFields.jsx b/web/src/components/storage/VolumeFields.jsx index d2e7c7913c..a74b52a7ae 100644 --- a/web/src/components/storage/VolumeFields.jsx +++ b/web/src/components/storage/VolumeFields.jsx @@ -39,6 +39,8 @@ import { _, N_ } from "~/i18n"; import { sprintf } from "sprintf-js"; import { SIZE_METHODS, SIZE_UNITS } from '~/components/storage/utils'; +const { K, ...MAX_SIZE_UNITS } = SIZE_UNITS; + /** * @typedef {import ("~/client/storage").Volume} Volume */ @@ -422,7 +424,7 @@ and maximum. If no maximum is given then the file system will be as big as possi /** @ts-expect-error: for some reason using id makes TS complain */ id="maxSizeUnit" aria-label={_("Unit for the maximum size")} - units={Object.values(SIZE_UNITS)} + units={Object.values(MAX_SIZE_UNITS)} value={formData.maxSizeUnit || formData.minSizeUnit} onChange={(_, maxSizeUnit) => onChange({ maxSizeUnit })} isDisabled={isDisabled}