diff --git a/src/gui/src/helpers.js b/src/gui/src/helpers.js index f855fa62e6..d217a8de99 100644 --- a/src/gui/src/helpers.js +++ b/src/gui/src/helpers.js @@ -20,6 +20,7 @@ import path from "./lib/path.js" import mime from "./lib/mime.js"; import UIAlert from './UI/UIAlert.js' +import UIPrompt from './UI/UIPrompt.js' import UIItem from './UI/UIItem.js' import UIWindowLogin from './UI/UIWindowLogin.js'; import UIWindowSaveAccount from './UI/UIWindowSaveAccount.js'; @@ -849,26 +850,110 @@ window.create_file = async(options)=>{ let content = options.content ? [options.content] : []; // create file - try{ - puter.fs.upload(new File(content, filename), dirname, - { - success: async function (data){ - const created_file = $(appendto_element).find('.item[data-path="'+html_encode(dirname)+'/'+html_encode(data.name)+'"]'); - if(created_file.length > 0){ - window.activate_item_name_editor(created_file); + return puter.fs.upload(new File(content, filename), dirname, + { + success: async function (data){ + const created_file = $(appendto_element).find('.item[data-path="'+html_encode(dirname)+'/'+html_encode(data.name)+'"]'); + if(created_file.length > 0){ + window.activate_item_name_editor(created_file); - // Add action to actions_history for undo ability - window.actions_history.push({ - operation: 'create_file', - data: created_file - }); - } + // Add action to actions_history for undo ability + window.actions_history.push({ + operation: 'create_file', + data: created_file + }); } + }, + error: function(err){ + console.error('Error creating file:', err); + } + }); +} + +window.create_weblink = async function(dirname, append_to_element) { + // Prompt for URL + const url = await UIPrompt({ + message: i18n('enter_url_for_web_link'), + placeholder: 'https://example.com' + }); + + if (!url) { + return; // User cancelled + } + + // Validate URL + const validUrl = url.trim(); + if (!validUrl.startsWith('http://') && !validUrl.startsWith('https://')) { + UIAlert(i18n('url_must_start_with_http'), [ + { label: i18n('ok'), value: 'ok', type: 'primary' } + ]); + return; + } + + // Generate filename from URL + let filename; + try { + const urlObj = new URL(validUrl); + const hostname = urlObj.hostname.replace('www.', ''); + // Remove protocol and get domain + filename = hostname.split('.')[0] || 'link'; + filename = filename.charAt(0).toUpperCase() + filename.slice(1) + '.weblink'; + } catch (e) { + filename = 'New Link.weblink'; + } + + // Create file with URL as content + const urlBlob = new Blob([validUrl], { type: 'text/plain' }); + await window.create_file({ + dirname: dirname, + append_to_element: append_to_element, + name: filename, + content: urlBlob + }); +}; + +// Flag to prevent duplicate weblink creation +window._creating_weblink = false; + +window.create_weblink_from_url = async function(dirname, append_to_element, url) { + // Prevent duplicate creation + if (window._creating_weblink) { + return; + } + + window._creating_weblink = true; + + try { + // Validate URL + const validUrl = url.trim(); + if (!validUrl.startsWith('http://') && !validUrl.startsWith('https://')) { + return; // Not a valid URL + } + + // Generate filename from URL + let filename; + try { + const urlObj = new URL(validUrl); + const hostname = urlObj.hostname.replace('www.', ''); + filename = hostname.split('.')[0] || 'link'; + filename = filename.charAt(0).toUpperCase() + filename.slice(1) + '.weblink'; + } catch (e) { + filename = 'New Link.weblink'; + } + + // Create file with URL as content + const urlBlob = new Blob([validUrl], { type: 'text/plain' }); + await window.create_file({ + dirname: dirname, + append_to_element: append_to_element, + name: filename, + content: urlBlob }); - }catch(err){ - console.log(err); + } finally { + // Reset flag immediately after file creation completes + window._creating_weblink = false; } -} +}; window.available_templates = async () => { const baseRoute = `/${window.user.username}` diff --git a/src/gui/src/helpers/item_icon.js b/src/gui/src/helpers/item_icon.js index 44d8d9c6ae..7194fa9a25 100644 --- a/src/gui/src/helpers/item_icon.js +++ b/src/gui/src/helpers/item_icon.js @@ -194,6 +194,10 @@ const item_icon = async (fsentry)=>{ else if(fsentry.name.toLowerCase().endsWith('.xlsx')){ return {image: window.icons['file-xlsx.svg'], type: 'icon'}; } + // *.weblink + else if(fsentry.name.toLowerCase().endsWith('.weblink')){ + return {image: window.icons['link.svg'], type: 'icon'}; + } // -------------------------------------------------- // Determine icon by set or derived mime type // -------------------------------------------------- diff --git a/src/gui/src/helpers/new_context_menu_item.js b/src/gui/src/helpers/new_context_menu_item.js index 64c0da2bf8..962f7e8ff1 100644 --- a/src/gui/src/helpers/new_context_menu_item.js +++ b/src/gui/src/helpers/new_context_menu_item.js @@ -70,6 +70,14 @@ const new_context_menu_item = function(dirname, append_to_element){ }); } }, + // Web Link + { + html: i18n('web_link'), + icon: ``, + onClick: async function() { + await window.create_weblink(dirname, append_to_element); + } + }, ]; //Show file_templates on the lower part of "New" diff --git a/src/gui/src/helpers/open_item.js b/src/gui/src/helpers/open_item.js index efdf3686fd..83c87ac428 100644 --- a/src/gui/src/helpers/open_item.js +++ b/src/gui/src/helpers/open_item.js @@ -36,6 +36,48 @@ const open_item = async function(options){ const associated_app_name = $(el_item).attr('data-associated_app_name'); const file_uid = $(el_item).attr('data-uid'); + //---------------------------------------------------------------- + // Is this a .weblink file? + //---------------------------------------------------------------- + if (!is_dir && path.extname(item_path).toLowerCase() === '.weblink') { + try { + // Read the URL from the file + const fileContent = await puter.fs.read(item_path); + const url = await fileContent.text(); + const trimmedUrl = url.trim(); + + // Validate URL + if (trimmedUrl.startsWith('http://') || trimmedUrl.startsWith('https://')) { + // Open URL in new tab with security attributes + const newWindow = window.open(trimmedUrl, '_blank'); + if (!newWindow) { + UIAlert(i18n('failed_to_open_url'), [ + { label: i18n('ok'), value: 'ok', type: 'primary' } + ]); + } else { + // Set opener to null for security (noopener equivalent) + try { + newWindow.opener = null; + } catch (e) { + // Some browsers may throw, ignore + } + } + return; + } else { + UIAlert(i18n('invalid_url_in_weblink'), [ + { label: i18n('ok'), value: 'ok', type: 'primary' } + ]); + return; + } + } catch (err) { + console.error('Error reading weblink file:', err); + UIAlert(i18n('error_reading_weblink'), [ + { label: i18n('ok'), value: 'ok', type: 'primary' } + ]); + return; + } + } + //---------------------------------------------------------------- // Is this a shortcut whose source is perma-deleted? //---------------------------------------------------------------- diff --git a/src/gui/src/i18n/translations/ar.js b/src/gui/src/i18n/translations/ar.js index cc28eff757..df6ce9999e 100644 --- a/src/gui/src/i18n/translations/ar.js +++ b/src/gui/src/i18n/translations/ar.js @@ -162,6 +162,12 @@ const ar = { "لا يمكن إعادة تسمية هذا العنصر لأنه في سلة المهملات. لإعادة تسمية هذا العنصر، اسحبه أولاً خارج سلة المهملات.", jpeg_image: "صورة JPEG", keep_in_taskbar: "الاحتفاظ في شريط المهام", + web_link: "رابط ويب", + enter_url_for_web_link: "أدخل عنوان URL للرابط:", + url_must_start_with_http: "يجب أن يبدأ عنوان URL بـ http:// أو https://", + failed_to_open_url: "فشل في فتح عنوان URL. يرجى التحقق من إعدادات النوافذ المنبثقة للمتصفح.", + invalid_url_in_weblink: "عنوان URL غير صالح مخزن في ملف رابط الويب هذا.", + error_reading_weblink: "خطأ في قراءة ملف رابط الويب.", language: "اللغة", license: "رخصة", lightness: "إضاءة", diff --git a/src/gui/src/i18n/translations/bn.js b/src/gui/src/i18n/translations/bn.js index 3a8c583729..f97480ca1e 100644 --- a/src/gui/src/i18n/translations/bn.js +++ b/src/gui/src/i18n/translations/bn.js @@ -151,6 +151,12 @@ const bn = { items_in_trash_cannot_be_renamed: `এই আইটেমটি নাম পরিবর্তন করা যাবে না কারণ এটি ট্র্যাশে রয়েছে। এই আইটেমটির নাম পরিবর্তন করতে, প্রথমে এটি ট্র্যাশ থেকে তুলে নিন।`, jpeg_image: "জেপিইজি ইমেজ", keep_in_taskbar: "টাস্কবারে রাখুন", + web_link: "ওয়েব লিঙ্ক", + enter_url_for_web_link: "ওয়েব লিঙ্কের জন্য URL লিখুন:", + url_must_start_with_http: "URL http:// বা https:// দিয়ে শুরু হতে হবে", + failed_to_open_url: "URL খুলতে ব্যর্থ। অনুগ্রহ করে আপনার ব্রাউজারের পপআপ সেটিংস পরীক্ষা করুন।", + invalid_url_in_weblink: "এই ওয়েব লিঙ্ক ফাইলে সংরক্ষিত অবৈধ URL।", + error_reading_weblink: "ওয়েব লিঙ্ক ফাইল পড়তে ত্রুটি।", language: "ভাষা", license: "লাইসেন্স", lightness: "উজ্জ্বলতা", diff --git a/src/gui/src/i18n/translations/br.js b/src/gui/src/i18n/translations/br.js index 3524b98ef5..de3b12d4e3 100644 --- a/src/gui/src/i18n/translations/br.js +++ b/src/gui/src/i18n/translations/br.js @@ -152,6 +152,12 @@ const br = { items_in_trash_cannot_be_renamed: `Este item não pode ser renomeado porque está na lixeira. Para renomear este item, primeiro arraste-o para fora da Lixeira.`, jpeg_image: 'Imagem JPEG', keep_in_taskbar: 'Manter na Barra de Tarefas', + web_link: "Link da Web", + enter_url_for_web_link: "Digite o URL para o link da web:", + url_must_start_with_http: "O URL deve começar com http:// ou https://", + failed_to_open_url: "Falha ao abrir o URL. Verifique as configurações de pop-up do seu navegador.", + invalid_url_in_weblink: "URL inválido armazenado neste arquivo de link da web.", + error_reading_weblink: "Erro ao ler o arquivo de link da web.", language: "Idioma", license: "Licença", lightness: 'Luminosidade', diff --git a/src/gui/src/i18n/translations/da.js b/src/gui/src/i18n/translations/da.js index f49365e522..ff567fde4d 100644 --- a/src/gui/src/i18n/translations/da.js +++ b/src/gui/src/i18n/translations/da.js @@ -151,6 +151,12 @@ const da = { items_in_trash_cannot_be_renamed: `Dette element kan ikke omdøbes, fordi det er i papirkurven. For at omdøbe dette element, skal du først trække det ud af papirkurven.`, jpeg_image: 'JPEG-billede', keep_in_taskbar: 'Behold i proceslinjen', + web_link: "Weblink", + enter_url_for_web_link: "Indtast URL'en for weblinket:", + url_must_start_with_http: "URL skal starte med http:// eller https://", + failed_to_open_url: "Kunne ikke åbne URL. Tjek din browsers popup-indstillinger.", + invalid_url_in_weblink: "Ugyldig URL gemt i denne weblinkfil.", + error_reading_weblink: "Fejl ved læsning af weblinkfilen.", language: 'Sprog', license: 'Licens', lightness: 'Lysstyrke', diff --git a/src/gui/src/i18n/translations/de.js b/src/gui/src/i18n/translations/de.js index fd4f8dc1d4..b6a149e26d 100644 --- a/src/gui/src/i18n/translations/de.js +++ b/src/gui/src/i18n/translations/de.js @@ -151,6 +151,12 @@ const de = { items_in_trash_cannot_be_renamed: `Dieses Element kann nicht umbenannt werden, da es sich im Papierkorb befindet. Um dieses Element umzubenennen, ziehen Sie es zunächst aus dem Papierkorb.`, jpeg_image: 'JPEG-Bild', keep_in_taskbar: 'In Taskleiste behalten', + web_link: "Web-Link", + enter_url_for_web_link: "Geben Sie die URL für den Web-Link ein:", + url_must_start_with_http: "URL muss mit http:// oder https:// beginnen", + failed_to_open_url: "URL konnte nicht geöffnet werden. Bitte überprüfen Sie die Popup-Einstellungen Ihres Browsers.", + invalid_url_in_weblink: "Ungültige URL in dieser Web-Link-Datei gespeichert.", + error_reading_weblink: "Fehler beim Lesen der Web-Link-Datei.", language: "Sprache", license: "Lizenz", lightness: 'Helligkeit', diff --git a/src/gui/src/i18n/translations/emoji.js b/src/gui/src/i18n/translations/emoji.js index 595ba15a3a..5d199c6382 100644 --- a/src/gui/src/i18n/translations/emoji.js +++ b/src/gui/src/i18n/translations/emoji.js @@ -88,6 +88,12 @@ const emoji = { items_in_trash_cannot_be_renamed: `🗑️🆓❌`, jpeg_image: '🖼️', keep_in_taskbar: '📌📁', + web_link: "🔗", + enter_url_for_web_link: "🔗 URL:", + url_must_start_with_http: "❌ URL http:// ma ọ bụ https://", + failed_to_open_url: "❌ URL", + invalid_url_in_weblink: "❌ URL", + error_reading_weblink: "❌ 📄", loading: '🔄', log_in: "👤🔓", log_into_another_account_anyway: '👤🔄', diff --git a/src/gui/src/i18n/translations/en.js b/src/gui/src/i18n/translations/en.js index 613120afc0..7bdca78226 100644 --- a/src/gui/src/i18n/translations/en.js +++ b/src/gui/src/i18n/translations/en.js @@ -154,6 +154,12 @@ const en = { items_in_trash_cannot_be_renamed: `This item can't be renamed because it's in the trash. To rename this item, first drag it out of the Trash.`, jpeg_image: 'JPEG image', keep_in_taskbar: 'Keep in Taskbar', + web_link: "Web Link", + enter_url_for_web_link: "Enter the URL for the web link:", + url_must_start_with_http: "URL must start with http:// or https://", + failed_to_open_url: "Failed to open URL. Please check your browser's popup settings.", + invalid_url_in_weblink: "Invalid URL stored in this web link file.", + error_reading_weblink: "Error reading web link file.", language: "Language", license: "License", lightness: 'Lightness', diff --git a/src/gui/src/i18n/translations/es.js b/src/gui/src/i18n/translations/es.js index 4ff34cfe8e..0aed0026df 100644 --- a/src/gui/src/i18n/translations/es.js +++ b/src/gui/src/i18n/translations/es.js @@ -174,6 +174,12 @@ const es = { items_in_trash_cannot_be_renamed: `Este elemento no se puede renombrar porque está en la papelera. Para cambiar el nombre de este archivo, primero extráelo fuera de la misma.`, jpeg_image: 'Imagen JPEG', keep_in_taskbar: 'Mantener en la barra de tareas', + web_link: "Enlace Web", + enter_url_for_web_link: "Ingrese la URL para el enlace web:", + url_must_start_with_http: "La URL debe comenzar con http:// o https://", + failed_to_open_url: "No se pudo abrir la URL. Por favor verifique la configuración de ventanas emergentes de su navegador.", + invalid_url_in_weblink: "URL inválida almacenada en este archivo de enlace web.", + error_reading_weblink: "Error al leer el archivo de enlace web.", language: 'Lenguage', license: 'Licencia', lightness: 'Claridad', diff --git a/src/gui/src/i18n/translations/fa.js b/src/gui/src/i18n/translations/fa.js index eb66665443..08cd89ccbb 100644 --- a/src/gui/src/i18n/translations/fa.js +++ b/src/gui/src/i18n/translations/fa.js @@ -88,6 +88,12 @@ const fa = { items_in_trash_cannot_be_renamed: `این مورد نمی تواند تغییر نام دهد زیرا در سطل زباله است. برای تغییر نام این مورد، ابتدا آن را از سطل زباله بیرون بکشید.`, jpeg_image: "تصویر JPEG", keep_in_taskbar: "در نوار وظایف نگه دارید", + web_link: "لینک وب", + enter_url_for_web_link: "URL را برای لینک وب وارد کنید:", + url_must_start_with_http: "URL باید با http:// یا https:// شروع شود", + failed_to_open_url: "باز کردن URL ناموفق بود. لطفاً تنظیمات پاپ‌آپ مرورگر خود را بررسی کنید.", + invalid_url_in_weblink: "URL نامعتبر ذخیره شده در این فایل لینک وب.", + error_reading_weblink: "خطا در خواندن فایل لینک وب.", language: "زبان", log_in: "ورود", log_out: "خروج", diff --git a/src/gui/src/i18n/translations/fi.js b/src/gui/src/i18n/translations/fi.js index 7c5bdd3b61..c7768b53ff 100644 --- a/src/gui/src/i18n/translations/fi.js +++ b/src/gui/src/i18n/translations/fi.js @@ -199,6 +199,12 @@ const fi = { items_in_trash_cannot_be_renamed: `Tätä kohdetta ei voi nimetä uudelleen, koska se on roskakorissa. Jos haluat nimetä kohteen uudelleen, palauta se ensin roskakorista.`, jpeg_image: "JPEG-kuva", keep_in_taskbar: "Pidä tehtäväpalkissa", + web_link: "Verkkolinkki", + enter_url_for_web_link: "Syötä verkkolinkin URL:", + url_must_start_with_http: "URL:n on alettava http:// tai https://", + failed_to_open_url: "URL:n avaaminen epäonnistui. Tarkista selaimen ponnahdusikkuna-asetukset.", + invalid_url_in_weblink: "Virheellinen URL tallennettuna tähän verkkolinkkitiedostoon.", + error_reading_weblink: "Virhe verkkolinkkitiedostoa luettaessa.", language: "Kieli", license: "Lisenssi", lightness: "Valoisuus", diff --git a/src/gui/src/i18n/translations/fr.js b/src/gui/src/i18n/translations/fr.js index cd5066163a..cb77afe9ee 100644 --- a/src/gui/src/i18n/translations/fr.js +++ b/src/gui/src/i18n/translations/fr.js @@ -151,6 +151,12 @@ const fr = { items_in_trash_cannot_be_renamed: `Cet élément ne peut pas être renommé car il se trouve dans la corbeille. Pour renommer cet élément, faites-le d'abord glisser hors de la corbeille.`, jpeg_image: 'Image JPEG', keep_in_taskbar: 'Garder dans la barre des tâches', + web_link: "Lien Web", + enter_url_for_web_link: "Entrez l'URL pour le lien Web :", + url_must_start_with_http: "L'URL doit commencer par http:// ou https://", + failed_to_open_url: "Impossible d'ouvrir l'URL. Veuillez vérifier les paramètres de popup de votre navigateur.", + invalid_url_in_weblink: "URL invalide stockée dans ce fichier de lien Web.", + error_reading_weblink: "Erreur lors de la lecture du fichier de lien Web.", language: "Langue", license: "Licence", lightness: 'Luminosité', diff --git a/src/gui/src/i18n/translations/he.js b/src/gui/src/i18n/translations/he.js index 61312e4085..efc9881905 100644 --- a/src/gui/src/i18n/translations/he.js +++ b/src/gui/src/i18n/translations/he.js @@ -162,6 +162,12 @@ const en = { items_in_trash_cannot_be_renamed: `לא ניתן לשנות את שם הפריט הזה כי הוא נמצא באשפה. כדי לשנות את שם הפריט הזה, תחילה גרור אותו מחוץ לאשפה.`, jpeg_image: "JPEG תמונת", keep_in_taskbar: "שמירה בשורת המשימות", + web_link: "קישור אינטרנט", + enter_url_for_web_link: "הזן את כתובת ה-URL לקישור האינטרנט:", + url_must_start_with_http: "כתובת ה-URL חייבת להתחיל ב-http:// או https://", + failed_to_open_url: "לא ניתן לפתוח את כתובת ה-URL. אנא בדוק את הגדרות החלונות הקופצים בדפדפן שלך.", + invalid_url_in_weblink: "כתובת URL לא תקינה שמורה בקובץ קישור האינטרנט הזה.", + error_reading_weblink: "שגיאה בקריאת קובץ קישור האינטרנט.", language: "שפה", license: "רישיון", lightness: "בהירות", diff --git a/src/gui/src/i18n/translations/hi.js b/src/gui/src/i18n/translations/hi.js index 49fd1a5d1b..b0c69e39c1 100644 --- a/src/gui/src/i18n/translations/hi.js +++ b/src/gui/src/i18n/translations/hi.js @@ -151,6 +151,12 @@ const hi = { items_in_trash_cannot_be_renamed: "इस वस्तु का नाम नहीं बदला जा सकता क्योंकि यह कूड़ेदान में है। इस वस्तु का नाम बदलने के लिए, पहले इसे ट्रैश से बाहर खींचें।", jpeg_image: 'जेपीईजी छवि', keep_in_taskbar: 'टास्कबार में रखें', + web_link: "वेब लिंक", + enter_url_for_web_link: "वेब लिंक के लिए URL दर्ज करें:", + url_must_start_with_http: "URL http:// या https:// से शुरू होना चाहिए", + failed_to_open_url: "URL खोलने में विफल। कृपया अपने ब्राउज़र की पॉपअप सेटिंग्स जांचें।", + invalid_url_in_weblink: "इस वेब लिंक फ़ाइल में संग्रहीत अमान्य URL।", + error_reading_weblink: "वेब लिंक फ़ाइल पढ़ने में त्रुटि।", language: "भाषा", license: "लाइसेंस", lightness: 'चमक', diff --git a/src/gui/src/i18n/translations/hu.js b/src/gui/src/i18n/translations/hu.js index 01fe9412ae..278b682ebc 100644 --- a/src/gui/src/i18n/translations/hu.js +++ b/src/gui/src/i18n/translations/hu.js @@ -147,6 +147,12 @@ const hu = { items_in_trash_cannot_be_renamed: "Ez az elem nem nevezhető át, mert a kukában van. A név megváltoztatásához először húzd ki a Kukából.", jpeg_image: "JPEG kép", keep_in_taskbar: "Tartsa a tálcán", + web_link: "Webes hivatkozás", + enter_url_for_web_link: "Adja meg a webes hivatkozás URL-jét:", + url_must_start_with_http: "Az URL-nek http:// vagy https:// -val kell kezdődnie", + failed_to_open_url: "Az URL megnyitása sikertelen. Kérjük, ellenőrizze a böngésző előugró ablak beállításait.", + invalid_url_in_weblink: "Érvénytelen URL tárolva ebben a webes hivatkozás fájlban.", + error_reading_weblink: "Hiba a webes hivatkozás fájl olvasásakor.", language: "Nyelv", license: "Licenc", lightness: "Világosság", diff --git a/src/gui/src/i18n/translations/hy.js b/src/gui/src/i18n/translations/hy.js index 98894d73a0..58eab1c04f 100644 --- a/src/gui/src/i18n/translations/hy.js +++ b/src/gui/src/i18n/translations/hy.js @@ -151,6 +151,12 @@ const hy = { items_in_trash_cannot_be_renamed: "Այս տարրը չի կարող վերանվանվել, քանի որ այն աղբարկղում է: Այս տարրը վերանվանելու համար նախ տեղափոխեք այն աղբարկղից:", jpeg_image: "JPEG պատկեր", keep_in_taskbar: "Պահպանել խնդրագոտում", + web_link: "Վեբ հղում", + enter_url_for_web_link: "Մուտքագրեք URL-ը վեբ հղման համար:", + url_must_start_with_http: "URL-ը պետք է սկսվի http:// կամ https:// -ով", + failed_to_open_url: "Չհաջողվեց բացել URL-ը: Ստուգեք ձեր զննարկիչի փոփ-ափ պատուհանների կարգավորումները:", + invalid_url_in_weblink: "Անվավեր URL-ը պահված է այս վեբ հղման ֆայլում:", + error_reading_weblink: "Սխալ վեբ հղման ֆայլը կարդալիս:", language: "Լեզու", license: "Լիցենզիա", lightness: "Լուսավորություն", diff --git a/src/gui/src/i18n/translations/id.js b/src/gui/src/i18n/translations/id.js index b838923193..b447f0159e 100644 --- a/src/gui/src/i18n/translations/id.js +++ b/src/gui/src/i18n/translations/id.js @@ -162,6 +162,12 @@ const id = { items_in_trash_cannot_be_renamed: `Barang ini tidak dapat dinamai ulang karena berada di sampah. Untuk mengganti nama barang ini, pertama-tama keluarkan dari Sampah.`, jpeg_image: "Gambar JPEG", keep_in_taskbar: "Pertahankan di Bilah Tugas", + web_link: "Tautan Web", + enter_url_for_web_link: "Masukkan URL untuk tautan web:", + url_must_start_with_http: "URL harus dimulai dengan http:// atau https://", + failed_to_open_url: "Gagal membuka URL. Silakan periksa pengaturan popup browser Anda.", + invalid_url_in_weblink: "URL tidak valid yang disimpan dalam file tautan web ini.", + error_reading_weblink: "Kesalahan membaca file tautan web.", language: "Bahasa", license: "Lisensi", lightness: "Kecerahan", diff --git a/src/gui/src/i18n/translations/ig.js b/src/gui/src/i18n/translations/ig.js index 75d6b8ffa2..54c1d905a3 100644 --- a/src/gui/src/i18n/translations/ig.js +++ b/src/gui/src/i18n/translations/ig.js @@ -165,6 +165,12 @@ const ig = { items_in_trash_cannot_be_renamed: `Enweghị ike ịnyegharị ihe a aha n'ihi na ọ nọ na ahịhịa. Iji nyegharịa ihe a aha, buru ụzọ dọrọ ya na ahịhịa.`, jpeg_image: "Foto JPEG", keep_in_taskbar: "Debe na Taskbar", + web_link: "Njikọ Weebụ", + enter_url_for_web_link: "Tinye URL maka njikọ weebụ:", + url_must_start_with_http: "URL ga-amalite na http:// ma ọ bụ https://", + failed_to_open_url: "Emeghị ka URL meghee. Biko lelee ntọala popup nke ihe nchọgharị gị.", + invalid_url_in_weblink: "URL na-adịghị mma echekwara na faịlụ njikọ weebụ a.", + error_reading_weblink: "Njehie mgbe ị na-agụ faịlụ njikọ weebụ.", language: "Asụsụ", license: "ikike", lightness: "ìhè", diff --git a/src/gui/src/i18n/translations/it.js b/src/gui/src/i18n/translations/it.js index 34766bb046..0172215ff5 100644 --- a/src/gui/src/i18n/translations/it.js +++ b/src/gui/src/i18n/translations/it.js @@ -167,6 +167,12 @@ const it = { items_in_trash_cannot_be_renamed: `Impossibile rinominare un elemento nel Cestino. Per rinominarlo, è necessario ripristinarlo.`, jpeg_image: "Immagine JPEG", keep_in_taskbar: "Blocca nella barra delle applicazioni", + web_link: "Collegamento Web", + enter_url_for_web_link: "Inserisci l'URL per il collegamento web:", + url_must_start_with_http: "L'URL deve iniziare con http:// o https://", + failed_to_open_url: "Impossibile aprire l'URL. Controlla le impostazioni dei popup del browser.", + invalid_url_in_weblink: "URL non valido memorizzato in questo file di collegamento web.", + error_reading_weblink: "Errore durante la lettura del file di collegamento web.", language: "Lingua", license: "Licenza", lightness: "Luminosità", diff --git a/src/gui/src/i18n/translations/ja.js b/src/gui/src/i18n/translations/ja.js index c199b892b3..866d1f7926 100644 --- a/src/gui/src/i18n/translations/ja.js +++ b/src/gui/src/i18n/translations/ja.js @@ -152,6 +152,12 @@ const ja = { items_in_trash_cannot_be_renamed: 'このアイテムはゴミ箱にあるため、名前を変更できません。このアイテムの名前を変更するには、まずゴミ箱からドラッグしてください。', jpeg_image: 'JPEG画像', keep_in_taskbar: 'タスクバーに保持', + web_link: "ウェブリンク", + enter_url_for_web_link: "ウェブリンクのURLを入力してください:", + url_must_start_with_http: "URLはhttp://またはhttps://で始まる必要があります", + failed_to_open_url: "URLを開けませんでした。ブラウザのポップアップ設定を確認してください。", + invalid_url_in_weblink: "このウェブリンクファイルに保存されているURLが無効です。", + error_reading_weblink: "ウェブリンクファイルの読み取りエラー。", language: "言語", license: "ライセンス", lightness: '明るさ', diff --git a/src/gui/src/i18n/translations/ko.js b/src/gui/src/i18n/translations/ko.js index 800005d7c4..0d0f642e02 100644 --- a/src/gui/src/i18n/translations/ko.js +++ b/src/gui/src/i18n/translations/ko.js @@ -164,6 +164,12 @@ const ko = { items_in_trash_cannot_be_renamed: `이 항목은 휴지통에 있기 때문에 이름을 바꿀 수 없습니다. 이 항목의 이름을 바꾸려면 먼저 휴지통에서 끌어내십시오.`, // Improvement suggestion: "이 항목은 휴지통에 있어 이름을 변경할 수 없습니다. 이름을 변경하려면 먼저 휴지통에서 복원해주세요." jpeg_image: "JPEG 이미지", keep_in_taskbar: "작업 표시줄에 유지", + web_link: "웹 링크", + enter_url_for_web_link: "웹 링크의 URL을 입력하세요:", + url_must_start_with_http: "URL은 http:// 또는 https://로 시작해야 합니다", + failed_to_open_url: "URL을 열 수 없습니다. 브라우저의 팝업 설정을 확인하세요.", + invalid_url_in_weblink: "이 웹 링크 파일에 저장된 URL이 유효하지 않습니다.", + error_reading_weblink: "웹 링크 파일을 읽는 중 오류가 발생했습니다.", language: "언어", license: "라이선스", lightness: "밝기", diff --git a/src/gui/src/i18n/translations/ku.js b/src/gui/src/i18n/translations/ku.js index 962ad7cced..08ea1e0f2b 100644 --- a/src/gui/src/i18n/translations/ku.js +++ b/src/gui/src/i18n/translations/ku.js @@ -168,6 +168,12 @@ const ku = { items_in_trash_cannot_be_renamed: `ئەم بابەتە ناتوانرێت ناونوسێت چونکە لە کوڵەدا هەیە. بۆ ناونوسین، سەبارەکەی لە کوڵەکە دەر بکە.`, jpeg_image: "وێنەی JPEG", keep_in_taskbar: "ڕێپێدان لە تاکسبار", + web_link: "بەستەری وێب", + enter_url_for_web_link: "ناونیشانی URL بۆ بەستەری وێب بنووسە:", + url_must_start_with_http: "URL دەبێت بە http:// یان https:// دەست پێبکات", + failed_to_open_url: "نەتوانرا URL بکەرێتەوە. تکایە ڕێکخستنەکانی پۆپ-ئەپی وێبگەڕەکەت بپشکنە.", + invalid_url_in_weblink: "URL نادروست لەم فایلە بەستەری وێبەدا هەڵگیراوە.", + error_reading_weblink: "هەڵە لەخوێندنەوەی فایلی بەستەری وێب.", language: "زمان", license: "لایسەنس", lightness: "رووناکی", diff --git a/src/gui/src/i18n/translations/nb.js b/src/gui/src/i18n/translations/nb.js index 3cb4508697..4648632a3e 100644 --- a/src/gui/src/i18n/translations/nb.js +++ b/src/gui/src/i18n/translations/nb.js @@ -88,6 +88,12 @@ const nb = { items_in_trash_cannot_be_renamed: "Dette elementet kan ikke omdøpes fordi det er i papirkurven. For å omdøpe dette elementet, dra det først ut av papirkurven.", jpeg_image: "JPEG-bilde", keep_in_taskbar: "Behold i oppgavelinjen", + web_link: "Weblenke", + enter_url_for_web_link: "Skriv inn URL for weblenken:", + url_must_start_with_http: "URL må starte med http:// eller https://", + failed_to_open_url: "Kunne ikke åpne URL. Sjekk nettleserens popup-innstillinger.", + invalid_url_in_weblink: "Ugyldig URL lagret i denne weblenkefilen.", + error_reading_weblink: "Feil ved lesing av weblenkefilen.", loading: 'Laster', log_in: "Logg inn", log_into_another_account_anyway: 'Logg inn på en annen bruker uansett', diff --git a/src/gui/src/i18n/translations/nl.js b/src/gui/src/i18n/translations/nl.js index 950eaaf612..d39a3c507d 100644 --- a/src/gui/src/i18n/translations/nl.js +++ b/src/gui/src/i18n/translations/nl.js @@ -151,6 +151,12 @@ const nl = { items_in_trash_cannot_be_renamed: `Dit item kan niet worden hernoemd omdat het in de prullenbak zit. Om dit item te hernoemen, sleept u het eerst uit de prullenbak.`, jpeg_image: 'JPEG-afbeelding', keep_in_taskbar: 'In Taakbalk Houden', + web_link: "Weblink", + enter_url_for_web_link: "Voer de URL voor de weblink in:", + url_must_start_with_http: "URL moet beginnen met http:// of https://", + failed_to_open_url: "Kan URL niet openen. Controleer de pop-upinstellingen van uw browser.", + invalid_url_in_weblink: "Ongeldige URL opgeslagen in dit weblinkbestand.", + error_reading_weblink: "Fout bij het lezen van het weblinkbestand.", language: 'Taal', license: 'Licentie', lightness: 'Helderheid', diff --git a/src/gui/src/i18n/translations/nn.js b/src/gui/src/i18n/translations/nn.js index ab8e1e7f8c..08a185cd7a 100644 --- a/src/gui/src/i18n/translations/nn.js +++ b/src/gui/src/i18n/translations/nn.js @@ -81,6 +81,12 @@ const nn = { items_in_trash_cannot_be_renamed: "Dette elementet kan ikkje omdøypast fordi det er i papirkorga. For å omdøype dette elementet, dra det først ut av papirkorga.", jpeg_image: "JPEG-bilete", keep_in_taskbar: "Behald i oppgåvelinja", + web_link: "Nettlenkje", + enter_url_for_web_link: "Skriv inn URL for nettlenkja:", + url_must_start_with_http: "URL må starte med http:// eller https://", + failed_to_open_url: "Kunne ikkje opna URL. Sjekk nettlesaren sine popup-innstillingar.", + invalid_url_in_weblink: "Ugyldig URL lagra i denne nettlenkefila.", + error_reading_weblink: "Feil ved lesing av nettlenkefila.", log_in: "Logg inn", log_out: "Logg ut", move: "Flytt", diff --git a/src/gui/src/i18n/translations/pl.js b/src/gui/src/i18n/translations/pl.js index 6e89438f00..33a88d3649 100644 --- a/src/gui/src/i18n/translations/pl.js +++ b/src/gui/src/i18n/translations/pl.js @@ -151,6 +151,12 @@ const pl = { items_in_trash_cannot_be_renamed: `Nazwa tego przedmiotu nie może zostać zmieniona, ponieważ znajduje się on w koszu. Aby zmienić jego nazwę, wyciągnij go z kosza.`, jpeg_image: 'Obraz JPEG', keep_in_taskbar: 'Zachowaj na pasku zadań', + web_link: "Link internetowy", + enter_url_for_web_link: "Wprowadź adres URL dla linku internetowego:", + url_must_start_with_http: "URL musi zaczynać się od http:// lub https://", + failed_to_open_url: "Nie udało się otworzyć adresu URL. Sprawdź ustawienia wyskakujących okienek w przeglądarce.", + invalid_url_in_weblink: "Nieprawidłowy adres URL zapisany w tym pliku linku internetowego.", + error_reading_weblink: "Błąd podczas odczytywania pliku linku internetowego.", language: "Język", license: "Licencja", lightness: 'Jasność', diff --git a/src/gui/src/i18n/translations/pt.js b/src/gui/src/i18n/translations/pt.js index eed6d0a886..21c0dc4e04 100644 --- a/src/gui/src/i18n/translations/pt.js +++ b/src/gui/src/i18n/translations/pt.js @@ -153,6 +153,12 @@ const pt = { items_in_trash_cannot_be_renamed: `Este item não pode ser renomeado porque está no lixo. Para alterar o nome, primeiro arrasta-o para fora do Lixo.`, jpeg_image: 'Imagem JPEG', keep_in_taskbar: 'Manter na Barra de Tarefas', + web_link: "Link da Web", + enter_url_for_web_link: "Digite o URL para o link da web:", + url_must_start_with_http: "O URL deve começar com http:// ou https://", + failed_to_open_url: "Falha ao abrir o URL. Verifique as configurações de pop-up do seu navegador.", + invalid_url_in_weblink: "URL inválido armazenado neste arquivo de link da web.", + error_reading_weblink: "Erro ao ler o arquivo de link da web.", language: "Língua", license: "Licença", lightness: 'Lightness', diff --git a/src/gui/src/i18n/translations/ro.js b/src/gui/src/i18n/translations/ro.js index ab93c061a7..4c1e63b07c 100644 --- a/src/gui/src/i18n/translations/ro.js +++ b/src/gui/src/i18n/translations/ro.js @@ -152,6 +152,12 @@ const ro = { items_in_trash_cannot_be_renamed: `Acest obiect nu poate fi redenumit deoarece este în coșul de gunoi. Pentru a redenumi acest obiect, mai întâi scoateți-l din Coșul de gunoi.`, jpeg_image: 'Imagine JPEG', keep_in_taskbar: 'Păstrează în bara de activități', + web_link: "Link Web", + enter_url_for_web_link: "Introduceți URL-ul pentru linkul web:", + url_must_start_with_http: "URL-ul trebuie să înceapă cu http:// sau https://", + failed_to_open_url: "Nu s-a putut deschide URL-ul. Vă rugăm să verificați setările de popup ale browserului dvs.", + invalid_url_in_weblink: "URL invalid stocat în acest fișier de link web.", + error_reading_weblink: "Eroare la citirea fișierului de link web.", language: "Limbă", license: "Licență", lightness: "Luminozitate", diff --git a/src/gui/src/i18n/translations/ru.js b/src/gui/src/i18n/translations/ru.js index 38900f7c47..efd6798bc1 100644 --- a/src/gui/src/i18n/translations/ru.js +++ b/src/gui/src/i18n/translations/ru.js @@ -168,6 +168,12 @@ const ru = { items_in_trash_cannot_be_renamed: `Этот элемент нельзя переименовать, потому что он находится в Корзине. Чтобы переименовать этот элемент, сначала перенесите его из Корзины.`, jpeg_image: 'JPEG изображение', keep_in_taskbar: 'Сохранить на Панели Задач', + web_link: "Веб-ссылка", + enter_url_for_web_link: "Введите URL для веб-ссылки:", + url_must_start_with_http: "URL должен начинаться с http:// или https://", + failed_to_open_url: "Не удалось открыть URL. Пожалуйста, проверьте настройки всплывающих окон вашего браузера.", + invalid_url_in_weblink: "Неверный URL, сохраненный в этом файле веб-ссылки.", + error_reading_weblink: "Ошибка при чтении файла веб-ссылки.", language: 'Язык', license: 'Лицензия', lightness: 'Легкость', //нужен контекст diff --git a/src/gui/src/i18n/translations/sv.js b/src/gui/src/i18n/translations/sv.js index 6c3e1e9489..5b21f7a060 100644 --- a/src/gui/src/i18n/translations/sv.js +++ b/src/gui/src/i18n/translations/sv.js @@ -152,6 +152,12 @@ const sv = { items_in_trash_cannot_be_renamed: "Det här objektet kan inte byta namn eftersom det är i papperskorgen. För att byta namn på detta objekt, dra det först ur papperskorgen.", jpeg_image: "JPEG-bild", keep_in_taskbar: "Behåll i aktivitetsfältet", + web_link: "Webblänk", + enter_url_for_web_link: "Ange URL för webbänken:", + url_must_start_with_http: "URL måste börja med http:// eller https://", + failed_to_open_url: "Kunde inte öppna URL. Kontrollera webbläsarens popup-inställningar.", + invalid_url_in_weblink: "Ogiltig URL lagrad i denna webbänkfil.", + error_reading_weblink: "Fel vid läsning av webbänkfilen.", language: "Språk", license: "Licens", lightness: "Ljus", diff --git a/src/gui/src/i18n/translations/ta.js b/src/gui/src/i18n/translations/ta.js index ebd7d244ba..3c36f853ee 100644 --- a/src/gui/src/i18n/translations/ta.js +++ b/src/gui/src/i18n/translations/ta.js @@ -150,6 +150,12 @@ const ta = { items_in_trash_cannot_be_renamed: `இந்த உருப்படி குப்பையில் இருப்பதால் மறுபெயரிட முடியாது. இந்த உருப்படியை மறுபெயரிட, முதலில் அதை குப்பையிலிருந்து வெளியே இழுக்கவும்.`, jpeg_image: 'JPEG படம்', keep_in_taskbar: 'பணிப்பட்டியில் வைக்கவும்', + web_link: "வலை இணைப்பு", + enter_url_for_web_link: "வலை இணைப்பிற்கான URL ஐ உள்ளிடவும்:", + url_must_start_with_http: "URL http:// அல்லது https:// உடன் தொடங்க வேண்டும்", + failed_to_open_url: "URL ஐ திறக்க முடியவில்லை. உங்கள் உலாவியின் பாப்அப் அமைப்புகளை சரிபார்க்கவும்.", + invalid_url_in_weblink: "இந்த வலை இணைப்பு கோப்பில் சேமிக்கப்பட்ட தவறான URL.", + error_reading_weblink: "வலை இணைப்பு கோப்பைப் படிக்கும்போது பிழை.", language: "மொழி", license: "உரிமம்", lightness: 'லேசான தன்மை', diff --git a/src/gui/src/i18n/translations/th.js b/src/gui/src/i18n/translations/th.js index ab63765c65..593e396a5e 100644 --- a/src/gui/src/i18n/translations/th.js +++ b/src/gui/src/i18n/translations/th.js @@ -150,6 +150,12 @@ const th = { items_in_trash_cannot_be_renamed: "ไม่สามารถเปลี่ยนชื่อรายการนี้ได้เนื่องจากอยู่ในถังขยะ หากต้องการเปลี่ยนชื่อรายการนี้ ให้ลากออกจากถังขยะก่อน", jpeg_image: "ภาพ JPEG", keep_in_taskbar: "คงไว้ในทาสก์บาร์", + web_link: "ลิงก์เว็บ", + enter_url_for_web_link: "ป้อน URL สำหรับลิงก์เว็บ:", + url_must_start_with_http: "URL ต้องเริ่มต้นด้วย http:// หรือ https://", + failed_to_open_url: "ไม่สามารถเปิด URL ได้ กรุณาตรวจสอบการตั้งค่าป๊อปอัปของเบราว์เซอร์", + invalid_url_in_weblink: "URL ที่ไม่ถูกต้องเก็บไว้ในไฟล์ลิงก์เว็บนี้", + error_reading_weblink: "เกิดข้อผิดพลาดในการอ่านไฟล์ลิงก์เว็บ", language: "ภาษา", license: "ใบอนุญาต", lightness: 'ความสว่าง', diff --git a/src/gui/src/i18n/translations/tr.js b/src/gui/src/i18n/translations/tr.js index 7cd913a2c6..dc8aadabe1 100644 --- a/src/gui/src/i18n/translations/tr.js +++ b/src/gui/src/i18n/translations/tr.js @@ -151,6 +151,12 @@ const tr = { items_in_trash_cannot_be_renamed: "Bu öğe, çöp kutusunda olduğu için yeniden adlandırılamaz. Bu öğeyi yeniden adlandırmak için önce çöp kutusundan çıkarın.", jpeg_image: "JPEG görüntüsü", keep_in_taskbar: "Görev Çubuğunda Tut", + web_link: "Web Bağlantısı", + enter_url_for_web_link: "Web bağlantısı için URL'yi girin:", + url_must_start_with_http: "URL http:// veya https:// ile başlamalıdır", + failed_to_open_url: "URL açılamadı. Lütfen tarayıcınızın açılır pencere ayarlarını kontrol edin.", + invalid_url_in_weblink: "Bu web bağlantısı dosyasında saklanan geçersiz URL.", + error_reading_weblink: "Web bağlantısı dosyası okunurken hata oluştu.", language: "Dil", license: "Lisans", lightness: "Aydınlık", diff --git a/src/gui/src/i18n/translations/ua.js b/src/gui/src/i18n/translations/ua.js index eee1183b87..4a006fba7a 100644 --- a/src/gui/src/i18n/translations/ua.js +++ b/src/gui/src/i18n/translations/ua.js @@ -154,6 +154,12 @@ const ua = { перемістіть його з корзини`, jpeg_image: "JPEG зображення", keep_in_taskbar: "Зберегти на Панелі Задач", + web_link: "Веб-посилання", + enter_url_for_web_link: "Введіть URL для веб-посилання:", + url_must_start_with_http: "URL повинен починатися з http:// або https://", + failed_to_open_url: "Не вдалося відкрити URL. Перевірте налаштування спливаючих вікон браузера.", + invalid_url_in_weblink: "Недійсний URL збережено в цьому файлі веб-посилання.", + error_reading_weblink: "Помилка при читанні файлу веб-посилання.", language: "Мова", license: "Ліцензія", lightness: "Яскравість", diff --git a/src/gui/src/i18n/translations/ur.js b/src/gui/src/i18n/translations/ur.js index 82b13b28c9..dd20eceb55 100644 --- a/src/gui/src/i18n/translations/ur.js +++ b/src/gui/src/i18n/translations/ur.js @@ -157,6 +157,12 @@ const ur = { "کچرے میں موجود اشیاء کا نام تبدیل نہیں کیا جا سکتا", jpeg_image: "جے پی ای جی_تصویر", keep_in_taskbar: "ٹاسک بار میں رکھیں ", + web_link: "ویب لنک", + enter_url_for_web_link: "ویب لنک کے لیے URL درج کریں:", + url_must_start_with_http: "URL http:// یا https:// سے شروع ہونا چاہیے", + failed_to_open_url: "URL کھولنے میں ناکام. براہ کرم اپنے براؤزر کی پاپ اپ کی ترتیبات چیک کریں۔", + invalid_url_in_weblink: "اس ویب لنک فائل میں محفوظ غلط URL۔", + error_reading_weblink: "ویب لنک فائل پڑھنے میں خرابی۔", language: "زبان", license: "License", lightness: "لائسنس", diff --git a/src/gui/src/i18n/translations/vi.js b/src/gui/src/i18n/translations/vi.js index 0963d2509a..a35025d1bb 100644 --- a/src/gui/src/i18n/translations/vi.js +++ b/src/gui/src/i18n/translations/vi.js @@ -152,6 +152,12 @@ const vi = { items_in_trash_cannot_be_renamed: `Mục này không thể đổi tên vì nó đang ở trong thùng rác. Để đổi tên mục này, trước tiên hãy kéo nó ra khỏi Thùng rác.`, jpeg_image: 'Hình ảnh JPEG', keep_in_taskbar: 'Giữ trong thanh tác vụ', + web_link: "Liên kết Web", + enter_url_for_web_link: "Nhập URL cho liên kết web:", + url_must_start_with_http: "URL phải bắt đầu bằng http:// hoặc https://", + failed_to_open_url: "Không thể mở URL. Vui lòng kiểm tra cài đặt popup của trình duyệt.", + invalid_url_in_weblink: "URL không hợp lệ được lưu trữ trong tệp liên kết web này.", + error_reading_weblink: "Lỗi khi đọc tệp liên kết web.", language: "Ngôn ngữ", license: "Giấy phép", lightness: 'Độ sáng', diff --git a/src/gui/src/i18n/translations/zh.js b/src/gui/src/i18n/translations/zh.js index 3d8ddc1d82..f5b21a4425 100644 --- a/src/gui/src/i18n/translations/zh.js +++ b/src/gui/src/i18n/translations/zh.js @@ -152,6 +152,12 @@ const zh = { items_in_trash_cannot_be_renamed: `此项目无法重命名,因为它在回收站中。要重命名此项目,请先将其拖出回收站。`, jpeg_image: 'JPEG 图像', keep_in_taskbar: '固定在任务栏', + web_link: "网页链接", + enter_url_for_web_link: "请输入网页链接的URL:", + url_must_start_with_http: "URL必须以http://或https://开头", + failed_to_open_url: "无法打开URL。请检查浏览器的弹窗设置。", + invalid_url_in_weblink: "此网页链接文件中存储的URL无效。", + error_reading_weblink: "读取网页链接文件时出错。", language: "语言", license: "许可协议", lightness: '明亮', diff --git a/src/gui/src/i18n/translations/zhtw.js b/src/gui/src/i18n/translations/zhtw.js index 00b31d178d..898e8c40ed 100644 --- a/src/gui/src/i18n/translations/zhtw.js +++ b/src/gui/src/i18n/translations/zhtw.js @@ -151,6 +151,12 @@ const zhtw = { items_in_trash_cannot_be_renamed: `此項目無法重新命名,因為它在垃圾桶中。要重新命名此項目,請先將其從垃圾桶中拖出。`, jpeg_image: 'JPEG 圖片', keep_in_taskbar: '保留在工作列', + web_link: "網頁連結", + enter_url_for_web_link: "請輸入網頁連結的URL:", + url_must_start_with_http: "URL必須以http://或https://開頭", + failed_to_open_url: "無法開啟URL。請檢查瀏覽器的彈出視窗設定。", + invalid_url_in_weblink: "此網頁連結檔案中儲存的URL無效。", + error_reading_weblink: "讀取網頁連結檔案時發生錯誤。", language: "語言", license: "授權", lightness: '亮度', diff --git a/src/gui/src/keyboard.js b/src/gui/src/keyboard.js index 23c5871470..161c0635b2 100644 --- a/src/gui/src/keyboard.js +++ b/src/gui/src/keyboard.js @@ -733,9 +733,32 @@ $(document).bind("keyup keydown", async function(e){ if((e.ctrlKey || e.metaKey) && e.which === 86 && !$(focused_el).is('input') && !$(focused_el).is('textarea')){ let target_path, target_el; - // continue only if there is something in the clipboard - if(window.clipboard.length === 0) - return; + // Check if there's text in clipboard that looks like a URL + if (window.clipboard.length === 0) { + // Prevent default early to avoid browser handling + e.preventDefault(); + e.stopPropagation(); + + // Try to read text from clipboard + if (navigator.clipboard && navigator.clipboard.readText) { + try { + const clipboardText = await navigator.clipboard.readText(); + if (clipboardText && (clipboardText.startsWith('http://') || clipboardText.startsWith('https://'))) { + const parent_container = determine_active_container_parent(); + if (parent_container) { + target_path = $(parent_container).attr('data-path'); + if (target_path && target_path !== window.trash_path && !target_path.startsWith(window.trash_path + '/')) { + await window.create_weblink_from_url(target_path, parent_container, clipboardText); + return false; + } + } + } + } catch (err) { + // Clipboard access denied or failed, continue with normal paste + } + } + return false; + } let parent_container = determine_active_container_parent();