// $TheSupernovaDuo: suwako,v 1.5.1 2023/4/15 23:9:28 yakumo_izuru Exp $ // Command line client for Mozhi, a (yet another) privacy friendly frontend to other translation engines package main import ( "encoding/json" "flag" "fmt" "log" "net/http" "net/url" "marisa.chaotic.ninja/suwako" "os" ) var ( engine string instance string input string source string target string ) type Translate struct { Output string `json:"translated-text"` } func init() { flag.StringVar(&source, "f", "auto", "Set the language to translate from. This can be skipped as it will autodetect the language you're translating from") flag.StringVar(&input, "i", "", "Enter the text to be translated") flag.StringVar(&target, "t", "en", "Set the language to translate to") flag.Usage = func() { fmt.Printf("usage: suwako -f [lang] -i [text] -t [lang]\nversion: %v\n", suwako.FullVersion()) } } func main() { engine = os.Getenv("SUWAKO_ENGINE") instance = os.Getenv("SUWAKO_INSTANCE") flag.Parse() if len(engine) == 0 || len(instance) == 0 { log.Println("SUWAKO_ENGINE and/or SUWAKO_INSTANCE are unset") log.Println("Defaulting to mozhi.aryak.me with engine 'google'") engine = "google" instance = "https://mozhi.aryak.me" } if len(input) == 0 { log.Fatal("Missing input text.") } // Map a variable to the struct var translate Translate // Build the full URL to query var encInput = url.PathEscape(input) var apiEndpoint = "/api/translate" var queryURL = instance + apiEndpoint + "?engine=" + engine + "&from=" + source + "&to=" + target + "&text=" + encInput // Begin the request and process the response resp, err := http.Get(queryURL) sanityCheck(err) defer resp.Body.Close() // JSON decoding _ = json.NewDecoder(resp.Body).Decode(&translate) sanityCheck(err) fmt.Printf("%v\n",translate.Output) } func sanityCheck(err error) { if err != nil { log.Fatal(err) } }