Translate-shellを無限に動かして遊ぶ

# はじめに
- [Translate-shell](https://github.com/soimort/translate-shell)というものがある。
- これは`trans`コマンドとしてCLI上で翻訳を行うことができるすごいコマンドである。
- また翻訳はデフォルトで**Google Translate API**(Bing Translator, Yandex.TranslateやApertiumも使用可能)を叩いて行っている。
- 主な処理系がAWKで実装されているというのも良い。
- しかし使っているうちに、いくらかすると結果が帰ってこなくなることがあるのに気づいた。
- 具体的に言うと、**連続して大量の文章翻訳を試み、API制限に引っかかった**時だった。([この記事内](https://qiita.com/eggplants/items/5cbbb8165d49125fb99b))
- 他の記事やサイトには**回避方法が見当たらなかった**のでその方法含め記事にした。
- この記事では、`trans`コマンドの使用方法と、この制限される問題を解消する方法を紹介する。
- なお、**音声読み上げ機能**(`-p`, `-sp`)や**Google API以外での翻訳**(`-e ENGINE`)については割愛する。

# 簡単な使用例
- 以下を踏まえれば`trans`コマンドの主な使用法は理解できる。
- 公式の使用例は[こちら(英語)](https://github.com/soimort/translate-shell/blob/develop/README.md)。

## インストール
- まずインストールしよう。

```bash:Terminal
$ brew install translate-shell    # か
$ apt-get install translate-shell # でインストール
```
## Help
<details><summary>`trans -hの出力（英語)`</summary><div>

```bash:Terminal
$ trans -h|sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
Usage:  trans [OPTIONS] [SOURCES]:[TARGETS] [TEXT]...

Information options:
    -V, -version
        Print version and exit.
    -H, -help
        Print help message and exit.
    -M, -man
        Show man page and exit.
    -T, -reference
        Print reference table of languages and exit.
    -R, -reference-english
        Print reference table of languages (in English names) and exit.
    -L CODES, -list CODES
        Print details of languages and exit.
    -S, -list-engines
        List available translation engines and exit.
    -U, -upgrade
        Check for upgrade of this program.

Translator options:
    -e ENGINE, -engine ENGINE
        Specify the translation engine to use.

Display options:
    -verbose
        Verbose mode. (default)
    -b, -brief
        Brief mode.
    -d, -dictionary
        Dictionary mode.
    -identify
        Language identification.
    -show-original Y/n
        Show original text or not.
    -show-original-phonetics Y/n
        Show phonetic notation of original text or not.
    -show-translation Y/n
        Show translation or not.
    -show-translation-phonetics Y/n
        Show phonetic notation of translation or not.
    -show-prompt-message Y/n
        Show prompt message or not.
    -show-languages Y/n
        Show source and target languages or not.
    -show-original-dictionary y/N
        Show dictionary entry of original text or not.
    -show-dictionary Y/n
        Show dictionary entry of translation or not.
    -show-alternatives Y/n
        Show alternative translations or not.
    -w NUM, -width NUM
        Specify the screen width for padding.
    -indent NUM
        Specify the size of indent (number of spaces).
    -theme FILENAME
        Specify the theme to use.
    -no-theme
        Do not use any other theme than default.
    -no-ansi
        Do not use ANSI escape codes.
    -no-autocorrect
        Do not autocorrect. (if defaulted by the translation engine)
    -no-bidi
        Do not convert bidirectional texts.
    -bidi
        Always convert bidirectional texts.
    -no-warn
        Do not write warning messages to stderr.
    -dump
        Print raw API response instead.

Audio options:
    -p, -play
        Listen to the translation.
    -speak
        Listen to the original text.
    -n VOICE, -narrator VOICE
        Specify the narrator, and listen to the translation.
    -player PROGRAM
        Specify the audio player to use, and listen to the translation.
    -no-play
        Do not listen to the translation.
    -no-translate
        Do not translate anything when using -speak.
    -download-audio
        Download the audio to the current directory.
    -download-audio-as FILENAME
        Download the audio to the specified file.

Terminal paging and browsing options:
    -v, -view
        View the translation in a terminal pager.
    -pager PROGRAM
        Specify the terminal pager to use, and view the translation.
    -no-view, -no-pager
        Do not view the translation in a terminal pager.
    -browser PROGRAM
        Specify the web browser to use.
    -no-browser
        Do not open the web browser.

Networking options:
    -x HOST:PORT, -proxy HOST:PORT
        Use HTTP proxy on given port.
    -u STRING, -user-agent STRING
        Specify the User-Agent to identify as.
    -4, -ipv4, -inet4-only
        Connect only to IPv4 addresses.
    -6, -ipv6, -inet6-only
        Connect only to IPv6 addresses.

Interactive shell options:
    -I, -interactive, -shell
        Start an interactive shell.
    -E, -emacs
        Start the GNU Emacs front-end for an interactive shell.
    -no-rlwrap
        Do not invoke rlwrap when starting an interactive shell.

I/O options:
    -i FILENAME, -input FILENAME
        Specify the input file.
    -o FILENAME, -output FILENAME
        Specify the output file.

Language preference options:
    -l CODE, -hl CODE, -lang CODE
        Specify your home language.
    -s CODES, -sl CODES, -source CODES, -from CODES
        Specify the source language(s), joined by '+'.
    -t CODES, -tl CODES, -target CODES, -to CODES
        Specify the target language(s), joined by '+'.

Text preprocessing options:
    -j, -join-sentence
        Treat all arguments as one single sentence.

Other options:
    -no-init
        Do not load any initialization script.

See the man page trans(1) for more information.

```
</div></details>

## Helpの翻訳
※一部オプション名までもが翻訳されているがそこはご愛嬌…
<details><summary>`trans -h`の出力を`trans`で翻訳する</summary><div>

```bash:Terminal
$ sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" <(trans -h) \
  | trans en:ja -b \
  | awk 'NR%2==0{print$0};NR%2==1{print"    "$0}'

    使用法：trans [OPTIONS] [SOURCES]：[TARGETS] [TEXT] ...

    情報オプション：
-V、-version
    バージョンを出力して終了します。
-H、-help
    ヘルプメッセージを出力して終了します。
-M、-man
    マニュアルページを表示して終了します。
-T、-reference
    言語の参照表を印刷して終了します。
-R、-reference-english
    言語の参照表（英語名）を出力して終了します。
-Lコード、-listコード
    言語の詳細を印刷して終了します。
-S、-list-engines
    利用可能な翻訳エンジンを一覧表示して終了します。
-U、-upgrade
    このプログラムのアップグレードを確認してください。

    翻訳者オプション：
-eエンジン、-engineエンジン
    使用する翻訳エンジンを指定します。

    表示オプション：
-冗長
    詳細モード。 （デフォルト）
-b、-brief
    簡易モード。
-d、-dictionary
    辞書モード。
-識別する
    言語識別。
-show-original Y / n
    元のテキストを表示するかどうか。
-show-original-phonetics Y / n
    元のテキストの音声表記を表示するかどうか。
-show-translation Y / n
    翻訳を表示するかどうか。
-show-translation-phonetics Y / n
    翻訳の音声表記を表示するかどうか。
-show-prompt-message Y / n
    プロンプトメッセージを表示するかどうか。
-show-languages Y / n
    ソース言語とターゲット言語を表示するかどうか。
-show-original-dictionary y / N
    元のテキストの辞書エントリを表示するかどうか。
-show-dictionary Y / n
    翻訳の辞書エントリを表示するかどうか。
-show-alternatives Y / n
    別の翻訳を表示するかどうか。
-w NUM、-width NUM
    パディングの画面幅を指定します。
-インデントNUMBER
    インデントのサイズ（スペースの数）を指定します。
-テーマFILENAME
    使用するテーマを指定します。
-テーマなし
    デフォルト以外のテーマは使用しないでください。
-no-ansi
    ANSIエスケープコードを使用しないでください。
-自動修正なし
    自動修正しないでください。 （翻訳エンジンによってデフォルト設定されている場合）
-のびび
    双方向テキストを変換しないでください。
-bidi
    常に双方向テキストを変換します。
-警告なし
    警告メッセージをstderrに書き込まないでください。
-投げ捨てる
    代わりに生のAPI応答を出力します。

    音声オプション：
-p、-play
    翻訳を聞いてください。
-話す
    元のテキストを聞いてください。
-n VOICE、-narrator VOICE
    ナレーターを指定し、翻訳を聞きます。
-playerプログラム
    使用するオーディオプレーヤーを指定し、翻訳を聞きます。
-遊びません
    翻訳を聞かないでください。
-翻訳なし
    -speakを使用するときは何も翻訳しないでください。
-ダウンロード-オーディオ
    オーディオを現在のディレクトリにダウンロードします。
-download-audio-as FILENAME
    指定されたファイルに音声をダウンロードします。

    端末のページングとブラウジングのオプション：
-v、-view
    ターミナルページャーで翻訳を表示します。
-ポケットベルプログラム
    使用するターミナルページャーを指定し、翻訳を表示します。
-no-view、-no-pager
    ターミナルページャーで翻訳を表示しないでください。
-ブラウザプログラム
    使用するWebブラウザーを指定します。
-ブラウザなし
    Webブラウザーを開かないでください。

    ネットワークオプション：
-x HOST：PORT、-proxy HOST：PORT
    指定されたポートでHTTPプロキシを使用します。
-u STRING、-user-agent STRING
    識別するユーザーエージェントを指定します。
-4、-ipv4、-inet4-only
    IPv4アドレスのみに接続します。
-6、-ipv6、-inet6-onlyのみ
    IPv6アドレスのみに接続します。

    対話型シェルオプション：
-I、-interactive、-shell
    対話型シェルを開始します。
-E、-emacs
    対話型シェルのGNU Emacsフロントエンドを起動します。
-no-rlwrap
    対話型シェルを起動するときにrlwrapを呼び出さないでください。

    I / Oオプション：
-i FILENAME、-input FILENAME
    入力ファイルを指定します。
-o FILENAME、-output FILENAME
    出力ファイルを指定します。

    言語設定オプション：
-l CODE、-hl CODE、-lang CODE
    自国語を指定します。
-s CODES、-sl CODES、-source CODES、-from CODES
    「+」で結合されたソース言語を指定します。
-t CODES、-tl CODES、-target CODES、-to CODES
    「+」で結合されたターゲット言語を指定します。

    テキストの前処理オプション：
-j、-join-sentence
    すべての引数を1つの文として扱います。

    他のオプション：
-no-init
    初期化スクリプトをロードしないでください。

    詳細については、manページtrans（1）を参照してください。

```

</div></details>

## 普通に使う
- 「○○語から☓☓語へ」は`<変換元言語コード>:<変換先言語コード>`で指定。(言語コード一覧は[公式Wiki](https://github.com/soimort/translate-shell/wiki/Languages)や`-R`オプションから確認できる)

<details><summary>`言語リスト`</summary><div>

```bash:Terminal
$ trans -R
┌───────────────────────┬───────────────────────┬───────────────────────┐
│ Afrikaans      -   af │ Hebrew         -   he │ Portuguese     -   pt │
│ Albanian       -   sq │ Hill Mari      -  mrj │ Punjabi        -   pa │
│ Amharic        -   am │ Hindi          -   hi │ Querétaro Otomi-  otq │
│ Arabic         -   ar │ Hmong          -  hmn │ Romanian       -   ro │
│ Armenian       -   hy │ Hmong Daw      -  mww │ Russian        -   ru │
│ Azerbaijani    -   az │ Hungarian      -   hu │ Samoan         -   sm │
│ Bashkir        -   ba │ Icelandic      -   is │ Scots Gaelic   -   gd │
│ Basque         -   eu │ Igbo           -   ig │ Serbian (Cyr...-sr-Cyrl
│ Belarusian     -   be │ Indonesian     -   id │ Serbian (Latin)-sr-Latn
│ Bengali        -   bn │ Irish          -   ga │ Sesotho        -   st │
│ Bosnian        -   bs │ Italian        -   it │ Shona          -   sn │
│ Bulgarian      -   bg │ Japanese       -   ja │ Sindhi         -   sd │
│ Cantonese      -  yue │ Javanese       -   jv │ Sinhala        -   si │
│ Catalan        -   ca │ Kannada        -   kn │ Slovak         -   sk │
│ Cebuano        -  ceb │ Kazakh         -   kk │ Slovenian      -   sl │
│ Chichewa       -   ny │ Khmer          -   km │ Somali         -   so │
│ Chinese Simp...- zh-CN│ Klingon        -  tlh │ Spanish        -   es │
│ Chinese Trad...- zh-TW│ Klingon (pIqaD)tlh-Qaak Sundanese      -   su │
│ Corsican       -   co │ Korean         -   ko │ Swahili        -   sw │
│ Croatian       -   hr │ Kurdish        -   ku │ Swedish        -   sv │
│ Czech          -   cs │ Kyrgyz         -   ky │ Tahitian       -   ty │
│ Danish         -   da │ Lao            -   lo │ Tajik          -   tg │
│ Dutch          -   nl │ Latin          -   la │ Tamil          -   ta │
│ Eastern Mari   -  mhr │ Latvian        -   lv │ Tatar          -   tt │
│ Emoji          -  emj │ Lithuanian     -   lt │ Telugu         -   te │
│ English        -   en │ Luxembourgish  -   lb │ Thai           -   th │
│ Esperanto      -   eo │ Macedonian     -   mk │ Tongan         -   to │
│ Estonian       -   et │ Malagasy       -   mg │ Turkish        -   tr │
│ Fijian         -   fj │ Malay          -   ms │ Udmurt         -  udm │
│ Filipino       -   tl │ Malayalam      -   ml │ Ukrainian      -   uk │
│ Finnish        -   fi │ Maltese        -   mt │ Urdu           -   ur │
│ French         -   fr │ Maori          -   mi │ Uzbek          -   uz │
│ Frisian        -   fy │ Marathi        -   mr │ Vietnamese     -   vi │
│ Galician       -   gl │ Mongolian      -   mn │ Welsh          -   cy │
│ Georgian       -   ka │ Myanmar        -   my │ Xhosa          -   xh │
│ German         -   de │ Nepali         -   ne │ Yiddish        -   yi │
│ Greek          -   el │ Norwegian      -   no │ Yoruba         -   yo │
│ Gujarati       -   gu │ Papiamento     -  pap │ Yucatec Maya   -  yua │
│ Haitian Creole -   ht │ Pashto         -   ps │ Zulu           -   zu │
│ Hausa          -   ha │ Persian        -   fa │                       │
│ Hawaiian       -  haw │ Polish         -   pl │                       │
└───────────────────────┴───────────────────────┴───────────────────────┘

```
</div></details>

- 早速翻訳しよう。

```bash:Terminal
$ trans en:ja hello world\! # これだとhelloしか返らない
hello
/heˈlō,həˈlō/

こんにちは
(Kon'nichiwa)

Definitions of hello
[ English -> 日本語 ]

noun
    今日は
        hello, good day

hello
    こんにちは, もしもし
```

```bash:Terminal
$ trans en:ja "hello world" # ""や''で囲むといい(-j(join-sentence)でもOK)
hello world

こんにちは世界
(Kon'nichiwa sekai)

Translations of hello world
[ English -> 日本語 ]

hello world
    こんにちは世界
$ trans -s ja シェル芸 # -s(source)で単語の意味を辞書のように引ける
シェル芸
(Sheru-gei)

Shell art

Translations of シェル芸
[ 日本語 -> English ]

シェル芸
    Shell art, Shell arts
```
- ファイルへの出力やパイプで渡す時は色コードが書き込まれるので処理しづらくなる。

```bash:Terminal
$ trans en:ja Lisp > lisp_mean
$ cat lisp_mean
Lisp
/lisp/

^[[1m舌足らずの発音^[[22m
^[[1m(Shitatarazu no hatsuon)^[[22m

Definitions of ^[[4mLisp^[[24m
[ ^[[4mEnglish^[[24m -> ^[[1m日本語^[[22m ]

noun
^[[1m    リスプ^[[22m
        lisp

^[[4mLisp^[[24m
    ^[[1m舌足らずの発音^[[22m, ^[[1mLisp^[[22m, ^[[1mリスプ^[[22m
```
- そこで`-no-ansi`をつけると色コードを削除できる。

```bash:Terimnal
$ trans en:ja lisp -no-ansi > lisp_mean
$ cat lsip_mean
lisp
/lisp/

舌足らずの発音
(Shitatarazu no hatsuon)

Definitions of lisp
[ English -> 日本語 ]

noun
    リスプ
        lisp

lisp
    舌足らずの発音, Lisp, リスプ
```

- 変換元省略で言語を自動検出する。  
- また標準入力やファイル、Webページからも文章を入力できる。

```bash:Terminal
$ echo "Импровизируй. Адаптируйся. Преодолевай" | trans :ja
Импровизируй. Адаптируйся. Преодолевай
(Improviziruy. Adaptiruysya. Preodolevay)

即興。適応します。克服する
(Sokkyō. Tekiō shimasu. Kokufuku suru)

Translations of Импровизируй. Адаптируйся. Преодолевай
[ Русский -> 日本語 ]

Импровизируй.
    即興。
Адаптируйся.
    適応します。, 適応。
Преодолевай
    克服する, 打ち勝ちます
```
```bash:Terminal
$ cat uae_song
عِيشِي بِلَادِي عَاشَ اتِّحَادُ إِمَارَاتِنَا
عِشْتِ لِشَعْبٍ دِينُهُ الْإِسْلَامُ هَدْيُهُ الْقُرْآنُ
حَصَّنْتُكَ بِاسْمِ اللهِ يَا وَطَنُ
بِلَادِي بِلَادِي بِلَادِي بِلَادِي
حَمَاكِ الْإِلَهُ شُرُورَ الزَّمَان
أَقْسَمْنَا أَنْ نَبْنِيَ نَعْمَل
نَعْمَل نُخْلِص نَعْمَل نُخْلِص
مَهْمَا عِشْنَا نُخْلِصْ نُخْلِصْ
دَامَ الْأَمَانُ وَعَاشَ الْعَلَم يَا إِمَارَاتِنَا
رَمْزَ الْعُرُوبَة كُلُّنَا نَفْدِيكِ
بِالدِّمَاء نَرْوِيكِ
نَفْدِيكَ بِالْأَرْوَاحِ يَا وَطَن
```

```bash:Terminal
$ trans ar:ja file://uae_song # ファイルを入力
私の国を長生きし、首長国連邦を長生きします。
クルアーンの指導であるイスラム教を宗教とする人々が長生きしています。
国よ、神の名においてあなたを強化した
私の国、私の国、私の国、私の国
神はあなたを時の邪悪から守ってくれます
私たちの誓いは、仕事を構築することです
私たちは仕事をし、私たちは仕事をします
どれだけ救われても救われる
私たちの首長国よ、安全で旗が長生きする限り
私たち全員がArabわれているアラビア主義の象徴
血であなたを見る
私たちは魂であなたをredいます
$ trans ar:ja -i uae_song -o uae_song_ja # -i(input)で入力, -o(output)で出力
$ trans :ru https://www.example.com # 翻訳ページURLを生成
https://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=https://www.example.com
```

- `-b(-brief)`で結果のみ。

```bash:Terminal
$ trans en:ja -b "Qiita is god."
Qiitaは神です。
$ trans en:zh -b "Qiita is god."
Qiita是上帝。
$ trans :@ja -b "დღეს ცივა." #-bの時, :@<国コード>で発音を表示する
Kyō wa samuidesu.
```
- `-L(list)`で言語情報の表示、`-id(identify)`で言語検出。

```bash:Terminal
$ trans -L eo
Esperanto
Name                  Esperanto
Family                Artificial Language
Writing system        Latin
Code                  eo
ISO 639-3             epo
SIL                   http://www-01.sil.org/iso639-3/documentation.asp?id=epo
Glottolog             http://glottolog.org/resource/languoid/id/espe1235
Wikipedia             http://en.wikipedia.org/wiki/Esperanto_language

$ trans -id "ચાલો દીકરી સાસિરયા - ગુજરાતી લગ્નનું ગીત - હિતેન કુમાર, રાજ લક્ષ્મી"
ગુજરાતી
Name                  Gujarati
Family                Indo-European
Writing system        Gujarati
Code                  gu
ISO 639-3             guj
SIL                   http://www-01.sil.org/iso639-3/documentation.asp?id=guj
Glottolog             http://glottolog.org/resource/languoid/id/guja1252
Wikipedia             http://en.wikipedia.org/wiki/Gujarati_language
$ trans :en -b "ચાલો દીકરી સાસિરયા - ગુજરાતી લગ્નનું ગીત - હિતેન કુમાર, રાજ લક્ષ્મી"
Did you mean: ચાલો દીકરી સાસરિયા - ગુજરાતી લગ્નનું ગીત - હિતેન કુમાર, રાજ લક્ષ્મી
Let's Daughter Sasiriya - Gujarati Wedding Song - Hiteen Kumar, Raj Lakshmi

```
- 以上のオプションを使えばいろいろと遊ぶことができる。

# API制限の回避
- 応用に入る前に、ひとつ注意することとして、何回か連続してコマンドを叩くときはランダムウェイトをとった方がいい。
- 特に無限回実行し続けたい時には。
- そうしなければ途中で何も結果が返ってこなくなる。(空文字列が返ってくる)
- この状態になると1時間ほど待たないといけないのが辛い。
- しかしこれは[API制限のせい](https://github.com/soimort/translate-shell/issues/264)らしい。
- 以下の実験で回避するための最良のランダムウェイトを探す。

<details><summary>`実験(面倒くさいので飛ばして良い)`</summary><div>

- 少し実験をする。
- 以下のコマンドを一時間ほど放置して、結果が返り続けるか検証する。

```bash:Terminal
# 固定ウェイト 1s
$ c=1;while :;do echo $[c++];trans en:ja "hello." -b;sleep 1;done
1
こんにちは。
…(略)…
52
こんにちは。
53

54
こんにちは。
55

56

… # 55回目でストップ
# 固定ウェイト 5s
$ c=1;while :;do echo $[c++];trans en:ja "Hello." -b;sleep 5;done
1
こんにちは。
…(略)…
35
こんにちは。
36

37

… # 36回目でストップ
# ランダムウェイト 5~9s
$ c=1;while :;do echo $[c++];trans en:ja "Hello." -b;sleep $[RANDOM%5+5];done
1
こんにちは。
…(略)…
375
こんにちは。 
376
こんにちは。 
… # OK
# ランダムウェイト 4~8s
$ c=1;while :;do echo $[c++];trans en:ja "Hello." -b;sleep $[RANDOM%5+4];done
1
こんにちは。
…(略)…
79
こんにちは。
80

81
こんにちは。
82

83

… # 82回目でストップ
# ランダムウェイト 1~5s
$ c=1;while :;do echo $[c++];trans en:ja "Hello." -b;sleep $[RANDOM%5+1];done 
1
こんにちは。
…(略)…
36
こんにちは。
37

38

… # 37回目でストップ

# ランダムウェイト 0~4s
$ c=1;while :;do echo $[c++];trans en:ja "Hello." -b;sleep $[RANDOM%5];done 
1
こんにちは。
…(略)…
41
こんにちは。
42

43

… # 42回目でストップ
```
</div></details>

- 結論として`sleep $[RANDOM%5+5]`がちょうどいい感じに制限を回避できた。
- よってこれをウェイトに用いる。
- これよりいいモノがあればコメントください。

# 応用して遊ぶ
- ここでは2つ無限に翻訳/出力するコマンド(スクリプト)例を考えた。

## 例1, いろんな国の「こんにちは」を連続表示

```bash:Terminal
# まず使用可能な言語コード一覧をWikiからとってその中の1つを取得
$ curl -s "https://github.com/soimort/translate-shell/wiki/Languages"|grep -oE '<strong><code>[^<]+<'|sed -r 's/^<strong><code>([^<]+)</\1/g'|shuf -n1
Cyrl
# その返り値を指定して実行(行頭の>はTerminal上での改行なので削除して実行してください)
$ while :
  do
    curl -s "https://github.com/soimort/translate-shell/wiki/Languages" \
    | grep -oE '<strong><code>[^<]+<' \
    | sed -r 's/^<strong><code>([^<]+)</\1/g' | shuf -n1 \
    | tee >(xargs -I{} trans -L {} \
    | awk 'NR==2{print$2}') >(xargs -I{} trans -b :{} 'Hello.') \
    | tr \\n :;sleep $[RANDOM%5+5]
  done
sn:Shona
Mhoro.
la:Latin
Salve.
fy:Frisian
Hoi.
...
```

## 例2, 辞書ファイルの単語を無限翻訳

```bash:Terminal
# 大体のubuntuには/usr/share/dictに以下のような辞書ファイルがある
$ ls /usr/share/dict
american-english  cracklib-small          words
british-english   README.select-wordlist  words.pre-dictionaries-common
$ shuf -n1 /usr/share/dict/american-english
downstream
$ c=0;while :
  do
    let c++
    echo -e "###\n`printf %03d $c`\n###"
    shuf -n1 /usr/share/dict/american-english \
    | trans :ja
    sleep $[RANDOM%5+5]
  done
###
001
###
Colombian

コロンビア人
(Koronbia hito)

Translations of Colombian
[ English -> 日本語 ]

Colombian
    コロンビア人, コロンビア
###
002
###
accounted

会計済み
(Kaikei-zumi)

Definitions of accounted
[ English -> 日本語 ]

verb
    占む
        command, occupy, account, hold
    みなす
        account, reckon

accounted
    会計済み, 占めました
###
003
###
Garfield's

ガーフィールド
(Gāfīrudo)

Translations of Garfield's
[ English -> 日本語 ]

Garfield's
    ガーフィールド, ガーフィールドさん

…(略)
```
楽しい。

# 結論
たのしいし辞書代わりにもなる`trans`くん最高！
シェル芸が捗る〜〜〜〜〜〜〜〜！！！！！！！！