Pages

自己紹介

某IT技術情報誌に連載記事を持っていたテクニカルライター。またもや休刊してしまったよ。
Copyright © 2011-2016 Daregada. All rights reserved. Powered by Blogger.

KeySnailのエキサイト翻訳クライアント(1.11)プラグインが動作しない問題

2011-02-27

KeySnailの「エキサイト翻訳クライアント on KeySnail」(1.11)プラグインの英和・和英翻訳処理が、エキサイト翻訳ページの構成変更によって正常動作しなくなっているのを、プラグインの修正でなんとかするよ、という話。(追記:2012-01-05) 本家リポジトリでこの問題が修正されたプラグイン(1.12)が公開された。以下の記述は参考として残しておく。

Abstract

理由
2010年8月ごろに、エキサイト翻訳の英語(英和・和英)翻訳ページの文字エンコーディングがUTF-8に変更され、(それと同時に?)GETメソッドに対する反応も変更されたため
対策
JavaScriptで書かれた「エキサイト翻訳クライアント on KeySnail」プラグイン(1.11)を以下のように修正する
おまけ
結果表示を一定時間の経過で消す修正など

理由

Firefox用のアドオン「KeySnail」や「エキサイト翻訳クライアント on KeySnail」プラグインが何をするものなのかといったことは、この記事を読みに来る方には自明だと思うので説明しない。

なお、執筆時点の「エキサイト翻訳クライアント on KeySnail」プラグインの最新バージョンは1.11だ。以下では、これを単に「プラグイン」と記述する。

現状では、このプラグインを利用した英和・和英翻訳が正常に行なわれないという問題が生じている。これは、2010年8月ごろに、エキサイト翻訳の英語(英和・和英)翻訳ページの構成が変更されたためだ。プラグインに関係するのは以下の2点だ。

  1. 文字エンコーディングがUTF-8に変更された(以前は英語翻訳ページのみShift_JIS)
  2. GETメソッドによるクエリーでは訳文が表示されない

1は、他の翻訳ページ(ドイツ語など)と共通のエンコーディングになったことを意味する。プラグインに含まれる(英語翻訳ページのみを対象とした)Shift_JIS変換処理をすべて取り除くことができるので歓迎すべき変更だ。

2は、現時点では英語翻訳ページにのみ見られる現象で、ドイツ語翻訳ページなどではGETメソッドのままでも訳文が表示される。ブックマークレットなら、開いたページでユーザーが"翻訳"ボタンを押せばいいだけの話だが、Ajaxによる非同期処理で訳文を取得するプラグインでは、POSTメソッドに変更する必要がある。

対策

対策としては、プラグインから「Shift_JIS変換処理を取り除く」とともに、「POSTメソッドによるクエリーを行なう」ようにすればいい。

プラグインはFirefoxのプロファイル(Windows Vista/7では、"C:\Users\ユーザー名\AppData\Roaming\Mozilla\Firefox\Profiles\英数文字列.default"、UNIX系OSでは"~/.mozilla/firefox/英数文字列.default"など)の"keysnail/plugins"以下に配置されている。ファイル名は"excite_translation.ks.js"だ。好みのテキストエディターで内容を書き換えればいい(バックアップなどは各自の判断で)。

  • Shift_JIS変換処理を取り除く
    1. readString()の内容で、英語翻訳のみ特別扱いしていた部分を修正 を、以下の内容に置き換える
    2. EscapeSJIS()およびJCT11280()は不要になったので、両者とも関数自体を削除
  • POSTメソッドによるクエリーを行なう
    1. readString()で変数uriに設定されるURI末尾の?を削除 を以下の内容に置き換える
    2. readString()の内容で、GETメソッドをPOSTメソッドに変更 を以下の内容に置き換える。POSTメソッドでクエリーを送るには、setRequestHeader()でコンテントタイプの指定が必要なことに注意

おまけ

和英・英和翻訳処理を正常化するだけなら、上記の修正で十分だ。以下は筆者の趣味による修正である。

ひとつは、「結果表示を一定時間経過で消す」ものだ。このプラグインの登場後に(というか、このプラグインに影響されて)、KeySnailのdisplay.prettyPrint()に追加された第2引数を使って、表示時間そのものと表示開始・終了時のフェード時間を指定する。

もうひとつは、「XMLHttpRequest()呼び出しの単純化」だ。KeySnail自体、Firefoxでしか動作しないのだから、IEなどを考慮してカプセル化されたcreateHttpRequest()を削除して、XMLHttpRequest()を直接呼び出す。

  • 結果表示を一定時間経過で消す方法
    1. readString()で使われているdisplay.prettyPrint()に第2引数を追加する。具体的には、 を、以下の内容に置き換える。 ちなみに、timeoutが表示時間、fadeが表示開始・終了時のフェード処理の時間だ。それぞれの値(ミリ秒単位)は各自の好みで調整されたい
  • XMLHttpRequest()呼び出しの単純化
    1. readString()の内容で、XMLHttpRequest()呼び出しを修正 を以下の内容に置き換える
    2. createHttpRequest()は不要になったので、関数自体を削除

なお、以上の修正をすべて行なうパッチを用意した。手作業で修正するのが面倒な人(なおかつpatchの使い方は知っている人)はどうぞ。

2 件のコメント

  1. 初めまして。excite_translation 作者の gongo と申します。
    こちらの記事を参考にさせていただき、リポジトリの方も更新しました。

    https://github.com/gongo/keysnail_plugin/blob/master/excite_translation.ks.js

    ありがとうございました!


    以上、ご報告まで。

    返信削除
  2. リポジトリの更新ありがとうございます。
    記事のリードを一部修正し、リポジトリへのリンクを張りました。

    返信削除