package lang; use diagnostics; use strict; #-###################################################################################### #- misc imports #-###################################################################################### use common qw(:common :file :system); use commands; use log; #-###################################################################################### #- Globals #-###################################################################################### #- key (to be used in $LC_ALL), [0] = english name, [1] = charset encoding, #- [2] = value for $LANG, [3] = value for LANGUAGE (a list of possible #- languages, carefully choosen) my %languages = ( 'en' => [ 'English (US)', undef, 'en', 'en_US:en' ], 'en_GB' => [ 'English (UK)', 'iso-8859-1', 'en', 'en_GB:en' ], 'af' => [ 'Afrikaans', 'iso-8859-1', 'af', 'af:en_ZA' ], #-'ar' => [ 'Arabic', 'iso-8859-6', 'ar', 'ar' ], 'bg' => [ 'Bulgarian', 'cp1251', 'bg', 'bg' ], 'br' => [ 'Brezhoneg', 'iso-8859-1', 'br', 'br:fr_FR:fr' ], 'ca' => [ 'Catalan', 'iso-8859-1', 'ca', 'ca:es_ES:es:fr_FR:fr' ], 'cs' => [ 'Czech', 'iso-8859-2', 'cs', 'cs' ], 'cy' => [ 'Cymraeg (Welsh)', 'iso-8859-14','cy', 'cy:en_GB:en' ], 'da' => [ 'Danish', 'iso-8859-1', 'da', 'da' ], 'de_AT' => [ 'German (Austria)', 'iso-8859-1', 'de', 'de_AT:de' ], 'de_DE' => [ 'German (Germany)', 'iso-8859-1', 'de', 'de_DE:de' ], 'el' => [ 'Greek', 'iso-8859-7', 'el', 'el' ], 'eo' => [ 'Esperanto', 'iso-8859-3', 'eo', 'eo' ], 'es_AR' => [ 'Spanish (Argentina)', 'iso-8859-1', 'es', 'es_AR:es_UY:es:es_ES' ], 'es_ES' => [ 'Spanish (Spain, modern sorting)', 'iso-8859-1', 'es', 'es' ], 'es@tradicional' => [ 'Spanish (Spain, traditional sorting)', 'iso-8859-1', 'es', 'es' ], 'es_MX' => [ 'Spanish (Mexico)', 'iso-8859-1', 'es', 'es_MX:es:es_ES' ], 'et' => [ 'Estonian', 'iso-8859-15','et', 'et' ], 'eu' => [ 'Euskara (Basque)', 'iso-8859-1', 'eu', 'eu:es_ES:fr_FR:es:fr' ], #-'fa' => [ 'Farsi (Iranian)', 'isiri-3342', 'fa', 'fa' ], 'fi' => [ 'Suomi (Finnish)', 'iso-8859-1', 'fi', 'fi' ], 'fr_CA' => [ 'French (Canada)', 'iso-8859-1', 'fr', 'fr_CA:fr' ], 'fr_FR' => [ 'French (France)', 'iso-8859-1', 'fr', 'fr_FR:fr' ], #-'fo' => [ 'Faroese', 'iso-8859-1', 'fo', 'fo:??:??' ], 'ga' => [ 'Gaeilge (Irish)', 'iso-8859-14','ga', 'ga:en_IE:en' ], #-'gd' => [ 'Sottish gaelic', 'iso-8859-14','gd', 'gd:en_GB:en' ], 'gl' => [ 'Galician', 'iso-8859-1', 'gl', 'gl:es_ES:pt_PT:pt_BR:es:pt' ], #- 'iw' was the old code for hebrew language #-'he' => [ 'Hebrew', 'iso-8859-8', 'he', 'he:iw_IL' ], 'hr' => [ 'Croatian', 'iso-8859-2', 'hr', 'hr' ], 'hu' => [ 'Hungarian', 'iso-8859-2', 'hu', 'hu' ], 'hy' => [ 'Armenian', 'armscii-8', 'hy', 'hy' ], #- 'in' was the old code for indonesian language; by putting LANGUAGE=id:in_ID #- we catch the few catalog files still using the wrong code 'id' => [ 'Indonesian', 'iso-8859-1', 'id', 'id:in_ID' ], 'is' => [ 'Icelandic', 'iso-8859-1', 'is', 'is' ], 'it' => [ 'Italian', 'iso-8859-1', 'it', 'it_IT:it' ], 'ja' => [ 'Japanese', 'jisx0208', 'ja', 'ja_JP.ujis:ja' ], 'ka' => [ 'Georgian', 'georgian-academy', 'ka', 'ka' ], #-'kl' => [ 'Greenlandic (inuit)', 'iso-8859-1', 'kl', 'kl' ], 'ko' => [ 'Korean', 'ksc5601', 'ko', 'ko' ], #-'lo' => [ 'Laotian', 'mulelao-1', 'lo', 'lo' ], 'lt' => [ 'Lithuanian', 'iso-8859-13','lt', 'lt' ], #-'lv' => [ 'Latvian', 'iso-8859-13','lv', 'lv' ], #-'mk' => [ 'Macedonian (Cyrillic)', 'iso-8859-5', 'mk', 'mk:sp:sr' ], #-'mk_latin'=> [ 'Macedonian (Latin)', 'iso-8859-2', 'mk_latin', 'mk_latin:sr' ], #-'ms' => [ 'Malay', 'iso-8859-1', 'ms', 'ms' ], 'nl' => [ 'Dutch (Netherlands)', 'iso-8859-1', 'nl', 'nl_NL:nl' ], 'no' => [ 'Norwegian (Bokmaal)', 'iso-8859-1', 'no', 'no:no@nynorsk' ], 'no@nynorsk' => [ 'Norwegian (Nynorsk)','iso-8859-1', 'no', 'no@nynorsk:no' ], #-'oc' => [ 'Occitan', 'iso-8859-1', 'oc', 'oc:fr_FR' ], 'pl' => [ 'Polish', 'iso-8859-2', 'pl', 'pl' ], 'pt_BR' => [ 'Portuguese (Brazil)', 'iso-8859-1', 'pt_BR', 'pt_BR:pt_PT:pt' ], 'pt_PT' => [ 'Portuguese (Portugal)', 'iso-8859-1', 'pt', 'pt_PT:pt:pt_BR' ], 'ro' => [ 'Romanian', 'iso-8859-2', 'ro', 'ro' ], 'ru' => [ 'Russian', 'koi8-r', 'ru', 'ru' ], 'sk' => [ 'Slovak', 'iso-8859-2', 'sk', 'sk' ], 'sl' => [ 'Slovenian', 'iso-8859-2', 'sl', 'sl' ], 'sp' => [ 'Serbian (Cyrillic)', 'iso-8859-5', 'sp', 'sp:sr' ], 'sr' => [ 'Serbian (Latin)', 'iso-8859-2', 'sr', 'sr' ], 'sv' => [ 'Swedish', 'iso-8859-1', 'sv', 'sv' ], 'th' => [ 'Thai', 'tis620', 'th', 'th' ], 'tr' => [ 'Turkish', 'iso-8859-9', 'tr', 'tr' ], 'uk' => [ 'Ukrainian', 'koi8-u', 'uk', 'uk' ], 'vi' => [ 'Vietnamese (TCVN)', 'tcvn', 'vi', 'vi_VN.tcvn:vi_VN.tcvn-5712:vi' ], 'vi_VN.viscii' => [ 'Vietnamese (VISCII)','viscii', 'vi', 'vi_VN.viscii:vi_VN.tcvn-viscii1.1-1:vi' ], 'wa' => [ 'Walon', 'iso-8859-1', 'wa', 'wa:fr_BE:fr' ], 'zh_TW.Big5' => [ 'Chinese (Big5)', 'Big5', 'zh_TW.Big5', 'zh_TW.Big5:zh_TW.big5:zh' ], 'zh_CN' => [ 'Chinese (GuoBiao)', 'gb2312', 'zh_CN', 'zh_CN.gb2312:zh' ], ); my %xim = ( 'zh_TW.Big5' => { ENC => 'big5', XIM => 'xcin', XMODIFIERS => '"@im=xcin"', }, 'zh_CN' => { ENC => 'gb', XIM => 'xcin-zh_CN', XMODIFIERS => '"@im=xcin-zh_CN"', }, 'ko' => { ENC => 'kr', XIM => 'Ami', XMODIFIERS => '"@im=Ami"', }, 'ja' => { ENC => 'eucj', XIM => 'kinput2', XMODIFIERS => '"@im=kinput2"', } ); sub std2 { "-mdk-helvetica-medium-r-normal-*-*-$_[1]-*-*-*-*-$_[0]" } sub std_ { std2($_[0], 100), std2($_[0], 100) } sub std { std2($_[0], 100), std2($_[0], 80) } #- [0]: console font name; [1]: unicode map for console font #- [2]: acm file for console font; [3]: X11 fontset my %charsets = ( "armscii-8" => [ "arm8", "armscii8.uni", "trivial.trans", std_("armscii-8") ], #- chinese needs special console driver for text mode "Big5" => [ undef, undef, undef, "-*-*-*-*-*-*-*-*-*-*-*-*-big5-0" ], "gb2312" => [ undef, undef, undef, "-isas-song ti-medium-r-normal--16-*-*-*-*-*-gb2312.1980-0" ], "georgian-academy" => [ "t_geors", "geors.uni", "trivial.trans", "-*-*-*-*-*-*-*-*-*-*-*-*-georgian-academy" ], "georgian-ps" => [ "t_geors", "geors.uni", "geors_to_geops.trans", "-*-*-*-*-*-*-*-*-*-*-*-*-georgian-academy" ], "iso-8859-1" => [ "lat0-sun16", undef, "iso15", std("iso8859-1") ], "iso-8859-2" => [ "lat2-sun16", undef, "iso02", std("iso8859-2") ], "iso-8859-3" => [ "iso03.f16", undef, "iso03", std_("iso8859-3") ], "iso-8859-4" => [ "lat4u-16", undef, "iso04", std_("iso8859-4") ], "iso-8859-5" => [ "iso05.f16", "iso05", "trivial.trans", std("iso8859-5") ], #- arabic needs special console driver for text mode [acon] #- (and gtk support isn't done yet) "iso-8859-6" => [ "iso06.f16", "iso06", "trivial.trans", std_("iso8859-6") ], "iso-8859-7" => [ "iso07.f16", "iso07", "trivial.trans", std_("iso8859-7") ], #- hebrew needs special console driver for text mode (none yet) #- (and gtk support isn't done yet) "iso-8859-8" => [ "iso08.f16", "iso08", "trivial.trans", std_("iso8859-8") ], "iso-8859-9" => [ "iso09.f16", "iso09", "trivial.trans", std("iso8859-9") ], "iso-8859-13" => [ "tlat7", "iso01", "trivial.trans", std_("iso8859-13") ], "iso-8859-14" => [ "tlat8", "iso01", "trivial.trans", std_("iso8859-14") ], "iso-8859-15" => [ "lat0-sun16", undef, "iso15", std("iso8859-15") ], #- japanese needs special console driver for text mode [kon2] "jisx0208" => [ undef, undef, "trivial.trans", "-*-*-*-*-*-*-*-*-*-*-*-*-jisx*.*-0" ], "koi8-r" => [ "koi8-8x16", "koi8-r", "trivial.trans", std("koi8-r") ], "koi8-u" => [ "koi8u_8x16", "koi8-r", "trivial.trans", std("koi8-u") ], "cp1251" => [ "iso05.f16", "iso05", "iso05_to_cp1251.trans", std2("microsoft-cp1251",100) ], #- korean needs special console driver for text mode "ksc5601" => [ undef, undef, undef, "-*-*-*-*-*-*-*-*-*-*-*-*-ksc5601.1987-*" ], #- I have no console font for Thai... "tis620" => [ undef, undef, "trivial.trans", std2("tis620.2533-1",120) ], "tcvn" => [ "tcvn8x16", "tcvn", "trivial.trans", std2("tcvn-5712", 130), std2("tcvn-5712", 100) ], "viscii" => [ "viscii10-8x16", "viscii.uni", "viscii1.0_to_viscii1.1.trans", "-*-*-*-*-*-*-*-*-*-*-*-*-viscii1.1-1" ], #- Farsi (iranian) needs special console driver for text mode [patching acon ?] #- (and gtk support isn't done yet) "isiri-3342" => [ undef, undef, "trivial.trans", "-*-*-*-*-*-*-*-*-*-*-*-*-isiri-3342" ], ); #-###################################################################################### #- Functions #-###################################################################################### sub list { map { $_->[0] } values %languages } sub lang2text { $languages{$_[0]} && $languages{$_[0]}[0] } sub text2lang { my ($t) = @_; while (my ($k, $v) = each %languages) { lc($v->[0]) eq lc($t) and return $k; } die "unknown language $t"; } sub set { my ($lang, $prefix) = @_; if ($lang) { $ENV{LC_ALL} = $lang; $ENV{LANG} = $languages{$lang}[2]; $ENV{LANGUAGE} = $languages{$lang}[3]; $ENV{LINGUAS} = $languages{$lang}[3]; local $_ = $languages{$lang}[1]; s/iso-8859-1$/iso-8859-15/; s/iso-/iso/; s/koi8-.*/koi8/; s/cp1251/mscp1251/; commands::install_cpio("/usr/share/locale", $languages{$lang}[2], "misc", $_); } else { # stick with the default (English) */ delete $ENV{LANG}; delete $ENV{LC_ALL}; delete $ENV{LINGUAS}; } } sub write { my ($prefix) = @_; my $lang = $ENV{LC_ALL}; $lang or return; my $h = { LC_ALL => $lang }; if (my $l = $languages{$lang}) { add2hash $h, { LANG => $l->[2], LANGUAGE => $l->[2], LINGUAS => $l->[3] }; my $c = $charsets{$l->[1] || ''}; if ($c && $c->[0] && $c->[1]) { add2hash $h, { SYSFONT => $c->[0], UNIMAP => $c->[1], SYSFONTACM => $c->[2] }; my $p = "$prefix/usr/lib/kbd"; eval { commands::cp("-f", "$p/consolefonts/$c->[0].psf.gz", glob_("$p/consoletrans/$c->[1]*"), glob_("$p/consoletrans/$c->[2]*"), "$prefix/etc/sysconfig/console"); }; $@ and log::l("missing console $c->[0], $c->[1], $c->[2]"); } add2hash $h, $xim{$lang}; } setVarsInSh("$prefix/etc/sysconfig/i18n", $h); } sub load_po($) { my ($lang) = @_; my ($s, $from, $to, $state, $fuzzy); $s .= "package po::I18N;\n"; $s .= "no strict;\n"; $s .= "\%{'$lang'} = ("; my $f; -e ($f = "$_/po/$lang.po") and last foreach @INC; unless (-e $f) { -e ($f = "$_") and last foreach @INC; $f = commands::install_cpio("$f/po", "$lang.po"); } local *F; unless (-e $f) { -e ($f = "$_/po/$lang.po.bz2") and last foreach @INC; if (-e $f) { open F, "bzip2 -dc $f 2>/dev/null |"; } else { -e ($f = "$_/po.cz2") and last foreach @INC; $f =~ s/\.cz2//; log::l("trying to load $lang.po from $f"); open F, "extract_archive $f '' $lang.po 2>/dev/null |"; } } else { open F, $f; #- not returning here help avoiding reading the same multiple times. } foreach () { /^msgstr/ and $state = 1; /^msgid/ && !$fuzzy and $state = 2; if (/^(#|$)/ && $state != 3) { $state = 3; if (my @l = $to =~ /%(\d+)\$/g) { $to =~ s/%(\d+)\$/%/g; $to = qq([ "$to", ) . join(",", map { $_ - 1 } @l) . " ],"; } else { $to = qq("$to"); } $s .= qq("$from" => $to,\n) if $from; $from = $to = ''; } $to .= (/"(.*)"/)[0] if $state == 1; $from .= (/"(.*)"/)[0] if $state == 2; $fuzzy = /^#, fuzzy/; } $s .= ");"; no strict "vars"; eval $s; !$@; } #-sub load_font { #- my ($charset) = @_; #- my $fontFile =#!/usr/bin/perl -w # DrakxTV # $Id$ # Copyright (C) 2002 MandrakeSoft (tvignaud@mandrakesoft.com) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. use lib qw(/usr/lib/libDrakX); use standalone; #- warning, standalone must be loaded very first, for 'explanations' use interactive; use strict; use detect_devices; use lang; use log; use common; ("@ARGV" =~ /--help|-h/) and die "usage: drakxtv [-h] [--help] [--no-guess]\n"; my $in = 'interactive'->vnew(); sub scan4channels { # xawtv has been installed by DrakX when/if it's detected a # tv card. # In the future, we might try to install xawtv if it'sn't there # as we're just a, xawtv wraper # -x "/usr/bin/scantv" or $in->do_pkgs->install('xawtv'); # -x "/usr/bin/scantv" or { #{ exec {'consolehelper'} $0, ("urpmi", "xawtv") or die _("consolehelper missing"); # }; if (! -x "/usr/bin/scantv") { # standalone::explanations("package xawtv isn't installed"); $in->ask_warn("XawTV isn't installed!", formatAlaTeX(_("XawTV isn't installed! If you do have a TV card but DrakX has neither detected it (no bttv nor saa7134 module in \"/etc/modules\") nor installed xawtv, please send the results of \"lspcidrake -v -f\" to \"install\@mandrakesoft.com\" with subject \"undetected TV card\". You can install it by typing \"urpmi xawtv\" as root, in a console."))); } else { my ($ftable_id, $norm); # my %freqtables = map {$i=$_;$i =~ s/ (.*)/-\1/;_($_) => $i} (...) # this table must be checked on each xawtv release: my %freqtables = ("us-bcast" => _("USA (broadcast)"), "us-cable" => _("USA (cable)"), "us-cable-hrc" => _("USA (cable-hrc)"), "canada-cable" => _("Canada (cable)"), "japan-bcast" => _("Japan (broadcast)"), "japan-cable" => _("Japan (cable)"), "china-bcast" => _("China (broadcast)"), "europe-west" => _("West Europe"), "europe-east" => _("East Europe"), "italy" => _("Italy"), "ireland" => _("Ireland"), "france" => _("France [SECAM]"), "newzealand" => _("Newzealand"), "australia" => _("Australia"), "southafrica" => _("South Africa"), "argentina" => _("Argentina"), "australia-optus" => _("Australian Optus cable TV"), -1 =>_("All") ); # Info: HRC means "Harmonically Related Carrier" # default to pal since most people use that $norm = "PAL"; if ("@ARGV" !~ /--help|-h/) { my %countries = ( "ar" => [ "argentina" ], "au" => [ "australia" ], "(br|fr)" => ["france", "SECAM"], "ca" => [ "canada-cable" ], "(ga|ie)" => [ "ireland" ], "it" => [ "italy" ], "jp" => [ "japan-bcast", "NTSC-JP"], "nz" => [ "newzealand" ], "(at|be|ch|de|eu|gb|se)" => [ "europe-west" ], "us" => [ "us-bcast", "NTSC" ], "za" => [ "southafrica" ], "(zh|TW|Big5|CN.GB2312|CN)" => [ "china-bcast" ] ); ($_) = lang::read('', $>); foreach my $i (keys %countries) { if (/($i|$i.UTF-8)$/i) { my $tbl = $countries{$i}; $ftable_id = $tbl->[0]; $norm = $tbl->[1] if ($tbl->[1]); } } log::l("[drakxtv] guess lang=>$_, norm=>$norm, area=>$ftable_id"); } if ($in->ask_from("TVdrake", _("Please,\ntype in your tv norm and country"), [ { label => _("TV norm:"), val => \$norm, list => ["NTSC", "NTSC-JP","PAL", "PAL-M", "PAL-N", "PAL-NC", "SECAM"], type => 'combo' }, { label => _("Area:"), val => \$ftable_id, list => [keys %freqtables], format => sub { $freqtables{$_[0]} }, sort => 1}, ] )) { my $wait = $in->wait_message(_('Please wait'), _("Scanning for TV channels in progress ...")); # we provide scantv a bogus table (france) which will # will be ignored since "All" is selected (because of -a) $ftable_id = "france -a " if ($ftable_id eq -1); # Note that this'll be broken if/when we implement interactive::qt my $use_X = $in->isa('interactive::gtk') && -x "/usr/X11R6/bin/xvt"; my $home = $ENV{HOME}; my $i = system ( (($use_X) ? "xvt -T '"._("Scanning for TV channels")." ...' -e ":"") . "scantv -n $norm -f $ftable_id -o $home/.xawtv".(($use_X)?"":" &>$home/tmp/scantv.log;")); if ($i) { $in->ask_warn(_("There was an error while scanning for TV channels"), _("XawTV isn't installed!")) } else { standalone::explanations("created file $home/.xawtv"); $in->ask_warn(_("Have a nice day!"), _("Now, you can run xawtv (under X Window!) !\n")) if (! $use_X); }; }; } } my @devices = grep { $_->{media_type} eq 'MULTIMEDIA_VIDEO' } detect_devices::probeall(1); if (@devices) { # TODO: That need some work for multiples TV cards foreach (@devices) { if (($< == 0) && (grep { $_->{driver} =~ '(bttv|saa7134)' } @devices)) { require harddrake::v4l; require modules; no strict 'subs'; modules::read_conf; harddrake::v4l::config($in, $_->{driver}); modules::write_conf; } scan4channels(); $in->exit(0); } } else { $in->ask_warn(_("No TV Card detected!"), formatAlaTeX( _("No TV Card has been detected on your machine. Please verify that a Linux-supported Video/TV Card is correctly plugged in. You can visit our hardware database at: http://www.linux-mandrake.com/en/hardware.php3"))); } # TODO: # - offer to sort channels after # - use Video-Capture-V4l-0.221 ? # - configure kwintv and zapping ? => they've already wizards :-( # - install xawtv if needed through consolhelper