Ren'Py製ゲーム翻訳の手引き

海外のビジュアルノベル翻訳の興味から調べてみたら、数えるほどしか日本語情報が見つからなかったRen’Pyのこの部分。

同じように翻訳を試みようとする誰かのために、調査結果を書き残しておきます。

 

2018/01/05追記:

記事投稿後にrenpy翻訳関連を調べなおしてみると、Ren’Py製ゲームの翻訳パッチ作成方法さんのページが充実した内容に追記されていた。

この記事よりよっぽどシンプルでわかりやすい説明なので、こっちも要チェキ。

スポンサーリンク

Ren’Pyとこの記事の概要

Ren’Pyはビジュアルノベル作成に向いたゲームエンジン。

いわゆる吉里吉里NScripterとかと似た立ち位置のやつ。

 

少し前に話題になったかたわ少女や、記事執筆時点ではDoki Doki Literature Club!などのゲームが、日本でも知名度があるRen’Py製ゲームかな。

Ren’PyはPythonPygameで作られているため……なんてあたりの詳細説明は、他サイト様におまかせするとして。そろそろこの記事の本題説明。

 

Ren’Pyの特徴として、多言語対応に強い部分がある。

多言語翻訳のための機能が本体に組み込まれていて、翻訳ファイルが非常に作りやすいのだ。

 

この記事では、(元々の開発者ではない)ユーザーが翻訳ファイルを作るために必要なことを書いていく。

記事の性質上、少々アングラ的な手法も紹介するので、苦手な方は気をつけて。 それじゃ、始めます。

公式ドキュメントと基礎説明

Ren’Pyの公式ドキュメントは、幸いにも日本語化されている。

「Ren’Py製ゲームの翻訳」については、ちょうどこのページがそう。

 

プログラムのドキュメントの中では、わりと丁寧懇切にかかれているほうだと思うが……当時の僕が初めて読んだ時の感想を、正直に言おう。

これは初学者にはわからん。

「この機能を使えばいいのか」とは理解できても、その機能自体の呼び出し方はさっぱりだ。

 

なので、このドキュメントは一旦横に置いて、翻訳に必要なものを考えてみよう。

  • 翻訳元のゲーム(翻訳前の原文)
  • 日本語訳を行った文章データ
  • 日本語フォント

極論、この三つさえ組み合わせられるなら、翻訳は可能となるわけだ。

 

そして、上の公式ドキュメントも、そうした部分を説明している。

(僕と同じように)公式ドキュメントがすんなり理解できなかった人は、まずその点を把握しておいてほしい。

翻訳に必要なツールを揃える

翻訳するならまず原文を手に入れなくてはいけないし、翻訳文を適用しなくちゃいけない。

また、きちんと表示できるかの確認も大切だ。

 

なので全てをスムーズにすすめるために、以下のものを揃えよう。

  • 翻訳元ゲームのバックアップ
  • Ren’Py開発用のSDKその他入手
  • お好みのエディタ

翻訳元ゲームのバックアップ

さすがに翻訳を試みる段階だから、すでにそのゲームは遊んでいるとは思う。

ただ、ゲームの内部構造まで把握してる場合は少ないだろう。

 

なので、まずは「ゲームのバックアップ」をオススメする。

フリーゲームなら、改めてダウンロードするなり。Steamで購入したゲームなら、Steamゲームライブラリフォルダ(初期設定ならSteam/steamapps/common/)を覗くなり。

 

見つけられたなら、翻訳したいゲームのフォルダごと別の場所にコピー。

このコピーを翻訳作業におけるマスターデータとして使えば、もしデータを壊した時も安心だ。

Ren’PyのSDKその他を入手

翻訳作業の場合でも、Ren’Py開発用SDKは必須。

とりあえず必要そうなものを書き出すので、必要に応じて入手すること。

  • Python # python2を推奨
  • Ren’Py SDK
    • rpatool # Ren’Py Archiveを解凍するツール
    • unrpy # コンパイルされたrpycファイルを平文に戻すツール

 

Ren’Py SDKをダウンロードできたら、起動して新しいプロジェクトを作っておこう。

あとでどうせ上書きするので、[新しいプロジェクト名]/game内に生成されたファイルを削除しておけば、なおスムーズだ。

お好みのエディタ

これは本当にお好み。

いじるのは結局テキストファイルなので、使い慣れたテキストエディタを使えば良い。

翻訳用の原文を入手する

ツールが整ったなら、いよいよ作業開始。

翻訳はとにもかくにも、原文がなくては始まらないので、まずそれを入手することになる。

が、ほとんどの場合、ゲームのデータは暗号化+圧縮が施されているだろう。

 

理想を言えば「ゲーム製作者にお伺いを立てて、翻訳を認可してもらう」ことが望ましいが、それは別の意味でハードルが高い。

(ユーザー個人が行う場合)取れる道はおもに以下の二つだ。

  • rpaファイルからぶっこぬく
  • Ren’Pyのおまけ機能から翻訳用原文を生成する

rpaファイルからぶっこぬく

はいアングラ。ギークはすぐデータぶっこぬくから困る。

なんて冗談はともかく。

 

こっちの方が手っ取り早く、また詳細な翻訳を行える。

(アングラ万歳発言はあまり言いたくないが)こっちの方が圧倒的に楽なのは事実。

 

事前にバックアップしたゲームのgameフォルダを覗いてみると、おそらくarchive.rpaといった感じの(.rpaもしくは.rpi拡張子の)ファイルがあるだろう。

それがRen’Py組み込み機能を使ってパッケージングされたゲームデータになる。

rpaファイルの解凍

先に紹介したrpatoolを用いると、rpaファイルを解凍することができる。

コマンドラインツールに慣れてないと困惑するかもしれないが、そこまで扱いは難しくないものだ。

 

rpatool -o 結果を出力するフォルダ -x 解凍したいrpaファイル

基本はこういった使い方。

 

Windowsでの勝手はよく知らないが、pythonをインストールした上で

python rpatool -o output -x archive.rpa

とかってやれば動くんじゃないかな多分。

rpycファイルのデコンパイル

解凍した中身に.rpyファイルが並んでいたなら、それをそのままエディタで開けば良いけど。

が、時には.rpycファイルばかりで、上手くエディタで開けないこともあるだろう。

 

その.rpycファイルはRen’Py SDKがコンパイルしたスクリプトで……まあざっくり言えばそのままじゃ読めないファイル

.rpycファイルを.rpyファイルに戻すには、やっぱり上で示したunrpyを使う。

 

ドキュメントを見る限り使用法は、

unrpyc.py script1.rpyc script2.rpyc script3.rpyc

といった感じとなる。

 

.rpaを解凍して出来たフォルダ内にある、(同名の.rpyファイルが無い)全ての.rpycファイルをデコンパイルすればオーケーだ。

Ren’Py SDKでの翻訳雛形生成

.rpaファイルを解凍したり、.rpycファイルのデコンパイルしたりが終わったら、そろそろ準備も大詰め。

先に用意しておいた空プロジェクトのgameフォルダへと、解凍・デコンパイルし終えたファイルをぶっこもう。

 

ここではRen’Py製ゲームの例として、Starlight Vegaの体験版データを入れた。

Starlight Vegaは良い百合ゲーだから、みんな遊んでみよう!(ダイマ)

Ren'Py SDKの起動画面

 

いざ翻訳の生成! の前に、いったん「プロジェクトの起動」を試しておく。

Starlight Vegaタイトル画面

といったふうにゲームが正常起動したなら、Ren’Py SDKから「翻訳の生成」を行おう。

 

翻訳の生成または更新

ここで入力を求められる言語名が、後々のフォルダ名となる。

逆に言えばそれだけでしかないので、日本語翻訳だと分かればなんでも良い。

 

翻訳ファイルの生成完了

この画面になったら、生成完了。game/tl/(入力した言語名)のフォルダが出来ているはずだ。

今後はそのフォルダを使って、翻訳作業を行うことになる。

Ren’Pyのおまけ機能から翻訳用原文を生成する

原文を得る二つ目の方法としては、Ren’Pyの「正式認可を受けてないユーザーが、(まだ)まっとうに翻訳を行う」ための機能を使うものがある。

それは上でもリンクを張った翻訳 — Ren'Py Documentationの、一番下の部分に書いてある。

 

要するに、「ゲーム画面に台詞が表示された時、同時に翻訳用原文として出力する」機能だ。

ひたすら手作業で全テキストを表示させる手間はあるが、一応これでも(台詞部分だけの)翻訳は行える。

 

のだが、僕はぶっちゃけこの機能を試してない。

この先は、君の目で確かめてくれ!

実際に翻訳を行う

上手く翻訳用の雛形を生成できたら、tl/(入力した言語名)フォルダが出来る。

毎回「(入力した言語名)」と書くのはややこしいので、今後この記事ではtl/japaneseと表記することにする。

 

Starlight Vegaの場合は、生成したtl/japaneseフォルダはこういったファイル構成になる。

翻訳フォルダのファイル構成1

このscriptフォルダ内に、肝心要の翻訳雛形ファイルが入っている構造。

他のゲームの場合は、フォルダ分けされずに散らばっているかもしれないが、まあ大体は同じだ。

 

シナリオデータが書かれている.rpyファイルをいじって、翻訳を進めていくことになる。

翻訳スクリプトの構文の意味

以下は、Ren’Py Tutorialの翻訳雛形の一文。

# game/script.rpy:156
translate japanese start_0e6a5bb4:

    # e "Hi! My name is Eileen, and I'd like to welcome you to the Ren'Py tutorial."
    e ""

これはだいたいこういった意味の構造。

# game/script.rpy:156  
# 翻訳元スクリプトの場所と、その行

translate japanese start_0e6a5bb4:
# 言語設定がjapaneseならば、この部分を以下の訳文で書き換える命令

    # e "Hi! My name is Eileen, and I'd like to welcome you to the Ren'Py tutorial."
    # 翻訳参考用の原文

    e ""
    # 訳文を入れる場所
    # e "こんにちは! わたしはエイリーンって言います。"といったように書き込めば良い
    # 文頭のeは、ゲーム側の変数を示している。この場合はエイリーンの台詞だということ。

ここまで分かれば、後は簡単。

雛形に合わせて翻訳すれば、大好きなゲームが日本語になりはじめるということ。

 

では作業を進めて、テスト起動してみれば……。

英語表示から切り替わっていないスクリーンショット

あるぇー? ナンデ! 英語表示ナンデ!

 

そう、「雛形ファイルを翻訳するだけ」では、ゲームは英語言語のままなのである!

訳した文章をゲーム画面に表示する

Ren’Pyの言語を変更する方法は幾つかある。

  • ゲーム内コンフィグから言語設定する
  • 環境変数設定ファイルを作成する
  • スクリプトから本体言語設定を書き換える

この中で一番スマートなのは、ゲーム内コンフィグから切り替えるようにする方法……なのだが。

正直言って、コンフィグに言語設定が無いゲームのほうが多いだろう。

 

なのでここでは、三つ目の「スクリプトから本体言語設定を書き換える」方法を紹介する。

この場合は、tl/japanese内の適当な.rpyファイルに、以下の文章を加えるだけで良い。

init python:
  config.language = "japanese"

Ren’Pyは「全スクリプトを一旦読み込んでから、順番通りに適用していく」仕組みらしく、これで本体言語が切り替わるということ。

では、ここではtl/japanese/screens.rpyにでも追記して、起動すれば……。

テキストが消えてしまったスクリーンショット

あるぇー? ナンデ! 同じ場面で無言ナンデ!

そう、「言語設定を変更する」だけでは、(ゲーム本体のフォントに日本語が含まれてないから)日本語表示は出来ないのである!

日本語フォントを適用させる

別言語に翻訳するのなら、その言語のフォントを用意しなければならない。

ライセンスとか、ライセンスとか、あと再配布ライセンスとか。めんどくさい部分が多いフォント周り……はまた別の話として。

 

Ren’PyではTrueTypeフォントとOpenTypeフォントが使えるらしい。

ここではやさしさゴシックを例として、Ren’Pyスクリプトからフォントを登録する方法を示そう。

まずはダウンロードしてきたフォントファイルを、tl/japanese/fontフォルダでも作って入れる。

正常に日本語表示ができたスクリーンショット

ファイル名が日本語でも、おそらくは上手く行くと思うけど……画像では面倒回避のためにリネーム済み。

 

そうしたら、ゲーム本体スクリプトの内容を参考にしつつ、仕様を追随するようにtl/japanese内スクリプトに書き込めば良い。

Ren’PyデフォルトGUIシステムを使ったゲームなら、以下のようなので動くんじゃないかと思われるのだけど(未確認)

translate japanese python:
    gui.text_font = "NihongoFont.ttf"
    # 当然ながら、適用させたいフォントの名前を指定する

 

ぶっちゃけた話、Starlight Vega(のような、ちょっと特殊な実装形式のゲーム)は、これじゃあ動かない。

しっかりと「ゲーム本体の実装を理解した上で」、上手くインターセプトさせるように実装させないとダメ。

 

例えば「フォント指定を日本語フォントに切り替えた変数Xを作っておいて、他の変数に変数Xを指定する」とかね。

なんて込み入った点はちょっと飛ばして……はい。

 

じょうずにできました〜〜!

補足:ちょっとつまづいた仕様

僕がStarlight Vegaの翻訳テストを行う時、自作システムへの日本語フォント適用で少し苦労した。

おそらく同じように苦しむ人も一人くらいはいると思うので、Ren’Pyの仕様をちょっと解説。

 

Ren’Pyは「全スクリプトを一旦読み込んでから、順番通りに適用していく」と先ほど書いたが、詳細な実行順序は(たぶん)こう。

  1. init
  2. init python early
  3. init python
  4. python

 

translate 言語名がついたものは、「(言語設定が一致している場合)同ブロックで同内容の命令文を代わりに行う」。

  • 変数A
  • 変数B - 変数Aを参照
  • 変数C - 変数Aを参照

 

だったら、こういう状況になってたら「変数Aだけtranslateで書き換えたら、変数B, Cも書き換わる」と思うじゃん?

(そうじゃ)ないんだな、それが。

 

僕が試した限りだと、変数B, Cまでしっかり記述する必要があった。translate段階でもっかい再設定しないと、上手いこと設定を上書きできないみたい。

一筋縄ではいかないシステムの場合、ここはちょっと気をつけて。

さらなる完成度を求めて

ここまでで、粗方の部分は説明できたはず。

ここからは、ちょっと小洒落た翻訳ファイルのための覚え書き。

テキストの表示を変えたい

元翻訳元の実装方法にもよるけど、テキスト表示を変えたい場合、だいたいはRen’Py側のスタイル変更でなんとかなりそう。

以下カスタマイズ例。

# tl/japanese内の適当な.rpyファイルに記述

# ゲーム本編でのダイアログ全般のスタイル
translate japanese style say_dialogue:
    font "tl/japanese/font/foo.ttf"    # フォント指定
    size 20                            # フォントサイズ
    language "japanese-normal"         # 日本語の改行方法

# 選択肢部分のスタイル
translate japanese style menu_choice_button_text:
    font "tl/japanese/font/bar.otf"
    size 20
    align (0.5, 0.5)                   # 中央揃えにする

Ren’Pyは、翻訳データから多くの機能にアクセスできる仕様。

 

ウェイトを入れたり、改行したり、新しい台詞を追加したり。

やろうと思えば、別物レベルの改造を施すこともできる。

 

高みを求める人は、テキスト - Ren’Py Documentationとかを参考にしてみて。

画像を用いたUIの翻訳

ゲームによっては、画像にテキストを埋め込んでいる場合がある。

一応公式ドキュメントの翻訳 - Ren’Py Documentationに、その場合の対応方法も書かれてる。

 

要するに「tl/japanese内に本体と同じディレクトリ構造で画像ファイルを置けば、それを優先して表示してくれる」ということ。

例を示すなら、こういった配置。
(表示環境によっては表からはみ出ちゃってるかも。その場合はゴメンね)

本体画像の位置 翻訳フォルダでの場所
game/assets/mm/foo.png game/tl/japanese/assets/mm/foo.png
game/bar2.png game/tl/japanese/bar2.png

UIの表示場所を変えたい

ゲームによっては、翻訳時にUIの配置を変えたくなる場合もあるだろう。

例えば、「キャラの名前が右側に表示されてるから、左側に移したい」とか。

 

あまりスマートとは言えないかも知れないが、手っ取り早いのは以下の方法。

  1. 本体スクリプトから、当該部分をいじってる箇所を見つける
  2. その箇所をブロックごと引っこ抜いて、tl/japanese内の同名スクリプトファイルに移植
  3. いじりたい数値をいじる

 

例えばscreen.rpyに当該箇所を見つけた場合、tl/japanese/内のscreen.rpyに書き込む、ということ。

もしtl/japanese内にファイルがなかったら、その名前で新規作成。

 

なぜこういう方法を取るかといえば、上で説明した画像周りと同じ仕様にちなむ。

似た内容・同じ名前のファイルがある場合、game/tlフォルダ内を優先的に使用する仕様だ。

 

たぶんスマートな解決法は他にあると思うけれど、どうしても困ったらこれを使ってみて。

なあに、動くなら大丈夫だよきっと。

日本語化導入を楽ちんにする

Ren’Pyはgameフォルダに圧縮された.rpaファイルと未圧縮ファイルが混在していても、問題なく動作する。

……もう少しわかりやすく言うと、「翻訳ファイルをわざわざ.rpaファイルに同梱させなくても動く」ということ。

 

なので、翻訳ファイルさえしっかりさせていれば、「バニラ状態から、tl/japaneseフォルダ一つぶっこめば日本語化完了」がわりと可能。

つまり、この記事で長々説明したことさえ行えば、ユーザーフレンドリーな翻訳データが作れるというわけだ!。

 

僕の調査結果はこれで全部。

後はがんばれ、翻訳者さんたち!