Movable Type 3.0 日本語版ベータ2
Movable Type 3.0 日本語版ベータ2が公開されています。これは本家の方でリリースされた3.01DEのコードフリーズ直前のバージョンに日本語化とバグフィックスを施したものになっていて、本家ではそのままリリースされてしまったバグが直っているというご利益付きです。
Movable Type 日本語版サイト: Movable Type 3.0 日本語版ベータ2のご提供
この日本語版ベータ2では、Ogawa::Memoranda: Movable Type 3.0DEのバグフィックスで述べてきたバグをほぼ全面的に取り入れていただけました。とりわけ問題の多かったMTCommentFieldsに関しては、JavaScriptでフィルする方法ではなく、MTCommentFieldsの定義自体を修正することによって対応がなされています。望ましい修正だと思われます。
ただ、escape、unescapeの代わりに可能であればencodeURIComponent、decodeURIComponentを使うようにするというのは取り入れられませんでした。現状の大半のブラウザはECMA-262 3rd Editionに準拠しており、encodeURIComponent、decodeURIComponentが実装されていますが、Macではまだこれに準拠していないブラウザを利用しているユーザがかなりいるというのがその理由のようです。したがって、Ogawa::Memoranda: Movable Type 3.0のCookieで述べているように、Typekeyで日本語のnicknameを付けた場合にはComment Previewなどで文字化けが生じ得ます。
この問題を突き詰めて考えるとこうなります。
Typekeyではないコメンター情報は、完全にJavaScriptのみによってハンドルされます。したがって、それがどのような形式でクッキーに格納されるのかはブラウザにしか関わりのない問題です。それがobsoleteなescape、unescapeであっても、encodeURIComponent、decodeURIComponentであっても、要は整合性がありさえすれば期待する動作をします。後者の方がより望ましいですが、3.01DEや日本語版ベータ2のように前者でも構いません。
Typekeyのコメンター情報は、クッキーへの格納はMovable Typeが行いますが、取り出しはMovable Type自身でやっている部分とJavaScriptでやっている部分が混在しています。前者は格納方法と取り出し方法が整合していますから文字化けは生じません。しかし、後者は整合しません。UTF-8に変換された上でURLエンコーディングした形式で格納され、unescapeで取り出すことになります(そして失敗します)。
しかしよく考えると、Typekeyのコメンター情報をJavaScriptを使ってクッキーから取り出す局面は、MTCommentFieldsが「getCookie("commenter_name"))」というコードを生成する部分しかないのです。これを止めてMTCommentFields生成時にMTがクッキーを読み込むことにすれば、Typekeyのコメンター情報は完全にMovable Typeのみによってハンドルされることになります。
これ以降に書かれている修正はMT3.0日本語版ベータ3以降にすでに含まれています。これらのバージョンをお使いの場合は以下の修正は不要です。
これを実現するためには、lib/MT/Template/Context.pmの1141行目あたりに以下のコードを追加します。
my $class = $ENV{MOD_PERL} ? 'Apache::Cookie' : 'CGI::Cookie';
eval "use $class;";
my $cookies = $class->fetch;
my $commenter_name = "";
if ($cookies && $cookies->{commenter_name} && $cookies->{commenter_name}->value()) {
$commenter_name = MT::I18N::encode_text($cookies->{commenter_name}->value(),'utf-8','');
}
if ($registration_required) {
その上で1145行目の「<script>document.write(getCookie("commenter_name"))</script>」を「$commenter_name」に、1201行目の「getCookie("commenter_name")」を「'$commenter_name'」に書き換えます。
これだけです。ノークレーム、ノーリターンでおながいします。diffは以下の通り。
--- lib/MT/Template/Context.pm.bak 2004-07-09 10:56:56.000000000 +0900
+++ lib/MT/Template/Context.pm 2004-07-09 20:29:04.000000000 +0900
@@ -1139,0 +1140,8 @@
+
+ my $class = $ENV{MOD_PERL} ? 'Apache::Cookie' : 'CGI::Cookie';
+ eval "use $class;";
+ my $cookies = $class->fetch;
+ my $commenter_name = "";
+ if ($cookies && $cookies->{commenter_name} && $cookies->{commenter_name}->value()) {
+ $commenter_name = MT::I18N::encode_text($cookies->{commenter_name}->value(),'utf-8','');
+ }
@@ -1145 +1153 @@
-<script>document.write(getCookie("commenter_name"))</script>
+$commenter_name
@@ -1201 +1209 @@
- document.write('<MT_TRANS phrase="Thanks for signing in, ">', getCookie("commenter_name"), '<MT_TRANS phrase=". Now you can comment."> (<a href="$path$comment_script?__mode=handle_sign_in&$static_arg&entry_id=$entry_id&logout=1"><MT_TRANS phrase="sign out"></a>)');
+ document.write('<MT_TRANS phrase="Thanks for signing in, ">', '$commenter_name', '<MT_TRANS phrase=". Now you can comment."> (<a href="$path$comment_script?__mode=handle_sign_in&$static_arg&entry_id=$entry_id&logout=1"><MT_TRANS phrase="sign out"></a>)');
ベータサイトにバグ報告しておいた、PublishCharsetをShift_JIS、EUC-JPなどにしている場合に「メインメニュー」の「MOVABLE TYPEニュース」がUTF-8のまま出力されるために文字化けする問題はnaoyaさんが解決されています。
このエントリーのトラックバックURL: http://as-is.net/mt/mt-tb.cgi/155
素早くかつ丁寧な解説付きの改善方法で、非常に役に立ちます。
早速試させていただきます。本当にありがとうございます。