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

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

Implemented Definitions and Translations in Web interface

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