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

Last change on this file since 30 was 29, checked in by manerakai, 21 months ago

Tweaked Dockerfile

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