Googel Cloud TranslationをUnityで使う

# Googel Cloud Translation
　[Cloud Translation](https://cloud.google.com/translate/) は、Google のニューラル機械翻訳技術を使用して、テキストを 100 以上の言語に瞬時に翻訳してくれるサービスです。今回は、Cloud TranslationのうちCloud Translation - Basic V2をUnityで使用する方法について解説します。

# 料金
　Cloud Translationは、毎月最初の500,000文字までは無料で利用することができます。以降は、翻訳を行なった原文の文字数に対して請求されます。この文字数は、マルチバイト文字であっても１文字としてカウントしてくれますが、空白文字を含む全ての文字がカウント対象に含まれるのでご注意ください。例えば`<p>こんにちは</p>`は12文字、空のクエリは1文字としてカウントされます。
詳しくは、[Cloud Translation の料金](https://cloud.google.com/translate/pricing)

# 前準備
　[Google Cloud](https://cloud.google.com/)のGet started for freeから支払い情報を入力し、Google Cloudに登録します。登録後、自動でMy First Projectが生成されます。

![スクリーンショット 2022-01-23 23.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527414/ee2a3f95-297a-802e-4743-37d5c346e44e.png)

　次は、左のタブのAPIとサービス -> ライブラリからClooud Translation APIを有効化します。

![スクリーンショット 2022-01-23 23.09.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527414/83f14662-e591-c12f-7287-e8708cf14cb2.png)

　最後に左のタブのAPIとサービス -> 認証情報から認証情報を作成 -> APIキーを選択します。このAPIキーが外部に公開されると、意図しない請求が発生する可能性があります。利用が終わった後は、必ずAPIキーを削除するか、[API キーを保護する](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)に従ってキーの保全に努めてください。

![スクリーンショット 2022-01-23 23.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527414/b831211e-34f5-05e2-7070-9fd78a23cffb.png)

# 実装

特に変わったことはなく、[リファレンス](https://cloud.google.com/translate/docs/reference/rest/v2/translate)に従って実装していきます。

```c#:TranslateSample.cs
using System;
using System.Collections.Generic;
using System.Text;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;

namespace Sample
{
    public sealed class TranslateSample : MonoBehaviour
    {
        private const string APIKey = "Your API Key.";
        private readonly string _url = $"https://translation.googleapis.com/language/translate/v2?key={APIKey}";

        private void Start()
        {
            Translate("en", "ja", "It is raining.");
            // 雨が降っている。
        }

        private async void Translate(string sourceLanguage, string targetLanguage, string sentence)
        {
            var query = new TranslateQuery
            {
                source = sourceLanguage,
                target = targetLanguage,
                format = "text",
                q = sentence
            };

            var requestBody = JsonUtility.ToJson(query);
            var postData = Encoding.UTF8.GetBytes(requestBody);

            using var request = new UnityWebRequest(_url, "POST");
            request.uploadHandler = new UploadHandlerRaw(postData);
            request.downloadHandler = new DownloadHandlerBuffer();
            request.SetRequestHeader("Content-Type", "application/json");

            await request.SendWebRequest();
            
            var translateResponse = JsonUtility.FromJson<TranslateResponseBody>(request.downloadHandler.text);

            foreach (var translate in translateResponse.data.translations)
            {
                Debug.Log(translate.translatedText);
            }
        }
        
        [Serializable]
        public class TranslateQuery
        {
            public string source;
            public string target;
            public string format;
            public string q;
        }

        [Serializable]
        public sealed class TranslateResponseBody
        {
            public TranslateTextResponseList data;
        }

        [Serializable]
        public sealed class TranslateTextResponseList
        {
            public List<TranslateTextResponseTranslation> translations;
        }

        [Serializable]
        public sealed class TranslateTextResponseTranslation
        {
            public string translatedText;
        }
    }
}

```

翻訳するの言語のコードは[言語コード](https://cloud.google.com/translate/docs/languages)から参照してください。
ちなみに`TranslateQuery`の`q`は`List<string>`でもいけたりします。