From 944bb0e1c705b0bb513a1baef7f5f1ebeb54ad56 Mon Sep 17 00:00:00 2001
From: Ashley <iamashley@duck.com>
Date: Sat, 13 Jan 2024 20:55:18 +0000
Subject: [PATCH] add poketranslate :3

---
 html/translate.ejs | 399 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 399 insertions(+)
 create mode 100644 html/translate.ejs

diff --git a/html/translate.ejs b/html/translate.ejs
new file mode 100644
index 00000000..03ae34da
--- /dev/null
+++ b/html/translate.ejs
@@ -0,0 +1,399 @@
+<!doctype html>
+
+<html lang="en">
+    <head>
+        <title>PokeTranslate</title>
+        <link rel="icon" href="/static/yt-ukraine.svg">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta content="PokeTranslate" property=og:title>
+    <meta content="Translate text - Anonymously!" property=twitter:description>
+    <meta content="https://cdn.glitch.global/43b6691a-c8db-41d4-921c-8cf6aa0d9108/17a7fa1d-cdf9-4b73-9686-21e62c7fb285.image.png?v=1667739586452" property=og:image>
+     <meta content=summary_large_image name=twitter:card>
+        <meta name="viewport" content="width=device-width, initial-scale=1.0">
+        <meta charset="UTF-8">
+        <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'">
+         <meta name="referrer" content="no-referrer">
+
+        <style>
+        .center {
+            text-align: center;
+        }
+
+        .wrap {
+            display: flex;
+            flex-wrap: wrap;
+            justify-content: center;
+        }
+
+        .wrap.languages {
+            flex-wrap: nowrap;
+            margin-bottom: 20px;
+        }
+
+        #could_not_switch_languages_text {
+            color: red;
+        }
+
+        .item {
+            width: 100%;
+            height: 150px;
+            border-radius:1em;
+        }
+
+        .item-wrapper {
+            display: flex;
+            flex-wrap: wrap;
+            justify-content: center;
+            width: 450px;
+            margin: 5px 10px;
+        }
+
+
+        .language,
+        .switch_languages {
+            display: flex;
+        }
+
+        .language {
+            margin: 0px 10px;
+        }
+
+        .switch_languages {
+            margin: 0px 5px;
+        }
+
+        #switchbutton {
+            white-space: nowrap;
+        }
+
+        button {
+            font-size: 1rem;
+            padding: 4px 10px;
+            border: 2px solid #888888;
+        }
+
+        input,
+        select,
+        textarea {
+            width: 100%;
+            font-size: 1rem;
+            padding: 4px;
+            border: 2px solid #888888;
+        }
+
+        textarea {
+            resize: vertical;
+            height: 5rem;
+            font-family: sans-serif;
+            width: 100%;
+        }
+
+        input:focus,
+        select:focus,
+        textarea:focus,
+        button:focus {
+            border-color: #478061;
+            outline: 1px solid #478061;
+        }
+
+
+        body {
+            justify-content: center;
+            overflow:hidden;
+            font-family: sans-serif;
+        }
+
+        #definitions_and_translations {
+            display: grid;
+            margin: auto;
+            width: 1100px;
+            gap: 10px;
+            grid-template-areas: "definitions translations";
+
+        }
+
+        .def_type {
+            color: #007979;
+            text-transform: capitalize;
+        }
+
+        .syn {
+            color: #804700;
+        }
+
+        .syn_type {
+            color: #007979;
+        }
+
+        .use_in_sentence {
+            color: #009902;
+        }
+
+        .definitions li:not(:last-child) {
+          margin-bottom: 1rem;
+        }
+
+        @media screen and (max-width: 1200px) {
+            #definitions_and_translations {
+                display: grid;
+                width: 90vw;
+                grid-template-areas:
+                    "definitions definitions"
+                    "translations translations";
+            }
+        }
+
+
+        div.definitions {
+            grid-area: definitions;
+        }
+
+        div.translations {
+            grid-area: translations;
+        }
+
+        @media screen and (prefers-color-scheme: dark) {
+            body {
+                background-color: #212529;
+                color: #f8f9fa;
+            }
+
+            #could_not_switch_languages_text {
+                color: #F13333;
+            }
+
+            a:visited {
+                color: #9759f6;
+                text-decoration: none;
+            }
+
+            a {
+                color: #599bf6;
+                text-decoration: none;
+            }
+
+            input,
+            select,
+            button,
+            textarea {
+                background-color: #131618;
+                border-color: #495057;
+                color: #f8f9fa;
+            }
+
+            .def_type {
+                color: cyan;
+                text-transform: capitalize;
+            }
+
+            .syn {
+                color: burlywood;
+            }
+
+            .syn_type {
+                color: cyan;
+            }
+
+            .use_in_sentence {
+                color: yellow;
+            }
+        }
+        </style>
+    </head>
+
+    <body>
+<div style="border-radius: 3em;background: #1a1a1a;padding: 1em;display: flex;flex-direction: column;height: fit-content;align-self: center;margin-top: 6em;">
+        
+        <header class="center"><h1>PokeTranslate</h1></header>
+ 
+                <form action="/translate" method="GET" id="translation-form">
+
+            <!-- from and to language -->
+            <div class="wrap languages">
+                <div class="language">
+                    
+               <% const languageOptions = [
+  { code: 'autodetect', name: 'Autodetect' },
+  { code: 'af', name: 'Afrikaans' },
+  { code: 'sq', name: 'Albanian' },
+  { code: 'am', name: 'Amharic' },
+  { code: 'ar', name: 'Arabic' },
+  { code: 'hy', name: 'Armenian' },
+  { code: 'as', name: 'Assamese' },
+  { code: 'ay', name: 'Aymara' },
+  { code: 'az', name: 'Azerbaijani' },
+  { code: 'bm', name: 'Bambara' },
+  { code: 'eu', name: 'Basque' },
+  { code: 'be', name: 'Belarusian' },
+  { code: 'bn', name: 'Bengali' },
+  { code: 'bh', name: 'Bhojpuri' },
+  { code: 'bs', name: 'Bosnian' },
+  { code: 'bg', name: 'Bulgarian' },
+  { code: 'ca', name: 'Catalan' },
+  { code: 'ceb', name: 'Cebuano' },
+  { code: 'ny', name: 'Chichewa' },
+  { code: 'zh-cn', name: 'Chinese (Simplified)' },
+  { code: 'zh-tw', name: 'Chinese (Traditional)' },
+  { code: 'co', name: 'Corsican' },
+  { code: 'hr', name: 'Croatian' },
+  { code: 'cs', name: 'Czech' },
+  { code: 'da', name: 'Danish' },
+  { code: 'dv', name: 'Dhivehi' },
+  { code: 'doi', name: 'Dogri' },
+  { code: 'nl', name: 'Dutch' },
+  { code: 'en', name: 'English' },
+  { code: 'eo', name: 'Esperanto' },
+  { code: 'et', name: 'Estonian' },
+  { code: 'ee', name: 'Ewe' },
+  { code: 'tl', name: 'Filipino' },
+  { code: 'fi', name: 'Finnish' },
+  { code: 'fr', name: 'French' },
+  { code: 'fy', name: 'Frisian' },
+  { code: 'gl', name: 'Galician' },
+  { code: 'ka', name: 'Georgian' },
+  { code: 'de', name: 'German' },
+  { code: 'el', name: 'Greek' },
+  { code: 'gn', name: 'Guarani' },
+  { code: 'gu', name: 'Gujarati' },
+  { code: 'ht', name: 'Haitian Creole' },
+  { code: 'ha', name: 'Hausa' },
+  { code: 'haw', name: 'Hawaiian' },
+  { code: 'he', name: 'Hebrew' },
+  { code: 'hi', name: 'Hindi' },
+  { code: 'hmn', name: 'Hmong' },
+  { code: 'hu', name: 'Hungarian' },
+  { code: 'is', name: 'Icelandic' },
+  { code: 'ig', name: 'Igbo' },
+  { code: 'ilo', name: 'Ilocano' },
+  { code: 'id', name: 'Indonesian' },
+  { code: 'ga', name: 'Irish' },
+  { code: 'it', name: 'Italian' },
+  { code: 'ja', name: 'Japanese' },
+  { code: 'jv', name: 'Javanese' },
+  { code: 'kn', name: 'Kannada' },
+  { code: 'kk', name: 'Kazakh' },
+  { code: 'km', name: 'Khmer' },
+  { code: 'rw', name: 'Kinyarwanda' },
+  { code: 'kok', name: 'Konkani' },
+  { code: 'ko', name: 'Korean' },
+  { code: 'kri', name: 'Krio' },
+  { code: 'ku', name: 'Kurdish (Kurmanji)' },
+  { code: 'sd', name: 'Sindhi' },
+  { code: 'si', name: 'Sinhala' },
+  { code: 'sk', name: 'Slovak' },
+  { code: 'sl', name: 'Slovenian' },
+  { code: 'so', name: 'Somali' },
+  { code: 'es', name: 'Spanish' },
+  { code: 'su', name: 'Sundanese' },
+  { code: 'sw', name: 'Swahili' },
+  { code: 'sv', name: 'Swedish' },
+  { code: 'tg', name: 'Tajik' },
+  { code: 'ta', name: 'Tamil' },
+  { code: 'tt', name: 'Tatar' },
+  { code: 'te', name: 'Telugu' },
+  { code: 'th', name: 'Thai' },
+  { code: 'ti', name: 'Tigrinya' },
+  { code: 'ts', name: 'Tsonga' },
+  { code: 'tr', name: 'Turkish' },
+  { code: 'tk', name: 'Turkmen' },
+  { code: 'twi', name: 'Twi' },
+  { code: 'uk', name: 'Ukrainian' },
+  { code: 'ur', name: 'Urdu' },
+  { code: 'ug', name: 'Uyghur' },
+  { code: 'uz', name: 'Uzbek' },
+  { code: 'vi', name: 'Vietnamese' },
+  { code: 'cy', name: 'Welsh' },
+  { code: 'xh', name: 'Xhosa' },
+  { code: 'yi', name: 'Yiddish' },
+  { code: 'yo', name: 'Yoruba' },
+  { code: 'zu', name: 'Zulu' }
+]; %>
+
+
+<!-- Source language select -->
+<select name="from_language" id="from_language" style="margin-right: 1em;border-radius: 1em;padding: 7px;" aria-label="Source language">
+   <% languageOptions.forEach(language => { %>
+    <option value="<%= language.code %>" <%= language.code === (from_language || 'autodetect') ? 'selected' : '' %>><%= language.name %></option>
+  <% }); %>
+</select>
+
+
+<!-- Target language select -->
+<select name="to_language" id="to_language"  style="margin-right: 1em;border-radius: 1em;padding: 7px;" aria-label="Target language">
+  <% languageOptions.slice(1).forEach(language => { %>
+    <option value="<%= language.code %>" <%= language.code === to_language ? 'selected' : '' %>><%= language.name %></option>
+  <% }); %>
+</select>
+
+                    
+                </div>
+            </div>
+
+            
+
+            <!-- text boxes -->
+            <div class="wrap">
+                <div class="item-wrapper">
+                    <textarea autofocus class="item" id="input" name="input" dir="auto"  placeholder="<%- text %>"><%- text %>
+</textarea>
+                    </div>
+
+
+
+                <div class="item-wrapper">
+                    <textarea id="output" class="translation item" dir="auto" placeholder="Translation" readonly> <%- translation %> </textarea>
+              </div>
+            </div>
+
+            <br>
+
+            <div class="center">
+                <!-- translate button -->
+                <button type="submit" style="border-radius: 1em;padding: 7px;">Translate :3</button>
+            </div>
+
+            <br>
+
+           
+
+            <br>
+ 
+                
+
+                
+            </div>
+
+        </form>
+            </div>
+
+
+        <br>
+        <br>
+        <br>
+
+ 
+
+        <script>
+            // @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0
+            // this code submits the translation form when pressing Ctrl/Meta+Enter while focussed on the input text field
+            document.getElementById("input").addEventListener("keydown", function(event) {
+                if (event.keyCode === 13 && (event.metaKey || event.ctrlKey)) {
+                    document.getElementById("translation-form").submit();
+                }
+            });
+
+            // Auto resize textarea to fit words inside it without need to scroll -- Thanks to: https://stackoverflow.com/a/25621277
+            var input = document.getElementById("input");
+            var output = document.getElementById("output");
+            input.setAttribute("style", "height:" + output.scrollHeight + "px;overflow-y:scroll;");
+            output.setAttribute("style", "height:" + output.scrollHeight + "px;overflow-y:scroll;");
+            input.addEventListener("input", function(e) {
+                this.style.height = 150 + "px";
+                this.style.height = this.scrollHeight + "px";
+            });
+            
+            // @license-end
+        </script>
+     <script src="/static/custom-css.js"></script>
+    </body>
+</html>
\ No newline at end of file