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

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

Update web/main.go

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