From 2f9c1390d8386bd5e4d5692cd0c0d6e1e39a5f99 Mon Sep 17 00:00:00 2001 From: Marius Meisenzahl Date: Wed, 2 Oct 2024 23:28:46 +0200 Subject: [PATCH 01/37] Hostname validation (#825) --- .github/workflows/ci.yml | 1 + meson.build | 1 + src/HostnameValidator.vala | 43 +++++++++++++++++++++++++++++++++ src/Utils.vala | 2 +- src/meson.build | 1 + test/HostnameValidatorTest.vala | 24 ++++++++++++++++++ test/Test.vala | 5 ++++ test/meson.build | 13 ++++++++++ 8 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/HostnameValidator.vala create mode 100644 test/HostnameValidatorTest.vala create mode 100644 test/Test.vala create mode 100644 test/meson.build diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5bd86320b..359b907fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,6 +30,7 @@ jobs: run: | meson setup build ninja -C build install + ninja -C build test lint: runs-on: ubuntu-latest diff --git a/meson.build b/meson.build index 8f1a847ff..662a778b4 100644 --- a/meson.build +++ b/meson.build @@ -36,3 +36,4 @@ subdir('common') subdir('daemon') subdir('src') subdir('data') +subdir('test') diff --git a/src/HostnameValidator.vala b/src/HostnameValidator.vala new file mode 100644 index 000000000..27e7e9fb5 --- /dev/null +++ b/src/HostnameValidator.vala @@ -0,0 +1,43 @@ +/* + * Copyright 2018-2022 System76 + * Copyright 2024 elementary, Inc. (https://elementary.io) + * SPDX-License-Identifier: MIT + */ + +namespace Utils { + private bool hostname_is_valid_char (char c) { + return (c.isalnum () || + c == '-' || + c == '.'); + } + + // Based on https://github.com/pop-os/hostname-validator/blob/458fa5a1df98cb663f0456dffb542e1a907861c9/src/lib.rs#L29 + /// Validate a hostname according to [IETF RFC 1123](https://tools.ietf.org/html/rfc1123). + /// + /// A hostname is valid if the following condition are true: + /// + /// - It does not start or end with `-` or `.`. + /// - It does not contain any characters outside of the alphanumeric range, except for `-` and `.`. + /// - It is not empty. + /// - It is 253 or fewer characters. + /// - Its labels (characters separated by `.`) are not empty. + /// - Its labels are 63 or fewer characters. + /// - Its labels do not start or end with '-' or '.'. + public bool hostname_is_valid (string hostname) { + for (int i = 0; i < hostname.char_count (); i++) { + char c = hostname[i]; + if (!hostname_is_valid_char (c)) { + return false; + } + } + + string[] labels = hostname.split (".", -1); + foreach (string label in labels) { + if (label.char_count () == 0 || label.length > 63 || label[0] == '-' || label[label.length - 1] == '-') { + return false; + } + } + + return !(hostname.char_count () == 0 || hostname.length > 253); + } +} diff --git a/src/Utils.vala b/src/Utils.vala index 8368ab2cf..c8b59a0a4 100644 --- a/src/Utils.vala +++ b/src/Utils.vala @@ -267,7 +267,7 @@ namespace Utils { // If the automatic hostname logic fails in some way, it's possible we may generate an invalid // hostname. We could fix this by trimming traling/leading hyphens or other invalid characters. // But it's probably a bad hostname anyway, so just fallback - if (!Distinst.validate_hostname (hostname)) { + if (!hostname_is_valid (hostname)) { hostname = "elementary-os"; } diff --git a/src/meson.build b/src/meson.build index 504555f76..3ecf0f994 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,5 +1,6 @@ vala_files = [ 'Application.vala', + 'HostnameValidator.vala', 'MainWindow.vala', 'Utils.vala', 'Helpers/InstallerDaemon.vala', diff --git a/test/HostnameValidatorTest.vala b/test/HostnameValidatorTest.vala new file mode 100644 index 000000000..7399c553e --- /dev/null +++ b/test/HostnameValidatorTest.vala @@ -0,0 +1,24 @@ +void add_hostname_validator_tests () { + Test.add_func ("/valid", () => { + assert (Utils.hostname_is_valid ("VaLiD-HoStNaMe")); + assert (Utils.hostname_is_valid ("50-name")); + assert (Utils.hostname_is_valid ("235235")); + assert (Utils.hostname_is_valid ("example.com")); + assert (Utils.hostname_is_valid ("VaLid.HoStNaMe")); + assert (Utils.hostname_is_valid ("123.456")); + }); + + Test.add_func ("/invalid", () => { + assert (!Utils.hostname_is_valid ("-invalid-name")); + assert (!Utils.hostname_is_valid ("also-invalid-")); + assert (!Utils.hostname_is_valid ("asdf@fasd")); + assert (!Utils.hostname_is_valid ("@asdfl")); + assert (!Utils.hostname_is_valid ("asd f@")); + assert (!Utils.hostname_is_valid (".invalid")); + assert (!Utils.hostname_is_valid ("invalid.name.")); + assert (!Utils.hostname_is_valid ("foo.label-is-way-to-longgggggggggggggggggggggggggggggggggggggggggggg.org")); + assert (!Utils.hostname_is_valid ("invalid.-starting.char")); + assert (!Utils.hostname_is_valid ("invalid.ending-.char")); + assert (!Utils.hostname_is_valid ("empty..label")); + }); +} diff --git a/test/Test.vala b/test/Test.vala new file mode 100644 index 000000000..de40a0434 --- /dev/null +++ b/test/Test.vala @@ -0,0 +1,5 @@ +void main (string[] args) { + Test.init (ref args); + add_hostname_validator_tests (); + Test.run (); +} diff --git a/test/meson.build b/test/meson.build new file mode 100644 index 000000000..1ef64043d --- /dev/null +++ b/test/meson.build @@ -0,0 +1,13 @@ +test_dependencies = [ + glib_dep, +] + +tests = executable( + meson.project_name() + '-tests', + 'HostnameValidatorTest.vala', + 'Test.vala', + meson.project_source_root() + '/src/HostnameValidator.vala', + dependencies: test_dependencies +) + +test('Test', tests) From 6337c27e904a188e12370fb1eecc928efa2d6462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Thu, 3 Oct 2024 07:57:55 -0700 Subject: [PATCH 02/37] HostnameValidatorTest: cleanup, comments, more tests (#826) --- src/HostnameValidator.vala | 52 ++++++++++++++++++++------------- test/HostnameValidatorTest.vala | 35 ++++++++++++++++++---- test/Test.vala | 5 ---- test/meson.build | 16 ++++------ 4 files changed, 67 insertions(+), 41 deletions(-) delete mode 100644 test/Test.vala diff --git a/src/HostnameValidator.vala b/src/HostnameValidator.vala index 27e7e9fb5..069722c78 100644 --- a/src/HostnameValidator.vala +++ b/src/HostnameValidator.vala @@ -4,40 +4,50 @@ * SPDX-License-Identifier: MIT */ -namespace Utils { - private bool hostname_is_valid_char (char c) { - return (c.isalnum () || - c == '-' || - c == '.'); - } +/** + * Validate a hostname according to [IETF RFC 1123](https://tools.ietf.org/html/rfc1123) + * + * Based on https://github.com/pop-os/hostname-validator/blob/458fa5a1df98cb663f0456dffb542e1a907861c9/src/lib.rs#L29 + */ - // Based on https://github.com/pop-os/hostname-validator/blob/458fa5a1df98cb663f0456dffb542e1a907861c9/src/lib.rs#L29 - /// Validate a hostname according to [IETF RFC 1123](https://tools.ietf.org/html/rfc1123). - /// - /// A hostname is valid if the following condition are true: - /// - /// - It does not start or end with `-` or `.`. - /// - It does not contain any characters outside of the alphanumeric range, except for `-` and `.`. - /// - It is not empty. - /// - It is 253 or fewer characters. - /// - Its labels (characters separated by `.`) are not empty. - /// - Its labels are 63 or fewer characters. - /// - Its labels do not start or end with '-' or '.'. +namespace Utils { public bool hostname_is_valid (string hostname) { + // It is not empty + if (hostname.char_count () == 0) { + return false; + } + + // It is 253 or fewer characters + if (hostname.length > 253) { + return false; + } + + // It does not contain any characters outside of the alphanumeric range, except for `-` and `.` for (int i = 0; i < hostname.char_count (); i++) { char c = hostname[i]; - if (!hostname_is_valid_char (c)) { + if (!(c.isalnum () || c == '-' || c == '.')) { return false; } } string[] labels = hostname.split (".", -1); foreach (string label in labels) { - if (label.char_count () == 0 || label.length > 63 || label[0] == '-' || label[label.length - 1] == '-') { + // Its labels (characters separated by `.`) are not empty. + if (label.char_count () == 0) { + return false; + } + + // Its labels do not start or end with '-' or '.' + if (label.has_prefix ("-") || label.has_suffix ("-") || label.has_prefix (".") || label.has_suffix (".")) { + return false; + } + + // Its labels are 63 or fewer characters. + if (label.length > 63) { return false; } } - return !(hostname.char_count () == 0 || hostname.length > 253); + return true; } } diff --git a/test/HostnameValidatorTest.vala b/test/HostnameValidatorTest.vala index 7399c553e..a1803cf13 100644 --- a/test/HostnameValidatorTest.vala +++ b/test/HostnameValidatorTest.vala @@ -1,4 +1,12 @@ -void add_hostname_validator_tests () { +/* + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2024 elementary, Inc. (https://elementary.io) + */ + +// Validate a hostname according to [IETF RFC 1123](https://tools.ietf.org/html/rfc1123) +private void main (string[] args) { + Test.init (ref args); + Test.add_func ("/valid", () => { assert (Utils.hostname_is_valid ("VaLiD-HoStNaMe")); assert (Utils.hostname_is_valid ("50-name")); @@ -9,16 +17,33 @@ void add_hostname_validator_tests () { }); Test.add_func ("/invalid", () => { - assert (!Utils.hostname_is_valid ("-invalid-name")); - assert (!Utils.hostname_is_valid ("also-invalid-")); + // It is not empty + assert (!Utils.hostname_is_valid ("")); + + // It is 253 or fewer characters + assert (!Utils.hostname_is_valid ("foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo.bar.baz.foo")); + + // It does not contain any characters outside of the alphanumeric range, except for `-` and `.` assert (!Utils.hostname_is_valid ("asdf@fasd")); assert (!Utils.hostname_is_valid ("@asdfl")); assert (!Utils.hostname_is_valid ("asd f@")); + + // It does not start or end with `-` or `.` + assert (!Utils.hostname_is_valid ("-invalid-name")); + assert (!Utils.hostname_is_valid ("also-invalid-")); assert (!Utils.hostname_is_valid (".invalid")); assert (!Utils.hostname_is_valid ("invalid.name.")); - assert (!Utils.hostname_is_valid ("foo.label-is-way-to-longgggggggggggggggggggggggggggggggggggggggggggg.org")); + + // Its labels (characters separated by `.`) are not empty. + assert (!Utils.hostname_is_valid ("empty..label")); + + // Its labels do not start or end with '-' or '.' assert (!Utils.hostname_is_valid ("invalid.-starting.char")); assert (!Utils.hostname_is_valid ("invalid.ending-.char")); - assert (!Utils.hostname_is_valid ("empty..label")); + + // Its labels are 63 or fewer characters. + assert (!Utils.hostname_is_valid ("foo.label-is-way-to-longgggggggggggggggggggggggggggggggggggggggggggg.org")); }); + + Test.run (); } diff --git a/test/Test.vala b/test/Test.vala deleted file mode 100644 index de40a0434..000000000 --- a/test/Test.vala +++ /dev/null @@ -1,5 +0,0 @@ -void main (string[] args) { - Test.init (ref args); - add_hostname_validator_tests (); - Test.run (); -} diff --git a/test/meson.build b/test/meson.build index 1ef64043d..389e4cc59 100644 --- a/test/meson.build +++ b/test/meson.build @@ -1,13 +1,9 @@ -test_dependencies = [ - glib_dep, -] - -tests = executable( - meson.project_name() + '-tests', +hostname_validator_test = executable( + 'HostnameValidatorTest', 'HostnameValidatorTest.vala', - 'Test.vala', - meson.project_source_root() + '/src/HostnameValidator.vala', - dependencies: test_dependencies + meson.project_source_root() / 'src' / 'HostnameValidator.vala', + dependencies: glib_dep, + install: false ) -test('Test', tests) +test('HostnameValidator Test', hostname_validator_test) From c35927ab47a77cbc1dd35f8865a5611fec8139fe Mon Sep 17 00:00:00 2001 From: Marius Meisenzahl Date: Thu, 3 Oct 2024 17:00:38 +0200 Subject: [PATCH 03/37] Prepare support for other backends (#737) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Danielle Foré --- common/DBusStructures.vala | 49 ++- daemon/Daemon.vala | 568 +------------------------- daemon/DistinstBackend.vala | 656 +++++++++++++++++++++++++++++++ daemon/meson.build | 12 +- meson.build | 8 +- meson_options.txt | 1 + src/Helpers/InstallerDaemon.vala | 22 +- src/Helpers/LogHelper.vala | 14 +- src/Views/PartitioningView.vala | 12 +- src/Views/ProgressView.vala | 34 +- src/Widgets/PartitionMenu.vala | 6 +- src/meson.build | 1 - 12 files changed, 769 insertions(+), 614 deletions(-) create mode 100644 daemon/DistinstBackend.vala diff --git a/common/DBusStructures.vala b/common/DBusStructures.vala index 1ca14fb0f..eaa64cecd 100644 --- a/common/DBusStructures.vala +++ b/common/DBusStructures.vala @@ -79,6 +79,50 @@ public enum InstallerDaemon.FileSystem { } } +public struct InstallerDaemon.PartitionUsage { + /** + * None = 0; Some(usage) = 1; + */ + public uint8 tag; + /** + * The size, in sectors, that a partition is used. + */ + public uint64 value; +} + +public enum InstallerDaemon.PartitionTable { + NONE, + GPT, + MSDOS; +} + +public enum InstallerDaemon.Step { + BACKUP, + INIT, + PARTITION, + EXTRACT, + CONFIGURE, + BOOTLOADER; +} + +public struct InstallerDaemon.Status { + Step step; + int percent; +} + +public enum InstallerDaemon.LogLevel { + TRACE, + DEBUG, + INFO, + WARN, + ERROR; +} + +public struct InstallerDaemon.Error { + Step step; + int err; +} + public struct InstallerDaemon.Partition { string device_path; @@ -86,7 +130,7 @@ public struct InstallerDaemon.Partition { uint64 start_sector; uint64 end_sector; - Distinst.PartitionUsage sectors_used; + PartitionUsage sectors_used; string? current_lvm_volume_group; } @@ -95,7 +139,8 @@ public struct InstallerDaemon.InstallConfig { string keyboard_layout; string keyboard_variant; string lang; - uint8 flags; + bool modify_boot_order; + bool install_drivers; } [Flags] diff --git a/daemon/Daemon.vala b/daemon/Daemon.vala index 04a53fe55..0fd716099 100644 --- a/daemon/Daemon.vala +++ b/daemon/Daemon.vala @@ -17,573 +17,11 @@ private static GLib.MainLoop loop; -[DBus (name = "io.elementary.InstallerDaemon")] -public class InstallerDaemon.Daemon : GLib.Object { - public signal void on_log_message (Distinst.LogLevel level, string message); - public signal void on_status (Distinst.Status status); - public signal void on_error (Distinst.Error error); - - private Distinst.Disks disks; - - construct { - Distinst.log ((level, message) => { - Idle.add (() => { - on_log_message (level, message); - }); - }); - } - - public Distinst.PartitionTable bootloader_detect () throws GLib.Error { - return Distinst.bootloader_detect (); - } - - public DiskInfo get_disks (bool get_partitions = false) throws GLib.Error { - disks = Distinst.Disks.probe (); - - if (get_partitions) { - disks.initialize_volume_groups (); - } - - DiskInfo result = DiskInfo (); - - Disk[] physical_disks = {}; - Disk[] logical_disks = {}; - - foreach (unowned Distinst.Disk disk in disks.list ()) { - if (disk.is_read_only ()) { - continue; - } - - // Skip root disk or live disk - if (disk.contains_mount ("/", disks) || disk.contains_mount ("/cdrom", disks)) { - continue; - } - - Partition[] partitions = {}; - - if (get_partitions) { - foreach (unowned Distinst.Partition part in disk.list_partitions ()) { - string lvm_vg = (part.get_file_system () == Distinst.FileSystem.LVM) - ? string_from_utf8 (part.get_current_lvm_volume_group ()) - : ""; - - partitions += Partition () { - device_path = string_from_utf8 (part.get_device_path ()), - filesystem = to_common_fs (part.get_file_system ()), - start_sector = part.get_start_sector (), - end_sector = part.get_end_sector (), - sectors_used = part.sectors_used (disk.get_sector_size ()), - current_lvm_volume_group = lvm_vg - }; - } - } - - string model = string_from_utf8 (disk.get_model ()); - string name = model.length == 0 ? string_from_utf8 (disk.get_serial ()).replace ("_", " ") : model; - - physical_disks += Disk () { - name = name, - device_path = string_from_utf8 (disk.get_device_path ()), - sectors = disk.get_sectors (), - sector_size = disk.get_sector_size (), - rotational = disk.is_rotational (), - removable = disk.is_removable (), - partitions = partitions - }; - } - - if (get_partitions) { - foreach (unowned Distinst.LvmDevice disk in disks.list_logical ()) { - Partition[] partitions = {}; - - foreach (unowned Distinst.Partition part in disk.list_partitions ()) { - string lvm_vg = (part.get_file_system () == Distinst.FileSystem.LVM) - ? string_from_utf8 (part.get_current_lvm_volume_group ()) - : ""; - - partitions += Partition () { - device_path = string_from_utf8 (part.get_device_path ()), - filesystem = to_common_fs (part.get_file_system ()), - start_sector = part.get_start_sector (), - end_sector = part.get_end_sector (), - sectors_used = part.sectors_used (disk.get_sector_size ()), - current_lvm_volume_group = lvm_vg - }; - } - - logical_disks += Disk () { - name = string_from_utf8 (disk.get_model ()), - device_path = string_from_utf8 (disk.get_device_path ()), - sectors = disk.get_sectors (), - sector_size = disk.get_sector_size (), - partitions = partitions - }; - } - } - - result.physical_disks = physical_disks; - result.logical_disks = logical_disks; - return result; - } - - public int decrypt_partition (string path, string pv, string password) throws GLib.Error { - return disks.decrypt_partition (path, Distinst.LvmEncryption () { - physical_volume = pv, - password = password, - keydata = null - }); - } - - public Disk get_logical_device (string pv) throws GLib.Error { - unowned Distinst.LvmDevice disk = disks.get_logical_device (pv); - if (disk == null) { - throw new GLib.IOError.NOT_FOUND ("Couldn't find a logical device with that name"); - } - - Partition[] partitions = {}; - - foreach (unowned Distinst.Partition part in disk.list_partitions ()) { - string lvm_vg = (part.get_file_system () == Distinst.FileSystem.LVM) - ? string_from_utf8 (part.get_current_lvm_volume_group ()) - : ""; - - partitions += Partition () { - device_path = string_from_utf8 (part.get_device_path ()), - filesystem = to_common_fs (part.get_file_system ()), - start_sector = part.get_start_sector (), - end_sector = part.get_end_sector (), - sectors_used = part.sectors_used (disk.get_sector_size ()), - current_lvm_volume_group = lvm_vg - }; - } - - return Disk () { - name = string_from_utf8 (disk.get_model ()), - device_path = string_from_utf8 (disk.get_device_path ()), - sectors = disk.get_sectors (), - sector_size = disk.get_sector_size (), - partitions = partitions - }; - } - - public void install_with_default_disk_layout (InstallConfig config, string disk, bool encrypt, string encryption_password) throws GLib.Error { - var disks = new Distinst.Disks (); - default_disk_configuration (disks, disk, encrypt ? encryption_password : null); - - install (config, (owned) disks); - } - - public void install_with_custom_disk_layout (InstallConfig config, Mount[] disk_config, LuksCredentials[] credentials) throws GLib.Error { - var disks = new Distinst.Disks (); - custom_disk_configuration (disks, disk_config, credentials); - - install (config, (owned) disks); - } - - private void install (InstallConfig config, owned Distinst.Disks disks) { - var installer = new Distinst.Installer (); - installer.on_error ((error) => on_error (error)); - installer.on_status ((status) => on_status (status)); - - var distinst_config = Distinst.Config (); - distinst_config.flags = config.flags; - distinst_config.hostname = config.hostname; - - var casper = casper_dir (); - distinst_config.remove = GLib.Path.build_filename (casper, "filesystem.manifest-remove"); - distinst_config.squashfs = GLib.Path.build_filename (casper, "filesystem.squashfs"); - - debug ("language: %s\n", config.lang); - distinst_config.lang = config.lang; - - distinst_config.keyboard_layout = config.keyboard_layout; - distinst_config.keyboard_model = null; - distinst_config.keyboard_variant = config.keyboard_variant == "" ? null : config.keyboard_variant; - - new Thread (null, () => { - if (installer.install ((owned) disks, distinst_config) != 0) { - Idle.add (() => { - on_error (Distinst.Error ()); - return GLib.Source.REMOVE; - }); - } - - return null; - }); - } - - public void set_demo_mode_locale (string locale) throws GLib.Error { - GLib.FileUtils.set_contents ("/etc/default/locale", "LANG=" + locale); - } - - public void trigger_demo_mode () throws GLib.Error { - var demo_mode_file = GLib.File.new_for_path ("/var/lib/lightdm/demo-mode"); - try { - demo_mode_file.create (GLib.FileCreateFlags.NONE); - } catch (Error e) { - if (!(e is GLib.IOError.EXISTS)) { - throw e; - } - } - } - - private string casper_dir () { - const string CDROM = "/cdrom"; - - try { - var cdrom_dir = File.new_for_path (CDROM); - var iter = cdrom_dir.enumerate_children (FileAttribute.STANDARD_NAME, 0); - - FileInfo info; - while ((info = iter.next_file ()) != null) { - unowned string name = info.get_name (); - if (name.has_prefix ("casper")) { - return GLib.Path.build_filename (CDROM, name); - } - } - } catch (GLib.Error e) { - critical ("failed to find casper dir automatically: %s\n", e.message); - } - - return GLib.Path.build_filename (CDROM, "casper"); - } - - private void default_disk_configuration (Distinst.Disks disks, string disk_path, string? encryption_password) throws GLib.IOError { - var encrypted_vg = Distinst.generate_unique_id ("cryptdata"); - var root_vg = Distinst.generate_unique_id ("data"); - if (encrypted_vg == null || root_vg == null) { - throw new GLib.IOError.FAILED ("Unable to generate unique volume group IDs"); - } - - Distinst.LvmEncryption? encryption; - if (encryption_password != null) { - debug ("encrypting"); - encryption = Distinst.LvmEncryption () { - physical_volume = encrypted_vg, - password = encryption_password, - keydata = null - }; - } else { - debug ("not encrypting"); - encryption = null; - } - - debug ("disk: %s\n", disk_path); - var disk = new Distinst.Disk (disk_path); - if (disk == null) { - throw new GLib.IOError.FAILED ("Could not find %s", disk_path); - } - - var bootloader = Distinst.bootloader_detect (); - - var start_sector = Distinst.Sector () { - flag = Distinst.SectorKind.START, - value = 0 - }; - - // 256 MiB is the minimum distinst ESP partition size, so this is 256 MiB in MB plus a bit - // extra for safety - var efi_sector = Distinst.Sector () { - flag = Distinst.SectorKind.MEGABYTE, - value = 278 - }; - - // 1024MB /boot partition that's created if we're doing encryption - var boot_sector = Distinst.Sector () { - flag = Distinst.SectorKind.MEGABYTE, - value = efi_sector.value + 1024 - }; - - // 4GB swap partition at the end - var swap_sector = Distinst.Sector () { - flag = Distinst.SectorKind.MEGABYTE_FROM_END, - value = 4096 - }; - - var end_sector = Distinst.Sector () { - flag = Distinst.SectorKind.END, - value = 0 - }; - - // Prepares a new partition table. - int result = disk.mklabel (bootloader); - - if (result != 0) { - throw new GLib.IOError.FAILED ("Unable to write partition table to %s", disk_path); - } - - var start = disk.get_sector (ref start_sector); - var end = disk.get_sector (ref boot_sector); - - switch (bootloader) { - case Distinst.PartitionTable.MSDOS: - // This is used to ensure LVM installs will work with BIOS - result = disk.add_partition ( - new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.EXT4) - .partition_type (Distinst.PartitionType.PRIMARY) - .flag (Distinst.PartitionFlag.BOOT) - .mount ("/boot") - ); - - if (result != 0) { - throw new GLib.IOError.FAILED ("Unable to add boot partition to %s", disk_path); - } - - // Start the LVM from the end of our /boot partition - start = disk.get_sector (ref boot_sector); - break; - case Distinst.PartitionTable.GPT: - end = disk.get_sector (ref efi_sector); - - // A FAT32 partition is required for EFI installs - result = disk.add_partition ( - new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.FAT32) - .partition_type (Distinst.PartitionType.PRIMARY) - .flag (Distinst.PartitionFlag.ESP) - .mount ("/boot/efi") - ); - - if (result != 0) { - throw new GLib.IOError.FAILED ("Unable to add EFI partition to %s", disk_path); - } - - // If we're encrypting, we need an unencrypted partition to store kernels and initramfs images - if (encryption != null) { - start = disk.get_sector (ref efi_sector); - end = disk.get_sector (ref boot_sector); - - result = disk.add_partition ( - new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.EXT4) - .partition_type (Distinst.PartitionType.PRIMARY) - .mount ("/boot") - ); - - if (result != 0) { - throw new GLib.IOError.FAILED ("unable to add /boot partition to %s", disk_path); - } - - // Start the LVM from the end of our /boot/efi and /boot partitions - start = disk.get_sector (ref boot_sector); - } else { - // No encryption, we only have a /boot/efi partition, start the LVM from there - start = disk.get_sector (ref efi_sector); - } - - break; - } - - end = disk.get_sector (ref end_sector); - - result = disk.add_partition ( - new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.LVM) - .partition_type (Distinst.PartitionType.PRIMARY) - .logical_volume (root_vg, encryption) - ); - - if (result != 0) { - throw new GLib.IOError.FAILED ("Unable to add LVM partition to %s", disk_path); - } - - disks.push ((owned) disk); - - result = disks.initialize_volume_groups (); - - if (result != 0) { - throw new GLib.IOError.FAILED ("Unable to initialize volume groups on %s", disk_path); - } - - unowned Distinst.LvmDevice lvm_device = disks.get_logical_device (root_vg); - - if (lvm_device == null) { - throw new GLib.IOError.FAILED ("Unable to find '%s' volume group on %s", root_vg, disk_path); - } - - start = lvm_device.get_sector (ref start_sector); - end = lvm_device.get_sector (ref swap_sector); - - result = lvm_device.add_partition ( - new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.EXT4) - .name ("root") - .mount ("/") - ); - - if (result != 0) { - throw new GLib.IOError.FAILED ("Unable to add / partition to LVM on %s", disk_path); - } - - start = lvm_device.get_sector (ref swap_sector); - end = lvm_device.get_sector (ref end_sector); - - result = lvm_device.add_partition ( - new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.SWAP) - .name ("swap") - ); - - if (result != 0) { - throw new GLib.IOError.FAILED ("Unable to add swap partition to LVM on %s", disk_path); - } - } - - private void custom_disk_configuration (Distinst.Disks disks, Mount[] mounts, LuksCredentials[] credentials) throws GLib.IOError { - Mount[] lvm_devices = {}; - - foreach (Mount m in mounts) { - if (m.is_lvm ()) { - lvm_devices += m; - } else { - unowned Distinst.Disk disk = disks.get_physical_device (m.parent_disk); - if (disk == null) { - var new_disk = new Distinst.Disk (m.parent_disk); - if (new_disk == null) { - throw new GLib.IOError.FAILED ("Could not find physical device: '%s'", m.parent_disk); - } - - disks.push ((owned) new_disk); - disk = disks.get_physical_device (m.parent_disk); - } - - unowned Distinst.Partition partition = disk.get_partition_by_path (m.partition_path); - - if (partition == null) { - throw new GLib.IOError.FAILED ("Could not find %s", m.partition_path); - } - - if (m.mount_point == "/boot/efi") { - if (m.is_valid_boot_mount ()) { - if (m.should_format ()) { - partition.format_with (to_distinst_fs (m.filesystem)); - } - - partition.set_mount (m.mount_point); - partition.set_flags ({ Distinst.PartitionFlag.ESP }); - } else { - throw new GLib.IOError.FAILED ("Unreachable code path -- EFI partition is invalid"); - } - } else { - if (m.filesystem != SWAP) { - partition.set_mount (m.mount_point); - } - - if (m.mount_point == "/boot") { - partition.set_flags ({ Distinst.PartitionFlag.BOOT }); - } - - if (m.should_format ()) { - partition.format_with (to_distinst_fs (m.filesystem)); - } - } - } - } - - disks.initialize_volume_groups (); - - foreach (LuksCredentials cred in credentials) { - disks.decrypt_partition (cred.device, Distinst.LvmEncryption () { - physical_volume = cred.pv, - password = cred.password, - keydata = null - }); - } - - foreach (Mount m in lvm_devices) { - var vg = m.parent_disk.offset (12); - unowned Distinst.LvmDevice disk = disks.get_logical_device (vg); - if (disk == null) { - throw new GLib.IOError.FAILED ("Could not find %s", vg); - } - - unowned Distinst.Partition partition = disk.get_partition_by_path (m.partition_path); - - if (partition == null) { - throw new GLib.IOError.FAILED ("could not find %s", m.partition_path); - } - - if (m.filesystem != SWAP) { - partition.set_mount (m.mount_point); - } - - if (m.should_format ()) { - partition.format_and_keep_name (to_distinst_fs (m.filesystem)); - } - } - } - - private static string string_from_utf8 (uint8[] input) { - var builder = new GLib.StringBuilder.sized (input.length); - builder.append_len ((string) input, input.length); - return (owned) builder.str; - } - - private InstallerDaemon.FileSystem to_common_fs (Distinst.FileSystem fs) { - switch (fs) { - case BTRFS: - return InstallerDaemon.FileSystem.BTRFS; - case EXT2: - return InstallerDaemon.FileSystem.EXT2; - case EXT3: - return InstallerDaemon.FileSystem.EXT3; - case EXT4: - return InstallerDaemon.FileSystem.EXT4; - case F2FS: - return InstallerDaemon.FileSystem.F2FS; - case FAT16: - return InstallerDaemon.FileSystem.FAT16; - case FAT32: - return InstallerDaemon.FileSystem.FAT32; - case NONE: - return InstallerDaemon.FileSystem.NONE; - case NTFS: - return InstallerDaemon.FileSystem.NTFS; - case SWAP: - return InstallerDaemon.FileSystem.SWAP; - case XFS: - return InstallerDaemon.FileSystem.XFS; - case LVM: - return InstallerDaemon.FileSystem.LVM; - case LUKS: - return InstallerDaemon.FileSystem.LUKS; - default: - return InstallerDaemon.FileSystem.NONE; - } - } - - private Distinst.FileSystem to_distinst_fs (InstallerDaemon.FileSystem fs) { - switch (fs) { - case BTRFS: - return Distinst.FileSystem.BTRFS; - case EXT2: - return Distinst.FileSystem.EXT2; - case EXT3: - return Distinst.FileSystem.EXT3; - case EXT4: - return Distinst.FileSystem.EXT4; - case F2FS: - return Distinst.FileSystem.F2FS; - case FAT16: - return Distinst.FileSystem.FAT16; - case FAT32: - return Distinst.FileSystem.FAT32; - case NONE: - return Distinst.FileSystem.NONE; - case NTFS: - return Distinst.FileSystem.NTFS; - case SWAP: - return Distinst.FileSystem.SWAP; - case XFS: - return Distinst.FileSystem.XFS; - case LVM: - return Distinst.FileSystem.LVM; - case LUKS: - return Distinst.FileSystem.LUKS; - default: - return Distinst.FileSystem.NONE; - } - } -} - private void on_bus_acquired (GLib.DBusConnection connection, string name) { try { - connection.register_object ("/io/elementary/InstallerDaemon", new InstallerDaemon.Daemon ()); +#if DISTINST_BACKEND + connection.register_object ("/io/elementary/InstallerDaemon", new InstallerDaemon.DistinstBackend ()); +#endif } catch (GLib.Error e) { critical ("Unable to register the object: %s", e.message); } diff --git a/daemon/DistinstBackend.vala b/daemon/DistinstBackend.vala new file mode 100644 index 000000000..b356ba868 --- /dev/null +++ b/daemon/DistinstBackend.vala @@ -0,0 +1,656 @@ +/* + * Copyright 2021 elementary, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +[DBus (name = "io.elementary.InstallerDaemon")] +public class InstallerDaemon.DistinstBackend : GLib.Object { + public signal void on_log_message (InstallerDaemon.LogLevel level, string message); + public signal void on_status (InstallerDaemon.Status status); + public signal void on_error (InstallerDaemon.Error error); + + private Distinst.Disks disks; + + construct { + Distinst.log ((level, message) => { + Idle.add (() => { + on_log_message (to_common_log_level (level), message); + }); + }); + } + + public InstallerDaemon.PartitionTable bootloader_detect () throws GLib.Error { + return to_common_usage_bootloader (Distinst.bootloader_detect ()); + } + + public DiskInfo get_disks (bool get_partitions = false) throws GLib.Error { + disks = Distinst.Disks.probe (); + + if (get_partitions) { + disks.initialize_volume_groups (); + } + + DiskInfo result = DiskInfo (); + + Disk[] physical_disks = {}; + Disk[] logical_disks = {}; + + foreach (unowned Distinst.Disk disk in disks.list ()) { + if (disk.is_read_only ()) { + continue; + } + + // Skip root disk or live disk + if (disk.contains_mount ("/", disks) || disk.contains_mount ("/cdrom", disks)) { + continue; + } + + Partition[] partitions = {}; + + if (get_partitions) { + foreach (unowned Distinst.Partition part in disk.list_partitions ()) { + string lvm_vg = (part.get_file_system () == Distinst.FileSystem.LVM) + ? string_from_utf8 (part.get_current_lvm_volume_group ()) + : ""; + + partitions += Partition () { + device_path = string_from_utf8 (part.get_device_path ()), + filesystem = to_common_fs (part.get_file_system ()), + start_sector = part.get_start_sector (), + end_sector = part.get_end_sector (), + sectors_used = to_common_usage (part.sectors_used (disk.get_sector_size ())), + current_lvm_volume_group = lvm_vg + }; + } + } + + string model = string_from_utf8 (disk.get_model ()); + string name = model.length == 0 ? string_from_utf8 (disk.get_serial ()).replace ("_", " ") : model; + + physical_disks += Disk () { + name = name, + device_path = string_from_utf8 (disk.get_device_path ()), + sectors = disk.get_sectors (), + sector_size = disk.get_sector_size (), + rotational = disk.is_rotational (), + removable = disk.is_removable (), + partitions = partitions + }; + } + + if (get_partitions) { + foreach (unowned Distinst.LvmDevice disk in disks.list_logical ()) { + Partition[] partitions = {}; + + foreach (unowned Distinst.Partition part in disk.list_partitions ()) { + string lvm_vg = (part.get_file_system () == Distinst.FileSystem.LVM) + ? string_from_utf8 (part.get_current_lvm_volume_group ()) + : ""; + + partitions += Partition () { + device_path = string_from_utf8 (part.get_device_path ()), + filesystem = to_common_fs (part.get_file_system ()), + start_sector = part.get_start_sector (), + end_sector = part.get_end_sector (), + sectors_used = to_common_usage (part.sectors_used (disk.get_sector_size ())), + current_lvm_volume_group = lvm_vg + }; + } + + logical_disks += Disk () { + name = string_from_utf8 (disk.get_model ()), + device_path = string_from_utf8 (disk.get_device_path ()), + sectors = disk.get_sectors (), + sector_size = disk.get_sector_size (), + partitions = partitions + }; + } + } + + result.physical_disks = physical_disks; + result.logical_disks = logical_disks; + return result; + } + + public int decrypt_partition (string path, string pv, string password) throws GLib.Error { + return disks.decrypt_partition (path, Distinst.LvmEncryption () { + physical_volume = pv, + password = password, + keydata = null + }); + } + + public Disk get_logical_device (string pv) throws GLib.Error { + unowned Distinst.LvmDevice disk = disks.get_logical_device (pv); + if (disk == null) { + throw new GLib.IOError.NOT_FOUND ("Couldn't find a logical device with that name"); + } + + Partition[] partitions = {}; + + foreach (unowned Distinst.Partition part in disk.list_partitions ()) { + string lvm_vg = (part.get_file_system () == Distinst.FileSystem.LVM) + ? string_from_utf8 (part.get_current_lvm_volume_group ()) + : ""; + + partitions += Partition () { + device_path = string_from_utf8 (part.get_device_path ()), + filesystem = to_common_fs (part.get_file_system ()), + start_sector = part.get_start_sector (), + end_sector = part.get_end_sector (), + sectors_used = to_common_usage (part.sectors_used (disk.get_sector_size ())), + current_lvm_volume_group = lvm_vg + }; + } + + return Disk () { + name = string_from_utf8 (disk.get_model ()), + device_path = string_from_utf8 (disk.get_device_path ()), + sectors = disk.get_sectors (), + sector_size = disk.get_sector_size (), + partitions = partitions + }; + } + + public void install_with_default_disk_layout (InstallConfig config, string disk, bool encrypt, string encryption_password) throws GLib.Error { + var disks = new Distinst.Disks (); + default_disk_configuration (disks, disk, encrypt ? encryption_password : null); + + install (config, (owned) disks); + } + + public void install_with_custom_disk_layout (InstallConfig config, Mount[] disk_config, LuksCredentials[] credentials) throws GLib.Error { + var disks = new Distinst.Disks (); + custom_disk_configuration (disks, disk_config, credentials); + + install (config, (owned) disks); + } + + private void install (InstallConfig config, owned Distinst.Disks disks) { + var installer = new Distinst.Installer (); + installer.on_error ((error) => on_error (to_common_error (error))); + installer.on_status ((status) => on_status (to_common_status (status))); + + var distinst_config = Distinst.Config (); + uint8 flags = 0; + if (config.modify_boot_order) { + flags = Distinst.MODIFY_BOOT_ORDER; + } + + if (config.install_drivers) { + flags |= Distinst.RUN_UBUNTU_DRIVERS; + } + + distinst_config.flags = flags; + distinst_config.hostname = config.hostname; + + var casper = casper_dir (); + distinst_config.remove = GLib.Path.build_filename (casper, "filesystem.manifest-remove"); + distinst_config.squashfs = GLib.Path.build_filename (casper, "filesystem.squashfs"); + + debug ("language: %s\n", config.lang); + distinst_config.lang = config.lang; + + distinst_config.keyboard_layout = config.keyboard_layout; + distinst_config.keyboard_model = null; + distinst_config.keyboard_variant = config.keyboard_variant == "" ? null : config.keyboard_variant; + + new Thread (null, () => { + if (installer.install ((owned) disks, distinst_config) != 0) { + Idle.add (() => { + on_error (InstallerDaemon.Error ()); + return GLib.Source.REMOVE; + }); + } + + return null; + }); + } + + public void set_demo_mode_locale (string locale) throws GLib.Error { + GLib.FileUtils.set_contents ("/etc/default/locale", "LANG=" + locale); + } + + public void trigger_demo_mode () throws GLib.Error { + var demo_mode_file = GLib.File.new_for_path ("/var/lib/lightdm/demo-mode"); + try { + demo_mode_file.create (GLib.FileCreateFlags.NONE); + } catch (GLib.Error e) { + if (!(e is GLib.IOError.EXISTS)) { + throw e; + } + } + } + + private string casper_dir () { + const string CDROM = "/cdrom"; + + try { + var cdrom_dir = File.new_for_path (CDROM); + var iter = cdrom_dir.enumerate_children (FileAttribute.STANDARD_NAME, 0); + + FileInfo info; + while ((info = iter.next_file ()) != null) { + unowned string name = info.get_name (); + if (name.has_prefix ("casper")) { + return GLib.Path.build_filename (CDROM, name); + } + } + } catch (GLib.Error e) { + critical ("failed to find casper dir automatically: %s\n", e.message); + } + + return GLib.Path.build_filename (CDROM, "casper"); + } + + private void default_disk_configuration (Distinst.Disks disks, string disk_path, string? encryption_password) throws GLib.IOError { + var encrypted_vg = Distinst.generate_unique_id ("cryptdata"); + var root_vg = Distinst.generate_unique_id ("data"); + if (encrypted_vg == null || root_vg == null) { + throw new GLib.IOError.FAILED ("Unable to generate unique volume group IDs"); + } + + Distinst.LvmEncryption? encryption; + if (encryption_password != null) { + debug ("encrypting"); + encryption = Distinst.LvmEncryption () { + physical_volume = encrypted_vg, + password = encryption_password, + keydata = null + }; + } else { + debug ("not encrypting"); + encryption = null; + } + + debug ("disk: %s\n", disk_path); + var disk = new Distinst.Disk (disk_path); + if (disk == null) { + throw new GLib.IOError.FAILED ("Could not find %s", disk_path); + } + + var bootloader = Distinst.bootloader_detect (); + + var start_sector = Distinst.Sector () { + flag = Distinst.SectorKind.START, + value = 0 + }; + + // 256 MiB is the minimum distinst ESP partition size, so this is 256 MiB in MB plus a bit + // extra for safety + var efi_sector = Distinst.Sector () { + flag = Distinst.SectorKind.MEGABYTE, + value = 278 + }; + + // 1024MB /boot partition that's created if we're doing encryption + var boot_sector = Distinst.Sector () { + flag = Distinst.SectorKind.MEGABYTE, + value = efi_sector.value + 1024 + }; + + // 4GB swap partition at the end + var swap_sector = Distinst.Sector () { + flag = Distinst.SectorKind.MEGABYTE_FROM_END, + value = 4096 + }; + + var end_sector = Distinst.Sector () { + flag = Distinst.SectorKind.END, + value = 0 + }; + + // Prepares a new partition table. + int result = disk.mklabel (bootloader); + + if (result != 0) { + throw new GLib.IOError.FAILED ("Unable to write partition table to %s", disk_path); + } + + var start = disk.get_sector (ref start_sector); + var end = disk.get_sector (ref boot_sector); + + switch (bootloader) { + case Distinst.PartitionTable.MSDOS: + // This is used to ensure LVM installs will work with BIOS + result = disk.add_partition ( + new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.EXT4) + .partition_type (Distinst.PartitionType.PRIMARY) + .flag (Distinst.PartitionFlag.BOOT) + .mount ("/boot") + ); + + if (result != 0) { + throw new GLib.IOError.FAILED ("Unable to add boot partition to %s", disk_path); + } + + // Start the LVM from the end of our /boot partition + start = disk.get_sector (ref boot_sector); + break; + case Distinst.PartitionTable.GPT: + end = disk.get_sector (ref efi_sector); + + // A FAT32 partition is required for EFI installs + result = disk.add_partition ( + new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.FAT32) + .partition_type (Distinst.PartitionType.PRIMARY) + .flag (Distinst.PartitionFlag.ESP) + .mount ("/boot/efi") + ); + + if (result != 0) { + throw new GLib.IOError.FAILED ("Unable to add EFI partition to %s", disk_path); + } + + // If we're encrypting, we need an unencrypted partition to store kernels and initramfs images + if (encryption != null) { + start = disk.get_sector (ref efi_sector); + end = disk.get_sector (ref boot_sector); + + result = disk.add_partition ( + new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.EXT4) + .partition_type (Distinst.PartitionType.PRIMARY) + .mount ("/boot") + ); + + if (result != 0) { + throw new GLib.IOError.FAILED ("unable to add /boot partition to %s", disk_path); + } + + // Start the LVM from the end of our /boot/efi and /boot partitions + start = disk.get_sector (ref boot_sector); + } else { + // No encryption, we only have a /boot/efi partition, start the LVM from there + start = disk.get_sector (ref efi_sector); + } + + break; + } + + end = disk.get_sector (ref end_sector); + + result = disk.add_partition ( + new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.LVM) + .partition_type (Distinst.PartitionType.PRIMARY) + .logical_volume (root_vg, encryption) + ); + + if (result != 0) { + throw new GLib.IOError.FAILED ("Unable to add LVM partition to %s", disk_path); + } + + disks.push ((owned) disk); + + result = disks.initialize_volume_groups (); + + if (result != 0) { + throw new GLib.IOError.FAILED ("Unable to initialize volume groups on %s", disk_path); + } + + unowned Distinst.LvmDevice lvm_device = disks.get_logical_device (root_vg); + + if (lvm_device == null) { + throw new GLib.IOError.FAILED ("Unable to find '%s' volume group on %s", root_vg, disk_path); + } + + start = lvm_device.get_sector (ref start_sector); + end = lvm_device.get_sector (ref swap_sector); + + result = lvm_device.add_partition ( + new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.EXT4) + .name ("root") + .mount ("/") + ); + + if (result != 0) { + throw new GLib.IOError.FAILED ("Unable to add / partition to LVM on %s", disk_path); + } + + start = lvm_device.get_sector (ref swap_sector); + end = lvm_device.get_sector (ref end_sector); + + result = lvm_device.add_partition ( + new Distinst.PartitionBuilder (start, end, Distinst.FileSystem.SWAP) + .name ("swap") + ); + + if (result != 0) { + throw new GLib.IOError.FAILED ("Unable to add swap partition to LVM on %s", disk_path); + } + } + + private void custom_disk_configuration (Distinst.Disks disks, Mount[] mounts, LuksCredentials[] credentials) throws GLib.IOError { + Mount[] lvm_devices = {}; + + foreach (Mount m in mounts) { + if (m.is_lvm ()) { + lvm_devices += m; + } else { + unowned Distinst.Disk disk = disks.get_physical_device (m.parent_disk); + if (disk == null) { + var new_disk = new Distinst.Disk (m.parent_disk); + if (new_disk == null) { + throw new GLib.IOError.FAILED ("Could not find physical device: '%s'", m.parent_disk); + } + + disks.push ((owned) new_disk); + disk = disks.get_physical_device (m.parent_disk); + } + + unowned Distinst.Partition partition = disk.get_partition_by_path (m.partition_path); + + if (partition == null) { + throw new GLib.IOError.FAILED ("Could not find %s", m.partition_path); + } + + if (m.mount_point == "/boot/efi") { + if (m.is_valid_boot_mount ()) { + if (m.should_format ()) { + partition.format_with (to_distinst_fs (m.filesystem)); + } + + partition.set_mount (m.mount_point); + partition.set_flags ({ Distinst.PartitionFlag.ESP }); + } else { + throw new GLib.IOError.FAILED ("Unreachable code path -- EFI partition is invalid"); + } + } else { + if (m.filesystem != InstallerDaemon.FileSystem.SWAP) { + partition.set_mount (m.mount_point); + } + + if (m.mount_point == "/boot") { + partition.set_flags ({ Distinst.PartitionFlag.BOOT }); + } + + if (m.should_format ()) { + partition.format_with (to_distinst_fs (m.filesystem)); + } + } + } + } + + disks.initialize_volume_groups (); + + foreach (LuksCredentials cred in credentials) { + disks.decrypt_partition (cred.device, Distinst.LvmEncryption () { + physical_volume = cred.pv, + password = cred.password, + keydata = null + }); + } + + foreach (Mount m in lvm_devices) { + var vg = m.parent_disk.offset (12); + unowned Distinst.LvmDevice disk = disks.get_logical_device (vg); + if (disk == null) { + throw new GLib.IOError.FAILED ("Could not find %s", vg); + } + + unowned Distinst.Partition partition = disk.get_partition_by_path (m.partition_path); + + if (partition == null) { + throw new GLib.IOError.FAILED ("could not find %s", m.partition_path); + } + + if (m.filesystem != InstallerDaemon.FileSystem.SWAP) { + partition.set_mount (m.mount_point); + } + + if (m.should_format ()) { + partition.format_and_keep_name (to_distinst_fs (m.filesystem)); + } + } + } + + private static string string_from_utf8 (uint8[] input) { + var builder = new GLib.StringBuilder.sized (input.length); + builder.append_len ((string) input, input.length); + return (owned) builder.str; + } + + private InstallerDaemon.FileSystem to_common_fs (Distinst.FileSystem fs) { + switch (fs) { + case BTRFS: + return InstallerDaemon.FileSystem.BTRFS; + case EXT2: + return InstallerDaemon.FileSystem.EXT2; + case EXT3: + return InstallerDaemon.FileSystem.EXT3; + case EXT4: + return InstallerDaemon.FileSystem.EXT4; + case F2FS: + return InstallerDaemon.FileSystem.F2FS; + case FAT16: + return InstallerDaemon.FileSystem.FAT16; + case FAT32: + return InstallerDaemon.FileSystem.FAT32; + case NONE: + return InstallerDaemon.FileSystem.NONE; + case NTFS: + return InstallerDaemon.FileSystem.NTFS; + case SWAP: + return InstallerDaemon.FileSystem.SWAP; + case XFS: + return InstallerDaemon.FileSystem.XFS; + case LVM: + return InstallerDaemon.FileSystem.LVM; + case LUKS: + return InstallerDaemon.FileSystem.LUKS; + default: + return InstallerDaemon.FileSystem.NONE; + } + } + + private InstallerDaemon.PartitionUsage to_common_usage (Distinst.PartitionUsage usage) { + return InstallerDaemon.PartitionUsage () { + tag = usage.tag, + value = usage.value + }; + } + + private Distinst.FileSystem to_distinst_fs (InstallerDaemon.FileSystem fs) { + switch (fs) { + case BTRFS: + return Distinst.FileSystem.BTRFS; + case EXT2: + return Distinst.FileSystem.EXT2; + case EXT3: + return Distinst.FileSystem.EXT3; + case EXT4: + return Distinst.FileSystem.EXT4; + case F2FS: + return Distinst.FileSystem.F2FS; + case FAT16: + return Distinst.FileSystem.FAT16; + case FAT32: + return Distinst.FileSystem.FAT32; + case NONE: + return Distinst.FileSystem.NONE; + case NTFS: + return Distinst.FileSystem.NTFS; + case SWAP: + return Distinst.FileSystem.SWAP; + case XFS: + return Distinst.FileSystem.XFS; + case LVM: + return Distinst.FileSystem.LVM; + case LUKS: + return Distinst.FileSystem.LUKS; + default: + return Distinst.FileSystem.NONE; + } + } + + private InstallerDaemon.PartitionTable to_common_usage_bootloader (Distinst.PartitionTable bootloader) { + switch (bootloader) { + case GPT: + return InstallerDaemon.PartitionTable.GPT; + case MSDOS: + return InstallerDaemon.PartitionTable.MSDOS; + case NONE: + default: + return InstallerDaemon.PartitionTable.NONE; + } + } + + private InstallerDaemon.LogLevel to_common_log_level (Distinst.LogLevel level) { + switch (level) { + case DEBUG: + return InstallerDaemon.LogLevel.DEBUG; + case INFO: + return InstallerDaemon.LogLevel.INFO; + case WARN: + return InstallerDaemon.LogLevel.WARN; + case ERROR: + return InstallerDaemon.LogLevel.ERROR; + case TRACE: + default: + return InstallerDaemon.LogLevel.TRACE; + } + } + + private InstallerDaemon.Error to_common_error (Distinst.Error error) { + return InstallerDaemon.Error () { + step = to_common_step (error.step), + err = error.err + }; + } + + private InstallerDaemon.Step to_common_step (Distinst.Step step) { + switch (step) { + case BACKUP: + return InstallerDaemon.Step.BACKUP; + case PARTITION: + return InstallerDaemon.Step.PARTITION; + case EXTRACT: + return InstallerDaemon.Step.EXTRACT; + case CONFIGURE: + return InstallerDaemon.Step.CONFIGURE; + case BOOTLOADER: + return InstallerDaemon.Step.BOOTLOADER; + case INIT: + default: + return InstallerDaemon.Step.INIT; + } + } + + private InstallerDaemon.Status to_common_status (Distinst.Status status) { + return InstallerDaemon.Status () { + step = to_common_step (status.step), + percent = status.percent + }; + } +} diff --git a/daemon/meson.build b/daemon/meson.build index f041264cc..f4a07ee25 100644 --- a/daemon/meson.build +++ b/daemon/meson.build @@ -4,13 +4,22 @@ vala_files = [ ] daemon_dependencies = [ - distinst_dep, gee_dep, glib_dep, gio_dep, gobject_dep, ] +args = '' + +if installer_backend == 'distinst' + vala_files += ['DistinstBackend.vala'] + daemon_dependencies += [distinst_dep] + args += '--define=DISTINST_BACKEND' +else + error('No supported installer backend provided') +endif + systemdunitdir = systemd_dep.get_pkgconfig_variable('systemdsystemunitdir') install_data( @@ -22,4 +31,5 @@ install_data('io.elementary.InstallerDaemon.conf', install_dir : get_option('dat executable(meson.project_name() + '-daemon', vala_files, dependencies : daemon_dependencies, + vala_args : args, install: true) diff --git a/meson.build b/meson.build index 662a778b4..85c73b6b3 100644 --- a/meson.build +++ b/meson.build @@ -12,7 +12,6 @@ add_project_arguments(['--vapidir', join_paths(meson.current_source_dir(), 'vapi gnome = import('gnome') i18n = import('i18n') -distinst_dep = dependency('distinst') glib_dep = dependency('glib-2.0', version: '>=2.74') gobject_dep = dependency('gobject-2.0') gtk_dep = dependency('gtk4') @@ -25,6 +24,13 @@ xml2_dep = dependency('libxml-2.0') pwquality_dep = dependency('pwquality') systemd_dep = dependency('systemd') +installer_backend = get_option('installer_backend') +if installer_backend == 'distinst' + distinst_dep = dependency('distinst') +else + error('No supported installer backend provided') +endif + asresources = gnome.compile_resources( 'as-resources', 'data/' + meson.project_name() + '.gresource.xml', source_dir: 'data', diff --git a/meson_options.txt b/meson_options.txt index 0f016d82e..9f76e1d3b 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,2 +1,3 @@ option('supported_languages', type : 'string', value : 'aa;ab;ae;af;ak;am;an;ar;as;ast;av;ay;az;ba;be;bg;bh;bi;bm;bn;bo;br;bs;ca;ce;ch;ckb;co;cr;cs;cu;cv;cy;da;de;de_CH;de_DE;dv;dz;ee;el;en;en_US;en_AU;en_CA;en_GB;eo;es;et;eu;fa;ff;fi;fj;fo;fr;fr_BE;fr_CA;fr_FR;fy;ga;gd;gl;gn;gu;gv;ha;he;hi;ho;hr;ht;hu;hy;hz;ia;id;ie;ig;ii;ik;io;is;it;iu;ja;jv;ka;kab;kg;ki;kj;kk;kl;km;kn;ko;kr;ks;ku;kv;kw;ky;la;lb;lg;li;ln;lo;lt;lu;lv;mg;mh;mi;mk;ml;mn;mo;mr;ms;mt;my;na;nb;nd;ne;ng;nl;nn;nr;nv;ny;oc;oj;om;or;os;pa;pi;pl;ps;pt;pt_PT;pt_BR;qu;rm;rn;ro;ru;rue;rw;sa;sc;sd;se;sg;si;sk;sl;sm;sma;sn;so;sq;sr;ss;st;su;sv;sw;szl;ta;te;tg;th;ti;tk;tl;tn;to;tr;ts;tt;tw;ty;udm;ug;uk;ur;uz;ve;vi;vo;wa;wo;xh;yi;yo;za;zh;zh_CN;zh_HK;zh_TW;zu', description : 'The list of supported languages') option('preferred_languages', type : 'string', value : 'en;zh;es;fr;pt;ru;de', description : 'A prioritized list of languages') +option('installer_backend', type : 'combo', choices : ['distinst'], value : 'distinst') diff --git a/src/Helpers/InstallerDaemon.vala b/src/Helpers/InstallerDaemon.vala index 254bb8f90..25cdbec16 100644 --- a/src/Helpers/InstallerDaemon.vala +++ b/src/Helpers/InstallerDaemon.vala @@ -23,11 +23,11 @@ public class Installer.Daemon { [DBus (name = "io.elementary.InstallerDaemon")] private interface InstallerInterface : GLib.DBusProxy { - public signal void on_error (Distinst.Error error); - public signal void on_status (Distinst.Status status); - public signal void on_log_message (Distinst.LogLevel level, string message); + public signal void on_error (InstallerDaemon.Error error); + public signal void on_status (InstallerDaemon.Status status); + public signal void on_log_message (InstallerDaemon.LogLevel level, string message); - public abstract Distinst.PartitionTable bootloader_detect () throws GLib.Error; + public abstract InstallerDaemon.PartitionTable bootloader_detect () throws GLib.Error; public async abstract InstallerDaemon.DiskInfo get_disks (bool get_partitions = false) throws GLib.Error; public async abstract int decrypt_partition (string path, string pv, string password) throws GLib.Error; @@ -38,9 +38,9 @@ public class Installer.Daemon { public async abstract void trigger_demo_mode () throws GLib.Error; } - public signal void on_error (Distinst.Error error); - public signal void on_status (Distinst.Status status); - public signal void on_log_message (Distinst.LogLevel level, string message); + public signal void on_error (InstallerDaemon.Error error); + public signal void on_status (InstallerDaemon.Status status); + public signal void on_log_message (InstallerDaemon.LogLevel level, string message); private InstallerInterface daemon; @@ -59,7 +59,7 @@ public class Installer.Daemon { daemon.on_log_message.connect ((level, message) => on_log_message (level, message)); } - public Distinst.PartitionTable bootloader_detect () { + public InstallerDaemon.PartitionTable bootloader_detect () { if (daemon == null) { return fallback_bootloader_detect (); } @@ -71,12 +71,12 @@ public class Installer.Daemon { } } - private Distinst.PartitionTable fallback_bootloader_detect () { + private InstallerDaemon.PartitionTable fallback_bootloader_detect () { var efi_file = GLib.File.new_for_path ("/sys/firmware/efi"); if (efi_file.query_exists ()) { - return Distinst.PartitionTable.GPT; + return InstallerDaemon.PartitionTable.GPT; } else { - return Distinst.PartitionTable.MSDOS; + return InstallerDaemon.PartitionTable.MSDOS; } } diff --git a/src/Helpers/LogHelper.vala b/src/Helpers/LogHelper.vala index 00677e1db..0bbb1e72f 100644 --- a/src/Helpers/LogHelper.vala +++ b/src/Helpers/LogHelper.vala @@ -16,17 +16,17 @@ * along with this program. If not, see . */ -static string level_name (Distinst.LogLevel level) { +static string level_name (InstallerDaemon.LogLevel level) { switch (level) { - case Distinst.LogLevel.TRACE: + case TRACE: return "TRACE"; - case Distinst.LogLevel.DEBUG: + case DEBUG: return "DEBUG"; - case Distinst.LogLevel.INFO: + case INFO: return "INFO"; - case Distinst.LogLevel.WARN: + case WARN: return "WARN"; - case Distinst.LogLevel.ERROR: + case ERROR: return "ERROR"; default: return "UNKNOWN"; @@ -50,7 +50,7 @@ public class LogHelper : GLib.Object { buffer.text = ""; } - public void log_func (Distinst.LogLevel level, string message) { + public void log_func (InstallerDaemon.LogLevel level, string message) { stdout.printf ("log: %s: %s\n", level_name (level), message); Gtk.TextIter end_iter; buffer.get_end_iter (out end_iter); diff --git a/src/Views/PartitioningView.vala b/src/Views/PartitioningView.vala index 98549b48f..5092e5311 100644 --- a/src/Views/PartitioningView.vala +++ b/src/Views/PartitioningView.vala @@ -60,11 +60,11 @@ public class Installer.PartitioningView : AbstractInstallerView { var bootloader = Daemon.get_default ().bootloader_detect (); switch (bootloader) { - case Distinst.PartitionTable.MSDOS: + case MSDOS: // Device is in BIOS mode, so we just require a root partition required_description = _("You must at least select a Root (/) partition."); break; - case Distinst.PartitionTable.GPT: + case GPT: // Device is in EFI mode, so we also require a boot partition required_description = _("You must at least select a Root (/) partition and an optional Boot (/boot/efi) partition."); break; @@ -233,9 +233,9 @@ public class Installer.PartitioningView : AbstractInstallerView { var bootloader = Daemon.get_default ().bootloader_detect (); switch (bootloader) { - case Distinst.PartitionTable.MSDOS: + case MSDOS: break; - case Distinst.PartitionTable.GPT: + case GPT: break; } @@ -341,7 +341,7 @@ public class Installer.PartitioningView : AbstractInstallerView { InstallerDaemon.Partition[] partitions = {}; - var usage_1 = Distinst.PartitionUsage () { + var usage_1 = InstallerDaemon.PartitionUsage () { tag = 1, value = 30312 }; @@ -355,7 +355,7 @@ public class Installer.PartitioningView : AbstractInstallerView { current_lvm_volume_group = "" }; - var usage_2 = Distinst.PartitionUsage () { + var usage_2 = InstallerDaemon.PartitionUsage () { tag = 0, value = 0 }; diff --git a/src/Views/ProgressView.vala b/src/Views/ProgressView.vala index 26dd5ba7a..3c7450574 100644 --- a/src/Views/ProgressView.vala +++ b/src/Views/ProgressView.vala @@ -109,10 +109,10 @@ public class ProgressView : Adw.NavigationPage { public void start_installation () { if (Installer.App.test_mode) { new Thread (null, () => { - fake_status (Distinst.Step.PARTITION); - fake_status (Distinst.Step.EXTRACT); - fake_status (Distinst.Step.CONFIGURE); - fake_status (Distinst.Step.BOOTLOADER); + fake_status (InstallerDaemon.Step.PARTITION); + fake_status (InstallerDaemon.Step.EXTRACT); + fake_status (InstallerDaemon.Step.CONFIGURE); + fake_status (InstallerDaemon.Step.BOOTLOADER); return null; }); } else { @@ -130,9 +130,9 @@ public class ProgressView : Adw.NavigationPage { unowned Configuration current_config = Configuration.get_default (); var config = InstallerDaemon.InstallConfig (); - config.flags = Distinst.MODIFY_BOOT_ORDER; + config.modify_boot_order = true; if (current_config.install_drivers) { - config.flags |= Distinst.RUN_UBUNTU_DRIVERS; + config.install_drivers = true; } config.hostname = Utils.get_hostname (); config.lang = "en_US.UTF-8"; @@ -164,7 +164,7 @@ public class ProgressView : Adw.NavigationPage { current_config.encryption_password ?? "" ); } catch (Error e) { - log_helper.log_func (Distinst.LogLevel.ERROR, e.message); + log_helper.log_func (InstallerDaemon.LogLevel.ERROR, e.message); on_error (); } } else { @@ -190,17 +190,17 @@ public class ProgressView : Adw.NavigationPage { try { yield daemon.install_with_custom_disk_layout (config, mounts, creds); } catch (Error e) { - log_helper.log_func (Distinst.LogLevel.ERROR, e.message); + log_helper.log_func (InstallerDaemon.LogLevel.ERROR, e.message); on_error (); } } } - private void fake_status (Distinst.Step step) { + private void fake_status (InstallerDaemon.Step step) { unowned var log_helper = LogHelper.get_default (); for (var percent = 0; percent <= 100; percent++) { log_helper.log_func (INFO, "I'm faking it!"); - Distinst.Status status = Distinst.Status () { + InstallerDaemon.Status status = InstallerDaemon.Status () { step = step, percent = percent }; @@ -209,9 +209,9 @@ public class ProgressView : Adw.NavigationPage { } } - private void installation_status_callback (Distinst.Status status) { + private void installation_status_callback (InstallerDaemon.Status status) { Idle.add (() => { - if (status.percent == 100 && status.step == Distinst.Step.BOOTLOADER) { + if (status.percent == 100 && status.step == InstallerDaemon.Step.BOOTLOADER) { on_success (); return GLib.Source.REMOVE; } @@ -219,21 +219,21 @@ public class ProgressView : Adw.NavigationPage { string step_string = ""; double fraction = ((double) status.percent) / (100.0 * NUM_STEP); switch (status.step) { - case Distinst.Step.PARTITION: + case PARTITION: ///TRANSLATORS: The current step of the installer back-end step_string = _("Partitioning Drive"); break; - case Distinst.Step.EXTRACT: + case EXTRACT: fraction += 2 * (1.0 / NUM_STEP); ///TRANSLATORS: The current step of the installer back-end step_string = _("Extracting Files"); break; - case Distinst.Step.CONFIGURE: + case CONFIGURE: fraction += 3 * (1.0 / NUM_STEP); ///TRANSLATORS: The current step of the installer back-end step_string = _("Configuring the System"); break; - case Distinst.Step.BOOTLOADER: + case BOOTLOADER: fraction += 4 * (1.0 / NUM_STEP); ///TRANSLATORS: The current step of the installer back-end step_string = _("Finishing the Installation"); @@ -246,7 +246,7 @@ public class ProgressView : Adw.NavigationPage { }); } - private void installation_error_callback (Distinst.Error error) { + private void installation_error_callback (InstallerDaemon.Error error) { Idle.add (() => { on_error (); return GLib.Source.REMOVE; diff --git a/src/Widgets/PartitionMenu.vala b/src/Widgets/PartitionMenu.vala index 35ee8e01f..d124d9292 100644 --- a/src/Widgets/PartitionMenu.vala +++ b/src/Widgets/PartitionMenu.vala @@ -49,7 +49,7 @@ public class Installer.PartitionMenu : Gtk.Popover { partition_path = path; parent_disk = parent; - string boot_partition = (Daemon.get_default ().bootloader_detect () == Distinst.PartitionTable.GPT) + string boot_partition = (Daemon.get_default ().bootloader_detect () == InstallerDaemon.PartitionTable.GPT) ? "/boot/efi" : "/boot"; @@ -158,7 +158,7 @@ public class Installer.PartitionMenu : Gtk.Popover { custom.visible = visible; if (active == 2) { - if (Daemon.get_default ().bootloader_detect () == Distinst.PartitionTable.GPT) { + if (Daemon.get_default ().bootloader_detect () == InstallerDaemon.PartitionTable.GPT) { type.active = 2; } else { type.active = 0; @@ -315,7 +315,7 @@ public class Installer.PartitionMenu : Gtk.Popover { case 1: return "/home"; case 2: - if (Daemon.get_default ().bootloader_detect () == Distinst.PartitionTable.GPT) { + if (Daemon.get_default ().bootloader_detect () == InstallerDaemon.PartitionTable.GPT) { return "/boot/efi"; } else { return "/boot"; diff --git a/src/meson.build b/src/meson.build index 3ecf0f994..13bf7e43a 100644 --- a/src/meson.build +++ b/src/meson.build @@ -57,7 +57,6 @@ config_file = configure_file( ) gui_dependencies = [ - distinst_dep, gee_dep, glib_dep, gobject_dep, From d5e019dcf84858fb092528a541a9af4dba1c2db6 Mon Sep 17 00:00:00 2001 From: Hossein Date: Wed, 2 Oct 2024 20:34:10 +0000 Subject: [PATCH 04/37] Translated using Weblate (Persian) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/fa/ --- po/fa.po | 97 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 40 deletions(-) diff --git a/po/fa.po b/po/fa.po index 26c364bbb..e9d79a035 100644 --- a/po/fa.po +++ b/po/fa.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-01 17:57+0000\n" -"PO-Revision-Date: 2024-09-30 16:16+0000\n" +"PO-Revision-Date: 2024-10-03 21:16+0000\n" "Last-Translator: Hossein \n" "Language-Team: Persian \n" @@ -160,22 +160,28 @@ msgid "" "Proprietary drivers contain private code that can't be reviewed. Security " "and other updates are dependent on the driver vendor." msgstr "" +"درایورهای اختصاصی حاوی کد خصوصی هستند که قابل بررسی نیستند. امنیت و سایر به " +"روز رسانی ها به فروشنده درایور بستگی دارد." #: src/Views/DriversView.vala:41 msgid "An Internet connection is required to install NVIDIA® graphics drivers." -msgstr "" +msgstr "برای نصب درایورهای گرافیک NVIDIA® به اتصال اینترنت نیاز است." #: src/Views/DriversView.vala:47 msgid "" "Proprietary drivers can be installed later through System Settings → System, " "but an Internet connection will be required for all drivers." msgstr "" +"درایورهای اختصاصی را می توان بعداً از طریق تنظیمات سیستم > سیستم نصب کرد، " +"اما اتصال اینترنت برای همه درایورها لازم است." #: src/Views/DriversView.vala:52 msgid "" "Include third-party proprietary drivers when installing. I agree to their " "respective licenses and terms of use." msgstr "" +"هنگام نصب، درایورهای اختصاصی شخص ثالث را درج شده. من با مجوزها و شرایط " +"استفاده مربوطه آنها موافقم." #: src/Views/DriversView.vala:75 src/Views/EncryptView.vala:143 #: src/Views/KeyboardLayoutView.vala:55 src/Views/PartitioningView.vala:141 @@ -189,35 +195,43 @@ msgstr "پاک کردن و نصب" #: src/Views/EncryptView.vala:26 msgid "Don’t Encrypt" -msgstr "" +msgstr "رمزگذاری نشده" #: src/Views/EncryptView.vala:50 msgid "Enable Drive Encryption" -msgstr "" +msgstr "رمزگذاری درایو را فعال کنید" #: src/Views/EncryptView.vala:54 msgid "" "Encrypt this device's drive if required for added protection, but be sure " "you understand:" msgstr "" +"در صورت نیاز برای محافظت بیشتر، درایو این دستگاه را رمزگذاری کنید، اما مطمئن " +"شوید که متوجه می‌شوید:" #: src/Views/EncryptView.vala:61 msgid "" "Data will only be protected from others with physical access to this device " "when it is shut down." msgstr "" +"داده‌ها فقط در صورت خاموش شدن این دستگاه در مقابل سایر افراد با دسترسی " +"فیزیکی به این دستگاه محافظت می‌شوند." #: src/Views/EncryptView.vala:67 msgid "" "The encryption password will be required each time this device is turned on. " "Store it somewhere safe." msgstr "" +"هر بار که این دستگاه روشن می شود، رمز رمزگذاری مورد نیاز خواهد بود. آن را در " +"جایی امن نگهداری کنید." #: src/Views/EncryptView.vala:73 msgid "" "A built-in or USB keyboard will be required to type the encryption password " "each time this device is turned on." msgstr "" +"برای تایپ رمز رمزگذاری هر بار که این دستگاه روشن می شود، به یک صفحه کلید " +"داخلی یا USB نیاز است." #: src/Views/EncryptView.vala:87 msgid "" @@ -225,10 +239,13 @@ msgid "" "data. This is a unique password for this device, not the password for " "your user account." msgstr "" +"اگر رمز عبور رمزگذاری را فراموش کردید، نمی‌توانید داده‌ها را بازیابی " +"کنید. این رمز عبور منحصربه‌فرد برای این دستگاه است، نه رمز عبور حساب " +"کاربری شما." #: src/Views/EncryptView.vala:95 msgid "Choose Encryption Password" -msgstr "" +msgstr "رمز عبور رمزگذاری را انتخاب کنید" #: src/Views/EncryptView.vala:109 msgid "Confirm Password" @@ -236,15 +253,15 @@ msgstr "تایید کلمه عبور" #: src/Views/EncryptView.vala:145 msgid "Choose Password" -msgstr "" +msgstr "رمز عبور را انتخاب کنید" #: src/Views/EncryptView.vala:168 msgid "Set Encryption Password" -msgstr "" +msgstr "رمز عبور رمزگذاری را تنظیم کنید" #: src/Views/EncryptView.vala:236 msgid "Passwords do not match" -msgstr "" +msgstr "رمزهای عبور مطابقت ندارند" #: src/Views/ErrorView.vala:31 msgid "Could Not Install" @@ -264,8 +281,6 @@ msgid "Try the installation again" msgstr "مجدد نصب را امتحان کنید" #: src/Views/ErrorView.vala:55 -#, fuzzy -#| msgid "• Use Demo Mode and try to manually recover" msgid "Use Demo Mode and try to manually recover" msgstr "از حالت دمو استفاده کنید و بصورت دستی بازیابی را انجام دهید" @@ -322,20 +337,18 @@ msgid "Currently active language" msgstr "زبان فعال کنونی" #: src/Views/PartitioningView.vala:51 -#, fuzzy -#| msgid "Use Partition" msgid "Select Partitions" -msgstr "استفاده از پارتیشن" +msgstr "انتخاب پارتیشن" #: src/Views/PartitioningView.vala:56 msgid "" "Selecting “Format” will erase all data on the selected partition." -msgstr "" +msgstr "با انتخاب\"فرمت\" همه اطلاعات در پارتیشن انتخابی پاک می شود." #. Device is in BIOS mode, so we just require a root partition #: src/Views/PartitioningView.vala:65 msgid "You must at least select a Root (/) partition." -msgstr "" +msgstr "حداقل باید یک پارتیشن Root (/) انتخاب کنید." #. Device is in EFI mode, so we also require a boot partition #: src/Views/PartitioningView.vala:69 @@ -343,10 +356,12 @@ msgid "" "You must at least select a Root (/) partition and an optional Boot " "(/boot/efi) partition." msgstr "" +"شما باید حداقل یک پارتیشن Root (/) و یک پارتیشن Boot (/boot/efi) اختیاری را انتخاب کنید." #: src/Views/PartitioningView.vala:80 msgid "It is also recommended to select a Swap partition." -msgstr "" +msgstr "همچنین توصیه می شود یک پارتیشن Swap را انتخاب کنید." #: src/Views/PartitioningView.vala:138 msgid "Modify Partitions…" @@ -354,29 +369,27 @@ msgstr "اصلاح پارتیشن ها…" #: src/Views/PartitioningView.vala:281 msgid "EFI partition has the wrong file system" -msgstr "" +msgstr "پارتیشن EFI سیستم فایل اشتباهی دارد" #: src/Views/PartitioningView.vala:283 msgid "EFI partition is too small" -msgstr "" +msgstr "پارتیشن EFI خیلی کوچک است" #: src/Views/PartitioningView.vala:286 msgid "Invalid file system for root" -msgstr "" +msgstr "سیستم فایل برای root نامعتبر است" #: src/Views/PartitioningView.vala:288 msgid "Invalid file system for home" -msgstr "" +msgstr "سیستم فایل برای home نامعتبر است" #: src/Views/ProgressView.vala:64 src/Views/ProgressView.vala:99 msgid "Show log" msgstr "نمایش گزارش" #: src/Views/ProgressView.vala:90 -#, fuzzy -#| msgid "Try Installing Again" msgid "Installing" -msgstr "مجددا تلاش برای نصب کنید" +msgstr "در حال نصب" #: src/Views/ProgressView.vala:95 msgid "Hide log" @@ -421,7 +434,7 @@ msgstr "پاک کردن دیسک و نصب" #: src/Views/TryInstallView.vala:46 #, c-format msgid "Erase everything and install a fresh copy of %s." -msgstr "" +msgstr "همه چیز را پاک کنید و یک نسخه جدید از %s را نصب کنید." #: src/Views/TryInstallView.vala:52 msgid "Custom Install (Advanced)" @@ -432,6 +445,8 @@ msgid "" "Create, resize, or otherwise manage partitions manually. This method may " "lead to data loss." msgstr "" +"پارتیشن ها را به صورت دستی ایجاد، تغییر اندازه یا مدیریت کنید. این روش ممکن " +"است منجر به از دست دادن اطلاعات شود." #: src/Views/TryInstallView.vala:107 msgid "Custom Install" @@ -444,7 +459,7 @@ msgstr "ادامه ی راه اندازی" #: src/Views/SuccessView.vala:32 #, c-format msgid "%s has been installed" -msgstr "" +msgstr "%s نصب شده است" #: src/Views/SuccessView.vala:57 msgid "Shut Down" @@ -467,13 +482,15 @@ msgstr "" #: src/Widgets/DecryptMenu.vala:66 msgid "Decrypt This Partition" -msgstr "" +msgstr "رمزگشایی این پارتیشن" #: src/Widgets/DecryptMenu.vala:70 msgid "" "Enter the partition's encryption password and set a device name for the " "decrypted partition." msgstr "" +"رمز عبور رمزگذاری پارتیشن را وارد کنید و نام دستگاه را برای پارتیشن رمزگشایی " +"تعیین کنید." #: src/Widgets/DecryptMenu.vala:82 msgid "Password:" @@ -489,17 +506,17 @@ msgstr "رمزگشایی" #: src/Widgets/DecryptMenu.vala:182 msgid "LUKS volume was decrypted" -msgstr "" +msgstr "حجم LUKS رمزگشایی شد" #: src/Widgets/DiskBar.vala:228 #, c-format msgid "%s (%s)" -msgstr "" +msgstr "%s (%s)" #: src/Widgets/DiskBar.vala:229 #, c-format msgid "%s (%s: %s)" -msgstr "" +msgstr "%s (%s: %s)" #: src/Widgets/PartitionMenu.vala:56 msgid "Use Partition" @@ -507,44 +524,44 @@ msgstr "استفاده از پارتیشن" #: src/Widgets/PartitionMenu.vala:60 msgid "Format" -msgstr "" +msgstr "فرمت" #: src/Widgets/PartitionMenu.vala:61 msgid "Delete all data and set up a new file system" -msgstr "" +msgstr "تمام داده ها را حذف کنید و یک سیستم فایل جدید راه اندازی کنید" #: src/Widgets/PartitionMenu.vala:64 msgid "Use as:" -msgstr "" +msgstr "استفاده به عنوان:" #: src/Widgets/PartitionMenu.vala:71 msgid "Root (/)" -msgstr "" +msgstr "Root (/)" #: src/Widgets/PartitionMenu.vala:72 msgid "Home (/home)" -msgstr "" +msgstr "Home (/home)" #: src/Widgets/PartitionMenu.vala:73 #, c-format msgid "Boot (%s)" -msgstr "" +msgstr "بوت(%s)" #: src/Widgets/PartitionMenu.vala:74 msgid "Swap" -msgstr "" +msgstr "Swap" #: src/Widgets/PartitionMenu.vala:75 msgid "Custom" -msgstr "" +msgstr "سفارشی" #: src/Widgets/PartitionMenu.vala:79 msgid "Custom:" -msgstr "" +msgstr "سفارشی:" #: src/Widgets/PartitionMenu.vala:86 msgid "Filesystem:" -msgstr "" +msgstr "سیستم فایل:" #: src/Widgets/PartitionMenu.vala:98 msgid "Default (ext4)" @@ -552,7 +569,7 @@ msgstr "پیشفرض (ext4)" #: src/Widgets/PartitionMenu.vala:261 msgid "Custom value must begin with /" -msgstr "" +msgstr "مقدار سفارشی باید با / شروع شود" #~ msgid "Ignore" #~ msgstr "نادیده بگیر" From 15e2a28528786f48d7d1fb7d550eda23fbb64504 Mon Sep 17 00:00:00 2001 From: TomiOhl Date: Wed, 2 Oct 2024 22:37:47 +0000 Subject: [PATCH 05/37] Translated using Weblate (Hungarian) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/hu/ --- po/hu.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/hu.po b/po/hu.po index 853f82d6f..be07022f3 100644 --- a/po/hu.po +++ b/po/hu.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-01 17:57+0000\n" -"PO-Revision-Date: 2024-09-14 09:16+0000\n" +"PO-Revision-Date: 2024-10-03 21:16+0000\n" "Last-Translator: TomiOhl \n" "Language-Team: Hungarian \n" @@ -575,7 +575,7 @@ msgstr "Alapértelmezett (ext4)" #: src/Widgets/PartitionMenu.vala:261 msgid "Custom value must begin with /" -msgstr "" +msgstr "Az egyéni értéknek /-rel kezdődnie" #~ msgid "" #~ "Proprietary drivers are subject to their own license terms. By " From 4c179cf6c522d77cbbce351bc0dae94c2c0416b5 Mon Sep 17 00:00:00 2001 From: Ryo Nakano Date: Mon, 7 Oct 2024 11:43:26 +0900 Subject: [PATCH 06/37] PartitionMenu: Correct gettext format (#829) --- src/Widgets/PartitionMenu.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Widgets/PartitionMenu.vala b/src/Widgets/PartitionMenu.vala index d124d9292..ec38f8fc1 100644 --- a/src/Widgets/PartitionMenu.vala +++ b/src/Widgets/PartitionMenu.vala @@ -70,7 +70,7 @@ public class Installer.PartitionMenu : Gtk.Popover { }; use_as.append_text (_("Root (/)")); use_as.append_text (_("Home (/home)")); - use_as.append_text (_("Boot (%s)".printf (boot_partition))); + use_as.append_text (_("Boot (%s)").printf (boot_partition)); use_as.append_text (_("Swap")); use_as.append_text (_("Custom")); use_as.active = 0; From e2a29ff22d6005e90405b8eaaa1a5e9447f010ff Mon Sep 17 00:00:00 2001 From: Kisaragi Hiu Date: Mon, 7 Oct 2024 08:05:35 +0000 Subject: [PATCH 07/37] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/zh_Hant/ --- po/zh_TW.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/zh_TW.po b/po/zh_TW.po index d53bd2e9e..0efca4d42 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-01 17:57+0000\n" -"PO-Revision-Date: 2024-09-13 00:58+0000\n" +"PO-Revision-Date: 2024-10-07 08:07+0000\n" "Last-Translator: Kisaragi Hiu \n" "Language-Team: Chinese (Traditional) \n" @@ -545,7 +545,7 @@ msgstr "預設 (ext4)" #: src/Widgets/PartitionMenu.vala:261 msgid "Custom value must begin with /" -msgstr "" +msgstr "自訂值必須以 / 開頭" #~ msgid "Ignore" #~ msgstr "忽略" From 4ad60d99515762b4623fe3b1b41634af274258a7 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Mon, 7 Oct 2024 06:42:08 +0000 Subject: [PATCH 08/37] Translated using Weblate (Hebrew) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/he/ --- po/he.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/he.po b/po/he.po index 1cd15add7..c2fb005b8 100644 --- a/po/he.po +++ b/po/he.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-01 17:57+0000\n" -"PO-Revision-Date: 2024-09-12 22:16+0000\n" +"PO-Revision-Date: 2024-10-07 08:07+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -558,7 +558,7 @@ msgstr "בררת מחדל (ext4)" #: src/Widgets/PartitionMenu.vala:261 msgid "Custom value must begin with /" -msgstr "" +msgstr "ערך מותאם אישית חייב להתחיל ב־/" #~ msgid "" #~ "Proprietary drivers are subject to their own license terms. By " From 11ecfddc9ffe10e72937723dd4a20fd844ae13f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Tue, 8 Oct 2024 07:48:48 -0700 Subject: [PATCH 09/37] Move session files to their own folder (#823) Co-authored-by: Ryan Kornheisl --- data/meson.build | 36 ------------------- meson.build | 1 + {data => session}/autostart.desktop | 0 .../compositor-autostart.desktop | 0 ...SettingsDaemon.MediaKeys-installer.desktop | 0 ...ome.SettingsDaemon.Power-installer.desktop | 0 ...SettingsDaemon.XSettings-installer.desktop | 0 ...nstaller-default-settings.gschema.override | 0 {data => session}/installer.desktop | 0 {data => session}/installer.session | 0 session/meson.build | 35 ++++++++++++++++++ 11 files changed, 36 insertions(+), 36 deletions(-) rename {data => session}/autostart.desktop (100%) rename {data => session}/compositor-autostart.desktop (100%) rename {data => session}/gsd/org.gnome.SettingsDaemon.MediaKeys-installer.desktop (100%) rename {data => session}/gsd/org.gnome.SettingsDaemon.Power-installer.desktop (100%) rename {data => session}/gsd/org.gnome.SettingsDaemon.XSettings-installer.desktop (100%) rename {data => session}/installer-default-settings.gschema.override (100%) rename {data => session}/installer.desktop (100%) rename {data => session}/installer.session (100%) create mode 100644 session/meson.build diff --git a/data/meson.build b/data/meson.build index de3425d8f..218791e5f 100644 --- a/data/meson.build +++ b/data/meson.build @@ -1,6 +1,3 @@ -autostartdir = join_paths(get_option('sysconfdir'), 'xdg', 'autostart') -schemadir = join_paths(get_option('datadir'), 'glib-2.0', 'schemas') - i18n.merge_file( input: meson.project_name() + '.desktop.in', output: meson.project_name() + '.desktop', @@ -19,39 +16,6 @@ i18n.merge_file( install_dir: get_option('datadir') / 'metainfo', ) -install_data( - 'installer.desktop', - install_dir: join_paths(get_option('datadir'), 'xsessions') -) - -install_data( - 'autostart.desktop', - install_dir: autostartdir, - rename: meson.project_name() + '.desktop' -) - -install_data( - 'compositor-autostart.desktop', - install_dir: autostartdir, - rename: meson.project_name() + '.compositor.desktop' -) - -install_subdir( - 'gsd', - install_dir: autostartdir, - strip_directory: true -) - -install_data( - 'installer.session', - install_dir: join_paths(get_option('datadir'), 'gnome-session', 'sessions') -) - -install_data( - 'installer-default-settings.gschema.override', - install_dir: schemadir -) - # Test the desktop file validate_desktop_exe = find_program('desktop-file-validate') test ('Validate desktop file', validate_desktop_exe, diff --git a/meson.build b/meson.build index 85c73b6b3..e85533499 100644 --- a/meson.build +++ b/meson.build @@ -41,5 +41,6 @@ subdir('po') subdir('common') subdir('daemon') subdir('src') +subdir('session') subdir('data') subdir('test') diff --git a/data/autostart.desktop b/session/autostart.desktop similarity index 100% rename from data/autostart.desktop rename to session/autostart.desktop diff --git a/data/compositor-autostart.desktop b/session/compositor-autostart.desktop similarity index 100% rename from data/compositor-autostart.desktop rename to session/compositor-autostart.desktop diff --git a/data/gsd/org.gnome.SettingsDaemon.MediaKeys-installer.desktop b/session/gsd/org.gnome.SettingsDaemon.MediaKeys-installer.desktop similarity index 100% rename from data/gsd/org.gnome.SettingsDaemon.MediaKeys-installer.desktop rename to session/gsd/org.gnome.SettingsDaemon.MediaKeys-installer.desktop diff --git a/data/gsd/org.gnome.SettingsDaemon.Power-installer.desktop b/session/gsd/org.gnome.SettingsDaemon.Power-installer.desktop similarity index 100% rename from data/gsd/org.gnome.SettingsDaemon.Power-installer.desktop rename to session/gsd/org.gnome.SettingsDaemon.Power-installer.desktop diff --git a/data/gsd/org.gnome.SettingsDaemon.XSettings-installer.desktop b/session/gsd/org.gnome.SettingsDaemon.XSettings-installer.desktop similarity index 100% rename from data/gsd/org.gnome.SettingsDaemon.XSettings-installer.desktop rename to session/gsd/org.gnome.SettingsDaemon.XSettings-installer.desktop diff --git a/data/installer-default-settings.gschema.override b/session/installer-default-settings.gschema.override similarity index 100% rename from data/installer-default-settings.gschema.override rename to session/installer-default-settings.gschema.override diff --git a/data/installer.desktop b/session/installer.desktop similarity index 100% rename from data/installer.desktop rename to session/installer.desktop diff --git a/data/installer.session b/session/installer.session similarity index 100% rename from data/installer.session rename to session/installer.session diff --git a/session/meson.build b/session/meson.build new file mode 100644 index 000000000..f0f07fa6b --- /dev/null +++ b/session/meson.build @@ -0,0 +1,35 @@ +autostartdir = get_option('sysconfdir') / 'xdg' / 'autostart' +schemadir = get_option('datadir') / 'glib-2.0' / 'schemas' + +install_data( + 'autostart.desktop', + install_dir: autostartdir, + rename: meson.project_name() + '.desktop' +) + +install_data( + 'compositor-autostart.desktop', + install_dir: autostartdir, + rename: meson.project_name() + '.compositor.desktop' +) + +install_data( + 'installer.desktop', + install_dir: get_option('datadir') / 'xsessions' +) + +install_data( + 'installer.session', + install_dir: get_option('datadir') / 'gnome-session' / 'sessions' +) + +install_data( + 'installer-default-settings.gschema.override', + install_dir: schemadir +) + +install_subdir( + 'gsd', + install_dir: autostartdir, + strip_directory: true +) From deae7d0844c1eaac7957f7d87f3a9ad763778b79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Tue, 8 Oct 2024 09:49:19 -0700 Subject: [PATCH 10/37] Send battery notification instead of infobar (#821) --- src/Application.vala | 29 +++++++++++++++++++++++ src/MainWindow.vala | 56 +------------------------------------------- 2 files changed, 30 insertions(+), 55 deletions(-) diff --git a/src/Application.vala b/src/Application.vala index 57199e6c4..3afb029fb 100644 --- a/src/Application.vala +++ b/src/Application.vala @@ -33,6 +33,35 @@ public class Installer.App : Gtk.Application { base.startup (); Granite.init (); + + try { + UPower upower = Bus.get_proxy_sync (BusType.SYSTEM, "org.freedesktop.UPower", "/org/freedesktop/UPower", GLib.DBusProxyFlags.GET_INVALIDATED_PROPERTIES); + + send_withdraw_battery_notification (upower.on_battery); + + ((DBusProxy) upower).g_properties_changed.connect ((changed, invalid) => { + var _on_battery = changed.lookup_value ("OnBattery", GLib.VariantType.BOOLEAN); + if (_on_battery != null) { + send_withdraw_battery_notification (upower.on_battery); + } + }); + } catch (Error e) { + critical ("Can't connect to UPower; unable to send battery notifications: %s", e.message); + } + } + + private void send_withdraw_battery_notification (bool on_battery) { + if (!on_battery) { + withdraw_notification ("on-battery"); + return; + } + + var notification = new GLib.Notification (_("Connect to a Power Source")); + notification.set_body (_("Installation will not succeed if this device loses power.")); + notification.set_icon (new ThemedIcon ("battery-ac-adapter")); + notification.set_priority (NotificationPriority.URGENT); + + send_notification ("on-battery", notification); } public override void activate () { diff --git a/src/MainWindow.vala b/src/MainWindow.vala index b5bc47c5a..35660ad81 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -28,7 +28,6 @@ public class Installer.MainWindow : Gtk.ApplicationWindow { // Minimum 15 GB private const uint64 MINIMUM_SPACE = 15 * ONE_GB; - private Gtk.Label infobar_label; private Adw.NavigationView navigation_view; private LanguageView language_view; private TryInstallView try_install_view; @@ -42,29 +41,7 @@ public class Installer.MainWindow : Gtk.ApplicationWindow { navigation_view = new Adw.NavigationView (); navigation_view.add (language_view); - infobar_label = new Gtk.Label ("") { - use_markup = true - }; - set_infobar_string (); - - var battery_infobar = new Gtk.InfoBar () { - message_type = Gtk.MessageType.WARNING, - margin_end = 7, - margin_bottom = 7, - margin_start = 7, - show_close_button = true, - halign = Gtk.Align.START, // Can't cover action area; need to select language - valign = Gtk.Align.END - }; - battery_infobar.add_child (infobar_label); - battery_infobar.add_css_class (Granite.STYLE_CLASS_FRAME); - - var overlay = new Gtk.Overlay () { - child = navigation_view - }; - overlay.add_overlay (battery_infobar); - - child = overlay; + child = navigation_view; titlebar = new Gtk.Grid () { visible = false }; var back_action = new SimpleAction ("back", null); @@ -80,31 +57,9 @@ public class Installer.MainWindow : Gtk.ApplicationWindow { Source.remove (orca_timeout_id); } - // Reset when language selection changes - set_infobar_string (); load_keyboard_view (); }); - try { - UPower upower = Bus.get_proxy_sync (BusType.SYSTEM, "org.freedesktop.UPower", "/org/freedesktop/UPower", GLib.DBusProxyFlags.GET_INVALIDATED_PROPERTIES); - - battery_infobar.revealed = upower.on_battery; - - ((DBusProxy) upower).g_properties_changed.connect ((changed, invalid) => { - var _on_battery = changed.lookup_value ("OnBattery", GLib.VariantType.BOOLEAN); - if (_on_battery != null) { - battery_infobar.revealed = upower.on_battery; - } - }); - } catch (Error e) { - warning (e.message); - battery_infobar.revealed = false; - } - - battery_infobar.response.connect (() => { - battery_infobar.revealed = false; - }); - var mediakeys_settings = new Settings ("org.gnome.settings-daemon.plugins.media-keys"); var a11y_settings = new Settings ("org.gnome.desktop.a11y.applications"); @@ -263,13 +218,4 @@ public class Installer.MainWindow : Gtk.ApplicationWindow { navigation_view.push (error_view); } - - private void set_infobar_string () { - var infobar_string = "%s\n%s".printf ( - _("Connect to a Power Source"), - Granite.TOOLTIP_SECONDARY_TEXT_MARKUP.printf (_("Your device is running on battery power. It's recommended to be plugged in while installing.")) - ); - - infobar_label.label = infobar_string; - } } From 92409e434f3d27cda77308db77f690b4e2900222 Mon Sep 17 00:00:00 2001 From: elementaryBot Date: Tue, 8 Oct 2024 16:51:06 +0000 Subject: [PATCH 11/37] Update translation template --- po/extra/extra.pot | 2 +- po/io.elementary.installer.pot | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/po/extra/extra.pot b/po/extra/extra.pot index cd12f2449..bf6930234 100644 --- a/po/extra/extra.pot +++ b/po/extra/extra.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/po/io.elementary.installer.pot b/po/io.elementary.installer.pot index 2e8b1d887..40ec628d8 100644 --- a/po/io.elementary.installer.pot +++ b/po/io.elementary.installer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: io.elementary.installer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,23 +18,21 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 From f4bba5888a351e18ac9de8ea7b99f96095cd33ea Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 8 Oct 2024 16:51:11 +0000 Subject: [PATCH 12/37] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/ --- po/af.po | 22 ++++++++++------------ po/ak.po | 22 ++++++++++------------ po/ar.po | 32 ++++++++++++++++++-------------- po/az.po | 22 ++++++++++------------ po/be.po | 22 ++++++++++------------ po/bg.po | 33 ++++++++++++++++++--------------- po/bn.po | 33 ++++++++++++++++++--------------- po/bs.po | 33 ++++++++++++++++++--------------- po/ca.po | 33 ++++++++++++++++++--------------- po/ckb.po | 33 ++++++++++++++++++--------------- po/cs.po | 33 ++++++++++++++++++--------------- po/cv.po | 22 ++++++++++------------ po/da.po | 33 ++++++++++++++++++--------------- po/de.po | 33 ++++++++++++++++++--------------- po/el.po | 22 ++++++++++------------ po/en_AU.po | 22 ++++++++++------------ po/en_CA.po | 33 ++++++++++++++++++--------------- po/en_GB.po | 33 ++++++++++++++++++--------------- po/eo.po | 32 ++++++++++++++++++-------------- po/es.po | 33 ++++++++++++++++++--------------- po/et.po | 22 ++++++++++------------ po/eu.po | 22 ++++++++++------------ po/fa.po | 46 ++++++++++++++++++++++++---------------------- po/fi.po | 33 ++++++++++++++++++--------------- po/fr.po | 33 ++++++++++++++++++--------------- po/fr_CA.po | 24 +++++++++++------------- po/ga.po | 22 ++++++++++------------ po/gl.po | 33 ++++++++++++++++++--------------- po/he.po | 29 ++++++++++++++++------------- po/hi.po | 33 ++++++++++++++++++--------------- po/hr.po | 22 ++++++++++------------ po/hu.po | 33 ++++++++++++++++++--------------- po/hy.po | 22 ++++++++++------------ po/ia.po | 22 ++++++++++------------ po/id.po | 33 ++++++++++++++++++--------------- po/is.po | 22 ++++++++++------------ po/it.po | 33 ++++++++++++++++++--------------- po/ja.po | 33 ++++++++++++++++++--------------- po/jv.po | 22 ++++++++++------------ po/ka.po | 31 +++++++++++++++++-------------- po/kn.po | 22 ++++++++++------------ po/ko.po | 33 ++++++++++++++++++--------------- po/ku.po | 24 +++++++++++------------- po/lb.po | 33 ++++++++++++++++++--------------- po/lg.po | 29 ++++++++++++++++------------- po/lt.po | 33 ++++++++++++++++++--------------- po/lv.po | 22 ++++++++++------------ po/mg.po | 22 ++++++++++------------ po/mk.po | 22 ++++++++++------------ po/mn.po | 22 ++++++++++------------ po/mo.po | 33 ++++++++++++++++++--------------- po/mr.po | 32 ++++++++++++++++++-------------- po/ms.po | 22 ++++++++++------------ po/my.po | 22 ++++++++++------------ po/nb.po | 33 ++++++++++++++++++--------------- po/nl.po | 33 ++++++++++++++++++--------------- po/nn.po | 33 ++++++++++++++++++--------------- po/pa.po | 33 ++++++++++++++++++--------------- po/pl.po | 33 ++++++++++++++++++--------------- po/pt.po | 33 ++++++++++++++++++--------------- po/pt_BR.po | 33 ++++++++++++++++++--------------- po/ro.po | 22 ++++++++++------------ po/ru.po | 33 ++++++++++++++++++--------------- po/sa.po | 22 ++++++++++------------ po/si.po | 33 ++++++++++++++++++--------------- po/sk.po | 33 ++++++++++++++++++--------------- po/sl.po | 29 ++++++++++++++++------------- po/sma.po | 22 ++++++++++------------ po/sq.po | 22 ++++++++++------------ po/sr.po | 33 ++++++++++++++++++--------------- po/sv.po | 33 ++++++++++++++++++--------------- po/szl.po | 33 ++++++++++++++++++--------------- po/ta.po | 22 ++++++++++------------ po/te.po | 22 ++++++++++------------ po/th.po | 31 +++++++++++++++++-------------- po/tl.po | 22 ++++++++++------------ po/tn.po | 22 ++++++++++------------ po/to.po | 22 ++++++++++------------ po/tr.po | 32 ++++++++++++++++++-------------- po/ug.po | 22 ++++++++++------------ po/uk.po | 33 ++++++++++++++++++--------------- po/ur.po | 33 ++++++++++++++++++--------------- po/uz.po | 33 ++++++++++++++++++--------------- po/vi.po | 22 ++++++++++------------ po/wa.po | 22 ++++++++++------------ po/wo.po | 22 ++++++++++------------ po/xh.po | 22 ++++++++++------------ po/yi.po | 22 ++++++++++------------ po/yo.po | 22 ++++++++++------------ po/za.po | 22 ++++++++++------------ po/zh.po | 29 ++++++++++++++++------------- po/zh_CN.po | 29 ++++++++++++++++------------- po/zh_HK.po | 22 ++++++++++------------ po/zh_TW.po | 29 ++++++++++++++++------------- po/zu.po | 22 ++++++++++------------ 95 files changed, 1360 insertions(+), 1287 deletions(-) diff --git a/po/af.po b/po/af.po index ff25eafbf..d021c2d71 100644 --- a/po/af.po +++ b/po/af.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-10-12 01:29+0200\n" "Last-Translator: Maxwell Barvian \n" "Language-Team: \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-28 06:46+0000\n" "X-Generator: Poedit 1.8.7.1\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/ak.po b/po/ak.po index 5eaa0093a..0190a4e72 100644 --- a/po/ak.po +++ b/po/ak.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2017-04-01 19:21+0000\n" "Last-Translator: Lawrence Aberba \n" "Language-Team: ak (generated) \n" "Language-Team: Arabic \n" "Language-Team: \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Poedit 1.8.7.1\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/be.po b/po/be.po index ba6cebf26..12be32e14 100644 --- a/po/be.po +++ b/po/be.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-10-11 19:51+0200\n" "Last-Translator: Maxwell Barvian \n" "Language-Team: \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Poedit 1.8.7.1\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/bg.po b/po/bg.po index 916386ee0..82aed0b36 100644 --- a/po/bg.po +++ b/po/bg.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2022-04-20 09:24+0000\n" "Last-Translator: David Hewitt \n" "Language-Team: Bulgarian \n" "Language-Team: Bengali \n" "Language-Team: Bosnian \n" "Language-Team: Catalan \n" "Language-Team: Kurdish (Central) \n" "Language-Team: Czech \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/da.po b/po/da.po index 5a0169713..ca3c10f28 100644 --- a/po/da.po +++ b/po/da.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2021-06-05 23:54+0000\n" "Last-Translator: Rantyrant \n" "Language-Team: Danish \n" "Language-Team: German \n" "Language-Team: \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Poedit 1.8.7.1\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/en_AU.po b/po/en_AU.po index 099383cbc..eab63df27 100644 --- a/po/en_AU.po +++ b/po/en_AU.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2017-07-11 12:01+0000\n" "Last-Translator: Mattias Ezequiel Mignone \n" "Language-Team: English (Australia) \n" "Language-Team: English (Canada) \n" "Language-Team: English (United Kingdom) \n" "Language-Team: Esperanto \n" "Language-Team: Spanish \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/eu.po b/po/eu.po index b6c2031b6..77f1ee81a 100644 --- a/po/eu.po +++ b/po/eu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-05-27 15:29+0000\n" "Last-Translator: Maxwell Barvian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/fa.po b/po/fa.po index e9d79a035..469185c52 100644 --- a/po/fa.po +++ b/po/fa.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-10-03 21:16+0000\n" "Last-Translator: Hossein \n" "Language-Team: Persian سیستم نصب کرد، " -"اما اتصال اینترنت برای همه درایورها لازم است." +"درایورهای اختصاصی را می توان بعداً از طریق تنظیمات سیستم > سیستم نصب کرد، اما " +"اتصال اینترنت برای همه درایورها لازم است." #: src/Views/DriversView.vala:52 msgid "" @@ -214,8 +210,8 @@ msgid "" "Data will only be protected from others with physical access to this device " "when it is shut down." msgstr "" -"داده‌ها فقط در صورت خاموش شدن این دستگاه در مقابل سایر افراد با دسترسی " -"فیزیکی به این دستگاه محافظت می‌شوند." +"داده‌ها فقط در صورت خاموش شدن این دستگاه در مقابل سایر افراد با دسترسی فیزیکی " +"به این دستگاه محافظت می‌شوند." #: src/Views/EncryptView.vala:67 msgid "" @@ -239,9 +235,8 @@ msgid "" "data. This is a unique password for this device, not the password for " "your user account." msgstr "" -"اگر رمز عبور رمزگذاری را فراموش کردید، نمی‌توانید داده‌ها را بازیابی " -"کنید. این رمز عبور منحصربه‌فرد برای این دستگاه است، نه رمز عبور حساب " -"کاربری شما." +"اگر رمز عبور رمزگذاری را فراموش کردید، نمی‌توانید داده‌ها را بازیابی کنید. این رمز عبور منحصربه‌فرد برای این دستگاه است، نه رمز عبور حساب کاربری شما." #: src/Views/EncryptView.vala:95 msgid "Choose Encryption Password" @@ -571,6 +566,13 @@ msgstr "پیشفرض (ext4)" msgid "Custom value must begin with /" msgstr "مقدار سفارشی باید با / شروع شود" +#~ msgid "" +#~ "Your device is running on battery power. It's recommended to be plugged " +#~ "in while installing." +#~ msgstr "" +#~ "دستگاه شما در حالت استفاده از باطری است. پیشنهاد میشود در حال نصب به برق " +#~ "وصل شود." + #~ msgid "Ignore" #~ msgstr "نادیده بگیر" diff --git a/po/fi.po b/po/fi.po index ecc044202..3e0fb82da 100644 --- a/po/fi.po +++ b/po/fi.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2023-09-04 08:08+0000\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish \n" "Language-Team: French \n" "Language-Team: French (Canada) \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/gl.po b/po/gl.po index 0251bbbf2..967efdcff 100644 --- a/po/gl.po +++ b/po/gl.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2022-04-20 09:24+0000\n" "Last-Translator: David Hewitt \n" "Language-Team: Galician \n" "Language-Team: Hebrew \n" "Language-Team: Hindi \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/hu.po b/po/hu.po index be07022f3..f4a0341f5 100644 --- a/po/hu.po +++ b/po/hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-10-03 21:16+0000\n" "Last-Translator: TomiOhl \n" "Language-Team: Hungarian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:39+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/ia.po b/po/ia.po index b3130448f..8e2e7ab82 100644 --- a/po/ia.po +++ b/po/ia.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: io.elementary.installer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -17,23 +17,21 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/id.po b/po/id.po index bcaba1105..05602f517 100644 --- a/po/id.po +++ b/po/id.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2023-05-20 18:06+0000\n" "Last-Translator: Faisal Rachmadin \n" @@ -16,27 +16,23 @@ msgstr "" "X-Generator: Weblate 4.17\n" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" -#: src/Application.vala:44 +#: src/Application.vala:59 +msgid "Connect to a Power Source" +msgstr "Sambungkan ke Sumber Daya" + +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." +msgstr "" + +#: src/Application.vala:73 #, c-format msgid "Install %s" msgstr "Pasang %s" -#: src/Application.vala:52 +#: src/Application.vala:81 msgid "operating system is being installed" msgstr "sistem operasi sedang dipasang" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" -msgstr "Sambungkan ke Sumber Daya" - -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." -msgstr "" -"Perangkat Anda beroperasi dengan daya baterai. Dianjurkan untuk dipasang ke " -"sumber daya saat memasang." - #: src/Utils.vala:34 msgid "Test mode shutdown" msgstr "Mode uji shutdown" @@ -581,6 +577,13 @@ msgstr "Bawaan (ext4)" msgid "Custom value must begin with /" msgstr "" +#~ msgid "" +#~ "Your device is running on battery power. It's recommended to be plugged " +#~ "in while installing." +#~ msgstr "" +#~ "Perangkat Anda beroperasi dengan daya baterai. Dianjurkan untuk dipasang " +#~ "ke sumber daya saat memasang." + #~ msgid "Ignore" #~ msgstr "Abaikan" diff --git a/po/is.po b/po/is.po index 90186a840..fe569bc5d 100644 --- a/po/is.po +++ b/po/is.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-05-27 15:29+0000\n" "Last-Translator: Maxwell Barvian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/it.po b/po/it.po index f023a56fd..0de3f5eac 100644 --- a/po/it.po +++ b/po/it.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2022-04-20 09:24+0000\n" "Last-Translator: David Hewitt \n" "Language-Team: Italian \n" "Language-Team: Japanese \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/ka.po b/po/ka.po index 4b8f87174..3c8a70e5c 100644 --- a/po/ka.po +++ b/po/ka.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-09-12 22:16+0000\n" "Last-Translator: NorwayFun \n" "Language-Team: Georgian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/ko.po b/po/ko.po index 1649b0092..0bbab86af 100644 --- a/po/ko.po +++ b/po/ko.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2022-08-07 18:13+0000\n" "Last-Translator: Jung-Kyu Park \n" "Language-Team: Korean \n" "Language-Team: Kurdish \n" "Language-Team: Luxembourgish \n" "Language-Team: Ganda \n" "Language-Team: Lithuanian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/mg.po b/po/mg.po index 187b3d0d5..42e4e6bcd 100644 --- a/po/mg.po +++ b/po/mg.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-05-27 15:29+0000\n" "Last-Translator: Maxwell Barvian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/mk.po b/po/mk.po index 24568c37d..ca8c6fc84 100644 --- a/po/mk.po +++ b/po/mk.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-05-27 15:28+0000\n" "Last-Translator: Maxwell Barvian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/mn.po b/po/mn.po index 12566934f..ae59fd6b2 100644 --- a/po/mn.po +++ b/po/mn.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-05-27 15:28+0000\n" "Last-Translator: Maxwell Barvian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/mo.po b/po/mo.po index fb859ea04..ad7af3199 100644 --- a/po/mo.po +++ b/po/mo.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2022-04-20 09:24+0000\n" "Last-Translator: David Hewitt \n" "Language-Team: Moldovan \n" "Language-Team: Marathi \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/my.po b/po/my.po index 5e3263210..4fc4b17e9 100644 --- a/po/my.po +++ b/po/my.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-06-26 17:01+0000\n" "Last-Translator: Bone Pyae Sone \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:40+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/nb.po b/po/nb.po index f4597e671..d78a553ba 100644 --- a/po/nb.po +++ b/po/nb.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-06-16 21:16+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language-Team: Dutch \n" "Language-Team: Norwegian Nynorsk \n" "Language-Team: Punjabi 1;\n" "X-Generator: Weblate 4.4.2\n" -#: src/Application.vala:44 +#: src/Application.vala:59 +msgid "Connect to a Power Source" +msgstr "ਕਿਸੇ ਊਰਜਾ ਸਰੋਤ ਨਾਲ਼ ਜੋੜੋ" + +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." +msgstr "" + +#: src/Application.vala:73 #, c-format msgid "Install %s" msgstr "%s ਨੂੰ ਸਥਾਪਤ ਕਰੋ" -#: src/Application.vala:52 +#: src/Application.vala:81 #, fuzzy #| msgid "%s has been installed" msgid "operating system is being installed" msgstr "%s ਸਥਾਪਤ ਹੋ ਚੁੱਕਿਐ" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" -msgstr "ਕਿਸੇ ਊਰਜਾ ਸਰੋਤ ਨਾਲ਼ ਜੋੜੋ" - -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." -msgstr "" -"ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਬੈਟਰੀ ਊਰਜਾ ਤੇ ਚੱਲ ਰਹੀ ਹੈ। ਸਿਫ਼ਾਰਿਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਕਿ ਸਥਾਪਨ ਦੇ ਦੌਰਾਨ ਚਾਰਜਰ " -"'ਤੇ ਲਾ ਕੇ ਰੱਖੋ।" - #: src/Utils.vala:34 msgid "Test mode shutdown" msgstr "ਟੈਸਟ ਮੋਡ ਸ਼ਟਡਾਊਨ" @@ -580,6 +576,13 @@ msgstr "ਡਿਫ਼ਾਲਟ (ਈ.ਐਕਸ.ਟੀ4)" msgid "Custom value must begin with /" msgstr "" +#~ msgid "" +#~ "Your device is running on battery power. It's recommended to be plugged " +#~ "in while installing." +#~ msgstr "" +#~ "ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਬੈਟਰੀ ਊਰਜਾ ਤੇ ਚੱਲ ਰਹੀ ਹੈ। ਸਿਫ਼ਾਰਿਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਕਿ ਸਥਾਪਨ ਦੇ ਦੌਰਾਨ " +#~ "ਚਾਰਜਰ 'ਤੇ ਲਾ ਕੇ ਰੱਖੋ।" + #~ msgid "Ignore" #~ msgstr "ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰੋ" diff --git a/po/pl.po b/po/pl.po index a881e28d4..e53aaee36 100644 --- a/po/pl.po +++ b/po/pl.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-10-02 18:16+0000\n" "Last-Translator: Marcin Serwin \n" "Language-Team: Polish \n" "Language-Team: Portuguese \n" "Language-Team: Portuguese (Brazil) \n" "Language-Team: Romanian \n" "Language-Team: Russian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/si.po b/po/si.po index 40e69d655..deedfbbd6 100644 --- a/po/si.po +++ b/po/si.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2021-03-04 15:31+0000\n" "Last-Translator: HelaBasa \n" "Language-Team: Sinhala \n" "Language-Team: Slovak \n" "Language-Team: Slovenian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/sq.po b/po/sq.po index a255251f9..7fcc10b84 100644 --- a/po/sq.po +++ b/po/sq.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-05-27 15:28+0000\n" "Last-Translator: Maxwell Barvian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:39+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/sr.po b/po/sr.po index 8d9b01ab5..df8638d2b 100644 --- a/po/sr.po +++ b/po/sr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2021-03-12 08:51+0000\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: Silesian =20) ? 1 : 2;\n" "X-Generator: Weblate 4.4.2\n" -#: src/Application.vala:44 +#: src/Application.vala:59 +msgid "Connect to a Power Source" +msgstr "Podłōncz do sztrōmu" + +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." +msgstr "" + +#: src/Application.vala:73 #, c-format msgid "Install %s" msgstr "Instaluj %s" -#: src/Application.vala:52 +#: src/Application.vala:81 msgid "operating system is being installed" msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" -msgstr "Podłōncz do sztrōmu" - -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." -msgstr "" -"Twoje maszina funguje na bateryji. Na czas instalacyje nojlepij podłōnczyć " -"jōm do sztrōmu." - #: src/Utils.vala:34 msgid "Test mode shutdown" msgstr "Zastawiynie trybu testowego" @@ -605,6 +601,13 @@ msgstr "Wychodny (ext4)" msgid "Custom value must begin with /" msgstr "" +#~ msgid "" +#~ "Your device is running on battery power. It's recommended to be plugged " +#~ "in while installing." +#~ msgstr "" +#~ "Twoje maszina funguje na bateryji. Na czas instalacyje nojlepij " +#~ "podłōnczyć jōm do sztrōmu." + #~ msgid "Ignore" #~ msgstr "Ignoruj" diff --git a/po/ta.po b/po/ta.po index d6a4ac225..fd3af1adf 100644 --- a/po/ta.po +++ b/po/ta.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-05-27 15:27+0000\n" "Last-Translator: Maxwell Barvian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/te.po b/po/te.po index 43eecd119..932baf920 100644 --- a/po/te.po +++ b/po/te.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-05-27 15:29+0000\n" "Last-Translator: Maxwell Barvian \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/th.po b/po/th.po index c4dcb94b4..fcb300a0b 100644 --- a/po/th.po +++ b/po/th.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-03-01 20:12+0000\n" "Last-Translator: Aefgh Threenine \n" "Language-Team: Thai \n" "Language-Team: Tagalog \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/to.po b/po/to.po index 405755683..7e01b4bcb 100644 --- a/po/to.po +++ b/po/to.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-05-25 22:12+0000\n" "Last-Translator: Launchpad Translations Administrators \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/tr.po b/po/tr.po index 4a2ce3203..77f3a45b9 100644 --- a/po/tr.po +++ b/po/tr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2023-05-18 16:52+0000\n" "Last-Translator: Özgür Baskin \n" "Language-Team: Turkish \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/uk.po b/po/uk.po index 700b04090..b8868f257 100644 --- a/po/uk.po +++ b/po/uk.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-10-02 18:16+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language-Team: Urdu \n" "Language-Team: Uzbek \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:41+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/wa.po b/po/wa.po index 864a72796..3bd76a640 100644 --- a/po/wa.po +++ b/po/wa.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: io.elementary.installer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -16,23 +16,21 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/wo.po b/po/wo.po index 25f2a24b2..dfdf8a435 100644 --- a/po/wo.po +++ b/po/wo.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: io.elementary.installer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -16,23 +16,21 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/xh.po b/po/xh.po index 94b8d9f30..8d2d391e9 100644 --- a/po/xh.po +++ b/po/xh.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: io.elementary.installer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -16,23 +16,21 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/yi.po b/po/yi.po index a310f22ce..240e29603 100644 --- a/po/yi.po +++ b/po/yi.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: io.elementary.installer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -16,23 +16,21 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/yo.po b/po/yo.po index 84a5c9b04..53dcd1a88 100644 --- a/po/yo.po +++ b/po/yo.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: io.elementary.installer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -16,23 +16,21 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/za.po b/po/za.po index b5780ddcb..f14bea9cf 100644 --- a/po/za.po +++ b/po/za.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: io.elementary.installer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -16,23 +16,21 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/zh.po b/po/zh.po index f0e66597a..04ec6f771 100644 --- a/po/zh.po +++ b/po/zh.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: io.elementary.installer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2021-11-01 08:19+0000\n" "Last-Translator: Yuchen Deng \n" "Language-Team: Chinese \n" "Language-Team: Chinese (Simplified) \n" "Language-Team: LANGUAGE \n" @@ -13,23 +13,21 @@ msgstr "" "X-Launchpad-Export-Date: 2016-09-27 06:42+0000\n" "X-Generator: Launchpad (build 18204)\n" -#: src/Application.vala:44 -#, c-format -msgid "Install %s" +#: src/Application.vala:59 +msgid "Connect to a Power Source" msgstr "" -#: src/Application.vala:52 -msgid "operating system is being installed" +#: src/Application.vala:60 +msgid "Installation will not succeed if this device loses power." msgstr "" -#: src/MainWindow.vala:269 -msgid "Connect to a Power Source" +#: src/Application.vala:73 +#, c-format +msgid "Install %s" msgstr "" -#: src/MainWindow.vala:270 -msgid "" -"Your device is running on battery power. It's recommended to be plugged in " -"while installing." +#: src/Application.vala:81 +msgid "operating system is being installed" msgstr "" #: src/Utils.vala:34 diff --git a/po/zh_TW.po b/po/zh_TW.po index 0efca4d42..5d45203cf 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-10-07 08:07+0000\n" "Last-Translator: Kisaragi Hiu \n" "Language-Team: Chinese (Traditional) Date: Tue, 8 Oct 2024 16:51:38 +0000 Subject: [PATCH 13/37] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: Installer/Installer (Extra) Translate-URL: https://l10n.elementary.io/projects/installer/extra/ --- po/extra/af.po | 2 +- po/extra/ak.po | 2 +- po/extra/ar.po | 2 +- po/extra/az.po | 2 +- po/extra/be.po | 2 +- po/extra/bg.po | 2 +- po/extra/bn.po | 2 +- po/extra/bs.po | 2 +- po/extra/ca.po | 2 +- po/extra/ckb.po | 2 +- po/extra/cs.po | 2 +- po/extra/cv.po | 2 +- po/extra/da.po | 2 +- po/extra/de.po | 2 +- po/extra/el.po | 2 +- po/extra/en_AU.po | 2 +- po/extra/en_CA.po | 2 +- po/extra/en_GB.po | 2 +- po/extra/eo.po | 2 +- po/extra/es.po | 2 +- po/extra/et.po | 2 +- po/extra/eu.po | 2 +- po/extra/fa.po | 2 +- po/extra/fi.po | 2 +- po/extra/fr.po | 2 +- po/extra/fr_CA.po | 2 +- po/extra/ga.po | 2 +- po/extra/gl.po | 2 +- po/extra/he.po | 2 +- po/extra/hi.po | 2 +- po/extra/hr.po | 2 +- po/extra/hu.po | 2 +- po/extra/hy.po | 2 +- po/extra/ia.po | 2 +- po/extra/id.po | 2 +- po/extra/is.po | 2 +- po/extra/it.po | 2 +- po/extra/ja.po | 2 +- po/extra/jv.po | 2 +- po/extra/ka.po | 2 +- po/extra/kn.po | 2 +- po/extra/ko.po | 2 +- po/extra/ku.po | 2 +- po/extra/lb.po | 2 +- po/extra/lg.po | 2 +- po/extra/lt.po | 2 +- po/extra/lv.po | 2 +- po/extra/mg.po | 2 +- po/extra/mk.po | 2 +- po/extra/mn.po | 2 +- po/extra/mo.po | 2 +- po/extra/mr.po | 2 +- po/extra/ms.po | 2 +- po/extra/my.po | 2 +- po/extra/nb.po | 2 +- po/extra/nl.po | 2 +- po/extra/nn.po | 2 +- po/extra/pa.po | 2 +- po/extra/pl.po | 2 +- po/extra/pt.po | 2 +- po/extra/pt_BR.po | 2 +- po/extra/ro.po | 2 +- po/extra/ru.po | 2 +- po/extra/sa.po | 2 +- po/extra/si.po | 2 +- po/extra/sk.po | 2 +- po/extra/sl.po | 2 +- po/extra/sma.po | 2 +- po/extra/sq.po | 2 +- po/extra/sr.po | 2 +- po/extra/sv.po | 2 +- po/extra/szl.po | 2 +- po/extra/ta.po | 2 +- po/extra/te.po | 2 +- po/extra/th.po | 2 +- po/extra/tl.po | 2 +- po/extra/tn.po | 2 +- po/extra/to.po | 2 +- po/extra/tr.po | 2 +- po/extra/ug.po | 2 +- po/extra/uk.po | 2 +- po/extra/ur.po | 2 +- po/extra/uz.po | 2 +- po/extra/vi.po | 2 +- po/extra/wa.po | 2 +- po/extra/wo.po | 2 +- po/extra/xh.po | 2 +- po/extra/yi.po | 2 +- po/extra/yo.po | 2 +- po/extra/za.po | 2 +- po/extra/zh.po | 2 +- po/extra/zh_CN.po | 2 +- po/extra/zh_HK.po | 2 +- po/extra/zh_TW.po | 2 +- po/extra/zu.po | 2 +- 95 files changed, 95 insertions(+), 95 deletions(-) diff --git a/po/extra/af.po b/po/extra/af.po index 4ca778b14..fafaf5444 100644 --- a/po/extra/af.po +++ b/po/extra/af.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/po/extra/ak.po b/po/extra/ak.po index 4ca778b14..fafaf5444 100644 --- a/po/extra/ak.po +++ b/po/extra/ak.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/po/extra/ar.po b/po/extra/ar.po index 7a5a10004..fbe8ee11a 100644 --- a/po/extra/ar.po +++ b/po/extra/ar.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2021-08-27 17:59+0000\n" "Last-Translator: Muhammad Al-Jayyousi \n" "Language-Team: Arabic \n" "Language-Team: Azerbaijani =2 && " diff --git a/po/extra/bg.po b/po/extra/bg.po index 5356b62c2..5e5cf95c4 100644 --- a/po/extra/bg.po +++ b/po/extra/bg.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: pantheon-calculator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2019-09-07 18:22+0000\n" "Last-Translator: Daniel Foré \n" "Language-Team: Bulgarian \n" "Language-Team: Bengali \n" "Language-Team: Bosnian \n" "Language-Team: Catalan \n" "Language-Team: Sorani \n" "Language-Team: Czech \n" "Language-Team: Danish \n" "Language-Team: German \n" "Language-Team: English (Canada) \n" "Language-Team: English (United Kingdom) \n" "Language-Team: Esperanto \n" "Language-Team: Spanish \n" "Language-Team: Estonian \n" diff --git a/po/extra/eu.po b/po/extra/eu.po index 4ca778b14..fafaf5444 100644 --- a/po/extra/eu.po +++ b/po/extra/eu.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/po/extra/fa.po b/po/extra/fa.po index 4ce9aac57..4b6e2e3b2 100644 --- a/po/extra/fa.po +++ b/po/extra/fa.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2022-04-14 23:02+0000\n" "Last-Translator: Pikhosh \n" "Language-Team: Persian \n" "Language-Team: Finnish \n" "Language-Team: French \n" "Language-Team: French (Canada) \n" "Language-Team: Galician \n" "Language-Team: Hebrew \n" "Language-Team: Hindi \n" "Language-Team: Croatian \n" diff --git a/po/extra/hu.po b/po/extra/hu.po index 9d6de9205..617480f8c 100644 --- a/po/extra/hu.po +++ b/po/extra/hu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: pantheon-calculator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-05-21 23:13+0000\n" "Last-Translator: TomiOhl \n" "Language-Team: Hungarian \n" diff --git a/po/extra/is.po b/po/extra/is.po index 4ca778b14..fafaf5444 100644 --- a/po/extra/is.po +++ b/po/extra/is.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/po/extra/it.po b/po/extra/it.po index 61b01ee5d..383f071bb 100644 --- a/po/extra/it.po +++ b/po/extra/it.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: pantheon-calculator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2019-07-02 05:27+0000\n" "Last-Translator: Fabio Zaramella \n" "Language-Team: Italian \n" "Language-Team: Japanese \n" "Language-Team: Georgian \n" "Language-Team: Korean \n" "Language-Team: Kurdish \n" "Language-Team: Lithuanian \n" "Language-Team: Moldovan \n" "Language-Team: Marathi \n" "Language-Team: Malay \n" diff --git a/po/extra/my.po b/po/extra/my.po index 0a071c693..94bf04c71 100644 --- a/po/extra/my.po +++ b/po/extra/my.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: pantheon-calculator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2016-06-24 03:08+0000\n" "Last-Translator: Bone Pyae Sone \n" "Language-Team: Burmese \n" diff --git a/po/extra/nb.po b/po/extra/nb.po index 256f9e4c3..3af1131cc 100644 --- a/po/extra/nb.po +++ b/po/extra/nb.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-06-16 21:16+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language-Team: Dutch \n" "Language-Team: Norwegian Nynorsk \n" "Language-Team: Polish \n" "Language-Team: Portuguese \n" "Language-Team: Portuguese (Brazil) 0 && n%100 < " diff --git a/po/extra/ru.po b/po/extra/ru.po index 4cad36e7f..2c324ed8e 100644 --- a/po/extra/ru.po +++ b/po/extra/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: pantheon-calculator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-05-21 23:13+0000\n" "Last-Translator: кубик круглый \n" "Language-Team: Russian \n" "Language-Team: Sinhala \n" "Language-Team: Slovak \n" "Language-Team: Slovenian \n" "Language-Team: Albanian \n" diff --git a/po/extra/sr.po b/po/extra/sr.po index 6f6eaa01e..d3f5e434b 100644 --- a/po/extra/sr.po +++ b/po/extra/sr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2020-12-19 10:16+0000\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: Thai \n" "Language-Team: Tagalog \n" diff --git a/po/extra/tn.po b/po/extra/tn.po index 4ca778b14..fafaf5444 100644 --- a/po/extra/tn.po +++ b/po/extra/tn.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/po/extra/to.po b/po/extra/to.po index 4ca778b14..fafaf5444 100644 --- a/po/extra/to.po +++ b/po/extra/to.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/po/extra/tr.po b/po/extra/tr.po index 58b20f976..4862beb50 100644 --- a/po/extra/tr.po +++ b/po/extra/tr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: pantheon-calculator\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-01 17:57+0000\n" +"POT-Creation-Date: 2024-10-08 16:51+0000\n" "PO-Revision-Date: 2024-09-21 10:16+0000\n" "Last-Translator: Sinan Decron \n" "Language-Team: Turkish \n" "Language-Team: Ukrainian \n" "Language-Team: Uzbek \n" "Language-Team: Chinese (Simplified) \n" "Language-Team: Chinese (Traditional) Date: Wed, 9 Oct 2024 02:25:11 +0000 Subject: [PATCH 14/37] Translated using Weblate (Ukrainian) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/uk/ --- po/uk.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/uk.po b/po/uk.po index b8868f257..046485708 100644 --- a/po/uk.po +++ b/po/uk.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-10-02 18:16+0000\n" +"PO-Revision-Date: 2024-10-09 18:16+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -22,7 +22,7 @@ msgstr "Під'єднайте джерело живлення" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." -msgstr "" +msgstr "Якщо пристрій вимкнеться, встановлення не буде успішним." #: src/Application.vala:73 #, c-format From 244c98ced1f7d3e43d59fffe9325635db3c5fe7c Mon Sep 17 00:00:00 2001 From: Ryo Nakano Date: Tue, 8 Oct 2024 22:48:13 +0000 Subject: [PATCH 15/37] Translated using Weblate (Japanese) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/ja/ --- po/ja.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/ja.po b/po/ja.po index b77b50afd..04daca212 100644 --- a/po/ja.po +++ b/po/ja.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-10-02 18:16+0000\n" +"PO-Revision-Date: 2024-10-09 18:16+0000\n" "Last-Translator: Ryo Nakano \n" "Language-Team: Japanese \n" @@ -21,7 +21,7 @@ msgstr "電源に接続してください" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." -msgstr "" +msgstr "デバイスの電源が落ちると、インストールは成功しません。" #: src/Application.vala:73 #, c-format From 848415d5ee26e5b75164662f876979275048c4be Mon Sep 17 00:00:00 2001 From: Uwe S Date: Wed, 9 Oct 2024 01:28:30 +0000 Subject: [PATCH 16/37] Translated using Weblate (German) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/de/ --- po/de.po | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/po/de.po b/po/de.po index 86d295ea7..bab535459 100644 --- a/po/de.po +++ b/po/de.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pantheon-calculator\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-10-02 18:16+0000\n" +"PO-Revision-Date: 2024-10-09 18:16+0000\n" "Last-Translator: Uwe S \n" "Language-Team: German \n" @@ -27,6 +27,8 @@ msgstr "Stromversorgung anschließen" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." msgstr "" +"Die Installation würde scheitern, wenn die Energieversorgung des Geräts " +"versagt." #: src/Application.vala:73 #, c-format From a475965b4a76962d49d0a31ddf4ac084544cf9f5 Mon Sep 17 00:00:00 2001 From: Italo Felipe Capasso Ballesteros Date: Tue, 8 Oct 2024 18:05:27 +0000 Subject: [PATCH 17/37] Translated using Weblate (Spanish) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/es/ --- po/es.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/es.po b/po/es.po index 7eaf2fa08..c6a04b1f4 100644 --- a/po/es.po +++ b/po/es.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-10-02 18:16+0000\n" +"PO-Revision-Date: 2024-10-09 18:16+0000\n" "Last-Translator: Italo Felipe Capasso Ballesteros \n" "Language-Team: Spanish \n" @@ -21,7 +21,7 @@ msgstr "Conéctese a una fuente de alimentación" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." -msgstr "" +msgstr "La instalación no será exitosa si el equipo se queda sin energía." #: src/Application.vala:73 #, c-format From 0fa21cf7e61f1ad17656c50eadda8457f91bd89e Mon Sep 17 00:00:00 2001 From: lenemter Date: Tue, 8 Oct 2024 18:03:38 +0000 Subject: [PATCH 18/37] Translated using Weblate (Russian) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/ru/ --- po/ru.po | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/po/ru.po b/po/ru.po index 8f2229bd6..2132cbfd2 100644 --- a/po/ru.po +++ b/po/ru.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-10-02 18:16+0000\n" -"Last-Translator: кубик круглый \n" +"PO-Revision-Date: 2024-10-09 18:16+0000\n" +"Last-Translator: lenemter \n" "Language-Team: Russian \n" "Language: ru\n" @@ -23,6 +23,7 @@ msgstr "Подключитесь к источнику питания" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." msgstr "" +"Установка не будет завершена, если это устройство отключится от питания." #: src/Application.vala:73 #, c-format From cd771a7273b232832d9846d7eeada05ba7df07f1 Mon Sep 17 00:00:00 2001 From: David M Date: Thu, 10 Oct 2024 10:27:41 +0000 Subject: [PATCH 19/37] Translated using Weblate (Catalan) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/ca/ --- po/ca.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/ca.po b/po/ca.po index 293d0e314..1e53e11bc 100644 --- a/po/ca.po +++ b/po/ca.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-10-02 18:16+0000\n" +"PO-Revision-Date: 2024-10-10 22:16+0000\n" "Last-Translator: David M \n" "Language-Team: Catalan \n" @@ -21,7 +21,7 @@ msgstr "Connecteu una font d'energia" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." -msgstr "" +msgstr "La instal·lació no tindrà èxit si aquest dispositiu perd energia." #: src/Application.vala:73 #, c-format From 5b41cd3abc4446d3392527cc18351a9355536e99 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Wed, 9 Oct 2024 21:32:53 +0000 Subject: [PATCH 20/37] Translated using Weblate (Hebrew) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/he/ --- po/he.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/he.po b/po/he.po index 90c23f3fb..563749f06 100644 --- a/po/he.po +++ b/po/he.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-10-07 08:07+0000\n" +"PO-Revision-Date: 2024-10-10 22:16+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -21,7 +21,7 @@ msgstr "נא לחבר למקור חשמל" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." -msgstr "" +msgstr "ההתקנה לא תצליח אם ההתקן הזה ינותק מחשמל." #: src/Application.vala:73 #, c-format From 786b505259198e72387ae94ef1f309bb27290ab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Fri, 11 Oct 2024 18:55:39 -0700 Subject: [PATCH 21/37] KeyboardLayout: list from xkbregistry (#833) --- .github/workflows/ci.yml | 2 +- README.md | 3 +- meson.build | 2 +- src/Config.vala.in | 1 - src/Objects/KeyboardLayout.vala | 76 +++-------------- src/meson.build | 6 +- vapi/xkbregistry.vapi | 147 ++++++++++++++++++++++++++++++++ 7 files changed, 163 insertions(+), 74 deletions(-) create mode 100644 vapi/xkbregistry.vapi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 359b907fb..db99c7221 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: - name: Install Dependencies run: | apt update - apt install -y desktop-file-utils gettext libadwaita-1-dev libdistinst-dev libgee-0.8-dev libgranite-7-dev libgtk-4-dev libxml2-dev libjson-glib-dev libpwquality-dev libxml2-utils meson valac + apt install -y desktop-file-utils gettext libadwaita-1-dev libdistinst-dev libgee-0.8-dev libgranite-7-dev libgtk-4-dev libxkbregistry-dev libjson-glib-dev libpwquality-dev meson valac - name: Build and Test env: DESTDIR: out diff --git a/README.md b/README.md index 4c4f4c751..9d2bb648c 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,7 @@ You'll need the following dependencies: - libadwaita-1-dev >=1.4.0 - libjson-glib-dev - libpwquality-dev - - libxml2-dev - - libxml2-utils + - libxkbregistry-dev - [distinst](https://github.com/pop-os/distinst/) - valac diff --git a/meson.build b/meson.build index e85533499..3f1c858cc 100644 --- a/meson.build +++ b/meson.build @@ -20,7 +20,7 @@ gio_dep = dependency('gio-2.0') granite_dep = dependency('granite-7', version: '>=7.4.0') adw_dep = dependency('libadwaita-1', version: '>=1.4.0') json_glib_dep = dependency('json-glib-1.0') -xml2_dep = dependency('libxml-2.0') +xkbregistry_dep = dependency('xkbregistry') pwquality_dep = dependency('pwquality') systemd_dep = dependency('systemd') diff --git a/src/Config.vala.in b/src/Config.vala.in index a9f6c8bd6..247c2d825 100644 --- a/src/Config.vala.in +++ b/src/Config.vala.in @@ -3,6 +3,5 @@ namespace Build { public const string LANG_LIST = "@LANG_LIST@"; public const string LOCALEDIR = @LOCALEDIR@; public const string PREFERRED_LANG_LIST = "@PREFERRED_LANG_LIST@"; - public const string XKB_BASE = "@XKB_BASE@"; public const string ISO_CODES_LOCATION = "@ISO_CODES_LOCATION@"; } diff --git a/src/Objects/KeyboardLayout.vala b/src/Objects/KeyboardLayout.vala index d9a3be6e0..e4ce0972f 100644 --- a/src/Objects/KeyboardLayout.vala +++ b/src/Objects/KeyboardLayout.vala @@ -246,79 +246,27 @@ public class Installer.KeyboardLayout : GLib.Object { return a.display_name.collate (b.display_name); } - private const string XKB_RULES_FILE = "base.xml"; - - private static string get_xml_rules_file_path () { - unowned string? base_path = GLib.Environment.get_variable ("XKB_CONFIG_ROOT"); - if (base_path == null) { - base_path = Build.XKB_BASE; - } - - return Path.build_filename (base_path, "rules", XKB_RULES_FILE); - } - public static GLib.ListStore get_all () { var layout_store = new GLib.ListStore (typeof (KeyboardLayout)); - unowned Xml.Doc* doc = Xml.Parser.read_file (get_xml_rules_file_path ()); - Xml.XPath.Context cntx = new Xml.XPath.Context (doc); - unowned Xml.XPath.Object* res = cntx.eval_expression ("/xkbConfigRegistry/layoutList/layout"); - if (res == null) { - delete doc; - critical ("Unable to parse 'base.xml'"); - return layout_store; - } - - if (res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null) { - delete res; - delete doc; - critical ("No layouts found in 'base.xml'"); - return layout_store; - } + var xkb_context = new Rxkb.Context (NO_FLAGS); + xkb_context.parse_default_ruleset (); - for (int i = 0; i < res->nodesetval->length (); i++) { - unowned Xml.Node* layout_node = res->nodesetval->item (i); - unowned Xml.Node* config_node = get_xml_node_by_name (layout_node, "configItem"); - unowned Xml.Node* variant_node = get_xml_node_by_name (layout_node, "variantList"); - unowned Xml.Node* description_node = get_xml_node_by_name (config_node, "description"); - unowned Xml.Node* name_node = get_xml_node_by_name (config_node, "name"); - if (name_node == null || description_node == null) { - continue; - } - - var layout = new KeyboardLayout (name_node->children->content, description_node->children->content); + var xkb_layout = xkb_context.get_first_layout (); + while (xkb_layout != null) { + var layout = new KeyboardLayout (xkb_layout.get_name (), xkb_layout.get_description ()); layout_store.insert_sorted (layout, (GLib.CompareDataFunc) KeyboardLayout.compare); - if (variant_node != null) { - for (unowned Xml.Node* variant_iter = variant_node->children; variant_iter != null; variant_iter = variant_iter->next) { - if (variant_iter->name == "variant") { - unowned Xml.Node* variant_config_node = get_xml_node_by_name (variant_iter, "configItem"); - if (variant_config_node != null) { - unowned Xml.Node* variant_description_node = get_xml_node_by_name (variant_config_node, "description"); - unowned Xml.Node* variant_name_node = get_xml_node_by_name (variant_config_node, "name"); - if (variant_description_node != null && variant_name_node != null) { - layout.add_variant (variant_name_node->children->content, variant_description_node->children->content); - } - } - } - } - } - } - - delete res; - delete doc; - return layout_store; - } + var next_layout = xkb_layout.next (); + while (next_layout != null && next_layout.get_variant () != null) { + layout.add_variant (next_layout.get_variant (), next_layout.get_description ()); - private static unowned Xml.Node* get_xml_node_by_name (Xml.Node* root, string name) { - for (unowned Xml.Node* iter = root->children; iter != null; iter = iter->next) { - if (iter->type == Xml.ElementType.ELEMENT_NODE) { - if (iter->name == name) { - return iter; - } + next_layout = next_layout.next (); } + + xkb_layout = next_layout; } - return null; + return layout_store; } } diff --git a/src/meson.build b/src/meson.build index 13bf7e43a..39df2156f 100644 --- a/src/meson.build +++ b/src/meson.build @@ -39,10 +39,6 @@ configuration_data.set('GETTEXT_PACKAGE', meson.project_name()) configuration_data.set('LANG_LIST', get_option('supported_languages')) configuration_data.set_quoted('LOCALEDIR', get_option('prefix') / get_option('localedir')) -xkbconf = dependency('xkeyboard-config') -xkb_base = xkbconf.get_pkgconfig_variable('xkb_base') -configuration_data.set('XKB_BASE', xkb_base) - isocodes = dependency('iso-codes') isocodes_prefix = isocodes.get_pkgconfig_variable('prefix') isocodes_location = join_paths(isocodes_prefix, get_option('datadir'), 'iso-codes', 'json') @@ -65,7 +61,7 @@ gui_dependencies = [ adw_dep, json_glib_dep, pwquality_dep, - xml2_dep + xkbregistry_dep ] executable(meson.project_name(), vala_files, config_file, diff --git a/vapi/xkbregistry.vapi b/vapi/xkbregistry.vapi new file mode 100644 index 000000000..bb4dfdd15 --- /dev/null +++ b/vapi/xkbregistry.vapi @@ -0,0 +1,147 @@ +/* + * Vala bindings for xkbregistry + * Copyright 2022 Corentin Noël + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +[CCode (cheader_filename = "xkbcommon/xkbregistry.h", cprefix = "rxkb_", lower_case_cprefix = "rxkb_")] +namespace Rxkb { + [CCode (cname = "struct rxkb_context", ref_function = "rxkb_context_ref", unref_function = "rxkb_context_unref", has_type_id = false)] + [Compact] + public class Context { + public Context (Rxkb.ContextFlags flags); + public void set_log_level (Rxkb.LogLevel level); + public Rxkb.LogLevel get_log_level (); + public bool parse (string ruleset); + public bool parse_default_ruleset (); + public bool include_path_append (string path); + public bool include_path_append_default (); + public void set_log_fn (LogFn log_fn); + public void set_user_data (void* user_data); + public void* get_user_data (); + [CCode (cname = "rxkb_model_first")] + public unowned Rxkb.Model? get_first_model (); + [CCode (cname = "rxkb_layout_first")] + public unowned Rxkb.Layout? get_first_layout (); + [CCode (cname = "rxkb_option_group_first")] + public unowned Rxkb.OptionGroup? get_first_option_group (); + public unowned Rxkb.Context @ref (); + public void unref (); + } + + [CCode (cname = "struct rxkb_model", ref_function = "rxkb_model_ref", unref_function = "rxkb_model_unref", has_type_id = false)] + [Compact] + public class Model { + public unowned Rxkb.Model? next (); + public unowned string get_name (); + public unowned string? get_description (); + public unowned string? get_vendor (); + public Rxkb.Popularity get_popularity (); + public unowned Rxkb.Model @ref (); + public void unref (); + } + + [CCode (cname = "struct rxkb_layout", ref_function = "rxkb_layout_ref", unref_function = "rxkb_layout_unref", has_type_id = false)] + [Compact] + public class Layout { + public unowned Rxkb.Layout? next (); + public unowned string get_name (); + public unowned string? get_description (); + public unowned string? get_variant (); + public unowned string? get_brief (); + [CCode (cname = "rxkb_layout_get_iso639_first")] + public unowned Rxkb.Iso639Code? get_first_iso639 (); + [CCode (cname = "rxkb_layout_get_iso3166_first")] + public unowned Rxkb.Iso3166Code? get_first_iso3166 (); + public unowned Rxkb.Layout @ref (); + public void unref (); + } + + [CCode (cname = "struct rxkb_option_group", ref_function = "rxkb_option_group_ref", unref_function = "rxkb_option_group_unref", has_type_id = false)] + [Compact] + public class OptionGroup { + public unowned Rxkb.OptionGroup? next (); + public unowned string get_name (); + public unowned string? get_description (); + public bool allows_multiple (); + public Rxkb.Popularity get_popularity (); + [CCode (cname = "rxkb_option_first")] + public unowned Rxkb.Option? get_first_option (); + public unowned Rxkb.OptionGroup @ref (); + public void unref (); + } + + [CCode (cname = "struct rxkb_option", ref_function = "rxkb_option_ref", unref_function = "rxkb_option_unref", has_type_id = false)] + [Compact] + public class Option { + public unowned Rxkb.Option? next (); + public unowned string get_name (); + public unowned string? get_description (); + public unowned string? get_brief (); + public Rxkb.Popularity get_popularity (); + public unowned Rxkb.Option @ref (); + public void unref (); + } + + [CCode (cname = "struct rxkb_iso639_code", ref_function = "rxkb_iso639_code_ref", unref_function = "rxkb_iso639_code_unref", has_type_id = false)] + [Compact] + public class Iso639Code { + public unowned Rxkb.Iso639Code? next (); + public unowned string get_code (); + public unowned Rxkb.Iso639Code @ref (); + public void unref (); + } + + [CCode (cname = "struct rxkb_iso3166_code", ref_function = "rxkb_iso3166_code_ref", unref_function = "rxkb_iso3166_code_unref", has_type_id = false)] + [Compact] + public class Iso3166Code { + public unowned Rxkb.Iso3166Code? next (); + public unowned string get_code (); + public unowned Rxkb.Iso3166Code @ref (); + public void unref (); + } + + [CCode (cname = "enum rxkb_context_flags", cprefix = "RXKB_CONTEXT_", has_type_id = false)] + [Flags] + public enum ContextFlags { + NO_FLAGS, + NO_DEFAULT_INCLUDES, + LOAD_EXOTIC_RULES + } + + [CCode (cname = "enum rxkb_popularity", cprefix = "RXKB_POPULARITY_", has_type_id = false)] + public enum Popularity { + STANDARD, + EXOTIC + } + + [CCode (cname = "enum rxkb_log_level", cprefix = "RXKB_LOG_LEVEL_", has_type_id = false)] + public enum LogLevel { + CRITICAL, + ERROR, + WARNING, + INFO, + DEBUG + } + + [CCode (has_target = false, has_typedef = false)] + public delegate void LogFn (Rxkb.Context ctx, Rxkb.LogLevel level, string format, va_list args); +} From b02f847e0316cf13139c2c213d64df05ab2bdfaa Mon Sep 17 00:00:00 2001 From: Ryo Nakano Date: Fri, 11 Oct 2024 12:50:30 +0000 Subject: [PATCH 22/37] Translated using Weblate (Japanese) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/ja/ --- po/ja.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/ja.po b/po/ja.po index 04daca212..25c34214e 100644 --- a/po/ja.po +++ b/po/ja.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-10-09 18:16+0000\n" +"PO-Revision-Date: 2024-10-12 12:00+0000\n" "Last-Translator: Ryo Nakano \n" "Language-Team: Japanese \n" @@ -334,7 +334,7 @@ msgstr "言語を選択" #: src/Views/LanguageView.vala:295 src/Views/LanguageView.vala:342 msgid "Currently active language" -msgstr "現在使用可能な言語" +msgstr "現在の選択言語" #: src/Views/PartitioningView.vala:51 msgid "Select Partitions" From 0ee054ae27874a502f57afa410e518a9b21c6230 Mon Sep 17 00:00:00 2001 From: David Hewitt Date: Sun, 13 Oct 2024 02:39:19 +0000 Subject: [PATCH 23/37] Translated using Weblate (English (United Kingdom)) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/en_GB/ --- po/en_GB.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/po/en_GB.po b/po/en_GB.po index d6a96350d..ecb928752 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-09-29 02:16+0000\n" +"PO-Revision-Date: 2024-10-13 05:38+0000\n" "Last-Translator: David Hewitt \n" "Language-Team: English (United Kingdom) \n" @@ -21,7 +21,7 @@ msgstr "Connect to a Power Source" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." -msgstr "" +msgstr "Installation will not succeed if this device loses power." #: src/Application.vala:73 #, c-format @@ -565,7 +565,7 @@ msgstr "Default (ext4)" #: src/Widgets/PartitionMenu.vala:261 msgid "Custom value must begin with /" -msgstr "" +msgstr "Custom value must begin with /" #~ msgid "" #~ "Your device is running on battery power. It's recommended to be plugged " From cc3401b9ab4044508c621a3814cf38a494ed798f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Sun, 13 Oct 2024 16:27:12 -0700 Subject: [PATCH 24/37] DiskBar: add constraint guide (#816) --- src/Widgets/DiskBar.vala | 43 ++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/src/Widgets/DiskBar.vala b/src/Widgets/DiskBar.vala index 0c5a228d4..5e4e790c8 100644 --- a/src/Widgets/DiskBar.vala +++ b/src/Widgets/DiskBar.vala @@ -69,6 +69,8 @@ public class Installer.DiskBar: Gtk.Box { public Gee.ArrayList partitions { get; construct; } public uint64 size { get; construct; } + private Gtk.ConstraintGuide guide; + public PartitionContainer (uint64 size, Gee.ArrayList partitions) { Object ( partitions: partitions, @@ -81,6 +83,28 @@ public class Installer.DiskBar: Gtk.Box { } construct { + guide = new Gtk.ConstraintGuide () { + max_width = 300, + min_width = 300, + nat_width = 600 + }; + + var layout_manager = ((Gtk.ConstraintLayout) get_layout_manager ()); + layout_manager.add_guide (guide); + + layout_manager.add_constraint ( + new Gtk.Constraint ( + guide, + HEIGHT, + EQ, + this, + HEIGHT, + 1.0, + 0.0, + Gtk.ConstraintStrength.REQUIRED + ) + ); + uint64 used = 0; var disk_sectors = size / 512; foreach (var partition in partitions) { @@ -100,17 +124,16 @@ public class Installer.DiskBar: Gtk.Box { var unused_bar = new Block (); unused_bar.add_css_class ("unused"); - append_partition (unused_bar, unused / size); + append_partition (unused_bar, (double) unused / size); } - var layout_manager = ((Gtk.ConstraintLayout) get_layout_manager ()); // Position last child at end layout_manager.add_constraint ( new Gtk.Constraint ( - get_last_child (), + null, END, EQ, - this, + get_last_child (), END, 1.0, 0.0, @@ -136,7 +159,7 @@ public class Installer.DiskBar: Gtk.Box { widget, HEIGHT, EQ, - this, + guide, HEIGHT, 1.0, 0.0, @@ -150,7 +173,7 @@ public class Installer.DiskBar: Gtk.Box { widget, WIDTH, EQ, - this, + guide, WIDTH, percentage, 0, @@ -163,10 +186,10 @@ public class Installer.DiskBar: Gtk.Box { // Position at start layout_manager.add_constraint ( new Gtk.Constraint ( - widget, + null, START, EQ, - this, + widget, START, 1.0, 0.0, @@ -182,8 +205,8 @@ public class Installer.DiskBar: Gtk.Box { EQ, previous_child, END, - 1.0, - 0.0, + 1, + 0, Gtk.ConstraintStrength.REQUIRED ) ); From 87fee86d2716aa968ef56651fb66a57eabb8a2e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Corentin=20No=C3=ABl?= Date: Mon, 14 Oct 2024 10:24:41 +0200 Subject: [PATCH 25/37] CheckView: Actually check if a children is there (#837) --- src/Views/CheckView.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Views/CheckView.vala b/src/Views/CheckView.vala index d2d23d34c..0c046e5fa 100644 --- a/src/Views/CheckView.vala +++ b/src/Views/CheckView.vala @@ -28,7 +28,7 @@ public class Installer.CheckView : AbstractInstallerView { private Gtk.Box message_box; public bool has_messages { get { - return message_box.get_first_child != null; + return message_box.get_first_child () != null; } } From 5370f1f16eabce206d009bb2357fd4204c2376f0 Mon Sep 17 00:00:00 2001 From: Kisaragi Hiu Date: Mon, 14 Oct 2024 06:58:55 +0000 Subject: [PATCH 26/37] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/zh_Hant/ --- po/zh_TW.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/zh_TW.po b/po/zh_TW.po index 5d45203cf..50673f934 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-10-07 08:07+0000\n" +"PO-Revision-Date: 2024-10-14 16:04+0000\n" "Last-Translator: Kisaragi Hiu \n" "Language-Team: Chinese (Traditional) \n" @@ -21,7 +21,7 @@ msgstr "請連接電源" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." -msgstr "" +msgstr "裝置若是沒電會無法完成安裝。" #: src/Application.vala:73 #, c-format From dbda76cc30386ed4678968443f321e4bc2e2719e Mon Sep 17 00:00:00 2001 From: Italo Felipe Capasso Ballesteros Date: Mon, 14 Oct 2024 16:24:54 +0000 Subject: [PATCH 27/37] Translated using Weblate (Spanish) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/es/ --- po/es.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/es.po b/po/es.po index c6a04b1f4..53c338bbe 100644 --- a/po/es.po +++ b/po/es.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-10-09 18:16+0000\n" +"PO-Revision-Date: 2024-10-14 17:11+0000\n" "Last-Translator: Italo Felipe Capasso Ballesteros \n" "Language-Team: Spanish \n" @@ -452,7 +452,7 @@ msgid "" "Create, resize, or otherwise manage partitions manually. This method may " "lead to data loss." msgstr "" -"Cree, redimensione o gestione manualmente las particiones. Este método puede " +"Cree, redimensione o gestione particiones manualmente. Este método puede " "provocar la pérdida de datos." #: src/Views/TryInstallView.vala:107 From 0c10d870947a9f4fa092721eb5006b10c90da406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Corentin=20No=C3=ABl?= Date: Tue, 15 Oct 2024 00:54:30 +0200 Subject: [PATCH 28/37] Application: Initialize translation at first (#836) --- src/Application.vala | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Application.vala b/src/Application.vala index 3afb029fb..fa825d970 100644 --- a/src/Application.vala +++ b/src/Application.vala @@ -21,11 +21,6 @@ public class Installer.App : Gtk.Application { } construct { - GLib.Intl.setlocale (LocaleCategory.ALL, ""); - GLib.Intl.bindtextdomain (application_id, Build.LOCALEDIR); - GLib.Intl.bind_textdomain_codeset (application_id, "UTF-8"); - GLib.Intl.textdomain (application_id); - add_main_option_entries (INSTALLER_OPTIONS); } @@ -84,5 +79,10 @@ public class Installer.App : Gtk.Application { } public static int main (string[] args) { + GLib.Intl.setlocale (LocaleCategory.ALL, ""); + GLib.Intl.bindtextdomain (Build.GETTEXT_PACKAGE, Build.LOCALEDIR); + GLib.Intl.bind_textdomain_codeset (Build.GETTEXT_PACKAGE, "UTF-8"); + GLib.Intl.textdomain (Build.GETTEXT_PACKAGE); + return new Installer.App ().run (args); } From 67b268a61af708a08d0d3d0072c3c65f357d0b47 Mon Sep 17 00:00:00 2001 From: Gustavo Silva Date: Tue, 15 Oct 2024 00:00:10 +0000 Subject: [PATCH 29/37] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/pt_BR/ --- po/pt_BR.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/po/pt_BR.po b/po/pt_BR.po index 9f12f786d..856eb2233 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-09-15 16:16+0000\n" -"Last-Translator: José Rafael \n" +"PO-Revision-Date: 2024-10-15 06:30+0000\n" +"Last-Translator: Gustavo Silva \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -21,7 +21,7 @@ msgstr "Conecte a uma fonte de energia" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." -msgstr "" +msgstr "A instalação irá falhar se o aparelho perder energia." #: src/Application.vala:73 #, c-format @@ -571,7 +571,7 @@ msgstr "Padrão (ext4)" #: src/Widgets/PartitionMenu.vala:261 msgid "Custom value must begin with /" -msgstr "" +msgstr "Valor customizado deve começar com /" #~ msgid "" #~ "Your device is running on battery power. It's recommended to be plugged " From 3576a9cbc87bc85cdf5104ed012562a9840764bb Mon Sep 17 00:00:00 2001 From: Ryo Nakano Date: Wed, 16 Oct 2024 04:49:05 +0900 Subject: [PATCH 30/37] LanguageView: Respect "main country" for locale selection (#835) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Danielle Foré --- src/Helpers/LocaleHelper.vala | 4 ++++ src/Views/LanguageView.vala | 25 ++++++++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/Helpers/LocaleHelper.vala b/src/Helpers/LocaleHelper.vala index 13b538de2..0a383007f 100644 --- a/src/Helpers/LocaleHelper.vala +++ b/src/Helpers/LocaleHelper.vala @@ -42,6 +42,10 @@ namespace LocaleHelper { public string alpha_2; public string alpha_3; public string name; + + public unowned string get_code () { + return alpha_2 ?? alpha_3; + } } private static Gee.HashMap lang_entries; diff --git a/src/Views/LanguageView.vala b/src/Views/LanguageView.vala index c25bfea0b..970ff968f 100644 --- a/src/Views/LanguageView.vala +++ b/src/Views/LanguageView.vala @@ -65,6 +65,8 @@ public class Installer.LanguageView : AbstractInstallerView { lang_variant_widget = new VariantWidget (); + lang_variant_widget.variant_listbox.set_sort_func ((Gtk.ListBoxSortFunc) CountryRow.compare); + lang_variant_widget.variant_listbox.row_activated.connect (() => { next_button.activate (); }); @@ -130,8 +132,8 @@ public class Installer.LanguageView : AbstractInstallerView { unowned Gtk.ListBoxRow crow = lang_variant_widget.variant_listbox.get_selected_row (); if (crow != null) { - string country = ((CountryRow) crow).country_entry.alpha_2; - configuration.country = country; + LocaleHelper.CountryEntry country = ((CountryRow) crow).country_entry; + configuration.country = country.get_code (); } else if (lang_entry.countries.length == 0) { configuration.country = null; } else { @@ -241,16 +243,25 @@ public class Installer.LanguageView : AbstractInstallerView { return; } + var lang_code = lang_entry.get_code (); + string? main_country = LocaleHelper.get_main_country (lang_code); + lang_variant_widget.variant_listbox.row_selected.disconnect (variant_row_selected); lang_variant_widget.clear_variants (); lang_variant_widget.variant_listbox.row_selected.connect (variant_row_selected); foreach (var country in countries) { - lang_variant_widget.variant_listbox.append (new CountryRow (country)); + var country_row = new CountryRow (country); + lang_variant_widget.variant_listbox.append (country_row); + if (country.get_code () == main_country) { + lang_variant_widget.variant_listbox.select_row (country_row); + } } - lang_variant_widget.variant_listbox.select_row (lang_variant_widget.variant_listbox.get_row_at_index (0)); + if (main_country == null || lang_variant_widget.variant_listbox.get_selected_row () == null) { + lang_variant_widget.variant_listbox.select_row (lang_variant_widget.variant_listbox.get_row_at_index (0)); + } - Environment.set_variable ("LANGUAGE", lang_entry.get_code (), true); + Environment.set_variable ("LANGUAGE", lang_code, true); Intl.textdomain (Build.GETTEXT_PACKAGE); lang_variant_widget.show_variants (_("Languages"), lang_entry.name); } @@ -369,5 +380,9 @@ public class Installer.LanguageView : AbstractInstallerView { child = box; } + + public static int compare (CountryRow countryrow1, CountryRow countryrow2) { + return countryrow1.country_entry.name.collate (countryrow2.country_entry.name); + } } } From c724f5eb46a32c922f60937a36dc5ce2dffe30c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Wed, 16 Oct 2024 09:13:07 -0700 Subject: [PATCH 31/37] LanguageView: port cleanups from InitialSetup (#831) --- src/Views/LanguageView.vala | 86 ++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/src/Views/LanguageView.vala b/src/Views/LanguageView.vala index 970ff968f..a353d5ae5 100644 --- a/src/Views/LanguageView.vala +++ b/src/Views/LanguageView.vala @@ -18,13 +18,12 @@ */ public class Installer.LanguageView : AbstractInstallerView { - Gtk.Label select_label; - Gtk.Stack select_stack; - Gtk.Button next_button; - int select_number = 0; - Gee.LinkedList preferred_langs; + private Gtk.Button next_button; + private Gtk.Label select_label; + private Gtk.Stack select_stack; + private int select_number = 0; + private static Gee.LinkedList preferred_langs; private uint lang_timeout = 0U; - private VariantWidget lang_variant_widget; public LanguageView () { @@ -37,24 +36,26 @@ public class Installer.LanguageView : AbstractInstallerView { } } - construct { + static construct { preferred_langs = new Gee.LinkedList (); - foreach (var lang in Build.PREFERRED_LANG_LIST.split (";")) { - preferred_langs.add (lang); - } + preferred_langs.add_all_array (Build.PREFERRED_LANG_LIST.split (";")); + } + construct { var image = new Gtk.Image.from_icon_name ("preferences-desktop-locale") { pixel_size = 128, valign = Gtk.Align.END }; - select_label = new Gtk.Label (null); - select_label.halign = Gtk.Align.CENTER; - select_label.wrap = true; + select_label = new Gtk.Label (null) { + halign = CENTER, + valign = START, + wrap = true + }; - select_stack = new Gtk.Stack (); - select_stack.valign = Gtk.Align.START; - select_stack.transition_type = Gtk.StackTransitionType.CROSSFADE; + select_stack = new Gtk.Stack () { + transition_type = Gtk.StackTransitionType.CROSSFADE + }; select_stack.add_child (select_label); select_stack.notify["transition-running"].connect (() => { @@ -71,19 +72,7 @@ public class Installer.LanguageView : AbstractInstallerView { next_button.activate (); }); - lang_variant_widget.main_listbox.set_sort_func ((row1, row2) => { - var langrow1 = (LangRow) row1; - var langrow2 = (LangRow) row2; - if (langrow1.preferred_row && langrow2.preferred_row == false) { - return -1; - } else if (langrow2.preferred_row && langrow1.preferred_row == false) { - return 1; - } else if (langrow1.preferred_row && langrow2.preferred_row) { - return preferred_langs.index_of (langrow1.lang_entry.get_code ()) - preferred_langs.index_of (langrow2.lang_entry.get_code ()); - } - - return langrow1.lang_entry.name.collate (langrow2.lang_entry.name); - }); + lang_variant_widget.main_listbox.set_sort_func ((Gtk.ListBoxSortFunc) LangRow.compare); lang_variant_widget.main_listbox.set_header_func ((row, before) => { row.set_header (null); @@ -95,6 +84,7 @@ public class Installer.LanguageView : AbstractInstallerView { margin_bottom = 3, margin_start = 6 }; + row.set_header (separator); } } @@ -111,8 +101,9 @@ public class Installer.LanguageView : AbstractInstallerView { lang_variant_widget.main_listbox.append (langrow); } - next_button = new Gtk.Button.with_label (_("Select")); - next_button.sensitive = false; + next_button = new Gtk.Button.with_label (_("Select")) { + sensitive = false + }; next_button.add_css_class (Granite.STYLE_CLASS_SUGGESTED_ACTION); action_box_end.append (next_button); @@ -315,9 +306,10 @@ public class Installer.LanguageView : AbstractInstallerView { public LangRow (LocaleHelper.LangEntry lang_entry) { this.lang_entry = lang_entry; - image = new Gtk.Image (); - image.hexpand = true; - image.halign = Gtk.Align.END; + image = new Gtk.Image () { + halign = END, + hexpand = true + }; var label = new Gtk.Label (lang_entry.name) { ellipsize = Pango.EllipsizeMode.END, @@ -336,6 +328,18 @@ public class Installer.LanguageView : AbstractInstallerView { child = box; } + + public static int compare (LangRow langrow1, LangRow langrow2) { + if (langrow1.preferred_row && langrow2.preferred_row == false) { + return -1; + } else if (langrow2.preferred_row && langrow1.preferred_row == false) { + return 1; + } else if (langrow1.preferred_row && langrow2.preferred_row) { + return preferred_langs.index_of (langrow1.lang_entry.get_code ()) - preferred_langs.index_of (langrow2.lang_entry.get_code ()); + } + + return langrow1.lang_entry.name.collate (langrow2.lang_entry.name); + } } public class CountryRow : Gtk.ListBoxRow { @@ -361,13 +365,17 @@ public class Installer.LanguageView : AbstractInstallerView { public CountryRow (LocaleHelper.CountryEntry country_entry) { this.country_entry = country_entry; - image = new Gtk.Image (); - image.hexpand = true; - image.halign = Gtk.Align.END; - var label = new Gtk.Label (country_entry.name); + image = new Gtk.Image () { + halign = END, + hexpand = true + }; + + var label = new Gtk.Label (country_entry.name) { + ellipsize = END, + xalign = 0 + }; label.add_css_class (Granite.STYLE_CLASS_H3_LABEL); - label.xalign = 0; var box = new Gtk.Box (HORIZONTAL, 6) { margin_top = 6, From b53be249b7515304cbec61256e8964d216aac215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Fri, 18 Oct 2024 09:32:01 -0700 Subject: [PATCH 32/37] Update gschema.override (#840) --- session/installer-default-settings.gschema.override | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/session/installer-default-settings.gschema.override b/session/installer-default-settings.gschema.override index 15e1c2c16..965a2e29d 100644 --- a/session/installer-default-settings.gschema.override +++ b/session/installer-default-settings.gschema.override @@ -4,6 +4,11 @@ triggers=['space'] [org.freedesktop.ibus.panel:Installer] show=1 +[org.gnome.desktop.background:Installer] +picture-options='zoom' +picture-uri='file:///usr/share/backgrounds/elementaryos-default' +primary-color='#000000' + [org.gnome.desktop.datetime:Installer] automatic-timezone=true @@ -32,6 +37,7 @@ resize-with-right-button=true [org.gnome.nm-applet:Installer] disable-connected-notifications=true +disable-disconnected-notifications=true show-applet=false [org.gnome.settings-daemon.peripherals.touchpad:Installer] From 20e938a0a1fbc1121de85a0f27e6b79712209840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Fri, 18 Oct 2024 18:16:28 -0700 Subject: [PATCH 33/37] Launcher: use gnome-session-quit --no-prompt (#839) --- data/io.elementary.installer.desktop.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/io.elementary.installer.desktop.in b/data/io.elementary.installer.desktop.in index 31c8ac8a4..d9272ca9e 100644 --- a/data/io.elementary.installer.desktop.in +++ b/data/io.elementary.installer.desktop.in @@ -1,7 +1,7 @@ [Desktop Entry] Name=Install elementary OS Comment=Install the system -Exec=dbus-send --session --dest=org.gnome.SessionManager --print-reply /org/gnome/SessionManager org.gnome.SessionManager.Logout uint32:0 +Exec=gnome-session-quit --no-prompt Icon=io.elementary.installer Terminal=false Type=Application From cc5b114a5ece6b1cf3169048ef816690bb816b8a Mon Sep 17 00:00:00 2001 From: Marcin Serwin Date: Sat, 19 Oct 2024 07:29:31 +0000 Subject: [PATCH 34/37] Translated using Weblate (Polish) Currently translated at 100.0% (114 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/pl/ --- po/pl.po | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/po/pl.po b/po/pl.po index e53aaee36..8fdbe9061 100644 --- a/po/pl.po +++ b/po/pl.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-10-02 18:16+0000\n" +"PO-Revision-Date: 2024-10-19 10:24+0000\n" "Last-Translator: Marcin Serwin \n" "Language-Team: Polish \n" @@ -23,6 +23,7 @@ msgstr "Podłącz do źródła zasilania" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." msgstr "" +"Instalacja nie powiedzie się jeśli urządzenie straci dostęp do zasilania." #: src/Application.vala:73 #, c-format From 81d4a9d4b61a3cc5fb8952406f2128258886c66b Mon Sep 17 00:00:00 2001 From: David Hewitt Date: Sun, 20 Oct 2024 12:35:34 +0900 Subject: [PATCH 35/37] Set LANG variable on startup (#843) --- src/Application.vala | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Application.vala b/src/Application.vala index fa825d970..97ee2d94c 100644 --- a/src/Application.vala +++ b/src/Application.vala @@ -79,6 +79,14 @@ public class Installer.App : Gtk.Application { } public static int main (string[] args) { + // When the installer starts on a live iso session, LANG is set to C.UTF-8, which causes gettext to ignore the + // LANGUAGE variable. To enable runtime language switching, we need to set LANG to something other than C.UTF-8. See: + // https://github.com/autotools-mirror/gettext/blob/8f089a25a48a2855e2ca9c700984f4dc514cfcb6/gettext-runtime/intl/dcigettext.c#L1509-L1525 + var current_lang = Environment.get_variable ("LANG"); + if (current_lang == null || current_lang.has_prefix ("C.")) { + Environment.set_variable ("LANG", "en_US.UTF-8", true); + } + GLib.Intl.setlocale (LocaleCategory.ALL, ""); GLib.Intl.bindtextdomain (Build.GETTEXT_PACKAGE, Build.LOCALEDIR); GLib.Intl.bind_textdomain_codeset (Build.GETTEXT_PACKAGE, "UTF-8"); From 4310a1379d7cc4a26fea45381cc9e59d9f3e5154 Mon Sep 17 00:00:00 2001 From: DutchVipperloid Date: Mon, 21 Oct 2024 10:30:41 +0000 Subject: [PATCH 36/37] Translated using Weblate (Dutch) Currently translated at 99.1% (113 of 114 strings) Translation: Installer/Installer Translate-URL: https://l10n.elementary.io/projects/installer/installer/nl/ --- po/nl.po | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/po/nl.po b/po/nl.po index 3d8f28d26..572ef9fd7 100644 --- a/po/nl.po +++ b/po/nl.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-10-08 16:51+0000\n" -"PO-Revision-Date: 2024-09-14 09:16+0000\n" +"PO-Revision-Date: 2024-10-21 12:28+0000\n" "Last-Translator: DutchVipperloid \n" "Language-Team: Dutch \n" @@ -22,6 +22,8 @@ msgstr "Verbinding met een voedingsbron maken" #: src/Application.vala:60 msgid "Installation will not succeed if this device loses power." msgstr "" +"De installatie zal niet afgerond kunnen worden als dit apparaat toegang tot " +"stroom verliest." #: src/Application.vala:73 #, c-format From 20fed8a018bbd4cb99f2086f228c389b7031647d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Mon, 21 Oct 2024 10:05:06 -0700 Subject: [PATCH 37/37] Metainfo: update 8.0.1 release notes (#845) --- data/installer.metainfo.xml.in | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/data/installer.metainfo.xml.in b/data/installer.metainfo.xml.in index 590b3e27c..102ae8cdb 100644 --- a/data/installer.metainfo.xml.in +++ b/data/installer.metainfo.xml.in @@ -60,12 +60,23 @@

Improvements:

    +
  • Sort language variants alphabetically and automatically select main variant by default
  • +
  • Provide more feedback for invalid values when doing a custom install
  • +
  • Battery warning is sent as a notification instead of an infobar
  • +
  • Update post-install driver installation instructions
  • +
  • Improve screen reader support
  • Updated translations
Screen Reader ignores each view’s title text Second step of VariantWidget not focused + Port Installer to GTK4 + Use libxkbregistry + No partitions visible when running without daemon + Installer is not localized + Clicking a partition in the custom install glitches the installer window + Installer doesn't launch from Applications menu in Circe daily