package Xconfigurator; # $Id$ use diagnostics; use strict; use vars qw($in $do_pkgs @window_managers @depths @monitorSize2resolution @hsyncranges %min_hsync4wres @vsyncranges %depths @resolutions %serversdriver @svgaservers @accelservers @allbutfbservers @allservers @allbutfbdrivers @alldrivers %vgamodes %videomemory @ramdac_name @ramdac_id @clockchip_name @clockchip_id %keymap_translate %standard_monitors $XF86firstchunk_text $keyboardsection_start $keyboardsection_start_v4 $keyboardsection_part2 $keyboardsection_part3 $keyboardsection_part3_v4 $keyboardsection_end $pointersection_text $monitorsection_text1 $monitorsection_text2 $monitorsection_text3 $monitorsection_text4 $modelines_text_Trident_TG_96xx $modelines_text_ext $modelines_text $devicesection_text $devicesection_text_v4 $screensection_text1 %lines @options %xkb_options $good_default_monitor $low_default_monitor $layoutsection_v4 $modelines_text_apple); use common; use log; use detect_devices; use run_program; use Xconfigurator_consts; use any; use modules; my $tmpconfig = "/tmp/Xconfig"; my ($prefix, %monitors, %standard_monitors_); sub xtest { my ($display) = @_; $::isStandalone ? system("DISPLAY=$display /usr/X11R6/bin/xtest") == 0 : c::Xtest($display); } sub getVGAMode($) { $_[0]->{card}{vga_mode} || $vgamodes{"640x480x16"}; } sub readCardsDB { my ($file) = @_; my ($card, %cards); my $F = common::openFileMaybeCompressed($file); my ($lineno, $cmd, $val) = 0; my $fs = { LINE => sub { push @{$card->{lines}}, $val unless $val eq "VideoRam" }, NAME => sub { $cards{$card->{type}} = $card if $card; $card = { type => $val }; }, SEE => sub { my $c = $cards{$val} or die "Error in database, invalid reference $val at line $lineno"; push @{$card->{lines}}, @{$c->{lines} || []}; add2hash($card->{flags}, $c->{flags}); add2hash($card, $c); }, CHIPSET => sub { $card->{chipset} = $val; $card->{flags}{needChipset} = 1 if $val eq 'GeForce DDR'; $card->{flags}{needVideoRam} = 1 if member($val, qw(mgag10 mgag200 RIVA128 SiS6326)); }, SERVER => sub { $card->{server} = $val; }, DRIVER => sub { $card->{driver} = $val; }, RAMDAC => sub { $card->{ramdac} = $val; }, DACSPEED => sub { $card->{dacspeed} = $val; }, CLOCKCHIP => sub { $card->{clockchip} = $val; $card->{flags}{noclockprobe} = 1; }, NOCLOCKPROBE => sub { $card->{flags}{noclockprobe} = 1 }, UNSUPPORTED => sub { $card->{flags}{unsupported} = 1 }, COMMENT => sub {}, }; local $_; while (<$F>) { $lineno++; s/\s+$//; /^#/ and next; /^$/ and next; /^END/ and do { $cards{$card->{type}} = $card if $card; last }; ($cmd, $val) = /(\S+)\s*(.*)/ or next; #log::l("bad line $lineno ($_)"), next; my $f = $fs->{$cmd}; $f ? $f->() : log::l("unknown line $lineno ($_)"); } \%cards; } sub readCardsNames { my $file = "$ENV{SHARE_PATH}/ldetect-lst/CardsNames"; map { (split '=>')[0] } grep { !/^#/ } catMaybeCompressed($file); } sub cardName2RealName { my ($name) = @_; my $file = "$ENV{SHARE_PATH}/ldetect-lst/CardsNames"; foreach (catMaybeCompressed($file)) { chop; next if /^#/; my ($name_, $real) = split '=>'; return $real if $name eq $name_; } $name; } sub realName2CardName { my ($real) = @_; my $file = "$ENV{SHARE_PATH}/ldetect-lst/CardsNames"; foreach (catMaybeCompressed($file)) { chop; next if /^#/; my ($name, $real_) = split '=>'; return $name if $real eq $real_; } return; } sub updateCardAccordingName { my ($card, $name) = @_; my $cards = readCardsDB("$ENV{SHARE_PATH}/ldetect-lst/Cards+"); add2hash($card->{flags}, $cards->{$name}{flags}); add2hash($card, $cards->{$name}); $card; } sub readMonitorsDB { my ($file) = @_; %monitors and return; my $F = common::openFileMaybeCompressed($file); local $_; my $lineno = 0; while (<$F>) { $lineno++; s/\s+$//; /^#/ and next; /^$/ and next; my @fields = qw(vendor type eisa hsyncrange vsyncrange dpms); my @l = split /\s*;\s*/; my %l; @l{@fields} = @l; if ($monitors{$l{type}}) { my $i; for ($i = 0; $monitors{"$l{type} ($i)"}; $i++) {} $l{type} = "$l{type} ($i)"; } $monitors{"$l{vendor}|$l{type}"} = \%l; } while (my ($k, $v) = each %standard_monitors) { $monitors{'Generic|' . translate($k)} = $standard_monitors_{$k} = { hsyncrange => $v->[1], vsyncrange => $v->[2] }; } } sub keepOnlyLegalModes { my ($card, $monitor) = @_; my $mem = 1024 * ($card->{memory} || ($card->{server} eq 'FBDev' ? 2048 : 32768)); #- limit to 2048x1536x64 my $hsync = max(split(/[,-]/, $monitor->{hsyncrange})); while (my ($depth, $res) = each %{$card->{depth}}) { @$res = grep { $mem >= product(@$_, $depth / 8) && $hsync >= ($min_hsync4wres{$_->[0]} || 0) && ($card->{server} ne 'FBDev' || $vgamodes{"$_->[0]x$_->[1]x$depth"}) } @$res; delete $card->{depth}{$depth} if @$res == 0; } } sub cardConfigurationAuto() { my @cards; if (my @c = grep { $_->{driver} =~ /(Card|Server):/ } detect_devices::probeall()) { foreach my $i (0..$#c) { local $_ = $c[$i]->{driver}; my $card = { identifier => ($c[$i]{description} . (@c > 1 && " $i")) }; $card->{type} = $1 if /Card:(.*)/; $card->{server} = $1 if /Server:(.*)/; $card->{driver} = $1 if /Driver:(.*)/; $card->{flags}{needVideoRam} = /86c368|S3 Inc|Tseng.*ET6\d00/; $card->{busid} = "PCI:$c[$i]{pci_bus}:$c[$i]{pci_device}:$c[$i]{pci_function}"; push @{$card->{lines}}, @{$lines{$card->{identifier}} || []}; push @cards, $card; } } #- take a default on sparc if nothing has been found. if (arch() =~ /^sparc/ && !@cards) { log::l("Using probe with /proc/fb as nothing has been found!"); local $_ = cat_("/proc/fb"); if (/Mach64/) { push @cards, { server => "Mach64" } } elsif (/Permedia2/) { push @cards, { server => "3DLabs" } } else { push @cards, { server => "Sun24" } } } #- special case for dual head card using only one busid. @cards = map { my $dup = $_->{identifier} =~ /MGA G[45]50/ ? 2 : 1; if ($dup > 1) { my @result; my $orig = $_; foreach (1..$dup) { my $card = {}; add2hash($card, $orig); push @result, $card; } @result; } else { ($_); } } @cards; #- make sure no type are already used, duplicate both screen #- and rename type (because used as id). if (@cards > 1) { my $card = 1; foreach (@cards) { updateCardAccordingName($_, $_->{type}) if $_->{type}; $_->{type} = "$_->{type} $card"; $card++; } } #- in case of only one cards, remove all busid reference, this will avoid #- need of change of it if the card is moved. #- on many PPC machines, card is on-board, busid is important, leave? @cards == 1 and delete $cards[0]{busid} if arch() !~ /ppc/; @cards; } sub cardConfiguration(;$$$) { my ($card, $noauto, $cardOptions) = @_; $card ||= {}; updateCardAccordingName($card, $card->{type}) if $card->{type}; #- try to get info from given type undef $card->{type} unless $card->{server} || $card->{driver}; #- bad type as we can't find the server my @cards = cardConfigurationAuto(); if (@cards > 1 && ($noauto || !$card->{server})) {#} && !$::isEmbedded) { my (%single_heads, @choices, $tc); my $configure_multi_head = sub { add2hash($card, $cards[0]); #- assume good default. delete $card->{cards} if $noauto; $card->{cards} or $card->{cards} = \@cards; $card->{force_xf4} = 1; #- force XF4 in such case. $card->{Xinerama} = $_[0]; }; foreach (@cards) { unless ($_->{driver} && !$_->{flags}{unsupported}) { log::l("found card \"$_->{identifier}\" not supported by XF4, disabling mutli-head support"); $configure_multi_head = undef; } #- if more than one card use the same BusID, we have to use screen. if ($single_heads{$_->{busid}}) { $single_heads{$_->{busid}}{screen} ||= 0; $_->{screen} = $single_heads{$_->{busid}}{screen} + 1; } $single_heads{$_->{busid}} = $_; } if ($configure_multi_head) { push @choices, { text => _("Configure all heads independently"), code => sub { $configure_multi_head->('') } }; push @choices, { text => _("Use Xinerama extension"), code => sub { $configure_multi_head->(1) } }; } foreach my $e (values %single_heads) { push @choices, { text => _("Configure only card \"%s\" (%s)", $e->{identifier}, $e->{busid}), code => sub { add2hash($card, $e); foreach (qw(cards screen Xinerama)) { delete $card->{$_} } } }; } $tc = $in->ask_from_listf(_("Multi-head configuration"), _("Your system support multiple head configuration. What do you want to do?"), sub { translate($_[0]{text}) }, \@choices) or return; #- no more die, CHECK with auto that return ''! $tc->{code} and $tc->{code}(); } else { #- only one head found, configure it as before. add2hash($card, $cards[0]) unless $noauto; delete $card->{cards}; delete $card->{Xinerama}; } $card->{server} = 'FBDev' unless !$cardOptions->{allowFB} || $card->{server} || $card->{driver} || $card->{type} || $noauto; my $currentRealName = realName2CardName($card->{type} || $cards[0]{type}) || 'Other|Unlisted'; $card->{type} = cardName2RealName($in->ask_from_treelist(_("Graphic card"), _("Select a graphic card"), '|', ['Other|Unlisted', readCardsNames()], $currentRealName)) or return unless $card->{type} || $card->{server} || $card->{driver}; updateCardAccordingName($card, $card->{type}) if $card->{type}; add2hash($card, { vendor => "Unknown", board => "Unknown" }); #- check to use XFree 4 or XFree 3.3. $card->{use_xf4} = $card->{driver} && !$card->{flags}{unsupported}; $card->{force_xf4} ||= arch() =~ /ppc|ia64/; #- try to figure out ugly hack for PPC (recommend XF4 always so...) $card->{prefer_xf3} = !$card->{force_xf4} && ($card->{type} =~ /NeoMagic /); #- take into account current environment in standalone to keep #- the XFree86 version. if ($::isStandalone) { readlink("$prefix/etc/X11/X") =~ /XFree86/ and $card->{prefer_xf3} = 0; readlink("$prefix/etc/X11/X") =~ /XF86_/ and $card->{prefer_xf3} = !$card->{force_xf4}; } #- manage X 3.3.6 or above 4.2.0 specific server or driver. if ($card->{type} eq 'Other|Unlisted') { undef $card->{type}; my @list = ('server', $cardOptions->{allowFB} ? @allservers : @allbutfbservers); my $default_server = if_(!$card->{use_xf4} || $card->{prefer_xf3}, $card->{server} || $cards[0]{server}) || 'server'; $card->{server} = $in->ask_from_list(_("X server"), _("Choose a X server"), \@list, $default_server) or return; if ($card->{server} eq 'server') { my $fake_card = {}; updateCardAccordingName($fake_card, $cards[0]{type}) if $cards[0]{type}; $card->{server} = $card->{prefer_xf3} = undef; $card->{use_xf4} = $card->{force_xf4} = 1; $card->{driver} = $in->ask_from_list(_("X driver"), _("Choose a X driver"), ($cardOptions->{allowFB} ? \@alldrivers : \@allbutfbdrivers), $card->{driver} || $fake_card->{driver} || $cards[0]{driver}) or return; } else { $card->{driver} = $card->{use_xf4} = $card->{force_xf4} = undef; $card->{prefer_xf3} = 1; } } foreach ($card, @{$card->{cards} || []}) { $_->{memory} = 4096, delete $_->{depth} if $_->{driver} eq 'i810'; $_->{memory} = 16384, delete $_->{depth} if $_->{chipset} =~ /PERMEDIA/ && $_->{memory} <= 1024; } if (availableRamMB() > 800 || arch() =~ /ppc/) { #- No 3D XFree 3.3 for PPC #- and no Utah GLX if more than 800 Mb (server, or kernel-enterprise, Utha GLX does not work with latest). $card->{Utah_glx} = $card->{Utah_glx_EXPERIMENTAL} = ''; } else { #- 3D acceleration configuration for XFree 3.3 using Utah-GLX. $card->{Utah_glx} = ($card->{identifier} =~ /Matrox.* G[24]00/ || #- 8bpp does not work. $card->{identifier} =~ /Rage X[CL]/ || $card->{identifier} =~ /3D Rage (?:LT|Pro)/); #- NOT WORKING $card->{type} =~ /Intel 810/); #- 3D acceleration configuration for XFree 3.3 using Utah-GLX #- but EXPERIMENTAL that may freeze the machine (FOR INFO NOT USED). $card->{Utah_glx_EXPERIMENTAL} = ($card->{identifier} =~ /[nN]Vidia.*T[nN]T2?/ || #- all RIVA/GeForce comes from NVIDIA ... $card->{identifier} =~ /[nN]Vidia.*NV[56]/ || #- and may freeze (gltron). $card->{identifier} =~ /[nN]Vidia.*Vanta/ || $card->{identifier} =~ /[nN]Vidia.*GeForce/ || $card->{identifier} =~ /[nN]Vidia.*NV1[15]/ || $card->{identifier} =~ /[nN]Vidia.*Quadro/ || $card->{identifier} =~ /Riva.*128/ || # moved here as not working correctly enough $card->{identifier} =~ /S3.*Savage.*3D/ || #- only this one is evoluting. $card->{identifier} =~ /Rage Mobility [PL]/ || $card->{identifier} =~ /SiS.*6C?326/ || #- prefer 16bit, other ? $card->{identifier} =~ /SiS.*6C?236/ || $card->{identifier} =~ /SiS.*630/); } #- 3D acceleration configuration for XFree 4 using DRI. $card->{DRI_glx} = ($card->{identifier} =~ /Voodoo [35]|Voodoo Banshee/ || #- 16bit only $card->{identifier} =~ /Matrox.* G[245][05]0/ || #- prefer 16bit with AGP only $card->{identifier} =~ /8281[05].* CGC/ || #- 16bits (Intel 810 & 815). $card->{identifier} =~ /Radeon / || #- 16bits preferable ? $card->{identifier} =~ /Rage 128|Rage Mobility M/) && #- 16 and 32 bits, prefer 16bit as no DMA. !($card->{identifier} =~ /Radeon 8500/); #- remove Radeon 8500 wich doesn't work with DRI (4.2). #- 3D acceleration configuration for XFree 4 using DRI but EXPERIMENTAL that may freeze the machine (FOR INFO NOT USED). $card->{DRI_glx_EXPERIMENTAL} = ($card->{identifier} =~ /SiS.*6C?326/ || #- prefer 16bit, other ? $card->{identifier} =~ /SiS.*6C?236/ || $card->{identifier} =~ /SiS.*630/); #- 3D acceleration configuration for XFree 4 using NVIDIA driver (TNT, TN2 and GeForce cards only). $card->{NVIDIA_glx} = $cardOptions->{allowNVIDIA_rpms} && ($card->{identifier} =~ /[nN]Vidia.*T[nN]T2/ || #- TNT2 cards $card->{identifier} =~ /[nN]Vidia.*NV[56]/ || $card->{identifier} =~ /[nN]Vidia.*Vanta/ || $card->{identifier} =~ /[nN]Vidia.*GeForce/ || #- GeForce cards $card->{identifier} =~ /[nN]Vidia.*NV1[15]/ || $card->{identifier} =~ /[nN]Vidia.*Quadro/); #- hack for SiS 640 for laptop. if ($card->{identifier} =~ /SiS.*640/ and detect_devices::isLaptop()) { $card->{use_xf4} = $card->{force_xf4} = ''; $card->{prefer_xf3} = 1; $card->{server} = 'FBDev'; } #- XFree version available, better to parse available package and get version from it. my ($xf4_ver, $xf3_ver) = ("4.2.0", "3.3.6"); #- basic installation, use of XFree 4.2 or XFree 3.3. my $xf3_tc = { text => _("XFree %s", $xf3_ver), code => sub { $card->{Utah_glx} = $card->{DRI_glx} = $card->{NVIDIA_glx} = ''; $card->{use_xf4} = ''; log::l("Using XFree $xf3_ver") } }; my $msg = _("Which configuration of XFree do you want to have?"); my @choices = $card->{use_xf4} ? (if_($card->{prefer_xf3}, $xf3_tc), if_(!$card->{prefer_xf3} || $::expert || $noauto, { text => _("XFree %s", $xf4_ver), code => sub { $card->{Utah_glx} = $card->{DRI_glx} = $card->{NVIDIA_glx} = ''; log::l("Using XFree $xf4_ver") } }), if_(!$card->{prefer_xf3} && !$card->{force_xf4} && ($::expert || $noauto), $xf3_tc)) : $xf3_tc; #- try to figure if 3D acceleration is supported #- by XFree 3.3 but not XFree 4 then ask user to keep XFree 3.3 ? if ($card->{Utah_glx} && !$card->{force_xf4}) { $msg = ($card->{use_xf4} && !($card->{DRI_glx} || $card->{NVIDIA_glx}) && !$card->{prefer_xf3} ? _("Your card can have 3D hardware acceleration support but only with XFree %s. Your card is supported by XFree %s which may have a better support in 2D.", $xf3_ver, $xf4_ver) : _("Your card can have 3D hardware acceleration support with XFree %s.", $xf3_ver)) . "\n\n\n" . $msg; $::expert || $noauto or @choices = (); #- keep it by default here as it is the only choice available. unshift @choices, { text => _("XFree %s with 3D hardware acceleration", $xf3_ver), code => sub { $card->{use_xf4} = ''; log::l("Using XFree $xf3_ver with 3D hardware acceleration") } }; } #- an expert user may want to try to use an EXPERIMENTAL 3D acceleration. if ($::expert && $card->{use_xf4} && $card->{DRI_glx_EXPERIMENTAL} && !$card->{Xinerama}) { $msg = _("Your card can have 3D hardware acceleration support with XFree %s, NOTE THIS IS EXPERIMENTAL SUPPORT AND MAY FREEZE YOUR COMPUTER.", $xf4_ver) . "\n\n\n" . $msg; push @choices, { text => _("XFree %s with EXPERIMENTAL 3D hardware acceleration", $xf4_ver), code => sub { $card->{DRI_glx} = 'EXPERIMENTAL'; log::l("Using XFree $xf4_ver with EXPERIMENTAL 3D hardware acceleration") } }; } #- an expert user may want to try to use an EXPERIMENTAL 3D acceleration, currenlty #- this is with Utah GLX and so, it can provide a way of testing. if ($::expert && $card->{Utah_glx_EXPERIMENTAL} && !$card->{force_xf4}) { $msg = ($card->{use_xf4} && !($card->{DRI_glx} || $card->{NVIDIA_glx}) && !$card->{prefer_xf3} ? _("Your card can have 3D hardware acceleration support but only with XFree %s, NOTE THIS IS EXPERIMENTAL SUPPORT AND MAY FREEZE YOUR COMPUTER. Your card is supported by XFree %s which may have a better support in 2D.", $xf3_ver, $xf4_ver) : _("Your card can have 3D hardware acceleration support with XFree %s, NOTE THIS IS EXPERIMENTAL SUPPORT AND MAY FREEZE YOUR COMPUTER.", $xf3_ver)) . "\n\n\n" . $msg; push @choices, { text => _("XFree %s with EXPERIMENTAL 3D hardware acceleration", $xf3_ver), code => sub { $card->{use_xf4} = ''; $card->{Utah_glx} = 'EXPERIMENTAL'; log::l("Using XFree $xf3_ver with EXPERIMENTAL 3D hardware acceleration") } }; } #- ask the expert or any user on second pass user to enable or not hardware acceleration support. if ($card->{use_xf4} && ($card->{DRI_glx} || $card->{NVIDIA_glx}) && !$card->{Xinerama}) { $msg = _("Your card can have 3D hardware acceleration support with XFree %s.", $xf4_ver) . "\n\n\n" . $msg; $::expert || $noauto or @choices = (); #- keep all user by default with XFree 4 including 3D acceleration. unshift @choices, { text => _("XFree %s with 3D hardware acceleration", $xf4_ver), code => sub { log::l("Using XFree $xf4_ver with 3D hardware acceleration") } }; } if (arch() =~ /ppc/) { #- not much choice for PPC - we only have XF4, and Xpmac from the installer @choices = { text => _("XFree %s", $xf4_ver), code => sub { $card->{xpmac} = ''; log::l("Using XFree $xf4_ver") } }; push @choices, { text => _("Xpmac (installation display driver)"), code => sub { $card->{xpmac} = 1 }} if ($ENV{DISPLAY}); } #- examine choice of user, beware the list MUST NOT BE REORDERED AS the first item should be the #- proposed one by DrakX. my $tc = $in->ask_from_listf(_("XFree configuration"), formatAlaTeX($msg), sub { translate($_[0]{text}) }, \@choices) or return; #- in case of class discarding, this can help ... $tc or $tc = $choices[0]; $tc->{code} and $tc->{code}(); if ($card->{xpmac} eq "1") { log::l("Use Xpmac - great..."); #- define this stuff just so XF86Config isn't empty - we don't need it for Xpmac $card->{type} = "Xpmac Frame Buffer Driver"; $card->{vendor} = $card->{board} = "None"; $card->{driver} = $card->{server} = "Xpmac"; } $card->{prog} = "/usr/X11R6/bin/" . ($card->{use_xf4} ? 'XFree86' : $card->{server} =~ /Sun(.*)/ ? "Xsun$1" : "XF86_$card->{server}"); #- additional packages to install according available card. #- add XFree86-libs-DRI here if using DRI (future split of XFree86 TODO) my @l = (); if ($card->{DRI_glx}) { push @l, 'Glide_V5' if $card->{identifier} =~ /Voodoo 5/; push @l, 'Glide_V3-DRI' if $card->{identifier} =~ /Voodoo (3|Banshee)/; push @l, 'XFree86-glide-module' if $card->{identifier} =~ /Voodoo/; } elsif ($card->{NVIDIA_glx}) { push @l, @{$cardOptions->{allowNVIDIA_rpms}}; } if ($card->{Utah_glx}) { push @l, 'Mesa' if !$card->{use_xf4}; } if ($card->{xpmac} eq "1") { push @l, 'XFree86-Xpmac'; $card->{use_xf4} = ''; $card->{prog} = "/usr/X11R6/bin/Xpmac"; $card->{server} = 'Xpmac'; } unless ($::g_auto_install) { if (-x "$prefix$card->{prog}") { @l and $do_pkgs->install(@l); } else { $do_pkgs->install($card->{use_xf4} ? 'XFree86-server' : "XFree86-$card->{server}", @l); } -x "$prefix$card->{prog}" or die "server $card->{server} is not available (should be in $prefix$card->{prog})"; } #- check for Matrox G200 PCI cards, disable AGP in such cases, causes black screen else. if ($card->{identifier} =~ /Matrox.* G[24]00/ && $card->{identifier} !~ /AGP/) { log::l("disabling AGP mode for Matrox card, as it seems to be a PCI card"); log::l("this is only used for XFree 3.3.6, see /etc/X11/glx.conf"); substInFile { s/^\s*#*\s*mga_dma\s*=\s*\d+\s*$/mga_dma = 0\n/ } "$prefix/etc/X11/glx.conf"; } #- make sure everything is correct at this point, packages have really been installed #- and driver and GLX extension is present. if ($card->{NVIDIA_glx} && !$card->{DRI_glx} && (-e "$prefix/usr/X11R6/lib/modules/drivers/nvidia_drv.o" && -e "$prefix/usr/X11R6/lib/modules/extensions/libglx.so")) { log::l("Using specific NVIDIA driver and GLX extensions"); $card->{driver} = 'nvidia'; foreach (@{$cardOptions->{allowNVIDIA_rpms}}) { #- hack as NVIDIA_kernel package does not do it actually (8.1 OEM). if (/NVIDIA_kernel-([^\-]*)-([^\-]*)(?:-(.*))?/ && -e "$prefix/boot/System.map-$1-$2$3") { run_program::rooted($prefix, "/sbin/depmod", "-a", "-F", "/boot/System.map-$1-$2$3", "$1-$2$3"); } } } else { $card->{NVIDIA_glx} = ''; } delete $card->{depth}{32} if $card->{type} =~ /S3 Trio3D|SiS/; $card->{options}{sw_cursor} = 1 if $card->{type} =~ /S3 Trio3D|SiS 6326/; unless ($card->{type}) { $card->{flags}{noclockprobe} = member($card->{server}, qw(I128 S3 S3V Mach64)); } $card->{options_xf3}{power_saver} = 1; $card->{options_xf4}{DPMS} = 'on'; $card->{flags}{needVideoRam} and $card->{memory} ||= $videomemory{$in->ask_from_list_('', _("Select the memory size of your graphic card"), [ sort { $videomemory{$a} <=> $videomemory{$b} } keys %videomemory]) || return}; #- hack for ATI Mach64 cards where two options should be used if using Utah-GLX. if ($card->{identifier} =~ /Rage X[CL]/ || $card->{identifier} =~ /Rage Mobility [PL]/ || $card->{identifier} =~ /3D Rage (?:LT|Pro)/) { $card->{options_xf3}{no_font_cache} = $card->{Utah_glx}; $card->{options_xf3}{no_pixmap_cache} = $card->{Utah_glx}; } #- hack for SiS cards where an option should be used if using Utah-GLX. if ($card->{identifier} =~ /SiS.*6C?326/ || $card->{identifier} =~ /SiS.*6C?236/ || $card->{identifier} =~ /SiS.*630/) { $card->{options_xf3}{no_pixmap_cache} = $card->{Utah_glx}; } #- 3D acceleration configuration for XFree 4 using DRI, this is enabled by default #- but for some there is a need to specify VideoRam (else it won't run). if ($card->{DRI_glx}) { $card->{identifier} =~ /Matrox.* G[245][05]0/ and $card->{flags}{needVideoRam} = 'fakeVideoRam'; $card->{identifier} =~ /8281[05].* CGC/ and ($card->{flags}{needVideoRam}, $card->{memory}) = ('fakeVideoRam', 16384); #- always enable (as a reminder for people using a better AGP mode to change it at their own risk). $card->{options_xf4}{AGPMode} = '1'; #- hack for ATI Rage 128 card using a bttv or peripheral with PCI bus mastering exchange #- AND using DRI at the same time. if ($card->{identifier} =~ /Rage 128|Rage Mobility M/) { $card->{options_xf4}{UseCCEFor2D} = (detect_devices::matching_desc('Bt8[47][89]') || detect_devices::matching_desc('TV') || detect_devices::matching_desc('AG GMV1')) ? 'true' : 'false'; } } $card; } sub optionsConfiguration($) { my ($o) = @_; my @l; my %l; foreach (@options) { if ($o->{card}{server} eq $_->[1] && $o->{card}{identifier} =~ /$_->[2]/) { my $options = 'options_' . ($o->{card}{server} eq 'XFree86' ? 'xf4' : 'xf3'); $o->{card}{$options}{$_->[0]} ||= 0; unless ($l{$_->[0]}) { push @l, { label => $_->[0], val => \$o->{card}{$options}{$_->[0]}, type => 'bool' }; $l{$_->[0]} = 1; } } } @l = @l[0..9] if @l > 9; #- reduce list size to 10 for display $in->ask_from('', _("Choose options for server"), \@l); } sub monitorConfiguration(;$$) { my $monitor = shift || {}; my $useFB = shift || 0; readMonitorsDB("$ENV{SHARE_PATH}/ldetect-lst/MonitorsDB"); if ($monitor->{EISA_ID}) { log::l("EISA_ID: $monitor->{EISA_ID}"); if (my ($mon) = grep { lc($_->{eisa}) eq $monitor->{EISA_ID} } values %monitors) { add2hash($monitor, $mon); log::l("EISA_ID corresponds to: $monitor->{type}"); } } if ($monitor->{hsyncrange} && $monitor->{vsyncrange}) { add2hash($monitor, { type => "monitor1", vendor => "Unknown", model => "Unknown" }); return $monitor; } my $good_default = (arch() =~ /ppc/ ? 'Apple|' : 'Generic|') . translate($good_default_monitor); $monitor->{type} ||= ($::auto_install ? $low_default_monitor : $in->ask_from_treelist(_("Monitor"), _("Choose a monitor"), '|', ['Custom', keys %monitors], $good_default)); if ($monitor->{type} eq 'Custom') { $in->ask_from('', _("The two critical parameters are the vertical refresh rate, which is the rate at which the whole screen is refreshed, and most importantly the horizontal sync rate, which is the rate at which scanlines are displayed. It is VERY IMPORTANT that you do not specify a monitor type with a sync range that is beyond the capabilities of your monitor: you may damage your monitor. If in doubt, choose a conservative setting."), [ { val => \$monitor->{hsyncrange}, list => \@hsyncranges, label => _("Horizontal refresh rate"), not_edit => 0 }, { val => \$monitor->{vsyncrange}, list => \@vsyncranges, label => _("Vertical refresh rate"), not_edit => 0 } ]); } else { add2hash($monitor, $monitors{$monitor->{type}} || $standard_monitors_{$monitor->{type}}); } add2hash($monitor, { type => "Unknown", vendor => "Unknown", model => "Unknown", manual => 1 }); } sub testConfig($) { my ($o) = @_; my ($resolutions, $clocklines); write_XF86Config($o, $tmpconfig); unlink "/tmp/.X9-lock"; #- restart_xfs; my $f = $tmpconfig . ($o->{card}{use_xf4} && "-4"); local *F; open F, "$prefix$o->{card}{prog} :9 -probeonly -pn -xf86config $f 2>&1 |"; local $_; while () { $o->{card}{memory} ||= $2 if /(videoram|Video RAM):\s*(\d*)/; # look for clocks push @$clocklines, $1 if /clocks: (.*)/ && !/(pixel |num)clocks:/; push @$resolutions, [ $1, $2 ] if /: Mode "(\d+)x(\d+)": mode clock/; print; } close F or die "X probeonly failed"; ($resolutions, $clocklines); } sub testFinalConfig { my ($o, $auto, $skiptest, $skip_badcard) = @_; $o->{monitor}{hsyncrange} && $o->{monitor}{vsyncrange} or $in->ask_warn('', _("Monitor not configured")), return; $o->{card}{server} || $o->{card}{driver} or $in->ask_warn('', _("Graphic card not configured yet")), return; $o->{card}{depth} or $in->ask_warn('', _("Resolutions not chosen yet")), return; my $f = "/etc/X11/XF86Config.test"; write_XF86Config($o, $::testing ? $tmpconfig : "$prefix/$f"); $skiptest || $o->{card}{server} =~ 'FBDev|Sun' and return 1; #- avoid testing with these. #- needed for bad cards not restoring cleanly framebuffer, according to which version of XFree are used. my $bad_card = ($o->{card}{use_xf4} ? $o->{card}{identifier} =~ /Matrox|Rage Mobility [PL]|SiS.*SG86C2.5|SiS.*559[78]|SiS.*300|SiS.*540|SiS.*6C?326|SiS.*6C?236|Tseng.*ET6\d00|Riva.*128/ : $o->{card}{identifier} =~ /i740|Rage Mobility [PL]|3D Rage LT|Rage 128/); $::live and $bad_card ||= $o->{card}{identifier} =~ /S3.*ViRGE/; log::l("the graphic card does not like X in framebuffer") if $bad_card; my $verybad_card = $o->{card}{driver} eq 'i810' || $o->{card}{driver} eq 'fbdev'; $verybad_card ||= $o->{card}{driver} eq 'nvidia' && !$::isStandalone; #- avoid testing during install at any price. $bad_card || $verybad_card and return 1; #- deactivating bad_card test too. my $mesg = _("Do you want to test the configuration?"); my $def = 1; if ($bad_card && !$::isStandalone) { $skip_badcard and return 1; $mesg = $mesg . "\n" . _("Warning: testing this graphic card may freeze your computer"); $def = 0; } $auto && $def or $in->ask_yesorno(_("Test of the configuration"), $mesg, $def) or return 1; unlink "$prefix/tmp/.X9-lock"; #- create a link from the non-prefixed /tmp/.X11-unix/X9 to the prefixed one #- that way, you can talk to :9 without doing a chroot #- but take care of non X11 install :-) if (-d "/tmp/.X11-unix") { symlinkf "$prefix/tmp/.X11-unix/X9", "/tmp/.X11-unix/X9" if $prefix; } else { symlinkf "$prefix/tmp/.X11-unix", "/tmp/.X11-unix" if $prefix; } #- restart_xfs; my $f_err = "$prefix/tmp/Xoutput"; my $pid; unless ($pid = fork) { system("xauth add :9 . `mcookie`"); open STDERR, ">$f_err"; chroot $prefix if $prefix; exec $o->{card}{prog}, if_($o->{card}{prog} !~ /Xsun/, "-xf86config", ($::testing ? $tmpconfig : $f) . ($o->{card}{use_xf4} && "-4")), ":9" or c::_exit(0); } do { sleep 1 } until xtest(":9") || waitpid($pid, c::WNOHANG()); my $b = before_leaving { unlink $f_err }; unless (xtest(":9")) { local $_; local *F; open F, $f_err; i: while () { if ($o->{card}{use_xf4}) { if (/^\(EE\)/ && $_ !~ /Disabling/ || /^Fatal\b/) { my @msg = !/error/ && $_ ; while () { /reporting a problem/ and last; push @msg, $_; $in->ask_warn('', [ _("An error has occurred:"), " ", @msg, _("\ntry to change some parameters") ]); return 0; } } } else { if (/\b(error|not supported)\b/i) { my @msg = !/error/ && $_ ; while () { /not fatal/ and last i; /^$/ and last; push @msg, $_; } $in->ask_warn('', [ _("An error has occurred:"), " ", @msg, _("\ntry to change some parameters") ]); return 0; } } } } $::noShadow = 1; local *F; open F, "|perl 2>/dev/null" or die ''; print F "use lib qw(", join(' ', @INC), ");\n"; print F q{ require lang; use interactive_gtk; use my_gtk qw(:wrappers); lang::bindtextdomain(); $ENV{DISPLAY} = ":9"; gtkset_background(200 * 257, 210 * 257, 210 * 257); my ($h, $w) = Gtk::Gdk::Window->new_foreign(Gtk::Gdk->ROOT_WINDOW)->get_size; $my_gtk::force_position = [ $w / 3, $h / 2.4 ]; $my_gtk::force_focus = 1; my $text = Gtk::Label->new; my $time = 8; Gtk->timeout_add(1000, sub { $text->set(_("Leaving in %d seconds", $time)); $time-- or Gtk->main_quit; 1; }); my $background = "/usr/share/pixmaps/backgrounds/linux-mandrake/XFdrake-image-test.jpg"; my $qiv = "/usr/bin/qiv"; -r "} . $prefix . q{/$background" && -x "} . $prefix . q{/$qiv" and system(($::testing ? "} . $prefix . q{" : "chroot } . $prefix . q{/ ") . "$qiv -y $background"); my $in = interactive_gtk->new; $in->exit($in->ask_yesorno('', [ _("Is this the correct setting?"), $text ], 0) ? 0 : 222); }; my $rc = close F; my $err = $?; unlink "/tmp/.X11-unix/X9" if $prefix; kill 2, $pid; $::noShadow = 0; $rc || $err == 222 << 8 or $in->ask_warn('', _("An error has occurred, try to change some parameters")); $rc; } sub allowedDepth($) { my ($card) = @_; my %allowed_depth; if ($card->{Utah_glx} || $card->{DRI_glx}) { $allowed_depth{16} = 1; #- this is the default. $card->{identifier} =~ /Voodoo 5/ and $allowed_depth{24} = undef; $card->{identifier} =~ /Matrox.* G[245][05]0/ and $allowed_depth{24} = undef; $card->{identifier} =~ /Rage 128/ and $allowed_depth{24} = undef; $card->{identifier} =~ /Radeon/ and $allowed_depth{24} = undef; } for ($card->{server}) { #- this should work by default, FBDev is allowed only if install currently uses it at 16bpp. /FBDev/ and $allowed_depth{16} = 1; #- Sun servers, Sun24 handles 24,8,2; Sun only 8 and 2; and SunMono only 2. /^Sun24$/ and @allowed_depth{qw(24 8 2)} = (1); /^Sun$/ and @allowed_depth{qw(8 2)} = (1); /^SunMono$/ and @allowed_depth{qw(2)} = (1); } return %allowed_depth && \%allowed_depth; #- no restriction if false is returned. } sub autoDefaultDepth($$) { my ($card, $wres_wanted) = @_; my ($best, $depth); #- check for forced depth according to current environment. my $allowed_depth = allowedDepth($card); if ($allowed_depth) { foreach (keys %$allowed_depth) { $allowed_depth->{$_} and return $_; #- a default depth is given. } } while (my ($d, $r) = each %{$card->{depth}}) { $allowed_depth && ! exists $allowed_depth->{$d} and next; #- reject depth. $depth = max($depth || 0, $d); #- try to have resolution_wanted $best = max($best || 0, $d) if $r->[0][0] >= $wres_wanted; $best = $card->{suggest_depth}, last if ($card->{suggest_depth} && $card->{suggest_wres} && $r->[0][0] >= $card->{suggest_wres}); } $best || $depth or die "no valid modes"; } sub autoDefaultResolution { # return "1024x768" if detect_devices::hasPCMCIA; if (arch() =~ /ppc/) { return "1024x768" if detect_devices::get_mac_model =~ /^PowerBook|^iMac/; } my ($size) = @_; $monitorSize2resolution[round($size || 14)] || #- assume a small monitor (size is in inch) $monitorSize2resolution[-1]; #- no corresponding resolution for this size. It means a big monitor, take biggest we have } sub chooseResolutionsGtk($$;$) { my ($card, $chosen_depth, $chosen_w) = @_; require my_gtk; my_gtk->import(qw(:helpers :wrappers)); my $W = my_gtk->new(_("Resolution")); my %txt2depth = reverse %depths; my ($r, $depth_combo, %w2depth, %w2h, %w2widget, $pix_monitor, $pix_colors, $w2_combo); $w2_combo = new Gtk::Combo; my $best_w; my $allowed_depth = allowedDepth($card); my %allowed_depth; while (my ($depth, $res) = each %{$card->{depth}}) { $allowed_depth && ! exists $allowed_depth->{$depth} and next; #- reject depth. foreach (@$res) { ++$allowed_depth{$depth}; $w2h{$_->[0]} = $_->[1]; push @{$w2depth{$_->[0]}}, $depth; $best_w = max($_->[0], $best_w) if $_->[0] <= $chosen_w; } } $chosen_w = $best_w; $chosen_w ||= 640; #- safe guard ? my $set_depth = sub { $depth_combo->entry->set_text(translate($depths{$chosen_depth})) }; #- the set function is usefull to toggle the CheckButton with the callback being ignored my $ignore; my $no_human; # is the w2_combo->entry changed by a human? my $set = sub { $ignore = 1; $_[0] and $_[0]->set_active(1); $ignore = 0; }; my %monitor; $monitor{$_} = [ gtkcreate_png("monitor-" . $_ . ".png") ] foreach (640, 800, 1024, 1280); $monitor{1152} = [ gtkcreate_png("monitor-" . 1024 . ".png") ]; $monitor{1600} = [ gtkcreate_png("monitor-" . 1280 . ".png") ]; my $pixmap_mo = new Gtk::Pixmap( $monitor{$chosen_w}[0] , $monitor{$chosen_w}[1] ); while (my ($w, $h) = each %w2h) { my $V = $w . "x" . $h; $w2widget{$w} = $r = new Gtk::RadioButton($r ? ($V, $r) : $V); if ($chosen_w == $w) { &$set($r); } $r->signal_connect("clicked" => sub { $ignore and return; $chosen_w = $w; $no_human=1; $w2_combo->entry->set_text($w . "x" . $w2h{$w}); unless (member($chosen_depth, @{$w2depth{$w}})) { $chosen_depth = max(@{$w2depth{$w}}); &$set_depth(); } }); } gtkadd($W->{window}, gtkpack_($W->create_box_with_title(_("Choose the resolution and the color depth"), "(" . ($card->{type} ? _("Graphic card: %s", $card->{type}) : _("XFree86 server: %s", $card->{server})) . ")" ), 1, gtkpack2(new Gtk::VBox(0,0), gtkpack2__(new Gtk::VBox(0, $::isEmbedded ? 15 : 0), if_($::isEmbedded, $pixmap_mo), if_(!$::isEmbedded, map {$w2widget{$_} } ikeys(%w2widget)), gtkpack2(new Gtk::HBox(0,0), create_packtable({ col_spacings => 5, row_spacings => 5}, [ if_($::isEmbedded,$w2_combo) , new Gtk::Label("")], [ $depth_combo = new Gtk::Combo, gtkadd(gtkset_shadow_type(new Gtk::Frame, 'etched_out'), $pix_colors = gtkpng ("colors")) ], ), ), ), ), 0, gtkadd($W->create_okcancel(_("Ok"), _("More")), $::isEmbedded ? gtksignal_connect(new Gtk::Button(_("Expert Mode")), clicked => sub { system ("XFdrake --expert"); }) : gtksignal_connect(new Gtk::Button(_("Show all")), clicked => sub { $W->{retval} = 1; $chosen_w = 0; Gtk->main_quit })), )); $depth_combo->disable_activate; $depth_combo->set_use_arrows_always(1); $depth_combo->entry->set_editable(0); $depth_combo->set_popdown_strings(map { translate($depths{$_}) } grep { $allowed_depth{$_} } ikeys(%{$card->{depth}})); $depth_combo->entry->signal_connect(changed => sub { $chosen_depth = $txt2depth{untranslate($depth_combo->entry->get_text, keys %txt2depth)}; my $w = $card->{depth}{$chosen_depth}[0][0]; $chosen_w > $w and &$set($w2widget{$chosen_w = $w}); $pix_colors->set(gtkcreate_png( $chosen_depth >= 24 ? "colors.png" : $chosen_depth >= 15 ? "colors16.png" : "colors8.png")); }); if ($::isEmbedded) { $w2_combo->disable_activate; $w2_combo->set_use_arrows_always(1); $w2_combo->entry->set_editable(0); $w2_combo->set_popdown_strings(map { $_ . "x" . $w2h{$_} } keys %w2h); $w2_combo->entry->signal_connect(changed => sub { ($chosen_w) = $w2_combo->entry->get_text =~ /([^x]*)x.*/; $no_human ? $no_human=0 : $w2widget{$chosen_w}->set_active(1); $pixmap_mo->set($monitor{$chosen_w}[0], $monitor{$chosen_w}[1]); }); } &$set_depth(); $W->{ok}->grab_focus; if ($::isEmbedded) { $no_human=1; $w2_combo->entry->set_text($chosen_w . "x" . $w2h{$chosen_w}); } $W->main or return; ($chosen_depth, $chosen_w); } sub chooseResolutions($$;$) { goto &chooseResolutionsGtk if $in->isa('interactive_gtk'); my ($card, $chosen_depth, $chosen_w) = @_; my $best_w; my $allowed_depth = allowedDepth($card); local $_ = $in->ask_from_list(_("Resolutions"), "", [ map_each { if_(!$allowed_depth || exists $allowed_depth->{$::a}, map { "$_->[0]x$_->[1] ${main::a}bpp" } @$::b) } %{$card->{depth}} ]) or return; reverse /(\d+)x\S+ (\d+)/; } sub resolutionsConfiguration { my ($o, $auto) = @_; my $card = $o->{card}; #- For the mono and vga16 server, no further configuration is required. if (member($card->{server}, "Mono", "VGA16")) { $card->{depth}{8} = [[ 640, 480 ]]; return; } elsif ($card->{server} =~ /Sun/) { $card->{depth}{2} = [[ 1152, 864 ]] if $card->{server} =~ /^(SunMono)$/; $card->{depth}{8} = [[ 1152, 864 ]] if $card->{server} =~ /^(SunMono|Sun)$/; $card->{depth}{24} = [[ 1152, 864 ]] if $card->{server} =~ /^(SunMono|Sun|Sun24)$/; $card->{default_wres} = 1152; $o->{default_depth} = max(keys %{$card->{depth}}); return 1; #- aka we cannot test, assumed as good (should be). } if (is_empty_hash_ref($card->{depth})) { $card->{depth}{$_} = [ map { [ split "x" ] } @resolutions ] foreach @depths; } #- sort resolutions in each depth foreach (values %{$card->{depth}}) { my $i = 0; @$_ = grep { first($i != $_->[0], $i = $_->[0]) } sort { $b->[0] <=> $a->[0] } @$_; } #- remove unusable resolutions (based on the video memory size and the monitor hsync rate) keepOnlyLegalModes($card, $o->{monitor}); my $res = $o->{resolution_wanted} || $card->{suggest_wres} || autoDefaultResolution($o->{monitor}{size}); my $wres = first(split 'x', $res); #- take the first available resolution <= the wanted resolution eval { $wres = max map { first(grep { $_->[0] <= $wres } @$_)->[0] } values %{$card->{depth}} }; my $depth = eval { $o->{default_depth} || autoDefaultDepth($card, $wres) }; $auto or ($depth, $wres) = chooseResolutions($card, $depth, $wres) or return; #- if nothing has been found for wres, #- try to find if memory used by mode found match the memory available #- card, if this is the case for a relatively low resolution ( < 1024 ), #- there could be a problem. #- memory in KB is approximated by $wres*$dpeth/14 which is little less #- than memory really used, (correct factor is 13.65333 for w/h ratio of 1.33333). if (!$wres || $auto && ref($in) !~ /class_discard/ && ($wres < 1024 && ($card->{memory} / ($wres * $depth / 14)) > 2)) { delete $card->{depth}; return resolutionsConfiguration($o); } #- needed in auto mode when all has been provided by the user $card->{depth}{$depth} or die "you selected an unusable depth"; #- remove all biggest resolution (keep the small ones for ctl-alt-+) #- otherwise there'll be a virtual screen :( $_ = [ grep { $_->[0] <= $wres } @$_ ] foreach values %{$card->{depth}}; $card->{default_wres} = $wres; $card->{vga_mode} = $vgamodes{"${wres}xx$depth"} || $vgamodes{"${res}x$depth"}; #- for use with frame buffer. $o->{default_depth} = $depth; 1; } #- Create the XF86Config file. sub write_XF86Config { my ($o, $file) = @_; my $O; $::g_auto_install and return; local (*F, *G); open F, ">$file" or die "can't write XF86Config in $file: $!"; open G, ">$file-4" or die "can't write XF86Config in $file-4: $!"; print F $XF86firstchunk_text; print G $XF86firstchunk_text; #- Write keyboard section. $O = $o->{keyboard}; print F $keyboardsection_start; print G $keyboardsection_start_v4; print F qq( XkbDisable\n) unless $O->{xkb_keymap}; print G qq( Option "XkbDisable"\n) unless $O->{xkb_keymap}; print F $keyboardsection_part3; print G $keyboardsection_part3_v4; $O->{xkb_model} ||= arch() =~ /sparc/ ? 'sun' : $O->{xkb_keymap} eq 'jp' ? 'jp106' : $O->{xkb_keymap} eq 'br' ? 'abnt2' : 'pc105'; print F qq( XkbModel "$O->{xkb_model}"\n); print G qq( Option "XkbModel" "$O->{xkb_model}"\n); print F qq( XkbLayout "$O->{xkb_keymap}"\n); print G qq( Option "XkbLayout" "$O->{xkb_keymap}"\n); print F join '', map { " $_\n" } @{$xkb_options{$O->{xkb_keymap}} || []}; print G join '', map { /(\S+)(.*)/; qq( Option "$1" $2\n) } @{$xkb_options{$O->{xkb_keymap}} || []}; print F $keyboardsection_end; print G $keyboardsection_end; #- Write pointer section. my $pointer = sub { my ($O, $id) = @_; print F $id > 1 ? qq(Section "XInput"\n) : qq(Section "Pointer"\n); $id > 1 and print F qq( SubSection "Mouse"\n); print G qq(Section "InputDevice"\n\n); $id > 1 and print F qq( DeviceName "Mouse$id"\n); print G qq( Identifier "Mouse$id"\n); print G qq( Driver "mouse"\n); print F ($id > 1 && " ") . qq( Protocol "$O->{XMOUSETYPE}"\n); print G qq( Option "Protocol" "$O->{XMOUSETYPE}"\n); print F ($id > 1 && " ") . qq( Device "/dev/$O->{device}"\n); print G qq( Option "Device" "/dev/$O->{device}"\n); print F " AlwaysCore\n" if $id > 1; #- this will enable the "wheel" or "knob" functionality if the mouse supports it print F ($id > 1 && " ") . " ZAxisMapping 4 5\n" if $O->{nbuttons} > 3; print F ($id > 1 && " ") . " ZAxisMapping 6 7\n" if $O->{nbuttons} > 5; print G qq( Option "ZAxisMapping" "4 5"\n) if $O->{nbuttons} > 3; print G qq( Option "ZAxisMapping" "6 7"\n) if $O->{nbuttons} > 5; print F "#" unless $O->{nbuttons} < 3; print G "#" unless $O->{nbuttons} < 3; print F ($id > 1 && " ") . qq( Emulate3Buttons\n); print G qq( Option "Emulate3Buttons"\n); print F "#" unless $O->{nbuttons} < 3; print G "#" unless $O->{nbuttons} < 3; print F ($id > 1 && " ") . qq( Emulate3Timeout 50\n\n); print G qq( Option "Emulate3Timeout" "50"\n\n); print F "# ChordMiddle is an option for some 3-button Logitech mice\n\n"; print G "# ChordMiddle is an option for some 3-button Logitech mice\n\n"; print F "#" unless $O->{chordmiddle}; print G "#" unless $O->{chordmiddle}; print F ($id > 1 && " ") . qq( ChordMiddle\n\n); print G qq( Option "ChordMiddle"\n\n); print F ($id > 1 && " ") . " ClearDTR\n" if $O->{cleardtrrts}; print F ($id > 1 && " ") . " ClearRTS\n\n" if $O->{cleardtrrts}; $id > 1 and print F qq( EndSubSection\n); print F "EndSection\n\n\n"; print G "EndSection\n\n\n"; }; print F $pointersection_text; print G $pointersection_text; $pointer->($o->{mouse}, 1); $o->{mouse}{auxmouse} and $pointer->($o->{mouse}{auxmouse}, 2); #- write module section for version 3. if (@{$o->{wacom}} || $o->{card}{Utah_glx}) { print F qq(Section "Module" ); print F qq( Load "xf86Wacom.so"\n) if @{$o->{wacom}}; print F qq( Load "glx-3.so"\n) if $o->{card}{Utah_glx}; #- glx.so may clash with server version 4. print F qq(EndSection ); } #- write wacom device support. foreach (1 .. @{$o->{wacom}}) { my $dev = "/dev/" . $o->{wacom}[$_-1]; print F $dev =~ /input\/event/ ? qq( Section "XInput" SubSection "WacomStylus" Port "$dev" DeviceName "Stylus$_" USB AlwaysCore Mode Absolute EndSubSection SubSection "WacomCursor" Port "$dev" DeviceName "Cursor$_" USB AlwaysCore Mode Relative EndSubSection SubSection "WacomEraser" Port "$dev" DeviceName "Eraser$_" USB AlwaysCore Mode Absolute EndSubSection EndSection ) : qq( Section "XInput" SubSection "WacomStylus" Port "$dev" DeviceName "Stylus$_" AlwaysCore Mode Absolute EndSubSection SubSection "WacomCursor" Port "$dev" DeviceName "Sursor$_" AlwaysCore Mode Relative EndSubSection SubSection "WacomEraser" Port "$dev" DeviceName "Eraser$_" AlwaysCore Mode Absolute EndSubSection EndSection ); } foreach (1..@{$o->{wacom}}) { my $dev = "/dev/" . $o->{wacom}[$_-1]; print G $dev =~ /input\/event/ ? qq( Section "InputDevice" Identifier "Stylus$_" Driver "wacom" Option "Type" "stylus" Option "Device" "$dev" Option "Mode" "Absolute" Option "USB" "on" EndSection Section "InputDevice" Identifier "Eraser$_" Driver "wacom" Option "Type" "eraser" Option "Device" "$dev" Option "Mode" "Absolute" Option "USB" "on" EndSection Section "InputDevice" Identifier "Cursor$_" Driver "wacom" Option "Type" "cursor" Option "Device" "$dev" Option "Mode" "Relative" Option "USB" "on" EndSection ) : qq( Section "InputDevice" Identifier "Stylus$_" Driver "wacom" Option "Type" "stylus" Option "Device" "$dev" Option "Mode" "Absolute" EndSection Section "InputDevice" Identifier "Eraser$_" Driver "wacom" Option "Type" "eraser" Option "Device" "$dev" Option "Mode" "Absolute" EndSection Section "InputDevice" Identifier "Cursor$_" Driver "wacom" Option "Type" "cursor" Option "Device" "$dev" Option "Mode" "Relative" EndSection ); } #- write modules section for version 4. print G qq( Section "Module" # This loads the DBE extension module. Load "dbe" ); unless ($o->{card}{DRI_glx} && $o->{card}{driver} eq 'r128') { print G qq( # This loads the Video for Linux module. Load "v4l" ); } if ($o->{card}{DRI_glx}) { print G qq( Load "glx" Load "dri" ); } elsif ($o->{card}{NVIDIA_glx}) { print G qq( # This loads the NVIDIA GLX extension module. # IT IS IMPORTANT TO KEEP NAME AS FULL PATH TO libglx.so ELSE # IT WILL LOAD XFree86 glx module and the server will crash. Load "/usr/X11R6/lib/modules/extensions/libglx.so" ); } print G qq( # This loads the miscellaneous extensions module, and disables # initialisation of the XFree86-DGA extension within that module. SubSection "extmod" #Option "omit xfree86-dga" EndSubSection # This loads the Type1 and FreeType font modules Load "type1" Load "freetype" EndSection ); print G qq( Section "DRI" Mode 0666 EndSection ) if $o->{card}{DRI_glx}; #- Write monitor section. $O = $o->{monitor}; print F $monitorsection_text1; print G $monitorsection_text1; print F qq( Identifier "$O->{type}"\n); print G qq( Identifier "$O->{type}"\n); print G qq( UseModes "Mac Modes"\n) if arch() =~ /ppc/; print F qq( VendorName "$O->{vendor}"\n); print G qq( VendorName "$O->{vendor}"\n); print F qq( ModelName "$O->{model}"\n\n); print G qq( ModelName "$O->{model}"\n\n); print F $monitorsection_text2; print G $monitorsection_text2; print F qq( HorizSync $O->{hsyncrange}\n\n); print G qq( HorizSync $O->{hsyncrange}\n\n); print F $monitorsection_text3; print G $monitorsection_text3; print F qq( VertRefresh $O->{vsyncrange}\n\n); print G qq( VertRefresh $O->{vsyncrange}\n\n); print F $monitorsection_text4; print F ($O->{modelines} || '') . ($o->{card}{type} eq "TG 96" ? $modelines_text_Trident_TG_96xx : "$modelines_text$modelines_text_ext"); print G $modelines_text_ext; print F "\nEndSection\n\n\n"; print G "\nEndSection\n\n\n"; print G $modelines_text_apple if arch() =~ /ppc/; foreach (2..@{$o->{card}{cards} || []}) { print G qq(Section "Monitor"\n); print G qq( Identifier "monitor$_"\n); print G qq( VendorName "$O->{vendor}"\n); print G qq( ModelName "$O->{model}"\n\n); print G qq( HorizSync $O->{hsyncrange}\n); print G qq( VertRefresh $O->{vsyncrange}\n); print G qq(EndSection\n\n\n); } #- Write Device section. $O = $o->{card}; print F $devicesection_text; print G $devicesection_text_v4; print F qq(Section "Device"\n); print F qq( Identifier "$O->{type}"\n); print F qq( VendorName "$O->{vendor}"\n); print F qq( BoardName "$O->{board}"\n); print F "#" if $O->{chipset} && !$O->{flags}{needChipset}; print F qq( Chipset "$O->{chipset}"\n) if $O->{chipset}; print F "#" if $O->{memory} && !$O->{flags}{needVideoRam}; print F " VideoRam $O->{memory}\n" if $O->{memory}; print F map { " $_\n" } @{$O->{lines} || []}; print F qq( Ramdac "$O->{ramdac}"\n) if $O->{ramdac}; print F qq( Dacspeed "$O->{dacspeed}"\n) if $O->{dacspeed}; if ($O->{clockchip}) { print F qq( Clockchip "$O->{clockchip}"\n); } else { print F " # Clock lines\n"; print F " Clocks $_\n" foreach (@{$O->{clocklines}}); } print F qq( # Uncomment following option if you see a big white block # instead of the cursor! # Option "sw_cursor" ); my $p_xf3 = sub { my $l = $O->{$_[0]}; map { (!$l->{$_} && '#') . qq( Option "$_"\n) } keys %{$l || {}}; }; my $p_xf4 = sub { my $l = $O->{$_[0]}; map { (! defined $l->{$_} && '#') . qq( Option "$_" "$l->{$_}"\n) } keys %{$l || {}}; }; print F $p_xf3->('options'); print F $p_xf3->('options_xf3'); print F "EndSection\n\n\n"; #- configure all drivers here! foreach (@{$O->{cards} || [ $O ]}) { print G qq(Section "Device"\n); print G qq( Identifier "$_->{type}"\n); print G qq( VendorName "$_->{vendor}"\n); print G qq( BoardName "$_->{board}"\n); print G qq( Driver "$_->{driver}"\n); print G "#" if $_->{memory} && !$_->{flags}{needVideoRam}; print G " VideoRam $_->{memory}\n" if $_->{memory}; print G map { " $_\n" } @{$_->{lines} || []}; print G qq( Ramdac "$_->{ramdac}"\n) if $_->{ramdac}; print G qq( Dacspeed "$_->{dacspeed}"\n) if $_->{dacspeed}; if ($_->{clockchip}) { print G qq( Clockchip "$_->{clockchip}"\n); } else { print G " # Clock lines\n"; print G " Clocks $_\n" foreach (@{$_->{clocklines}}); } print G qq( # Uncomment following option if you see a big white block # instead of the cursor! # Option "sw_cursor" ); print G $p_xf3->('options'); #- keep $O for these! print G $p_xf4->('options_xf4'); #- keep $O for these! print G qq( Screen $_->{screen}\n) if defined $_->{screen}; print G qq( BusID "$_->{busid}"\n) if $_->{busid}; if ((arch =~ /ppc/) && ($_->{driver} eq "r128")) { print G qq( Option "UseFBDev"\n); } print G "EndSection\n\n\n"; } #- Write Screen sections. print F $screensection_text1, "\n"; print G $screensection_text1, "\n"; my $subscreen = sub { my ($f, $server, $defdepth, $depths) = @_; print $f " DefaultColorDepth $defdepth\n" if $defdepth; foreach (ikeys(%$depths)) { my $m = $server ne "fbdev" ? join(" ", map { qq("$_->[0]x$_->[1]") } @{$depths->{$_}}) : qq("default"); #-" print $f qq( Subsection "Display"\n); print $f qq( Depth $_\n) if $_; print $f qq( Modes $m\n); print $f qq( ViewPort 0 0\n); print $f qq( EndSubsection\n); } print $f "EndSection\n"; }; my $screen = sub { my ($server, $defdepth, $device, $depths) = @_; print F qq( Section "Screen" Driver "$server" Device "$device" Monitor "$o->{monitor}{type}" ); #-" $subscreen->(*F, $server, $defdepth, $depths); }; #- SVGA screen section. print F qq( # The Colour SVGA server ); if (member($O->{server}, @svgaservers)) { &$screen("svga", $o->{default_depth}, $O->{type}, $O->{depth}); } else { &$screen("svga", '', "Generic VGA", { 8 => [[ 320, 200 ]] }); } &$screen("vga16", '', (member($O->{server}, "Mono", "VGA16") ? $O->{type} : "Generic VGA"), { '' => [[ 640, 480 ], [ 800, 600 ]]}); &$screen("vga2", '', (member($O->{server}, "Mono", "VGA16") ? $O->{type} : "Generic VGA"), { '' => [[ 640, 480 ], [ 800, 600 ]]}); &$screen("accel", $o->{default_depth}, $O->{type}, $O->{depth}); &$screen("fbdev", $o->{default_depth}, $O->{type}, $O->{depth}); print G qq( Section "Screen" Identifier "screen1" Device "$O->{type}" Monitor "$o->{monitor}{type}" ); #- hack for DRI with Matrox card at 24 bpp, need another command. $O->{DRI_glx} && $O->{identifier} =~ /Matrox.* G[245][05]0/ && $o->{default_depth} == 24 and print G " DefaultFbBpp 32\n"; #- bpp 32 not handled by XF4 $subscreen->(*G, "svga", min($o->{default_depth}, 24), $O->{depth}); foreach (2..@{$O->{cards} || []}) { my $device = $O->{cards}[$_ - 1]{type}; print G qq( Section "Screen" Identifier "screen$_" Device "$device" Monitor "monitor$_" ); #- hack for DRI with Matrox card at 24 bpp, need another command. $O->{DRI_glx} && $O->{identifier} =~ /Matrox.* G[245][05]0/ && $o->{default_depth} == 24 and print G " DefaultFbBpp 32\n"; #- bpp 32 not handled by XF4 $subscreen->(*G, "svga", min($o->{default_depth}, 24), $O->{depth}); } print G qq( Section "ServerLayout" Identifier "layout1" Screen "screen1" ); foreach (2..@{$O->{cards} || []}) { my ($curr, $prev) = ($_, $_ - 1); print G qq( Screen "screen$curr" RightOf "screen$prev"\n); } print G '#' if defined $O->{Xinerama} && !$O->{Xinerama}; print G qq( Option "Xinerama" "on"\n) if defined $O->{Xinerama}; print G ' InputDevice "Mouse1" "CorePointer" '; $o->{mouse}{auxmouse} and print G ' InputDevice "Mouse2" "SendCoreEvents" '; foreach (1..@{$o->{wacom}}) { print G qq( InputDevice "Stylus$_" "AlwaysCore" InputDevice "Eraser$_" "AlwaysCore" InputDevice "Cursor$_" "AlwaysCore" ); } print G ' InputDevice "Keyboard1" "CoreKeyboard" EndSection '; #-" close F; close G; } sub XF86check_link { my ($ext) = @_; my $f = "$prefix/etc/X11/XF86Config$ext"; touch($f); my $l = "$prefix/usr/X11R6/lib/X11/XF86Config$ext"; if (-e $l && (stat($f))[1] != (stat($l))[1]) { #- compare the inode, must be the sames -e $l and unlink($l) || die "can't remove bad $l"; symlinkf "../../../../etc/X11/XF86Config$ext", $l; } } sub info { my ($o) = @_; my $info; my $xf_ver = $o->{card}{use_xf4} ? "4.2.0" : "3.3.6"; my $title = ($o->{card}{DRI_glx} || $o->{card}{NVIDIA_glx} || $o->{Utah_glx} ? _("XFree %s with 3D hardware acceleration", $xf_ver) : _("XFree %s", $xf_ver)); $info .= _("Keyboard layout: %s\n", $o->{keyboard}{xkb_keymap}); $info .= _("Mouse type: %s\n", $o->{mouse}{XMOUSETYPE}); $info .= _("Mouse device: %s\n", $o->{mouse}{device}) if $::expert; $info .= _("Monitor: %s\n", $o->{monitor}{type}); $info .= _("Monitor HorizSync: %s\n", $o->{monitor}{hsyncrange}) if $::expert; $info .= _("Monitor VertRefresh: %s\n", $o->{monitor}{vsyncrange}) if $::expert; $info .= _("Graphic card: %s\n", $o->{card}{type}); $info .= _("Graphic card identification: %s\n", $o->{card}{identifier}) if $::expert; $info .= _("Graphic memory: %s kB\n", $o->{card}{memory}) if $o->{card}{memory}; if ($o->{default_depth} and my $depth = $o->{card}{depth}{$o->{default_depth}}) { $info .= _("Color depth: %s\n", translate($depths{$o->{default_depth}})); $info .= _("Resolution: %s\n", join "x", @{$depth->[0]}) if $depth && !is_empty_array_ref($depth->[0]); } $info .= _("XFree86 server: %s\n", $o->{card}{server}) if $o->{card}{server}; $info .= _("XFree86 driver: %s\n", $o->{card}{driver}) if $o->{card}{driver}; "$title\n\n$info"; } sub show_info { my ($o) = @_; $in->ask_warn('', info($o)); } #- Program entry point. sub main { ($prefix, my $o, $in, $do_pkgs, my $cardOptions) = @_; $o ||= {}; XF86check_link(''); XF86check_link('-4'); { my $w = $in->wait_message('', _("Preparing X-Window configuration"), 1); $o->{card} = cardConfiguration($o->{card}, $::noauto, $cardOptions); $o->{monitor} = monitorConfiguration($o->{monitor}, $o->{card}{server} eq 'FBDev'); } my $ok = resolutionsConfiguration($o, $::auto); $ok &&= testFinalConfig($o, $::auto, $o->{skiptest}, $::auto); my $quit; until ($ok || $quit) { ref($in) =~ /discard/ and die "automatic X configuration failed, ensure you give hsyncrange and vsyncrange with non-DDC aware videocards/monitors"; $in->set_help('configureXmain') unless $::isStandalone; my $f; $in->ask_from_( { title => 'XFdrake', messages => _("What do you want to do?"), cancel => '', }, [ { format => sub { $_[0][0] }, val => \$f, list => [ [ _("Change Monitor") => sub { $o->{monitor} = monitorConfiguration() } ], [ _("Change Graphic card") => sub { my $card = cardConfiguration('', 'noauto', $cardOptions); $card and $o->{card} = $card } ], if_($::expert, [ _("Change Server options") => sub { optionsConfiguration($o) } ]), [ _("Change Resolution") => sub { resolutionsConfiguration($o) } ], [ _("Show information") => sub { show_info($o) } ], [ _("Test again") => sub { $ok = testFinalConfig($o, 1) } ], [ _("Quit") => sub { $quit = 1 } ], ], } ]); $f->[1]->(); $in->kill; } if (!$ok) { $ok = $in->ask_yesorno('', _("Keep the changes? Current configuration is: %s", info($o))); } if ($ok) { unless ($::testing) { my $f = "$prefix/etc/X11/XF86Config"; if (-e "$f.test") { rename $f, "$f.old" or die "unable to make a backup of XF86Config"; rename "$f-4", "$f-4.old"; rename "$f.test", $f; rename "$f.test-4", "$f-4"; if ($o->{card}{server} !~ /Xpmac/) { symlinkf "../..$o->{card}{prog}", "$prefix/etc/X11/X"; } } } if (!$::isStandalone || $0 !~ /Xdrakres/) { $in->set_help('configureXxdm') unless $::isStandalone; my $run = exists $o->{xdm} ? $o->{xdm} : $::auto || $in->ask_yesorno(_("X at startup"), _("I can set up your computer to automatically start X upon booting. Would you like X to start when you reboot?"), 1); any::runlevel($prefix, $run ? 5 : 3) unless $::testing; } if ($::isStandalone && $in->isa('interactive_gtk')) { if (my $wm = any::running_window_manager()) { if ($in->ask_okcancel('', _("Please relog into %s to activate the changes", ucfirst (lc $wm)), 1)) { fork and $in->exit; any::ask_window_manager_to_logout($wm); open STDIN, "/dev/null"; open STDERR, ">&STDERR"; c::setsid(); exec qw(perl -e), q{ my $wm = shift; for (my $nb = 30; $nb && `pidof "$wm"` > 0; $nb--) { sleep 1 } system("killall X ; killall -15 xdm gdm kdm prefdm") unless `pidof "$wm"` > 0; }, $wm; } } else { $in->ask_warn('', _("Please log out and then use Ctrl-Alt-BackSpace")); } } } } 1; 'n1585' href='#n1585'>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
# translation of DrakX.po to Arabic
# Amr Fathy <amr10@menanet.net>, 2001.
# Mohammed Gamal <f2c2001@yahoo.com>, 2002.
# Youcef Rabah Rahal <rahal@arabeyes.org>, 2004.
# Ossama M. Khayat <okhayat@yahoo.com>, 2004, 2005.
# Munzir Taha <munzir@kacst.edu.sa>, 2004.
# Abdulaziz Al-Arfaj <alarfaj@arabeyes.org>, 2005.
#
msgid ""
msgstr ""
"Project-Id-Version: DrakX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2008-09-11 18:48+0200\n"
"PO-Revision-Date: 2005-03-03 01:06+0300\n"
"Last-Translator: Ossama M. Khayat <okhayat@yahoo.com>\n"
"Language-Team: Arabic <support@arabeyes.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.9.1\n"
"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : n>=3 && n<=10 ? 2 : "
"3\n"

#: any.pm:109
#, c-format
msgid "Do you have further supplementary media?"
msgstr "هل لديك أوساط إضافيّة أخرى؟"

#. -PO: keep the double empty lines between sections, this is formatted a la LaTeX
#: any.pm:112
#, c-format
msgid ""
"The following media have been found and will be used during install: %s.\n"
"\n"
"\n"
"Do you have a supplementary installation medium to configure?"
msgstr ""

#: any.pm:120
#, c-format
msgid "CD-ROM"
msgstr "القرص المدمج"

#: any.pm:121
#, c-format
msgid "Network (HTTP)"
msgstr "الشبكة (HTTP)"

#: any.pm:122
#, c-format
msgid "Network (FTP)"
msgstr "الشبكة (FTP)"

#: any.pm:123
#, c-format
msgid "Network (NFS)"
msgstr ""

#: any.pm:163
#, c-format
msgid "URL of the mirror?"
msgstr "عنوان URL للمرآة؟"

#: any.pm:169
#, c-format
msgid "URL must start with ftp:// or http://"
msgstr ""

#: any.pm:180
#, c-format
msgid ""
"Contacting Mandriva Linux web site to get the list of available mirrors..."
msgstr ""
"جاري الإتصال بموقع ماندريبا لينكس للحصول على قائمة بالمرايا المتوفرة..."

#: any.pm:185
#, fuzzy, c-format
msgid ""
"Failed contacting Mandriva Linux web site to get the list of available "
"mirrors"
msgstr ""
"جاري الإتصال بموقع ماندريبا لينكس للحصول على قائمة بالمرايا المتوفرة..."

#: any.pm:195
#, c-format
msgid "Choose a mirror from which to get the packages"
msgstr "اختيار مرآة سيتم من خلالها تنزيل الحزم"

#: any.pm:225
#, c-format
msgid "NFS setup"
msgstr ""

#: any.pm:226
#, c-format
msgid "Please enter the hostname and directory of your NFS media"
msgstr ""

#: any.pm:230
#, c-format
msgid "Hostname missing"
msgstr ""

#: any.pm:231
#, c-format
msgid "Directory must begin with \"/\""
msgstr ""

#: any.pm:235
#, c-format
msgid "Hostname of the NFS mount ?"
msgstr ""

#: any.pm:236
#, c-format
msgid "Directory"
msgstr "الدليل"

#: any.pm:258
#, c-format
msgid "Supplementary"
msgstr ""

#: any.pm:293
#, c-format
msgid ""
"Can't find a package list file on this mirror. Make sure the location is "
"correct."
msgstr "لم يمكن العثور على ملف hdlist على هذه المرآة. تأكد من صحة الموقع."

#: any.pm:328
#, c-format
msgid "Looking at packages already installed..."
msgstr "التعرف على الحزم المثبتة مسبقاً..."

#: any.pm:335
#, c-format
msgid "Removing packages prior to upgrade..."
msgstr ""

#: any.pm:377
#, c-format
msgid "Finding packages to upgrade..."
msgstr "البحث عن الحزم التي ستتم ترقيتها..."

#. -PO: keep the double empty lines between sections, this is formatted a la LaTeX
#: any.pm:564
#, c-format
msgid ""
"You have selected the following server(s): %s\n"
"\n"
"\n"
"These servers are activated by default. They do not have any known security\n"
"issues, but some new ones could be found. In that case, you must make sure\n"
"to upgrade as soon as possible.\n"
"\n"
"\n"
"Do you really want to install these servers?\n"
msgstr ""
"لقد اخترت الخادمات التالية: %s\n"
"\n"
"\n"
"هذه الخادمات مُنشّطة افتراضياً، و لا يوجد لهم مشاكل أمنية\n"
"معروفة، و لكن قد تكتشف بعض المشاكل الجديدة. في هذه الحالة، تأكد من أن\n"
"تقوم بالترقية في أقرب وقت ممكن.\n"
"\n"
"\n"
"هل أنت متأكد أنك تريد تثبيت هذه الخادمات الآن؟\n"

#. -PO: keep the double empty lines between sections, this is formatted a la LaTeX
#: any.pm:587
#, c-format
msgid ""
"The following packages will be removed to allow upgrading your system: %s\n"
"\n"
"\n"
"Do you really want to remove these packages?\n"
msgstr ""
"سيتم حذف هذه الحزم لكي تتم ترقية النظام: %s\n"
"\n"
"\n"
"هل تريد حذف هذه الحزم فعلاً؟\n"

#: any.pm:801
#, c-format
msgid "Error reading file %s"
msgstr "خطأ في قراءة الملف %s"

#: any.pm:1008
#, c-format
msgid "The following disk(s) were renamed:"
msgstr "تمّ تغيير أسماء القرص التّالي أو الأقراص التّالية:"

#: any.pm:1010
#, c-format
msgid "%s (previously named as %s)"
msgstr "%s (المسمّى %s سابقاً)"

#: any.pm:1067
#, c-format
msgid "HTTP"
msgstr "HTTP"

#: any.pm:1067
#, c-format
msgid "FTP"
msgstr "FTP"

#: any.pm:1067
#, c-format
msgid "NFS"
msgstr "NFS"

#: any.pm:1086 steps_interactive.pm:972
#, c-format
msgid "Network"
msgstr "الشبكة"

#: any.pm:1090
#, c-format
msgid "Please choose a media"
msgstr "الرجاء اختيار وسط"

#: any.pm:1106
#, c-format
msgid "File already exists. Overwrite it?"
msgstr "الملف موجود مسبقاً. هل تريد الكتابة عليه؟"

#: any.pm:1110
#, c-format
msgid "Permission denied"
msgstr "غير مسموح لك بذلك"

#: any.pm:1158
#, c-format
msgid "Bad NFS name"
msgstr ""

#: any.pm:1179
#, c-format
msgid "Bad media %s"
msgstr "الوسط %s سيء"

#: any.pm:1222
#, c-format
msgid "Can not make screenshots before partitioning"
msgstr "لا يمكنني عمل لقطات للشاشة قبل التجزئة"

#: any.pm:1230
#, c-format
msgid "Screenshots will be available after install in %s"
msgstr "ستكون لقطات الشاشة موجودة بعد التثبيت في %s"

#: gtk.pm:126
#, fuzzy, c-format
msgid "Installation"
msgstr "التثبيت"

#: gtk.pm:130 share/meta-task/compssUsers.pl:42
#, c-format
msgid "Configuration"
msgstr "التهيئة"

#: install2.pm:168
#, c-format
msgid "You must also format %s"
msgstr "عليك أيضا تنسيق %s"

#: interactive.pm:16
#, c-format
msgid ""
"Some hardware on your computer needs ``proprietary'' drivers to work.\n"
"You can find some information about them at: %s"
msgstr ""
"بعض العتاد الموجود على جهازك يحتاج إلى مشغلات ``تجارية'' كي تعمل.\n"
"يمكنك ايجاد مزيد من المعلومات عنها في: %s"

#: interactive.pm:22
#, c-format
msgid "Bringing up the network"
msgstr "جاري تشغيل الشبكة"

#: interactive.pm:27
#, c-format
msgid "Bringing down the network"
msgstr "جاري اغلاق الشبكة"

#: media.pm:703 media.pm:714
#, fuzzy, c-format
msgid "Downloading file %s..."
msgstr "جاري ارسال الملفات..."

#: media.pm:806
#, c-format
msgid "Copying some packages on disks for future use"
msgstr ""

#: media.pm:859
#, c-format
msgid "Copying in progress"
msgstr "جاري النسخ"

#: pkgs.pm:29
#, c-format
msgid "must have"
msgstr "يجب أن يكون لديك"

#: pkgs.pm:30
#, c-format
msgid "important"
msgstr "مهم"

#: pkgs.pm:31
#, c-format
msgid "very nice"
msgstr "ظريف جداً"

#: pkgs.pm:32
#, c-format
msgid "nice"
msgstr "ظريف"

#: pkgs.pm:33
#, c-format
msgid "maybe"
msgstr "ربما"

#: pkgs.pm:253
#, c-format
msgid ""
"Some packages requested by %s cannot be installed:\n"
"%s"
msgstr ""

#: share/meta-task/compssUsers.pl:11
#, c-format
msgid "Workstation"
msgstr "محطة عمل"

#: share/meta-task/compssUsers.pl:13
#, c-format
msgid "Office Workstation"
msgstr "محطّة عمل مكتبية"

#: share/meta-task/compssUsers.pl:15
#, c-format
msgid ""
"Office programs: wordprocessors (OpenOffice.org Writer, Kword), spreadsheets "
"(OpenOffice.org Calc, Kspread), PDF viewers, etc"
msgstr ""
"برامج مكتبية: معالجة الكلمات (OpenOffice.org Writer، Kword(، الجداول "
"الحسابية (OpenOffice.org Calc، Kspread( ، برامج عرض pdf، الخ"

#: share/meta-task/compssUsers.pl:16
#, c-format
msgid ""
"Office programs: wordprocessors (kword, abiword), spreadsheets (kspread, "
"gnumeric), pdf viewers, etc"
msgstr ""
"برامج مكتبية: معالجة الكلمات (kword، abiword(، الجداول الحسابية (kspread، "
"gnumeric) ، برامج عرض pdf، الخ"

#: share/meta-task/compssUsers.pl:21
#, c-format
msgid "Game station"
msgstr "محطّة ألعاب"

#: share/meta-task/compssUsers.pl:22
#, c-format
msgid "Amusement programs: arcade, boards, strategy, etc"
msgstr "برامج التسلية: ألعاب فيديو، ألعاب لوحات، ألعاب استراتيجية، الخ"

#: share/meta-task/compssUsers.pl:25
#, c-format
msgid "Multimedia station"
msgstr "محطة وسائط متعدّدة"

#: share/meta-task/compssUsers.pl:26
#, c-format
msgid "Sound and video playing/editing programs"
msgstr "برامج تحرير/تشغيل الفيديو و الصوت"

#: share/meta-task/compssUsers.pl:31
#, c-format
msgid "Internet station"
msgstr "محطّة إنترنت"

#: share/meta-task/compssUsers.pl:32
#, c-format
msgid ""
"Set of tools to read and send mail and news (mutt, tin..) and to browse the "
"Web"
msgstr ""
"مجموعة من الأدوات لقراءة و إرسال البريد و الأخبار (mutt، tin..( و لتصفح "
"الإنترنت"

#: share/meta-task/compssUsers.pl:37
#, c-format
msgid "Network Computer (client)"
msgstr "جهاز شبكة (عميل)"

#: share/meta-task/compssUsers.pl:38
#, c-format
msgid "Clients for different protocols including ssh"
msgstr "عملاء لبروتوكولات مختلفة مثل ssh"

#: share/meta-task/compssUsers.pl:43
#, c-format
msgid "Tools to ease the configuration of your computer"
msgstr "أدوات لتسهيل إعداد جهازك"

#: share/meta-task/compssUsers.pl:47
#, c-format
msgid "Console Tools"
msgstr "أدوات الطرفيّات"

#: share/meta-task/compssUsers.pl:48
#, c-format
msgid "Editors, shells, file tools, terminals"
msgstr "محررات نصوص، صَدَفات، أدوات ملفات، طرفيات"

#: share/meta-task/compssUsers.pl:52 share/meta-task/compssUsers.pl:153
#: share/meta-task/compssUsers.pl:155
#, c-format
msgid "Development"
msgstr "تطوير"

#: share/meta-task/compssUsers.pl:53 share/meta-task/compssUsers.pl:156
#, c-format
msgid "C and C++ development libraries, programs and include files"
msgstr "برامج و مكتبات تطوير C و C++"

#: share/meta-task/compssUsers.pl:56 share/meta-task/compssUsers.pl:160
#, c-format
msgid "Documentation"
msgstr "التّوثيق"

#: share/meta-task/compssUsers.pl:57 share/meta-task/compssUsers.pl:161
#, c-format
msgid "Books and Howto's on Linux and Free Software"
msgstr "كتب ومذكرات Howto حول لينكس و البرامج الحرة"

#: share/meta-task/compssUsers.pl:61 share/meta-task/compssUsers.pl:164
#, c-format
msgid "LSB"
msgstr "LSB"

#: share/meta-task/compssUsers.pl:62 share/meta-task/compssUsers.pl:165
#, c-format
msgid "Linux Standard Base. Third party applications support"
msgstr "القاعدة القياسيّة للينكس (LSB). دعم تطبيقات الأطراف الثالثة"

#: share/meta-task/compssUsers.pl:71
#, c-format
msgid "Web Server"
msgstr "خادم الوب"

#: share/meta-task/compssUsers.pl:72
#, c-format
msgid "Apache"
msgstr "Apache"

#: share/meta-task/compssUsers.pl:75
#, c-format
msgid "Groupware"
msgstr "برامج المجموعات"

#: share/meta-task/compssUsers.pl:76
#, c-format
msgid "Kolab Server"
msgstr "خادم Kolab"

#: share/meta-task/compssUsers.pl:79 share/meta-task/compssUsers.pl:120
#, c-format
msgid "Firewall/Router"
msgstr "جدار ناري/موجِّه"

#: share/meta-task/compssUsers.pl:80 share/meta-task/compssUsers.pl:121
#, c-format
msgid "Internet gateway"
msgstr "بوابة الإنترنت"

#: share/meta-task/compssUsers.pl:83
#, c-format
msgid "Mail/News"
msgstr "بريد/أخبار"

#: share/meta-task/compssUsers.pl:84
#, c-format
msgid "Postfix mail server, Inn news server"
msgstr "خادم بريد Postfix، خادم أخبار Inn"

#: share/meta-task/compssUsers.pl:87
#, c-format
msgid "Directory Server"
msgstr "خادم مجلّدات"

#: share/meta-task/compssUsers.pl:91
#, c-format
msgid "FTP Server"
msgstr "الخادم FTP"

#: share/meta-task/compssUsers.pl:92
#, c-format
msgid "ProFTPd"
msgstr "ProFTPd"

#: share/meta-task/compssUsers.pl:95
#, c-format
msgid "DNS/NIS"
msgstr "DNS/NIS"

#: share/meta-task/compssUsers.pl:96
#, c-format
msgid "Domain Name and Network Information Server"
msgstr "خادم أسماء النّطاقات ومعلومات الشّبكة"

#: share/meta-task/compssUsers.pl:99
#, c-format
msgid "File and Printer Sharing Server"
msgstr "خادم مشاركة الملفّات والطّابعات"

#: share/meta-task/compssUsers.pl:100
#, c-format
msgid "NFS Server, Samba server"
msgstr "خادم NFS، خادم Samba"

#: share/meta-task/compssUsers.pl:103 share/meta-task/compssUsers.pl:116
#, c-format
msgid "Database"
msgstr "قواعد البيانات"

#: share/meta-task/compssUsers.pl:104
#, c-format
msgid "PostgreSQL and MySQL Database Server"
msgstr "خادم قواعد بيانات PostgreSQL و MySQL"

#: share/meta-task/compssUsers.pl:108
#, c-format
msgid "Web/FTP"
msgstr "وب/FTP"

#: share/meta-task/compssUsers.pl:109
#, c-format
msgid "Apache, Pro-ftpd"
msgstr "Apache، Pro-ftpd"

#: share/meta-task/compssUsers.pl:112
#, c-format
msgid "Mail"
msgstr "البريد"

#: share/meta-task/compssUsers.pl:113
#, c-format
msgid "Postfix mail server"
msgstr "خادم البريد Postfix"

#: share/meta-task/compssUsers.pl:117
#, c-format
msgid "PostgreSQL or MySQL database server"
msgstr "خادم قواعد البيانات PostgreSQL أو MySQL"

#: share/meta-task/compssUsers.pl:124
#, c-format
msgid "Network Computer server"
msgstr "خادم شبكات"

#: share/meta-task/compssUsers.pl:125
#, c-format
msgid "NFS server, SMB server, Proxy server, ssh server"
msgstr "خادم NFS، خادم SMB، خادم بروكسي، خادم ssh"

#: share/meta-task/compssUsers.pl:131
#, c-format
msgid "Graphical Environment"
msgstr "بيئات رسومية"

#: share/meta-task/compssUsers.pl:133
#, c-format
msgid "KDE Workstation"
msgstr "محطّة عمل كيدي"

#: share/meta-task/compssUsers.pl:134
#, c-format
msgid ""
"The K Desktop Environment, the basic graphical environment with a collection "
"of accompanying tools"
msgstr ""
"بيئة سطح مكتب كيدي، البيئة الرسومية الأساسية مع مجموعة من الأدوات المصاحبة"

#: share/meta-task/compssUsers.pl:138
#, c-format
msgid "GNOME Workstation"
msgstr "محطّة عمل جينوم"

#: share/meta-task/compssUsers.pl:139
#, c-format
msgid ""
"A graphical environment with user-friendly set of applications and desktop "
"tools"
msgstr ""
"بيئة رسومية مع مجموعة من التطبيقات و أدوات سطح المكتب المناسبة للمستخدمين "
"العاديين"

#: share/meta-task/compssUsers.pl:142
#, fuzzy, c-format
msgid "IceWm Desktop"
msgstr "Plucker Desktop"

#: share/meta-task/compssUsers.pl:146
#, c-format
msgid "Other Graphical Desktops"
msgstr "أسطح مكتب رسومية أخرى"

#: share/meta-task/compssUsers.pl:147
#, fuzzy, c-format
msgid "Window Maker, Enlightenment, Fvwm, etc"
msgstr "Icewm، Window Maker، Enlightenment، Fvwm، الخ"

#: share/meta-task/compssUsers.pl:170
#, c-format
msgid "Utilities"
msgstr "منافع"

#: share/meta-task/compssUsers.pl:172 share/meta-task/compssUsers.pl:173
#, c-format
msgid "SSH Server"
msgstr "خادم SSH"

#: share/meta-task/compssUsers.pl:177
#, c-format
msgid "Webmin"
msgstr "Webmin"

#: share/meta-task/compssUsers.pl:178
#, c-format
msgid "Webmin Remote Configuration Server"
msgstr "خادم التّهيئة البعيدة Webmin"

#: share/meta-task/compssUsers.pl:182
#, c-format
msgid "Network Utilities/Monitoring"
msgstr "منافع شبكة/مراقبة"

#: share/meta-task/compssUsers.pl:183
#, c-format
msgid "Monitoring tools, processes accounting, tcpdump, nmap, ..."
msgstr "أدوات مراقبة، محاسبة عمليّات، tcpdump، nmap، ..."

#: share/meta-task/compssUsers.pl:187
#, c-format
msgid "Mandriva Wizards"
msgstr "مرشدو ماندريبا"

#: share/meta-task/compssUsers.pl:188
#, c-format
msgid "Wizards to configure server"
msgstr "مرشدو تهيئة الخادم"

#: steps.pm:85
#, c-format
msgid ""
"An error occurred, but I do not know how to handle it nicely.\n"
"Continue at your own risk."
msgstr ""
"ظهر خطأ و لا أعرف كيف أتعامل معه بأسلوب جيد.\n"
"تابع على مسؤوليتك."

#: steps.pm:437
#, c-format
msgid ""
"Some important packages did not get installed properly.\n"
"Either your cdrom drive or your cdrom is defective.\n"
"Check the cdrom on an installed computer using \"rpm -qpl media/main/*.rpm"
"\"\n"
msgstr ""
"لم يتمّ تثبيت بعض الحزم المهمّة بشكل صحيح.\n"
"إمّا أن يكون قارئ الأقراص معطوبا أو القرص.\n"
"إفحص القرص المدمج على حاسب مثبت باستعمال \"rpm -qpl media/main/*.rpm\"\n"

#: steps_auto_install.pm:71 steps_stdio.pm:27
#, c-format
msgid "Entering step `%s'\n"
msgstr "الانتقال للخطوة `%s'\n"

#: steps_curses.pm:22
#, c-format
msgid "Mandriva Linux Installation %s"
msgstr "تثبيت ماندريبا لينكس %s"

#: steps_curses.pm:32
#, c-format
msgid "<Tab>/<Alt-Tab> between elements"
msgstr "<Tab>/<Alt-Tab> بين العناصر"

#: steps_gtk.pm:84
#, c-format
msgid "Xorg server is slow to start. Please wait..."
msgstr ""

#: steps_gtk.pm:194
#, c-format
msgid ""
"Your system is low on resources. You may have some problem installing\n"
"Mandriva Linux. If that occurs, you can try a text install instead. For "
"this,\n"
"press `F1' when booting on CDROM, then enter `text'."
msgstr ""
"نظامك قليل الموارد. قد تقابل بعض المشاكل قي تثبيت\n"
"ماندريبا لينكس. إذا حدث ذلك، يمكنك التثبيت في وضع نصي بدلاً من ذلك. لهذا "
"الغرض،\n"
"اضغط `F1' عند الإقلاع من القرص المدمج، و اكتب `text'."

#: steps_gtk.pm:228
#, c-format
msgid "Install Mandriva KDE Desktop"
msgstr ""

#: steps_gtk.pm:229
#, c-format
msgid "Install Mandriva GNOME Desktop"
msgstr ""

#: steps_gtk.pm:230
#, fuzzy, c-format
msgid "Custom install"
msgstr "تثبيت مصغّر"

#: steps_gtk.pm:253
#, c-format
msgid "Here's a preview of the '%s' desktop."
msgstr ""

#: steps_gtk.pm:275
#, c-format
msgid "Click on images in order to see a bigger preview"
msgstr ""

#: steps_gtk.pm:287 steps_interactive.pm:618 steps_list.pm:30
#, c-format
msgid "Package Group Selection"
msgstr "اختيار مجموعات الحزم"

#: steps_gtk.pm:308 steps_interactive.pm:635
#, c-format
msgid "Individual package selection"
msgstr "اختيار مفرد للحزم"

#: steps_gtk.pm:330 steps_interactive.pm:561
#, c-format
msgid "Total size: %d / %d MB"
msgstr "الحجم الإجمالي: %d / %d م.ب."

#: steps_gtk.pm:375
#, c-format
msgid "Bad package"
msgstr "حزمة سيئة"

#: steps_gtk.pm:377
#, c-format
msgid "Version: "
msgstr "النسخة:"

#: steps_gtk.pm:378
#, c-format
msgid "Size: "
msgstr "الحجم: "

#: steps_gtk.pm:378
#, c-format
msgid "%d KB\n"
msgstr "%d ك.ب.\n"

#: steps_gtk.pm:379
#, c-format
msgid "Importance: "
msgstr "الأهمية:"

#: steps_gtk.pm:413
#, c-format
msgid "You can not select/unselect this package"
msgstr "لا يمكنك اختيار/ازالة اختيار هذه الحزمة"

#: steps_gtk.pm:417
#, c-format
msgid "due to missing %s"
msgstr "بسبب غياب %s"

#: steps_gtk.pm:418
#, c-format
msgid "due to unsatisfied %s"
msgstr "بسبب عدم إرضاء %s"

#: steps_gtk.pm:419
#, c-format
msgid "trying to promote %s"
msgstr "السعي إلى ترويج %s"

#: steps_gtk.pm:420
#, c-format
msgid "in order to keep %s"
msgstr "من أجل حفظ %s"

#: steps_gtk.pm:425
#, c-format
msgid ""
"You can not select this package as there is not enough space left to install "
"it"
msgstr "لا يمكنك اختيار هذه الحزمة لأنه لا يوجد مساحة كافية متبقية لتثبيتها"

#: steps_gtk.pm:428
#, c-format
msgid "The following packages are going to be installed"
msgstr "سيتم تثبيت الحزم التالية"

#: steps_gtk.pm:429
#, c-format
msgid "The following packages are going to be removed"
msgstr "سيتم حذف الحزم التالية"

#: steps_gtk.pm:454
#, c-format
msgid "This is a mandatory package, it can not be unselected"
msgstr "هذه الحزمة الزامية، لا يمكن عدم اختيارها"

#: steps_gtk.pm:456
#, c-format
msgid "You can not unselect this package. It is already installed"
msgstr "لا يمكن إزالة اختيار هذه الحزم. انها مثبتة مسبقاً"

#: steps_gtk.pm:458
#, c-format
msgid "You can not unselect this package. It must be upgraded"
msgstr "لا يمكنك إزالة اختيار هذه الحزمة. يجب ترقيتها"

#: steps_gtk.pm:462
#, c-format
msgid "Show automatically selected packages"
msgstr "إظهار الحزم المختارة ألياً"

#: steps_gtk.pm:464
#, c-format
msgid "Install"
msgstr "تثبيت"

#: steps_gtk.pm:467
#, c-format
msgid "Load/Save selection"
msgstr "تحميل/حفظ الاختيار"

#: steps_gtk.pm:468
#, c-format
msgid "Updating package selection"
msgstr "تحديث اختيار الحزم"

#: steps_gtk.pm:473
#, c-format
msgid "Minimal install"
msgstr "تثبيت مصغّر"

#: steps_gtk.pm:487
#, c-format
msgid "Software Management"
msgstr "إدارة البرامج"

#: steps_gtk.pm:487 steps_interactive.pm:447
#, c-format
msgid "Choose the packages you want to install"
msgstr "اختر الحزم التي تريد تثبيتها"

#: steps_gtk.pm:504 steps_interactive.pm:649 steps_list.pm:32
#, c-format
msgid "Installing"
msgstr "التثبيت"

#: steps_gtk.pm:530
#, c-format
msgid "No details"
msgstr "لا تفاصيل"

#: steps_gtk.pm:545
#, c-format
msgid "Time remaining "
msgstr "الوقت المتبقي"

#: steps_gtk.pm:546
#, fuzzy, c-format
msgid "(estimating...)"
msgstr "الحساب التقريبي"

#: steps_gtk.pm:573
#, fuzzy, c-format
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] "%d حزم"
msgstr[1] "%d حزم"
msgstr[2] "%d حزم"
msgstr[3] "%d حزم"

#: steps_gtk.pm:619 steps_interactive.pm:837 steps_list.pm:43
#, c-format
msgid "Summary"
msgstr "ملخص"

#: steps_gtk.pm:636
#, c-format
msgid "Configure"
msgstr "تهيئة"

#: steps_gtk.pm:653 steps_interactive.pm:833 steps_interactive.pm:984
#, c-format
msgid "not configured"
msgstr "غير مهيّأ"

#: steps_gtk.pm:694
#, fuzzy, c-format
msgid "Media Selection"
msgstr "اختيار مجموعات الحزم"

#: steps_gtk.pm:704 steps_interactive.pm:335
#, c-format
msgid ""
"The following installation media have been found.\n"
"If you want to skip some of them, you can unselect them now."
msgstr ""
"تم العثور على وسط التثبيت التالي.\n"
"إن كنت تريد تخطي بعضها، يمكنك إزالة اختيارها الآن."

#: steps_gtk.pm:700 steps_interactive.pm:337
#, c-format
msgid ""
"You have the option to copy the contents of the CDs onto the hard drive "
"before installation.\n"
"It will then continue from the hard drive and the packages will remain "
"available once the system is fully installed."
msgstr ""
"لديك الخيار بنسخ محتويات الأقراص المدمجة إلى قرصك الصلب قبل التثبيت.\n"
"سيكمل التثبيت بعد ذلك من القرص الصلب وستبقى الحزم متوفرة حالما يتم تثبيت "
"النظام بالكامل."

#: steps_gtk.pm:702 steps_interactive.pm:339
#, c-format
msgid "Copy whole CDs"
msgstr "نسخ الأقراص بالكامل"

#: steps_interactive.pm:38
#, c-format
msgid "An error occurred"
msgstr "حدث خطأ"

#: steps_interactive.pm:102
#, c-format
msgid "Please choose your keyboard layout"
msgstr "الرجاء اختيار لوحة المفاتيح"

#: steps_interactive.pm:105
#, fuzzy, c-format
msgid "Here is the full list of available keyboards:"
msgstr "هذه هي القائمة الكاملة لكلّ لوحات المفاتيح المتوفّرة"

#: steps_interactive.pm:136
#, c-format
msgid "Install/Upgrade"
msgstr "تثبيت/ترقية"

#: steps_interactive.pm:134
#, c-format
msgid "Is this an install or an upgrade?"
msgstr "هل هذا تثبيت أم ترقية؟"

#: steps_interactive.pm:138
#, fuzzy, c-format
msgid ""
"_: This is a noun:\n"
"Install"
msgstr "تثبيت"

#: steps_interactive.pm:144
#, c-format
msgid "Upgrade %s"
msgstr "ترقية %s"

#: steps_interactive.pm:148
#, c-format
msgid "Upgrade from a 32bit to a 64bit distribution is not supported"
msgstr ""

#: steps_interactive.pm:152
#, c-format
msgid "Upgrade from a 64bit to a 32bit distribution is not supported"
msgstr ""

#: steps_interactive.pm:171
#, c-format
msgid "Encryption key for %s"
msgstr "مفتاح التشفير لـ %s"

#: steps_interactive.pm:199
#, c-format
msgid "Cancel installation, reboot system"
msgstr ""

#: steps_interactive.pm:200
#, fuzzy, c-format
msgid "New Installation"
msgstr "التثبيت"

#: steps_interactive.pm:201
#, c-format
msgid "Upgrade previous installation (not recommended)"
msgstr ""

#: steps_interactive.pm:205
#, c-format
msgid ""
"Installer has detected that your installed Mandriva Linux system could not\n"
"safely be upgraded to %s.\n"
"\n"
"New installation replacing your previous one is recommended.\n"
"\n"
"Warning : you should backup all your personal data before choosing \"New\n"
"Installation\"."
msgstr ""

#: steps_interactive.pm:247
#, c-format
msgid "IDE"
msgstr "IDE"

#: steps_interactive.pm:247
#, c-format
msgid "Configuring IDE"
msgstr "جاري تهيئة IDE"

#: steps_interactive.pm:284
#, c-format
msgid ""
"No free space for 1MB bootstrap! Install will continue, but to boot your "
"system, you'll need to create the bootstrap partition in DiskDrake"
msgstr ""
"ليس هناك مساحة حرّة لواحد ميجابات من bootstrap! سوف يستمرّ التّثبيت، لكن لإقلاع "
"نظامك، سوف تحتاج لإنشاء تجزيء bootstrap في DiskDrake"

#: steps_interactive.pm:289
#, c-format
msgid ""
"You'll need to create a PPC PReP Boot bootstrap! Install will continue, but "
"to boot your system, you'll need to create the bootstrap partition in "
"DiskDrake"
msgstr ""
"تحتاج إلى إنشاء PPC PReP Boot bootstrap! ستكمل عملية التثبيت، ولكن لإقلاع "
"نظامك، أنت بحاجة إلى إنشاء تجزيء bootstrap من خلال DiskDrake"

#: steps_interactive.pm:381
#, c-format
msgid ""
"Change your Cd-Rom!\n"
"Please insert the Cd-Rom labelled \"%s\" in your drive and press Ok when "
"done.\n"
"If you do not have it, press Cancel to avoid installation from this Cd-Rom."
msgstr ""
"غيّر القرص المدمج !\n"
"من فضلك  أدخل القرص المدمج المسّمى \"%s\" في الّسواقة واضغط على موافق عندما "
"تنتهي.\n"
"إن لم يكن القرص لديك، اضغط على إلغاء لتجّنب التثبيت من هذا القرص المدمج."

#: steps_interactive.pm:403
#, c-format
msgid "Looking for available packages..."
msgstr "العثور على الحزم المتوفرة..."

#: steps_interactive.pm:411
#, c-format
msgid ""
"Your system does not have enough space left for installation or upgrade (%"
"dMB > %dMB)"
msgstr ""

#: steps_interactive.pm:459
#, c-format
msgid ""
"Please choose load or save package selection.\n"
"The format is the same as auto_install generated files."
msgstr ""
"الرجاء اختيار حفظ أو تحميل اختياراتك للحزم.\n"
"النسق مشابه لملفات التثبيت الآلي المولّدة."

#: steps_interactive.pm:461
#, c-format
msgid "Load"
msgstr "تحميل"

#: steps_interactive.pm:461
#, c-format
msgid "Save"
msgstr "حفظ"

#: steps_interactive.pm:469
#, c-format
msgid "Bad file"
msgstr "ملف سيء"

#: steps_interactive.pm:485
#, fuzzy, c-format
msgid "KDE"
msgstr "IDE"

#: steps_interactive.pm:486
#, c-format
msgid "GNOME"
msgstr ""

#: steps_interactive.pm:489
#, fuzzy, c-format
msgid "Desktop Selection"
msgstr "اختيار مجموعات الحزم"

#: steps_interactive.pm:490
#, c-format
msgid "You can choose your workstation desktop profile:"
msgstr ""

#: steps_interactive.pm:575
#, c-format
msgid "Selected size is larger than available space"
msgstr "الحجم المختار أكبر من المساحة المتوفرة"

#: steps_interactive.pm:590
#, c-format
msgid "Type of install"
msgstr "نوع التثبيت"

#: steps_interactive.pm:591
#, c-format
msgid ""
"You have not selected any group of packages.\n"
"Please choose the minimal installation you want:"
msgstr ""
"لم تختر أي مجموعة من الحزم.\n"
"الرجاء اختيار التثبيت المصغر الذي تريده:"

#: steps_interactive.pm:594
#, c-format
msgid "With X"
msgstr "مع X"

#: steps_interactive.pm:595
#, c-format
msgid "With basic documentation (recommended!)"
msgstr "مع وثائق المساعدة الأساسية (مفضّل)"

#: steps_interactive.pm:596
#, c-format
msgid "Truly minimal install (especially no urpmi)"
msgstr "تثبيت مصغّر فعلاً (خصوصاً بدون urpmi)"

#: steps_interactive.pm:650
#, c-format
msgid "Preparing installation"
msgstr "التحضير للتثبيت"

#: steps_interactive.pm:658
#, c-format
msgid "Installing package %s"
msgstr "جاري تثبيت الحزمة %s"

#: steps_interactive.pm:682
#, c-format
msgid "There was an error ordering packages:"
msgstr "كان هناك خطأ في ترتيب الحزم:"

#: steps_interactive.pm:682
#, c-format
msgid "Go on anyway?"
msgstr "هل تريد المتابعة على أي حال؟"

#: steps_interactive.pm:686
#, c-format
msgid "Retry"
msgstr ""

#: steps_interactive.pm:687
#, c-format
msgid "Skip this package"
msgstr ""

#: steps_interactive.pm:688
#, c-format
msgid "Skip all packages from medium \"%s\""
msgstr ""

#: steps_interactive.pm:689
#, fuzzy, c-format
msgid "Go back to media and packages selection"
msgstr "حفظ اختيار الحزم"

#: steps_interactive.pm:692
#, fuzzy, c-format
msgid "There was an error installing package %s."
msgstr "كان هناك خطأ في تثبيت الحزم:"

#: steps_interactive.pm:710
#, c-format
msgid "Post-install configuration"
msgstr "تهيئة ما بعد التثبيت"

#: steps_interactive.pm:717
#, c-format
msgid "Please ensure the Update Modules media is in drive %s"
msgstr ""

#: steps_interactive.pm:745 steps_list.pm:47
#, c-format
msgid "Updates"
msgstr "التحديثات"

#: steps_interactive.pm:746
#, c-format
msgid ""
"You now have the opportunity to download updated packages. These packages\n"
"have been updated after the distribution was released. They may\n"
"contain security or bug fixes.\n"
"\n"
"To download these packages, you will need to have a working Internet \n"
"connection.\n"
"\n"
"Do you want to install the updates?"
msgstr ""
"تستطيع الآن تنزيل الحزم المحدّثة. هذه الحزم\n"
"تم تحديثها بعد اصدار التوزيعة. قد\n"
"تحتوي على اصلاحات أمنية أو اصلاحات لعيوب برمجية.\n"
"\n"
"لتنزيل هذه الحزم، تحتاج إلى أن تكون لديك اتصال \n"
"بالإنترنت.\n"
"\n"
"هل تريد تنزيل هذه التحديثات ؟"

#: steps_interactive.pm:849
#, c-format
msgid "%s on %s"
msgstr "%s على %s"

#: steps_interactive.pm:912 steps_interactive.pm:919 steps_interactive.pm:932
#: steps_interactive.pm:949 steps_interactive.pm:964
#, c-format
msgid "Hardware"
msgstr "العتاد"

#: steps_interactive.pm:933 steps_interactive.pm:950
#, c-format
msgid "Sound card"
msgstr "بطاقة الصوت"

#: steps_interactive.pm:953
#, c-format
msgid "Do you have an ISA sound card?"
msgstr "هل لديك بطاقة صوت ISA؟"

#: steps_interactive.pm:955
#, c-format
msgid ""
"Run \"alsaconf\" or \"sndconfig\" after installation to configure your sound "
"card"
msgstr ""
"شغّل \"alsaconf\" أو \"sndconfig\" بعد التّثبيت لتهيئة بطاقة الصّوت الخاصّة بك"

#: steps_interactive.pm:957
#, c-format
msgid "No sound card detected. Try \"harddrake\" after installation"
msgstr "لم يعثر على بطاقة الصوت. حاول تشغيل \"harddrake\" بعد التثبيت"

#: steps_interactive.pm:965
#, c-format
msgid "Graphical interface"
msgstr "الواجهة الرسومية"

#: steps_interactive.pm:971 steps_interactive.pm:982
#, c-format
msgid "Network & Internet"
msgstr "الشبكة والإنترنت"

#: steps_interactive.pm:983
#, c-format
msgid "Proxies"
msgstr "البروكسيات"

#: steps_interactive.pm:984
#, c-format
msgid "configured"
msgstr "مُهيّء"

#: steps_interactive.pm:994
#, c-format
msgid "Security Level"
msgstr "مستوى الأمن"

#: steps_interactive.pm:1013
#, c-format
msgid "Firewall"
msgstr "جدار ناري"

#: steps_interactive.pm:1017
#, c-format
msgid "activated"
msgstr "مُنشّط"

#: steps_interactive.pm:1017
#, c-format
msgid "disabled"
msgstr "مُعطّل"

#: steps_interactive.pm:1031
#, c-format
msgid "You have not configured X. Are you sure you really want this?"
msgstr "لم تقم بتهيئة خادم X. هل أنت متأكد أنك تريد ذلك؟"

#: steps_interactive.pm:1058
#, c-format
msgid "Preparing bootloader..."
msgstr "جاري تحضير محمّل الإقلاع..."

#: steps_interactive.pm:1068
#, c-format
msgid ""
"You appear to have an OldWorld or Unknown machine, the yaboot bootloader "
"will not work for you. The install will continue, but you'll need to use "
"BootX or some other means to boot your machine. The kernel argument for the "
"root fs is: root=%s"
msgstr ""
"يبدو أن لديك ماكينة مجهولة أو من العالم القديم، ولن يعمل محمل الإقلاع yaboot "
"مع نظامك. ستكمل عملية التثبيت، ولكنك بحاجة إلى استخدام BootX أو طريقة ما "
"أخرى لإقلاع نظامك. مُعطى النواة لنظام الملفات الجذر هو: root=%s"

#: steps_interactive.pm:1087
#, c-format
msgid ""
"In this security level, access to the files in the Windows partition is "
"restricted to the administrator."
msgstr ""