diff --git a/.github/workflows/ci-rust.yml b/.github/workflows/ci-rust.yml index 41c3a6eaa3..ffc9857543 100644 --- a/.github/workflows/ci-rust.yml +++ b/.github/workflows/ci-rust.yml @@ -76,6 +76,7 @@ jobs: pam-devel python-langtable-data timezone + xkeyboard-config - name: Install Rust toolchains run: rustup toolchain install stable @@ -92,10 +93,12 @@ jobs: tool: cargo-binstall - name: Install Tarpaulin (for code coverage) - run: cargo-binstall --no-confirm cargo-tarpaulin + run: | + echo "$PWD/share/bin" >> $GITHUB_PATH + cargo-binstall --no-confirm cargo-tarpaulin - name: Run the tests - run: cargo tarpaulin --out xml + run: cargo tarpaulin --out xml -- --nocapture # send the code coverage for the Rust part to the coveralls.io - name: Coveralls GitHub Action diff --git a/.github/workflows/obs-release.yml b/.github/workflows/obs-release.yml index c31034c5fd..77d1f0049a 100644 --- a/.github/workflows/obs-release.yml +++ b/.github/workflows/obs-release.yml @@ -20,7 +20,7 @@ jobs: with: install_packages: obs-service-cargo_audit obs-service-cargo_vendor project_name: systemsmanagement:Agama:Devel - package_name: agama-cli + package_name: agama update_web: uses: ./.github/workflows/obs-staging-shared.yml diff --git a/.github/workflows/obs-service-shared.yml b/.github/workflows/obs-service-shared.yml index ab99479bc4..a7f4871fd0 100644 --- a/.github/workflows/obs-service-shared.yml +++ b/.github/workflows/obs-service-shared.yml @@ -62,7 +62,7 @@ jobs: OBS_USER: ${{ secrets.OBS_USER }} OBS_PASSWORD: ${{ secrets.OBS_PASSWORD }} - - name: Commit the rubygem-agama package to ${{ inputs.project_name }} + - name: Commit the rubygem-agama-yast package to ${{ inputs.project_name }} run: rake osc:commit working-directory: ./service env: @@ -71,7 +71,7 @@ jobs: SKIP_OSC_BUILD: 1 OBS_PROJECT: ${{ inputs.project_name }} - - name: Submit the rubygem-agama package + - name: Submit the rubygem-agama-yast package # only when a tag has been pushed if: ${{ github.ref_type == 'tag' }} # the package has been comitted in the previous step, just submit it diff --git a/.github/workflows/obs-staging-rust.yml b/.github/workflows/obs-staging-rust.yml index b83f6759f7..0e804b3c2f 100644 --- a/.github/workflows/obs-staging-rust.yml +++ b/.github/workflows/obs-staging-rust.yml @@ -17,4 +17,4 @@ jobs: with: install_packages: obs-service-cargo_audit obs-service-cargo_vendor project_name: systemsmanagement:Agama:Staging - package_name: agama-cli + package_name: agama diff --git a/.github/workflows/obs-staging-service.yml b/.github/workflows/obs-staging-service.yml index 5d3cb47bf5..342f2e38f0 100644 --- a/.github/workflows/obs-staging-service.yml +++ b/.github/workflows/obs-staging-service.yml @@ -1,4 +1,4 @@ -name: Submit rubygem-agama +name: Submit rubygem-agama-yast on: # runs on pushes targeting the default branch diff --git a/PACKAGING.md b/PACKAGING.md index 58cee4ee62..08fb248b25 100644 --- a/PACKAGING.md +++ b/PACKAGING.md @@ -23,10 +23,11 @@ The Agama packages are available in two OBS projects: You can find more details the automatic OBS synchronization in the [obs_integration.md](doc/obs_integration.md) file. -The process to build each package is slightly different depending on the technology we are using. -While the Ruby-based one (`rubygem-agama`) is built as any other YaST package, the web UI -(`cockpit-agama`) and the CLI (`agama-cli`) rely on [OBS source -services](https://openbuildservice.org/help/manuals/obs-user-guide/cha.obs.source_service.html). +The process to build each package is slightly different depending on the +technology we are using. While the Ruby-based one (`rubygem-agama-yast`) is +built as any other YaST package, Agama server (`agama`), the CLI (`agama-cli`), +and the web UI (`cockpit-agama`) rely on +[OBS source services](https://openbuildservice.org/help/manuals/obs-user-guide/cha.obs.source_service.html). ## Versioning Policy @@ -71,8 +72,8 @@ for manual update. ### Service You can check the current package in -[systemsmanagement:Agama:Staging/rubygem-agama]( -https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/rubygem-agama). +[systemsmanagement:Agama:Staging/rubygem-agama-yast]( +https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/rubygem-agama-yast). Use `rake` to update the package in OBS as you would do with any other YaST package: @@ -108,10 +109,11 @@ respect such a tag. (e.g. `2.1+42`). You can read more about the overall approach of this package in the following article: [Git work flows in the upcoming 2.7 release](https://openbuildservice.org/2016/04/08/new_git_in_27/). -### Command-line Interface +### Server and Command-line Interface -The current package is [systemsmanagement:Agama:Staging/agama-cli]( -https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/agama-cli). +The current package is [systemsmanagement:Agama:Staging/agama]( +https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/agama), +which includes `agama` and `agama-cli` as a subpackage. To manually update the package in the build service, run the following commands: diff --git a/README.md b/README.md index 970385403e..6fd9ba799c 100644 --- a/README.md +++ b/README.md @@ -18,14 +18,14 @@ **[OBS systemsmanagement:Agama:Staging](https://build.opensuse.org/project/show/systemsmanagement:Agama:Staging)** -[![Submit agama-cli](https://github.com/openSUSE/agama/actions/workflows/obs-staging-rust.yml/badge.svg)](https://github.com/openSUSE/agama/actions/workflows/obs-staging-rust.yml) +[![Submit agama](https://github.com/openSUSE/agama/actions/workflows/obs-staging-rust.yml/badge.svg)](https://github.com/openSUSE/agama/actions/workflows/obs-staging-rust.yml) [![Submit cockpit-agama](https://github.com/openSUSE/agama/actions/workflows/obs-staging-web.yml/badge.svg)](https://github.com/openSUSE/agama/actions/workflows/obs-staging-web.yml) -[![Submit rubygem-agama](https://github.com/openSUSE/agama/actions/workflows/obs-staging-service.yml/badge.svg)](https://github.com/openSUSE/agama/actions/workflows/obs-staging-service.yml) +[![Submit rubygem-agama-yast](https://github.com/openSUSE/agama/actions/workflows/obs-staging-service.yml/badge.svg)](https://github.com/openSUSE/agama/actions/workflows/obs-staging-service.yml) [![Submit cockpit-agama-playwright](https://github.com/openSUSE/agama/actions/workflows/obs-staging-playwright.yml/badge.svg)](https://github.com/openSUSE/agama/actions/workflows/obs-staging-playwright.yml) -[![OBS Staging/agama-cli](https://img.shields.io/obs/systemsmanagement:Agama:Staging/agama-cli/openSUSE_Tumbleweed/x86_64?label=Package%20agama-cli)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/agama-cli) +[![OBS Staging/agama](https://img.shields.io/obs/systemsmanagement:Agama:Staging/agama/openSUSE_Tumbleweed/x86_64?label=Package%20agama)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/agama) [![OBS Staging/cockpit-agama](https://img.shields.io/obs/systemsmanagement:Agama:Staging/cockpit-agama/openSUSE_Tumbleweed/x86_64?label=Package%20cockpit-agama)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/cockpit-agama) -[![OBS Staging/rubygem-agama](https://img.shields.io/obs/systemsmanagement:Agama:Staging/rubygem-agama/openSUSE_Tumbleweed/x86_64?label=Package%20rubygem-agama)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/rubygem-agama) +[![OBS Staging/rubygem-agama-yast](https://img.shields.io/obs/systemsmanagement:Agama:Staging/rubygem-agama-yast/openSUSE_Tumbleweed/x86_64?label=Package%20rubygem-agama-yast)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/rubygem-agama-yast) [![OBS Staging/agama-products-opensuse](https://img.shields.io/obs/systemsmanagement%3AAgama%3AStaging/agama-products-opensuse/openSUSE_Tumbleweed/x86_64?label=Package%20agama-products-opensuse)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/agama-products-opensuse) [![OBS Staging/cockpit-agama-playwright](https://img.shields.io/obs/systemsmanagement:Agama:Staging/cockpit-agama-playwright/openSUSE_Tumbleweed/x86_64?label=Package%20cockpit-agama-playwright)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/cockpit-agama-playwright) [![OBS Staging/agama-live](https://img.shields.io/obs/systemsmanagement:Agama:Staging/agama-live:openSUSE/images/x86_64?label=Live%20ISO)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Staging/agama-live) @@ -35,9 +35,9 @@ ![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/openSUSE/agama?label=Version&sort=semver) [![Release](https://github.com/openSUSE/agama/actions/workflows/obs-release.yml/badge.svg)](https://github.com/openSUSE/agama/actions/workflows/obs-release.yml) -[![OBS Devel/agama-cli](https://img.shields.io/obs/systemsmanagement:Agama:Devel/agama-cli/openSUSE_Tumbleweed/x86_64?label=Package%20agama-cli)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Devel/agama-cli) +[![OBS Devel/agama](https://img.shields.io/obs/systemsmanagement:Agama:Devel/agama/openSUSE_Tumbleweed/x86_64?label=Package%20agama)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Devel/agama) [![OBS Devel/cockpit-agama](https://img.shields.io/obs/systemsmanagement:Agama:Devel/cockpit-agama/openSUSE_Tumbleweed/x86_64?label=Package%20cockpit-agama)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Devel/cockpit-agama) -[![OBS Devel/rubygem-agama](https://img.shields.io/obs/systemsmanagement:Agama:Devel/rubygem-agama/openSUSE_Tumbleweed/x86_64?label=Package%20rubygem-agama)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Devel/rubygem-agama) +[![OBS Devel/rubygem-agama-yast](https://img.shields.io/obs/systemsmanagement:Agama:Devel/rubygem-agama-yast/openSUSE_Tumbleweed/x86_64?label=Package%20rubygem-agama-yast)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Devel/rubygem-agama-yast) [![OBS Devel/agama-live](https://img.shields.io/obs/systemsmanagement:Agama:Devel/agama-live:openSUSE/images/x86_64?label=Live%20ISO)](https://build.opensuse.org/package/show/systemsmanagement:Agama:Devel/agama-live) # Agama: A Service-based Linux Installer diff --git a/rust/Cargo.lock b/rust/Cargo.lock index d79e816f4c..8bef766f82 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -66,6 +66,7 @@ dependencies = [ "regex", "serde", "serde_json", + "serde_with", "serde_yaml", "simplelog", "systemd-journal-logger", @@ -158,6 +159,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -250,6 +266,19 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-compression" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" +dependencies = [ + "brotli", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-io" version = "1.13.0" @@ -572,6 +601,27 @@ dependencies = [ "tracing", ] +[[package]] +name = "brotli" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bumpalo" version = "3.15.0" @@ -629,6 +679,7 @@ dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", + "serde", "windows-targets 0.52.0", ] @@ -692,7 +743,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.0", "terminal_size", ] @@ -870,6 +921,41 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 2.0.48", +] + +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.48", +] + [[package]] name = "data-encoding" version = "2.5.0" @@ -883,6 +969,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -1220,13 +1307,19 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.13.2" @@ -1394,6 +1487,12 @@ dependencies = [ "cc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.5.0" @@ -1404,6 +1503,17 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + [[package]] name = "indexmap" version = "2.1.0" @@ -2526,13 +2636,43 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" +dependencies = [ + "base64 0.21.7", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.1.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "serde_yaml" version = "0.9.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" dependencies = [ - "indexmap", + "indexmap 2.1.0", "itoa", "ryu", "serde", @@ -2661,6 +2801,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strsim" version = "0.11.0" @@ -2928,7 +3074,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap", + "indexmap 2.1.0", "toml_datetime", "winnow 0.5.28", ] @@ -2939,7 +3085,7 @@ version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" dependencies = [ - "indexmap", + "indexmap 2.1.0", "serde", "serde_spanned", "toml_datetime", @@ -2968,12 +3114,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e" dependencies = [ + "async-compression", "bitflags 2.4.1", "bytes", + "futures-core", "http", "http-body", "http-body-util", "pin-project-lite", + "tokio", + "tokio-util", "tower-layer", "tower-service", "tracing", @@ -3186,7 +3336,7 @@ version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "272ebdfbc99111033031d2f10e018836056e4d2c8e2acda76450ec7974269fa7" dependencies = [ - "indexmap", + "indexmap 2.1.0", "serde", "serde_json", "utoipa-gen", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 36ab33dc58..6885b0b788 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -1,7 +1,7 @@ [workspace] members = [ "agama-cli", - "agama-dbus-server", + "agama-server", "agama-derive", "agama-lib", "agama-locale-data", diff --git a/rust/agama-dbus-server/src/web.rs b/rust/agama-dbus-server/src/web.rs deleted file mode 100644 index b3e1490f9b..0000000000 --- a/rust/agama-dbus-server/src/web.rs +++ /dev/null @@ -1,18 +0,0 @@ -//! This module implements a web-based API for Agama. It is responsible for: -//! -//! * Exposing an HTTP API to interact with Agama. -//! * Emit relevant events via websocket. -//! * Serve the code for the web user interface (not implemented yet). - -mod auth; -mod config; -mod docs; -mod http; -mod service; -mod state; -mod ws; - -pub use auth::generate_token; -pub use config::ServiceConfig; -pub use docs::ApiDoc; -pub use service::service; diff --git a/rust/agama-dbus-server/src/web/docs.rs b/rust/agama-dbus-server/src/web/docs.rs deleted file mode 100644 index a45465aa44..0000000000 --- a/rust/agama-dbus-server/src/web/docs.rs +++ /dev/null @@ -1,9 +0,0 @@ -use utoipa::OpenApi; - -#[derive(OpenApi)] -#[openapi( - info(description = "Agama web API description"), - paths(super::http::ping), - components(schemas(super::http::PingResponse)) -)] -pub struct ApiDoc; diff --git a/rust/agama-dbus-server/src/web/service.rs b/rust/agama-dbus-server/src/web/service.rs deleted file mode 100644 index 2c30d24212..0000000000 --- a/rust/agama-dbus-server/src/web/service.rs +++ /dev/null @@ -1,25 +0,0 @@ -use super::{auth::TokenClaims, config::ServiceConfig, state::ServiceState}; -use axum::{ - middleware, - routing::{get, post}, - Router, -}; -use tower_http::trace::TraceLayer; - -/// Returns a service that implements the web-based Agama API. -pub fn service(config: ServiceConfig, dbus_connection: zbus::Connection) -> Router { - let state = ServiceState { - config, - dbus_connection, - }; - Router::new() - .route("/protected", get(super::http::protected)) - .route("/ws", get(super::ws::ws_handler)) - .route_layer(middleware::from_extractor_with_state::( - state.clone(), - )) - .route("/ping", get(super::http::ping)) - .route("/authenticate", post(super::http::authenticate)) - .layer(TraceLayer::new_for_http()) - .with_state(state) -} diff --git a/rust/agama-dbus-server/src/web/state.rs b/rust/agama-dbus-server/src/web/state.rs deleted file mode 100644 index 49e16c4e22..0000000000 --- a/rust/agama-dbus-server/src/web/state.rs +++ /dev/null @@ -1,12 +0,0 @@ -//! Implements the web service state. - -use super::config::ServiceConfig; - -/// Web service state. -/// -/// It holds the service configuration and the current D-Bus connection. -#[derive(Clone)] -pub struct ServiceState { - pub config: ServiceConfig, - pub dbus_connection: zbus::Connection, -} diff --git a/rust/agama-dbus-server/src/web/ws.rs b/rust/agama-dbus-server/src/web/ws.rs deleted file mode 100644 index 3cfd9061c1..0000000000 --- a/rust/agama-dbus-server/src/web/ws.rs +++ /dev/null @@ -1,56 +0,0 @@ -//! Implements the websocket handling. - -use super::state::ServiceState; -use agama_lib::progress::{Progress, ProgressMonitor, ProgressPresenter}; -use async_trait::async_trait; -use axum::{ - extract::{ - ws::{Message, WebSocket}, - State, WebSocketUpgrade, - }, - response::IntoResponse, -}; - -pub async fn ws_handler( - State(state): State, - ws: WebSocketUpgrade, -) -> impl IntoResponse { - ws.on_upgrade(move |socket| handle_socket(socket, state.dbus_connection)) -} - -async fn handle_socket(socket: WebSocket, connection: zbus::Connection) { - let presenter = WebSocketProgressPresenter::new(socket); - let mut monitor = ProgressMonitor::new(connection).await.unwrap(); - _ = monitor.run(presenter).await; -} - -/// Experimental ProgressPresenter to emit progress events over a WebSocket. -struct WebSocketProgressPresenter(WebSocket); - -impl WebSocketProgressPresenter { - pub fn new(socket: WebSocket) -> Self { - Self(socket) - } - - pub async fn report_progress(&mut self, progress: &Progress) { - let payload = serde_json::to_string(&progress).unwrap(); - _ = self.0.send(Message::Text(payload)).await; - } -} - -#[async_trait] -impl ProgressPresenter for WebSocketProgressPresenter { - async fn start(&mut self, progress: &Progress) { - self.report_progress(progress).await; - } - - async fn update_main(&mut self, progress: &Progress) { - self.report_progress(progress).await; - } - - async fn update_detail(&mut self, progress: &Progress) { - self.report_progress(progress).await; - } - - async fn finish(&mut self) {} -} diff --git a/rust/agama-lib/src/progress.rs b/rust/agama-lib/src/progress.rs index 0e3b1a7237..b79db61195 100644 --- a/rust/agama-lib/src/progress.rs +++ b/rust/agama-lib/src/progress.rs @@ -53,7 +53,7 @@ use tokio_stream::{StreamExt, StreamMap}; use zbus::Connection; /// Represents the progress for an Agama service. -#[derive(Default, Debug, Serialize)] +#[derive(Clone, Default, Debug, Serialize)] pub struct Progress { /// Current step pub current_step: u32, @@ -112,22 +112,21 @@ impl<'a> ProgressMonitor<'a> { /// Runs the monitor until the current operation finishes. pub async fn run(&mut self, mut presenter: impl ProgressPresenter) -> Result<(), ServiceError> { - presenter.start(&self.main_progress().await).await; + presenter.start(&self.main_progress().await?).await; let mut changes = self.build_stream().await; while let Some(stream) = changes.next().await { match stream { ("/org/opensuse/Agama/Manager1", _) => { - let progress = self.main_progress().await; + let progress = self.main_progress().await?; if progress.finished { presenter.finish().await; return Ok(()); - } else { - presenter.update_main(&progress).await; } + presenter.update_main(&progress).await; } ("/org/opensuse/Agama/Software1", _) => { - let progress = &self.detail_progress().await; + let progress = &self.detail_progress().await?; presenter.update_detail(progress).await; } _ => eprintln!("Unknown"), @@ -138,13 +137,13 @@ impl<'a> ProgressMonitor<'a> { } /// Proxy that reports the progress. - async fn main_progress(&self) -> Progress { - Progress::from_proxy(&self.manager_proxy).await.unwrap() + async fn main_progress(&self) -> Result { + Ok(Progress::from_proxy(&self.manager_proxy).await?) } /// Proxy that reports the progress detail. - async fn detail_progress(&self) -> Progress { - Progress::from_proxy(&self.software_proxy).await.unwrap() + async fn detail_progress(&self) -> Result { + Ok(Progress::from_proxy(&self.software_proxy).await?) } /// Builds an stream of progress changes. diff --git a/rust/agama-locale-data/src/lib.rs b/rust/agama-locale-data/src/lib.rs index 71d6c1654c..fad38cbe70 100644 --- a/rust/agama-locale-data/src/lib.rs +++ b/rust/agama-locale-data/src/lib.rs @@ -19,7 +19,7 @@ pub mod timezone_part; use keyboard::xkeyboard; -pub use locale::{InvalidLocaleCode, KeymapId, LocaleCode}; +pub use locale::{InvalidKeymap, InvalidLocaleCode, KeymapId, LocaleCode}; fn file_reader(file_path: &str) -> anyhow::Result { let file = File::open(file_path) @@ -51,8 +51,7 @@ pub fn get_xkeyboards() -> anyhow::Result { /// assert!(key_maps.contains(&us)); /// ``` pub fn get_localectl_keymaps() -> anyhow::Result> { - const BINARY: &str = "/usr/bin/localectl"; - let output = Command::new(BINARY) + let output = Command::new("localectl") .arg("list-keymaps") .output() .context("failed to execute localectl list-maps")? diff --git a/rust/agama-locale-data/src/locale.rs b/rust/agama-locale-data/src/locale.rs index 43fa6ce5f7..f46f5501fd 100644 --- a/rust/agama-locale-data/src/locale.rs +++ b/rust/agama-locale-data/src/locale.rs @@ -1,11 +1,12 @@ //! Defines useful types to deal with localization values use regex::Regex; +use serde::Serialize; use std::sync::OnceLock; use std::{fmt::Display, str::FromStr}; use thiserror::Error; -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, Serialize)] pub struct LocaleCode { // ISO-639 pub language: String, @@ -79,7 +80,7 @@ static KEYMAP_ID_REGEX: OnceLock = OnceLock::new(); /// let id_with_dashes: KeymapId = "es-ast".parse().unwrap(); /// assert_eq!(id, id_with_dashes); /// ``` -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, Serialize)] pub struct KeymapId { pub layout: String, pub variant: Option, diff --git a/rust/agama-dbus-server/Cargo.toml b/rust/agama-server/Cargo.toml similarity index 94% rename from rust/agama-dbus-server/Cargo.toml rename to rust/agama-server/Cargo.toml index 85f8753a9e..25cc8ccba5 100644 --- a/rust/agama-dbus-server/Cargo.toml +++ b/rust/agama-server/Cargo.toml @@ -29,7 +29,7 @@ macaddr = "1.0" async-trait = "0.1.75" axum = { version = "0.7.4", features = ["ws"] } serde_json = "1.0.113" -tower-http = { version = "0.5.1", features = ["trace"] } +tower-http = { version = "0.5.1", features = ["compression-br", "trace"] } tracing-subscriber = "0.3.18" tracing-journald = "0.3.0" tracing = "0.1.40" @@ -47,6 +47,7 @@ chrono = { version = "0.4.34", default-features = false, features = [ "clock", ] } pam = "0.8.0" +serde_with = "3.6.1" [[bin]] name = "agama-dbus-server" diff --git a/rust/agama-dbus-server/share/server-example.yaml b/rust/agama-server/share/server-example.yaml similarity index 100% rename from rust/agama-dbus-server/share/server-example.yaml rename to rust/agama-server/share/server-example.yaml diff --git a/rust/agama-dbus-server/src/agama-dbus-server.rs b/rust/agama-server/src/agama-dbus-server.rs similarity index 100% rename from rust/agama-dbus-server/src/agama-dbus-server.rs rename to rust/agama-server/src/agama-dbus-server.rs diff --git a/rust/agama-dbus-server/src/agama-web-server.rs b/rust/agama-server/src/agama-web-server.rs similarity index 52% rename from rust/agama-dbus-server/src/agama-web-server.rs rename to rust/agama-server/src/agama-web-server.rs index 9df6dfac0c..d8a16fc565 100644 --- a/rust/agama-dbus-server/src/agama-web-server.rs +++ b/rust/agama-server/src/agama-web-server.rs @@ -1,6 +1,11 @@ -use agama_dbus_server::web; -use agama_lib::connection; +use std::process::{ExitCode, Termination}; + +use agama_dbus_server::{ + l10n::helpers, + web::{self, run_monitor}, +}; use clap::{Parser, Subcommand}; +use tokio::sync::broadcast::channel; use tracing_subscriber::prelude::*; use utoipa::OpenApi; @@ -8,8 +13,9 @@ use utoipa::OpenApi; enum Commands { /// Start the API server. Serve { - /// Address to listen on (default: "0.0.0.0:3000") - #[arg(long, default_value = "0.0.0.0:3000")] + // Address to listen on (":::3000" listens for both IPv6 and IPv4 + // connections unless manually disabled in /proc/sys/net/ipv6/bindv6only) + #[arg(long, default_value = ":::3000")] address: String, }, /// Display the API documentation in OpenAPI format. @@ -27,7 +33,7 @@ struct Cli { } /// Start serving the API. -async fn serve_command(address: &str) { +async fn serve_command(address: &str) -> anyhow::Result<()> { let journald = tracing_journald::layer().expect("could not connect to journald"); tracing_subscriber::registry().with(journald).init(); @@ -35,25 +41,53 @@ async fn serve_command(address: &str) { .await .unwrap_or_else(|_| panic!("could not listen on {}", address)); - let dbus_connection = connection().await.unwrap(); + let (tx, _) = channel(16); + run_monitor(tx.clone()).await?; + let config = web::ServiceConfig::load().unwrap(); - let service = web::service(config, dbus_connection); + let service = web::service(config, tx); axum::serve(listener, service) .await .expect("could not mount app on listener"); + Ok(()) } /// Display the API documentation in OpenAPI format. -fn openapi_command() { +fn openapi_command() -> anyhow::Result<()> { println!("{}", web::ApiDoc::openapi().to_pretty_json().unwrap()); + Ok(()) } -#[tokio::main] -async fn main() { - let cli = Cli::parse(); - +async fn run_command(cli: Cli) -> anyhow::Result<()> { match cli.command { Commands::Serve { address } => serve_command(&address).await, Commands::Openapi => openapi_command(), } } + +/// Represents the result of execution. +pub enum CliResult { + /// Successful execution. + Ok = 0, + /// Something went wrong. + Error = 1, +} + +impl Termination for CliResult { + fn report(self) -> ExitCode { + ExitCode::from(self as u8) + } +} + +#[tokio::main] +async fn main() -> CliResult { + let cli = Cli::parse(); + _ = helpers::init_locale(); + + if let Err(error) = run_command(cli).await { + eprintln!("{:?}", error); + return CliResult::Error; + } + + CliResult::Ok +} diff --git a/rust/agama-dbus-server/src/error.rs b/rust/agama-server/src/error.rs similarity index 100% rename from rust/agama-dbus-server/src/error.rs rename to rust/agama-server/src/error.rs diff --git a/rust/agama-dbus-server/src/l10n.rs b/rust/agama-server/src/l10n.rs similarity index 94% rename from rust/agama-dbus-server/src/l10n.rs rename to rust/agama-server/src/l10n.rs index fcf6ec3b1c..a5ebb08fe9 100644 --- a/rust/agama-dbus-server/src/l10n.rs +++ b/rust/agama-server/src/l10n.rs @@ -2,13 +2,17 @@ pub mod helpers; mod keyboard; mod locale; mod timezone; +pub mod web; use crate::error::Error; use agama_locale_data::{KeymapId, LocaleCode}; use anyhow::Context; +pub use keyboard::Keymap; use keyboard::KeymapsDatabase; +pub use locale::LocaleEntry; use locale::LocalesDatabase; use std::process::Command; +pub use timezone::TimezoneEntry; use timezone::TimezonesDatabase; use zbus::{dbus_interface, Connection}; @@ -16,7 +20,7 @@ pub struct Locale { timezone: String, timezones_db: TimezonesDatabase, locales: Vec, - locales_db: LocalesDatabase, + pub locales_db: LocalesDatabase, keymap: KeymapId, keymaps_db: KeymapsDatabase, ui_locale: LocaleCode, @@ -190,18 +194,18 @@ impl Locale { let mut locales_db = LocalesDatabase::new(); locales_db.read(&locale)?; - let default_locale = if locales_db.exists(locale.as_str()) { - ui_locale.to_string() - } else { + let mut default_locale = ui_locale.to_string(); + if !locales_db.exists(locale.as_str()) { // TODO: handle the case where the database is empty (not expected!) - locales_db.entries().get(0).unwrap().code.to_string() + default_locale = locales_db.entries().first().unwrap().code.to_string(); }; let mut timezones_db = TimezonesDatabase::new(); timezones_db.read(&ui_locale.language)?; + let mut default_timezone = DEFAULT_TIMEZONE.to_string(); if !timezones_db.exists(&default_timezone) { - default_timezone = timezones_db.entries().get(0).unwrap().code.to_string(); + default_timezone = timezones_db.entries().first().unwrap().code.to_string(); }; let mut keymaps_db = KeymapsDatabase::new(); diff --git a/rust/agama-dbus-server/src/l10n/helpers.rs b/rust/agama-server/src/l10n/helpers.rs similarity index 100% rename from rust/agama-dbus-server/src/l10n/helpers.rs rename to rust/agama-server/src/l10n/helpers.rs diff --git a/rust/agama-dbus-server/src/l10n/keyboard.rs b/rust/agama-server/src/l10n/keyboard.rs similarity index 94% rename from rust/agama-dbus-server/src/l10n/keyboard.rs rename to rust/agama-server/src/l10n/keyboard.rs index 8a286bf4f6..aec68657e6 100644 --- a/rust/agama-dbus-server/src/l10n/keyboard.rs +++ b/rust/agama-server/src/l10n/keyboard.rs @@ -1,10 +1,14 @@ use agama_locale_data::{get_localectl_keymaps, keyboard::XkbConfigRegistry, KeymapId}; use gettextrs::*; +use serde::Serialize; use std::collections::HashMap; // Minimal representation of a keymap +#[derive(Clone, Debug, Serialize, utoipa::ToSchema)] pub struct Keymap { + /// Keymap identifier (e.g., "us") pub id: KeymapId, + /// Keymap description description: String, } diff --git a/rust/agama-dbus-server/src/l10n/locale.rs b/rust/agama-server/src/l10n/locale.rs similarity index 95% rename from rust/agama-dbus-server/src/l10n/locale.rs rename to rust/agama-server/src/l10n/locale.rs index a56919ea0a..65d76ec1e4 100644 --- a/rust/agama-dbus-server/src/l10n/locale.rs +++ b/rust/agama-server/src/l10n/locale.rs @@ -3,12 +3,16 @@ use crate::error::Error; use agama_locale_data::{InvalidLocaleCode, LocaleCode}; use anyhow::Context; +use serde::Serialize; +use serde_with::{serde_as, DisplayFromStr}; use std::process::Command; /// Represents a locale, including the localized language and territory. -#[derive(Debug)] +#[serde_as] +#[derive(Debug, Serialize, Clone, utoipa::ToSchema)] pub struct LocaleEntry { /// The locale code (e.g., "es_ES.UTF-8"). + #[serde_as(as = "DisplayFromStr")] pub code: LocaleCode, /// Localized language name (e.g., "Spanish", "Español", etc.) pub language: String, @@ -35,7 +39,7 @@ impl LocalesDatabase { /// /// * `ui_language`: language to translate the descriptions (e.g., "en"). pub fn read(&mut self, ui_language: &str) -> Result<(), Error> { - let result = Command::new("/usr/bin/localectl") + let result = Command::new("localectl") .args(["list-locales"]) .output() .context("Failed to get the list of locales")?; @@ -113,7 +117,6 @@ mod tests { use super::LocalesDatabase; use agama_locale_data::LocaleCode; - #[ignore] #[test] fn test_read_locales() { let mut db = LocalesDatabase::new(); @@ -125,7 +128,6 @@ mod tests { assert_eq!(&found.territory, "Spanien"); } - #[ignore] #[test] fn test_locale_exists() { let mut db = LocalesDatabase::new(); diff --git a/rust/agama-dbus-server/src/l10n/timezone.rs b/rust/agama-server/src/l10n/timezone.rs similarity index 98% rename from rust/agama-dbus-server/src/l10n/timezone.rs rename to rust/agama-server/src/l10n/timezone.rs index bfa7ddae8f..f1547903f7 100644 --- a/rust/agama-dbus-server/src/l10n/timezone.rs +++ b/rust/agama-server/src/l10n/timezone.rs @@ -3,10 +3,11 @@ use crate::error::Error; use agama_locale_data::territory::Territories; use agama_locale_data::timezone_part::TimezoneIdParts; +use serde::Serialize; use std::collections::HashMap; /// Represents a timezone, including each part as localized. -#[derive(Debug)] +#[derive(Clone, Debug, Serialize, utoipa::ToSchema)] pub struct TimezoneEntry { /// Timezone identifier (e.g. "Atlantic/Canary"). pub code: String, @@ -114,7 +115,6 @@ mod tests { let mut db = TimezonesDatabase::new(); db.read("es").unwrap(); let found_timezones = db.entries(); - dbg!(&found_timezones); let found = found_timezones .iter() .find(|tz| tz.code == "Europe/Berlin") diff --git a/rust/agama-server/src/l10n/web.rs b/rust/agama-server/src/l10n/web.rs new file mode 100644 index 0000000000..1f84f4d437 --- /dev/null +++ b/rust/agama-server/src/l10n/web.rs @@ -0,0 +1,207 @@ +//! This module implements the web API for the localization module. + +use super::{keyboard::Keymap, locale::LocaleEntry, timezone::TimezoneEntry, Locale}; +use crate::{ + error::Error, + l10n::helpers, + web::{Event, EventsSender}, +}; +use agama_locale_data::{InvalidKeymap, LocaleCode}; +use axum::{ + extract::State, + http::StatusCode, + response::{IntoResponse, Response}, + routing::{get, put}, + Json, Router, +}; +use serde::{Deserialize, Serialize}; +use serde_json::json; +use std::sync::{Arc, RwLock}; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum LocaleError { + #[error("Unknown locale code: {0}")] + UnknownLocale(String), + #[error("Unknown timezone: {0}")] + UnknownTimezone(String), + #[error("Invalid keymap: {0}")] + InvalidKeymap(#[from] InvalidKeymap), + #[error("Cannot translate: {0}")] + OtherError(#[from] Error), +} + +impl IntoResponse for LocaleError { + fn into_response(self) -> Response { + let body = json!({ + "error": self.to_string() + }); + (StatusCode::BAD_REQUEST, Json(body)).into_response() + } +} + +#[derive(Clone)] +struct LocaleState { + locale: Arc>, + events: EventsSender, +} + +/// Sets up and returns the axum service for the localization module. +/// +/// * `events`: channel to send the events to the main service. +pub fn l10n_service(events: EventsSender) -> Router { + let code = LocaleCode::default(); + let locale = Locale::new_with_locale(&code).unwrap(); + let state = LocaleState { + locale: Arc::new(RwLock::new(locale)), + events, + }; + + Router::new() + .route("/keymaps", get(keymaps)) + .route("/locales", get(locales)) + .route("/timezones", get(timezones)) + .route("/config", put(set_config).get(get_config)) + .with_state(state) +} + +#[utoipa::path(get, path = "/l10n/locales", responses( + (status = 200, description = "List of known locales", body = Vec) +))] +async fn locales(State(state): State) -> Json> { + let data = state.locale.read().unwrap(); + let locales = data.locales_db.entries().to_vec(); + Json(locales) +} + +#[derive(Serialize, Deserialize, utoipa::ToSchema)] +pub struct LocaleConfig { + /// Locales to install in the target system + locales: Option>, + /// Keymap for the target system + keymap: Option, + /// Timezone for the target system + timezone: Option, + /// User-interface locale. It is actually not related to the `locales` property. + ui_locale: Option, +} + +#[utoipa::path(get, path = "/l10n/timezones", responses( + (status = 200, description = "List of known timezones") +))] +async fn timezones(State(state): State) -> Json> { + let data = state.locale.read().unwrap(); + let timezones = data.timezones_db.entries().to_vec(); + Json(timezones) +} + +#[utoipa::path(get, path = "/l10n/keymaps", responses( + (status = 200, description = "List of known keymaps", body = Vec) +))] +async fn keymaps(State(state): State) -> Json> { + let data = state.locale.read().unwrap(); + let keymaps = data.keymaps_db.entries().to_vec(); + Json(keymaps) +} + +#[utoipa::path(put, path = "/l10n/config", responses( + (status = 200, description = "Set the locale configuration", body = LocaleConfig) +))] +async fn set_config( + State(state): State, + Json(value): Json, +) -> Result, LocaleError> { + let mut data = state.locale.write().unwrap(); + + if let Some(locales) = &value.locales { + for loc in locales { + if !data.locales_db.exists(loc.as_str()) { + return Err(LocaleError::UnknownLocale(loc.to_string())); + } + } + data.locales = locales.clone(); + } + + if let Some(timezone) = &value.timezone { + if !data.timezones_db.exists(timezone) { + return Err(LocaleError::UnknownTimezone(timezone.to_string())); + } + data.timezone = timezone.to_owned(); + } + + if let Some(keymap_id) = &value.keymap { + data.keymap = keymap_id.parse()?; + } + + if let Some(ui_locale) = &value.ui_locale { + let locale: LocaleCode = ui_locale + .as_str() + .try_into() + .map_err(|_e| LocaleError::UnknownLocale(ui_locale.to_string()))?; + + helpers::set_service_locale(&locale); + data.translate(&locale)?; + _ = state.events.send(Event::LocaleChanged { + locale: locale.to_string(), + }); + } + + Ok(Json(())) +} + +#[utoipa::path(get, path = "/l10n/config", responses( + (status = 200, description = "Localization configuration", body = LocaleConfig) +))] +async fn get_config(State(state): State) -> Json { + let data = state.locale.read().unwrap(); + Json(LocaleConfig { + locales: Some(data.locales.clone()), + keymap: Some(data.keymap()), + timezone: Some(data.timezone().to_string()), + ui_locale: Some(data.ui_locale().to_string()), + }) +} + +#[cfg(test)] +mod tests { + use crate::l10n::{web::LocaleState, Locale}; + use agama_locale_data::{KeymapId, LocaleCode}; + use std::sync::{Arc, RwLock}; + use tokio::{sync::broadcast::channel, test}; + + fn build_state() -> LocaleState { + let (tx, _) = channel(16); + let default_code = LocaleCode::default(); + let locale = Locale::new_with_locale(&default_code).unwrap(); + LocaleState { + locale: Arc::new(RwLock::new(locale)), + events: tx, + } + } + + #[test] + async fn test_locales() { + let state = build_state(); + let response = super::locales(axum::extract::State(state)).await; + let default = LocaleCode::default(); + let found = response.iter().find(|l| l.code == default); + assert!(found.is_some()); + } + + #[test] + async fn test_keymaps() { + let state = build_state(); + let response = super::keymaps(axum::extract::State(state)).await; + let english: KeymapId = "us".parse().unwrap(); + let found = response.iter().find(|k| k.id == english); + assert!(found.is_some()); + } + + #[test] + async fn test_timezones() { + let state = build_state(); + let response = super::timezones(axum::extract::State(state)).await; + let found = response.iter().find(|t| t.code == "Atlantic/Canary"); + assert!(found.is_some()); + } +} diff --git a/rust/agama-dbus-server/src/lib.rs b/rust/agama-server/src/lib.rs similarity index 100% rename from rust/agama-dbus-server/src/lib.rs rename to rust/agama-server/src/lib.rs diff --git a/rust/agama-dbus-server/src/network.rs b/rust/agama-server/src/network.rs similarity index 100% rename from rust/agama-dbus-server/src/network.rs rename to rust/agama-server/src/network.rs diff --git a/rust/agama-dbus-server/src/network/action.rs b/rust/agama-server/src/network/action.rs similarity index 100% rename from rust/agama-dbus-server/src/network/action.rs rename to rust/agama-server/src/network/action.rs diff --git a/rust/agama-dbus-server/src/network/adapter.rs b/rust/agama-server/src/network/adapter.rs similarity index 100% rename from rust/agama-dbus-server/src/network/adapter.rs rename to rust/agama-server/src/network/adapter.rs diff --git a/rust/agama-dbus-server/src/network/dbus.rs b/rust/agama-server/src/network/dbus.rs similarity index 100% rename from rust/agama-dbus-server/src/network/dbus.rs rename to rust/agama-server/src/network/dbus.rs diff --git a/rust/agama-dbus-server/src/network/dbus/interfaces.rs b/rust/agama-server/src/network/dbus/interfaces.rs similarity index 100% rename from rust/agama-dbus-server/src/network/dbus/interfaces.rs rename to rust/agama-server/src/network/dbus/interfaces.rs diff --git a/rust/agama-dbus-server/src/network/dbus/interfaces/common.rs b/rust/agama-server/src/network/dbus/interfaces/common.rs similarity index 100% rename from rust/agama-dbus-server/src/network/dbus/interfaces/common.rs rename to rust/agama-server/src/network/dbus/interfaces/common.rs diff --git a/rust/agama-dbus-server/src/network/dbus/interfaces/connection_configs.rs b/rust/agama-server/src/network/dbus/interfaces/connection_configs.rs similarity index 100% rename from rust/agama-dbus-server/src/network/dbus/interfaces/connection_configs.rs rename to rust/agama-server/src/network/dbus/interfaces/connection_configs.rs diff --git a/rust/agama-dbus-server/src/network/dbus/interfaces/connections.rs b/rust/agama-server/src/network/dbus/interfaces/connections.rs similarity index 100% rename from rust/agama-dbus-server/src/network/dbus/interfaces/connections.rs rename to rust/agama-server/src/network/dbus/interfaces/connections.rs diff --git a/rust/agama-dbus-server/src/network/dbus/interfaces/devices.rs b/rust/agama-server/src/network/dbus/interfaces/devices.rs similarity index 100% rename from rust/agama-dbus-server/src/network/dbus/interfaces/devices.rs rename to rust/agama-server/src/network/dbus/interfaces/devices.rs diff --git a/rust/agama-dbus-server/src/network/dbus/interfaces/ip_config.rs b/rust/agama-server/src/network/dbus/interfaces/ip_config.rs similarity index 100% rename from rust/agama-dbus-server/src/network/dbus/interfaces/ip_config.rs rename to rust/agama-server/src/network/dbus/interfaces/ip_config.rs diff --git a/rust/agama-dbus-server/src/network/dbus/service.rs b/rust/agama-server/src/network/dbus/service.rs similarity index 100% rename from rust/agama-dbus-server/src/network/dbus/service.rs rename to rust/agama-server/src/network/dbus/service.rs diff --git a/rust/agama-dbus-server/src/network/dbus/tree.rs b/rust/agama-server/src/network/dbus/tree.rs similarity index 100% rename from rust/agama-dbus-server/src/network/dbus/tree.rs rename to rust/agama-server/src/network/dbus/tree.rs diff --git a/rust/agama-dbus-server/src/network/error.rs b/rust/agama-server/src/network/error.rs similarity index 100% rename from rust/agama-dbus-server/src/network/error.rs rename to rust/agama-server/src/network/error.rs diff --git a/rust/agama-dbus-server/src/network/model.rs b/rust/agama-server/src/network/model.rs similarity index 99% rename from rust/agama-dbus-server/src/network/model.rs rename to rust/agama-server/src/network/model.rs index 4a963b07d0..551c353496 100644 --- a/rust/agama-dbus-server/src/network/model.rs +++ b/rust/agama-server/src/network/model.rs @@ -345,7 +345,6 @@ mod tests { let error = state .set_ports(&bond0, vec!["eth0".to_string()]) .unwrap_err(); - dbg!(&error); assert!(matches!(error, NetworkStateError::UnknownConnection(_))); } diff --git a/rust/agama-dbus-server/src/network/model/builder.rs b/rust/agama-server/src/network/model/builder.rs similarity index 100% rename from rust/agama-dbus-server/src/network/model/builder.rs rename to rust/agama-server/src/network/model/builder.rs diff --git a/rust/agama-dbus-server/src/network/nm.rs b/rust/agama-server/src/network/nm.rs similarity index 100% rename from rust/agama-dbus-server/src/network/nm.rs rename to rust/agama-server/src/network/nm.rs diff --git a/rust/agama-dbus-server/src/network/nm/adapter.rs b/rust/agama-server/src/network/nm/adapter.rs similarity index 100% rename from rust/agama-dbus-server/src/network/nm/adapter.rs rename to rust/agama-server/src/network/nm/adapter.rs diff --git a/rust/agama-dbus-server/src/network/nm/client.rs b/rust/agama-server/src/network/nm/client.rs similarity index 100% rename from rust/agama-dbus-server/src/network/nm/client.rs rename to rust/agama-server/src/network/nm/client.rs diff --git a/rust/agama-dbus-server/src/network/nm/dbus.rs b/rust/agama-server/src/network/nm/dbus.rs similarity index 100% rename from rust/agama-dbus-server/src/network/nm/dbus.rs rename to rust/agama-server/src/network/nm/dbus.rs diff --git a/rust/agama-dbus-server/src/network/nm/error.rs b/rust/agama-server/src/network/nm/error.rs similarity index 100% rename from rust/agama-dbus-server/src/network/nm/error.rs rename to rust/agama-server/src/network/nm/error.rs diff --git a/rust/agama-dbus-server/src/network/nm/model.rs b/rust/agama-server/src/network/nm/model.rs similarity index 100% rename from rust/agama-dbus-server/src/network/nm/model.rs rename to rust/agama-server/src/network/nm/model.rs diff --git a/rust/agama-dbus-server/src/network/nm/proxies.rs b/rust/agama-server/src/network/nm/proxies.rs similarity index 100% rename from rust/agama-dbus-server/src/network/nm/proxies.rs rename to rust/agama-server/src/network/nm/proxies.rs diff --git a/rust/agama-dbus-server/src/network/system.rs b/rust/agama-server/src/network/system.rs similarity index 100% rename from rust/agama-dbus-server/src/network/system.rs rename to rust/agama-server/src/network/system.rs diff --git a/rust/agama-dbus-server/src/questions.rs b/rust/agama-server/src/questions.rs similarity index 100% rename from rust/agama-dbus-server/src/questions.rs rename to rust/agama-server/src/questions.rs diff --git a/rust/agama-dbus-server/src/questions/answers.rs b/rust/agama-server/src/questions/answers.rs similarity index 100% rename from rust/agama-dbus-server/src/questions/answers.rs rename to rust/agama-server/src/questions/answers.rs diff --git a/rust/agama-server/src/web.rs b/rust/agama-server/src/web.rs new file mode 100644 index 0000000000..7cbb1ec6b8 --- /dev/null +++ b/rust/agama-server/src/web.rs @@ -0,0 +1,55 @@ +//! This module implements a web-based API for Agama. It is responsible for: +//! +//! * Exposing an HTTP API to interact with Agama. +//! * Emit relevant events via websocket. +//! * Serve the code for the web user interface (not implemented yet). + +mod auth; +mod config; +mod docs; +mod event; +mod http; +mod progress; +mod service; +mod state; +mod ws; + +use agama_lib::{connection, error::ServiceError, progress::ProgressMonitor}; +pub use auth::generate_token; +pub use config::ServiceConfig; +pub use docs::ApiDoc; +pub use event::{Event, EventsReceiver, EventsSender}; + +use crate::l10n::web::l10n_service; +use axum::Router; +pub use service::MainServiceBuilder; + +use self::progress::EventsProgressPresenter; + +/// Returns a service that implements the web-based Agama API. +/// +/// * `config`: service configuration. +/// * `events`: D-Bus connection. +pub fn service(config: ServiceConfig, events: EventsSender) -> Router { + MainServiceBuilder::new(events.clone()) + .add_service("/l10n", l10n_service(events)) + .with_config(config) + .build() +} + +/// Starts monitoring the D-Bus service progress. +/// +/// The events are sent to the `events` channel. +/// +/// * `events`: channel to send the events to. +pub async fn run_monitor(events: EventsSender) -> Result<(), ServiceError> { + let presenter = EventsProgressPresenter::new(events); + let connection = connection().await?; + let mut monitor = ProgressMonitor::new(connection).await?; + tokio::spawn(async move { + if let Err(error) = monitor.run(presenter).await { + eprintln!("Could not monitor the D-Bus server: {}", error); + } + }); + Ok(()) +} diff --git a/rust/agama-dbus-server/src/web/auth.rs b/rust/agama-server/src/web/auth.rs similarity index 100% rename from rust/agama-dbus-server/src/web/auth.rs rename to rust/agama-server/src/web/auth.rs diff --git a/rust/agama-dbus-server/src/web/config.rs b/rust/agama-server/src/web/config.rs similarity index 100% rename from rust/agama-dbus-server/src/web/config.rs rename to rust/agama-server/src/web/config.rs diff --git a/rust/agama-server/src/web/docs.rs b/rust/agama-server/src/web/docs.rs new file mode 100644 index 0000000000..58a1de6aed --- /dev/null +++ b/rust/agama-server/src/web/docs.rs @@ -0,0 +1,15 @@ +use utoipa::OpenApi; + +#[derive(OpenApi)] +#[openapi( + info(description = "Agama web API description"), + paths(super::http::ping, crate::l10n::web::locales), + components( + schemas(super::http::PingResponse), + schemas(crate::l10n::LocaleEntry), + schemas(crate::l10n::web::LocaleConfig), + schemas(crate::l10n::Keymap), + schemas(crate::l10n::TimezoneEntry) + ) +)] +pub struct ApiDoc; diff --git a/rust/agama-server/src/web/event.rs b/rust/agama-server/src/web/event.rs new file mode 100644 index 0000000000..76db326bc4 --- /dev/null +++ b/rust/agama-server/src/web/event.rs @@ -0,0 +1,13 @@ +use agama_lib::progress::Progress; +use serde::Serialize; +use tokio::sync::broadcast::{Receiver, Sender}; + +#[derive(Clone, Serialize)] +#[serde(tag = "type")] +pub enum Event { + LocaleChanged { locale: String }, + Progress(Progress), +} + +pub type EventsSender = Sender; +pub type EventsReceiver = Receiver; diff --git a/rust/agama-dbus-server/src/web/http.rs b/rust/agama-server/src/web/http.rs similarity index 89% rename from rust/agama-dbus-server/src/web/http.rs rename to rust/agama-server/src/web/http.rs index f6131044db..54da54a3ae 100644 --- a/rust/agama-dbus-server/src/web/http.rs +++ b/rust/agama-server/src/web/http.rs @@ -24,11 +24,6 @@ pub async fn ping() -> Json { }) } -// TODO: remove this route (as it is just for teting) as soon as we have a legit protected one -pub async fn protected() -> String { - "OK".to_string() -} - #[derive(Serialize)] pub struct AuthResponse { /// Bearer token to use on subsequent calls diff --git a/rust/agama-server/src/web/progress.rs b/rust/agama-server/src/web/progress.rs new file mode 100644 index 0000000000..c892edd8ed --- /dev/null +++ b/rust/agama-server/src/web/progress.rs @@ -0,0 +1,40 @@ +//! Implements a mechanism to monitor track service progress. + +use super::event::{Event, EventsSender}; +use agama_lib::progress::{Progress, ProgressPresenter}; +use async_trait::async_trait; + +// let presenter = EventsProgressPresenter::new(socket); +// let mut monitor = ProgressMonitor::new(connection).await.unwrap(); +// _ = monitor.run(presenter).await; + +/// Experimental ProgressPresenter to emit progress events over a Events. +pub struct EventsProgressPresenter(EventsSender); + +impl EventsProgressPresenter { + pub fn new(events: EventsSender) -> Self { + Self(events) + } + + pub async fn report_progress(&mut self, progress: &Progress) { + _ = self.0.send(Event::Progress(progress.clone())) + // _ = self.events.send(Message::Text(payload)).await; + } +} + +#[async_trait] +impl ProgressPresenter for EventsProgressPresenter { + async fn start(&mut self, progress: &Progress) { + self.report_progress(progress).await; + } + + async fn update_main(&mut self, progress: &Progress) { + self.report_progress(progress).await; + } + + async fn update_detail(&mut self, progress: &Progress) { + self.report_progress(progress).await; + } + + async fn finish(&mut self) {} +} diff --git a/rust/agama-server/src/web/service.rs b/rust/agama-server/src/web/service.rs new file mode 100644 index 0000000000..d2590bc688 --- /dev/null +++ b/rust/agama-server/src/web/service.rs @@ -0,0 +1,62 @@ +use super::{auth::TokenClaims, config::ServiceConfig, state::ServiceState, EventsSender}; +use axum::{ + extract::Request, + middleware, + response::IntoResponse, + routing::{get, post}, + Router, +}; +use std::convert::Infallible; +use tower::Service; +use tower_http::{compression::CompressionLayer, trace::TraceLayer}; + +pub struct MainServiceBuilder { + config: ServiceConfig, + events: EventsSender, + router: Router, +} + +impl MainServiceBuilder { + pub fn new(events: EventsSender) -> Self { + let router = Router::new().route("/ws", get(super::ws::ws_handler)); + let config = ServiceConfig::default(); + + Self { + events, + router, + config, + } + } + + pub fn with_config(self, config: ServiceConfig) -> Self { + Self { config, ..self } + } + + pub fn add_service(self, path: &str, service: T) -> Self + where + T: Service + Clone + Send + 'static, + T::Response: IntoResponse, + T::Future: Send + 'static, + { + Self { + router: self.router.nest_service(path, service), + ..self + } + } + + pub fn build(self) -> Router { + let state = ServiceState { + config: self.config, + events: self.events, + }; + self.router + .route_layer(middleware::from_extractor_with_state::( + state.clone(), + )) + .route("/ping", get(super::http::ping)) + .route("/authenticate", post(super::http::authenticate)) + .layer(TraceLayer::new_for_http()) + .layer(CompressionLayer::new().br(true)) + .with_state(state) + } +} diff --git a/rust/agama-server/src/web/state.rs b/rust/agama-server/src/web/state.rs new file mode 100644 index 0000000000..c35592b8c5 --- /dev/null +++ b/rust/agama-server/src/web/state.rs @@ -0,0 +1,12 @@ +//! Implements the web service state. + +use super::{config::ServiceConfig, EventsSender}; + +/// Web service state. +/// +/// It holds the service configuration, the current D-Bus connection and a channel to send events. +#[derive(Clone)] +pub struct ServiceState { + pub config: ServiceConfig, + pub events: EventsSender, +} diff --git a/rust/agama-server/src/web/ws.rs b/rust/agama-server/src/web/ws.rs new file mode 100644 index 0000000000..e7c348ddb8 --- /dev/null +++ b/rust/agama-server/src/web/ws.rs @@ -0,0 +1,26 @@ +//! Implements the websocket handling. + +use super::{state::ServiceState, EventsSender}; +use axum::{ + extract::{ + ws::{Message, WebSocket}, + State, WebSocketUpgrade, + }, + response::IntoResponse, +}; + +pub async fn ws_handler( + State(state): State, + ws: WebSocketUpgrade, +) -> impl IntoResponse { + ws.on_upgrade(move |socket| handle_socket(socket, state.events)) +} + +async fn handle_socket(mut socket: WebSocket, events: EventsSender) { + let mut rx = events.subscribe(); + while let Ok(msg) = rx.recv().await { + if let Ok(json) = serde_json::to_string(&msg) { + _ = socket.send(Message::Text(json)).await; + } + } +} diff --git a/rust/agama-dbus-server/tests/common/mod.rs b/rust/agama-server/tests/common/mod.rs similarity index 95% rename from rust/agama-dbus-server/tests/common/mod.rs rename to rust/agama-server/tests/common/mod.rs index 009d95bfb1..cd77539774 100644 --- a/rust/agama-dbus-server/tests/common/mod.rs +++ b/rust/agama-server/tests/common/mod.rs @@ -1,4 +1,5 @@ use agama_lib::error::ServiceError; +use axum::body::{to_bytes, Body}; use std::{ error::Error, future::Future, @@ -144,3 +145,8 @@ where } } } + +pub async fn body_to_string(body: Body) -> String { + let bytes = to_bytes(body, usize::MAX).await.unwrap(); + String::from_utf8(bytes.to_vec()).unwrap() +} diff --git a/rust/agama-server/tests/l10n.rs b/rust/agama-server/tests/l10n.rs new file mode 100644 index 0000000000..f2d0291c29 --- /dev/null +++ b/rust/agama-server/tests/l10n.rs @@ -0,0 +1,66 @@ +pub mod common; + +use agama_dbus_server::l10n::web::l10n_service; +use axum::{ + body::Body, + http::{Request, StatusCode}, + Router, +}; +use common::body_to_string; +use tokio::{sync::broadcast::channel, test}; +use tower::ServiceExt; + +fn build_service() -> Router { + let (tx, _) = channel(16); + l10n_service(tx) +} + +#[test] +async fn test_get_config() { + let service = build_service(); + let request = Request::builder() + .uri("/config") + .body(Body::empty()) + .unwrap(); + let response = service.oneshot(request).await.unwrap(); + assert_eq!(response.status(), StatusCode::OK); +} + +#[test] +async fn test_locales() { + let service = build_service(); + let request = Request::builder() + .uri("/locales") + .body(Body::empty()) + .unwrap(); + let response = service.oneshot(request).await.unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let body = body_to_string(response.into_body()).await; + assert!(body.contains(r#""language":"English""#)); +} + +#[test] +async fn test_keymaps() { + let service = build_service(); + let request = Request::builder() + .uri("/keymaps") + .body(Body::empty()) + .unwrap(); + let response = service.oneshot(request).await.unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let body = body_to_string(response.into_body()).await; + assert!(body.contains(r#""layout":"us""#)); +} + +#[test] +async fn test_timezones() { + let service = build_service(); + let request = Request::builder() + .uri("/timezones") + .body(Body::empty()) + .unwrap(); + let response = service.oneshot(request).await.unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let body = body_to_string(response.into_body()).await; + assert!(body.contains(r#""code":"Atlantic/Canary""#)); +} diff --git a/rust/agama-dbus-server/tests/network.rs b/rust/agama-server/tests/network.rs similarity index 99% rename from rust/agama-dbus-server/tests/network.rs rename to rust/agama-server/tests/network.rs index 2261746325..ed4b0037b2 100644 --- a/rust/agama-dbus-server/tests/network.rs +++ b/rust/agama-server/tests/network.rs @@ -1,4 +1,4 @@ -mod common; +pub mod common; use self::common::{async_retry, DBusServer}; use agama_dbus_server::network::{ diff --git a/rust/agama-dbus-server/tests/service.rs b/rust/agama-server/tests/service.rs similarity index 57% rename from rust/agama-dbus-server/tests/service.rs rename to rust/agama-server/tests/service.rs index c825fbbe43..6179484be8 100644 --- a/rust/agama-dbus-server/tests/service.rs +++ b/rust/agama-server/tests/service.rs @@ -1,29 +1,32 @@ -mod common; +pub mod common; -use self::common::DBusServer; -use agama_dbus_server::{service, web::generate_token, web::ServiceConfig}; +use agama_dbus_server::{ + service, + web::{generate_token, MainServiceBuilder, ServiceConfig}, +}; use axum::{ body::Body, http::{Method, Request, StatusCode}, response::Response, + routing::get, + Router, }; -use http_body_util::BodyExt; +use common::body_to_string; use std::error::Error; -use tokio::test; +use tokio::{sync::broadcast::channel, test}; use tower::ServiceExt; -async fn body_to_string(body: Body) -> String { - let bytes = body.collect().await.unwrap().to_bytes(); - String::from_utf8(bytes.to_vec()).unwrap() +fn build_service() -> Router { + let (tx, _) = channel(16); + service(ServiceConfig::default(), tx) } #[test] async fn test_ping() -> Result<(), Box> { - let dbus_server = DBusServer::new().start().await?; - let web_server = service(ServiceConfig::default(), dbus_server.connection()); + let web_service = build_service(); let request = Request::builder().uri("/ping").body(Body::empty()).unwrap(); - let response = web_server.oneshot(request).await.unwrap(); + let response = web_service.oneshot(request).await.unwrap(); assert_eq!(response.status(), StatusCode::OK); let body = body_to_string(response.into_body()).await; @@ -31,12 +34,20 @@ async fn test_ping() -> Result<(), Box> { Ok(()) } +async fn protected() -> String { + "OK".to_string() +} + async fn access_protected_route(token: &str, jwt_secret: &str) -> Response { - let dbus_server = DBusServer::new().start().await.unwrap(); let config = ServiceConfig { jwt_secret: jwt_secret.to_string(), }; - let web_server = service(config, dbus_server.connection()); + let (tx, _) = channel(16); + let web_service = MainServiceBuilder::new(tx) + .add_service("/protected", get(protected)) + .with_config(config) + .build(); + let request = Request::builder() .uri("/protected") .method(Method::GET) @@ -44,12 +55,10 @@ async fn access_protected_route(token: &str, jwt_secret: &str) -> Response { .body(Body::empty()) .unwrap(); - web_server.oneshot(request).await.unwrap() + web_service.oneshot(request).await.unwrap() } -// TODO: The following test should belong to `auth.rs`. However, we need a working -// D-Bus connection which is not available on containers. Let's keep the test -// here until by now. +// TODO: The following test should belong to `auth.rs` #[test] async fn test_access_protected_route() -> Result<(), Box> { let token = generate_token("nots3cr3t"); @@ -60,10 +69,8 @@ async fn test_access_protected_route() -> Result<(), Box> { assert_eq!(body, "OK"); Ok(()) } - -// TODO: The following test should belong to `auth.rs`. However, we need a working -// D-Bus connection which is not available on containers. Let's keep the test -// here until by now. +// +// TODO: The following test should belong to `auth.rs`. #[test] async fn test_access_protected_route_failed() -> Result<(), Box> { let token = generate_token("nots3cr3t"); diff --git a/rust/package/_service b/rust/package/_service index 74597e457b..04b7d36141 100644 --- a/rust/package/_service +++ b/rust/package/_service @@ -7,8 +7,8 @@ master rust enable - package/agama-cli.changes - package/agama-cli.spec + package/agama.changes + package/agama.spec agama/rust diff --git a/rust/package/agama-cli.changes b/rust/package/agama.changes similarity index 97% rename from rust/package/agama-cli.changes rename to rust/package/agama.changes index ef6dccebab..656cd074eb 100644 --- a/rust/package/agama-cli.changes +++ b/rust/package/agama.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Tue Feb 27 15:55:28 UTC 2024 - Imobach Gonzalez Sosa + +- Reorganize RPM packages (gh#openSUSE/agama#1056): + * agama is now the main package and it contains agama-dbus-server + and agama-web-server. + * agama-cli is a subpackage. + ------------------------------------------------------------------- Wed Feb 7 11:49:02 UTC 2024 - Imobach Gonzalez Sosa diff --git a/rust/package/agama-cli.spec b/rust/package/agama.spec similarity index 78% rename from rust/package/agama-cli.spec rename to rust/package/agama.spec index b180f26aa7..51edf53679 100644 --- a/rust/package/agama-cli.spec +++ b/rust/package/agama.spec @@ -1,7 +1,7 @@ # -# spec file for package agama-cli +# spec file for package agama # -# Copyright (c) 2023 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2023-2024 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -15,64 +15,61 @@ # Please submit bugfixes or comments via http://bugs.opensuse.org/ # -Name: agama-cli +Name: agama # This will be set by osc services, that will run after this. Version: 0 Release: 0 -Summary: Agama command line interface +Summary: Agama Installer # If you know the license, put it's SPDX string here. # Alternately, you can use cargo lock2rpmprovides to help generate this. License: GPL-2.0-only Url: https://github.com/opensuse/agama Source0: agama.tar Source1: vendor.tar.zst + BuildRequires: cargo-packaging BuildRequires: pkgconfig(openssl) # used in tests for dbus service BuildRequires: python-langtable-data -BuildRequires: timezone BuildRequires: dbus-1-common +Requires: dbus-1-common # required by agama-dbus-server integration tests BuildRequires: dbus-1-daemon BuildRequires: clang-devel BuildRequires: pkgconfig(pam) +# required by autoinstallation Requires: jsonnet Requires: lshw # required by "agama logs store" Requires: bzip2 Requires: tar # required for translating the keyboards descriptions +BuildRequires: xkeyboard-config-lang Requires: xkeyboard-config-lang # required for getting the list of timezones Requires: timezone +BuildRequires: timezone +# dependency on the YaST part of Agama +Requires: agama-yast -%description -Command line program to interact with the agama service. - -%package -n agama-dbus-server -# This will be set by osc services, that will run after this. -Version: 0 -Release: 0 -Summary: Agama Rust D-Bus service -License: GPL-2.0-only -Url: https://github.com/opensuse/agama -Requires: python-langtable-data -Requires: dbus-1-common +# conflicts with the old packages +Conflicts: agama-dbus-server -%description -n agama-dbus-server -D-Bus service for agama project. It provides localization, networking and questions services. +%description +Agama is a service-based Linux installer. It is composed of an HTTP-based API, +a web user interface, a command-line interface and a D-Bus service which exposes +part of the YaST libraries. -%package -n agama-web-server +%package -n agama-cli # This will be set by osc services, that will run after this. Version: 0 Release: 0 -Summary: Agama web server +Summary: Agama command-line interface License: GPL-2.0-only Url: https://github.com/opensuse/agama -Requires: agama-dbus-server -%description -n agama-web-server -Agama project web server. It provides a web-based API to Agama. +%description -n agama-cli +Command line program to interact with the Agama installer. %prep %autosetup -a1 -n agama @@ -95,23 +92,23 @@ install -m 0644 --target-directory=%{buildroot}%{_datadir}/dbus-1/agama-services %check +PATH=$PWD/share/bin:$PATH %ifarch aarch64 /usr/bin/cargo auditable test -j1 --offline --no-fail-fast %else +echo $PATH %{cargo_test} %endif %files -%{_bindir}/agama -%dir %{_datadir}/agama-cli -%{_datadir}/agama-cli/profile.schema.json - -%files -n agama-dbus-server %{_bindir}/agama-dbus-server +%{_bindir}/agama-web-server %{_datadir}/dbus-1/agama-services %{_pam_vendordir}/agama -%files -n agama-web-server -%{_bindir}/agama-web-server +%files -n agama-cli +%{_bindir}/agama +%dir %{_datadir}/agama-cli +%{_datadir}/agama-cli/profile.schema.json %changelog diff --git a/rust/share/bin/README.md b/rust/share/bin/README.md new file mode 100644 index 0000000000..7c6ea621db --- /dev/null +++ b/rust/share/bin/README.md @@ -0,0 +1,8 @@ +This directory contains commands that replaces real ones during CI testing. The reason is that these +commands might not work in the CI environment (e.g., systemd related commands). + +To use these "binaries" in the tests, just set the right PATH: + +``` +PATH=$PWD/share/bin:$PATH cargo test +``` diff --git a/rust/share/bin/localectl b/rust/share/bin/localectl new file mode 100755 index 0000000000..21f4ce9dbe --- /dev/null +++ b/rust/share/bin/localectl @@ -0,0 +1,5 @@ +#!/usr/bin/env sh + +SCRIPT=$(readlink -f "$0") +DATADIR=$(dirname "$SCRIPT")/.. +cat $DATADIR/localectl-$1.txt diff --git a/rust/share/localectl-list-keymaps.txt b/rust/share/localectl-list-keymaps.txt new file mode 100644 index 0000000000..a68870b4ea --- /dev/null +++ b/rust/share/localectl-list-keymaps.txt @@ -0,0 +1,612 @@ +3l +ANSI-dvorak +Pl02 +adnw +al +al-plisi +amiga-de +amiga-us +apple-a1048-sv +apple-a1243-sv +apple-a1243-sv-fn-reverse +apple-internal-0x0253-sv +apple-internal-0x0253-sv-fn-reverse +applkey +ara +at +at-mac +at-nodeadkeys +atari-de +atari-se +atari-uk-falcon +atari-us +az +azerty +ba +ba-alternatequotes +ba-unicode +ba-unicodeus +ba-us +backspace +bashkir +be +be-iso-alternate +be-latin1 +be-nodeadkeys +be-oss +be-oss_latin9 +be-wang +bg-cp1251 +bg-cp855 +bg_bds-cp1251 +bg_bds-utf8 +bg_pho-cp1251 +bg_pho-utf8 +bone +br +br-abnt +br-abnt-alt +br-abnt2 +br-abnt2-old +br-dvorak +br-latin1-abnt2 +br-latin1-us +br-nativo +br-nativo-epo +br-nativo-us +br-nodeadkeys +br-thinkpad +by +by-cp1251 +by-latin +bywin-cp1251 +ca +ca-eng +ca-fr-dvorak +ca-fr-legacy +ca-multix +carpalx +carpalx-full +cf +ch +ch-de_mac +ch-de_nodeadkeys +ch-fr +ch-fr_mac +ch-fr_nodeadkeys +ch-legacy +chinese +cm +cm-azerty +cm-dvorak +cm-french +cm-mmuock +cm-qwerty +cn +cn-altgr-pinyin +cn-latin1 +croat +ctrl +cz +cz-bksl +cz-cp1250 +cz-dvorak-ucw +cz-lat2 +cz-lat2-prog +cz-lat2-us +cz-qwerty +cz-qwerty-mac +cz-qwerty_bksl +cz-rus +cz-us-qwertz +cz-winkeys +cz-winkeys-qwerty +de +de-T3 +de-deadacute +de-deadgraveacute +de-deadtilde +de-dsb +de-dsb_qwertz +de-dvorak +de-e1 +de-e2 +de-latin1 +de-latin1-nodeadkeys +de-mac +de-mac_nodeadkeys +de-mobii +de-neo +de-nodeadkeys +de-qwerty +de-ro +de-ro_nodeadkeys +de-tr +de-us +de_CH-latin1 +de_alt_UTF-8 +defkeymap +defkeymap_V1.0 +dk +dk-dvorak +dk-latin1 +dk-mac +dk-mac_nodeadkeys +dk-nodeadkeys +dk-winkeys +dvorak +dvorak-ca-fr +dvorak-de +dvorak-es +dvorak-fr +dvorak-l +dvorak-la +dvorak-no +dvorak-programmer +dvorak-r +dvorak-ru +dvorak-sv-a1 +dvorak-sv-a5 +dvorak-uk +dvorak-ukp +dz +dz-azerty-deadkeys +dz-qwerty-gb-deadkeys +dz-qwerty-us-deadkeys +ee +ee-dvorak +ee-nodeadkeys +ee-us +emacs +emacs2 +en +en-latin9 +epo +epo-legacy +es +es-ast +es-cat +es-cp850 +es-deadtilde +es-dvorak +es-nodeadkeys +es-olpc +es-winkeys +et +et-nodeadkeys +euro +euro1 +euro2 +fa +fi +fi-classic +fi-kotoistus +fi-mac +fi-nodeadkeys +fi-smi +fi-winkeys +fo +fo-nodeadkeys +fr +fr-afnor +fr-azerty +fr-bepo +fr-bepo-latin9 +fr-bepo_afnor +fr-bepo_latin9 +fr-bre +fr-dvorak +fr-latin1 +fr-latin9 +fr-latin9_nodeadkeys +fr-mac +fr-nodeadkeys +fr-oci +fr-oss +fr-oss_latin9 +fr-oss_nodeadkeys +fr-pc +fr-us +fr_CH +fr_CH-latin1 +gb +gb-colemak +gb-colemak_dh +gb-dvorak +gb-dvorakukp +gb-extd +gb-gla +gb-intl +gb-mac +gb-mac_intl +gb-pl +ge +ge-ergonomic +ge-mess +ge-ru +gh +gh-akan +gh-avn +gh-ewe +gh-fula +gh-ga +gh-generic +gh-gillbt +gh-hausa +gr +gr-pc +hr +hr-alternatequotes +hr-unicode +hr-unicodeus +hr-us +hu +hu-101_qwerty_comma_dead +hu-101_qwerty_comma_nodead +hu-101_qwerty_dot_dead +hu-101_qwerty_dot_nodead +hu-101_qwertz_comma_dead +hu-101_qwertz_comma_nodead +hu-101_qwertz_dot_dead +hu-101_qwertz_dot_nodead +hu-102_qwerty_comma_dead +hu-102_qwerty_comma_nodead +hu-102_qwerty_dot_dead +hu-102_qwerty_dot_nodead +hu-102_qwertz_comma_dead +hu-102_qwertz_comma_nodead +hu-102_qwertz_dot_dead +hu-102_qwertz_dot_nodead +hu-nodeadkeys +hu-qwerty +hu-standard +hu101 +id +ie +ie-CloGaelach +ie-UnicodeExpert +ie-ogam_is434 +il +il-heb +il-phonetic +il-si2 +in-eng +in-iipa +iq-ku +iq-ku_alt +iq-ku_ara +iq-ku_f +ir +ir-ku +ir-ku_alt +ir-ku_ara +ir-ku_f +is +is-dvorak +is-latin1 +is-latin1-us +is-mac +is-mac_legacy +it +it-fur +it-geo +it-ibm +it-intl +it-mac +it-nodeadkeys +it-scn +it-us +it-winkeys +it2 +jp +jp-OADG109A +jp-dvorak +jp-kana86 +jp106 +kazakh +ke +ke-kik +keypad +khmer +koy +kr +kr-kr104 +ky_alt_sh-UTF-8 +kyrgyz +kz-latin +la-latin1 +latam +latam-colemak +latam-deadtilde +latam-dvorak +latam-nodeadkeys +lk-us +lt +lt-ibm +lt-lekp +lt-lekpa +lt-ratise +lt-sgs +lt-std +lt-us +lt.baltic +lt.l4 +lt.std +lv +lv-adapted +lv-apostrophe +lv-ergonomic +lv-fkey +lv-modern +lv-tilde +ma-french +ma-rif +mac-Pl02 +mac-be +mac-br-abnt2 +mac-cz-us-qwertz +mac-de-latin1 +mac-de-latin1-nodeadkeys +mac-de_CH +mac-dk-latin1 +mac-dvorak +mac-es +mac-euro +mac-euro2 +mac-fi-latin1 +mac-fr +mac-fr-legacy +mac-fr_CH-latin1 +mac-gr +mac-hu +mac-it +mac-jp106 +mac-no-latin1 +mac-pl +mac-pt-latin1 +mac-ru1 +mac-se +mac-template +mac-uk +mac-us +md +md-gag +me +me-latinalternatequotes +me-latinunicode +me-latinunicodeyz +me-latinyz +mk +mk-cp1251 +mk-utf +mk0 +ml +ml-fr-oss +ml-us-intl +ml-us-mac +mm +mm-mnw +mm-shn +mod-dh-ansi-us +mod-dh-ansi-us-awing +mod-dh-ansi-us-fatz +mod-dh-ansi-us-fatz-wide +mod-dh-ansi-us-wide +mod-dh-iso-uk +mod-dh-iso-uk-wide +mod-dh-iso-us +mod-dh-iso-us-wide +mod-dh-matrix-us +mt +mt-alt-gb +mt-alt-us +mt-us +neo +neoqwertz +ng +ng-hausa +ng-igbo +ng-yoruba +nl +nl-mac +nl-std +nl-us +nl2 +no +no-colemak +no-colemak_dh +no-colemak_dh_wide +no-dvorak +no-latin1 +no-mac +no-mac_nodeadkeys +no-nodeadkeys +no-smi +no-smi_nodeadkeys +no-winkeys +nz +nz-mao +pc110 +ph +ph-capewell-dvorak +ph-capewell-qwerf2k6 +ph-colemak +ph-dvorak +pl +pl-csb +pl-dvorak +pl-dvorak_altquotes +pl-dvorak_quotes +pl-dvp +pl-legacy +pl-qwertz +pl-szl +pl1 +pl2 +pl3 +pl4 +pt +pt-latin1 +pt-latin9 +pt-mac +pt-mac_nodeadkeys +pt-nativo +pt-nativo-epo +pt-nativo-us +pt-nodeadkeys +ro +ro-latin2 +ro-std +ro-winkeys +ro_std +ro_win +rs-latin +rs-latinalternatequotes +rs-latinunicode +rs-latinunicodeyz +rs-latinyz +ru +ru-cp1251 +ru-cv_latin +ru-ms +ru-ruchey_en +ru-yawerty +ru1 +ru1_win-utf +ru2 +ru3 +ru4 +ru_win +ruwin_alt-CP1251 +ruwin_alt-KOI8-R +ruwin_alt-UTF-8 +ruwin_alt_sh-UTF-8 +ruwin_cplk-CP1251 +ruwin_cplk-KOI8-R +ruwin_cplk-UTF-8 +ruwin_ct_sh-CP1251 +ruwin_ct_sh-KOI8-R +ruwin_ct_sh-UTF-8 +ruwin_ctrl-CP1251 +ruwin_ctrl-KOI8-R +ruwin_ctrl-UTF-8 +se +se-dvorak +se-fi-ir209 +se-fi-lat6 +se-ir209 +se-lat6 +se-latin1 +se-mac +se-nodeadkeys +se-smi +se-svdvorak +se-us +se-us_dvorak +sg +sg-latin1 +sg-latin1-lk450 +si +si-alternatequotes +si-us +sk +sk-bksl +sk-prog-qwerty +sk-prog-qwertz +sk-qwerty +sk-qwerty_bksl +sk-qwertz +slovene +sr-cy +sr-latin +sun-pl +sun-pl-altgraph +sundvorak +sunkeymap +sunt4-es +sunt4-fi-latin1 +sunt4-no-latin1 +sunt5-cz-us +sunt5-de-latin1 +sunt5-es +sunt5-fi-latin1 +sunt5-fr-latin1 +sunt5-ru +sunt5-uk +sunt5-us-cz +sunt6-uk +sv-latin1 +sy-ku +sy-ku_alt +sy-ku_f +taiwanese +tj_alt-UTF8 +tm +tm-alt +tr +tr-alt +tr-e +tr-f +tr-intl +tr-ku +tr-ku_alt +tr-ku_f +tr_f-latin5 +tr_q-latin5 +tralt +trf +trq +ttwin_alt-UTF-8 +ttwin_cplk-UTF-8 +ttwin_ct_sh-UTF-8 +ttwin_ctrl-UTF-8 +tw +tw-indigenous +tw-saisiyat +ua +ua-cp1251 +ua-crh +ua-crh_alt +ua-crh_f +ua-utf +ua-utf-ws +ua-ws +uk +unicode +us +us-acentos +us-acentos-old +us-alt-intl +us-altgr-intl +us-colemak +us-colemak_dh +us-colemak_dh_iso +us-colemak_dh_ortho +us-colemak_dh_wide +us-colemak_dh_wide_iso +us-dvorak +us-dvorak-alt-intl +us-dvorak-classic +us-dvorak-intl +us-dvorak-l +us-dvorak-mac +us-dvorak-r +us-dvp +us-euro +us-haw +us-hbs +us-intl +us-mac +us-norman +us-olpc2 +us-symbolic +us-workman +us-workman-intl +us1 +uz-latin +vn +vn-fr +vn-us +wangbe +wangbe2 +windowkeys diff --git a/rust/share/localectl-list-locale.txt b/rust/share/localectl-list-locale.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/rust/share/localectl-list-locales.txt b/rust/share/localectl-list-locales.txt new file mode 100644 index 0000000000..a3da6481d4 --- /dev/null +++ b/rust/share/localectl-list-locales.txt @@ -0,0 +1,151 @@ +C.UTF-8 +aa_DJ.UTF-8 +af_ZA.UTF-8 +an_ES.UTF-8 +ar_AE.UTF-8 +ar_BH.UTF-8 +ar_DZ.UTF-8 +ar_EG.UTF-8 +ar_IQ.UTF-8 +ar_JO.UTF-8 +ar_KW.UTF-8 +ar_LB.UTF-8 +ar_LY.UTF-8 +ar_MA.UTF-8 +ar_OM.UTF-8 +ar_QA.UTF-8 +ar_SA.UTF-8 +ar_SD.UTF-8 +ar_SY.UTF-8 +ar_TN.UTF-8 +ar_YE.UTF-8 +ast_ES.UTF-8 +be_BY.UTF-8 +bg_BG.UTF-8 +bhb_IN.UTF-8 +br_FR.UTF-8 +bs_BA.UTF-8 +ca_AD.UTF-8 +ca_ES.UTF-8 +ca_FR.UTF-8 +ca_IT.UTF-8 +cs_CZ.UTF-8 +cy_GB.UTF-8 +da_DK.UTF-8 +de_AT.UTF-8 +de_BE.UTF-8 +de_CH.UTF-8 +de_DE.UTF-8 +de_IT.UTF-8 +de_LI.UTF-8 +de_LU.UTF-8 +el_CY.UTF-8 +el_GR.UTF-8 +en_AU.UTF-8 +en_BW.UTF-8 +en_CA.UTF-8 +en_DK.UTF-8 +en_GB.UTF-8 +en_HK.UTF-8 +en_IE.UTF-8 +en_NZ.UTF-8 +en_PH.UTF-8 +en_SC.UTF-8 +en_SG.UTF-8 +en_US.UTF-8 +en_ZA.UTF-8 +en_ZW.UTF-8 +es_AR.UTF-8 +es_BO.UTF-8 +es_CL.UTF-8 +es_CO.UTF-8 +es_CR.UTF-8 +es_DO.UTF-8 +es_EC.UTF-8 +es_ES.UTF-8 +es_GT.UTF-8 +es_HN.UTF-8 +es_MX.UTF-8 +es_NI.UTF-8 +es_PA.UTF-8 +es_PE.UTF-8 +es_PR.UTF-8 +es_PY.UTF-8 +es_SV.UTF-8 +es_US.UTF-8 +es_UY.UTF-8 +es_VE.UTF-8 +et_EE.UTF-8 +eu_ES.UTF-8 +fi_FI.UTF-8 +fo_FO.UTF-8 +fr_BE.UTF-8 +fr_CA.UTF-8 +fr_CH.UTF-8 +fr_FR.UTF-8 +fr_LU.UTF-8 +ga_IE.UTF-8 +gd_GB.UTF-8 +gl_ES.UTF-8 +gv_GB.UTF-8 +he_IL.UTF-8 +hr_HR.UTF-8 +hsb_DE.UTF-8 +hu_HU.UTF-8 +id_ID.UTF-8 +is_IS.UTF-8 +it_CH.UTF-8 +it_IT.UTF-8 +ja_JP.UTF-8 +ka_GE.UTF-8 +kk_KZ.UTF-8 +kl_GL.UTF-8 +ko_KR.UTF-8 +ku_TR.UTF-8 +kw_GB.UTF-8 +lg_UG.UTF-8 +lt_LT.UTF-8 +lv_LV.UTF-8 +mg_MG.UTF-8 +mi_NZ.UTF-8 +mk_MK.UTF-8 +ms_MY.UTF-8 +mt_MT.UTF-8 +nb_NO.UTF-8 +nl_BE.UTF-8 +nl_NL.UTF-8 +nn_NO.UTF-8 +no_NO.UTF-8 +oc_FR.UTF-8 +om_KE.UTF-8 +pl_PL.UTF-8 +pt_BR.UTF-8 +pt_PT.UTF-8 +ro_RO.UTF-8 +ru_RU.UTF-8 +ru_UA.UTF-8 +sk_SK.UTF-8 +sl_SI.UTF-8 +so_DJ.UTF-8 +so_KE.UTF-8 +so_SO.UTF-8 +sq_AL.UTF-8 +st_ZA.UTF-8 +sv_FI.UTF-8 +sv_SE.UTF-8 +tcy_IN.UTF-8 +tg_TJ.UTF-8 +th_TH.UTF-8 +tl_PH.UTF-8 +tr_CY.UTF-8 +tr_TR.UTF-8 +uk_UA.UTF-8 +uz_UZ.UTF-8 +wa_BE.UTF-8 +xh_ZA.UTF-8 +yi_US.UTF-8 +zh_CN.UTF-8 +zh_HK.UTF-8 +zh_SG.UTF-8 +zh_TW.UTF-8 +zu_ZA.UTF-8 diff --git a/service/agama.gemspec b/service/agama-yast.gemspec similarity index 91% rename from service/agama.gemspec rename to service/agama-yast.gemspec index 62dbdba14f..d93dfdd3fd 100644 --- a/service/agama.gemspec +++ b/service/agama-yast.gemspec @@ -1,7 +1,7 @@ # frozen_string_literal: true # -# Copyright (c) [2022] SUSE LLC +# Copyright (c) 2022-2024 SUSE LLC # # All Rights Reserved. # @@ -21,7 +21,7 @@ # find current contact information at www.suse.com. Gem::Specification.new do |spec| - spec.name = "agama" + spec.name = "agama-yast" # in a git checkout? if File.exist?(File.join(__dir__, "../.git")) @@ -33,8 +33,8 @@ Gem::Specification.new do |spec| spec.version = "99.yupdate" end - spec.summary = "Agama Installer Service" - spec.description = "System service for Agama, an experimental YaST-based installer." + spec.summary = "YaST integration service for Agama" + spec.description = "D-Bus service exposing some YaST features that are useful for Agama." spec.author = "YaST Team" spec.email = "yast-devel@opensuse.org" spec.homepage = "https://github.com/openSUSE/agama" diff --git a/service/package/gem2rpm.yml b/service/package/gem2rpm.yml index 142916e9d2..fef1bc79db 100644 --- a/service/package/gem2rpm.yml +++ b/service/package/gem2rpm.yml @@ -23,6 +23,7 @@ :preamble: |- # Override build.rpm, see also https://github.com/openSUSE/obs-build/blob/master/configs/ %global rb_build_versions %{rb_default_ruby} + Provides: agama-yast BuildRequires: dbus-1-common Requires: dbus-1-common Requires: suseconnect-ruby-bindings diff --git a/service/package/rubygem-agama.changes b/service/package/rubygem-agama-yast.changes similarity index 99% rename from service/package/rubygem-agama.changes rename to service/package/rubygem-agama-yast.changes index 8c07ea0b36..5f51032451 100644 --- a/service/package/rubygem-agama.changes +++ b/service/package/rubygem-agama-yast.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Feb 27 15:53:46 UTC 2024 - Imobach Gonzalez Sosa + +- Rename the gem to agama-yast and the package to + rubygem-agama-yast (gh#openSUSE/agama#1056). + ------------------------------------------------------------------- Tue Feb 20 13:15:15 UTC 2024 - José Iván López González diff --git a/setup-services.sh b/setup-services.sh index 4f54260ce4..ee647418d1 100755 --- a/setup-services.sh +++ b/setup-services.sh @@ -121,7 +121,7 @@ fi # Only install cargo if it is not available (avoid conflicts with rustup) which cargo || $SUDO zypper --non-interactive install cargo -# Packages required by Rust code (see ./rust/package/agama-cli.spec) +# Packages required by Rust code (see ./rust/package/agama.spec) $SUDO zypper --non-interactive install \ bzip2 \ clang-devel \ diff --git a/web/package/cockpit-agama.changes b/web/package/cockpit-agama.changes index a28b65bab7..792f22ff75 100644 --- a/web/package/cockpit-agama.changes +++ b/web/package/cockpit-agama.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Mon Feb 26 20:46:45 UTC 2024 - Josef Reidinger + +- Remove fs type option "Btrfs with snapshots" and create instead + global option that affects only root volume + (gh#openSUSE/agama#1039) + ------------------------------------------------------------------- Thu Feb 22 14:05:56 UTC 2024 - David Diaz diff --git a/web/po/cs.po b/web/po/cs.po index 9d03f2c337..4257f9c802 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-02-18 02:07+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" "PO-Revision-Date: 2023-12-31 20:39+0000\n" "Last-Translator: Ladislav Slezák \n" "Language-Team: Czech LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +msgid "File systems" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1247,40 +1266,161 @@ msgid "" "first run." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 msgid "Change encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +msgid "Custom" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +msgid "Used device" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +msgid "Current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +msgid "Action" +msgstr "" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, c-format +msgid "%s partition table" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +msgid "EFI system partition" +msgstr "" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, c-format +msgid "%s file system" +msgstr "" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, c-format +msgid "Member of RAID %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +msgid "Actions to find space" +msgstr "" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +msgid "Find Space" +msgstr "" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." msgstr "" #. TRANSLATORS: header for a list of items @@ -1349,11 +1489,6 @@ msgstr "" msgid "transactional" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "" @@ -1364,23 +1499,10 @@ msgstr "" msgid "Mount point" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "" - #: src/components/storage/VolumeForm.jsx:102 msgid "Select a value" msgstr "" @@ -1836,71 +1958,6 @@ msgstr "" msgid "Targets" msgstr "" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "" diff --git a/web/po/de.po b/web/po/de.po index 261ab6acfd..077d1dc8fc 100644 --- a/web/po/de.po +++ b/web/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-18 02:07+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" "PO-Revision-Date: 2023-12-31 20:39+0000\n" "Last-Translator: anonymous \n" "Language-Team: German LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +msgid "File systems" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1242,40 +1261,161 @@ msgid "" "first run." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 msgid "Change encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +msgid "Custom" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +msgid "Used device" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +msgid "Current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +msgid "Action" +msgstr "" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, c-format +msgid "%s partition table" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +msgid "EFI system partition" +msgstr "" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, c-format +msgid "%s file system" +msgstr "" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, c-format +msgid "Member of RAID %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +msgid "Actions to find space" +msgstr "" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +msgid "Find Space" +msgstr "" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." msgstr "" #. TRANSLATORS: header for a list of items @@ -1344,11 +1484,6 @@ msgstr "" msgid "transactional" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "" @@ -1359,23 +1494,10 @@ msgstr "" msgid "Mount point" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "" - #: src/components/storage/VolumeForm.jsx:102 msgid "Select a value" msgstr "" @@ -1831,68 +1953,6 @@ msgstr "" msgid "Targets" msgstr "" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "" -msgstr[1] "" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "" -msgstr[1] "" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "" -msgstr[1] "" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "" diff --git a/web/po/es.po b/web/po/es.po index 29b9462cf0..cf07647938 100644 --- a/web/po/es.po +++ b/web/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-18 02:07+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" "PO-Revision-Date: 2024-02-09 13:42+0000\n" "Last-Translator: Victor hck \n" "Language-Team: Spanish LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +#, fuzzy +msgid "File systems" +msgstr "Tipo de sistema de archivos" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "Administrar y formatear" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "Activar discos" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "zFCP" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "Conectar a objetivos iSCSI" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "iSCSI" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1286,43 +1307,177 @@ msgstr "" "integridad del sistema. El sellado TPM requiere que el nuevo sistema se " "inicie directamente en su primera ejecución." -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "Utilice el TPM para descifrar automáticamente en cada arranque" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 msgid "Change encryption settings" msgstr "Cambiar las configuraciones de cifrado" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "Configuraciones del cifrado" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "Usar cifrado" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "Ajustes" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "Eliminar el contenido actual" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" +"Se eliminarán todas las particiones y se perderán todos los datos de los " +"discos." + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "Reducir las particiones existentes" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +#, fuzzy +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" +"Los datos se conservan, pero las particiones actuales cambiarán de tamaño " +"según sea necesario para crear espacio suficiente." + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "Utilice el espacio disponible" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 +#, fuzzy msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -"Seleccione cómo liberar espacio en los discos seleccionados para asignar los " -"sistemas de archivos." +"Los datos se conservan y las particiones existentes no se modificarán. Sólo " +"se utilizará el espacio que no esté asignado a ninguna partición." -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" -msgstr "Encontrar espacio" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +#, fuzzy +msgid "Custom" +msgstr "Dispositivos personalizados" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" -msgstr "Política de espacio" +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." +msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" -msgstr "Ajustes" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +#, fuzzy +msgid "Used device" +msgstr "Leer dispositivos zFCP" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +#, fuzzy +msgid "Current content" +msgstr "Eliminar el contenido actual" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "Tamaño" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "Detalles" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +#, fuzzy +msgid "Action" +msgstr "Acciones" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, fuzzy, c-format +msgid "%s partition table" +msgstr "partición" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +#, fuzzy +msgid "EFI system partition" +msgstr "partición" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, fuzzy, c-format +msgid "%s file system" +msgstr "Agregar sistema de archivos" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, fuzzy, c-format +msgid "Member of RAID %s" +msgstr "Miembros: %s" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "Eliminar" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +#, fuzzy +msgid "Actions to find space" +msgstr "Acciones para la conexión %s" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +#, fuzzy +msgid "Find Space" +msgstr "Encontrar espacio" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." +msgstr "" #. TRANSLATORS: header for a list of items #: src/components/storage/ProposalVolumes.jsx:59 @@ -1390,11 +1545,6 @@ msgstr "con instantáneas" msgid "transactional" msgstr "transaccional" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "Eliminar" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "Editar sistema de archivos" @@ -1405,23 +1555,10 @@ msgstr "Editar sistema de archivos" msgid "Mount point" msgstr "Punto de montaje" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "Detalles" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "Tamaño" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "Tabla con puntos de montaje" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "Sistemas de archivos para crear en su sistema" - #: src/components/storage/VolumeForm.jsx:102 msgid "Select a value" msgstr "Seleccionar un valor" @@ -1890,75 +2027,6 @@ msgstr "Descubrir" msgid "Targets" msgstr "Objetivos" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "Eliminar el contenido actual" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "Reducir las particiones existentes" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "Utilice el espacio disponible" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" -"Se eliminarán todas las particiones y se perderán todos los datos de los " -"discos." - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" -"Los datos se conservan, pero las particiones actuales cambiarán de tamaño " -"según sea necesario para crear espacio suficiente." - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" -"Los datos se conservan y las particiones existentes no se modificarán. Sólo " -"se utilizará el espacio que no esté asignado a ninguna partición." - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "Seleccione un mecanismo para hacer espacio" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "eliminar todo el contenido del dispositivo de instalación" -msgstr[1] "eliminar todo el contenido de los %d discos seleccionados" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "Reduccir las particiones del dispositivo de instalación" -msgstr[1] "Reduccir las particiones de los %d discos seleccionados" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "sin modificar ninguna partición" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "Esto sólo afectará al dispositivo de instalación" -msgstr[1] "" -"Esto sólo afectará a los %d discos seleccionados para la instalación" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "KB" @@ -2140,6 +2208,48 @@ msgstr "Usuario" msgid "Root authentication" msgstr "Autenticación de root" +#~ msgid "Devices will not be modified until installation starts." +#~ msgstr "" +#~ "Los dispositivos no se modificarán hasta que comience la instalación." + +#~ msgid "File systems to create in your system" +#~ msgstr "Sistemas de archivos para crear en su sistema" + +#~ msgid "" +#~ "Select how to make free space in the disks selected for allocating " +#~ "the file systems." +#~ msgstr "" +#~ "Seleccione cómo liberar espacio en los discos seleccionados para asignar " +#~ "los sistemas de archivos." + +#~ msgid "Space Policy" +#~ msgstr "Política de espacio" + +#~ msgid "Select a mechanism to make space" +#~ msgstr "Seleccione un mecanismo para hacer espacio" + +#, c-format +#~ msgid "deleting all content of the installation device" +#~ msgid_plural "deleting all content of the %d selected disks" +#~ msgstr[0] "eliminar todo el contenido del dispositivo de instalación" +#~ msgstr[1] "eliminar todo el contenido de los %d discos seleccionados" + +#, c-format +#~ msgid "shrinking partitions of the installation device" +#~ msgid_plural "shrinking partitions of the %d selected disks" +#~ msgstr[0] "Reduccir las particiones del dispositivo de instalación" +#~ msgstr[1] "Reduccir las particiones de los %d discos seleccionados" + +#~ msgid "without modifying any partition" +#~ msgstr "sin modificar ninguna partición" + +#, c-format +#~ msgid "This will only affect the installation device" +#~ msgid_plural "This will affect the %d disks selected for installation" +#~ msgstr[0] "Esto sólo afectará al dispositivo de instalación" +#~ msgstr[1] "" +#~ "Esto sólo afectará a los %d discos seleccionados para la instalación" + #, c-format #~ msgid "Edit %s connection" #~ msgstr "Editar %s conexión" diff --git a/web/po/fr.po b/web/po/fr.po index 5b2cca83da..16590e40d9 100644 --- a/web/po/fr.po +++ b/web/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-18 02:07+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" "PO-Revision-Date: 2024-01-23 12:59+0000\n" "Last-Translator: faila fail \n" "Language-Team: French LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +#, fuzzy +msgid "File systems" +msgstr "Type de système de fichiers" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "Gérer et formater" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "Activer les disques" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "zFCP" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "Se connecter aux cibles iSCSI" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "iSCSI" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1301,44 +1320,177 @@ msgstr "" "l'intégrité du système. Le scellement par TPM exige que le nouveau système " "soit démarré directement lors de sa première exécution." -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "Utiliser le TPM pour décrypter automatiquement à chaque démarrage" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 msgid "Change encryption settings" msgstr "Modifier les paramètres de chiffrement" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "Paramètres de chiffrement" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "Utiliser le chiffrement" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "Paramètres" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "Supprimer le contenu actuel" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" +"Toutes les partitions seront supprimées et toutes les données contenues dans " +"les disques seront perdues." + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "Réduire les partitions existantes" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +#, fuzzy +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" +"Les données sont conservées, mais les partitions actuelles seront " +"redimensionnées si nécessaire pour libérer de l'espace." + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "Utiliser l'espace disponible" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 +#, fuzzy msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -"Sélectionnez la manière de libérer de l'espace sur les disques sélectionnés " -"pour l'allocation des systèmes de fichiers." +"Les données sont conservées et les partitions existantes ne seront pas " +"modifiées. Seul l'espace qui n'est attribué à aucune partition sera utilisé." -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" -msgstr "Trouver de l'espace" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +#, fuzzy +msgid "Custom" +msgstr "Périphériques personnalisés" -#: src/components/storage/ProposalSettingsSection.jsx:631 +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:72 #, fuzzy -msgid "Space Policy" -msgstr "Politique sur l'espace" +msgid "Used device" +msgstr "Lire les périphériques zFCP" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" -msgstr "Paramètres" +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +#, fuzzy +msgid "Current content" +msgstr "Supprimer le contenu actuel" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "Taille" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "Détails" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +#, fuzzy +msgid "Action" +msgstr "Actions" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, fuzzy, c-format +msgid "%s partition table" +msgstr "partition" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +#, fuzzy +msgid "EFI system partition" +msgstr "partition" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, fuzzy, c-format +msgid "%s file system" +msgstr "Ajouter un système de fichiers" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, fuzzy, c-format +msgid "Member of RAID %s" +msgstr "Membres : %s" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "Supprimer" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +#, fuzzy +msgid "Actions to find space" +msgstr "Actions concernant la connexion %s" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +#, fuzzy +msgid "Find Space" +msgstr "Trouver de l'espace" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." +msgstr "" #. TRANSLATORS: header for a list of items #: src/components/storage/ProposalVolumes.jsx:59 @@ -1406,11 +1558,6 @@ msgstr "avec des clichés" msgid "transactional" msgstr "transactionnel" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "Supprimer" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "Modifier le système de fichiers" @@ -1421,23 +1568,10 @@ msgstr "Modifier le système de fichiers" msgid "Mount point" msgstr "Point de montage" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "Détails" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "Taille" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "Table avec points de montage" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "Systèmes de fichiers à créer dans votre système" - #: src/components/storage/VolumeForm.jsx:102 msgid "Select a value" msgstr "Sélectionner une valeur" @@ -1907,74 +2041,6 @@ msgstr "Découvrir" msgid "Targets" msgstr "Cibles" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "Supprimer le contenu actuel" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "Réduire les partitions existantes" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "Utiliser l'espace disponible" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" -"Toutes les partitions seront supprimées et toutes les données contenues dans " -"les disques seront perdues." - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" -"Les données sont conservées, mais les partitions actuelles seront " -"redimensionnées si nécessaire pour libérer de l'espace." - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" -"Les données sont conservées et les partitions existantes ne seront pas " -"modifiées. Seul l'espace qui n'est attribué à aucune partition sera utilisé." - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "Sélectionner un mécanisme pour faire de la place" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "suppression de tout le contenu du périphérique d'installation" -msgstr[1] "suppression de tout le contenu des %d disques sélectionnés" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "réduction des partitions du périphérique d'installation" -msgstr[1] "réduction des partitions des %d disques sélectionnés" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "sans modifier aucune partition" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "Cela n'affectera que le périphérique d'installation" -msgstr[1] "Cela affectera les %d disques sélectionnés pour l'installation" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "KiB" @@ -2156,6 +2222,49 @@ msgstr "Utilisateur" msgid "Root authentication" msgstr "Authentification root" +#~ msgid "Devices will not be modified until installation starts." +#~ msgstr "" +#~ "Les périphériques ne seront pas modifiés tant que l'installation n'aura " +#~ "pas commencé." + +#~ msgid "File systems to create in your system" +#~ msgstr "Systèmes de fichiers à créer dans votre système" + +#~ msgid "" +#~ "Select how to make free space in the disks selected for allocating " +#~ "the file systems." +#~ msgstr "" +#~ "Sélectionnez la manière de libérer de l'espace sur les disques " +#~ "sélectionnés pour l'allocation des systèmes de fichiers." + +#, fuzzy +#~ msgid "Space Policy" +#~ msgstr "Politique sur l'espace" + +#~ msgid "Select a mechanism to make space" +#~ msgstr "Sélectionner un mécanisme pour faire de la place" + +#, c-format +#~ msgid "deleting all content of the installation device" +#~ msgid_plural "deleting all content of the %d selected disks" +#~ msgstr[0] "suppression de tout le contenu du périphérique d'installation" +#~ msgstr[1] "suppression de tout le contenu des %d disques sélectionnés" + +#, c-format +#~ msgid "shrinking partitions of the installation device" +#~ msgid_plural "shrinking partitions of the %d selected disks" +#~ msgstr[0] "réduction des partitions du périphérique d'installation" +#~ msgstr[1] "réduction des partitions des %d disques sélectionnés" + +#~ msgid "without modifying any partition" +#~ msgstr "sans modifier aucune partition" + +#, c-format +#~ msgid "This will only affect the installation device" +#~ msgid_plural "This will affect the %d disks selected for installation" +#~ msgstr[0] "Cela n'affectera que le périphérique d'installation" +#~ msgstr[1] "Cela affectera les %d disques sélectionnés pour l'installation" + #, c-format #~ msgid "Edit %s connection" #~ msgstr "Modifier la connexion %s" diff --git a/web/po/id.po b/web/po/id.po index 5681c76990..b31b978f88 100644 --- a/web/po/id.po +++ b/web/po/id.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-18 02:07+0000\n" -"PO-Revision-Date: 2024-01-12 18:59+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" +"PO-Revision-Date: 2024-02-21 04:42+0000\n" "Last-Translator: Arif Budiman \n" "Language-Team: Indonesian \n" @@ -155,10 +155,9 @@ msgstr "" #: src/components/product/ProductPage.jsx:71 #: src/components/product/ProductPage.jsx:140 #: src/components/product/ProductPage.jsx:207 -#: src/components/storage/ProposalSettingsSection.jsx:172 -#: src/components/storage/ProposalSettingsSection.jsx:367 -#: src/components/storage/ProposalSettingsSection.jsx:551 -#: src/components/storage/ProposalSettingsSection.jsx:647 +#: src/components/storage/ProposalDeviceSection.jsx:169 +#: src/components/storage/ProposalDeviceSection.jsx:364 +#: src/components/storage/ProposalSettingsSection.jsx:211 #: src/components/storage/ProposalVolumes.jsx:148 #: src/components/storage/ProposalVolumes.jsx:283 #: src/components/storage/ZFCPPage.jsx:511 @@ -172,22 +171,23 @@ msgstr "Instal" #: src/components/core/InstallationFinished.jsx:41 msgid "TPM sealing requires the new system to be booted directly." -msgstr "" +msgstr "Penyegelan TPM mengharuskan sistem baru untuk di-boot secara langsung." #: src/components/core/InstallationFinished.jsx:46 msgid "" "If a local media was used to run this installer, remove it before the next " "boot." msgstr "" +"Jika media lokal digunakan untuk menjalankan penginstalasi ini, hapus media " +"tersebut sebelum boot berikutnya." #: src/components/core/InstallationFinished.jsx:50 -#, fuzzy msgid "Hide details" -msgstr "Detail" +msgstr "Sembunyikan detail" #: src/components/core/InstallationFinished.jsx:50 msgid "See more details" -msgstr "" +msgstr "Lihat detail lebih lanjut" #. TRANSLATORS: Do not translate 'abbr' and 'title', they are part of the HTML markup #: src/components/core/InstallationFinished.jsx:55 @@ -197,6 +197,10 @@ msgid "" "first boot of the new system. For that to work, the machine needs to boot " "directly to the new boot loader." msgstr "" +"Langkah terakhir untuk mengonfigurasi TPM agar secara otomatis membuka perangkat yang dienkripsi " +"akan dilakukan pada saat booting pertama dari sistem yang baru. Agar dapat " +"berfungsi, mesin harus melakukan booting langsung ke boot loader yang baru." #. TRANSLATORS: page title #: src/components/core/InstallationFinished.jsx:88 @@ -824,7 +828,7 @@ msgid "Software" msgstr "Perangkat lunak" #: src/components/overview/StorageSection.jsx:42 -#: src/components/storage/ProposalSettingsSection.jsx:132 +#: src/components/storage/ProposalDeviceSection.jsx:129 msgid "No device selected yet" msgstr "Belum ada perangkat yang dipilih" @@ -864,7 +868,7 @@ msgstr "Memeriksa perangkat penyimpanan" #. TRANSLATORS: page title #. TRANSLATORS: page section title #: src/components/overview/StorageSection.jsx:208 -#: src/components/storage/ProposalPage.jsx:232 +#: src/components/storage/ProposalPage.jsx:239 msgid "Storage" msgstr "Penyimpanan" @@ -992,9 +996,8 @@ msgid "No products available for selection" msgstr "Tidak ada produk yang tersedia untuk dipilih" #: src/components/product/ProductSelector.jsx:42 -#, fuzzy msgid "Available products" -msgstr "Lokal yang tersedia" +msgstr "Produk yang tersedia" #: src/components/questions/GenericQuestion.jsx:35 #: src/components/questions/LuksActivationQuestion.jsx:60 @@ -1084,7 +1087,9 @@ msgstr "ID saluran" msgid "Status" msgstr "Status" +#. TRANSLATORS: The storage "Device" section's title #: src/components/storage/DASDTable.jsx:66 +#: src/components/storage/ProposalDeviceSection.jsx:423 msgid "Device" msgstr "Perangkat" @@ -1160,77 +1165,60 @@ msgid "Storage iSCSI" msgstr "Penyimpanan iSCSI" #. TRANSLATORS: show/hide toggle action, this is a clickable link -#: src/components/storage/ProposalActionsSection.jsx:71 +#: src/components/storage/ProposalActionsSection.jsx:70 #, c-format msgid "Hide %d subvolume action" msgid_plural "Hide %d subvolume actions" msgstr[0] "Menyembunyikan tindakan subvolume %d" #. TRANSLATORS: show/hide toggle action, this is a clickable link -#: src/components/storage/ProposalActionsSection.jsx:73 +#: src/components/storage/ProposalActionsSection.jsx:72 #, c-format msgid "Show %d subvolume action" msgid_plural "Show %d subvolume actions" msgstr[0] "Tampilkan tindakan subvolume %d" -#: src/components/storage/ProposalActionsSection.jsx:78 -msgid "Actions to create the file systems and to ensure the system boots." -msgstr "" -"Tindakan untuk membuat sistem berkas dan memastikan sistem melakukan booting." - -#. TRANSLATORS: section title, list of planned actions for the selected device, -#. e.g. "delete partition A", "create partition B with filesystem C", ... -#: src/components/storage/ProposalActionsSection.jsx:126 +#. TRANSLATORS: The storage "Planned Actions" section's title. The +#. section shows a list of planned actions for the selected device, e.g. +#. "delete partition A", "create partition B with filesystem C", ... +#: src/components/storage/ProposalActionsSection.jsx:124 msgid "Planned Actions" msgstr "Tindakan yang Direncanakan" -#: src/components/storage/ProposalPage.jsx:211 -msgid "Devices will not be modified until installation starts." -msgstr "Perangkat tidak akan dimodifikasi hingga penginstalan dimulai." - -#: src/components/storage/ProposalPageMenu.jsx:40 -msgid "Manage and format" -msgstr "Mengelola dan memformat" - -#: src/components/storage/ProposalPageMenu.jsx:58 -msgid "Activate disks" -msgstr "Mengaktifkan disk" - -#: src/components/storage/ProposalPageMenu.jsx:60 -msgid "zFCP" -msgstr "zFCP" - -#: src/components/storage/ProposalPageMenu.jsx:76 -msgid "Connect to iSCSI targets" -msgstr "Menyambungkan ke target iSCSI" +#. TRANSLATORS: The storage "Planned Actions" section's description +#: src/components/storage/ProposalActionsSection.jsx:126 +#, fuzzy +msgid "Actions to create the file systems and to ensure the new system boots." +msgstr "" +"Tindakan untuk membuat sistem berkas dan memastikan sistem melakukan booting." -#: src/components/storage/ProposalPageMenu.jsx:78 -msgid "iSCSI" -msgstr "iSCSI" +#: src/components/storage/ProposalDeviceSection.jsx:135 +msgid "Waiting for information about selected device" +msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:141 +#: src/components/storage/ProposalDeviceSection.jsx:138 msgid "Select the device for installing the system." msgstr "Pilih perangkat untuk menginstal sistem." -#: src/components/storage/ProposalSettingsSection.jsx:146 -#: src/components/storage/ProposalSettingsSection.jsx:150 -#: src/components/storage/ProposalSettingsSection.jsx:248 +#: src/components/storage/ProposalDeviceSection.jsx:143 +#: src/components/storage/ProposalDeviceSection.jsx:147 +#: src/components/storage/ProposalDeviceSection.jsx:245 msgid "Installation device" msgstr "Perangkat penginstalan" -#: src/components/storage/ProposalSettingsSection.jsx:156 +#: src/components/storage/ProposalDeviceSection.jsx:153 msgid "No devices found." msgstr "Tidak ada perangkat yang ditemukan." -#: src/components/storage/ProposalSettingsSection.jsx:245 +#: src/components/storage/ProposalDeviceSection.jsx:242 msgid "Devices for creating the volume group" msgstr "Perangkat untuk membuat grup volume" -#: src/components/storage/ProposalSettingsSection.jsx:254 +#: src/components/storage/ProposalDeviceSection.jsx:251 msgid "Custom devices" msgstr "Perangkat khusus" -#: src/components/storage/ProposalSettingsSection.jsx:318 +#: src/components/storage/ProposalDeviceSection.jsx:315 msgid "" "Configuration of the system volume group. All the file systems will be " "created in a logical volume of the system volume group." @@ -1238,27 +1226,64 @@ msgstr "" "Konfigurasi grup volume sistem. Semua sistem berkas akan dibuat dalam volume " "logis dari grup volume sistem." -#: src/components/storage/ProposalSettingsSection.jsx:324 +#: src/components/storage/ProposalDeviceSection.jsx:321 msgid "Configure the LVM settings" msgstr "Mengkonfigurasi pengaturan LVM" -#: src/components/storage/ProposalSettingsSection.jsx:329 -#: src/components/storage/ProposalSettingsSection.jsx:349 +#: src/components/storage/ProposalDeviceSection.jsx:326 +#: src/components/storage/ProposalDeviceSection.jsx:346 msgid "LVM settings" msgstr "Pengaturan LVM" -#: src/components/storage/ProposalSettingsSection.jsx:342 +#: src/components/storage/ProposalDeviceSection.jsx:333 +msgid "Waiting for information about LVM" +msgstr "" + +#: src/components/storage/ProposalDeviceSection.jsx:339 msgid "Use logical volume management (LVM)" msgstr "Gunakan manajemen volume logis (LVM)" -#: src/components/storage/ProposalSettingsSection.jsx:350 +#: src/components/storage/ProposalDeviceSection.jsx:347 msgid "System Volume Group" msgstr "Grup Volume Sistem" +#. TRANSLATORS: The storage "Device" sections's description. Do not +#. translate 'abbr' and 'title', they are part of the HTML markup. +#: src/components/storage/ProposalDeviceSection.jsx:414 +msgid "" +"Select the main disk or LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +#, fuzzy +msgid "File systems" +msgstr "Jenis sistem berkas" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "Mengelola dan memformat" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "Mengaktifkan disk" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "zFCP" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "Menyambungkan ke target iSCSI" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "iSCSI" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1266,44 +1291,176 @@ msgid "" "first run." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 #, fuzzy msgid "Change encryption settings" msgstr "Pengaturan enkripsi" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "Pengaturan enkripsi" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "Gunakan enkripsi" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "Pengaturan" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "Hapus konten saat ini" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "Semua partisi akan dihapus dan semua data dalam disk akan hilang." + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "Perkecil partisi yang ada" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +#, fuzzy +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" +"Data akan disimpan, namun partisi yang ada akan diubah ukurannya sesuai " +"kebutuhan untuk menyediakan ruang yang cukup." + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "Gunakan ruang yang tersedia" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 +#, fuzzy msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -"Memilih cara mengosongkan ruang pada disk yang dipilih untuk mengalokasikan " -"sistem berkas." +"Data akan disimpan dan partisi yang ada tidak akan diubah. Hanya ruang yang " +"tidak ditetapkan ke partisi mana pun yang akan digunakan." -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" -msgstr "Temukan ruang" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +#, fuzzy +msgid "Custom" +msgstr "Perangkat khusus" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" -msgstr "Kebijakan Ruang" +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." +msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" -msgstr "Pengaturan" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +#, fuzzy +msgid "Used device" +msgstr "Baca perangkat zFCP" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +#, fuzzy +msgid "Current content" +msgstr "Hapus konten saat ini" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "Ukuran" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "Detail" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +#, fuzzy +msgid "Action" +msgstr "Tindakan" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, fuzzy, c-format +msgid "%s partition table" +msgstr "partisi" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +#, fuzzy +msgid "EFI system partition" +msgstr "partisi" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, fuzzy, c-format +msgid "%s file system" +msgstr "Tambahkan sistem berkas" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, fuzzy, c-format +msgid "Member of RAID %s" +msgstr "Anggota: %s" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "Menghapus" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +#, fuzzy +msgid "Actions to find space" +msgstr "Tindakan untuk koneksi %s" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +#, fuzzy +msgid "Find Space" +msgstr "Temukan ruang" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." +msgstr "" #. TRANSLATORS: header for a list of items #: src/components/storage/ProposalVolumes.jsx:59 @@ -1371,11 +1528,6 @@ msgstr "dengan snapshot" msgid "transactional" msgstr "transaksional" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "Menghapus" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "Edit sistem berkas" @@ -1386,23 +1538,10 @@ msgstr "Edit sistem berkas" msgid "Mount point" msgstr "Titik pemasangan" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "Detail" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "Ukuran" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "Tabel dengan titik pemasangan" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "Sistem berkas yang akan dibuat di sistem Anda" - #: src/components/storage/VolumeForm.jsx:102 #, fuzzy msgid "Select a value" @@ -1868,69 +2007,6 @@ msgstr "Temukan" msgid "Targets" msgstr "Target" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "Hapus konten saat ini" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "Perkecil partisi yang ada" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "Gunakan ruang yang tersedia" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "Semua partisi akan dihapus dan semua data dalam disk akan hilang." - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" -"Data akan disimpan, namun partisi yang ada akan diubah ukurannya sesuai " -"kebutuhan untuk menyediakan ruang yang cukup." - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" -"Data akan disimpan dan partisi yang ada tidak akan diubah. Hanya ruang yang " -"tidak ditetapkan ke partisi mana pun yang akan digunakan." - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "Pilih mekanisme untuk menyediakan ruang" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "menghapus semua konten dari %d disk yang dipilih" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "mengecilkan partisi dari %d disk yang dipilih" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "tanpa memodifikasi partisi apa pun" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "Ini akan mempengaruhi %d disk yang dipilih untuk instalasi" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "KiB" @@ -2112,6 +2188,43 @@ msgstr "Pengguna" msgid "Root authentication" msgstr "Autentikasi root" +#~ msgid "Devices will not be modified until installation starts." +#~ msgstr "Perangkat tidak akan dimodifikasi hingga penginstalan dimulai." + +#~ msgid "File systems to create in your system" +#~ msgstr "Sistem berkas yang akan dibuat di sistem Anda" + +#~ msgid "" +#~ "Select how to make free space in the disks selected for allocating " +#~ "the file systems." +#~ msgstr "" +#~ "Memilih cara mengosongkan ruang pada disk yang dipilih untuk " +#~ "mengalokasikan sistem berkas." + +#~ msgid "Space Policy" +#~ msgstr "Kebijakan Ruang" + +#~ msgid "Select a mechanism to make space" +#~ msgstr "Pilih mekanisme untuk menyediakan ruang" + +#, c-format +#~ msgid "deleting all content of the installation device" +#~ msgid_plural "deleting all content of the %d selected disks" +#~ msgstr[0] "menghapus semua konten dari %d disk yang dipilih" + +#, c-format +#~ msgid "shrinking partitions of the installation device" +#~ msgid_plural "shrinking partitions of the %d selected disks" +#~ msgstr[0] "mengecilkan partisi dari %d disk yang dipilih" + +#~ msgid "without modifying any partition" +#~ msgstr "tanpa memodifikasi partisi apa pun" + +#, c-format +#~ msgid "This will only affect the installation device" +#~ msgid_plural "This will affect the %d disks selected for installation" +#~ msgstr[0] "Ini akan mempengaruhi %d disk yang dipilih untuk instalasi" + #, c-format #~ msgid "Edit %s connection" #~ msgstr "Mengedit koneksi %s" diff --git a/web/po/ja.po b/web/po/ja.po index dccfc99f99..7b0a3648f2 100644 --- a/web/po/ja.po +++ b/web/po/ja.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-18 02:07+0000\n" -"PO-Revision-Date: 2024-01-22 06:59+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" +"PO-Revision-Date: 2024-02-22 01:00+0000\n" "Last-Translator: Yasuhiko Kamata \n" "Language-Team: Japanese \n" @@ -154,10 +154,9 @@ msgstr "" #: src/components/product/ProductPage.jsx:71 #: src/components/product/ProductPage.jsx:140 #: src/components/product/ProductPage.jsx:207 -#: src/components/storage/ProposalSettingsSection.jsx:172 -#: src/components/storage/ProposalSettingsSection.jsx:367 -#: src/components/storage/ProposalSettingsSection.jsx:551 -#: src/components/storage/ProposalSettingsSection.jsx:647 +#: src/components/storage/ProposalDeviceSection.jsx:169 +#: src/components/storage/ProposalDeviceSection.jsx:364 +#: src/components/storage/ProposalSettingsSection.jsx:211 #: src/components/storage/ProposalVolumes.jsx:148 #: src/components/storage/ProposalVolumes.jsx:283 #: src/components/storage/ZFCPPage.jsx:511 @@ -830,7 +829,7 @@ msgid "Software" msgstr "ソフトウエア" #: src/components/overview/StorageSection.jsx:42 -#: src/components/storage/ProposalSettingsSection.jsx:132 +#: src/components/storage/ProposalDeviceSection.jsx:129 msgid "No device selected yet" msgstr "まだ何もデバイスを選択していません" @@ -870,7 +869,7 @@ msgstr "ストレージデバイスを検出しています" #. TRANSLATORS: page title #. TRANSLATORS: page section title #: src/components/overview/StorageSection.jsx:208 -#: src/components/storage/ProposalPage.jsx:232 +#: src/components/storage/ProposalPage.jsx:239 msgid "Storage" msgstr "ストレージ" @@ -996,9 +995,8 @@ msgid "No products available for selection" msgstr "選択できる製品がありません" #: src/components/product/ProductSelector.jsx:42 -#, fuzzy msgid "Available products" -msgstr "利用可能なロケール" +msgstr "利用可能な製品" #: src/components/questions/GenericQuestion.jsx:35 #: src/components/questions/LuksActivationQuestion.jsx:60 @@ -1088,7 +1086,9 @@ msgstr "チャネル ID" msgid "Status" msgstr "状態" +#. TRANSLATORS: The storage "Device" section's title #: src/components/storage/DASDTable.jsx:66 +#: src/components/storage/ProposalDeviceSection.jsx:423 msgid "Device" msgstr "デバイス" @@ -1164,78 +1164,61 @@ msgid "Storage iSCSI" msgstr "ストレージ iSCSI" #. TRANSLATORS: show/hide toggle action, this is a clickable link -#: src/components/storage/ProposalActionsSection.jsx:71 +#: src/components/storage/ProposalActionsSection.jsx:70 #, c-format msgid "Hide %d subvolume action" msgid_plural "Hide %d subvolume actions" msgstr[0] "%d 個のサブボリューム処理を隠す" #. TRANSLATORS: show/hide toggle action, this is a clickable link -#: src/components/storage/ProposalActionsSection.jsx:73 +#: src/components/storage/ProposalActionsSection.jsx:72 #, c-format msgid "Show %d subvolume action" msgid_plural "Show %d subvolume actions" msgstr[0] "%d 個のサブボリューム処理を表示" -#: src/components/storage/ProposalActionsSection.jsx:78 -msgid "Actions to create the file systems and to ensure the system boots." -msgstr "" -"ファイルシステムを作成するための処理とシステムが起動できるようにするための処" -"理です。" - -#. TRANSLATORS: section title, list of planned actions for the selected device, -#. e.g. "delete partition A", "create partition B with filesystem C", ... -#: src/components/storage/ProposalActionsSection.jsx:126 +#. TRANSLATORS: The storage "Planned Actions" section's title. The +#. section shows a list of planned actions for the selected device, e.g. +#. "delete partition A", "create partition B with filesystem C", ... +#: src/components/storage/ProposalActionsSection.jsx:124 msgid "Planned Actions" msgstr "処理の計画" -#: src/components/storage/ProposalPage.jsx:211 -msgid "Devices will not be modified until installation starts." -msgstr "インストールを開始するまではデバイスへの書き込みは行われません。" - -#: src/components/storage/ProposalPageMenu.jsx:40 -msgid "Manage and format" -msgstr "管理とフォーマット" - -#: src/components/storage/ProposalPageMenu.jsx:58 -msgid "Activate disks" -msgstr "ディスクの有効化" - -#: src/components/storage/ProposalPageMenu.jsx:60 -msgid "zFCP" -msgstr "zFCP" - -#: src/components/storage/ProposalPageMenu.jsx:76 -msgid "Connect to iSCSI targets" -msgstr "iSCSI ターゲットへの接続" +#. TRANSLATORS: The storage "Planned Actions" section's description +#: src/components/storage/ProposalActionsSection.jsx:126 +#, fuzzy +msgid "Actions to create the file systems and to ensure the new system boots." +msgstr "" +"ファイルシステムを作成するための処理とシステムが起動できるようにするための処" +"理です。" -#: src/components/storage/ProposalPageMenu.jsx:78 -msgid "iSCSI" -msgstr "iSCSI" +#: src/components/storage/ProposalDeviceSection.jsx:135 +msgid "Waiting for information about selected device" +msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:141 +#: src/components/storage/ProposalDeviceSection.jsx:138 msgid "Select the device for installing the system." msgstr "システムのインストール先デバイスを選択してください。" -#: src/components/storage/ProposalSettingsSection.jsx:146 -#: src/components/storage/ProposalSettingsSection.jsx:150 -#: src/components/storage/ProposalSettingsSection.jsx:248 +#: src/components/storage/ProposalDeviceSection.jsx:143 +#: src/components/storage/ProposalDeviceSection.jsx:147 +#: src/components/storage/ProposalDeviceSection.jsx:245 msgid "Installation device" msgstr "インストール先のデバイス" -#: src/components/storage/ProposalSettingsSection.jsx:156 +#: src/components/storage/ProposalDeviceSection.jsx:153 msgid "No devices found." msgstr "デバイスが見つかりませんでした。" -#: src/components/storage/ProposalSettingsSection.jsx:245 +#: src/components/storage/ProposalDeviceSection.jsx:242 msgid "Devices for creating the volume group" msgstr "ボリュームグループを作成するデバイス" -#: src/components/storage/ProposalSettingsSection.jsx:254 +#: src/components/storage/ProposalDeviceSection.jsx:251 msgid "Custom devices" msgstr "独自のデバイス" -#: src/components/storage/ProposalSettingsSection.jsx:318 +#: src/components/storage/ProposalDeviceSection.jsx:315 msgid "" "Configuration of the system volume group. All the file systems will be " "created in a logical volume of the system volume group." @@ -1243,27 +1226,64 @@ msgstr "" "システムのボリュームグループ向けの設定です。全てのファイルシステムは、システ" "ムのボリュームグループにある論理ボリューム内に作成されます。" -#: src/components/storage/ProposalSettingsSection.jsx:324 +#: src/components/storage/ProposalDeviceSection.jsx:321 msgid "Configure the LVM settings" msgstr "LVM 設定" -#: src/components/storage/ProposalSettingsSection.jsx:329 -#: src/components/storage/ProposalSettingsSection.jsx:349 +#: src/components/storage/ProposalDeviceSection.jsx:326 +#: src/components/storage/ProposalDeviceSection.jsx:346 msgid "LVM settings" msgstr "LVM 設定" -#: src/components/storage/ProposalSettingsSection.jsx:342 +#: src/components/storage/ProposalDeviceSection.jsx:333 +msgid "Waiting for information about LVM" +msgstr "" + +#: src/components/storage/ProposalDeviceSection.jsx:339 msgid "Use logical volume management (LVM)" msgstr "論理ボリュームマネージャ (LVM) を使用する" -#: src/components/storage/ProposalSettingsSection.jsx:350 +#: src/components/storage/ProposalDeviceSection.jsx:347 msgid "System Volume Group" msgstr "システムのボリュームグループ" +#. TRANSLATORS: The storage "Device" sections's description. Do not +#. translate 'abbr' and 'title', they are part of the HTML markup. +#: src/components/storage/ProposalDeviceSection.jsx:414 +msgid "" +"Select the main disk or LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +#, fuzzy +msgid "File systems" +msgstr "ファイルシステムの種類" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "管理とフォーマット" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "ディスクの有効化" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "zFCP" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "iSCSI ターゲットへの接続" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "iSCSI" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1275,43 +1295,168 @@ msgstr "" "シーリングを使用するには、新しいシステムの初回起動時に直接起動を行う必要があ" "ります。" -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "毎回の起動時に TPM を利用して自動的に暗号化解除する" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 msgid "Change encryption settings" msgstr "暗号化設定の変更" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "暗号化の設定" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "暗号化を使用する" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "設定" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "現在の内容を全て削除" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" +"ディスク内の全てのパーティションを削除します。これにより、ディスク内に存在す" +"るデータは全て失われます。" + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "既存のパーティションの縮小" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" +"既存のデータは保持しますが、十分な領域を確保するために既存のパーティションの" +"サイズ変更を行います。" + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "利用可能な領域を使用する" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -"選択したディスク内にファイルシステムを割り当てるための領域確保方法を選択して" -"ください。" +"既存のデータを全て保持します。パーティションに割り当てられていない空き領域の" +"みを使用します。" -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" -msgstr "領域の検出" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +msgid "Custom" +msgstr "独自設定" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" -msgstr "領域ポリシー" +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." +msgstr "パーティションの設定作業を独自に実施します。" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" -msgstr "設定" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +msgid "Used device" +msgstr "使用済みデバイス" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +msgid "Current content" +msgstr "現在の内容" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "サイズ" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "詳細" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +msgid "Action" +msgstr "処理" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, c-format +msgid "%s partition table" +msgstr "%s パーティションテーブル" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +msgid "EFI system partition" +msgstr "EFI システムパーティション" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, c-format +msgid "%s file system" +msgstr "%s ファイルシステム" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "%s の LVM 物理ボリューム" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, c-format +msgid "Member of RAID %s" +msgstr "RAID %s のメンバー" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "不明" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "%s の未使用" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "%s 単位で縮小可能" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "%s に対する領域処理の選択" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "削除" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "サイズ変更の許可" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "変更しない" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +msgid "Actions to find space" +msgstr "領域の検出処理" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +msgid "Find Space" +msgstr "領域の検出" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." +msgstr "" #. TRANSLATORS: header for a list of items #: src/components/storage/ProposalVolumes.jsx:59 @@ -1379,11 +1524,6 @@ msgstr "スナップショット有り" msgid "transactional" msgstr "トランザクション型" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "削除" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "ファイルシステムの編集" @@ -1394,23 +1534,10 @@ msgstr "ファイルシステムの編集" msgid "Mount point" msgstr "マウントポイント" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "詳細" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "サイズ" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "マウントポイントの一覧" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "お使いのシステム内で作成するファイルシステム" - #: src/components/storage/VolumeForm.jsx:102 msgid "Select a value" msgstr "値の選択" @@ -1876,71 +2003,6 @@ msgstr "検索" msgid "Targets" msgstr "ターゲット" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "現在の内容を全て削除" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "既存のパーティションの縮小" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "利用可能な領域を使用する" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" -"ディスク内の全てのパーティションを削除します。これにより、ディスク内に存在す" -"るデータは全て失われます。" - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" -"ディスク内のデータは保持しますが、十分な領域を確保するために既存のパーティ" -"ションのサイズ変更を行います。" - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" -"ディスク内のデータは全て保持し、パーティションの変更も行いません。パーティ" -"ションに割り当てられていない空き領域のみを使用します。" - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "領域の確保方法を選択してください" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "選択した %d 個のディスクの全内容を削除します" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "選択した %d 個のディスクのパーティションを縮小します" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "パーティションの変更を行いません" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "この処理は、選択した %d 個のディスクにのみ影響します" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "KiB" @@ -2120,6 +2182,43 @@ msgstr "ユーザ" msgid "Root authentication" msgstr "root の認証" +#~ msgid "Devices will not be modified until installation starts." +#~ msgstr "インストールを開始するまではデバイスへの書き込みは行われません。" + +#~ msgid "File systems to create in your system" +#~ msgstr "お使いのシステム内で作成するファイルシステム" + +#~ msgid "" +#~ "Select how to make free space in the disks selected for allocating " +#~ "the file systems." +#~ msgstr "" +#~ "選択したディスク内にファイルシステムを割り当てるための領域確保方法を選択し" +#~ "てください。" + +#~ msgid "Space Policy" +#~ msgstr "領域ポリシー" + +#~ msgid "Select a mechanism to make space" +#~ msgstr "領域の確保方法を選択してください" + +#, c-format +#~ msgid "deleting all content of the installation device" +#~ msgid_plural "deleting all content of the %d selected disks" +#~ msgstr[0] "選択した %d 個のディスクの全内容を削除します" + +#, c-format +#~ msgid "shrinking partitions of the installation device" +#~ msgid_plural "shrinking partitions of the %d selected disks" +#~ msgstr[0] "選択した %d 個のディスクのパーティションを縮小します" + +#~ msgid "without modifying any partition" +#~ msgstr "パーティションの変更を行いません" + +#, c-format +#~ msgid "This will only affect the installation device" +#~ msgid_plural "This will affect the %d disks selected for installation" +#~ msgstr[0] "この処理は、選択した %d 個のディスクにのみ影響します" + #, c-format #~ msgid "Edit %s connection" #~ msgstr "接続 %s の編集" diff --git a/web/po/ka.po b/web/po/ka.po index b8f169b003..f01517eac0 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-02-18 02:07+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" "PO-Revision-Date: 2024-02-17 05:42+0000\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +msgid "File systems" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "მართვა და დაფორმატება" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "დისკების გააქტიურება" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "zFCP" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "iSCSI" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1243,41 +1262,167 @@ msgid "" "first run." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 msgid "Change encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "დაშიფვრის პარამეტრები" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "დაშიფვრის გამოყენება" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "მორგება" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" -msgstr "ადგილის პოვნა" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +#, fuzzy +msgid "Custom" +msgstr "მომხმარებლის მოწყობილობები" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" -msgstr "ადგილის პოლიტიკა" +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." +msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" -msgstr "მორგება" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +#, fuzzy +msgid "Used device" +msgstr "მომხმარებლის მოწყობილობები" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +msgid "Current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "ზომა" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "დეტალები" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +#, fuzzy +msgid "Action" +msgstr "ქმედებები" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, fuzzy, c-format +msgid "%s partition table" +msgstr "დანაყოფი" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +#, fuzzy +msgid "EFI system partition" +msgstr "დანაყოფი" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, c-format +msgid "%s file system" +msgstr "" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, fuzzy, c-format +msgid "Member of RAID %s" +msgstr "წევრები: %s" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "წაშლა" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +msgid "Actions to find space" +msgstr "" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +#, fuzzy +msgid "Find Space" +msgstr "ადგილის პოვნა" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." +msgstr "" #. TRANSLATORS: header for a list of items #: src/components/storage/ProposalVolumes.jsx:59 @@ -1345,11 +1490,6 @@ msgstr "სწრაფი ასლებით" msgid "transactional" msgstr "ტრანზაქციული" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "წაშლა" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "" @@ -1360,23 +1500,10 @@ msgstr "" msgid "Mount point" msgstr "მიმაგრების წერტილი" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "დეტალები" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "ზომა" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "" - #: src/components/storage/VolumeForm.jsx:102 msgid "Select a value" msgstr "" @@ -1832,68 +1959,6 @@ msgstr "აღმოაჩინეთ" msgid "Targets" msgstr "სამიზნეები" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "" -msgstr[1] "" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "" -msgstr[1] "" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "" -msgstr[1] "" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "კიბ" @@ -2070,3 +2135,6 @@ msgstr "მომხმარებელი" #: src/components/users/UsersPage.jsx:34 msgid "Root authentication" msgstr "Root-ით ავთენტიკაცია" + +#~ msgid "Space Policy" +#~ msgstr "ადგილის პოლიტიკა" diff --git a/web/po/mk.po b/web/po/mk.po index 13a71dafc9..862b488ff9 100644 --- a/web/po/mk.po +++ b/web/po/mk.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-18 02:07+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" "PO-Revision-Date: 2023-12-31 20:39+0000\n" "Last-Translator: Kristijan Fremen Velkovski \n" "Language-Team: Macedonian LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +msgid "File systems" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1247,40 +1266,161 @@ msgid "" "first run." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 msgid "Change encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +msgid "Custom" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +msgid "Used device" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +msgid "Current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +msgid "Action" +msgstr "" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, c-format +msgid "%s partition table" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +msgid "EFI system partition" +msgstr "" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, c-format +msgid "%s file system" +msgstr "" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, c-format +msgid "Member of RAID %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +msgid "Actions to find space" +msgstr "" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +msgid "Find Space" +msgstr "" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." msgstr "" #. TRANSLATORS: header for a list of items @@ -1349,11 +1489,6 @@ msgstr "" msgid "transactional" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "" @@ -1364,23 +1499,10 @@ msgstr "" msgid "Mount point" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "" - #: src/components/storage/VolumeForm.jsx:102 msgid "Select a value" msgstr "" @@ -1836,68 +1958,6 @@ msgstr "" msgid "Targets" msgstr "" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "" -msgstr[1] "" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "" -msgstr[1] "" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "" -msgstr[1] "" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "" diff --git a/web/po/nl.po b/web/po/nl.po index 2994d20e6e..838c726062 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-02-18 02:07+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" "PO-Revision-Date: 2023-12-31 20:39+0000\n" "Last-Translator: anonymous \n" "Language-Team: Dutch LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +#, fuzzy +msgid "File systems" +msgstr "Bestandssysteem type" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "Beheer en formatteer" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "Activeer disks" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "zFCP" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "Verbind met iSCSI doelen" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "iSCSI" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1295,42 +1316,169 @@ msgid "" "first run." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 #, fuzzy msgid "Change encryption settings" msgstr "Encryptie instellingen" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "Encryptie instellingen" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "Gebruik encryptie" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "Instellingen" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +#, fuzzy +msgid "Use available space" +msgstr "Beschikbare apparaten" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +#, fuzzy +msgid "Custom" +msgstr "Installatie apparaat" + +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +#, fuzzy +msgid "Used device" +msgstr "Lees zFCP apparaten" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +msgid "Current content" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" -msgstr "Instellingen" +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "Grootte" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "Details" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +#, fuzzy +msgid "Action" +msgstr "Acties" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, fuzzy, c-format +msgid "%s partition table" +msgstr "partitie" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +#, fuzzy +msgid "EFI system partition" +msgstr "partitie" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, fuzzy, c-format +msgid "%s file system" +msgstr "Voeg bestandssysteem toe" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, fuzzy, c-format +msgid "Member of RAID %s" +msgstr "Leden: %s" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "Verwijderen" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +#, fuzzy +msgid "Actions to find space" +msgstr "Acties voor verbinding %s" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +msgid "Find Space" +msgstr "" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." +msgstr "" #. TRANSLATORS: header for a list of items #: src/components/storage/ProposalVolumes.jsx:59 @@ -1399,11 +1547,6 @@ msgstr "met snapshots" msgid "transactional" msgstr "Voer een actie uit" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "Verwijderen" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "Wijzig bestandssysteem" @@ -1414,23 +1557,10 @@ msgstr "Wijzig bestandssysteem" msgid "Mount point" msgstr "Koppelpunt" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "Details" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "Grootte" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "Tabel met koppelpunten" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "Bestandssystemen die worden gemaakt in uw systeem" - #: src/components/storage/VolumeForm.jsx:102 #, fuzzy msgid "Select a value" @@ -1898,70 +2028,6 @@ msgstr "Detecteer" msgid "Targets" msgstr "Doelen" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -#, fuzzy -msgid "Use available space" -msgstr "Beschikbare apparaten" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "" -msgstr[1] "" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "" -msgstr[1] "" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -#, fuzzy -msgid "without modifying any partition" -msgstr "%s met %d partities" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "" -msgstr[1] "" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "KiB" @@ -2145,6 +2211,16 @@ msgstr "Gebruiker" msgid "Root authentication" msgstr "Root authenticatie" +#~ msgid "Devices will not be modified until installation starts." +#~ msgstr "Apparaten worden niet gewijzigd tot de installatie start." + +#~ msgid "File systems to create in your system" +#~ msgstr "Bestandssystemen die worden gemaakt in uw systeem" + +#, fuzzy +#~ msgid "without modifying any partition" +#~ msgstr "%s met %d partities" + #, c-format #~ msgid "Edit %s connection" #~ msgstr "Wijzig %s verbinding" diff --git a/web/po/pt_BR.po b/web/po/pt_BR.po index 9c5a0189c4..02502adb73 100644 --- a/web/po/pt_BR.po +++ b/web/po/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-18 02:07+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" "PO-Revision-Date: 2023-12-31 20:39+0000\n" "Last-Translator: anonymous \n" "Language-Team: Portuguese (Brazil) LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +#, fuzzy +msgid "File systems" +msgstr "Tipo de sistema de arquivos" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "zFCP" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "iSCSI" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1272,42 +1293,166 @@ msgid "" "first run." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 #, fuzzy msgid "Change encryption settings" msgstr "Usar criptografia" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "Usar criptografia" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "Configurações" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +msgid "Custom" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" -msgstr "Configurações" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +msgid "Used device" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +msgid "Current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "Tamanho" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "Detalhes" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +#, fuzzy +msgid "Action" +msgstr "Ações" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, fuzzy, c-format +msgid "%s partition table" +msgstr "partição" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +#, fuzzy +msgid "EFI system partition" +msgstr "partição" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, fuzzy, c-format +msgid "%s file system" +msgstr "Adicionar sistema de arquivos" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, c-format +msgid "Member of RAID %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "Excluir" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +#, fuzzy +msgid "Actions to find space" +msgstr "Ações para a conexão %s" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +msgid "Find Space" +msgstr "" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." +msgstr "" #. TRANSLATORS: header for a list of items #: src/components/storage/ProposalVolumes.jsx:59 @@ -1375,11 +1520,6 @@ msgstr "com instantâneos" msgid "transactional" msgstr "transacional" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "Excluir" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "Editar sistema de arquivos" @@ -1390,23 +1530,10 @@ msgstr "Editar sistema de arquivos" msgid "Mount point" msgstr "Ponto de montagem" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "Detalhes" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "Tamanho" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "Tabela com pontos de montagem" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "Sistemas de arquivos para criar em seu sistema" - #: src/components/storage/VolumeForm.jsx:102 #, fuzzy msgid "Select a value" @@ -1868,68 +1995,6 @@ msgstr "Discover" msgid "Targets" msgstr "Destinos" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "" -msgstr[1] "" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "" -msgstr[1] "" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "" -msgstr[1] "" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "KiB" @@ -2108,6 +2173,9 @@ msgstr "Usuário" msgid "Root authentication" msgstr "" +#~ msgid "File systems to create in your system" +#~ msgstr "Sistemas de arquivos para criar em seu sistema" + #, c-format #~ msgid "Edit %s connection" #~ msgstr "Editar conexão %s" diff --git a/web/po/ru.po b/web/po/ru.po index 71a0a07501..e525a627cf 100644 --- a/web/po/ru.po +++ b/web/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-18 02:07+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" "PO-Revision-Date: 2023-12-31 20:39+0000\n" "Last-Translator: Milachew \n" "Language-Team: Russian LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +msgid "File systems" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1285,40 +1307,163 @@ msgid "" "first run." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 msgid "Change encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +msgid "Custom" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +msgid "Used device" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +msgid "Current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +#, fuzzy +msgid "Action" +msgstr "Действия" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, c-format +msgid "%s partition table" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +msgid "EFI system partition" +msgstr "" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, c-format +msgid "%s file system" +msgstr "" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, c-format +msgid "Member of RAID %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +#, fuzzy +msgid "Actions to find space" +msgstr "Действия для соединения %s" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +msgid "Find Space" +msgstr "" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." msgstr "" #. TRANSLATORS: header for a list of items @@ -1387,11 +1532,6 @@ msgstr "" msgid "transactional" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "" @@ -1402,23 +1542,10 @@ msgstr "" msgid "Mount point" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "" - #: src/components/storage/VolumeForm.jsx:102 #, fuzzy msgid "Select a value" @@ -1877,71 +2004,6 @@ msgstr "" msgid "Targets" msgstr "" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "" diff --git a/web/po/sv.po b/web/po/sv.po index b2b1d31de7..4cc1e63cdb 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-02-18 02:07+0000\n" -"PO-Revision-Date: 2024-01-21 14:59+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" +"PO-Revision-Date: 2024-02-21 12:42+0000\n" "Last-Translator: Luna Jernberg \n" "Language-Team: Swedish \n" @@ -153,10 +153,9 @@ msgstr "" #: src/components/product/ProductPage.jsx:71 #: src/components/product/ProductPage.jsx:140 #: src/components/product/ProductPage.jsx:207 -#: src/components/storage/ProposalSettingsSection.jsx:172 -#: src/components/storage/ProposalSettingsSection.jsx:367 -#: src/components/storage/ProposalSettingsSection.jsx:551 -#: src/components/storage/ProposalSettingsSection.jsx:647 +#: src/components/storage/ProposalDeviceSection.jsx:169 +#: src/components/storage/ProposalDeviceSection.jsx:364 +#: src/components/storage/ProposalSettingsSection.jsx:211 #: src/components/storage/ProposalVolumes.jsx:148 #: src/components/storage/ProposalVolumes.jsx:283 #: src/components/storage/ZFCPPage.jsx:511 @@ -831,7 +830,7 @@ msgid "Software" msgstr "Programvara" #: src/components/overview/StorageSection.jsx:42 -#: src/components/storage/ProposalSettingsSection.jsx:132 +#: src/components/storage/ProposalDeviceSection.jsx:129 msgid "No device selected yet" msgstr "Ingen enhet vald ännu" @@ -870,7 +869,7 @@ msgstr "Undersöker lagringsenheter" #. TRANSLATORS: page title #. TRANSLATORS: page section title #: src/components/overview/StorageSection.jsx:208 -#: src/components/storage/ProposalPage.jsx:232 +#: src/components/storage/ProposalPage.jsx:239 msgid "Storage" msgstr "Lagring" @@ -998,9 +997,8 @@ msgid "No products available for selection" msgstr "Inga produkter tillgängliga för val" #: src/components/product/ProductSelector.jsx:42 -#, fuzzy msgid "Available products" -msgstr "Tillgängliga lokaler" +msgstr "Tillgängliga produkter" #: src/components/questions/GenericQuestion.jsx:35 #: src/components/questions/LuksActivationQuestion.jsx:60 @@ -1090,7 +1088,9 @@ msgstr "Kanal-ID" msgid "Status" msgstr "Status" +#. TRANSLATORS: The storage "Device" section's title #: src/components/storage/DASDTable.jsx:66 +#: src/components/storage/ProposalDeviceSection.jsx:423 msgid "Device" msgstr "Enhet" @@ -1166,7 +1166,7 @@ msgid "Storage iSCSI" msgstr "Lagring iSCSI" #. TRANSLATORS: show/hide toggle action, this is a clickable link -#: src/components/storage/ProposalActionsSection.jsx:71 +#: src/components/storage/ProposalActionsSection.jsx:70 #, c-format msgid "Hide %d subvolume action" msgid_plural "Hide %d subvolume actions" @@ -1174,72 +1174,55 @@ msgstr[0] "Dölj %d undervolym åtgärd" msgstr[1] "Dölj %d undervolymer åtgärder" #. TRANSLATORS: show/hide toggle action, this is a clickable link -#: src/components/storage/ProposalActionsSection.jsx:73 +#: src/components/storage/ProposalActionsSection.jsx:72 #, c-format msgid "Show %d subvolume action" msgid_plural "Show %d subvolume actions" msgstr[0] "Visa %d undervolym åtgärd" msgstr[1] "Visa %d undervolymer åtgärder" -#: src/components/storage/ProposalActionsSection.jsx:78 -msgid "Actions to create the file systems and to ensure the system boots." -msgstr "" -"Åtgärder för att skapa filsystemen och för att säkerställa att systemet " -"startar." - -#. TRANSLATORS: section title, list of planned actions for the selected device, -#. e.g. "delete partition A", "create partition B with filesystem C", ... -#: src/components/storage/ProposalActionsSection.jsx:126 +#. TRANSLATORS: The storage "Planned Actions" section's title. The +#. section shows a list of planned actions for the selected device, e.g. +#. "delete partition A", "create partition B with filesystem C", ... +#: src/components/storage/ProposalActionsSection.jsx:124 msgid "Planned Actions" msgstr "Planerade åtgärder" -#: src/components/storage/ProposalPage.jsx:211 -msgid "Devices will not be modified until installation starts." -msgstr "Enheter kommer inte att modifieras förrän installationen startar." - -#: src/components/storage/ProposalPageMenu.jsx:40 -msgid "Manage and format" -msgstr "Hantera och formatera" - -#: src/components/storage/ProposalPageMenu.jsx:58 -msgid "Activate disks" -msgstr "Aktivera diskar" - -#: src/components/storage/ProposalPageMenu.jsx:60 -msgid "zFCP" -msgstr "zFCP" - -#: src/components/storage/ProposalPageMenu.jsx:76 -msgid "Connect to iSCSI targets" -msgstr "Anslut till iSCSI mål" +#. TRANSLATORS: The storage "Planned Actions" section's description +#: src/components/storage/ProposalActionsSection.jsx:126 +#, fuzzy +msgid "Actions to create the file systems and to ensure the new system boots." +msgstr "" +"Åtgärder för att skapa filsystemen och för att säkerställa att systemet " +"startar." -#: src/components/storage/ProposalPageMenu.jsx:78 -msgid "iSCSI" -msgstr "iSCSI" +#: src/components/storage/ProposalDeviceSection.jsx:135 +msgid "Waiting for information about selected device" +msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:141 +#: src/components/storage/ProposalDeviceSection.jsx:138 msgid "Select the device for installing the system." msgstr "Välj enhet för installation av systemet." -#: src/components/storage/ProposalSettingsSection.jsx:146 -#: src/components/storage/ProposalSettingsSection.jsx:150 -#: src/components/storage/ProposalSettingsSection.jsx:248 +#: src/components/storage/ProposalDeviceSection.jsx:143 +#: src/components/storage/ProposalDeviceSection.jsx:147 +#: src/components/storage/ProposalDeviceSection.jsx:245 msgid "Installation device" msgstr "Installationsenhet" -#: src/components/storage/ProposalSettingsSection.jsx:156 +#: src/components/storage/ProposalDeviceSection.jsx:153 msgid "No devices found." msgstr "Inga enheter hittades." -#: src/components/storage/ProposalSettingsSection.jsx:245 +#: src/components/storage/ProposalDeviceSection.jsx:242 msgid "Devices for creating the volume group" msgstr "Enheter för att skapa volymgrupp" -#: src/components/storage/ProposalSettingsSection.jsx:254 +#: src/components/storage/ProposalDeviceSection.jsx:251 msgid "Custom devices" msgstr "Anpassade enheter" -#: src/components/storage/ProposalSettingsSection.jsx:318 +#: src/components/storage/ProposalDeviceSection.jsx:315 msgid "" "Configuration of the system volume group. All the file systems will be " "created in a logical volume of the system volume group." @@ -1247,27 +1230,64 @@ msgstr "" "Konfiguration av systemvolymgruppen. Alla filsystem kommer att skapas i en " "logisk volym av systemvolymgruppen." -#: src/components/storage/ProposalSettingsSection.jsx:324 +#: src/components/storage/ProposalDeviceSection.jsx:321 msgid "Configure the LVM settings" msgstr "Konfigurera LVM-inställningar" -#: src/components/storage/ProposalSettingsSection.jsx:329 -#: src/components/storage/ProposalSettingsSection.jsx:349 +#: src/components/storage/ProposalDeviceSection.jsx:326 +#: src/components/storage/ProposalDeviceSection.jsx:346 msgid "LVM settings" msgstr "LVM-inställningar" -#: src/components/storage/ProposalSettingsSection.jsx:342 +#: src/components/storage/ProposalDeviceSection.jsx:333 +msgid "Waiting for information about LVM" +msgstr "" + +#: src/components/storage/ProposalDeviceSection.jsx:339 msgid "Use logical volume management (LVM)" msgstr "Använd logisk volymhantering (LVM)" -#: src/components/storage/ProposalSettingsSection.jsx:350 +#: src/components/storage/ProposalDeviceSection.jsx:347 msgid "System Volume Group" msgstr "System volymgrupp" +#. TRANSLATORS: The storage "Device" sections's description. Do not +#. translate 'abbr' and 'title', they are part of the HTML markup. +#: src/components/storage/ProposalDeviceSection.jsx:414 +msgid "" +"Select the main disk or LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +#, fuzzy +msgid "File systems" +msgstr "Filsystem typ" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "Hantera och formatera" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "Aktivera diskar" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "zFCP" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "Anslut till iSCSI mål" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "iSCSI" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1279,43 +1299,168 @@ msgstr "" "integritet. TPM-försegling kräver att det nya systemet startas upp direkt " "vid första körningen." -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "Använd TPM för att dekryptera automatiskt vid varje uppstart" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 msgid "Change encryption settings" msgstr "Ändra krypteringsinställningar" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "Krypteringsinställningar" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "Använd kryptering" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "Inställningar" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "Radera nuvarande innehåll" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" +"Alla partitioner kommer att tas bort och all data på diskarna kommer att gå " +"förlorad." + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "Krymp existerande partitioner" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" +"Data bevaras, men storleken på de aktuella partitionerna kommer att ändras " +"efter behov." + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "Använd tillgängligt utrymme" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -"Välj hur du gör ledigt utrymme på de diskar som valts för tilldelning av " -"filsystemen." +"Data bevaras. Endast det utrymme som inte är tilldelat någon partition " +"kommer att användas." -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" -msgstr "Hitta utrymme" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +msgid "Custom" +msgstr "Anpassad" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" -msgstr "Utrymmespolicy" +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." +msgstr "Välj vad som ska göras med varje partition." -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" -msgstr "Inställningar" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +msgid "Used device" +msgstr "Använda enheter" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +msgid "Current content" +msgstr "Nuvarande innehåll" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "Storlek" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "Detaljer" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +msgid "Action" +msgstr "Åtgärd" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, c-format +msgid "%s partition table" +msgstr "%s partitionstabell" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +msgid "EFI system partition" +msgstr "EFI-systempartition" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, c-format +msgid "%s file system" +msgstr "%s filsystem" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "LVM fysisk volym av %s" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, c-format +msgid "Member of RAID %s" +msgstr "Medlem av RAID %s" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "Inte identifierad" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "%s oanvänt" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "Krympbar med %s" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "Platsåtgärdsväljare för %s" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "Ta bort" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "Tillåt storleksändring" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "Modifiera inte" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +msgid "Actions to find space" +msgstr "Åtgärder för att hitta utrymme" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +msgid "Find Space" +msgstr "Hitta utrymme" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." +msgstr "" #. TRANSLATORS: header for a list of items #: src/components/storage/ProposalVolumes.jsx:59 @@ -1383,11 +1528,6 @@ msgstr "med ögonblicksavbilder" msgid "transactional" msgstr "transaktionell" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "Ta bort" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "Redigera filsystem" @@ -1398,23 +1538,10 @@ msgstr "Redigera filsystem" msgid "Mount point" msgstr "Monteringspunkt" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "Detaljer" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "Storlek" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "Tabell med monteringspunkter" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "Filsystem att skapa i ditt system" - #: src/components/storage/VolumeForm.jsx:102 msgid "Select a value" msgstr "Välj ett värde" @@ -1880,74 +2007,6 @@ msgstr "Upptäck" msgid "Targets" msgstr "Mål" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "Radera nuvarande innehåll" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "Krymp existerande partitioner" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "Använd tillgängligt utrymme" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" -"Alla partitioner kommer att tas bort och all data på diskarna kommer att gå " -"förlorad." - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" -"Data bevaras, men storleken på de aktuella partitionerna kommer att ändras " -"efter behov för att göra tillräckligt med utrymme." - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" -"Data bevaras och befintliga partitioner kommer inte att ändras. Endast det " -"utrymme som inte är tilldelat någon partition kommer att användas." - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "Välj en mekanism för att skapa utrymme" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "radera allt innehåll på installationsenhet" -msgstr[1] "tar bort allt innehåll på de %d valda diskarna" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "krymper partitioner på installationsenhet" -msgstr[1] "krymper partitioner på %d valda diskarna" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "utan att modifiera någon partition" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "Detta påverkar bara installationsenheten" -msgstr[1] "Detta kommer att påverka %d diskarna som valts för installation" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "KiB" @@ -2129,6 +2188,46 @@ msgstr "Användare" msgid "Root authentication" msgstr "Rootautentisering" +#~ msgid "Devices will not be modified until installation starts." +#~ msgstr "Enheter kommer inte att modifieras förrän installationen startar." + +#~ msgid "File systems to create in your system" +#~ msgstr "Filsystem att skapa i ditt system" + +#~ msgid "" +#~ "Select how to make free space in the disks selected for allocating " +#~ "the file systems." +#~ msgstr "" +#~ "Välj hur du gör ledigt utrymme på de diskar som valts för tilldelning av " +#~ "filsystemen." + +#~ msgid "Space Policy" +#~ msgstr "Utrymmespolicy" + +#~ msgid "Select a mechanism to make space" +#~ msgstr "Välj en mekanism för att skapa utrymme" + +#, c-format +#~ msgid "deleting all content of the installation device" +#~ msgid_plural "deleting all content of the %d selected disks" +#~ msgstr[0] "radera allt innehåll på installationsenhet" +#~ msgstr[1] "tar bort allt innehåll på de %d valda diskarna" + +#, c-format +#~ msgid "shrinking partitions of the installation device" +#~ msgid_plural "shrinking partitions of the %d selected disks" +#~ msgstr[0] "krymper partitioner på installationsenhet" +#~ msgstr[1] "krymper partitioner på %d valda diskarna" + +#~ msgid "without modifying any partition" +#~ msgstr "utan att modifiera någon partition" + +#, c-format +#~ msgid "This will only affect the installation device" +#~ msgid_plural "This will affect the %d disks selected for installation" +#~ msgstr[0] "Detta påverkar bara installationsenheten" +#~ msgstr[1] "Detta kommer att påverka %d diskarna som valts för installation" + #, c-format #~ msgid "Edit %s connection" #~ msgstr "Redigera %s anslutning" diff --git a/web/po/uk.po b/web/po/uk.po index 188a8101be..6c640512e5 100644 --- a/web/po/uk.po +++ b/web/po/uk.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-18 02:07+0000\n" +"POT-Creation-Date: 2024-02-25 02:07+0000\n" "PO-Revision-Date: 2023-12-31 20:39+0000\n" "Last-Translator: Milachew \n" "Language-Team: Ukrainian LVM " +"Volume Group for installation." +msgstr "" + +#: src/components/storage/ProposalFileSystemsSection.jsx:70 +msgid "File systems" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:40 +msgid "Manage and format" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:58 +msgid "Activate disks" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:60 +msgid "zFCP" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:76 +msgid "Connect to iSCSI targets" +msgstr "" + +#: src/components/storage/ProposalPageMenu.jsx:78 +msgid "iSCSI" +msgstr "" + #. TRANSLATORS: The word 'directly' is key here. For example, booting to the installer media and then choosing #. 'Boot from Hard Disk' from there will not work. Keep it sort (this is a hint in a form) but keep it clear. #. Do not translate 'abbr' and 'title', they are part of the HTML markup. -#: src/components/storage/ProposalSettingsSection.jsx:426 +#: src/components/storage/ProposalSettingsSection.jsx:86 msgid "" "The password will not be needed to boot and access the data if the TPM can verify the integrity of the " @@ -1247,40 +1266,161 @@ msgid "" "first run." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:444 +#: src/components/storage/ProposalSettingsSection.jsx:104 msgid "Use the TPM to decrypt automatically on each boot" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:515 +#: src/components/storage/ProposalSettingsSection.jsx:175 msgid "Change encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:520 -#: src/components/storage/ProposalSettingsSection.jsx:541 +#: src/components/storage/ProposalSettingsSection.jsx:180 +#: src/components/storage/ProposalSettingsSection.jsx:201 msgid "Encryption settings" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:534 +#: src/components/storage/ProposalSettingsSection.jsx:194 msgid "Use encryption" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:621 +#: src/components/storage/ProposalSettingsSection.jsx:244 +msgid "Settings" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:50 +msgid "Delete current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:51 +msgid "All partitions will be removed and any data in the disks will be lost." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:55 +msgid "Shrink existing partitions" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:56 +msgid "The data is kept, but the current partitions will be resized as needed." +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:60 +msgid "Use available space" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:61 msgid "" -"Select how to make free space in the disks selected for allocating the " -"file systems." +"The data is kept. Only the space not assigned to any partition will be used." msgstr "" -#. TRANSLATORS: To be completed with the rest of a sentence like "deleting all content" -#: src/components/storage/ProposalSettingsSection.jsx:627 -msgid "Find space" +#: src/components/storage/ProposalSpacePolicySection.jsx:65 +msgid "Custom" msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:631 -msgid "Space Policy" +#: src/components/storage/ProposalSpacePolicySection.jsx:66 +msgid "Select what to do with each partition." msgstr "" -#: src/components/storage/ProposalSettingsSection.jsx:708 -msgid "Settings" +#: src/components/storage/ProposalSpacePolicySection.jsx:72 +msgid "Used device" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:73 +msgid "Current content" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:74 +#: src/components/storage/ProposalVolumes.jsx:309 +#: src/components/storage/VolumeForm.jsx:795 +msgid "Size" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:75 +#: src/components/storage/ProposalVolumes.jsx:308 +msgid "Details" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:76 +msgid "Action" +msgstr "" + +#. TRANSLATORS: %s is replaced by partition table type (e.g., GPT) +#: src/components/storage/ProposalSpacePolicySection.jsx:110 +#, c-format +msgid "%s partition table" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:121 +msgid "EFI system partition" +msgstr "" + +#. TRANSLATORS: %s is replaced by a file system type (e.g., btrfs). +#: src/components/storage/ProposalSpacePolicySection.jsx:124 +#, c-format +msgid "%s file system" +msgstr "" + +#. TRANSLATORS: %s is replaced by a LVM volume group name (e.g., /dev/vg0). +#: src/components/storage/ProposalSpacePolicySection.jsx:131 +#, c-format +msgid "LVM physical volume of %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a RAID name (e.g., /dev/md0). +#: src/components/storage/ProposalSpacePolicySection.jsx:134 +#, c-format +msgid "Member of RAID %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:136 +msgid "Not identified" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 20 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:173 +#, c-format +msgid "%s unused" +msgstr "" + +#. TRANSLATORS: %s is replaced by a disk size (e.g., 2 GiB) +#: src/components/storage/ProposalSpacePolicySection.jsx:186 +#, c-format +msgid "Shrinkable by %s" +msgstr "" + +#. TRANSLATORS: %s is replaced by a device name (e.g., /dev/sda) +#: src/components/storage/ProposalSpacePolicySection.jsx:221 +#, c-format +msgid "Space action selector for %s" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:224 +#: src/components/storage/ProposalVolumes.jsx:229 +#: src/components/storage/iscsi/NodesPresenter.jsx:77 +msgid "Delete" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:228 +msgid "Allow resize" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:230 +msgid "Do not modify" +msgstr "" + +#: src/components/storage/ProposalSpacePolicySection.jsx:382 +msgid "Actions to find space" +msgstr "" + +#. TRANSLATORS: The storage "Find Space" section's title +#: src/components/storage/ProposalSpacePolicySection.jsx:452 +msgid "Find Space" +msgstr "" + +#. TRANSLATORS: The storage "Find space" sections's description +#: src/components/storage/ProposalSpacePolicySection.jsx:454 +msgid "" +"Allocating the file systems might need to find free space in the devices " +"listed below. Choose how to do it." msgstr "" #. TRANSLATORS: header for a list of items @@ -1349,11 +1489,6 @@ msgstr "" msgid "transactional" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:229 -#: src/components/storage/iscsi/NodesPresenter.jsx:77 -msgid "Delete" -msgstr "" - #: src/components/storage/ProposalVolumes.jsx:275 msgid "Edit file system" msgstr "" @@ -1364,23 +1499,10 @@ msgstr "" msgid "Mount point" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:308 -msgid "Details" -msgstr "" - -#: src/components/storage/ProposalVolumes.jsx:309 -#: src/components/storage/VolumeForm.jsx:795 -msgid "Size" -msgstr "" - #: src/components/storage/ProposalVolumes.jsx:345 msgid "Table with mount points" msgstr "" -#: src/components/storage/ProposalVolumes.jsx:408 -msgid "File systems to create in your system" -msgstr "" - #: src/components/storage/VolumeForm.jsx:102 msgid "Select a value" msgstr "" @@ -1836,71 +1958,6 @@ msgstr "" msgid "Targets" msgstr "" -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:45 -msgid "Delete current content" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:49 -msgid "Shrink existing partitions" -msgstr "" - -#. TRANSLATORS: automatic actions to find space for installation in the target disk(s) -#: src/components/storage/space-policy-utils.jsx:53 -msgid "Use available space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:65 -msgid "All partitions will be removed and any data in the disks will be lost." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:68 -msgid "" -"The data is kept, but the current partitions will be resized as needed to " -"make enough space." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:71 -msgid "" -"The data is kept and existing partitions will not be modified. Only the " -"space that is not assigned to any partition will be used." -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:108 -msgid "Select a mechanism to make space" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:127 -#, c-format -msgid "deleting all content of the installation device" -msgid_plural "deleting all content of the %d selected disks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#: src/components/storage/space-policy-utils.jsx:137 -#, c-format -msgid "shrinking partitions of the installation device" -msgid_plural "shrinking partitions of the %d selected disks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#. TRANSLATORS: This is presented next to the label "Find space", so the whole sentence -#. would read as "Find space without modifying any partition". -#: src/components/storage/space-policy-utils.jsx:145 -msgid "without modifying any partition" -msgstr "" - -#: src/components/storage/space-policy-utils.jsx:160 -#, c-format -msgid "This will only affect the installation device" -msgid_plural "This will affect the %d disks selected for installation" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - #: src/components/storage/utils.js:44 msgid "KiB" msgstr "" diff --git a/web/src/components/core/About.jsx b/web/src/components/core/About.jsx index 6fcd86cc5f..be97bd7892 100644 --- a/web/src/components/core/About.jsx +++ b/web/src/components/core/About.jsx @@ -51,9 +51,9 @@ export default function About() { { // TRANSLATORS: content of the "About" popup (1/2) _("Agama is an experimental installer for (open)SUSE systems. It \ -still under development so, please, do not use it in \ +is still under development so, please, do not use it in \ production environments. If you want to give it a try, we \ -recommend to use a virtual machine to prevent any possible \ +recommend using a virtual machine to prevent any possible \ data loss.") } diff --git a/web/src/components/storage/ProposalSettingsSection.jsx b/web/src/components/storage/ProposalSettingsSection.jsx index 1a8812d949..1ce78674db 100644 --- a/web/src/components/storage/ProposalSettingsSection.jsx +++ b/web/src/components/storage/ProposalSettingsSection.jsx @@ -26,6 +26,7 @@ import { _ } from "~/i18n"; import { If, PasswordAndConfirmationInput, Section, Popup } from "~/components/core"; import { Icon } from "~/components/layout"; import { noop } from "~/utils"; +import { hasFS } from "~/components/storage/utils"; /** * @typedef {import ("~/client/storage").ProposalManager.ProposalSettings} ProposalSettings @@ -112,6 +113,65 @@ const EncryptionSettingsForm = ({ ); }; +/** + * Allows to define snapshots enablement + * @component + * + * @param {object} props + * @param {ProposalSettings} props.settings - Settings used for calculating a proposal. + * @param {onChangeFn} [props.onChange=noop] - On change callback + * + * @callback onChangeFn + * @param {object} settings + */ +const SnapshotsField = ({ + settings, + onChange = noop +}) => { + const rootVolume = (settings.volumes || []).find((i) => i.mountPath === "/"); + + const initialChecked = rootVolume !== undefined && hasFS(rootVolume, "Btrfs") && rootVolume.snapshots; + const [isChecked, setIsChecked] = useState(initialChecked); + + // no root volume is probably some error or still loading + if (rootVolume === undefined) { + return ; + } + + const switchState = (_, checked) => { + setIsChecked(checked); + onChange({ active: checked, settings }); + }; + + const configurableSnapshots = rootVolume.outline.snapshotsConfigurable; + const forcedSnapshots = !configurableSnapshots && hasFS(rootVolume, "Btrfs") && rootVolume.snapshots; + + const SnapshotsToggle = () => { + const explanation = _("Uses Btrfs for the root file system allowing to boot to a previous version of the system after configuration changes or software upgrades."); + return ( + <> + +
+ {explanation} +
+ + ); + }; + + return ( +
+ + } /> +
+ ); +}; + /** * Allows to define encryption * @component @@ -237,11 +297,28 @@ export default function ProposalSettingsSection({ onChange({ encryptionPassword: password, encryptionMethod: method }); }; + const changeBtrfsSnapshots = ({ active, settings }) => { + const rootVolume = settings.volumes.find((i) => i.mountPath === "/"); + + if (active) { + rootVolume.fsType = "Btrfs"; + rootVolume.snapshots = true; + } else { + rootVolume.snapshots = false; + } + + onChange({ volumes: settings.volumes }); + }; + const encryption = settings.encryptionPassword !== undefined && settings.encryptionPassword.length > 0; return ( <>
+ { ); }; -/** - * Btrfs file system type can be offered with two flavors, with and without snapshots. - */ -const BTRFS_WITH_SNAPSHOTS = "BtrfsWithSnapshots"; - /** * Possible file system type options for a volume. * @function @@ -136,40 +131,7 @@ const BTRFS_WITH_SNAPSHOTS = "BtrfsWithSnapshots"; * @returns {string[]} */ const fsOptions = (volume) => { - const options = (volume, fsType) => { - if (fsType !== "Btrfs") return fsType; - - const { snapshotsConfigurable } = volume.outline; - if (snapshotsConfigurable) return [BTRFS_WITH_SNAPSHOTS, fsType]; - - return (volume.snapshots ? BTRFS_WITH_SNAPSHOTS : fsType); - }; - - return volume.outline.fsTypes.flatMap(fsType => options(volume, fsType)); -}; - -/** - * File system option according to the given type and the value of snapshots. - * @function - * - * @param {FsValue} value - * @returns {string} - */ -const fsOption = ({ fsType, snapshots }) => { - if (fsType !== "Btrfs") return fsType; - - return (snapshots ? BTRFS_WITH_SNAPSHOTS : fsType); -}; - -/** - * Label for a file system type option. - * @function - * - * @param {string} fsOption - * @returns {string} - */ -const fsOptionLabel = (fsOption) => { - return (fsOption === BTRFS_WITH_SNAPSHOTS ? sprintf("Btrfs %s", _("with snapshots")) : fsOption); + return volume.outline.fsTypes; }; /** @@ -180,10 +142,7 @@ const fsOptionLabel = (fsOption) => { * @returns {FsValue} */ const fsValue = (fsOption) => { - if (fsOption === BTRFS_WITH_SNAPSHOTS) - return { fsType: "Btrfs", snapshots: true }; - else - return { fsType: fsOption, snapshots: false }; + return { fsType: fsOption, snapshots: false }; }; /** @@ -196,27 +155,9 @@ const fsValue = (fsOption) => { * @returns {ReactComponent} */ const FsSelectOption = ({ fsOption }) => { - const label = () => { - if (fsOption === BTRFS_WITH_SNAPSHOTS) return "Btrfs"; - return fsOption; - }; - - const details = () => { - if (fsOption === BTRFS_WITH_SNAPSHOTS) return _("with snapshots"); - return undefined; - }; - - const description = () => { - if (fsOption === BTRFS_WITH_SNAPSHOTS) - // TRANSLATORS: description of Btrfs snapshots feature. - return _("Allows rolling back any change done to the system and restoring its previous state"); - - return undefined; - }; - return ( - - {label()} + + {fsOption} ); }; @@ -237,7 +178,7 @@ const FsSelect = ({ id, value, volume, onChange }) => { const [isOpen, setIsOpen] = useState(false); const options = fsOptions(volume); - const selected = fsOption(value); + const selected = value; const onToggleClick = () => { setIsOpen(!isOpen); @@ -257,7 +198,7 @@ const FsSelect = ({ id, value, volume, onChange }) => { isExpanded={isOpen} className="full-width" > - {fsOptionLabel(selected)} + {selected} ); }; @@ -300,8 +241,13 @@ const FsSelect = ({ id, value, volume, onChange }) => { */ const FsField = ({ value, volume, onChange }) => { const isSingleFs = () => { - const { fsTypes, snapshotsConfigurable } = volume.outline; - return fsTypes.length === 1 && (fsTypes[0] !== "Btrfs" || !snapshotsConfigurable); + // check for btrfs with snapshots + if (volume.fsType === "Btrfs" && volume.snapshots) { + return true; + } + + const { fsTypes } = volume.outline; + return fsTypes.length === 1; }; const Info = () => { @@ -330,7 +276,7 @@ const FsField = ({ value, volume, onChange }) => { condition={isSingleFs()} then={ -

{fsOptionLabel(fsOption(value))}

+

{value}

} else={ @@ -760,7 +706,7 @@ export default function VolumeForm({ id, volume: currentVolume, templates = [], if (!Object.keys(errors).length) onSubmit(volume); }; - const { fsType, snapshots } = state.formData; + const { fsType } = state.formData; const ShowMountPointSelector = () => ( diff --git a/web/src/components/storage/VolumeForm.test.jsx b/web/src/components/storage/VolumeForm.test.jsx index 94a47f5d98..a3ca147f48 100644 --- a/web/src/components/storage/VolumeForm.test.jsx +++ b/web/src/components/storage/VolumeForm.test.jsx @@ -95,12 +95,12 @@ beforeEach(() => { }); it("renders a control for displaying/selecting the file system type", async () => { - const { user } = plainRender(); + // use home which is not using snapshots + const { user } = plainRender(); const fsTypeButton = screen.getByRole("button", { name: "File system type" }); await user.click(fsTypeButton); - screen.getByRole("option", { name: /Btrfs with snapshots/ }); - screen.getByRole("option", { name: "Btrfs" }); + screen.getByRole("option", { name: "XFS" }); screen.getByRole("option", { name: "Ext4" }); }); @@ -117,6 +117,24 @@ it("does not render the file system control if there is only one option", async ); }); +it("renders the file system control for root mount point without snapshots", async () => { + const { user } = plainRender(); + + const fsTypeButton = screen.getByRole("button", { name: "File system type" }); + await user.click(fsTypeButton); + screen.getByRole("option", { name: "Btrfs" }); + screen.getByRole("option", { name: "Ext4" }); +}); + +it("does not render the file system control for root mount point with btrfs with snapshots", async () => { + plainRender(); + + await screen.findByText("Btrfs"); + await waitFor(() => ( + expect(screen.queryByRole("button", { name: "File system type" })).not.toBeInTheDocument()) + ); +}); + it("renders controls for setting the desired size", () => { plainRender(); @@ -179,17 +197,16 @@ it("calls the onSubmit callback with resulting volume when the form is submitted await user.type(maxSizeInput, "25"); await user.selectOptions(maxSizeUnitSelector, maxSizeGiBUnit); - const fsTypeButton = screen.getByRole("button", { name: "File system type" }); - await user.click(fsTypeButton); - const ext4Button = screen.getByRole("option", { name: "Ext4" }); - await user.click(ext4Button); + // root is with btrfs and snapshots, so it is not possible to select it + await screen.findByText("Btrfs"); + await waitFor(() => ( + expect(screen.queryByRole("button", { name: "File system type" })).not.toBeInTheDocument()) + ); await user.click(submitForm); expect(onSubmitFn).toHaveBeenCalledWith({ ...volumes.root, - fsType: "Ext4", - snapshots: false, minSize: parseToBytes("10 GiB"), maxSize: parseToBytes("25 GiB") }); diff --git a/web/src/components/storage/utils.js b/web/src/components/storage/utils.js index 3f4d7d77e5..621e5194dc 100644 --- a/web/src/components/storage/utils.js +++ b/web/src/components/storage/utils.js @@ -135,6 +135,20 @@ const deviceLabel = (device) => { return size ? `${name}, ${deviceSize(size)}` : name; }; +/** + * Checks if volume uses given fs. This method works same as in backend + * case insensitive. + * + * @param {import(~/clients/storage).Volume} volume + * @param {string} fs - Filesystem name to check. + * @returns {boolean} true when volume uses given fs + */ +const hasFS = (volume, fs) => { + const volFS = volume.fsType; + + return volFS.toLowerCase() === fs.toLocaleLowerCase(); +}; + export { DEFAULT_SIZE_UNIT, SIZE_METHODS, @@ -143,4 +157,5 @@ export { deviceSize, parseToBytes, splitSize, + hasFS }; diff --git a/web/src/components/storage/utils.test.js b/web/src/components/storage/utils.test.js index 5c65c3475b..052e69bbf7 100644 --- a/web/src/components/storage/utils.test.js +++ b/web/src/components/storage/utils.test.js @@ -19,7 +19,7 @@ * find current contact information at www.suse.com. */ -import { deviceSize, deviceLabel, parseToBytes, splitSize } from "./utils"; +import { deviceSize, deviceLabel, parseToBytes, splitSize, hasFS } from "./utils"; describe("deviceSize", () => { it("returns the size with units", () => { @@ -86,3 +86,17 @@ describe("splitSize", () => { expect(splitSize("")).toEqual({ size: undefined, unit: undefined }); }); }); + +describe("hasFS", () => { + it("returns true if volume has given filesystem", () => { + expect(hasFS({ fsType: "Btrfs" }, "Btrfs")).toBe(true); + }); + + it("returns true if volume has given filesystem regarding different case", () => { + expect(hasFS({ fsType: "btrfs" }, "Btrfs")).toBe(true); + }); + + it("returns false if volume has different filesystem", () => { + expect(hasFS({ fsType: "Btrfs" }, "EXT4")).toBe(false); + }); +});