Slack 次世代プラットフォームで動作する DeepL 翻訳アプリを公開しました

こんにちは、Slack の[公式 SDK 開発](https://github.com/slackapi)と日本の Developer Relations を担当している瀬良 (@seratch) と申します :wave:

過去に DeepL API を使って Slack メッセージやファイルの翻訳を行うアプリについてご紹介しました。これらのアプリは非常に多くの方にご利用いただいています。

https://qiita.com/seratch/items/a001985ee1dccaf95727

https://qiita.com/seratch/items/c1e416dea6f6dcf6f62e

この記事では、上記一つ目の記事で紹介しているアプリの Slack 次世代プラットフォーム上で動作するバージョンについて日本語でご紹介します。アプリは、Slack の公式 GitHub Organization にて、オープンソースライセンス（MIT）で公開されています。

https://github.com/slack-samples/deno-message-translator

ぜひお試しいただき、お役に立ちましたらスターを一つ増やしておいていただけますと、大変嬉しいです :bow: 

以下はこのアプリの README を日本語訳したものです。

## Run-on-Slack: 翻訳アプリ (powered by DeepL API)

このアプリは、Slack の[次世代ホスティングプラットフォーム](https://api.slack.com/future)を利用した TypeScript のサンプルプロジェクトを含みます。

このプロジェクトは、国旗ベースのリアクション絵文字をつけたときにシンプルなメッセージ翻訳を行うワークフローを動作させる方法をデモします。ワークフローの管理者はどこでこのアプリを動作させるかを、リンクトリガーからモーダルを開いてチャンネルリストを編集するインタラクションによって設定することができます。

このアプリがチャンネルに追加されたら、エンドユーザーは 🇺🇸 🇪🇸 🇫🇷 🇯🇵 などのリアクションをつけるだけで、そのチャンネルのすべてのメッセージを他の言語に翻訳することができます。対応している言語の一覧を確認するには、[DeepL API のドキュメントサイト](https://www.deepl.com/en/docs-api)をご確認ください。

## セットアップ

アプリの開発・利用に取り掛かる前に、アプリをインストールすることができる開発用のワークスペースをお持ちかをご確認ください。もし「まだワークスペースがない」という場合は、[こちら](https://slack.com/create)から新しく作成します。また、この次世代プラットフォームを試すには [Slack の有料プラン](https://slack.com/pricing)のいずれかをご利用いただく必要があります。

### DeepL API アカウントを作成

また、このアプリを動作させるには、テキスト翻訳の API の利用のために DeepL API の有効なアクセストークンが必要です。[DeepL API のドキュメントサイト](https://www.deepl.com/en/docs-api)にアクセスして、ご自身の[API アカウント](https://www.deepl.com/account/summary)を作成してください。

**API アカウントが通常のアカウントとは異なる**ことにご注意ください。すでに DeepL Webサイト上での翻訳を行うためのアカウントをお持ちであっても、API の利用には別の種別のアカウントを新しく作る必要があります。

API アカウントを作成したら、[アカウントページ](https://www.deepl.com/account/summary)に表示されている API トークン文字列をコピーしてください。後ほど利用します。

### Slack CLI をインストール

このテンプレートアプリを利用するには、まずSlack CLI を使って設定をする必要があります。ステップバイステップの操作ガイドは、[クイックスタートガイド（英語）](https://api.slack.com/future/quickstart)をご確認ください。

### テンプレートをクローン

https://github.com/slack-samples/deno-message-translator のリポジトリを以下の手順で clone します。

```zsh
# このプロジェクトをあなたのマシンにクローン
$ slack create my-message-translator -t slack-samples/deno-message-translator

# プロジェクトのディレクトリに移動
$ cd my-message-translator
```

## Env の値を保存

[DeepL API のトークン](https://www.deepl.com/account/summary)をコピーして、その値を以下のように `.env` という名前のファイルに保存します。

```
DEEPL_AUTH_KEY=(your token here)
```

後ほどアプリをデプロイするときに、同じ値を以下のコマンドを実行して設定します。

```bash
slack env add DEEPL_AUTH_KEY (you token here)
```

## アプリの設定のためにリンクトリガーを作成

**2025 年 2 月更新**: `all_resources: true` という新機能によって、ここのステップは不要になりました。代わりに `triggers/reaction_added_trigger.ts` のトリガーを作成して、翻訳を有効にしたいチャンネルにアプリのボットユーザーを追加するだけで OK です。詳しくは[こちらの PR](https://github.com/slack-samples/deno-message-translator/pull/47) を参考にしてください。

<del>
[トリガー](https://api.slack.com/future/triggers)はワークフローを実行するための起点です。トリガーは、ユーザーによって実行されたり、Slack 内のイベントに反応する形で自動実行されたります。

[リンクトリガー](https://api.slack.com/future/triggers/link)は、**ショートカット URL** を生成するタイプのトリガーです。この URL はチャンネルメッセージとして投稿されたり、チャンネルのブックマークに追加されると有効なリンクとなります。それがクリックされると、それに紐づけられたワークフローが実行されます。

リンクトリガーは、 _インストールされたアプリごと_ に異なります。これはつまり、ショートカット URL はワークスペースごとに異なる URL となりますし（Enterprise Grid 内は共通です）、ローカル実行のアプリ（local と表示されているもの）とデプロイされた本番アプリでも異なります。

トリガーを作成するとき、そのトリガーを作成したいワークスペースを選択します。また、それぞれのワークスペースでは、開発バージョンのアプリ（`(local)` と表記されたもの）とデプロイされた本番アプリが存在します。

このテンプレートプロジェクトから、アプリの設定のためのワークフローを実行するためのリンクトリガー作成するには、以下のコマンドを実行します。

```zsh
$ slack trigger create --trigger-def triggers/configurator.ts
```

ワークスペースを選択したら、リンクトリガーのショートカット URL を含む内容が出力されます。その URL をコピーして、先ほど選択したワークスペースの Slack チャンネル内のメッセージとして投稿するか、チャンネルのブックマークに追加してください。 

**注意: このリンクはアプリがローカルマシンで起動している、またはデプロイされている場合のみ、正常に動作します！** アプリをローカルで実行し、最終的には Slack のホスティング環境で実行する方法を知るために、以下のセクションも続けて読んでください。
</del>

## プロジェクトをローカルで実行

`slack run` でアプリを起動することで、アプリを開発している間、あなたがコードに加えた変更がリアルタイムで反映されるようになります。また、Slack CLI と Slack ワークスペース内ともにアプリの名前が `(local)` を末尾に含む場合は、それは開発バージョンのアプリであることを意味します。

```zsh
# 開発版アプリをローカルで起動する
$ slack run

Connected, awaiting events
```

アプリが立ち上がったら、先ほど作った `(local)` バージョンのアプリと紐付けられたショートカット URL をクリックしてみてください。これによって、プロジェクトに含まれるサンプルワークフローの実行が開始されます。

ローカル実行アプリを停止するには `<CTRL> + C` でプロセスを停止してください。

Slack ワークスペース内でリンクトリガーの URL をクリックすると、以下のようにしてアプリを動作させたいチャンネルの一覧を編集することができます。

<img src="https://user-images.githubusercontent.com/19658/206636945-e6078c32-0e81-422b-bb38-711d10f53b55.gif" width=500 />

これによって、翻訳アプリがチャンネルに追加されたら、 `:jp:` や `:fr:` のようなリアクション絵文字（リアクジとも呼ばれます）をつけるだけで、その絵文字に対応した言語に翻訳されたテキストがそのメッセージへの返信としてスレッドに投稿されます。

<img width="600" src="https://user-images.githubusercontent.com/19658/206638194-6eff88fa-05c1-4308-a180-0a547890aab6.png">

## ユニットテストを実行

ファンクションをテストする方法の例として [`functions/translate_test.ts`](https://github.com/slack-samples/deno-message-translator/blob/main/functions/translate_test.ts) などを参考にしてください。テストファイルのファイル名は必ず `_test` という接尾辞が付けられている必要があります。

全てのテストを実行するには `deno test` を実行します:

```zsh
$ deno test
```

## アプリをデプロイ

開発が終わったら、`slack deploy` コマンドを使って、Slack のホスティング環境で動作する本番アプリとしてデプロイしましょう。また、DeepL API のトークンをそのアプリに対して設定することも忘れずに。

```zsh
$ slack deploy
$ slack env add DEEPL_AUTH_KEY (your key here)
```

デプロイが終わったら、また、新しく本番アプリ（`(local)` とついていない方です）用のリンクトリガーを作成します。トリガーが実行されたら、先ほどローカルで確認したものと同じように動作するはずです。

また、本番運用においては `maintenance_job.ts` というファイルのワークフローも有効にすることを強く推奨します。

この翻訳アプリは、アプリのボットユーザーがチャンネルのメンバーであることを前提としています。設定モーダルでチャンネルを追加すれば、ボットユーザーは自動でチャンネルに追加されるようにはなっています。しかし、いつでも誰でもそのボットユーザーをチャンネルから除外することは可能です（意図的かはともかくとして）。

このような場合にボットユーザーを再び設定されている全てのチャンネルに呼び戻す手段としては、日次での設定メンテナンスジョブとしてのワークフローは、十分に有効なソリューションです。以下のコマンドを実行するだけで、日次で自動的にワークフローを開始するスケジュールトリガーを作成することができます。

```bash
$ slack trigger create --trigger-def triggers/daily_maintenance_job.ts
```

### アプリのログを確認

あなたのアプリの本番インスタンスの実行ログを確認するには `slack activity` コマンドを使います。

```zsh
$ slack activity
```

## 終わりに

以上となります。ぜひこちらのアプリをお試しいただき、フィードバックがありましたら、この記事のコメント欄か、以下のイシュートラッカーまでお気軽にお寄せください。私がメンテナーをやっている限りは、日本語で投稿いただいても対応できるかと思います（もちろん英語でも大歓迎です！）。

https://github.com/slack-samples/deno-message-translator/issues

また、このアプリを気に入った！という方はぜひ GitHub のスターを増やしていただけると励みになります :bow: 

それでは！