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

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

Improved code

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