diff --git a/i18n/NotepadNext_ru.ts b/i18n/NotepadNext_ru.ts index ac3a5d9dc..3965e8203 100644 --- a/i18n/NotepadNext_ru.ts +++ b/i18n/NotepadNext_ru.ts @@ -1,2299 +1,3055 @@ - - + + + AuthenticateDialog + + + Dialog + + + + + Please provide the user name and password for the download location. + + + + + &User name: + + + + + &Password: + + + + ColumnEditorDialog - - Column Mode - Режим столбцов + + Column Mode + Режим столбцов - - Text - Текст + + Text + Текст - - Numbers - Числа + + Numbers + Числа - - Start: - Начало: + + Start: + Начало: - - Step: - Шаг: + + Step: + Шаг: - - + + DebugLogDock - - Debug Log - Журнал отладки + + Debug Log + Журнал отладки + + + + Downloader + + + + Updater + + + + + + + Downloading updates + + + + + Time remaining: 0 minutes + + + + + Open + + + + + + Stop + + + + + + Time remaining + + + + + unknown + + + + + Error + + + + + Cannot find downloaded update! + + + + + Close + Закрыть + + + + Download complete! + + + + + The installer will open separately + + + + + Click "OK" to begin installing the update + + + + + In order to install the update, you may need to quit the application. + + + + + In order to install the update, you may need to quit the application. This is a mandatory update, exiting now will close the application. + - - + + + Click the "Open" button to apply the update + + + + + Are you sure you want to cancel the download? + + + + + Are you sure you want to cancel the download? This is a mandatory update, exiting now will close the application + + + + + + %1 bytes + + + + + + %1 KB + + + + + + %1 MB + + + + + of + + + + + Downloading Updates + + + + + Time Remaining + + + + + Unknown + + + + + about %1 hours + + + + + about one hour + + + + + %1 minutes + + + + + 1 minute + + + + + %1 seconds + + + + + 1 second + + + + EditorInfoStatusBar - - Length: %L1 Lines: %L2 - Длина: %L1 Строк: %L2 + + Length: %L1 Lines: %L2 + Длина: %L1 Строк: %L2 - - Sel: N/A - Выб: Н/Д + + Sel: N/A + Выб: Н/Д - - Sel: %L1 | %L2 - Выб: %L1 | %L2 + + Sel: %L1 | %L2 + Выб: %L1 | %L2 - - Ln: %L1 Col: %L2 - Стр: %L1 Стл: %L2 + + Ln: %L1 Col: %L2 + Стр: %L1 Стл: %L2 - - Macintosh (CR) - Macintosh (CR) + + Macintosh (CR) + Macintosh (CR) - - Windows (CR LF) - Windows (CR LF) + + Windows (CR LF) + Windows (CR LF) - - Unix (LF) - Unix (LF) + + Unix (LF) + Unix (LF) - - ANSI - ANSI + + ANSI + ANSI - - UTF-8 - UTF-8 + + UTF-8 + UTF-8 - - UTF-8 BOM - UTF-8 BOM + + UTF-8 BOM + UTF-8 BOM - - UTF-16LE BOM - UTF-16LE BOM + + UTF-16LE BOM + UTF-16LE BOM - - UTF-16BE BOM - UTF-16BE BOM + + UTF-16BE BOM + UTF-16BE BOM - - OVR - This is a short abbreviation to indicate characters will be replaced when typing - OVR + + OVR + This is a short abbreviation to indicate characters will be replaced when typing + OVR - - INS - This is a short abbreviation to indicate characters will be inserted when typing - INS + + INS + This is a short abbreviation to indicate characters will be inserted when typing + INS - - + + EditorInspectorDock - - Editor Inspector - Инспектор редактора + + Editor Inspector + Инспектор редактора - - Position Information - Информация о положении + + Position Information + Информация о положении - - Current Position - Текущее положение + + Current Position + Текущее положение - - Current Position (x, y) - Текущее положение (x, y) + + Current Position (x, y) + Текущее положение (x, y) - - Column - Столбец + + Column + Столбец - - Current Style - Текущий стиль + + Current Style + Текущий стиль - - Current Line - Текущая строка + + Current Line + Текущая строка - - Line Length - Длина строки + + Line Length + Длина строки - - Line End Position - Положение конца строки + + Line End Position + Положение конца строки - - Line Indentation - Отступ строки + + Line Indentation + Отступ строки - - Line Indent Position - Положение отступа строки + + Line Indent Position + Положение отступа строки - - Selection Information - Информация о выделении + + Selection Information + Информация о выделении - - Mode - Режим + + Mode + Режим - - Is Rectangle - Прямоугольник + + Is Rectangle + Прямоугольник - - Selection Empty - Выделение пусто + + Selection Empty + Выделение пусто - - Main Selection - Основное выделение + + Main Selection + Основное выделение - - # of Selections - # выделений + + # of Selections + # выделений - - Multiple Selections - Множественные выделения + + Multiple Selections + Множественные выделения - - Document Information - Информация о документе + + Document Information + Информация о документе - - Length - Длина + + Length + Длина - - Line Count - Количество строк + + Line Count + Количество строк - - View Information - Сведения об области просмотра + + View Information + Сведения об области просмотра - - Lines on Screen - Строк на экране + + Lines on Screen + Строк на экране - - First Visible Line - Первая видимая строка + + First Visible Line + Первая видимая строка - - X Offset - Смещение по X + + X Offset + Смещение по X - - Fold Information - Информация о сворачивании + + Fold Information + Информация о сворачивании - - Visible From Doc Line - Отображаемая от строки документа + + Visible From Doc Line + Отображаемая от строки документа - - Doc Line From Visible - Строка документа от отображаемой + + Doc Line From Visible + Строка документа от отображаемой - - Fold Level - Уровень вложенности + + Fold Level + Уровень вложенности - - Is Fold Header - Заголовок вложения + + Is Fold Header + Заголовок вложения - - Fold Parent - Родитель вложения + + Fold Parent + Родитель вложения - - Last Child - Последний дочерний + + Last Child + Последний дочерний - - Contracted Fold Next - Следующее свернутое вложение + + Contracted Fold Next + Следующее свернутое вложение - - Caret - Каретка + + Caret + Каретка - - Anchor - Якорь + + Anchor + Якорь - - Caret Virtual Space - Виртуальное пространство каретки + + Caret Virtual Space + Виртуальное пространство каретки - - Anchor Virtual Space - Виртуальное пространство якоря + + Anchor Virtual Space + Виртуальное пространство якоря - - + + FileList - - File List - Список файлов + + File List + Список файлов - - ... - ... + + ... + ... - - Sort by File Name - Sort by File Name + + Sort by File Name + Sort by File Name - - + + FindReplaceDialog - - - - Find - Поиск + + + + Find + Поиск - - Search Mode - Режим поиска + + Search Mode + Режим поиска - - &Normal - &Нормальный + + &Normal + &Нормальный - - E&xtended (\n, \r, \t, \0, \x...) - Р&асширенный (\n, \r, \t, \0, \x...) + + E&xtended (\n, \r, \t, \0, \x...) + Р&асширенный (\n, \r, \t, \0, \x...) - - Re&gular expression - &Регулярное выражение + + Re&gular expression + &Регулярное выражение - - &. matches newline - &. - новая строка + + &. matches newline + &. - новая строка - - Transparenc&y - Про&зрачность + + Transparenc&y + Про&зрачность - - On losing focus - При потере фокуса + + On losing focus + При потере фокуса - - Always - Всегда + + Always + Всегда - - Coun&t - &Подсчитать + + Coun&t + &Подсчитать - - &Replace - &Заменить + + &Replace + &Заменить - - Replace &All - Заменить &все + + Replace &All + Заменить &все - - Replace All in &Opened Documents - Заменить все во всех о&ткрытых документах + + Replace All in &Opened Documents + Заменить все во всех о&ткрытых документах - - Find All in All &Opened Documents - Найти все во всех откр&ытых документах + + Find All in All &Opened Documents + Найти все во всех откр&ытых документах - - Find All in Current Document - Найти все в текущем документе + + Find All in Current Document + Найти все в текущем документе - - Close - Закрыть + + Close + Закрыть - - &Find: - &Найти: + + &Find: + &Найти: - - Replace: - Заменить: + + Replace: + Заменить: - - Backward direction - Обратное направление поиска + + Backward direction + Обратное направление поиска - - Match &whole word only - Только целые &слова + + Match &whole word only + Только целые &слова - - Match &case - Учитывать &регистр + + Match &case + Учитывать &регистр - - Wra&p Around - За&циклить поиск + + Wra&p Around + За&циклить поиск - - Replace - Замена + + Replace + Замена - - - Replaced %Ln matches - - Заменено %Ln соответствие - Заменено %Ln соответствия - Заменено %Ln соответствий - Replaced %Ln matches - + + + Replaced %Ln matches + + Заменено %Ln соответствие + Заменено %Ln соответствия + Заменено %Ln соответствий + - - The end of the document has been reached. Found 1st occurrence from the top. - Достигнут конец документа. Обнаружено первое соответствие сверху. + + The end of the document has been reached. Found 1st occurrence from the top. + Достигнут конец документа. Обнаружено первое соответствие сверху. - - No matches found. - Не найдено соответствий. + + No matches found. + Не найдено соответствий. - - 1 occurrence was replaced - 1 совпадение заменено + + 1 occurrence was replaced + 1 совпадение заменено - - No more occurrences were found - Больше совпадений не обнаружено + + No more occurrences were found + Больше совпадений не обнаружено - - Found %Ln matches - - Найдено %Ln соответствие - Найдено %Ln соответствия - Найдено %Ln соответствий - Found %Ln matches - - - - + + Found %Ln matches + + Найдено %Ln соответствие + Найдено %Ln соответствия + Найдено %Ln соответствий + + + + FolderAsWorkspaceDock - - Folder as Workspace - Папка как Проект + + Folder as Workspace + Папка как Проект - - + + HexViewerDock - - Hex Viewer - Просмотр Hex + Hex Viewer + Просмотр Hex - - + + LanguageInspectorDock - - Language Inspector - Инспектор языка + + Language Inspector + Инспектор языка - - Language: - Язык: + + Language: + Язык: - - Lexer: - Лексер: + + Lexer: + Лексер: - - Properties: - Свойства: + + Properties: + Свойства: - - Property - Свойство + + Property + Свойство - - Type - Тип + + Type + Тип - - - Description - Описание + + + Description + Описание - - Value - Значение + + Value + Значение - - Keywords: - Ключевые слова: + + Keywords: + Ключевые слова: - - ID - ID + + ID + ID - - Styles: - Стили: + + Styles: + Стили: - - TextLabel - TextLabel + + TextLabel + TextLabel - - Position %1 Style %2 - Положение %1 Стиль %2 + + Position %1 Style %2 + Положение %1 Стиль %2 - - + + LuaConsoleDock - - Lua Console - Консоль Lua + + Lua Console + Консоль Lua - - + + MacroEditorDialog - - Macro Editor - Редактор макросов + + Macro Editor + Редактор макросов - - Name - Имя + + Name + Имя - - Shortcut - Комбинация клавиш + + Shortcut + Комбинация клавиш - - Steps: - Шаги: + + Steps: + Шаги: - - Insert Macro Step - Вставить шаг макроса + + Insert Macro Step + Вставить шаг макроса - - Delete Selected Macro Step - Удалить выбранный шаг макроса + + Delete Selected Macro Step + Удалить выбранный шаг макроса - - Move Selected Macro Step Up - Переместить выбранный шаг макроса вверх + + Move Selected Macro Step Up + Переместить выбранный шаг макроса вверх - - Move Selected Macro Step Down - Переместить выбранный шаг макроса вниз + + Move Selected Macro Step Down + Переместить выбранный шаг макроса вниз - - Copy Selected Macro - Копировать выбранный макрос + + Copy Selected Macro + Копировать выбранный макрос - - Delete Selected Macro - Удалить выбранный макрос + + Delete Selected Macro + Удалить выбранный макрос - - Delete Macro - Удалить макрос + + Delete Macro + Удалить макрос - - Are you sure you want to delete <b>%1</b>? - Вы действительно хотите удалить <b>%1</b>? + + Are you sure you want to delete <b>%1</b>? + Вы действительно хотите удалить <b>%1</b>? - - (Copy) - (копия) + + (Copy) + (копия) - - + + MacroRunDialog - - Run a Macro Multiple Times - Многократный запуск + + Run a Macro Multiple Times + Многократный запуск - - Macro: - Макрос: + + Macro: + Макрос: - - Run Until End of File - Выполнять до конца файла + + Run Until End of File + Выполнять до конца файла - - Execute... - Выполнить... + + Execute... + Выполнить... - - times - раз(а) + + times + раз(а) - - Run - Запускать + + Run + Запускать - - Cancel - Отмена + + Cancel + Отмена - - + + MacroSaveDialog - - Save Macro - Сохранение макроса + + Save Macro + Сохранение макроса - - Name: - Имя: + + Name: + Имя: - - Shortcut: - Комбинация клавиш: + + Shortcut: + Комбинация клавиш: - - OK - ОК + + OK + ОК - - Cancel - Отмена + + Cancel + Отмена - - + + MacroStepTableModel - - Name - Имя + + Name + Имя - - Text - Текст + + Text + Текст - - + + MainWindow - - Notepad Next[*] - Notepad Next[*] + + Notepad Next[*] + Notepad Next[*] + + + + + + + + + + + &File + &Файл + + + + Close More + Закрытие вкладок + + + + &Recent Files + &Последние файлы + + + + + Export As + Экспортировать как - - + - + + + &Edit + &Правка - - &File - &Файл + + Copy More + Копировать в буфер - - Close More - Закрытие вкладок + + Indent + Отступ - - &Recent Files - &Последние файлы + + EOL Conversion + Конвертация конца строк - - - Export As - Экспортировать как + + Convert Case + Конвертация регистра - - &Edit - &Правка + + Line Operations + Операции со строками - - Copy More - Копировать в буфер + + Comment/Uncomment + Комментирование - - Indent - Отступ + + Copy As + Копировать как - - EOL Conversion - Конвертация конца строк + + Encoding/Decoding + Кодирование/декодирование - - Convert Case - Конвертация регистра + + Search + Поиск - - Line Operations - Операции со строками + + Bookmarks + Закладки - - Comment/Uncomment - Комментирование + + Mark All Occurrences + Mark All Occurrences - - Copy As - Копировать как + + Clear Marks + Clear Marks - - Encoding/Decoding - Кодирование/декодирование + + &View + &Вид - - Search - Поиск + + &Zoom + &Масштаб - - Bookmarks - Закладки + + Show Symbol + Показать символ - - Mark All Occurrences - Mark All Occurrences + + Fold Level + Уровень вложенности - - Clear Marks - Clear Marks + + Unfold Level + Unfold Level - - &View - &Вид + + Language + Язык - - &Zoom - &Масштаб + + Settings + Опции - - Show Symbol - Показать символ + + Macro + Макросы - - Fold Level - Уровень вложенности + + Help + Справка - - Unfold Level - Unfold Level + + Encoding + Кодировка - - Language - Язык + + Main Tool Bar + Основная панель инструментов - - Settings - Опции + + &New + &Новый - - Macro - Макросы + + Create a new file + Создать новый файл - - Help - Справка + + Ctrl+N + Ctrl+N - - Encoding - Кодировка + + &Open... + &Открыть... - - Main Tool Bar - Основная панель инструментов + + Ctrl+O + Ctrl+O - - &New - &Новый + + &Save + &Сохранить - - Create a new file - Создать новый файл + + Save + Сохранить - - Ctrl+N - Ctrl+N + + Ctrl+S + Ctrl+S - - &Open... - &Открыть... + + E&xit + &Выход - - Ctrl+O - Ctrl+O + + &Undo + &Отмена - - &Save - &Сохранить + + Ctrl+Z + Ctrl+Z - - Save - Сохранить + + &Redo + &Повтор - - Ctrl+S - Ctrl+S + + Ctrl+Y + Ctrl+Y - - E&xit - &Выход + + Cu&t + В&ырезать - - &Undo - &Отмена + + Ctrl+X + Ctrl+X - - Ctrl+Z - Ctrl+Z + + &Copy + &Копировать - - &Redo - &Повтор + + Ctrl+C + Ctrl+C - - Ctrl+Y - Ctrl+Y + + &Paste + В&ставить - - Cu&t - В&ырезать + + Ctrl+V + Ctrl+V - - Ctrl+X - Ctrl+X + + &Delete + &Удалить - - &Copy - &Копировать + + Del + Del - - Ctrl+C - Ctrl+C + + Copy Full Path + Копировать полный путь - - &Paste - В&ставить + + Copy File Name + Копировать имя файла - - Ctrl+V - Ctrl+V + + Copy File Directory + Копировать путь к файлу - - &Delete - &Удалить + + &Close + &Закрыть - - Del - Del + + Close the current file + Закрыть текущий файл - - Copy Full Path - Копировать полный путь + + Ctrl+W + Ctrl+W - - Copy File Name - Копировать имя файла + + Save &As... + Сох&ранить как... - - Copy File Directory - Копировать путь к файлу + + Ctrl+Alt+S + Ctrl+Alt+S - - &Close - &Закрыть + + Save a Copy As... + Сохранить копию как... - - Close the current file - Закрыть текущий файл + + Sav&e All + Сохра&нить все - - Ctrl+W - Ctrl+W + + Ctrl+Shift+S + Ctrl+Shift+S - - Save &As... - Сох&ранить как... + + Select A&ll + Выделить &все - - Ctrl+Alt+S - Ctrl+Alt+S + + Ctrl+A + Ctrl+A - - Save a Copy As... - Сохранить копию как... + + Increase Indent + Увеличить отступ - - Sav&e All - Сохра&нить все + + Decrease Indent + Уменьшить отступ - - Ctrl+Shift+S - Ctrl+Shift+S + + Rename... + Переименовать... - - Select A&ll - Выделить &все + + Re&load + &Перезагрузить - - Ctrl+A - Ctrl+A + + Windows (CR LF) + Windows (CR LF) - - Increase Indent - Увеличить отступ + + Unix (LF) + Unix (LF) - - Decrease Indent - Уменьшить отступ + + Macintosh (CR) + Macintosh (CR) - - Rename... - Переименовать... + + UPPER CASE + ВЕРХНИЙ РЕГИСТР - - Re&load - &Перезагрузить + + Convert text to upper case + Конвертировать текст в верхний регистр - - Windows (CR LF) - Windows (CR LF) + + lower case + нижний регистр - - Unix (LF) - Unix (LF) + + Convert text to lower case + Конвертировать текст в нижний регистр - - Macintosh (CR) - Macintosh (CR) + + Duplicate Current Line + Дублировать текущую строку - - UPPER CASE - ВЕРХНИЙ РЕГИСТР + + Alt+Down + Alt+Down - - Convert text to upper case - Конвертировать текст в верхний регистр + + Split Lines + Разбить строки - - lower case - нижний регистр + + Join Lines + Объединить строки - - Convert text to lower case - Конвертировать текст в нижний регистр + + Ctrl+J + Ctrl+J - - Duplicate Current Line - Дублировать текущую строку + + Move Selected Lines Up + Переместить выбранные строки вверх - - Alt+Down - Alt+Down + + Ctrl+Shift+Up + Ctrl+Shift+Up - - Split Lines - Разбить строки + + Move Selected Lines Down + Переместить выбранные строки вниз - - Join Lines - Объединить строки + + Ctrl+Shift+Down + Ctrl+Shift+Down - - Ctrl+J - Ctrl+J + + Clos&e All + Зак&рыть все - - Move Selected Lines Up - Переместить выбранные строки вверх + + Close All files + Закрыть все файлы - - Ctrl+Shift+Up - Ctrl+Shift+Up + + Ctrl+Shift+W + Ctrl+Shift+W - - Move Selected Lines Down - Переместить выбранные строки вниз + + Close All Except Active Document + Закрыть все кроме текущей - - Ctrl+Shift+Down - Ctrl+Shift+Down + + Close All to the Left + Закрыть все вкладки слева - - Clos&e All - Зак&рыть все + + Close All to the Right + Закрыть все вкладки справа - - Close All files - Закрыть все файлы + + Zoom &In + У&величить масштаб - - Ctrl+Shift+W - Ctrl+Shift+W + + Ctrl++ + Ctrl++ - - Close All Except Active Document - Закрыть все кроме текущей + + Zoom &Out + &Уменьшить масштаб - - Close All to the Left - Закрыть все вкладки слева + + Ctrl+- + Ctrl+- - - Close All to the Right - Закрыть все вкладки справа + + Reset Zoom + Сбросить масштаб - - Zoom &In - У&величить масштаб + + Ctrl+0 + Ctrl+0 - - Ctrl++ - Ctrl++ + + About Qt + О Qt - - Zoom &Out - &Уменьшить масштаб + + About Notepad Next + О Notepad Next - - Ctrl+- - Ctrl+- + + Show Whitespace + Показывать пустое пространство - - Reset Zoom - Сбросить масштаб + + Show End of Line + Показывать символ конца строки - - Ctrl+0 - Ctrl+0 + + Show All Characters + Показывать все символы - - About Qt - О Qt + + Show Indent Guide + Показывать направляющие отступов - - About Notepad Next - О Notepad Next + + Show Wrap Symbol + Отображать знак Перенос строк - - Show Whitespace - Показывать пустое пространство + + Word Wrap + Перенос строк - - Show End of Line - Показывать символ конца строки + + Restore Recently Closed File + Открыть последний закрытый файл - - Show All Characters - Показывать все символы + + Ctrl+Shift+T + Ctrl+Shift+T - - Show Indent Guide - Показывать направляющие отступов + + Open All Recent Files + Открыть все недавние файлы - - Show Wrap Symbol - Отображать знак Перенос строк + + Clear Recent Files List + Очистить список недавних файлов - - Word Wrap - Перенос строк + + &Find... + &Найти... - - Restore Recently Closed File - Открыть последний закрытый файл + + Ctrl+F + Ctrl+F - - Ctrl+Shift+T - Ctrl+Shift+T + + Find in Files... + Найти в файлах... - - Open All Recent Files - Открыть все недавние файлы + + Find &Next + Искать &далее - - Clear Recent Files List - Очистить список недавних файлов + + F3 + F3 - - &Find... - &Найти... + + Find &Previous + Искать &ранее - - Ctrl+F - Ctrl+F + + Shift+F3 + - - Find in Files... - Найти в файлах... + + &Replace... + &Заменить... - - Find &Next - Искать &далее + + Ctrl+H + Ctrl+H - - F3 - F3 + + Full Screen + Полный экран - - Find &Previous - Искать &ранее + + F11 + F11 - - &Replace... - &Заменить... + + + Start Recording + Начать запись - - Ctrl+H - Ctrl+H + + Playback + Воспроизвести - - Full Screen - Полный экран + + Ctrl+Shift+P + Ctrl+Shift+ - - F11 - F11 + + Save Current Recorded Macro... + Сохранить записанный макрос... - - - Start Recording - Начать запись + + Run a Macro Multiple Times... + Многократный запуск... - - Playback - Воспроизвести + + Preferences... + Настройки... - - Ctrl+Shift+P - Ctrl+Shift+ + + Quick Find + Быстрый поиск - - Save Current Recorded Macro... - Сохранить записанный макрос... + + Ctrl+Alt+I + Ctrl+Alt+I - - Run a Macro Multiple Times... - Многократный запуск... + + Select Next Instance + Выделить следующий экземпляр - - Preferences... - Настройки... + + Ctrl+D + Ctrl+D - - Quick Find - Быстрый поиск + + Move to Trash... + Убрать в корзину... - - Ctrl+Alt+I - Ctrl+Alt+I + + Move to Trash + Убрать в корзину - - Select Next Instance - Выделить следующий экземпляр + + Check for Updates... + Проверить обновления... - - Ctrl+D - Ctrl+D + + &Go to Line... + &Перейти к строке... - - Move to Trash... - Убрать в корзину... + + Ctrl+G + Ctrl+G - - Move to Trash - Убрать в корзину + + Print... + Печать... - - Check for Updates... - Проверить обновления... + + Ctrl+P + Ctrl+P - - &Go to Line... - &Перейти к строке... + + Open Folder as Workspace... + Открыть папку как Проект... - - Ctrl+G - Ctrl+G + + Toggle Single Line Comment + Комментирование строки (включить/выключить) - - Print... - Печать... + + Ctrl+/ + Ctrl+/ - - Ctrl+P - Ctrl+P + + Single Line Comment + Комментировать строку - - Open Folder as Workspace... - Открыть папку как Проект... + + Ctrl+K + Ctrl+K - - Toggle Single Line Comment - Комментирование строки (включить/выключить) + + Single Line Uncomment + Раскомментировать строку - - Ctrl+/ - Ctrl+/ + + Ctrl+Shift+K + Ctrl+Shift+K - - Single Line Comment - Комментировать строку + + Edit Macros... + Редактирование макросов... - - Ctrl+K - Ctrl+K + + This is not currently implemented + Это еще не реализовано - - Single Line Uncomment - Раскомментировать строку + + Column Mode... + Режим столбцов... - - Ctrl+Shift+K - Ctrl+Shift+K + + Export as HTML... + Экспортировать как HTML... - - Edit Macros... - Редактирование макросов... + + Export as RTF... + Экспортировать как RTF... - - This is not currently implemented - Это еще не реализовано + + Copy as HTML + Копировать как HTML - - Column Mode... - Режим столбцов... + + Copy as RTF + Копировать как RTF - - Export as HTML... - Экспортировать как HTML... + + Base 64 Encode + Кодирование Base 64 - - Export as RTF... - Экспортировать как RTF... + + URL Encode + Кодирование URL - - Copy as HTML - Копировать как HTML + + Base 64 Decode + Декодирование Base 64 - - Copy as RTF - Копировать как RTF + + URL Decode + Декодирование URL - - Base 64 Encode - Кодирование Base 64 + + Copy URL + Копировать URL - - URL Encode - Кодирование URL + + Remove Empty Lines + Удалить пустые строки - - Base 64 Decode - Декодирование Base 64 + + + Show in Explorer + Открыть в Проводнике - - URL Decode - Декодирование URL + + Open %1 Here + Open %1 Here - - Copy URL - Копировать URL + + Toggle Bookmark + Закладка (поставить/снять) - - Remove Empty Lines - Удалить пустые строки + + Ctrl+F2 + Ctrl+F2 - - - Show in Explorer - Открыть в Проводнике + + Next Bookmark + Следующая закладка - - Open %1 Here - Open %1 Here + + F2 + F2 - - Toggle Bookmark - Закладка (поставить/снять) + + Previous Bookmark + Предыдущая закладка - - Ctrl+F2 - Ctrl+F2 + + Shift+F2 + Shift+F2 - - Next Bookmark - Следующая закладка + + Clear Bookmarks + Очистить закладки - - F2 - F2 + + Invert Bookmarks + Инвертировать закладки - - Previous Bookmark - Предыдущая закладка + + Next Tab + Следующая вкладка - - Shift+F2 - Shift+F2 + + Ctrl+Tab + Ctrl+Tab - - Clear Bookmarks - Очистить закладки + + Previous Tab + Предыдущая вкладка - - Invert Bookmarks - Инвертировать закладки + + Ctrl+Shift+Tab + Ctrl+Shift+Tab - - Next Tab - Next Tab + + Fold Level 1 + Свернуть первый уровень - - Ctrl+Tab - Ctrl+Tab + + Alt+1 + Alt+1 - - Previous Tab - Previous Tab + + Fold Level 2 + Свернуть второй уровень - - Ctrl+Shift+Tab - Ctrl+Shift+Tab + + Alt+2 + Alt+2 - - Fold Level 1 - Fold Level 1 + + Fold Level 3 + Свернуть третий уровень - - Alt+1 - Alt+1 + + Alt+3 + Alt+3 - - Fold Level 2 - Fold Level 2 + + Fold Level 4 + Свернуть четвёртый уровень - - Alt+2 - Alt+2 + + Alt+4 + Alt+4 - - Fold Level 3 - Fold Level 3 + + Unfold Level 1 + Развернуть первый уровень - - Alt+3 - Alt+3 + + Alt+Shift+1 + Alt+Shift+1 - - Fold Level 4 - Fold Level 4 + + Unfold Level 2 + Развернуть второй уровень - - Alt+4 - Alt+4 + + Alt+Shift+2 + Alt+Shift+2 - - Unfold Level 1 - Unfold Level 1 + + Unfold Level 3 + Развернуть третий уровень - - Alt+Shift+1 - Alt+Shift+1 + + Alt+Shift+3 + Alt+Shift+3 - - Unfold Level 2 - Unfold Level 2 + + Unfold Level 4 + Развернуть четвёртый уровень - - Alt+Shift+2 - Alt+Shift+2 + + Alt+Shift+4 + Alt+Shift+4 - - Unfold Level 3 - Unfold Level 3 + + Fold All + Свернуть все - - Alt+Shift+3 - Alt+Shift+3 + + Alt+0 + Alt+0 - - Unfold Level 4 - Unfold Level 4 + + Unfold All + Развернуть все - - Alt+Shift+4 - Alt+Shift+4 + + Alt+Shift+0 + Alt+Shift+0 - - Fold All - Fold All + + Fold Level 5 + Свернуть пятый уровень - - Alt+0 - Alt+0 + + Alt+5 + Alt+5 - - Unfold All - Unfold All + + Fold Level 6 + Свернуть шестой уровень - - Alt+Shift+0 - Alt+Shift+0 + + Alt+6 + Alt+6 - - Fold Level 5 - Fold Level 5 + + Fold Level 7 + Свернуть седьмой уровень - - Alt+5 - Alt+5 + + Alt+7 + Alt+7 - - Fold Level 6 - Fold Level 6 + + Fold Level 8 + Свернуть восьмой уровень - - Alt+6 - Alt+6 + + Alt+8 + Alt+8 - - Fold Level 7 - Fold Level 7 + + Fold Level 9 + Свернуть девятый уровень - - Alt+7 - Alt+7 + + Alt+9 + Alt+9 - - Fold Level 8 - Fold Level 8 + + Unfold Level 5 + Развернуть пятый уровень - - Alt+8 - Alt+8 + + Alt+Shift+5 + Alt+Shift+5 - - Fold Level 9 - Fold Level 9 + + Unfold Level 6 + Развернуть шестой уровень - - Alt+9 - Alt+9 + + Alt+Shift+6 + Alt+Shift+6 - - Unfold Level 5 - Unfold Level 5 + + Unfold Level 7 + Развернуть седьмой уровень - - Alt+Shift+5 - Alt+Shift+5 + + Alt+Shift+7 + Alt+Shift+7 - - Unfold Level 6 - Unfold Level 6 + + Unfold Level 8 + Развернуть восьмой уровень - - Alt+Shift+6 - Alt+Shift+6 + + Alt+Shift+8 + Alt+Shift+8 - - Unfold Level 7 - Unfold Level 7 + + Unfold Level 9 + Развернуть девятый уровень - - Alt+Shift+7 - Alt+Shift+7 + + Alt+Shift+9 + Alt+Shift+9 - - Unfold Level 8 - Unfold Level 8 + + + Toggle Overtype + Toggle Overtype - - Alt+Shift+8 - Alt+Shift+8 + + Ins + Ins - - Unfold Level 9 - Unfold Level 9 + + Debug Info... + Debug Info... - - Alt+Shift+9 - Alt+Shift+9 + + Cut Bookmarked Lines + Cut Bookmarked Lines - - - Toggle Overtype - Toggle Overtype + + Copy Bookmarked Lines + Copy Bookmarked Lines - - Ins - Ins + + Delete Bookmarked Lines + Delete Bookmarked Lines - - Debug Info... - Debug Info... + + Mark Style 1 + Mark Style 1 - - Cut Bookmarked Lines - Cut Bookmarked Lines + + Mark Style 2 + Mark Style 2 - - Copy Bookmarked Lines - Copy Bookmarked Lines + + Clear Style 1 + Clear Style 1 - - Delete Bookmarked Lines - Delete Bookmarked Lines + + Clear Style 2 + Clear Style 2 - - Mark Style 1 - Mark Style 1 + + Mark Style 3 + Mark Style 3 - - Mark Style 2 - Mark Style 2 + + Clear Style 3 + Clear Style 3 - - Clear Style 1 - Clear Style 1 + + + Clear All Styles + Clear All Styles - - Clear Style 2 - Clear Style 2 + + Remove Duplicate Lines + Remove Duplicate Lines - - Mark Style 3 - Mark Style 3 + + Remove Consecutive Duplicate Lines + Remove Consecutive Duplicate Lines - - Clear Style 3 - Clear Style 3 + + Sort Lines Ascending + - - - Clear All Styles - Clear All Styles + + Sort Lines Descending + - - Remove Duplicate Lines - Remove Duplicate Lines + + Sort Lines Ascending (Case-Insensitive) + - - Remove Consecutive Duplicate Lines - Remove Consecutive Duplicate Lines + + Sort Lines Descending (Case-Insensitive) + - - Go to line - Перейти к строке + + Sort Lines by Length Ascending + - - Line Number (1 - %1) - Номер строки (1 - %1) + + Sort Lines by Length Descending + - - Stop Recording - Остановить запись + + Reverse Line Order + - - Debug Info - Debug Info + + Go to line + Перейти к строке - - New %1 - Новый %1 + + Line Number (1 - %1) + Номер строки (1 - %1) - - Create File - Создать файл + + Stop Recording + Остановить запись - - <b>%1</b> does not exist. Do you want to create it? - <b>%1</b> не существует. Хотите создать его? + + Debug Info + Debug Info - - - Save file <b>%1</b>? - Сохранить файл <b>%1</b>? + + New %1 + Новый %1 - - - Save File - Сохранить файл + + Create File + Создать файл - - Open Folder as Workspace - Открыть папку как Проект + + <b>%1</b> does not exist. Do you want to create it? + <b>%1</b> не существует. Хотите создать его? - - - Reload File - Перезагрузить файл + + + Save file <b>%1</b>? + Сохранить файл <b>%1</b>? - - Are you sure you want to reload <b>%1</b>? Any unsaved changes will be lost. - Уверены, что хотите перезагрузить <b>%1</b>? Все несохраненные изменения будут потеряны. + + + Save File + Сохранить файл - - Save a Copy As - Сохранить копию как + + Open Folder as Workspace + Открыть папку как Проект - - - Rename - Переименовать + + + Reload File + Перезагрузить файл - - Name: - Имя: + + Are you sure you want to reload <b>%1</b>? Any unsaved changes will be lost. + Уверены, что хотите перезагрузить <b>%1</b>? Все несохраненные изменения будут потеряны. - - Delete File - Удалить файл + + Save a Copy As + Сохранить копию как - - Are you sure you want to move <b>%1</b> to the trash? - Вы действительно хотите переместить <b>%1</b> в корзину? + + + Rename + Переименовать - - Error Deleting File - Ошибка при удалении файла + + Name: + Имя: - - Something went wrong deleting <b>%1</b>? - Что-то пошло не так при удалении <b>%1</b>? + + Delete File + Удалить файл - - Administrator - Администратор + + Are you sure you want to move <b>%1</b> to the trash? + Вы действительно хотите переместить <b>%1</b> в корзину? - - <b>%1</b> has been modified by another program. Do you want to reload it? - <b>%1</b> has been modified by another program. Do you want to reload it? + + Error Deleting File + Ошибка при удалении файла - - Read error - Read error + + Something went wrong deleting <b>%1</b>? + Что-то пошло не так при удалении <b>%1</b>? - - Write error - Write error + + Administrator + Администратор - - Fatal error - Fatal error + + <b>%1</b> has been modified by another program. Do you want to reload it? + <b>%1</b> has been modified by another program. Do you want to reload it? - - Resource error - Resource error + + Read error + Read error - - Open error - Open error + + Write error + Write error - - Abort error - Abort error + + Fatal error + Fatal error - - Timeout error - Timeout error + + Resource error + Resource error - - Unspecified error - Unspecified error + + Open error + Open error - - Remove error - Remove error + + Abort error + Abort error - - Rename error - Rename error + + Timeout error + Timeout error - - Position error - Position error + + Unspecified error + Unspecified error - - Resize error - Resize error + + Remove error + Remove error - - Permissions error - Permissions error + + Rename error + Rename error - - Copy error - Copy error + + Position error + Position error - - Unknown error (%1) - Unknown error (%1) + + Resize error + Resize error - - Error Saving File - Ошибка при сохранении файла + + Permissions error + Permissions error - - An error occurred when saving <b>%1</b><br><br>Error: %2 - Произошла ошибка при сохранении <b>%1</b><br><br>Ошибка: %2 + + Copy error + Copy error - - Zoom: %1% - Масштаб: %1% + + Unknown error (%1) + Unknown error (%1) - - No updates are available at this time. - В настоящее время обновлений нет. + + Error Saving File + Ошибка при сохранении файла - - + + + An error occurred when saving <b>%1</b><br><br>Error: %2 + Произошла ошибка при сохранении <b>%1</b><br><br>Ошибка: %2 + + + + Zoom: %1% + Масштаб: %1% + + + + No updates are available at this time. + В настоящее время обновлений нет. + + + PreferencesDialog - - Preferences - Настройки + + Preferences + Настройки + + + + Unsaved сhanges + Несохраненные изменения + + + Default title + Название по-умолчанию + + + Unsaved Changes + Несохраненные изменения + + + + You have unsaved changes. +Do you want to save them before closing? + Сохранить внесенные правки? + + + Show menu bar + Показать строку меню + + + Show toolbar + Показать панель инструментов + + + Show status bar + Показать строку состояния + + + Restore previous session + Восстанавливать предыдущую сессию + + + Unsaved changes + Несохраненные изменения + + + Temporary files + Временные файлы + + + Recenter find/replace dialog when opened + Recenter find/replace dialog when opened + + + Combine search results + Комбинировать результаты поиска + + + Translation: + Перевод: + + + Exit on last tab closed + Exit on last tab closed + + + Default Font + Default Font + + + Font + Font + + + Font Size + Font Size + + + pt + pt + + + Default Line Endings + Default Line Endings + + + Highlight URLs + Highlight URLs + + + Show Line Numbers + Show Line Numbers + + + Default Directory + Default Directory + + + Follow Current Document + Follow Current Document + + + Last Used Directory + Last Used Directory + + + ... + ... + + + TextLabel + TextLabel + + + An application restart is required to apply certain settings. + Для применения определенных настроек требуется перезапуск приложения. + + + Warning + Предупреждение + + + This feature is experimental and it should not be considered safe for critically important work. It may lead to possible data loss. Use at your own risk. + Эта функция является экспериментальной, и ее не следует считать безопасной для критически важной работы. Это может привести к возможной потере данных. Используйте на свой риск. + + + System Default + System Default + + + Windows (CR LF) + Windows (CR LF) + + + Linux (LF) + Linux (LF) - - Show menu bar - Показать строку меню + Macintosh (CR) + Macintosh (CR) - - Show toolbar - Показать панель инструментов + <System Default> + <Использовать системный> + + + QObject - - Show status bar - Показать строку состояния + + List All Tabs + Показать перечень вкладок - - Restore previous session - Восстанавливать предыдущую сессию + + Detach Group + Отделить группу - - Unsaved changes - Несохраненные изменения + + Minimize + Свернуть - - Temporary files - Временные файлы + + Close Tab + Закрыть вкладку - - Recenter find/replace dialog when opened - Recenter find/replace dialog when opened + + Default directory + Каталог по-умолчанию - - Combine search results - Комбинировать результаты поиска + + Current document directory + Каталог активного документа - - Translation: - Перевод: + + Last used directory + Последний использованный каталог - - Exit on last tab closed - Exit on last tab closed + + Selected directory: + Выбранный каталог: - - Default Font - Default Font + + Selected directory path here... + Путь к выбранному каталогу... - - Font - Font + + Open directory select dialog + Открыть окно выбора каталога - - Font Size - Font Size + + Not exists + Не существует - - pt - pt + + Not a directory + Не каталог - - Default Line Endings - Default Line Endings + + No write access + Нет прав на запись - - Highlight URLs - Highlight URLs + + Please, use absolute path + Пожалуйста, используйте полный путь - - Show Line Numbers - Show Line Numbers + + Select default directory + Выбор каталога по-умолчанию - - - Default Directory - Default Directory + + Restore previous session + Восстанавливать предыдущую сессию - - Follow Current Document - Follow Current Document + + Unsaved changes + Несохраненные изменения - - Last Used Directory - Last Used Directory + + Temporary files + Временные файлы - - ... - ... + + Like in system + Как в системе - - TextLabel - TextLabel + + System default + Окончания строк + Системные - - An application restart is required to apply certain settings. - Для применения определенных настроек требуется перезапуск приложения. + <System> + <Системный> - - Warning - Предупреждение + <System default> + <Системные> - - This feature is experimental and it should not be considered safe for critically important work. It may lead to possible data loss. Use at your own risk. - Эта функция является экспериментальной, и ее не следует считать безопасной для критически важной работы. Это может привести к возможной потере данных. Используйте на свой риск. + <System Language> + <Системный> - - System Default - System Default + + Language: + Язык: - - Windows (CR LF) - Windows (CR LF) + System Default + Окончания строк + Системные - - Linux (LF) - Linux (LF) + + Windows (CR LF) + Windows (CR LF) - - Macintosh (CR) - Macintosh (CR) + + Unix (LF) + Unix (LF) - - <System Default> - <Использовать системный> + + Macintosh (CR) + Macintosh (CR) - - + + + Default line endings: + Окончания строк по-умолчанию: + + + + Recenter find/replace dialog when opened + Центрировать окно поиска/замены при открытии + + + + Combine search results + Комбинировать результаты поиска + + + + Exit on last tab closed + Выход после закрытия последней вкладки + + + + Behavior + Поведение + + + + Application restart required to apply changes. + Требуется перезапуск приложения. + + + Window + Главное окно + + + + Main window + Главное окно + + + + Show menu bar + Показать строку меню + + + + Show toolbar + Показать панель инструментов + + + + Show status bar + Показать строку состояния + + + + Font + Шрифт + + + + Family: + Семейство: + + + + Size: + Размер: + + + + Editor + Редактор + + + + Highlight URLs + Подсвечивать ссылки + + + + Show line numbers + Показывать номера строк + + + Show Line Numbers + Показывать номера строк + + + + Appearance + Внешний вид + + + QuickFindWidget - - Frame - Фрейм + + Frame + Фрейм - - Find... - Поиск... + + Find... + Поиск... - - Match case - Учитывать регистр + + Match case + Учитывать регистр - - Aa - Aa + + Aa + Aa - - Match whole word - Искать целые слова + + Match whole word + Искать целые слова - - |A| - |A| + + |A| + |A| - - Use regular expression - Используйте регулярное выражение + + Use regular expression + Используйте регулярное выражение - - . * - . * + + . * + . * - - Alt+E - Alt+E + + Alt+E + Alt+E - - %L1/%L2 - %L1/%L2 + + %L1/%L2 + %L1/%L2 - - + + SearchResultsDock - - Search Results - Результаты поиска + + Search Results + Результаты поиска + + + + Copy Results to Clipboard + Copy Results to Clipboard + + + + Collapse All + Свернуть все + + + + Expand All + Развернуть все + + + + Delete Entry + Удалить запись + + + + Delete All + Удалить все + + + + Updater + + + Would you like to download the update now? + + + + + Would you like to download the update now?<br />This is a mandatory update, exiting now will close the application. + + + + + <strong>Change log:</strong><br/>%1 + + + + + Version %1 of %2 has been released! + + + + + No updates are available for the moment + + + + + Congratulations! You are running the latest version of %1 + + + + + Window + + + QSimpleUpdater Example + + + + + <h1><i>QSimpleUpdater</i></h1> + + + + + <i>A simpler way to update your Qt applications...</i> + + + + + Updater Options + + + + + 0.1 + + + + + Write a version string... + + + + + Set installed version (latest version is 1.0) + + + + + Do not use the QSU library to read the appcast + + + + + Notify me when an update is available + + + + + Show all notifications + + + + + Enable integrated downloader + + + + + Mandatory Update + + + + + Changelog + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'.Lucida Grande UI'; font-size:13pt;">Click &quot;Check for Updates&quot; to update this field...</span></p></body></html> + + + + + Reset Fields + + + + + Close + Закрыть + + + + Check for Updates + + + + + ads::CAutoHideTab + + + Detach + + + + + Pin To... + + + + + Top + + + + + Left + + + + + Right + + + + + Bottom + + + + + Unpin (Dock) + + + + + Close + Закрыть + + + + ads::CDockAreaTitleBar + + + Detach + + + + + Detach Group + Отделить группу + + + + + Unpin (Dock) + + + + + + Pin Group + + + + + Pin Group To... + + + + + Top + + + + + Left + + + + + Right + + + + + Bottom + + + + + + Minimize + Свернуть + + + + + + Close + Закрыть + + + + + Close Group + + + + + Close Other Groups + + + + + Pin Active Tab (Press Ctrl to Pin Group) + + + + + Close Active Tab + + + + + ads::CDockManager + + + Show View + + + + + ads::CDockWidgetTab + + + Detach + + + + + Pin + + + + + Pin To... + + + + + Top + - - Copy Results to Clipboard - Copy Results to Clipboard + + Left + - - Collapse All - Свернуть все + + Right + - - Expand All - Развернуть все + + Bottom + - - Delete Entry - Удалить запись + + Close + Закрыть - - Delete All - Удалить все + + Close Others + - + diff --git a/i18n/NotepadNext_uk.ts b/i18n/NotepadNext_uk.ts index 415fdda89..6a997a10a 100644 --- a/i18n/NotepadNext_uk.ts +++ b/i18n/NotepadNext_uk.ts @@ -1,2299 +1,3046 @@ - - + + + AuthenticateDialog + + + Dialog + + + + + Please provide the user name and password for the download location. + + + + + &User name: + + + + + &Password: + + + + ColumnEditorDialog - - Column Mode - Створення стовпця + + Column Mode + Створення стовпця - - Text - Текст + + Text + Текст - - Numbers - Числа + + Numbers + Числа - - Start: - Початок: + + Start: + Початок: - - Step: - Крок: + + Step: + Крок: - - + + DebugLogDock - - Debug Log - Журнал налагодження + + Debug Log + Журнал налагодження + + + + Downloader + + + + Updater + + + + + + + Downloading updates + + + + + Time remaining: 0 minutes + + + + + Open + + + + + + Stop + + + + + + Time remaining + + + + + unknown + + + + + Error + + + + + Cannot find downloaded update! + + + + + Close + Закрити + + + + Download complete! + + + + + The installer will open separately + + + + + Click "OK" to begin installing the update + + + + + In order to install the update, you may need to quit the application. + + + + + In order to install the update, you may need to quit the application. This is a mandatory update, exiting now will close the application. + + + + + Click the "Open" button to apply the update + + + + + Are you sure you want to cancel the download? + + + + + Are you sure you want to cancel the download? This is a mandatory update, exiting now will close the application + + + + + + %1 bytes + + + + + + %1 KB + + + + + + %1 MB + + + + + of + + + + + Downloading Updates + + + + + Time Remaining + - - + + + Unknown + + + + + about %1 hours + + + + + about one hour + + + + + %1 minutes + + + + + 1 minute + + + + + %1 seconds + + + + + 1 second + + + + EditorInfoStatusBar - - Length: %L1 Lines: %L2 - Розмір: %L1 Рядків: %L2 + + Length: %L1 Lines: %L2 + Розмір: %L1 Рядків: %L2 - - Sel: N/A - Обрано: N/A + + Sel: N/A + Обрано: N/A - - Sel: %L1 | %L2 - Обрано: %L1 | %L2 + + Sel: %L1 | %L2 + Обрано: %L1 | %L2 - - Ln: %L1 Col: %L2 - Рядок: %L1 Стовпець: %L2 + + Ln: %L1 Col: %L2 + Рядок: %L1 Стовпець: %L2 - - Macintosh (CR) - Macintosh (CR) + + Macintosh (CR) + Macintosh (CR) - - Windows (CR LF) - Windows (CR LF) + + Windows (CR LF) + Windows (CR LF) - - Unix (LF) - Unix (LF) + + Unix (LF) + Unix (LF) - - ANSI - ANSI + + ANSI + ANSI - - UTF-8 - UTF-8 + + UTF-8 + UTF-8 - - UTF-8 BOM - UTF-8 BOM + + UTF-8 BOM + UTF-8 BOM - - UTF-16LE BOM - UTF-16LE BOM + + UTF-16LE BOM + UTF-16LE BOM - - UTF-16BE BOM - UTF-16BE BOM + + UTF-16BE BOM + UTF-16BE BOM - - OVR - This is a short abbreviation to indicate characters will be replaced when typing - OVR + + OVR + This is a short abbreviation to indicate characters will be replaced when typing + OVR - - INS - This is a short abbreviation to indicate characters will be inserted when typing - INS + + INS + This is a short abbreviation to indicate characters will be inserted when typing + INS - - + + EditorInspectorDock - - Editor Inspector - Аналізатор редактору + + Editor Inspector + Аналізатор редактору - - Position Information - Інформація про позицію + + Position Information + Інформація про позицію - - Current Position - Поточна позиція + + Current Position + Поточна позиція - - Current Position (x, y) - Поточна позиція (x, y) + + Current Position (x, y) + Поточна позиція (x, y) - - Column - Стовпець + + Column + Стовпець - - Current Style - Поточний стиль + + Current Style + Поточний стиль - - Current Line - Поточний рядок + + Current Line + Поточний рядок - - Line Length - Розмір рядка + + Line Length + Розмір рядка - - Line End Position - Позиція кінця рядка + + Line End Position + Позиція кінця рядка - - Line Indentation - Відступ рядка + + Line Indentation + Відступ рядка - - Line Indent Position - Позиція відступу рядка + + Line Indent Position + Позиція відступу рядка - - Selection Information - Інформація про виділення + + Selection Information + Інформація про виділення - - Mode - Режим + + Mode + Режим - - Is Rectangle - Прямокутне виділення ? + + Is Rectangle + Прямокутне виділення ? - - Selection Empty - Пусте виділення ? + + Selection Empty + Пусте виділення ? - - Main Selection - Головне виділення + + Main Selection + Головне виділення - - # of Selections - # виділень + + # of Selections + # виділень - - Multiple Selections - Множинне виділення + + Multiple Selections + Множинне виділення - - Document Information - Інформація про документ + + Document Information + Інформація про документ - - Length - Довжина + + Length + Довжина - - Line Count - Кількісь рядків + + Line Count + Кількісь рядків - - View Information - Інформація про видиму область + + View Information + Інформація про видиму область - - Lines on Screen - Макс. кількість рядків на екрані + + Lines on Screen + Макс. кількість рядків на екрані - - First Visible Line - Перший видимий рядок + + First Visible Line + Перший видимий рядок - - X Offset - Зміщення по осі Х + + X Offset + Зміщення по осі Х - - Fold Information - Інформація про блок + + Fold Information + Інформація про блок - - Visible From Doc Line - Visible From Doc Line + + Visible From Doc Line + Visible From Doc Line - - Doc Line From Visible - Doc Line From Visible + + Doc Line From Visible + Doc Line From Visible - - Fold Level - Рівень блоку + + Fold Level + Рівень блоку - - Is Fold Header - Початок блоку ? + + Is Fold Header + Початок блоку ? - - Fold Parent - Початок блоку + + Fold Parent + Початок блоку - - Last Child - Кінець блоку + + Last Child + Кінець блоку - - Contracted Fold Next - Contracted Fold Next + + Contracted Fold Next + Contracted Fold Next - - Caret - Каретка + + Caret + Каретка - - Anchor - Якір + + Anchor + Якір - - Caret Virtual Space - Віртуальний простір каретки + + Caret Virtual Space + Віртуальний простір каретки - - Anchor Virtual Space - Віртуальний простір якору + + Anchor Virtual Space + Віртуальний простір якору - - + + FileList - - File List - Список файлів + + File List + Список файлів - - ... - ... + + ... + ... - - Sort by File Name - Сортувати за іменем файлу + + Sort by File Name + Сортувати за іменем файлу - - + + FindReplaceDialog - - - - Find - Шукати + + + + Find + Шукати - - Search Mode - Режим пошуку + + Search Mode + Режим пошуку - - &Normal - З&а замовчуванням + + &Normal + З&а замовчуванням - - E&xtended (\n, \r, \t, \0, \x...) - Р&озширений(\n, \r, \t, \0, \x...) + + E&xtended (\n, \r, \t, \0, \x...) + Р&озширений(\n, \r, \t, \0, \x...) - - Re&gular expression - Р&егулярні вирази + + Re&gular expression + Р&егулярні вирази - - &. matches newline - &. - новий рядок + + &. matches newline + &. - новий рядок - - Transparenc&y - &Прозорість вікна + + Transparenc&y + &Прозорість вікна - - On losing focus - При втраті фокусу + + On losing focus + При втраті фокусу - - Always - Завжди + + Always + Завжди - - Coun&t - &Кількість + + Coun&t + &Кількість - - &Replace - &Замінити + + &Replace + &Замінити - - Replace &All - Замінити &всі + + Replace &All + Замінити &всі - - Replace All in &Opened Documents - За&мінити всі у відкритих документах + + Replace All in &Opened Documents + За&мінити всі у відкритих документах - - Find All in All &Opened Documents - З&найти всі у всіх відкритих документах + + Find All in All &Opened Documents + З&найти всі у всіх відкритих документах - - Find All in Current Document - Знайти всі у поточному документі + + Find All in Current Document + Знайти всі у поточному документі - - Close - Закрити + + Close + Закрити - - &Find: - &Шукати: + + &Find: + &Шукати: - - Replace: - Замінити: + + Replace: + Замінити: - - Backward direction - Зворотній напрям + + Backward direction + Зворотній напрям - - Match &whole word only - Ш&укати ціле слово + + Match &whole word only + Ш&укати ціле слово - - Match &case - Враховувати рег&істр + + Match &case + Враховувати рег&істр - - Wra&p Around - &Циклічний пошук + + Wra&p Around + &Циклічний пошук - - Replace - Замінити + + Replace + Замінити - - - Replaced %Ln matches - - Замінено %Ln співпадінь - Replaced %Ln matches - Replaced %Ln matches - Replaced %Ln matches - + + + Replaced %Ln matches + + Замінено %Ln співпадінь + Replaced %Ln matches + Replaced %Ln matches + - - The end of the document has been reached. Found 1st occurrence from the top. - Досягнуто кінець документу. Знайдено 1 збіг. + + The end of the document has been reached. Found 1st occurrence from the top. + Досягнуто кінець документу. Знайдено 1 збіг. - - No matches found. - Нічого не знайдено. + + No matches found. + Нічого не знайдено. - - 1 occurrence was replaced - Був замінений 1 збіг + + 1 occurrence was replaced + Був замінений 1 збіг - - No more occurrences were found - Більше збігів не знайдено + + No more occurrences were found + Більше збігів не знайдено - - Found %Ln matches - - Знайдено %Ln співпадінь - Found %Ln matches - Found %Ln matches - Found %Ln matches - - - - + + Found %Ln matches + + Знайдено %Ln співпадінь + Found %Ln matches + Found %Ln matches + + + + FolderAsWorkspaceDock - - Folder as Workspace - Каталог як робочий простір + + Folder as Workspace + Каталог як робочий простір - - + + HexViewerDock - - Hex Viewer - HEX-переглядач + Hex Viewer + HEX-переглядач - - + + LanguageInspectorDock - - Language Inspector - Аналізатор синтаксису + + Language Inspector + Аналізатор синтаксису - - Language: - Синтаксис: + + Language: + Синтаксис: - - Lexer: - Lexer: + + Lexer: + Lexer: - - Properties: - Властивості: + + Properties: + Властивості: - - Property - Властивість + + Property + Властивість - - Type - Тип + + Type + Тип - - - Description - Опис + + + Description + Опис - - Value - Значення + + Value + Значення - - Keywords: - Ключові слова: + + Keywords: + Ключові слова: - - ID - ID + + ID + ID - - Styles: - Стилі: + + Styles: + Стилі: - - TextLabel - Текстове поле + + TextLabel + Текстове поле - - Position %1 Style %2 - Позиція: %1 Стиль: %2 + + Position %1 Style %2 + Позиція: %1 Стиль: %2 - - + + LuaConsoleDock - - Lua Console - Консоль Lua + + Lua Console + Консоль Lua - - + + MacroEditorDialog - - Macro Editor - Редактор макросів + + Macro Editor + Редактор макросів - - Name - Назва + + Name + Назва - - Shortcut - Скорочення + + Shortcut + Скорочення - - Steps: - Операції: + + Steps: + Операції: - - Insert Macro Step - Вставити операцію + + Insert Macro Step + Вставити операцію - - Delete Selected Macro Step - Видалити операцію + + Delete Selected Macro Step + Видалити операцію - - Move Selected Macro Step Up - Перемістити операцію вгору + + Move Selected Macro Step Up + Перемістити операцію вгору - - Move Selected Macro Step Down - Перемістити операцію вниз + + Move Selected Macro Step Down + Перемістити операцію вниз - - Copy Selected Macro - Копіювати макрос + + Copy Selected Macro + Копіювати макрос - - Delete Selected Macro - Видалити макрос + + Delete Selected Macro + Видалити макрос - - Delete Macro - Видалити макрос + + Delete Macro + Видалити макрос - - Are you sure you want to delete <b>%1</b>? - Ви дійсно хочете видалити <b>%1</b>? + + Are you sure you want to delete <b>%1</b>? + Ви дійсно хочете видалити <b>%1</b>? - - (Copy) - (копіювати) + + (Copy) + (копіювати) - - + + MacroRunDialog - - Run a Macro Multiple Times - Багаторазове виконання макросу + + Run a Macro Multiple Times + Багаторазове виконання макросу - - Macro: - Макрос: + + Macro: + Макрос: - - Run Until End of File - Виконувати до кінця файлу + + Run Until End of File + Виконувати до кінця файлу - - Execute... - Виконати... + + Execute... + Виконати... - - times - разів + + times + разів - - Run - Виконати + + Run + Виконати - - Cancel - Скасувати + + Cancel + Скасувати - - + + MacroSaveDialog - - Save Macro - Збереження макросу + + Save Macro + Збереження макросу - - Name: - Назва: + + Name: + Назва: - - Shortcut: - Скорочення: + + Shortcut: + Скорочення: - - OK - OK + + OK + OK - - Cancel - Скасувати + + Cancel + Скасувати - - + + MacroStepTableModel - - Name - Назва + + Name + Назва - - Text - Текст + + Text + Текст - - + + MainWindow - - Notepad Next[*] - Notepad Next[*] + + Notepad Next[*] + Notepad Next[*] + + + + + + + + + + + &File + &Файл - - + - + + + Close More + Закрити - - &File - &Файл + + &Recent Files + &Останні файли - - Close More - Закрити + + + Export As + Експортувати як - - &Recent Files - &Останні файли + + &Edit + &Редагування - - - Export As - Експортувати як + + Copy More + Копіювати - - &Edit - &Редагування + + Indent + Відступ - - Copy More - Копіювати + + EOL Conversion + Перетворення символу кінця рядку (EOL) - - Indent - Відступ + + Convert Case + Змінити регістр - - EOL Conversion - Перетворення символу кінця рядку (EOL) + + Line Operations + Операції з рядками - - Convert Case - Змінити регістр + + Comment/Uncomment + Закоментувати/розкоментувати - - Line Operations - Операції з рядками + + Copy As + Копіювати як - - Comment/Uncomment - Закоментувати/розкоментувати + + Encoding/Decoding + Зашифрувати/Розшифрувати - - Copy As - Копіювати як + + Search + По&шук - - Encoding/Decoding - Зашифрувати/Розшифрувати + + Bookmarks + Закладки - - Search - По&шук + + Mark All Occurrences + Позначити всі збіги - - Bookmarks - Закладки + + Clear Marks + Очистити позначки - - Mark All Occurrences - Позначити всі збіги + + &View + &Вид - - Clear Marks - Очистити позначки + + &Zoom + &Масштаб - - &View - &Вид + + Show Symbol + Показувати символи - - &Zoom - &Масштаб + + Fold Level + Згорнути рівень - - Show Symbol - Показувати символи + + Unfold Level + Розгорнути рівень - - Fold Level - Згорнути рівень + + Language + &Синтаксис - - Unfold Level - Розгорнути рівень + + Settings + &Параметри - - Language - &Синтаксис + + Macro + &Макрос - - Settings - &Параметри + + Help + &Довідка - - Macro - &Макрос + + Encoding + Набір символів - - Help - &Довідка + + Main Tool Bar + Головна панель інструментів - - Encoding - Набір символів + + &New + &Новий - - Main Tool Bar - Головна панель інструментів + + Create a new file + Створити новий файл - - &New - &Новий + + Ctrl+N + Ctrl+N - - Create a new file - Створити новий файл + + &Open... + &Відкрити... - - Ctrl+N - Ctrl+N + + Ctrl+O + Ctrl+O - - &Open... - &Відкрити... + + &Save + &Зберегти - - Ctrl+O - Ctrl+O + + Save + Зберегти - - &Save - &Зберегти + + Ctrl+S + Ctrl+S - - Save - Зберегти + + E&xit + Ви&йти - - Ctrl+S - Ctrl+S + + &Undo + &Відмінити операцію - - E&xit - Ви&йти + + Ctrl+Z + Ctrl+Z - - &Undo - &Відмінити операцію + + &Redo + &Повторити операцію - - Ctrl+Z - Ctrl+Z + + Ctrl+Y + Ctrl+Y - - &Redo - &Повторити операцію + + Cu&t + В&ирізати - - Ctrl+Y - Ctrl+Y + + Ctrl+X + Ctrl+X - - Cu&t - В&ирізати + + &Copy + &Копіювати - - Ctrl+X - Ctrl+X + + Ctrl+C + Ctrl+C - - &Copy - &Копіювати + + &Paste + В&ставити - - Ctrl+C - Ctrl+C + + Ctrl+V + Ctrl+V - - &Paste - В&ставити + + &Delete + Ви&далити - - Ctrl+V - Ctrl+V + + Del + Del - - &Delete - Ви&далити + + Copy Full Path + Копіювати повний шлях - - Del - Del + + Copy File Name + Копіювати назву файлу - - Copy Full Path - Копіювати повний шлях + + Copy File Directory + Копіювати назву каталогу - - Copy File Name - Копіювати назву файлу + + &Close + За&крити - - Copy File Directory - Копіювати назву каталогу + + Close the current file + Закрити поточний файл - - &Close - За&крити + + Ctrl+W + Ctrl+W - - Close the current file - Закрити поточний файл + + Save &As... + З&берегти як... - - Ctrl+W - Ctrl+W + + Ctrl+Alt+S + Ctrl+Alt+S - - Save &As... - З&берегти як... + + Save a Copy As... + Зберегти копію як... - - Ctrl+Alt+S - Ctrl+Alt+S + + Sav&e All + Зб&ерегти все - - Save a Copy As... - Зберегти копію як... + + Ctrl+Shift+S + Ctrl+Shift+S - - Sav&e All - Зб&ерегти все + + Select A&ll + &Обрати всі - - Ctrl+Shift+S - Ctrl+Shift+S + + Ctrl+A + Ctrl+A - - Select A&ll - &Обрати всі + + Increase Indent + Збільшити відступ - - Ctrl+A - Ctrl+A + + Decrease Indent + Зменшити відступ - - Increase Indent - Збільшити відступ + + Rename... + Перейменувати... - - Decrease Indent - Зменшити відступ + + Re&load + &Перезавантажити - - Rename... - Перейменувати... + + Windows (CR LF) + Windows (CR LF) - - Re&load - &Перезавантажити + + Unix (LF) + Unix (LF) - - Windows (CR LF) - Windows (CR LF) + + Macintosh (CR) + Macintosh (CR) - - Unix (LF) - Unix (LF) + + UPPER CASE + ВЕРХНІЙ РЕГІСТР - - Macintosh (CR) - Macintosh (CR) + + Convert text to upper case + Перетворити в ВЕРХНІЙ РЕГІСТР - - UPPER CASE - ВЕРХНІЙ РЕГІСТР + + lower case + нижній регістр - - Convert text to upper case - Перетворити в ВЕРХНІЙ РЕГІСТР + + Convert text to lower case + Перетворити в нижній регістр - - lower case - нижній регістр + + Duplicate Current Line + Дублювати поточний рядок - - Convert text to lower case - Перетворити в нижній регістр + + Alt+Down + Alt+Down - - Duplicate Current Line - Дублювати поточний рядок + + Split Lines + Розділити рядки - - Alt+Down - Alt+Down + + Join Lines + Об'єднати рядки - - Split Lines - Розділити рядки + + Ctrl+J + Ctrl+J - - Join Lines - Об'єднати рядки + + Move Selected Lines Up + Перемістити поточний рядок вверх - - Ctrl+J - Ctrl+J + + Ctrl+Shift+Up + Ctrl+Shift+Up - - Move Selected Lines Up - Перемістити поточний рядок вверх + + Move Selected Lines Down + Перемістити поточний рядок вниз - - Ctrl+Shift+Up - Ctrl+Shift+Up + + Ctrl+Shift+Down + Ctrl+Shift+Down - - Move Selected Lines Down - Перемістити поточний рядок вниз + + Clos&e All + Зак&рити все - - Ctrl+Shift+Down - Ctrl+Shift+Down + + Close All files + Закрити всі файли - - Clos&e All - Зак&рити все + + Ctrl+Shift+W + Ctrl+Shift+W - - Close All files - Закрити всі файли + + Close All Except Active Document + Закрити всі документи окрім поточного - - Ctrl+Shift+W - Ctrl+Shift+W + + Close All to the Left + Закрити всі ліворуч - - Close All Except Active Document - Закрити всі документи окрім поточного + + Close All to the Right + Закрити всі праворуч - - Close All to the Left - Закрити всі ліворуч + + Zoom &In + Ма&сштаб + - - Close All to the Right - Закрити всі праворуч + + Ctrl++ + Ctrl++ - - Zoom &In - Ма&сштаб + + + Zoom &Out + &Масштаб - - - Ctrl++ - Ctrl++ + + Ctrl+- + Ctrl+- - - Zoom &Out - &Масштаб - + + Reset Zoom + Масштаб за замовчуванням - - Ctrl+- - Ctrl+- + + Ctrl+0 + Ctrl+0 - - Reset Zoom - Масштаб за замовчуванням + + About Qt + Про Qt - - Ctrl+0 - Ctrl+0 + + About Notepad Next + Про Notepad Next - - About Qt - Про Qt + + Show Whitespace + Показувати пробіл - - About Notepad Next - Про Notepad Next + + Show End of Line + Показувати кінець рядку - - Show Whitespace - Показувати пробіл + + Show All Characters + Показувати всі символи - - Show End of Line - Показувати кінець рядку + + Show Indent Guide + Показувати лінії відступу - - Show All Characters - Показувати всі символи + + Show Wrap Symbol + Показувати символ переносу - - Show Indent Guide - Показувати лінії відступу + + Word Wrap + Перенесення слів - - Show Wrap Symbol - Показувати символ переносу + + Restore Recently Closed File + Відновити щойно закритий файл - - Word Wrap - Перенесення слів + + Ctrl+Shift+T + Ctrl+Shift+T - - Restore Recently Closed File - Відновити щойно закритий файл + + Open All Recent Files + Відкрити ві нещодавні файли - - Ctrl+Shift+T - Ctrl+Shift+T + + Clear Recent Files List + Очистити список нещодавніх файлів - - Open All Recent Files - Відкрити ві нещодавні файли + + &Find... + &Знайти... - - Clear Recent Files List - Очистити список нещодавніх файлів + + Ctrl+F + Ctrl+F - - &Find... - &Знайти... + + Find in Files... + Знайти в файлах... - - Ctrl+F - Ctrl+F + + Find &Next + Знайти &наступний - - Find in Files... - Знайти в файлах... + + F3 + F3 - - Find &Next - Знайти &наступний + + Find &Previous + Знайти &попередній - - F3 - F3 + + Shift+F3 + - - Find &Previous - Знайти &попередній + + &Replace... + З&амінити... - - &Replace... - З&амінити... + + Ctrl+H + Ctrl+H - - Ctrl+H - Ctrl+H + + Full Screen + Повноекранний режим - - Full Screen - Повноекранний режим + + F11 + F11 - - F11 - F11 + + + Start Recording + Почати запис - - - Start Recording - Почати запис + + Playback + Виконати - - Playback - Виконати + + Ctrl+Shift+P + Ctrl+Shift+P - - Ctrl+Shift+P - Ctrl+Shift+P + + Save Current Recorded Macro... + Зберегти щойно записаний макрос... - - Save Current Recorded Macro... - Зберегти щойно записаний макрос... + + Run a Macro Multiple Times... + Виконати макрос багато разів... - - Run a Macro Multiple Times... - Виконати макрос багато разів... + + Preferences... + Налаштування... - - Preferences... - Налаштування... + + Quick Find + Швидкий пошук - - Quick Find - Швидкий пошук + + Ctrl+Alt+I + Ctrl+Alt+I - - Ctrl+Alt+I - Ctrl+Alt+I + + Select Next Instance + Виділити схожі вирази - - Select Next Instance - Виділити схожі вирази + + Ctrl+D + Ctrl+D - - Ctrl+D - Ctrl+D + + Move to Trash... + Перемістити до смітника... - - Move to Trash... - Перемістити до смітника... + + Move to Trash + Перемістити до смітника - - Move to Trash - Перемістити до смітника + + Check for Updates... + Перевірити оновлення... - - Check for Updates... - Перевірити оновлення... + + &Go to Line... + П&ерейти до рядку... - - &Go to Line... - П&ерейти до рядку... + + Ctrl+G + Ctrl+G - - Ctrl+G - Ctrl+G + + Print... + Друк... - - Print... - Друк... + + Ctrl+P + Ctrl+P - - Ctrl+P - Ctrl+P + + Open Folder as Workspace... + Відкрити каталог як робочий простір... - - Open Folder as Workspace... - Відкрити каталог як робочий простір... + + Toggle Single Line Comment + Однорядковий коментар - - Toggle Single Line Comment - Однорядковий коментар + + Ctrl+/ + Ctrl+/ - - Ctrl+/ - Ctrl+/ + + Single Line Comment + Закоментувати один рядок - - Single Line Comment - Закоментувати один рядок + + Ctrl+K + Ctrl+K - - Ctrl+K - Ctrl+K + + Single Line Uncomment + Розкоментувати один рядок - - Single Line Uncomment - Розкоментувати один рядок + + Ctrl+Shift+K + Ctrl+Shift+K - - Ctrl+Shift+K - Ctrl+Shift+K + + Edit Macros... + Редагувати макрос... - - Edit Macros... - Редагувати макрос... + + This is not currently implemented + Ця можливість ще не реалізована - - This is not currently implemented - Ця можливість ще не реалізована + + Column Mode... + Створити стовпець... - - Column Mode... - Створити стовпець... + + Export as HTML... + Експортувати як HTML... - - Export as HTML... - Експортувати як HTML... + + Export as RTF... + Експортувати як RTF... - - Export as RTF... - Експортувати як RTF... + + Copy as HTML + Копіювати як HTML - - Copy as HTML - Копіювати як HTML + + Copy as RTF + Копіювати як RTF - - Copy as RTF - Копіювати як RTF + + Base 64 Encode + Зашифрувати Base 64 - - Base 64 Encode - Зашифрувати Base 64 + + URL Encode + Зашифрувати URL - - URL Encode - Зашифрувати URL + + Base 64 Decode + Розшифрувати Base 64 - - Base 64 Decode - Розшифрувати Base 64 + + URL Decode + Розшифрувати URL - - URL Decode - Розшифрувати URL + + Copy URL + Копіювати URL - - Copy URL - Копіювати URL + + Remove Empty Lines + Видалити пусті рядки - - Remove Empty Lines - Видалити пусті рядки + + + Show in Explorer + Показати в файловому менеджері - - - Show in Explorer - Показати в файловому менеджері + + Open %1 Here + Відкрити %1 тут - - Open %1 Here - Відкрити %1 тут + + Toggle Bookmark + Додати/видалити закладку - - Toggle Bookmark - Додати/видалити закладку + + Ctrl+F2 + Ctrl+F2 - - Ctrl+F2 - Ctrl+F2 + + Next Bookmark + Наступна закладка - - Next Bookmark - Наступна закладка + + F2 + F2 - - F2 - F2 + + Previous Bookmark + Попередня закладка - - Previous Bookmark - Попередня закладка + + Shift+F2 + Shift+F2 - - Shift+F2 - Shift+F2 + + Clear Bookmarks + Очистити закладки - - Clear Bookmarks - Очистити закладки + + Invert Bookmarks + Інвертувати закладки - - Invert Bookmarks - Інвертувати закладки + + Next Tab + Наступна вкладка - - Next Tab - Наступна вкладка + + Ctrl+Tab + Ctrl+Tab - - Ctrl+Tab - Ctrl+Tab + + Previous Tab + Попередня вкладка - - Previous Tab - Попередня вкладка + + Ctrl+Shift+Tab + Ctrl+Shift+Tab - - Ctrl+Shift+Tab - Ctrl+Shift+Tab + + Fold Level 1 + Згорнути рівень 1 - - Fold Level 1 - Згорнути рівень 1 + + Alt+1 + Alt+1 - - Alt+1 - Alt+1 + + Fold Level 2 + Згорнути рівень 2 - - Fold Level 2 - Згорнути рівень 2 + + Alt+2 + Alt+2 - - Alt+2 - Alt+2 + + Fold Level 3 + Згорнути рівень 3 - - Fold Level 3 - Згорнути рівень 3 + + Alt+3 + Alt+3 - - Alt+3 - Alt+3 + + Fold Level 4 + Згорнути рівень 4 - - Fold Level 4 - Згорнути рівень 4 + + Alt+4 + Alt+4 - - Alt+4 - Alt+4 + + Unfold Level 1 + Розгорнути рівень 1 - - Unfold Level 1 - Розгорнути рівень 1 + + Alt+Shift+1 + Alt+Shift+1 - - Alt+Shift+1 - Alt+Shift+1 + + Unfold Level 2 + Розгорнути рівень 2 - - Unfold Level 2 - Розгорнути рівень 2 + + Alt+Shift+2 + Alt+Shift+2 - - Alt+Shift+2 - Alt+Shift+2 + + Unfold Level 3 + Розгорнути рівень 3 - - Unfold Level 3 - Розгорнути рівень 3 + + Alt+Shift+3 + Alt+Shift+3 - - Alt+Shift+3 - Alt+Shift+3 + + Unfold Level 4 + Розгорнути рівень 4 - - Unfold Level 4 - Розгорнути рівень 4 + + Alt+Shift+4 + Alt+Shift+4 - - Alt+Shift+4 - Alt+Shift+4 + + Fold All + Згорнути всі - - Fold All - Згорнути всі + + Alt+0 + Alt+0 - - Alt+0 - Alt+0 + + Unfold All + Розгорнути всі - - Unfold All - Розгорнути всі + + Alt+Shift+0 + Alt+Shift+0 - - Alt+Shift+0 - Alt+Shift+0 + + Fold Level 5 + Згорнути рівень 5 - - Fold Level 5 - Згорнути рівень 5 + + Alt+5 + Alt+5 - - Alt+5 - Alt+5 + + Fold Level 6 + Згорнути рівень 6 - - Fold Level 6 - Згорнути рівень 6 + + Alt+6 + Alt+6 - - Alt+6 - Alt+6 + + Fold Level 7 + Згорнути рівень 7 - - Fold Level 7 - Згорнути рівень 7 + + Alt+7 + Alt+7 - - Alt+7 - Alt+7 + + Fold Level 8 + Згорнути рівень 8 - - Fold Level 8 - Згорнути рівень 8 + + Alt+8 + Alt+8 - - Alt+8 - Alt+8 + + Fold Level 9 + Згорнути рівень 9 - - Fold Level 9 - Згорнути рівень 9 + + Alt+9 + Alt+9 - - Alt+9 - Alt+9 + + Unfold Level 5 + Розгорнути рівень 5 - - Unfold Level 5 - Розгорнути рівень 5 + + Alt+Shift+5 + Alt+Shift+5 - - Alt+Shift+5 - Alt+Shift+5 + + Unfold Level 6 + Розгорнути рівень 6 - - Unfold Level 6 - Розгорнути рівень 6 + + Alt+Shift+6 + Alt+Shift+6 - - Alt+Shift+6 - Alt+Shift+6 + + Unfold Level 7 + Розгорнути рівень 7 - - Unfold Level 7 - Розгорнути рівень 7 + + Alt+Shift+7 + Alt+Shift+7 - - Alt+Shift+7 - Alt+Shift+7 + + Unfold Level 8 + Розгорнути рівень 8 - - Unfold Level 8 - Розгорнути рівень 8 + + Alt+Shift+8 + Alt+Shift+8 - - Alt+Shift+8 - Alt+Shift+8 + + Unfold Level 9 + Розгорнути рівень 9 - - Unfold Level 9 - Розгорнути рівень 9 + + Alt+Shift+9 + Alt+Shift+9 - - Alt+Shift+9 - Alt+Shift+9 + + + Toggle Overtype + Toggle Overtype - - - Toggle Overtype - Toggle Overtype + + Ins + Ins - - Ins - Ins + + Debug Info... + Інформація про налагодження... - - Debug Info... - Інформація про налагодження... + + Cut Bookmarked Lines + Вирізати рядки з закладок - - Cut Bookmarked Lines - Вирізати рядки з закладок + + Copy Bookmarked Lines + Копіювати рядки з закладок - - Copy Bookmarked Lines - Копіювати рядки з закладок + + Delete Bookmarked Lines + Видалити рядки з закладок - - Delete Bookmarked Lines - Видалити рядки з закладок + + Mark Style 1 + Позначити стилем 1 - - Mark Style 1 - Позначити стилем 1 + + Mark Style 2 + Позначити стилем 2 - - Mark Style 2 - Позначити стилем 2 + + Clear Style 1 + Очистити стиль 1 - - Clear Style 1 - Очистити стиль 1 + + Clear Style 2 + Очистити стиль 2 - - Clear Style 2 - Очистити стиль 2 + + Mark Style 3 + Позначити стилем 3 - - Mark Style 3 - Позначити стилем 3 + + Clear Style 3 + Очистити стиль 3 - - Clear Style 3 - Очистити стиль 3 + + + Clear All Styles + Очистити всі стилі - - - Clear All Styles - Очистити всі стилі + + Remove Duplicate Lines + Remove Duplicate Lines - - Remove Duplicate Lines - Remove Duplicate Lines + + Remove Consecutive Duplicate Lines + Remove Consecutive Duplicate Lines - - Remove Consecutive Duplicate Lines - Remove Consecutive Duplicate Lines + + Sort Lines Ascending + - - Go to line - Перейти до рядку + + Sort Lines Descending + - - Line Number (1 - %1) - Номер рядку (1 - %1) + + Sort Lines Ascending (Case-Insensitive) + - - Stop Recording - Зупинити запис + + Sort Lines Descending (Case-Insensitive) + - - Debug Info - Інформація про налагодження + + Sort Lines by Length Ascending + - - New %1 - Новий %1 + + Sort Lines by Length Descending + - - Create File - Створити файл + + Reverse Line Order + - - <b>%1</b> does not exist. Do you want to create it? - <b>%1</b> не існує. Бажаєте створити його ? + + Go to line + Перейти до рядку - - - Save file <b>%1</b>? - Зберегти файл <b>%1</b>? + + Line Number (1 - %1) + Номер рядку (1 - %1) - - - Save File - Зберегти файл + + Stop Recording + Зупинити запис - - Open Folder as Workspace - Відкрити каталог як робочий простір + + Debug Info + Інформація про налагодження - - - Reload File - Перезавантажити файл + + New %1 + Новий %1 - - Are you sure you want to reload <b>%1</b>? Any unsaved changes will be lost. - Ви дійсно хочете перезавантажити файл<b>%1</b>? Всі не збережені зміни будут втрачені. + + Create File + Створити файл - - Save a Copy As - Зберегти копію як + + <b>%1</b> does not exist. Do you want to create it? + <b>%1</b> не існує. Бажаєте створити його ? - - - Rename - Перейменувати + + + Save file <b>%1</b>? + Зберегти файл <b>%1</b>? - - Name: - Назва: + + + Save File + Зберегти файл - - Delete File - Видалити файл + + Open Folder as Workspace + Відкрити каталог як робочий простір - - Are you sure you want to move <b>%1</b> to the trash? - Ви дійсно хочете перемістити файл <b>%1</b> до смітника ? + + + Reload File + Перезавантажити файл - - Error Deleting File - Помилка видалення файлу + + Are you sure you want to reload <b>%1</b>? Any unsaved changes will be lost. + Ви дійсно хочете перезавантажити файл<b>%1</b>? Всі не збережені зміни будут втрачені. - - Something went wrong deleting <b>%1</b>? - Під час видалення щось пішло не так <b>%1</b>? + + Save a Copy As + Зберегти копію як - - Administrator - Адміністратор + + + Rename + Перейменувати - - <b>%1</b> has been modified by another program. Do you want to reload it? - <b>%1</b> був змінений. Бажаєте завантажити актуальну версію? + + Name: + Назва: - - Read error - Read error + + Delete File + Видалити файл - - Write error - Write error + + Are you sure you want to move <b>%1</b> to the trash? + Ви дійсно хочете перемістити файл <b>%1</b> до смітника ? - - Fatal error - Fatal error + + Error Deleting File + Помилка видалення файлу - - Resource error - Resource error + + Something went wrong deleting <b>%1</b>? + Під час видалення щось пішло не так <b>%1</b>? - - Open error - Open error + + Administrator + Адміністратор - - Abort error - Abort error + + <b>%1</b> has been modified by another program. Do you want to reload it? + <b>%1</b> був змінений. Бажаєте завантажити актуальну версію? - - Timeout error - Timeout error + + Read error + Read error - - Unspecified error - Unspecified error + + Write error + Write error - - Remove error - Remove error + + Fatal error + Fatal error - - Rename error - Rename error + + Resource error + Resource error - - Position error - Position error + + Open error + Open error - - Resize error - Resize error + + Abort error + Abort error - - Permissions error - Permissions error + + Timeout error + Timeout error - - Copy error - Copy error + + Unspecified error + Unspecified error - - Unknown error (%1) - Unknown error (%1) + + Remove error + Remove error - - Error Saving File - Помилка збереження файлу + + Rename error + Rename error - - An error occurred when saving <b>%1</b><br><br>Error: %2 - Під час збереження виникла помилка<b>%1</b><br><br>Помилка: %2 + + Position error + Position error - - Zoom: %1% - Масштаб: %1% + + Resize error + Resize error - - No updates are available at this time. - На цю мить не має ніяких оновлень. + + Permissions error + Permissions error - - + + + Copy error + Copy error + + + + Unknown error (%1) + Unknown error (%1) + + + + Error Saving File + Помилка збереження файлу + + + + An error occurred when saving <b>%1</b><br><br>Error: %2 + Під час збереження виникла помилка<b>%1</b><br><br>Помилка: %2 + + + + Zoom: %1% + Масштаб: %1% + + + + No updates are available at this time. + На цю мить не має ніяких оновлень. + + + PreferencesDialog - - Preferences - Налаштування + + Preferences + Налаштування + + + + Unsaved сhanges + Незбережені зміни + + + + You have unsaved changes. +Do you want to save them before closing? + Зберегти внесені зміни? + + + Show menu bar + Показувати панель меню + + + Show toolbar + Показувати панель інструментів + + + Show status bar + Показувати рядок стану + + + Restore previous session + Відновлювати попередній сеанс + + + Unsaved changes + Не збережені зміни + + + Temporary files + Тимчасові файли + + + Recenter find/replace dialog when opened + Центрувати вікно пошуку/заміни під час його відкриття + + + Combine search results + Об'єднувати результати пошуку + + + Translation: + Локалізація: + + + Exit on last tab closed + Закривати програму при закритті останньої вкладки + + + Default Font + Шрифт за замовчуванням + + + Font + Шрифт + + + Font Size + Розмір + + + pt + pt + + + Default Line Endings + Символ кінця рядку за замовчуванням + + + Highlight URLs + Підкреслювати посилання URL + + + Show Line Numbers + Показувати кількість рядків + + + Default Directory + Default Directory + + + Follow Current Document + Follow Current Document + + + Last Used Directory + Last Used Directory + + + ... + ... + + + TextLabel + Текстове поле + + + An application restart is required to apply certain settings. + Для застосування деяких змін потрібно перезапустити програму. + + + Warning + Попередження + + + This feature is experimental and it should not be considered safe for critically important work. It may lead to possible data loss. Use at your own risk. + Ця функція є експериментальною, тому її не можна вважати безпечною. Її використання може призвести до втрати даних. Використовуйте цю опцію на власний розсуд. + + + System Default + Системний + + + Windows (CR LF) + Windows (CR LF) + + + Linux (LF) + Linux (LF) + + + Macintosh (CR) + Macintosh (CR) - - Show menu bar - Показувати панель меню + <System Default> + <Мова системи> + + + QObject - - Show toolbar - Показувати панель інструментів + + List All Tabs + Перелік всіх вкладок - - Show status bar - Показувати рядок стану + + Detach Group + Відокремити групу - - Restore previous session - Відновлювати попередній сеанс + + Minimize + Згорнути - - Unsaved changes - Не збережені зміни + + Close Tab + Закрити вкладку - - Temporary files - Тимчасові файли + + Default directory + Каталог за замовчуванням - - Recenter find/replace dialog when opened - Центрувати вікно пошуку/заміни під час його відкриття + + Current document directory + Поточний каталог документу - - Combine search results - Об'єднувати результати пошуку + + Last used directory + Останній використаний каталог - - Translation: - Локалізація: + + Selected directory: + Обраний каталог: - - Exit on last tab closed - Закривати програму при закритті останньої вкладки + + Selected directory path here... + Шлях до обраного каталогу... - - Default Font - Шрифт за замовчуванням + + Open directory select dialog + Відкрити вікно вибору каталогу - - Font - Шрифт + + Not exists + Не існує - - Font Size - Розмір + + Not a directory + Не є каталогом - - pt - pt + + No write access + Немає дозволу на запис - - Default Line Endings - Символ кінця рядку за замовчуванням + + Please, use absolute path + Будь ласка, використовуйте повний шлях - - Highlight URLs - Підкреслювати посилання URL + + Select default directory + Вибрати каталог за замовчуванням - - Show Line Numbers - Показувати кількість рядків + + Restore previous session + Відновлювати попередній сеанс - - - Default Directory - Default Directory + + Unsaved changes + Незбережені зміни - - Follow Current Document - Follow Current Document + + Temporary files + Тимчасові файли - - Last Used Directory - Last Used Directory + + Like in system + Як у системі - - ... - ... + + System default + Окінчення рядків + Системні - - TextLabel - Текстове поле + <System> + <Системна> - - An application restart is required to apply certain settings. - Для застосування деяких змін потрібно перезапустити програму. + <System default> + <Системні> - - Warning - Попередження + <System Language> + <Системна> - - This feature is experimental and it should not be considered safe for critically important work. It may lead to possible data loss. Use at your own risk. - Ця функція є експериментальною, тому її не можна вважати безпечною. Її використання може призвести до втрати даних. Використовуйте цю опцію на власний розсуд. + + Language: + Мова: - - System Default - Системний + System Default + Системний - - Windows (CR LF) - Windows (CR LF) + + Windows (CR LF) + Windows (CR LF) - - Linux (LF) - Linux (LF) + + Unix (LF) + Unix (LF) - - Macintosh (CR) - Macintosh (CR) + + Macintosh (CR) + Macintosh (CR) - - <System Default> - <Мова системи> + + Default line endings: + Символ кінця рядку за замовчуванням: - - + + + Recenter find/replace dialog when opened + Центрувати вікно пошуку/заміни під час відкриття + + + + Combine search results + Об'єднувати результати пошуку + + + + Exit on last tab closed + Закривати програму при закритті останньої вкладки + + + + Behavior + Поведінка + + + + Application restart required to apply changes. + Потребує перезапуск додатку. + + + Window + Головне вікно + + + + Main window + Головне вікно + + + + Show menu bar + Показувати панель меню + + + + Show toolbar + Показувати панель інструментів + + + + Show status bar + Показувати рядок стану + + + + Font + Шрифт + + + + Family: + Сімейство: + + + + Size: + Розмір: + + + + Editor + Редактор + + + + Highlight URLs + Підсвічувати посилання + + + + Show line numbers + Показувати номера рядків + + + Show Line Numbers + Показувати номера рядків + + + + Appearance + Зовнішній вигляд + + + QuickFindWidget - - Frame - Рама + + Frame + Рама - - Find... - Шукати... + + Find... + Шукати... - - Match case - Чутливість до регістру + + Match case + Чутливість до регістру - - Aa - Aa + + Aa + Aa - - Match whole word - Шукати ціле слово + + Match whole word + Шукати ціле слово - - |A| - |A| + + |A| + |A| - - Use regular expression - Використовувати регулярний вираз + + Use regular expression + Використовувати регулярний вираз - - . * - . * + + . * + . * - - Alt+E - Alt+E + + Alt+E + Alt+E - - %L1/%L2 - %L1/%L2 + + %L1/%L2 + %L1/%L2 - - + + SearchResultsDock - - Search Results - Результати пошуку + + Search Results + Результати пошуку + + + + Copy Results to Clipboard + Копіювати результати до буферу обміну + + + + Collapse All + Згорнути все + + + + Expand All + Розгорнути все + + + + Delete Entry + Видалити запис + + + + Delete All + Видалити все + + + + Updater + + + Would you like to download the update now? + + + + + Would you like to download the update now?<br />This is a mandatory update, exiting now will close the application. + + + + + <strong>Change log:</strong><br/>%1 + + + + + Version %1 of %2 has been released! + + + + + No updates are available for the moment + + + + + Congratulations! You are running the latest version of %1 + + + + + Window + + + QSimpleUpdater Example + + + + + <h1><i>QSimpleUpdater</i></h1> + + + + + <i>A simpler way to update your Qt applications...</i> + + + + + Updater Options + + + + + 0.1 + + + + + Write a version string... + + + + + Set installed version (latest version is 1.0) + + + + + Do not use the QSU library to read the appcast + + + + + Notify me when an update is available + + + + + Show all notifications + + + + + Enable integrated downloader + + + + + Mandatory Update + + + + + Changelog + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'.Lucida Grande UI'; font-size:13pt;">Click &quot;Check for Updates&quot; to update this field...</span></p></body></html> + + + + + Reset Fields + + + + + Close + Закрити + + + + Check for Updates + + + + + ads::CAutoHideTab + + + Detach + + + + + Pin To... + + + + + Top + + + + + Left + + + + + Right + + + + + Bottom + + + + + Unpin (Dock) + + + + + Close + Закрити + + + + ads::CDockAreaTitleBar + + + Detach + + + + + Detach Group + Відокремити групу + + + + + Unpin (Dock) + + + + + + Pin Group + + + + + Pin Group To... + + + + + Top + + + + + Left + + + + + Right + + + + + Bottom + + + + + + Minimize + Згорнути + + + + + + Close + Закрити + + + + + Close Group + + + + + Close Other Groups + + + + + Pin Active Tab (Press Ctrl to Pin Group) + + + + + Close Active Tab + + + + + ads::CDockManager + + + Show View + + + + + ads::CDockWidgetTab + + + Detach + + + + + Pin + + + + + Pin To... + + + + + Top + - - Copy Results to Clipboard - Копіювати результати до буферу обміну + + Left + - - Collapse All - Згорнути все + + Right + - - Expand All - Розгорнути все + + Bottom + - - Delete Entry - Видалити запис + + Close + Закрити - - Delete All - Видалити все + + Close Others + - + diff --git a/src/ApplicationSettings.cpp b/src/ApplicationSettings.cpp index 17def0ca6..0fcdfe222 100644 --- a/src/ApplicationSettings.cpp +++ b/src/ApplicationSettings.cpp @@ -18,6 +18,7 @@ #include "ApplicationSettings.h" +#include #include #include @@ -36,8 +37,45 @@ ApplicationSetting name{#group "/" #name, default};\ ApplicationSettings::ApplicationSettings(QObject *parent) - : QSettings{parent} + : QSettings(parent) +{ } + +ApplicationSettings::ApplicationSettings(QTemporaryFile *tempFile, QObject *parent) + : QSettings(tempFile->fileName(), QSettings::NativeFormat, parent) +{ + tempFile->setParent(this); +} + +void ApplicationSettings::fillFrom(ApplicationSettings *other) +{ + if (!other) return; + + const auto meta = metaObject(); + + for (auto i = meta->propertyOffset(); i < meta->propertyCount(); ++i) + { + const auto property = meta->property(i); + + if (property.isWritable() && property.isReadable()) + property.write(this, property.read(other)); + } +} + +bool ApplicationSettings::isEquals(ApplicationSettings *other) const { + if (!other) return false; + + const auto meta = metaObject(); + + for (auto i = meta->propertyOffset(); i < meta->propertyCount(); ++i) + { + const auto property = meta->property(i); + + if (property.read(this) != property.read(other)) + return false; + } + + return true; } CREATE_SETTING(Gui, ShowMenuBar, showMenuBar, bool, true) diff --git a/src/ApplicationSettings.h b/src/ApplicationSettings.h index cd4089801..7dfe75303 100644 --- a/src/ApplicationSettings.h +++ b/src/ApplicationSettings.h @@ -26,6 +26,7 @@ #include #include +class QTemporaryFile; template class ApplicationSetting @@ -53,39 +54,54 @@ class ApplicationSetting }; -#define DEFINE_SETTING(name, lname, type)\ -public:\ - type lname() const;\ -public slots:\ - void set##name(type lname);\ -Q_SIGNAL\ - void lname##Changed(type lname);\ - +#define DEFINE_SETTING(name, lname, type) \ + Q_PROPERTY(type lname READ lname WRITE set##name NOTIFY lname##Changed FINAL) \ + public: \ + type lname() const; \ + public slots: \ + void set##name(type lname); \ + Q_SIGNAL \ + void lname##Changed(type lname); class ApplicationSettings : public QSettings { Q_OBJECT - public: - explicit ApplicationSettings(QObject *parent = nullptr); - - enum DefaultDirectoryBehaviorEnum { + enum DefaultDirectoryBehaviorEnum + { FollowCurrentDocument, RememberLastUsed, HardCoded }; Q_ENUM(DefaultDirectoryBehaviorEnum) +public: + explicit ApplicationSettings(QObject *parent = nullptr); + + /** + * @brief Create temporary instance with default settings. + * @param tempFile Temporary file instance to be used. + * @warning Ensure tempFile->open() was called before passing it. + * @note The instance takes ownership of tempFile. + */ + ApplicationSettings(QTemporaryFile *tempFile, QObject *parent = nullptr); + + inline void copyTo(ApplicationSettings *other) const { + other->fillFrom(const_cast(this)); + } + void fillFrom(ApplicationSettings *other); + bool isEquals(ApplicationSettings *other) const; + template - T get(const char *key, const T &defaultValue) const + inline T get(const char *key, const T &defaultValue) const { return value(QLatin1String(key), defaultValue).template value(); } template - T get(const ApplicationSetting &setting) const + inline T get(const ApplicationSetting &setting) const { return get(setting.key(), setting.getDefault()); } template - void set(const ApplicationSetting &setting, const T &value) + inline void set(const ApplicationSetting &setting, const T &value) { setValue(QLatin1String(setting.key()), value); } DEFINE_SETTING(ShowMenuBar, showMenuBar, bool) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2bc1f9fa4..020a17e32 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -125,6 +125,17 @@ qt_add_executable(NotepadNext decorators/SurroundSelection.h decorators/URLFinder.cpp decorators/URLFinder.h + dialogs/Preferences/PreferencesCategoryListModel.cpp + dialogs/Preferences/PreferencesCategoryListModel.h + dialogs/Preferences/BehaviorCategoryItem.cpp + dialogs/Preferences/BehaviorCategoryItem.h + dialogs/Preferences/PreferencesViewUtils.h + dialogs/Preferences/PreferencesCategoryItem.h + dialogs/Preferences/PreferencesCategoryItemT.h + dialogs/Preferences/AppearanceCategoryItem.cpp + dialogs/Preferences/AppearanceCategoryItem.h + dialogs/PreferencesDialog.cpp + dialogs/PreferencesDialog.h dialogs/ColumnEditorDialog.cpp dialogs/ColumnEditorDialog.h dialogs/ColumnEditorDialog.ui @@ -143,9 +154,9 @@ qt_add_executable(NotepadNext dialogs/MainWindow.cpp dialogs/MainWindow.h dialogs/MainWindow.ui - dialogs/PreferencesDialog.cpp - dialogs/PreferencesDialog.h - dialogs/PreferencesDialog.ui + + + docks/DebugLogDock.cpp docks/DebugLogDock.h docks/DebugLogDock.ui diff --git a/src/dialogs/MainWindow.cpp b/src/dialogs/MainWindow.cpp index 8f4930e41..447f58db2 100644 --- a/src/dialogs/MainWindow.cpp +++ b/src/dialogs/MainWindow.cpp @@ -716,12 +716,22 @@ MainWindow::MainWindow(NotepadNextApplication *app) : languageActionGroup->setExclusive(true); connect(ui->actionPreferences, &QAction::triggered, this, [=] { - PreferencesDialog *pd = findChild(QString(), Qt::FindDirectChildrenOnly); + auto pd = findChild(QString(), Qt::FindDirectChildrenOnly); if (pd == Q_NULLPTR) { pd = new PreferencesDialog(app->getSettings(), this); } + pd->resize(700, 400); + pd->setGeometry( + QStyle::alignedRect( + Qt::LeftToRight, + Qt::AlignCenter, + pd->size(), + geometry() + ) + ); + pd->show(); pd->raise(); pd->activateWindow(); diff --git a/src/dialogs/Preferences/AppearanceCategoryItem.cpp b/src/dialogs/Preferences/AppearanceCategoryItem.cpp new file mode 100644 index 000000000..d088f5091 --- /dev/null +++ b/src/dialogs/Preferences/AppearanceCategoryItem.cpp @@ -0,0 +1,131 @@ +#include +#include +#include +#include +#include +#include + +#include "AppearanceCategoryItem.h" +#include "PreferencesViewUtils.h" +#include "ApplicationSettings.h" + +using namespace Preferences; + +namespace +{ + inline QGroupBox *WindowAppearanceView(ApplicationSettings *settings) + { + const auto group = new QGroupBox(QObject::tr("Main window")); + + const auto layout = new QVBoxLayout(group); + layout->addWidget(CreateCheckBox( + QObject::tr("Show menu bar"), + settings, + PREFERENCES_BIND_PROPERTY(showMenuBar, ShowMenuBar) + )); + layout->addWidget(CreateCheckBox( + QObject::tr("Show toolbar"), + settings, + PREFERENCES_BIND_PROPERTY(showToolBar, ShowToolBar) + )); + layout->addWidget(CreateCheckBox( + QObject::tr("Show status bar"), + settings, + PREFERENCES_BIND_PROPERTY(showStatusBar, ShowStatusBar) + )); + layout->setContentsMargins(MARGINS_6); + layout->setSpacing(SPACING_6); + + return group; + } + + inline QGroupBox *FontAppearanceView(ApplicationSettings *settings) + { + const auto group = new QGroupBox(QObject::tr("Font")); + + const auto familyCombo = new QFontComboBox; + familyCombo->setMinimumWidth(120); + + const auto sizeCombo = new QComboBox; + sizeCombo->addItems({ + "4", "6", "8", "9", "10", + "11", "12", "14", "16", "18", + "20", "22", "24", "26", "28", + "36", "48", "72" + }); + sizeCombo->setValidator(new QIntValidator(4, 200, sizeCombo)); + sizeCombo->setEditable(true); + + const auto wheelSuppressor = new WheelEventSuppressFilter(group); + wheelSuppressor->setupFor(familyCombo); + wheelSuppressor->setupFor(sizeCombo); + + const auto layout = new QHBoxLayout(group); + layout->addWidget(new QLabel(QObject::tr("Family:"))); + layout->addWidget(familyCombo, 1); + layout->addSpacing(3); + layout->addWidget(new QLabel(QObject::tr("Size:"))); + layout->addWidget(sizeCombo); + layout->setContentsMargins(MARGINS_6); + layout->setSpacing(3); + + familyCombo->setCurrentFont(QFont(settings->fontName())); + sizeCombo->setCurrentText(QString("%1").arg(settings->fontSize())); + + QObject::connect(familyCombo, &QFontComboBox::currentFontChanged, + settings, [settings](const QFont &font) { + settings->setFontName(font.family()); + }); + QObject::connect(settings, &ApplicationSettings::fontNameChanged, + familyCombo, [familyCombo](const QString &fontName){ + familyCombo->setCurrentFont(QFont(fontName)); + }); + + QObject::connect(sizeCombo, &QComboBox::currentTextChanged, + settings, [settings](const QString &value) { + settings->setFontSize(value.toInt()); + }); + QObject::connect(settings, &ApplicationSettings::fontSizeChanged, + sizeCombo, [sizeCombo](int size) { + sizeCombo->setCurrentText(QString("%1").arg(size)); + }); + + return group; + } + + inline QGroupBox *EditorAppearanceView(ApplicationSettings *settings) + { + const auto group = new QGroupBox(QObject::tr("Editor")); + + const auto layout = new QVBoxLayout(group); + layout->addWidget(FontAppearanceView(settings)); + layout->addWidget(CreateCheckBox( + QObject::tr("Highlight URLs"), + settings, + PREFERENCES_BIND_PROPERTY(urlHighlighting, URLHighlighting) + )); + layout->addWidget(CreateCheckBox( + QObject::tr("Show line numbers"), + settings, + PREFERENCES_BIND_PROPERTY(showLineNumbers, ShowLineNumbers) + )); + layout->setContentsMargins(MARGINS_6); + layout->setSpacing(SPACING_6); + + return group; + } +} + +QWidget *AppearanceCategoryItem::contentView(ApplicationSettings *settings) const +{ + const auto widget = new QWidget; + const auto layout = new QVBoxLayout(widget); + + layout->addWidget(WindowAppearanceView(settings)); + layout->addWidget(EditorAppearanceView(settings)); + layout->addStretch(1); + layout->setContentsMargins(MARGINS_6); + layout->setSpacing(SPACING_6); + + return widget; +} diff --git a/src/dialogs/Preferences/AppearanceCategoryItem.h b/src/dialogs/Preferences/AppearanceCategoryItem.h new file mode 100644 index 000000000..10dde6436 --- /dev/null +++ b/src/dialogs/Preferences/AppearanceCategoryItem.h @@ -0,0 +1,17 @@ +#ifndef APPEARANCECATEGORYITEM_H +#define APPEARANCECATEGORYITEM_H + +#include "PreferencesCategoryItem.h" + +class AppearanceCategoryItem : public PreferencesCategoryItem +{ +public: + AppearanceCategoryItem() = default; + virtual ~AppearanceCategoryItem() = default; + + virtual QString title() const override { return QObject::tr("Appearance"); } + virtual QString iconPath() const override { return "://icons/paintbrush.svg"; } + virtual QWidget *contentView(ApplicationSettings *settings) const override; +}; + +#endif // APPEARANCECATEGORYITEM_H diff --git a/src/dialogs/Preferences/BehaviorCategoryItem.cpp b/src/dialogs/Preferences/BehaviorCategoryItem.cpp new file mode 100644 index 000000000..10f032c4f --- /dev/null +++ b/src/dialogs/Preferences/BehaviorCategoryItem.cpp @@ -0,0 +1,293 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "NotepadNextApplication.h" +#include "PreferencesViewUtils.h" +#include "BehaviorCategoryItem.h" +#include "TranslationManager.h" +#include "ScintillaNext.h" + +using namespace Preferences; + +namespace +{ + const QLatin1StringView PathStyleValid("QLineEdit { border: 1px solid #2ecc71; }"); + const QLatin1StringView PathStyleInvalid("QLineEdit { border: 1px solid #e74c3c; }"); + + inline QGroupBox *DefaultFolderView(ApplicationSettings *settings) + { + using BehaviourEnum = ApplicationSettings::DefaultDirectoryBehaviorEnum; + + const auto group = new QGroupBox(QObject::tr("Default directory")); + + const auto layout = new QVBoxLayout(group); + + const auto currentRadio = new QRadioButton(QObject::tr("Current document directory")); + const auto lastUsedRadio = new QRadioButton(QObject::tr("Last used directory")); + const auto selectedRadio = new QRadioButton(QObject::tr("Selected directory:")); + + const auto buttonGroup = new QButtonGroup(group); + buttonGroup->addButton(currentRadio, ApplicationSettings::FollowCurrentDocument); + buttonGroup->addButton(lastUsedRadio, ApplicationSettings::RememberLastUsed); + buttonGroup->addButton(selectedRadio, ApplicationSettings::HardCoded); + + const auto selectedPathEdit = new QLineEdit; + selectedPathEdit->setClearButtonEnabled(true); + selectedPathEdit->setPlaceholderText(QObject::tr("Selected directory path here...")); +#if QT_CONFIG(completer) + selectedPathEdit->setCompleter( + FilesystemCompliter( + selectedPathEdit, + Qt::CaseInsensitive, + QCompleter::PopupCompletion + ) + ); +#endif + + const auto pathBrowseButton = new QPushButton; + pathBrowseButton->setIcon(qApp->style()->standardIcon(QStyle::SP_DirIcon)); + pathBrowseButton->setToolTip(QObject::tr("Open directory select dialog")); + + const auto setPathInputEnabled = [selectedPathEdit, pathBrowseButton](bool state) { + selectedPathEdit->setEnabled(state); + pathBrowseButton->setEnabled(state); + }; + + const auto selectedLayout = new QHBoxLayout; + selectedLayout->addWidget(selectedRadio); + selectedLayout->addWidget(selectedPathEdit, 1); + selectedLayout->addWidget(pathBrowseButton); + selectedLayout->setContentsMargins(MARGINS_0); + selectedLayout->setSpacing(SPACING_3); + + layout->addWidget(currentRadio); + layout->addWidget(lastUsedRadio); + layout->addLayout(selectedLayout); + layout->setContentsMargins(MARGINS_6); + layout->setSpacing(SPACING_6); + + {// Load actual path + const auto selectedPath = QDir::toNativeSeparators(settings->defaultDirectory()); + if (!selectedPath.isEmpty()) + selectedPathEdit->setText(selectedPath); + else + selectedPathEdit->setText(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); + } + + QObject::connect(selectedPathEdit, &QLineEdit::textChanged, + settings, [selectedPathEdit, settings](const QString &text) { + QFileInfo checkDir(text); + QString toolTip; + QString style; + + if (!text.isEmpty()) + { + bool checks = checkDir.exists() + && checkDir.isDir() + && checkDir.isWritable(); + if (checks) + { + style = PathStyleValid; + settings->setDefaultDirectory(text); + } + else + { + QStringList whys; + + if (!checkDir.exists()) + whys += QObject::tr("Not exists"); + if (!checkDir.isDir()) + whys += QObject::tr("Not a directory"); + if (!checkDir.isWritable()) + whys += QObject::tr("No write access"); + + toolTip = whys.join(" | "); + + style = PathStyleInvalid; + } + } + else + toolTip = QObject::tr("Please, use absolute path"); + + selectedPathEdit->setStyleSheet(style); + selectedPathEdit->setToolTip(toolTip); + }); + QObject::connect(pathBrowseButton, &QPushButton::clicked, + group, [group, selectedPathEdit]() { + const auto selected = QFileDialog::getExistingDirectory( + group, + QObject::tr("Select default directory"), + selectedPathEdit->text(), + QFileDialog::ShowDirsOnly + | QFileDialog::DontResolveSymlinks + ); + if (!selected.isEmpty()) + selectedPathEdit->setText(selected); + }); + + QObject::connect(buttonGroup, &QButtonGroup::idClicked, + settings, [settings, setPathInputEnabled](int id) { + setPathInputEnabled(id == BehaviourEnum::HardCoded); + settings->setDefaultDirectoryBehavior((BehaviourEnum)id); + }); + QObject::connect(settings, &ApplicationSettings::defaultDirectoryBehaviorChanged, + buttonGroup, [buttonGroup, setPathInputEnabled](BehaviourEnum value) { + const auto button = buttonGroup->button(value); + const QSignalBlocker block(buttonGroup); // Prevent ss-loop + if (button) button->click(); + setPathInputEnabled(value == BehaviourEnum::HardCoded); + }); + + // Load current selection AFTER QObject::connect's + const auto checkableRadio = buttonGroup->button(settings->defaultDirectoryBehavior()); + if (checkableRadio) checkableRadio->click(); + + return group; + } + + inline QGroupBox *PreviousSessionView(ApplicationSettings *settings) + { + const auto group = new QGroupBox(QObject::tr("Restore previous session")); + group->setCheckable(true); + + const auto layout = new QVBoxLayout(group); + layout->addWidget(CreateCheckBox( + QObject::tr("Unsaved changes"), + settings, + PREFERENCES_BIND_PROPERTY(restoreUnsavedFiles, RestoreUnsavedFiles) + )); + layout->addWidget(CreateCheckBox( + QObject::tr("Temporary files"), + settings, + PREFERENCES_BIND_PROPERTY(restoreTempFiles, RestoreTempFiles) + )); + layout->setContentsMargins(MARGINS_6); + layout->setSpacing(SPACING_6); + + group->setChecked(settings->restorePreviousSession()); + + QObject::connect(settings, &ApplicationSettings::restorePreviousSessionChanged, + group, &QGroupBox::setChecked); + QObject::connect(group, &QGroupBox::toggled, + settings, &ApplicationSettings::setRestorePreviousSession); + + return group; + } + + inline QGridLayout *AppLanguageView(ApplicationSettings *settings) + { + const auto app = qobject_cast(qApp); + + const auto languageCombo = new QComboBox; + languageCombo->addItem(QObject::tr("Like in system"), QStringLiteral("")); + for (const auto &languageData : app->getTranslationManager()->availableTranslations()) + { + QLocale locale(languageData); + const auto languageTitle = TranslationManager::FormatLocaleTerritoryAndLanguage(locale); + languageCombo->addItem(languageTitle, languageData); + } + + const auto wheelSuppressor = new WheelEventSuppressFilter(languageCombo); + wheelSuppressor->setupFor(languageCombo); + + const auto restartNotification = new RestartRequiredLabel; + + const auto layout = new QGridLayout; + layout->addWidget(new QLabel(QObject::tr("Language:")), 0, 0); + layout->addWidget(languageCombo, 0, 1); + layout->addWidget(restartNotification, 1, 0, 1, 2); + layout->setColumnStretch(1, 1); + layout->setContentsMargins(MARGINS_0); + layout->setSpacing(SPACING_3); + + const auto setComboByData = [languageCombo](const QString &data) { + const auto index = languageCombo->findData(data); + languageCombo->setCurrentIndex(index >= 0 ? index : 0); + }; + + setComboByData(settings->translation()); + + QObject::connect(languageCombo, QOverload::of(&QComboBox::currentIndexChanged), + settings, [settings, languageCombo](int index) { + settings->setTranslation(languageCombo->itemData(index).toString()); + }); + QObject::connect(settings, &ApplicationSettings::translationChanged, + languageCombo, setComboByData); + + return layout; + } + + inline QHBoxLayout *EOLTypeView(ApplicationSettings *settings) + { + const auto eolCombo = new QComboBox; + eolCombo->addItem(QObject::tr("System default"), QString("")); + eolCombo->addItem(QObject::tr("Windows (CR LF)"), ScintillaNext::eolModeToString(SC_EOL_CRLF)); + eolCombo->addItem(QObject::tr("Unix (LF)"), ScintillaNext::eolModeToString(SC_EOL_LF)); + eolCombo->addItem(QObject::tr("Macintosh (CR)"), ScintillaNext::eolModeToString(SC_EOL_CR)); + + const auto wheelSuppressor = new WheelEventSuppressFilter(eolCombo); + wheelSuppressor->setupFor(eolCombo); + + const auto layout = new QHBoxLayout; + layout->addWidget(new QLabel(QObject::tr("Default line endings:"))); + layout->addWidget(eolCombo, 1); + layout->setContentsMargins(MARGINS_0); + layout->setSpacing(SPACING_3); + + const auto setComboByData = [eolCombo](const QString &data) { + const auto index = eolCombo->findData(data); + eolCombo->setCurrentIndex(index >= 0 ? index : 0); + }; + + setComboByData(settings->defaultEOLMode()); + + QObject::connect(eolCombo, QOverload::of(&QComboBox::currentIndexChanged), + settings, [settings, eolCombo](int index) { + settings->setDefaultEOLMode(eolCombo->itemData(index).toString()); + }); + QObject::connect(settings, &ApplicationSettings::defaultEOLModeChanged, + eolCombo, setComboByData); + + return layout; + } +} + +QWidget *BehaviorCategoryItem::contentView(ApplicationSettings *settings) const +{ + const auto widget = new QWidget; + const auto layout = new QVBoxLayout(widget); + + layout->addLayout(AppLanguageView(settings)); + layout->addWidget(PreviousSessionView(settings)); + layout->addWidget(DefaultFolderView(settings)); + layout->addLayout(EOLTypeView(settings)); + layout->addWidget(CreateCheckBox( + QObject::tr("Recenter find/replace dialog when opened"), + settings, + PREFERENCES_BIND_PROPERTY(centerSearchDialog, CenterSearchDialog) + )); + layout->addWidget(CreateCheckBox( + QObject::tr("Combine search results"), + settings, + PREFERENCES_BIND_PROPERTY(combineSearchResults, CombineSearchResults) + )); + layout->addWidget(CreateCheckBox( + QObject::tr("Exit on last tab closed"), + settings, + PREFERENCES_BIND_PROPERTY(exitOnLastTabClosed, ExitOnLastTabClosed) + )); + layout->addStretch(1); + layout->setContentsMargins(MARGINS_6); + layout->setSpacing(SPACING_6); + + return widget; +} diff --git a/src/dialogs/Preferences/BehaviorCategoryItem.h b/src/dialogs/Preferences/BehaviorCategoryItem.h new file mode 100644 index 000000000..3e9f6c10c --- /dev/null +++ b/src/dialogs/Preferences/BehaviorCategoryItem.h @@ -0,0 +1,17 @@ +#ifndef BEHAVIORCATEGORYITEM_H +#define BEHAVIORCATEGORYITEM_H + +#include "PreferencesCategoryItem.h" + +class BehaviorCategoryItem : public PreferencesCategoryItem +{ +public: + BehaviorCategoryItem() = default; + virtual ~BehaviorCategoryItem() = default; + + virtual QString title() const override { return QObject::tr("Behavior"); } + virtual QString iconPath() const override { return "://icons/audio-waveform.svg"; } + virtual QWidget *contentView(ApplicationSettings *settings) const override; +}; + +#endif // BEHAVIORCATEGORYITEM_H diff --git a/src/dialogs/Preferences/PreferencesCategoryItem.h b/src/dialogs/Preferences/PreferencesCategoryItem.h new file mode 100644 index 000000000..61bc5d777 --- /dev/null +++ b/src/dialogs/Preferences/PreferencesCategoryItem.h @@ -0,0 +1,20 @@ +#ifndef PREFERENCESCATEGORYITEM_H +#define PREFERENCESCATEGORYITEM_H + +#include + +class ApplicationSettings; + +class PreferencesCategoryItem +{ +public: + PreferencesCategoryItem() = default; + virtual ~PreferencesCategoryItem() = default; + + virtual QString title() const = 0; + virtual QString iconPath() const = 0; + /// @warning Caller becomes owner. + virtual QWidget *contentView(ApplicationSettings *settings) const = 0; +}; + +#endif // PREFERENCESCATEGORYITEM_H diff --git a/src/dialogs/Preferences/PreferencesCategoryItemT.h b/src/dialogs/Preferences/PreferencesCategoryItemT.h new file mode 100644 index 000000000..60fc3a52e --- /dev/null +++ b/src/dialogs/Preferences/PreferencesCategoryItemT.h @@ -0,0 +1,26 @@ +#ifndef PREFERENCESCATEGORYITEMT_H +#define PREFERENCESCATEGORYITEMT_H + +#include "PreferencesCategoryItem.h" + +template +class PreferencesCategoryItemT : public PreferencesCategoryItem +{ +public: + PreferencesCategoryItemT(const QString &title, const QString &icon) + : PreferencesCategoryItem(), mTitle(title), mIcon(icon) + { } + virtual ~PreferencesCategoryItemT() = default; + + inline virtual QString title() const override { return mTitle; } + inline virtual QString iconPath() const override { return mIcon; } + inline virtual T *contentView(ApplicationSettings *settings) const override { + return new T(settings); + } + +private: + QString mTitle; + QString mIcon; +}; + +#endif // PREFERENCESCATEGORYITEMT_H diff --git a/src/dialogs/Preferences/PreferencesCategoryListModel.cpp b/src/dialogs/Preferences/PreferencesCategoryListModel.cpp new file mode 100644 index 000000000..e63f87164 --- /dev/null +++ b/src/dialogs/Preferences/PreferencesCategoryListModel.cpp @@ -0,0 +1,64 @@ +#include "PreferencesCategoryListModel.h" + +namespace +{ + using ItemPtr = std::unique_ptr; + + constexpr unsigned int RowHeight = 32; +} + +PreferencesCategoryListModel::PreferencesCategoryListModel(QObject *parent) + : QAbstractListModel(parent) +{ + mItems.reserve(5); +} + +QVariant PreferencesCategoryListModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() >= mItems.size()) + return {}; + + const auto &item = mItems.at(index.row()); + + switch (role) + { + case Qt::DisplayRole: + return item->title(); + case Qt::DecorationRole: + return QIcon(item->iconPath()); + case Qt::SizeHintRole: + return QSize(0, RowHeight); + case Qt::TextAlignmentRole: + return Qt::AlignVCenter; + } + + return {}; +} + +void PreferencesCategoryListModel::addCategory(PreferencesCategoryItem *category, int row) +{ + if (row < 0 || row > mItems.size()) + row = mItems.size(); + + beginInsertRows(index(row), row, row + 1); + mItems.insert(mItems.cbegin() + row, std::move(ItemPtr(category))); + endInsertRows(); +} + +void PreferencesCategoryListModel::removeCategory(int row) +{ + if (row < 0 || row >= mItems.size()) + return; + + beginRemoveRows(index(row), row, row + 1); + mItems.erase(mItems.cbegin() + row); + endRemoveRows(); +} + +PreferencesCategoryItem *PreferencesCategoryListModel::category(int row) const +{ + if (row < 0 || row >= mItems.size()) + return nullptr; + + return mItems.at(row).get(); +} diff --git a/src/dialogs/Preferences/PreferencesCategoryListModel.h b/src/dialogs/Preferences/PreferencesCategoryListModel.h new file mode 100644 index 000000000..aab51889f --- /dev/null +++ b/src/dialogs/Preferences/PreferencesCategoryListModel.h @@ -0,0 +1,34 @@ +#ifndef PREFERENCESCATEGORYLISTMODEL_H +#define PREFERENCESCATEGORYLISTMODEL_H + +#include +#include + +#include "PreferencesCategoryItem.h" + +class PreferencesCategoryListModel : public QAbstractListModel +{ +public: + explicit PreferencesCategoryListModel(QObject *parent = nullptr); + virtual ~PreferencesCategoryListModel() = default; + + inline virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override { + return mItems.size(); + } + + virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + /** + * @param item Specific item. + * @param pos Item position. -1 will append to the end. + * @note takes ownership of the item. + */ + void addCategory(PreferencesCategoryItem *category, int row = -1); + void removeCategory(int row); + PreferencesCategoryItem *category(int row) const; + +private: + std::vector> mItems; +}; + +#endif // PREFERENCESCATEGORYLISTMODEL_H diff --git a/src/dialogs/Preferences/PreferencesViewUtils.h b/src/dialogs/Preferences/PreferencesViewUtils.h new file mode 100644 index 000000000..5810593bc --- /dev/null +++ b/src/dialogs/Preferences/PreferencesViewUtils.h @@ -0,0 +1,134 @@ +#ifndef PREFERENCESVIEWUTILS_H +#define PREFERENCESVIEWUTILS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define PREFERENCES_BIND_PROPERTY(name, Name) \ + &ApplicationSettings::name, \ + &ApplicationSettings::set##Name, \ + &ApplicationSettings::name##Changed + +namespace Preferences +{ + inline const QMargins MARGINS_0; + inline const QMargins MARGINS_6(6, 6, 6, 6); + + inline const int SPACING_0(0); + inline const int SPACING_3(3); + inline const int SPACING_6(6); + + class WheelEventSuppressFilter : public QObject + { + public: + explicit WheelEventSuppressFilter(QObject *parent = nullptr) + : QObject(parent) { } + + inline void setupFor(QWidget *widget) + { + widget->installEventFilter(this); + widget->setFocusPolicy(Qt::ClickFocus); + } + + inline virtual bool eventFilter(QObject *obj, QEvent *event) override + { + if (event->type() == QEvent::Wheel) + { + const auto widget = qobject_cast(obj); + if (widget && !widget->hasFocus()) + { + event->ignore(); + return true; + } + } + + return QObject::eventFilter(obj, event); + } + }; + + class RestartRequiredLabel : public QWidget + { + public: + RestartRequiredLabel(QWidget *parent = nullptr) + : QWidget(parent) + { + const auto iconSize = qApp->style()->pixelMetric(QStyle::PM_SmallIconSize); + + const auto icon = new QLabel; + icon->setPixmap( + qApp->style()->standardIcon( + QStyle::SP_MessageBoxInformation + ).pixmap(iconSize, iconSize) + ); + + mLabel = new QLabel(QObject::tr("Application restart required to apply changes.")); + mLabel->setWordWrap(true); + + auto infoFont = mLabel->font(); + infoFont.setPointSize(infoFont.pointSize() - 1); + infoFont.setItalic(true); + mLabel->setFont(infoFont); + + const auto layout = new QHBoxLayout(this); + layout->addWidget(icon, 0, Qt::AlignTop); + layout->addWidget(mLabel, 1); + layout->setContentsMargins(9, 0, 3, 6); + layout->setSpacing(SPACING_3); + } + + inline const QLabel *label() const { + return mLabel; + } + + private: + QLabel *mLabel = nullptr; + }; + +#if QT_CONFIG(completer) + inline QCompleter *FilesystemCompliter(QObject *parent, + Qt::CaseSensitivity caseSensivity = Qt::CaseInsensitive, + QCompleter::CompletionMode completionMode = QCompleter::InlineCompletion, + const QDir::Filters &filters = QDir::AllDirs | QDir::NoDotAndDotDot) + { + const auto fsModel = new QFileSystemModel(parent); + fsModel->setRootPath(""); + fsModel->setFilter(filters); + + const auto completer = new QCompleter(fsModel, parent); + completer->setCompletionMode(completionMode); + completer->setCaseSensitivity(caseSensivity); + + return completer; + } +#endif + + template + inline QCheckBox *CreateCheckBox(const QString &title, + ApplicationSettings *settings, + G getter, S setter, N notifier, + const QString &toolTip = QString()) + { + const auto checkBox = new QCheckBox(title); + + if (!toolTip.isEmpty()) + checkBox->setToolTip(toolTip); + + checkBox->setChecked(std::bind(getter, settings)()); + + QObject::connect(settings, notifier, checkBox, &QCheckBox::setChecked); + QObject::connect(checkBox, &QCheckBox::toggled, settings, setter); + + return checkBox; + } +} + +#endif // PREFERENCESVIEWUTILS_H diff --git a/src/dialogs/PreferencesDialog.cpp b/src/dialogs/PreferencesDialog.cpp index 54296f482..24c0be238 100644 --- a/src/dialogs/PreferencesDialog.cpp +++ b/src/dialogs/PreferencesDialog.cpp @@ -1,200 +1,239 @@ -/* - * This file is part of Notepad Next. - * Copyright 2019 Justin Dailey - * - * Notepad Next is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Notepad Next is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Notepad Next. If not, see . - */ - - -#include "PreferencesDialog.h" -#include "NotepadNextApplication.h" -#include "TranslationManager.h" -#include "ui_PreferencesDialog.h" -#include "ScintillaNext.h" - -#include -#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Preferences/PreferencesCategoryListModel.h" +#include "Preferences/AppearanceCategoryItem.h" +#include "Preferences/BehaviorCategoryItem.h" +#include "PreferencesDialog.h" +#include "ApplicationSettings.h" -PreferencesDialog::PreferencesDialog(ApplicationSettings *settings, QWidget *parent) : - QDialog(parent, Qt::Tool), - ui(new Ui::PreferencesDialog), - settings(settings) +namespace { - ui->setupUi(this); - - QIcon icon = style()->standardIcon(QStyle::SP_MessageBoxInformation); - QPixmap pixmap = icon.pixmap(QSize(16, 16)); - ui->labelAppRestartIcon->setPixmap(pixmap); - ui->labelAppRestartIcon->hide(); - ui->labelAppRestart->hide(); - - MapSettingToCheckBox(ui->checkBoxMenuBar, &ApplicationSettings::showMenuBar, &ApplicationSettings::setShowMenuBar, &ApplicationSettings::showMenuBarChanged); - MapSettingToCheckBox(ui->checkBoxToolBar, &ApplicationSettings::showToolBar, &ApplicationSettings::setShowToolBar, &ApplicationSettings::showToolBarChanged); - MapSettingToCheckBox(ui->checkBoxStatusBar, &ApplicationSettings::showStatusBar, &ApplicationSettings::setShowStatusBar, &ApplicationSettings::showStatusBarChanged); - MapSettingToCheckBox(ui->checkBoxRecenterSearchDialog, &ApplicationSettings::centerSearchDialog, &ApplicationSettings::setCenterSearchDialog, &ApplicationSettings::centerSearchDialogChanged); - - MapSettingToGroupBox(ui->gbxRestorePreviousSession, &ApplicationSettings::restorePreviousSession, &ApplicationSettings::setRestorePreviousSession, &ApplicationSettings::restorePreviousSessionChanged); - connect(ui->gbxRestorePreviousSession, &QGroupBox::toggled, this, [=](bool checked) { - if (!checked) { - ui->checkBoxUnsavedFiles->setChecked(false); - ui->checkBoxRestoreTempFiles->setChecked(false); - } - else { - QMessageBox::warning(this, tr("Warning"), tr("This feature is experimental and it should not be considered safe for critically important work. It may lead to possible data loss. Use at your own risk.")); - } - }); - - MapSettingToCheckBox(ui->checkBoxUnsavedFiles, &ApplicationSettings::restoreUnsavedFiles, &ApplicationSettings::setRestoreUnsavedFiles, &ApplicationSettings::restoreUnsavedFilesChanged); - MapSettingToCheckBox(ui->checkBoxRestoreTempFiles, &ApplicationSettings::restoreTempFiles, &ApplicationSettings::setRestoreTempFiles, &ApplicationSettings::restoreTempFilesChanged); - - MapSettingToCheckBox(ui->checkBoxCombineSearchResults, &ApplicationSettings::combineSearchResults, &ApplicationSettings::setCombineSearchResults, &ApplicationSettings::combineSearchResultsChanged); - - populateTranslationComboBox(); - connect(ui->comboBoxTranslation, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index) { - settings->setTranslation(ui->comboBoxTranslation->itemData(index).toString()); - showApplicationRestartRequired(); - }); - - MapSettingToCheckBox(ui->checkBoxExitOnLastTabClosed, &ApplicationSettings::exitOnLastTabClosed, &ApplicationSettings::setExitOnLastTabClosed, &ApplicationSettings::exitOnLastTabClosedChanged); + using ListModel = PreferencesCategoryListModel; - ui->fcbDefaultFont->setCurrentFont(QFont(settings->fontName())); - connect(ui->fcbDefaultFont, &QFontComboBox::currentFontChanged, this, [=](const QFont &f) { - settings->setFontName(f.family()); - }); - connect(settings, &ApplicationSettings::fontNameChanged, this, [=](QString fontName){ - ui->fcbDefaultFont->setCurrentFont(QFont(fontName)); - }); - - ui->spbDefaultFontSize->setValue(settings->fontSize()); - connect(ui->spbDefaultFontSize, QOverload::of(&QSpinBox::valueChanged), settings, &ApplicationSettings::setFontSize); - connect(settings, &ApplicationSettings::fontSizeChanged, ui->spbDefaultFontSize, &QSpinBox::setValue); + inline QFont ContentTitleFont() noexcept + { + auto font = QApplication::font("QLabel"); + font.setPointSize(16); + font.setBold(true); + return font; + } +} - ui->comboBoxLineEndings->addItem(tr("System Default"), QString("")); - ui->comboBoxLineEndings->addItem(tr("Windows (CR LF)"), ScintillaNext::eolModeToString(SC_EOL_CRLF)); - ui->comboBoxLineEndings->addItem(tr("Linux (LF)"), ScintillaNext::eolModeToString(SC_EOL_LF)); - ui->comboBoxLineEndings->addItem(tr("Macintosh (CR)"), ScintillaNext::eolModeToString(SC_EOL_CR)); +struct PreferencesDialog::PreferencesDialogPrivate +{ +public: + inline bool hasUnsavedChanges() const { + return (settings.backup) ? !settings.actual->isEquals(settings.backup) : false; + } + inline void makeSettingsBackup() { + if (settings.backup) settings.backup->fillFrom(settings.actual); + } + inline void makeSettingsRestore() { + if (settings.backup) settings.actual->fillFrom(settings.backup); + } + inline void makeSettingsReset() const + { + std::unique_ptr tempSettings(createTemporarySettings(nullptr)); + if (tempSettings) settings.actual->fillFrom(tempSettings.get()); + } - // Select the current one - int index = ui->comboBoxLineEndings->findData(settings->defaultEOLMode()); - ui->comboBoxLineEndings->setCurrentIndex(index == -1 ? 0 : index); + inline ApplicationSettings *createTemporarySettings(QObject *parent) const + { + auto tempFile = std::make_unique(); - connect(ui->comboBoxLineEndings, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index) { - settings->setDefaultEOLMode(ui->comboBoxLineEndings->itemData(index).toString()); - }); - connect(settings, &ApplicationSettings::defaultEOLModeChanged, this, [=](QString defaultEOLMode) { - int index = ui->comboBoxLineEndings->findData(defaultEOLMode); - ui->comboBoxLineEndings->setCurrentIndex(index == -1 ? 0 : index); - }); + if (!tempFile->open()) + { + qWarning() << "Unable to create temporary file:" + << tempFile->errorString(); + return nullptr; + } - MapSettingToCheckBox(ui->checkBoxHighlightURLs, &ApplicationSettings::urlHighlighting, &ApplicationSettings::setURLHighlighting, &ApplicationSettings::urlHighlightingChanged); - MapSettingToCheckBox(ui->checkBoxShowLineNumbers, &ApplicationSettings::showLineNumbers, &ApplicationSettings::setShowLineNumbers, &ApplicationSettings::showLineNumbersChanged); + return new ApplicationSettings(tempFile.release(), parent); + } +public: /* Logic */ + struct { + /// @brief Actual settings populated in-app. + ApplicationSettings *actual = nullptr; + /// @brief Settings backup on latest show event. + ApplicationSettings *backup = nullptr; + } settings; - QButtonGroup *buttonGroup = new QButtonGroup(this); - buttonGroup->addButton(ui->radioFollowCurrentDirectory, ApplicationSettings::FollowCurrentDocument); - buttonGroup->addButton(ui->radioLastUsedDirectory, ApplicationSettings::RememberLastUsed); - buttonGroup->addButton(ui->radioHardCoded, ApplicationSettings::HardCoded); +public: /* View */ + QGridLayout *mainLayout = nullptr; - connect(buttonGroup, &QButtonGroup::idClicked, this, [=](int id) { - ApplicationSettings::DefaultDirectoryBehaviorEnum e = static_cast(id); - settings->setDefaultDirectoryBehavior(e); - }); + struct { + QListView *listView = nullptr; + ListModel *model = nullptr; + } category; - connect(ui->radioHardCoded, &QRadioButton::toggled, this, [=](bool checked){ - ui->btnSelectHardCodedPath->setEnabled(checked); - ui->txtHardCodedPath->setEnabled(checked); - }); + struct { + QWidget *widget = nullptr; + QVBoxLayout *layout = nullptr; - connect(ui->btnSelectHardCodedPath, &QToolButton::clicked, this, [=]() { - QString dir = QFileDialog::getExistingDirectory(this, tr("Default Directory")); - if (dir.isEmpty()) return; // user cancelled + QLabel *title = nullptr; + QScrollArea *viewport = nullptr; + } content; - settings->setDefaultDirectory(QDir::fromNativeSeparators(dir)); - ui->txtHardCodedPath->setText(QDir::toNativeSeparators(dir)); - }); + QDialogButtonBox *controlsBox = nullptr; +}; - connect(ui->txtHardCodedPath, &QLineEdit::editingFinished, this, [=]() { - QString dir = ui->txtHardCodedPath->text(); - settings->setDefaultDirectory(QDir::fromNativeSeparators(dir)); - ui->txtHardCodedPath->setText(QDir::toNativeSeparators(dir)); +PreferencesDialog::PreferencesDialog(ApplicationSettings *settings, QWidget *parent) + : QDialog(parent, Qt::Tool), + p(new PreferencesDialogPrivate) +{ + setWindowTitle(tr("Preferences")); + + p->settings.actual = settings; + p->settings.backup = p->createTemporarySettings(this); + + // Category + p->category.listView = new QListView; + p->category.listView->setFixedWidth(180); + + p->category.model = new ListModel(p->category.listView); + p->category.model->addCategory(new BehaviorCategoryItem); + p->category.model->addCategory(new AppearanceCategoryItem); + + p->category.listView->setModel(p->category.model); + + // Content + p->content.title = new QLabel; + p->content.title->setFont(ContentTitleFont()); + + p->content.viewport = new QScrollArea; + + p->content.widget = new QWidget; + p->content.widget->setSizePolicy( + QSizePolicy::Expanding, + QSizePolicy::Expanding + ); + + p->content.layout = new QVBoxLayout(p->content.widget); + p->content.layout->setContentsMargins(0, 0, 0, 0); + p->content.layout->addWidget(p->content.title); + p->content.layout->addWidget(p->content.viewport); + + // Controls + p->controlsBox = new QDialogButtonBox(Qt::Horizontal); + p->controlsBox->setStandardButtons( + QDialogButtonBox::RestoreDefaults + | QDialogButtonBox::Ok + | QDialogButtonBox::Cancel + ); + + // Main assembly + p->mainLayout = new QGridLayout(this); + p->mainLayout->addWidget(p->category.listView, 0, 0, 2, 1); + p->mainLayout->addWidget(p->content.widget, 0, 1); + p->mainLayout->addWidget(p->controlsBox, 1, 1); + + connect(p->category.listView->selectionModel(), &QItemSelectionModel::currentRowChanged, + this, &PreferencesDialog::onCategoryChanged); + + connect(p->controlsBox, &QDialogButtonBox::clicked, + this, [this](QAbstractButton *button) { + switch (p->controlsBox->buttonRole(button)) + { + case QDialogButtonBox::ResetRole: onResetClicked(); break; + case QDialogButtonBox::AcceptRole: onOkClicked(); break; + case QDialogButtonBox::RejectRole: onCancelClicked(); break; + default: break; + } }); - if (auto b = buttonGroup->button(settings->defaultDirectoryBehavior())) { - b->setChecked(true); - } - - if (settings->defaultDirectoryBehavior() == ApplicationSettings::HardCoded) { - ui->txtHardCodedPath->setText((QDir::toNativeSeparators(settings->defaultDirectory()))); - } - else { - ui->txtHardCodedPath->setText(QString()); - } + // Force switch to first category + QMetaObject::invokeMethod(this, [this](){ + p->category.listView->setCurrentIndex(p->category.model->index(0)); + }, Qt::QueuedConnection); } PreferencesDialog::~PreferencesDialog() { - delete ui; + delete p; } -void PreferencesDialog::showApplicationRestartRequired() const +void PreferencesDialog::showEvent(QShowEvent *event) { - ui->labelAppRestartIcon->show(); - ui->labelAppRestart->show(); + p->makeSettingsBackup(); + QDialog::showEvent(event); } -template -void PreferencesDialog::MapSettingToCheckBox(QCheckBox *checkBox, Func1 getter, Func2 setter, Func3 notifier) const +void PreferencesDialog::closeEvent(QCloseEvent *event) { - // Get the value and set the checkbox state - checkBox->setChecked(std::bind(getter, settings)()); + if (isVisible() && p->hasUnsavedChanges()) + { + const auto reply = QMessageBox::question( + this, + tr("Unsaved сhanges"), + tr("You have unsaved changes.\n" + "Do you want to save them before closing?"), + QMessageBox::Save + | QMessageBox::Discard + | QMessageBox::Cancel + ); + + switch (reply) + { + case QMessageBox::Cancel: + event->ignore(); + return; + case QMessageBox::Discard: + p->makeSettingsRestore(); + [[fallthrough]]; + case QMessageBox::Save: + p->settings.actual->sync(); + break; + default: + break; + } + } - // Set up two way connection - connect(settings, notifier, checkBox, &QCheckBox::setChecked); - connect(checkBox, &QCheckBox::toggled, settings, setter); + QDialog::closeEvent(event); } -template -void PreferencesDialog::MapSettingToGroupBox(QGroupBox *groupBox, Func1 getter, Func2 setter, Func3 notifier) const +void PreferencesDialog::onCategoryChanged(const QModelIndex &index) { - // Get the value and set the checkbox state - groupBox->setChecked(std::bind(getter, settings)()); + if (!index.isValid()) return; - // Set up two way connection - connect(settings, notifier, groupBox, &QGroupBox::setChecked); - connect(groupBox, &QGroupBox::toggled, settings, setter); + const auto item = p->category.model->category(index.row()); + if (!item) return; + + p->content.title->setText(item->title()); + p->content.viewport->setWidget(item->contentView(p->settings.actual)); + p->content.viewport->widget()->setSizePolicy( + QSizePolicy::Expanding, QSizePolicy::Expanding + ); + p->content.viewport->setWidgetResizable(true); } -void PreferencesDialog::populateTranslationComboBox() +void PreferencesDialog::onOkClicked() { - NotepadNextApplication *app = qobject_cast(qApp); - - // Add the system default at the top - ui->comboBoxTranslation->addItem(tr(""), QStringLiteral("")); + p->settings.actual->sync(); + accept(); +} - // TODO: sort this list and keep the system default at the top - for (const auto &localeName : app->getTranslationManager()->availableTranslations()) - { - QLocale locale(localeName); - const QString localeDisplay = TranslationManager::FormatLocaleTerritoryAndLanguage(locale); - ui->comboBoxTranslation->addItem(localeDisplay, localeName); - } +void PreferencesDialog::onCancelClicked() +{ + close(); +} - // Select the current one - int index = ui->comboBoxTranslation->findData(settings->translation()); - if (index != -1) { - ui->comboBoxTranslation->setCurrentIndex(index); - } +void PreferencesDialog::onResetClicked() +{ + p->makeSettingsReset(); } diff --git a/src/dialogs/PreferencesDialog.h b/src/dialogs/PreferencesDialog.h index 985a9b8b4..09b0c9926 100644 --- a/src/dialogs/PreferencesDialog.h +++ b/src/dialogs/PreferencesDialog.h @@ -1,58 +1,31 @@ -/* - * This file is part of Notepad Next. - * Copyright 2019 Justin Dailey - * - * Notepad Next is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Notepad Next is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Notepad Next. If not, see . - */ - - #ifndef PREFERENCESDIALOG_H #define PREFERENCESDIALOG_H -#include "ApplicationSettings.h" - #include -#include -#include - -namespace Ui { -class PreferencesDialog; -} -class Settings; +class ApplicationSettings; class PreferencesDialog : public QDialog { Q_OBJECT - public: - PreferencesDialog(ApplicationSettings *settings, QWidget *parent = 0); - ~PreferencesDialog(); - - void showApplicationRestartRequired() const; + PreferencesDialog(ApplicationSettings *settings, QWidget *parent = nullptr); + virtual ~PreferencesDialog(); -private: - Ui::PreferencesDialog *ui; - ApplicationSettings *settings; +protected: + virtual void showEvent(QShowEvent *event) override; + virtual void closeEvent(QCloseEvent *event) override; - template - void MapSettingToCheckBox(QCheckBox *checkBox, Func1 getter, Func2 setter, Func3 notifier) const; +private slots: + void onCategoryChanged(const QModelIndex &index); - template - void MapSettingToGroupBox(QGroupBox *groupBox, Func1 getter, Func2 setter, Func3 notifier) const; + void onOkClicked(); + void onCancelClicked(); + void onResetClicked(); - void populateTranslationComboBox(); +private: + struct PreferencesDialogPrivate; + PreferencesDialogPrivate *p; }; #endif // PREFERENCESDIALOG_H diff --git a/src/dialogs/PreferencesDialog.ui b/src/dialogs/PreferencesDialog.ui deleted file mode 100644 index 2d98c2230..000000000 --- a/src/dialogs/PreferencesDialog.ui +++ /dev/null @@ -1,342 +0,0 @@ - - - PreferencesDialog - - - - 0 - 0 - 803 - 597 - - - - Preferences - - - - - - true - - - - - 0 - -99 - 769 - 644 - - - - - - - - - Show menu bar - - - - - - - Show toolbar - - - - - - - Show status bar - - - - - - - Restore previous session - - - true - - - false - - - - - - Unsaved changes - - - - - - - Temporary files - - - - - - - - - - - - Recenter find/replace dialog when opened - - - - - - - Combine search results - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - - Translation: - - - - - - - - - Exit on last tab closed - - - - - - - - - Default Font - - - - - - Font - - - - - - - - - - Font Size - - - - - - - pt - - - 2 - - - 48 - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Default Line Endings - - - - - - - - - - - - Highlight URLs - - - - - - - Show Line Numbers - - - - - - - Default Directory - - - - - - Follow Current Document - - - - - - - Last Used Directory - - - - - - - - - - - - - - - - - - - ... - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - TextLabel - - - - - - - - true - - - - An application restart is required to apply certain settings. - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Ok - - - - - - - - - - - buttonBox - accepted() - PreferencesDialog - accept() - - - 792 - 586 - - - 157 - 274 - - - - - buttonBox - rejected() - PreferencesDialog - reject() - - - 792 - 586 - - - 286 - 274 - - - - - diff --git a/src/icons/audio-waveform.svg b/src/icons/audio-waveform.svg new file mode 100644 index 000000000..17d3bb76b --- /dev/null +++ b/src/icons/audio-waveform.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/paintbrush.svg b/src/icons/paintbrush.svg new file mode 100644 index 000000000..078adf1da --- /dev/null +++ b/src/icons/paintbrush.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/resources.qrc b/src/resources.qrc index d373be086..1b1192573 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -42,5 +42,7 @@ icons/application_osx_terminal.png icons/folder_go.png icons/wrapindicator.png + icons/audio-waveform.svg + icons/paintbrush.svg