home *** CD-ROM | disk | FTP | other *** search
- package lang;
-
-
-
-
-
-
-
- use common qw(:common :file :system);
- use commands;
- use log;
-
-
-
-
-
-
-
- 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' ],
-
- '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' ],
-
- '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' ],
-
- 'ga' => [ 'Gaeilge (Irish)', 'iso-8859-14','ga', 'ga:en_IE:en' ],
-
- 'gl' => [ 'Galician', 'iso-8859-1', 'gl', 'gl:es_ES:pt_PT:pt_BR:es:pt' ],
-
-
- 'hr' => [ 'Croatian', 'iso-8859-2', 'hr', 'hr' ],
- 'hu' => [ 'Hungarian', 'iso-8859-2', 'hu', 'hu' ],
- 'hy' => [ 'Armenian', 'armscii-8', 'hy', 'hy' ],
-
-
- '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' ],
-
- 'ko' => [ 'Korean', 'ksc5601', 'ko', 'ko' ],
-
- 'lt' => [ 'Lithuanian', 'iso-8859-13','lt', 'lt' ],
-
-
-
-
- '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' ],
-
- '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:zh_CN.GB2312: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) }
-
-
-
- my %charsets = (
- "armscii-8" => [ "arm8", "armscii8.uni", "trivial.trans",
- std_("armscii-8") ],
-
- "Big5" => [ undef, undef, undef,
- "-*-*-*-*-*-*-*-*-*-*-*-*-big5-0" ],
- "gb2312" => [ undef, undef, undef,
- "-*-*-*-*-*-*-*-*-*-*-*-*-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") ],
-
-
- "iso-8859-6" => [ "iso06.f16", "iso06", "trivial.trans",
- std_("iso8859-6") ],
- "iso-8859-7" => [ "iso07.f16", "iso07", "trivial.trans",
- std_("iso8859-7") ],
-
-
- "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") ],
-
- "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",
- std_("microsoft-cp1251") ],
-
- "ksc5601" => [ undef, undef, undef,
- "-*-*-*-*-*-*-*-*-*-*-*-*-ksc5601.1987-*" ],
-
- "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" ],
-
-
- "isiri-3342" => [ undef, undef, "trivial.trans",
- "-*-*-*-*-*-*-*-*-*-*-*-*-isiri-3342" ],
- );
-
-
-
-
-
- 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;
- }
- foreach (<F>) {
- /^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 get_x_fontset {
- my ($lang) = @_;
-
- my $l = $languages{$lang} or return;
- my $c = $charsets{$l->[1]} or return;
- @$c[3..4];
- }
-
-
-
-
- 1;
-