RuneTranslate が NScripter / ONScripter のビジュアルノベルを翻訳できるようになりました
RuneTranslate が NScripter と ONScripter のビジュアルノベルを英語と30以上の言語へ翻訳できるようになりました — XOR-0x84 で難読化された nscript.dat をデコードし、Shift-JIS / CP932 のテキストとラテン文字始まりの行のパーサー落とし穴に対応し、タイトル画面・メニュー・ボタンに焼き込まれた日本語まで翻訳します。ゲームフォルダーを指定し、自動検出、翻訳、そのまま遊べるコピーとして書き出し。新規追加 — 読み込めないゲームがあれば報告してください。
RuneTranslate が、日本のビジュアルノベルで最も古い方言のひとつを話せるようになりました。NScripter と、そのオープンソースの双子である ONScripter です。謎めいた .dat ファイルと Shift-JIS スクリプトが詰まったフォルダーとして配布される、あの古典的な同人 VN を翻訳してみたいと思ったことがあるなら — これは歴史的に手作業でこじ開けるのが最も骨の折れるエンジン系統であり、機械翻訳ツールがたいてい素通りしてきた対象です。RuneTranslate は今やこれを検出し、スクリプトのテキストを読み取り、タイトル画面やメニューボタンに描き込まれた日本語まで翻訳します。
これは 新しく追加されたエンジン です。ですので何よりもまず — RuneTranslate を NScripter / ONScripter のゲームに向けて読み込めない、あるいは検出されない場合は、ぜひ教えてください。これについては末尾で詳しく触れます。
NScripter と ONScripter が実際に何なのか
NScripter は Naoki Takahashi が作成した Windows 向けのビジュアルノベル・スクリプトエンジンで、おおよそ 1999 年から 2018 年まで開発されました(最後のポイントリリースである 3.10.102 は 2018 年 2 月付ですが、意味のある機能追加は 2000 年代初頭以降、劇的に鈍化しました)。オープンソースになったことは一度もありませんが、そのライセンスはロイヤリティ不要の個人利用 および 商用利用を許可しており、それが — 組み込みのアーカイブパッカーと、強力かつ低レベルさで名高いスクリプト言語と相まって — 全盛期の日本で最も広く使われた VN エンジンのひとつにしました。Nekonekosoft のような商業スタジオはほぼ専らこれに頼り、同人シーンはこれを愛しました。
ONScripter は別個の独立したプロジェクトです。NScripter ランタイムをオープンソース(GPL)で再実装したもので、2002 年に Ogapee として知られるプログラマーが始めました。SDL 上に構築され、NScripter のゲームとドロップイン互換であることを目指していますが、NScripter が決して動けなかった場所 — Linux、macOS、BSD、Android など — で動作します。オープンで改変可能なため、英語圏のローカライズコミュニティは翻訳版 NScripter ゲームを 配布 するための事実上のエンジンとしてこれを採用し、一連のフォークが西欧言語サポートを追加しました。Chendo の 2004 年の 1 バイト文字パッチ、比例 Unicode フォント向けの Haeleth の ONScripter-EN(ONS-EN)と Ponscripter*、Uncle Mion による後年の保守、そして現代のビルド向けに insani が再稼働させたブランチです。
要するに — NScripter はゲームが制作された元のクローズドな Windows エンジンであり、ONScripter(および ONS-EN / Ponscripter)は有志翻訳者が実際に翻訳ビルドを走らせるオープンでクロスプラットフォームなランタイムです。RuneTranslate はゲームのスクリプトとアセットから作業するので、どちらの陣営のタイトルもカバーします。
なぜこれらのゲームは翻訳が非常に難しかったのか
Ren'Py や Kirikiri のような現代的なエンジンと比べると、NScripter / ONScripter はエンジン時代特有のクセだらけの地雷原です。とりわけ次の 4 つが、手作業の翻訳者にとっても、素朴な機械翻訳ツールにとっても壁になってきました。
- Shift-JIS / CP932 エンコーディング。 古いスクリプトやデータファイルは Shift-JIS(Microsoft の変種である CP932)、つまり古い日本語の 2 バイトエンコーディングでエンコードされています。デコードを誤れば文字化けし、不用意に再エンコードすれば一部の古いランタイムはメモリを破壊してクラッシュします。翻訳ツールは CP932 を正しく検出し、往復変換しなければなりません — 現代のネイティブスクリプトは UTF-8 のこともありますが、旧作カタログは CP932 です。
- XOR-0x84 で難読化された `nscript.dat`。 コンパイル済みスクリプトはたいてい
nscript.dat(Ponscripter ではpscript.dat)にあり、すべてのバイトが定数バイト0x84と XOR されています。これは暗号化ではありません — ドキュメントは、これが何のセキュリティも提供せず、うっかりネタバレを防ぐための単なる守りだと明言しています — とはいえテキストエディタでそのまま開くこともできません。XOR を解いて中の Shift-JIS テキストを編集し、書き戻す際に再び XOR をかける必要があります。(ゲームによっては代わりに平文の0.txt/.uスクリプトを配布したり、.nsa/.sarアーカイブ内にスクリプトを収めたりします。) - 画像アートに焼き込まれたテキスト。 タイトル画面、メニュー、ボタンはしばしば事前レンダリングされたビットマップです — NScripter は一部のアートを BMP にすることを要求さえします — そのため、そこに載る日本語は文字列ではなくピクセルです。文字列抽出ツールでは手が出せません。
- 厄介なもの — ラテン文字で始まる行がコマンドとして再解釈される。 NScripter のパーサーはすべての行を コマンド モードで開始します。歴史的にはこれで安全でした。エンジンが 2 バイトの日本語しか受け付けなかったため、表示される行はどれも紛れもなくテキストだったからです。1 バイトの英語を持ち込んだ瞬間、ラテン文字で始まる行はスクリプトコマンドとそっくりに見え、エンジンはそれを 実行 しようとします — ゲームを壊してしまうのです。コミュニティの対策は予約済みのテキストマーカー(旧 ONScripter のバッククォート `
`。Ponscripter は後に^` へ移行)で、行の残りをテキストモードに強制します。日本語を英語に素朴に置換すると、エンジンがコマンドと誤読する行ができてしまいます。
まさにこの最後の落とし穴こそ、初期の有志プロジェクト(Gin'iro、Mizuiro)が 2 バイトのラテン文字に頼った理由であり — 素の NScripter は 1 バイト入力をまったく受け付けませんでした — エンジンを理解しない汎用の翻訳ツールがスクリプトをただ壊してしまう理由です。
RuneTranslate が今できること
RuneTranslate は NScripter / ONScripter を第一級のエンジンとして扱い、問題の両面をともに処理します。
- スクリプトのテキスト。 ゲームのスクリプト — 独立した平文ファイル(
0.txtなど)や、XOR0x84で難読化されたnscript.dat— を読み取り、Shift-JIS / CP932 のセリフをデコードし、翻訳可能な行をすべてエディタに一覧表示します。そして書き出し時にはエンジンが期待する形式でスクリプトを書き戻し、元の.datが使っていた場合は XOR0x84難読化を再適用します。さらに 1 バイトテキストマーカーを自動で付与するので、翻訳した英語がコマンドと誤読されません。(ゲームのルートに独立したコピーがなく.nsa/.sarアーカイブ内 だけ にあるスクリプトはまだ読めません — 下の制限事項を参照。) - 焼き込まれた画像テキスト。 タイトル画面、メニュー、ボタンの日本語 — 文字列ではなくピクセル — は RuneTranslate の 画像テキスト翻訳が扱います。単語を枠で囲み、認識し、自分のプロバイダーで翻訳し、結果を焼き直すことで、ゲームが翻訳後のアートを代わりに読み込むようにします。
日本語 → 英語が最も得意な組み合わせです — このエンジンの有志翻訳の歴史はまさにそれをめぐるものであり、古い Shift-JIS スクリプトでは非ラテン系のターゲット言語はエンジンのフォントが表示できる範囲に制限されます — とはいえ 30 以上の言語のいずれでもターゲットにできます。
必要なもの
- Windows 版 RuneTranslate — 無料で、すべてのエンジンとプロバイダーが解放されています。
- NScripter または ONScripter のゲームフォルダー。ゲームの
.exe(または ONScripter バイナリ)とそのスクリプト・アセットが入ったディレクトリで、通常はnscript.dat、独立した0.txt、そして 1 つ以上の.nsa/.sarアーカイブがあります。 - ターゲット言語 — 英語、スペイン語、フランス語、ドイツ語、ポルトガル語、ロシア語、中国語、イタリア語、トルコ語、ベトナム語、ほか 20 以上。
- 翻訳プロバイダーを 1 つ。無料の Google Translate はそのまま使え、DeepL には無料枠があり、OpenAI、Anthropic、ローカルモデル(Ollama / LM Studio)、そして OpenAI 互換の任意の API は自分のキーを用意して使います。これらのゲームはセリフが多く、トーンに敏感なので、たいていは LLM(OpenAI / Anthropic)か DeepL が最も自然に読めます。
ステップ 1: ゲームフォルダーを開く
RuneTranslate を起動し、新規プロジェクト をクリックして、NScripter / ONScripter のゲームディレクトリを指定します。エンジン検出は自動で走ります — nscript.dat、独立した 0.txt スクリプト、またはエンジンの .nsa アーカイブを見つけると、プロジェクトを NScripter / ONScripter として認識します。元のゲームフォルダーは決して変更されません。
ステップ 2: スクリプトはどう読まれるか
RuneTranslate は、ゲームがルートに独立して配布しているスクリプトを読み取り、あなたのためにデコードします。
- 難読化された `nscript.dat` —
0x84に対して XOR を解き、Shift-JIS として読み取るので、別途nsdecの手順を走らせる必要はありません。 - 独立した平文スクリプト(
0.txtなど) — そのまま読み取ります。 - アーカイブされた画像 — 下記の画像テキスト手順のために、ゲームの
.nsa/.sarアーカイブから取り出します。(スクリプト自体は上記の独立したルートファイルから読み取ります。アーカイブ内だけに詰められたスクリプトはまだ読めません。)
セリフと表示テキストは、ファイルごとにまとめられてエディタに一覧表示されます。エンジンのマークアップやコマンドトークンは、何かがプロバイダーに届く前に数値のプレースホルダーの背後にマスクされ、出力時に復元されます — そして必要な箇所には 1 バイトテキストマーカーが付与されるので、エンジンが翻訳後の英語の行をコマンドと取り違えることはありません。
ステップ 3: 翻訳する
プロバイダーを選んで実行します。ビジュアルノベルなら、キャラクターの声色やトーンには LLM(OpenAI / Anthropic) が最適で、地の文には DeepL が速くて綺麗、短いメニュー文字列には 無料の Google Translate で十分です。名前がゲーム全体で同一に表示されるよう、登場人物や繰り返し出てくる用語はあらかじめ用語集にまとめておきましょう — 用語集 101 を参照。仕上げに、任意で AI リファイナー を一度かけると、各行を文脈の中で読み直し、機械翻訳が残しがちな硬く直訳的な言い回しを引き締めます。
ステップ 4: 画像内のテキストを翻訳する
NScripter の UI は事前レンダリングされたアートが非常に多いため、この手順はほとんどのエンジンよりもここで重要になります。プロジェクトでタイトルやメニューの画像を開き、日本語の各部分の周りに枠をドラッグし、認識させ、セリフに使うのと同じプロバイダーで翻訳します。書き出し時に RuneTranslate は翻訳を画像に焼き直し、書き出したコピーへ独立ファイルとして書き込むので、エンジンはアーカイブされた元画像の上にあなたの翻訳アートを読み込みます。(元のゲームフォルダーは手つかずのまま。SPB 圧縮のアートや一部の特殊な画像バリアントはまだ強化中です — おかしなところがあれば報告してください。)詳しい手順: 画像テキスト翻訳。
ステップ 5: そのまま遊べるコピーを書き出す
書き出し をクリックします。RuneTranslate はゲームの翻訳済みコピーを書き出します — スクリプトは Shift-JIS / CP932 に再エンコードされ、元の .dat が使っていた場合は XOR 0x84 で再難読化され、エンジンがどのアーカイブ内コピーよりも優先して読み込む独立スクリプトとして書き込まれます。さらに翻訳済みの画像があれば、その横に独立ファイルとして書き込まれます。ゲームを起動すれば、元の NScripter ランタイムで起動しても、ONScripter / ONScripter-EN で起動しても、ターゲット言語で動きます。
既知の制限
- XOR-0x84 難読化には対応していますが、標準の難読化ではなく本物のカスタム暗号化で保護されたゲームは開けないことがあります。
- ゲームのルートに独立した
nscript.dat/0.txtがなく.nsa/.sarアーカイブ内 だけ に詰められたスクリプトは、まだ抽出できません — ほとんどのゲームはスクリプトを独立して配布しますが、一部はそうではありません。 - 画像テキスト翻訳はメニュー・タイトル・ボタンに描かれた日本語には届きますが、SPB 圧縮のアートや強く様式化されたロゴアートは、なお手作業での微調整が必要な場合があります。
- 正確なエンジンはリリースによって異なることがあります — NScripter と一般に関連づけられる一部のタイトル(たとえば When They Cry 系列の一部)は NScripter で作られ、一般に ONScripter で動かされますが、特定の Steam / コンソール移植版は再設計されていることもありました。必ずお手元の版で確認してください。
できたてです — 壊れたところを教えてください
このエンジンは できたての追加 であり、実戦で鍛えられたものではありません。NScripter / ONScripter には数十年分のバリアント、フォーク、スタジオごとのクセがあり、私たちがそのすべてを見たわけではありません。ですので、RuneTranslate を NScripter または ONScripter のゲームに向けて、検出されない、読み込めない、あるいはランタイムが開けないものを書き出す場合は、ぜひ報告してください — ゲームの名前と、どう梱包されているか(独立した 0.txt、nscript.dat、.nsa アーカイブ)こそ、私たちが最速で堅牢化するのに役立ちます。
RuneTranslate をダウンロードして、ずっと読もうと思っていたあの古典 VN に向けて、試してみてください。より現代的な VN エンジンについては、次に Ren'Py の手順をお読みください。
RuneTranslate を試してみませんか?
無料プランですべてのエンジンとすべての翻訳プロバイダーが使えます。Supporter(月額 $3)ならフルスピードで翻訳できます。
Windows 版をダウンロード