├── .gitignore ├── README ├── data ├── meson.build ├── piclone.desktop.in └── piclone.ui ├── debian ├── changelog ├── control ├── copyright ├── rules └── source │ └── format ├── meson.build ├── po ├── POTFILES.in ├── de.po ├── en_GB.po ├── hy.po ├── it.po ├── ko.po ├── linggen ├── meson.build ├── nb.po ├── sk.po └── zh_CN.po └── src ├── backup ├── meson.build └── piclone.c /.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | *.so 3 | *.la 4 | *.a 5 | *.gmo 6 | *.lo 7 | *.desktop 8 | *.log 9 | *.pot 10 | .dirstamp 11 | configure 12 | config.guess 13 | config.h 14 | config.h.in 15 | config.h.in~ 16 | config.log 17 | config.status 18 | config.sub 19 | Makefile 20 | Makefile.in 21 | POTFILES 22 | LINGUAS 23 | po/.intltool-merge-cache 24 | po/stamp-it 25 | aclocal.m4 26 | ar-lib 27 | compile 28 | depcomp 29 | install-sh 30 | libtool 31 | ltmain.sh 32 | missing 33 | stamp-h1 34 | .deps/ 35 | .libs/ 36 | autom4te.cache/ 37 | m4/ 38 | autoreconf.* 39 | *.substvars 40 | debian/files 41 | debian/debhelper-build-stamp 42 | debian/.debhelper/ 43 | debian/piclone/ 44 | piclone 45 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | How to build 2 | ------------ 3 | 4 | 1. Install dependencies 5 | 6 | The dependencies of any Debian project are listed in the "Build-Depends" section 7 | of the file named "control" in the "debian" subdirectory of the project. Either 8 | install each of these manually by using "sudo apt install ", or, 9 | if the project has already been released into apt, the build dependencies can all 10 | be automatically installed using the command "sudo apt build-dep ". 11 | 12 | 2. Configure meson 13 | 14 | To configure the meson build system, use the command "meson setup builddir" 15 | in the top directory of the project. This will create a subdirectory "builddir", 16 | and by default set the project for installation in the /usr/local tree, 17 | which will not overwrite a version which has been installed from apt. 18 | 19 | If you wish to overwrite a preinstalled version in the /usr tree, use the command 20 | "meson setup builddir --prefix=/usr --libdir=/usr/lib/". 21 | On a 32-bit system, should be "arm-linux-gnueabihf". 22 | On a 64-bit system, should be "aarch64-linux-gnu". 23 | 24 | 3. Build 25 | 26 | To build the application, change to the "builddir" directory and use the 27 | command "meson compile". 28 | 29 | 4. Install 30 | 31 | To install the application and all required data files, change to the 32 | "builddir" directory and use the command "sudo meson install". 33 | -------------------------------------------------------------------------------- /data/meson.build: -------------------------------------------------------------------------------- 1 | install_data('piclone.ui', install_dir: resource_dir) 2 | 3 | i18n.merge_file(input: 'piclone.desktop.in', 4 | output: 'piclone.desktop', 5 | type: 'desktop', 6 | po_dir: '../po', 7 | install: true, 8 | install_dir: desktop_dir 9 | ) 10 | -------------------------------------------------------------------------------- /data/piclone.desktop.in: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Name=SD Card Copier 4 | GenericName=SD Card Copier 5 | Comment=Make a copy of the Raspbian SD card 6 | Icon=media-removable 7 | Exec=piclone 8 | StartupNotify=true 9 | Categories=Utility; 10 | -------------------------------------------------------------------------------- /data/piclone.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | False 7 | 5 8 | SD Card Copier 9 | False 10 | media-removable 11 | 12 | 13 | True 14 | False 15 | vertical 16 | 2 17 | 18 | 19 | True 20 | False 21 | vertical 22 | 5 23 | 24 | 25 | True 26 | False 27 | 10 28 | 29 | 30 | True 31 | False 32 | Select the device from which to copy 33 | Copy From Device: 34 | 0 35 | 36 | 37 | True 38 | True 39 | 0 40 | 41 | 42 | 43 | 44 | True 45 | False 46 | Select the device to copy from 47 | 48 | 49 | False 50 | True 51 | 1 52 | 53 | 54 | 55 | 56 | False 57 | True 58 | 0 59 | 60 | 61 | 62 | 63 | True 64 | False 65 | 10 66 | 67 | 68 | True 69 | False 70 | Select the device to which to copy 71 | Copy To Device: 72 | 0 73 | 74 | 75 | True 76 | True 77 | 0 78 | 79 | 80 | 81 | 82 | True 83 | False 84 | Select the device to copy to 85 | 86 | 87 | False 88 | True 89 | 1 90 | 91 | 92 | 93 | 94 | False 95 | True 96 | 1 97 | 98 | 99 | 100 | 101 | True 102 | False 103 | 104 | 105 | New Partition UUIDs 106 | True 107 | True 108 | False 109 | Check this box to create new partition UUIDs on the copy 110 | True 111 | 112 | 113 | False 114 | True 115 | end 116 | 0 117 | 118 | 119 | 120 | 121 | False 122 | True 123 | 2 124 | 125 | 126 | 127 | 128 | False 129 | True 130 | 0 131 | 132 | 133 | 134 | 135 | True 136 | False 137 | 5 138 | True 139 | end 140 | 141 | 142 | gtk-help 143 | True 144 | True 145 | True 146 | True 147 | 148 | 149 | False 150 | False 151 | end 152 | 0 153 | True 154 | 155 | 156 | 157 | 158 | gtk-close 159 | True 160 | True 161 | True 162 | True 163 | 164 | 165 | False 166 | False 167 | end 168 | 1 169 | 170 | 171 | 172 | 173 | Start 174 | True 175 | True 176 | True 177 | 178 | 179 | False 180 | False 181 | end 182 | 2 183 | 184 | 185 | 186 | 187 | True 188 | True 189 | 1 190 | 191 | 192 | 193 | 194 | 195 | 196 | vertical 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | pixbox 211 | False 212 | False 213 | True 214 | True 215 | center-on-parent 216 | 340 217 | True 218 | dialog 219 | True 220 | True 221 | 222 | 223 | True 224 | False 225 | 20 226 | 20 227 | 20 228 | 20 229 | vertical 230 | 20 231 | 232 | 233 | 300 234 | True 235 | False 236 | label 237 | True 238 | 239 | 240 | False 241 | True 242 | 0 243 | 244 | 245 | 246 | 247 | True 248 | False 249 | 250 | 251 | False 252 | True 253 | 1 254 | 255 | 256 | 257 | 258 | True 259 | False 260 | 20 261 | 262 | 263 | _Cancel 264 | 100 265 | True 266 | True 267 | True 268 | True 269 | 270 | 271 | True 272 | False 273 | 0 274 | 275 | 276 | 277 | 278 | _OK 279 | 100 280 | True 281 | True 282 | True 283 | True 284 | 285 | 286 | True 287 | False 288 | 1 289 | 290 | 291 | 292 | 293 | False 294 | True 295 | 2 296 | 297 | 298 | 299 | 300 | 301 | 302 | False 303 | False 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | SD Card Copier v1.0 312 | 313 | This is an application to copy and back up SD cards. To use it, you will need a USB SD card writer. 314 | 315 | To back up your Raspberry Pi's internal SD card, insert a blank SD card into a USB card writer and connect it to your Pi. Then start the application, choose your card writer from the “Copy To Device” drop-down box and press “Start”. The copy process will take 10-15 minutes depending on the size of your card. 316 | 317 | The resulting card should be a bootable copy of your existing card; to restore, simply place the backup card into the onboard SD card slot, put the card to restore onto into the USB writer and repeat the copy process above. 318 | 319 | You can also back up to a standard USB stick, and then restore from the USB stick to an SD card by setting the “Copy From Device” drop-down to the USB stick and the “Copy To Device” to a USB card writer containing the card to restore onto. 320 | 321 | Note that you cannot copy onto the SD card from which your Pi is currently booted, which is why it does not appear in the “Copy To Device” dropdown. 322 | 323 | Note also that the destination card doesn’t need to be the same size as the source card, but it must have enough space to hold all the data that is on it. The application will warn you if there is insufficient space on the destination. 324 | 325 | Under Raspbian Stretch and later versions, you cannot mount two partitions with the same UUID, so you will not be able to mount a cloned SD card when booted from the disk from which it was cloned. If you need to do this, check the "New Partition UUIDs" box before copying. 326 | 327 | 328 | 329 | 400 330 | 250 331 | False 332 | 5 333 | SD Card Copier Help 334 | media-removable 335 | dialog 336 | 337 | 338 | True 339 | False 340 | vertical 341 | 5 342 | 343 | 344 | True 345 | False 346 | end 347 | 348 | 349 | gtk-ok 350 | True 351 | True 352 | True 353 | True 354 | 355 | 356 | False 357 | False 358 | 1 359 | 360 | 361 | 362 | 363 | False 364 | False 365 | 0 366 | 367 | 368 | 369 | 370 | True 371 | True 372 | never 373 | 374 | 375 | 400 376 | 200 377 | True 378 | False 379 | False 380 | word 381 | False 382 | textbuffer1 383 | 384 | 385 | 386 | 387 | True 388 | True 389 | 1 390 | 391 | 392 | 393 | 394 | 395 | btn_ok 396 | 397 | 398 | 399 | -------------------------------------------------------------------------------- /debian/changelog: -------------------------------------------------------------------------------- 1 | piclone (0.32) bookworm; urgency=medium 2 | 3 | * Convert to meson build system 4 | 5 | -- Simon Long Thu, 27 Mar 2025 13:22:37 +0000 6 | 7 | piclone (0.31) bookworm; urgency=medium 8 | 9 | * Fix shadows on undecorated windows 10 | 11 | -- Simon Long Thu, 12 Sep 2024 13:47:44 +0100 12 | 13 | piclone (0.30) bookworm; urgency=medium 14 | 15 | * Translation update 16 | 17 | -- Simon Long Tue, 16 Jul 2024 07:47:57 +0100 18 | 19 | piclone (0.29) bookworm; urgency=medium 20 | 21 | * Use allocated rather than fixed buffer in sys_printf 22 | 23 | -- Simon Long Tue, 09 Apr 2024 09:26:44 +0100 24 | 25 | piclone (0.28) bookworm; urgency=medium 26 | 27 | * Fix hiding of titlebars under Wayland 28 | 29 | -- Simon Long Mon, 15 Jan 2024 07:59:21 +0000 30 | 31 | piclone (0.27) bookworm; urgency=medium 32 | 33 | * Run GUI without sudo 34 | 35 | -- Simon Long Wed, 26 Jul 2023 10:58:57 +0100 36 | 37 | piclone (0.26) bullseye; urgency=medium 38 | 39 | * Set undecorated dialogs in code 40 | 41 | -- Simon Long Tue, 31 Jan 2023 09:56:21 +0000 42 | 43 | piclone (0.25) bullseye; urgency=medium 44 | 45 | * Fix size of modal dialog 46 | 47 | -- Simon Long Tue, 15 Mar 2022 10:10:48 +0000 48 | 49 | piclone (0.24) bullseye; urgency=medium 50 | 51 | * Add call to lxplug-ejecter external eject command at end 52 | 53 | -- Simon Long Thu, 02 Sep 2021 12:06:59 +0100 54 | 55 | piclone (0.23) bullseye; urgency=medium 56 | 57 | * Added Italian translation 58 | 59 | -- Simon Long Mon, 16 Aug 2021 10:34:05 +0100 60 | 61 | piclone (0.22) bullseye; urgency=medium 62 | 63 | * Korean translation added 64 | 65 | -- Simon Long Mon, 09 Aug 2021 10:05:14 +0100 66 | 67 | piclone (0.21) bullseye; urgency=medium 68 | 69 | * Remove dialog hint 70 | 71 | -- Simon Long Mon, 12 Jul 2021 13:31:11 +0100 72 | 73 | piclone (0.20) bullseye; urgency=medium 74 | 75 | * Added Armenian translation 76 | 77 | -- Simon Long Mon, 26 Apr 2021 09:04:29 +0100 78 | 79 | piclone (0.19) buster; urgency=medium 80 | 81 | * Remove hiding of application in other desktops 82 | 83 | -- Simon Long Thu, 01 Apr 2021 20:38:12 +0100 84 | 85 | piclone (0.18) buster; urgency=medium 86 | 87 | * Fix issue with NVME devices 88 | 89 | -- Simon Long Wed, 24 Feb 2021 14:13:30 +0000 90 | 91 | piclone (0.17) buster; urgency=medium 92 | 93 | * Added Slovak translation 94 | 95 | -- Simon Long Sun, 03 Jan 2021 21:54:22 +0000 96 | 97 | piclone (0.16) buster; urgency=medium 98 | 99 | * Abort copy if drives changed while in progress 100 | 101 | -- Simon Long Mon, 15 Jun 2020 13:37:29 +0100 102 | 103 | piclone (0.15) buster; urgency=medium 104 | 105 | * Modify desktop file to preserve environment 106 | 107 | -- Simon Long Fri, 04 Oct 2019 15:02:49 +0100 108 | 109 | piclone (0.14) buster; urgency=medium 110 | 111 | * Added Norwegian translation 112 | 113 | -- Simon Long Wed, 21 Aug 2019 09:59:22 +0100 114 | 115 | piclone (0.13) unstable; urgency=medium 116 | 117 | * Create new FATs as FAT32 by default. 118 | 119 | -- Simon Long Fri, 10 May 2019 07:46:46 +0100 120 | 121 | piclone (0.12) stretch; urgency=medium 122 | 123 | * Set partition flags at end of copy rather than start 124 | 125 | -- Simon Long Wed, 06 Mar 2019 08:50:10 +0000 126 | 127 | piclone (0.11) stretch; urgency=medium 128 | 129 | * Add dependency on dbus package 130 | 131 | -- Simon Long Wed, 23 Jan 2019 09:09:28 +0000 132 | 133 | piclone (0.10) stretch; urgency=medium 134 | 135 | * Move password prompt into subdir of /usr/lib/ 136 | 137 | -- Simon Long Fri, 06 Jul 2018 09:18:07 +0100 138 | 139 | piclone (0.9) stretch; urgency=medium 140 | 141 | * Move password prompt into /usr/lib/ 142 | 143 | -- Simon Long Thu, 21 Jun 2018 15:24:34 +0100 144 | 145 | piclone (0.8) stretch; urgency=medium 146 | 147 | * Use new style for message box 148 | 149 | -- Simon Long Fri, 18 May 2018 11:52:23 +0100 150 | 151 | piclone (0.7) stretch; urgency=medium 152 | 153 | * Add option to not clone partition UUIDs 154 | 155 | -- Simon Long Tue, 18 Jul 2017 08:21:15 +0100 156 | 157 | piclone (0.6) stretch; urgency=medium 158 | 159 | * Enable access to session DBus from desktop command line 160 | 161 | -- Simon Long Mon, 17 Jul 2017 15:18:41 +0100 162 | 163 | piclone (0.5) stretch; urgency=medium 164 | 165 | * Use sudo -A option with zenity helper script to prompt for password when needed 166 | 167 | -- Simon Long Tue, 04 Jul 2017 15:26:56 +0100 168 | 169 | piclone (0.4) jessie; urgency=medium 170 | 171 | * Clone PARTUUID when copying 172 | * Allow all /dev/sd? and /dev/mmcblk? devices as sources and targets 173 | * Detect root and boot devices and prevent use as target 174 | 175 | -- Simon Long Wed, 08 Mar 2017 14:33:07 +0000 176 | 177 | piclone (0.3) Jessie; urgency=low 178 | 179 | * Retry file system creation if it fails due to inability to write UUID 180 | * Improve portability of parted output 181 | 182 | -- Simon Long Wed, 10 Aug 2016 09:15:00 +0100 183 | 184 | piclone (0.2) jessie; urgency=medium 185 | 186 | * Added some more error checking to prevent null strings making it into commands 187 | * Copying of volume labels and IDs added 188 | * Integrate effects of language changes 189 | * Translations updated 190 | * Check for more than 9 partitions 191 | * A lot of error checking for failures such as write-protected target 192 | * German translation added 193 | 194 | -- Serge Schneider Fri, 27 May 2016 10:58:28 +0100 195 | 196 | piclone (0.1) unstable; urgency=low 197 | 198 | * Initial release 199 | 200 | -- Simon Long Mon, 22 Feb 2016 16:50:06 +0000 201 | -------------------------------------------------------------------------------- /debian/control: -------------------------------------------------------------------------------- 1 | Source: piclone 2 | Section: utils 3 | Priority: optional 4 | Maintainer: Simon Long 5 | Build-Depends: debhelper-compat (= 13), meson, libgtk-3-dev (>= 3.24), intltool (>= 0.40.0) 6 | Standards-Version: 4.5.1 7 | Homepage: http://raspberrypi.com/ 8 | 9 | Package: piclone 10 | Architecture: any 11 | Depends: ${shlibs:Depends}, ${misc:Depends}, parted, dosfstools, e2fsprogs, coreutils, mount, uuid, sudopwd, dbus-x11, libgtk-3-0 (>= 3.24) 12 | Description: SD Card backup program for Raspberry Pi 13 | This is a GTK application to copy the contents of SD cards and other USB 14 | drives. It mirrors the partition layout of the source device onto the 15 | target device, with the exception of the last partition, which is created 16 | to be the largest which will fit onto the target device. 17 | Files are then copied between all partitions - the result should be a 18 | bootable card with an image of the source device. 19 | -------------------------------------------------------------------------------- /debian/copyright: -------------------------------------------------------------------------------- 1 | Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | Upstream-Name: piclone 3 | Source: http://github.com/raspberrypi/piclone 4 | 5 | Files: * 6 | Copyright: 2016-2025 Raspberry Pi 7 | License: BSD-3-Clause 8 | 9 | License: BSD-3-Clause 10 | Redistribution and use in source and binary forms, with or without 11 | modification, are permitted provided that the following conditions 12 | are met: 13 | 1. Redistributions of source code must retain the above copyright 14 | notice, this list of conditions and the following disclaimer. 15 | 2. Redistributions in binary form must reproduce the above copyright 16 | notice, this list of conditions and the following disclaimer in the 17 | documentation and/or other materials provided with the distribution. 18 | 3. Neither the name of the University nor the names of its contributors 19 | may be used to endorse or promote products derived from this software 20 | without specific prior written permission. 21 | . 22 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 25 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE HOLDERS OR 26 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 27 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 28 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 29 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 30 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 31 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 | -------------------------------------------------------------------------------- /debian/rules: -------------------------------------------------------------------------------- 1 | #!/usr/bin/make -f 2 | # See debhelper(7) (uncomment to enable) 3 | # output every command that modifies files on the build system. 4 | #DH_VERBOSE = 1 5 | 6 | # see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/* 7 | DPKG_EXPORT_BUILDFLAGS = 1 8 | include /usr/share/dpkg/default.mk 9 | 10 | %: 11 | dh $@ --with autoreconf 12 | -------------------------------------------------------------------------------- /debian/source/format: -------------------------------------------------------------------------------- 1 | 3.0 (native) 2 | -------------------------------------------------------------------------------- /meson.build: -------------------------------------------------------------------------------- 1 | project ('piclone','c') 2 | 3 | share_dir = join_paths(get_option('prefix'), 'share') 4 | bin_dir = join_paths(get_option('prefix'), 'bin') 5 | resource_dir = join_paths(share_dir, meson.project_name()) 6 | desktop_dir = join_paths(share_dir, 'applications') 7 | 8 | i18n = import('i18n') 9 | 10 | add_project_arguments('-DPACKAGE_LOCALE_DIR="' + share_dir + '/locale"', language : 'c' ) 11 | 12 | subdir('po') 13 | subdir('src') 14 | subdir('data') 15 | -------------------------------------------------------------------------------- /po/POTFILES.in: -------------------------------------------------------------------------------- 1 | [encoding: UTF-8] 2 | src/piclone.c 3 | [type: gettext/glade] data/piclone.ui 4 | # files added by intltool-prepare 5 | data/piclone.desktop.in 6 | data/pwdpic.sh 7 | -------------------------------------------------------------------------------- /po/de.po: -------------------------------------------------------------------------------- 1 | # German translations for piclone package. 2 | # Copyright (C) 2016 THE piclone'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the piclone package. 4 | # Simon Long , 2016. 5 | # Benjamin Weis 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: piclone 0.1\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2016-02-22 16:07+0000\n" 12 | "PO-Revision-Date: 2016-05-14 16:20+0200\n" 13 | "Last-Translator: Benjamin Weis \n" 14 | "Language-Team: \n" 15 | "Language: de\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 20 | "X-Generator: Poedit 1.8.7\n" 21 | 22 | #: ../src/piclone.c:117 23 | msgid "OK" 24 | msgstr "OK" 25 | 26 | #: ../src/piclone.c:167 27 | msgid "Unable to read source." 28 | msgstr "Quelle kann nicht gelesen werden." 29 | 30 | #: ../src/piclone.c:172 31 | msgid "Non-MSDOS partition table on source." 32 | msgstr "Nicht-MSDOS-Partitionstabelle auf Quelle." 33 | 34 | #: ../src/piclone.c:179 35 | msgid "Preparing target..." 36 | msgstr "Ziel wird vorbereitet..." 37 | 38 | #: ../src/piclone.c:204 39 | msgid "Reading partitions..." 40 | msgstr "Partitionen werden gelesen..." 41 | 42 | #: ../src/piclone.c:224 43 | msgid "Preparing partitions..." 44 | msgstr "Partitionen werden vorbereitet..." 45 | 46 | #: ../src/piclone.c:272 47 | #, c-format 48 | msgid "Copying partition %d of %d..." 49 | msgstr "Partition %d von %d wird kopiert..." 50 | 51 | #: ../src/piclone.c:298 52 | msgid "Insufficient space. Backup aborted." 53 | msgstr "Nicht genügend Speicherplatz . Sicherung abgebrochen." 54 | 55 | #: ../src/piclone.c:334 56 | msgid "Copy complete." 57 | msgstr "Kopieren abgeschlossen." 58 | 59 | #. add message 60 | #: ../src/piclone.c:410 61 | msgid "Checking source..." 62 | msgstr "Quelle wird überprüft..." 63 | 64 | #. add cancel button 65 | #: ../src/piclone.c:420 66 | msgid "Cancel" 67 | msgstr "Abbrechen" 68 | 69 | #: ../src/piclone.c:482 70 | #, c-format 71 | msgid "This will erase all content on the device '%s'. Are you sure?" 72 | msgstr "Dies wird alle Inhalte auf dem Gerät '%s' löschen. Sind Sie sicher?" 73 | 74 | #. add buttons 75 | #: ../src/piclone.c:490 76 | msgid "No" 77 | msgstr "Nein" 78 | 79 | #: ../src/piclone.c:494 80 | msgid "Yes" 81 | msgstr "Ja" 82 | 83 | #. populate the comboboxes 84 | #: ../src/piclone.c:553 85 | msgid "Internal SD card (/dev/mmcblk0)" 86 | msgstr "Interne SD-Karte (/dev/mmcblk0)" 87 | 88 | #: ../src/piclone.c:579 89 | msgid "No devices available" 90 | msgstr "Keine Geräte verfügbar" 91 | 92 | #: ../src/piclone.c:626 93 | msgid "Select the device to copy from" 94 | msgstr "Wählen Sie das Gerät aus, von dem kopiert werden soll" 95 | 96 | #: ../src/piclone.c:634 97 | msgid "Select the device to copy to" 98 | msgstr "Wählen Sie das Gerät aus, zu dem kopiert werden soll" 99 | 100 | #. End of file 101 | #. =========================================================================== 102 | #: ../data/piclone.ui.h:1 ../data/piclone.desktop.in.h:1 103 | msgid "SD Card Copier" 104 | msgstr "SD Card Copier" 105 | 106 | #: ../data/piclone.ui.h:2 107 | msgid "Help" 108 | msgstr "Hilfe" 109 | 110 | #: ../data/piclone.ui.h:3 111 | msgid "Start" 112 | msgstr "Start" 113 | 114 | #: ../data/piclone.ui.h:4 115 | msgid "Copy From Device:" 116 | msgstr "Von Gerät kopieren:" 117 | 118 | #: ../data/piclone.ui.h:5 119 | msgid "Copy To Device:" 120 | msgstr "Auf Gerät kopieren:" 121 | 122 | #: ../data/piclone.ui.h:6 123 | msgid "" 124 | "SD Card Copier v1.0\n" 125 | "\n" 126 | "This is an application to copy and back up SD cards. To use it, you will " 127 | "need a USB SD card writer.\n" 128 | "\n" 129 | "To back up your Raspberry Pi's internal SD card, insert a blank SD card into " 130 | "a USB card writer and connect it to your Pi. Then start the application, " 131 | "choose your card writer from the “Copy To Device” drop-down box and press " 132 | "“Start”. The copy process will take 10-15 minutes depending on the size of " 133 | "your card.\n" 134 | "\n" 135 | "The resulting card should be a bootable copy of your existing card; to " 136 | "restore, simply place the backup card into the onboard SD card slot, put the " 137 | "card to restore onto into the USB writer and repeat the copy process above.\n" 138 | "\n" 139 | "You can also back up to a standard USB stick, and then restore from the USB " 140 | "stick to an SD card by setting the “Copy From Device” drop-down to the USB " 141 | "stick and the “Copy To Device” to a USB card writer containing the card to " 142 | "restore onto.\n" 143 | "\n" 144 | "Note that you cannot copy onto the SD card from which your Pi is currently " 145 | "booted, which is why it does not appear in the “Copy To Device” dropdown.\n" 146 | "\n" 147 | "Note also that the destination card doesn’t need to be the same size as the " 148 | "source card, but it must have enough space to hold all the data that is on " 149 | "it. The application will warn you if there is insufficient space on the " 150 | "destination.\n" 151 | msgstr "" 152 | "SD Card Copier v1.0\n" 153 | "\n" 154 | "Dies ist eine Anwendung zum Kopieren und Sichern von SD-Karten. Sie " 155 | "benötigen einen USB-SD-Kartenschreiber, um sie verwenden zu können.\n" 156 | "\n" 157 | "Um die interne SD-Karte Ihres Raspberry Pis zu sichern, legen Sie eine leere " 158 | "SD-Karte in einen USB-Kartenschreiber ein und verbinden Sie ihn mit Ihrem " 159 | "Pi. Anschließend starten Sie die Anwendung, wählen Sie Ihren Kartenschreiber " 160 | "aus der Dropdown-Liste “Auf Gerät kopieren” aus und drücken Sie auf “Start”. " 161 | "Der Kopiervorgang wird 10-15 Minuten dauern, je nach Größe Ihrer Karte.\n" 162 | "\n" 163 | "Die hierdurch entstandene Karte sollte eine bootbare Kopie Ihrer vorhandenen " 164 | "Karte sein; zum Wiederherstellen legen Sie einfach die Sicherungskarte in " 165 | "den sich auf der Platine befindlichen SD-Kartensteckplatz ein, legen Sie zum " 166 | "Wiederherstellen der Karte diese in den USB-Kartenschreiber ein und " 167 | "wiederholen sie den obigen Kopiervorgang.\n" 168 | "\n" 169 | "Sie können auch auf einen Standard-USB-Stick sichern und anschließend von " 170 | "dem USB-Stick auf eine SD-Karte durch die Auswahl “Von Gerät kopieren” in " 171 | "der Dropdown-Liste wiederherstellen und zu einem USB-Kartenschreiber, der " 172 | "die Karte enthält, mit “Auf Gerät kopieren” wiederherstellen.\n" 173 | "\n" 174 | "Beachten Sie, dass Sie nicht auf die SD-Karte kopieren können, von denen Ihr " 175 | "Pi gebootet wurde, welche deshalb auch nicht in der Dropdown-Liste “Auf " 176 | "Gerät kopieren” erscheint.\n" 177 | "\n" 178 | "Beachten Sie auch, dass die Zielkarte nicht die gleiche Größe wie die " 179 | "Quellkarte haben muss, aber sie muss genügend Speicherplatz für alle Daten " 180 | "haben. Die Anwendung wird Sie warnen, wenn nicht genügend Speicherplatz auf " 181 | "dem Ziel vorhanden ist.\n" 182 | 183 | #: ../data/piclone.ui.h:20 184 | msgid "SD Card Copier Help" 185 | msgstr "SD Card Copier Hilfe" 186 | 187 | #: ../data/piclone.desktop.in.h:2 188 | msgid "Make a copy of the Raspbian SD card" 189 | msgstr "Erstellen Sie eine Kopie der Raspbian SD-Karte" 190 | -------------------------------------------------------------------------------- /po/en_GB.po: -------------------------------------------------------------------------------- 1 | # English translations for piclone package. 2 | # Copyright (C) 2017 Raspberry Pi 3 | # This file is distributed under the same license as the piclone package. 4 | # Simon Long , 2017. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: piclone 0.5\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2020-06-15 18:37+0100\n" 11 | "PO-Revision-Date: 2017-07-18 08:19+0100\n" 12 | "Last-Translator: Simon Long \n" 13 | "Language-Team: English (British)\n" 14 | "Language: en_GB\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 19 | 20 | #: ../src/piclone.c:89 ../src/piclone.c:793 21 | msgid "Drives changed - copy aborted" 22 | msgstr "Drives changed - copy aborted" 23 | 24 | #: ../src/piclone.c:163 ../src/piclone.c:794 25 | msgid "OK" 26 | msgstr "OK" 27 | 28 | #: ../src/piclone.c:216 29 | msgid "Unable to read source." 30 | msgstr "Unable to read source." 31 | 32 | #: ../src/piclone.c:222 33 | msgid "Non-MSDOS partition table on source." 34 | msgstr "Non MS-DOS partition table on source." 35 | 36 | #: ../src/piclone.c:229 37 | msgid "Preparing target..." 38 | msgstr "Preparing target..." 39 | 40 | #: ../src/piclone.c:242 41 | msgid "Could not write to destination." 42 | msgstr "Could not write to destination." 43 | 44 | #: ../src/piclone.c:256 45 | msgid "Could not create FAT." 46 | msgstr "Could not create FAT." 47 | 48 | #: ../src/piclone.c:262 49 | msgid "Reading partitions..." 50 | msgstr "Reading partitions..." 51 | 52 | #: ../src/piclone.c:277 53 | msgid "Too many partitions on source." 54 | msgstr "Too many partitions on source." 55 | 56 | #: ../src/piclone.c:289 57 | msgid "Preparing partitions..." 58 | msgstr "Preparing partitions..." 59 | 60 | #: ../src/piclone.c:300 ../src/piclone.c:311 ../src/piclone.c:320 61 | msgid "Could not create partition." 62 | msgstr "Could not create partition." 63 | 64 | #: ../src/piclone.c:385 ../src/piclone.c:391 ../src/piclone.c:413 65 | #: ../src/piclone.c:419 66 | msgid "Could not create file system." 67 | msgstr "Could not create file system." 68 | 69 | #: ../src/piclone.c:443 70 | #, c-format 71 | msgid "Copying partition %d of %d..." 72 | msgstr "Copying partition %d of %d..." 73 | 74 | #: ../src/piclone.c:453 ../src/piclone.c:459 75 | msgid "Could not mount partition." 76 | msgstr "Could not mount partition." 77 | 78 | #: ../src/piclone.c:477 79 | msgid "Insufficient space. Backup aborted." 80 | msgstr "Insufficient space. Backup aborted." 81 | 82 | #: ../src/piclone.c:518 ../src/piclone.c:524 83 | msgid "Could not unmount partition." 84 | msgstr "Could not unmount partition." 85 | 86 | #: ../src/piclone.c:535 ../src/piclone.c:543 87 | msgid "Could not set flags." 88 | msgstr "Could not set flags." 89 | 90 | #: ../src/piclone.c:550 91 | msgid "Copy complete." 92 | msgstr "Copy complete." 93 | 94 | #: ../src/piclone.c:593 95 | msgid "Cancelling..." 96 | msgstr "Cancelling..." 97 | 98 | #. add message 99 | #: ../src/piclone.c:641 100 | msgid "Checking source..." 101 | msgstr "Checking source..." 102 | 103 | #. add cancel button 104 | #: ../src/piclone.c:651 105 | msgid "Cancel" 106 | msgstr "Cancel" 107 | 108 | #: ../src/piclone.c:726 109 | #, c-format 110 | msgid "This will erase all content on the device '%s'. Are you sure?" 111 | msgstr "This will erase all content on the device '%s'. Are you sure?" 112 | 113 | #. add buttons 114 | #: ../src/piclone.c:734 115 | msgid "No" 116 | msgstr "No" 117 | 118 | #: ../src/piclone.c:738 119 | msgid "Yes" 120 | msgstr "Yes" 121 | 122 | #: ../src/piclone.c:776 ../src/piclone.c:850 123 | msgid "No devices available" 124 | msgstr "No devices available" 125 | 126 | #: ../src/piclone.c:803 127 | msgid "Drives changed - cancelling..." 128 | msgstr "Drives changed - cancelling..." 129 | 130 | #: ../src/piclone.c:900 131 | msgid "Select the device to copy from" 132 | msgstr "Select the device to copy from" 133 | 134 | #: ../src/piclone.c:908 135 | msgid "Select the device to copy to" 136 | msgstr "Select the device to copy to" 137 | 138 | #. End of file 139 | #. =========================================================================== 140 | #: ../data/piclone.ui.h:1 ../data/piclone.desktop.in.h:1 141 | msgid "SD Card Copier" 142 | msgstr "SD Card Copier" 143 | 144 | #: ../data/piclone.ui.h:2 145 | msgid "Help" 146 | msgstr "Help" 147 | 148 | #: ../data/piclone.ui.h:3 149 | msgid "Start" 150 | msgstr "Start" 151 | 152 | #: ../data/piclone.ui.h:4 153 | msgid "Copy From Device:" 154 | msgstr "Copy From Device:" 155 | 156 | #: ../data/piclone.ui.h:5 157 | msgid "Select the device from which to copy" 158 | msgstr "Select the device from which to copy" 159 | 160 | #: ../data/piclone.ui.h:6 161 | msgid "Copy To Device:" 162 | msgstr "Copy To Device:" 163 | 164 | #: ../data/piclone.ui.h:7 165 | msgid "Select the device to which to copy" 166 | msgstr "Select the device to which to copy" 167 | 168 | #: ../data/piclone.ui.h:8 169 | msgid "New Partition UUIDs" 170 | msgstr "New Partition UUIDs" 171 | 172 | #: ../data/piclone.ui.h:9 173 | msgid "Check this box to create new partition UUIDs on the copy" 174 | msgstr "Tick this box to create new partition UUIDs on the copy" 175 | 176 | #: ../data/piclone.ui.h:10 177 | msgid "" 178 | "SD Card Copier v1.0\n" 179 | "\n" 180 | "This is an application to copy and back up SD cards. To use it, you will " 181 | "need a USB SD card writer.\n" 182 | "\n" 183 | "To back up your Raspberry Pi's internal SD card, insert a blank SD card into " 184 | "a USB card writer and connect it to your Pi. Then start the application, " 185 | "choose your card writer from the “Copy To Device” drop-down box and press " 186 | "“Start”. The copy process will take 10-15 minutes depending on the size of " 187 | "your card.\n" 188 | "\n" 189 | "The resulting card should be a bootable copy of your existing card; to " 190 | "restore, simply place the backup card into the onboard SD card slot, put the " 191 | "card to restore onto into the USB writer and repeat the copy process above.\n" 192 | "\n" 193 | "You can also back up to a standard USB stick, and then restore from the USB " 194 | "stick to an SD card by setting the “Copy From Device” drop-down to the USB " 195 | "stick and the “Copy To Device” to a USB card writer containing the card to " 196 | "restore onto.\n" 197 | "\n" 198 | "Note that you cannot copy onto the SD card from which your Pi is currently " 199 | "booted, which is why it does not appear in the “Copy To Device” dropdown.\n" 200 | "\n" 201 | "Note also that the destination card doesn’t need to be the same size as the " 202 | "source card, but it must have enough space to hold all the data that is on " 203 | "it. The application will warn you if there is insufficient space on the " 204 | "destination.\n" 205 | "\n" 206 | "Under Raspbian Stretch and later versions, you cannot mount two partitions " 207 | "with the same UUID, so you will not be able to mount a cloned SD card when " 208 | "booted from the disk from which it was cloned. If you need to do this, check " 209 | "the \"New Partition UUIDs\" box before copying.\n" 210 | msgstr "" 211 | "SD Card Copier\n" 212 | "\n" 213 | "This is an application to copy and back up SD cards. To use it, you will " 214 | "need a USB SD card writer.\n" 215 | "\n" 216 | "To back up your Raspberry Pi's internal SD card, insert a blank SD card into " 217 | "a USB card writer connected to the Raspberry Pi. Then choose the internal SD " 218 | "card (labelled as '/dev/mmcblk0') from the “Copy From Device” drop-down box, " 219 | "choose your card writer from the “Copy To Device” drop-down box and press " 220 | "“Start”. The copy process will take 10-15 minutes depending on the size of " 221 | "your card.\n" 222 | "\n" 223 | "The resulting card should be a bootable copy of your existing card; to " 224 | "restore, simply place the backup card into the onboard SD card slot, put the " 225 | "card to restore onto into the USB writer and repeat the copy process above.\n" 226 | "\n" 227 | "You can also back up to a standard USB stick, and then restore from the USB " 228 | "stick to an SD card by setting the “Copy From Device” drop-down to the USB " 229 | "stick and the “Copy To Device” to a USB card writer containing the card to " 230 | "restore onto.\n" 231 | "\n" 232 | "Note that you cannot copy onto the SD card from which your Raspberry Pi is " 233 | "booted, which is why it does not appear in the “Copy To Device” dropdown.\n" 234 | "\n" 235 | "Note also that the destination card doesn’t need to be the same size as the " 236 | "source card, but the destination must have enough space for all the data on " 237 | "the source. The application will warn you if there is insufficient space on " 238 | "the destination.\n" 239 | "\n" 240 | "Under some versions of the operating system, you cannot mount two partitions " 241 | "with the same UUID, so you will not be able to mount a cloned SD card when " 242 | "booted from the disk from which it was cloned. If you need to do this, tick " 243 | "the \"New Partition UUIDs\" box before copying.\n" 244 | 245 | #: ../data/piclone.ui.h:26 246 | msgid "SD Card Copier Help" 247 | msgstr "SD Card Copier Help" 248 | 249 | #: ../data/piclone.desktop.in.h:2 250 | msgid "Make a copy of the Raspbian SD card" 251 | msgstr "Copy SD cards and USB devices" 252 | 253 | #: ../data/pwdpic.sh:6 254 | msgid "Password Required" 255 | msgstr "Password Required" 256 | -------------------------------------------------------------------------------- /po/hy.po: -------------------------------------------------------------------------------- 1 | # Armenian translations for piclone package. 2 | # Copyright (C) 2017 Raspberry Pi 3 | # This file is distributed under the same license as the piclone package. 4 | # Simon Long , 2017. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: piclone 0.5\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2020-06-15 18:37+0100\n" 11 | "PO-Revision-Date: 2017-07-18 08:19+0100\n" 12 | "Last-Translator: Avag Sayan \n" 13 | "Language-Team: Armenian\n" 14 | "Language: hy\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 19 | 20 | #: ../src/piclone.c:89 ../src/piclone.c:793 21 | msgid "Drives changed - copy aborted" 22 | msgstr "Սարքը տեղում չէ- պատճենումը դադարեցվեց" 23 | 24 | #: ../src/piclone.c:163 ../src/piclone.c:794 25 | msgid "OK" 26 | msgstr "Լավ" 27 | 28 | #: ../src/piclone.c:216 29 | msgid "Unable to read source." 30 | msgstr "Հնարավոր չէ ընթերցել աղբյուրը։" 31 | 32 | #: ../src/piclone.c:222 33 | msgid "Non-MSDOS partition table on source." 34 | msgstr "Սկավառակի ոչ MS-DOS հատորի աղյուսակը" 35 | 36 | #: ../src/piclone.c:229 37 | msgid "Preparing target..." 38 | msgstr "Թիրախի նախապատրաստում..." 39 | 40 | #: ../src/piclone.c:242 41 | msgid "Could not write to destination." 42 | msgstr "Չհաջողվեց գրառել նպատակակետը։" 43 | 44 | #: ../src/piclone.c:256 45 | msgid "Could not create FAT." 46 | msgstr "Չհաջողվեց ստեղծել FAT -ը" 47 | 48 | #: ../src/piclone.c:262 49 | msgid "Reading partitions..." 50 | msgstr "Հատորների ընթերցում..." 51 | 52 | #: ../src/piclone.c:277 53 | msgid "Too many partitions on source." 54 | msgstr "Սարքի վրա առկա է սահմանվածից շատ հատորներ" 55 | 56 | #: ../src/piclone.c:289 57 | msgid "Preparing partitions..." 58 | msgstr "Հատորների նախապատրաստում..." 59 | 60 | #: ../src/piclone.c:300 ../src/piclone.c:311 ../src/piclone.c:320 61 | msgid "Could not create partition." 62 | msgstr "Չկարողացավ ստեղծել հատորը։" 63 | 64 | #: ../src/piclone.c:385 ../src/piclone.c:391 ../src/piclone.c:413 65 | #: ../src/piclone.c:419 66 | msgid "Could not create file system." 67 | msgstr "Չհաջողվեց ստեղծել նիշային համակարգը" 68 | 69 | #: ../src/piclone.c:443 70 | #, c-format 71 | msgid "Copying partition %d of %d..." 72 | msgstr "Հատորի պատճենում՝ %d -ն %d -ի..." 73 | 74 | #: ../src/piclone.c:453 ../src/piclone.c:459 75 | msgid "Could not mount partition." 76 | msgstr "Չհաջողվեց տեղակայել հատորը" 77 | 78 | #: ../src/piclone.c:477 79 | msgid "Insufficient space. Backup aborted." 80 | msgstr "Անբավարար տարածք։ Պահուստավորումը դադարեցվեց։" 81 | 82 | #: ../src/piclone.c:518 ../src/piclone.c:524 83 | msgid "Could not unmount partition." 84 | msgstr "Չհաջողվեց ապատեղակայել հատորը" 85 | 86 | #: ../src/piclone.c:535 ../src/piclone.c:543 87 | msgid "Could not set flags." 88 | msgstr "Չհաջողվեց սահմանել դրոշակները" 89 | 90 | #: ../src/piclone.c:550 91 | msgid "Copy complete." 92 | msgstr "Պատճենումը ավարտվեց" 93 | 94 | #: ../src/piclone.c:593 95 | msgid "Cancelling..." 96 | msgstr "Չեղարկում..." 97 | 98 | #. add message 99 | #: ../src/piclone.c:641 100 | msgid "Checking source..." 101 | msgstr "Աղբյուրի ստուգում..." 102 | 103 | #. add cancel button 104 | #: ../src/piclone.c:651 105 | msgid "Cancel" 106 | msgstr "Չեղարկել" 107 | 108 | #: ../src/piclone.c:726 109 | #, c-format 110 | msgid "This will erase all content on the device '%s'. Are you sure?" 111 | msgstr "Սա կջնջի '%s' սարքի ամբողջ բովանդակությունը. Իրո՞ք ցանկանում եք" 112 | 113 | #. add buttons 114 | #: ../src/piclone.c:734 115 | msgid "No" 116 | msgstr "Ոչ" 117 | 118 | #: ../src/piclone.c:738 119 | msgid "Yes" 120 | msgstr "Այո" 121 | 122 | #: ../src/piclone.c:776 ../src/piclone.c:850 123 | msgid "No devices available" 124 | msgstr "Հասանելի սարքեր առկա չեն" 125 | 126 | #: ../src/piclone.c:803 127 | msgid "Drives changed - cancelling..." 128 | msgstr "Սարքը տեղում չէ - չեղարկում..." 129 | 130 | #: ../src/piclone.c:900 131 | msgid "Select the device to copy from" 132 | msgstr "Ընտրել սարքը, ոպես պատճենման աղբյուր" 133 | 134 | #: ../src/piclone.c:908 135 | msgid "Select the device to copy to" 136 | msgstr "Ընտրել սարքը, որպես պատճենման նպատակակետ" 137 | 138 | #. End of file 139 | #. =========================================================================== 140 | #: ../data/piclone.ui.h:1 ../data/piclone.desktop.in.h:1 141 | msgid "SD Card Copier" 142 | msgstr "SD կլոնավորում" 143 | 144 | #: ../data/piclone.ui.h:2 145 | msgid "Help" 146 | msgstr "Օգնություն" 147 | 148 | #: ../data/piclone.ui.h:3 149 | msgid "Start" 150 | msgstr "Մեկնարկ" 151 | 152 | #: ../data/piclone.ui.h:4 153 | msgid "Copy From Device:" 154 | msgstr "Պատճենել հետևյալ սարքից՝" 155 | 156 | #: ../data/piclone.ui.h:5 157 | msgid "Select the device from which to copy" 158 | msgstr "Ընտրեք սարքը, որից պետք է պատճենել" 159 | 160 | #: ../data/piclone.ui.h:6 161 | msgid "Copy To Device:" 162 | msgstr "Պատճենել հետևյալ սարքի վրա՝" 163 | 164 | #: ../data/piclone.ui.h:7 165 | msgid "Select the device to which to copy" 166 | msgstr "Ընտրեք սարքը, որի վրա պետք է պատճենել" 167 | 168 | #: ../data/piclone.ui.h:8 169 | msgid "New Partition UUIDs" 170 | msgstr "Նոր Հատոր UUIDs" 171 | 172 | #: ../data/piclone.ui.h:9 173 | msgid "Check this box to create new partition UUIDs on the copy" 174 | msgstr "Նոր UUIDs հատորի պատճենը ստեղծելու համար նշեք այս վանդակը" 175 | 176 | #: ../data/piclone.ui.h:10 177 | msgid "" 178 | "SD Card Copier v1.0\n" 179 | "\n" 180 | "This is an application to copy and back up SD cards. To use it, you will " 181 | "need a USB SD card writer.\n" 182 | "\n" 183 | "To back up your Raspberry Pi's internal SD card, insert a blank SD card into " 184 | "a USB card writer and connect it to your Pi. Then start the application, " 185 | "choose your card writer from the “Copy To Device” drop-down box and press " 186 | "“Start”. The copy process will take 10-15 minutes depending on the size of " 187 | "your card.\n" 188 | "\n" 189 | "The resulting card should be a bootable copy of your existing card; to " 190 | "restore, simply place the backup card into the onboard SD card slot, put the " 191 | "card to restore onto into the USB writer and repeat the copy process above.\n" 192 | "\n" 193 | "You can also back up to a standard USB stick, and then restore from the USB " 194 | "stick to an SD card by setting the “Copy From Device” drop-down to the USB " 195 | "stick and the “Copy To Device” to a USB card writer containing the card to " 196 | "restore onto.\n" 197 | "\n" 198 | "Note that you cannot copy onto the SD card from which your Pi is currently " 199 | "booted, which is why it does not appear in the “Copy To Device” dropdown.\n" 200 | "\n" 201 | "Note also that the destination card doesn’t need to be the same size as the " 202 | "source card, but it must have enough space to hold all the data that is on " 203 | "it. The application will warn you if there is insufficient space on the " 204 | "destination.\n" 205 | "\n" 206 | "Under Raspbian Stretch and later versions, you cannot mount two partitions " 207 | "with the same UUID, so you will not be able to mount a cloned SD card when " 208 | "booted from the disk from which it was cloned. If you need to do this, check " 209 | "the \"New Partition UUIDs\" box before copying.\n" 210 | msgstr "" 211 | "SD կլոնավորում\n" 212 | "\n" 213 | "Սա SD կրիչի կլոնավորման և պահուստավորման ծրագիր է։ Այն օգտագործելու համար " 214 | "անհրաժեշտ է USB SD կրիչ գրառող սարք։\n" 215 | "\n" 216 | "Raspberry Pi-ի ներքին կրիչը պահուստավորելու համար, տեղադրեք դատարկ SD կրիչը " 217 | "USB գրառման սարքի մեջ և միացրեք Raspberry Pi-ին։ Ապա ընտրեք ներքին SD կրիչը " 218 | "(պիտակավորված է լինում, որպես '/dev/mmcblk0') «Պատճենել սարքից»-ի միջոցով ընտրացանկից, " 219 | "ընտրել կրիչի գրառման սարքը «Պատճենել սարքի վրա» ընտրացանկից և սեղմել " 220 | "«Մեկնարկ»։ Պատճենումը կտևի մոտ 10-15 րոպե կախված ձեր համակարգի " 221 | "ծավալից։\n" 222 | "\n" 223 | "Արդյունքում ստացված քարտը պետք է լինի ձեր առկա քարտի պատճենը։ վերականգնելու համար " 224 | "ուղարկի անհրաժեշտ է տեղադրել պահուստային կրիչը և գրառել այնպես, ինչպես ստեղծել ենք " 225 | "պահուստային կրիչւ\n" 226 | "\n" 227 | "Կարող եք նաև պահուստավորել սովորական USB սարքը, և ապա վերականգնել USB -ից " 228 | " " 229 | " " 230 | "\n" 231 | "\n" 232 | "Note that you cannot copy onto the SD card from which your Raspberry Pi is " 233 | "booted, which is why it does not appear in the “Copy To Device” dropdown.\n" 234 | "\n" 235 | "Note also that the destination card doesn’t need to be the same size as the " 236 | "source card, but the destination must have enough space for all the data on " 237 | "the source. The application will warn you if there is insufficient space on " 238 | "the destination.\n" 239 | "\n" 240 | "Under some versions of the operating system, you cannot mount two partitions " 241 | "with the same UUID, so you will not be able to mount a cloned SD card when " 242 | "booted from the disk from which it was cloned. If you need to do this, tick " 243 | "the \"New Partition UUIDs\" box before copying.\n" 244 | 245 | #: ../data/piclone.ui.h:26 246 | msgid "SD Card Copier Help" 247 | msgstr "SD կլոնավորման օգնություն" 248 | 249 | #: ../data/piclone.desktop.in.h:2 250 | msgid "Make a copy of the Raspbian SD card" 251 | msgstr "Պատճենել SD կրիչներ և USB սարքեր" 252 | 253 | #: ../data/pwdpic.sh:6 254 | msgid "Password Required" 255 | msgstr "Պահանւում է գաղտնաբառի մուտքագրում" 256 | -------------------------------------------------------------------------------- /po/it.po: -------------------------------------------------------------------------------- 1 | # Italian translations for piclone package. 2 | # Copyright (C) 2021 Raspberry Pi 3 | # This file is distributed under the same license as the piclone package. 4 | # Emanuele Goldoni , 2021. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: \n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2021-08-14 09:13+0200\n" 11 | "PO-Revision-Date: 2021-08-14 09:47+0200\n" 12 | "Language-Team: \n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: 8bit\n" 16 | "X-Generator: Poedit 2.4.1\n" 17 | "Last-Translator: Emanuele Goldoni \n" 18 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 19 | "Language: it\n" 20 | 21 | #: ../src/piclone.c:89 ../src/piclone.c:811 22 | msgid "Drives changed - copy aborted" 23 | msgstr "Dispositivi cambiati - copia annullata" 24 | 25 | #: ../src/piclone.c:166 ../src/piclone.c:812 26 | msgid "OK" 27 | msgstr "OK" 28 | 29 | #: ../src/piclone.c:252 30 | msgid "Unable to read source." 31 | msgstr "Impossibile leggere la sorgente." 32 | 33 | #: ../src/piclone.c:258 34 | msgid "Non-MSDOS partition table on source." 35 | msgstr "Tabella delle partizioni non-MSDOS sulla sorgente." 36 | 37 | #: ../src/piclone.c:265 38 | msgid "Preparing target..." 39 | msgstr "Preparazione della destinazione..." 40 | 41 | #: ../src/piclone.c:278 42 | msgid "Could not write to destination." 43 | msgstr "Impossibile scrivere sulla destinazione." 44 | 45 | #: ../src/piclone.c:292 46 | msgid "Could not create FAT." 47 | msgstr "Impossibile creare la FAT." 48 | 49 | #: ../src/piclone.c:298 50 | msgid "Reading partitions..." 51 | msgstr "Lettura delle partizioni..." 52 | 53 | #: ../src/piclone.c:313 54 | msgid "Too many partitions on source." 55 | msgstr "Troppe partizioni sulla sorgente." 56 | 57 | #: ../src/piclone.c:325 58 | msgid "Preparing partitions..." 59 | msgstr "Preparazione delle partizioni..." 60 | 61 | #: ../src/piclone.c:336 ../src/piclone.c:347 ../src/piclone.c:356 62 | msgid "Could not create partition." 63 | msgstr "Impossibile creare la partizione." 64 | 65 | #: ../src/piclone.c:421 ../src/piclone.c:427 ../src/piclone.c:449 66 | #: ../src/piclone.c:455 67 | msgid "Could not create file system." 68 | msgstr "Impossibile creare il file system." 69 | 70 | #: ../src/piclone.c:479 71 | #, c-format 72 | msgid "Copying partition %d of %d..." 73 | msgstr "Copia della partizione %d di %d..." 74 | 75 | #: ../src/piclone.c:489 ../src/piclone.c:495 76 | msgid "Could not mount partition." 77 | msgstr "Impossibile montare la partizione." 78 | 79 | #: ../src/piclone.c:513 80 | msgid "Insufficient space. Backup aborted." 81 | msgstr "Spazio insufficiente. Backup annullato." 82 | 83 | #: ../src/piclone.c:554 ../src/piclone.c:560 84 | msgid "Could not unmount partition." 85 | msgstr "Impossibile smontare la partizione." 86 | 87 | #: ../src/piclone.c:571 ../src/piclone.c:579 88 | msgid "Could not set flags." 89 | msgstr "Impossibile impostare i flag." 90 | 91 | #: ../src/piclone.c:586 92 | msgid "Copy complete." 93 | msgstr "Copia completa." 94 | 95 | #: ../src/piclone.c:624 96 | msgid "Cancelling..." 97 | msgstr "Annullamento..." 98 | 99 | #: ../src/piclone.c:667 100 | msgid "Checking source..." 101 | msgstr "Verifica della sorgente..." 102 | 103 | #: ../src/piclone.c:734 104 | #, c-format 105 | msgid "This will erase all content on the device '%s'. Are you sure?" 106 | msgstr "Tutti i dati sul dispositivo «%s» verranno cancellati. Proseguire?" 107 | 108 | #: ../src/piclone.c:743 109 | msgid "_No" 110 | msgstr "_No" 111 | 112 | #: ../src/piclone.c:747 113 | msgid "_Yes" 114 | msgstr "_Sì" 115 | 116 | #: ../src/piclone.c:794 ../src/piclone.c:868 117 | msgid "No devices available" 118 | msgstr "Nessun dispositivo disponibile" 119 | 120 | #: ../src/piclone.c:821 121 | msgid "Drives changed - cancelling..." 122 | msgstr "I dispositivi sono cambiati - annullamento..." 123 | 124 | #. End of file 125 | #. =========================================================================== 126 | #: ../data/piclone.ui.h:1 ../data/piclone.desktop.in.h:1 127 | msgid "SD Card Copier" 128 | msgstr "SD Card Copier" 129 | 130 | #: ../data/piclone.ui.h:2 131 | msgid "Select the device from which to copy" 132 | msgstr "Selezionare il dispositivo dal quale copiare" 133 | 134 | #: ../data/piclone.ui.h:3 135 | msgid "Copy From Device:" 136 | msgstr "Copia dal dispositivo:" 137 | 138 | #: ../data/piclone.ui.h:4 139 | msgid "Select the device to copy from" 140 | msgstr "Selezionare il dispositivo sorgente" 141 | 142 | #: ../data/piclone.ui.h:5 143 | msgid "Select the device to which to copy" 144 | msgstr "Selezionare il dispositivo sul quale copiare" 145 | 146 | #: ../data/piclone.ui.h:6 147 | msgid "Copy To Device:" 148 | msgstr "Copia al dispositivo:" 149 | 150 | #: ../data/piclone.ui.h:7 151 | msgid "Select the device to copy to" 152 | msgstr "Selezionare il dispositivo di destinazione" 153 | 154 | #: ../data/piclone.ui.h:8 155 | msgid "New Partition UUIDs" 156 | msgstr "Nuovi UUID delle partizioni" 157 | 158 | #: ../data/piclone.ui.h:9 159 | msgid "Check this box to create new partition UUIDs on the copy" 160 | msgstr "" 161 | "Spuntare questa caselle per creare nuovi UUID delle partizioni durante la " 162 | "copia" 163 | 164 | #: ../data/piclone.ui.h:10 165 | msgid "Start" 166 | msgstr "Avvio" 167 | 168 | #: ../data/piclone.ui.h:11 169 | msgid "label" 170 | msgstr "etichetta" 171 | 172 | #: ../data/piclone.ui.h:12 173 | msgid "_Cancel" 174 | msgstr "_Annulla" 175 | 176 | #: ../data/piclone.ui.h:13 177 | msgid "_OK" 178 | msgstr "_OK" 179 | 180 | #: ../data/piclone.ui.h:14 181 | msgid "" 182 | "SD Card Copier v1.0\n" 183 | "\n" 184 | "This is an application to copy and back up SD cards. To use it, you will " 185 | "need a USB SD card writer.\n" 186 | "\n" 187 | "To back up your Raspberry Pi's internal SD card, insert a blank SD card into " 188 | "a USB card writer and connect it to your Pi. Then start the application, " 189 | "choose your card writer from the “Copy To Device” drop-down box and press " 190 | "“Start”. The copy process will take 10-15 minutes depending on the size of " 191 | "your card.\n" 192 | "\n" 193 | "The resulting card should be a bootable copy of your existing card; to " 194 | "restore, simply place the backup card into the onboard SD card slot, put the " 195 | "card to restore onto into the USB writer and repeat the copy process above.\n" 196 | "\n" 197 | "You can also back up to a standard USB stick, and then restore from the USB " 198 | "stick to an SD card by setting the “Copy From Device” drop-down to the USB " 199 | "stick and the “Copy To Device” to a USB card writer containing the card to " 200 | "restore onto.\n" 201 | "\n" 202 | "Note that you cannot copy onto the SD card from which your Pi is currently " 203 | "booted, which is why it does not appear in the “Copy To Device” dropdown.\n" 204 | "\n" 205 | "Note also that the destination card doesn’t need to be the same size as the " 206 | "source card, but it must have enough space to hold all the data that is on " 207 | "it. The application will warn you if there is insufficient space on the " 208 | "destination.\n" 209 | "\n" 210 | "Under Raspbian Stretch and later versions, you cannot mount two partitions " 211 | "with the same UUID, so you will not be able to mount a cloned SD card when " 212 | "booted from the disk from which it was cloned. If you need to do this, check " 213 | "the \"New Partition UUIDs\" box before copying.\n" 214 | msgstr "" 215 | "SD Card Copier v1.0\n" 216 | "\n" 217 | "Questa è un'applicazione per copiare e salvare schede SD. Per utilizzarla è " 218 | "necessario un lettore USB di schede SD.\n" 219 | "\n" 220 | "Per fare il backup della scheda SD interna del Raspberry Pi, inserire una " 221 | "scheda SD vuota in un lettore USB e collegarla al Pi. Poi avviare " 222 | "l'applicazione, scegliere il lettore esterno dal menu a tendina «Copia sul " 223 | "dispositivo» e premere «Avvia». Il processo di copia richiederà 10-15 minuti " 224 | "a seconda della dimensione della scheda.\n" 225 | "\n" 226 | "La scheda risultante dovrebbe essere una copia avviabile della scheda " 227 | "esistente; per ripristinare il backup, inserire semplicemente la scheda di " 228 | "backup nello slot SD del Pi, mettere la scheda da ripristinare nel lettore " 229 | "USB e ripetere il processo di copia di cui sopra.\n" 230 | "\n" 231 | "E' possibile anche fare il backup su una chiavetta USB, e poi ripristinare " 232 | "dalla chiavetta USB a una scheda SD impostando la chiavetta USB nel menu a " 233 | "tendina «Copia dal dispositivo» e un lettore USB contenente la scheda su cui " 234 | "ripristinare in «Copia al dispositivo».\n" 235 | "\n" 236 | "Si noti che non è possibile copiare sulla scheda SD con cui il Pi è " 237 | "attualmente avviato; per questo motivo essa non appare nel menu a tendina " 238 | "«Copia dal dispositivo».\n" 239 | "\n" 240 | "Si noti anche che la scheda di destinazione non ha bisogno di essere della " 241 | "stessa dimensione della scheda sorgente, ma deve avere abbastanza spazio per " 242 | "contenere tutti i dati che sono su di essa. L'applicazione avviserà se lo " 243 | "spazio sulla destinazione è insufficiente.\n" 244 | "\n" 245 | "In Raspbian Stretch e versioni successive, non è possibile montare due " 246 | "partizioni con lo stesso UUID, quindi non sarà possibile montare una scheda " 247 | "SD clonata quando si avvia dal disco da cui è stata clonata. Se dovesse " 248 | "essere necessario, spuntare la casella «Nuovi UUID delle partizioni» prima " 249 | "di copiare.\n" 250 | 251 | #: ../data/piclone.ui.h:30 252 | msgid "SD Card Copier Help" 253 | msgstr "Aiuto di SD Card Copier" 254 | 255 | #: ../data/piclone.desktop.in.h:2 256 | msgid "Make a copy of the Raspbian SD card" 257 | msgstr "Crea una copia della scheda SD Raspbian" 258 | 259 | #: ../data/pwdpic.sh:6 260 | msgid "Password Required" 261 | msgstr "Password necessaria" 262 | -------------------------------------------------------------------------------- /po/ko.po: -------------------------------------------------------------------------------- 1 | # English translations for piclone package. 2 | # Copyright (C) 2017 Raspberry Pi 3 | # This file is distributed under the same license as the piclone package. 4 | # Simon Long , 2017. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: piclone 0.5\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2020-06-15 18:37+0100\n" 11 | "PO-Revision-Date: 2021-08-02 20:14+0900\n" 12 | "Language-Team: English (British)\n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: 8bit\n" 16 | "Plural-Forms: nplurals=1; plural=0;\n" 17 | "X-Generator: Poedit 2.4.2\n" 18 | "Last-Translator: Lee Yunseok \n" 19 | "Language: ko\n" 20 | 21 | #: ../src/piclone.c:89 ../src/piclone.c:793 22 | msgid "Drives changed - copy aborted" 23 | msgstr "드라이브 변경으로 복사 중단됨" 24 | 25 | #: ../src/piclone.c:163 ../src/piclone.c:794 26 | msgid "OK" 27 | msgstr "확인" 28 | 29 | #: ../src/piclone.c:216 30 | msgid "Unable to read source." 31 | msgstr "소스를 읽을 수 없습니다." 32 | 33 | #: ../src/piclone.c:222 34 | msgid "Non-MSDOS partition table on source." 35 | msgstr "소스 파티션 테이블이 MSDOS가 아닙니다." 36 | 37 | #: ../src/piclone.c:229 38 | msgid "Preparing target..." 39 | msgstr "대상 준비 중..." 40 | 41 | #: ../src/piclone.c:242 42 | msgid "Could not write to destination." 43 | msgstr "대상에 쓸 수 없습니다." 44 | 45 | #: ../src/piclone.c:256 46 | msgid "Could not create FAT." 47 | msgstr "FAT을 생성할 수 없습니다." 48 | 49 | #: ../src/piclone.c:262 50 | msgid "Reading partitions..." 51 | msgstr "파티션 읽는 중..." 52 | 53 | #: ../src/piclone.c:277 54 | msgid "Too many partitions on source." 55 | msgstr "소스에 파티션이 너무 많습니다." 56 | 57 | #: ../src/piclone.c:289 58 | msgid "Preparing partitions..." 59 | msgstr "파티션 준비 중..." 60 | 61 | #: ../src/piclone.c:300 ../src/piclone.c:311 ../src/piclone.c:320 62 | msgid "Could not create partition." 63 | msgstr "파티션을 생성할 수 없습니다." 64 | 65 | #: ../src/piclone.c:385 ../src/piclone.c:391 ../src/piclone.c:413 66 | #: ../src/piclone.c:419 67 | msgid "Could not create file system." 68 | msgstr "파일 시스템을 생성할 수 없습니다." 69 | 70 | #: ../src/piclone.c:443 71 | #, c-format 72 | msgid "Copying partition %d of %d..." 73 | msgstr "%d / %d 파티션 복사 중..." 74 | 75 | #: ../src/piclone.c:453 ../src/piclone.c:459 76 | msgid "Could not mount partition." 77 | msgstr "파티션을 마운트할 수 없습니다." 78 | 79 | #: ../src/piclone.c:477 80 | msgid "Insufficient space. Backup aborted." 81 | msgstr "공간이 부족해 백업이 중단되었습니다." 82 | 83 | #: ../src/piclone.c:518 ../src/piclone.c:524 84 | msgid "Could not unmount partition." 85 | msgstr "마운트된 파티션을 해제할 수 없습니다." 86 | 87 | #: ../src/piclone.c:535 ../src/piclone.c:543 88 | msgid "Could not set flags." 89 | msgstr "플래그를 설정할 수 없습니다." 90 | 91 | #: ../src/piclone.c:550 92 | msgid "Copy complete." 93 | msgstr "복사가 완료되었습니다." 94 | 95 | #: ../src/piclone.c:593 96 | msgid "Cancelling..." 97 | msgstr "취소하는 중..." 98 | 99 | #. add message 100 | #: ../src/piclone.c:641 101 | msgid "Checking source..." 102 | msgstr "소스 확인 중..." 103 | 104 | #. add cancel button 105 | #: ../src/piclone.c:651 106 | msgid "Cancel" 107 | msgstr "취소" 108 | 109 | #: ../src/piclone.c:726 110 | #, c-format 111 | msgid "This will erase all content on the device '%s'. Are you sure?" 112 | msgstr "장치 '%s'의 모든 콘텐츠가 삭제됩니다. 계속하시겠습니까?" 113 | 114 | #. add buttons 115 | #: ../src/piclone.c:734 116 | msgid "No" 117 | msgstr "아니오" 118 | 119 | #: ../src/piclone.c:738 120 | msgid "Yes" 121 | msgstr "네" 122 | 123 | #: ../src/piclone.c:776 ../src/piclone.c:850 124 | msgid "No devices available" 125 | msgstr "사용 가능한 장치 없음" 126 | 127 | #: ../src/piclone.c:803 128 | msgid "Drives changed - cancelling..." 129 | msgstr "드라이브가 변경돼 취소하는 중..." 130 | 131 | #: ../src/piclone.c:900 132 | msgid "Select the device to copy from" 133 | msgstr "복사할 장치 선택" 134 | 135 | #: ../src/piclone.c:908 136 | msgid "Select the device to copy to" 137 | msgstr "복사될 장치 선택" 138 | 139 | #. End of file 140 | #. =========================================================================== 141 | #: ../data/piclone.ui.h:1 ../data/piclone.desktop.in.h:1 142 | msgid "SD Card Copier" 143 | msgstr "SD 카드 복사기" 144 | 145 | #: ../data/piclone.ui.h:2 146 | msgid "Help" 147 | msgstr "도움말" 148 | 149 | #: ../data/piclone.ui.h:3 150 | msgid "Start" 151 | msgstr "시작" 152 | 153 | #: ../data/piclone.ui.h:4 154 | msgid "Copy From Device:" 155 | msgstr "장치에서 복사:" 156 | 157 | #: ../data/piclone.ui.h:5 158 | msgid "Select the device from which to copy" 159 | msgstr "어느 장치를 복사할 지 선택" 160 | 161 | #: ../data/piclone.ui.h:6 162 | msgid "Copy To Device:" 163 | msgstr "장치로 복사:" 164 | 165 | #: ../data/piclone.ui.h:7 166 | msgid "Select the device to which to copy" 167 | msgstr "어느 장치에 복사할 지 선택" 168 | 169 | #: ../data/piclone.ui.h:8 170 | msgid "New Partition UUIDs" 171 | msgstr "새 파티션 UUID" 172 | 173 | #: ../data/piclone.ui.h:9 174 | msgid "Check this box to create new partition UUIDs on the copy" 175 | msgstr "복사본에 새 파티션 UUID를 생성하려면 선택" 176 | 177 | #: ../data/piclone.ui.h:10 178 | msgid "" 179 | "SD Card Copier v1.0\n" 180 | "\n" 181 | "This is an application to copy and back up SD cards. To use it, you will " 182 | "need a USB SD card writer.\n" 183 | "\n" 184 | "To back up your Raspberry Pi's internal SD card, insert a blank SD card into " 185 | "a USB card writer and connect it to your Pi. Then start the application, " 186 | "choose your card writer from the “Copy To Device” drop-down box and press " 187 | "“Start”. The copy process will take 10-15 minutes depending on the size of " 188 | "your card.\n" 189 | "\n" 190 | "The resulting card should be a bootable copy of your existing card; to " 191 | "restore, simply place the backup card into the onboard SD card slot, put the " 192 | "card to restore onto into the USB writer and repeat the copy process above.\n" 193 | "\n" 194 | "You can also back up to a standard USB stick, and then restore from the USB " 195 | "stick to an SD card by setting the “Copy From Device” drop-down to the USB " 196 | "stick and the “Copy To Device” to a USB card writer containing the card to " 197 | "restore onto.\n" 198 | "\n" 199 | "Note that you cannot copy onto the SD card from which your Pi is currently " 200 | "booted, which is why it does not appear in the “Copy To Device” dropdown.\n" 201 | "\n" 202 | "Note also that the destination card doesn’t need to be the same size as the " 203 | "source card, but it must have enough space to hold all the data that is on " 204 | "it. The application will warn you if there is insufficient space on the " 205 | "destination.\n" 206 | "\n" 207 | "Under Raspbian Stretch and later versions, you cannot mount two partitions " 208 | "with the same UUID, so you will not be able to mount a cloned SD card when " 209 | "booted from the disk from which it was cloned. If you need to do this, check " 210 | "the \"New Partition UUIDs\" box before copying.\n" 211 | msgstr "" 212 | "SD 카드 복사기 v1.0\n" 213 | "\n" 214 | "SD 카드를 복사 및 백업하는 애플리케이션입니다. 사용하려면 USB SD 카드 라이터" 215 | "가 필요합니다.\n" 216 | "\n" 217 | "라즈베리 파이(Raspberry Pi)의 내부 SD 카드를 백업하려면 USB 카드 라이터에 빈 " 218 | "SD 카드를 삽입하고 장치에 연결합니다. 그런 다음 응용 프로그램을 시작하고 드롭" 219 | "다운 상자에서 \"장치로 복사\"를 선택한 다음 \"시작\"을 누릅니다. 복사는 카드 " 220 | "크기에 따라 10-15분 정도 소요됩니다.\n" 221 | "\n" 222 | "결과 카드는 기존 카드의 부팅 가능한 복사본이어야 합니다. 복원하려면 백업 카드" 223 | "를 온보드 SD 카드 슬롯에 넣고 복원할 카드를 USB 라이터에 넣은 다음 위의 복사 " 224 | "과정을 반복하면 됩니다.\n" 225 | "\n" 226 | "표준 USB 스틱으로 백업한 다음 \"장치에서 복사\" 드롭다운을 USB 스틱으로 설정" 227 | "하고 \"장치로 복사\"를 USB 카드 리더로 설정하여 USB 스틱에서 SD 카드로 복원" 228 | "할 수도 있습니다.\n" 229 | "\n" 230 | "현재 부팅된 SD 카드에는 복사할 수 없으므로 \"장치로 복사\" 드롭다운에 표시되" 231 | "지 않습니다.\n" 232 | "\n" 233 | "또한 대상 카드의 크기가 원본 카드와 같을 필요는 없지만 모든 데이터를 저장할 " 234 | "수 있는 충분한 공간이 있어야 합니다. 대상에 공간이 충분하지 않으면 프로그램에" 235 | "서 경고할 것입니다.\n" 236 | "\n" 237 | "라즈비안 스트레치(Raspbian Stretch) 및 이후 버전에서는 동일한 UUID로 두 개의 " 238 | "파티션을 마운트할 수 없으므로 부팅할 때 원본 SD 카드가 부팅된 장치에서 복제" 239 | "된 SD 카드를 마운트할 수 없습니다. 이 작업을 수행해야 하는 경우 복사하기 전" 240 | "에 \"새 파티션 UUID\" 상자를 선택하십시오.\n" 241 | 242 | #: ../data/piclone.ui.h:26 243 | msgid "SD Card Copier Help" 244 | msgstr "SD 카드 복사기 도움말" 245 | 246 | #: ../data/piclone.desktop.in.h:2 247 | msgid "Make a copy of the Raspbian SD card" 248 | msgstr "라즈비안(Raspbian) SD 카드의 복사본 만들기" 249 | 250 | #: ../data/pwdpic.sh:6 251 | msgid "Password Required" 252 | msgstr "비밀번호 필요" 253 | -------------------------------------------------------------------------------- /po/linggen: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | ls -1 *.po | cut -d . -f 1 > LINGUAS 3 | -------------------------------------------------------------------------------- /po/meson.build: -------------------------------------------------------------------------------- 1 | run_command('linggen') 2 | i18n.gettext(meson.project_name(), preset: 'glib') 3 | -------------------------------------------------------------------------------- /po/nb.po: -------------------------------------------------------------------------------- 1 | # Norwegian Bokmål translations for piclone package. 2 | # Copyright (C) 2017 Raspberry Pi 3 | # This file is distributed under the same license as the piclone package. 4 | # Imre Kristoffer Eilertsen , 2019 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: piclone 0.5\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2017-07-18 08:18+0100\n" 11 | "PO-Revision-Date: 2019-08-14 18:45+0200\n" 12 | "Language-Team: Norwegian Bokmål\n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: 8bit\n" 16 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 17 | "X-Generator: Poedit 2.2.3\n" 18 | "Last-Translator: Imre Kristoffer Eilertsen \n" 19 | "Language: nb\n" 20 | 21 | #: ../src/piclone.c:139 22 | msgid "OK" 23 | msgstr "OK" 24 | 25 | #: ../src/piclone.c:187 26 | msgid "Unable to read source." 27 | msgstr "Klarte ikke å lese kilden." 28 | 29 | #: ../src/piclone.c:193 30 | msgid "Non-MSDOS partition table on source." 31 | msgstr "Kilden har en ikke-MSDOS-partisjonstabell." 32 | 33 | #: ../src/piclone.c:200 34 | msgid "Preparing target..." 35 | msgstr "Forbereder mål-enheten …" 36 | 37 | #: ../src/piclone.c:213 38 | msgid "Could not write to destination." 39 | msgstr "Klarte ikke å lagre til destinasjonen." 40 | 41 | #: ../src/piclone.c:227 42 | msgid "Could not create FAT." 43 | msgstr "Klarte ikke å opprette FAT." 44 | 45 | #: ../src/piclone.c:233 46 | msgid "Reading partitions..." 47 | msgstr "Leser inn partisjoner …" 48 | 49 | #: ../src/piclone.c:248 50 | msgid "Too many partitions on source." 51 | msgstr "For mange partisjoner i kilden." 52 | 53 | #: ../src/piclone.c:260 54 | msgid "Preparing partitions..." 55 | msgstr "Forbereder partisjoner …" 56 | 57 | #: ../src/piclone.c:271 ../src/piclone.c:282 ../src/piclone.c:291 58 | msgid "Could not create partition." 59 | msgstr "Klarte ikke å opprette partisjon." 60 | 61 | #: ../src/piclone.c:356 ../src/piclone.c:362 ../src/piclone.c:384 62 | #: ../src/piclone.c:390 63 | msgid "Could not create file system." 64 | msgstr "Klarte ikke å opprette filsystem." 65 | 66 | #: ../src/piclone.c:407 ../src/piclone.c:415 67 | msgid "Could not set flags." 68 | msgstr "Klarte ikke å iverksette flaggene." 69 | 70 | #: ../src/piclone.c:432 71 | #, c-format 72 | msgid "Copying partition %d of %d..." 73 | msgstr "Kopierer partisjon %d av %d …" 74 | 75 | #: ../src/piclone.c:439 ../src/piclone.c:445 76 | msgid "Could not mount partition." 77 | msgstr "Klarte ikke å montere partisjonen." 78 | 79 | #: ../src/piclone.c:463 80 | msgid "Insufficient space. Backup aborted." 81 | msgstr "Utilstrekkelig lagringsplass. Sikkerhetskopieringen ble avbrutt." 82 | 83 | #: ../src/piclone.c:496 ../src/piclone.c:502 84 | msgid "Could not unmount partition." 85 | msgstr "Klarte ikke å avmontere partisjonen." 86 | 87 | #: ../src/piclone.c:508 88 | msgid "Copy complete." 89 | msgstr "Kopieringen er fullført." 90 | 91 | #. add message 92 | #: ../src/piclone.c:584 93 | msgid "Checking source..." 94 | msgstr "Sjekker kilden …" 95 | 96 | #. add cancel button 97 | #: ../src/piclone.c:594 98 | msgid "Cancel" 99 | msgstr "Avbrytt" 100 | 101 | #: ../src/piclone.c:661 102 | #, c-format 103 | msgid "This will erase all content on the device '%s'. Are you sure?" 104 | msgstr "Dette vil slette alt innhold på '%s'-enheten. Er du sikker?" 105 | 106 | #. add buttons 107 | #: ../src/piclone.c:669 108 | msgid "No" 109 | msgstr "Nei" 110 | 111 | #: ../src/piclone.c:673 112 | msgid "Yes" 113 | msgstr "Ja" 114 | 115 | #: ../src/piclone.c:710 ../src/piclone.c:763 116 | msgid "No devices available" 117 | msgstr "Ingen enheter er tilgjengelige" 118 | 119 | #: ../src/piclone.c:813 120 | msgid "Select the device to copy from" 121 | msgstr "Velg enheten det skal kopieres ifra" 122 | 123 | #: ../src/piclone.c:821 124 | msgid "Select the device to copy to" 125 | msgstr "Velg enheten som det skal kopieres til" 126 | 127 | #. End of file 128 | #. =========================================================================== 129 | #: ../data/piclone.ui.h:1 ../data/piclone.desktop.in.h:1 130 | msgid "SD Card Copier" 131 | msgstr "SD Card Copier" 132 | 133 | #: ../data/piclone.ui.h:2 134 | msgid "Help" 135 | msgstr "Hjelp" 136 | 137 | #: ../data/piclone.ui.h:3 138 | msgid "Start" 139 | msgstr "Begynn" 140 | 141 | #: ../data/piclone.ui.h:4 142 | msgid "Copy From Device:" 143 | msgstr "Kopier fra enhet:" 144 | 145 | #: ../data/piclone.ui.h:5 146 | msgid "Select the device from which to copy" 147 | msgstr "Velg enheten det skal kopieres ifra" 148 | 149 | #: ../data/piclone.ui.h:6 150 | msgid "Copy To Device:" 151 | msgstr "Kopier til enhet:" 152 | 153 | #: ../data/piclone.ui.h:7 154 | msgid "Select the device to which to copy" 155 | msgstr "Velg enheten det skal kopieres til" 156 | 157 | #: ../data/piclone.ui.h:8 158 | msgid "New Partition UUIDs" 159 | msgstr "Nye partisjons-UUID-er" 160 | 161 | #: ../data/piclone.ui.h:9 162 | msgid "Check this box to create new partition UUIDs on the copy" 163 | msgstr "Huk av denne boksen for å opprette nye partisjons-UUID-er hos kopien" 164 | 165 | #: ../data/piclone.ui.h:10 166 | msgid "" 167 | "SD Card Copier v1.0\n" 168 | "\n" 169 | "This is an application to copy and back up SD cards. To use it, you will " 170 | "need a USB SD card writer.\n" 171 | "\n" 172 | "To back up your Raspberry Pi's internal SD card, insert a blank SD card into " 173 | "a USB card writer and connect it to your Pi. Then start the application, " 174 | "choose your card writer from the “Copy To Device” drop-down box and press " 175 | "“Start”. The copy process will take 10-15 minutes depending on the size of " 176 | "your card.\n" 177 | "\n" 178 | "The resulting card should be a bootable copy of your existing card; to " 179 | "restore, simply place the backup card into the onboard SD card slot, put the " 180 | "card to restore onto into the USB writer and repeat the copy process above.\n" 181 | "\n" 182 | "You can also back up to a standard USB stick, and then restore from the USB " 183 | "stick to an SD card by setting the “Copy From Device” drop-down to the USB " 184 | "stick and the “Copy To Device” to a USB card writer containing the card to " 185 | "restore onto.\n" 186 | "\n" 187 | "Note that you cannot copy onto the SD card from which your Pi is currently " 188 | "booted, which is why it does not appear in the “Copy To Device” dropdown.\n" 189 | "\n" 190 | "Note also that the destination card doesn’t need to be the same size as the " 191 | "source card, but it must have enough space to hold all the data that is on " 192 | "it. The application will warn you if there is insufficient space on the " 193 | "destination.\n" 194 | "\n" 195 | "Under Raspbian Stretch and later versions, you cannot mount two partitions " 196 | "with the same UUID, so you will not be able to mount a cloned SD card when " 197 | "booted from the disk from which it was cloned. If you need to do this, check " 198 | "the \"New Partition UUIDs\" box before copying.\n" 199 | msgstr "" 200 | "SD Card Copier v1.0\n" 201 | "\n" 202 | "Dette er et program for å (sikkerhets)kopiere SD-kort. For å bruke det, må " 203 | "du ha en SD-til-USB-adapter.\n" 204 | "\n" 205 | "For å sikkerhetskopiere din Raspberry Pis interne SD-kort, sett inn et " 206 | "blankt SD-kort i en USB-kortskriver og koble den til din Pi. Start deretter " 207 | "programmer, velg kortskriveren din fra «Kopier til enhet»-nedfallsmenyen, og " 208 | "trykk på «Begynn». Kopieringsprosessen vil ta 10-15 minutter avhengig av " 209 | "kortets størrelse.\n" 210 | "\n" 211 | "Det resulterende kortet burde da bli en oppstartsbar kopi av ditt " 212 | "eksisterende kort; for å gjenopprette fra den, bare sett inn " 213 | "sikkerhetskopikortet i Pi-ens SD-kortinngang, sett kortet det skal " 214 | "gjenopprettes til inn i USB-kortskriveren, og gjenta kopieringsprosessen " 215 | "ovenfor.\n" 216 | "\n" 217 | "Du kan også sikkerhetskopiere til en vanlig USB-pinne, og deretter " 218 | "gjenopprette fra USB-pinnen til et SD-kort ved å velge USB-pinnen i «Kopier " 219 | "fra enhet»-nedfallsmenyen, og sett «Kopier til enhet» til en USB-kortskriver " 220 | "som har kortet det skal gjenopprettes til inni seg.\n" 221 | "\n" 222 | "Bemerk at du ikke kan kopiere til SD-kortet som Pi-en din for øyeblikket er " 223 | "startet opp ifra, som er grunnen til at den ikke dukker opp i «Kopier til " 224 | "enhet»-nedfallsmenyen.\n" 225 | "\n" 226 | "Bemerk også at mål-enheten ikke behøver å ha samme størrelse som " 227 | "kildekortet, men den må ha nok størrelse til å romme alle dataene som er på " 228 | "den. Programmet vil advare deg dersom det ikke er tilstrekkelig plass på mål-" 229 | "enheten.\n" 230 | "\n" 231 | "I Raspbian Stretch og senere versjoner, kan du ikke montere to partisjoner " 232 | "med den samme UUID-en, så du vil ikke kunne montere et klonet SD-kort når " 233 | "det startes opp fra disken som den ble klonet ifra. Hvis du behøver å gjøre " 234 | "dette, huk av «Nye partisjons-UUID-er»-boksen før du kopierer.\n" 235 | 236 | #: ../data/piclone.ui.h:26 237 | msgid "SD Card Copier Help" 238 | msgstr "SD Card Copier-hjelp" 239 | 240 | #: ../data/piclone.desktop.in.h:2 241 | msgid "Make a copy of the Raspbian SD card" 242 | msgstr "Lag en kopi av Raspbian-SD-kortet" 243 | 244 | #: ../data/pwdpic.sh:6 245 | msgid "Password Required" 246 | msgstr "Passord påkrevd" 247 | -------------------------------------------------------------------------------- /po/sk.po: -------------------------------------------------------------------------------- 1 | # Slovak translations for piclone package. 2 | # Copyright (C) 2017 Raspberry Pi 3 | # This file is distributed under the same license as the piclone package. 4 | # Jose Riha , 2020. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: piclone 0.5\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2020-06-15 18:37+0100\n" 11 | "PO-Revision-Date: 2020-12-12 18:13+0100\n" 12 | "Last-Translator: Jose Riha \n" 13 | "Language-Team: Slovak\n" 14 | "Language: sk\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 19 | "X-Generator: Poedit 2.4.1\n" 20 | 21 | #: ../src/piclone.c:89 ../src/piclone.c:793 22 | msgid "Drives changed - copy aborted" 23 | msgstr "Zariadenia sa zmenili - kopírovanie zrušené" 24 | 25 | #: ../src/piclone.c:163 ../src/piclone.c:794 26 | msgid "OK" 27 | msgstr "OK" 28 | 29 | #: ../src/piclone.c:216 30 | msgid "Unable to read source." 31 | msgstr "Nie je možné čítať zo zdroja." 32 | 33 | #: ../src/piclone.c:222 34 | msgid "Non-MSDOS partition table on source." 35 | msgstr "Zdroj používa inú ako MS-DOS tabuľku partícií." 36 | 37 | #: ../src/piclone.c:229 38 | msgid "Preparing target..." 39 | msgstr "Pripravujem cieľ..." 40 | 41 | #: ../src/piclone.c:242 42 | msgid "Could not write to destination." 43 | msgstr "Nie je možné zapisovať na cieľové zariadenie." 44 | 45 | #: ../src/piclone.c:256 46 | msgid "Could not create FAT." 47 | msgstr "Nepodarilo sa vytvoriť tabuľku FAT." 48 | 49 | #: ../src/piclone.c:262 50 | msgid "Reading partitions..." 51 | msgstr "Čítam partície..." 52 | 53 | #: ../src/piclone.c:277 54 | msgid "Too many partitions on source." 55 | msgstr "Zdroj obsahuje príliš mnoho partícií." 56 | 57 | #: ../src/piclone.c:289 58 | msgid "Preparing partitions..." 59 | msgstr "Pripravujem partície..." 60 | 61 | #: ../src/piclone.c:300 ../src/piclone.c:311 ../src/piclone.c:320 62 | msgid "Could not create partition." 63 | msgstr "Nepodarilo sa vytvoriť partíciu." 64 | 65 | #: ../src/piclone.c:385 ../src/piclone.c:391 ../src/piclone.c:413 ../src/piclone.c:419 66 | msgid "Could not create file system." 67 | msgstr "Nepodarilo sa vytvoriť súborový systém." 68 | 69 | #: ../src/piclone.c:443 70 | #, c-format 71 | msgid "Copying partition %d of %d..." 72 | msgstr "Kopírujem partíciu %d of %d..." 73 | 74 | #: ../src/piclone.c:453 ../src/piclone.c:459 75 | msgid "Could not mount partition." 76 | msgstr "Nepodarilo sa pripojiť partíciu." 77 | 78 | #: ../src/piclone.c:477 79 | msgid "Insufficient space. Backup aborted." 80 | msgstr "Nedostatok miesta. Záloha bola zrušená." 81 | 82 | #: ../src/piclone.c:518 ../src/piclone.c:524 83 | msgid "Could not unmount partition." 84 | msgstr "Nepodarilo sa odpojiť partíciu." 85 | 86 | #: ../src/piclone.c:535 ../src/piclone.c:543 87 | msgid "Could not set flags." 88 | msgstr "Nepodarilo sa nastaviť príznaky." 89 | 90 | #: ../src/piclone.c:550 91 | msgid "Copy complete." 92 | msgstr "Kopírovanie dokončené." 93 | 94 | #: ../src/piclone.c:593 95 | msgid "Cancelling..." 96 | msgstr "Ruším..." 97 | 98 | #. add message 99 | #: ../src/piclone.c:641 100 | msgid "Checking source..." 101 | msgstr "Kontrolujem zdroj..." 102 | 103 | #. add cancel button 104 | #: ../src/piclone.c:651 105 | msgid "Cancel" 106 | msgstr "Zrušiť" 107 | 108 | #: ../src/piclone.c:726 109 | #, c-format 110 | msgid "This will erase all content on the device '%s'. Are you sure?" 111 | msgstr "Týmto odstránite všetok obsah na zariadení '%s'. Ste si istý?" 112 | 113 | #. add buttons 114 | #: ../src/piclone.c:734 115 | msgid "No" 116 | msgstr "Nie" 117 | 118 | #: ../src/piclone.c:738 119 | msgid "Yes" 120 | msgstr "Áno" 121 | 122 | #: ../src/piclone.c:776 ../src/piclone.c:850 123 | msgid "No devices available" 124 | msgstr "Nie sú dostupné žiadne zariadenia" 125 | 126 | #: ../src/piclone.c:803 127 | msgid "Drives changed - cancelling..." 128 | msgstr "Zariadenia sa zmenili - ruším..." 129 | 130 | #: ../src/piclone.c:900 131 | msgid "Select the device to copy from" 132 | msgstr "Vyberte zariadenie, z ktorého sa má kopírovať" 133 | 134 | #: ../src/piclone.c:908 135 | msgid "Select the device to copy to" 136 | msgstr "Vyberte zariadenia, na ktoré sa má kopírovať" 137 | 138 | #. End of file 139 | #. =========================================================================== 140 | #: ../data/piclone.ui.h:1 ../data/piclone.desktop.in.h:1 141 | msgid "SD Card Copier" 142 | msgstr "Kopírovanie SD kariet" 143 | 144 | #: ../data/piclone.ui.h:2 145 | msgid "Help" 146 | msgstr "Pomocník" 147 | 148 | #: ../data/piclone.ui.h:3 149 | msgid "Start" 150 | msgstr "Spustiť" 151 | 152 | #: ../data/piclone.ui.h:4 153 | msgid "Copy From Device:" 154 | msgstr "Kopírovať zo zariadenia:" 155 | 156 | #: ../data/piclone.ui.h:5 157 | msgid "Select the device from which to copy" 158 | msgstr "Vyberte zariadenie, z ktorého sa má kopírovať" 159 | 160 | #: ../data/piclone.ui.h:6 161 | msgid "Copy To Device:" 162 | msgstr "Kopírovať na zariadenie:" 163 | 164 | #: ../data/piclone.ui.h:7 165 | msgid "Select the device to which to copy" 166 | msgstr "Vyberte zariadenie, na ktoré sa má kopírovať" 167 | 168 | #: ../data/piclone.ui.h:8 169 | msgid "New Partition UUIDs" 170 | msgstr "Nové identifikátory (UUID) partícií" 171 | 172 | #: ../data/piclone.ui.h:9 173 | msgid "Check this box to create new partition UUIDs on the copy" 174 | msgstr "Zaškrtnite toto políčko pre vytvorenie nových UUID partícií počas kopírovania" 175 | 176 | #: ../data/piclone.ui.h:10 177 | msgid "" 178 | "SD Card Copier v1.0\n" 179 | "\n" 180 | "This is an application to copy and back up SD cards. To use it, you will need a USB " 181 | "SD card writer.\n" 182 | "\n" 183 | "To back up your Raspberry Pi's internal SD card, insert a blank SD card into a USB " 184 | "card writer and connect it to your Pi. Then start the application, choose your card " 185 | "writer from the “Copy To Device” drop-down box and press “Start”. The copy process " 186 | "will take 10-15 minutes depending on the size of your card.\n" 187 | "\n" 188 | "The resulting card should be a bootable copy of your existing card; to restore, " 189 | "simply place the backup card into the onboard SD card slot, put the card to restore " 190 | "onto into the USB writer and repeat the copy process above.\n" 191 | "\n" 192 | "You can also back up to a standard USB stick, and then restore from the USB stick " 193 | "to an SD card by setting the “Copy From Device” drop-down to the USB stick and the " 194 | "“Copy To Device” to a USB card writer containing the card to restore onto.\n" 195 | "\n" 196 | "Note that you cannot copy onto the SD card from which your Pi is currently booted, " 197 | "which is why it does not appear in the “Copy To Device” dropdown.\n" 198 | "\n" 199 | "Note also that the destination card doesn’t need to be the same size as the source " 200 | "card, but it must have enough space to hold all the data that is on it. The " 201 | "application will warn you if there is insufficient space on the destination.\n" 202 | "\n" 203 | "Under Raspbian Stretch and later versions, you cannot mount two partitions with the " 204 | "same UUID, so you will not be able to mount a cloned SD card when booted from the " 205 | "disk from which it was cloned. If you need to do this, check the \"New Partition " 206 | "UUIDs\" box before copying.\n" 207 | msgstr "" 208 | "Kopírovanie SD kariet v1.0\n" 209 | "\n" 210 | "Toto je program na kopírovanie a zálohu SD kariet. Na jeho fungovanie budete " 211 | "potrebovať USB čítačku SD kariet.\n" 212 | "\n" 213 | "Pre zálohovanie internej SD karty Vášho Raspberry Pi, vložte prázdnu SD kartu do " 214 | "USB čítačky pripojenej k Vášmu Raspberry Pi. Potom vyberte internú SD kartu " 215 | "(označenú ako '/dev/mmcblk0') v rozbaľovacej ponuke \"Kopírovať zo zariadenia\", v " 216 | "ponuke \"Kopírovať na zariadenie\" vyberte čítačku a kliknite na \"Spustiť\". " 217 | "Proces kopírovania zaberie 10-15 minút v závislosti od veľkosti Vašej karty.\n" 218 | "\n" 219 | "Zapísaná karta by mala byt spustiteľnou kópiou existujúcej karty; pre obnovenie dát " 220 | "jednoducho vložte kartu so zálohou do interného slotu Raspberry Pi, do čítačky " 221 | "kariet vložte kartu, na ktorú chcete obnovu zapísať a zopakujte proces kopírovania " 222 | "popísaný vyššie.\n" 223 | "\n" 224 | "Zálohu môžete tiež zapísať na bežný USB kľúč - pre obnovu dát na SD kartu v ponuke " 225 | "\"Kopírovať zo zariadenia\" vyberiete USB kľúč a v ponuke \"Kopírovať na zariadenie" 226 | "\" zvolíte USB čítačku kariet, do ktorej vložíte kartu, na ktorú chcete obnovené " 227 | "údaje zapísať.\n" 228 | "\n" 229 | "Všimnite si, že nemôžete kopírovať na SD kartu, z ktorej Vašej Raspberry Pi " 230 | "naštartovalo, čo je dôvodom, prečo sa táto nezobrazuje v ponuke \"Kopírovať na " 231 | "zariadenie\".\n" 232 | "\n" 233 | "Rovnako si všimnite, že cieľová karta nemusí mať rovnakú veľkosť ako karta, z " 234 | "ktorej sa kopíruje, ale musí mať dostatok voľného miesta pre všetky kopírované " 235 | "údaje. Aplikácia Vás upozorní, ak na cieľovej karte chýba voľné miesto.\n" 236 | "\n" 237 | "Niektoré verzie operačného systému neumožňujú pripojenie dvoch partícií s rovnakým " 238 | "identifikátorom (UUID) dôsledkom čoho nebudete môcť pripojiť klonovanú SD kartu v " 239 | "systéme, ktorý naštartoval z karty, z ktorej bola záloha spustená. Ak to " 240 | "potrebujete, aktivujte pred kopírovaním voľbu \"Nové identifikátory (UUID) partícií" 241 | "\".\n" 242 | 243 | #: ../data/piclone.ui.h:26 244 | msgid "SD Card Copier Help" 245 | msgstr "Pomocník Kopírovania SD kariet" 246 | 247 | #: ../data/piclone.desktop.in.h:2 248 | msgid "Make a copy of the Raspbian SD card" 249 | msgstr "Kopírovať SD karty a USB zariadenia" 250 | 251 | #: ../data/pwdpic.sh:6 252 | msgid "Password Required" 253 | msgstr "Je potrebné zadať heslo" 254 | -------------------------------------------------------------------------------- /po/zh_CN.po: -------------------------------------------------------------------------------- 1 | # Simplified Chinese translations for piclone package. 2 | # Copyright (C) 2017 Raspberry Pi 3 | # This file is distributed under the same license as the piclone package. 4 | # ykla , 2024. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: piclone 0.5\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2020-06-15 18:37+0100\n" 11 | "PO-Revision-Date: 2024-07-14 13:55+0800\n" 12 | "Last-Translator: ykla \n" 13 | "Language-Team: ykla \n" 14 | "Language: zh_CN\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=1; plural=0;\n" 19 | "X-Generator: Poedit 3.4.4\n" 20 | 21 | #: ../src/piclone.c:89 ../src/piclone.c:793 22 | msgid "Drives changed - copy aborted" 23 | msgstr "设备发生变更——复制中断" 24 | 25 | #: ../src/piclone.c:163 ../src/piclone.c:794 26 | msgid "OK" 27 | msgstr "成功" 28 | 29 | #: ../src/piclone.c:216 30 | msgid "Unable to read source." 31 | msgstr "无法读取来源设备。" 32 | 33 | #: ../src/piclone.c:222 34 | msgid "Non-MSDOS partition table on source." 35 | msgstr "来源设备非 MBR 分区表。" 36 | 37 | #: ../src/piclone.c:229 38 | msgid "Preparing target..." 39 | msgstr "正在准备目标设备……" 40 | 41 | #: ../src/piclone.c:242 42 | msgid "Could not write to destination." 43 | msgstr "目标无法写入。" 44 | 45 | #: ../src/piclone.c:256 46 | msgid "Could not create FAT." 47 | msgstr "无法创建 FAT。" 48 | 49 | #: ../src/piclone.c:262 50 | msgid "Reading partitions..." 51 | msgstr "正在读取分区……" 52 | 53 | #: ../src/piclone.c:277 54 | msgid "Too many partitions on source." 55 | msgstr "来源设备分区太多了。" 56 | 57 | #: ../src/piclone.c:289 58 | msgid "Preparing partitions..." 59 | msgstr "正在准备分区……" 60 | 61 | #: ../src/piclone.c:300 ../src/piclone.c:311 ../src/piclone.c:320 62 | msgid "Could not create partition." 63 | msgstr "无法创建分区。" 64 | 65 | #: ../src/piclone.c:385 ../src/piclone.c:391 ../src/piclone.c:413 66 | #: ../src/piclone.c:419 67 | msgid "Could not create file system." 68 | msgstr "无法创建文件系统。" 69 | 70 | #: ../src/piclone.c:443 71 | #, c-format 72 | msgid "Copying partition %d of %d..." 73 | msgstr "正在复制分区 %d 于 %d..." 74 | 75 | #: ../src/piclone.c:453 ../src/piclone.c:459 76 | msgid "Could not mount partition." 77 | msgstr "无法挂载分区。" 78 | 79 | #: ../src/piclone.c:477 80 | msgid "Insufficient space. Backup aborted." 81 | msgstr "空间不足。备份中断。" 82 | 83 | #: ../src/piclone.c:518 ../src/piclone.c:524 84 | msgid "Could not unmount partition." 85 | msgstr "无法卸载分区。" 86 | 87 | #: ../src/piclone.c:535 ../src/piclone.c:543 88 | msgid "Could not set flags." 89 | msgstr "无法设置标志位。" 90 | 91 | #: ../src/piclone.c:550 92 | msgid "Copy complete." 93 | msgstr "复制完成。" 94 | 95 | #: ../src/piclone.c:593 96 | msgid "Cancelling..." 97 | msgstr "正在取消……" 98 | 99 | #. add message 100 | #: ../src/piclone.c:641 101 | msgid "Checking source..." 102 | msgstr "正在检查来源设备……" 103 | 104 | #. add cancel button 105 | #: ../src/piclone.c:651 106 | msgid "Cancel" 107 | msgstr "取消" 108 | 109 | #: ../src/piclone.c:726 110 | #, c-format 111 | msgid "This will erase all content on the device '%s'. Are you sure?" 112 | msgstr "将清除 '%s' 上的所有内容,您确定吗?" 113 | 114 | #. add buttons 115 | #: ../src/piclone.c:734 116 | msgid "No" 117 | msgstr "否" 118 | 119 | #: ../src/piclone.c:738 120 | msgid "Yes" 121 | msgstr "确定" 122 | 123 | #: ../src/piclone.c:776 ../src/piclone.c:850 124 | msgid "No devices available" 125 | msgstr "无设备可用" 126 | 127 | #: ../src/piclone.c:803 128 | msgid "Drives changed - cancelling..." 129 | msgstr "驱动发生变更——正在取消……" 130 | 131 | #: ../src/piclone.c:900 132 | msgid "Select the device to copy from" 133 | msgstr "选择复制的来源设备" 134 | 135 | #: ../src/piclone.c:908 136 | msgid "Select the device to copy to" 137 | msgstr "选择复制的目标设备" 138 | 139 | #. End of file 140 | #. =========================================================================== 141 | #: ../data/piclone.ui.h:1 ../data/piclone.desktop.in.h:1 142 | msgid "SD Card Copier" 143 | msgstr "SD 卡复制工具" 144 | 145 | #: ../data/piclone.ui.h:2 146 | msgid "Help" 147 | msgstr "帮助" 148 | 149 | #: ../data/piclone.ui.h:3 150 | msgid "Start" 151 | msgstr "开始" 152 | 153 | #: ../data/piclone.ui.h:4 154 | msgid "Copy From Device:" 155 | msgstr "复制的来源设备:" 156 | 157 | #: ../data/piclone.ui.h:5 158 | msgid "Select the device from which to copy" 159 | msgstr "选择复制的来源设备" 160 | 161 | #: ../data/piclone.ui.h:6 162 | msgid "Copy To Device:" 163 | msgstr "复制到目标设备:" 164 | 165 | #: ../data/piclone.ui.h:7 166 | msgid "Select the device to which to copy" 167 | msgstr "选择复制的目标设备" 168 | 169 | #: ../data/piclone.ui.h:8 170 | msgid "New Partition UUIDs" 171 | msgstr "生成新的分区 UUID" 172 | 173 | #: ../data/piclone.ui.h:9 174 | msgid "Check this box to create new partition UUIDs on the copy" 175 | msgstr "选中此框可在目标设备上创建新的分区 UUID" 176 | 177 | #: ../data/piclone.ui.h:10 178 | msgid "" 179 | "SD Card Copier v1.0\n" 180 | "\n" 181 | "This is an application to copy and back up SD cards. To use it, you will " 182 | "need a USB SD card writer.\n" 183 | "\n" 184 | "To back up your Raspberry Pi's internal SD card, insert a blank SD card into " 185 | "a USB card writer and connect it to your Pi. Then start the application, " 186 | "choose your card writer from the “Copy To Device” drop-down box and press " 187 | "“Start”. The copy process will take 10-15 minutes depending on the size of " 188 | "your card.\n" 189 | "\n" 190 | "The resulting card should be a bootable copy of your existing card; to " 191 | "restore, simply place the backup card into the onboard SD card slot, put the " 192 | "card to restore onto into the USB writer and repeat the copy process above.\n" 193 | "\n" 194 | "You can also back up to a standard USB stick, and then restore from the USB " 195 | "stick to an SD card by setting the “Copy From Device” drop-down to the USB " 196 | "stick and the “Copy To Device” to a USB card writer containing the card to " 197 | "restore onto.\n" 198 | "\n" 199 | "Note that you cannot copy onto the SD card from which your Pi is currently " 200 | "booted, which is why it does not appear in the “Copy To Device” dropdown.\n" 201 | "\n" 202 | "Note also that the destination card doesn’t need to be the same size as the " 203 | "source card, but it must have enough space to hold all the data that is on " 204 | "it. The application will warn you if there is insufficient space on the " 205 | "destination.\n" 206 | "\n" 207 | "Under Raspbian Stretch and later versions, you cannot mount two partitions " 208 | "with the same UUID, so you will not be able to mount a cloned SD card when " 209 | "booted from the disk from which it was cloned. If you need to do this, check " 210 | "the \"New Partition UUIDs\" box before copying.\n" 211 | msgstr "" 212 | "SD 卡复制工具 v1.0\n" 213 | "\n" 214 | "这是一款用于复制和备份 SD 卡的工具。该工具需使用 USB SD 卡读卡器才能运行。\n" 215 | "\n" 216 | "要备份你的树莓派所使用的 SD 卡,请将一张空白的 SD 卡插入 USB 读卡器,并将其接" 217 | "入至你的树莓派。然后启动应用程序,从下拉框“复制到目标设备”中选择你的读卡器并" 218 | "按“开始”。复制过程取决于卡的大小,可能需要 10-15 分钟。\n" 219 | "\n" 220 | "生成的卡是现有卡的可启动备份;要恢复,只需将备份卡插入板载 SD 卡槽,将要恢复" 221 | "的卡放入 USB 读卡器中,然后重复上述复制过程。\n" 222 | "\n" 223 | "你也可以备份到普通 U 盘,然后把下拉框“复制的来源设备”设置为 U 盘,将“复制到目" 224 | "标设备”设置为包含要恢复到的卡的 USB 读卡器,从 U 盘恢复至 SD 卡。\n" 225 | "\n" 226 | "请注意,你无法把树莓派当前正在的使用 SD 卡作为要复制的目标设备,因此它不会出" 227 | "现在下拉框“复制到目标设备”中。\n" 228 | "\n" 229 | "还请注意,目标设备不需要与来源设备大小一致,但必须有足够的空间容纳所有数据。" 230 | "如果目标设备空间不足,应用程序会产生警告。\n" 231 | "\n" 232 | "在 Raspbian Stretch 及更高版本中,你无法挂载两个相同 UUID 的分区,因此当从被" 233 | "克隆的磁盘启动时,你将无法挂载来源设备的 SD 卡。如果要这样做,请在复制前勾" 234 | "选“生成新的分区 UUID”框。\n" 235 | 236 | #: ../data/piclone.ui.h:26 237 | msgid "SD Card Copier Help" 238 | msgstr "SD 卡复制工具帮助" 239 | 240 | #: ../data/piclone.desktop.in.h:2 241 | msgid "Make a copy of the Raspbian SD card" 242 | msgstr "制作 Raspbian SD 卡备份" 243 | 244 | #: ../data/pwdpic.sh:6 245 | msgid "Password Required" 246 | msgstr "需要密码" 247 | -------------------------------------------------------------------------------- /src/backup: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # unmount any partitions on the target device 4 | 5 | a=9 6 | while [ $a -gt 0 ] 7 | do 8 | sudo umount $1$a 9 | a=`expr $a - 1` 10 | done 11 | 12 | # wipe the FAT on the target 13 | 14 | sudo dd if=/dev/zero of=$1 bs=512 count=1 15 | 16 | # prepare mount points 17 | 18 | src=$(mktemp -d) 19 | dst=$(mktemp -d) 20 | 21 | # find the last partition on the source 22 | 23 | line=$(sudo parted /dev/mmcblk0 unit s print | tail -n 2 | head -n -1) 24 | lastpnum=$(echo $line | cut -d ' ' -f 1) 25 | 26 | # prepare the new FAT 27 | 28 | sudo parted $1 mklabel msdos 29 | 30 | # mirror the partitions on mmcblk0 31 | 32 | sudo parted /dev/mmcblk0 unit s print | tail -n +8 | head -n -1 | while read line ; do 33 | pnum=$(echo $line | cut -d ' ' -f 1) 34 | start=$(echo $line | cut -d ' ' -f 2) 35 | end=$(echo $line | cut -d ' ' -f 3) 36 | type=$(echo $line | cut -d ' ' -f 5) 37 | fstype=$(echo $line | cut -d ' ' -f 6) 38 | flags=$(echo $line | cut -d ' ' -f 7) 39 | if [ "$type" == "extended" ]; then 40 | sudo parted $1 -- mkpart extended $start -1s 41 | else 42 | if [ "$pnum" == "$lastpnum" ]; then 43 | sudo parted $1 -- mkpart $type $fstype $start -1s 44 | else 45 | sudo parted $1 mkpart $type $fstype $start $end 46 | fi 47 | sudo partprobe 48 | 49 | # create file systems 50 | 51 | if [ "$fstype" == "fat32" ] || [ "$fstype" == "fat16" ]; then 52 | sudo mkfs.fat $1$pnum 53 | fi 54 | if [ "$fstype" == "ext4" ]; then 55 | sudo mkfs.ext4 -F $1$pnum 56 | fi 57 | 58 | # mount and copy 59 | 60 | sudo mount $1$pnum $dst 61 | sudo mount /dev/mmcblk0p$pnum $src 62 | sudo cp -axv $src/. $dst/. 63 | sudo umount $dst 64 | sudo umount $src 65 | fi 66 | if [ "$flags" == "lba" ]; then 67 | sudo parted $1 set $pnum lba on 68 | else 69 | sudo parted $1 set $pnum lba off 70 | fi 71 | done 72 | -------------------------------------------------------------------------------- /src/meson.build: -------------------------------------------------------------------------------- 1 | sources = files ( 2 | 'piclone.c' 3 | ) 4 | 5 | add_global_arguments('-Wno-unused-result', language : 'c') 6 | 7 | gtk = dependency ('gtk+-3.0') 8 | 9 | deps = [ gtk ] 10 | 11 | executable (meson.project_name(), sources, dependencies: deps, install: true, 12 | c_args : [ '-DPACKAGE_DATA_DIR="' + resource_dir + '"', '-DGETTEXT_PACKAGE="' + meson.project_name() + '"' ] 13 | ) 14 | -------------------------------------------------------------------------------- /src/piclone.c: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2018 Raspberry Pi (Trading) Ltd. 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | * Neither the name of the copyright holder nor the 13 | names of its contributors may be used to endorse or promote products 14 | derived from this software without specific prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | */ 27 | 28 | #ifdef HAVE_CONFIG_H 29 | #include 30 | #endif 31 | 32 | #include 33 | #include 34 | #include 35 | #include 36 | #include 37 | #include 38 | 39 | #include 40 | #include 41 | #include 42 | #include 43 | 44 | /*---------------------------------------------------------------------------*/ 45 | /* Variable and macro definitions */ 46 | /*---------------------------------------------------------------------------*/ 47 | 48 | #define SUDO_PREFIX "SUDO_ASKPASS=/usr/bin/sudopwd sudo -A " 49 | 50 | /* struct to store partition data */ 51 | 52 | #define MAXPART 9 53 | 54 | typedef struct 55 | { 56 | int pnum; 57 | long start; 58 | long end; 59 | char ptype[10]; 60 | char ftype[20]; 61 | char flags[10]; 62 | } partition_t; 63 | 64 | partition_t parts[MAXPART]; 65 | 66 | /* global volume monitor object */ 67 | GVolumeMonitor *monitor; 68 | 69 | /* control widget globals */ 70 | static GtkWidget *main_dlg, *msg_dlg, *status, *no, *yes, *progress, *cancel, *to_cb, *from_cb, *start_btn, *help_btn, *close_btn, *cpuidcheck; 71 | 72 | /* combo box counters */ 73 | int src_count, dst_count; 74 | 75 | /* device names */ 76 | char src_dev[32], dst_dev[32]; 77 | 78 | /* mount points */ 79 | char src_mnt[32], dst_mnt[32]; 80 | 81 | /* flag to show that new partition UUIDs should be created */ 82 | char new_uuid; 83 | 84 | /* flag to show that copy thread is running */ 85 | char copying; 86 | 87 | /* flag to show that copy has been interrupted */ 88 | char ended; 89 | 90 | /* flag to show that backup has been cancelled by the user */ 91 | char cancelled; 92 | #define CANCEL_CHECK if (cancelled) { if (cancelled == 1) g_idle_add (close_msg, NULL); else terminate_dialog (_("Drives changed - copy aborted")); return NULL; } 93 | 94 | /* flag to show state - inactive, confirm prompt or cloning */ 95 | typedef enum { 96 | STATE_IDLE, 97 | STATE_CONF, 98 | STATE_COPY 99 | } state_t; 100 | 101 | state_t state; 102 | 103 | /*---------------------------------------------------------------------------*/ 104 | /* Function definitions */ 105 | /*---------------------------------------------------------------------------*/ 106 | 107 | /*---------------------------------------------------------------------------*/ 108 | /* System helpers */ 109 | 110 | /* Call a system command and read the first string returned */ 111 | 112 | static int get_string (char *cmd, char *name) 113 | { 114 | FILE *fp; 115 | char buf[64]; 116 | int res; 117 | 118 | name[0] = 0; 119 | fp = popen (cmd, "r"); 120 | if (fp == NULL) return 0; 121 | if (fgets (buf, sizeof (buf) - 1, fp) == NULL) 122 | { 123 | pclose (fp); 124 | return 0; 125 | } 126 | else 127 | { 128 | pclose (fp); 129 | res = sscanf (buf, "%s", name); 130 | if (res != 1) return 0; 131 | return 1; 132 | } 133 | } 134 | 135 | /* System function with printf formatting */ 136 | 137 | static int sys_printf (const char * format, ...) 138 | { 139 | char *buffer; 140 | va_list args; 141 | FILE *fp; 142 | int res; 143 | 144 | va_start (args, format); 145 | g_vasprintf (&buffer, format, args); 146 | va_end (args); 147 | fp = popen (buffer, "r"); 148 | res = pclose (fp); 149 | g_free (buffer); 150 | return res; 151 | } 152 | 153 | 154 | /*---------------------------------------------------------------------------*/ 155 | /* UI helpers */ 156 | 157 | /* Close the progress dialog - usually called on idle */ 158 | 159 | static gboolean close_msg (gpointer data) 160 | { 161 | gtk_widget_destroy (msg_dlg); 162 | return FALSE; 163 | } 164 | 165 | 166 | /* Update the progress dialog with a message to show that backup has ended */ 167 | 168 | static gboolean cb_terminate (gpointer data) 169 | { 170 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), 1.0); 171 | gtk_label_set_text (GTK_LABEL (status), (char *) data); 172 | gtk_button_set_label (GTK_BUTTON (cancel), _("OK")); 173 | gtk_widget_set_sensitive (GTK_WIDGET (cancel), TRUE); 174 | return FALSE; 175 | } 176 | 177 | static void terminate_dialog (char *msg) 178 | { 179 | ended = 1; 180 | state = STATE_IDLE; 181 | gdk_threads_add_idle (cb_terminate, msg); 182 | } 183 | 184 | 185 | /* Get a partition name - format is different on mmcblk from sd */ 186 | 187 | static char *partition_name (char *device, char *buffer) 188 | { 189 | if (!strncmp (device, "/dev/mmcblk", 11) || !strncmp (device, "/dev/nvme", 9)) 190 | sprintf (buffer, "%sp", device); 191 | else 192 | sprintf (buffer, "%s", device); 193 | return buffer; 194 | } 195 | 196 | /* Callbacks to main thread to update UI */ 197 | 198 | static gboolean cb_update_progress (gpointer data) 199 | { 200 | gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), *((float *) data)); 201 | return FALSE; 202 | } 203 | 204 | static void update_progress (float prog) 205 | { 206 | gdk_threads_add_idle (cb_update_progress, (void *) &prog); 207 | } 208 | 209 | static gboolean cb_update_label (gpointer data) 210 | { 211 | gtk_label_set_text (GTK_LABEL (status), (char *) data); 212 | return FALSE; 213 | } 214 | 215 | static void update_label (char *msg) 216 | { 217 | gdk_threads_add_idle (cb_update_label, msg); 218 | } 219 | 220 | /*---------------------------------------------------------------------------*/ 221 | /* Threads */ 222 | 223 | /* Thread which calls the system copy command to do the bulk of the work */ 224 | 225 | static gpointer copy_thread (gpointer data) 226 | { 227 | copying = 1; 228 | sys_printf (SUDO_PREFIX "cp -ax %s/. %s/.", src_mnt, dst_mnt); 229 | copying = 0; 230 | return NULL; 231 | } 232 | 233 | 234 | /* Thread which sets up all the partitions */ 235 | 236 | static gpointer backup_thread (gpointer data) 237 | { 238 | char buffer[256], res[256], dev[16], uuid[64], puuid[64], npuuid[64]; 239 | int n, p, lbl, uid, puid; 240 | long srcsz, dstsz, stime; 241 | double prog; 242 | FILE *fp; 243 | 244 | // get a new partition UUID 245 | get_string ("uuid | cut -f1 -d-", npuuid); 246 | 247 | // check the source has an msdos partition table 248 | sprintf (buffer, SUDO_PREFIX "parted %s unit s print | tail -n +4 | head -n 1", src_dev); 249 | fp = popen (buffer, "r"); 250 | if (fp == NULL) return NULL; 251 | if (fgets (buffer, sizeof (buffer) - 1, fp) == NULL) 252 | { 253 | pclose (fp); 254 | terminate_dialog (_("Unable to read source.")); 255 | return NULL; 256 | } 257 | pclose (fp); 258 | if (strncmp (buffer, "Partition Table: msdos", 22)) 259 | { 260 | terminate_dialog (_("Non-MSDOS partition table on source.")); 261 | return NULL; 262 | } 263 | else 264 | CANCEL_CHECK; 265 | 266 | update_progress (1.0); 267 | update_label (_("Preparing target...")); 268 | update_progress (0.0); 269 | 270 | // unmount any partitions on the target device 271 | for (n = 9; n >= 1; n--) 272 | { 273 | sys_printf (SUDO_PREFIX "umount %s%d", partition_name (dst_dev, dev), n); 274 | CANCEL_CHECK; 275 | } 276 | 277 | // wipe the FAT on the target 278 | if (sys_printf (SUDO_PREFIX "dd if=/dev/zero of=%s bs=512 count=1", dst_dev)) 279 | { 280 | terminate_dialog (_("Could not write to destination.")); 281 | return NULL; 282 | } 283 | CANCEL_CHECK; 284 | 285 | // prepare temp mount points 286 | get_string ("mktemp -d", src_mnt); 287 | CANCEL_CHECK; 288 | get_string ("mktemp -d", dst_mnt); 289 | CANCEL_CHECK; 290 | 291 | // prepare the new FAT 292 | if (sys_printf (SUDO_PREFIX "parted -s %s mklabel msdos", dst_dev)) 293 | { 294 | terminate_dialog (_("Could not create FAT.")); 295 | return NULL; 296 | } 297 | CANCEL_CHECK; 298 | 299 | update_progress (1.0); 300 | update_label (_("Reading partitions...")); 301 | update_progress (0.0); 302 | 303 | // read in the source partition table 304 | n = 0; 305 | sprintf (buffer, SUDO_PREFIX "parted %s unit s print | sed '/^ /!d'", src_dev); 306 | fp = popen (buffer, "r"); 307 | if (fp != NULL) 308 | { 309 | while (1) 310 | { 311 | if (fgets (buffer, sizeof (buffer) - 1, fp) == NULL) break; 312 | if (n >= MAXPART) 313 | { 314 | pclose (fp); 315 | terminate_dialog (_("Too many partitions on source.")); 316 | return NULL; 317 | } 318 | sscanf (buffer, "%d %lds %lds %*ds %s %s %s", &(parts[n].pnum), &(parts[n].start), 319 | &(parts[n].end), (char *) &(parts[n].ptype), (char *) &(parts[n].ftype), (char *) &(parts[n].flags)); 320 | n++; 321 | } 322 | pclose (fp); 323 | } 324 | CANCEL_CHECK; 325 | 326 | update_progress (1.0); 327 | update_label (_("Preparing partitions...")); 328 | update_progress (0.0); 329 | 330 | // recreate the partitions on the target 331 | for (p = 0; p < n; p++) 332 | { 333 | // create the partition 334 | if (!strcmp (parts[p].ptype, "extended")) 335 | { 336 | if (sys_printf (SUDO_PREFIX "parted -s %s -- mkpart extended %lds -1s", dst_dev, parts[p].start)) 337 | { 338 | terminate_dialog (_("Could not create partition.")); 339 | return NULL; 340 | } 341 | } 342 | else 343 | { 344 | if (p == (n - 1)) 345 | { 346 | if (sys_printf (SUDO_PREFIX "parted -s %s -- mkpart %s %s %lds -1s", dst_dev, 347 | parts[p].ptype, parts[p].ftype, parts[p].start)) 348 | { 349 | terminate_dialog (_("Could not create partition.")); 350 | return NULL; 351 | } 352 | } 353 | else 354 | { 355 | if (sys_printf (SUDO_PREFIX "parted -s %s mkpart %s %s %lds %lds", dst_dev, 356 | parts[p].ptype, parts[p].ftype, parts[p].start, parts[p].end)) 357 | { 358 | terminate_dialog (_("Could not create partition.")); 359 | return NULL; 360 | } 361 | } 362 | } 363 | CANCEL_CHECK; 364 | 365 | // refresh the kernel partion table 366 | sys_printf (SUDO_PREFIX "partprobe"); 367 | CANCEL_CHECK; 368 | 369 | // get the UUID 370 | sprintf (buffer, "lsblk -o name,uuid %s | grep %s%d | tr -s \" \" | cut -d \" \" -f 2", src_dev, partition_name (src_dev, dev) + 5, parts[p].pnum); 371 | uid = get_string (buffer, uuid); 372 | if (uid) 373 | { 374 | // sanity check the ID 375 | if (strlen (uuid) == 9) 376 | { 377 | if (uuid[4] == '-') 378 | { 379 | // remove the hyphen from the middle of a FAT volume ID 380 | uuid[4] = uuid[5]; 381 | uuid[5] = uuid[6]; 382 | uuid[6] = uuid[7]; 383 | uuid[7] = uuid[8]; 384 | uuid[8] = 0; 385 | } 386 | else uid = 0; 387 | } 388 | else if (strlen (uuid) == 36) 389 | { 390 | // check there are hyphens in the right places in a UUID 391 | if (uuid[8] != '-') uid = 0; 392 | if (uuid[13] != '-') uid = 0; 393 | if (uuid[18] != '-') uid = 0; 394 | if (uuid[23] != '-') uid = 0; 395 | } 396 | else uid = 0; 397 | } 398 | 399 | // get the label 400 | sprintf (buffer, "lsblk -o name,label %s | grep %s%d | tr -s \" \" | cut -d \" \" -f 2", src_dev, partition_name (src_dev, dev) + 5, parts[p].pnum); 401 | lbl = get_string (buffer, res); 402 | if (!strlen (res)) lbl = 0; 403 | 404 | // get the partition UUID 405 | sprintf (buffer, SUDO_PREFIX "blkid %s | rev | cut -f 2 -d ' ' | rev | cut -f 2 -d \\\"", src_dev); 406 | puid = get_string (buffer, puuid); 407 | if (!strlen (puuid)) puid = 0; 408 | 409 | // create file systems 410 | if (!strncmp (parts[p].ftype, "fat", 3)) 411 | { 412 | if (uid) sprintf (buffer, SUDO_PREFIX "mkfs.fat -F 32 -i %s %s%d", uuid, partition_name (dst_dev, dev), parts[p].pnum); 413 | else sprintf (buffer, SUDO_PREFIX "mkfs.fat -F 32 %s%d", partition_name (dst_dev, dev), parts[p].pnum); 414 | 415 | if (sys_printf (buffer)) 416 | { 417 | if (uid) 418 | { 419 | // second try just in case the only problem was a corrupt UUID 420 | sprintf (buffer, SUDO_PREFIX "mkfs.fat -F 32 %s%d", partition_name (dst_dev, dev), parts[p].pnum); 421 | if (sys_printf (buffer)) 422 | { 423 | terminate_dialog (_("Could not create file system.")); 424 | return NULL; 425 | } 426 | } 427 | else 428 | { 429 | terminate_dialog (_("Could not create file system.")); 430 | return NULL; 431 | } 432 | } 433 | 434 | if (lbl) sys_printf (SUDO_PREFIX "fatlabel %s%d %s", partition_name (dst_dev, dev), parts[p].pnum, res); 435 | } 436 | CANCEL_CHECK; 437 | 438 | if (!strcmp (parts[p].ftype, "ext4")) 439 | { 440 | if (uid) sprintf (buffer, SUDO_PREFIX "mkfs.ext4 -F -U %s %s%d", uuid, partition_name (dst_dev, dev), parts[p].pnum); 441 | else sprintf (buffer, SUDO_PREFIX "mkfs.ext4 -F %s%d", partition_name (dst_dev, dev), parts[p].pnum); 442 | 443 | if (sys_printf (buffer)) 444 | { 445 | if (uid) 446 | { 447 | // second try just in case the only problem was a corrupt UUID 448 | sprintf (buffer, SUDO_PREFIX "mkfs.ext4 -F %s%d", partition_name (dst_dev, dev), parts[p].pnum); 449 | if (sys_printf (buffer)) 450 | { 451 | terminate_dialog (_("Could not create file system.")); 452 | return NULL; 453 | } 454 | } 455 | else 456 | { 457 | terminate_dialog (_("Could not create file system.")); 458 | return NULL; 459 | } 460 | } 461 | 462 | if (lbl) sys_printf (SUDO_PREFIX "e2label %s%d %s", partition_name (dst_dev, dev), parts[p].pnum, res); 463 | } 464 | CANCEL_CHECK; 465 | 466 | // write the partition UUID 467 | if (puid) sys_printf ("echo \"x\ni\n0x%s\nr\nw\n\" | %sfdisk %s", new_uuid ? npuuid : puuid, SUDO_PREFIX, dst_dev); 468 | CANCEL_CHECK; 469 | 470 | prog = p + 1; 471 | prog /= n; 472 | update_progress (prog); 473 | } 474 | 475 | // do the copy for each partition 476 | for (p = 0; p < n; p++) 477 | { 478 | // don't try to copy extended partitions 479 | if (strcmp (parts[p].ptype, "extended")) 480 | { 481 | sprintf (buffer, _("Copying partition %d of %d..."), p + 1, n); 482 | update_label (buffer); 483 | update_progress (0.0); 484 | 485 | // belt-and-braces call to partprobe to make sure devices are found... 486 | get_string ("partprobe", res); 487 | 488 | // mount partitions 489 | if (sys_printf (SUDO_PREFIX "mount %s%d %s", partition_name (dst_dev, dev), parts[p].pnum, dst_mnt)) 490 | { 491 | terminate_dialog (_("Could not mount partition.")); 492 | return NULL; 493 | } 494 | CANCEL_CHECK; 495 | if (sys_printf (SUDO_PREFIX "mount %s%d %s", partition_name (src_dev, dev), parts[p].pnum, src_mnt)) 496 | { 497 | terminate_dialog (_("Could not mount partition.")); 498 | return NULL; 499 | } 500 | CANCEL_CHECK; 501 | 502 | // check there is enough space... 503 | sprintf (buffer, "df %s | tail -n 1 | tr -s \" \" \" \" | cut -d ' ' -f 3", src_mnt); 504 | get_string (buffer, res); 505 | sscanf (res, "%ld", &srcsz); 506 | 507 | sprintf (buffer, "df %s | tail -n 1 | tr -s \" \" \" \" | cut -d ' ' -f 4", dst_mnt); 508 | get_string (buffer, res); 509 | sscanf (res, "%ld", &dstsz); 510 | 511 | if (srcsz >= dstsz) 512 | { 513 | sys_printf (SUDO_PREFIX "umount %s", dst_mnt); 514 | sys_printf (SUDO_PREFIX "umount %s", src_mnt); 515 | terminate_dialog (_("Insufficient space. Backup aborted.")); 516 | return NULL; 517 | } 518 | 519 | // start the copy itself in a new thread 520 | g_thread_new (NULL, copy_thread, NULL); 521 | 522 | // get the size to be copied 523 | sprintf (buffer, SUDO_PREFIX "du -s %s", src_mnt); 524 | get_string (buffer, res); 525 | sscanf (res, "%ld", &srcsz); 526 | if (srcsz < 50000) stime = 1; 527 | else if (srcsz < 500000) stime = 5; 528 | else stime = 10; 529 | 530 | // wait for the copy to complete, while updating the progress bar... 531 | sprintf (buffer, SUDO_PREFIX "du -s %s", dst_mnt); 532 | while (copying) 533 | { 534 | get_string (buffer, res); 535 | sscanf (res, "%ld", &dstsz); 536 | prog = dstsz; 537 | prog /= srcsz; 538 | update_progress (prog); 539 | sleep (stime); 540 | CANCEL_CHECK; 541 | } 542 | 543 | update_progress (1.0); 544 | 545 | // fix up relevant files if changing partition UUID 546 | if (puid && new_uuid) 547 | { 548 | // relevant files are dst_mnt/etc/fstab and dst_mnt/boot/cmdline.txt 549 | sys_printf ("if [ -e /%s/etc/fstab ] ; then %ssed -i s/%s/%s/g /%s/etc/fstab ; fi", dst_mnt, SUDO_PREFIX, puuid, npuuid, dst_mnt); 550 | sys_printf ("if [ -e /%s/cmdline.txt ] ; then %ssed -i s/%s/%s/g /%s/cmdline.txt ; fi", dst_mnt, SUDO_PREFIX, puuid, npuuid, dst_mnt); 551 | } 552 | 553 | // unmount partitions 554 | if (sys_printf (SUDO_PREFIX "umount %s", dst_mnt)) 555 | { 556 | terminate_dialog (_("Could not unmount partition.")); 557 | return NULL; 558 | } 559 | CANCEL_CHECK; 560 | if (sys_printf (SUDO_PREFIX "umount %s", src_mnt)) 561 | { 562 | terminate_dialog (_("Could not unmount partition.")); 563 | return NULL; 564 | } 565 | CANCEL_CHECK; 566 | } 567 | 568 | // set the flags 569 | if (!strcmp (parts[p].flags, "lba")) 570 | { 571 | if (sys_printf (SUDO_PREFIX "parted -s %s set %d lba on", dst_dev, parts[p].pnum)) 572 | { 573 | terminate_dialog (_("Could not set flags.")); 574 | return NULL; 575 | } 576 | } 577 | else 578 | { 579 | if (sys_printf (SUDO_PREFIX "parted -s %s set %d lba off", dst_dev, parts[p].pnum)) 580 | { 581 | terminate_dialog (_("Could not set flags.")); 582 | return NULL; 583 | } 584 | } 585 | CANCEL_CHECK; 586 | } 587 | 588 | if (getenv ("WAYLAND_DISPLAY")) 589 | sys_printf ("wfpanelctl ejecter %s", dst_dev); 590 | else 591 | sys_printf ("lxpanelctl command ejecter %s", dst_dev); 592 | terminate_dialog (_("Copy complete.")); 593 | return NULL; 594 | } 595 | 596 | 597 | /*---------------------------------------------------------------------------*/ 598 | /* Progress dialog UI handlers */ 599 | 600 | static void kill_copy (void) 601 | { 602 | FILE *fp; 603 | char buffer[256]; 604 | int pid; 605 | 606 | if (copying) 607 | { 608 | sprintf (buffer, "ps ax | grep \"cp -ax %s/. %s/.\" | grep -v \"grep\"", src_mnt, dst_mnt); 609 | fp = popen (buffer, "r"); 610 | if (fp != NULL) 611 | { 612 | while (1) 613 | { 614 | if (fgets (buffer, sizeof (buffer) - 1, fp) == NULL) break; 615 | if (sscanf (buffer, "%d", &pid) == 1) sys_printf (SUDO_PREFIX "kill %d", pid); 616 | } 617 | pclose (fp); 618 | } 619 | copying = 0; 620 | } 621 | } 622 | 623 | /* Handler for cancel button */ 624 | 625 | 626 | static gboolean cb_cancel (gpointer data) 627 | { 628 | // hide the progress bar and disable the cancel button 629 | gtk_progress_bar_pulse (GTK_PROGRESS_BAR (progress)); 630 | gtk_label_set_text (GTK_LABEL (status), _("Cancelling...")); 631 | gtk_widget_set_sensitive (GTK_WIDGET (cancel), FALSE); 632 | return FALSE; 633 | } 634 | 635 | static gboolean on_cancel (void) 636 | { 637 | if (ended) 638 | { 639 | g_idle_add (close_msg, NULL); 640 | return FALSE; 641 | } 642 | 643 | gdk_threads_add_idle (cb_cancel, NULL); 644 | 645 | // kill copy processes if running 646 | kill_copy (); 647 | cancelled = 1; 648 | state = STATE_IDLE; 649 | return FALSE; 650 | } 651 | 652 | 653 | /*---------------------------------------------------------------------------*/ 654 | /* Confirm dialog UI handlers */ 655 | 656 | /* Handler for Yes button */ 657 | 658 | static gboolean on_start (void) 659 | { 660 | GtkBuilder *builder; 661 | GtkWidget *wid; 662 | 663 | // close the confirm dialog 664 | gtk_widget_destroy (msg_dlg); 665 | state = STATE_COPY; 666 | 667 | builder = gtk_builder_new_from_file (PACKAGE_DATA_DIR "/piclone.ui"); 668 | msg_dlg = (GtkWidget *) gtk_builder_get_object (builder, "modal"); 669 | gtk_window_set_transient_for (GTK_WINDOW (msg_dlg), GTK_WINDOW (main_dlg)); 670 | 671 | // add message 672 | status = (GtkWidget *) gtk_builder_get_object (builder, "modal_msg"); 673 | gtk_label_set_text (GTK_LABEL (status), _("Checking source...")); 674 | 675 | // add progress bar 676 | progress = (GtkWidget *) gtk_builder_get_object (builder, "modal_pb"); 677 | 678 | // add cancel button 679 | cancel = (GtkWidget *) gtk_builder_get_object (builder, "modal_cancel"); 680 | g_signal_connect (cancel, "clicked", G_CALLBACK (on_cancel), NULL); 681 | 682 | wid = (GtkWidget *) gtk_builder_get_object (builder, "modal_ok"); 683 | gtk_widget_hide (wid); 684 | 685 | gtk_widget_show (msg_dlg); 686 | 687 | // launch a thread with the system call to run the backup 688 | cancelled = 0; 689 | ended = 0; 690 | g_thread_new (NULL, backup_thread, NULL); 691 | return FALSE; 692 | } 693 | 694 | 695 | /* Handler for No button */ 696 | 697 | static gboolean on_close (void) 698 | { 699 | gtk_widget_destroy (msg_dlg); 700 | state = STATE_IDLE; 701 | return FALSE; 702 | } 703 | 704 | /*---------------------------------------------------------------------------*/ 705 | /* Main dialog UI handlers */ 706 | 707 | /* Handler for Start button */ 708 | 709 | static gboolean on_confirm (void) 710 | { 711 | char buffer[256]; 712 | char *src, *dst; 713 | int len; 714 | GtkBuilder *builder; 715 | GtkWidget *wid; 716 | 717 | // set up source and target devices from combobox values 718 | dst = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (to_cb)); 719 | strtok (dst, "("); 720 | strcpy (dst_dev, strtok (NULL, ")")); 721 | 722 | src = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (from_cb)); 723 | strtok (src, "("); 724 | strcpy (src_dev, strtok (NULL, ")")); 725 | 726 | // read the UUID clone setting 727 | new_uuid = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cpuidcheck)); 728 | 729 | // basic sanity check - don't do anything if src == dest 730 | if (!strcmp (src_dev, dst_dev)) return FALSE; 731 | 732 | // create the confirm dialog 733 | builder = gtk_builder_new_from_file (PACKAGE_DATA_DIR "/piclone.ui"); 734 | msg_dlg = (GtkWidget *) gtk_builder_get_object (builder, "modal"); 735 | gtk_window_set_transient_for (GTK_WINDOW (msg_dlg), GTK_WINDOW (main_dlg)); 736 | 737 | // add message 738 | len = strlen (dst); 739 | if (len >= 2) dst[len - 2] = 0; 740 | sprintf (buffer, _("This will erase all content on the device '%s'. Are you sure?"), dst); 741 | status = (GtkWidget *) gtk_builder_get_object (builder, "modal_msg"); 742 | gtk_label_set_text (GTK_LABEL (status), buffer); 743 | 744 | wid = (GtkWidget *) gtk_builder_get_object (builder, "modal_pb"); 745 | gtk_widget_hide (wid); 746 | 747 | // add buttons 748 | no = (GtkWidget *) gtk_builder_get_object (builder, "modal_cancel"); 749 | gtk_button_set_label (GTK_BUTTON (no), _("_No")); 750 | g_signal_connect (no, "clicked", G_CALLBACK (on_close), NULL); 751 | 752 | yes = (GtkWidget *) gtk_builder_get_object (builder, "modal_ok"); 753 | gtk_button_set_label (GTK_BUTTON (yes), _("_Yes")); 754 | g_signal_connect (yes, "clicked", G_CALLBACK (on_start), NULL); 755 | 756 | g_free (src); 757 | g_free (dst); 758 | 759 | gtk_widget_show (msg_dlg); 760 | state = STATE_CONF; 761 | return FALSE; 762 | } 763 | 764 | 765 | /* Handler for Help button */ 766 | 767 | static gboolean on_help (void) 768 | { 769 | GtkBuilder *builder; 770 | GtkWidget *dlg; 771 | 772 | builder = gtk_builder_new_from_file (PACKAGE_DATA_DIR "/piclone.ui"); 773 | dlg = (GtkWidget *) gtk_builder_get_object (builder, "help"); 774 | g_object_unref (builder); 775 | gtk_dialog_run (GTK_DIALOG (dlg)); 776 | gtk_widget_destroy (dlg); 777 | return FALSE; 778 | } 779 | 780 | 781 | /* Handler for Close button */ 782 | 783 | static gboolean on_quit (void) 784 | { 785 | gtk_main_quit (); 786 | return FALSE; 787 | } 788 | 789 | 790 | /* Handler for "changed" signal from comboboxes */ 791 | 792 | static void on_cb_changed (void) 793 | { 794 | // set the start button to active only if boxes contain different strings 795 | if (gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (to_cb)) == 0 || 796 | gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (from_cb)) == 0 || 797 | !strcmp (gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (to_cb)), 798 | gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (from_cb))) || 799 | !strcmp (gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (to_cb)), 800 | _("No devices available"))) 801 | gtk_widget_set_sensitive (GTK_WIDGET (start_btn), FALSE); 802 | else 803 | gtk_widget_set_sensitive (GTK_WIDGET (start_btn), TRUE); 804 | } 805 | 806 | 807 | /* Handler for drives changed signal from volume monitor */ 808 | 809 | static void on_drives_changed (GVolumeMonitor *volume_monitor, GDrive *drive, gpointer user_data) 810 | { 811 | char buffer[256], test[128]; 812 | FILE *fp; 813 | 814 | if (state == STATE_CONF) 815 | { 816 | gtk_label_set_text (GTK_LABEL (status), _("Drives changed - copy aborted")); 817 | gtk_button_set_label (GTK_BUTTON (no), _("OK")); 818 | gtk_widget_hide (yes); 819 | state = STATE_IDLE; 820 | } 821 | 822 | if (state == STATE_COPY && (int) user_data == 1) 823 | { 824 | // hide the progress bar and disable the cancel button 825 | gtk_progress_bar_pulse (GTK_PROGRESS_BAR (progress)); 826 | gtk_label_set_text (GTK_LABEL (status), _("Drives changed - cancelling...")); 827 | gtk_widget_set_sensitive (GTK_WIDGET (cancel), FALSE); 828 | 829 | // kill copy processes if running 830 | kill_copy (); 831 | cancelled = 2; 832 | state = STATE_IDLE; 833 | } 834 | 835 | // empty the comboboxes 836 | while (src_count) 837 | { 838 | gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT (from_cb), 0); 839 | src_count--; 840 | } 841 | while (dst_count) 842 | { 843 | gtk_combo_box_text_remove (GTK_COMBO_BOX_TEXT (to_cb), 0); 844 | dst_count--; 845 | } 846 | 847 | // populate the comboboxes 848 | GList *iter, *drives = g_volume_monitor_get_connected_drives (monitor); 849 | for (iter = drives; iter != NULL; iter = g_list_next (iter)) 850 | { 851 | GDrive *d = iter->data; 852 | char *id = g_drive_get_identifier (d, "unix-device"); 853 | char *n = g_drive_get_name (d); 854 | sprintf (buffer, "%s (%s)", n, id); 855 | gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (from_cb), buffer); 856 | src_count++; 857 | 858 | // do not allow the current root and boot devices as targets 859 | sprintf (test, "lsblk %s | grep -Eq \"part /(boot)?$\"", id); 860 | fp = popen (test, "r"); 861 | if (fp && pclose (fp)) 862 | { 863 | gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (to_cb), buffer); 864 | dst_count++; 865 | } 866 | g_free (id); 867 | g_free (n); 868 | } 869 | g_list_free_full (drives, g_object_unref); 870 | 871 | if (dst_count == 0) 872 | { 873 | gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (to_cb), _("No devices available")); 874 | gtk_combo_box_set_active (GTK_COMBO_BOX (to_cb), 0); 875 | gtk_widget_set_sensitive (GTK_WIDGET (to_cb), FALSE); 876 | dst_count++; 877 | } 878 | else gtk_widget_set_sensitive (GTK_WIDGET (to_cb), TRUE); 879 | } 880 | 881 | 882 | /*---------------------------------------------------------------------------*/ 883 | /* Main function - main dialog */ 884 | 885 | int main (int argc, char *argv[]) 886 | { 887 | GtkBuilder *builder; 888 | 889 | setlocale (LC_ALL, ""); 890 | bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); 891 | bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); 892 | textdomain (GETTEXT_PACKAGE); 893 | 894 | // GTK setup 895 | gtk_init (&argc, &argv); 896 | gtk_icon_theme_prepend_search_path (gtk_icon_theme_get_default(), PACKAGE_DATA_DIR); 897 | 898 | // build the UI 899 | builder = gtk_builder_new_from_file (PACKAGE_DATA_DIR "/piclone.ui"); 900 | main_dlg = (GtkWidget *) gtk_builder_get_object (builder, "main_window"); 901 | 902 | // set up the start button 903 | start_btn = (GtkWidget *) gtk_builder_get_object (builder, "btn_start"); 904 | g_signal_connect (start_btn, "clicked", G_CALLBACK (on_confirm), NULL); 905 | gtk_widget_set_sensitive (GTK_WIDGET (start_btn), FALSE); 906 | 907 | // set up the close button 908 | close_btn = (GtkWidget *) gtk_builder_get_object (builder, "btn_close"); 909 | g_signal_connect (close_btn, "clicked", G_CALLBACK (on_quit), NULL); 910 | 911 | // set up the help button 912 | help_btn = (GtkWidget *) gtk_builder_get_object (builder, "btn_help"); 913 | g_signal_connect (help_btn, "clicked", G_CALLBACK (on_help), NULL); 914 | 915 | // get the new UUID checkbox - uncheck it by default 916 | cpuidcheck = (GtkWidget *) gtk_builder_get_object (builder, "cpcheck"); 917 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cpuidcheck), FALSE); 918 | 919 | // create and add the source combobox 920 | src_count = 0; 921 | from_cb = (GtkWidget *) gtk_builder_get_object (builder, "cb_from"); 922 | g_signal_connect (from_cb, "changed", G_CALLBACK (on_cb_changed), NULL); 923 | 924 | // create and add the destination combobox 925 | dst_count = 0; 926 | to_cb = (GtkWidget *) gtk_builder_get_object (builder, "cb_to"); 927 | g_signal_connect (to_cb, "changed", G_CALLBACK (on_cb_changed), NULL); 928 | 929 | // configure monitoring for drives being connected or disconnected 930 | monitor = g_volume_monitor_get (); 931 | 932 | // populate the comboboxes 933 | on_drives_changed (NULL, NULL, 0); 934 | 935 | g_signal_connect (monitor, "drive_changed", G_CALLBACK (on_drives_changed), (void *) 0); 936 | g_signal_connect (monitor, "drive_connected", G_CALLBACK (on_drives_changed), (void *) 1); 937 | g_signal_connect (monitor, "drive_disconnected", G_CALLBACK (on_drives_changed), (void *) 1); 938 | g_signal_connect (monitor, "mount_changed", G_CALLBACK (on_drives_changed), (void *) 0); 939 | g_signal_connect (monitor, "mount_added", G_CALLBACK (on_drives_changed), (void *) 0); 940 | g_signal_connect (monitor, "mount_removed", G_CALLBACK (on_drives_changed), (void *) 0); 941 | 942 | state = STATE_IDLE; 943 | 944 | g_object_unref (builder); 945 | 946 | gtk_widget_show (main_dlg); 947 | gtk_main (); 948 | 949 | gtk_widget_destroy (main_dlg); 950 | 951 | return 0; 952 | } 953 | 954 | /* End of file */ 955 | /*===========================================================================*/ 956 | --------------------------------------------------------------------------------