2022年2月6日追記
この記事の内容は古い内容となります。
最近の記事はこちらをご覧ください。
上の記事をUnicodeに対応させたコモンイベントの例はこちら(公式コモン集)からどうぞ。
ご自由にお使いください。
--- ここから以前の記事 ---
久々にゲーム製作とは全く関係の無いウディタのシステムについての話です。
今回の記事は「できそうなら実装する」の中に入れておいた「多言語化」です。
製作の負担が非常に大きく、細かな制約があるため多言語化は限定した部分のみの実装となります。
誰か任意のフォントかつ任意のフォントサイズで上下左右の余白を自由に弄れる、文字をpng画像化するツールを作ってください。それさえあれば負担が9割9分減ります。
はじめに
ウディタを触った事がある方なら知ってのとおりですが、ウディタでは文字コードとしてShift-JISが採用されてます。
そのため文字によっては表示できず、「?」が表示されたり、強○終了したりします。
ゲーム基本設定で中国語とハングル文字にも対応はできますが、弊害として日本語に対応できなくなるという欠点があります。
またゲーム基本設定を変更してもEditor.exeでShift-JISに無い文字を入れると「?」に置き換えられてしまいます。(対策があるかも?)
ですのでテキストファイル等から文章を読み込まないと日本語OSでShift-JIS外の文字は使用できません。
多言語化についてですが、上述のとおり英語などの「ウディタで使える文字だけ」で構成された言語であれば手間はかかりますが、実装はまだ楽です。
問題はそれ以外の言語で、普通の方法だとどうにもなりません。
そこで「中国語(簡体字・繁体字)に無理矢理対応させてしまおうという」のが今回の記事となります。
完成例
からくり
今回ゲームで使用するための翻訳文は以下のように設定してます。
今回作った翻訳機は以下の順番で処理をしています。
1.翻訳後の文章を用意する
2.ツールを利用し、ウディタで使えない文字を変換用の文字に置き換える
3.ゲーム内で、置き換わった文字を\imgの文法にさらに変える
4.文章として表示する
やり方
コード取得
今回は以下のサイトから「GB2312」(簡体字)と「Big5」(繁体字)の文字コードを取得いたしました。
(難しい事を考えないのであれば、Ctrl+Aで全て選択してからメモ帳に貼り、要らない部分を消すと手っ取り早いです)
https://uic.jp/charset/supported_list/
タブ文字を,に置換し、一番上にCSVとして取得されるよう見出し文字を追加するとこうなります。
できたファイルはUTF-8か何か(正常に保存できる文字コード)で保存してください。ANSIだと正常に保存できません。
Excelで間違って開かないよう、保存時の拡張子は「txt」を推奨します。
一番左の列を数字として取得する箇所があるのでExcelでは開かないでください。
ウディタで使用できる文字を変換しないようにする方法の例
※全部\imgで表示させてしまう場合はこの項は必要ありません。
ウディタには「使用できないをエディタに貼ると「?」に置き換わる」という仕様があります。
この仕様を利用し、以下の手順で使用できる文字を抽出したファイルを作ります。
1.文字コードがあるファイルを複製する
2.複製したファイルと何も文字が入っていないメモ帳を開く
3.複製したファイルの中身を切り取り、エディタに貼り付ける
※Ctrl+Aで一気にコピペするとエディタの最大文字数に引っかかるため、何回かに分けておこなわないといけません。
4.貼り付けた物をCtrl+Aで選択し、切り取って空のメモ帳に貼り付ける
5.複製したファイルの中身が空になるまで3と4を繰り返す
6.空になったら処理した物が入っているメモ帳の内容をCtrl+Aで選択し、複製したファイルに貼り付けて保存する
7.「?」があるならその部分を処理しないようにする
変換
※サンプルコードは「実際の挙動について」のファイルを落として覗いてください。110行ほどあるので書くと長くなります。
私はこんな感じで作りました。
1.input.txtの中に変換したい内容を「1文字ずつ改行して」保存する
理由は知りませんが、改行しないと変換できない事があります。
2.Config.txtの中身を取得し変換モードを決定・文字コードのファイルをCSVファイルとしてUDBかCDBに取得
3.input.txtを取得する
4.DBに入れた文字を1文字ずつ取得し、変換モードに応じて一致する文字を置換する
5.一番最後まで取得が終わったら1行ずつ切り出して出力用の文字列変数に足して出力
文字の画像化
・表示する画像をください。
・気合で用意してください。
・手作業で作るなら以下のサイトを使って画像化し、加工すると少しだけ負担が減ります。(画像化せず右クリックで保存してください)
https://ysklog.net/tool/text-img-generate.html
※ゲームのフォントサイズが「28」の場合
フォントタイプ:MS ゴシック
フォントサイズ:20
フォントの色:白
画像背景の透過度:100%
最終的な画像サイズ:縦28px,横28px
いい感じに調整して保存するとこんな風な画像となります。
翻訳文の取得方法
今回はテキストファイルに原文と翻訳後の文章を入れておき、文字列操作にある<から指定文字まで>と<の指定文字以降を切り出し>を使い取得しました。
例として「,てすと,test,\zhcn[B2E2]\zhcn[D1E9],測驗,」のような形でテキストファイルに入力し、ゲーム側で「てすと」と入れると、「,てすと,」以降が切り出されます。
さらに言語設定の数値から1を引いた値を使い、「,」以降の文字を切り出し、最後に「,」までの文章を切り出す事で表示させたい文章を取得できます。
(文章だと滅茶苦茶分かり辛い気がしたので該当箇所のサンプルコードです)
*
■文字列操作:CSelf7[改行無] = CSelf5[文章]
■文字列操作:CSelf8 = CSelf9
■文字列操作:CSelf8 =<の指定文字以降を切り出し> ",\cself[7],"
■条件分岐(文字): 【1】 CSelf8が "<<NotFound>>" と同じ
-◇分岐: 【1】 CSelf8 "<<NotFound>>" と同じ の場合↓
|■イベント処理中断
|■
◇分岐終了◇
■変数操作: CSelf10 = CSelf1 - 1
■回数付きループ [ CSelf10 ]回
|■文字列操作:CSelf8 =<の指定文字以降を切り出し> ","
|■
◇ループここまで◇◇
■文字列操作:CSelf8 =<から指定文字まで切り出し> ","
■条件分岐(文字): 【1】 CSelf8が "" と同じ 【2】 CSelf8が "<<NotFound>>" と同じ
-◇分岐: 【1】 [ CSelf8 "" と同じ ]の場合↓
|■イベント処理中断
|■
-◇分岐: 【2】 CSelf8 "<<NotFound>>" と同じ の場合↓
|■イベント処理中断
|■
◇分岐終了◇
■文字列操作:CSelf5 = CSelf8
ここで注意すべき点ですが、翻訳文が入ったファイルは文字コードを「ANSI」に変えて保存してください。
Windows10だと、新たに作ったメモ帳や空欄のまま保存したファイルは「UTF-8」として保存されてしまいます。
UTF-8だとShift-JISと互換性が無いため、ウディタ上で正しく処理できません。(n敗)
変換コードを\img(画像)に変える方法
特殊文字周りでバグがありそうですが、以下のコードでなぜか動いてます。
*
■文字列操作:CSelf5[文章] =<から文字列を置換> "]" → ".png]"
■文字列操作:CSelf5[文章] =<から文字列を置換> "\zhcn[" → "\img[Language/zhcn/"
■文字列操作:CSelf5[文章] =<から文字列を置換> "\zhtw[" → "\img[Language/zhtw/"
■文字列操作:CSelf5[文章] = "\img[Language/FFFF.png]\cself[5]"
■文字列操作:CSelf5[文章] =<から文字列を置換> "\n" → "\n\img[Language/FFFF.png]"
※最後の2行は、フォントサイズ(\f[]含む)を指定以下の値にするとimg表示の前と後で表示位置が変わってしまう挙動への対策です。(文章の途中で\f[]を入れた場合は上の処理では対応できません)
横1px、縦28px(imgの縦サイズと同一)の透過画像を用意してください。
※\nは「\n」ではなく「改行」です。
実際の挙動について
Translation.zip (9.98MB)
ダウンロード
全ての文字が正しく変換できているかは確認していません。
使いやすいよう改造してお使いください。
おまけとして表示を確認する為の機能も入れてありますが、各自で画像を用意する必要があります。
注意点
・今回の例では頻繁に変わる変数に対応させるには処理を分ける必要があるため、変数は対応できない物とお考えください。
文章に変数を使う事を前提にする場合、可変データベースにCSVを読み込み「データIDと項目IDを使い文章を呼び出す」形にする必要があります。
・頻繁に変えない変数だけに対応させる場合は「変数の中身が変わったタイミングで」翻訳文を保存し直してください。負荷はかかりますがそれだけで対応できます。
追記(2月20日)
・可変データベースを使ってもよいのであれば、翻訳文をCSVファイルとして読み込み、手を加えずにセーブする事で翻訳文の特殊文字を特殊文字のまま保存できます。(そんな仕様ありましたね……)
この挙動を使うと、以下のようなイベントコードを書くと変数にも対応できます。
(モード-1を先に実行し、翻訳前にCSelf9が空白ならモード-2を実行する流れです)
・翻訳文に「,」・「"」・「\n(改行文字」は入れないでください。CSV取得のせいでバグります。
使い勝手
非常に悪いです。
文字を全て画像として表示させないと、ピクチャの拡大率で大きさを変更した場合に、元の文字が画像以上に潰れて読めなくなります。
ですのでフォントサイズを変えて表示する必要がある場合、専用に画像を用意か、翻訳文のみフォントサイズを変えずに表示させる無難です。
ゲームの進捗
画像として貼れる物が無いため、やる事をまとめたリストと進捗を置いておきます。
(進捗や諸事情により一部内容は没となる可能性がございます)
v1α13
目標:20/3/31
作業が終わった物の先頭に○を追加
追加
・ふれあい機能の動作テスト版を実装
○・ミニゲームにある「避けるアレ」を遊べるよう調整
当たり判定や弾の挙動がおかしいですが修正が大変なので仕様とします。
・大会機能を仮実装
※現在は最低ランクのみ出場できます。
※魔物が敵で出ますが、敵は固有特性を含め特性を持ってません。
○・どうぐやを実装
アイテムの購入・売却をおこなえます。
○※一部商品は特定の月のみ購入できます。
・敵を追加
※現状は敵限定となります。
○・言語設定に以下の物を追加
-英語
-中国語(簡体字・繁体字(言語不明))
※現状では「はい、いいえ」の選択肢など、一部箇所のみの対応となります。
※原文をちょこっと弄ってGoogle翻訳に突っ込んだ物を使用しています。
そのため正しく翻訳されているかは一切保証できません。
※繁体字は台湾語なのか広東語なのかは分かりません。
修正
○・一部選択肢を選んだ場合にSEが同時に再生されるバグを修正
○・一部の「はい、いいえ」選択肢で「いいえ」を決定キーで選ぶと、キャンセルキーでキャンセルした場合のSEと異なるミスを修正