Advertisement
Guest User

Напишите программу(или опишите алгоритм), которая (который),

a guest
May 23rd, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 4.20 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "strings"
  5.     "log"
  6.     "os"
  7.     "net/url"
  8.     "net/http"
  9.     "io"
  10.     "bytes"
  11.     "encoding/json"
  12.     "fmt"
  13.     "sort"
  14.     "bufio"
  15. )
  16.  
  17. const (
  18.     API_KEY  = "trnsl.1.1.20180523T112547Z.725c1553f076f23f.81ed61b7dafaf2282289001215c8fe8a4ddbc894"
  19.     BASE_URL = "https://translate.yandex.net"
  20. )
  21.  
  22. var (
  23.     Debug   = log.New(os.Stdout, "[Debug] ", log.Ldate|log.Ltime|log.Lshortfile)
  24.     Info    = log.New(os.Stdout, "[Info] ", log.Ldate|log.Ltime|log.Lshortfile)
  25.     Warning = log.New(os.Stdout, "[Warning] ", log.Ldate|log.Ltime|log.Lshortfile)
  26.     Error   = log.New(os.Stdout, "[Error] ", log.Ldate|log.Ltime|log.Lshortfile)
  27. )
  28.  
  29. type Client struct {
  30.     BaseURL   *url.URL
  31.     UserAgent string
  32.  
  33.     httpClient *http.Client
  34. }
  35.  
  36. type Translate struct {
  37.     LanguageDetected string   `json:"lang"`
  38.     Translation      []string `json:"text"`
  39.     Word             string
  40.     TranslateTo      string
  41. }
  42.  
  43. func NewClient(httpClient *http.Client) *Client {
  44.     if httpClient == nil {
  45.         httpClient = http.DefaultClient
  46.     }
  47.     baseUrl, _ := url.Parse(BASE_URL)
  48.  
  49.     c := &Client{httpClient: httpClient, BaseURL: baseUrl, UserAgent: "TEST"}
  50.     return c
  51. }
  52.  
  53. func (c *Client) DetectLanguage(word string) (string, error) {
  54.     req, err := c.newRequest("GET", "/api/v1.5/tr.json/detect", nil)
  55.  
  56.     q := req.URL.Query()
  57.     q.Add("text", word)
  58.     req.URL.RawQuery = q.Encode()
  59.  
  60.     if err != nil {
  61.         return "", err
  62.     }
  63.     var translate Translate
  64.     _, err = c.do(req, &translate)
  65.     return translate.LanguageDetected, err
  66. }
  67.  
  68. func (c *Client) TranslateWord(word string, lang string) ([]string, error) {
  69.     req, err := c.newRequest("GET", "/api/v1.5/tr.json/translate", nil)
  70.  
  71.     q := req.URL.Query()
  72.     q.Add("text", word)
  73.     q.Add("lang", lang)
  74.     req.URL.RawQuery = q.Encode()
  75.  
  76.     if err != nil {
  77.         return nil, err
  78.     }
  79.  
  80.     var translate Translate
  81.     _, err = c.do(req, &translate)
  82.     //Debug.Println(translate)
  83.     return translate.Translation, err
  84. }
  85.  
  86. func (c *Client) newRequest(method, path string, body interface{}) (*http.Request, error) {
  87.     rel := &url.URL{Path: path}
  88.     u := c.BaseURL.ResolveReference(rel)
  89.     var buf io.ReadWriter
  90.     if body != nil {
  91.         buf = new(bytes.Buffer)
  92.         err := json.NewEncoder(buf).Encode(body)
  93.         if err != nil {
  94.             return nil, err
  95.         }
  96.     }
  97.     req, err := http.NewRequest(method, u.String(), buf)
  98.     if err != nil {
  99.         return nil, err
  100.     }
  101.     if body != nil {
  102.         req.Header.Set("Content-Type", "application/json")
  103.     }
  104.     req.Header.Set("Accept", "application/json")
  105.     req.Header.Set("User-Agent", c.UserAgent)
  106.     q := req.URL.Query()
  107.     q.Add("key", API_KEY)
  108.     req.URL.RawQuery = q.Encode()
  109.  
  110.     return req, nil
  111. }
  112.  
  113. func (c *Client) do(req *http.Request, v interface{}) (*http.Response, error) {
  114.     resp, err := c.httpClient.Do(req)
  115.     if err != nil {
  116.         return nil, err
  117.     }
  118.     defer resp.Body.Close()
  119.     err = json.NewDecoder(resp.Body).Decode(v)
  120.     return resp, err
  121. }
  122.  
  123. func main() {
  124.  
  125.     //Read string
  126.     reader := bufio.NewReader(os.Stdin)
  127.     fmt.Print("Enter text: ")
  128.     text, _ := reader.ReadString('\n')
  129.  
  130.     //Parse string
  131.     var ss = strings.Split(text, " ")
  132.  
  133.     //var ss = strings.Split("green яблоко mandorla buono amigo", " ")
  134.  
  135.     client := NewClient(nil)
  136.     m := make(map[int]*Translate)
  137.  
  138.     for i, word := range ss {
  139.         lang, err := client.DetectLanguage(word)
  140.  
  141.         if err != nil {
  142.             Error.Println(err)
  143.         }
  144.  
  145.         translate := &Translate{Word: word, LanguageDetected: lang}
  146.         m[i] = translate
  147.     }
  148.  
  149.     for i, t := range m {
  150.         translate := m[i]
  151.  
  152.         switch t.LanguageDetected {
  153.         case "ru":
  154.             continue
  155.         case "en":
  156.             translate.TranslateTo = "en-ru"
  157.         default:
  158.             translate.TranslateTo = t.LanguageDetected + "-en"
  159.         }
  160.  
  161.         translation, err := client.TranslateWord(t.Word, t.TranslateTo)
  162.         translate.Translation = translation
  163.  
  164.         if err != nil {
  165.             Error.Println(err)
  166.         }
  167.         //Info.Println("Word: ", m[i].Word)
  168.         //Info.Println("Detected: ", m[i].LanguageDetected)
  169.         //Info.Println("To: ", m[i].TranslateTo)
  170.         //Info.Println("Translation: ", m[i].Translation)
  171.     }
  172.  
  173.     var keys []int
  174.     for k := range m {
  175.         keys = append(keys, k)
  176.     }
  177.     sort.Ints(keys)
  178.  
  179.     for i := range keys {
  180.         if (m[i].Translation == nil) {
  181.             fmt.Printf("%s ", m[i].Word)
  182.  
  183.         } else if (i == len(m)-1) {
  184.             fmt.Printf("%s", m[i].Word)
  185.         } else {
  186.             fmt.Printf("%s ", m[i].Translation[0])
  187.         }
  188.     }
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement