🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ローカライゼーション

ローカライゼーション(L10n)とは、地域に適した内容を付け加えたり、テキストを各国の文書に適時翻訳することによって、ソフトウェアを現地語環境に適合(地域化)させる事を指します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1188閲覧

Unity: リスト内の複数の要素(文章)をローカライゼーションするアドバイスが欲しいです。

Kotaro22

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ローカライゼーション

ローカライゼーション(L10n)とは、地域に適した内容を付け加えたり、テキストを各国の文書に適時翻訳することによって、ソフトウェアを現地語環境に適合(地域化)させる事を指します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2019/10/28 08:00

イメージ説明

イメージ説明

上記の設定から下記のイメージの様に文章を作成し、シーン内のテキストにリスト内の24の文章が表示される様に設定したのですがプログラミングの経験も浅くUnityでの初めてのアプリ作成でもあり、どの様にローカライゼーションするべきか分からずにいます。I2 Localizationをインポートしてみたのですがリストへの適用は難しそうだったのでここで質問させてもらいました。

イメージ説明

Localization++も使用しようと試してみたのですが現在の自分では柔軟に使いこなせそうにありませんでした。C#やUnityでのローカライゼーションに明るい方がいましたらアドバイスを頂けないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

汎用性に欠けちゃうんですが、リストをそのまま使いまわしたいってことなら最悪既存クラスの拡張で対応とか…は駄目ですかね? 24個ぐらいならこれでも書けるかなーとは思うのですが

cs

1 [System.Serializable] 2 public class Question { 3 public string fact; // 日本語 4 public string factEN; // 英語 5 public string factCN; // 中国語 6 } 7 8 Language currentLanguage = Language.JP; // とりあえず日本語選択 9 10 enum Language { 11 JP, 12 EN, 13 CN 14 } 15 16 17 void SetCurrentQuestion() { 18 currentQuestion = unansweredQuestions[currentQuestionIndex]; 19 switch (currentLanguage) { 20 case Language.EN: 21 factText.text = currentQuestion.factEN; 22 break; 23 case Language.CN: 24 factText.text = currentQuestion.factCN; 25 break; 26 default: 27 factText.text = currentQuestion.fact; 28 break; 29 } 30 } 31

もっと汎用的や拡張性を考えると、キーなどを決めて対応する言語を入力して外部に翻訳データを作っていくとかになると思います。

主キー,日本語,英語 fact1,あなたは犬好き?,Do you like dog? fact2,あなたは猫好き?,Do you like cat?

質問1のときはfact1の行のデータを取得して、日本語なら2列目のテキスト、英語なら3列目のテキストを引っ張ってくる…みたいなやり方でしょうか。

#追記(2019/10/31)
思いついた内容を実装したサンプルなので、これが必ずしも正解というわけではありませんが外部化してみるテストです。(質問者さんのListを使いまわしたいという願望からは外れます)

まず、翻訳用データのテキストファィルを2つ作成します。UTF-8などの文字コードで保存してください。
保存先はアセットフォルダに【Resources】というフォルダを作成し、更に【Language】というフォルダを作成し、【language_**.txt】という形式で保存します。
(例:【Resources\Language\language_ja.txt】)

● language_ja.txt

txt

1fact1,こんにちは 2fact2,おはよう! 3fact3,さよなら! 4fact4,僕ドラえもんです 5fact5,僕はおにぎりが大好きなんだなぁ 6fact6,おっす、おら悟空! 7fact7,月にかわってお仕置きよ!

● language_en.txt

txt

1fact1,Hello! 2fact2,Good morning. 3fact3,Good-bye. 4fact4,Hello, I'm Doraemon 5fact5,I love Riceball 6fact6,Hi. this is Goku! 7fact7,In the name of the Moon I shall punish you!

テキストIDに対するテキストがそれぞれ保存されていることがわかります。
(例: fact1 であれば こんにちは (英語ならHello!))

では、これを読み込んで表示するスクリプトを書いてみます。

● LocalizeTest.cs

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class LocalizeTest : MonoBehaviour { 6 7 // 現在の言語設定 8 string currentLanguage = "ja"; // ja,en 9 10 // キーを並べた会話データ。この順番に会話が進む 11 private List<string> gameTextID = new List<string>() { 12 "fact1", 13 "fact3", 14 "fact4", 15 "fact2", 16 "fact5", 17 "fact6", 18 "fact7", 19 }; 20 21 // 翻訳データ。選択中の言語のデータがロードされる 22 public Dictionary<string, string> textData = new Dictionary<string, string>(); 23 24 // 会話の現在の場所を表す変数 25 int clickCounter = 0; 26 27 private void Start() { 28 Debug.Log("現在の言語は " + currentLanguage + " です。マウスクリックで次の会話が表示されます"); 29 LoadLanguageData(); 30 } 31 32 // 翻訳データをテキストファイルから読み込む 33 private void LoadLanguageData() { 34 35 // Resources/Language/language_*.txt を読み込んでいる 36 var loadLanguageText = Resources.Load<TextAsset>("Language/language_" + currentLanguage); 37 38 // 読み込んだテキストデータを改行で区切って配列に代入 39 var languageTextData = loadLanguageText.text.Split('\n'); 40 41 // キー,テキストデータ という構成なので、更に,で区切ってDictionaryに入れる 42 foreach (string text in languageTextData) { 43 // 得た1行を更にカンマで区切る。 44 var myText = text.Split(','); 45 // 区切られた文字列は テキストID と テキスト なのでDictionaryに追加 46 textData.Add(myText[0], myText[1]); 47 } 48 49 } 50 51 void Update() { 52 53 // マウスクリックで会話が進む 54 if (Input.GetMouseButtonDown(0)) { 55 56 // テキストデータのキーから現在の会話IDをチェック 57 var currentText = textData[gameTextID[clickCounter]]; 58 59 // データが見つからなければ戻す 60 if (currentText == null || currentText == "") { return; } 61 62 // テキストを表示 63 Debug.Log("[" + gameTextID[clickCounter] + "]" + currentText); 64 65 // 会話を1つすすめる。カウンターが会話データよりも多ければ0に戻す 66 clickCounter = clickCounter + 1 >= gameTextID.Count ? 0 : clickCounter + 1; 67 } 68 69 } 70 71}

適当なオブジェクトにアタッチして起動したら画面をクリックしてみてください。コンソールに会話文がどんどん表示されるかと思います。

currentLanguage で現在の言語設定を設定しています。jaなら日本語、enなら英語データをロードしにいきます。

キーをあてがって会話文を外部化したので、呼び出したい会話をキーでセットしておけば言語設定に沿った内容が表示されることが期待できます。gameTextIDでは会話の順番をテキストIDで指定しています。

翻訳データ取得のところでは【Resources\Language\language_ja.txt】などのテキストファイルをロードして、その内容を改行ごとにわけて配列に代入しさらにそれをカンマで区切ってDictionary<string,string>にキーとテキストとして代入していきます。
※ よく考えると今回は英語ローカライズとかもするのでカンマは悪手でした、何か区切り文字を他のものに変えても良さそうです(|とか)

あとは画面クリックする度に、会話の順番のテキストIDを使ってDictionaryから該当するテキストデータを探し、それを表示しています。外部化するメリットは、たとえば中国語対応をしたいなと思ったらlanguage_cn.txt を追加して中身をガリガリ書けば良いという感じのところです。

ゲームの日本語化作業とかで得た断片的な知識で書いているだけで、ローカライズが仕事とかではないのであまり鵜呑みにせずこんなこと思いついた人がいる程度に見て頂ければと思います

投稿2019/10/29 00:58

編集2019/10/31 01:34
hogefugapiyo

総合スコア3302

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kotaro22

2019/10/30 08:23

>hogefugapiyoさん 回答ありがとうございます。既存のクラスを拡張した方法を少し自分なりに応用して多言語化しようと思います。 2つ目のアプローチの仕方についての質問になるのですが、外部に翻訳データを作った場合はforeachやforで24回ループさせて表示させたいテキストへ反映させるのかなとぼんやりイメージするのですが可能であれば少し具体的なスクリプトをシェアしてもらい理解を深めさせてもらえないでしょうか?
hogefugapiyo

2019/10/31 01:35

思いついたものを追記しました。あくまでこんなやり方もできるかもねぐらいに思って頂ければ幸いです
Kotaro22

2019/10/31 08:05

>hogefugapiyoさん 事細かくアドバイスをしていただき本当にありがとうございます。シェアして頂いたものをしっかり参照し、今後円滑にローカライズをしていける様ステップアップしていきたいと思います。ローカライズに関する理解を深めるためにとても参考になりました。どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問