From 0d64d3caca1bfa66148b9ecd6985e515e9c87a06 Mon Sep 17 00:00:00 2001 From: GA Date: Sun, 25 Oct 2026 15:36:06 +0100 Subject: [PATCH] feat(TextViewer): edit and save text files, choose the background - The text preview can be edited and saved (Ctrl+S, or "Save" in the More menu). Cut and Paste are added to the context menu while editing, and closing or replacing the preview with unsaved edits asks whether to save them. - Escape inside the text only leaves the editor (hides the caret); a second Escape closes the preview. The view exposes HasUnsavedChanges and ConsumeEscape() so the preview window can keep Space/Escape from closing it while edits are pending. - A "Background" entry in the More menu cycles through six dark-theme background presets (light to black); the choice is stored in the plugin's BackgroundColor setting, documented in OPTIONS.md. - New strings (Editor_Cut, Editor_Paste, MW_SaveText, MW_SaveChangesPrompt and the MW_Background* set) are present in every language of the plugin's Translations.config. The non-English/Spanish translations are new and could use a native-speaker review. Co-Authored-By: Claude Haiku 5.5 --- OPTIONS.md | 7 + .../Plugin.MoreMenu.cs | 43 +++ .../QuickLook.Plugin.TextViewer/Plugin.cs | 3 +- .../TextViewerPanel.cs | 220 +++++++++++- .../Translations.config | 319 ++++++++++++++++++ 5 files changed, 579 insertions(+), 13 deletions(-) diff --git a/OPTIONS.md b/OPTIONS.md index a5fd6b0cb..d7ef8f3d8 100644 --- a/OPTIONS.md +++ b/OPTIONS.md @@ -293,6 +293,13 @@ These keys are also stored in `QuickLook.config`. - Example: - `13` +### `` +- Default: empty (the default background) +- Type: `String` +- Description: Custom background color of the text viewer. The value is parsed by WPF `ColorConverter` (`#AARRGGBB` is accepted, so it can be translucent). It only applies to the dark theme. The "Background" entry in the More menu cycles through six presets and stores the chosen value here. +- Example: + - `#B4141414` + ## Notes - All option names are case-sensitive and stored as XML element names under ``. diff --git a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Plugin.MoreMenu.cs b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Plugin.MoreMenu.cs index 5eee34293..ddad93002 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Plugin.MoreMenu.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Plugin.MoreMenu.cs @@ -74,5 +74,48 @@ public IEnumerable GetMenuItems() if (reopen is not null) yield return reopen; + + if (_tvp is not null) + { + yield return new MoreMenuItem() + { + Icon = FontSymbols.Save, + Header = TranslationHelper.Get("MW_SaveText", translationFile), + Command = new RelayCommand(() => _tvp?.Save()), + }; + + var background = new MoreMenuItem() + { + Icon = FontSymbols.Color, + Header = GetBackgroundHeader(translationFile), + }; + background.Command = new RelayCommand(() => + { + // Cycle through the presets; a custom value from the config file restarts at the lightest one + var presets = TextViewerPanel.BackgroundPresets; + var index = Array.FindIndex(presets, p => p.Equals(TextViewerPanel.BackgroundColor, StringComparison.OrdinalIgnoreCase)); + TextViewerPanel.BackgroundColor = presets[(index + 1) % presets.Length]; + _tvp?.ApplyBackground(); + background.Header = GetBackgroundHeader(translationFile); + }); + yield return background; + } + } + + private static string GetBackgroundHeader(string translationFile) + { + var index = Array.FindIndex(TextViewerPanel.BackgroundPresets, + p => p.Equals(TextViewerPanel.BackgroundColor, StringComparison.OrdinalIgnoreCase)); + var name = index switch + { + 0 => TranslationHelper.Get("MW_BackgroundLight", translationFile), + 1 => TranslationHelper.Get("MW_BackgroundMedium", translationFile), + 2 => TranslationHelper.Get("MW_BackgroundDefault", translationFile), + 3 => TranslationHelper.Get("MW_BackgroundDark", translationFile), + 4 => TranslationHelper.Get("MW_BackgroundDarker", translationFile), + 5 => TranslationHelper.Get("MW_BackgroundBlack", translationFile), + _ => TextViewerPanel.BackgroundColor, + }; + return $"{TranslationHelper.Get("MW_Background", translationFile)}: {name}"; } } diff --git a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Plugin.cs b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Plugin.cs index 92bc33737..55ffe4f80 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Plugin.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Plugin.cs @@ -69,7 +69,7 @@ public bool CanHandle(string path) public void Prepare(string path, ContextObject context) { - context.PreferredSize = new Size { Width = 800, Height = 600 }; + context.PreferredSize = new Size { Width = 800, Height = Math.Min(900, SystemParameters.WorkArea.Height * 0.85) }; } public void View(string path, ContextObject context) @@ -100,6 +100,7 @@ public void View(string path, ContextObject context) public void Cleanup() { + _tvp?.PromptSaveIfDirty(); _tvp?.Dispose(); _tvp = null; } diff --git a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/TextViewerPanel.cs b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/TextViewerPanel.cs index 0da7847f1..bb8d56578 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/TextViewerPanel.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/TextViewerPanel.cs @@ -43,6 +43,19 @@ namespace QuickLook.Plugin.TextViewer; public partial class TextViewerPanel : TextEditor, IDisposable { private bool _disposed; + private string _path; + private ContextObject _context; + private string _title; + private bool _hasBom; + private bool _isDirty; + private int _escapeLeftEditorTick; // Environment.TickCount of the Escape that left the editor, 0 if none + private bool _isDarkHighlighting; + + /// + /// Background presets for the dark theme, from lightest to darkest, cycled from the More menu. An empty value keeps the + /// window backdrop (transparent); any other "#AARRGGBB" value can also be set in the config file. + /// + public static readonly string[] BackgroundPresets = ["#30FFFFFF", "#18FFFFFF", "", "#B4141414", "#E60C0C0C", "#FF000000"]; /// Maximum number of characters allowed on a single line before it is truncated. private const int MAX_LINE_LENGTH = 10000; @@ -95,12 +108,25 @@ public TextViewerPanel() ?.Stroke = Brushes.Transparent; ContextMenu = new ContextMenu(); + // Add "Cut" and "Paste" menu items, only shown while editing. + ContextMenu.Items.Add(new MenuItem + { + Header = TranslationHelper.Get("Editor_Cut", domain: Assembly.GetExecutingAssembly().GetName().Name), + Command = ApplicationCommands.Cut, + Tag = "EditOnly", + }); // Add "Copy" menu item. ContextMenu.Items.Add(new MenuItem { Header = TranslationHelper.Get("Editor_Copy", domain: Assembly.GetExecutingAssembly().GetName().Name), Command = ApplicationCommands.Copy }); + ContextMenu.Items.Add(new MenuItem + { + Header = TranslationHelper.Get("Editor_Paste", domain: Assembly.GetExecutingAssembly().GetName().Name), + Command = ApplicationCommands.Paste, + Tag = "EditOnly", + }); // Add "Select All" menu item. ContextMenu.Items.Add(new MenuItem { @@ -113,6 +139,12 @@ public TextViewerPanel() ManipulationStarting += Viewer_ManipulationStarting; ManipulationDelta += Viewer_ManipulationDelta; KeyDown += Viewer_KeyDown; + PreviewKeyDown += Viewer_PreviewKeyDown; + ContextMenuOpening += (_, _) => + { + foreach (var item in ContextMenu.Items.OfType().Where(i => i.Tag is "EditOnly")) + item.Visibility = IsReadOnly ? Visibility.Collapsed : Visibility.Visible; + }; PreviewMouseWheel += Viewer_MouseWheel; @@ -136,6 +168,147 @@ public void Dispose() _disposed = true; } + public static string BackgroundColor + { + get => SettingHelper.Get("BackgroundColor", string.Empty, "QuickLook.Plugin.TextViewer"); + set => SettingHelper.Set("BackgroundColor", value ?? string.Empty, "QuickLook.Plugin.TextViewer"); + } + + /// + /// Applies the configured background. The custom color only applies to the dark theme, + /// since the light syntax colors are unreadable on a dark background. + /// + public void ApplyBackground() + { + if (_isDarkHighlighting) + { + Background = TryParseColor(BackgroundColor, out var color) + ? new SolidColorBrush(color) + : Brushes.Transparent; + } + else + { + // if os dark mode, but not AllowDarkTheme, make background light + Background = OSThemeHelper.AppsUseDarkTheme() + ? new SolidColorBrush(Color.FromArgb(175, 255, 255, 255)) + : Brushes.Transparent; + } + } + + private static bool TryParseColor(string value, out Color color) + { + color = default; + if (string.IsNullOrWhiteSpace(value)) + return false; + + try + { + color = (Color)ColorConverter.ConvertFromString(value.Trim()); + return true; + } + catch (FormatException) + { + return false; + } + } + + /// + /// False when the shown text differs from the file (truncated or converted), so saving it would lose data. + /// + public bool CanEdit { get; private set; } + + /// + /// Read by QuickLook (by name) to keep Space from closing the preview while edits are unsaved. + /// + public bool HasUnsavedChanges => _isDirty && !IsReadOnly; + + /// + /// Called by QuickLook (by name) when Escape is released: true when that Escape only left the editor, + /// so it must not also close the preview. + /// + public bool ConsumeEscape() + { + // only the release of that same Escape counts: a later one closes the preview as usual + var handled = _escapeLeftEditorTick != 0 && Environment.TickCount - _escapeLeftEditorTick < 2000; + _escapeLeftEditorTick = 0; + return handled; + } + + // Escape in the text leaves the editor (hides the caret) instead of closing the preview; the next + // Escape, or Space, then acts on the preview again. + private void Viewer_PreviewKeyDown(object sender, KeyEventArgs e) + { + if (e.Key != Key.Escape || !TextArea.IsKeyboardFocused) + return; + + e.Handled = true; + _escapeLeftEditorTick = Environment.TickCount | 1; + + var window = Window.GetWindow(this); + if (window != null) + { + // the window is a focus scope: focusing it would hand the focus straight back to the text + FocusManager.SetFocusedElement(window, null); + Keyboard.Focus(window); + } + else + { + Keyboard.ClearFocus(); + } + } + + /// + /// Writes the text back to the file, keeping its original encoding and byte order mark. + /// + public void Save() + { + if (!CanEdit || IsReadOnly || !_isDirty) + return; + + try + { + var bytes = Encoding.GetBytes(Text); + using (var fs = new FileStream(_path, FileMode.Create, FileAccess.Write, FileShare.Read)) + { + if (_hasBom) + { + var preamble = Encoding.GetPreamble(); + fs.Write(preamble, 0, preamble.Length); + } + fs.Write(bytes, 0, bytes.Length); + } + + _isDirty = false; + UpdateTitle(); + } + catch (Exception e) + { + ProcessHelper.WriteLog(e.ToString()); + MessageBox.Show(e.Message, "QuickLook", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + + /// + /// Asks whether to save unsaved edits before the preview is closed or replaced. + /// + public void PromptSaveIfDirty() + { + if (!_isDirty || IsReadOnly) + return; + + var result = MessageBox.Show( + TranslationHelper.Get("MW_SaveChangesPrompt", domain: Assembly.GetExecutingAssembly().GetName().Name), + "QuickLook", MessageBoxButton.YesNo, MessageBoxImage.Question); + if (result == MessageBoxResult.Yes) + Save(); + } + + private void UpdateTitle() + { + if (_context != null) + _context.Title = _isDirty ? $"{_title} *" : _title; + } + private void Viewer_ManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e) { e.TranslationBehavior = new InertiaTranslationBehavior @@ -167,6 +340,13 @@ private void Viewer_ManipulationStarting(object sender, ManipulationStartingEven private void Viewer_KeyDown(object sender, KeyEventArgs e) { + if (e.Key == Key.S && Keyboard.Modifiers == ModifierKeys.Control) + { + e.Handled = true; + Save(); + return; + } + // Support keyboard shortcuts for RTL and LTR text direction if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) { @@ -317,17 +497,22 @@ protected override void ColorizeLine(DocumentLine line) public void LoadFileAsync(string path, ContextObject context) { + _path = path; + _context = context; + _ = Task.Run(() => { + bool transferred = false; const int maxLength = 5 * 1024 * 1024; const int maxHighlightingLength = (int)(0.5d * 1024 * 1024); var buffer = new MemoryStream(); bool fileTooLong = false; // Read file to memory stream - if (FormatDetector.Transfer(path, out string transferred)) + if (FormatDetector.Transfer(path, out string transferredText)) { - byte[] bytes = Encoding.UTF8.GetBytes(transferred); + transferred = true; + byte[] bytes = Encoding.UTF8.GetBytes(transferredText); buffer.Write(bytes, 0, bytes.Length); } else @@ -356,6 +541,12 @@ public void LoadFileAsync(string path, ContextObject context) var encoding = EncodingDetector.DetectFromBytes(bufferCopy); var text = encoding.GetString(bufferCopy); + var preamble = encoding.GetPreamble(); + var hasBom = preamble.Length > 0 && bufferCopy.Take(preamble.Length).SequenceEqual(preamble); + + // GetString keeps the BOM as U+FEFF; drop it so it is not written twice on save + if (hasBom && text.Length > 0 && text[0] == '\uFEFF') + text = text.Substring(1); // Truncate overly long lines to prevent crashes and lag bool hasLongLines = TruncateLongLinesInText(ref text); @@ -372,11 +563,24 @@ public void LoadFileAsync(string path, ContextObject context) var highlighting = HighlightingThemeManager.GetHighlightingByExtensionOrDetector(path, extension, text); Encoding = encoding; + _hasBom = hasBom; + _title = context.Title; + CanEdit = !transferred && !fileTooLong && !hasLongLines; + doc.TextChanged += (_, _) => + { + if (_isDirty || IsReadOnly) + return; + _isDirty = true; + UpdateTitle(); + }; SyntaxHighlighting = bufferCopy.Length > maxHighlightingLength ? null : highlighting.SyntaxHighlighting; Document = doc; + // editable right away, unless saving would lose data (truncated or converted text) + IsReadOnly = !CanEdit; + if (SyntaxHighlighting is ICustomHighlightingDefinition custom) { foreach (var lineTransformer in custom.LineTransformers) @@ -392,18 +596,10 @@ public void LoadFileAsync(string path, ContextObject context) TextArea.TextView.LineTransformers.Add(new TruncatedLineDecolorizer(this)); } + _isDarkHighlighting = highlighting.IsDark; + ApplyBackground(); if (highlighting.IsDark) - { - Background = Brushes.Transparent; SetResourceReference(ForegroundProperty, "WindowTextForeground"); - } - else - { - // if os dark mode, but not AllowDarkTheme, make background light - Background = OSThemeHelper.AppsUseDarkTheme() - ? new SolidColorBrush(Color.FromArgb(175, 255, 255, 255)) - : Brushes.Transparent; - } // Support automatic RTL for text files if (extension.Equals(".txt", StringComparison.OrdinalIgnoreCase)) diff --git a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Translations.config b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Translations.config index 71bbc18ce..c601e5e71 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Translations.config +++ b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Translations.config @@ -8,6 +8,17 @@ إعادة فتح كمعاينة HTML إعادة فتح كمعاينة صورة إعادة فتح كمعاينة CSV + قص + لصق + حفظ (Ctrl+S) + هل تريد حفظ التغييرات في هذا الملف؟ + الخلفية + فاتح + متوسط + افتراضي + داكن + أكثر قتامة + أسود Consolas @@ -16,6 +27,17 @@ Torna a obrir com a previsualització HTML Torna a obrir com a previsualització d'imatge Torna a obrir com a previsualització CSV + Retalla + Enganxa + Desa (Ctrl+S) + Voleu desar els canvis en aquest fitxer? + Fons + Clar + Mitjà + Per defecte + Fosc + Més fosc + Negre Consolas @@ -24,6 +46,17 @@ Als HTML-Vorschau erneut öffnen Als Bildvorschau erneut öffnen Als CSV-Vorschau erneut öffnen + Ausschneiden + Einfügen + Speichern (Strg+S) + Änderungen an dieser Datei speichern? + Hintergrund + Hell + Mittel + Standard + Dunkel + Dunkler + Schwarz Consolas @@ -32,6 +65,17 @@ Reopen as HTML preview Reopen as image preview Reopen as CSV preview + Cut + Paste + Save (Ctrl+S) + Save changes to this file? + Background + Light + Medium + Default + Dark + Darker + Black Consolas @@ -40,6 +84,17 @@ Reabrir como vista previa HTML Reabrir como vista previa de imagen Reabrir como vista previa CSV + Cortar + Pegar + Guardar (Ctrl+S) + ¿Guardar los cambios en este archivo? + Fondo + Claro + Medio + Predeterminado + Oscuro + Más oscuro + Negro Consolas @@ -48,6 +103,17 @@ Rouvrir en aperçu HTML Rouvrir en aperçu d'image Rouvrir en aperçu CSV + Couper + Coller + Enregistrer (Ctrl+S) + Enregistrer les modifications de ce fichier ? + Arrière-plan + Clair + Moyen + Par défaut + Sombre + Plus sombre + Noir Consolas @@ -56,6 +122,17 @@ Riapri come anteprima HTML Riapri come anteprima immagine Riapri come anteprima CSV + Taglia + Incolla + Salva (Ctrl+S) + Salvare le modifiche a questo file? + Sfondo + Chiaro + Medio + Predefinito + Scuro + Più scuro + Nero Consolas,Meiryo UI,MS UI Gothic,MS Gothic @@ -64,6 +141,17 @@ HTML プレビューとして再度開く 画像プレビューとして再度開く CSV プレビューとして再度開く + 切り取り + 貼り付け + 保存 (Ctrl+S) + このファイルの変更を保存しますか? + 背景 + 明るい + 中間 + 既定 + 暗い + より暗い + 黒 Consolas,Malgun Gothic,Gulim @@ -72,6 +160,17 @@ HTML 미리보기로 다시 열기 이미지 미리보기로 다시 열기 CSV 미리보기로 다시 열기 + 잘라내기 + 붙여넣기 + 저장 (Ctrl+S) + 이 파일의 변경 내용을 저장하시겠습니까? + 배경 + 밝게 + 보통 + 기본값 + 어둡게 + 더 어둡게 + 검정 Consolas @@ -80,6 +179,17 @@ Åpne på nytt som HTML-forhåndsvisning Åpne på nytt som bilde-forhåndsvisning Åpne på nytt som CSV-forhåndsvisning + Klipp ut + Lim inn + Lagre (Ctrl+S) + Vil du lagre endringene i denne filen? + Bakgrunn + Lys + Middels + Standard + Mørk + Mørkere + Svart Consolas @@ -88,6 +198,17 @@ Opnieuw openen als HTML-voorbeeld Opnieuw openen als afbeelding-voorbeeld Opnieuw openen als CSV-voorbeeld + Knippen + Plakken + Opslaan (Ctrl+S) + Wijzigingen in dit bestand opslaan? + Achtergrond + Licht + Gemiddeld + Standaard + Donker + Donkerder + Zwart Consolas @@ -96,6 +217,17 @@ Otwórz ponownie jako podgląd HTML Otwórz ponownie jako podgląd obrazu Otwórz ponownie jako podgląd CSV + Wytnij + Wklej + Zapisz (Ctrl+S) + Czy zapisać zmiany w tym pliku? + Tło + Jasne + Średnie + Domyślne + Ciemne + Ciemniejsze + Czarne Consolas @@ -104,6 +236,17 @@ Reabrir como visualização HTML Reabrir como visualização de imagem Reabrir como visualização CSV + Recortar + Colar + Salvar (Ctrl+S) + Salvar as alterações neste arquivo? + Plano de fundo + Claro + Médio + Padrão + Escuro + Mais escuro + Preto Consolas @@ -112,6 +255,17 @@ Reabrir como pré-visualização HTML Reabrir como pré-visualização de imagem Reabrir como pré-visualização CSV + Cortar + Colar + Guardar (Ctrl+S) + Guardar as alterações a este ficheiro? + Fundo + Claro + Médio + Predefinido + Escuro + Mais escuro + Preto Consolas @@ -120,6 +274,17 @@ Redeschideți ca previzualizare HTML Redeschideți ca previzualizare imagine Redeschideți ca previzualizare CSV + Decupare + Lipire + Salvare (Ctrl+S) + Salvați modificările din acest fișier? + Fundal + Deschis + Mediu + Implicit + Închis + Mai închis + Negru Consolas @@ -128,6 +293,17 @@ Переоткрыть как предварительный просмотр HTML Переоткрыть как предварительный просмотр изображения Переоткрыть как предварительный просмотр CSV + Вырезать + Вставить + Сохранить (Ctrl+S) + Сохранить изменения в этом файле? + Фон + Светлый + Средний + По умолчанию + Тёмный + Темнее + Чёрный Consolas @@ -136,6 +312,17 @@ HTML önizlemesi olarak yeniden aç Resim önizlemesi olarak yeniden aç CSV önizlemesi olarak yeniden aç + Kes + Yapıştır + Kaydet (Ctrl+S) + Bu dosyadaki değişiklikler kaydedilsin mi? + Arka plan + Açık + Orta + Varsayılan + Koyu + Daha koyu + Siyah Consolas @@ -144,6 +331,17 @@ Перевідкрити як попередній перегляд HTML Перевідкрити як попередній перегляд зображення Перевідкрити як попередній перегляд CSV + Вирізати + Вставити + Зберегти (Ctrl+S) + Зберегти зміни в цьому файлі? + Тло + Світлий + Середній + За замовчуванням + Темний + Темніший + Чорний Consolas @@ -152,6 +350,17 @@ Mở lại dưới dạng xem trước HTML Mở lại dưới dạng xem trước hình ảnh Mở lại dưới dạng xem trước CSV + Cắt + Dán + Lưu (Ctrl+S) + Lưu các thay đổi cho tệp này? + Nền + Sáng + Trung bình + Mặc định + Tối + Tối hơn + Đen Consolas,Microsoft Yahei UI,Microsoft Yahei,SimSun @@ -160,6 +369,17 @@ 重新作为 HTML 预览打开 重新作为图像预览打开 重新作为 CSV 预览打开 + 剪切 + 粘贴 + 保存 (Ctrl+S) + 是否保存对此文件的更改? + 背景 + 浅色 + 中等 + 默认 + 深色 + 更深 + 黑色 Consolas,Microsoft JhengHei UI,Microsoft JhengHei,MingLiU @@ -167,6 +387,17 @@ 全選 重新作為 HTML 預覽開啟 重新作為圖像預覽開啟 + 剪下 + 貼上 + 儲存 (Ctrl+S) + 要儲存對此檔案的變更嗎? + 背景 + 淺色 + 中等 + 預設 + 深色 + 更深 + 黑色 Consolas,Mangal,Nirmala UI @@ -174,6 +405,17 @@ सर्व निवडा HTML पूर्वावलोकन म्हणून पुन्हा उघडा प्रतिमा पूर्वावलोकन म्हणून पुन्हा उघडा + कापा + चिकटवा + जतन करा (Ctrl+S) + या फाइलमधील बदल जतन करायचे? + पार्श्वभूमी + फिकट + मध्यम + डीफॉल्ट + गडद + अधिक गडद + काळा Consolas,Mangal,Nirmala UI @@ -181,6 +423,17 @@ सभी चुनें HTML पूर्वावलोकन के रूप में फिर से खोलें छवि पूर्वावलोकन के रूप में फिर से खोलें + काटें + चिपकाएँ + सहेजें (Ctrl+S) + इस फ़ाइल में किए गए बदलाव सहेजें? + पृष्ठभूमि + हल्का + मध्यम + डिफ़ॉल्ट + गहरा + और गहरा + काला Consolas @@ -188,6 +441,17 @@ בחר הכל פתח מחדש כתצוגה מקדימה של HTML פתח מחדש כתצוגה מקדימה של תמונה + גזור + הדבק + שמור (Ctrl+S) + לשמור את השינויים בקובץ זה? + רקע + בהיר + בינוני + ברירת מחדל + כהה + כהה יותר + שחור Consolas @@ -195,6 +459,17 @@ Mindet kijelöl Újranyitás HTML előnézetként Újranyitás kép előnézetként + Kivágás + Beillesztés + Mentés (Ctrl+S) + Menti a fájlban végzett módosításokat? + Háttér + Világos + Közepes + Alapértelmezett + Sötét + Sötétebb + Fekete Consolas @@ -202,6 +477,17 @@ Pilih Semua Buka ulang sebagai pratinjau HTML Buka ulang sebagai pratinjau gambar + Potong + Tempel + Simpan (Ctrl+S) + Simpan perubahan pada berkas ini? + Latar belakang + Terang + Sedang + Default + Gelap + Lebih gelap + Hitam Consolas @@ -209,6 +495,17 @@ Označiť všetko Znova otvoriť ako HTML náhľad Znova otvoriť ako náhľad obrázka + Vystrihnúť + Prilepiť + Uložiť (Ctrl+S) + Uložiť zmeny v tomto súbore? + Pozadie + Svetlé + Stredné + Predvolené + Tmavé + Tmavšie + Čierne Consolas @@ -216,6 +513,17 @@ Επιλογή όλων Επανανοίξτε ως προεπισκόπηση HTML Επανανοίξτε ως προεπισκόπηση εικόνας + Αποκοπή + Επικόλληση + Αποθήκευση (Ctrl+S) + Να αποθηκευτούν οι αλλαγές σε αυτό το αρχείο; + Φόντο + Ανοιχτό + Μεσαίο + Προεπιλογή + Σκούρο + Πιο σκούρο + Μαύρο Consolas @@ -223,5 +531,16 @@ Markera allt Öppna på nytt som HTML-förhandsgranskning Öppna på nytt som bildförhandsgranskning + Klipp ut + Klistra in + Spara (Ctrl+S) + Vill du spara ändringarna i den här filen? + Bakgrund + Ljus + Medel + Standard + Mörk + Mörkare + Svart