SubTranslate

提供:きまぐれ手記 Kimagurenote
移動先: 案内検索
当サイトではアフィリエイト広告を掲載しています
English information available at mw:Extension:SubTranslate
原文が日本語のページ英語フランス語中国語に機械翻訳した例。このようにページを必要に応じて自動翻訳できる

Extension:SubTranslate は、言語コード付きサブページを開くと自動的に DeepL API を呼び出して機械翻訳するMediaWiki用の自作Extension(拡張機能)

例えばfullurlが https://yourwiki.example.com/wiki/Article のページをフランス語で読みたいときは、https://yourwiki.example.com/wiki/Article/fr を開くと自動で機械翻訳される。

ユーザー目線では Google translate(Webサイトをまるごと翻訳できる)などを使えば済むのだが、Webサイト側で自動翻訳機能を提供したい場合に便利かも?

DeepLの翻訳は専門用語等を含めてGoogleよりも読みやすい翻訳になることが多いが、本格的に使おうとするとAPI使用料がけっこうかかるので、使いどころが悩ましいかも(^^;

DeepL API Free(制限付きの無料版)と DeepL API Pro(有料版)どちらも使える。DeepL API Business(大規模商用サイト向け)は不明。

初期設定 Setting

Download

SubTranslate_20230921.zip (7KB)

Download and unzip it on your MediaWiki extensions directory.

You can use it freely at your own risk. I license it under the Revised BSD License.

English installation guide is here.

LocalSettings.php

Edit LocalSettings.php file to add below.

LocalSettings.php 
/* Extension:SubTranslate */
wfLoadExtension( 'SubTranslate' );
/* if you use DeepL API Free plan */
$wgSubTranslateAPIKey['api-free.deepl.com'] = "<your auth-key here>";
/* if you use DeepL API Pro plan */
$wgSubTranslateAPIKey['api.deepl.com'] = "<your auth-key here>";
/* Enabled subpages in NS_MAIN */
$wgNamespacesWithSubpages[NS_MAIN] = true;

And check Special:Version on your wiki.

追加設定 Additional settings

タイムアウト

このExtensionは、DeepL API の呼び出しタイムアウトを規定で5秒にしている。

5秒くらいあれば翻訳できることが多いが、ページの長さや言語によっては翻訳に時間がかかることがあるので、翻訳がタイムアウトする(規定の空ページが表示される)場合はタイムアウト時間を延ばしてみると良いかも。

LocalSettings.php 
$wgSubTranslateTimeout = 7.5;

キャッシュ

LocalSettings.php に下記の設定をすると、object cache を使って翻訳結果を一時保存できる。

LocalSettings.php 
$wgSubTranslateCaching = true;
$wgSubTranslateCachingTime = 604800;	/* 7日(1週間) */

API呼び出しと翻訳に時間がかかることはもちろん、繰り返しAPIを呼ぶとそのぶん利用料金が嵩むので、差し支えない範囲でキャッシュ保持時間を長めに設定しておくと良いだろう。

ちなみに翻訳元のページを編集するとキャッシュが無効になる(再度翻訳される)ので特段メンテナンス不要。

もし明示的にキャッシュデータをクリアしたい場合は、LocalSetting.php に下記の設定をしてから該当ページを再読込する

LocalSettings.php 
$wgSubTranslateCaching = true;
$wgSubTranslateCachingTime = false;
Purgeは本Extensionには機能しない。空編集でも再翻訳されるが、この場合は古いキャッシュはクリアされず期限切れまで残ることになる。

ボット拒否

自動翻訳ページを検索エンジンに拾ってほしくない場合など、自動翻訳ページに限ってボット拒否を設定できるようにした。(v1.0.2-)

LocalSettings.php 
$wgSubTranslateRobotPolicy = "noindex,nofollow";

この設定値は本Extensionで自動翻訳されたページにのみ適用される。他の通常ページに関しては、mw:Manual:Noindexmw:Manual:$wgExemptFromUserRobotsControl および mw:Manual:$wgDefaultRobotPolicy を参照。

名前空間

このExtensionは NS_MAIN でのみ動作する。例えばテンプレートやトークページなどは翻訳できない。

$wgContentNamespaces を指定して他の名前空間(カスタム名前空間)を記事に使っていて、そこでも機械翻訳を使いたい場合は、その名前空間でも $wgNamespacesWithSubpages を設定してサブページを有効にする必要がある。

FAQ

対応言語コード

ページ名の後に付加する言語コードの大文字・小文字は区別されない

言語コードは ISO 639-1 準拠の英字2文字(と一部のサブタグ)だが、DeepL が対応している言語のみ使える。対応言語コードは下記の通り。

ちなみに上記の言語コードはソースコードにハードコートしているので、DeepL側で新しい言語に追加対応しても、ソースコードを書き換えないと使えない。

言語コードは小文字表記が推奨されているが、DeepL API に渡すときには大文字にするので、上の一覧では大文字で表記している。
最新の対応言語はAPIを呼んで取得できるのだが、そのためだけに都度APIを呼んで遅くするのも…と思って。

Wikiページ内からリンクを貼りたい

[{{fullurl:ページ名}}/en English] のように、マジックワードを使うと手軽。

サブページが存在する場合

同名のサブページにすでに記事が存在する場合は、本Extensionは動作しない。

ただし、MediaWikiでは英字の大小文字を区別するが、本Extensionでは区別しないので、例えば「記事名/en」が存在しても、「記事名/En」や「記事名/EN」が存在しなければ、それを開くと機械翻訳を利用できる。

見出しに付加される言語名を装飾する

本Extensionの v1.0.1 より、見出し ‎<H1>...‎</H1> を「元の記事名 (翻訳した言語名)」に書き換えるようにした。

言語名には <span class="targetlang"> を付加しているので、MediaWiki:Common.css で装飾できる。 例:

MediaWiki:Common.css 
H1 SPAN.targetlang {
	font-size: smaller;
}

もし他の見出しを書き換えるExtension等と競合する場合は、下記の設定により、この機能を無効にできる。

LocalSettings.php 
$wgSubTranslateSuppressLanguageCaption = true;

{{BASEPAGENAME}}を使う

{{PAGENAME}}マジックワード)を使って記事名を本文中に埋め込みたい場合は、替わりに{{BASEPAGENAME}}を使うようにする。

{{PAGENAME}}を使っていると、本Extensionで翻訳される各言語のページでは、後ろに言語コードが付いた状態で翻訳される(例えば英語ページでは「記事名/en」となる)。

エラーメッセージを表示したい

API呼出等でエラーになっても、本Extensionは特段のエラーメッセージ等を表示せず、静かに終了する。

うまく動かなくて困っている場合は、LocalSettings.php でerror_reportingを指定すると、エラーメッセージが表示されるようになる。

LocalSettings.php 
error_reporting( E_ALL );

例えばAPIがタイムアウトした場合は、「Warning: file_get_contents(…): failed to open stream: HTTP request failed!」といった警告メッセージが表示される。これが頻繁に起きる場合はタイムアウト時間を延ばす方が良いと思う。

その他

記事のサイズ(とJSONエンコード等のオーバーヘッドを含めて)が128KiB以上になると、DeepL API の制限により、このExtensionは動作しない。

DeepL以外には今のところ対応予定なし(DeepLは無料で使えたから試しに書いてみようと思えたが、わざわざ開発用に自腹で料金を払ってまで対応したいとも思えないので…)

DeepL API は翻訳の質は高くて使いやすいが、本格的に使おうとするとけっこう費用がかかる(無料で使えるのは月に500,000文字まで、有料プランは無制限だが月々3130円~、使うだけ料金が上がる)ので、筆者のような貧乏サイトには手が届かないかも(^^;。商用サイトでMediaWikiを使っている所はあまり知らないが、もしあれば。

History

Links

Related articles