日記

更新頻度はあまり高くはありませんがネタがあったら書いていこうと思います。

コマンドラインで翻訳できるツールを作った。(バイナリ配布)

roomba.hatenablog.com

こちらの記事でGlosbeの翻訳APIをしったので、このツールのGo実装を作成してみました。さらに、いろいろな言語に対応できるようにしました。

github.com

ソースコードです

package main

import (
    "encoding/json"
    "flag"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "os"
    "strings"
)

// URL of api
const URL = "https://glosbe.com/gapi/translate"

func makeURL(src, srcLang, destLang string) string {
    v := url.Values{}
    v.Add("from", srcLang)
    v.Add("dest", destLang)
    v.Add("format", "json")
    v.Add("phrase", src)

    return URL + "?" + v.Encode()
}

// Send request.
func request(url string) (result string, err error) {
    resp, err := http.Get(url)
    if err != nil {
        return
    }

    defer resp.Body.Close()
    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return
    }

    var response Response
    err = json.Unmarshal(b, &response)
    if err != nil {
        return
    }

    res := make([]string, len(response.Tuc))
    count := 0
    for i, v := range response.Tuc {
        if v.Phrase.Text != "" {
            res[i] = v.Phrase.Text
            count = i
        }
    }
    result = strings.Join(res[:count+1], ",")

    return
}

func main() {

    // Setting help message.
    flag.Usage = func() {
        fmt.Fprintf(os.Stderr, `dict [OPTIONS] <src>
Options
`)
        flag.PrintDefaults()
    }

    // If this option is exist, translate to Japanese from English.
    from := flag.String("f", "", "From")
    to := flag.String("t", "", "To")
    flag.Parse()
    args := flag.Args()

    if *to == "" || *from == "" || args == nil || len(args) != 1 {
        flag.Usage()
        os.Exit(1)
    }

    result, err := request(makeURL(args[0], *from, *to))
    if err != nil {
        fmt.Println("Not found.")
    } else {
        fmt.Println(result)
    }
}

// Response object.
type Response struct {
    Result string `json:"result"`
    Tuc    []Tuc  `json:"tuc"`
    Phrase string `json:"phrase"`
    From   string `json:"from"`
    Dest   string `json:"dest"`
}

// Tuc object.
type Tuc struct {
    Phrase    Phrase    `json:"phrase"`
    Meanings  []Meaning `json:"meanings"`
    MeaningID int64     `json:"meaningId"`
    Authors   []int64   `json:"authors"`
}

// Phrase object.
type Phrase struct {
    Text     string `json:"text"`
    Language string `json:"language"`
}

// Meaning object.
type Meaning struct {
    Language string `json:"language"`
    Text     string `json:"text"`
}

使い方はGithubにも書いてありますが。例えば

$ dict -f en -t ja cat
$ 猫,ネコ,ねこ,にゃあにゃあ,neko,にゃにゃ,にゃんにゃん,ぬこ,カト,キャット

みたいな感じで実行します。
マークダウンとか英語で書いてる時この日本語英語でなんて言うんだろうって時にさっと検索できるのでいいと思います。 うえで上げたブログにかかれているようにaliasを好きな(自然)言語で設定するといいです。

バイナリも配布しているのでGoの環境を作らなくてもお気軽に試すことができるのでぜひ導入してみてください。

バイナリダウンロードリンク

Downloads | dict

良いお年を〜