summaryrefslogtreecommitdiffstats
path: root/tools/syncrpms
blob: df3ddfaed8f5da03e62c5808df14b173a0fdc8f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
#!/usr/bin/perl

#- Synchronize mulitple RPMS/SRPMS directories.
#- Copyright (C) 1999 MandrakeSoft (fpons@mandrakesoft.com)
#-
#- This program is free software; you can redistribute it and/or modify
#- it under the terms of the GNU General Public License as published by
#- the Free Software Foundation; either version 2, or (at your option)
#- any later version.
#-
#- This program is distributed in the hope that it will be useful,
#- but WITHOUT ANY WARRANTY; without even the implied warranty of
#- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#- GNU General Public License for more details.
#-
#- You should have received a copy of the GNU General Public License
#- along with this program; if not, write to the Free Software
#- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


use strict qw(subs vars refs);

#- compare a version string.
use URPM;

#- get basename for a file.
sub basename { $_[0] =~ /([^\/]*)$/ ? $1 : $_[0]; }

#- system functions.
sub cp {
    my $pid;
    if ($pid = fork()) {
	waitpid($pid, 0);
    } else {
	exec '/bin/cp', @_;
    }
}
sub mv {
    my $pid;
    if ($pid = fork()) {
	waitpid($pid, 0);
    } else {
	exec '/bin/mv', @_;
    }
}
sub rm {
    my $pid;
    if ($pid = fork()) {
	waitpid($pid, 0);
    } else {
	exec '/bin/rm', '-f', @_;
    }
}

#- get a hash on name of srpms/rpms in a directory.
sub get_rpms {
    my ($dir, $rpms, $flag, $modifiable) = @_;

    opendir D, $dir or die "cannot open directory $dir\n";
    map { 
	if (/([^\/]*?)-([^-]*)-([^-]*)\.([^-\.]*)\.rpm$/) {
	    my $key = "$1 $4"; #- get name including architecture.
	    if ($rpms->{$key}) {
		if (URPM::ranges_overlap("== $2-$3", "> $rpms->{$key}{version}-$rpms->{$key}{release}")) {
		    if ($modifiable) {
			if ($flag->{sorted}) {
			    print "you said rpms directory is sorted, so I keep obsoleted $rpms->{$key}{file} by $_ in $rpms->{$key}{dir}\n" if $flag->{verbose};
			} else {
			    if (-d $flag->{conflict}) {
				print "moving obsoleted $rpms->{$key}{file} by $_ in $rpms->{$key}{dir}\n" if $flag->{verbose};
				mv("$rpms->{$key}{dir}/$rpms->{$key}{file}", $flag->{conflict});
			    } elsif ($flag->{clean}) {
				print "removing obsoleted $rpms->{$key}{file} by $_ in $rpms->{$key}{dir}\n" if $flag->{verbose};
				rm("$rpms->{$key}{dir}/$rpms->{$key}{file}");
			    }
			}
		    }
		    $rpms->{$key} = { key => $key,
				      name => $1,
				      version => $2,
				      release => $3,
				      arch => $4,
				      dir => $dir,
				      file => $_,
				    };
		} else {
		    if ($modifiable) {
			if (-d $flag->{conflict}) {
			    print "copying older or equal $_ by $rpms->{$key}{file} in $flag->{conflict}\n" if $flag->{verbose};
			    cp("$dir/$_", $flag->{conflict});
			    chmod 0644, "$flag->{conflict}/$_";
			} elsif ($flag->{clean}) {
			    print "removing older or equal $_ by $rpms->{$key}{file} in $dir\n" if $flag->{verbose};
			    rm("$dir/$_");
			}
		    }
		}
	    } else {
		$rpms->{$key} = { key => $key,
				  name => $1,
				  version => $2,
				  release => $3,
				  arch => $4,
				  dir => $dir,
				  file => $_,
			        };
	    }
	} else {
	    print STDERR "unable to parse filename $_\n";
	}
    } grep { /\.rpm$/ } readdir D;
    closedir D;
}

#- sync packages list according to hashes of rpms.
sub sync_medium {
    my ($rpmsdirs, $list, $rpms, $flag) = @_;
    my %pkg2dir;

    #- build a hash according to rpmsdirs and list for package name.
    my $i = 0;
    foreach (@$list) {
	local *F;
	open F, $_ or die "unable to open packages list file \"$_\"\n";
	foreach (<F>) {
	    chomp;
	    print STDERR "package \"$_\" is listed in mulitple list files!\n" if $pkg2dir{$_};
	    $pkg2dir{$_} = $rpmsdirs->[$i];
	    print "package \"$_\" listed in list files does not exists in rpms directory\n" if $flag->{verbose} && !$rpms->{$_};
	}
	close F;

	++$i;
    }

    #- check for right directory, and move if necessary.
    foreach (values %$rpms) {
	unless ($pkg2dir{$_->{key}}) {
	    print "file $_->{file} in $_->{dir} define package \"$_->{name}\" not listed in list files\n" if $flag->{verbose};
	} elsif ($_->{dir} ne $pkg2dir{$_->{key}}) {
	    print "moving file $_->{file} in $_->{dir} to $pkg2dir{$_->{key}}\n" if $flag->{verbose};
	    mv("$_->{dir}/$_->{file}", $pkg2dir{$_->{key}});
	    $_->{dir} = $pkg2dir{$_->{key}};
	}
    }
}

#- sync two hashes of rpms, update rpms and printer newer version that are not taken into account.
sub sync_rpms {
    my ($source, $target, $flag) = @_;

    #- search in source part.
    foreach (keys %$source) {
	unless ($target->{$_}) {
	    if ($flag->{verbose}) {
		print "adding $source->{$_}{file}" . (-d $flag->{add} ? " to $flag->{add}\n" : " is neccessary!\n");
	    }
	    if (-d $flag->{add}) {
		cp("$source->{$_}{dir}/$source->{$_}{file}", $flag->{add});
		chmod 0644, "$flag->{add}/$source->{$_}{file}";
	    }
	}
    }

    #- search in both part.
    foreach (keys %$source) {
	if ($target->{$_}) {
	    if (URPM::ranges_overlap("== $source->{$_}{version}-$source->{$_}{release}",
				     ">= $target->{$_}{version}-$target->{$_}{release}")) {
		if ("$source->{$_}{version}-$source->{$_}{release}" eq "$target->{$_}{version}-$target->{$_}{release}") {
		    -s "$source->{$_}{dir}/$source->{$_}{file}" == -s "$target->{$_}{dir}/$target->{$_}{file}" and next;
		}
		if ($flag->{verbose}) {
		    print "updating $target->{$_}{dir}/$target->{$_}{file} with newer version $source->{$_}{file}\n";
		}
		if ($flag->{update}) {
		    cp("$source->{$_}{dir}/$source->{$_}{file}", $target->{$_}{dir});
		    chmod 0644, "$target->{$_}{dir}/$source->{$_}{file}";
		    unless (-e "$target->{$_}{dir}/$source->{$_}{file}") {
			die "unable to copy $source->{$_}{file} from $source->{$_}{dir} into $target->{$_}{dir}\n";
		    }
		    rm("$target->{$_}{dir}/$target->{$_}{file}") unless $source->{$_}{file} eq $target->{$_}{file}; #- copy on eq
		}
	    } elsif ($source->{$_}{version} ne $target->{$_}{version} || $source->{$_}{release} ne $target->{$_}{release}) {
		if ($flag->{verbose}) {
		    print STDERR "keeping more up-to-date version $target->{$_}{dir}/$target->{$_}{file} against $source->{$_}{dir}/$source->{$_}{file}, check your repository !\n";
		}
	    } #- say nothing if source is equal to target.
	}
    }

    #- search in target part.
    foreach (keys %$target) {
	unless ($source->{$_}) {
	    if ($flag->{verbose}) {
		print "removing $target->{$_}{file}" . ($flag->{remove} ? " from $target->{$_}{dir}\n" : " is neccessary!\n");
		my $k = $_;
	    }
	    if ($flag->{remove}) {
		rm("$target->{$_}{dir}/$target->{$_}{file}");
	    }
	}
    }
}

#- main program.
sub main {
    my @from_rpms;
    my @to_rpms;
    my @list;
    my $target;
    my %flag;
    my %source;
    my %target;

    foreach (@_) {
	if (/^--(\w*)$/) {
	    if ($1 eq 'verbose' || $1 eq 'update' || $1 eq 'remove' || $1 eq 'clean' || $1 eq 'sorted') {
		$flag{$1} = 1;
	    } elsif ($1 eq 'add' || $1 eq 'conflict') {
		$flag{$1} = undef;
	    } elsif ($1 eq 'from') {
		$target = \@from_rpms;
	    } elsif ($1 eq 'to') {
		$target = \@to_rpms;
	    } elsif ($1 eq 'list') {
		$target = \@list;
	    } else {
		die "unknown option: $1\n";
	    }
	} else {
	    if (exists $flag{add} && ! $flag{add}) {
		$flag{add} = $_;
		die "cannot add to non-directory: $_\n" unless -d $flag{add};
	    } elsif (exists $flag{conflict} && ! $flag{conflict}) {
		$flag{conflict} = $_;
		die "cannot add to non-directory: $_\n" unless -d $flag{conflict};
	    } else {
		die "unknown parameter: $_\n" unless $target;
		push @$target, $_;
	    }
	}
    }

    die "usage: syncrpms [--update] [--remove] [--clean] [--sorted] [--add <dir>] [--conflict <dir>] --from <dir_sources> --to <dir_targets> [--list <files>]\n"
	unless scalar(@from_rpms) > 0 || scalar(@to_rpms) > 0;

    #- parse directory structures.
    get_rpms($_, \%source, \%flag, 0) foreach @from_rpms;
    print STDERR "reading " . scalar(keys %source) . " packages as source rpms from\n";
    print STDERR "    $_\n" foreach @from_rpms;

    get_rpms($_, \%target, \%flag, 1) foreach @to_rpms;
    print STDERR "reading " . scalar(keys %target) . " packages as target rpms from\n";
    print STDERR "    $_\n" foreach @to_rpms;

    sync_medium(\@to_rpms, \@list, \%target, \%flag) if scalar(@list) > 0 && scalar(@to_rpms) > 0;
    sync_rpms(\%source, \%target, \%flag) if scalar(@from_rpms) > 0 && scalar(@to_rpms) > 0;
}

main(@ARGV);
an class="hl str">"Fejl, umount returnerede {}" #: backend/raw_write.py:146 msgid "Execution failed: {}" msgstr "Eksekvering mislykkedes: {}" #: backend/raw_write.py:171 msgid "Signature file {} not found\n" msgstr "Signaturfilen {} blev ikke fundet\n" #: backend/raw_write.py:179 msgid "Sum SHA512 file {} not found\n" msgstr "Sum SHA512-filen {} blev ikke fundet\n" #: backend/raw_write.py:207 #, python-format msgid "Invalid signature for %s.sha512" msgstr "Ugyldig signatur til %s.sha512" #: backend/raw_write.py:209 msgid "SHA512 sum: {}" msgstr "SHA512-sum: {}" #: backend/raw_write.py:213 msgid "The sha512 sum check is OK and the sum is signed" msgstr "Tjek af sha512-sum er OK og summen er signeret" #: backend/raw_write.py:215 msgid "The sha512 sum check is OK but the signature can't be found" msgstr "Tjek af sha512-sum er OK men kan ikke finde signaturen" #: backend/raw_write.py:217 msgid "/!\\The computed and stored sums don't match" msgstr "/!\\De udregnede og lagrede summe er ikke ens" #: lib/isodumper.py:166 msgid "Target Device: " msgstr "Destinationsenheder: " #. I18N these are units for files size #: lib/isodumper.py:174 msgid "B" msgstr "" #: lib/isodumper.py:174 msgid "GiB" msgstr "" #: lib/isodumper.py:174 msgid "KiB" msgstr "" #: lib/isodumper.py:174 msgid "MiB" msgstr "" #: lib/isodumper.py:174 lib/isodumper.py:178 msgid "TiB" msgstr "" #: lib/isodumper.py:192 msgid "Formatting confirmation" msgstr "Bekræftelse af formatering" #: lib/isodumper.py:197 msgid "The device was formatted successfully." msgstr "Enheden blev formateret med succes." #: lib/isodumper.py:201 msgid "An error occurred while creating a partition." msgstr "En fejl opstod ved oprettelse af en partition." #: lib/isodumper.py:205 msgid "Authentication error." msgstr "Identifikation fejl." #: lib/isodumper.py:209 msgid "An error occurred." msgstr "Der opstod en fejl." #: lib/isodumper.py:226 msgid "Wrote: {}% " msgstr "Skrev: {}% " #: lib/isodumper.py:252 msgid "Backup confirmation" msgstr "Bekræftelse af sikkerhedskopiering" #: lib/isodumper.py:252 msgid "Do you want to overwrite the file?" msgstr "Ønsker du at overskrive filen?" #: lib/isodumper.py:260 #, python-format msgid "" "The destination directory is too small to receive the backup (%s Mb needed)" msgstr "" "Destinationsmappen er for lille til at modtage sikkerhedskopien (%s Mb " "kræves)" #: lib/isodumper.py:266 lib/isodumper.py:541 lib/isodumper.py:698 msgid "Backup to:" msgstr "Sikkerhedskopiér til:" #: lib/isodumper.py:279 #, python-brace-format msgid "{source} successfully written to {target}" msgstr "{source} blev skrevet til {target}" #: lib/isodumper.py:301 msgid "The device is too small to contain the ISO file." msgstr "Enheden er for lille til at indeholde ISO filen." #: lib/isodumper.py:305 msgid "Writing confirmation" msgstr "Bekræftelse af skrivning" #: lib/isodumper.py:308 msgid "The device is bigger than 32 Gbytes. Are you sure you want use it?" msgstr "Enheden er større end 32 Gb. Er du sikker på, at du vil bruge den?" #: lib/isodumper.py:308 lib/isodumper.py:380 msgid "Warning" msgstr "Advarsel" #: lib/isodumper.py:315 #, python-brace-format msgid "Writing {source} to {target}" msgstr "Skriver {source} til {target}" #: lib/isodumper.py:316 msgid " to " msgstr " til " #: lib/isodumper.py:316 msgid "Executing copy from " msgstr "Udfører kopi fra " #: lib/isodumper.py:333 #, python-brace-format msgid "Image {source} successfully written to {target}" msgstr "Aftrykket {source} blev skrevet til {target}" #: lib/isodumper.py:334 msgid "Bytes written: " msgstr "Bytes skrevet: " #: lib/isodumper.py:335 msgid "Checking " msgstr "Tjekker" #: lib/isodumper.py:353 msgid "Adding persistent partition" msgstr "" #: lib/isodumper.py:355 msgid "Added persistent partition" msgstr "" #: lib/isodumper.py:368 msgid "" "The operation completed successfully.\n" " You are free to unplug it now, a logfile \n" "(/home/-user- or /root)/.isodumper/isodumper.log will be saved when\n" " you close the application." msgstr "" "Handlingen blev fuldført.\n" " Du kan nu frit tage den ud, en logfil \n" "(/home/-bruger- eller /root)/.isodumper/isodumper.log vil blive gemt når\n" " du lukket programmet." #: lib/isodumper.py:380 msgid "" "Writing is in progress. Exiting during writing \n" " will make the device or the backup unusable.\n" " Are you sure you want to quit during writing?" msgstr "" "Skrivning i gang. Afslutning under skrivning \n" " vil gøre enheden eller sikkerhedskopien ubrugelig.\n" " Er du sikker på, at du vil afslutte under skrivning?" #: lib/isodumper.py:392 lib/isodumper.py:476 msgid "Error" msgstr "Fejl" #: lib/isodumper.py:432 msgid "Image " msgstr "Billede " #: lib/isodumper.py:436 lib/isodumper.py:498 msgid "IsoDumper" msgstr "IsoDumper" #: lib/isodumper.py:436 msgid "" "Mageia IsoDumper<BR />----------------<BR />This GUI program is primarily " "for safely writing a bootable ISO image to a USB flash drive, an operation " "devious & potentially hazardous when done by hand. As a bonus, it can also " "back up theentire previous<BR />contents of the flash drive onto the hard " "disc, and restore the flash drive to its previous state subsequently.<BR /" ">It gives also a feature for formatting the USB device.<BR /><BR />IsoDumper " "can be launched either from the menus, or a user or root console with the " "command 'isodumper'.<BR />For normal users, the root password is solicited; " "this is necessary for the program's operation. <BR />The flash drive can be " "inserted beforehand or once the program is started. In the latter case, a " "dialogue will say that there is no flash drive inserted, and allow a 'retry' " "to find it once it is. <BR />(You may have to close any automatically opened " "File Manager window).<BR /><BR />The fields of the main window are as " "follows:<BR />- Device to work on: the device of the USB flash drive, a drop-" "down list to choose from.<BR />- Write Image: to choose the source ISO image " "*.iso (or flash drive backup file *.img) to write out.<BR />- Write to " "device: This button launches the operation - with a prior warning dialogue. " "<BR />The operation is shown in the progress bar beneath.<BR />- Backup to: " "define the name and placement of the backup image file. The current flash " "drive will be backed up to a disc file. Note that the entire flash drive is " "preserved, regardless of its actual contents; ensure that you have the " "necessary free disc space (the same size as the USB device). This backup " "file can be used later to restore the flash drive by selecting it as the " "source *.img file to write out.<BR />- Backup the device: launch the backup " "operation.<BR />- Format the device: create an unique partition on the " "entire volume in the specified format in FAT, NTFS or ext. You can specify a " "volume name and the format in a new dialog box.<BR />" msgstr "" "Mageia IsoDumper<BR />----------------<BR />Dette GUI-program er primært til " "at skrive et bootbart ISO-aftryk sikkert til et USB-flashdrev, en handling " "som kan drille og potientelt være farligt når det gøres manuelt. Som en " "bonus, kan du også sikkerhedskopiere alt det forrige<BR />indhold på " "flashdrevet til harddisken og gendanne flashdrevet til sin forrige tilstand " "efterfølgende.<BR />Den har også en facalitet til formatering af USB-enheden." "<BR /><BR />IsoDumper kan enten startes fra menuerne eller en bruger- eller " "root-konsol med kommandoen 'isodumper'.<BR />For normale brugere anmodes der " "om root-adgangskoden; dette er nødvendigt for at programmet kan fungere. " "<BR />Flashdrevet kan indsættes på forhånd eller når programmet er startet. " "I det sidstnævnte tilfælde, fortæller en dialog at der ikke er sat noget " "flashdrev i og tilbyder 'prøv igen' for at finde det når det er sat i. <BR /" ">(det kan være at du skal lukke eventuelle automatisk åbnede " "filhåndteringsvinduer).<BR /><BR />Hovedvinduets felter er som følger:<BR /" ">- Enhed der arbejdes på: USB-flashdrevets enhed, en drop down-liste at " "vælge fra.<BR />- Skriv aftryk: til at vælge kilde-ISO-aftryk *.iso (eller " "flashdrev-sikkedskopifil *.img) som skal skrives ud.<BR />- Skriv til enhed: " "Denne knap starter handlingen - med en forudgående advarslesdialog. <BR /" ">Handlingen vises i forløbsbjælken nedenfor.<BR />- Sikkerhedskopiér til: " "definer navnet og placeringen af sikkerhedskopiaftrykfilen. Der vil blive " "oprettet en sikkerhedskopi af det aktulle flashdrev til en diskfil. Bemærk " "at hele flashdrevet bevares, uanset dens indhold; sørg for at du har den " "nødvendige ledige diskplads (samme størrelse som USB-enheden). Denne " "sikkerhedskopifil kan senere bruges til at gendanne flashdrevet ved at vælge " "den som kilde-*.img-filen som skal skrives ud.<BR />- Sikkerhedskopiér " "enheden: start sikkerhedskopieringshandlingen.<BR />- Formatér enheden: " "opret en unik partition på hele volumen i det angivne format i FAT, NTFS " "eller ext. Du kan angive et volumenavn og format i en ny dialogboks.<BR />" #: lib/isodumper.py:476 msgid "There is another instance of Isodumper already running." msgstr "" #: lib/isodumper.py:490 msgid "Choose an image" msgstr "Vælg et aftryk" #: lib/isodumper.py:491 msgid "" "Warning\n" "This will destroy all data on the target device,\n" " are you sure you want to proceed?\n" " If you say ok here, please <b>do not unplug</b> the device " "during the following operation." msgstr "" "Advarsel\n" "Dette vil ødelægge alt data på målenheden,\n" " er du sikker på, at du vil fortsætte?\n" " Hvis du siger ok her, så tag venligst <b>ikke enheden ud</b> under " "den følgende handling." #: lib/isodumper.py:525 msgid "Device to work on:" msgstr "Enhed der arbejdes på:" #: lib/isodumper.py:529 msgid "Write Image:" msgstr "Skriv aftryk:" #: lib/isodumper.py:535 msgid "&Write to device" msgstr "&Skriv til enhed" #: lib/isodumper.py:538 msgid "Add a persistent partition in the remaining space" msgstr "" #: lib/isodumper.py:547 msgid "Backup the device" msgstr "Sikkerhedskopiér enheden" #: lib/isodumper.py:550 msgid "Format the device in FAT, NTFS or ext:" msgstr "Formatere enheden i FAT, NTFS eller ext:" #: lib/isodumper.py:552 msgid "Format the device" msgstr "Formatér enheden" #: lib/isodumper.py:555 msgid "Progress" msgstr "Forløb" #: lib/isodumper.py:559 msgid "Report" msgstr "Rapport" #: lib/isodumper.py:562 lib/isodumper.py:666 msgid "Refresh" msgstr "Genopfrisk" #: lib/isodumper.py:564 msgid "About" msgstr "Om" #: lib/isodumper.py:566 msgid "Help" msgstr "Hjælp" #: lib/isodumper.py:568 msgid "Quit" msgstr "Afslut" #: lib/isodumper.py:574 msgid "UDisks2 is not available on your system" msgstr "UDisks2 er ikke tilgængelig på dit system" #: lib/isodumper.py:590 msgid "Label for the device:" msgstr "Label til enhenden:" #: lib/isodumper.py:594 msgid "FAT 32 (Windows)" msgstr "FAT 32 (Windows)" #: lib/isodumper.py:596 msgid "NTFS (Windows)" msgstr "NTFS (Windows)" #: lib/isodumper.py:598 msgid "ext4 (Linux)" msgstr "ext4 (Linux)" #: lib/isodumper.py:600 msgid "Execute" msgstr "Udfør" #: lib/isodumper.py:601 lib/isodumper.py:667 msgid "Cancel" msgstr "Annullér" #: lib/isodumper.py:638 msgid "OK" msgstr "OK" #: lib/isodumper.py:648 msgid "Yes" msgstr "Ja" #: lib/isodumper.py:649 msgid "No" msgstr "Nej" #: lib/isodumper.py:657 msgid "A tool for writing ISO images to a device" msgstr "Et værktøj til at skrive ISO-aftryk på en enhed" #: lib/isodumper.py:657 msgid "Oliver Grawert<BR />Papoteur<BR />Pictures : Timothée Giet" msgstr "" #: lib/isodumper.py:665 msgid "" "Warning\n" "No target devices were found.\n" "You need to plug in a USB Key to which the image can be written." msgstr "" "Advarsel\n" "Der blev ikke fundet nogen målenhed.\n" "Du skal sætte en USB-nøgle i hvor aftrykket skal skrives på." #: polkit/org.mageia.isodumper.policy.in.h:1 msgid "Isodumper requesting write access" msgstr "Isodumper anmoder om skriveadgang" #: polkit/org.mageia.isodumper.policy.in.h:2 msgid "Manatools requesting write access" msgstr "Manatools anmoder om skriveadgang" #: share/applications/format-usb.desktop.in.h:1 msgid "A GUI tool to format USB sticks" msgstr "Et GUI-værktøj til at formatere USB-sticks" #: share/applications/isodumper.desktop.in.h:1 msgid "A GUI tool to write .img and .iso files to USB sticks"