月別: 2018年1月

スプラトゥーン2の英語

1のときにも記事かきましたけど。

2における最大にして重大な変更といえば、なにをおいても

カモンがC’mon!からThis way!になった

ことでありましょう。

1のとき、日本語版における「カモン!」のメッセージは、英語版では(おそらく深い考えなしに)「C’mon!」と訳されていました。が、英語でcome on!といえば、日本語における「カモン」のように「来い」という意味もある一方で、こう、相手を煽るというか、けなすというか、そういった意味合いもありました。実際、ヘマして水に落ちるとc’mon!連打する人とかもいた。

これはよろしくないので本来の意味がより直接的につたわるよう、This way!となったわけで、まぎれがなくなりました。

それにしてもこの翻訳、「いわれてみればなるほど」だけど、おそらく非ネイティブであればなかなか見逃してもしかたないようなミスだよなあ。あらためて、ゲーム翻訳の世界における興味深い事例といえるのではないかなあとあらためて思った次第。

マニューバはdualies、シェルター類はbrella

ほかだと新武器類であるマニューバ、シェルターはどうか。マニューバは英語でmaneuverですがこれだと意味は通らないからか、dualiesという名前になっています。dualは二重という意味。他の言語でもだいたい二重とか2つといった意味の語が選ばれているようです。

シェルター系。パラシェルターはsplat brella、キャンピングシェルターはtent brella、スパイガジェットはundercover brellaというように、brellaを武器種名としてつかっています。umbrella(傘)からの語ですね。これはまあわかりやすい。というかパラシェルターのほうがよくわからないよな。

ガチアサリはClam Blitz

新ルールのガチアサリですが、英語版ではClam Blitzとなっています。Clamはアサリみたいな貝のこと。Blitzはドイツ語の「電撃戦」(blitzkrieg)から転じて急襲といった意味のある語……ただこれ、アサリの形状がどうみてもアメフトボールなので、まあアメフト用語のブリッツ(blitz)を念頭において考えられた語だろうな、とおもいます。

バッテラストリートがThe Reef

新ステージ名はバッテラだの海女だのガンガゼだのフジツボだのエンガワだのと、なかなか翻訳がむずかしそうな語がおおいですが、だいたい適当にぜんぜん違う海産物系の名前をつかってます。

が、バッテラストリートについてはもうなんか完全にあきらめたのか、The Reefとなっていました。Reefは岩礁といった名前の語です。某ウィキによると、他の言語ではスシなんとか、みたいな名前のようなので、なぜ英語だけおもいきって変えたのかは、ちょっと謎ですが。

海女美術大学はInkblot Art Academy。まあ海女は訳せないよな、訳しても意味ないし。Inkblotはインクのシミといった意味。

ただ完全にそのまんまな例もあり、たとえばManta Maria(マンタマリア号)。そのまんまでわかりやすいときはそのまんまにしてるようです。

デボン海洋博物館の裏設定?

こないだでてきたデボン海洋博物館ですが、英語版ではShellendorf Instituteとなっていました。Instituteは研究所、といったところなので博物館とはちょっとちがうけれどもそう遠からずですが、さてShellendorfとは?

とおもったら、なんとこれ、1で言及のあったブキチ(英語版Sheldon)のおじいちゃん、日本語版でいうカンブリヤ・ブキノサイの英語名がAmmoses Shellendorfなんだそうで。

するってーと、このおじいちゃんが設立した、といった裏設定があったりするのか? とか想像するのもちょっとおもしろい。それにしてもどうして英語版にだけこんな名前を採用してるんだろ。

そんなこんなで、ローカリゼーションにしても翻訳にしても、逐語的に訳してるわけじゃないんだよなー、まあいろいろがんばってんだな、とおもうなどしました。

Goのオプショナル引数

そういえば、Goには可変長引数でナントカオプションみたいなデータをわたす、というパターンがよくある。これってGoに特有のパターンだなとおもう。

とくに顕著な例として、たとえばgRPCがある。gRPC/Goには、たとえばDialOptionという型があって、gRPCサーバにつなぐときに、

conn, err := grpc.Dial(target, grpc.WithInsecure(), grpc.WithCompressor(grpc.NewGZIPCompressor()))

などのようにconnをカスタマイズするためにつかう。

DialOptionは型のなかみとしては関数になっていて、privateなdialOption型をうけとって何らかの処理をすることになっている。dialOptionは外からはみえないが実際にはただのstructで、いろんなオプション(たとえばSSLするかどうかとか、圧縮するかとか)をそれぞれフィールドとして持っている。個別のDialOptionはこれらのデータをセットする関数になっている。

func WithInsecure() DialOption {
  return func(o *dialOptions) {
    o.insecure = true
  }
}

といった具合。こういうデータを受け取る関数の側では、

func Dial(target string, opts ...DialOption) (ClientConn, error) {
  opt := defaultOptions()
  for _, o := range opts {
    opts(opt)
  }
  ...
}

といったふうに適用していく。

こういう “dialOptions” みたいなstructがほしいんだとすると、単純にその型をexposeしておいて、指定させておけばいいのではないか?とおもうかもしれない。つまり、

func Dial(target string, opt *DialOptions) (ClientConn, error) {
  ...
}

こんなかんじで定義しておいて、

conn, err := grpc.Dial(target, &grpc.DialOptions{})

こんなふうにつかうイメージ。

この手法と比較すると、可変長引数のオプションをつらねる方式の利点はいくつか考えられる。

  • そもそもオプションをとくに指定したくない場合には何もかかなくてもよい
  • デフォルト値をゼロ値と想定しなくてよい
  • それなりに記述的な表現ではある

いっぽう、欠点としては、

  • gRPCの例でもそうなんだけど、なんとかオプションみたいなものが多種類あるとあつかいがめんどうになりうる。おなじような意味で対応するDialOptionとServerOptionを指定したいときに関数名をかえないといけなかったりとか(がんばればできるかもしれないが、型が微妙にちがう場合などもありうるとすると限度がある)
  • 可変長引数としてつかえるのは一種類のデータだけなので、何種類も使えない

でもまあおもしろいイディオムだなーとおもう。Goのシンボル可視性、可変長引数の挙動、関数型の扱い、などが絶妙にくみあわさっているようにかんじる。

それにしても、おもしろいとおもうのにGo以外でぜんぜんみたことないパターンだよな、なぜだろうか……とつらつらかんがえてみたところ、なんのことはない、ほかの言語にはふつうにデフォルト値指定できるラベル引数があるからであった。どっちかというと言語レベルでラベル引数あればよかっただけで、いまはこういうパターンでしのいでいるとみるべきだろう。ガッカリおち。