From 8914151dfade8f5788f99d3d5ceba93d78968e3f Mon Sep 17 00:00:00 2001 From: mqxym Date: Sat, 9 Nov 2024 13:24:26 +0100 Subject: [PATCH] v3.3.2 qol improvements: - auto dark mode set using device data with manual setting override - auto language set on device data - finished translation of private algorithm to the remaining languages - added faq items for private algorithm - set title and description based of language set - noscript header --- README.md | 6 +- index.html | 111 ++++++++++++++++++++++++----- js/emo.js | 2 +- js/lang.js | 202 ++++++++++++++++++++++++++++++++++++++--------------- 4 files changed, 242 insertions(+), 79 deletions(-) diff --git a/README.md b/README.md index dc74bf8..636b5da 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# EmojiCrypt Version 3.3.0 🌈 +# EmojiCrypt Version 3.3.2 🌈 Your convenient and secure text encryption, where emojis are all that matters. This repo is hosted here: @@ -22,8 +22,8 @@ The idea is to implement a protocol where only you and the receiver knows what t - Generate emoji keys which look like encrypted messages - Save keys within the browser - Site can be added to homescreen on Android and iOS to act as an app (Webapp) -- The web app is available in 7 languages (feel free to improve the automated translations, not all features have been translated yet) -- Dark mode +- The web app is available in 7 languages (feel free to improve the automated translations) +- Auto Dark mode ### Basic Security Information 🔐 diff --git a/index.html b/index.html index bce6dcd..447d90f 100644 --- a/index.html +++ b/index.html @@ -343,6 +343,31 @@
+ +
+
+
+ +
+
+
+
+ + To use the private algorithm: +
    +
  • Ensure you're on the Conversion app (the default app).
  • +
  • Click 💎 Private Algorithm and generate a key.
  • +
  • You can use the conversion app like before.
  • +
  • Share the link with your receipient.
  • +
  • When the key does not match, the output is gibberish.
  • +
  • The more you use the same key for different messages and the longer the messages are, the easier it is to crack the key.
  • +
+
+
+
+
@@ -795,6 +820,25 @@
Privacy Policy for NasaEmoji
{ code: 'fr', name: 'French 🇫🇷' }, { code: 'ar', name: 'Arabic 🇸🇦' }, ]; + + /** + * Retrieves the matching language code from the global languages array by reading the user set language. + * + * @returns {string|null} The matching language code if found, otherwise `null`. + */ + function getUserLanguageCode() { + // Get the user's preferred language from the browser + const userLanguage = navigator.language || (navigator.languages && navigator.languages[0]) || 'en'; + + // Extract the primary language code (e.g., 'en' from 'en-US') + const primaryCode = userLanguage.split('-')[0].toLowerCase(); + + // Find the language with the primary code + const language = languages.find(lang => lang.code.toLowerCase() === primaryCode); + + // Return the language code if found, otherwise null + return language ? language.code : null; + } /** * Get the language code from the URL parameter 'lang'. @@ -819,10 +863,11 @@
Privacy Policy for NasaEmoji
* @returns {Object} An object containing languageCode and languageIndex. */ function initializeLanguage() { - let languageCode = getLanguageCodeFromURL() || localStorage.getItem('lang') || 'en'; + let languageCode = getLanguageCodeFromURL() || localStorage.getItem('lang') || getUserLanguageCode() || 'en'; let languageIndex = getLanguageIndexFromCode(languageCode); if (languageIndex === -1) { + languageCode = 'en'; languageIndex = 0; } @@ -880,7 +925,7 @@
Privacy Policy for NasaEmoji
* @param {number} languageIndex - Index of the current language. */ function updateFAQItems(languageIndex) { - const faqItemCount = 24; + const faqItemCount = 25; for (let i = 1; i <= faqItemCount; i++) { $(`#faqQuestion${i}`).html(getTranslation(`faqQuestion${i}`, languageIndex)); $(`#faqAnswer${i}`).html(getTranslation(`faqAnswer${i}`, languageIndex)); @@ -972,11 +1017,22 @@
Privacy Policy for NasaEmoji
/** * Check if dark mode is enabled. - * @returns {boolean} True if dark mode is enabled. + * @returns {boolean} True if dark mode is enabled */ function isDarkModeEnabled() { return localStorage.getItem('darkMode') === 'true'; } + + /** + * DarkMode Toggle for site device + */ + function handleDarkModeToggle () { + if (isDarkModeEnabled()) { + disableDarkMode(); + } else { + enableDarkMode(); + } + } const darkModeClassToggles = [ { selector: 'body', classes: 'bg-dark text-light dark-mode' }, @@ -993,11 +1049,11 @@
Privacy Policy for NasaEmoji
{ selector: '.form-control', classes: 'bg-secondary text-light' }, { selector: 'footer', removeClasses: 'bg-light', classes: 'bg-dark text-light' }, ]; - + /** * Enable dark mode by adding appropriate classes. */ - function enableDarkMode() { + function enableDarkMode(fromToggle = false) { darkModeClassToggles.forEach((item) => { if (item.removeClasses) { $(item.selector).removeClass(item.removeClasses); @@ -1037,6 +1093,22 @@
Privacy Policy for NasaEmoji
localStorage.setItem('darkMode', 'false'); $('#darkModeMenu').html(getTranslation('enableDarkMode', languageIndex)); } + + function setAutoDarkMode () { + if (darkModeDeviceIsActive()) { + enableDarkMode(); + } else { + disableDarkMode(); + } + } + /** + * Get device dark mode information + * + * @returns {boolean} Returns True if device dark mode is enabled + */ + function darkModeDeviceIsActive() { + return (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches); + } // ======================================= // Section Transition Handling @@ -1224,16 +1296,16 @@
Privacy Policy for NasaEmoji
switch (currentMenu) { case 'encryptSection': - title = 'Encrypt Text with Emojis - Emoji Encryption Tool'; - description = 'Securely encrypt and decrypt messages using emojis.'; + title = getTranslation('metaTitleEncrypt', languageIndex); + description = getTranslation('metaDescriptionEncrypt', languageIndex); break; case 'convertSection': - title = 'Convert Text to Emojis - Emoji Conversion Tool'; - description = 'Easily convert your text into emojis and back.'; + title = getTranslation('metaTitleConvert', languageIndex); + description = getTranslation('metaTitleEncrypt', languageIndex); break; case 'aboutSection': - title = 'About Emoji Encryption Tool'; - description = 'Learn more about our emoji encryption and conversion tool.'; + title = getTranslation('metaTitleAbout', languageIndex); + description = getTranslation('metaDescriptionAbout', languageIndex); break; } @@ -1285,17 +1357,17 @@
Privacy Policy for NasaEmoji
}; // Dark Mode Toggle - if (isDarkModeEnabled()) { - enableDarkMode(); - } else { - disableDarkMode(); - } + setAutoDarkMode(); $('#darkModeMenu').click(function () { - if (isDarkModeEnabled()) { - disableDarkMode(); - } else { + handleDarkModeToggle() + }); + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + if (event.matches) { enableDarkMode(); + } else { + disableDarkMode(); } }); @@ -1553,6 +1625,7 @@
Privacy Policy for NasaEmoji
// Update the UI language updateUILanguage(); + updateMetadata(); // Update the URL history.pushState(null, '', href); diff --git a/js/emo.js b/js/emo.js index 01f50f4..8f6856a 100644 --- a/js/emo.js +++ b/js/emo.js @@ -3,7 +3,7 @@ * @returns {string} The current version. */ function getVersion() { - return "3.3.0"; + return "3.3.2"; } /* diff --git a/js/lang.js b/js/lang.js index de46f99..53d3ce9 100644 --- a/js/lang.js +++ b/js/lang.js @@ -17,6 +17,66 @@ function getTranslation(key, langIndex) { "النص 📄 🔄 🌈 إيموجي", // Arabic "", // Placeholder for additional languages ], + metaTitleEncrypt: [ + "Encrypt Text with Emojis - Emoji Encryption Tool", + "Verschlüssele Text mit Emojis - Emoji-Verschlüsselungstool", + "使用表情符号加密文本 - 表情符号加密工具", + "Зашифруйте текст с помощью эмодзи - Инструмент шифрования эмодзи", + "Cifrar Texto con Emojis - Herramienta de Encriptación de Emojis", + "Chiffrer du texte avec des emojis - Outil de cryptage Emoji", + "تشفير النص باستخدام الرموز التعبيرية - أداة تشفير الرموز التعبيرية", + "", + ], + metaDescriptionEncrypt: [ + "Securely encrypt and decrypt messages using emojis.", + "Verschlüssele und entschlüssele Nachrichten sicher mit Emojis.", + "使用表情符号安全地加密和解密消息。", + "Безопасно шифруйте и расшифровывайте сообщения с помощью эмодзи.", + "Encripta y desencripta mensajes de forma segura usando emojis.", + "Sécurise le cryptage et le décryptage des messages avec des emojis.", + "قم بتشفير وفك تشفير الرسائل بأمان باستخدام الرموز التعبيرية.", + "", + ], + metaTitleConvert: [ + "Convert Text to Emojis - Emoji Conversion Tool", + "Text in Emojis umwandeln - Emoji-Konvertierungstool", + "将文本转换为表情符号 - 表情符号转换工具", + "Преобразуйте текст в эмодзи - Инструмент конвертации эмодзи", + "Convertir Texto a Emojis - Herramienta de Conversión de Emojis", + "Convertir du texte en emojis - Outil de conversion Emoji", + "تحويل النص إلى رموز تعبيرية - أداة تحويل الرموز التعبيرية", + "", + ], + metaDescriptionConvert: [ + "Securely convert your text to emojis and back.", + "Konvertiere deinen Text sicher in Emojis und zurück.", + "安全地将文本转换为表情符号并恢复。", + "Безопасно преобразуйте ваш текст в эмодзи и обратно.", + "Convierte tu texto a emojis y viceversa de forma segura.", + "Convertis ton texte en emojis et inversement en toute sécurité.", + "حوّل نصك إلى رموز تعبيرية والعكس بأمان.", + "", + ], + metaTitleAbout: [ + "About Emoji Encryption Tool", + "Über das Emoji-Verschlüsselungstool", + "关于表情符号加密工具", + "О инструменте шифрования эмодзи", + "Acerca de la Herramienta de Encriptación de Emojis", + "À propos de l'outil de cryptage Emoji", + "حول أداة تشفير الرموز التعبيرية", + "", + ], + metaDescriptionAbout: [ + "Learn more about our emoji encryption and conversion tool.", + "Erfahre mehr über unser Emoji-Verschlüsselungs- und -Konvertierungstool.", + "了解更多关于我们的表情符号加密和转换工具。", + "Узнайте больше о нашем инструменте шифрования и конвертации эмодзи.", + "Aprende más sobre nuestra herramienta de encriptación y conversión de emojis.", + "En savoir plus sur notre outil de cryptage et de conversion Emoji.", + "تعرف أكثر على أداتنا لتشفير وتحويل الرموز التعبيرية.", + "", + ], enableDarkMode: [ "Dark Mode", "Dunkler Modus", @@ -233,102 +293,111 @@ function getTranslation(key, langIndex) { privateLinkText: [ "Your link to the private conversion algorithm:", "Dein Link zum privaten Konvertierungsalgorithmus:", + "你链接到私有转换算法:", + "Твоя ссылка на приватный алгоритм конвертации:", + "Tu enlace al algoritmo de conversión privado:", + "Ton lien vers l'algorithme privé de conversion :", + "رابطك إلى خوارزمية التحويل الخاصة:", "", - "", - "", - "", - "", + ], + copyPrivateConversionLink: [ + "Copy", + "Kopieren", + "复制", + "Копировать", + "Copiar", + "Copier", + "نسخ", "", ], - copyPrivateConversionLink: ["Copy", "Kopieren", "", "", "", "", "", ""], disablePrivateConversionButton: [ "🗑️ Remove private algorithm", "🗑️ Deaktivieren", - "", - "", - "", - "", - "", + "🗑️ 移除私有算法", + "🗑️ Удалить приватный алгоритм", + "🗑️ Eliminar algoritmo privado", + "🗑️ Supprimer l'algorithme privé", + "🗑️ إزالة الخوارزمية الخاصة", "", ], privateAlgorithmDisclaimer: [ "Using a private algorithm is just another layer of obfuscation, but can be cracked pretty easily.
Especially, when using the same algorithm more than once.", "Der private Algorithmus ist nur als weitere Verschleierungsmethode gedacht, kann aber leicht geknackt werden.
Besonders, wenn derselbe Algorithmus häufiger als einmal verwendet wird.", - "", - "", - "", - "", - "", + "使用私有算法只是另一层混淆,但很容易被破解。
尤其是,当多次使用相同的算法时。", + "Использование приватного алгоритма — это просто еще один слой обфускации, но его можно довольно легко взломать.
Особенно, если использовать один и тот же алгоритм несколько раз.", + "Usar un algoritmo privado es solo otra capa de ofuscación, pero puede ser descifrado bastante fácil.
Especialmente cuando se usa el mismo algoritmo más de una vez.", + "Utiliser un algorithme privé est juste une couche supplémentaire d'obfuscation, mais il peut être assez facilement craqué.
Surtout, quand on utilise le même algorithme plus d'une fois.", + "استخدام خوارزمية خاصة هو مجرد طبقة إضافية من الإخفاء، ولكن يمكن اختراقها بسهولة.
خاصة عند استخدام نفس الخوارزمية أكثر من مرة.", "", ], generatePrivateConversionButton: [ "🔮 Generate (new) private algorithm", "🔮 (Neuer) Algorithmus generieren", - "", - "", - "", - "", - "", + "🔮 生成(新的)私有算法", + "🔮 Создать (новый) приватный алгоритм", + "🔮 Generar algoritmo privado (nuevo)", + "🔮 Générer un algorithme privé (nouveau)", + "🔮 إنشاء خوارزمية خاصة (جديدة)", "", ], btnPrivateAlgorithmRemoved: [ "Algorithm removed", "Algorithmus entfernt", - "", - "", - "", - "", - "", + "算法已移除", + "Алгоритм удален", + "Algoritmo eliminado", + "Algorithme supprimé", + "تمت إزالة الخوارزمية", "", ], btnPrivateAlgorithmGenerated: [ "⚙️ Private algorithm generated!", "⚙️ Privater Algorithmus erstellt!", - "", - "", - "", - "", - "", + "⚙️ 私有算法已生成!", + "⚙️ Приватный алгоритм создан!", + "⚙️ ¡Algoritmo privado generado!", + "⚙️ Algorithme privé généré !", + "⚙️ تم إنشاء الخوارزمية الخاصة!", "", ], modalDisablePrivateAlgorithm: [ "Do you want to remove the private algorithm?", "Möchtest du den privaten Algorithmus entfernen?", - "", - "", - "", - "", - "", + "你想移除私有算法吗?", + "Ты хочешь удалить приватный алгоритм?", + "¿Quieres eliminar el algoritmo privado?", + "Tu veux supprimer l'algorithme privé ?", + "هل تريد إزالة الخوارزمية الخاصة؟", "", ], privateAlgorithmFooter: [ "You can use a private algorithm with a unique key to obfuscate your messages.", - "Mit einem privaten Algorithmus kannst du deine Nachrichten zusätzlich verschleiern.", - "", - "", - "", - "", - "", + "Mit einem privaten Algorithmus kannst du deine Nachrichten mit einem einzigenartigen Schlüssel zusätzlich verschleiern.", + "你可以使用带有唯一密钥的私有算法来混淆你的消息。", + "Ты можешь использовать приватный алгоритм с уникальным ключом для обфускации своих сообщений.", + "Puedes usar un algoritmo privado con una clave única para ofuscar tus mensajes.", + "Tu peux utiliser un algorithme privé avec une clé unique pour obfusquer tes messages.", + "يمكنك استخدام خوارزمية خاصة بمفتاح فريد لإخفاء رسائلك.", "", ], showPrivateAlgorithmButton: [ "💎 Private Algorithm", "💎 Privater Algorithmus", - "", - "", - "", - "", - "", + "💎 私有算法", + "💎 Приватный алгоритм", + "💎 Algoritmo Privado", + "💎 Algorithme privé", + "💎 الخوارزمية الخاصة", "", ], privateAlgorithmHeader: [ "A private algorithm is used.
Click '💎 Private Algorithm' for more information.
", "Ein privater Konvertierungsalgorithmus wird verwendet.
Klicke '💎 Privater Algorithmus' für mehr Informationen.
", - "", - "", - "", - "", - "", + "正在使用私有算法。
点击‘💎 私有算法’了解更多信息。
", + "Используется приватный алгоритм.
Нажми '💎 Приватный алгоритм' для получения дополнительной информации.
", + "Se está utilizando un algoritmo privado.
Haz clic en '💎 Algoritmo Privado' para más información.
", + "Un algorithme privé est utilisé.
Clique sur '💎 Algorithme privé' pour plus d'informations.
", + "يتم استخدام خوارزمية خاصة.
اضغط على '💎 الخوارزمية الخاصة' للمزيد من المعلومات.
", "", ], // Messages and other elements @@ -950,17 +1019,38 @@ function getTranslation(key, langIndex) { 'يمكنك المساهمة بزيارة مستودع GitHub، الإبلاغ عن المشكلات، اقتراح التحسينات، أو تقديم طلبات سحب. تحسين الترجمات دائمًا مرحب به.', "", ], + faqQuestion25: [ + "How do I use the private algorithm?", + "Wie benutze ich den privaten Algorithmus?", + "如何使用私有算法?", + "Как использовать приватный алгоритм?", + "¿Cómo uso el algoritmo privado?", + "Comment utiliser l'algorithme privé ?", + "كيف أستخدم الخوارزمية الخاصة؟", + "", + ], + faqAnswer25: [ + 'To use the private algorithm:
  • Ensure you are on the Conversion app (the default app).
  • Click 💎 Private Algorithm and generate a key.
  • You can use the Conversion app like before.
  • Share the link with your recipient.
  • When the key does not match, the output is gibberish.
  • The more you use the same key for different messages and the longer the messages are, the easier it is to crack the key.
', + 'Um den privaten Algorithmus zu verwenden:
  • Stelle sicher, dass du dich in der Konvertierungs-App (der Standard-App) befindest.
  • Klicke auf 💎 Privater Algorithmus und generiere einen Schlüssel.
  • Du kannst die Konvertierungs-App wie gewohnt verwenden.
  • Teile den Link mit deinem Empfänger.
  • Wenn der Schlüssel nicht übereinstimmt, ist die Ausgabe unsinnig.
  • Je öfter du denselben Schlüssel für verschiedene Nachrichten verwendest und je länger die Nachrichten sind, desto einfacher ist es, den Schlüssel zu knacken.
', + '要使用私有算法:
  • 确保你在转换应用程序(默认应用)上。
  • 点击 💎 私有算法 并生成一个密钥。
  • 你可以像以前一样使用转换应用。
  • 与接收者分享链接。
  • 当密钥不匹配时,输出将是乱码。
  • 你对不同消息使用相同密钥的次数越多,消息越长,破解密钥就越容易。
', + 'Чтобы использовать приватный алгоритм:
  • Убедитесь, что вы находитесь в приложении Конвертация (приложение по умолчанию).
  • Нажмите 💎 Приватный алгоритм и сгенерируйте ключ.
  • Вы можете использовать приложение Конвертация как раньше.
  • Поделитесь ссылкой с вашим получателем.
  • Если ключ не совпадает, вывод будет бессмысленным.
  • Чем больше вы используете один и тот же ключ для разных сообщений и чем длиннее сообщения, тем легче взломать ключ.
', + 'Para usar el algoritmo privado:
  • Asegúrate de estar en la aplicación Conversión (la aplicación predeterminada).
  • Haz clic en 💎 Algoritmo Privado y genera una clave.
  • Puedes usar la aplicación de conversión como antes.
  • Comparte el enlace con tu destinatario.
  • Cuando la clave no coincide, la salida será ininteligible.
  • Cuantas más veces uses la misma clave para diferentes mensajes y más largos sean los mensajes, más fácil será descifrar la clave.
', + 'Pour utiliser l\'algorithme privé :
  • Assure-toi d\'être dans l\'application Conversion (l\'application par défaut).
  • Clique sur 💎 Algorithme privé et génère une clé.
  • Tu peux utiliser l\'application de conversion comme avant.
  • Partage le lien avec ton destinataire.
  • Lorsque la clé ne correspond pas, la sortie est du charabia.
  • Plus tu utilises la même clé pour différents messages et plus les messages sont longs, plus il est facile de craquer la clé.
', + 'لاستخدام الخوارزمية الخاصة:
  • تأكد من أنك في تطبيق التحويل (التطبيق الافتراضي).
  • اضغط على 💎 الخوارزمية الخاصة وأنشئ مفتاحًا.
  • يمكنك استخدام تطبيق التحويل كما من قبل.
  • شارك الرابط مع المستلم الخاص بك.
  • عندما لا يتطابق المفتاح، يكون الناتج غير مفهوم.
  • كلما استخدمت نفس المفتاح لرسائل مختلفة وكلما كانت الرسائل أطول، أصبح من الأسهل اختراق المفتاح.
', + "", + ], }; + + if (translations[key]) { if (translations[key][langIndex]) { return translations[key][langIndex]; - } else { - // Return english if translation is not found - return translations[key][0]; - } + } + // Return english if langIndex translation is not found + return translations[key][0]; } else { - // Return key if translation is not found + // Return key if translation key is not found return key; } }