Type-Map (var)の作成
前回、ウェブページの国際化に関して書きました。結論としては、type-mapを使って、.varファイルを作成すれば良いということでした。このtype-mapファイル作成を手作業でやるのは面倒ですので、生成スクリプトmktypemap.pl.zipを作りました。
使い方は以下の通りです。
カレントディレクトリのhtmlファイルとjpgファイルに対してlvarファイルを作成します。
mktypemap.pl *.html
カレントディレクトリのファイル全部を対象とし、既にvarファイルがあるときは上書きします。
mktypemap.pl -f .
ここでは、"foo.php"に対して国際化されたファイルが"foo.ja.php"もしくは"foo.php.ja"の形式に対応します。
中身は以下のようなものです。
基本的に各々のファイルに対して言語違いファイルを捜して、それらをまとめて".var"ファイルを作成します。
#!/usr/bin/perl
$Usage = "$0 [-h] [-S[imulate]] [-force] [-quiet] [--] files_to_create_var\n";
$Simulate_Mode = 0; #-- all procedure is simulated without creating files.
$Verbose = 1; #-- print out many messages.
$ForceOverwrite = 0; #-- When not set, .var file isn't created if exist.
#--- interpret the command-line arguments
while (defined($ARGV[0])) {
# print STDERR "$ARGV[0]\n";
if ($ARGV[0] =~ /^-D.*/) {
$Debug = 1;
} elsif ($ARGV[0] =~ /^-q.*/) {
$Verbose = 0;
} elsif ($ARGV[0] =~ /^-f.*/) {
$ForceOverwrite = 1;
} elsif ($ARGV[0] =~ /^-S.*/) {
$Simulate_Mode = 1;
} elsif ($ARGV[0] =~ /^-.*/) {
print STDERR "$Usage";
exit 0;
} elsif ($ARGV[0] =~ /^--/) {
shift(@ARGV); last;
} else {
last;
}
shift(@ARGV);
}
#--- checking to set the necessary variables.
#--- DebugPrint function
#$Debug = 1;
sub Dprint { if (defined($Debug)) { printf STDERR "DBG @_"; } return 0; }
Dprint "ARGS($#ARGV): @ARGV\n";
#--- If there are no files in arguments, all files in the current directory should be checked.
if ($#ARGV < 0 || $ARGV[0] eq ".") {
@files = glob("*");
} else {
@files = @ARGV;
}
#--- Create file list
%typemap_created = (); #--- type-map file created by the program.
foreach my $fle (@files) {
my ($bdy, $lng, $ext);
if (!-f $fle || -d $fle || $fle =~ m|\.var$|i) {
next;
} elsif ($fle =~ m|~$|i) {
next;
} elsif ($fle =~ /\.(html|htm)$/i) {
#--- at this moment, html is a dummy to transfer to php.
next;
} elsif ($fle =~ m|^(.*)\.([^.]{2})(\.[^.]+)$|i) {
#--- like foo.de.html
($bdy, $lng, $ext) = ($1, $2, $3);
Dprint "(FILE 1: ($fle)($bdy, $lng, $ext)\n";
} elsif ($fle =~ m|^(.*)(\.[^.]+)\.([^.]{2})$|i) {
#--- like foo.html.de
($bdy, $lng, $ext) = ($1, $3, $2);
Dprint "(FILE 2: ($fle)($bdy, $lng, $ext)\n";
} elsif ($fle =~ m|^(.*)\.([^.]{2})$|i) {
#--- like foo.de
($bdy, $lng, $ext) = ($1, $2, "");
Dprint "(FILE 3: ($fle)($bdy, $lng, $ext)\n";
} elsif ($fle =~ m|^(.*)(\.[^.]+)$|i) {
#--- like foo.html
($bdy, $lng, $ext) = ($1, "ja", $2);
Dprint "(FILE 4: ($fle)($bdy, $lng, $ext)\n";
} else {
next;
}
if ($lng eq "js" || $ext eq ".js") {
#-- should be a java script file.
next;
}
if (!$ForceOverwrite && -f "$bdy.var") {
next;
} elsif (exists($typemap_created{"$bdy.var"})) {
next;
}
my $str = CreateTypeMap($bdy, $ext);
if (length($str) > 0) {
my $fvar = "${bdy}.var";
if (!$Simulate_Mode) {
open(FOUT, ">$fvar") or next;
printf FOUT "$str";
close(FOUT);
}
$typemap_created{$fvar} = 1;
}
}
exit 0;
#--- Creating contents of type map file
sub CreateTypeMap {
my ($bdy, $ext) = @_;
my @grpfiles = glob("${bdy}${ext} ${bdy}.*${ext} ${bdy}${ext}.??");
Dprint "CreateTypeMap: ($bdy, $ext)\n";
Dprint "@grpfiles\n";
my $s = "";
foreach (@grpfiles) {
my ($b, $l, $e);
Dprint "CreateTypeMap: ($_)\n";
if (!-f $ || -d $ || /\.var$/i) {
next;
} elsif (/~$/i) {
next;
} elsif (/\.(html|htm)$/i) {
#--- at this moment, html is a dummy to transfer to php.
next;
} elsif (/^(.*)\.([^.]{2})(\.[^.]+)$/) {
#--- like foo.de.php
($b, $l, $e) = ($1, $2, $3);
} elsif (/^(.*)(\.[^.]+)\.([^.]{2})$/) {
#--- like foo.php.de
($b, $l, $e) = ($1, $3, $2);
} elsif (/^(.*)\.([^.]{2})$/i) {
#--- like foo.de
($b, $l, $e) = ($1, $2, "");
} elsif (/^(.*)(\.[^.]+)$/) {
#--- like foo.php
($b, $l, $e) = ($1, "ja", $2);
} else {
next;
}
if ($l eq "js" || $e eq ".js") {
#-- should be a java script file.
next;
}
Dprint "CreateTypeMap: ($b, $l, $e)\n";
my $hder = "URI: $_\nContent-Language: $l";
$cty = GetContenttype($e);
if ($cty eq "text/html") {
$chs = GetCharset($l);
$ctyp = "Content-type: text/html; charset=$chs\n";
} else {
$ctyp = "Content-type: $cty\n";
}
if (length($s) > 0) {
$s .= "\n";
}
$s .= "$hder\n$ctyp";
}
#if (length($s) > 0) {
# $s = "URI: $bdy; vary=\"type,language\"\n\n" . $s;
#}
Dprint "$s\n";
return $s;
}
#--- Get the charset
sub GetCharset {
my ($lg) = @_;
my $c;
if ($lg eq "ja") {
$c = "UTF-8";
} else {
$c = "ISO-8859-1";
}
return $c;
}
#--- Get the content type
sub GetContenttype {
my ($e) = @_;
my $c;
if ($e =~ /(jpg|jpeg)$/i) {
$c = "image/jpeg";
} elsif ($e =~ /gif$/i) {
$c = "image/gif";
} elsif ($e =~ /png$/i) {
$c = "image/png";
} elsif ($e =~ /(php|html|htm)$/i) {
$c = "text/html";
} elsif ($e =~ /zip$/i) {
$c = "application/zip";
} elsif ($e =~ /(tgz|tar)$/i) {
$c = "application/x-tar";
} else {
$c = "application/octet-stream";
}
return $c;
}
なお、このコードでは、"#--- at this moment, html is a dummy to transfer to
php."のところにあるように、".html"に対しては".var"ファイルを作成しません。これは私は".php"としてコンテンツを作成している
ためで、".html"は昔からあるコンテンツや外部からのリンクが切れないように転送ページを置いています。
このファイルは以下のようなものです。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang="ja">
<head>
<title>301 Moved Permanently</title>
<meta http-equiv="refresh" CONTENT="0;URL=index.var">
<meta name="robots" content="NOINDEX,NOFOLLOW">
</head>
<body>
このページは、<a href="index.var">http://www.nikep.net/</a>に移転しました。
自動転送されない場合は、このアイコン<a href="index.var"><img src="home3.png"></a>を
押して下さい。<br/>
Requested page was transfered to <a href="index.var">http://www.nikep.net/</a>.
If you can see this text, please click the following icon <a href="index.var">
<img src="home3.png" alt="nikep"></a>.
</body>
</html>