feat: v0.12.0 —— 顶部工具栏、最近目录、统一配置文件

- 顶部工具栏:新建 / 打开 / 保存,以及「最近文件」「最近目录」下拉菜单
- 文件菜单同样拆成「最近文件」「最近目录」两个子菜单,各记 8 条、可分别清空
- 启动时自动打开上次编辑的文件,文件不存在则显示欢迎文档
- 所有设置改用 AppConfig 单例写进同一个 config.ini;关于对话框显示其路径
- 修掉编辑器一创建就被标成「已修改」的问题(setDocumentMargin 的副作用),
  否则恢复上次文件时会误弹保存提示
- 工具栏加了配套的 QSS 与中英文翻译,截图更新到 0.12.0
This commit is contained in:
2026-10-23 11:25:46 +08:00
parent 09e8f13901
commit 505063a2e7
14 changed files with 444 additions and 222 deletions
+23 -3
View File
@@ -2,10 +2,13 @@
一个轻量的跨平台 Markdown 编辑器,基于 **Qt 5 / C++17** 构建。
当前版本 **0.11.0**。
当前版本 **0.12.0**。
## 界面
窗口从上到下依次是菜单栏、工具栏、侧栏 + 编辑区、状态栏。工具栏固定放
**新建 / 打开 / 保存**,以及 **最近文件**、**最近目录** 两个下拉菜单。
| 浅色 · 编辑模式 | 深色 · 编辑模式 |
| --- | --- |
| ![浅色主题](docs/screenshot-light.png) | ![深色主题](docs/screenshot-dark.png) |
@@ -121,11 +124,27 @@ Windows / macOS 保留系统原生对话框。
### 文件
- 新建、打开、保存、另存为、最近打开(最多 8 条)
- 新建、打开、保存、另存为
- **最近文件** / **最近目录**:各记 8 条,文件菜单和工具栏上的下拉菜单都能打开,
两个列表可以分别清空
- **启动时自动打开上次编辑的文件**;文件已经被删掉就退回欢迎文档
- 保留原文件的 **BOM** 与 **CRLF** 换行风格,保存时原子写入(`QSaveFile`)
- 关闭或切换文件时提示未保存的修改
- 记忆窗口位置、字号、换行开关、侧栏状态等设置
### 配置文件
所有设置都写进同一个 INI 文件,换机器时把它拷过去就行:
| 平台 | 路径 |
| --- | --- |
| Windows | `%LOCALAPPDATA%\VoiletMark\VoiletMark\config.ini` |
| Linux | `~/.config/VoiletMark/VoiletMark/config.ini` |
| macOS | `~/Library/Preferences/VoiletMark/VoiletMark/config.ini` |
确切路径也显示在 **帮助 → 关于 VoiletMark** 里。文件里记着主题、语言、字号、
自动换行、侧栏状态、最近文件 / 最近目录、上次打开的文件和上次的文件夹。
### 主题
四种模式:
@@ -236,7 +255,8 @@ src/
├── main.cpp 入口:命令行解析、Fusion 样式、主题 / 语言初始化
├── ThemeManager.{h,cpp} 四种主题模式 + 系统检测 + 调色板 / QSS 生成
├── LanguageManager.{h,cpp} 中英文切换
├── MainWindow.{h,cpp} 菜单、文件读写、侧栏、Git 工具栏、状态栏、设置
├── AppConfig.{h,cpp} 所有设置共用的 config.ini
├── MainWindow.{h,cpp} 菜单、工具栏、文件读写、侧栏、Git 工具栏、状态栏、设置
├── MarkdownEditor.{h,cpp} 编辑器控件:行号、缩进、代码框装饰、源码模式
├── MarkdownHighlighter.{h,cpp} Markdown 着色与就地渲染
├── CodeHighlight.{h,cpp} 多语言语法高亮 tokenizer
+3 -1
View File
@@ -1,6 +1,6 @@
TEMPLATE = app
TARGET = VoiletMark
VERSION = 0.11.0
VERSION = 0.12.0
QT += core gui widgets
@@ -23,6 +23,7 @@ SOURCES += \
src/MarkdownEditor.cpp \
src/MarkdownHighlighter.cpp \
src/MarkdownRenderer.cpp \
src/AppConfig.cpp \
src/CodeHighlight.cpp \
src/GitRunner.cpp \
src/LanguageManager.cpp \
@@ -33,6 +34,7 @@ HEADERS += \
src/MarkdownEditor.h \
src/MarkdownHighlighter.h \
src/MarkdownRenderer.h \
src/AppConfig.h \
src/CodeHighlight.h \
src/GitRunner.h \
src/LanguageManager.h \
Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 112 KiB

+34
View File
@@ -0,0 +1,34 @@
#include "AppConfig.h"
#include <QDir>
#include <QFileInfo>
#include <QStandardPaths>
namespace {
QString configFilePath()
{
const QString directory = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
return QDir(directory).filePath(QStringLiteral("config.ini"));
}
} // namespace
QString AppConfig::filePath()
{
return configFilePath();
}
QSettings &AppConfig::settings()
{
static QSettings *instance = nullptr;
if (!instance) {
const QString path = configFilePath();
QDir().mkpath(QFileInfo(path).absolutePath());
instance = new QSettings(path, QSettings::IniFormat);
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
instance->setIniCodec("UTF-8");
#endif
}
return *instance;
}
+17
View File
@@ -0,0 +1,17 @@
#pragma once
#include <QSettings>
#include <QString>
/// 统一的应用配置:所有设置写进同一个 INI 文件,
/// 而不是散落在系统注册表 / 各自的配置目录里。
///
/// Linux: ~/.config/VoiletMark/VoiletMark/config.ini
/// Windows: %LOCALAPPDATA%/VoiletMark/VoiletMark/config.ini
/// macOS: ~/Library/Preferences/VoiletMark/VoiletMark/config.ini
namespace AppConfig {
QSettings &settings();
QString filePath();
} // namespace AppConfig
+4 -2
View File
@@ -5,6 +5,8 @@
#include <QSettings>
#include <QTranslator>
#include "AppConfig.h"
LanguageManager *LanguageManager::instance()
{
static LanguageManager *manager = new LanguageManager();
@@ -30,7 +32,7 @@ QString LanguageManager::displayName(const QString &code)
void LanguageManager::initialize()
{
QSettings settings;
QSettings &settings = AppConfig::settings();
QString code = settings.value(QStringLiteral("ui/language")).toString();
if (!availableLanguages().contains(code)) {
code = QLocale::system().language() == QLocale::English
@@ -77,6 +79,6 @@ void LanguageManager::setLanguage(const QString &code)
}
m_language = normalized;
QSettings().setValue(QStringLiteral("ui/language"), m_language);
AppConfig::settings().setValue(QStringLiteral("ui/language"), m_language);
emit languageChanged();
}
+129 -25
View File
@@ -1,5 +1,6 @@
#include "MainWindow.h"
#include "AppConfig.h"
#include "GitRunner.h"
#include "LanguageManager.h"
#include "MarkdownEditor.h"
@@ -43,6 +44,7 @@
#include <QTextCursor>
#include <QTextDocument>
#include <QTimer>
#include <QToolBar>
#include <QToolButton>
#include <QVBoxLayout>
#include <QWidget>
@@ -176,8 +178,9 @@ MainWindow::MainWindow(QWidget *parent)
connect(m_git, &GitRunner::finished, this, &MainWindow::onGitFinished);
createActions();
createSidebar();
createMenus();
createToolBar();
createSidebar();
createStatusBar();
loadSettings();
refreshRecentMenu();
@@ -193,12 +196,51 @@ MainWindow::MainWindow(QWidget *parent)
connect(LanguageManager::instance(), &LanguageManager::languageChanged,
this, &MainWindow::retranslateUi);
showWelcomeDocument();
// 恢复上次打开的文件;没有记录或文件已不存在时显示欢迎文档
const QString lastFile =
AppConfig::settings().value(QStringLiteral("session/lastFile")).toString();
if (!lastFile.isEmpty() && QFileInfo::exists(lastFile)) {
openPath(lastFile);
} else {
showWelcomeDocument();
}
updateEditActionStates();
updateStatusBar();
m_editor->setFocus();
}
void MainWindow::createToolBar()
{
m_toolBar = addToolBar(tr("常用"));
m_toolBar->setObjectName(QStringLiteral("mainToolBar"));
m_toolBar->setMovable(false);
m_toolBar->setToolButtonStyle(Qt::ToolButtonTextOnly);
m_toolBar->setIconSize(QSize(16, 16));
m_toolBar->addAction(m_newAction);
m_toolBar->addAction(m_openAction);
m_toolBar->addAction(m_saveAction);
m_toolBar->addSeparator();
const auto makeMenuButton = [this](const QString &text, QMenu **target) {
QToolButton *button = new QToolButton(m_toolBar);
button->setText(text);
button->setPopupMode(QToolButton::InstantPopup);
button->setToolButtonStyle(Qt::ToolButtonTextOnly);
button->setCursor(Qt::PointingHandCursor);
QMenu *menu = new QMenu(button);
button->setMenu(menu);
m_toolBar->addWidget(button);
*target = menu;
return button;
};
m_toolRecentFilesButton = makeMenuButton(tr("最近文件"), &m_toolRecentFilesMenu);
m_toolRecentFoldersButton = makeMenuButton(tr("最近目录"), &m_toolRecentFoldersMenu);
}
void MainWindow::createActions()
{
m_newAction = new QAction(tr("新建"), this);
@@ -286,7 +328,7 @@ void MainWindow::createActions()
const QSignalBlocker blocker(m_sidebarButton);
m_sidebarButton->setChecked(visible);
}
QSettings().setValue(QStringLiteral("window/sidebarVisible"), visible);
AppConfig::settings().setValue(QStringLiteral("window/sidebarVisible"), visible);
});
m_sourceModeAction = new QAction(tr("源代码模式"), this);
@@ -443,7 +485,8 @@ void MainWindow::createMenus()
m_fileMenu->addAction(m_newAction);
m_fileMenu->addAction(m_openAction);
m_fileMenu->addAction(m_openFolderAction);
m_recentMenu = m_fileMenu->addMenu(tr("最近打开"));
m_recentMenu = m_fileMenu->addMenu(tr("最近文件"));
m_recentFolderMenu = m_fileMenu->addMenu(tr("最近目录"));
m_fileMenu->addSeparator();
m_fileMenu->addAction(m_saveAction);
m_fileMenu->addAction(m_saveAsAction);
@@ -556,7 +599,7 @@ void MainWindow::createStatusBar()
void MainWindow::loadSettings()
{
QSettings settings;
QSettings &settings = AppConfig::settings();
const QByteArray geometry = settings.value(QStringLiteral("window/geometry")).toByteArray();
if (!geometry.isEmpty())
@@ -604,7 +647,7 @@ void MainWindow::loadSettings()
void MainWindow::saveSettings()
{
QSettings settings;
QSettings &settings = AppConfig::settings();
settings.setValue(QStringLiteral("window/geometry"), saveGeometry());
settings.setValue(QStringLiteral("editor/fontSize"), m_editor->editorFontPointSize());
settings.setValue(QStringLiteral("editor/wordWrap"), m_wrapAction->isChecked());
@@ -612,6 +655,7 @@ void MainWindow::saveSettings()
settings.setValue(QStringLiteral("files/recent"), m_recentFiles);
settings.setValue(QStringLiteral("files/folder"), m_folderPath);
settings.setValue(QStringLiteral("window/sidebarVisible"), m_sidebar->isVisible());
settings.sync();
}
void MainWindow::closeEvent(QCloseEvent *event)
@@ -882,6 +926,7 @@ bool MainWindow::maybeSave()
void MainWindow::setCurrentFile(const QString &path)
{
m_currentPath = path;
AppConfig::settings().setValue(QStringLiteral("session/lastFile"), path);
if (!path.isEmpty()) {
m_lastDirectory = QFileInfo(path).absolutePath();
setWindowFilePath(path);
@@ -926,7 +971,7 @@ void MainWindow::changeZoom(int direction)
const int size = (direction == 0) ? kDefaultFontSize
: m_editor->editorFontPointSize() + direction;
m_editor->setEditorFontPointSize(size);
QSettings().setValue(QStringLiteral("editor/fontSize"), m_editor->editorFontPointSize());
AppConfig::settings().setValue(QStringLiteral("editor/fontSize"), m_editor->editorFontPointSize());
}
void MainWindow::resetZoom()
@@ -937,7 +982,7 @@ void MainWindow::resetZoom()
void MainWindow::setWordWrapEnabled(bool enabled)
{
m_editor->setLineWrapMode(enabled ? QPlainTextEdit::WidgetWidth : QPlainTextEdit::NoWrap);
QSettings().setValue(QStringLiteral("editor/wordWrap"), enabled);
AppConfig::settings().setValue(QStringLiteral("editor/wordWrap"), enabled);
}
void MainWindow::applyThemeMode(int mode)
@@ -957,7 +1002,14 @@ void MainWindow::retranslateUi()
m_viewMenu->setTitle(tr("视图"));
m_formatMenu->setTitle(tr("格式"));
m_helpMenu->setTitle(tr("帮助"));
m_recentMenu->setTitle(tr("最近打开"));
m_recentMenu->setTitle(tr("最近文件"));
m_recentFolderMenu->setTitle(tr("最近目录"));
if (m_toolBar)
m_toolBar->setWindowTitle(tr("常用"));
if (m_toolRecentFilesButton)
m_toolRecentFilesButton->setText(tr("最近文件"));
if (m_toolRecentFoldersButton)
m_toolRecentFoldersButton->setText(tr("最近目录"));
m_themeMenu->setTitle(tr("主题"));
m_headingMenu->setTitle(tr("标题"));
m_languageMenu->setTitle(tr("语言"));
@@ -1008,7 +1060,7 @@ void MainWindow::retranslateUi()
m_languageChineseAction->setChecked(language == QLatin1String("zh_CN"));
m_languageEnglishAction->setChecked(language == QLatin1String("en"));
// 侧栏、最近打开、欢迎文档都跟着换
// 侧栏、最近文件、欢迎文档都跟着换
m_displayedFolder.clear();
refreshRecentMenu();
refreshFolder();
@@ -1034,6 +1086,8 @@ void MainWindow::showAbout()
"<p>基于 Qt %2 与 C++17 构建。</p>")
.arg(QCoreApplication::applicationVersion(),
QString::fromLatin1(qVersion())));
box.setInformativeText(
tr("配置文件:%1").arg(QDir::toNativeSeparators(AppConfig::filePath())));
box.setStandardButtons(QMessageBox::Ok);
box.exec();
}
@@ -1045,45 +1099,94 @@ void MainWindow::addRecentFile(const QString &path)
m_recentFiles.prepend(absolutePath);
while (m_recentFiles.size() > kMaxRecentFiles)
m_recentFiles.removeLast();
AppConfig::settings().setValue(QStringLiteral("files/recent"), m_recentFiles);
refreshRecentMenu();
QSettings().setValue(QStringLiteral("files/recent"), m_recentFiles);
}
void MainWindow::loadRecentFiles()
{
m_recentFiles = QSettings().value(QStringLiteral("files/recent")).toStringList();
m_recentFiles = AppConfig::settings().value(QStringLiteral("files/recent")).toStringList();
m_recentFiles.removeDuplicates();
while (m_recentFiles.size() > kMaxRecentFiles)
m_recentFiles.removeLast();
m_recentFolders =
AppConfig::settings().value(QStringLiteral("files/recentFolders")).toStringList();
m_recentFolders.removeDuplicates();
while (m_recentFolders.size() > kMaxRecentFiles)
m_recentFolders.removeLast();
}
void MainWindow::refreshRecentMenu()
{
if (!m_recentMenu)
fillRecentFilesMenu(m_recentMenu);
fillRecentFilesMenu(m_toolRecentFilesMenu);
fillRecentFoldersMenu(m_recentFolderMenu);
fillRecentFoldersMenu(m_toolRecentFoldersMenu);
}
void MainWindow::fillRecentFilesMenu(QMenu *menu)
{
if (!menu)
return;
m_recentMenu->clear();
menu->clear();
if (m_recentFiles.isEmpty()) {
QAction *empty = m_recentMenu->addAction(tr("(暂无记录)"));
QAction *empty = menu->addAction(tr("(暂无记录)"));
empty->setEnabled(false);
return;
}
for (const QString &path : m_recentFiles) {
QAction *action = m_recentMenu->addAction(QDir::toNativeSeparators(path));
QAction *action = menu->addAction(QDir::toNativeSeparators(path));
action->setToolTip(path);
connect(action, &QAction::triggered, this, [this, path] {
openPath(path);
});
connect(action, &QAction::triggered, this, [this, path] { openPath(path); });
}
m_recentMenu->addSeparator();
m_recentMenu->addAction(tr("清空列表"), this, [this] {
menu->addSeparator();
menu->addAction(tr("清空列表"), this, [this] {
m_recentFiles.clear();
QSettings().setValue(QStringLiteral("files/recent"), m_recentFiles);
AppConfig::settings().setValue(QStringLiteral("files/recent"), m_recentFiles);
refreshRecentMenu();
});
}
void MainWindow::fillRecentFoldersMenu(QMenu *menu)
{
if (!menu)
return;
menu->clear();
if (m_recentFolders.isEmpty()) {
QAction *empty = menu->addAction(tr("(暂无记录)"));
empty->setEnabled(false);
return;
}
for (const QString &path : m_recentFolders) {
QAction *action = menu->addAction(QDir::toNativeSeparators(path));
action->setToolTip(path);
connect(action, &QAction::triggered, this, [this, path] { openFolder(path); });
}
menu->addSeparator();
menu->addAction(tr("清空列表"), this, [this] {
m_recentFolders.clear();
AppConfig::settings().setValue(QStringLiteral("files/recentFolders"), m_recentFolders);
refreshRecentMenu();
});
}
void MainWindow::addRecentFolder(const QString &path)
{
const QString absolutePath = QFileInfo(path).absoluteFilePath();
m_recentFolders.removeAll(absolutePath);
m_recentFolders.prepend(absolutePath);
while (m_recentFolders.size() > kMaxRecentFiles)
m_recentFolders.removeLast();
AppConfig::settings().setValue(QStringLiteral("files/recentFolders"), m_recentFolders);
refreshRecentMenu();
}
void MainWindow::chooseFolder()
{
const QString directory = QFileDialog::getExistingDirectory(
@@ -1101,7 +1204,8 @@ void MainWindow::openFolder(const QString &path)
m_folderPath = info.absoluteFilePath();
m_lastDirectory = m_folderPath;
QSettings().setValue(QStringLiteral("files/folder"), m_folderPath);
AppConfig::settings().setValue(QStringLiteral("files/folder"), m_folderPath);
addRecentFolder(m_folderPath);
refreshFolder();
updateGitState();
@@ -1243,7 +1347,7 @@ void MainWindow::setSourceModeEnabled(bool enabled)
m_sourceModeAction->setChecked(enabled);
}
QSettings().setValue(QStringLiteral("editor/sourceMode"), enabled);
AppConfig::settings().setValue(QStringLiteral("editor/sourceMode"), enabled);
}
// ---------------------------------------------------------------- Git
@@ -1356,7 +1460,7 @@ void MainWindow::switchSidebarMode(int mode)
if (m_sidebarMode == 1)
rebuildToc();
QSettings().setValue(QStringLiteral("window/sidebarMode"), m_sidebarMode);
AppConfig::settings().setValue(QStringLiteral("window/sidebarMode"), m_sidebarMode);
}
void MainWindow::rebuildToc()
+12
View File
@@ -10,6 +10,7 @@ class QDockWidget;
class QLabel;
class QPushButton;
class QStackedWidget;
class QToolBar;
class QToolButton;
class GitRunner;
class QListWidget;
@@ -35,6 +36,7 @@ private:
enum class Eol { Lf, Crlf };
void createActions();
void createToolBar();
void createSidebar();
void createMenus();
void createStatusBar();
@@ -51,7 +53,10 @@ private:
void showWelcomeDocument();
void addRecentFile(const QString &path);
void addRecentFolder(const QString &path);
void refreshRecentMenu();
void fillRecentFilesMenu(QMenu *menu);
void fillRecentFoldersMenu(QMenu *menu);
void loadRecentFiles();
void chooseFolder();
@@ -140,6 +145,7 @@ private:
Eol m_eol = Eol::Lf;
bool m_hasBom = false;
QStringList m_recentFiles;
QStringList m_recentFolders;
QString m_lastDirectory;
QAction *m_newAction = nullptr;
@@ -173,6 +179,12 @@ private:
QAction *m_headingActions[6] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
QMenu *m_recentMenu = nullptr;
QMenu *m_recentFolderMenu = nullptr;
QMenu *m_toolRecentFilesMenu = nullptr;
QMenu *m_toolRecentFoldersMenu = nullptr;
QToolButton *m_toolRecentFilesButton = nullptr;
QToolButton *m_toolRecentFoldersButton = nullptr;
QToolBar *m_toolBar = nullptr;
QMenu *m_fileMenu = nullptr;
QMenu *m_editMenu = nullptr;
QMenu *m_viewMenu = nullptr;
+2
View File
@@ -105,6 +105,8 @@ MarkdownEditor::MarkdownEditor(QWidget *parent)
setAcceptDrops(true);
viewport()->setMouseTracking(true);
document()->setDocumentMargin(18);
// setDocumentMargin() 会把文档标记为已修改,新建编辑器时清掉
document()->setModified(false);
m_lineNumberArea = new LineNumberArea(this);
m_highlighter = new MarkdownHighlighter(document());
+8 -3
View File
@@ -13,6 +13,8 @@
#include <QTimer>
#include <QXmlStreamReader>
#include "AppConfig.h"
namespace {
QString runCommand(const QString &program, const QStringList &arguments, int timeoutMs)
@@ -184,7 +186,7 @@ void ThemeManager::initialize(Mode forcedMode, bool persist)
if (forcedMode != Mode::System) {
setMode(forcedMode, persist);
} else {
const QString saved = QSettings().value(QStringLiteral("theme/mode")).toString();
const QString saved = AppConfig::settings().value(QStringLiteral("theme/mode")).toString();
m_mode = modeFromString(saved, nullptr);
applyScheme(schemeForMode(m_mode), true);
}
@@ -195,7 +197,7 @@ void ThemeManager::setMode(Mode mode, bool persist)
{
m_mode = mode;
if (persist)
QSettings().setValue(QStringLiteral("theme/mode"), modeToString(mode));
AppConfig::settings().setValue(QStringLiteral("theme/mode"), modeToString(mode));
applyScheme(schemeForMode(m_mode), true);
}
@@ -282,6 +284,9 @@ QMenu::item { padding: 6px 28px 6px 22px; border-radius: 5px; }
QMenu::item:selected { background-color: @highlight; color: @highlightedText; }
QMenu::item:disabled { color: @disabled; }
QMenu::separator { height: 1px; background-color: @border; margin: 5px 8px; }
QToolBar { background-color: @window; border: none; border-bottom: 1px solid @border;
spacing: 2px; padding: 2px 6px; }
QToolBar::separator { width: 1px; background-color: @border; margin: 4px 6px; }
QStatusBar { background-color: @window; color: @placeholder; border-top: 1px solid @border; }
QStatusBar::item { border: none; }
QPlainTextEdit { background-color: @editorBase; color: @editorText; border: none;
@@ -303,7 +308,7 @@ QPushButton { background-color: @button; color: @buttonText; border: 1px solid @
QPushButton:hover { background-color: @highlight; color: @highlightedText; }
QPushButton:default { background-color: @accent; color: #ffffff; border-color: @accent; }
QToolTip { background-color: @menuBackground; color: @text; border: 1px solid @border; padding: 4px; }
QToolButton { border: none; border-radius: 5px; padding: 3px 8px; color: @text; background: transparent; }
QToolButton { border: none; border-radius: 5px; padding: 2px 8px; color: @text; background: transparent; }
QToolButton:hover { background-color: @hoverBackground; }
QToolButton:checked { background-color: @highlight; color: @highlightedText; }
QDockWidget { color: @text; }
Binary file not shown.
+212 -188
View File
@@ -1,9 +1,10 @@
<?xml version='1.0' encoding='utf-8'?>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
<name>GitRunner</name>
<message>
<location filename="../src/GitRunner.cpp" line="32" />
<location filename="../src/GitRunner.cpp" line="32"/>
<source>
(超时,已中止)</source>
<translation>
@@ -13,464 +14,487 @@
<context>
<name>MainWindow</name>
<message>
<location filename="../src/MainWindow.cpp" line="204" />
<location filename="../src/MainWindow.cpp" line="965" />
<location filename="../src/MainWindow.cpp" line="246"/>
<location filename="../src/MainWindow.cpp" line="1009"/>
<source>新建</source>
<translation>New</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="208" />
<location filename="../src/MainWindow.cpp" line="966" />
<location filename="../src/MainWindow.cpp" line="250"/>
<location filename="../src/MainWindow.cpp" line="1010"/>
<source>打开…</source>
<translation>Open…</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="212" />
<location filename="../src/MainWindow.cpp" line="968" />
<location filename="../src/MainWindow.cpp" line="254"/>
<location filename="../src/MainWindow.cpp" line="1012"/>
<source>保存</source>
<translation>Save</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="216" />
<location filename="../src/MainWindow.cpp" line="969" />
<location filename="../src/MainWindow.cpp" line="258"/>
<location filename="../src/MainWindow.cpp" line="1013"/>
<source>另存为…</source>
<translation>Save As…</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="220" />
<location filename="../src/MainWindow.cpp" line="970" />
<location filename="../src/MainWindow.cpp" line="262"/>
<location filename="../src/MainWindow.cpp" line="1014"/>
<source>导出 PDF…</source>
<translation>Export PDF…</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="224" />
<location filename="../src/MainWindow.cpp" line="971" />
<location filename="../src/MainWindow.cpp" line="266"/>
<location filename="../src/MainWindow.cpp" line="1015"/>
<source>退出</source>
<translation>Quit</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="228" />
<location filename="../src/MainWindow.cpp" line="973" />
<location filename="../src/MainWindow.cpp" line="270"/>
<location filename="../src/MainWindow.cpp" line="1017"/>
<source>撤销</source>
<translation>Undo</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="232" />
<location filename="../src/MainWindow.cpp" line="974" />
<location filename="../src/MainWindow.cpp" line="274"/>
<location filename="../src/MainWindow.cpp" line="1018"/>
<source>重做</source>
<translation>Redo</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="236" />
<location filename="../src/MainWindow.cpp" line="975" />
<location filename="../src/MainWindow.cpp" line="278"/>
<location filename="../src/MainWindow.cpp" line="1019"/>
<source>剪切</source>
<translation>Cut</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="240" />
<location filename="../src/MainWindow.cpp" line="976" />
<location filename="../src/MainWindow.cpp" line="282"/>
<location filename="../src/MainWindow.cpp" line="1020"/>
<source>复制</source>
<translation>Copy</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="244" />
<location filename="../src/MainWindow.cpp" line="977" />
<location filename="../src/MainWindow.cpp" line="286"/>
<location filename="../src/MainWindow.cpp" line="1021"/>
<source>粘贴</source>
<translation>Paste</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="248" />
<location filename="../src/MainWindow.cpp" line="978" />
<location filename="../src/MainWindow.cpp" line="290"/>
<location filename="../src/MainWindow.cpp" line="1022"/>
<source>全选</source>
<translation>Select All</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="252" />
<location filename="../src/MainWindow.cpp" line="982" />
<location filename="../src/MainWindow.cpp" line="294"/>
<location filename="../src/MainWindow.cpp" line="1026"/>
<source>自动换行</source>
<translation>Word Wrap</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="257" />
<location filename="../src/MainWindow.cpp" line="983" />
<location filename="../src/MainWindow.cpp" line="299"/>
<location filename="../src/MainWindow.cpp" line="1027"/>
<source>放大</source>
<translation>Zoom In</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="261" />
<location filename="../src/MainWindow.cpp" line="984" />
<location filename="../src/MainWindow.cpp" line="303"/>
<location filename="../src/MainWindow.cpp" line="1028"/>
<source>缩小</source>
<translation>Zoom Out</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="265" />
<location filename="../src/MainWindow.cpp" line="985" />
<location filename="../src/MainWindow.cpp" line="307"/>
<location filename="../src/MainWindow.cpp" line="1029"/>
<source>实际大小</source>
<translation>Actual Size</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="274" />
<location filename="../src/MainWindow.cpp" line="967" />
<location filename="../src/MainWindow.cpp" line="316"/>
<location filename="../src/MainWindow.cpp" line="1011"/>
<source>打开文件夹…</source>
<translation>Open Folder…</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="278" />
<location filename="../src/MainWindow.cpp" line="534" />
<location filename="../src/MainWindow.cpp" line="980" />
<location filename="../src/MainWindow.cpp" line="1001" />
<location filename="../src/MainWindow.cpp" line="320"/>
<location filename="../src/MainWindow.cpp" line="577"/>
<location filename="../src/MainWindow.cpp" line="1024"/>
<location filename="../src/MainWindow.cpp" line="1045"/>
<source>侧栏</source>
<translation>Sidebar</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="292" />
<location filename="../src/MainWindow.cpp" line="981" />
<location filename="../src/MainWindow.cpp" line="334"/>
<location filename="../src/MainWindow.cpp" line="1025"/>
<source>源代码模式</source>
<translation>Source Mode</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="297" />
<location filename="../src/MainWindow.cpp" line="997" />
<location filename="../src/MainWindow.cpp" line="339"/>
<location filename="../src/MainWindow.cpp" line="1041"/>
<source>代码块</source>
<translation>Code Block</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="304" />
<location filename="../src/MainWindow.cpp" line="995" />
<location filename="../src/MainWindow.cpp" line="346"/>
<location filename="../src/MainWindow.cpp" line="1039"/>
<source>标题 %1</source>
<translation>Heading %1</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="315" />
<location filename="../src/MainWindow.cpp" line="357"/>
<source>文件夹</source>
<translation>Folder</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="350" />
<location filename="../src/MainWindow.cpp" line="1147" />
<location filename="../src/MainWindow.cpp" line="392"/>
<location filename="../src/MainWindow.cpp" line="1243"/>
<source>未打开文件夹</source>
<translation>No folder open</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="392" />
<location filename="../src/MainWindow.cpp" line="1280" />
<location filename="../src/MainWindow.cpp" line="434"/>
<location filename="../src/MainWindow.cpp" line="1376"/>
<source>Git 仓库</source>
<translation>Git repository</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="405" />
<location filename="../src/MainWindow.cpp" line="1428" />
<location filename="../src/MainWindow.cpp" line="447"/>
<location filename="../src/MainWindow.cpp" line="1524"/>
<source>拉取</source>
<translation>Pull</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="405" />
<location filename="../src/MainWindow.cpp" line="447"/>
<source>git pull --ff-only</source>
<translation>git pull --ff-only</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="404" />
<location filename="../src/MainWindow.cpp" line="1436" />
<location filename="../src/MainWindow.cpp" line="446"/>
<location filename="../src/MainWindow.cpp" line="1532"/>
<source>获取</source>
<translation>Fetch</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="404" />
<location filename="../src/MainWindow.cpp" line="446"/>
<source>git fetch --all --prune</source>
<translation>git fetch --all --prune</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="408" />
<location filename="../src/MainWindow.cpp" line="1443" />
<location filename="../src/MainWindow.cpp" line="1551" />
<location filename="../src/MainWindow.cpp" line="450"/>
<location filename="../src/MainWindow.cpp" line="1539"/>
<location filename="../src/MainWindow.cpp" line="1647"/>
<source>推送</source>
<translation>Push</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="408" />
<location filename="../src/MainWindow.cpp" line="450"/>
<source>git push</source>
<translation>git push</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1450" />
<location filename="../src/MainWindow.cpp" line="1546"/>
<source>暂存</source>
<translation>Stage</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="406" />
<location filename="../src/MainWindow.cpp" line="448"/>
<source>git add -A</source>
<translation>git add -A</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="407" />
<location filename="../src/MainWindow.cpp" line="1463" />
<location filename="../src/MainWindow.cpp" line="1470" />
<location filename="../src/MainWindow.cpp" line="1474" />
<location filename="../src/MainWindow.cpp" line="1550" />
<location filename="../src/MainWindow.cpp" line="449"/>
<location filename="../src/MainWindow.cpp" line="1559"/>
<location filename="../src/MainWindow.cpp" line="1566"/>
<location filename="../src/MainWindow.cpp" line="1570"/>
<location filename="../src/MainWindow.cpp" line="1646"/>
<source>提交</source>
<translation>Commit</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="407" />
<location filename="../src/MainWindow.cpp" line="449"/>
<source>把暂存区的内容提交</source>
<translation>Commit the staged changes</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="340" />
<location filename="../src/MainWindow.cpp" line="442" />
<location filename="../src/MainWindow.cpp" line="955" />
<location filename="../src/MainWindow.cpp" line="382"/>
<location filename="../src/MainWindow.cpp" line="484"/>
<location filename="../src/MainWindow.cpp" line="999"/>
<source>文件</source>
<translation>File</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="341" />
<location filename="../src/MainWindow.cpp" line="383"/>
<source>目录</source>
<translation>Outline</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="446" />
<location filename="../src/MainWindow.cpp" line="960" />
<location filename="../src/MainWindow.cpp" line="1004"/>
<source>最近打开</source>
<translation>Recent Files</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="454" />
<location filename="../src/MainWindow.cpp" line="956" />
<location filename="../src/MainWindow.cpp" line="497"/>
<location filename="../src/MainWindow.cpp" line="1000"/>
<source>编辑</source>
<translation>Edit</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="464" />
<location filename="../src/MainWindow.cpp" line="957" />
<location filename="../src/MainWindow.cpp" line="215"/>
<source>常用</source>
<translation>Quick Access</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="240"/>
<location filename="../src/MainWindow.cpp" line="488"/>
<source>最近文件</source>
<translation>Recent Files</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="241"/>
<location filename="../src/MainWindow.cpp" line="489"/>
<source>最近目录</source>
<translation>Recent Folders</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="507"/>
<location filename="../src/MainWindow.cpp" line="1001"/>
<source>视图</source>
<translation>View</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="475" />
<location filename="../src/MainWindow.cpp" line="961" />
<location filename="../src/MainWindow.cpp" line="518"/>
<location filename="../src/MainWindow.cpp" line="1005"/>
<source>主题</source>
<translation>Theme</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="483" />
<location filename="../src/MainWindow.cpp" line="991" />
<location filename="../src/MainWindow.cpp" line="526"/>
<location filename="../src/MainWindow.cpp" line="1035"/>
<source>6:00–18:00 使用浅色,其余时间使用深色</source>
<translation>Light from 6:00 to 18:00, dark the rest of the day</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="501" />
<location filename="../src/MainWindow.cpp" line="963" />
<location filename="../src/MainWindow.cpp" line="544"/>
<location filename="../src/MainWindow.cpp" line="1007"/>
<source>语言</source>
<translation>Language</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="518" />
<location filename="../src/MainWindow.cpp" line="958" />
<location filename="../src/MainWindow.cpp" line="561"/>
<location filename="../src/MainWindow.cpp" line="1002"/>
<source>格式</source>
<translation>Format</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="519" />
<location filename="../src/MainWindow.cpp" line="962" />
<location filename="../src/MainWindow.cpp" line="562"/>
<location filename="../src/MainWindow.cpp" line="1006"/>
<source>标题</source>
<translation>Heading</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="526" />
<location filename="../src/MainWindow.cpp" line="959" />
<location filename="../src/MainWindow.cpp" line="569"/>
<location filename="../src/MainWindow.cpp" line="1003"/>
<source>帮助</source>
<translation>Help</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="527" />
<location filename="../src/MainWindow.cpp" line="998" />
<location filename="../src/MainWindow.cpp" line="1028" />
<location filename="../src/MainWindow.cpp" line="570"/>
<location filename="../src/MainWindow.cpp" line="1042"/>
<location filename="../src/MainWindow.cpp" line="1072"/>
<source>关于 VoiletMark</source>
<translation>About VoiletMark</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="538" />
<location filename="../src/MainWindow.cpp" line="1002" />
<location filename="../src/MainWindow.cpp" line="581"/>
<location filename="../src/MainWindow.cpp" line="1046"/>
<source>显示 / 隐藏文件夹侧栏(Ctrl+B)</source>
<translation>Show / hide the folder sidebar (Ctrl+B)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="546" />
<location filename="../src/MainWindow.cpp" line="1005" />
<location filename="../src/MainWindow.cpp" line="589"/>
<location filename="../src/MainWindow.cpp" line="1049"/>
<source>源代码模式:关闭语法高亮与行号(Ctrl+Shift+M)</source>
<translation>Source mode: turn off highlighting and line numbers (Ctrl+Shift+M)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="630" />
<location filename="../src/MainWindow.cpp" line="761" />
<location filename="../src/MainWindow.cpp" line="673"/>
<location filename="../src/MainWindow.cpp" line="804"/>
<source>未命名</source>
<translation>Untitled</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="679" />
<location filename="../src/MainWindow.cpp" line="722"/>
<source>打开 Markdown 文件</source>
<translation>Open Markdown File</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="680" />
<location filename="../src/MainWindow.cpp" line="723"/>
<source>Markdown 文件 (*.md *.markdown *.mdown *.mkd);;文本文件 (*.txt);;所有文件 (*)</source>
<translation>Markdown files (*.md *.markdown *.mdown *.mkd);;Text files (*.txt);;All files (*)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="698" />
<location filename="../src/MainWindow.cpp" line="741"/>
<source>无法打开文件</source>
<translation>Cannot Open File</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="699" />
<location filename="../src/MainWindow.cpp" line="742"/>
<source>读取「%1」失败:%2</source>
<translation>Could not read "%1": %2</translation>
<translation>Could not read &quot;%1&quot;: %2</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="733" />
<location filename="../src/MainWindow.cpp" line="776"/>
<source>另存为</source>
<translation>Save As</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="734" />
<location filename="../src/MainWindow.cpp" line="777"/>
<source>Markdown 文件 (*.md);;文本文件 (*.txt);;所有文件 (*)</source>
<translation>Markdown files (*.md);;Text files (*.txt);;All files (*)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="766" />
<location filename="../src/MainWindow.cpp" line="809"/>
<source>导出 PDF</source>
<translation>Export PDF</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="767" />
<location filename="../src/MainWindow.cpp" line="810"/>
<source>PDF 文件 (*.pdf)</source>
<translation>PDF files (*.pdf)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="774" />
<location filename="../src/MainWindow.cpp" line="817"/>
<source>正在导出 PDF…</source>
<translation>Exporting PDF…</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="811" />
<location filename="../src/MainWindow.cpp" line="821" />
<location filename="../src/MainWindow.cpp" line="854"/>
<location filename="../src/MainWindow.cpp" line="864"/>
<source>导出失败</source>
<translation>Export Failed</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="811" />
<location filename="../src/MainWindow.cpp" line="854"/>
<source>文档排版结果异常,已中止导出。</source>
<translation>The document layout looks broken; export was aborted.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="822" />
<location filename="../src/MainWindow.cpp" line="865"/>
<source>没能写出「%1」,换个位置再试一次。</source>
<translation>Could not write "%1". Try another location.</translation>
<translation>Could not write &quot;%1&quot;. Try another location.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="826" />
<location filename="../src/MainWindow.cpp" line="869"/>
<source>已导出 %1</source>
<translation>Exported to %1</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="841" />
<location filename="../src/MainWindow.cpp" line="848" />
<location filename="../src/MainWindow.cpp" line="853" />
<location filename="../src/MainWindow.cpp" line="884"/>
<location filename="../src/MainWindow.cpp" line="891"/>
<location filename="../src/MainWindow.cpp" line="896"/>
<source>无法保存文件</source>
<translation>Cannot Save File</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="842" />
<location filename="../src/MainWindow.cpp" line="885"/>
<source>写入「%1」失败:%2</source>
<translation>Could not write "%1": %2</translation>
<translation>Could not write &quot;%1&quot;: %2</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="849" />
<location filename="../src/MainWindow.cpp" line="892"/>
<source>写入「%1」时发生错误。</source>
<translation>An error occurred while writing "%1".</translation>
<translation>An error occurred while writing &quot;%1&quot;.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="854" />
<location filename="../src/MainWindow.cpp" line="897"/>
<source>提交「%1」失败:%2</source>
<translation>Could not commit "%1": %2</translation>
<translation>Could not commit &quot;%1&quot;: %2</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="862" />
<location filename="../src/MainWindow.cpp" line="905"/>
<source>已保存 %1</source>
<translation>Saved to %1</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="872" />
<location filename="../src/MainWindow.cpp" line="915"/>
<source>VoiletMark</source>
<translation>VoiletMark</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="873" />
<location filename="../src/MainWindow.cpp" line="916"/>
<source>「%1」有未保存的修改,是否保存?</source>
<translation>"%1" has unsaved changes. Save them?</translation>
<translation>&quot;%1&quot; has unsaved changes. Save them?</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="897" />
<location filename="../src/MainWindow.cpp" line="941"/>
<source>%1[*] — VoiletMark</source>
<translation>%1[*] — VoiletMark</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="916" />
<location filename="../src/MainWindow.cpp" line="960"/>
<source>行 %1,列 %2</source>
<translation>Line %1, Col %2</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="918" />
<location filename="../src/MainWindow.cpp" line="962"/>
<source> 已选 %1 字</source>
<translation> %1 selected</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="919" />
<location filename="../src/MainWindow.cpp" line="963"/>
<source> %1 字</source>
<translation> %1 chars</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1032" />
<location filename="../src/MainWindow.cpp" line="1076"/>
<source>&lt;h3&gt;VoiletMark %1&lt;/h3&gt;&lt;p&gt;一个轻量的跨平台 Markdown 编辑器。&lt;/p&gt;&lt;p&gt;基于 Qt %2 与 C++17 构建。&lt;/p&gt;</source>
<translation>&lt;h3&gt;VoiletMark %1&lt;/h3&gt;&lt;p&gt;A lightweight cross-platform Markdown editor.&lt;/p&gt;&lt;p&gt;Built with Qt %2 and C++17.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1067" />
<location filename="../src/MainWindow.cpp" line="1082"/>
<source>配置文件:%1</source>
<translation>Config file: %1</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1127"/>
<location filename="../src/MainWindow.cpp" line="1152"/>
<source>(暂无记录)</source>
<translation>(none)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1080" />
<location filename="../src/MainWindow.cpp" line="1138"/>
<location filename="../src/MainWindow.cpp" line="1163"/>
<source>清空列表</source>
<translation>Clear List</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1090" />
<location filename="../src/MainWindow.cpp" line="1185"/>
<source>打开文件夹</source>
<translation>Open Folder</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1148" />
<location filename="../src/MainWindow.cpp" line="1244"/>
<source>文件 → 打开文件夹…</source>
<translation>File → Open Folder…</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1184" />
<location filename="../src/MainWindow.cpp" line="1280"/>
<source>(没有 Markdown 文件)</source>
<translation>(no Markdown files)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1316" />
<location filename="../src/MainWindow.cpp" line="1412"/>
<source>正在%1…</source>
<translation>%1…</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1326" />
<location filename="../src/MainWindow.cpp" line="1422"/>
<source>Git 操作失败</source>
<translation>Git Operation Failed</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1327" />
<location filename="../src/MainWindow.cpp" line="1423"/>
<source>%1失败:
%2</source>
@@ -479,124 +503,124 @@
%2</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1328" />
<location filename="../src/MainWindow.cpp" line="1424"/>
<source>(没有输出)</source>
<translation>(no output)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1334" />
<location filename="../src/MainWindow.cpp" line="1430"/>
<source>%1完成</source>
<translation>%1 finished</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1409" />
<location filename="../src/MainWindow.cpp" line="1505"/>
<source>(没有标题)</source>
<translation>(no headings)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1464" />
<location filename="../src/MainWindow.cpp" line="1560"/>
<source>暂存区是空的,先点「暂存」把所有改动加进去。</source>
<translation>Nothing is staged yet. Click "Stage" first to add all changes.</translation>
<translation>Nothing is staged yet. Click &quot;Stage&quot; first to add all changes.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1470" />
<location filename="../src/MainWindow.cpp" line="1566"/>
<source>提交说明:</source>
<translation>Commit message:</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1482" />
<location filename="../src/MainWindow.cpp" line="1578"/>
<source>添加到提交</source>
<translation>Add to commit</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1501" />
<location filename="../src/MainWindow.cpp" line="1597"/>
<source>「%1」已经在 .gitignore 里了</source>
<translation>"%1" is already in .gitignore</translation>
<translation>&quot;%1&quot; is already in .gitignore</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1507" />
<location filename="../src/MainWindow.cpp" line="1603"/>
<source>忽略文件</source>
<translation>Ignore File</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1508" />
<location filename="../src/MainWindow.cpp" line="1604"/>
<source>打不开 .gitignore:%1</source>
<translation>Cannot open .gitignore: %1</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1515" />
<location filename="../src/MainWindow.cpp" line="1611"/>
<source>已把 %1 写进 .gitignore</source>
<translation>Added %1 to .gitignore</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1530" />
<location filename="../src/MainWindow.cpp" line="1535" />
<location filename="../src/MainWindow.cpp" line="1573" />
<location filename="../src/MainWindow.cpp" line="1626"/>
<location filename="../src/MainWindow.cpp" line="1631"/>
<location filename="../src/MainWindow.cpp" line="1669"/>
<source>删除远端</source>
<translation>Delete from remote</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1531" />
<location filename="../src/MainWindow.cpp" line="1627"/>
<source>「%1」没有被 git 跟踪,远端本来就没有它。</source>
<translation>"%1" is not tracked by git, so the remote never had it.</translation>
<translation>&quot;%1&quot; is not tracked by git, so the remote never had it.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1536" />
<location filename="../src/MainWindow.cpp" line="1632"/>
<source>从仓库删除「%1」并推送到远端?
本地文件会保留,远端和别人 pull 下来的仓库里会删掉它。</source>
<translation>Remove "%1" from the repository and push?
<translation>Remove &quot;%1&quot; from the repository and push?
Your local file is kept, but the remote copy and everyone else's will be deleted.</translation>
Your local file is kept, but the remote copy and everyone else&apos;s will be deleted.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1540" />
<location filename="../src/MainWindow.cpp" line="1636"/>
<source>删除并推送</source>
<translation>Delete and push</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1549" />
<location filename="../src/MainWindow.cpp" line="1645"/>
<source>chore: 从仓库删除 %1</source>
<translation>chore: remove %1 from repository</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="406" />
<location filename="../src/MainWindow.cpp" line="1568" />
<location filename="../src/MainWindow.cpp" line="448"/>
<location filename="../src/MainWindow.cpp" line="1664"/>
<source>添加</source>
<translation>Add</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1569" />
<location filename="../src/MainWindow.cpp" line="1665"/>
<source>git add 这个文件</source>
<translation>git add this file</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1570" />
<location filename="../src/MainWindow.cpp" line="1666"/>
<source>忽略</source>
<translation>Ignore</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1571" />
<location filename="../src/MainWindow.cpp" line="1667"/>
<source>把路径写进 .gitignore(不改仓库里已跟踪的文件)</source>
<translation>Add the path to .gitignore (does not untrack files already in the repo)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1574" />
<location filename="../src/MainWindow.cpp" line="1670"/>
<source>git rm --cached 后提交并推送:远端删除,本地保留</source>
<translation>git rm --cached, then commit and push: gone from the remote, kept locally</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1541" />
<location filename="../src/MainWindow.cpp" line="1637"/>
<source>取消</source>
<translation>Cancel</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1547" />
<location filename="../src/MainWindow.cpp" line="1643"/>
<source>从仓库移除</source>
<translation>Remove from repository</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="1564" />
<location filename="../src/MainWindow.cpp" line="1660"/>
<source>打开</source>
<translation>Open</translation>
</message>
@@ -604,40 +628,40 @@ Your local file is kept, but the remote copy and everyone else's will be deleted
<context>
<name>MarkdownEditor</name>
<message>
<location filename="../src/MarkdownEditor.cpp" line="590" />
<location filename="../src/MarkdownEditor.cpp" line="714" />
<location filename="../src/MarkdownEditor.cpp" line="592"/>
<location filename="../src/MarkdownEditor.cpp" line="716"/>
<source>已复制</source>
<translation>Copied</translation>
</message>
<message>
<location filename="../src/MarkdownEditor.cpp" line="590" />
<location filename="../src/MarkdownEditor.cpp" line="714" />
<location filename="../src/MarkdownEditor.cpp" line="592"/>
<location filename="../src/MarkdownEditor.cpp" line="716"/>
<source>复制</source>
<translation>Copy</translation>
</message>
<message>
<location filename="../src/MarkdownEditor.cpp" line="645" />
<location filename="../src/MarkdownEditor.cpp" line="656" />
<location filename="../src/MarkdownEditor.cpp" line="647"/>
<location filename="../src/MarkdownEditor.cpp" line="658"/>
<source>纯文本</source>
<translation>Plain text</translation>
</message>
<message>
<location filename="../src/MarkdownEditor.cpp" line="1108" />
<location filename="../src/MarkdownEditor.cpp" line="1110"/>
<source>插入行</source>
<translation>Insert row</translation>
</message>
<message>
<location filename="../src/MarkdownEditor.cpp" line="1123" />
<location filename="../src/MarkdownEditor.cpp" line="1125"/>
<source>删除行</source>
<translation>Delete row</translation>
</message>
<message>
<location filename="../src/MarkdownEditor.cpp" line="1133" />
<location filename="../src/MarkdownEditor.cpp" line="1135"/>
<source>插入列</source>
<translation>Insert column</translation>
</message>
<message>
<location filename="../src/MarkdownEditor.cpp" line="1148" />
<location filename="../src/MarkdownEditor.cpp" line="1150"/>
<source>删除列</source>
<translation>Delete column</translation>
</message>
@@ -645,24 +669,24 @@ Your local file is kept, but the remote copy and everyone else's will be deleted
<context>
<name>QObject</name>
<message>
<location filename="../src/ThemeManager.cpp" line="364" />
<location filename="../src/ThemeManager.cpp" line="369"/>
<source>浅色</source>
<translation>Light</translation>
</message>
<message>
<location filename="../src/ThemeManager.cpp" line="365" />
<location filename="../src/ThemeManager.cpp" line="370"/>
<source>深色</source>
<translation>Dark</translation>
</message>
<message>
<location filename="../src/ThemeManager.cpp" line="366" />
<location filename="../src/ThemeManager.cpp" line="371"/>
<source>按时段自动</source>
<translation>Scheduled</translation>
</message>
<message>
<location filename="../src/ThemeManager.cpp" line="369" />
<location filename="../src/ThemeManager.cpp" line="374"/>
<source>跟随系统</source>
<translation>Follow System</translation>
</message>
</context>
</TS>
</TS>