正規表現フィルターで不要な行を翻訳から除外する
デバッグ文字列、アセットパス、開発時の残骸テキストは、自動除外をすり抜けてしまうことがあります。RuneTranslate のプロジェクトごとの正規表現フィルターは、ソースがパターンに一致する行をすべて除外し、しかも何が引っかかるかをリアルタイムで正確にプレビューできるので、無駄な行に翻訳を消費することがありません。すべてのティアで無料です。
RuneTranslate をゲームに向けると、見つけられる翻訳可能な文字列をすべて取り込みます。その大半は実際のセリフやメニューテキストですが、中にはゴミも混じっています。残ったデバッグ行、アセットのファイル名、内部フラグ、そしてプレイヤーには決して表示されない迷子の識別子などです。RuneTranslate はエンジンごとに明らかなケースをすでに除外し、赤いオプトイン行として印を付けますが、ゲームはそれぞれ異なり、作業中のタイトル固有のゴミもあります。
そこで役立つのが正規表現の除外フィルターです。RuneTranslate に 1 つ以上のパターンを与えると、ソーステキストがパターンに一致する行は実行から除外されます。翻訳エンジンにスキップされ、いつでも元に戻せる赤いオプトイン行として表示されます。これは組み込みのエンジン除外と同じ仕組みですが、あなた自身のルールで動き、プロジェクトとともに保存されます。しかも費用はかかりません。用語集や翻訳メモリとは違い、正規表現の除外はすべてのティアで無料です。
そもそもなぜ行を除外するのか?
理由は 2 つあります。1 つは分かりやすく、もう 1 つはより重要です。
- コストと時間。 翻訳するゴミ行は 1 つ残らず、誰も読まないテキストにプロバイダーの割り当て量(または無料スクレイパーのレート制限)を消費します。ゲーム全体で見れば積み重なります。
- ゲームを正常に動かし続けること。 これが本命です。中には、そもそもテキストではない行もあります。エンジンが値で解決するキー、ファイルパス、フロー演算子などです。
bg_office_01やEV_FLAG_TRUEを翻訳してしまうと、シーン遷移や変数参照を気づかぬうちに壊しかねません。それらを除外すれば、書き出したビルドが安定します。
どこにあるのか
プロジェクトを開き、エディターのツールバーで⋯ その他メニューを開いて正規表現による除外を選びます。するとカスタム除外フィルターパネルが開きます。パターンの追加、何が引っかかるかの確認、適用まで、すべて 1 つのダイアログで行えます。
リアルタイムプレビューこそが肝心
パターンを手探りで適用することは決してありません。正規表現を入力すると、RuneTranslate は全 TOTAL 行中 N 行に一致と表示し、引っかかる実際の行をいくつか挙げ、1 打鍵ごとに更新します。無効なパターンはエラーとともに即座に指摘されるので、壊れたものを保存することはできません。
プレビューにはあなたのプロジェクトの実際の行が表示されるため、ゴミだけを正確に捉えて本物は何も捉えないところまでパターンを調整してから適用できます。覚えておきたい点が 1 つあります。パターンが照合するのはソーステキスト、つまり元の日本語やあなたのソース言語であって、翻訳文ではありません。パターンは未翻訳のテキストに対して書きます。
既成のパターン
パネルには、ほぼすべての日本語ゲームで登場するパターン向けに、ワンクリックのプリセットチップが用意されています。
- ASCII のみ —
^[\x00-\x7F]+$— ソース言語の文字を一切含まない行(残った英語、ローマ字、または識別子)。ソースが日本語であれば通常は削除して問題ありません。 - アセットパス —
\.(png|jpe?g|gif|webp|ogg|mp3|wav|webm|mp4)$— メディアファイルの拡張子で終わるものすべて。 - 変数 —
^[a-z_]+\.[a-z_]—f.pageやstate.flagのようなドット区切りのコード参照。 - 大文字トークン —
^[A-Z0-9_]+$—EVENT_FLAG_3のような定数やフラグ。 - 数字/記号 —
^[\d\s.,:%/+\-]+$— 数字だけの行や11111112222のようなタイルマスク。 - 角括弧タグ —
^\[.*\]$—[tag]だけで構成される行全体。
パネルには、自分でパターンを作るためのコンパクトなチートシートも表示されます。^ と $ は行の先頭と末尾を固定し、. は任意の 1 文字、* と + はそれぞれ 0 回以上と 1 回以上を意味し、? は省略可能、\d は数字、\w は単語文字、\s は空白を表します。
独自のフィルターを書く
プリセットは一般的なケースをカバーします。ゲーム固有のものについては、自分で JavaScript の正規表現を書きます。いくつかの目安を挙げます。
- 行全体に固定する。 単なる
debugは、その単語を含むあらゆる行に一致します。デバッグについての実際のセリフも含めてです。^DEBUG:はそのマーカーで始まる行だけに一致し、パターンを^...$で囲めば行全体に一致します。固定するのが最も安全なデフォルトです。 - プレビューの件数に注目する。 パターンが引っかける行がゴミ 12 行から 400 行に跳ね上がったら、ほぼ間違いなく本物のテキストを捉えています。サンプルを確認して条件を絞り込みましょう。
- 単語より構造を重視する。 ゴミはたいてい特定の単語ではなく形で見分けられます。すべて大文字、ドット区切りのパス、末尾のファイル拡張子、純粋な数字などです。構造的なパターンはプロジェクト全体に広く通用します。
- 1 つの発想につき 1 つのルール。 小さく分かりやすいパターンを複数用意するほうが、巨大で読めないものを 1 つ作るよりも、把握しやすく、後で削除するのも簡単です。
適用と取り消し
適用して保存を押します。RuneTranslate はパターンをプロジェクトとともに保存し、すべての行を再分類したうえで、何が起きたかを正確に伝えます。たとえば340 行を除外 · 5 行を復元のように。復元件数は、以前はフィルターが引っかけていたが今は引っかけなくなった行が、自動的に戻されたものです。
完全に元に戻せます。パターンを削除してもう一度適用すれば、その行は戻ってきます。フィルターが管理するのは自分自身の除外だけで、エンジンの自動除外を上書きすることは決してありません。また、フィルターの範囲が少し広すぎた場合でも、各行のトグルで任意の 1 行を個別に元に戻せます。
フィルターした翻訳をリセットする確認
RuneTranslate が代わりに対処してくれるケースが 1 つあります。すでに翻訳済みの行をフィルターで除外したらどうなるか、です。除外された行はソーステキストを書き出しますが、古い翻訳は依然としてその行に紐づいたままです。そこで適用直後、新たにフィルターされた行にすでに翻訳が付いていた場合、RuneTranslate はそれらを保留中にリセットするか(翻訳を破棄して、書き出し時にソースへきれいにフォールバックさせます)、それともそのまま残すかを尋ねます。たいていはリセットが望ましいでしょう。まさに翻訳したくないからこそ、それらの行を除外したのですから。
他の機能との関係
正規表現フィルターはラストワンマイルのツールです。エンジンアダプターは各フォーマットについて把握している構造的なゴミをすでに除外しているので、十分に対応されたゲームでは AI がアセットパスを目にすることはありません。フィルターはその取りこぼしのためにあります。ゲーム固有のマーカー、風変わりなデバッグチャンネル 1 つ、あるいはニッチなエンジンが表に出すセリフとは言い切れない文字列などです。
エディターの除外済みステータスフィルターを使えば、現在保留されているものすべて(エンジンの除外とあなたの正規表現の除外をまとめて)を確認し、任意のものを再度対象に戻せます。そして、フィルターが行を取り除くのに対し、用語集はその逆を行います。選んだ用語を固定して、常に同じ訳になるようにするのです。この 2 つを組み合わせれば、何を翻訳するかと、どう翻訳するかの両方を制御できます。
プロジェクトの最初にフィルターパネルで 5 分(プリセットチップをいくつか放り込み、プレビューをちらっと確認して、適用する)かけるだけで、以降のすべての実行で割り当て量を節約でき、危険な非テキストを翻訳エンジンから完全に締め出せます。RuneTranslate をダウンロードして、好きなゲームを開き、⋯ その他メニューで正規表現による除外を確認してみてください。
RuneTranslate を試してみませんか?
無料プランですべてのエンジンとすべての翻訳プロバイダーが使えます。Supporter(月額 $3)ならフルスピードで翻訳できます。
Windows 版をダウンロード