DeepL glossary（用語集）を API から使って Google Slide を翻訳してみる

# DeepL glossary（用語集）とは

> [Announcing glossary support for the DeepL API](https://www.deepl.com/en/blog/announcing-glossary-support-for-deepl-api)

2021年8月から `glossary` が API でサポートされています。

`English into Japanese (EN -> JA)` もサポートされ、最大1000個までの用語集を管理できます。

> [Translate your way with the DeepL glossary feature](https://www.deepl.com/en/blog/translate-your-way-with-the-deepl-glossary)

2022年5月から GUI でも対応開始しています。

# 用語集の `csv` ファイル作成

こちらのような `csv` ファイルを作成して活用します。

> [kyouheicf/deepl-glossary](https://github.com/kyouheicf/deepl-glossary)

例えば製品特有なワードとして登録して、変な翻訳を防ぎたいシーンがあります。

```csv:deepl-glossary.csv
Cloudflare,Cloudflare
Workers,ワーカーズ
Rate Limiting,レートリミット
Zero Trust,ゼロトラスト
Remote Browser Isolation,リモートブラウザ分離
Pages,ページズ
Durable Objects,Durable Objects
Images,イメージズ
```

# DeepL glossary（用語集）の作成

こちらの API ドキュメントを参考にします。

> [Manage Glossaries - DeepL API](https://www.deepl.com/docs-api/glossaries/)

`entries=` の部分は URL エンコードされた文字列になるように `csv` から変換をかけています。

例えば、`"sourceEntry1,targetEntry1\nsourceEntry2,targetEntry2"` は

`"sourceEntry1%2CtargetEntry1%0AsourceEntry2%2CtargetEntry2"` というように指定します。

```shell
export DEEPL_API_KEY='YOUR_DEEPL_API_KEY'
export ENTRIES=$(awk -v d="\\\n" '{s=(NR==1?s:s d)$0}END{print s}' deepl-glossary.csv | nkf -WMQ | sed 's/=$//g' | tr -d '\n' | tr = % | sed 's/%5Cn/%0A/g')

curl -X POST 'https://api-free.deepl.com/v2/glossaries' \
	-H "Authorization: DeepL-Auth-Key $DEEPL_API_KEY" \
	-d 'name=My%20Glossary' \
	-d 'source_lang=en' \
	-d 'target_lang=ja' \
	-d 'entries='${ENTRIES}'' \
	-d 'entries_format=csv'
```

以下のように `glossary_id` が結果として得られますので、Google Slide の翻訳に活用します。

```json:result.json
{
  "glossary_id": "bab585c6-62f8-4660-b11a-37c2941271e9",
  "name": "My Glossary",
  "ready": true,
  "source_lang": "en",
  "target_lang": "ja",
  "creation_time": "2022-11-25T15:51:12.392537+00:00",
  "entry_count": 8
}
```

# Google App Script

以前のコードを DeepL glossary（用語集）を活用できるように変更しましたので、こちらを使います。

> [Google App Script コード - Google Slides を翻訳する Google App Script - Qiita](https://qiita.com/khayama/items/e3b3b84d7c643a79b303#google-app-script-%E3%82%B3%E3%83%BC%E3%83%89)

# 結果

以下のスライド内容を比較してみると、おおむね、うまく機能させられたことがわかります。

ただ `Cloudflare,Cloudflare` は機能していますが、`Durable Objects,Durable Objects` は「耐久性のあるオブジェクト」となり、機能していません。

英語を英語のまま残しておくような指定の仕方だと結果として翻訳にかけられてしまう可能性があるので、適切な日本語訳を日本語で明示的に指定してあげる使い方が良さそうです。

## オリジナル

![glossaryTest1](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/glossaryTest1.jpeg)

## DeepL glossary（用語集）なし

![glossaryTest2](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/glossaryTest2.jpeg)

## DeepL glossary（用語集）あり

![glossaryTest3](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/glossaryTest3.jpeg)

# 感想

こうなると次は用語が増えるほど用語集の管理が大変になってくるかもしれませんが、積み重ねで翻訳フィードバックの蓄積を反映できるのは長い目で見たときには品質を改善することにつながってくると思います。

# 参考

- [CData Arc を使ってCSV ファイルからDeepL に用語集を作成する | CData Software Blog](https://www.cdata.com/jp/blog/arcesb-csv-deeplglossaries)
- [How to Join Multiple Lines Into One | Baeldung on Linux](https://www.baeldung.com/linux/join-multiple-lines)
- [Macでnkfコマンドを使えるようにするには？ | Takuya.B.com](https://takuyab.com/archives/8306)
- [シェルスクリプトでシンプルにurlエンコードする話 - Qiita](https://qiita.com/ik-fib/items/cc983ca34600c2d633d5)
- [DeepL API](https://www.deepl.com/docs-api/translate-text/)

# 参考：List Glossaries

```shell
curl -s 'https://api-free.deepl.com/v2/glossaries' \
	-H "Authorization: DeepL-Auth-Key $DEEPL_API_KEY" | jq
```

# 参考：Delete Glossaries

```shell
curl -sX DELETE 'https://api-free.deepl.com/v2/glossaries/9c1a9bb8-c3bf-4b73-96ff-01eb741e1830' \
	-H "Authorization: DeepL-Auth-Key $DEEPL_API_KEY" | jq
```

# 参考：Delete All Glossaries

```shell
curl -s 'https://api-free.deepl.com/v2/glossaries' -H "Authorization: DeepL-Auth-Key $DEEPL_API_KEY" | jq -r '.glossaries[].glossary_id' | while read line
do
  curl -sX DELETE "https://api-free.deepl.com/v2/glossaries/$line" \
	-H "Authorization: DeepL-Auth-Key $DEEPL_API_KEY"
done
```