XUnity.AutoTranslatorの使い方(備忘録)

背景

Dinkum楽しい!
オーストラリア製どう森と噂のDinkumやってます。
ヘリコプター欲しいです。

Dinkum

日本語に対応していませんが、難しい英語もそんなになく…
めっちゃありました。

翻訳アプリをスマホで起動しながら操作して~…
いや大変だし、翻訳している間にゲーム内の時間どんどん進むし…
いい方法がないか検索すると自動翻訳のMODを発見。
※MODの利用はゲームのクラッシュやアカウントの制限の対象となる場合があります。

それがこちら↓

Xunity.AutoTranslator

なんとUnity製のゲームならなんでも(?)自動翻訳してくれるとのこと。
導入方法も検索したらすぐに(めっちゃ解りやすい先駆者の)ページがヒットしました。

Xunity.AutoTranslatorの導入方法

人に聞いた内容をさも自分の手柄の如く書くのは気が引けるので、リンクが切れないことを祈りつつ、ここに導入方法は書きません。

ここで書くのはXunity.AutoTranslatorを使う上で友人(非プログラマ)と一緒に勉強したことを備忘録として残していきます。

正規表現

今回、主に勉強に時間を割いたのが正規表現でした。
Xunity.AutoTranslatorは正規表現に対応していますので、
「上手く登録すれば万人に使ってもらえる翻訳が作れるのでは?」
と考えたのがきっかけです。
「Dinkumが本当に楽しかったので日本のユーザーを増やして正規に日本語対応してもらいたい」という下心で挑戦しました。

”正規表現”という単語自体、今回初めて聞いたのでまずそこから。
Xunity.AutoTranslatorでは正規表現を用いることで重複する翻訳をまとめることができます。
例えば以下のようなアイテムがあります。

  • Tin Bar=錫の延べ棒

  • Copper Bar=銅の延べ棒

  • Iron Bar=鉄の延べ棒

  • Tin Axe=錫の斧

  • Copper Axe=銅の斧

  • Iron Axe=鉄の斧

この場合「Bar」の部分を「延べ棒」と訳し、「Axe」を「斧」と訳せば計6個ある翻訳の数を5個に減らすことができます。
※後述しますが、このあとの正規表現は使いません。

正規表現を用いた場合、以下のようになります。

  • Tin=錫

  • Copper=銅

  • Iron=鉄

  • ([A-Za-z]+) Bar=$1の延べ棒

  • (\w+) Axe=$1の斧

解説

( )は正規表現の場所を指定しています。
[ ]は対象の文字や文字列を指定しています。
 [A-Z]はA~Zの文字 例:「Tin」の「T」
 [a-z]はa~zの文字 例:「Tin」の「i」と「n」
 [A-Za-z]にするとA~Zもしくはa~zの文字 例:「Tin」の「T」と「i」と「n」
+ は「一回以上の繰り返し」を意味し、これがないと一文字しか認識しません。
ですので、「Tin」を認識する正規表現は [A-Za-z]+ となります。

$は正規表現の結果を返す文字です。
$以降の数字は( )の出てきた順番になります。
 一つ目の正規表現を返してほしいので$1となります。

正規表現は他にも次のようなものがあります。
0-9 = 数字
{ } = 繰り返しの数を指定
 例:[0-9]{1,3} だと数字の1~3文字 {3}で3文字のときだけ認識します。
   1234を認識するなら[0-9]{4}となります。
* = 0個以上の繰り返し
 ややこしいですが、あってもなくても認識するものです。
 例えば、1234とあった場合 [A-Za-z]+では認識できません。
 しかし、[A-Za-z]*だと1234を認識することができてしまいます。
 Dinkumでは空白があったりなかったりしたので何度か使用しました。

\w について。
正規表現には既に定義されたものがあります。
\w は「A~Zとa~zとアンダーバーと数字」が定義されています。
つまり、[\w]+ は [A-Za-z_0-9]+ が定義されており、
[A-Za-z]が含まれているので同じ動きをするという訳です。
余計なものを拾う可能性がありますが、表現を簡略化するのに使えます。
(対象となる文字種が多い分、動作が重くなる?要検証)

他にも色々ありますが、数が多いのでDinkumで使う分だけ記載します。

\s = 空白文字
\ = 直後の文字を対象外にします。
 例:「OK?」を認識したい場合 [A-Z?]+ と書きたいのですが、
   ?は正規表現で「直前の文字が0個か1個の場合に認識する」という意味を持ってしまい、?そのものを文字として認識することができません。
   そこで [A-Z\?]+とすることで?を対象外にすることで、?を文字として認識することができます。

正規表現は奥が深く、まだまだ沢山あります。
検索するとすぐ出てくるので興味ある方は勉強してみてください。
(簡潔にまとめられていて超参考にしたリンク↓)

Xunity.AutoTranslatorでの正規表現の使い方

さて、前置きがかなり長くなってしまいましたがここからが本題です。
Xunity.AutoTranslatorでは正規表現を使うことができます。
しかし、製作者の人が「控え目に使ってくれ」とわざわざ書くくらいです。
とりあえず200箇所を正規表現にしたらDinkumがフリーズしました。
友人と書き方が悪いのか、そもそも数が多いのか原因を調査中です。

使い方は簡単で、MOD導入後に作られた以下のフォルダ
(Dinkumのディレクトリ)\AutoTranslator\Translation\ja\Text
ここにテキストファイルを入れるだけです。

ちなみに正規表現なしで3500行の翻訳ファイルを使ってDinkumを動かしましたが、特に重たくなった等はなく「正規表現必要か?」問題も調査中です。

書き方

前述したアイテムのように、Dinkumでは「錫の~」「銅の~」「鉄の~」と違う素材の同じ物が多々あります。
そこでそれらをまとめようとした場合以下のように記載します。

対象が一つの場合

例文
r:"^([A-Za-z]+) Bar$"=$1の延べ棒

正規表現を英語でregular expressionと言うのでその頭文字のrでしょうか。
簡単に解説します。
r:"  " 「"から"まで正規表現です」という宣言。
^ 文頭
$ 文末 ($1と混同しないように注意)
= 翻訳前と後の区切り

先ほどの例文とは別に
Tin=錫
Copper=銅
Iron=鉄
と記載しておくことで、素材が変わっても正確に翻訳してくれます。

ただ、このままだとBarの部分が変わった際に対応できません。
そこで使うのが「sr:」スプリット正規表現です。

対象が二つの場合

例文
sr:"^([A-Za-z]+) ([A-Za-z]+)$"=$1の$2
解説
( )を一区切りとして二つ以上の正規表現に対応します。
宣言には「sr:」を使います。
他は「r:」と同じです。

例文とは別に
Bar=延べ棒
Axe=斧
Tin=錫
Copper=銅
Iron=鉄
と記載しておくことで、素材と物の両方に対応することができます。

名前の定義

3つ以上になる場合は名前の定義を作ることで対応することができます。
例えば
SPR SUN AM=春 月曜日 午前
このように、季節や曜日に加えて午前と午後も変わる場合は以下のように記載します。
sr:"^(?<season>[A-Z]{3}) (?<week>[A-Z]{3}) (?<ampm>[A-Z]{2})$"=${season} ${week} ${ampm}
解説
?< >で名前を定義し、${ }で結果を返します。
例文とは別に
SPR=春
SUN=日曜日
AM=午前
が必要です。
SUM=夏
MON=月曜日
PM=午後
などを追加しておくことで柔軟に対応できるようになります。

翻訳ファイル

ここまで書いておいてなんですが、正規表現込みだとDinkumがクラッシュします。
正規表現にミスがあるのか、入れ込みすぎなのか調査中です。
正規表現を使っていない場合は正常に動くのでその部分だけの翻訳ファイルを置いておきます。

使い方は
(Dinkumのディレクトリ)\AutoTranslator\Translation\ja\Textに保存してください。
同フォルダ内のテキストファイルは_AutoGeneratedTranslaslations.txtよりも優先して読み込むそうなので、ファイル追加で問題ないようです。

正規表現のみを抜粋したファイル↓

お礼

勉強時に利用させていただいたリンク先の皆さま、8時間を超えて一緒に正規表現を考えてくれた友人のトミーにこの場をお借りしてお礼を申し上げます。
ありがとうございました。

いいなと思ったら応援しよう!