ラベル Hegemony Rome の投稿を表示しています。 すべての投稿を表示
ラベル Hegemony Rome の投稿を表示しています。 すべての投稿を表示

2017年10月4日水曜日

Hegemony Rome: The Rise of Caesar 日本語化 進捗状況

---
2025/2/17 追記
Google ドライブの共有リンクの URL が 2022 年 2 月中旬と 2021 年 9 月 13 日にセキュリティアップデートが適用されたことに伴い変更されたことに伴い記事内のリンク先を変更しました。
追記ここまで
---
日本語話者でやってる人いるのこれ?

ま、昨日より日本語化し始めたHegemony Rome: The Rise of Caesarですが、とりあえず概ね機械翻訳にかけ終えました。

和訳作業シートから生成されたlanguage.strはこちらからダウンロードいただけます(※これは最新版ではない可能性が極めて高いです。できればシートを直接ご利用ください)。

どんな感じになるか、スクリーンショットを取るのも面倒なのでイントロからゲーム開始までを撮影してみました。

この記事よりシートのほうが更新日時が新しければ、それはメンテナンスがかかってるということなのでそういう意味で記事にしときます。

*** 2017/10/16 追記 ***
DLCの翻訳も作成しましたので、各DLCのlanguage.strのダウンロード元を追記します。


*** 追記ここまで ***

具体的な成果物(日本語化作業シートのこと)からlanguage.strに落としてご利用くださいませ。

以下無駄口。

しかしまあ、文章本文中にhtmlのタグをまねた似非タグが散りばめられているのですが、これがまた極めて厳密。
等号の右辺と左辺の間にスペースがあるとゲームがクラッシュ。
タグを閉じ忘れてもゲームがクラッシュ。

機械翻訳の結果をそのまま掲載できない(タグの処理がグダるため)ので、手動でタグをつけたり外したりという手間を考えると、これをとりあえずはざっとでも機械翻訳にかけ終えられたのは奇跡ですわ。

とはいえ、まだタグの閉じ漏れなどが多数残っているようで、抜けやタグの閉じ忘れなどの見直しが必要ですが、とてもじゃないが手が回りません。
タグの閉じ忘れチェックツールを書く必要がありそうです。
とりあえずもうクラッシュはしないとは思います(2017/10/05)。

それと、google翻訳先生にお任せしている翻訳作業ですが、これがまあひどいひどい。
日ごろに輪をかけてすごい。

Ambushがマダムスタンドという訳文になったのはもう本当にうんざりしました。
誰かがそういう訳をgoogle翻訳に教え込んだんでしょうが・・・意味わからん。そもそもマダムスタンドってなんだろう??

そのほか、ゲルマンがドイツ人だったりガリアがゴールはいいとして、特にガリアの訳が挙句の果てはガリックだのゲーマーだのガルだのガールだのゴルだの、その他ありとあらゆるカタカナでこれでもかというほどバラエティ豊かな表現ぶり。
最終的には一括置換でもいいので訳語を統一しないといけませんね、誰かが

あとは表示領域内に収まりきらない文が勝手に切り捨てられるという現象も一部で見られているので、これを収まる訳文にブラッシュアップするなどの手間もかけないといけなさそうです。誰かが

最後にはローマ風に上院という訳文を元老院にするとか地名や民族名を英語読みから当時の呼び名にしたりサソリと訳されちゃうスコルピオなどのローマが誇る攻城兵器の名前を統一したりできればカンペキですが。。。カエサルがカールになったりシーザーになってるのをどうにかするのも必要ですね。誰かが

まあ、なんちゅうか。日本語話者でやってる人いるのこれ?(repeated)

今まで手掛けた和訳でも最も需要がないことが見え見え・・・しかもゲーム自体をやってないので面白いのかどうかも不明。我ながら極めて間抜け。

ここまでやったらもうガウル、ガリア、じゃなくてゴールしていいかなぁ
でもboldで書いた誰かって、私ですよねぇ

いつもなんでこういうことしちゃうんだろ。

2017年10月3日火曜日

Hegemony Rome: The Rise of Caesar 日本語化作業シート

和訳作業シートはこちらです。
イヤな目に会った前例により、匿名の方の直接の編集はお断りしております。編集権が欲しい方はシートへのコメント、またはこちらのコメント欄よりご請求ください。
どうしても編集したいけど匿名でいたい方はご自分のドライブにコピーする権限は付与してございますので、コピーなりダウンロードなりしたうえで利用ください。

まだ先日購入したバンドルのうち一作もやってないんですが、その一つのHegemony Rome: The Rise of Caesar、だれも手を付けていないけれど、日本語化できそうだネってな具合で手を付けてみたら極めて優秀な多言語対応ぶりで感動しました。

思わず作業シートと、作業シートからlanguage.strを再生成するスクリプトを作ってみたところ、結果は良好です。
例えば、ローディングスクリーンではこんな具合。ごめんね、機械翻訳でごめんね。
ナレーション画面だとこんな感じ。
デフォルトフォントだと中華系のフォントが入っていて日本語で使われる文字の収録数が少ないため、やたらと豆腐になるのですが、フォント設定(fontregistry.xnt)を変えるだけで上のサンプルのようにバッチリ日本語がきれいに表示されています。なお、上記のサンプルで使用したフォントはmeiryoです。
蟹行文字文化圏にありがちな文字間に(日本語では不自然な)空白を入れる必要もなく、極めて優秀、単純に翻訳するだけでおしまいなパターンなんてめったにありませんのでなんだかうれしくなっちゃいますねえ。

こんなに簡単に日本語化できるんならだれかやっててもよさそうなのに誰もやってない。
つまり・・・そういうことなんでしょうねえ。

なお、私自身もゲーム自体はやってないですしやるかどうかもわかりません。
やけにメモリ食うし動作も軽快とは見えないし、何よりマウスカーソルを奪ったらキーボード操作を介さないと放してくれないという、まるで20世紀に作られたかのようなプログラムなので、私の好みにまったくあいません。
ゲームの内容を理解する前に放棄するんじゃないかなあと思っています。そもそもバンドルについてきたってだけでのご縁ですので、いまだにどんなゲームかもまだ知らないですし。

余談ですが、google translateはローマ史が苦手みたいですね。
ガリアを正しくガリアと表記できたパターンがほとんどなくガウルだったりガールになってみたり、さらにはヴェルティンジェトリックスや小カトーなどは翻訳すらできないケースもちらほら散見されます。
まあ、アメリカだからいいのかな。ヨーロッパだったら許されない気もするけど。

ま、このまま機械翻訳を進めても、この調子じゃどうしようもないかもしれませんねぇ。

とりあえず、作業シートのTSVからlanguage.strを再生成するスクリプトは以下です。
注意点:
  • 以下の作業はHegemony Rome\Resources\Entitiesで行ってください。
  • オリジナルのlanguage.strはlanguage.str.orgにリネームする。
  • 作業シートの1行目および、全行のカラムA,B,C,Dは変更不可(下記のE,F列にある翻訳結果をlanguage.strに反映するために使用するためです)
  • カラムEに機械翻訳(必須。英文のままでも構いません)、カラムFに手動翻訳(空欄可)があること
  • 上記の点に留意なさって、作業シートを開いてコピペしてa.tsvというファイルとして保存。ダウンロードではない点に注意。
そのうえで以下のスクリプトを実行した結果をlanguage.strにリダイレクトして保存します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env perl -w
#
# Hegemony Rome: The Rise of Caesar用
#  日本語化language.str生成スクリプト
#
# 引数: 日本語化済tsvファイル名
#   ハイフン: 標準入力
#   省略時  : a.tsv
#   ※tsvの内容は以下のシート内容をCtrl+Aで全コピーした内容を保存したファイル
#     https://docs.google.com/spreadsheets/d/1ZxyFLIHI7GFTSxWfHxfhY601CNAkSZZdEaymD6WYeAU/
# 必要データファイル(実行ディレクトリにあること):
#   language.str.org (オリジナルのlanguage.strをリネームしたもの)
# 出力先: STDOUT (language.strにリダイレクトして使用)
#
our $LANGUAGESTRMADEDATE=`LANG=C date`;
sub conbined_text_decode
{
  my $str =$_[0];
  my @arr = split( /\t/m, $str );
  my $text = $arr[4];
  if( defined( $arr[5] ) && $arr[5] ne "" && $arr[5] ne "\n" && $arr[5] ne "\r\n"){
    $text = $arr[5];
  }
  $text  =~ s/"//mg;
  $text  =~ s/"/\"/mg;
  $text  =~ s/\\t;/\t/mg;
  $text  =~ s/\n\n$/\n/mg;
   
 
  $text =~ s/%%%LANGUAGESTRMADEDATE%%%/$LANGUAGESTRMADEDATE/;
  return $text;
}
sub tag_check
{
  my ($indexno,$line) = (@_);
  my $str = $line;
 
  my $pre  = $str =~ s/<//g;
  my $post = $str =~ s/>//g;
   
  if( $pre != $post ){
    print STDERR "$line $pre vs $post TAG ERROR index=$indexno\n";
  }
}
my @TSV=();
my $combinedline="";
my $mode = 0;
my $translate_indexno = 0;
my $lineno = 0;
my $isfirst = 0;
my $INPUTFNAME=$ARGV[0];
my $FH = *STDIN;
if(!defined($INPUTFNAME)){
  $INPUTFNAME="a.tsv";
}
if( $INPUTFNAME ne "-" ){
  open (FIN_TSV, "<$INPUTFNAME") or die "can't open tsv $INPUTFNAME";
  $FH = *FIN_TSV;
}
while(<$FH>){
  my $line = $_;
  my @arr = split( /\t/,$line);
  if( $arr[0] eq "#lineno" ){
    next;
  }
  if($isfirst ==0){
    $combinedline = $line;
    $isfirst  = 1;
    next;
  }
 
  if( $#arr >= 2 && $arr[0] =~ m/^\d+$/ && $arr[1] =~ m/^\d+$/ ){
    @arr = split( /\t/,$combinedline);
    $translate_indexno = $arr[1];
    $TSV[ $translate_indexno ] = conbined_text_decode( $combinedline );
    $combinedline = $line;
  }
  else{
    $combinedline .= $line;
  }
}
my @arr = split( /\t/,$combinedline);
$translate_indexno = $arr[1];
$TSV[ $translate_indexno ] = conbined_text_decode( $combinedline );
if( $INPUTFNAME ne "-" ){
  close(FIN_TSV);
}
 
 
$combinedline="";
$mode = 0;
$translate_indexno = 0;
$lineno = 0;
open (FIN, "<language.str.org") or die "can't open language.str.org";
while(<FIN>){
  my $line = $_;
  $lineno++;
  if( $line =~ m/^%%LANGUAGE=en[\r\n]+/ ){
    $mode  = 1;
    print $line;
    next;
  }
  if( $mode  == 1 && $line =~ m/^%%STRING=<<HEREDOC[\r\n]/ ){
    $mode  = 2;
    $combinedline="";
    print $line;
    next;
  }
  if( $mode == 2 ){
    $translate_indexno++;
    $mode = 3;
    $combinedline = "";
  }
  if( $mode == 3 ){
    if( $line =~ m/^HEREDOC[\r\n]/ ){
      if(defined( $TSV[ $translate_indexno ])){
        tag_check( $translate_indexno, $TSV[ $translate_indexno ] );
        print $TSV[ $translate_indexno ];
        if( $TSV[ $translate_indexno ] !~ m/\n$/ ){
          print "\n";
        }
      }
      print $line;
      $mode = 0;
    }
    else{
      $combinedline .= $line;
    }
    next;
  }
  elsif( $mode == 0 ){
    print $line;
  }
}
close(FIN);
使い方はスクリプトの井桁(#)が並んでいる冒頭部分にあります。同じものがシートの備忘録にもありますので、そちらのほうが分かりやすいかもしれませんのでご覧ください。
いやあ、どんなOS(Windowsですら)でもperlがのってないOSはない時代になったので説明が楽でいいですわ。

結果だけ欲しい?
私もです。
まあ、翻訳元文が3,648文もあるんで、暇を見つけて機械翻訳にかけていきたいと思ってはいます。
そしてゆくゆくは機械翻訳版language.strを直接ダウンロードできるようにはしたいと、まあ・・・どうかなぁ。やらない気がするゲームなのでモチベーションは正直申し上げてかなり低いです。特に原文を機械翻訳にかけて結果をシートにペーストするような単純作業といった場合、モチベーションの低さが作業量に直結することは率直に認めます。

我こそは訳出するゾ、という方がおいでであればぜひよろしくお願いいたします。
ま。過去の例で一人も出てきたことはないうえにCapitalism Labでは古い古いと苦情ばっかりみたいなので申し訳ないです。そのために作業シート、変換ツール、ノウハウまで公開してんだろ。自分でやれよ