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