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ファイルを解凍することができる。

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

 


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

 

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

```python rpatool -o output -x archive.rpa```

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

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

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

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

 

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

`.rpyc`ファイルを`.rpy`ファイルに戻すには、やっぱり上で示した[unrpy](https://github.com/CensoredUsername/unrpyc)を使う。

 

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

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

といった感じとなる。

 

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

#### Ren'Py SDKでの翻訳雛形生成

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

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

 

ここではRen'Py製ゲームの例として、[Starlight Vega](http://www.razzartvisual.com/starlightvega/)の体験版データを入れた。

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

![Ren'Py SDKの起動画面](/images/blog/2018/renpy/01_translate_generate.png)

 

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

![Starlight Vegaタイトル画面](/images/blog/2018/renpy/02_sv_titlemenu.png)

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

 

![翻訳の生成または更新](/images/blog/2018/renpy/03_renpy_tl_japanese_begin.png)

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

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

 

![翻訳ファイルの生成完了](/images/blog/2018/renpy/04_renpy_tl_japanese_end.png)

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

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

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

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

それは上でもリンクを張った[翻訳 — Ren'Py Documentation](http://ja.renpy.org/doc/html/translation.html#unsanctioned-translations)の、一番下の部分に書いてある。

 

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

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

 

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

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

## 実際に翻訳を行う

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

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

 

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

![翻訳フォルダのファイル構成1](/images/blog/2018/renpy/05_tl_folder_content.png)

この`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

翻訳元スクリプトの場所と、その行

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

translate japanese start_0e6a5bb4: # e “Hi! My name is Eileen, and I’d like to welcome you to the Ren’Py tutorial.” # 翻訳参考用の原文

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

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

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

 

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

![英語表示から切り替わっていないスクリーンショット](/images/blog/2018/renpy/06_sv_before_translation.png)

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

 

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

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

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

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

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

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

 

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

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

init python: config.language = “japanese”


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

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


![テキストが消えてしまったスクリーンショット](/images/blog/2018/renpy/07_sv_translation_no_font.png)

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

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

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

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

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

 

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

ここでは[やさしさゴシック](http://fontna.com/freefont/?p=40)を例として、Ren'Pyスクリプトからフォントを登録する方法を示そう。

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

![正常に日本語表示ができたスクリーンショット](/images/blog/2018/renpy/09_tl_folder_font_setting.png)

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

 

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

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

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


 

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

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

 

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

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

 

![](/images/blog/2018/renpy/08_sv_after_translation.png)

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

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

僕が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側の[スタイル変更](http://ja.renpy.org/doc/html/style.html#styles)でなんとかなりそう。

以下カスタマイズ例。

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フォルダ一つぶっこめば日本語化完了」がわりと可能。

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

 

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

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