source: code/trunk/web/main.go@ 23

Last change on this file since 23 was 23, checked in by manerakai, 22 months ago

Improved code

File size: 5.3 KB
RevLine 
[9]1package main
2
3import (
[17]4 "bytes"
5 "net/http"
6 "net/url"
[18]7 "time"
[17]8
[9]9 "codeberg.org/SimpleWeb/SimplyTranslate/engines"
[15]10 "github.com/gofiber/fiber/v2"
[16]11 "github.com/gofiber/template/html/v2"
[9]12)
13
[15]14func main() {
[16]15 engine := html.New("./views", ".html")
[19]16 engine.AddFunc("inc", func(i int) int { return i + 1 })
17
[16]18 app := fiber.New(fiber.Config{
19 Views: engine,
20 })
[9]21
[16]22 app.All("/", func(c *fiber.Ctx) error {
[23]23 engine := c.Cookies("engine")
24 if c.Query("engine") != "" {
25 engine = c.Query("engine")
26 }
27 if _, ok := engines.Engines[engine]; !ok {
[16]28 engine = "google"
29 }
30 targetLanguages, err := engines.Engines[engine].TargetLanguages()
31 if err != nil {
32 return c.SendStatus(500)
33 }
34 sourceLanguages, err := engines.Engines[engine].SourceLanguages()
35 if err != nil {
36 return c.SendStatus(500)
37 }
38 originalText := ""
39 translatedText := ""
40 from := ""
41 to := ""
[17]42 ttsFrom := ""
43 ttsTo := ""
[16]44
[22]45 var translation engines.TranslationResult
[16]46 if c.Method() == "POST" {
[18]47 from = c.FormValue("from")
[16]48 to = c.FormValue("to")
49 originalText = c.FormValue("text")
50 if result, err := engines.Engines[engine].Translate(originalText, from, to); err != nil {
51 return c.SendStatus(500)
52 } else {
53 translatedText = result.TranslatedText
[22]54 translation = result
[23]55 from = result.SourceLanguage
[16]56 }
[17]57
58 ttsFromURL, _ := url.Parse("api/tts")
59 fromQuery := url.Values{}
60 fromQuery.Add("lang", from)
61 fromQuery.Add("text", originalText)
62 ttsFromURL.RawQuery = fromQuery.Encode()
63 ttsFrom = ttsFromURL.String()
64
65 ttsToURL, _ := url.Parse("api/tts")
66 toQuery := url.Values{}
67 toQuery.Add("lang", to)
68 toQuery.Add("text", translatedText)
69 ttsToURL.RawQuery = toQuery.Encode()
70 ttsTo = ttsToURL.String()
71
[18]72 fromCookie := new(fiber.Cookie)
73 fromCookie.Name = "from"
74 fromCookie.Value = from
[23]75 fromCookie.Expires = time.Now().Add(time.Hour * 24 * 365)
[18]76 c.Cookie(fromCookie)
77
78 toCookie := new(fiber.Cookie)
79 toCookie.Name = "to"
80 toCookie.Value = to
[23]81 toCookie.Expires = time.Now().Add(time.Hour * 24 * 365)
[18]82 c.Cookie(toCookie)
83
[23]84 engineCookie := new(fiber.Cookie)
85 engineCookie.Name = "engine"
86 engineCookie.Value = engine
87 engineCookie.Expires = time.Now().Add(time.Hour * 24 * 365)
88 c.Cookie(engineCookie)
[18]89 } else if c.Method() == "GET" {
90 from = c.Cookies("from")
91 to = c.Cookies("to")
92 } else {
93 return c.SendStatus(400)
[16]94 }
[19]95
96 enginesNames := map[string]string{}
97 for k, v := range engines.Engines {
98 enginesNames[k] = v.DisplayName()
99 }
100
[16]101 return c.Render("index", fiber.Map{
102 "Engine": engine,
[19]103 "enginesNames": enginesNames,
[20]104 "SourceLanguages": sourceLanguages,
105 "TargetLanguages": targetLanguages,
[16]106 "OriginalText": originalText,
[22]107 "Translation": translation,
[16]108 "From": from,
109 "To": to,
[17]110 "TtsFrom": ttsFrom,
111 "TtsTo": ttsTo,
[16]112 })
113 })
114
[18]115 app.All("/api/translate", func(c *fiber.Ctx) error {
116 from := ""
117 to := ""
118 engine := ""
119 text := ""
120 if c.Method() == "GET" {
121 engine = c.Query("engine")
122 text = c.Query("text")
123 from = c.Query("from")
124 to = c.Query("to")
125 } else if c.Method() == "POST" {
126 engine = c.FormValue("engine")
127 text = c.FormValue("text")
128 from = c.FormValue("from")
129 to = c.FormValue("to")
130 } else {
131 return c.SendStatus(400)
132 }
133 if _, ok := engines.Engines[engine]; !ok || engine == "" {
134 engine = "google"
135 }
136 if to == "" {
137 return c.SendStatus(400)
138 }
139 if result, err := engines.Engines[engine].Translate(text, from, to); err != nil {
140 return c.SendStatus(500)
141 } else {
142 return c.JSON(result)
143 }
144 })
[16]145
[18]146 app.Get("/api/source_languages", func(c *fiber.Ctx) error {
147 engine := c.Query("engine")
148 if _, ok := engines.Engines[engine]; !ok || engine == "" {
149 engine = "google"
150 }
151 if result, err := engines.Engines[engine].SourceLanguages(); err != nil {
152 return c.SendStatus(500)
153 } else {
154 return c.JSON(result)
155 }
156 })
157
158 app.Get("/api/target_languages", func(c *fiber.Ctx) error {
159 engine := c.Query("engine")
160 if _, ok := engines.Engines[engine]; !ok || engine == "" {
161 engine = "google"
162 }
163 if result, err := engines.Engines[engine].TargetLanguages(); err != nil {
164 return c.SendStatus(500)
165 } else {
166 return c.JSON(result)
167 }
168 })
169
[17]170 app.Get("/api/tts", func(c *fiber.Ctx) error {
171 engine := c.Query("engine")
172 if _, ok := engines.Engines[engine]; !ok || engine == "" {
173 engine = "google"
174 }
175
176 text := c.Query("text")
177 if text == "" {
178 return c.SendStatus(400)
179 }
180
181 lang := c.Query("lang")
182
183 if url, err := engines.Engines[engine].Tts(text, lang); err != nil {
184 return c.SendStatus(500)
185 } else {
186 if response, err := http.Get(url); err != nil {
187 return c.SendStatus(500)
188 } else {
189 defer response.Body.Close()
190 var buf bytes.Buffer
191 response.Write(&buf)
192 c.Context().SetContentType("audio/mpeg")
193 return c.Send(buf.Bytes())
194 }
195 }
196 })
197
[20]198 app.Post("/switchlanguages", func(c *fiber.Ctx) error {
199 if c.Cookies("from") != "" {
200 fromCookie := new(fiber.Cookie)
201 fromCookie.Name = "from"
202 fromCookie.Value = c.Cookies("to")
203 fromCookie.Expires = time.Now().Add(24 * time.Hour * 365)
204
205 toCookie := new(fiber.Cookie)
206 toCookie.Name = "to"
207 toCookie.Value = c.Cookies("from")
208 toCookie.Expires = time.Now().Add(24 * time.Hour * 365)
209
210 c.Cookie(fromCookie)
211 c.Cookie(toCookie)
212 }
213 return c.Redirect("/")
214 })
215
[18]216 app.Static("/static", "./static")
217
[15]218 app.Listen(":3000")
[9]219}
Note: See TracBrowser for help on using the repository browser.