NScripter / ONScripter ビジュアルノベルを翻訳する方法
RuneTranslate は NScripter と ONScripter のビジュアルノベルを英語と 30 以上の言語に翻訳します — XOR 難読化された nscript.dat をデコードし、Shift-JIS / CP932 を扱い、すぐ実行できるコピーをエクスポートします。新機能。読み込めないものがあれば報告してください。
RuneTranslate は、日本語ビジュアルノベルで最も古いエンジンファミリーの 1 つを読み取ります:NScripter とそのオープンソースの双子 ONScripter。これらの古典的な同人 VN — 謎めいた .dat ファイルと Shift-JIS スクリプトのフォルダとして出荷されるもの — は歴史的に手作業で開くのが最も苦痛で、機械翻訳ツールがたいてい飛ばすものでした。RuneTranslate はエンジンを検出し、スクリプトテキストを読み、タイトル画面やメニューボタンに描かれた日本語まで翻訳できます。
このエンジン対応は 新規追加され、まだ実ゲーム検証されていません ので、RuneTranslate を NScripter / ONScripter のゲームに向けて、検出や読み込みをしない場合は、ぜひ教えてください — 詳しくは最後に。
NScripter と ONScripter とは実際に何か
NScripter は Naoki Takahashi によるクローズドソースの Windows VN スクリプトエンジンで、2000 年代初頭以降、日本で広く使われました。個人・商用利用のロイヤリティフリーなライセンス、組み込みのアーカイブパッカー、そして有名なほど低レベルなスクリプト言語が、これを同人シーンの定番にしました。ねこねこソフトのようなスタジオはほぼ独占的にこれを頼りました。
ONScripter は、Ogapee として知られるプログラマーによる、NScripter ランタイムの別個のオープンソース(GPL)再実装です。SDL 上に構築され、ドロップイン互換で、NScripter が動けない場所 — Linux、macOS、Android など — で動くので、ローカライズコミュニティはこれ(および比例 Unicode フォント用のフォーク ONScripter-EN や Ponscripter)を、翻訳済みビルドを出荷するための事実上のランタイムとして採用しました。
手短に言えば:NScripter はゲームが作られた元のクローズドな Windows エンジンで、ONScripter はファン翻訳者が自分のビルドを走らせるオープンでクロスプラットフォームなランタイムです。RuneTranslate はゲームのスクリプトとアセットから作業するので、どちらの陣営のタイトルもカバーします。
なぜこれらのゲームは翻訳が難しかったのか
Ren’Py や Kirikiri のような現代的なエンジンと比べると、NScripter / ONScripter はエンジン時代の癖の地雷原です。特に 4 つが、手作業の翻訳者と単純な MT ツールの双方にとって壁になってきました:
- Shift-JIS / CP932 エンコーディング。 レガシースクリプトは Shift-JIS(CP932)です。誤ってデコードすると文字化けし、不用意に再エンコードすると一部の古いランタイムはメモリを破壊してクラッシュします。現代のネイティブスクリプトは UTF-8 のこともありますが、バックカタログは CP932 です。
- XOR-`0x84` 難読化された `nscript.dat`。 コンパイル済みスクリプトはたいてい
nscript.dat(Ponscripter ではpscript.dat)にあり、すべてのバイトが定数0x84に対して XOR されています。暗号化ではなく — 偶発的なネタバレへの防護に過ぎません — が、それでもテキストエディターでは開けません。プレーンテキストのゲームは、代わりにスクリプトを0.utf/0.utf.txt(UTF-8)または0.txt/00.txt(Shift-JIS)として出荷します。 - 画像アートに焼き込まれたテキスト。 タイトル画面、メニュー、ボタンは頻繁に事前レンダリングされたビットマップなので、そこにある日本語は文字列ではなくピクセルです — 文字列抽出では触れられません。
- 厄介な 1 つ:ラテン文字で始まる行がコマンドとして再解釈される。 NScripter のパーサーはすべての行を コマンド モードで始めます。エンジンが 2 バイトの日本語しか受け付けなかった頃は安全でしたが、1 バイトのラテン文字で始まる行はコマンドとまったく同じに見え、エンジンはそれを 実行 しようとします。コミュニティの修正は、テキストモードを強制する予約済みのテキストマーカー(レガシー ONScripter ではバッククォート `
`、Ponscripter では^`)です — 単純な find-and-replace は追加してくれません。
RuneTranslate が今できること
RuneTranslate は NScripter / ONScripter を一級のエンジンとして扱い、問題の両半分を処理します:
- スクリプトテキスト。 ゲームのスクリプト — ルーズなプレーンテキストファイル、または XOR
0x84で難読化されたnscript.dat— を読み、Shift-JIS / CP932 のセリフをデコードし、すべての翻訳可能な行をエディターに一覧し、エクスポート時にはエンジンが期待する形でスクリプトを書き戻し、元が使っていた場合は XOR を再適用します。翻訳された英語がコマンドと誤読されないよう、1 バイトのテキストマーカーも自動的に挿入します。(.nsa/.sarアーカイブの中 だけ にあり、ルーズなコピーのないスクリプトはまだ読まれません — 制限を参照。) - 焼き込まれた画像テキスト。 タイトル画面やメニューの日本語は 画像テキスト翻訳 で処理されます:単語を囲み、認識し、自分のプロバイダーで翻訳し、結果を焼き戻すので、ゲームはあなたの翻訳済みアートを読み込みます。
日本語 → 英語が最も得意 です — このエンジンのファン翻訳の歴史はまさにそれです — が、30 以上の言語をターゲットにできます。レガシーな Shift-JIS スクリプトでは、非ラテンのターゲットはエンジンがレンダリングできるフォントに制限されます。
必要なもの
- Windows 版 RuneTranslate — 無料。すべてのエンジンとプロバイダーが解放されています。
- NScripter または ONScripter のゲームフォルダ — ゲームの
.exe(または ONScripter バイナリ)、そのスクリプト(nscript.dat、またはルーズな0.txt/0.utf)、そして任意の.nsa/.sarアーカイブがあるディレクトリ。 - ターゲット言語 — 英語、スペイン語、フランス語、ドイツ語、中国語、その他 30 以上。
- 1 つのプロバイダー。無料の Google Translate はそのまま使えます。DeepL には無料ティアがあります。OpenAI、Anthropic、ローカルモデル、あらゆる OpenAI 互換 API は自分のキーを用意するタイプです。これらのゲームはセリフが多いので、LLM または DeepL が最もよく読めます。
ステップ 1: ゲームフォルダを開く
RuneTranslate を起動し、新規プロジェクト をクリックして、ゲームディレクトリに向けます。検出は自動的に実行されます:nscript.dat / pscript.dat、あるいはプレーンテキストの 0.utf / 0.utf.txt だけで十分です。素の Shift-JIS 0.txt や単独の .nsa アーカイブは、誤検出を避けるため、裏付けとなるシグナル — ONScripter バイナリ、ゲームフォント、付随するアーカイブ — と一緒のときにのみ認識されます。元のゲームフォルダは決して変更されません。
ステップ 2: スクリプトがどう読まれるか
RuneTranslate は、ゲームがルートにルーズで出荷するスクリプトを読み、あなたのためにデコードします:
- 難読化された `nscript.dat` —
0x84に対して un-XOR され、Shift-JIS として読まれるので、別のnsdecステップを省けます。 - プレーンテキストスクリプト —
0.utf/0.utf.txt(UTF-8)または0.txt/00.txt(Shift-JIS)が直接読まれます。 - アーカイブされた画像 — 画像テキストのステップのために、ゲームの
.nsa/.sarアーカイブから取り出されます。(スクリプト自体はルーズなルートファイルから読まれます。アーカイブの中だけにパックされたスクリプトはまだ読まれません。)
セリフと表示テキストは、ファイルごとにグループ化してエディターに一覧されます。エンジンのマークアップとコマンドトークンは、プロバイダーに届く前に数字プレースホルダーの背後にマスクされ、出力時に復元されます — そして必要な場所には 1 バイトのテキストマーカーが適用されるので、エンジンが翻訳された行をコマンドと取り違えることはありません。
ステップ 3: 翻訳
プロバイダーを選んで実行します。LLM(OpenAI / Anthropic) はキャラクターの声に最適で、DeepL はナレーションを高速かつクリーンに、無料の Google Translate は短いメニュー文字列に十分です。名前が同一に表示されるよう、キャストを事前に用語集化しましょう — 用語集 101 を参照。完了したら、AI リファイナー で任意のパスを実行すると、各行を文脈の中で読み直し、MT が残しがちな堅く直訳的な言い回しを引き締めます。
ステップ 4: 画像内のテキストを翻訳
NScripter の UI の多くが事前レンダリングされたアートなので、このステップはほとんどのエンジンよりここで重要です。タイトルやメニューの画像を開き、日本語の各部分を囲み、認識し、同じプロバイダーで翻訳し、エクスポート時に RuneTranslate は翻訳を焼き戻してエクスポートしたコピーにルーズに書き込むので、エンジンはアーカイブされた元のものより上にあなたの翻訳済みアートを読み込みます。(元のフォルダは手を加えられないままです。SPB 圧縮アートやいくつかの珍しい画像バリアントはまだ堅牢化中です。)詳しいウォークスルー:画像テキスト翻訳。
ステップ 5: すぐ実行できるコピーをエクスポート
エクスポート をクリックします。RuneTranslate はゲームの翻訳済みコピーを書き出します — スクリプトは Shift-JIS / CP932 に再エンコードされ、元が使っていた場合は XOR 0x84 で再難読化され、エンジンがアーカイブされたコピーより上に読み込むルーズなスクリプトとして書き込まれ、翻訳済み画像もその隣に置かれます。実行すれば、元の NScripter ランタイムでも ONScripter / ONScripter-EN でも、ターゲット言語でプレイできます。
既知の制限
- XOR-
0x84の難読化は処理されますが、本物のカスタム暗号化を持つゲームは開かないかもしれません。 - ルートにルーズな
nscript.dat/0.txtがなく、.nsa/.sarアーカイブの中 だけ にパックされたスクリプトはまだ抽出されません — ほとんどのゲームはルーズに出荷しますが、一部は違います。 - 画像テキスト翻訳は描かれたメニュー、タイトル、ボタンに届きますが、SPB 圧縮アートや強く様式化されたロゴは手作業の手直しが必要かもしれません。
- 正確なエンジンはリリースごとに異なる場合があります — NScripter に関連する一部のタイトルは、特定の Steam / コンソール再リリース向けに作り直されています。自分のコピーで検証してください。
できたばかりです — 壊れたら教えてください
このエンジンは 新規追加で、まだ実戦テストされていません。NScripter / ONScripter には、私たちがすべて見たわけではない数十年のバリアント、フォーク、スタジオごとの癖があります。ですので、RuneTranslate をそれに向けて、検出しない、読み込まない、あるいはランタイムが開けないものをエクスポートした場合は、報告してください — ゲーム名とパッケージ方法(ルーズな 0.txt、nscript.dat、.nsa アーカイブ)があると、私たちが最速で堅牢化できます。
RuneTranslate をダウンロードし、ずっと読もうと思っていたあの古典的な VN に向けて、試してみてください。より現代的な VN エンジンについては、次に Ren’Py ウォークスルー を読んでください。
RuneTranslate を試してみませんか?
無料プランですべてのエンジンとすべての翻訳プロバイダーが使えます。Supporter(月額 $3)ならフルスピードで翻訳できます。
Windows 版をダウンロード
