summaryrefslogtreecommitdiffstats
path: root/perl-install/bootloader.pm
blob: 605712975b3e832704d221f427d27c77519d4d6f (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
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
package bootloader; # $Id$

use diagnostics;
use strict;

#-######################################################################################
#- misc imports
#-######################################################################################
use common;
use fs::type;
use fs::get;
use fs::loopback;
use fs::proc_partitions;
use log;
use any;
use devices;
use detect_devices;
use partition_table::raw;
use run_program;
use modules;

#-#####################################################################################
#- Functions
#-#####################################################################################
my $vmlinuz_regexp = 'vmlinuz|win4lin';
my $decompose_vmlinuz_name = qr/((?:$vmlinuz_regexp).*?)-(\d+\.\d+.*)/;

sub expand_vmlinuz_symlink {
    my ($vmlinuz) = @_;
    my $f = $::prefix . ($vmlinuz =~ m!^/! ? $vmlinuz : "/boot/$vmlinuz");
    -l $f ? readlink($f) : $vmlinuz;
}

sub installed_vmlinuz_raw() { grep { /^($vmlinuz_regexp)/ } all("$::prefix/boot") }
sub installed_vmlinuz() { grep { ! -l "$::prefix/boot/$_" } installed_vmlinuz_raw() }
sub vmlinuz2version {
    my ($vmlinuz) = @_;
    expand_vmlinuz_symlink($vmlinuz) =~ /$decompose_vmlinuz_name/ && $2;
}
sub vmlinuz2kernel_str {
    my ($vmlinuz) = @_;
    my ($basename, $version) = expand_vmlinuz_symlink($vmlinuz) =~ /$decompose_vmlinuz_name/ or return;
    { 
	basename => $basename,
	version => $version, 
	$version =~ /(.*)-(\D.*)-(\d+md[kv])$/ ? #- eg: 2.6.22.5-server-1mdv
	  (ext => $2, version_no_ext => "$1-$3") :
	$version =~ /(.*md[kv])-?(.*)/ ? #- (old) eg: 2.6.17-13mdventerprise
	  (ext => $2, version_no_ext => $1) : (version_no_ext => $version),
    };
}

sub basename2initrd_basename {
    my ($basename) = @_;
    $basename =~ s!vmlinuz-?!!; #- here we do not use $vmlinuz_regexp since we explictly want to keep all that is not "vmlinuz"
    'initrd' . ($basename ? "-$basename" : '');    
}
sub kernel_str2vmlinuz_long {
    my ($kernel) = @_;
    $kernel->{basename} . '-' . $kernel->{version};
}
sub kernel_str2initrd_long {
    my ($kernel) = @_;
    basename2initrd_basename($kernel->{basename}) . '-' . $kernel->{version} . '.img';
}
sub kernel_str2vmlinuz_short {
    my ($kernel) = @_;
    if ($kernel->{use_long_name}) {
	kernel_str2vmlinuz_long($kernel);
    } else {
	my $ext = $kernel->{ext} ? "-$kernel->{ext}" : '';
	$kernel->{basename} . $ext;
    }
}
sub kernel_str2initrd_short {
    my ($kernel) = @_;
    if ($kernel->{use_long_name}) {
	kernel_str2initrd_long($kernel);
    } else {
	my $ext = $kernel->{ext} ? "-$kernel->{ext}" : '';
	basename2initrd_basename($kernel->{basename}) . $ext . '.img';
    }
}

sub kernel_str2label {
    my ($kernel, $o_use_long_name) = @_;
    my $base = $kernel->{basename} eq 'vmlinuz' ? 'linux' : $kernel->{basename};
    $o_use_long_name || $kernel->{use_long_name} ?
      _sanitize_ver($kernel) : $base;
}

sub get {
    my ($vmlinuz, $bootloader) = @_;
    $_->{kernel_or_dev} && $_->{kernel_or_dev} eq $vmlinuz and return $_ foreach @{$bootloader->{entries}};
    undef;
}
sub get_label {
    my ($label, $bootloader) = @_;
    $_->{label} && lc(make_label_lilo_compatible($_->{label})) eq lc(make_label_lilo_compatible($label)) and return $_ foreach @{$bootloader->{entries}};
    undef;
}

sub mkinitrd {
    my ($kernel_version, $bootloader, $entry, $initrd) = @_;

    $::testing || -e "$::prefix/$initrd" and return $initrd;

    my $loop_boot = fs::loopback::prepare_boot();

    modules::load('loop');
    my @options = (
		   "-v", "-f", $initrd, "--ifneeded", $kernel_version, 
		   if_($entry->{initrd_options}, split(' ', $entry->{initrd_options})),
		  );
    if (!run_program::rooted($::prefix, 'mkinitrd', @options)) {
	unlink("$::prefix/$initrd");
	die "mkinitrd failed:\n(mkinitrd @options))";
    }
    add_boot_splash($initrd, $entry->{vga} || $bootloader->{vga});

    fs::loopback::save_boot($loop_boot);

    -e "$::prefix/$initrd" && $initrd;
}

sub rebuild_initrd {
    my ($kernel_version, $bootloader, $entry, $initrd) = @_;

    my $old = $::prefix . $entry->{initrd} . '.old';
    unlink $old;
    rename "$::prefix$initrd", $old;
    if (!mkinitrd($kernel_version, $bootloader, $entry, $initrd)) {
	log::l("rebuilding initrd failed, putting back the old one");
	rename $old, "$::prefix$initrd";
    }
}

sub remove_boot_splash {
    my ($initrd) = @_;
    run_program::rooted($::prefix, '/usr/share/bootsplash/scripts/remove-boot-splash', $initrd);
}
sub add_boot_splash {
    my ($initrd, $vga) = @_;

    $vga or return;

    eval { require Xconfig::resolution_and_depth } or return;
    if (my $res = Xconfig::resolution_and_depth::from_bios($vga)) {
	run_program::rooted($::prefix, '/usr/share/bootsplash/scripts/make-boot-splash', $initrd, $res->{X});
    } else {
	log::l("unknown vga bios mode $vga");
    }
}
sub update_splash {
    my ($bootloader) = @_;

    foreach (@{$bootloader->{entries}}) {
	bootloader::add_boot_splash($_->{initrd}, $_->{vga} || $bootloader->{vga}) if $_->{initrd};
    }
}

sub read {
    my ($all_hds) = @_;
    my $fstab = [ fs::get::fstab($all_hds) ];
    foreach my $main_method (main_method_choices()) {
	my $f = $bootloader::{"read_$main_method"} or die "unknown bootloader method $main_method (read)";
	my $bootloader = $f->($fstab);

	cleanup_entries($bootloader);

	my @devs = $bootloader->{boot};
	if ($bootloader->{'raid-extra-boot'} =~ /mbr/ && 
	    (my $md = fs::get::device2part($bootloader->{boot}, $all_hds->{raids}))) {
	    @devs = map { $_->{rootDevice} } @{$md->{disks}};
	} elsif ($bootloader->{'raid-extra-boot'} =~ m!/dev/!) {
	    @devs = split(',', $bootloader->{'raid-extra-boot'});
	}

	my ($type) = map {
	    if (m!/fd\d+$!) {
		warn "not checking the method on floppy, assuming $main_method is right\n";
		$main_method;
	    } elsif (member($main_method, qw(yaboot cromwell silo))) {
		#- not checking, there's only one bootloader anyway :)
		$main_method;
	    } elsif (my $type = partition_table::raw::typeOfMBR($_)) {
		warn "typeOfMBR $type on $_ for method $main_method\n" if $ENV{DEBUG};
		$type;
	    } else { () }
	} @devs;

	if ($type eq $main_method) {
	    my @prefered_entries = map { get_label($_, $bootloader) } $bootloader->{default}, 'linux';

	    if (my $default = find { $_ && $_->{type} eq 'image' } (@prefered_entries, @{$bootloader->{entries}})) {
		$bootloader->{default_options} = $default;
		$bootloader->{perImageAppend} ||= $default->{append};
		log::l("perImageAppend is now $bootloader->{perImageAppend}");
	    } else {
		$bootloader->{default_options} = {};
	    }
	    return $bootloader;
	}
    }
}

sub read_grub {
    my ($fstab) = @_;

    my $grub2dev = read_grub_device_map();

    my $bootloader = read_grub_menu_lst($fstab, $grub2dev) or return;

    read_grub_install_sh($bootloader, $grub2dev);

    $bootloader;
}

sub read_grub_install_sh {
    my ($bootloader, $grub2dev) = @_;

    #- matches either:
    #-   setup (hd0)
    #-   install (hd0,0)/boot/grub/stage1 d (hd0) (hd0,0)/boot/grub/stage2 p (hd0,0)/boot/grub/menu.lst
    if (cat_("$::prefix/boot/grub/install.sh") =~ /^(?:setup.*|install\s.*\sd)\s+(\(.*?\))/m) {
	$bootloader->{boot} = grub2dev($1, $grub2dev);
    }    
}

sub read_grub_menu_lst {
    my ($fstab, $grub2dev) = @_;
    my $global = 1;
    my ($e, %b);

    my $menu_lst_file = "$::prefix/boot/grub/menu.lst";
    -e $menu_lst_file or return;

    foreach (cat_($menu_lst_file)) {
        chomp;
	s/^\s*//; s/\s*$//;
        next if /^#/ || /^$/;
	my ($keyword, $v) = split('[ \t=]+', $_, 2) or
	  warn qq(unknown line in /boot/grub/menu.lst: "$_"\n), next;

        if ($keyword eq 'title') {
            push @{$b{entries}}, $e = { label => $v };
            $global = 0;
        } elsif ($global) {
            $b{$keyword} = $v eq '' ? 1 : grub2file($v, $grub2dev, $fstab);
        } else {
            if ($keyword eq 'kernel') {
                $e->{type} = 'image';
		$e->{kernel} = $v;
            } elsif ($keyword eq 'root' || $keyword eq 'rootnoverify') {
                $e->{type} = 'other';
		$e->{grub_noverify} = 1 if $keyword eq 'rootnoverify';
                $e->{kernel_or_dev} = grub2dev($v, $grub2dev);
                $e->{append} = "";
            } elsif ($keyword eq 'initrd') {
                $e->{initrd} = grub2file($v, $grub2dev, $fstab);
            } elsif ($keyword eq 'map') {
		$e->{mapdrive}{$2} = $1 if $v =~ m/\((.*)\) \((.*)\)/;
            } elsif ($keyword eq 'module') {
		push @{$e->{modules}}, $v;
	    } else {
		$e->{$keyword} = $v eq '' ? 1 : $v;
	    }
        }
    }

    #- sanitize
    foreach my $e (@{$b{entries}}) {
	if ($e->{kernel} =~ /xen/ && @{$e->{modules} || []} == 2 && $e->{modules}[1] =~ /initrd/) {
	    (my $xen, $e->{xen_append}) = split(' ', $e->{kernel}, 2);
	    ($e->{kernel}, my $initrd) = @{delete $e->{modules}};
	    $e->{xen} = grub2file($xen, $grub2dev, $fstab);
	    $e->{initrd} = grub2file($initrd, $grub2dev, $fstab);
	}
	if (my $v = delete $e->{kernel}) {
	    (my $kernel, $e->{append}) = split(' ', $v, 2);
	    $e->{append} = join(' ', grep { !/^BOOT_IMAGE=/ } split(' ', $e->{append}));
	    $e->{root} = $1 if $e->{append} =~ s/root=(\S*)\s*//;
	    $e->{kernel_or_dev} = grub2file($kernel, $grub2dev, $fstab);
	}
	my ($vga, $other) = partition { /^vga=/ } split(' ', $e->{append});
	if (@$vga) {
	    $e->{vga} = $vga->[0] =~ /vga=(.*)/ && $1;
	    $e->{append} = join(' ', @$other);
	}
    }

    $b{nowarn} = 1;
    # handle broken installkernel -r:
    if (@{$b{entries}}) {
	$b{default} = min($b{default}, scalar(@{$b{entries}}) - 1);
	$b{default} = $b{entries}[$b{default}]{label};
    }
    $b{method} = $b{gfxmenu} ? 'grub-graphic' :  'grub-menu';

    \%b;
}

sub yaboot2dev {
    my ($of_path) = @_;
    find { dev2yaboot($_) eq $of_path } map { "/dev/$_->{dev}" } fs::proc_partitions::read_raw();
}

# assumes file is in /boot
# to do: use yaboot2dev for files as well
#- example of of_path: /pci@f4000000/ata-6@d/disk@0:3,/initrd-2.6.8.1-8mdk.img
sub yaboot2file {
    my ($of_path) = @_;
    
    if ($of_path =~ /,/) {
	"$::prefix/boot/" . basename($of_path);
    } else {
	yaboot2dev($of_path);
    }
}

sub read_silo() {
    my $bootloader = read_lilo_like("/boot/silo.conf", sub {
					my ($f) = @_;
					"/boot$f";
				    });
    $bootloader->{method} = 'silo';
    $bootloader;
}
sub read_cromwell() {
    my %b;
    $b{method} = 'cromwell';
    \%b;
}
sub read_yaboot() { 
    my $bootloader = read_lilo_like("/etc/yaboot.conf", \&yaboot2file);
    $bootloader->{method} = 'yaboot';
    $bootloader;
}
sub read_lilo() {
    my $bootloader = read_lilo_like("/etc/lilo.conf", sub { $_[0] });

    delete $bootloader->{timeout} unless $bootloader->{prompt};
    $bootloader->{timeout} = $bootloader->{timeout} / 10 if $bootloader->{timeout};

    my $submethod = member($bootloader->{install}, 'text', 'menu') ? $bootloader->{install} : 'menu';
    $bootloader->{method} = "lilo-$submethod";
    
    $bootloader;
}
sub read_lilo_like {
    my ($file, $filter_file) = @_;

    my $global = 1;
    my ($e);
    my %b;
    -e "$::prefix$file" or return;
    foreach my $line (cat_("$::prefix$file")) {
	next if $line =~ /^\s*#/ || $line =~ /^\s*$/;
	my ($cmd, $v) = $line =~ /^\s*([^=\s]+)\s*(?:=\s*(.*?))?\s*$/ or log::l("unknown line in $file: $line"), next;

	if ($cmd =~ /^(?:image|other|macos|macosx|bsd|darwin)$/) {
	    $v = $filter_file->($v);
	    push @{$b{entries}}, $e = { type => $cmd, kernel_or_dev => $v };
	    $global = 0;
	} elsif ($global) {
	    if ($cmd eq 'disk' && $v =~ /(\S+)\s+bios\s*=\s*(\S+)/) {
		$b{bios}{$1} = $2;
	    } elsif ($cmd eq 'bios') {
		$b{bios}{$b{disk}} = $v;
	    } elsif ($cmd eq 'init-message') {
		$v =~ s/\\n//g; 
		$v =~ s/"//g;
		$b{'init-message'} = $v;
	    } else {
		$b{$cmd} = $v eq '' ? 1 : $v;
	    }
	} else {
	    if (($cmd eq 'map-drive' .. $cmd eq 'to') && $cmd eq 'to') {
		$e->{mapdrive}{$e->{'map-drive'}} = $v;
	    } else {
		if ($cmd eq 'initrd') {
		    $v = $filter_file->($v);
		}
		$e->{$cmd} = $v || 1;
	    }
	}
    }

    sub remove_quotes_and_spaces {
	local ($_) = @_;
	s/^\s*//; s/\s*$//;
	s/^"(.*?)"$/$1/;
	s/\\"/"/g;
	s/^\s*//; s/\s*$//; #- do it again for append=" foo"
	$_;
    }

    foreach ('append', 'root', 'default', 'raid-extra-boot') {
	$b{$_} = remove_quotes_and_spaces($b{$_}) if $b{$_};
    }
    foreach my $entry (@{$b{entries}}) {
	foreach ('append', 'root', 'label') {
	    $entry->{$_} = remove_quotes_and_spaces($entry->{$_}) if $entry->{$_};
	}
	if ($entry->{kernel_or_dev} =~ /\bmbootpack\b/) {
	    $entry->{initrd} = $entry->{kernel_or_dev};
	    $entry->{initrd} =~ s/\bmbootpack/initrd/;
	    $entry->{kernel_or_dev} =~ s/\bmbootpack/vmlinuz/;
	    $entry->{kernel_or_dev} =~ s/.img$//;
	    #- assume only xen is configured with mbootpack
	    $entry->{xen} = '/boot/xen.gz';
	    $entry->{root} = $1 if $entry->{append} =~ s/root=(\S*)\s*//;
	    ($entry->{xen_append}, $entry->{append}) = split '\s*--\s*', $entry->{append}, 2;
	}
    }

    # cleanup duplicate labels (in case file is corrupted)
    @{$b{entries}} = uniq_ { $_->{label} } @{$b{entries}};

    \%b;
}

sub cleanup_entries {
    my ($bootloader) = @_;

    #- cleanup bad entries (in case file is corrupted)
    @{$bootloader->{entries}} = 
	grep { 
	    my $pb = $_->{type} eq 'image' && dirname($_->{kernel_or_dev}) eq '/boot' && ! -e "$::prefix$_->{kernel_or_dev}";
	    log::l("dropping bootloader entry $_->{label} since $_->{kernel_or_dev} doesn't exist") if $pb;
	    !$pb;
	} @{$bootloader->{entries}};
}

sub suggest_onmbr {
    my ($hd) = @_;
    
    my ($onmbr, $unsafe) = (1, 1);

    if (my $type = partition_table::raw::typeOfMBR($hd->{device})) {
	if (member($type, qw(dos dummy empty))) {
	    $unsafe = 0;
	} elsif (!member($type, qw(lilo grub))) {
	    $onmbr = 0;
	}
	log::l("bootloader::suggest_onmbr: type $type, onmbr $onmbr, unsafe $unsafe");
    }
    ($onmbr, $unsafe);
}

sub allowed_boot_parts {
    my ($bootloader, $all_hds) = @_;
    (
     @{$all_hds->{hds}},
     if_($bootloader->{method} =~ /lilo/,
	 grep { $_->{level} eq '1' } @{$all_hds->{raids}}
	),
     (grep { !isFat_or_NTFS($_) } fs::get::hds_fstab(@{$all_hds->{hds}})),
     detect_devices::floppies(),
    );
}

sub same_entries {
    my ($a, $b) = @_;

    foreach (uniq(keys %$a, keys %$b)) {
	if (member($_, 'label', 'append', 'mapdrive', 'readonly', 'makeactive')) {
	    next;
	} else {
	    next if $a->{$_} eq $b->{$_};

	    my ($inode_a, $inode_b) = map { (stat "$::prefix$_")[1] } ($a->{$_}, $b->{$_});
	    next if $inode_a && $inode_b && $inode_a == $inode_b;
	}

	log::l("entries $a->{label} do not have same $_: $a->{$_} ne $b->{$_}");
	return;
    }
    1;
}

sub add_entry {
    my ($bootloader, $v) = @_;

    my $to_add = $v;
    my $label = $v->{label};
    for (my $i = 0; $i < 10;) {
	my $conflicting = get_label($label, $bootloader);

	$to_add->{label} = $label;

	if ($conflicting) {
	    #- replacing $conflicting with $to_add
	    @{$bootloader->{entries}} = map { $_ == $conflicting ? $to_add : $_ } @{$bootloader->{entries}};

	    #- we will keep $conflicting, but not with same symlinks if used by the entry to add
	    expand_entry_symlinks($bootloader, $conflicting);
	} else {
	    #- we have found an unused label
	    push @{$bootloader->{entries}}, $to_add;
	}

	if (!$conflicting || same_entries($conflicting, $to_add)) {
	    log::l("current labels: " . join(" ", map { $_->{label} } @{$bootloader->{entries}}));
	    return $v;
	}
	$to_add = $conflicting;

	if ($to_add->{label} eq 'linux') {
	    $label = kernel_str2label(vmlinuz2kernel_str($to_add->{kernel_or_dev}), 'use_long_name');
	} else {
	    $label =~ s/^alt\d*_//;
	    $label = 'alt' . ($i++ ? $i : '') . "_$label";
	}
    }
    die 'add_entry';
}

sub expand_entry_symlinks {
    my ($bootloader, $entry) = @_;

    foreach my $kind ('kernel_or_dev', 'initrd') {
	my $old_long_name = $bootloader->{old_long_names} && $bootloader->{old_long_names}{$entry->{$kind}} or next;

	#- replace all the {$kind} using this symlink to the real file
	log::l("replacing $entry->{$kind} with $old_long_name for bootloader label $entry->{label}");
	$entry->{$kind} = $old_long_name;
    }
}

sub _do_the_symlink {
    my ($bootloader, $link, $long_name) = @_;

    my $existing_link = readlink("$::prefix$link");
    if ($existing_link && $existing_link eq $long_name) {
	#- nothing to do :)
	return;
    }

    if ($existing_link) {
	#- the symlink is going to change! 
	#- replace all the {$kind} using this symlink to the real file
	my $old_long_name = $existing_link =~ m!^/! ? $existing_link : "/boot/$existing_link";
	if (-e "$::prefix$old_long_name") {
	    $bootloader->{old_long_names}{$link} = $old_long_name;
	} else {
	    log::l("ERROR: $link points to $old_long_name which does not exist");
	}
    } elsif (-e "$::prefix$link") {
	log::l("ERROR: $link is not a symbolic link");
    }

    #- changing the symlink
    symlinkf($long_name, "$::prefix$link")
      or cp_af("$::prefix/boot/$long_name", "$::prefix$link");
}

sub cmp_kernel_versions {
    my ($va, $vb) = @_;
    my $rel_a = $va =~ s/-(.*)$// && $1;
    my $rel_b = $vb =~ s/-(.*)$// && $1;
    ($va, $vb) = map { [ split /[.-]/ ] } $va, $vb;
    my $r = 0;
    mapn_ {
	$r ||= $_[0] <=> $_[1];
    } $va, $vb;
    $r || $rel_a <=> $rel_b || $rel_a cmp $rel_b;
}

sub get_mbootpack_filename {
    my ($entry) = @_;
    my $mbootpack_file = $entry->{initrd};
    $mbootpack_file =~ s/\binitrd/mbootpack/;
    $entry->{xen} && $mbootpack_file;
}

sub build_mbootpack {
    my ($entry) = @_;

    my $mbootpack = '/usr/bin/mbootpack';
    -f $::prefix . $entry->{kernel_or_dev} && -f $::prefix . $entry->{initrd} or return;

    my $mbootpack_file = get_mbootpack_filename($entry);
    -f ($::prefix . $mbootpack_file) and return 1;

    my $error;
    my $xen_kernel = '/tmp/xen_kernel';
    my $xen_vmlinux = '/tmp/xen_vmlinux';
    my $_b = before_leaving { unlink $::prefix . $_ foreach $xen_kernel, $xen_vmlinux };
    run_program::rooted($::prefix, '/bin/gzip', '>', $xen_kernel, '2>', \$error, '-dc', $entry->{xen})
      or die "unable to uncompress xen kernel";
    run_program::rooted($::prefix, '/bin/gzip', '>', $xen_vmlinux, '2>', \$error, '-dc', $entry->{kernel_or_dev})
      or die "unable to uncompress xen vmlinuz";

    run_program::rooted($::prefix, $mbootpack,
                        "2>", \$error,
                        '-o', $mbootpack_file,
                        '-m', $xen_vmlinux,
                        '-m', $entry->{initrd},
                        $xen_kernel)
      or die "mbootpack failed: $error";

    1;
}

sub add_kernel {
    my ($bootloader, $kernel_str, $v, $b_nolink, $b_no_initrd) = @_;

    #- eg: for /boot/vmlinuz-2.6.17-13mdvxen0 (pkg kernel-xen0-xxx) 
    #-      or /boot/vmlinuz-2.6.18-xen (pkg kernel-xen-uptodate)
    if ($kernel_str->{version} =~ /xen/ && -f '/boot/xen.gz') {
	$v->{xen} = '/boot/xen.gz';
    }

    add2hash($v,
	     {
	      type => 'image',
	      label => kernel_str2label($kernel_str),
	     });

    #- normalize append and handle special options
    {
	my ($simple, $dict) = unpack_append("$bootloader->{perImageAppend} $v->{append}");
	if ($v->{label} eq 'failsafe') {
	    #- perImageAppend contains resume=/dev/xxx which we don't want
	    @$dict = grep { $_->[0] ne 'resume' } @$dict;
	}
	if (-e "$::prefix/sbin/udev" && cmp_kernel_versions($kernel_str->{version_no_ext}, '2.6.8') >= 0) {
	    log::l("it is a recent kernel, so we remove any existing devfs= kernel option to enable udev");
	    @$dict = grep { $_->[0] ne 'devfs' } @$dict;
	}
	$v->{append} = pack_append($simple, $dict);
    }

    #- new versions of yaboot do not handle symlinks
    $b_nolink ||= arch() =~ /ppc/;

    $b_nolink ||= $kernel_str->{use_long_name};

    my $vmlinuz_long = kernel_str2vmlinuz_long($kernel_str);
    $v->{kernel_or_dev} = "/boot/$vmlinuz_long";
    -e "$::prefix$v->{kernel_or_dev}" or log::l("unable to find kernel image $::prefix$v->{kernel_or_dev}"), return;
    if (!$b_nolink) {
	$v->{kernel_or_dev} = '/boot/' . kernel_str2vmlinuz_short($kernel_str);
	_do_the_symlink($bootloader, $v->{kernel_or_dev}, $vmlinuz_long);
    }
    log::l("adding $v->{kernel_or_dev}");

    if (!$b_no_initrd) {
	my $initrd_long = kernel_str2initrd_long($kernel_str);
	$v->{initrd} = mkinitrd($kernel_str->{version}, $bootloader, $v, "/boot/$initrd_long");
	if ($v->{initrd} && !$b_nolink) {
	    $v->{initrd} = '/boot/' . kernel_str2initrd_short($kernel_str);
	    _do_the_symlink($bootloader, $v->{initrd}, $initrd_long);
	}
    }

    add_entry($bootloader, $v);
}

sub rebuild_initrds {
    my ($bootloader) = @_;

    my %done;
    foreach my $v (grep { $_->{initrd} } @{$bootloader->{entries}}) {
	my $kernel_str = vmlinuz2kernel_str($v->{kernel_or_dev}) or next;
	my $initrd_long = '/boot/' . kernel_str2initrd_long($kernel_str);
	next if $done{$initrd_long}++;

	rebuild_initrd($kernel_str->{version}, $bootloader, $v, $initrd_long);
    }
}

sub duplicate_kernel_entry {
    my ($bootloader, $new_label) = @_;

    get_label($new_label, $bootloader) and return;

    my $entry = { %{ get_label('linux', $bootloader) }, label => $new_label };
    add_entry($bootloader, $entry);
}

my $uniq_dict_appends = join('|', qw(devfs acpi pci resume PROFILE XFree));

sub unpack_append {
    my ($s) = @_;
    my @l = "$s " =~ /((?:[^"\s]+|".*?")*)\s+/g;
    [ grep { !/=/ } @l ], [ map { if_(/(.*?)=(.*)/, [$1, $2]) } @l ];
}
sub pack_append {
    my ($simple, $dict) = @_;

    #- normalize
    $simple = [ reverse(uniq(reverse @$simple)) ];
    $dict = [ reverse(uniq_ { 
	my ($k, $v) = @$_; 
	$k =~ /^($uniq_dict_appends)$/ ? $k : "$k=$v";
    } reverse @$dict) ];

    join(' ', @$simple, map { "$_->[0]=$_->[1]" } @$dict);
}

sub modify_append {
    my ($b, $f) = @_;

    my @l = grep { $_->{type} eq 'image' && !($::isStandalone && $_->{label} eq 'failsafe') } @{$b->{entries}};

    foreach (\$b->{perImageAppend}, map { \$_->{append} } @l) {
	my ($simple, $dict) = unpack_append($$_);
	$f->($simple, $dict);
	$$_ = pack_append($simple, $dict);
	log::l("modify_append: $$_");
    }
}

sub append__mem_is_memsize { $_[0] =~ /^\d+[kM]?$/i }

sub get_append_simple {
    my ($b, $key) = @_;
    my ($simple, $_dict) = unpack_append($b->{perImageAppend});
    member($key, @$simple);
}
sub get_append_with_key {
    my ($b, $key) = @_;
    my ($_simple, $dict) = unpack_append($b->{perImageAppend});
    my @l = map { $_->[1] } grep { $_->[0] eq $key } @$dict;

    log::l("more than one $key in $b->{perImageAppend}") if @l > 1;
    $l[0];
}
sub remove_append_simple {
    my ($b, $key) = @_;
    modify_append($b, sub {
	my ($simple, $_dict) = @_;
	@$simple = grep { $_ ne $key } @$simple;
    });
}
sub set_append_with_key {
    my ($b, $key, $val) = @_;

    modify_append($b, sub {
	my ($_simple, $dict) = @_;

	if ($val eq '') {
	    @$dict = grep { $_->[0] ne $key } @$dict;
	} else {
	    push @$dict, [ $key, $val ];
	}
    });
}
sub set_append_simple {
    my ($b, $key) = @_;

    modify_append($b, sub {
	my ($simple, $_dict) = @_;
	@$simple = uniq(@$simple, $key);
    });
}
sub may_append_with_key {
    my ($b, $key, $val) = @_;
    set_append_with_key($b, $key, $val) if !get_append_with_key($b, $key);
}

sub get_append_memsize {
    my ($b) = @_;
    my ($_simple, $dict) = unpack_append($b->{perImageAppend});
    my $e = find { $_->[0] eq 'mem' && append__mem_is_memsize($_->[1]) } @$dict;
    $e && $e->[1];
}

sub set_append_memsize {
    my ($b, $memsize) = @_;

    modify_append($b, sub {
	my ($_simple, $dict) = @_;

	@$dict = grep { $_->[0] ne 'mem' || !append__mem_is_memsize($_->[1]) } @$dict;
	push @$dict, [ mem => $memsize ] if $memsize;
    });
}

sub get_append_netprofile {
    my ($e) = @_;
    my ($simple, $dict) = unpack_append($e->{append});
    my ($p, $dict_) = partition { $_->[0] eq 'PROFILE' } @$dict;
    pack_append($simple, $dict_), $p->[0][1];
}
sub set_append_netprofile {
    my ($e, $append, $profile) = @_;
    my ($simple, $dict) = unpack_append($append);
    push @$dict, [ 'PROFILE', $profile ] if $profile;
    $e->{append} = pack_append($simple, $dict);
}

sub configure_entry {
    my ($bootloader, $entry) = @_;
    $entry->{type} eq 'image' or return;

    if (my $kernel_str = vmlinuz2kernel_str($entry->{kernel_or_dev})) {
	$entry->{initrd} = 
	  mkinitrd($kernel_str->{version}, $bootloader, $entry,
		   $entry->{initrd} || '/boot/' . kernel_str2initrd_short($kernel_str));
    }
}

sub get_kernels_and_labels_before_kernel_remove {
    my ($to_remove_kernel) = @_;
    my @kernels = grep { $_ ne $to_remove_kernel } installed_vmlinuz();
    map { kernel_str2label($_) => $_ } get_kernel_labels(\@kernels);
}

sub get_kernels_and_labels {
    my ($b_prefer_24) = @_;
    get_kernel_labels([ installed_vmlinuz() ], $b_prefer_24);
}

sub get_kernel_labels {
    my ($kernels, $b_prefer_24) = @_;
    
    my @kernels_str = 
      sort { cmp_kernel_versions($b->{version_no_ext}, $a->{version_no_ext}) } 
      grep { -d "$::prefix/lib/modules/$_->{version}" }
      map { vmlinuz2kernel_str($_) } @$kernels;

    if ($b_prefer_24) {
	my ($kernel_24, $other) = partition { $_->{ext} eq '' && $_->{version} =~ /^\Q2.4/ } @kernels_str;
	@kernels_str = (@$kernel_24, @$other);
    }

    $kernels_str[0]{ext} = '';

    my %labels;
    foreach (@kernels_str) {
	if ($labels{$_->{ext}}) {
	    $_->{use_long_name} = 1;
	} else {
	    $labels{$_->{ext}} = 1;
	}
    }
    @kernels_str;
}

sub short_ext {
    my ($kernel_str) = @_;

    my $short_ext = {
	'i586-up-1GB' => 'i586',
	'i686-up-4GB' => '4GB',
	'xen0' => 'xen',
    }->{$kernel_str->{ext}};

    $short_ext || $kernel_str->{ext};
}

# deprecated, only for compatibility (nov 2007)
sub sanitize_ver {    
    my ($_name, $kernel_str) = @_;
    _sanitize_ver($kernel_str);
}

sub _sanitize_ver {
    my ($kernel_str) = @_;

    my $name = $kernel_str->{basename};
    $name = '' if $name eq 'vmlinuz';

    my $v = $kernel_str->{version_no_ext};
    if ($v =~ s/-\d+\.mm\././) {
	$name = join(' ', grep { $_ } $name, 'multimedia');
    }

    $v =~ s!md[kv]$!!;
    $v =~ s!-0\.(pre|rc)(\d+)\.!$1$2-!;

    my $return = join(' ', grep { $_ } $name, short_ext($kernel_str), $v);

    length($return) < 30 or $return =~ s!secure!sec!;
    length($return) < 30 or $return =~ s!enterprise!ent!;
    length($return) < 30 or $return =~ s!multimedia!mm!;

    $return;
}

sub suggest_message_text {
    my ($bootloader) = @_;

    if (!$bootloader->{message} && !$bootloader->{message_text} && arch() !~ /ia64/) {
	my $msg_en =
#-PO: these messages will be displayed at boot time in the BIOS, use only ASCII (7bit)
N_("Welcome to the operating system chooser!

Choose an operating system from the list above or
wait for default boot.

");
	my $msg = translate($msg_en);
	#- use the english version if more than 40% of 8bits chars
	#- else, use the translation but force a conversion to ascii
	#- to be sure there won't be undisplayable characters
	if (int(grep { $_ & 0x80 } unpack "c*", $msg) / length($msg) > 0.4) {
	    $msg = $msg_en;
	} else {
	    $msg = Locale::gettext::iconv($msg, "utf-8", "ascii//TRANSLIT");
	}
	$bootloader->{message_text} = $msg;
    }
}

sub suggest {
    my ($bootloader, $all_hds, %options) = @_;
    my $fstab = [ fs::get::fstab($all_hds) ];
    my $root_part = fs::get::root($fstab);
    my $root = isLoopback($root_part) ? '/dev/loop7' : fs::wild_device::from_part('', $root_part);
    my $boot = fs::get::root($fstab, 'boot')->{device};
    #- PPC xfs module requires enlarged initrd
    my $xfsroot = $root_part->{fs_type} eq 'xfs';

    my ($onmbr, $unsafe) = $bootloader->{crushMbr} ? (1, 0) : suggest_onmbr($all_hds->{hds}[0]);
    add2hash_($bootloader, arch() =~ /ppc/ ?
	{
	 defaultos => "linux",
	 entries => [],
	 'init-message' => "Welcome to Mandriva Linux!",
	 delay => 30,	#- OpenFirmware delay
	 timeout => 50,
	 enableofboot => 1,
	 enablecdboot => 1,
	   if_(detect_devices::get_mac_model() =~ /IBM/,
	 boot => "/dev/sda1",
           ),
	 xfsroot => $xfsroot,
	} :
	{
	 bootUnsafe => $unsafe,
	 entries => [],
	 timeout => $onmbr && 10,
	 nowarn => 1,
	   if_(arch() !~ /ia64/,
	 boot => "/dev/" . ($onmbr ? $all_hds->{hds}[0]{device} : $boot),
	 map => "/boot/map",
	 compact => 1,
	 color => 'black/cyan yellow/cyan',
	 'menu-scheme' => 'wb:bw:wb:bw'
         ),
	});

    suggest_message_text($bootloader);

    add2hash_($bootloader, { memsize => $1 }) if cat_("/proc/cmdline") =~ /\bmem=(\d+[KkMm]?)(?:\s.*)?$/;
    if (my ($s, $port, $speed) = cat_("/proc/cmdline") =~ /console=(ttyS(\d),(\d+)\S*)/) {
	log::l("serial console $s $port $speed");
	set_append_with_key($bootloader, console => $s);
	any::set_login_serial_console($port, $speed);
    }

    my @kernels = get_kernels_and_labels() or die "no kernel installed";

    foreach my $kernel (@kernels) {
	my $e = add_kernel($bootloader, $kernel,
	       {
		root => $root,
		if_($options{vga_fb} && $kernel->{ext} eq '', vga => $options{vga_fb}), #- using framebuffer
		if_($options{vga_fb} && $options{quiet}, append => "splash=silent"),
	       });

	if ($options{vga_fb} && $e->{label} eq 'linux') {
	    add_kernel($bootloader, $kernel, { root => $root, label => 'linux-nonfb' });
	}
    }

    #- remove existing failsafe, do not care if the previous one was modified by the user?
    @{$bootloader->{entries}} = grep { $_->{label} ne 'failsafe' } @{$bootloader->{entries}};

    add_kernel($bootloader, $kernels[0],
	       { root => $root, label => 'failsafe', append => 'failsafe' });

    if (arch() =~ /ppc/) {
	#- if we identified a MacOS partition earlier - add it
	if (defined $partition_table::mac::macos_part) {
	    add_entry($bootloader,
		      {
		       type => "macos",
		       kernel_or_dev => $partition_table::mac::macos_part
		      });
	}
    } elsif (arch() !~ /ia64/) {
	#- search for dos (or windows) boot partition. Do not look in extended partitions!
	my @windows_boot_parts =
	  grep { isFat_or_NTFS($_) && member(fs::type::fs_type_from_magic($_), 'vfat', 'ntfs')
		   && fs::type::part2type_name($_) !~ /^Hidden/;
	     }
	    map { @{$_->{primary}{normal}} } @{$all_hds->{hds}};
	each_index {
	    add_entry($bootloader,
		      {
		       type => 'other',
		       kernel_or_dev => "/dev/$_->{device}",
		       label => 'windows' . ($::i || ''),
		       table => "/dev/$_->{rootDevice}",
		       makeactive => 1,
		      });
	} @windows_boot_parts;
    }

    my @preferred = map { "linux-$_" } 'p3-smp-64GB', 'secure', 'enterprise', 'smp', 'i686-up-4GB';
    if (my $preferred = find { get_label($_, $bootloader) } @preferred) {
	$bootloader->{default} ||= $preferred;
    }
    $bootloader->{default} ||= "linux";
    $bootloader->{method} ||= first(method_choices($all_hds, 1));
}

sub detect_main_method {
    my ($all_hds) = @_;
    my $bootloader = &read($all_hds);
    $bootloader && main_method($bootloader->{method});
}

sub main_method {
    my ($method) = @_;
    $method =~ /(\w+)/ && $1;
}

sub config_files() {
    my %files = (
	lilo => '/etc/lilo.conf',
	grub => '/boot/grub/menu.lst',
	grub_install => '/boot/grub/install.sh',
    );
    
    map_each { 
	my $content = cat_("$::prefix/$::b");
	{ main_method => main_method($::a), name => $::a, file => $::b, content => $content };
    } %files;
}

sub method2text {
    my ($method) = @_;
    +{
	'lilo-menu'    => N("LILO with text menu"),
	'grub-graphic' => N("GRUB with graphical menu"),
	'grub-menu'    => N("GRUB with text menu"),
	'yaboot'       => N("Yaboot"),
	'silo'         => N("SILO"),
    }->{$method};
}

sub method_choices_raw {
    my ($b_prefix_mounted) = @_;
    detect_devices::is_xbox() ? 'cromwell' :
    arch() =~ /ppc/ ? 'yaboot' : 
    arch() =~ /ia64/ ? 'lilo' : 
    arch() =~ /sparc/ ? 'silo' : 
      (
       if_(!$b_prefix_mounted || whereis_binary('grub', $::prefix), 
	   'grub-graphic', 'grub-menu'),
       if_(!$b_prefix_mounted || whereis_binary('lilo', $::prefix), 
	   'lilo-menu'),
      );
}
sub method_choices {
    my ($all_hds, $b_prefix_mounted) = @_;
    my $fstab = [ fs::get::fstab($all_hds) ];
    my $root_part = fs::get::root($fstab);
    my $boot_part = fs::get::root($fstab, 'boot');
    my $have_dmraid = find { fs::type::is_dmraid($_) } @{$all_hds->{hds}};

    grep {
	!(/lilo/ && (isLoopback($root_part) || $have_dmraid))
	  && !(/grub/ && isRAID($boot_part))
	  && !(/grub-graphic/ && cat_("/proc/cmdline") =~ /console=ttyS/);
    } method_choices_raw($b_prefix_mounted);
}
sub main_method_choices {
    my ($b_prefix_mounted) = @_;
    uniq(map { main_method($_) } method_choices_raw($b_prefix_mounted));
}
sub configured_main_methods() {
    my @bad_main_methods = map { if_(!$_->{content}, $_->{main_method}) } config_files();
    difference2([ main_method_choices(1) ], \@bad_main_methods);
}

sub keytable {
    my ($f) = @_;
    $f or return;

    if ($f !~ /\.klt$/) {
	my $file = "/boot/$f.klt";
	run_program::rooted($::prefix, "keytab-lilo.pl", ">", $file, $f) or return;
	$f = $file;
    }
    -r "$::prefix/$f" && $f;
}


sub create_link_source() {
    #- we simply do it for all kernels :)
    #- so this can be used in %post of kernel and also of kernel-source
    foreach (all("$::prefix/usr/src")) {
	my ($version) = /^linux-(\d+\.\d+.*)/ or next;
	foreach (glob("$::prefix/lib/modules/$version*")) {
	    -d $_ or next;
	    log::l("creating symlink $_/build");
	    symlink "/usr/src/linux-$version", "$_/build";
	    log::l("creating symlink $_/source");
	    symlink "/usr/src/linux-$version", "$_/source";
	}
    }
}

sub dev2yaboot {
    my ($dev) = @_;

    devices::make("$::prefix$dev"); #- create it in the chroot

    my $of_dev;
    run_program::rooted_or_die($::prefix, "/usr/sbin/ofpath", ">", \$of_dev, $dev);
    chomp($of_dev);
    log::l("OF Device: $of_dev");
    $of_dev;
}

sub check_enough_space() {
    my $e = "$::prefix/boot/.enough_space";
    output $e, 1; -s $e or die N("not enough room in /boot");
    unlink $e;
}

sub write_yaboot {
    my ($bootloader, $all_hds) = @_;

    my $fstab = [ fs::get::fstab($all_hds) ]; 

    my $file2yaboot = sub {
	my ($part, $file) = fs::get::file2part($fstab, $_[0]);
	dev2yaboot('/dev/' . $part->{device}) . "," . $file;
    };

    #- do not write yaboot.conf for old-world macs
    my $mac_type = detect_devices::get_mac_model();
    return if $mac_type =~ /Power Macintosh/;

    $bootloader->{prompt} ||= $bootloader->{timeout};

    if ($bootloader->{message_text}) {
	eval { output("$::prefix/boot/message", $bootloader->{message_text}) }
	  and $bootloader->{message} = '/boot/message';
    }

    my @conf;

    if (!get_label($bootloader->{default}, $bootloader)) {
	log::l("default bootloader entry $bootloader->{default} is invalid, choosing another one");
	$bootloader->{default} = $bootloader->{entries}[0]{label};
    }
    push @conf, "# yaboot.conf - generated by DrakX/drakboot";
    push @conf, "# WARNING: do not forget to run ybin after modifying this file\n";
    push @conf, "default=" . make_label_lilo_compatible($bootloader->{default}) if $bootloader->{default};
    push @conf, sprintf('init-message="\n%s\n"', $bootloader->{'init-message'}) if $bootloader->{'init-message'};

    if ($bootloader->{boot}) {
	push @conf, "boot=$bootloader->{boot}";
	push @conf, "ofboot=" . dev2yaboot($bootloader->{boot}) if $mac_type !~ /IBM/;
    } else {
	die "no bootstrap partition defined.";
    }

    push @conf, map { "$_=$bootloader->{$_}" } grep { $bootloader->{$_} } (qw(delay timeout), if_($mac_type !~ /IBM/, 'defaultos'));
    push @conf, "install=/usr/lib/yaboot/yaboot";
    if ($mac_type =~ /IBM/) {
	push @conf, 'nonvram';
    } else {
	push @conf, 'magicboot=/usr/lib/yaboot/ofboot';
	push @conf, grep { $bootloader->{$_} } qw(enablecdboot enableofboot);
    }
    foreach my $entry (@{$bootloader->{entries}}) {

	if ($entry->{type} eq "image") {
	    push @conf, "$entry->{type}=" . $file2yaboot->($entry->{kernel_or_dev});
	    my @entry_conf;
	    push @entry_conf, "label=" . make_label_lilo_compatible($entry->{label});
	    push @entry_conf, "root=$entry->{root}";
	    push @entry_conf, "initrd=" . $file2yaboot->($entry->{initrd}) if $entry->{initrd};
	    #- xfs module on PPC requires larger initrd - say 6MB?
	    push @entry_conf, "initrd-size=6144" if $bootloader->{xfsroot};
	    push @entry_conf, qq(append=" $entry->{append}") if $entry->{append};
	    push @entry_conf, grep { $entry->{$_} } qw(read-write read-only);
	    push @conf, map { "\t$_" } @entry_conf;
	} else {
	    my $of_dev = dev2yaboot($entry->{kernel_or_dev});
	    push @conf, "$entry->{type}=$of_dev";
	}
    }
    my $f = "$::prefix/etc/yaboot.conf";
    log::l("writing yaboot config to $f");
    renamef($f, "$f.old");
    output($f, map { "$_\n" } @conf);
}

sub install_yaboot {
    my ($bootloader, $all_hds) = @_;
    log::l("Installing boot loader...");
    write_yaboot($bootloader, $all_hds);
    when_config_changed_yaboot($bootloader);
}
sub when_config_changed_yaboot {
    my ($bootloader) = @_;
    $::testing and return;
    if (defined $partition_table::mac::new_bootstrap) {
	run_program::run("hformat", $bootloader->{boot}) or die "hformat failed";
    }	
    my $error;
    run_program::rooted($::prefix, "/usr/sbin/ybin", "2>", \$error) or die "ybin failed: $error";
}

sub install_cromwell { 
    my ($_bootloader, $_all_hds) = @_;
    log::l("XBox/Cromwell - nothing to install...");
}
sub write_cromwell { 
    my ($_bootloader, $_all_hds) = @_;
    log::l("XBox/Cromwell - nothing to write...");
}
sub when_config_changed_cromwell {
    my ($_bootloader) = @_;
    log::l("XBox/Cromwell - nothing to do...");
}

sub simplify_label {
    my ($label) = @_;

    length($label) < 31 or $label =~ s/\.//g;

    $label = substr($label, 0, 31); #- lilo does not handle more than 31 char long labels
    $label =~ s/ /_/g; #- lilo does not support blank character in image names, labels or aliases
    $label;
}

sub make_label_lilo_compatible {
    my ($label) = @_;
    '"' . simplify_label($label) . '"';
}

sub write_lilo {
    my ($bootloader, $all_hds) = @_;
    $bootloader->{prompt} ||= $bootloader->{timeout};

    my $file2fullname = sub {
	my ($file) = @_;
	if (arch() =~ /ia64/) {
	    my $fstab = [ fs::get::fstab($all_hds) ];
	    (my $part, $file) = fs::get::file2part($fstab, $file);
	    my %hds = map_index { $_ => "hd$::i" } map { $_->{device} } 
	      sort { 
		  my ($a_is_fat, $b_is_fat) = ($a->{fs_type} eq 'vfat', $b->{fs_type} eq 'vfat');
		  $a_is_fat <=> $b_is_fat || $a->{device} cmp $b->{device};
	      } @$fstab;
	    $hds{$part->{device}} . ":" . $file;
	} else {
	    $file;
	}
    };

    my $quotes = sub {
	my ($s) = @_;
	$s =~ s/"/\\"/g;
	qq("$s");
    };

    my $quotes_if_needed = sub {
	my ($s) = @_;
	$s =~ /["=\s]/ ? $quotes->($s) : $s;
    };
    

    my @sorted_hds = sort_hds_according_to_bios($bootloader, $all_hds);

    if (is_empty_hash_ref($bootloader->{bios} ||= {}) && $all_hds->{hds}[0] != $sorted_hds[0]) {
	log::l("Since we're booting on $sorted_hds[0]{device}, make it bios=0x80");
	$bootloader->{bios} = { "/dev/$sorted_hds[0]{device}" => '0x80' };
    }

    my @conf;

    #- normalize: RESTRICTED is only valid if PASSWORD is set
    delete $bootloader->{restricted} if !$bootloader->{password};
    foreach my $entry (@{$bootloader->{entries}}) {
	delete $entry->{restricted} if !$entry->{password} && !$bootloader->{password};
    }
    if (get_append_with_key($bootloader, 'console') =~ /ttyS(.*)/) {
	$bootloader->{serial} ||= $1;
    }

    if (!get_label($bootloader->{default}, $bootloader)) {
	log::l("default bootloader entry $bootloader->{default} is invalid, choosing another one");
	$bootloader->{default} = $bootloader->{entries}[0]{label};
    }
    push @conf, "# File generated by DrakX/drakboot";
    push @conf, "# WARNING: do not forget to run lilo after modifying this file\n";
    push @conf, "default=" . make_label_lilo_compatible($bootloader->{default}) if $bootloader->{default};
    push @conf, map { $_ . '=' . $quotes_if_needed->($bootloader->{$_}) } grep { $bootloader->{$_} } qw(boot root map install serial vga keytable raid-extra-boot menu-scheme vmdefault);
    push @conf, grep { $bootloader->{$_} } qw(linear geometric compact prompt nowarn restricted static-bios-codes);
    push @conf, "append=" . $quotes->($bootloader->{append}) if $bootloader->{append};
    push @conf, "password=" . $bootloader->{password} if $bootloader->{password}; #- also done by msec
    push @conf, "timeout=" . round(10 * $bootloader->{timeout}) if $bootloader->{timeout};
    
    push @conf, "message=$bootloader->{message}" if $bootloader->{message};

    push @conf, "ignore-table" if any { $_->{unsafe} && $_->{table} } @{$bootloader->{entries}};

    push @conf, map_each { "disk=$::a bios=$::b" } %{$bootloader->{bios}};

    foreach my $entry (@{$bootloader->{entries}}) {
	my $mbootpack_file = get_mbootpack_filename($entry);
        if ($mbootpack_file && !build_mbootpack($entry)) {
	    warn "mbootpack is required for xen but unavailable, skipping\n";
	    next;
	}

	push @conf, "$entry->{type}=" . $file2fullname->($mbootpack_file || $entry->{kernel_or_dev});
	my @entry_conf;
	push @entry_conf, "label=" . make_label_lilo_compatible($entry->{label}) if $entry->{label};

	if ($entry->{type} eq "image") {		
	    push @entry_conf, 'root=' . $quotes_if_needed->($entry->{root}) if $entry->{root} && !$entry->{xen};
	    push @entry_conf, "initrd=" . $file2fullname->($entry->{initrd}) if $entry->{initrd} && !$mbootpack_file;
	    my $append = join(' ', if_($entry->{xen_append}, $entry->{xen_append}),
	                           if_($entry->{xen}, '--', 'root=' . $entry->{root}),
	                           if_($entry->{append}, $entry->{append}));
	    push @entry_conf, "append=" . $quotes->($append) if $append;
	    push @entry_conf, "vga=$entry->{vga}" if $entry->{vga};
	    push @entry_conf, grep { $entry->{$_} } qw(read-write read-only optional);
	} else {
	    delete $entry->{unsafe} if $entry->{table}; #- we can't have both
	    push @entry_conf, map { "$_=$entry->{$_}" } grep { $entry->{$_} } qw(table boot-as);
	    push @entry_conf, grep { $entry->{$_} } qw(unsafe master-boot);
		
	    if ($entry->{table}) {
		#- hum, things like table=c: are needed for some os2 cases,
		#- in that case $hd below is undef
		my $hd = fs::get::device2part($entry->{table}, $all_hds->{hds});
		if ($hd && $hd != $sorted_hds[0]) {		       
		    #- boot off the nth drive, so reverse the BIOS maps
		    my $nb = sprintf("0x%x", 0x80 + (find_index { $hd == $_ } @sorted_hds));
		    $entry->{mapdrive} ||= { '0x80' => $nb, $nb => '0x80' }; 
		}
	    }
	    if ($entry->{mapdrive}) {
		push @entry_conf, map_each { "map-drive=$::a", "   to=$::b" } %{$entry->{mapdrive}};
	    }
	}
	push @entry_conf, "password=$entry->{password}" if $entry->{password};
	push @entry_conf, grep { $entry->{$_} } qw(restricted vmwarn vmdisable);

	push @conf, map { "\t$_" } @entry_conf;
    }
    my $f = arch() =~ /ia64/ ? "$::prefix/boot/efi/elilo.conf" : "$::prefix/etc/lilo.conf";

    log::l("writing lilo config to $f");
    renamef($f, "$f.old");
    output_with_perm($f, $bootloader->{password} ? 0600 : 0644, map { "$_\n" } @conf);
}

sub install_lilo {
    my ($bootloader, $all_hds) = @_;

    if (my ($install) = $bootloader->{method} =~ /lilo-(text|menu)/) {
	$bootloader->{install} = $install;
    } else {
	delete $bootloader->{install};
    }
    if ($bootloader->{message_text}) {
	output("$::prefix/boot/message-text", $bootloader->{message_text});
    }
    my $message = "message-text";
    if (-r "$::prefix/boot/$message") {
	symlinkf $message, "$::prefix/boot/message";
	$bootloader->{message} = '/boot/message';
    }

    #- ensure message does not contain the old graphic format
    if ($bootloader->{message} && -s "$::prefix$bootloader->{message}" > 65_000) {
	output("$::prefix$bootloader->{message}", '');
    }

    write_lilo($bootloader, $all_hds);

    when_config_changed_lilo($bootloader);

    configure_kdm_BootManager('Lilo');
}

sub install_raw_lilo {
    my ($o_force_answer) = @_;

    my $error;
    my $answer = $o_force_answer || '';
    run_program::rooted($::prefix, "echo $answer | lilo", '2>', \$error) or die "lilo failed: $error";
}

sub when_config_changed_lilo {
    my ($bootloader) = @_;
    if (!$::testing && arch() !~ /ia64/ && $bootloader->{method} =~ /lilo/) {
	log::l("Installing boot loader on $bootloader->{boot}...");
	install_raw_lilo($bootloader->{force_lilo_answer});
    }
}

#- NB: ide is lower than scsi, this is important for sort_hds_according_to_bios()
sub hd2bios_kind {
    my ($hd) = @_;
    lc(join('_', $hd->{bus}, $hd->{host}));
}

sub mixed_kind_of_disks {
    my ($hds) = @_;
    (uniq_ { hd2bios_kind($_) } @$hds) > 1;
}

sub sort_hds_according_to_bios {
    my ($bootloader, $all_hds) = @_;
    my $boot_hd = fs::get::device2part($bootloader->{first_hd_device} || $bootloader->{boot}, $all_hds->{hds}); #- $boot_hd is undefined when installing on floppy
    my $boot_kind = $boot_hd && hd2bios_kind($boot_hd);

    my $translate = sub {
	my ($hd) = @_;
	my $kind = hd2bios_kind($hd);
	$boot_hd ? ($hd == $boot_hd ? 0 : $kind eq $boot_kind ? 1 : 2) . "_$kind" : $kind;
    };
    sort { $translate->($a) cmp $translate->($b) } @{$all_hds->{hds}};
}

sub device_string2grub {
    my ($dev, $legacy_floppies, $sorted_hds) = @_;
    if (my $device = fs::get::device2part($dev, [ @$sorted_hds, fs::get::hds_fstab(@$sorted_hds) ])) {
	device2grub($device, $sorted_hds);
    } elsif (my $floppy = fs::get::device2part($dev, $legacy_floppies)) {
	my $bios = find_index { $floppy eq $_ } @$legacy_floppies;
	"(fd$bios)";
    } else {
	internal_error("unknown device $dev");
    }
}
sub device2grub {
    my ($device, $sorted_hds) = @_;

    if (isRAID($device) && $device->{level} == 1) {
	#- we can take any disk
	$device = $device->{disks}[0];
    }
    my ($hd, $part_nb) = 
      $device->{rootDevice} ?
	(fs::get::device2part($device->{rootDevice}, $sorted_hds), $device->{device} =~ /(\d+)$/) :
	$device;
    my $bios = eval { find_index { $hd eq $_ } @$sorted_hds };
    if (defined $bios) {
	my $part_string = defined $part_nb ? ',' . ($part_nb - 1) : '';    
	"(hd$bios$part_string)";
    } else {
	undef;
    }
}

sub read_grub_device_map() {
    my %grub2dev = map { m!\((.*)\)\s+/dev/(.*)$! } cat_("$::prefix/boot/grub/device.map");
    \%grub2dev;
}
sub write_grub_device_map {
    my ($legacy_floppies, $sorted_hds) = @_;
    my $f = "$::prefix/boot/grub/device.map";
    renamef($f, "$f.old");
    output($f,
	   (map_index { "(fd$::i) /dev/$_->{device}\n" } @$legacy_floppies),
	   (map_index { "(hd$::i) /dev/$_->{device}\n" } @$sorted_hds));
}

sub grub2dev_and_file {
    my ($grub_file, $grub2dev, $o_block_device) = @_;
    my ($grub_dev, $rel_file) = $grub_file =~ m!\((.*?)\)/?(.*)! or return;
    my ($hd, $part) = split(',', $grub_dev);
    $grub2dev->{$hd} or internal_error("$hd has no mapping in device.map (when translating $grub_file)");
    $part = $o_block_device ? '' : defined $part && $part + 1; #- grub wants "(hdX,Y)" where lilo just want "hdY+1"
    my $device = '/dev/' . $grub2dev->{$hd} . $part;
    $device, $rel_file;
}
sub grub2dev {
    my ($grub_file, $grub2dev, $o_block_device) = @_;
    first(grub2dev_and_file($grub_file, $grub2dev, $o_block_device));
}

# replace dummy "(hdX,Y)" in "(hdX,Y)/boot/vmlinuz..." by appropriate path if needed
sub grub2file {
    my ($grub_file, $grub2dev, $fstab) = @_;
    if (my ($device, $rel_file) = grub2dev_and_file($grub_file, $grub2dev)) {	
	if (my $part = fs::get::device2part($device, $fstab)) {
	    my $mntpoint = $part->{mntpoint} || '';
	    ($mntpoint eq '/' ? '' : $mntpoint) . '/' . $rel_file;
	} else {
	    log::l("ERROR: unknown device $device (computed from $grub_file)");
	    $grub_file;
	}
    } else {
	$grub_file;
    }
}

sub boot_copies_dir() { '/boot/copied' }
sub create_copy_in_boot {
    my ($file) = @_;

    my $s = $file;
    $s =~ s!/!_!g;
    my $file2 = boot_copies_dir() . "/$s";

    log::l("$file is not available at boot time, creating a copy ($file2)");
    mkdir_p(boot_copies_dir());
    output("$file2.link", $file . "\n");
    update_copy_in_boot("$file2.link");

    $file2;
}
sub update_copy_in_boot {
    my ($link) = @_;
    my $orig = chomp_(cat_("$::prefix$link"));
    (my $dest = $link) =~ s/\.link$// or internal_error("update_copy_in_boot: $link");
    if (-e "$::prefix$orig") {
	log::l("updating $dest from $orig");
	cp_af("$::prefix$orig", "$::prefix$dest");
    } else {
	log::l("removing $dest since $orig does not exist anymore");
	unlink "$::prefix$link", "$::prefix$orig";
    }
}

sub write_grub {
    my ($bootloader, $all_hds) = @_;

    my $fstab = [ fs::get::fstab($all_hds) ]; 
    my @legacy_floppies = detect_devices::floppies();
    my @sorted_hds = sort_hds_according_to_bios($bootloader, $all_hds);
    write_grub_device_map(\@legacy_floppies, \@sorted_hds);

    my $file2grub; $file2grub = sub {
	my ($file) = @_;
	if ($file =~ m!^\(.*\)/!) {
	    $file; #- it's already in grub format
	} else {
	    my ($part, $rel_file) = fs::get::file2part($fstab, $file, 'keep_simple_symlinks');
	    if (my $grub = device2grub($part, \@sorted_hds)) {
		$grub . $rel_file;
	    } elsif (!begins_with($file, '/boot/')) {
		log::l("$file is on device $part->{device} which is not available at boot time. Copying it");
		$file2grub->(create_copy_in_boot($file));
	    } else {
		log::l("ERROR: $file is on device $part->{device} which is not available at boot time. Defaulting to a dumb value");
		"(hd0,0)$file";
	    }
	}
    };

    if (get_append_with_key($bootloader, 'console') =~ /ttyS(\d),(\d+)/) {
	$bootloader->{serial} ||= "--unit=$1 --speed=$2";
	$bootloader->{terminal} ||= "--timeout=" . ($bootloader->{timeout} || 0) . " console serial";
    } elsif ($bootloader->{method} eq 'grub-graphic') {
	my $bin = '/usr/sbin/grub-gfxmenu';
	if ($bootloader->{gfxmenu} eq '' && -x "$::prefix/usr/sbin/grub-gfxmenu") {
	    my $locale = $::o->{locale} || do { require lang; lang::read() };
	    run_program::rooted($::prefix, $bin, '--lang', $locale->{lang}, '--update-gfxmenu');
	    $bootloader->{gfxmenu} ||= '/boot/gfxmenu';
	}
	#- not handled anymore
	delete $bootloader->{$_} foreach qw(splashimage viewport shade);
    } else {
	delete $bootloader->{gfxmenu};
    }

    {
	my @conf;

	push @conf, map { "$_ $bootloader->{$_}" } grep { $bootloader->{$_} } qw(timeout color password serial shade terminal viewport background foreground);
	push @conf, map { $_ . ' ' . $file2grub->($bootloader->{$_}) } grep { $bootloader->{$_} } qw(gfxmenu);

	eval {
	    push @conf, "default " . (find_index { $_->{label} eq $bootloader->{default} } @{$bootloader->{entries}});
	};

	foreach my $entry (@{$bootloader->{entries}}) {
	    my $title = "\ntitle $entry->{label}";

	    if ($entry->{type} eq "image") {
		push @conf, $title;
		push @conf, grep { $entry->{$_} } 'lock';
		push @conf, join(' ', 'kernel', $file2grub->($entry->{xen}), $entry->{xen_append}) if $entry->{xen};

		my $vga = $entry->{vga} || $bootloader->{vga};
		push @conf, join(' ', $entry->{xen} ? 'module' : 'kernel', 
		       $file2grub->($entry->{kernel_or_dev}),
		       $entry->{xen} ? '' : 'BOOT_IMAGE=' . simplify_label($entry->{label}),
		       if_($entry->{root}, $entry->{root} =~ /loop7/ ? "root=707" : "root=$entry->{root}"), #- special to workaround bug in kernel (see #ifdef CONFIG_BLK_DEV_LOOP)
		       $entry->{append},
		       if_($entry->{'read-write'}, 'rw'),
		       if_($vga && $vga ne "normal", "vga=$vga"));
		push @conf, "module " . $_ foreach @{$entry->{modules} || []};
		push @conf, join(' ', $entry->{xen} ? 'module' : 'initrd', $file2grub->($entry->{initrd})) if $entry->{initrd};
	    } else {
		my $dev = eval { device_string2grub($entry->{kernel_or_dev}, \@legacy_floppies, \@sorted_hds) };
		if (!$dev) {
		    log::l("dropping bad entry $entry->{label} for unknown device $entry->{kernel_or_dev}");
		    next;
		}
		push @conf, $title;
		push @conf, join(' ', $entry->{grub_noverify} ? 'rootnoverify' : 'root', $dev);

		if ($entry->{table}) {
		    if (my $hd = fs::get::device2part($entry->{table}, \@sorted_hds)) {
			if (my $bios = find_index { $hd eq $_ } @sorted_hds) {
			    #- boot off the nth drive, so reverse the BIOS maps
			    my $nb = sprintf("0x%x", 0x80 + $bios);
			    $entry->{mapdrive} ||= { '0x80' => $nb, $nb => '0x80' }; 
			}
		    }
		}
		if ($entry->{mapdrive}) {
		    push @conf, map_each { "map ($::b) ($::a)" } %{$entry->{mapdrive}};
		}
		push @conf, "makeactive" if $entry->{makeactive};
		push @conf, "chainloader +1";
	    }
	}
	my $f = "$::prefix/boot/grub/menu.lst";
	log::l("writing grub config to $f");
	renamef($f, "$f.old");
	output($f, map { "$_\n" } @conf);
    }
    {
	my $f = "$::prefix/boot/grub/install.sh";
	my $boot_dev = device_string2grub($bootloader->{boot}, \@legacy_floppies, \@sorted_hds);
	my $files_dev = device2grub(fs::get::root_($fstab, 'boot'), \@sorted_hds);
	renamef($f, "$f.old");
	output_with_perm($f, 0755,
"grub --device-map=/boot/grub/device.map --batch <<EOF
root $files_dev
setup --stage2=/boot/grub/stage2 $boot_dev
quit
EOF
");
    }

    check_enough_space();
}

sub configure_kdm_BootManager {
    my ($name) = @_;
    eval { common::update_gnomekderc_no_create("$::prefix/etc/kde/kdm/kdmrc", 'Shutdown' => (
	BootManager => $name
    )) };
}

sub sync_partition_data_to_disk {
    my ($part) = @_;

    common::sync();

    if ($part->{fs_type} eq 'xfs') {
	run_program::rooted($::prefix, 'xfs_freeze', '-f', $part->{mntpoint});
	run_program::rooted($::prefix, 'xfs_freeze', '-u', $part->{mntpoint});
    }
}

sub install_grub {
    my ($bootloader, $all_hds) = @_;

    write_grub($bootloader, $all_hds);

    if (!$::testing) {
	my @files = grep { /(stage1|stage2|_stage1_5)$/ } glob("$::prefix/lib/grub/*/*");
	cp_af(@files, "$::prefix/boot/grub");
	sync_partition_data_to_disk(fs::get::root([ fs::get::fstab($all_hds) ], 'boot'));
	install_raw_grub(); 
    }

    configure_kdm_BootManager('Grub');
}
sub install_raw_grub() {
    log::l("Installing boot loader...");
    my $error;
    run_program::rooted($::prefix, "sh", "2>", \$error, '/boot/grub/install.sh') or die "grub failed: $error";
}

sub when_config_changed_grub {
    my ($_bootloader) = @_;
    #- do not do anything

    update_copy_in_boot($_) foreach glob($::prefix . boot_copies_dir() . '/*.link');
}

sub action {
    my ($bootloader, $action, @para) = @_;

    my $main_method = main_method($bootloader->{method});
    my $f = $bootloader::{$action . '_' . $main_method} or die "unknown bootloader method $bootloader->{method} ($action)";
    $f->($bootloader, @para);
}

sub install {
    my ($bootloader, $all_hds) = @_;

    if (my $part = fs::get::device2part($bootloader->{boot}, [ fs::get::fstab($all_hds) ])) {
	die N("You can not install the bootloader on a %s partition\n", $part->{fs_type})
	  if $part->{fs_type} eq 'xfs';
    }
    $bootloader->{keytable} = keytable($bootloader->{keytable});
    action($bootloader, 'install', $all_hds);
}

sub ensure_pkg_is_installed {
    my ($do_pkgs, $bootloader) = @_;

    my $main_method = bootloader::main_method($bootloader->{method});
    if ($main_method eq 'grub' || $main_method eq 'lilo') {
	$do_pkgs->ensure_binary_is_installed($main_method, $main_method, 1) or return 0;
	if ($bootloader->{method} eq 'grub-graphic') {
	    $do_pkgs->ensure_is_installed('mandriva-gfxboot-theme', '/usr/share/gfxboot/themes/Mandriva/boot/message', 1) or return 0;
	}
    }
    1;
}

sub update_for_renumbered_partitions {
    my ($in, $renumbering, $all_hds) = @_;

    my @configs = grep { $_->{content} } config_files();
    $_->{new} = $_->{orig} = $_->{content} foreach @configs;

    my @sorted_hds; {
 	my $grub2dev = read_grub_device_map();
	map_each {
	    $sorted_hds[$1] = fs::get::device2part($::b, $all_hds->{hds}) if $::a =~ /hd(\d+)/;
	} %$grub2dev;
    }

    #- NB: we make the changes with an added string inside so that hda5 is only renamed once to hda6

    foreach (@$renumbering) {
	my ($old, $new) = @$_;
	log::l("renaming $old -> $new");
	(my $lnew = $new) =~ s/(\d+)$/__DRAKX_DONE__$1/;
	$_->{new} =~ s/\b$old/$lnew/g foreach @configs;

	any { $_->{name} eq 'grub' } @configs or next;

	my ($old_grub, $new_grub) = map { device_string2grub($_, [], \@sorted_hds) } $old, $new;
	log::l("renaming $old_grub -> $new_grub");
	(my $lnew_grub = $new_grub) =~ s/\)$/__DRAKX_DONE__)/;
	$_->{new} =~ s/\Q$old_grub/$lnew_grub/g foreach @configs;
    }

    $_->{new} =~ s/__DRAKX_DONE__//g foreach @configs;

    my @changed_configs = grep { $_->{orig} ne $_->{new} } @configs or return 1; # no need to update

    $in->ask_okcancel('', N("Your bootloader configuration must be updated because partition has been renumbered")) or return;

    foreach (@changed_configs) {
	renamef("$::prefix/$_->{file}", "$::prefix/$_->{file}.old");
	output("$::prefix/$_->{file}", $_->{new});
    }

    my $main_method = detect_main_method($all_hds);
    my @needed = map { 
	$_ eq 'grub' ? 'grub_install' : $_;
    } $main_method ? $main_method : ('lilo', 'grub');

    if (intersection(\@needed, [ map { $_->{name} } @changed_configs ])) {
	$in->ask_warn('', N("The bootloader can not be installed correctly. You have to boot rescue and choose \"%s\"", 
			    N("Re-install Boot Loader")));
    }
    1;
}

1;
415 diskdrake/interactive.pm:969 #, c-format msgid "Add to RAID" msgstr "RAID'ga qoʻshish" #: diskdrake/interactive.pm:416 diskdrake/interactive.pm:988 #, c-format msgid "Add to LVM" msgstr "LVM'ga qoʻshish" #: diskdrake/interactive.pm:417 #, c-format msgid "Use" msgstr "Foydalanish" #: diskdrake/interactive.pm:419 #, c-format msgid "Delete" msgstr "Olib tashlash" #: diskdrake/interactive.pm:420 #, c-format msgid "Remove from RAID" msgstr "RAID'dan olib tashlash" #: diskdrake/interactive.pm:421 #, c-format msgid "Remove from LVM" msgstr "LVM'dan olib tashlash" #: diskdrake/interactive.pm:422 #, c-format msgid "Remove from dm" msgstr "dm'dan olib tashlash" #: diskdrake/interactive.pm:423 #, c-format msgid "Modify RAID" msgstr "RAID'ni oʻzgartirish" #: diskdrake/interactive.pm:424 #, c-format msgid "Use for loopback" msgstr "Loopback uchun ishlatish" #: diskdrake/interactive.pm:434 #, c-format msgid "Create" msgstr "Yaratish" #: diskdrake/interactive.pm:456 #, c-format msgid "Failed to mount partition" msgstr "Disk qismini ulab boʻlmadi" #: diskdrake/interactive.pm:490 diskdrake/interactive.pm:492 #, c-format msgid "Create a new partition" msgstr "Yangi disk qismi yaratish" #: diskdrake/interactive.pm:494 #, c-format msgid "Start sector: " msgstr "Boshlangʻich sektor: " #: diskdrake/interactive.pm:497 diskdrake/interactive.pm:1073 #, c-format msgid "Size in MB: " msgstr "Hajmi (Mb): " #: diskdrake/interactive.pm:499 diskdrake/interactive.pm:1074 #, c-format msgid "Filesystem type: " msgstr "Fayl tizimi turi: " #: diskdrake/interactive.pm:505 #, c-format msgid "Preference: " msgstr "Afzal koʻrish: " #: diskdrake/interactive.pm:508 #, c-format msgid "Logical volume name " msgstr "Logik disk qismi nomi " #: diskdrake/interactive.pm:510 #, fuzzy, c-format msgid "Encrypt partition" msgstr "Shifrlash algoritmi" #: diskdrake/interactive.pm:511 #, fuzzy, c-format msgid "Encryption key " msgstr "Shifrlash kaliti" #: diskdrake/interactive.pm:512 diskdrake/interactive.pm:1501 #, c-format msgid "Encryption key (again)" msgstr "Shifrlash kaliti (yana)" #: diskdrake/interactive.pm:524 diskdrake/interactive.pm:1497 #, c-format msgid "The encryption keys do not match" msgstr "Shifrlar kalitlari mos kelmaydi" #: diskdrake/interactive.pm:525 #, fuzzy, c-format msgid "Missing encryption key" msgstr "Fayl tizimining shifrlash kaliti" #: diskdrake/interactive.pm:545 #, c-format msgid "" "You cannot create a new partition\n" "(since you reached the maximal number of primary partitions).\n" "First remove a primary partition and create an extended partition." msgstr "" "Yangi qismni yaratib boʻlmaydi\n" "(chunki siz diskning asosiy qismlarining maksimal soniga yetdingiz).\n" "Avvalo diskning asosiy qismini olib tanshlang keyin diskning kengaytirilgan " "qismini yarating." #: diskdrake/interactive.pm:572 diskdrake/interactive.pm:1292 #: fs/partitioning.pm:48 #, c-format msgid "Check for bad blocks?" msgstr "Xato bloklarni tekshiraymi?" #: diskdrake/interactive.pm:603 #, c-format msgid "Remove the loopback file?" msgstr "Loopback fayli olib tashlansinmi?" #: diskdrake/interactive.pm:626 #, c-format msgid "" "After changing type of partition %s, all data on this partition will be lost" msgstr "" "Diskning %s qismining turini oʻzgartirishdan keyin undagi hamma maʼlumot " "yoʻqoladi" #: diskdrake/interactive.pm:642 #, c-format msgid "Change partition type" msgstr "Disk qismi turini oʻzgartirish" #: diskdrake/interactive.pm:644 diskdrake/removable.pm:47 #, c-format msgid "Which filesystem do you want?" msgstr "Sizga qaysi fayl tizimi kerak?" #: diskdrake/interactive.pm:651 #, c-format msgid "Switching from %s to %s" msgstr "%s dan %s ga oʻtish" #: diskdrake/interactive.pm:686 #, c-format msgid "Set volume label" msgstr "" #: diskdrake/interactive.pm:688 #, c-format msgid "Beware, this will be written to disk as soon as you validate!" msgstr "Diqqat, tekshirishdan keyin ushbu maʼlumotlar diskka yoziladi!" #: diskdrake/interactive.pm:689 #, c-format msgid "Beware, this will be written to disk only after formatting!" msgstr "Diqqat, ushbu maʼlumotlar diskka formatlangandan keyin yoziladi!" #: diskdrake/interactive.pm:691 #, c-format msgid "Which volume label?" msgstr "" #: diskdrake/interactive.pm:692 #, c-format msgid "Label:" msgstr "Yorliq:" #: diskdrake/interactive.pm:713 #, c-format msgid "Where do you want to mount the loopback file %s?" msgstr "%s loopback faylini qaerga ulamoqchisiz?" #: diskdrake/interactive.pm:714 #, c-format msgid "Where do you want to mount device %s?" msgstr "%s uskunani qaerga ulamoqchisiz?" #: diskdrake/interactive.pm:719 #, c-format msgid "" "Cannot unset mount point as this partition is used for loop back.\n" "Remove the loopback first" msgstr "" "Ushbu disk qismi loop back uchun ishlatilayotganligi uchun ulanish nuqtasini " "uzib boʻlmaydi.\n" "Avval loopback olib tashlansinmi" #: diskdrake/interactive.pm:749 #, c-format msgid "Where do you want to mount %s?" msgstr "Diskning %s qismini qaerga ulamoqchisiz?" #: diskdrake/interactive.pm:779 diskdrake/interactive.pm:875 #: fs/partitioning_wizard.pm:129 fs/partitioning_wizard.pm:205 #, c-format msgid "Resizing" msgstr "Hajm oʻzgartirilmoqda" #: diskdrake/interactive.pm:779 #, c-format msgid "Computing FAT filesystem bounds" msgstr "FAT fayl tizimining chegaralari hisoblanmoqda" #: diskdrake/interactive.pm:821 #, c-format msgid "This partition is not resizeable" msgstr "Diskning bu qismini hajmini oʻzgartirib boʻlmaydi" #: diskdrake/interactive.pm:826 #, c-format msgid "All data on this partition should be backed up" msgstr "Ushbu disk qismidagi barcha maʼlumotlardan zahira nusxa olinishi kerak" #: diskdrake/interactive.pm:828 #, c-format msgid "After resizing partition %s, all data on this partition will be lost" msgstr "" "Diskning %s qismini hajmi oʻzgartirilgandan keyin u yerdagi hamma maʼlumot " "yoʻqoladi" #: diskdrake/interactive.pm:835 #, c-format msgid "Choose the new size" msgstr "Yangi hajmni tanlang" #: diskdrake/interactive.pm:836 #, c-format msgid "New size in MB: " msgstr "Yangi hajm (Mb): " #: diskdrake/interactive.pm:837 #, c-format msgid "Minimum size: %s MB" msgstr "Eng kichik hajm: %s Mb" #: diskdrake/interactive.pm:838 #, c-format msgid "Maximum size: %s MB" msgstr "Eng katta hajm: %s Mb" #: diskdrake/interactive.pm:886 fs/partitioning_wizard.pm:213 #, c-format msgid "" "To ensure data integrity after resizing the partition(s),\n" "filesystem checks will be run on your next boot into Microsoft Windows®" msgstr "" "Disk qismi hajmi oʻzgartirilganda maʼlumot butunligi saqlab qolish uchun\n" "Microsoft Windows® keyingi yuklanganda fayl tizimi tekshiriladi" #: diskdrake/interactive.pm:952 diskdrake/interactive.pm:1492 #, c-format msgid "Filesystem encryption key" msgstr "Fayl tizimining shifrlash kaliti" #: diskdrake/interactive.pm:953 #, c-format msgid "Enter your filesystem encryption key" msgstr "Fayl tizimi shifrlash kalitini kiriting" #: diskdrake/interactive.pm:954 diskdrake/interactive.pm:1500 #, c-format msgid "Encryption key" msgstr "Shifrlash kaliti" #: diskdrake/interactive.pm:961 #, c-format msgid "Invalid key" msgstr "xato kalit" #: diskdrake/interactive.pm:969 #, c-format msgid "Choose an existing RAID to add to" msgstr "Qoʻshish uchun mavjud boʻlgan RAID'ni tanlang" #: diskdrake/interactive.pm:971 diskdrake/interactive.pm:990 #, c-format msgid "new" msgstr "yangi" #: diskdrake/interactive.pm:988 #, c-format msgid "Choose an existing LVM to add to" msgstr "Qoʻshish uchun mavjud boʻlgan LVM'ni tanlang" #: diskdrake/interactive.pm:1000 diskdrake/interactive.pm:1009 #, c-format msgid "LVM name" msgstr "LVM nomi" #: diskdrake/interactive.pm:1001 #, c-format msgid "Enter a name for the new LVM volume group" msgstr "" #: diskdrake/interactive.pm:1006 #, c-format msgid "\"%s\" already exists" msgstr "\"%s\" allaqachon mavjud" #: diskdrake/interactive.pm:1038 #, c-format msgid "" "Physical volume %s is still in use.\n" "Do you want to move used physical extents on this volume to other volumes?" msgstr "" #: diskdrake/interactive.pm:1040 #, c-format msgid "Moving physical extents" msgstr "Fizik kengaytmalarni koʻchirish" #: diskdrake/interactive.pm:1058 #, c-format msgid "This partition cannot be used for loopback" msgstr "Diskning bu qismini loopback uchun ishlatib boʻlmaydi" #: diskdrake/interactive.pm:1071 #, c-format msgid "Loopback" msgstr "Loopback" #: diskdrake/interactive.pm:1072 #, c-format msgid "Loopback file name: " msgstr "Loopback faylining nomi: " #: diskdrake/interactive.pm:1077 #, c-format msgid "Give a file name" msgstr "Fayl nomini kiriting" #: diskdrake/interactive.pm:1080 #, c-format msgid "File is already used by another loopback, choose another one" msgstr "Faylni boshqa loopback ishlatayapti, boshqasini tanlang" #: diskdrake/interactive.pm:1081 #, c-format msgid "File already exists. Use it?" msgstr "Fayl allaqachon mavjud. Undan foydalanilsinmi?" #: diskdrake/interactive.pm:1113 diskdrake/interactive.pm:1116 #, c-format msgid "Mount options" msgstr "Ulash parametrlari" #: diskdrake/interactive.pm:1123 #, c-format msgid "Various" msgstr "Har xil" #: diskdrake/interactive.pm:1169 #, c-format msgid "device" msgstr "uskuna" #: diskdrake/interactive.pm:1170 #, c-format msgid "level" msgstr "daraja" #: diskdrake/interactive.pm:1171 #, c-format msgid "chunk size in KiB" msgstr "" #: diskdrake/interactive.pm:1189 #, c-format msgid "Be careful: this operation is dangerous." msgstr "Diqqat: Bu amal xavfli." #: diskdrake/interactive.pm:1204 #, c-format msgid "Partitioning Type" msgstr "Diskni boʻlish turi" #: diskdrake/interactive.pm:1204 #, c-format msgid "What type of partitioning?" msgstr "Diskni qismlarga boʻlishning qaysi turi?" #: diskdrake/interactive.pm:1242 #, c-format msgid "You'll need to reboot before the modification can take effect" msgstr "" "Oʻzgarishlar amalda qoʻllanilishi uchun kompyuterni oʻchirib-yoqish kerak" #: diskdrake/interactive.pm:1251 #, c-format msgid "Partition table of drive %s is going to be written to disk" msgstr "%s diskining qismlar jadvali diskga saqlanish arafasida" #: diskdrake/interactive.pm:1270 fs/format.pm:110 fs/format.pm:117 #, c-format msgid "Formatting partition %s" msgstr "Diskning qismi (%s) format qilinmoqda" #: diskdrake/interactive.pm:1283 #, c-format msgid "After formatting partition %s, all data on this partition will be lost" msgstr "" "Diskning %s qismi format qilgandan keyin u yerdagi hamma maʼlumot yoʻqoladi" #: diskdrake/interactive.pm:1306 #, c-format msgid "Move files to the new partition" msgstr "Fayllarni diskning yangi qismiga koʻchirish" #: diskdrake/interactive.pm:1306 #, c-format msgid "Hide files" msgstr "Fayllarni yashirish" #: diskdrake/interactive.pm:1307 #, c-format msgid "" "Directory %s already contains data\n" "(%s)\n" "\n" "You can either choose to move the files into the partition that will be " "mounted there or leave them where they are (which results in hiding them by " "the contents of the mounted partition)" msgstr "" #: diskdrake/interactive.pm:1322 #, c-format msgid "Moving files to the new partition" msgstr "Fayllar diskning yangi qismiga koʻchirilmoqda" #: diskdrake/interactive.pm:1326 #, c-format msgid "Copying %s" msgstr "%s'dan nusxa koʻchirilmoqda" #: diskdrake/interactive.pm:1330 #, c-format msgid "Removing %s" msgstr "%s olib tashlanmoqda" #: diskdrake/interactive.pm:1344 #, c-format msgid "partition %s is now known as %s" msgstr "diskning %s qismi endi %s sifatida maʼlum" #: diskdrake/interactive.pm:1345 #, c-format msgid "Partitions have been renumbered: " msgstr "Disk qismi raqami oʻzgartirildi: " #: diskdrake/interactive.pm:1370 diskdrake/interactive.pm:1441 #, c-format msgid "Device: " msgstr "Uskuna: " #: diskdrake/interactive.pm:1371 #, c-format msgid "Volume label: " msgstr "" #: diskdrake/interactive.pm:1372 #, c-format msgid "UUID: " msgstr "uuid: " #: diskdrake/interactive.pm:1373 #, fuzzy, c-format msgid "DOS drive letter: %s (just a guess)\n" msgstr "DOS diskining harfi: %s (tavakkaliga)\n" #: diskdrake/interactive.pm:1377 diskdrake/interactive.pm:1386 #: diskdrake/interactive.pm:1460 #, c-format msgid "Type: " msgstr "Turi: " #: diskdrake/interactive.pm:1381 diskdrake/interactive.pm:1445 #, c-format msgid "Name: " msgstr "Nomi: " #: diskdrake/interactive.pm:1388 #, fuzzy, c-format msgid "Start: sector %s\n" msgstr "Boshi: sektor %s\n" #: diskdrake/interactive.pm:1389 #, c-format msgid "Size: %s" msgstr "Hajmi: %s" #: diskdrake/interactive.pm:1391 #, c-format msgid ", %s sectors" msgstr ", %s sektor" #: diskdrake/interactive.pm:1393 #, fuzzy, c-format msgid "Cylinder %d to %d\n" msgstr "Silindr %d dan %d gacha\n" #: diskdrake/interactive.pm:1394 #, fuzzy, c-format msgid "Number of logical extents: %d\n" msgstr "Logik kengaytmalarning soni: %d\n" #: diskdrake/interactive.pm:1395 #, fuzzy, c-format msgid "Formatted\n" msgstr "Formatlangan\n" #: diskdrake/interactive.pm:1396 #, fuzzy, c-format msgid "Not formatted\n" msgstr "Format qilinmagan\n" #: diskdrake/interactive.pm:1397 #, fuzzy, c-format msgid "Mounted\n" msgstr "Ulangan\n" #: diskdrake/interactive.pm:1398 #, fuzzy, c-format msgid "RAID %s\n" msgstr "RAID %s\n" #: diskdrake/interactive.pm:1400 #, c-format msgid "Encrypted" msgstr "Shifrlangan" #: diskdrake/interactive.pm:1402 #, c-format msgid " (mapped on %s)" msgstr "" #: diskdrake/interactive.pm:1403 #, c-format msgid " (to map on %s)" msgstr "" #: diskdrake/interactive.pm:1404 #, c-format msgid " (inactive)" msgstr " (aktiv emas)" #: diskdrake/interactive.pm:1411 #, fuzzy, c-format msgid "" "Loopback file(s):\n" " %s\n" msgstr "" "Loopback fayl(lar):\n" " %s\n" #: diskdrake/interactive.pm:1412 #, fuzzy, c-format msgid "" "Partition booted by default\n" " (for MS-DOS boot, not for lilo)\n" msgstr "" "Andoza yuklanadigan disk qismi\n" " (MS-DOS yuklanishi uchun, lilo uchun emas)\n" #: diskdrake/interactive.pm:1414 #, fuzzy, c-format msgid "Level %s\n" msgstr "%s daraja\n" #: diskdrake/interactive.pm:1415 #, c-format msgid "Chunk size %d KiB\n" msgstr "" #: diskdrake/interactive.pm:1416 #, fuzzy, c-format msgid "RAID-disks %s\n" msgstr "RAID disklar %s\n" #: diskdrake/interactive.pm:1418 #, c-format msgid "Loopback file name: %s" msgstr "Loopback faylining nomi: %s" #: diskdrake/interactive.pm:1421 #, fuzzy, c-format msgid "" "\n" "Chances are, this partition is\n" "a Driver partition. You should\n" "probably leave it alone.\n" msgstr "" "\n" "Ehtimol, diskning bu qismi\n" "drayverning qismidir.\n" "Yaxshisi unga teginmang.\n" #: diskdrake/interactive.pm:1424 #, c-format msgid "" "\n" "This special Bootstrap\n" "partition is for\n" "dual-booting your system.\n" msgstr "" #: diskdrake/interactive.pm:1433 #, c-format msgid "Free space on %s (%s)" msgstr "%s (%s) dagi boʻsh joy" #: diskdrake/interactive.pm:1442 #, c-format msgid "Read-only" msgstr "Faqat oʻqishga" #: diskdrake/interactive.pm:1443 #, fuzzy, c-format msgid "Size: %s\n" msgstr "Hajmi: %s\n" #: diskdrake/interactive.pm:1444 #, fuzzy, c-format msgid "Geometry: %s cylinders, %s heads, %s sectors\n" msgstr "Geometriya: %s silindr, %s kallacha, %s sektor\n" #: diskdrake/interactive.pm:1446 #, c-format msgid "Medium type: " msgstr "Maʼlumot tashuvchi turi: " #: diskdrake/interactive.pm:1447 #, fuzzy, c-format msgid "LVM-disks %s\n" msgstr "LVM disklar %s\n" #: diskdrake/interactive.pm:1448 #, fuzzy, c-format msgid "Partition table type: %s\n" msgstr "Disk qismi jadvali turi: %s\n" #: diskdrake/interactive.pm:1449 #, fuzzy, c-format msgid "on channel %d id %d\n" msgstr "%d id %d kanalida\n" #: diskdrake/interactive.pm:1493 #, c-format msgid "Choose your filesystem encryption key" msgstr "Fayl tizimi shifrlash kalitini tanlang" #: diskdrake/interactive.pm:1496 #, c-format msgid "This encryption key is too simple (must be at least %d characters long)" msgstr "" "Shifrlash kaliti juda sodda (u eng kami %d belgidan iborat boʻlishi shart)" #: diskdrake/interactive.pm:1503 #, c-format msgid "Encryption algorithm" msgstr "Shifrlash algoritmi" #: diskdrake/removable.pm:46 #, c-format msgid "Change type" msgstr "Turini oʻzgartirish" #: diskdrake/smbnfs_gtk.pm:81 interactive.pm:129 interactive.pm:550 #: interactive/curses.pm:267 interactive/http.pm:104 interactive/http.pm:160 #: interactive/stdio.pm:39 interactive/stdio.pm:148 mygtk2.pm:846 ugtk2.pm:415 #: ugtk2.pm:517 ugtk2.pm:526 ugtk2.pm:812 #, fuzzy, c-format msgid "Cancel" msgstr "Bekor qilish" #: diskdrake/smbnfs_gtk.pm:164 #, c-format msgid "Cannot login using username %s (bad password?)" msgstr "%s foydalanuvchi nomi ostida kirib boʻlmaydi (maxfiy soʻz xatomi?)" #: diskdrake/smbnfs_gtk.pm:168 diskdrake/smbnfs_gtk.pm:177 #, c-format msgid "Domain Authentication Required" msgstr "Domen autentifikatsiyasi talab qilinadi" #: diskdrake/smbnfs_gtk.pm:169 #, c-format msgid "Which username" msgstr "Qaysi foydalanuvchi" #: diskdrake/smbnfs_gtk.pm:169 #, c-format msgid "Another one" msgstr "Boshqasi" #: diskdrake/smbnfs_gtk.pm:178 #, c-format msgid "" "Please enter your username, password and domain name to access this host." msgstr "" "Ushbu xostga kirish uchun foydalanuvchi nomi, maxfiy soʻz va domen nomini " "kiriting." #: diskdrake/smbnfs_gtk.pm:180 #, c-format msgid "Username" msgstr "Foydalanuvchi" #: diskdrake/smbnfs_gtk.pm:182 #, c-format msgid "Domain" msgstr "Domen" #: diskdrake/smbnfs_gtk.pm:206 #, c-format msgid "Search servers" msgstr "Serverlarni qidirish" #: diskdrake/smbnfs_gtk.pm:211 #, c-format msgid "Search for new servers" msgstr "Yangi serverlarni qidirish" #: do_pkgs.pm:19 do_pkgs.pm:57 #, c-format msgid "The package %s needs to be installed. Do you want to install it?" msgstr "%s paketi oʻrnatilishi kerak. Uni oʻrnatishni istaysizmi?" #: do_pkgs.pm:23 do_pkgs.pm:44 do_pkgs.pm:60 do_pkgs.pm:82 #, c-format msgid "Could not install the %s package!" msgstr "%s paketini oʻrnatib boʻlmadi!" #: do_pkgs.pm:28 do_pkgs.pm:65 #, c-format msgid "Mandatory package %s is missing" msgstr "Shart boʻlgan %s paketi yetishmayapti" #: do_pkgs.pm:39 do_pkgs.pm:77 #, fuzzy, c-format msgid "The following packages need to be installed:\n" msgstr "Quyidagi paketlarni oʻrnatish kerak:\n" #: do_pkgs.pm:241 #, c-format msgid "Installing packages..." msgstr "Paketlar oʻrnatilmoqda..." #: do_pkgs.pm:287 pkgs.pm:285 #, c-format msgid "Removing packages..." msgstr "Paketlar olib tashlanmoqda..." #: fs/any.pm:17 #, fuzzy, c-format msgid "" "An error occurred - no valid devices were found on which to create new " "filesystems. Please check your hardware for the cause of this problem" msgstr "" "Xatolik roʻy berdi - fayl tizimini yaratish uchun yaroqli uskuna topilmadi. " "Iltimos ushbu muammoni tuzatish uchun uskunangizni tekshirib koʻring" #: fs/any.pm:75 fs/partitioning_wizard.pm:62 #, c-format msgid "You must have a FAT partition mounted in /boot/efi" msgstr "Sizda /boot/efi nuqtasiga ulangan diskning FAT qismi boʻlishi shart" #: fs/format.pm:114 #, c-format msgid "Creating and formatting file %s" msgstr "%s fayli yaratilmoqda va format qilinmoqda" #: fs/format.pm:133 #, c-format msgid "I do not know how to set label on %s with type %s" msgstr "" #: fs/format.pm:145 #, c-format msgid "setting label on %s failed, is it formatted?" msgstr "%s uchun yorliqni oʻrnatib boʻlmadi, u formatlanganmi?" #: fs/format.pm:186 #, c-format msgid "I do not know how to format %s in type %s" msgstr "%s'ni %s turida qanday format qilishni bilmayman" #: fs/format.pm:191 fs/format.pm:193 #, c-format msgid "%s formatting of %s failed" msgstr "%s turida %s'ni format qilish muvaffaqiyatsiz tugadi" #: fs/loopback.pm:24 #, c-format msgid "Circular mounts %s\n" msgstr "" #: fs/mount.pm:85 #, c-format msgid "Mounting partition %s" msgstr "Disk qismi (%s) ulanmoqda" #: fs/mount.pm:86 #, c-format msgid "mounting partition %s in directory %s failed" msgstr "%s disk qismini %s direktoriyaga ulash muvaffaqiyatsiz tugadi" #: fs/mount.pm:91 fs/mount.pm:108 #, c-format msgid "Checking %s" msgstr "%s tekshirilmoqda" #: fs/mount.pm:125 partition_table.pm:422 #, c-format msgid "error unmounting %s: %s" msgstr "" #: fs/mount.pm:140 #, c-format msgid "Enabling swap partition %s" msgstr "Diskning svop qismi (%s) yoqilmoqda" #: fs/mount_options.pm:113 #, c-format msgid "Enable POSIX Access Control Lists" msgstr "" #: fs/mount_options.pm:115 #, c-format msgid "Flush write cache on file close" msgstr "Faylni yopishda keshni tozalash" #: fs/mount_options.pm:117 #, c-format msgid "Enable group disk quota accounting and optionally enforce limits" msgstr "" #: fs/mount_options.pm:119 #, c-format msgid "" "Do not update inode access times on this filesystem\n" "(e.g, for faster access on the news spool to speed up news servers)." msgstr "" #: fs/mount_options.pm:122 #, c-format msgid "" "Update inode access times on this filesystem in a more efficient way\n" "(e.g, for faster access on the news spool to speed up news servers)." msgstr "" #: fs/mount_options.pm:125 #, c-format msgid "" "Can only be mounted explicitly (i.e.,\n" "the -a option will not cause the filesystem to be mounted)." msgstr "" #: fs/mount_options.pm:128 #, c-format msgid "Do not interpret character or block special devices on the filesystem." msgstr "" #: fs/mount_options.pm:130 #, c-format msgid "" "Do not allow execution of any binaries on the mounted\n" "filesystem. This option might be useful for a server that has filesystems\n" "containing binaries for architectures other than its own." msgstr "" #: fs/mount_options.pm:134 #, c-format msgid "" "Do not allow set-user-identifier or set-group-identifier\n" "bits to take effect. (This seems safe, but is in fact rather unsafe if you\n" "have suidperl(1) installed.)" msgstr "" #: fs/mount_options.pm:138 #, c-format msgid "Mount the filesystem read-only." msgstr "Fayl tizimini faqat oʻqish usulida ulash." #: fs/mount_options.pm:140 #, c-format msgid "All I/O to the filesystem should be done synchronously." msgstr "" #: fs/mount_options.pm:142 #, c-format msgid "Allow every user to mount and umount the filesystem." msgstr "" "Barcha foydalanuvchilarga fayl tizimini ulash va uzishga ruxsat berish." #: fs/mount_options.pm:144 #, c-format msgid "Allow an ordinary user to mount the filesystem." msgstr "Oddiy foydalanuvchiga fayl tizimini ulashga ruxsat berish." #: fs/mount_options.pm:146 #, c-format msgid "Enable user disk quota accounting, and optionally enforce limits" msgstr "" #: fs/mount_options.pm:148 #, c-format msgid "Support \"user.\" extended attributes" msgstr "\"user.\" kengaytirilgan atributlarini qoʻllash" #: fs/mount_options.pm:150 #, c-format msgid "Give write access to ordinary users" msgstr "Oddiy foydalanuvchilarga yozish ruxsatini berish" #: fs/mount_options.pm:152 #, c-format msgid "Give read-only access to ordinary users" msgstr "Oddiy foydalanuvchilarga faqat oʻqishga ruxsatini berish" #: fs/mount_point.pm:82 #, c-format msgid "Duplicate mount point %s" msgstr "Bir xil ulash nuqtalari %s" #: fs/mount_point.pm:97 #, c-format msgid "No partition available" msgstr "Diskning qismi yoʻq" #: fs/mount_point.pm:100 #, c-format msgid "Scanning partitions to find mount points" msgstr "Ulash nuqtalarini topish uchun diskning qismlari tekshirilmoqda" #: fs/mount_point.pm:107 #, c-format msgid "Choose the mount points" msgstr "Ulash nuqtalarini tanlang" #: fs/partitioning.pm:46 #, c-format msgid "Choose the partitions you want to format" msgstr "Format qilish uchun diskning qismlarini tanlang" #: fs/partitioning.pm:75 #, fuzzy, c-format msgid "" "Failed to check filesystem %s. Do you want to repair the errors? (beware, " "you can lose data)" msgstr "" "%s fayl tizimini tekshirish muvaffaqiyatsiz tugadi. Xatolarni tuzatishni " "istaysizmi? (esingizda tursin, siz maʼlumotni yoʻqotishingiz mumkin)" #: fs/partitioning.pm:78 #, c-format msgid "Not enough swap space to fulfill installation, please add some" msgstr "" "Oʻrnatishni bajarish uchun yetarli svop xotirasi mavjud emas, iltimos uni " "qoʻshing" #: fs/partitioning_wizard.pm:53 #, c-format msgid "" "You must have a root partition.\n" "To accomplish this, create a partition (or click on an existing one).\n" "Then choose action ``Mount point'' and set it to `/'" msgstr "" "Sizda diskning tub qismi boʻlishi shart.\n" "Buning uchun, diskda yangi qism yarating (yoki borini tanlang).\n" "Keyin, \"Ulash nuqtasi\" amali yordamida ulash nuqtasi sifatida \"/\"ni " "koʻrsating" #: fs/partitioning_wizard.pm:59 #, c-format msgid "" "You do not have a swap partition.\n" "\n" "Continue anyway?" msgstr "" "Diskning svop qismi koʻrsatilmagan.\n" "\n" "Bunga qaramasdan davom etishni istaysizmi?" #: fs/partitioning_wizard.pm:93 #, c-format msgid "Use free space" msgstr "Boʻsh joydan foydalanish" #: fs/partitioning_wizard.pm:95 #, c-format msgid "Not enough free space to allocate new partitions" msgstr "Yangi qism yaratish uchun diskda yetarli joy yoʻq" #: fs/partitioning_wizard.pm:103 #, c-format msgid "Use existing partitions" msgstr "Diskda bor qismlardan foydalanish" #: fs/partitioning_wizard.pm:105 #, c-format msgid "There is no existing partition to use" msgstr "Foydalanish uchun disk qismi mavjud emas" #: fs/partitioning_wizard.pm:129 #, c-format msgid "Computing the size of the Microsoft Windows® partition" msgstr "Diskning Microsoft Windows® qismi hajmi hisoblanmoqda" #: fs/partitioning_wizard.pm:165 #, c-format msgid "Use the free space on a Microsoft Windows® partition" msgstr "Diskning Windows® qismidagi boʻsh joydan foydalanish" #: fs/partitioning_wizard.pm:169 #, c-format msgid "Which partition do you want to resize?" msgstr "Diskning qaysi qismi hajmini oʻzgartirishni istaysiz?" #: fs/partitioning_wizard.pm:172 #, fuzzy, c-format msgid "" "Your Microsoft Windows® partition is too fragmented. Please reboot your " "computer under Microsoft Windows®, run the ``defrag'' utility, then restart " "the %s installation." msgstr "" "Microsoft Windows® disk qismi defragmentatsiya qilinishi kerak. Iltimos " "Microsoft Windows® tizimini yuklang va ``defrag'' vositasini ishga tushiring " "va yana qaytadan %s tizimini oʻrnatib koʻring." #: fs/partitioning_wizard.pm:180 #, fuzzy, c-format msgid "" "WARNING!\n" "\n" "\n" "Your Microsoft Windows® partition will be now resized.\n" "\n" "\n" "Be careful: this operation is dangerous. If you have not already done so, " "you first need to exit the installation, run \"chkdsk c:\" from a Command " "Prompt under Microsoft Windows® (beware, running graphical program \"scandisk" "\" is not enough, be sure to use \"chkdsk\" in a Command Prompt!), " "optionally run defrag, then restart the installation. You should also backup " "your data.\n" "\n" "\n" "When sure, press %s." msgstr "" "DIQQAT!\n" "\n" "\n" "Diskning tanlangan Microsoft Windows® qismi hajmi oʻzgartiriladi.\n" "\n" "\n" "Juda ehtiyot boʻling, bu amal juda xavfli. Agar jarayon davomida xato roʻy " "bersa, diskdagi maʼlumotni yoʻqolishiga olib kelish ehtimoli juda katta. " "Birinchi oʻrinda, Windows tizimida chkdsk dasturi yordamida (masalan " "\"chkdsk c:\") diskni xatoga tekshiring. Ikkinchidan, diskni defragmentlash " "tavsiya qilinadi. Bundan tashqari, diskdagi maʼlumotlardan har ehtimolga " "qarshi zahira nusxani olishni ham tavsiya qilinadi.\n" "\n" "\n" "Davom etishni istasangiz, %s tugmasini bosing." #. -PO: keep the double empty lines between sections, this is formatted a la LaTeX #: fs/partitioning_wizard.pm:189 fs/partitioning_wizard.pm:557 #: interactive.pm:549 interactive/curses.pm:270 ugtk2.pm:519 #, fuzzy, c-format msgid "Next" msgstr "Keyingi" #: fs/partitioning_wizard.pm:195 #, c-format msgid "Partitionning" msgstr "Diskni boʻlish" #: fs/partitioning_wizard.pm:195 #, c-format msgid "Which size do you want to keep for Microsoft Windows® on partition %s?" msgstr "" "Diskning %s qismida Microsoft Windows® uchun qancha joy qoldirishni istaysiz?" #: fs/partitioning_wizard.pm:196 #, c-format msgid "Size" msgstr "Hajmi" #: fs/partitioning_wizard.pm:205 #, c-format msgid "Resizing Microsoft Windows® partition" msgstr "Diskning Microsoft Windows® qismi hajmini oʻzgartirish" #: fs/partitioning_wizard.pm:210 #, c-format msgid "FAT resizing failed: %s" msgstr "Diskning FAT qismi hajmini oʻzgartirish muvaffaqiyatsiz tugadi: %s" #: fs/partitioning_wizard.pm:226 #, c-format msgid "There is no FAT partition to resize (or not enough space left)" msgstr "" "Hajmini oʻzgartirish uchun diskda FAT qism mavjud emas (yoki yetarli joy " "mavjud emas)" #: fs/partitioning_wizard.pm:231 #, c-format msgid "Remove Microsoft Windows®" msgstr "Microsoft Windows® tizimiini olib tashlash" #: fs/partitioning_wizard.pm:231 #, c-format msgid "Erase and use entire disk" msgstr "Butun diskni oʻchirib tashlab foydalanish" #: fs/partitioning_wizard.pm:235 #, fuzzy, c-format msgid "" "You have more than one hard disk drive, which one do you want the installer " "to use?" msgstr "" "Sizda bittadan koʻp qattiq disk mavjud. Ularni qaysiga Mageia OTni " "oʻrnatishni istaysiz?" #: fs/partitioning_wizard.pm:243 fsedit.pm:632 #, c-format msgid "ALL existing partitions and their data will be lost on drive %s" msgstr "%s diskning barcha qismlari va ulardagi barcha maʼlumot oʻchiriladi" #: fs/partitioning_wizard.pm:253 #, c-format msgid "Custom disk partitioning" msgstr "Diskni boshqacha boʻlish" #: fs/partitioning_wizard.pm:259 #, c-format msgid "Use fdisk" msgstr "Fdisk dasturidan foydalanish" #: fs/partitioning_wizard.pm:262 #, c-format msgid "" "You can now partition %s.\n" "When you are done, do not forget to save using `w'" msgstr "" "Endi siz %s diskni boʻlishingiz mumkin.\n" "Tugatgach \"w\" bilan saqlash esingizdan chiqmasin." #: fs/partitioning_wizard.pm:401 #, fuzzy, c-format msgid "Ext2/3/4" msgstr "Ext3" #: fs/partitioning_wizard.pm:431 fs/partitioning_wizard.pm:577 #, c-format msgid "I cannot find any room for installing" msgstr "Oʻrnatish uchun yetarli joy topilmadi" #: fs/partitioning_wizard.pm:440 fs/partitioning_wizard.pm:584 #, c-format msgid "The DrakX Partitioning wizard found the following solutions:" msgstr "Diskni boʻlish vositasi quyidagi yechimlarni topdi:" #: fs/partitioning_wizard.pm:510 #, c-format msgid "Here is the content of your disk drive " msgstr "Bu qattiq diskning tarkibi " #: fs/partitioning_wizard.pm:594 #, c-format msgid "Partitioning failed: %s" msgstr "Diskni boʻlish muvaffaqiyatsiz tugadi: %s" #: fs/type.pm:392 #, c-format msgid "You cannot use JFS for partitions smaller than 16MB" msgstr "" "Hajmi 16 Mb'dan kichik boʻlgan qismlar uchun JFS fayl tizimini ishlatib " "boʻlmaydi" #: fs/type.pm:393 #, c-format msgid "You cannot use ReiserFS for partitions smaller than 32MB" msgstr "" "Hajmi 32 Mb'dan kichik boʻlgan qismlar uchun ReiserFS fayl tizimini ishlatib " "boʻlmaydi" #: fsedit.pm:24 #, c-format msgid "simple" msgstr "oson" #: fsedit.pm:28 #, c-format msgid "with /usr" msgstr "/usr bilan" #: fsedit.pm:33 #, c-format msgid "server" msgstr "server" #: fsedit.pm:137 #, c-format msgid "BIOS software RAID detected on disks %s. Activate it?" msgstr "%s diskda dasturiy BIOS RAID topildi. U aktivlashtirilsinmi?" #: fsedit.pm:247 #, c-format msgid "" "I cannot read the partition table of device %s, it's too corrupted for me :" "(\n" "I can try to go on, erasing over bad partitions (ALL DATA will be lost!).\n" "The other solution is to not allow DrakX to modify the partition table.\n" "(the error is %s)\n" "\n" "Do you agree to lose all the partitions?\n" msgstr "" #: fsedit.pm:427 #, c-format msgid "Mount points must begin with a leading /" msgstr "Ulash nuqtalari \"/\" belgisi bilan boshlanishi shart" #: fsedit.pm:428 #, c-format msgid "Mount points should contain only alphanumerical characters" msgstr "Ulash nuqtalari faqat son yoki harflardan iborat boʻlishi mumkin" #: fsedit.pm:429 #, fuzzy, c-format msgid "There is already a partition with mount point %s\n" msgstr "%s ulash nuqtali diskning qismi allaqachon mavjud\n" #: fsedit.pm:434 #, fuzzy, c-format msgid "" "You've selected a software RAID partition as root (/).\n" "No bootloader is able to handle this without a /boot partition.\n" "Please be sure to add a separate /boot partition" msgstr "" "Siz root (/) sifatida dasturiy RAID disk qismini tanladingiz.\n" "Hech bir yuklovchi ularni /boot disk qismisiz boshqara olmaydi.\n" "Iltimos /boot disk qismi qoʻshilganligini tekshirib koʻring" #: fsedit.pm:440 #, fuzzy, c-format msgid "" "Metadata version unsupported for a boot partition. Please be sure to add a " "separate /boot partition." msgstr "" "Siz root (/) sifatida dasturiy RAID disk qismini tanladingiz.\n" "Hech bir yuklovchi ularni /boot disk qismisiz boshqara olmaydi.\n" "Iltimos /boot disk qismi qoʻshilganligini tekshirib koʻring" #: fsedit.pm:448 #, fuzzy, c-format msgid "" "You've selected a software RAID partition as /boot.\n" "No bootloader is able to handle this." msgstr "" "Siz root (/) sifatida dasturiy RAID disk qismini tanladingiz.\n" "Hech bir yuklovchi ularni /boot disk qismisiz boshqara olmaydi.\n" "Iltimos /boot disk qismi qoʻshilganligini tekshirib koʻring" #: fsedit.pm:452 #, c-format msgid "Metadata version unsupported for a boot partition." msgstr "" #: fsedit.pm:459 #, fuzzy, c-format msgid "" "You've selected an encrypted partition as root (/).\n" "No bootloader is able to handle this without a /boot partition.\n" "Please be sure to add a separate /boot partition" msgstr "" "Siz root (/) sifatida dasturiy RAID disk qismini tanladingiz.\n" "Hech bir yuklovchi ularni /boot disk qismisiz boshqara olmaydi.\n" "Iltimos /boot disk qismi qoʻshilganligini tekshirib koʻring" #: fsedit.pm:465 fsedit.pm:483 #, c-format msgid "You cannot use an encrypted filesystem for mount point %s" msgstr "%s ulash nuqtasi uchun shifrlangan fayl tizimini ishlatib boʻlmaydi" #: fsedit.pm:469 #, c-format msgid "" "You cannot use the LVM Logical Volume for mount point %s since it spans " "physical volumes" msgstr "" #: fsedit.pm:471 #, fuzzy, c-format msgid "" "You've selected the LVM Logical Volume as root (/).\n" "The bootloader is not able to handle this when the volume spans physical " "volumes.\n" "You should create a separate /boot partition first" msgstr "" "Siz root (/) sifatida dasturiy RAID disk qismini tanladingiz.\n" "Hech bir yuklovchi ularni /boot disk qismisiz boshqara olmaydi.\n" "Iltimos /boot disk qismi qoʻshilganligini tekshirib koʻring" #: fsedit.pm:475 fsedit.pm:477 #, c-format msgid "This directory should remain within the root filesystem" msgstr "Bu direktoriya tub fayl tizimida boʻlishi kerak" #: fsedit.pm:479 fsedit.pm:481 #, fuzzy, c-format msgid "" "You need a true filesystem (ext2/3/4, reiserfs, xfs, or jfs) for this mount " "point\n" msgstr "" "Bu ulash nuqtasi uchun haqiqiy fayl tizimi (ext2/3/4, reiserfs, xfs, yoki " "jfs) kerak\n" #: fsedit.pm:548 #, c-format msgid "Not enough free space for auto-allocating" msgstr "Avto-taqsimlash uchun yetarlicha joy yoʻq" #: fsedit.pm:550 #, c-format msgid "Nothing to do" msgstr "Bajarish uchun hech narsa yoʻq" #: harddrake/data.pm:62 #, c-format msgid "SATA controllers" msgstr "SATA kontrollerlar" #: harddrake/data.pm:71 #, c-format msgid "RAID controllers" msgstr "RAID kontrollerlar" #: harddrake/data.pm:81 #, c-format msgid "(E)IDE/ATA controllers" msgstr "(E)IDE/ATA kontrollerlar" #: harddrake/data.pm:92 #, c-format msgid "Card readers" msgstr "Kartadan oʻqish vositasi" #: harddrake/data.pm:101 #, c-format msgid "Firewire controllers" msgstr "Firewire kontrollerlari" #: harddrake/data.pm:110 #, c-format msgid "PCMCIA controllers" msgstr "PCMCIA kontrollerlar" #: harddrake/data.pm:119 #, c-format msgid "SCSI controllers" msgstr "SCSI kontrollerlar" #: harddrake/data.pm:128 #, c-format msgid "USB controllers" msgstr "USB kontrollerlar" #: harddrake/data.pm:137 #, c-format msgid "USB ports" msgstr "USB portlar" #: harddrake/data.pm:146 #, c-format msgid "SMBus controllers" msgstr "SMBus kontrollerlar" #: harddrake/data.pm:155 #, c-format msgid "Bridges and system controllers" msgstr "Koʻpriklar va tizim kontrollerlari" #: harddrake/data.pm:167 #, c-format msgid "Floppy" msgstr "Disket" #: harddrake/data.pm:177 #, c-format msgid "Zip" msgstr "Zip" #: harddrake/data.pm:193 #, c-format msgid "Hard Disk" msgstr "Qattiq disk" #: harddrake/data.pm:203 #, c-format msgid "USB Mass Storage Devices" msgstr "USB maʼlumot saqlash uskunalar" #: harddrake/data.pm:212 #, c-format msgid "CDROM" msgstr "CDROM" #: harddrake/data.pm:222 #, c-format msgid "CD/DVD burners" msgstr "CD/DVD yozuvchilari" #: harddrake/data.pm:232 #, c-format msgid "DVD-ROM" msgstr "DVD-ROM" #: harddrake/data.pm:242 #, c-format msgid "Tape" msgstr "Magnit tasma" #: harddrake/data.pm:253 #, c-format msgid "AGP controllers" msgstr "AGP kontrollerlar" #: harddrake/data.pm:262 #, c-format msgid "Videocard" msgstr "Video karta" #: harddrake/data.pm:271 #, c-format msgid "DVB card" msgstr "DVB karta" #: harddrake/data.pm:279 #, c-format msgid "Tvcard" msgstr "TV karta" #: harddrake/data.pm:289 #, c-format msgid "Other MultiMedia devices" msgstr "Boshqa multimedia uskunalar" #: harddrake/data.pm:298 #, c-format msgid "Soundcard" msgstr "Tovush kartasi" #: harddrake/data.pm:312 #, c-format msgid "Webcam" msgstr "Veb-kamera" #: harddrake/data.pm:327 #, c-format msgid "Processors" msgstr "Protsessorlar" #: harddrake/data.pm:337 #, c-format msgid "ISDN adapters" msgstr "ISDN adapterlar" #: harddrake/data.pm:348 #, c-format msgid "USB sound devices" msgstr "USB tovush uskunalari" #: harddrake/data.pm:357 #, c-format msgid "Radio cards" msgstr "Radio kartalar" #: harddrake/data.pm:366 #, c-format msgid "ATM network cards" msgstr "ATM tarmoq kartalari" #: harddrake/data.pm:375 #, c-format msgid "WAN network cards" msgstr "WAN tarmoq kartalari" #: harddrake/data.pm:384 #, c-format msgid "Bluetooth devices" msgstr "Bluetooth uskunalari" #: harddrake/data.pm:393 #, c-format msgid "Ethernetcard" msgstr "Ethernet karta" #: harddrake/data.pm:410 #, c-format msgid "Modem" msgstr "Modem" #: harddrake/data.pm:420 #, c-format msgid "ADSL adapters" msgstr "ADSL adapterlar" #: harddrake/data.pm:432 #, c-format msgid "Memory" msgstr "Xotira" #: harddrake/data.pm:441 #, c-format msgid "Printer" msgstr "Printer" #. -PO: these are joysticks controllers: #: harddrake/data.pm:455 #, c-format msgid "Game port controllers" msgstr "Oʻyin porti kontrollerlari" #: harddrake/data.pm:464 #, c-format msgid "Joystick" msgstr "Joystik" #: harddrake/data.pm:474 #, c-format msgid "Keyboard" msgstr "Klaviatura" #: harddrake/data.pm:488 #, c-format msgid "Tablet and touchscreen" msgstr "Planshet va sensorli ekran" #: harddrake/data.pm:497 #, c-format msgid "Mouse" msgstr "Sichqoncha" #: harddrake/data.pm:512 #, c-format msgid "Biometry" msgstr "Biometriya" #: harddrake/data.pm:520 #, c-format msgid "UPS" msgstr "UPS" #: harddrake/data.pm:529 #, c-format msgid "Scanner" msgstr "Skaner" #: harddrake/data.pm:540 #, c-format msgid "Unknown/Others" msgstr "Nomaʼlum/Boshqalar" #: harddrake/data.pm:570 #, c-format msgid "cpu # " msgstr "protsessor # " #: harddrake/sound.pm:270 #, c-format msgid "Please Wait... Applying the configuration" msgstr "Iltimos kutib turing... Moslamalar qoʻllanilmoqda" #: harddrake/sound.pm:331 #, c-format msgid "Enable PulseAudio" msgstr "PulseAudio'ni yoqish" #: harddrake/sound.pm:336 #, c-format msgid "Use Glitch-Free mode" msgstr "Glitch-Free usulidan foydalanish" #: harddrake/sound.pm:342 #, c-format msgid "Reset sound mixer to default values" msgstr "Tovush miksheri andoza qiymatlarini tiklash" #: harddrake/sound.pm:347 #, c-format msgid "Troubleshooting" msgstr "Nosozliklarni topish va bartaraf qilish" #: harddrake/sound.pm:354 #, c-format msgid "No alternative driver" msgstr "Boshqa drayver yoʻq" #: harddrake/sound.pm:355 #, fuzzy, c-format msgid "" "There's no known OSS/ALSA alternative driver for your sound card (%s) which " "currently uses \"%s\"" msgstr "" "Sizning %s tovush kartangizga, joriy holda %s drayveri ishlatilmoqda, maʼlum " "boʻlgan boshqa OSS/ALSA drayveri mavjud emas." #: harddrake/sound.pm:362 #, c-format msgid "Sound configuration" msgstr "Tovushni sozlash" #: harddrake/sound.pm:364 #, fuzzy, c-format msgid "" "Here you can select an alternative driver (either OSS or ALSA) for your " "sound card (%s)." msgstr "" "Bu yerda %s tovush kartangiz uchun boshqa drayverni (OSS yoki ALSA) " "tanlashingiz mumkin." #. -PO: here the first %s is either "OSS" or "ALSA", #. -PO: the second %s is the name of the current driver #. -PO: and the third %s is the name of the default driver #: harddrake/sound.pm:369 #, fuzzy, c-format msgid "" "\n" "\n" "Your card currently uses the %s\"%s\" driver (the default driver for your " "card is \"%s\")" msgstr "" "\n" "\n" "Sizning kartangiz %s\"%s\" drayverini ishlatmoqda (kartangizning andoza " "drayveri \"%s\")" #: harddrake/sound.pm:371 #, c-format msgid "" "OSS (Open Sound System) was the first sound API. It's an OS independent " "sound API (it's available on most UNIX(tm) systems) but it's a very basic " "and limited API.\n" "What's more, OSS drivers all reinvent the wheel.\n" "\n" "ALSA (Advanced Linux Sound Architecture) is a modularized architecture " "which\n" "supports quite a large range of ISA, USB and PCI cards.\n" "\n" "It also provides a much higher API than OSS.\n" "\n" "To use alsa, one can either use:\n" "- the old compatibility OSS API\n" "- the new ALSA API that provides many enhanced features but requires using " "the ALSA library.\n" msgstr "" #: harddrake/sound.pm:385 harddrake/sound.pm:468 #, c-format msgid "Driver:" msgstr "Drayver:" #: harddrake/sound.pm:399 #, c-format msgid "" "The old \"%s\" driver is blacklisted.\n" "\n" "It has been reported to oops the kernel on unloading.\n" "\n" "The new \"%s\" driver will only be used on next bootstrap." msgstr "" #: harddrake/sound.pm:407 #, c-format msgid "No open source driver" msgstr "Ochiq kodli drayver mavjud emas" #: harddrake/sound.pm:408 #, c-format msgid "" "There's no free driver for your sound card (%s), but there's a proprietary " "driver at \"%s\"." msgstr "" #: harddrake/sound.pm:411 #, c-format msgid "No known driver" msgstr "Maʼlum boʻlgan drayver yoʻq" #: harddrake/sound.pm:412 #, c-format msgid "There's no known driver for your sound card (%s)" msgstr "" "Sizning \"%s\" tovush kartangiz uchun maʼlum boʻlgan drayver mavjud emas." #: harddrake/sound.pm:427 #, c-format msgid "Sound troubleshooting" msgstr "Tovush nosozliklarini topish va bartaraf qilish" #. -PO: keep the double empty lines between sections, this is formatted a la LaTeX #: harddrake/sound.pm:430 #, c-format msgid "" "The classic bug sound tester is to run the following commands:\n" "\n" "\n" "- \"lspcidrake -v | fgrep -i AUDIO\" will tell you which driver your card " "uses\n" "by default\n" "\n" "- \"grep sound-slot /etc/modprobe.conf\" will tell you what driver it\n" "currently uses\n" "\n" "- \"/sbin/lsmod\" will enable you to check if its module (driver) is\n" "loaded or not\n" "\n" "- \"/sbin/chkconfig --list sound\" and \"/sbin/chkconfig --list alsa\" will\n" "tell you if sound and alsa services are configured to be run on\n" "initlevel 3\n" "\n" "- \"aumix -q\" will tell you if the sound volume is muted or not\n" "\n" "- \"/sbin/fuser -v /dev/dsp\" will tell which program uses the sound card.\n" msgstr "" #: harddrake/sound.pm:457 #, c-format msgid "Let me pick any driver" msgstr "Boshqa drayverni tanlash" #: harddrake/sound.pm:460 #, c-format msgid "Choosing an arbitrary driver" msgstr "Ixtiyoriy drayver tanlanmoqda" #. -PO: keep the double empty lines between sections, this is formatted a la LaTeX #: harddrake/sound.pm:463 #, fuzzy, c-format msgid "" "If you really think that you know which driver is the right one for your " "card\n" "you can pick one from the above list.\n" "\n" "The current driver for your \"%s\" sound card is \"%s\" " msgstr "" "Agar sizning tovush kartangizga toʻgʻri keladigan drayverni rostdan " "bilsangiz,\n" "uni yuqoridagi roʻyxatdan tanlashingiz mumkin.\n" "\n" "Sizning \"%s\" tovush kartangizning joriy drayveri \"%s\" " #: harddrake/v4l.pm:12 #, c-format msgid "Auto-detect" msgstr "Avto-aniqlash" #: harddrake/v4l.pm:97 harddrake/v4l.pm:285 harddrake/v4l.pm:337 #, c-format msgid "Unknown|Generic" msgstr "Nomaʼlum|Andoza" #: harddrake/v4l.pm:130 #, c-format msgid "Unknown|CPH05X (bt878) [many vendors]" msgstr "Nomaʼlum|CPH05X (bt878) [koʻp ishlab chiqaruvchilar]" #: harddrake/v4l.pm:131 #, c-format msgid "Unknown|CPH06X (bt878) [many vendors]" msgstr "Nomaʼlum|CPH06X (bt878) [aksariyat ishlab chiqaruvchilar]" #: harddrake/v4l.pm:475 #, c-format msgid "" "For most modern TV cards, the bttv module of the GNU/Linux kernel just auto-" "detect the rights parameters.\n" "If your card is misdetected, you can force the right tuner and card types " "here. Just select your TV card parameters if needed." msgstr "" #: harddrake/v4l.pm:478 #, c-format msgid "Card model:" msgstr "Kartaning modeli:" #: harddrake/v4l.pm:479 #, c-format msgid "Tuner type:" msgstr "Tyuner turi:" #: interactive.pm:128 interactive.pm:549 interactive/curses.pm:270 #: interactive/http.pm:103 interactive/http.pm:156 interactive/stdio.pm:39 #: interactive/stdio.pm:148 interactive/stdio.pm:149 mygtk2.pm:846 #: ugtk2.pm:421 ugtk2.pm:519 ugtk2.pm:812 ugtk2.pm:835 #, c-format msgid "Ok" msgstr "Ok" #: interactive.pm:228 modules/interactive.pm:72 ugtk2.pm:811 wizards.pm:156 #, c-format msgid "Yes" msgstr "Ha" #: interactive.pm:228 modules/interactive.pm:72 ugtk2.pm:811 wizards.pm:156 #, c-format msgid "No" msgstr "Yoʻq" #: interactive.pm:262 #, c-format msgid "Choose a file" msgstr "Faylni tanlang" #: interactive.pm:387 interactive/gtk.pm:453 #, c-format msgid "Add" msgstr "Qoʻshish" #: interactive.pm:387 interactive/gtk.pm:453 #, c-format msgid "Modify" msgstr "Oʻzgartirish" #: interactive.pm:549 interactive/curses.pm:270 ugtk2.pm:519 #, fuzzy, c-format msgid "Finish" msgstr "Tayyor" #: interactive.pm:550 interactive/curses.pm:267 ugtk2.pm:517 #, c-format msgid "Previous" msgstr "Oldingi" #: interactive/curses.pm:563 ugtk2.pm:872 #, c-format msgid "No file chosen" msgstr "Fayl tanlanmagan" #: interactive/curses.pm:567 ugtk2.pm:876 #, c-format msgid "You have chosen a directory, not a file" msgstr "Fayl oʻrniga direktoriya tanlangan" #: interactive/curses.pm:569 ugtk2.pm:878 #, c-format msgid "No such directory" msgstr "Bunday direktoriya mavjud emas" #: interactive/curses.pm:569 ugtk2.pm:878 #, c-format msgid "No such file" msgstr "Bunday fayl mavjud emas" #: interactive/gtk.pm:594 #, c-format msgid "Beware, Caps Lock is enabled" msgstr "Caps Lock bosilganiga eʼtibor bering" #: interactive/stdio.pm:29 interactive/stdio.pm:154 #, fuzzy, c-format msgid "Bad choice, try again\n" msgstr "Notoʻgʻri tanlov, qaytadan urinib koʻring\n" #: interactive/stdio.pm:30 interactive/stdio.pm:155 #, c-format msgid "Your choice? (default %s) " msgstr "Siz nimani tanlaysiz? (andoza: %s) " #: interactive/stdio.pm:54 #, c-format msgid "" "Entries you'll have to fill:\n" "%s" msgstr "" "Toʻldirish kerak boʻlgan maydonlar:\n" "%s" #: interactive/stdio.pm:70 #, c-format msgid "Your choice? (0/1, default `%s') " msgstr "Siz nimani tanlaysiz? (0/1, andoza: \"%s\")" #: interactive/stdio.pm:97 #, c-format msgid "Button `%s': %s" msgstr "" #: interactive/stdio.pm:98 #, c-format msgid "Do you want to click on this button?" msgstr "Bu tugmani bosishni istaysizmi?" #: interactive/stdio.pm:110 #, c-format msgid "Your choice? (default `%s'%s) " msgstr "Siz nimani tanlaysiz? (andoza: \"%s\"%s) " #: interactive/stdio.pm:110 #, c-format msgid " enter `void' for void entry" msgstr "" #: interactive/stdio.pm:128 #, fuzzy, c-format msgid "=> There are many things to choose from (%s).\n" msgstr "=> Tanlash uchun koʻp narsa bor (%s).\n" #: interactive/stdio.pm:131 #, c-format msgid "" "Please choose the first number of the 10-range you wish to edit,\n" "or just hit Enter to proceed.\n" "Your choice? " msgstr "" #: interactive/stdio.pm:144 #, c-format msgid "" "=> Notice, a label changed:\n" "%s" msgstr "" "=> Eʼtibor bering, yorliq oʻzgardi:\n" "%s" #: interactive/stdio.pm:151 #, c-format msgid "Re-submit" msgstr "Boshqadan joʻnatish" #. -PO: the string "default:LTR" can be translated *ONLY* as "default:LTR" #. -PO: or as "default:RTL", depending if your language is written from #. -PO: left to right, or from right to left; any other string is wrong. #: lang.pm:203 #, c-format msgid "default:LTR" msgstr "default:LTR" #: lang.pm:220 #, c-format msgid "Andorra" msgstr "Andorra" #: lang.pm:221 timezone.pm:226 #, c-format msgid "United Arab Emirates" msgstr "Birlashgan Arab Amirliklari" #: lang.pm:222 #, c-format msgid "Afghanistan" msgstr "Afgʻoniston" #: lang.pm:223 #, c-format msgid "Antigua and Barbuda" msgstr "Antigua va Barbuda" #: lang.pm:224 #, c-format msgid "Anguilla" msgstr "Angvilla" #: lang.pm:225 #, c-format msgid "Albania" msgstr "Albaniya" #: lang.pm:226 #, c-format msgid "Armenia" msgstr "Armaniston" #: lang.pm:227 #, c-format msgid "Netherlands Antilles" msgstr "Niderlandlar Antil Orollari" #: lang.pm:228 #, c-format msgid "Angola" msgstr "Angola" #: lang.pm:229 #, c-format msgid "Antarctica" msgstr "Antarktika" #: lang.pm:230 timezone.pm:271 #, c-format msgid "Argentina" msgstr "Argentina" #: lang.pm:231 #, c-format msgid "American Samoa" msgstr "Amerika Samoasi" #: lang.pm:232 mirror.pm:12 timezone.pm:229 #, c-format msgid "Austria" msgstr "Avstriya" #: lang.pm:233 mirror.pm:11 timezone.pm:267 #, c-format msgid "Australia" msgstr "Avstraliya" #: lang.pm:234 #, c-format msgid "Aruba" msgstr "Aruba" #: lang.pm:235 #, c-format msgid "Azerbaijan" msgstr "Ozarbayjon" #: lang.pm:236 #, c-format msgid "Bosnia and Herzegovina" msgstr "Bosniya va Gersogovina" #: lang.pm:237 #, c-format msgid "Barbados" msgstr "Barbados" #: lang.pm:238 timezone.pm:211 #, c-format msgid "Bangladesh" msgstr "Bangladesh" #: lang.pm:239 mirror.pm:13 timezone.pm:231 #, c-format msgid "Belgium" msgstr "Belgiya" #: lang.pm:240 #, c-format msgid "Burkina Faso" msgstr "Burkina-Fasso" #: lang.pm:241 timezone.pm:232 #, c-format msgid "Bulgaria" msgstr "Bolgariya" #: lang.pm:242 #, c-format msgid "Bahrain" msgstr "Bahrayn" #: lang.pm:243 #, c-format msgid "Burundi" msgstr "Burundi" #: lang.pm:244 #, c-format msgid "Benin" msgstr "Benin" #: lang.pm:245 #, c-format msgid "Bermuda" msgstr "Bermuda Orollari" #: lang.pm:246 #, c-format msgid "Brunei Darussalam" msgstr "Bruney Dorussalom" #: lang.pm:247 #, c-format msgid "Bolivia" msgstr "Boliviya" #: lang.pm:248 mirror.pm:14 timezone.pm:272 #, c-format msgid "Brazil" msgstr "Braziliya" #: lang.pm:249 #, c-format msgid "Bahamas" msgstr "Bagama Orollari" #: lang.pm:250 #, c-format msgid "Bhutan" msgstr "Butan" #: lang.pm:251 #, c-format msgid "Bouvet Island" msgstr "Buve Oroli" #: lang.pm:252 #, c-format msgid "Botswana" msgstr "Botsvana" #: lang.pm:253 timezone.pm:230 #, c-format msgid "Belarus" msgstr "Belorus" #: lang.pm:254 #, c-format msgid "Belize" msgstr "Beliz" #: lang.pm:255 mirror.pm:15 timezone.pm:261 #, c-format msgid "Canada" msgstr "Kanada" #: lang.pm:256 #, c-format msgid "Cocos (Keeling) Islands" msgstr "Kokos (Kiling) Orollari" #: lang.pm:257 #, c-format msgid "Congo (Kinshasa)" msgstr "Kongo (Kinshasa)" #: lang.pm:258 #, c-format msgid "Central African Republic" msgstr "Markaziy Afrika Respublikasi" #: lang.pm:259 #, c-format msgid "Congo (Brazzaville)" msgstr "Kongo (Brazzavil)" #: lang.pm:260 mirror.pm:39 timezone.pm:255 #, c-format msgid "Switzerland" msgstr "Shveysariya" #: lang.pm:261 #, c-format msgid "Cote d'Ivoire" msgstr "Kot d'Ivuar" #: lang.pm:262 #, c-format msgid "Cook Islands" msgstr "Kuk Orollari" #: lang.pm:263 timezone.pm:273 #, c-format msgid "Chile" msgstr "Chili" #: lang.pm:264 #, c-format msgid "Cameroon" msgstr "Kamerun" #: lang.pm:265 timezone.pm:212 #, c-format msgid "China" msgstr "Xitoy" #: lang.pm:266 #, c-format msgid "Colombia" msgstr "Kolumbiya" #: lang.pm:267 mirror.pm:16 #, c-format msgid "Costa Rica" msgstr "Kosta Rika" #: lang.pm:268 #, c-format msgid "Serbia & Montenegro" msgstr "Serbiya va Montenegro" #: lang.pm:269 #, c-format msgid "Cuba" msgstr "Kuba" #: lang.pm:270 #, c-format msgid "Cape Verde" msgstr "Keyp Verde" #: lang.pm:271 #, c-format msgid "Christmas Island" msgstr "Krismas Oroli" #: lang.pm:272 #, c-format msgid "Cyprus" msgstr "Kipr" #: lang.pm:273 mirror.pm:17 timezone.pm:233 #, c-format msgid "Czech Republic" msgstr "Chex Respublikasi" #: lang.pm:274 mirror.pm:22 timezone.pm:238 #, c-format msgid "Germany" msgstr "Germaniya" #: lang.pm:275 #, c-format msgid "Djibouti" msgstr "Jibuti" #: lang.pm:276 mirror.pm:18 timezone.pm:234 #, c-format msgid "Denmark" msgstr "Daniya" #: lang.pm:277 #, c-format msgid "Dominica" msgstr "Dominikan" #: lang.pm:278 #, c-format msgid "Dominican Republic" msgstr "Dominikan Respublikasi" #: lang.pm:279 #, c-format msgid "Algeria" msgstr "Jazoir" #: lang.pm:280 #, c-format msgid "Ecuador" msgstr "Ekvador" #: lang.pm:281 mirror.pm:19 timezone.pm:235 #, c-format msgid "Estonia" msgstr "Estoniya" #: lang.pm:282 #, c-format msgid "Egypt" msgstr "Misr" #: lang.pm:283 #, c-format msgid "Western Sahara" msgstr "Gʻarbiy Saxara" #: lang.pm:284 #, c-format msgid "Eritrea" msgstr "Eritriya" #: lang.pm:285 mirror.pm:37 timezone.pm:253 #, c-format msgid "Spain" msgstr "Ispaniya" #: lang.pm:286 #, c-format msgid "Ethiopia" msgstr "Efiopiya" #: lang.pm:287 mirror.pm:20 timezone.pm:236 #, c-format msgid "Finland" msgstr "Finlandiya" #: lang.pm:288 #, c-format msgid "Fiji" msgstr "Fiji" #: lang.pm:289 #, c-format msgid "Falkland Islands (Malvinas)" msgstr "Folklend (Malvin) Orollari" #: lang.pm:290 #, c-format msgid "Micronesia" msgstr "Mikroneziya" #: lang.pm:291 #, c-format msgid "Faroe Islands" msgstr "Farer Orollari" #: lang.pm:292 mirror.pm:21 timezone.pm:237 #, c-format msgid "France" msgstr "Fransiya" #: lang.pm:293 #, c-format msgid "Gabon" msgstr "Gabon" #: lang.pm:294 timezone.pm:257 #, c-format msgid "United Kingdom" msgstr "Buyuk Britaniya" #: lang.pm:295 #, c-format msgid "Grenada" msgstr "Grenada" #: lang.pm:296 #, c-format msgid "Georgia" msgstr "Gruziya" #: lang.pm:297 #, c-format msgid "French Guiana" msgstr "Fransuz Gvineya" #: lang.pm:298 #, c-format msgid "Ghana" msgstr "Gana" #: lang.pm:299 #, c-format msgid "Gibraltar" msgstr "Gibraltar" #: lang.pm:300 #, c-format msgid "Greenland" msgstr "Grenlandiya" #: lang.pm:301 #, c-format msgid "Gambia" msgstr "Gambiya" #: lang.pm:302 #, c-format msgid "Guinea" msgstr "Gvineya" #: lang.pm:303 #, c-format msgid "Guadeloupe" msgstr "Gvadelupa" #: lang.pm:304 #, c-format msgid "Equatorial Guinea" msgstr "Ekvatorial Gvineya" #: lang.pm:305 mirror.pm:23 timezone.pm:239 #, c-format msgid "Greece" msgstr "Gretsiya" #: lang.pm:306 #, c-format msgid "South Georgia and the South Sandwich Islands" msgstr "Janubiy Jorjiya va Janubiy Sendvich Orollari" #: lang.pm:307 timezone.pm:262 #, c-format msgid "Guatemala" msgstr "Gvatemala" #: lang.pm:308 #, c-format msgid "Guam" msgstr "Guam" #: lang.pm:309 #, c-format msgid "Guinea-Bissau" msgstr "Gvineya-Bissau" #: lang.pm:310 #, c-format msgid "Guyana" msgstr "Gviana" #: lang.pm:311 #, c-format msgid "Hong Kong SAR (China)" msgstr "Xitoy (Gonkong)" #: lang.pm:312 #, c-format msgid "Heard and McDonald Islands" msgstr "Xerd va MakDonald Orollari" #: lang.pm:313 #, c-format msgid "Honduras" msgstr "Gonduras" #: lang.pm:314 #, c-format msgid "Croatia" msgstr "Xorvatiya" #: lang.pm:315 #, c-format msgid "Haiti" msgstr "Gaiti" #: lang.pm:316 mirror.pm:24 timezone.pm:240 #, c-format msgid "Hungary" msgstr "Vengriya" #: lang.pm:317 timezone.pm:215 #, c-format msgid "Indonesia" msgstr "Indoneziya" #: lang.pm:318 mirror.pm:25 timezone.pm:241 #, c-format msgid "Ireland" msgstr "Irlandiya" #: lang.pm:319 mirror.pm:26 timezone.pm:217 #, c-format msgid "Israel" msgstr "Isroil" #: lang.pm:320 timezone.pm:214 #, c-format msgid "India" msgstr "Hindiston" #: lang.pm:321 #, c-format msgid "British Indian Ocean Territory" msgstr "Hind Okeanning Britaniya Yerlari" #: lang.pm:322 #, c-format msgid "Iraq" msgstr "Iroq" #: lang.pm:323 timezone.pm:216 #, c-format msgid "Iran" msgstr "Eron" #: lang.pm:324 #, c-format msgid "Iceland" msgstr "Islandiya" #: lang.pm:325 mirror.pm:27 timezone.pm:242 #, c-format msgid "Italy" msgstr "Italiya" #: lang.pm:326 #, c-format msgid "Jamaica" msgstr "Yamayka" #: lang.pm:327 #, c-format msgid "Jordan" msgstr "Iordan" #: lang.pm:328 mirror.pm:28 timezone.pm:218 #, c-format msgid "Japan" msgstr "Yaponiya" #: lang.pm:329 #, c-format msgid "Kenya" msgstr "Keniya" #: lang.pm:330 #, c-format msgid "Kyrgyzstan" msgstr "Qirgʻiziston" #: lang.pm:331 #, c-format msgid "Cambodia" msgstr "Kambodja" #: lang.pm:332 #, c-format msgid "Kiribati" msgstr "Kiribati" #: lang.pm:333 #, c-format msgid "Comoros" msgstr "Komoros" #: lang.pm:334 #, c-format msgid "Saint Kitts and Nevis" msgstr "Sent-Kristofer va Nevis" #: lang.pm:335 #, c-format msgid "Korea (North)" msgstr "Shimoliy Koreya" #: lang.pm:336 timezone.pm:219 #, c-format msgid "Korea" msgstr "Koreya" #: lang.pm:337 #, c-format msgid "Kuwait" msgstr "Quvayt" #: lang.pm:338 #, c-format msgid "Cayman Islands" msgstr "Kayman Orollari" #: lang.pm:339 #, c-format msgid "Kazakhstan" msgstr "Qozogʻiston" #: lang.pm:340 #, c-format msgid "Laos" msgstr "Laos" #: lang.pm:341 #, c-format msgid "Lebanon" msgstr "Lebanon" #: lang.pm:342 #, c-format msgid "Saint Lucia" msgstr "Sent-Lyusiya" #: lang.pm:343 #, c-format msgid "Liechtenstein" msgstr "Lixtenshteyn" #: lang.pm:344 #, c-format msgid "Sri Lanka" msgstr "Shri Lanka" #: lang.pm:345 #, c-format msgid "Liberia" msgstr "Liberiya" #: lang.pm:346 #, c-format msgid "Lesotho" msgstr "Lesoto" #: lang.pm:347 timezone.pm:243 #, c-format msgid "Lithuania" msgstr "Litva" #: lang.pm:348 timezone.pm:244 #, c-format msgid "Luxembourg" msgstr "Lyuksemburg" #: lang.pm:349 #, c-format msgid "Latvia" msgstr "Latviya" #: lang.pm:350 #, c-format msgid "Libya" msgstr "Libiya" #: lang.pm:351 #, c-format msgid "Morocco" msgstr "Marokash" #: lang.pm:352 #, c-format msgid "Monaco" msgstr "Monako" #: lang.pm:353 #, c-format msgid "Moldova" msgstr "Moldova" #: lang.pm:354 #, c-format msgid "Madagascar" msgstr "Madagaskar" #: lang.pm:355 #, c-format msgid "Marshall Islands" msgstr "Marshall Orollari" #: lang.pm:356 #, c-format msgid "Macedonia" msgstr "Makedoniya" #: lang.pm:357 #, c-format msgid "Mali" msgstr "Mali" #: lang.pm:358 #, c-format msgid "Myanmar" msgstr "Myanmar" #: lang.pm:359 #, c-format msgid "Mongolia" msgstr "Moʻgʻiliston" #: lang.pm:360 #, c-format msgid "Northern Mariana Islands" msgstr "Shimoliy Mariana Orollari" #: lang.pm:361 #, c-format msgid "Martinique" msgstr "Martinika" #: lang.pm:362 #, c-format msgid "Mauritania" msgstr "Mavritaniya" #: lang.pm:363 #, c-format msgid "Montserrat" msgstr "Monserrat" #: lang.pm:364 #, c-format msgid "Malta" msgstr "Malta" #: lang.pm:365 #, c-format msgid "Mauritius" msgstr "Mavrikiy" #: lang.pm:366 #, c-format msgid "Maldives" msgstr "Maldiv Orollari" #: lang.pm:367 #, c-format msgid "Malawi" msgstr "Malavi" #: lang.pm:368 timezone.pm:263 #, c-format msgid "Mexico" msgstr "Meksika" #: lang.pm:369 timezone.pm:220 #, c-format msgid "Malaysia" msgstr "Malayziya" #: lang.pm:370 #, c-format msgid "Mozambique" msgstr "Mozambik" #: lang.pm:371 #, c-format msgid "Namibia" msgstr "Namibiya" #: lang.pm:372 #, c-format msgid "New Caledonia" msgstr "Yangi Kaledoniya" #: lang.pm:373 #, c-format msgid "Niger" msgstr "Niger" #: lang.pm:374 #, c-format msgid "Norfolk Island" msgstr "Norfolk Oroli" #: lang.pm:375 #, c-format msgid "Nigeria" msgstr "Nigeriya" #: lang.pm:376 #, c-format msgid "Nicaragua" msgstr "Nikaragua" #: lang.pm:377 mirror.pm:29 timezone.pm:245 #, c-format msgid "Netherlands" msgstr "Niderlandlar" #: lang.pm:378 mirror.pm:31 timezone.pm:246 #, c-format msgid "Norway" msgstr "Norvegiya" #: lang.pm:379 #, c-format msgid "Nepal" msgstr "Nepal" #: lang.pm:380 #, c-format msgid "Nauru" msgstr "Nauru" #: lang.pm:381 #, c-format msgid "Niue" msgstr "Niue" #: lang.pm:382 mirror.pm:30 timezone.pm:268 #, c-format msgid "New Zealand" msgstr "Yangi Zelandiya" #: lang.pm:383 #, c-format msgid "Oman" msgstr "Ummon" #: lang.pm:384 #, c-format msgid "Panama" msgstr "Panama" #: lang.pm:385 #, c-format msgid "Peru" msgstr "Peru" #: lang.pm:386 #, c-format msgid "French Polynesia" msgstr "Fransuz Polineziya" #: lang.pm:387 #, c-format msgid "Papua New Guinea" msgstr "Papua Yangi Gvineya" #: lang.pm:388 timezone.pm:221 #, c-format msgid "Philippines" msgstr "Filippin" #: lang.pm:389 #, c-format msgid "Pakistan" msgstr "Pokiston" #: lang.pm:390 mirror.pm:32 timezone.pm:247 #, c-format msgid "Poland" msgstr "Polsha" #: lang.pm:391 #, c-format msgid "Saint Pierre and Miquelon" msgstr "Sent-Per va Mikelon" #: lang.pm:392 #, c-format msgid "Pitcairn" msgstr "Pitkern" #: lang.pm:393 #, c-format msgid "Puerto Rico" msgstr "Puerto-Riko" #: lang.pm:394 #, c-format msgid "Palestine" msgstr "Falastin" #: lang.pm:395 mirror.pm:33 timezone.pm:248 #, c-format msgid "Portugal" msgstr "Portugaliya" #: lang.pm:396 #, c-format msgid "Paraguay" msgstr "Paragvay" #: lang.pm:397 #, c-format msgid "Palau" msgstr "Palau" #: lang.pm:398 #, c-format msgid "Qatar" msgstr "Qatar" #: lang.pm:399 #, c-format msgid "Reunion" msgstr "Reyunion" #: lang.pm:400 timezone.pm:249 #, c-format msgid "Romania" msgstr "Ruminiya" #: lang.pm:401 mirror.pm:34 #, c-format msgid "Russia" msgstr "Rossiya" #: lang.pm:402 #, c-format msgid "Rwanda" msgstr "Ruanda" #: lang.pm:403 #, c-format msgid "Saudi Arabia" msgstr "Saudiya Arabistoni" #: lang.pm:404 #, c-format msgid "Solomon Islands" msgstr "Solomon Orollari" #: lang.pm:405 #, c-format msgid "Seychelles" msgstr "Seyshel Orollari" #: lang.pm:406 #, c-format msgid "Sudan" msgstr "Sudan" #: lang.pm:407 mirror.pm:38 timezone.pm:254 #, c-format msgid "Sweden" msgstr "Shvetsiya" #: lang.pm:408 timezone.pm:222 #, c-format msgid "Singapore" msgstr "Singapur" #: lang.pm:409 #, c-format msgid "Saint Helena" msgstr "Avliyo Yelena Oroli" #: lang.pm:410 timezone.pm:252 #, c-format msgid "Slovenia" msgstr "Sloveniya" #: lang.pm:411 #, c-format msgid "Svalbard and Jan Mayen Islands" msgstr "Svalbard va Yan Mayen Orollari" #: lang.pm:412 mirror.pm:35 timezone.pm:251 #, c-format msgid "Slovakia" msgstr "Slovakiya" #: lang.pm:413 #, c-format msgid "Sierra Leone" msgstr "Serra-Leone" #: lang.pm:414 #, c-format msgid "San Marino" msgstr "San-Marino" #: lang.pm:415 #, c-format msgid "Senegal" msgstr "Senegal" #: lang.pm:416 #, c-format msgid "Somalia" msgstr "Somali" #: lang.pm:417 #, c-format msgid "Suriname" msgstr "Surinam" #: lang.pm:418 #, c-format msgid "Sao Tome and Principe" msgstr "San-Tome va Prinsipi" #: lang.pm:419 #, c-format msgid "El Salvador" msgstr "Salvador" #: lang.pm:420 #, c-format msgid "Syria" msgstr "Suriya" #: lang.pm:421 #, c-format msgid "Swaziland" msgstr "Svazilend" #: lang.pm:422 #, c-format msgid "Turks and Caicos Islands" msgstr "Turks va Kaikos Orollari" #: lang.pm:423 #, c-format msgid "Chad" msgstr "Chad" #: lang.pm:424 #, c-format msgid "French Southern Territories" msgstr "Fransiyaning Janubiy Yerlari" #: lang.pm:425 #, c-format msgid "Togo" msgstr "Togo" #: lang.pm:426 mirror.pm:41 timezone.pm:224 #, c-format msgid "Thailand" msgstr "Tailand" #: lang.pm:427 #, c-format msgid "Tajikistan" msgstr "Tojikiston" #: lang.pm:428 #, c-format msgid "Tokelau" msgstr "Tokelau" #: lang.pm:429 #, c-format msgid "East Timor" msgstr "Sharqiy Timur" #: lang.pm:430 #, c-format msgid "Turkmenistan" msgstr "Turkmaniston" #: lang.pm:431 #, c-format msgid "Tunisia" msgstr "Tunis" #: lang.pm:432 #, c-format msgid "Tonga" msgstr "Tonga" #: lang.pm:433 timezone.pm:225 #, c-format msgid "Turkey" msgstr "Turkiya" #: lang.pm:434 #, c-format msgid "Trinidad and Tobago" msgstr "Trinidad va Tobago" #: lang.pm:435 #, c-format msgid "Tuvalu" msgstr "Tuvalu" #: lang.pm:436 mirror.pm:40 timezone.pm:223 #, c-format msgid "Taiwan" msgstr "Tayvan" #: lang.pm:437 timezone.pm:208 #, c-format msgid "Tanzania" msgstr "Tanzaniya" #: lang.pm:438 timezone.pm:256 #, c-format msgid "Ukraine" msgstr "Ukraina" #: lang.pm:439 #, c-format msgid "Uganda" msgstr "Uganda" #: lang.pm:440 #, c-format msgid "United States Minor Outlying Islands" msgstr "Kichik Uzoqlashgan Orollar Qoʻshma Shtatlari" #: lang.pm:441 mirror.pm:42 timezone.pm:264 #, c-format msgid "United States" msgstr "Qoʻshma Shtatlar" #: lang.pm:442 #, c-format msgid "Uruguay" msgstr "Urugvay" #: lang.pm:443 #, c-format msgid "Uzbekistan" msgstr "Oʻzbekiston" #: lang.pm:444 #, c-format msgid "Vatican" msgstr "Vatikan" #: lang.pm:445 #, c-format msgid "Saint Vincent and the Grenadines" msgstr "Sent-Vinsent va Grenadina" #: lang.pm:446 #, c-format msgid "Venezuela" msgstr "Venesuela" #: lang.pm:447 #, c-format msgid "Virgin Islands (British)" msgstr "Virginiya Orollari (Angliya)" #: lang.pm:448 #, c-format msgid "Virgin Islands (U.S.)" msgstr "Virginiya Orollari (AQSH)" #: lang.pm:449 #, c-format msgid "Vietnam" msgstr "Vetnam" #: lang.pm:450 #, c-format msgid "Vanuatu" msgstr "Vanuatu" #: lang.pm:451 #, c-format msgid "Wallis and Futuna" msgstr "Uollis va Futuna Orollari" #: lang.pm:452 #, c-format msgid "Samoa" msgstr "Samoa" #: lang.pm:453 #, c-format msgid "Yemen" msgstr "Yaman" #: lang.pm:454 #, c-format msgid "Mayotte" msgstr "Mayot" #: lang.pm:455 mirror.pm:36 timezone.pm:207 #, c-format msgid "South Africa" msgstr "Janubiy Afrika" #: lang.pm:456 #, c-format msgid "Zambia" msgstr "Zambiya" #: lang.pm:457 #, c-format msgid "Zimbabwe" msgstr "Zimbabve" #: lang.pm:1227 #, c-format msgid "Welcome to %s" msgstr "%s'ga marhamat" #: lvm.pm:92 #, c-format msgid "Moving used physical extents to other physical volumes failed" msgstr "" #: lvm.pm:149 #, c-format msgid "Physical volume %s is still in use" msgstr "" #: lvm.pm:159 #, c-format msgid "Remove the logical volumes first\n" msgstr "" #: lvm.pm:202 #, c-format msgid "The bootloader can't handle /boot on multiple physical volumes" msgstr "" #. -PO: keep the double empty lines between sections, this is formatted a la LaTeX #: messages.pm:11 #, fuzzy, c-format msgid "" "Introduction\n" "\n" "The operating system and the different components available in the Mageia " "distribution \n" "shall be called the \"Software Products\" hereafter. The Software Products " "include, but are not \n" "restricted to, the set of programs, methods, rules and documentation related " "to the operating \n" "system and the different components of the Mageia distribution, and any " "applications \n" "distributed with these products provided by Mageia's licensors or " "suppliers.\n" "\n" "\n" "1. License Agreement\n" "\n" "Please read this document carefully. This document is a license agreement " "between you and \n" "Mageia which applies to the Software Products.\n" "By installing, duplicating or using any of the Software Products in any " "manner, you explicitly \n" "accept and fully agree to conform to the terms and conditions of this " "License. \n" "If you disagree with any portion of the License, you are not allowed to " "install, duplicate or use \n" "the Software Products. \n" "Any attempt to install, duplicate or use the Software Products in a manner " "which does not comply \n" "with the terms and conditions of this License is void and will terminate " "your rights under this \n" "License. Upon termination of the License, you must immediately destroy all " "copies of the \n" "Software Products.\n" "\n" "\n" "2. Limited Warranty\n" "\n" "The Software Products and attached documentation are provided \"as is\", " "with no warranty, to the \n" "extent permitted by law.\n" "Neither Mageia nor its licensors or suppliers will, in any circumstances and " "to the extent \n" "permitted by law, be liable for any special, incidental, direct or indirect " "damages whatsoever \n" "(including without limitation damages for loss of business, interruption of " "business, financial \n" "loss, legal fees and penalties resulting from a court judgment, or any other " "consequential loss) \n" "arising out of the use or inability to use the Software Products, even if " "Mageia or its \n" "licensors or suppliers have been advised of the possibility or occurrence of " "such damages.\n" "\n" "LIMITED LIABILITY LINKED TO POSSESSING OR USING PROHIBITED SOFTWARE IN SOME " "COUNTRIES\n" "\n" "To the extent permitted by law, neither Mageia nor its licensors, suppliers " "or\n" "distributors will, in any circumstances, be liable for any special, " "incidental, direct or indirect \n" "damages whatsoever (including without limitation damages for loss of " "business, interruption of \n" "business, financial loss, legal fees and penalties resulting from a court " "judgment, or any \n" "other consequential loss) arising out of the possession and use of software " "components or \n" "arising out of downloading software components from one of Mageia sites " "which are \n" "prohibited or restricted in some countries by local laws.\n" "This limited liability applies to, but is not restricted to, the strong " "cryptography components \n" "included in the Software Products.\n" "However, because some jurisdictions do not allow the exclusion or limitation " "or liability for \n" "consequential or incidental damages, the above limitation may not apply to " "you. \n" "\n" "\n" "3. The GPL License and Related Licenses\n" "\n" "The Software Products consist of components created by different persons or " "entities.\n" "Most of these licenses allow you to use, duplicate, adapt or redistribute " "the components which \n" "they cover. Please read carefully the terms and conditions of the license " "agreement for each component \n" "before using any component. Any question on a component license should be " "addressed to the component \n" "licensor or supplier and not to Mageia.\n" "The programs developed by Mageia are governed by the GPL License. " "Documentation written \n" "by Mageia is governed by a specific license. Please refer to the " "documentation for \n" "further details.\n" "\n" "\n" "4. Intellectual Property Rights\n" "\n" "All rights to the components of the Software Products belong to their " "respective authors and are \n" "protected by intellectual property and copyright laws applicable to software " "programs.\n" "Mageia and its suppliers and licensors reserves their rights to modify or " "adapt the Software \n" "Products, as a whole or in parts, by all means and for all purposes.\n" "\"Mageia\", \"Mageia\" and associated logos are trademarks of Mageia \n" "\n" "\n" "5. Governing Laws \n" "\n" "If any portion of this agreement is held void, illegal or inapplicable by a " "court judgment, this \n" "portion is excluded from this contract. You remain bound by the other " "applicable sections of the \n" "agreement.\n" "The terms and conditions of this License are governed by the Laws of " "France.\n" "All disputes on the terms of this license will preferably be settled out of " "court. As a last \n" "resort, the dispute will be referred to the appropriate Courts of Law of " "Paris - France.\n" "For any question on this document, please contact Mageia." msgstr "" "Kirish\n" "\n" "Mageia distributivida mavjud boʻlgan operatsion tizim va uning turli " "qismlari \n" "bundan buyon \"Dasturiy Mahsulotlar\" deb yuritiladi. Dasturiy mahsulotlar \n" "Mageia distributivning qismlari va operatsion tizim bilan bogʻliq boʻlgan\n" "dasturlar toʻplami, usullar, qoidalar va qoʻllanmalarni oʻz ichiga oladi, " "ammo bu bilan cheklanmaydi.\n" "\n" "\n" "1. Litsenziya kelishuvi\n" "\n" "Iltimos, ushbu hujjatni diqqat bilan oʻqib chiqing. Bu hujjat Siz bilan " "Mageia \n" "oʻrtasida Dasturiy Mahsulotlari boʻyicha imzolanadigan litsenziya " "kelishuvidir.\n" "Dasturiy Mahsulotlarni har qanday maqsad bilan oʻrnatib, koʻpaytirib yoki \n" "ulardan foydalanib Siz mazkur Litsenziyaning shartlari va qoidalarini toʻliq " "qabul \n" "qilib, ularga rozi ekanligingizni bildirgan boʻlasiz. Agar mazkur \n" "Litsenziyaning biror qismi Sizga toʻgʻri kelmasa, u holda Sizga Dasturiy " "Mahsulotlarni\n" "oʻrnatish, koʻpaytirish yoki ulardan foydalanishga ruxsat berilmaydi. Mazkur " "litsenziyaning \n" "shartlariga zid holda Dasturiy Mahsulotlarni oʻrnatish, koʻpaytirish va " "ulardan foydalanishga \n" "har qanday urinish ushbu Litsenziya asosida Sizga berilgan barcha " "huquqlarni\n" "bekor qiladi. Litsenziya kelishuvi bekor qilingach, Siz Dasturiy " "Mahsulotlarning\n" "barcha nusxalarini darhol oʻchirib tashlashingiz lozim.\n" "\n" "\n" "2. Cheklangan kafolat majburiyatlari\n" "\n" "Dasturiy Mahsulotlar va ularga ilova qilingan qoʻllanmalar \"oʻz holicha\", " "qonunda yoʻl qoʻyilgan\n" "darajada hech qanday kafolatlarsiz taqdim qilinadi. Mageia qonunda yoʻl " "qoʻyilgan\n" "darajada hech qanday holatda Dasturiy Mahsulotlardan foydalanish yoki " "foydalanmaslik oqibatida\n" "tasodifiy, toʻgʻridan-toʻgʻri, bevosita yoki bilvosita yetkazilgan zararlar " "(shu jumladan biznesning\n" "kasod boʻlishi, tijorat faoliyatidagi uzilishlar, moliyaviy zararlar, sud " "mahkamalari natijasidagi\n" "sud xarajatlari yoki jarimalar yoki boshqa har qanday bilvosita " "yoʻqotishlar) uchun, hatto Mageia'ga\n" "shunday zarar koʻrish imkoniyati yoki holatlari maʼlum boʻlgan taqdirda " "ham,\n" "javobgar boʻlmaydi.\n" "\n" "BAʼZI MAMLAKATLARDA MAN QILINGAN DASTURIY MAHSULOTLARGA EGALIK QILISH\n" "YOKI ULARDAN FOYDALANISH BILAN BOGʻLIQ CHEKLANGAN MASʼULIYAT\n" "\n" "Mageia yoki uning tarqatuvchilari qonunda yoʻl qoʻyilgan darajada hech " "qanday holatda\n" "baʼzi mamlakatlarning mahalliy qonunlari bilan cheklangan yoki man qilingan " "dasturiy\n" "mahsulotlarning qismlariga egalik qilish va ulardan foydalanish, yoki Mageia " "Linux\n" "saytlarining biridan dasturiy mahsulotning qismlarini koʻchirib olish " "oqibatida tasodifiy,\n" "toʻgʻridan-toʻgʻri, bevosita yoki bilvosita yetkazilgan zararlar (shu " "jumladan biznesning kasod boʻlishi,\n" "tijorat faoliyatidagi uzilishlar, moliyaviy zararlar, sud mahkamalari " "natijasidagi sud\n" "xarajatlari yoki jarimalar yoki boshqa har qanday bilvosita yoʻqotishlar) " "uchun javobgar boʻlmaydi.\n" "Cheklangan maʼsuliyat Dasturiy Mahsulotlarga kiritiladigan kuchli " "kriptografiya qismlariga\n" "nisbatan ham qoʻllaniladi, ammo bu bilan cheklanmaydi.\n" "\n" "\n" "3. GPL litsenziyasi va unga bogʻliq litsenziyalar\n" "\n" "Dasturiy Mahsulotlar turli kishilar yoki tashkilotlar tomonidan yaratilgan " "qismlardan iboratdir.\n" "Ushbu qismlarning koʻpchiligi bundan buyon \"GPL\" deb ataladigan GNU " "General Public Licence\n" "shartlari va qoidalari yoki shunga oʻxshash litsenziyalar taʼsiri ostidadir. " "Ushbu litsenziyalarning\n" "koʻpchiligi oʻz taʼsiri ostidagi qismlarni Sizga foydalanish, koʻpaytirish, " "moslashtirish yoki tarqatish\n" "huquqini beradi. Iltimos, har qanday qismdan foydalanishdan avval " "qismlarning har biri\n" "uchun litsenziya kelishuvining shartlari va qoidalarini diqqat bilan oʻqib " "chiqing. Qismning\n" "litsenziyasiga oid har qanday savollar Mageia'ga emas, balki qismning " "muallifiga yuborilishi\n" "lozim. Mageia tomonidan ishlab chiqilgan dasturlar GPL litsenziyasi taʼsiri\n" "ostidadir. Mageia tomonidan yozilgan qoʻllanmalar esa maxsus litsenziya " "taʼsiri\n" "ostidadir. Iltimos, qoʻshimcha maʼlumot uchun qoʻllanmalarga murojaat " "qiling.\n" "\n" "\n" "4. Intellektual mulk huquqlari\n" "\n" "Dasturiy Mahsulotlarning qismlariga oid barcha huquqlar ularning bevosita " "mualliflariga\n" "tegishli boʻlib, intellektual mulk va dasturiy mahsulotlarga oid mualliflik " "huquqi\n" "toʻgʻrisidagi qonunlar bilan himoyalanadi. Mageia Dasturiy Mahsulotlarni " "toʻliq\n" "yoki qisman, har qanday yoʻl bilan va istalgan maqsadlarda oʻzgartirish yoki " "moslashtirish huquqini\n" "oʻzida saqlab qoladi. \"Mageia\", \"Mageia\" va tegishli belgilar Mageia'ga\n" "tegishli savdo belgilaridir.\n" "\n" "\n" "5. Boshqaruvchi qonunlar\n" "\n" "Agar mazkur kelishuvning biror qismi sud qarori bilan bekor qilinsa, " "noqonuniy yoki\n" "amaldagi qonunchilikka zid topilsa, bu qism mazkur kelishuvdan chiqarib " "tashlanadi. Sizning\n" "hatti-harakatlaringiz kelishuvning boshqa yaroqli boʻlimlari bilan cheklanib " "qolaveradi.\n" "Mazkur Litsenziyaning shartlari va qoidalari Fransiya qonunchiligi taʼsiri " "ostidadir.\n" "Mazkur litsenziyaning shartlari va qoidalariga oid har qanday nizolar asosan " "sudda muhokama qilinadi.\n" "Soʻnggi navbatda masalaning koʻrilishi tegishli Parij (Fransiya) Qonunchilik " "sudiga havola qilinadi.\n" "Iltimos, mazkur hujjatga oid har qanday savollar boʻyicha Mageia bilan " "bogʻlaning.\n" #: messages.pm:93 #, c-format msgid "" "Warning: Free Software may not necessarily be patent free, and some Free\n" "Software included may be covered by patents in your country. For example, " "the\n" "MP3 decoders included may require a licence for further usage (see\n" "http://www.mp3licensing.com for more details). If you are unsure if a " "patent\n" "may be applicable to you, check your local laws." msgstr "" #. -PO: keep the double empty lines between sections, this is formatted a la LaTeX #: messages.pm:102 #, fuzzy, c-format msgid "" "Congratulations, installation is complete.\n" "Remove the boot media and press Enter to reboot.\n" "\n" "\n" "For information on fixes which are available for this release of Mageia,\n" "consult the Errata available from:\n" "\n" "\n" "%s\n" "\n" "\n" "Information on configuring your system is available in the post\n" "install chapter of the Official Mageia User's Guide." msgstr "" "Tabriklaymiz! Oʻrnatish tugadi.\n" "Yuklovchi manbani olib tashlang va kompyuterni\n" "oʻchirib-yoqish uchun ENTER tugmasini bosing.\n" "\n" "\n" "Mageia'ninig bu versiyasi uchun yangilanishlar haqida\n" "maʼlumot quyidagi Errata veb-sahifasida mavjud:\n" "\n" "\n" "%s\n" "\n" "\n" "Tizimni moslash haqida maʼlumot Mageia\n" "foydalanuvchilari uchun rasmiy qoʻllanmasida mavjud." #: modules/interactive.pm:19 #, c-format msgid "This driver has no configuration parameter!" msgstr "Ushbu drayverda sozlash parametrlari yoʻq!" #: modules/interactive.pm:22 #, c-format msgid "Module configuration" msgstr "Modulni sozlash" #: modules/interactive.pm:22 #, c-format msgid "You can configure each parameter of the module here." msgstr "Modulning hamma moslamalarini shu yerda moslashingiz mumkin." #: modules/interactive.pm:64 #, c-format msgid "Found %s interfaces" msgstr "%s interfeyslar topildi" #: modules/interactive.pm:65 #, c-format msgid "Do you have another one?" msgstr "Sizda yana boshqasi bormi?" #: modules/interactive.pm:66 #, c-format msgid "Do you have any %s interfaces?" msgstr "Sizda %s interfeysi bormi?" #: modules/interactive.pm:72 #, c-format msgid "See hardware info" msgstr "Asbob-uskuna haqida maʼlumotga qarang" #: modules/interactive.pm:83 #, c-format msgid "Installing driver for USB controller" msgstr "USB kontrolleri uchun drayver oʻrnatilmoqda" #: modules/interactive.pm:84 #, c-format msgid "Installing driver for firewire controller %s" msgstr "Firewire kontrolleri %s uchun drayver oʻrnatilmoqda" #: modules/interactive.pm:85 #, c-format msgid "Installing driver for hard disk drive controller %s" msgstr "Qattiq disk kontrolleri %s uchun drayver oʻrnatilmoqda" #: modules/interactive.pm:86 #, c-format msgid "Installing driver for ethernet controller %s" msgstr "Tarmoq kartasi (%s) uchun drayver oʻrnatilmoqda" #. -PO: the first %s is the card type (scsi, network, sound,...) #. -PO: the second is the vendor+model name #: modules/interactive.pm:97 #, c-format msgid "Installing driver for %s card %s" msgstr "%s kartasi (%s) uchun drayver oʻrnatilmoqda" #: modules/interactive.pm:100 #, c-format msgid "Configuring Hardware" msgstr "Asbob-uskunalarni sozlash" #: modules/interactive.pm:111 #, c-format msgid "" "You may now provide options to module %s.\n" "Note that any address should be entered with the prefix 0x like '0x123'" msgstr "" #: modules/interactive.pm:117 #, c-format msgid "" "You may now provide options to module %s.\n" "Options are in format ``name=value name2=value2 ...''.\n" "For instance, ``io=0x300 irq=7''" msgstr "" "Endi %s moduliga moslamalarni kiritishingiz mumkin.\n" "Parametrlar \"nomi=qiymati nomi2=qiymati2\" koʻrinishda.\n" "Masalan, \"io=0x300 irq=7\"" #: modules/interactive.pm:119 #, c-format msgid "Module options:" msgstr "Modulning parametrlari:" #. -PO: the %s is the driver type (scsi, network, sound,...) #: modules/interactive.pm:132 #, c-format msgid "Which %s driver should I try?" msgstr "Qaysi %s drayverni sinab koʻray?" #: modules/interactive.pm:141 #, c-format msgid "" "In some cases, the %s driver needs to have extra information to work\n" "properly, although it normally works fine without them. Would you like to " "specify\n" "extra options for it or allow the driver to probe your machine for the\n" "information it needs? Occasionally, probing will hang a computer, but it " "should\n" "not cause any damage." msgstr "" #: modules/interactive.pm:145 #, c-format msgid "Autoprobe" msgstr "Avto-aniqlash" #: modules/interactive.pm:145 #, c-format msgid "Specify options" msgstr "Parametrlarni aniqlash" #: modules/interactive.pm:157 #, c-format msgid "" "Loading module %s failed.\n" "Do you want to try again with other parameters?" msgstr "" "%s modulini yuklash muvaffaqiyatsiz tugadi.\n" "Boshqa moslamalar bilan yana urinib koʻrishni istaysizmi?" #: mygtk2.pm:1540 mygtk2.pm:1541 #, c-format msgid "Password is trivial to guess" msgstr "Maxfiy soʻz juda sodda" #: mygtk2.pm:1542 #, c-format msgid "Password should be resistant to basic attacks" msgstr "Maxfiy soʻz oddiy hujumlarga chidamli boʻlishi kerak" #: mygtk2.pm:1543 mygtk2.pm:1544 #, c-format msgid "Password seems secure" msgstr "Maxfiy soʻz xavfsizga oʻxshaydi" #: partition_table.pm:428 #, c-format msgid "mount failed: " msgstr "ulash muvaffaqiyatsiz tugadi: " #: partition_table.pm:540 #, c-format msgid "Extended partition not supported on this platform" msgstr "Ushbu platformada kengaytirilgan disk qismi qoʻllanilmaydi" #: partition_table.pm:558 #, c-format msgid "" "You have a hole in your partition table but I cannot use it.\n" "The only solution is to move your primary partitions to have the hole next " "to the extended partitions." msgstr "" #: partition_table/raw.pm:288 #, c-format msgid "" "Something bad is happening on your hard disk drive. \n" "A test to check the integrity of data has failed. \n" "It means writing anything on the disk will end up with random, corrupted " "data." msgstr "" #: pkgs.pm:252 pkgs.pm:255 pkgs.pm:268 #, c-format msgid "Unused packages removal" msgstr "Ishlatilmaydigan paketlarni olib tashlash" #: pkgs.pm:252 #, c-format msgid "Finding unused hardware packages..." msgstr "Ishlatilmaydigan uskuna paketlari qidirilmoqda..." #: pkgs.pm:255 #, c-format msgid "Finding unused localization packages..." msgstr "Ishlatilmaydigan mahalliylashtirish paketlari qidirilmoqda..." #: pkgs.pm:269 #, fuzzy, c-format msgid "" "We have detected that some packages are not needed for your system " "configuration." msgstr "Baʼzi paketlar joriy tizim moslamasi uchun kerak emas deb aniqlandi." #: pkgs.pm:270 #, c-format msgid "We will remove the following packages, unless you choose otherwise:" msgstr "" "Agar hech narsani oʻzgartirmasangiz, quyidagi paketlar olib tashlanadi:" #: pkgs.pm:273 pkgs.pm:274 #, c-format msgid "Unused hardware support" msgstr "Foydalanilmaydigan uskunalar qoʻllanuvi" #: pkgs.pm:277 pkgs.pm:278 #, c-format msgid "Unused localization" msgstr "Ishlatilmaydigan mahalliylashtirish" #: raid.pm:42 #, c-format msgid "Cannot add a partition to _formatted_ RAID %s" msgstr "_Formatlangan_ RAID %s ga disk qismini qoʻshib boʻlmadi" #: raid.pm:165 #, fuzzy, c-format msgid "Not enough partitions for RAID level %d\n" msgstr "RAID'ni %d chi darajasi uchun diskning yetarli qismlari mavjud emas\n" #: scanner.pm:96 #, c-format msgid "Could not create directory /usr/share/sane/firmware!" msgstr "/usr/share/sane/firmware direktoriyasini yaratib boʻlmadi!" #: scanner.pm:107 #, c-format msgid "Could not create link /usr/share/sane/%s!" msgstr "/usr/share/sane/%s bogʻlamasini yaratib boʻlmadi!" #: scanner.pm:114 #, c-format msgid "Could not copy firmware file %s to /usr/share/sane/firmware!" msgstr "" "%s proshivka faylidan /usr/share/sane/firmware ga nusxa olib boʻlmadi!" #: scanner.pm:121 #, c-format msgid "Could not set permissions of firmware file %s!" msgstr "%s proshivka fayli uchun huquqlarni oʻrnatib boʻlmayapti!" #: scanner.pm:200 #, c-format msgid "Scannerdrake" msgstr "Scannerdrake" #: scanner.pm:201 #, c-format msgid "Could not install the packages needed to share your scanner(s)." msgstr "" "Skaner(lar)ni boʻlish uchun foydalaniladigan paketlarni oʻrnatib boʻlmadi." #: scanner.pm:202 #, c-format msgid "Your scanner(s) will not be available for non-root users." msgstr "Skaner(lar) uchun oddiy foydalanuvchilarga ruxsat yoʻq." #: security/help.pm:11 #, c-format msgid "Accept bogus IPv4 error messages." msgstr "bogus IPv4 xatolik xabarini qabul qilish." #: security/help.pm:13 #, c-format msgid "Accept broadcasted icmp echo." msgstr "Brodkast icmp exo paketini qabul qilish." #: security/help.pm:15 #, c-format msgid "Accept icmp echo." msgstr "icmp exo paketini qabul qilish." #: security/help.pm:17 #, c-format msgid "Allow autologin." msgstr "Avto-kirishga ruxsat berish." #. -PO: here "ALL" is a value in a pull-down menu; translate it the same as "ALL" is #: security/help.pm:21 #, c-format msgid "" "If set to \"ALL\", /etc/issue and /etc/issue.net are allowed to exist.\n" "\n" "If set to \"None\", no issues are allowed.\n" "\n" "Else only /etc/issue is allowed." msgstr "" #: security/help.pm:27 #, c-format msgid "Allow reboot by the console user." msgstr "Terminal orqali kompyuterni oʻchirib-yoqishga ruxsat etish." #: security/help.pm:29 #, c-format msgid "Allow remote root login." msgstr "Root foydalanuvchisiga masofadan kirishiga ruxsat etish." #: security/help.pm:31 #, c-format msgid "Allow direct root login." msgstr "Root foydalanuvchisiga toʻgʻridan-toʻgʻri kirishiga ruxsat etish." #: security/help.pm:33 #, c-format msgid "" "Allow the list of users on the system on display managers (kdm and gdm)." msgstr "" "Oyna boshqaruvchilarida (kdm va gdm) foydalanuvchilar roʻyxatini chiqarish." #: security/help.pm:35 #, c-format msgid "" "Allow to export display when\n" "passing from the root account to the other users.\n" "\n" "See pam_xauth(8) for more details.'" msgstr "" "Root foydalanuvchisidan boshqasiga oʻtganda\n" "displeyni eksport qilishga ruxsat berish.\n" "\n" "Tafsilot uchun pam_xauth(8) ga qarang.'" #: security/help.pm:40 #, c-format msgid "" "Allow X connections:\n" "\n" "- \"All\" (all connections are allowed),\n" "\n" "- \"Local\" (only connection from local machine),\n" "\n" "- \"None\" (no connection)." msgstr "" "X ulanishga ruxsat berish:\n" "\n" "- \"Hammasi\" (barcha ulanishlarga ruxsat beriladi),\n" "\n" "- \"Lokal\" (faqat lokal kompyuterlardan ulanishga ruxsat),\n" "\n" "- \"Yoʻq\" (ulanish yoʻq)." #: security/help.pm:48 #, c-format msgid "" "The argument specifies if clients are authorized to connect\n" "to the X server from the network on the tcp port 6000 or not." msgstr "" #. -PO: here "ALL", "Local" and "None" are values in a pull-down menu; translate them the same as they're #: security/help.pm:53 #, c-format msgid "" "Authorize:\n" "\n" "- all services controlled by tcp_wrappers (see hosts.deny(5) man page) if " "set to \"ALL\",\n" "\n" "- only local ones if set to \"Local\"\n" "\n" "- none if set to \"None\".\n" "\n" "To authorize the services you need, use /etc/hosts.allow (see hosts.allow" "(5))." msgstr "" #: security/help.pm:63 #, c-format msgid "" "If SERVER_LEVEL (or SECURE_LEVEL if absent)\n" "is greater than 3 in /etc/security/msec/security.conf, creates the\n" "symlink /etc/security/msec/server to point to\n" "/etc/security/msec/server.<SERVER_LEVEL>.\n" "\n" "The /etc/security/msec/server is used by chkconfig --add to decide to\n" "add a service if it is present in the file during the installation of\n" "packages." msgstr "" #: security/help.pm:72 #, c-format msgid "" "Enable crontab and at for users.\n" "\n" "Put allowed users in /etc/cron.allow and /etc/at.allow (see man at(1)\n" "and crontab(1))." msgstr "" #: security/help.pm:77 #, c-format msgid "Enable syslog reports to console 12" msgstr "" #: security/help.pm:79 #, c-format msgid "" "Enable name resolution spoofing protection. If\n" "\"%s\" is true, also reports to syslog." msgstr "" #: security/help.pm:80 #, c-format msgid "Security Alerts:" msgstr "Xavfsizlik xabarnomasi:" #: security/help.pm:82 #, c-format msgid "Enable IP spoofing protection." msgstr "" #: security/help.pm:84 #, c-format msgid "Enable libsafe if libsafe is found on the system." msgstr "" #: security/help.pm:86 #, c-format msgid "Enable the logging of IPv4 strange packets." msgstr "" #: security/help.pm:88 #, c-format msgid "Enable msec hourly security check." msgstr "" #: security/help.pm:90 #, c-format msgid "" "Enable su only from members of the wheel group. If set to no, allows su from " "any user." msgstr "" #: security/help.pm:92 #, c-format msgid "Use password to authenticate users." msgstr "Foydalanuvchilarni tasdiqlash uchun maxfiy soʻzdan foydalanish." #: security/help.pm:94 #, c-format msgid "Activate Ethernet cards promiscuity check." msgstr "" #: security/help.pm:96 #, c-format msgid "Activate daily security check." msgstr "Kundalik xavfsizlik tekshirishlarini bajarish." #: security/help.pm:98 #, c-format msgid "Enable sulogin(8) in single user level." msgstr "" #: security/help.pm:100 #, c-format msgid "Add the name as an exception to the handling of password aging by msec." msgstr "" #: security/help.pm:102 #, c-format msgid "Set password aging to \"max\" days and delay to change to \"inactive\"." msgstr "" #: security/help.pm:104 #, c-format msgid "Set the password history length to prevent password reuse." msgstr "" #: security/help.pm:106 #, fuzzy, c-format msgid "" "Set the password minimum length and minimum number of digit and minimum " "number of capitalized letters." msgstr "" "Maxfiy soʻzning eng qisqa uzunligini, undagi sonlarning va bosh harflarning " "eng kichik sonini aniqlash." #: security/help.pm:108 #, c-format msgid "Set the root's file mode creation mask." msgstr "" #: security/help.pm:109 #, c-format msgid "if set to yes, check open ports." msgstr "agar \"ha\" boʻlsa, ochiq portlarni tekshirish" #: security/help.pm:110 #, c-format msgid "" "if set to yes, check for:\n" "\n" "- empty passwords,\n" "\n" "- no password in /etc/shadow\n" "\n" "- for users with the 0 id other than root." msgstr "" #: security/help.pm:117 #, c-format msgid "if set to yes, check permissions of files in the users' home." msgstr "" #: security/help.pm:118 #, c-format msgid "if set to yes, check if the network devices are in promiscuous mode." msgstr "" #: security/help.pm:119 #, c-format msgid "if set to yes, run the daily security checks." msgstr "agar \"ha\" boʻlsa, kundalik xavfsizlik tekshirishlarini bajarish" #: security/help.pm:120 #, c-format msgid "if set to yes, check additions/removals of sgid files." msgstr "" #: security/help.pm:121 #, c-format msgid "if set to yes, check empty password in /etc/shadow." msgstr "" "agar \"ha\" boʻlsa, /etc/shadow faylidagi boʻsh maxfiy soʻzlarni tekshirish" #: security/help.pm:122 #, c-format msgid "if set to yes, verify checksum of the suid/sgid files." msgstr "" #: security/help.pm:123 #, c-format msgid "if set to yes, check additions/removals of suid root files." msgstr "" #: security/help.pm:124 #, c-format msgid "if set to yes, report unowned files." msgstr "" #: security/help.pm:125 #, c-format msgid "if set to yes, check files/directories writable by everybody." msgstr "" #: security/help.pm:126 #, c-format msgid "if set to yes, run chkrootkit checks." msgstr "agar \"ha\" boʻlsa, chkrootkit tekshiruvini bajarish" #: security/help.pm:127 #, c-format msgid "" "if set, send the mail report to this email address else send it to root." msgstr "" #: security/help.pm:128 #, c-format msgid "if set to yes, report check result by mail." msgstr "agar \"ha\" boʻlsa, tekshiruv natijasini xat orqali joʻnatish" #: security/help.pm:129 #, c-format msgid "Do not send mails if there's nothing to warn about" msgstr "" #: security/help.pm:130 #, c-format msgid "if set to yes, run some checks against the rpm database." msgstr "" #: security/help.pm:131 #, c-format msgid "if set to yes, report check result to syslog." msgstr "" #: security/help.pm:132 #, c-format msgid "if set to yes, reports check result to tty." msgstr "" #: security/help.pm:134 #, c-format msgid "Set shell commands history size. A value of -1 means unlimited." msgstr "" "Konsoldan kiritilgan buyruqlar tarixining hajmini aniqlash. -1 cheksizga " "teng." #: security/help.pm:136 #, c-format msgid "Set the shell timeout. A value of zero means no timeout." msgstr "" #: security/help.pm:136 #, c-format msgid "Timeout unit is second" msgstr "" #: security/help.pm:138 #, c-format msgid "Set the user's file mode creation mask." msgstr "" #: security/l10n.pm:11 #, fuzzy, c-format msgid "Accept bogus IPv4 error messages" msgstr "bogus IPv4 xatolik xabarini qabul qilish." #: security/l10n.pm:12 #, fuzzy, c-format msgid "Accept broadcasted icmp echo" msgstr "Brodkast icmp exo paketini qabul qilish." #: security/l10n.pm:13 #, fuzzy, c-format msgid "Accept icmp echo" msgstr "icmp exo paketini qabul qilish." #: security/l10n.pm:15 #, c-format msgid "/etc/issue* exist" msgstr "/etc/issue* mavjud" #: security/l10n.pm:16 #, c-format msgid "Reboot by the console user" msgstr "Konsoldan kompyuterni oʻchirib-yoqish" #: security/l10n.pm:17 #, c-format msgid "Allow remote root login" msgstr "Root masofadan kirishiga ruxsat etish" #: security/l10n.pm:18 #, c-format msgid "Direct root login" msgstr "root'ning toʻgʻridan-toʻgʻri kirishi" #: security/l10n.pm:19 #, c-format msgid "List users on display managers (kdm and gdm)" msgstr "" "Foydalanuvchilarning roʻyxatini displey boshqaruvchilarda (KDM va GDM) " "koʻrsatish" #: security/l10n.pm:20 #, c-format msgid "Export display when passing from root to the other users" msgstr "" #: security/l10n.pm:21 #, c-format msgid "Allow X Window connections" msgstr "X Windows ulanishlarga ruxsat etish" #: security/l10n.pm:22 #, c-format msgid "Authorize TCP connections to X Window" msgstr "" #: security/l10n.pm:23 #, c-format msgid "Authorize all services controlled by tcp_wrappers" msgstr "" #: security/l10n.pm:24 #, c-format msgid "Chkconfig obey msec rules" msgstr "" #: security/l10n.pm:25 #, c-format msgid "Enable \"crontab\" and \"at\" for users" msgstr "" #: security/l10n.pm:26 #, c-format msgid "Syslog reports to console 12" msgstr "" #: security/l10n.pm:27 #, c-format msgid "Name resolution spoofing protection" msgstr "" #: security/l10n.pm:28 #, c-format msgid "Enable IP spoofing protection" msgstr "" #: security/l10n.pm:29 #, c-format msgid "Enable libsafe if libsafe is found on the system" msgstr "" #: security/l10n.pm:30 #, c-format msgid "Enable the logging of IPv4 strange packets" msgstr "" #: security/l10n.pm:31 #, c-format msgid "Enable msec hourly security check" msgstr "" #: security/l10n.pm:32 #, c-format msgid "Enable su only from the wheel group members" msgstr "" #: security/l10n.pm:33 #, c-format msgid "Use password to authenticate users" msgstr "Foydalanuvchilarni tasdiqlash uchun maxfiy soʻzdan foydalanish" #: security/l10n.pm:34 #, c-format msgid "Ethernet cards promiscuity check" msgstr "" #: security/l10n.pm:35 #, c-format msgid "Daily security check" msgstr "Kundalik xavfsizlik tekshiruvi" #: security/l10n.pm:36 #, c-format msgid "Sulogin(8) in single user level" msgstr "" #: security/l10n.pm:37 #, c-format msgid "No password aging for" msgstr "" #: security/l10n.pm:38 #, c-format msgid "Set password expiration and account inactivation delays" msgstr "" #: security/l10n.pm:39 #, c-format msgid "Password history length" msgstr "Maxfiy soʻz tarixining uzunligi" #: security/l10n.pm:40 #, c-format msgid "Password minimum length and number of digits and upcase letters" msgstr "" "Maxfiy soʻzning eng qisqa uzunligi, undagi sonlarning va bosh harflarning " "soni" #: security/l10n.pm:41 #, c-format msgid "Root umask" msgstr "" #: security/l10n.pm:42 #, c-format msgid "Shell history size" msgstr "Konsolda bajarilgan buyruqlar tarixining hajmi" #: security/l10n.pm:43 #, c-format msgid "Shell timeout" msgstr "Konsol uchun taymaut" #: security/l10n.pm:44 #, c-format msgid "User umask" msgstr "" #: security/l10n.pm:45 #, c-format msgid "Check open ports" msgstr "Ochiq portlarni tekshirish" #: security/l10n.pm:46 #, c-format msgid "Check for unsecured accounts" msgstr "" #: security/l10n.pm:47 #, c-format msgid "Check permissions of files in the users' home" msgstr "" #: security/l10n.pm:48 #, c-format msgid "Check if the network devices are in promiscuous mode" msgstr "" #: security/l10n.pm:49 #, c-format msgid "Run the daily security checks" msgstr "Kundalik xavfsizlik tekshirishlarini bajarish" #: security/l10n.pm:50 #, c-format msgid "Check additions/removals of sgid files" msgstr "" #: security/l10n.pm:51 #, c-format msgid "Check empty password in /etc/shadow" msgstr "Boʻsh maxfiy soʻzni /etc/shadow faylida tekshirish" #: security/l10n.pm:52 #, c-format msgid "Verify checksum of the suid/sgid files" msgstr "suid/sgid fayllarning checksum'ini tekshirish" #: security/l10n.pm:53 #, c-format msgid "Check additions/removals of suid root files" msgstr "" #: security/l10n.pm:54 #, c-format msgid "Report unowned files" msgstr "" #: security/l10n.pm:55 #, c-format msgid "Check files/directories writable by everybody" msgstr "" #: security/l10n.pm:56 #, c-format msgid "Run chkrootkit checks" msgstr "chkrootkit tekshiruvlarini bajarish" #: security/l10n.pm:57 #, c-format msgid "Do not send empty mail reports" msgstr "" #: security/l10n.pm:58 #, c-format msgid "If set, send the mail report to this email address else send it to root" msgstr "" #: security/l10n.pm:59 #, c-format msgid "Report check result by mail" msgstr "Tekshiruv natijasini elektron xat orqali joʻnatish" #: security/l10n.pm:60 #, c-format msgid "Run some checks against the rpm database" msgstr "" #: security/l10n.pm:61 #, c-format msgid "Report check result to syslog" msgstr "" #: security/l10n.pm:62 #, c-format msgid "Reports check result to tty" msgstr "" #: security/level.pm:10 #, c-format msgid "Disable msec" msgstr "" #: security/level.pm:11 #, c-format msgid "Standard" msgstr "Andoza" #: security/level.pm:12 #, c-format msgid "Secure" msgstr "Xavfsizlik" #: security/level.pm:52 #, c-format msgid "" "This level is to be used with care, as it disables all additional security\n" "provided by msec. Use it only when you want to take care of all aspects of " "system security\n" "on your own." msgstr "" #: security/level.pm:55 #, fuzzy, c-format msgid "" "This is the standard security recommended for a computer that will be used " "to connect to the Internet as a client." msgstr "" "Bu Internet tarmogʻida klient sifatida ishlatiladigan kompyuter uchun " "tavsiya etilgan xavfsizlikning andoza darajasi." #: security/level.pm:56 #, fuzzy, c-format msgid "" "With this security level, the use of this system as a server becomes " "possible.\n" "The security is now high enough to use the system as a server which can " "accept\n" "connections from many clients. Note: if your machine is only a client on the " "Internet, you should choose a lower level." msgstr "" "Xavfsizlikning bu darajasida tizimni server sifatida ishlatish mumkin.\n" "Tizimni bir qancha klientlar bilan aloqa oʻrnata oladigan server sifatida " "ishlatish uchun xavfsizlik darajasi yetarlicha yuqori.\n" "Izoh: agar kompyuteringizni Internet tarmogʻida klient sifatida " "ishlatsangiz, pastroq darajani tanlang." #: security/level.pm:63 #, c-format msgid "DrakSec Basic Options" msgstr "DrakSec asosiy moslamalari" #: security/level.pm:66 #, c-format msgid "Please choose the desired security level" msgstr "Iltimos istalgan xavfsizlik darajasini tanlang" #. -PO: this string is used to properly format "<security level>: <level description>" #: security/level.pm:70 #, fuzzy, c-format msgid "%s: %s" msgstr "%s %s" #: security/level.pm:73 #, c-format msgid "Security Administrator:" msgstr "Xavfsizlik boshqaruvchisi:" #: security/level.pm:74 #, c-format msgid "Login or email:" msgstr "" #: services.pm:18 #, c-format msgid "Listen and dispatch ACPI events from the kernel" msgstr "" #: services.pm:19 #, c-format msgid "Launch the ALSA (Advanced Linux Sound Architecture) sound system" msgstr "" "ALSA (Advanced Linux Sound Architecture) tovush tizimini ishga tushirish" #: services.pm:20 #, c-format msgid "Anacron is a periodic command scheduler." msgstr "" #: services.pm:21 #, c-format msgid "" "apmd is used for monitoring battery status and logging it via syslog.\n" "It can also be used for shutting down the machine when the battery is low." msgstr "" #: services.pm:23 #, c-format msgid "" "Runs commands scheduled by the at command at the time specified when\n" "at was run, and runs batch commands when the load average is low enough." msgstr "" #: services.pm:25 #, c-format msgid "Avahi is a ZeroConf daemon which implements an mDNS stack" msgstr "" #: services.pm:26 #, c-format msgid "Set CPU frequency settings" msgstr "" #: services.pm:27 #, c-format msgid "" "cron is a standard UNIX program that runs user-specified programs\n" "at periodic scheduled times. vixie cron adds a number of features to the " "basic\n" "UNIX cron, including better security and more powerful configuration options." msgstr "" #: services.pm:30 #, c-format msgid "" "Common UNIX Printing System (CUPS) is an advanced printer spooling system" msgstr "" #: services.pm:31 #, c-format msgid "Launches the graphical display manager" msgstr "" #: services.pm:32 #, c-format msgid "" "FAM is a file monitoring daemon. It is used to get reports when files " "change.\n" "It is used by GNOME and KDE" msgstr "" #: services.pm:34 #, c-format msgid "" "G15Daemon allows users access to all extra keys by decoding them and \n" "pushing them back into the kernel via the linux UINPUT driver. This driver " "must be loaded \n" "before g15daemon can be used for keyboard access. The G15 LCD is also " "supported. By default, \n" "with no other clients active, g15daemon will display a clock. Client " "applications and \n" "scripts can access the LCD via a simple API." msgstr "" #: services.pm:39 #, c-format msgid "" "GPM adds mouse support to text-based Linux applications such the\n" "Midnight Commander. It also allows mouse-based console cut-and-paste " "operations,\n" "and includes support for pop-up menus on the console." msgstr "" #: services.pm:42 #, c-format msgid "HAL is a daemon that collects and maintains information about hardware" msgstr "" #: services.pm:43 #, c-format msgid "" "HardDrake runs a hardware probe, and optionally configures\n" "new/changed hardware." msgstr "" #: services.pm:45 #, c-format msgid "" "Apache is a World Wide Web server. It is used to serve HTML files and CGI." msgstr "" #: services.pm:46 #, c-format msgid "" "The internet superserver daemon (commonly called inetd) starts a\n" "variety of other internet services as needed. It is responsible for " "starting\n" "many services, including telnet, ftp, rsh, and rlogin. Disabling inetd " "disables\n" "all of the services it is responsible for." msgstr "" #: services.pm:50 #, c-format msgid "Automates a packet filtering firewall with ip6tables" msgstr "" #: services.pm:51 #, c-format msgid "Automates a packet filtering firewall with iptables" msgstr "" #: services.pm:52 #, c-format msgid "" "Evenly distributes IRQ load across multiple CPUs for enhanced performance" msgstr "" #: services.pm:53 #, c-format msgid "" "This package loads the selected keyboard map as set in\n" "/etc/sysconfig/keyboard. This can be selected using the kbdconfig utility.\n" "You should leave this enabled for most machines." msgstr "" #: services.pm:56 #, c-format msgid "" "Automatic regeneration of kernel header in /boot for\n" "/usr/include/linux/{autoconf,version}.h" msgstr "" #: services.pm:58 #, c-format msgid "Automatic detection and configuration of hardware at boot." msgstr "Tizimni yuklashda asbob-uskunalarni avto-aniqlash va moslash." #: services.pm:59 #, c-format msgid "Tweaks system behavior to extend battery life" msgstr "" #: services.pm:60 #, c-format msgid "" "Linuxconf will sometimes arrange to perform various tasks\n" "at boot-time to maintain the system configuration." msgstr "" #: services.pm:62 #, c-format msgid "" "lpd is the print daemon required for lpr to work properly. It is\n" "basically a server that arbitrates print jobs to printer(s)." msgstr "" #: services.pm:64 #, c-format msgid "" "Linux Virtual Server, used to build a high-performance and highly\n" "available server." msgstr "" #: services.pm:66 #, c-format msgid "Monitors the network (Interactive Firewall and wireless" msgstr "" #: services.pm:67 #, c-format msgid "Software RAID monitoring and management" msgstr "" #: services.pm:68 #, c-format msgid "" "DBUS is a daemon which broadcasts notifications of system events and other " "messages" msgstr "" #: services.pm:69 #, c-format msgid "Enables MSEC security policy on system startup" msgstr "" #: services.pm:70 #, c-format msgid "" "named (BIND) is a Domain Name Server (DNS) that is used to resolve host " "names to IP addresses." msgstr "" #: services.pm:71 #, c-format msgid "Initializes network console logging" msgstr "" #: services.pm:72 #, c-format msgid "" "Mounts and unmounts all Network File System (NFS), SMB (Lan\n" "Manager/Windows), and NCP (NetWare) mount points." msgstr "" #: services.pm:74 #, c-format msgid "" "Activates/Deactivates all network interfaces configured to start\n" "at boot time." msgstr "" #: services.pm:76 #, c-format msgid "Requires network to be up if enabled" msgstr "" #: services.pm:77 #, c-format msgid "Wait for the hotplugged network to be up" msgstr "" #: services.pm:78 #, c-format msgid "" "NFS is a popular protocol for file sharing across TCP/IP networks.\n" "This service provides NFS server functionality, which is configured via the\n" "/etc/exports file." msgstr "" #: services.pm:81 #, c-format msgid "" "NFS is a popular protocol for file sharing across TCP/IP\n" "networks. This service provides NFS file locking functionality." msgstr "" #: services.pm:83 #, c-format msgid "Synchronizes system time using the Network Time Protocol (NTP)" msgstr "NTP yordamida tizim soatini sinxronizatsiya qiladi" #: services.pm:84 #, c-format msgid "" "Automatically switch on numlock key locker under console\n" "and Xorg at boot." msgstr "" #: services.pm:86 #, c-format msgid "Support the OKI 4w and compatible winprinters." msgstr "" #: services.pm:87 #, c-format msgid "Checks if a partition is close to full up" msgstr "" #: services.pm:88 #, c-format msgid "" "PCMCIA support is usually to support things like ethernet and\n" "modems in laptops. It will not get started unless configured so it is safe " "to have\n" "it installed on machines that do not need it." msgstr "" #: services.pm:91 #, c-format msgid "" "The portmapper manages RPC connections, which are used by\n" "protocols such as NFS and NIS. The portmap server must be running on " "machines\n" "which act as servers for protocols which make use of the RPC mechanism." msgstr "" #: services.pm:94 #, c-format msgid "Reserves some TCP ports" msgstr "" #: services.pm:95 #, c-format msgid "" "Postfix is a Mail Transport Agent, which is the program that moves mail from " "one machine to another." msgstr "" #: services.pm:96 #, c-format msgid "" "Saves and restores system entropy pool for higher quality random\n" "number generation." msgstr "" #: services.pm:98 #, c-format msgid "" "Assign raw devices to block devices (such as hard disk drive\n" "partitions), for the use of applications such as Oracle or DVD players" msgstr "" #: services.pm:100 #, fuzzy, c-format msgid "Nameserver information manager" msgstr "Qattiq disk haqida maʼlumot" #: services.pm:101 #, c-format msgid "" "The routed daemon allows for automatic IP router table updated via\n" "the RIP protocol. While RIP is widely used on small networks, more complex\n" "routing protocols are needed for complex networks." msgstr "" #: services.pm:104 #, c-format msgid "" "The rstat protocol allows users on a network to retrieve\n" "performance metrics for any machine on that network." msgstr "" #: services.pm:106 #, c-format msgid "" "Syslog is the facility by which many daemons use to log messages to various " "system log files. It is a good idea to always run rsyslog." msgstr "" #: services.pm:107 #, c-format msgid "" "The rusers protocol allows users on a network to identify who is\n" "logged in on other responding machines." msgstr "" #: services.pm:109 #, c-format msgid "" "The rwho protocol lets remote users get a list of all of the users\n" "logged into a machine running the rwho daemon (similar to finger)." msgstr "" #: services.pm:111 #, c-format msgid "" "SANE (Scanner Access Now Easy) enables to access scanners, video cameras, ..." msgstr "" #: services.pm:112 #, c-format msgid "Packet filtering firewall" msgstr "" #: services.pm:113 #, c-format msgid "" "The SMB/CIFS protocol enables to share access to files & printers and also " "integrates with a Windows Server domain" msgstr "" #: services.pm:114 #, c-format msgid "Launch the sound system on your machine" msgstr "Kompyuteringizda tovush tizimini ishga tushirish" #: services.pm:115 #, c-format msgid "layer for speech analysis" msgstr "" #: services.pm:116 #, c-format msgid "" "Secure Shell is a network protocol that allows data to be exchanged over a " "secure channel between two computers" msgstr "" #: services.pm:117 #, c-format msgid "" "Syslog is the facility by which many daemons use to log messages\n" "to various system log files. It is a good idea to always run syslog." msgstr "" #: services.pm:119 #, c-format msgid "Moves the generated persistent udev rules to /etc/udev/rules.d" msgstr "" #: services.pm:120 #, c-format msgid "Load the drivers for your usb devices." msgstr "USB uskunalaringiz uchun drayverlarni yuklash." #: services.pm:121 #, c-format msgid "A lightweight network traffic monitor" msgstr "" #: services.pm:122 #, c-format msgid "Starts the X Font Server." msgstr "X shrift serverini ishga tushiradi." #: services.pm:123 #, c-format msgid "Starts other deamons on demand." msgstr "Boshqa demonlarni talabga koʻra ishga tushirish." #: services.pm:146 #, c-format msgid "Printing" msgstr "Chop etish" #: services.pm:149 #, c-format msgid "Internet" msgstr "Internet" #: services.pm:154 #, c-format msgid "" "_: Keep these entry short\n" "Networking" msgstr "Tarmoq" #: services.pm:156 #, c-format msgid "System" msgstr "Tizim" #: services.pm:162 #, c-format msgid "Remote Administration" msgstr "Masofadan turib boshqarish" #: services.pm:171 #, c-format msgid "Database Server" msgstr "Maʼlumot baza serveri" #: services.pm:182 services.pm:221 #, c-format msgid "Services" msgstr "Xizmatlar" #: services.pm:182 #, c-format msgid "Choose which services should be automatically started at boot time" msgstr "Tizim yuklanayotganda ishga tushishi kerak boʻlgan xizmatlarni tanlang" #: services.pm:200 #, c-format msgid "%d activated for %d registered" msgstr "%d ishlamoqda %d qayd qilingan" #: services.pm:237 #, c-format msgid "running" msgstr "" #: services.pm:237 #, c-format msgid "stopped" msgstr "toʻxtatilgan" #: services.pm:242 #, c-format msgid "Services and daemons" msgstr "Xizmat va demonlar" #: services.pm:248 #, c-format msgid "" "No additional information\n" "about this service, sorry." msgstr "" "Uzr, bu xizmat haqida\n" "qoʻshimcha maʼlumot yoʻq." #: services.pm:253 ugtk2.pm:924 #, c-format msgid "Info" msgstr "Maʼlumot" #: services.pm:256 #, c-format msgid "Start when requested" msgstr "Talab qilinganda ishga tushirish" #: services.pm:256 #, c-format msgid "On boot" msgstr "Tizim yuklanayotganda" #: services.pm:274 #, fuzzy, c-format msgid "Start" msgstr "ishga tushish" #: services.pm:274 #, fuzzy, c-format msgid "Stop" msgstr "toktotuu" #: standalone.pm:25 #, c-format msgid "" "This program is free software; you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation; either version 2, or (at your option)\n" "any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program; if not, write to the Free Software\n" "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, " "USA.\n" msgstr "" #: standalone.pm:44 #, c-format msgid "" "[--config-info] [--daemon] [--debug] [--default] [--show-conf]\n" "Backup and Restore application\n" "\n" "--default : save default directories.\n" "--debug : show all debug messages.\n" "--show-conf : list of files or directories to backup.\n" "--config-info : explain configuration file options (for non-X " "users).\n" "--daemon : use daemon configuration. \n" "--help : show this message.\n" "--version : show version number.\n" msgstr "" #: standalone.pm:56 #, c-format msgid "" "[--boot]\n" "OPTIONS:\n" " --boot - enable to configure boot loader\n" "default mode: offer to configure autologin feature" msgstr "" #: standalone.pm:60 #, c-format msgid "" "[OPTIONS] [PROGRAM_NAME]\n" "\n" "OPTIONS:\n" " --help - print this help message.\n" " --report - program should be one of %s tools\n" " --incident - program should be one of %s tools" msgstr "" #: standalone.pm:66 #, c-format msgid "" "[--add]\n" " --add - \"add a network interface\" wizard\n" " --del - \"delete a network interface\" wizard\n" " --skip-wizard - manage connections\n" " --internet - configure internet\n" " --wizard - like --add" msgstr "" #: standalone.pm:72 #, c-format msgid "" "\n" "Font Importation and monitoring application\n" "\n" "OPTIONS:\n" "--windows_import : import from all available windows partitions.\n" "--xls_fonts : show all fonts that already exist from xls\n" "--install : accept any font file and any directory.\n" "--uninstall : uninstall any font or any directory of font.\n" "--replace : replace all font if already exist\n" "--application : 0 none application.\n" " : 1 all application available supported.\n" " : name_of_application like so for staroffice \n" " : and gs for ghostscript for only this one." msgstr "" #: standalone.pm:87 #, c-format msgid "" "[OPTIONS]...\n" "%s Terminal Server Configurator\n" "--enable : enable MTS\n" "--disable : disable MTS\n" "--start : start MTS\n" "--stop : stop MTS\n" "--adduser : add an existing system user to MTS (requires username)\n" "--deluser : delete an existing system user from MTS (requires " "username)\n" "--addclient : add a client machine to MTS (requires MAC address, IP, " "nbi image name)\n" "--delclient : delete a client machine from MTS (requires MAC address, " "IP, nbi image name)" msgstr "" #: standalone.pm:99 #, c-format msgid "[keyboard]" msgstr "[klaviatura]" #: standalone.pm:100 #, c-format msgid "[--file=myfile] [--word=myword] [--explain=regexp] [--alert]" msgstr "" #: standalone.pm:101 #, c-format msgid "" "[OPTIONS]\n" "Network & Internet connection and monitoring application\n" "\n" "--defaultintf interface : show this interface by default\n" "--connect : connect to internet if not already connected\n" "--disconnect : disconnect to internet if already connected\n" "--force : used with (dis)connect : force (dis)connection.\n" "--status : returns 1 if connected 0 otherwise, then exit.\n" "--quiet : do not be interactive. To be used with (dis)connect." msgstr "" #: standalone.pm:111 #, c-format msgid "" "[OPTION]...\n" " --no-confirmation do not ask first confirmation question in %s Update " "mode\n" " --no-verify-rpm do not verify packages signatures\n" " --changelog-first display changelog before filelist in the " "description window\n" " --merge-all-rpmnew propose to merge all .rpmnew/.rpmsave files found" msgstr "" #: standalone.pm:116 #, fuzzy, c-format msgid "" "[--manual] [--device=dev] [--update-sane=sane_source_dir] [--update-" "usbtable] [--dynamic=dev]" msgstr "" "[--manual] [--device=dev] [--update-sane=sane_source_dir] [--update-" "usbtable] [--dynamic=dev]" #: standalone.pm:117 #, c-format msgid "" " [everything]\n" " XFdrake [--noauto] monitor\n" " XFdrake resolution" msgstr "" " [everything]\n" " XFdrake [--noauto] monitor\n" " XFdrake oʻlcham" #: standalone.pm:153 #, fuzzy, c-format msgid "" "\n" "Usage: %s [--auto] [--beginner] [--expert] [-h|--help] [--noauto] [--" "testing] [-v|--version] " msgstr "" "\n" "Foydalanish: %s [--auto] [--beginner] [--expert] [-h|--help] [--noauto] [--" "testing] [-v|--version] " #: timezone.pm:161 timezone.pm:162 #, c-format msgid "All servers" msgstr "Hamma serverlar" #: timezone.pm:196 #, c-format msgid "Global" msgstr "Global" #: timezone.pm:199 #, c-format msgid "Africa" msgstr "Afrika" #: timezone.pm:200 #, c-format msgid "Asia" msgstr "Osiyo" #: timezone.pm:201 #, c-format msgid "Europe" msgstr "Yevropa" #: timezone.pm:202 #, c-format msgid "North America" msgstr "Shimoliy Amerika" #: timezone.pm:203 #, c-format msgid "Oceania" msgstr "Okeaniya" #: timezone.pm:204 #, c-format msgid "South America" msgstr "Janubiy Amerika" #: timezone.pm:213 #, c-format msgid "Hong Kong" msgstr "Gonkong" #: timezone.pm:250 #, c-format msgid "Russian Federation" msgstr "Rossiya Federatsiyasi" #: timezone.pm:258 #, c-format msgid "Yugoslavia" msgstr "Yugoslaviya" #: ugtk2.pm:812 #, c-format msgid "Is this correct?" msgstr "Bu toʻgʻrimi?" #: ugtk2.pm:874 #, c-format msgid "You have chosen a file, not a directory" msgstr "Direktoriya oʻrniga fayl tanlangan" #: wizards.pm:95 #, c-format msgid "" "%s is not installed\n" "Click \"Next\" to install or \"Cancel\" to quit" msgstr "" "%s oʻrnatilmagan\n" "Oʻrnatish uchun \"Keyingi\" yoki chiqish uchun \"Bekor qilish\" tugmasini " "bosing" #: wizards.pm:99 #, c-format msgid "Installation failed" msgstr "Oʻrnatish muvaffaqiyatsiz tugadi" #~ msgid "File sharing" #~ msgstr "Fayl bilan boʻlishish" #~ msgid "Enable 5.1 sound with Pulse Audio" #~ msgstr "Pulse Audio 5.1 tovushini yoqish" #~ msgid "Enable user switching for audio applications" #~ msgstr "Tovush dasturlarida foydalanuvchilarni almashtirishni yoqish" #~ msgid "Restrict command line options" #~ msgstr "Buyruqlar satri parametrlarini chegaralash" #~ msgid "restrict" #~ msgstr "chegaralash" #~ msgid "" #~ "Option ``Restrict command line options'' is of no use without a password" #~ msgstr "" #~ "``Buyruqlar satri parametrlarini chegaralash'' parametri maxfiy soʻzsiz " #~ "ishlatilmaydi" #~ msgid "Use an encrypted filesystem" #~ msgstr "Shifrlangan fayl tizimidan foydalanish" #~ msgid "" #~ "To ensure data integrity after resizing the partition(s), \n" #~ "filesystem checks will be run on your next boot into Microsoft Windows®" #~ msgstr "" #~ "Disk qismi hajmi oʻzgartirilganda maʼlumot butunligi saqlab qolish uchun\n" #~ "Microsoft Windows® keyingi yuklanganda fayl tizimi tekshiriladi"