1 #!/usr/local/bin/perl -wC
11 use Digest::SHA qw(sha1_hex);
12 require "charmaps.pm";
16 print "Usage: $0 --unidir=<unidir> --etc=<etcdir> --type=<type>\n";
20 my $DEFENCODING = "UTF-8";
26 my $result = GetOptions (
27 "unidir=s" => \$UNIDIR,
38 my %translations = ();
40 my %alternativemonths = ();
46 get_utf8map("$UNIDIR/posix/$DEFENCODING.cm");
47 get_encodings("$ETCDIR/charmaps");
50 tie(%keys, "Tie::IxHash");
51 tie(%hashtable, "Tie::IxHash");
54 "monetdef" => "LC_MONETARY",
55 "timedef" => "LC_TIME",
56 "msgdef" => "LC_MESSAGES",
57 "numericdef" => "LC_NUMERIC",
58 "colldef" => "LC_COLLATE",
59 "ctypedef" => "LC_CTYPE"
63 mdorder => \&callback_mdorder,
64 altmon => \&callback_altmon,
65 cformat => \&callback_cformat,
66 dformat => \&callback_dformat,
67 dtformat => \&callback_dtformat,
68 cbabmon => \&callback_abmon,
69 cbampm => \&callback_ampm,
76 "decimal_point" => "decimal_point",
77 "thousands_sep" => "thousands_sep",
78 "grouping" => "grouping",
81 "int_curr_symbol" => "int_curr_symbol (last character always " .
83 "currency_symbol" => "currency_symbol",
84 "mon_decimal_point" => "mon_decimal_point",
85 "mon_thousands_sep" => "mon_thousands_sep",
86 "mon_grouping" => "mon_grouping",
87 "positive_sign" => "positive_sign",
88 "negative_sign" => "negative_sign",
89 "int_frac_digits" => "int_frac_digits",
90 "frac_digits" => "frac_digits",
91 "p_cs_precedes" => "p_cs_precedes",
92 "p_sep_by_space" => "p_sep_by_space",
93 "n_cs_precedes" => "n_cs_precedes",
94 "n_sep_by_space" => "n_sep_by_space",
95 "p_sign_posn" => "p_sign_posn",
96 "n_sign_posn" => "n_sign_posn",
99 "yesexpr" => "yesexpr",
100 "noexpr" => "noexpr",
101 "yesstr" => "yesstr",
105 "abmon" => "Short month names",
106 "mon" => "Long month names (as in a date)",
107 "abday" => "Short weekday names",
108 "day" => "Long weekday names",
113 "d_t_fmt" => "date_fmt",
114 "altmon" => "Long month names (without case ending)",
115 "md_order" => "md_order",
116 "t_fmt_ampm" => "ampm_fmt",
119 if ($TYPE eq "colldef") {
120 transform_collation();
124 if ($TYPE eq "ctypedef") {
129 if ($TYPE eq "numericdef") {
131 "decimal_point" => "s",
132 "thousands_sep" => "s",
140 if ($TYPE eq "monetdef") {
142 "int_curr_symbol" => "s",
143 "currency_symbol" => "s",
144 "mon_decimal_point" => "s",
145 "mon_thousands_sep" => "s",
146 "mon_grouping" => "ai",
147 "positive_sign" => "s",
148 "negative_sign" => "s",
149 "int_frac_digits" => "i",
150 "frac_digits" => "i",
151 "p_cs_precedes" => "i",
152 "p_sep_by_space" => "i",
153 "n_cs_precedes" => "i",
154 "n_sep_by_space" => "i",
155 "p_sign_posn" => "i",
163 if ($TYPE eq "msgdef") {
175 if ($TYPE eq "timedef") {
177 "abmon" => "<cbabmon<abmon<as",
182 "d_fmt" => "<dformat<d_fmt<s",
183 "c_fmt" => "<cformat<d_t_fmt<s",
184 "am_pm" => "<cbampm<am_pm<as",
185 "d_t_fmt" => "<dtformat<d_t_fmt<s",
186 "altmon" => "<altmon<mon<as",
187 "md_order" => "<mdorder<d_fmt<s",
197 my $nl = $callback{data}{l} . "_" . $callback{data}{c};
198 my $enc = $callback{data}{e};
200 if ($nl eq 'ru_RU') {
201 if ($enc eq 'UTF-8') {
204 my $converter = Text::Iconv->new("utf-8", "$enc");
205 $s = $converter->convert("дп;пп");
211 sub callback_cformat {
213 my $nl = $callback{data}{l} . "_" . $callback{data}{c};
215 if ($nl eq 'ko_KR') {
216 $s =~ s/(> )(%p)/$1%A $2/;
221 $s =~ s/^"%e\./%A %e/;
222 $s =~ s/^"(%B %e, )/"%A, $1/;
223 $s =~ s/^"(%e %B )/"%A $1/;
227 sub callback_dformat {
230 $s =~ s/(%m(<SOLIDUS>|[-.]))%e/$1%d/;
231 $s =~ s/%e((<SOLIDUS>|[-.])%m)/%d$1/;
235 sub callback_dtformat {
237 my $nl = $callback{data}{l} . "_" . $callback{data}{c};
239 if ($nl eq 'ja_JP') {
240 $s =~ s/(> )(%H)/$1%A $2/;
241 } elsif ($nl eq 'ko_KR' || $nl eq 'zh_CN' || $nl eq 'zh_TW') {
242 if ($nl ne 'ko_KR') {
245 $s =~ s/(> )(%p)/$1%A $2/;
248 $s =~ s/^"%e\./%A %e/;
249 $s =~ s/^"(%B %e, )/"%A, $1/;
250 $s =~ s/^"(%e %B )/"%A $1/;
254 sub callback_mdorder {
256 return undef if (!defined $s);
262 sub callback_altmon {
263 # if the language/country is known in %alternative months then
264 # return that, otherwise repeat mon
267 if (defined $alternativemonths{$callback{data}{l}}{$callback{data}{c}}) {
268 my @altnames = split(";",$alternativemonths{$callback{data}{l}}{$callback{data}{c}});
276 return join(";",@cleaned);
283 # for specified CJK locales, pad result with a space to enable
284 # columns to line up (style established in FreeBSD in 2001)
286 my $nl = $callback{data}{l} . "_" . $callback{data}{c};
288 if ($nl eq 'ja_JP' || $nl eq 'ko_KR' || $nl eq 'zh_CN' ||
289 $nl eq 'zh_HK' || $nl eq 'zh_TW') {
290 my @monthnames = split(";", $s);
292 foreach (@monthnames)
294 if ($_ =~ /^"<(two|three|four|five|six|seven|eight|nine)>/ ||
295 ($_ =~ /^"<one>/ && $_ !~ /^"<one>(<zero>|<one>|<two>)/))
297 $_ =~ s/^"/"<space>/;
301 return join(";",@cleaned);
306 ############################
309 my $directory = shift;
311 open(FIN, "$directory/UnicodeData.txt")
312 or die("Cannot open $directory/UnicodeData.txt");;
317 foreach my $l (@lines) {
318 my @a = split(/;/, $l);
320 $ucd{code2name}{"$a[0]"} = $a[1]; # Unicode name
321 $ucd{name2code}{"$a[1]"} = $a[0]; # Unicode code
336 foreach my $l (@lines) {
338 next if ($l =~ /^\#/);
341 if ($l eq "CHARMAP") {
346 next if (!$incharmap);
347 last if ($l eq "END CHARMAP");
349 $l =~ /^<([^\s]+)>\s+(.*)/;
352 $k =~ s/_/ /g; # unicode char string
353 $v =~ s/\\x//g; # UTF-8 char code
356 $utf8aliases{$k} = $prev_k if ($prev_v eq $v);
365 foreach my $e (sort(keys(%encodings))) {
366 if (!open(FIN, "$dir/$e.TXT")) {
367 print "Cannot open charmap for $e\n";
375 foreach my $l (@lines) {
377 next if ($l =~ /^\#/);
380 my @a = split(" ", $l);
382 $a[0] =~ s/^0[xX]//; # local char code
383 $a[1] =~ s/^0[xX]//; # unicode char code
384 $convertors{$e}{uc($a[1])} = uc($a[0]);
390 my %data = get_xmldata($ETCDIR);
391 %languages = %{$data{L}};
392 %translations = %{$data{T}};
393 %alternativemonths = %{$data{AM}};
394 %encodings = %{$data{E}};
397 sub transform_ctypes {
399 $languages{"C"}{"x"}{data}{"x"}{$DEFENCODING} = undef;
401 foreach my $l (sort keys(%languages)) {
402 foreach my $f (sort keys(%{$languages{$l}})) {
403 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
404 next if (defined $languages{$l}{$f}{definitions}
405 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
406 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 0; # unread
408 $file .= "_" . $f if ($f ne "x");
409 $file .= "_" . $c if ($c ne "x");
412 my $filename = "$UNIDIR/posix/xx_Comm_C.UTF-8.src";
413 if (! -f $filename) {
414 print STDERR "Cannot open $filename\n";
417 open(FIN, "$filename");
418 print "Reading from $filename for ${l}_${f}_${c}\n";
419 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 1; # read
427 $shex = sha1_hex(join("\n", @lines));
428 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = $shex;
429 $hashtable{$shex}{"${l}_${f}_${c}.$DEFENCODING"} = 1;
430 open(FOUT, ">$TYPE.draft/$actfile.$DEFENCODING.src");
433 foreach my $enc (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
434 next if ($enc eq $DEFENCODING);
435 $filename = "$UNIDIR/posix/$file.$DEFENCODING.src";
436 if (! -f $filename) {
437 print STDERR "Cannot open $filename\n";
441 open(FIN, "$filename");
443 if ((/^comment_char\s/) || (/^escape_char\s/)){
446 if (/^LC_CTYPE/../^END LC_CTYPE/) {
451 $uhex = sha1_hex(join("\n", @lines) . $enc);
452 $languages{$l}{$f}{data}{$c}{$enc} = $uhex;
453 $hashtable{$uhex}{"${l}_${f}_${c}.$enc"} = 1;
454 open(FOUT, ">$TYPE.draft/$actfile.$enc.src");
456 # Warning: Do not edit. This file is automatically extracted from the
457 # tools in /usr/src/tools/tools/locale. The data is obtained from the
458 # CLDR project, obtained from http://cldr.unicode.org/
459 # -----------------------------------------------------------------------------
470 sub transform_collation {
471 foreach my $l (sort keys(%languages)) {
472 foreach my $f (sort keys(%{$languages{$l}})) {
473 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
474 next if (defined $languages{$l}{$f}{definitions}
475 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
476 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 0; # unread
479 $file .= $f . "_" if ($f ne "x");
483 my $filename = "$UNIDIR/posix/$file.$DEFENCODING.src";
484 $filename = "$ETCDIR/$file.$DEFENCODING.src"
487 && defined $languages{$l}{$f}{fallback}) {
488 $file = $languages{$l}{$f}{fallback};
489 $filename = "$UNIDIR/posix/$file.$DEFENCODING.src";
491 $filename = "$UNIDIR/posix/$file.$DEFENCODING.src"
493 if (! -f $filename) {
495 "Cannot open $file.$DEFENCODING.src or fallback\n";
498 open(FIN, "$filename");
499 print "Reading from $filename for ${l}_${f}_${c}\n";
500 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 1; # read
504 if ((/^comment_char\s/) || (/^escape_char\s/)){
507 if (/^LC_COLLATE/../^END LC_COLLATE/) {
513 $shex = sha1_hex(join("\n", @lines));
514 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = $shex;
515 $hashtable{$shex}{"${l}_${f}_${c}.$DEFENCODING"} = 1;
516 open(FOUT, ">$TYPE.draft/$actfile.$DEFENCODING.src");
518 # Warning: Do not edit. This file is automatically extracted from the
519 # tools in /usr/src/tools/tools/locale. The data is obtained from the
520 # CLDR project, obtained from http://cldr.unicode.org/
521 # -----------------------------------------------------------------------------
526 foreach my $enc (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
527 next if ($enc eq $DEFENCODING);
528 copy ("$TYPE.draft/$actfile.$DEFENCODING.src",
529 "$TYPE.draft/$actfile.$enc.src");
530 $languages{$l}{$f}{data}{$c}{$enc} = $shex;
531 $hashtable{$shex}{"${l}_${f}_${c}.$enc"} = 1;
539 foreach my $l (sort keys(%languages)) {
540 foreach my $f (sort keys(%{$languages{$l}})) {
541 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
542 next if (defined $languages{$l}{$f}{definitions}
543 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
545 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 0; # unread
548 $file .= $f . "_" if ($f ne "x");
551 my $filename = "$UNIDIR/posix/$file.$DEFENCODING.src";
552 $filename = "$ETCDIR/$file.$DEFENCODING.src"
555 && defined $languages{$l}{$f}{fallback}) {
556 $file = $languages{$l}{$f}{fallback};
557 $filename = "$UNIDIR/posix/$file.$DEFENCODING.src";
559 $filename = "$UNIDIR/posix/$file.$DEFENCODING.src"
561 if (! -f $filename) {
563 "Cannot open $file.$DEFENCODING.src or fallback\n";
566 open(FIN, "$filename");
567 print "Reading from $filename for ${l}_${f}_${c}\n";
568 $languages{$l}{$f}{data}{$c}{$DEFENCODING} = 1; # read
573 foreach my $k (keys(%keys)) {
574 foreach my $line (@lines) {
576 next if (!$continue && $line !~ /^$k\s/);
583 $values{$l}{$f}{$c}{$k} = ""
584 if (!defined $values{$l}{$f}{$c}{$k});
586 $continue = ($line =~ /\/$/);
587 $line =~ s/\/$// if ($continue);
589 while ($line =~ /_/) {
591 s/\<([^>_]+)_([^>]+)\>/<$1 $2>/;
593 die "_ in data - $line" if ($line =~ /_/);
594 $values{$l}{$f}{$c}{$k} .= $line;
596 last if (!$continue);
612 # Conversion to UTF-8 can be done from the Unicode name to
613 # the UTF-8 character code.
616 die "Cannot convert $s in $e (charmap)" if (!defined $v);
619 # Conversion to these encodings can be done from the Unicode
620 # name to Unicode code to the encodings code.
623 $ucc = $ucd{name2code}{$s} if (defined $ucd{name2code}{$s});
624 $ucc = $ucd{name2code}{$utf8aliases{$s}}
627 && defined $ucd{name2code}{$utf8aliases{$s}});
630 if (defined $translations{$e}{$s}{hex}) {
631 $v = $translations{$e}{$s}{hex};
633 } elsif (defined $translations{$e}{$s}{ucc}) {
634 $ucc = $translations{$e}{$s}{ucc};
638 die "Cannot convert $s in $e (ucd string)" if (!defined $ucc);
639 $v = $convertors{$e}{$ucc} if (!defined $v);
641 $v = $translations{$e}{$s}{hex}
642 if (!defined $v && defined $translations{$e}{$s}{hex});
644 if (!defined $v && defined $translations{$e}{$s}{unicode}) {
645 my $ucn = $translations{$e}{$s}{unicode};
646 $ucc = $ucd{name2code}{$ucn}
647 if (defined $ucd{name2code}{$ucn});
648 $ucc = $ucd{name2code}{$utf8aliases{$ucn}}
650 && defined $ucd{name2code}{$utf8aliases{$ucn}});
651 $v = $convertors{$e}{$ucc};
654 die "Cannot convert $s in $e (charmap)" if (!defined $v);
657 return pack("C", hex($v)) if (length($v) == 2);
658 return pack("CC", hex(substr($v, 0, 2)), hex(substr($v, 2, 2)))
659 if (length($v) == 4);
660 return pack("CCC", hex(substr($v, 0, 2)), hex(substr($v, 2, 2)),
661 hex(substr($v, 4, 2))) if (length($v) == 6);
662 print STDERR "Cannot convert $e $s\n";
663 return "length = " . length($v);
671 return $translations{$enc}{$v} if (defined $translations{$enc}{$v});
676 foreach my $l (sort keys(%languages)) {
677 foreach my $f (sort keys(%{$languages{$l}})) {
678 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
679 next if (defined $languages{$l}{$f}{definitions}
680 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
681 foreach my $enc (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
682 if ($languages{$l}{$f}{data}{$c}{$DEFENCODING} eq "0") {
683 print "Skipping ${l}_" .
684 ($f eq "x" ? "" : "${f}_") .
689 $file .= "_" . $f if ($f ne "x");
691 print "Writing to $file in $enc\n";
693 if ($enc ne $DEFENCODING &&
694 !defined $convertors{$enc}) {
695 print "Failed! Cannot convert to $enc.\n";
699 open(FOUT, ">$TYPE.draft/$file.$enc.new");
703 # Warning: Do not edit. This file is automatically generated from the
704 # tools in /usr/src/tools/tools/locale. The data is obtained from the
705 # CLDR project, obtained from http://cldr.unicode.org/
706 # -----------------------------------------------------------------------------
708 foreach my $k (keys(%keys)) {
711 die("Unknown $k in \%DESC")
712 if (!defined $DESC{$k});
714 $output .= "#\n# $DESC{$k}\n";
716 # Replace one row with another
724 $callback{data}{c} = $c;
725 $callback{data}{k} = $k;
726 $callback{data}{f} = $f;
727 $callback{data}{l} = $l;
728 $callback{data}{e} = $enc;
729 my @a = split(/\</, substr($g, 1));
731 &{$callback{$a[0]}}($values{$l}{$f}{$c}{$a[1]});
732 $values{$l}{$f}{$c}{$k} = $rv;
734 $callback{data} = ();
737 my $v = $values{$l}{$f}{$c}{$k};
738 $v = "undef" if (!defined $v);
752 while ($v =~ /^(.*?)<(.*?)>(.*)/) {
757 my $rv = decodecldr($enc, $cm);
758 # $rv = translate($enc, $cm)
762 "Could not convert $k ($cm) from $DEFENCODING to $enc\n";
767 $v = $p1 . $rv . $p3;
773 foreach my $v (split(/;/, $v)) {
777 while ($v =~ /^(.*?)<(.*?)>(.*)/) {
785 # $rv = translate($enc,
790 "Could not convert $k ($cm) from $DEFENCODING to $enc\n";
806 $languages{$l}{$f}{data}{$c}{$enc} = sha1_hex($output);
807 $hashtable{sha1_hex($output)}{"${l}_${f}_${c}.$enc"} = 1;
808 print FOUT "$output# EOF\n";
812 rename("$TYPE.draft/$file.$enc.new",
813 "$TYPE.draft/$file.$enc.src");
815 rename("$TYPE.draft/$file.$enc.new",
816 "$TYPE.draft/$file.$enc.failed");
825 print "Creating Makefile for $TYPE\n";
831 if ($TYPE eq "colldef") {
832 $SRCOUT = "localedef \${LOCALEDEF_ENDIAN} -D -U " .
833 "-i \${.IMPSRC} \\\n" .
834 "\t-f \${MAPLOC}/map.\${.TARGET:T:R:E:C/@.*//} " .
835 "\${.OBJDIR}/\${.IMPSRC:T:R}";
836 $MAPLOC = "MAPLOC=\t\t\${.CURDIR}/../../tools/tools/" .
837 "locale/etc/final-maps\n";
838 $SRCOUT2 = "LC_COLLATE";
840 ".for f t in \${LOCALES_MAPPED}\n" .
841 "FILES+=\t\$t.LC_COLLATE\n" .
842 "FILESDIR_\$t.LC_COLLATE=\t\${LOCALEDIR}/\$t\n" .
843 "\$t.LC_COLLATE: \${.CURDIR}/\$f.src\n" .
844 "\tlocaledef \${LOCALEDEF_ENDIAN} -D -U " .
845 "-i \${.ALLSRC} \\\n" .
846 "\t\t-f \${MAPLOC}/map.\${.TARGET:T:R:E:C/@.*//} \\\n" .
847 "\t\t\${.OBJDIR}/\${.TARGET:T:R}\n" .
849 $SRCOUT4 = "## LOCALES_MAPPED\n";
851 elsif ($TYPE eq "ctypedef") {
852 $SRCOUT = "localedef \${LOCALEDEF_ENDIAN} -D -U -c " .
853 "-w \${MAPLOC}/widths.txt \\\n" .
854 "\t-f \${MAPLOC}/map.\${.IMPSRC:T:R:E} " .
855 "\\\n\t-i \${.IMPSRC} \${.OBJDIR}/\${.IMPSRC:T:R} " .
857 $SRCOUT2 = "LC_CTYPE";
858 $MAPLOC = "MAPLOC=\t\t\${.CURDIR}/../../tools/tools/" .
859 "locale/etc/final-maps\n";
860 $SRCOUT3 = "## SYMPAIRS\n\n" .
861 ".for s t in \${SYMPAIRS}\n" .
862 "\${t:S/src\$/LC_CTYPE/}: " .
864 "\tlocaledef \${LOCALEDEF_ENDIAN} -D -U -c " .
865 "-w \${MAPLOC}/widths.txt \\\n" .
866 "\t-f \${MAPLOC}/map.\${.TARGET:T:R:C/^.*\\.//} " .
867 "\\\n\t-i \${.ALLSRC} \${.OBJDIR}/\${.TARGET:T:R} " .
872 $SRCOUT = "grep -v -E '^(\#\$\$|\#[ ])' < \${.IMPSRC} > \${.TARGET}";
876 open(FOUT, ">$TYPE.draft/Makefile");
879 # Warning: Do not edit. This file is automatically generated from the
880 # tools in /usr/src/tools/tools/locale.
882 LOCALEDIR= \${SHAREDIR}/locale
883 FILESNAME= $FILESNAMES{$TYPE}
884 .SUFFIXES: .src .${SRCOUT2}
888 if ($TYPE eq "colldef" || $TYPE eq "ctypedef") {
890 .include <bsd.endian.mk>
905 foreach my $hash (keys(%hashtable)) {
906 # For colldef, weight LOCALES to UTF-8
907 # Sort as upper-case and reverse to achieve it
908 # Make en_US, ru_RU, and ca_AD preferred
910 if ($TYPE eq "colldef") {
912 if ($a eq 'en_x_US.UTF-8' ||
913 $a eq 'ru_x_RU.UTF-8' ||
914 $a eq 'ca_x_AD.UTF-8') { return -1; }
915 elsif ($b eq 'en_x_US.UTF-8' ||
916 $b eq 'ru_x_RU.UTF-8' ||
917 $b eq 'ca_x_AD.UTF-8') { return 1; }
918 else { return uc($b) cmp uc($a); }
919 } keys(%{$hashtable{$hash}});
920 } elsif ($TYPE eq "ctypedef") {
922 if ($a eq 'C_x_x.UTF-8') { return -1; }
923 elsif ($b eq 'C_x_x.UTF-8') { return 1; }
924 if ($a =~ /^en_x_US/) { return -1; }
925 elsif ($b =~ /^en_x_US/) { return 1; }
927 if ($a =~ /^en_x_GB.ISO8859-15/ ||
928 $a =~ /^ru_x_RU/) { return -1; }
929 elsif ($b =~ /^en_x_GB.ISO8859-15/ ||
930 $b =~ /ru_x_RU/) { return 1; }
931 else { return uc($b) cmp uc($a); }
933 } keys(%{$hashtable{$hash}});
936 if ($a =~ /_Comm_/ ||
937 $b eq 'en_x_US.UTF-8') { return 1; }
938 elsif ($b =~ /_Comm_/ ||
939 $a eq 'en_x_US.UTF-8') { return -1; }
940 else { return uc($b) cmp uc($a); }
941 } keys(%{$hashtable{$hash}});
944 my $link = shift(@files);
945 $link =~ s/_x_x//; # special case for C
946 $link =~ s/_x_/_/; # strip family if none there
947 foreach my $file (@files) {
948 my @a = split(/_/, $file);
949 my @b = split(/\./, $a[-1]);
951 print FOUT "SAME+=\t\t$link $file\n";
952 undef($languages{$a[0]}{$a[1]}{data}{$b[0]}{$b[1]});
957 foreach my $l (sort keys(%languages)) {
958 foreach my $f (sort keys(%{$languages{$l}})) {
959 foreach my $c (sort keys(%{$languages{$l}{$f}{data}})) {
960 next if (defined $languages{$l}{$f}{definitions}
961 && $languages{$l}{$f}{definitions} !~ /$TYPE/);
962 if (defined $languages{$l}{$f}{data}{$c}{$DEFENCODING}
963 && $languages{$l}{$f}{data}{$c}{$DEFENCODING} eq "0") {
964 print "Skipping ${l}_" . ($f eq "x" ? "" : "${f}_") .
968 foreach my $e (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
970 $file .= "_" . $f if ($f ne "x");
971 $file .= "_" . $c if ($c ne "x");
972 next if (!defined $languages{$l}{$f}{data}{$c}{$e});
973 print FOUT "LOCALES+=\t$file.$e\n";
976 if (defined $languages{$l}{$f}{nc_link}) {
977 foreach my $e (sort keys(%{$languages{$l}{$f}{data}{$c}})) {
979 $file .= $f . "_" if ($f ne "x");
981 print FOUT "SAME+=\t\t$file.$e $languages{$l}{$f}{nc_link}.$e\t# legacy (lang/country change)\n";
985 if (defined $languages{$l}{$f}{e_link}) {
986 foreach my $el (split(" ", $languages{$l}{$f}{e_link})) {
987 my @a = split(/:/, $el);
989 $file .= $f . "_" if ($f ne "x");
991 print FOUT "SAME+=\t\t$file.$a[0] $file.$a[1]\t# legacy (same charset)\n";
1001 FILES= \${LOCALES:S/\$/.${SRCOUT2}/}
1002 CLEANFILES= \${FILES}
1004 .for f t in \${SAME}
1005 SYMLINKS+= ../\$f/\${FILESNAME} \\
1006 \${LOCALEDIR}/\$t/\${FILESNAME}
1009 .for f in \${LOCALES}
1010 FILESDIR_\${f}.${SRCOUT2}= \${LOCALEDIR}/\${f}
1013 ${SRCOUT3}.include <bsd.prog.mk>