【Unity(C#)】Google Cloud Translationの使い方

##はじめに
UnityからGoogle Cloud Translationを使用する方法をメモします。

## Google Cloud Translation
Googleの提供する翻訳WebAPIです。

下記リンクより登録に進みAPIキーを取得します。
【参考リンク】：[Translation](https://cloud.google.com/translate)

登録後、下記ダッシュボードの画面からAPIキーを取得可能です。
![GoogleCloudTranslationAPIキー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/df705c7a-0096-a24f-b788-e8b74b12f8ac.png)


料金は従量課金制ですが、[1月当り500,000文字までは無料](https://cloud.google.com/translate/pricing)で使えるようです。

##バージョン
念のため使ったライブラリ等のバージョンも書いときます。
>Unity 2019.4.8f1
UniTask.2.2.4
UniRx 7.1.0

##コード
Unityから使用するサンプルです。
GIFにおいては使用しているAPIは異なりますが、下記と同様に動作します。

【参考リンク】：[【Unity(C#)】Microsoft Translatorの使い方](https://qiita.com/drafts/c3b6799c91b26317b4be/edit)
![MSTranslatorSample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/a5c737b8-3a90-986b-6bcf-43d1db525976.gif)




```C#:適当なオブジェクトにアタッチ
using System;
using System.Linq;
using System.Threading;
using Cysharp.Threading.Tasks;
using UniRx;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

/// <summary>
/// GoogleTranslationの最小構成サンプル
/// </summary>
public class GoogleTranslationTest : MonoBehaviour
{
    [SerializeField] private Dropdown fromLanguageDd;
    [SerializeField] private Dropdown toLanguageDd;
    [SerializeField] private Button translateButton;
    [SerializeField] private InputField inputField;
    [SerializeField] private Text translationText;

    private const string API_KEY = "APIキー";
    private const string ENDPOINT = "https://translation.googleapis.com/language/translate/v2?";

    /// <summary>
    /// レスポンスを格納する構造体
    /// </summary>
    [Serializable]
    public struct TranslateData
    {
        public Data data;
        
        [Serializable]
        public struct Data
        {
            public Translations[] translations;
        
            [Serializable]
            public struct Translations
            {
                public string translatedText;
                public string detectedSourceLanguage;
            }
        }
    }

    private void Start()
    {
        var token = this.GetCancellationTokenOnDestroy();

        //ドロップダウンメニュー作成
        var languages = Enum.GetNames(typeof(Language));
        fromLanguageDd.ClearOptions();
        fromLanguageDd.AddOptions(languages.ToList());
        toLanguageDd.ClearOptions();
        toLanguageDd.AddOptions(languages.ToList());
        fromLanguageDd.value = (int) fromLanguage;
        toLanguageDd.value = (int) toLanguage;
        
        //翻訳元言語
        fromLanguageDd.OnValueChangedAsObservable()
            .Subscribe(value => { fromLanguage = (Language) value; })
            .AddTo(this);

        //翻訳後言語
        toLanguageDd.OnValueChangedAsObservable()
            .Subscribe(value => { toLanguage = (Language) value; })
            .AddTo(this);
        
        //翻訳ボタン押下
        translateButton.OnClickAsObservable()
            .Subscribe(async _ =>
            {
                //結果が送られてくるまで待ってから表示
                var result = GetTranslation(fromLanguage, toLanguage, inputField.text, token);
                translationText.text = await result;
            })
            .AddTo(this);
    }

    /// <summary>
    /// 設定言語
    /// </summary>
    private enum Language
    {
        ja,
        en
    }

    private Language fromLanguage = Language.en;
    private Language toLanguage = Language.ja;

    /// <summary>
    /// 翻訳結果を返す
    /// </summary>
    /// <param name="from">翻訳前の言語設定</param>
    /// <param name="to">翻訳語の言語設定</param>
    /// <param name="speechText">翻訳したい文字列</param>
    /// <param name="ct">CancellationToken</param>
    /// <returns>翻訳結果</returns>
    private async UniTask<string> GetTranslation(Language from, Language to, string speechText, CancellationToken ct)
    {
        //POSTメソッドのリクエストを作成
        var requestInfo = ENDPOINT;
        requestInfo += $"key={API_KEY}&q={speechText}&detectedSourceLanguage={from}&target={to}";
        var request = UnityWebRequest.Post(requestInfo, "Post");

        //結果受け取り
        var second = TimeSpan.FromSeconds(3);
        var result = await request.SendWebRequest().ToUniTask(cancellationToken: ct).Timeout(second);
        var json = result.downloadHandler.text;
        Debug.Log(json);
        var jsonData = JsonUtility.FromJson<TranslateData>(json);
        return jsonData.data.translations[0].translatedText;
    }
}
```

リクエストパラーメーターとして渡す言語情報の文字列は下記に載っています。
【参考リンク】：[言語サポート](https://cloud.google.com/translate/docs/languages?hl=ja)

##おわりに
DeepLも試したのでまとめます。

試しました→[【Unity(C#)】DeepL Translatorの使い方](https://qiita.com/OKsaiyowa/items/b6873ca171d325828f61)