1 #!/usr/local/bin/perl -wC
11 use Digest::SHA qw(sha1_hex);
12 require "charmaps.pm";
16 print "Usage: $0 --cldr=<cldrdir> --unidata=<unidatadir> --etc=<etcdir> --type=<type> [--lc=<la_CC>]\n";
20 my $DEFENCODING = "UTF-8";
24 my $UNIDATADIR = undef;
29 my $result = GetOptions (
30 "cldr=s" => \$CLDRDIR,
31 "unidata=s" => \$UNIDATADIR,
43 my %translations = ();
45 my %alternativemonths = ();
50 get_unidata($UNIDATADIR);
51 get_utf8map("$CLDRDIR/posix/$DEFENCODING.cm");
52 get_encodings("$ETCDIR/charmaps");
55 tie(%keys, "Tie::IxHash");
56 tie(%hashtable, "Tie::IxHash");
59 "monetdef" => "LC_MONETARY",
60 "timedef" => "LC_TIME",
61 "msgdef" => "LC_MESSAGES",
62 "numericdef" => "LC_NUMERIC",
63 "colldef" => "LC_COLLATE",
64 "ctypedef" => "LC_CTYPE"
68 mdorder => \&callback_mdorder,
69 altmon => \&callback_altmon,
70 cformat => \&callback_cformat,
71 dformat => \&callback_dformat,
72 dtformat => \&callback_dtformat,
73 cbabmon => \&callback_abmon,
74 cbampm => \&callback_ampm,
81 "decimal_point" => "decimal_point",
82 "thousands_sep" => "thousands_sep",
83 "grouping" => "grouping",
86 "int_curr_symbol" => "int_curr_symbol (last character always " .
88 "currency_symbol" => "currency_symbol",
89 "mon_decimal_point" => "mon_decimal_point",
90 "mon_thousands_sep" => "mon_thousands_sep",
91 "mon_grouping" => "mon_grouping",
92 "positive_sign" => "positive_sign",
93 "negative_sign" => "negative_sign",
94 "int_frac_digits" => "int_frac_digits",
95 "frac_digits" => "frac_digits",
96 "p_cs_precedes" => "p_cs_precedes",
97 "p_sep_by_space" => "p_sep_by_space",
98 "n_cs_precedes" => "n_cs_precedes",
99 "n_sep_by_space" => "n_sep_by_space",
100 "p_sign_posn" => "p_sign_posn",
101 "n_sign_posn" => "n_sign_posn",
104 "yesexpr" => "yesexpr",
105 "noexpr" => "noexpr",
106 "yesstr" => "yesstr",
110 "abmon" => "Short month names",
111 "mon" => "Long month names (as in a date)",
112 "abday" => "Short weekday names",
113 "day" => "Long weekday names",
118 "d_t_fmt" => "date_fmt",
119 "altmon" => "Long month names (without case ending)",
120 "md_order" => "md_order",
121 "t_fmt_ampm" => "ampm_fmt",
124 if ($TYPE eq "colldef") {
125 transform_collation();
129 if ($TYPE eq "ctypedef") {
134 if ($TYPE eq "numericdef") {
136 "decimal_point" => "s",
137 "thousands_sep" => "s",
145 if ($TYPE eq "monetdef") {
147 "int_curr_symbol" => "s",
148 "currency_symbol" => "s",
149 "mon_decimal_point" => "s",
150 "mon_thousands_sep" => "s",
151 "mon_grouping" => "ai",
152 "positive_sign" => "s",
153 "negative_sign" => "s",
154 "int_frac_digits" => "i",
155 "frac_digits" => "i",
156 "p_cs_precedes" => "i",
157 "p_sep_by_space" => "i",
158 "n_cs_precedes" => "i",
159 "n_sep_by_space" => "i",
160 "p_sign_posn" => "i",
168 if ($TYPE eq "msgdef") {
180 if ($TYPE eq "timedef") {
182 "abmon" => "<cbabmon<abmon<as",
187 "d_fmt" => "<dformat<d_fmt<s",
188 "c_fmt" => "<cformat<d_t_fmt<s",
189 "am_pm" => "<cbampm<am_pm<as",
190 "d_t_fmt" => "<dtformat<d_t_fmt<s",
191 "altmon" => "<altmon<mon<as",
192 "md_order" => "<mdorder<d_fmt<s",
202 my $nl = $callback{data}{l} . "_" . $callback{data}{c};
203 my $enc = $callback{data}{e};
204 my $converter = Text::Iconv->new("utf-8", "$enc");
206 if ($nl eq 'ru_RU') {
207 if ($enc eq 'UTF-8') {
210 $s = $converter->convert("дп;пп");
216 sub callback_cformat {
218 my $nl = $callback{data}{l} . "_" . $callback{data}{c};
223 $s =~ s/^"(%B %e, )/"%A, $1/;
224 $s =~ s/^"(%e %B )/"%A $1/;
228 sub callback_dformat {
231 $s =~ s/(%m(<SOLIDUS>|[-.]))%e/$1%d/;
232 $s =~ s/%e((<SOLIDUS>|[-.])%m)/%d$1/;
236 sub callback_dtformat {
238 my $nl = $callback{data}{l} . "_" . $callback{data}{c};
240 if ($nl eq 'ja_JP') {
241 $s =~ s/(> )(%H)/$1%A $2/;
244 $s =~ s/^"(%B %e, )/"%A, $1/;
245 $s =~ s/^"(%e %B )/"%A $1/;
249 sub callback_mdorder {
251 return undef if (!defined $s);
257 sub callback_altmon {
258 # if the language/country is known in %alternative months then
259 # return that, otherwise repeat mon
262 if (defined $alternativemonths{$callback{data}{l}}{$callback{data}{c}}) {
263 my @altnames = split(";",$alternativemonths{$callback{data}{l}}{$callback{data}{c}});
271 return join(";",@cleaned);
278 # for specified CJK locales, pad result with a space to enable
279 # columns to line up (style established in FreeBSD in 2001)
281 my $nl = $callback{data}{l} . "_" . $callback{data}{c};
283 if ($nl eq 'ja_JP' || $nl eq 'ko_KR' || $nl eq 'zh_CN' ||
284 $nl eq 'zh_HK' || $nl eq 'zh_TW') {
285 my @monthnames = split(";", $s);
287 foreach (@monthnames)
289 if ($_ =~ /^"<(two|three|four|five|six|seven|eight|nine)>/ ||
290 ($_ =~ /^"<one>/ && $_ !~ /^"<one>(<zero>|<one>|<two>)/))
292 $_ =~ s/^"/"<space>/;
296 return join(";",@cleaned);
301 ############################
304 my $directory = shift;
306 open(FIN, "$directory/UnicodeData.txt")
307 or die("Cannot open $directory/UnicodeData.txt");;
312 foreach my $l (@lines) {
313 my @a = split(/;/, $l);
315 $ucd{code2name}{"$a[0]"} = $a[1]; # Unicode name
316 $ucd{name2code}{"$a[1]"} = $a[0]; # Unicode code
331 foreach my $l (@lines) {
333 next if ($l =~ /^\#/);
336 if ($l eq "CHARMAP") {
341 next if (!$incharmap);
342 last if ($l eq "END CHARMAP");
344 $l =~ /^<([^\s]+)>\s+(.*)/;
347 $k =~ s/_/ /g; # unicode char string
348 $v =~ s/\\x//g; # UTF-8 char code
351 $utf8aliases{$k} = $prev_k if ($prev_v eq $v);
360 foreach my $e (sort(keys(%encodings))) {
361 if (!open(FIN, "$dir/$e.TXT")) {
362 print "Cannot open charmap for $e\n";
370 foreach my $l (@lines) {
372 next if ($l =~ /^\#/);
375 my @a = split(" ", $l);
377 $a[0] =~ s/^0[xX]//; # local char code
378 $a[1] =~ s/^0[xX]//; # unicode char code
379 $convertors{$e}{uc($a[1])} = uc($a[0]);
385 my %data = get_xmldata($ETCDIR);
386 %languages = %{$data{L}};
387 %translations = %{$data{T}};
388 %alternativemonths = %{$data{AM}};
389 %encodings = %{$data{E}};
391 return if (!defined $doonly);
393 my @a = split(/_/, $doonly);
404 print Dumper(@filter);
408 sub transform_ctypes {
409 foreach my $l (sort keys(%languages)) {
410 foreach my $f (sort keys(%{$languages{$l}})) {
411 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
412 next if ($#filter == 2 && ($filter[0] ne $l
413 || $filter[1] ne $f || $filter[2] ne $c));
414 next if (defined $languages{$l}{$f}{definitions}
415 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
416 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 0; # unread
419 $file .= $f . "_" if ($f ne "x");
423 my $filename = "$CLDRDIR/posix/xx_Comm_US.UTF-8.src";
424 if (! -f $filename) {
425 print STDERR "Cannot open $filename\n";
428 open(FIN, "$filename");
429 print "Reading from $filename for ${l}_${f}_${c}\n";
430 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 1; # read
438 $shex = sha1_hex(join("\n", @lines));
439 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = $shex;
440 $hashtable{$shex}{"${l}_${f}_${c}.$DEFENCODING"} = 1;
441 open(FOUT, ">$TYPE.draft/$actfile.$DEFENCODING.src");
444 foreach my $enc (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
445 next if ($enc eq $DEFENCODING);
446 $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src";
447 if (! -f $filename) {
448 print STDERR "Cannot open $filename\n";
452 open(FIN, "$filename");
454 if ((/^comment_char\s/) || (/^escape_char\s/)){
457 if (/^LC_CTYPE/../^END LC_CTYPE/) {
462 $uhex = sha1_hex(join("\n", @lines) . $enc);
463 $languages{$l}{$f}{data}{$c}{$enc} = $uhex;
464 $hashtable{$uhex}{"${l}_${f}_${c}.$enc"} = 1;
465 open(FOUT, ">$TYPE.draft/$actfile.$enc.src");
467 # Warning: Do not edit. This file is automatically extracted from the
468 # tools in /usr/src/tools/tools/locale. The data is obtained from the
469 # CLDR project, obtained from http://cldr.unicode.org/
470 # -----------------------------------------------------------------------------
481 sub transform_collation {
482 foreach my $l (sort keys(%languages)) {
483 foreach my $f (sort keys(%{$languages{$l}})) {
484 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
485 next if ($#filter == 2 && ($filter[0] ne $l
486 || $filter[1] ne $f || $filter[2] ne $c));
487 next if (defined $languages{$l}{$f}{definitions}
488 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
489 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 0; # unread
492 $file .= $f . "_" if ($f ne "x");
496 my $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src";
497 $filename = "$ETCDIR/$file.$DEFENCODING.src"
500 && defined $languages{$l}{$f}{fallback}) {
501 $file = $languages{$l}{$f}{fallback};
502 $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src";
504 $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src"
506 if (! -f $filename) {
508 "Cannot open $file.$DEFENCODING.src or fallback\n";
511 open(FIN, "$filename");
512 print "Reading from $filename for ${l}_${f}_${c}\n";
513 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 1; # read
517 if ((/^comment_char\s/) || (/^escape_char\s/)){
520 if (/^LC_COLLATE/../^END LC_COLLATE/) {
526 $shex = sha1_hex(join("\n", @lines));
527 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = $shex;
528 $hashtable{$shex}{"${l}_${f}_${c}.$DEFENCODING"} = 1;
529 open(FOUT, ">$TYPE.draft/$actfile.$DEFENCODING.src");
531 # Warning: Do not edit. This file is automatically extracted from the
532 # tools in /usr/src/tools/tools/locale. The data is obtained from the
533 # CLDR project, obtained from http://cldr.unicode.org/
534 # -----------------------------------------------------------------------------
539 foreach my $enc (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
540 next if ($enc eq $DEFENCODING);
541 copy ("$TYPE.draft/$actfile.$DEFENCODING.src",
542 "$TYPE.draft/$actfile.$enc.src");
543 $languages{$l}{$f}{data}{$c}{$enc} = $shex;
544 $hashtable{$shex}{"${l}_${f}_${c}.$enc"} = 1;
552 foreach my $l (sort keys(%languages)) {
553 foreach my $f (sort keys(%{$languages{$l}})) {
554 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
555 next if ($#filter == 2 && ($filter[0] ne $l
556 || $filter[1] ne $f || $filter[2] ne $c));
557 next if (defined $languages{$l}{$f}{definitions}
558 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
560 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 0; # unread
563 $file .= $f . "_" if ($f ne "x");
566 my $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src";
567 $filename = "$ETCDIR/$file.$DEFENCODING.src"
570 && defined $languages{$l}{$f}{fallback}) {
571 $file = $languages{$l}{$f}{fallback};
572 $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src";
574 $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src"
576 if (! -f $filename) {
578 "Cannot open $file.$DEFENCODING.src or fallback\n";
581 open(FIN, "$filename");
582 print "Reading from $filename for ${l}_${f}_${c}\n";
583 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 1; # read
588 foreach my $k (keys(%keys)) {
589 foreach my $line (@lines) {
591 next if (!$continue && $line !~ /^$k\s/);
598 $values{$l}{$f}{$c}{$k} = ""
599 if (!defined $values{$l}{$f}{$c}{$k});
601 $continue = ($line =~ /\/$/);
602 $line =~ s/\/$// if ($continue);
604 while ($line =~ /_/) {
606 s/\<([^>_]+)_([^>]+)\>/<$1 $2>/;
608 die "_ in data - $line" if ($line =~ /_/);
609 $values{$l}{$f}{$c}{$k} .= $line;
611 last if (!$continue);
627 # Conversion to UTF-8 can be done from the Unicode name to
628 # the UTF-8 character code.
631 die "Cannot convert $s in $e (charmap)" if (!defined $v);
634 # Conversion to these encodings can be done from the Unicode
635 # name to Unicode code to the encodings code.
638 $ucc = $ucd{name2code}{$s} if (defined $ucd{name2code}{$s});
639 $ucc = $ucd{name2code}{$utf8aliases{$s}}
642 && defined $ucd{name2code}{$utf8aliases{$s}});
645 if (defined $translations{$e}{$s}{hex}) {
646 $v = $translations{$e}{$s}{hex};
648 } elsif (defined $translations{$e}{$s}{ucc}) {
649 $ucc = $translations{$e}{$s}{ucc};
653 die "Cannot convert $s in $e (ucd string)" if (!defined $ucc);
654 $v = $convertors{$e}{$ucc} if (!defined $v);
656 $v = $translations{$e}{$s}{hex}
657 if (!defined $v && defined $translations{$e}{$s}{hex});
659 if (!defined $v && defined $translations{$e}{$s}{unicode}) {
660 my $ucn = $translations{$e}{$s}{unicode};
661 $ucc = $ucd{name2code}{$ucn}
662 if (defined $ucd{name2code}{$ucn});
663 $ucc = $ucd{name2code}{$utf8aliases{$ucn}}
665 && defined $ucd{name2code}{$utf8aliases{$ucn}});
666 $v = $convertors{$e}{$ucc};
669 die "Cannot convert $s in $e (charmap)" if (!defined $v);
672 return pack("C", hex($v)) if (length($v) == 2);
673 return pack("CC", hex(substr($v, 0, 2)), hex(substr($v, 2, 2)))
674 if (length($v) == 4);
675 return pack("CCC", hex(substr($v, 0, 2)), hex(substr($v, 2, 2)),
676 hex(substr($v, 4, 2))) if (length($v) == 6);
677 print STDERR "Cannot convert $e $s\n";
678 return "length = " . length($v);
686 return $translations{$enc}{$v} if (defined $translations{$enc}{$v});
691 foreach my $l (sort keys(%languages)) {
692 foreach my $f (sort keys(%{$languages{$l}})) {
693 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
694 next if ($#filter == 2 && ($filter[0] ne $l
695 || $filter[1] ne $f || $filter[2] ne $c));
696 next if (defined $languages{$l}{$f}{definitions}
697 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
698 foreach my $enc (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
699 if ($languages{$l}{$f}{data}{$c}{$DEFENCODING} eq "0") {
700 print "Skipping ${l}_" .
701 ($f eq "x" ? "" : "${f}_") .
706 $file .= "_" . $f if ($f ne "x");
708 print "Writing to $file in $enc\n";
710 if ($enc ne $DEFENCODING &&
711 !defined $convertors{$enc}) {
712 print "Failed! Cannot convert to $enc.\n";
716 open(FOUT, ">$TYPE.draft/$file.$enc.new");
720 # Warning: Do not edit. This file is automatically generated from the
721 # tools in /usr/src/tools/tools/locale. The data is obtained from the
722 # CLDR project, obtained from http://cldr.unicode.org/
723 # -----------------------------------------------------------------------------
725 foreach my $k (keys(%keys)) {
728 die("Unknown $k in \%DESC")
729 if (!defined $DESC{$k});
731 $output .= "#\n# $DESC{$k}\n";
733 # Replace one row with another
741 $callback{data}{c} = $c;
742 $callback{data}{k} = $k;
743 $callback{data}{f} = $f;
744 $callback{data}{l} = $l;
745 $callback{data}{e} = $enc;
746 my @a = split(/\</, substr($g, 1));
748 &{$callback{$a[0]}}($values{$l}{$f}{$c}{$a[1]});
749 $values{$l}{$f}{$c}{$k} = $rv;
751 $callback{data} = ();
754 my $v = $values{$l}{$f}{$c}{$k};
755 $v = "undef" if (!defined $v);
769 while ($v =~ /^(.*?)<(.*?)>(.*)/) {
774 my $rv = decodecldr($enc, $cm);
775 # $rv = translate($enc, $cm)
779 "Could not convert $k ($cm) from $DEFENCODING to $enc\n";
784 $v = $p1 . $rv . $p3;
790 foreach my $v (split(/;/, $v)) {
794 while ($v =~ /^(.*?)<(.*?)>(.*)/) {
802 # $rv = translate($enc,
807 "Could not convert $k ($cm) from $DEFENCODING to $enc\n";
823 $languages{$l}{$f}{data}{$c}{$enc} = sha1_hex($output);
824 $hashtable{sha1_hex($output)}{"${l}_${f}_${c}.$enc"} = 1;
825 print FOUT "$output# EOF\n";
829 rename("$TYPE.draft/$file.$enc.new",
830 "$TYPE.draft/$file.$enc.src");
832 rename("$TYPE.draft/$file.$enc.new",
833 "$TYPE.draft/$file.$enc.failed");
842 return if ($#filter > -1);
843 print "Creating Makefile for $TYPE\n";
849 if ($TYPE eq "colldef") {
850 $SRCOUT = "localedef -D -U -i \${.IMPSRC} \\\n" .
851 "\t-f \${MAPLOC}/map.\${.TARGET:T:R:E:C/@.*//} " .
852 "\${.OBJDIR}/\${.IMPSRC:T:R}";
853 $MAPLOC = "MAPLOC=\t\t\${.CURDIR}/../../tools/tools/" .
854 "locale/etc/final-maps\n";
855 $SRCOUT2 = "LC_COLLATE";
857 ".for f t in \${LOCALES_MAPPED}\n" .
858 "FILES+=\t\$t.LC_COLLATE\n" .
859 "FILESDIR_\$t.LC_COLLATE=\t\${LOCALEDIR}/\$t\n" .
860 "\$t.LC_COLLATE: \${.CURDIR}/\$f.src\n" .
861 "\tlocaledef -D -U -i \${.ALLSRC} \\\n" .
862 "\t\t-f \${MAPLOC}/map.\${.TARGET:T:R:E:C/@.*//} \\\n" .
863 "\t\t\${.OBJDIR}/\${.TARGET:T:R}\n" .
865 $SRCOUT4 = "## LOCALES_MAPPED\n";
867 elsif ($TYPE eq "ctypedef") {
868 $SRCOUT = "localedef -D -U -c -w \${MAPLOC}/widths.txt \\\n" .
869 "\t-f \${MAPLOC}/map.\${.IMPSRC:T:R:E} " .
870 "\\\n\t-i \${.IMPSRC} \${.OBJDIR}/\${.IMPSRC:T:R} " .
872 $SRCOUT2 = "LC_CTYPE";
873 $MAPLOC = "MAPLOC=\t\t\${.CURDIR}/../../tools/tools/" .
874 "locale/etc/final-maps\n";
875 $SRCOUT3 = "## SYMPAIRS\n\n" .
876 ".for s t in \${SYMPAIRS}\n" .
877 "\${t:S/src\$/LC_CTYPE/}: " .
879 "\tlocaledef -D -U -c -w \${MAPLOC}/widths.txt \\\n" .
880 "\t-f \${MAPLOC}/map.\${.TARGET:T:R:C/^.*\\.//} " .
881 "\\\n\t-i \${.ALLSRC} \${.OBJDIR}/\${.TARGET:T:R} " .
886 $SRCOUT = "grep -v -E '^(\#\$\$|\#[ ])' < \${.IMPSRC} > \${.TARGET}";
890 open(FOUT, ">$TYPE.draft/Makefile");
893 # Warning: Do not edit. This file is automatically generated from the
894 # tools in /usr/src/tools/tools/locale.
896 LOCALEDIR= \${SHAREDIR}/locale
897 FILESNAME= $FILESNAMES{$TYPE}
898 .SUFFIXES: .src .${SRCOUT2}
909 foreach my $hash (keys(%hashtable)) {
910 # For colldef, weight LOCALES to UTF-8
911 # Sort as upper-case and reverse to achieve it
912 # Make en_US, ru_RU, and ca_AD preferred
914 if ($TYPE eq "colldef") {
916 if ($a eq 'en_x_US.UTF-8' ||
917 $a eq 'ru_x_RU.UTF-8' ||
918 $a eq 'ca_x_AD.UTF-8') { return -1; }
919 elsif ($b eq 'en_x_US.UTF-8' ||
920 $b eq 'ru_x_RU.UTF-8' ||
921 $b eq 'ca_x_AD.UTF-8') { return 1; }
922 else { return uc($b) cmp uc($a); }
923 } keys(%{$hashtable{$hash}});
924 } elsif ($TYPE eq "ctypedef") {
926 if ($a eq 'en_x_US.UTF-8') { return -1; }
927 elsif ($b eq 'en_x_US.UTF-8') { return 1; }
928 if ($a =~ /^en_x_US/) { return -1; }
929 elsif ($b =~ /^en_x_US/) { return 1; }
931 if ($a =~ /^en_x_GB.ISO8859-15/ ||
932 $a =~ /^ru_x_RU/) { return -1; }
933 elsif ($b =~ /^en_x_GB.ISO8859-15/ ||
934 $b =~ /ru_x_RU/) { return 1; }
935 else { return uc($b) cmp uc($a); }
937 } keys(%{$hashtable{$hash}});
940 if ($a =~ /_Comm_/ ||
941 $b eq 'en_x_US.UTF-8') { return 1; }
942 elsif ($b =~ /_Comm_/ ||
943 $a eq 'en_x_US.UTF-8') { return -1; }
944 else { return uc($b) cmp uc($a); }
945 } keys(%{$hashtable{$hash}});
948 my $link = shift(@files);
949 $link =~ s/_x_/_/; # strip family if none there
950 foreach my $file (@files) {
951 my @a = split(/_/, $file);
952 my @b = split(/\./, $a[-1]);
954 print FOUT "SAME+=\t\t$link $file\n";
955 undef($languages{$a[0]}{$a[1]}{data}{$b[0]}{$b[1]});
960 foreach my $l (sort keys(%languages)) {
961 foreach my $f (sort keys(%{$languages{$l}})) {
962 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
963 next if ($#filter == 2 && ($filter[0] ne $l
964 || $filter[1] ne $f || $filter[2] ne $c));
965 next if (defined $languages{$l}{$f}{definitions}
966 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
967 if (defined $languages{$l}{$f}{data}{$c}{$DEFENCODING}
968 && $languages{$l}{$f}{data}{$c}{$DEFENCODING} eq "0") {
969 print "Skipping ${l}_" . ($f eq "x" ? "" : "${f}_") .
973 foreach my $e (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
975 $file .= $f . "_" if ($f ne "x");
977 next if (!defined $languages{$l}{$f}{data}{$c}{$e});
978 print FOUT "LOCALES+=\t$file.$e\n";
981 if (defined $languages{$l}{$f}{nc_link}) {
982 foreach my $e (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
984 $file .= $f . "_" if ($f ne "x");
986 print FOUT "SAME+=\t\t$file.$e $languages{$l}{$f}{nc_link}.$e\t# legacy (lang/country change)\n";
990 if (defined $languages{$l}{$f}{e_link}) {
991 foreach my $el (split(" ", $languages{$l}{$f}{e_link})) {
992 my @a = split(/:/, $el);
994 $file .= $f . "_" if ($f ne "x");
996 print FOUT "SAME+=\t\t$file.$a[0] $file.$a[1]\t# legacy (same charset)\n";
1006 FILES= \${LOCALES:S/\$/.${SRCOUT2}/}
1007 CLEANFILES= \${FILES}
1009 .for f t in \${SAME}
1010 SYMLINKS+= ../\$f/\${FILESNAME} \\
1011 \${LOCALEDIR}/\$t/\${FILESNAME}
1014 .for f in \${LOCALES}
1015 FILESDIR_\${f}.${SRCOUT2}= \${LOCALEDIR}/\${f}
1018 ${SRCOUT3}.include <bsd.prog.mk>