1 #!/usr/local/bin/perl -wC
10 use Digest::SHA qw(sha1_hex);
11 require "charmaps.pm";
15 print "Usage: $0 --cldr=<cldrdir> --unidata=<unidatadir> --etc=<etcdir> --type=<type> [--lc=<la_CC>]\n";
19 my $DEFENCODING = "UTF-8";
23 my $UNIDATADIR = undef;
28 my $result = GetOptions (
29 "cldr=s" => \$CLDRDIR,
30 "unidata=s" => \$UNIDATADIR,
42 my %translations = ();
44 my %alternativemonths = ();
49 get_unidata($UNIDATADIR);
50 get_utf8map("$CLDRDIR/posix/$DEFENCODING.cm");
51 get_encodings("$ETCDIR/charmaps");
54 tie(%keys, "Tie::IxHash");
55 tie(%hashtable, "Tie::IxHash");
58 "monetdef" => "LC_MONETARY",
59 "timedef" => "LC_TIME",
60 "msgdef" => "LC_MESSAGES",
61 "numericdef" => "LC_NUMERIC",
62 "colldef" => "LC_COLLATE",
63 "ctypedef" => "LC_CTYPE"
67 mdorder => \&callback_mdorder,
68 altmon => \&callback_altmon,
69 cformat => \&callback_cformat,
70 dtformat => \&callback_dtformat,
71 cbabmon => \&callback_abmon,
78 "decimal_point" => "decimal_point",
79 "thousands_sep" => "thousands_sep",
80 "grouping" => "grouping",
83 "int_curr_symbol" => "int_curr_symbol (last character always " .
85 "currency_symbol" => "currency_symbol",
86 "mon_decimal_point" => "mon_decimal_point",
87 "mon_thousands_sep" => "mon_thousands_sep",
88 "mon_grouping" => "mon_grouping",
89 "positive_sign" => "positive_sign",
90 "negative_sign" => "negative_sign",
91 "int_frac_digits" => "int_frac_digits",
92 "frac_digits" => "frac_digits",
93 "p_cs_precedes" => "p_cs_precedes",
94 "p_sep_by_space" => "p_sep_by_space",
95 "n_cs_precedes" => "n_cs_precedes",
96 "n_sep_by_space" => "n_sep_by_space",
97 "p_sign_posn" => "p_sign_posn",
98 "n_sign_posn" => "n_sign_posn",
101 "yesexpr" => "yesexpr",
102 "noexpr" => "noexpr",
103 "yesstr" => "yesstr",
107 "abmon" => "Short month names",
108 "mon" => "Long month names (as in a date)",
109 "abday" => "Short weekday names",
110 "day" => "Long weekday names",
115 "d_t_fmt" => "date_fmt",
116 "altmon" => "Long month names (without case ending)",
117 "md_order" => "md_order",
118 "t_fmt_ampm" => "ampm_fmt",
121 if ($TYPE eq "colldef") {
122 transform_collation();
126 if ($TYPE eq "ctypedef") {
131 if ($TYPE eq "numericdef") {
133 "decimal_point" => "s",
134 "thousands_sep" => "s",
142 if ($TYPE eq "monetdef") {
144 "int_curr_symbol" => "s",
145 "currency_symbol" => "s",
146 "mon_decimal_point" => "s",
147 "mon_thousands_sep" => "s",
148 "mon_grouping" => "ai",
149 "positive_sign" => "s",
150 "negative_sign" => "s",
151 "int_frac_digits" => "i",
152 "frac_digits" => "i",
153 "p_cs_precedes" => "i",
154 "p_sep_by_space" => "i",
155 "n_cs_precedes" => "i",
156 "n_sep_by_space" => "i",
157 "p_sign_posn" => "i",
165 if ($TYPE eq "msgdef") {
177 if ($TYPE eq "timedef") {
179 "abmon" => "<cbabmon<abmon<as",
185 "c_fmt" => "<cformat<d_t_fmt<s",
188 "d_t_fmt" => "<dtformat<d_t_fmt<s",
189 "altmon" => "<altmon<mon<as",
190 "md_order" => "<mdorder<d_fmt<s",
198 sub callback_cformat {
205 sub callback_dtformat {
207 my $nl = $callback{data}{l} . "_" . $callback{data}{c};
209 if ($nl eq 'ja_JP') {
210 $s =~ s/(> )(%H)/$1%A $2/;
215 sub callback_mdorder {
217 return undef if (!defined $s);
222 sub callback_altmon {
223 # if the language/country is known in %alternative months then
224 # return that, otherwise repeat mon
227 if (defined $alternativemonths{$callback{data}{l}}{$callback{data}{c}}) {
228 my @altnames = split(";",$alternativemonths{$callback{data}{l}}{$callback{data}{c}});
236 return join(";",@cleaned);
243 # for specified CJK locales, pad result with a space to enable
244 # columns to line up (style established in FreeBSD in 2001)
246 my $nl = $callback{data}{l} . "_" . $callback{data}{c};
248 if ($nl eq 'ja_JP' || $nl eq 'ko_KR' || $nl eq 'zh_CN' ||
249 $nl eq 'zh_HK' || $nl eq 'zh_TW') {
250 my @monthnames = split(";", $s);
252 foreach (@monthnames)
254 if ($_ =~ /^"<(two|three|four|five|six|seven|eight|nine)>/ ||
255 ($_ =~ /^"<one>/ && $_ !~ /^"<one>(<zero>|<one>|<two>)/))
257 $_ =~ s/^"/"<space>/;
261 return join(";",@cleaned);
266 ############################
269 my $directory = shift;
271 open(FIN, "$directory/UnicodeData.txt")
272 or die("Cannot open $directory/UnicodeData.txt");;
277 foreach my $l (@lines) {
278 my @a = split(/;/, $l);
280 $ucd{code2name}{"$a[0]"} = $a[1]; # Unicode name
281 $ucd{name2code}{"$a[1]"} = $a[0]; # Unicode code
296 foreach my $l (@lines) {
298 next if ($l =~ /^\#/);
301 if ($l eq "CHARMAP") {
306 next if (!$incharmap);
307 last if ($l eq "END CHARMAP");
309 $l =~ /^<([^\s]+)>\s+(.*)/;
312 $k =~ s/_/ /g; # unicode char string
313 $v =~ s/\\x//g; # UTF-8 char code
316 $utf8aliases{$k} = $prev_k if ($prev_v eq $v);
325 foreach my $e (sort(keys(%encodings))) {
326 if (!open(FIN, "$dir/$e.TXT")) {
327 print "Cannot open charmap for $e\n";
335 foreach my $l (@lines) {
337 next if ($l =~ /^\#/);
340 my @a = split(" ", $l);
342 $a[0] =~ s/^0[xX]//; # local char code
343 $a[1] =~ s/^0[xX]//; # unicode char code
344 $convertors{$e}{uc($a[1])} = uc($a[0]);
350 my %data = get_xmldata($ETCDIR);
351 %languages = %{$data{L}};
352 %translations = %{$data{T}};
353 %alternativemonths = %{$data{AM}};
354 %encodings = %{$data{E}};
356 return if (!defined $doonly);
358 my @a = split(/_/, $doonly);
369 print Dumper(@filter);
373 sub transform_ctypes {
374 foreach my $l (sort keys(%languages)) {
375 foreach my $f (sort keys(%{$languages{$l}})) {
376 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
377 next if ($#filter == 2 && ($filter[0] ne $l
378 || $filter[1] ne $f || $filter[2] ne $c));
379 next if (defined $languages{$l}{$f}{definitions}
380 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
381 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 0; # unread
384 $file .= $f . "_" if ($f ne "x");
388 my $filename = "$CLDRDIR/posix/xx_Comm_US.UTF-8.src";
389 if (! -f $filename) {
390 print STDERR "Cannot open $filename\n";
393 open(FIN, "$filename");
394 print "Reading from $filename for ${l}_${f}_${c}\n";
395 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 1; # read
403 $shex = sha1_hex(join("\n", @lines));
404 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = $shex;
405 $hashtable{$shex}{"${l}_${f}_${c}.$DEFENCODING"} = 1;
406 open(FOUT, ">$TYPE.draft/$actfile.$DEFENCODING.src");
409 foreach my $enc (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
410 next if ($enc eq $DEFENCODING);
411 $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src";
412 if (! -f $filename) {
413 print STDERR "Cannot open $filename\n";
417 open(FIN, "$filename");
419 if ((/^comment_char\s/) || (/^escape_char\s/)){
422 if (/^LC_CTYPE/../^END LC_CTYPE/) {
427 $uhex = sha1_hex(join("\n", @lines) . $enc);
428 $languages{$l}{$f}{data}{$c}{$enc} = $uhex;
429 $hashtable{$uhex}{"${l}_${f}_${c}.$enc"} = 1;
430 open(FOUT, ">$TYPE.draft/$actfile.$enc.src");
432 # Warning: Do not edit. This file is automatically extracted from the
433 # tools in /usr/src/tools/tools/locale. The data is obtained from the
434 # CLDR project, obtained from http://cldr.unicode.org/
435 # -----------------------------------------------------------------------------
446 sub transform_collation {
447 foreach my $l (sort keys(%languages)) {
448 foreach my $f (sort keys(%{$languages{$l}})) {
449 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
450 next if ($#filter == 2 && ($filter[0] ne $l
451 || $filter[1] ne $f || $filter[2] ne $c));
452 next if (defined $languages{$l}{$f}{definitions}
453 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
454 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 0; # unread
457 $file .= $f . "_" if ($f ne "x");
461 my $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src";
462 $filename = "$ETCDIR/$file.$DEFENCODING.src"
465 && defined $languages{$l}{$f}{fallback}) {
466 $file = $languages{$l}{$f}{fallback};
467 $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src";
469 $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src"
471 if (! -f $filename) {
473 "Cannot open $file.$DEFENCODING.src or fallback\n";
476 open(FIN, "$filename");
477 print "Reading from $filename for ${l}_${f}_${c}\n";
478 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 1; # read
482 if ((/^comment_char\s/) || (/^escape_char\s/)){
485 if (/^LC_COLLATE/../^END LC_COLLATE/) {
491 $shex = sha1_hex(join("\n", @lines));
492 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = $shex;
493 $hashtable{$shex}{"${l}_${f}_${c}.$DEFENCODING"} = 1;
494 open(FOUT, ">$TYPE.draft/$actfile.$DEFENCODING.src");
496 # Warning: Do not edit. This file is automatically extracted from the
497 # tools in /usr/src/tools/tools/locale. The data is obtained from the
498 # CLDR project, obtained from http://cldr.unicode.org/
499 # -----------------------------------------------------------------------------
504 foreach my $enc (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
505 next if ($enc eq $DEFENCODING);
506 copy ("$TYPE.draft/$actfile.$DEFENCODING.src",
507 "$TYPE.draft/$actfile.$enc.src");
508 $languages{$l}{$f}{data}{$c}{$enc} = $shex;
509 $hashtable{$shex}{"${l}_${f}_${c}.$enc"} = 1;
517 foreach my $l (sort keys(%languages)) {
518 foreach my $f (sort keys(%{$languages{$l}})) {
519 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
520 next if ($#filter == 2 && ($filter[0] ne $l
521 || $filter[1] ne $f || $filter[2] ne $c));
522 next if (defined $languages{$l}{$f}{definitions}
523 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
525 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 0; # unread
528 $file .= $f . "_" if ($f ne "x");
531 my $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src";
532 $filename = "$ETCDIR/$file.$DEFENCODING.src"
535 && defined $languages{$l}{$f}{fallback}) {
536 $file = $languages{$l}{$f}{fallback};
537 $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src";
539 $filename = "$CLDRDIR/posix/$file.$DEFENCODING.src"
541 if (! -f $filename) {
543 "Cannot open $file.$DEFENCODING.src or fallback\n";
546 open(FIN, "$filename");
547 print "Reading from $filename for ${l}_${f}_${c}\n";
548 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 1; # read
553 foreach my $k (keys(%keys)) {
554 foreach my $line (@lines) {
556 next if (!$continue && $line !~ /^$k\s/);
563 $values{$l}{$c}{$k} = ""
564 if (!defined $values{$l}{$c}{$k});
566 $continue = ($line =~ /\/$/);
567 $line =~ s/\/$// if ($continue);
569 while ($line =~ /_/) {
571 s/\<([^>_]+)_([^>]+)\>/<$1 $2>/;
573 die "_ in data - $line" if ($line =~ /_/);
574 $values{$l}{$c}{$k} .= $line;
576 last if (!$continue);
592 # Conversion to UTF-8 can be done from the Unicode name to
593 # the UTF-8 character code.
596 die "Cannot convert $s in $e (charmap)" if (!defined $v);
599 # Conversion to these encodings can be done from the Unicode
600 # name to Unicode code to the encodings code.
603 $ucc = $ucd{name2code}{$s} if (defined $ucd{name2code}{$s});
604 $ucc = $ucd{name2code}{$utf8aliases{$s}}
607 && defined $ucd{name2code}{$utf8aliases{$s}});
610 if (defined $translations{$e}{$s}{hex}) {
611 $v = $translations{$e}{$s}{hex};
613 } elsif (defined $translations{$e}{$s}{ucc}) {
614 $ucc = $translations{$e}{$s}{ucc};
618 die "Cannot convert $s in $e (ucd string)" if (!defined $ucc);
619 $v = $convertors{$e}{$ucc} if (!defined $v);
621 $v = $translations{$e}{$s}{hex}
622 if (!defined $v && defined $translations{$e}{$s}{hex});
624 if (!defined $v && defined $translations{$e}{$s}{unicode}) {
625 my $ucn = $translations{$e}{$s}{unicode};
626 $ucc = $ucd{name2code}{$ucn}
627 if (defined $ucd{name2code}{$ucn});
628 $ucc = $ucd{name2code}{$utf8aliases{$ucn}}
630 && defined $ucd{name2code}{$utf8aliases{$ucn}});
631 $v = $convertors{$e}{$ucc};
634 die "Cannot convert $s in $e (charmap)" if (!defined $v);
637 return pack("C", hex($v)) if (length($v) == 2);
638 return pack("CC", hex(substr($v, 0, 2)), hex(substr($v, 2, 2)))
639 if (length($v) == 4);
640 return pack("CCC", hex(substr($v, 0, 2)), hex(substr($v, 2, 2)),
641 hex(substr($v, 4, 2))) if (length($v) == 6);
642 print STDERR "Cannot convert $e $s\n";
643 return "length = " . length($v);
651 return $translations{$enc}{$v} if (defined $translations{$enc}{$v});
656 foreach my $l (sort keys(%languages)) {
657 foreach my $f (sort keys(%{$languages{$l}})) {
658 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
659 next if ($#filter == 2 && ($filter[0] ne $l
660 || $filter[1] ne $f || $filter[2] ne $c));
661 next if (defined $languages{$l}{$f}{definitions}
662 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
663 foreach my $enc (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
664 if ($languages{$l}{$f}{data}{$c}{$DEFENCODING} eq "0") {
665 print "Skipping ${l}_" .
666 ($f eq "x" ? "" : "${f}_") .
671 $file .= "_" . $f if ($f ne "x");
673 print "Writing to $file in $enc\n";
675 if ($enc ne $DEFENCODING &&
676 !defined $convertors{$enc}) {
677 print "Failed! Cannot convert to $enc.\n";
681 open(FOUT, ">$TYPE.draft/$file.$enc.new");
685 # Warning: Do not edit. This file is automatically generated from the
686 # tools in /usr/src/tools/tools/locale. The data is obtained from the
687 # CLDR project, obtained from http://cldr.unicode.org/
688 # -----------------------------------------------------------------------------
690 foreach my $k (keys(%keys)) {
693 die("Unknown $k in \%DESC")
694 if (!defined $DESC{$k});
696 $output .= "#\n# $DESC{$k}\n";
698 # Replace one row with another
706 $callback{data}{c} = $c;
707 $callback{data}{k} = $k;
708 $callback{data}{l} = $l;
709 $callback{data}{e} = $enc;
710 my @a = split(/\</, substr($f, 1));
712 &{$callback{$a[0]}}($values{$l}{$c}{$a[1]});
713 $values{$l}{$c}{$k} = $rv;
715 $callback{data} = ();
718 my $v = $values{$l}{$c}{$k};
719 $v = "undef" if (!defined $v);
733 while ($v =~ /^(.*?)<(.*?)>(.*)/) {
738 my $rv = decodecldr($enc, $cm);
739 # $rv = translate($enc, $cm)
743 "Could not convert $k ($cm) from $DEFENCODING to $enc\n";
748 $v = $p1 . $rv . $p3;
754 foreach my $v (split(/;/, $v)) {
758 while ($v =~ /^(.*?)<(.*?)>(.*)/) {
766 # $rv = translate($enc,
771 "Could not convert $k ($cm) from $DEFENCODING to $enc\n";
787 $languages{$l}{$f}{data}{$c}{$enc} = sha1_hex($output);
788 $hashtable{sha1_hex($output)}{"${l}_${f}_${c}.$enc"} = 1;
789 print FOUT "$output# EOF\n";
793 rename("$TYPE.draft/$file.$enc.new",
794 "$TYPE.draft/$file.$enc.src");
796 rename("$TYPE.draft/$file.$enc.new",
797 "$TYPE.draft/$file.$enc.failed");
806 return if ($#filter > -1);
807 print "Creating Makefile for $TYPE\n";
813 if ($TYPE eq "colldef") {
814 $SRCOUT = "localedef -D -U -i \${.IMPSRC} \\\n" .
815 "\t-f \${MAPLOC}/map.\${.TARGET:T:R:E} " .
816 "\${.OBJDIR}/\${.IMPSRC:T:R}";
817 $MAPLOC = "MAPLOC=\t\t\${.CURDIR}/../../tools/tools/" .
818 "locale/etc/final-maps\n";
819 $SRCOUT2 = "LC_COLLATE";
821 ".for f t in \${LOCALES_MAPPED}\n" .
822 "FILES+=\t\$t.LC_COLLATE\n" .
823 "FILESDIR_\$t.LC_COLLATE=\t\${LOCALEDIR}/\$t\n" .
824 "\$t.LC_COLLATE: \${.CURDIR}/\$f.src\n" .
825 "\tlocaledef -D -U -i \${.ALLSRC} \\\n" .
826 "\t\t-f \${MAPLOC}/map.\${.TARGET:T:R:E} \\\n" .
827 "\t\t\${.OBJDIR}/\${.TARGET:T:R}\n" .
829 $SRCOUT4 = "## LOCALES_MAPPED\n";
831 elsif ($TYPE eq "ctypedef") {
832 $SRCOUT = "localedef -D -U -c -w \${MAPLOC}/widths.txt \\\n" .
833 "\t-f \${MAPLOC}/map.\${.IMPSRC:T:R:E} " .
834 "\\\n\t-i \${.IMPSRC} \${.OBJDIR}/\${.IMPSRC:T:R} " .
836 $SRCOUT2 = "LC_CTYPE";
837 $MAPLOC = "MAPLOC=\t\t\${.CURDIR}/../../tools/tools/" .
838 "locale/etc/final-maps\n";
839 $SRCOUT3 = "## SYMPAIRS\n\n" .
840 ".for s t in \${SYMPAIRS}\n" .
841 "\${t:S/src\$/LC_CTYPE/}: " .
843 "\tlocaledef -D -U -c -w \${MAPLOC}/widths.txt \\\n" .
844 "\t-f \${MAPLOC}/map.\${.TARGET:T:R:C/^.*\\.//} " .
845 "\\\n\t-i \${.ALLSRC} \${.OBJDIR}/\${.TARGET:T:R} " .
850 $SRCOUT = "grep -v -E '^(\#\$\$|\#[ ])' < \${.IMPSRC} > \${.TARGET}";
854 open(FOUT, ">$TYPE.draft/Makefile");
857 # Warning: Do not edit. This file is automatically generated from the
858 # tools in /usr/src/tools/tools/locale.
860 LOCALEDIR= \${SHAREDIR}/locale
861 FILESNAME= $FILESNAMES{$TYPE}
862 .SUFFIXES: .src .${SRCOUT2}
873 foreach my $hash (keys(%hashtable)) {
874 # For colldef, weight LOCALES to UTF-8
875 # Sort as upper-case and reverse to achieve it
876 # Make en_US, ru_RU, and ca_AD preferred
878 if ($TYPE eq "colldef") {
880 if ($a eq 'en_x_US.UTF-8' ||
881 $a eq 'ru_x_RU.UTF-8' ||
882 $a eq 'ca_x_AD.UTF-8') { return -1; }
883 elsif ($b eq 'en_x_US.UTF-8' ||
884 $b eq 'ru_x_RU.UTF-8' ||
885 $b eq 'ca_x_AD.UTF-8') { return 1; }
886 else { return uc($b) cmp uc($a); }
887 } keys(%{$hashtable{$hash}});
888 } elsif ($TYPE eq "ctypedef") {
890 if ($a eq 'en_x_US.UTF-8') { return -1; }
891 elsif ($b eq 'en_x_US.UTF-8') { return 1; }
892 if ($a =~ /^en_x_US/) { return -1; }
893 elsif ($b =~ /^en_x_US/) { return 1; }
895 if ($a =~ /^en_x_GB.ISO8859-15/ ||
896 $a =~ /^ru_x_RU/) { return -1; }
897 elsif ($b =~ /^en_x_GB.ISO8859-15/ ||
898 $b =~ /ru_x_RU/) { return 1; }
899 else { return uc($b) cmp uc($a); }
901 } keys(%{$hashtable{$hash}});
904 if ($a =~ /_Comm_/ ||
905 $b eq 'en_x_US.UTF-8') { return 1; }
906 elsif ($b =~ /_Comm_/ ||
907 $a eq 'en_x_US.UTF-8') { return -1; }
908 else { return uc($b) cmp uc($a); }
909 } keys(%{$hashtable{$hash}});
912 my $link = shift(@files);
913 $link =~ s/_x_/_/; # strip family if none there
914 foreach my $file (@files) {
915 my @a = split(/_/, $file);
916 my @b = split(/\./, $a[-1]);
918 print FOUT "SAME+=\t\t$link $file\n";
919 undef($languages{$a[0]}{$a[1]}{data}{$b[0]}{$b[1]});
924 foreach my $l (sort keys(%languages)) {
925 foreach my $f (sort keys(%{$languages{$l}})) {
926 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
927 next if ($#filter == 2 && ($filter[0] ne $l
928 || $filter[1] ne $f || $filter[2] ne $c));
929 next if (defined $languages{$l}{$f}{definitions}
930 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
931 if (defined $languages{$l}{$f}{data}{$c}{$DEFENCODING}
932 && $languages{$l}{$f}{data}{$c}{$DEFENCODING} eq "0") {
933 print "Skipping ${l}_" . ($f eq "x" ? "" : "${f}_") .
937 foreach my $e (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
939 $file .= $f . "_" if ($f ne "x");
941 next if (!defined $languages{$l}{$f}{data}{$c}{$e});
942 print FOUT "LOCALES+=\t$file.$e\n";
945 if (defined $languages{$l}{$f}{nc_link}) {
946 foreach my $e (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
948 $file .= $f . "_" if ($f ne "x");
950 print FOUT "SAME+=\t\t$file.$e $languages{$l}{$f}{nc_link}.$e\t# legacy (lang/country change)\n";
954 if (defined $languages{$l}{$f}{e_link}) {
955 foreach my $el (split(" ", $languages{$l}{$f}{e_link})) {
956 my @a = split(/:/, $el);
958 $file .= $f . "_" if ($f ne "x");
960 print FOUT "SAME+=\t\t$file.$a[0] $file.$a[1]\t# legacy (same charset)\n";
970 FILES= \${LOCALES:S/\$/.${SRCOUT2}/}
971 CLEANFILES= \${FILES}
974 SYMLINKS+= ../\$f/\${FILESNAME} \\
975 \${LOCALEDIR}/\$t/\${FILESNAME}
978 .for f in \${LOCALES}
979 FILESDIR_\${f}.${SRCOUT2}= \${LOCALEDIR}/\${f}
982 ${SRCOUT3}.include <bsd.prog.mk>