Merge branch 'release/3.76.1'

This commit is contained in:
purocean
2024-09-06 18:59:01 +08:00
28 changed files with 1038 additions and 59 deletions
+10 -5
View File
@@ -4,7 +4,7 @@ A **highly extensible** Markdown editor, designed for productivity. **[Download]
[![Download](./help/mas_en.svg?.inline)](https://apps.apple.com/cn/app/yank-note/id1551528618) [Not recommended](https://github.com/purocean/yn/issues/65#issuecomment-1065799677)
English | [中文说明](./README_ZH-CN.md)
English | [中文说明](./README_ZH-CN.md) | [Русский](./README_RU.md)
[toc]{level: [2]}
@@ -76,12 +76,17 @@ For more information on how to use the following functions, please see [characte
## Changelogs
### [v3.75.4](https://github.com/purocean/yn/releases/tag/v3.75.4) 2024-08-06
### [v3.76.1](https://github.com/purocean/yn/releases/tag/v3.76.1) 2024-09-06
[Windows](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-win-x64-3.75.4.exe) | [macOS arm64](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-mac-arm64-3.75.4.dmg) | [macOS x64](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-mac-x64-3.75.4.dmg) | [Linux AppImage](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-linux-x86_64-3.75.4.AppImage) | [Linux deb](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-linux-amd64-3.75.4.deb)
[Windows](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-win-x64-3.76.1.exe) | [macOS arm64](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-mac-arm64-3.76.1.dmg) | [macOS x64](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-mac-x64-3.76.1.dmg) | [Linux AppImage](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-linux-x86_64-3.76.1.AppImage) | [Linux deb](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-linux-amd64-3.76.1.deb)
1. fix: Correct the error in detecting supported file types.
2. fix: Resolve the issue where the shortcut key triggers an accent key and inserts additional characters in the editor on macOS.
1. feat: Added support for the Russian language
2. feat: Added an entry point for usage guidance
3. feat: Optimized the completion of ordered list numbers
4. feat: Added `{docHash}` placeholder to the image save directory configuration
5. fix: Fixed an issue where the input box might not be focusable on Windows
6. fix: Fixed the issue of incorrect read-only status in the editor under certain conditions
7. fix: Fixed the issue of incorrect size calculation for Mermaid rendering under certain conditions
[More release notes](https://github.com/purocean/yn/releases)
+82
View File
@@ -0,0 +1,82 @@
# Yank Note
**Гибкий, расширяемый** редактор Markdown, создан для повышения производительности. **[Скачать](https://github.com/purocean/yn/releases)** | **[Попробовать онлайн >>>](https://demo.yank-note.com/)**
[![Скачать](./help/mas_en.svg?.inline)](https://apps.apple.com/cn/app/yank-note/id1551528618) [Не рекомендуется](https://github.com/purocean/yn/issues/65#issuecomment-1065799677)
[English](./README.md) | [中文说明](./README_ZH-CN.md) | Русский
[toc]{level: [2]}
![Screenshot](./help/1.png)
## Особенности
- **Простота использования:** Используется ядро *Monaco*, оптимизированное для редактирования в формате Markdown, и возможности редактирования такие же, как у VSCode.
- **Мощный:** Поддержка контроля версий; в документ можно встраивать апплеты, запускаемые блоки кода, таблицы, PlantUML, Drawio, макрозамены и т.д.; поддержка автодополнения [OpenAI](https://openai.com).
- **Высокая совместимость:** Данные сохраняются в виде локальных файлов Markdown, а функции расширения реализованы в оригинальном синтаксисе Markdown, насколько это возможно.
- **Расширение плагинов:** Поддержка пользователей в написании собственных плагинов для расширения функциональности редактора.
- **Поддержка шифрования:** Используйте шифрование для сохранения приватных файлов, таких как номер счета, а пароль может быть установлен отдельно для каждого файла.
## Внимание
- Ради большей расширяемости Yank Note жертвует защитой безопасности (выполнение команд, произвольное чтение и запись файлов). Если вы хотите использовать его для открытия постороннего файла Markdown, ⚠️**убедитесь, что содержимое файла заслуживает доверия**⚠️.
- Шифрование и дешифрование зашифрованных файлов выполняется на клиентской стороне. Пожалуйста, **убедитесь, что вы помните свой пароль**. Если пароль утерян, его можно только взломать.
## Основнве функции
Более подробную информацию об использовании следующих функций см. в разделе [описание основных функций](./help/FEATURES.md)
- **Синхронная прокрутка:** область редактирования и область предварительного просмотра прокручиваются синхронно, а область предварительного просмотра можно прокручивать независимо
- **Конспект:** быстрый переход к соответствующему месту документа через конспект в области предварительного просмотра
- **Управление версиями:** поддержка истории документа
- **Шифрование:** файлы, заканчивающиеся на `.c.md`, обрабатываются как зашифрованные
- **Автосохранение:** автоматическое сохранение файлов после редактирования с напоминанием в строке заголовка для несохраненных файлов (зашифрованные документы не сохраняются автоматически)
- **Редактирование:** автоматическое заполнение списка
- **Вставка изображений:** вы можете быстро вставлять изображения из буфера обмена и вставлять их как файлы или Base64
- **Вложения:** вы можете добавлять вложения в документ и открывать их в операционной системе щелчком мыши
- **Выполнение кода:** поддержка запуска JavaScript, PHP, nodejs, Python, кода bash
- **Список задач:** поддержка отображения хода выполнения задач в документе. Щелкните, чтобы быстро переключить статус задачи
- **Быстрое открытие:** вы можете использовать сочетание клавиш для открытия панели переключения файлов, чтобы быстро открывать файлы, помеченные файлы и выполнять полнотекстовый поиск по содержимому файлов
- **Интегрированный терминал:** поддержка открытия терминала в редакторе для быстрого переключения текущего рабочего каталога
- **Katex:** поддержка выражений katex
- **Стили:** Markdown использует стили и функции GitHub
- **Репозиторий:** можно определить несколько расположений данных для организации документов
- **Преобразование внешних ссылок:** преобразование внешних ссылок или изображений Base64 в локальные изображения
- **Разрешение HTML:** вы можете использовать HTML-код непосредственно в документе или использовать сочетания клавиш для копирования и вставки HTML в Markdown
- **Экспорт в несколько форматов:** backend использует pandoc в качестве конвертера
- **TOC:** напишите `[toc]{type:** "ol", level:** [1,2,3]}` для генерации TOC (Table Of Content, оглавление), где вам нужно сгенерировать его
- **Изменить ячейку таблицы:** дважды щелкните ячейку таблицы для быстрого редактирования
- **Копирование ссылки на заголовок:** копирование пути ссылки на заголовок в буфер обмена для легкой вставки в другие файлы
- **Встроенные апплеты:** документ поддерживает встроенные HTML-аплеты
- **Встроенная графика PlantUML:** документ поддерживает встроенную графику plantUML
- **Встроенная графика drawio:** документ поддерживает встроенную графику drawio
- **Встроенная графика ECharts:** документ поддерживает встроенную графику Echarts
- **Встроенная графика Mermaid:** документ поддерживает встроенную графику Mermaid
- **Встроенные таблицы Luckysheet:** документ поддерживает встроенные таблицы Luckysheet
- **Mind map:** вложенный список может быть отображен в виде интеллект-карты
- **Запись атрибутов элемента:** любой атрибут элемента может быть настроен
- **Улучшение таблиц:** поддержка заголовка таблицы с несколькими строками текста, списка и других функций
- **Ссылка на документ:** поддержка ссылок на другие документы в документе и перехода друг к другу
- **Сноска:** поддержка написания сносок в документе
- **Пользовательский контейнер:** поддержка пользовательских контейнеров, аналогичных VuePress по умолчанию темы
- **Макросы:** поддержка встроенных выражений JavaScript для динамической замены содержимого документа
- **Служба хостинга изображений:** поддержка службы хостинга изображений [PicGo](https://picgo.github.io/PicGo-Doc/)
- **OpenAI:** поддержка автодополнения [OpenAI](https://openai.com)
- **Пользовательские плагины:** поддержка написания плагинов JavaScript для расширения функциональности редактора. Плагин находится в `home directory/plugins`. См. [руководство по разработке плагинов](./help/PLUGIN.md)
## Скриншоты
![Screenshot](./help/6.png)
![Screenshot](./help/7.png)
![Screenshot](./help/2.png)
![Screenshot](./help/3.png)
![Screenshot](./help/4.png)
![Screenshot](./help/5.png)
## Поддержка
Wechat Group
<img src="./help/qrcode-wechat.jpg?.inline" width="150">
+10 -5
View File
@@ -4,7 +4,7 @@
[![Download](./help/mas_en.svg?.inline)](https://apps.apple.com/cn/app/yank-note/id1551528618) [Mac App Store 版本说明](https://github.com/purocean/yn/issues/65#issuecomment-1065799677)
[English](./README.md) | 中文说明
[English](./README.md) | 中文说明 | [Русский](./README_RU.md)
[toc]{level: [2]}
@@ -76,12 +76,17 @@
## 更新日志
### [v3.75.4](https://github.com/purocean/yn/releases/tag/v3.75.4) 2024-08-06
### [v3.76.1](https://github.com/purocean/yn/releases/tag/v3.76.1) 2024-09-06
[Windows](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-win-x64-3.75.4.exe) | [macOS arm64](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-mac-arm64-3.75.4.dmg) | [macOS x64](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-mac-x64-3.75.4.dmg) | [Linux AppImage](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-linux-x86_64-3.75.4.AppImage) | [Linux deb](https://github.com/purocean/yn/releases/download/v3.75.4/Yank-Note-linux-amd64-3.75.4.deb)
[Windows](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-win-x64-3.76.1.exe) | [macOS arm64](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-mac-arm64-3.76.1.dmg) | [macOS x64](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-mac-x64-3.76.1.dmg) | [Linux AppImage](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-linux-x86_64-3.76.1.AppImage) | [Linux deb](https://github.com/purocean/yn/releases/download/v3.76.1/Yank-Note-linux-amd64-3.76.1.deb)
1. fix: 修复支持的文件类型检测错误
2. fix: 修复 macOS 上快捷键触发重音键会在编辑器插入额外字符问题
1. feat: 增加俄语语言支持
2. feat: 增加使用指引帮助入口
3. feat: 优化有序列表序号补全
4. feat: 图片保存目录配置增加 `{docHash}` 占位符
5. fix: 修复 Windows 上可能出现输入框无法聚焦的问题
6. fix: 修复某些情况下编辑器只读不正确问题
7. fix: 修复某些情况下 Mermaid 渲染尺寸计算不正确问题
[更多发布说明](https://github.com/purocean/yn/releases)
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "yank.note",
"version": "3.75.4",
"version": "3.76.1",
"description": "Yank Note: A highly extensible Markdown editor, designed for productivity.",
"main": "dist/main/app.js",
"license": "AGPL-3.0",
+5
View File
@@ -21,3 +21,8 @@ fs.writeFileSync(path.join(__dirname, '..', './help/README.md'), md)
readme = path.join(__dirname, '..', 'README_ZH-CN.md')
md = fs.readFileSync(readme).toString('UTF-8').replace(/\]\(\.\/help\//ig, '](./').replace(/src="\.\/help\//ig, 'src="./')
fs.writeFileSync(path.join(__dirname, '..', './help/README_ZH-CN.md'), md)
// copy README_RU.md
readme = path.join(__dirname, '..', 'README_RU.md')
md = fs.readFileSync(readme).toString('UTF-8').replace(/\]\(\.\/help\//ig, '](./').replace(/src="\.\/help\//ig, 'src="./')
fs.writeFileSync(path.join(__dirname, '..', './help/README_RU.md'), md)
+31
View File
@@ -603,6 +603,37 @@ if (!gotTheLock) {
app.on('web-contents-created', (_, webContents) => {
electronRemote.enable(webContents)
// fix focus issue after dialog show on Windows.
webContents.on('frame-created', (_, { frame }) => {
frame.on('dom-ready', () => {
frame.executeJavaScript(`if ('ctx' in window && ctx?.env?.isWindows) {
window._FIX_ELECTRON_DIALOG_FOCUS ??= function () {
setTimeout(() => {
ctx.env.getElectronRemote().getCurrentWindow().blur();
ctx.env.getElectronRemote().getCurrentWindow().focus();
}, 0);
};
if (!window._ORIGIN_ALERT) {
window._ORIGIN_ALERT = window.alert;
window.alert = function (...args) {
window._ORIGIN_ALERT(...args);
window._FIX_ELECTRON_DIALOG_FOCUS();
};
}
if (!window._ORIGIN_CONFIRM) {
window._ORIGIN_CONFIRM = window.confirm;
window.confirm = function (...args) {
const res = window._ORIGIN_CONFIRM(...args);
window._FIX_ELECTRON_DIALOG_FOCUS();
return res;
};
}
}`)
})
})
webContents.setWindowOpenHandler(({ url }) => {
if (url.includes('__allow-open-window__')) {
return { action: 'allow' }
+1 -1
View File
@@ -759,7 +759,7 @@ const server = (port = 3000) => {
}
})
const host = config.get('server.host', 'localhost')
const host = config.get('server.host', '127.0.0.1')
server.listen(port, host)
console.log(`Address: http://${host}:${port}`)
+5 -3
View File
@@ -101,17 +101,19 @@ export default defineComponent({
return
}
const readOnly = FLAG_READONLY || !current || !current.plain || current.writeable === false
const editor = getEditor()
// change content only
if (current && previous && isSameFile(current, previous)) {
editor.updateOptions({ readOnly })
setValue(current.content ?? '\n')
} else {
getMonacoEditor().createModel(toUri(current), current?.content ?? '\n')
}
await nextTick()
getEditor().updateOptions({
readOnly: FLAG_READONLY || !current || !current.plain || current.writeable === false
})
editor.updateOptions({ readOnly })
if (isDefault()) {
await nextTick()
+4 -3
View File
@@ -31,15 +31,15 @@
<div class="help">
<h2>{{$t('get-started.help')}}</h2>
<div class="list">
<div class="item">
<a :href="GUIDE_URL" target="_blank">{{$t('status-bar.help.guide')}}</a>
</div>
<div class="item">
<a href="javascript:void(0);" @click="openHelpDoc('readme')">{{$t('status-bar.help.readme')}}</a>
</div>
<div class="item">
<a href="javascript:void(0);" @click="openHelpDoc('features')">{{$t('status-bar.help.features')}}</a>
</div>
<div class="item">
<a href="javascript:void(0);" @click="openHelpDoc('plugin')">{{$t('status-bar.help.plugin')}}</a>
</div>
<div class="item">
<a href="javascript:void(0);" @click="openShortcutManager()">{{$t('status-bar.help.shortcuts')}}</a>
</div>
@@ -78,6 +78,7 @@ import { showPremium, getPurchased } from '@fe/others/premium'
import { showSettingPanel } from '@fe/services/setting'
import { createDoc, supported, switchDoc } from '@fe/services/document'
import { getActionHandler } from '@fe/core/action'
import { GUIDE_URL } from '@share/misc'
useI18n()
+7 -1
View File
@@ -16,7 +16,7 @@
<div class="editor" ref="editor" v-show="showEditor">
<slot name="editor"></slot>
</div>
<div class="preview" v-show="showView">
<div :class="{preview: true, 'preview-hidden': !presentation && !showView}">
<div v-if="showView && showEditor" class="sash-left" @dblclick="resetSize('right', 'editor')" @mousedown="initEditorResize"></div>
<slot name="preview"></slot>
</div>
@@ -391,6 +391,12 @@ export default defineComponent({
min-width: 0;
box-sizing: border-box;
position: relative;
&.preview-hidden {
visibility: hidden;
width: 0;
flex: none;
}
}
.footer {
+11 -9
View File
@@ -154,15 +154,16 @@ export default defineComponent({
const onClick = async (e: Event) => {
const target = e.target as HTMLInputElement
if (target.name && target.name.endsWith('[path]')) {
if (target.tagName === 'INPUT' && target.name) {
const jsonPath = target.name.replace(/\]/g, '').replace(/\[/g, '.')
const field = editor.getEditor(jsonPath)
const { canceled, filePaths } = await api.choosePath({
properties: ['openDirectory', 'createDirectory'],
})
if (!canceled && filePaths[0]) {
field.setValue(filePaths[0])
if (field && field.schema.openDialogOptions) {
const { canceled, filePaths } = await api.choosePath(field.schema.openDialogOptions)
if (!canceled && filePaths[0]) {
field.setValue(filePaths[0])
}
}
}
}
@@ -206,7 +207,7 @@ export default defineComponent({
<style lang="scss" scoped>
.editor-wrapper {
width: 800px;
width: 900px;
background: var(--g-color-backdrop);
backdrop-filter: var(--g-backdrop-filter);
margin: auto;
@@ -256,7 +257,7 @@ export default defineComponent({
}
::v-deep(.je-form-input-label) {
width: 120px;
width: 140px;
display: inline-flex;
align-items: center;
flex: none;
@@ -264,7 +265,7 @@ export default defineComponent({
}
::v-deep(.je-form-input-label + input) {
max-width: calc(100% - 140px);
max-width: calc(100% - 160px);
}
::v-deep(.je-form-input-label ~ .je-form-input-label) {
@@ -309,6 +310,7 @@ export default defineComponent({
tr > td:last-child {
width: 120px;
text-align: left !important;
}
}
+4 -3
View File
@@ -30,6 +30,7 @@ const schema: SettingSchema = ({
path: {
type: 'string',
title: 'T_setting-panel.schema.repos.path',
openDialogOptions: { properties: ['openDirectory', 'createDirectory'] },
options: {
inputAttributes: { placeholder: 'T_setting-panel.schema.repos.path-placeholder', style: 'cursor: pointer' }
},
@@ -52,9 +53,9 @@ const schema: SettingSchema = ({
defaultValue: 'system',
title: 'T_setting-panel.schema.language',
type: 'string',
enum: ['system', 'en', 'zh-CN', 'zh-TW'],
enum: ['system', 'en', 'zh-CN', 'zh-TW', 'ru'],
options: {
enum_titles: ['System', 'English', '简体中文', '繁體中文'],
enum_titles: ['System', 'English', '简体中文', '繁體中文', 'русский'],
},
group: 'appearance',
required: true,
@@ -377,7 +378,7 @@ const schema: SettingSchema = ({
defaultValue: 'localhost',
title: 'T_setting-panel.schema.server.host',
type: 'string',
enum: ['localhost', '0.0.0.0'],
enum: ['127.0.0.1', '0.0.0.0'],
group: 'other',
required: true,
},
+2 -1
View File
@@ -85,8 +85,9 @@ class JavascriptIframeExecutor implements ReadableStreamDefaultReader<string> {
const AsyncFunction = iframeWindow.eval('(async function(){}).constructor')
const fn = new AsyncFunction('console', 'ctx', this.code)
await fn.call(iframeWindow, xConsole, window.ctx)
await sleep(0)
await fn.call(iframeWindow, xConsole, window.ctx)
await sleep(0)
this._readResolve('')
+1 -1
View File
@@ -17,7 +17,7 @@ function processCursorChange (editor: Monaco.editor.IStandaloneCodeEditor, monac
const isTab = e.source === 'tab'
const isOutdent = e.source === 'outdent'
const isDeleteLeft = e.source === 'deleteLeft'
const isEnter = e.source === 'keyboard' && isKeydown('ENTER')
const isEnter = (e.source === 'keyboard' || e.source === 'editor.action.insertLineAfter') && isKeydown('ENTER')
const isSpace = e.source === 'keyboard' && isKeydown(' ')
if (!isTab && !isDeleteLeft && !isEnter && !isSpace && !isOutdent) {
+6 -1
View File
@@ -199,7 +199,12 @@ function convertLink (state: StateCore) {
return
}
if (/^[^:]*:/.test(attrVal) || attrVal.startsWith('//')) { // xxx:
if (/^[a-z+]+:/.test(attrVal)) { // xxx:
return
}
if (attrVal.startsWith('//')) {
token.attrSet(attrName, `https:${attrVal}`)
return
}
+14 -7
View File
@@ -1,5 +1,5 @@
import type { Plugin } from '@fe/context'
import { HOMEPAGE_URL } from '@share/misc'
import { GUIDE_URL, HOMEPAGE_URL } from '@share/misc'
import logoImg from '@fe/assets/icon.png'
export default {
@@ -41,6 +41,19 @@ export default {
onClick: () => ctx.showPremium()
},
{ type: 'separator' },
{
id: 'show-shortcuts',
type: 'normal',
title: ctx.i18n.t('status-bar.help.shortcuts'),
onClick: () => ctx.action.getActionHandler('keyboard-shortcuts.show-manager')()
},
{ type: 'separator' },
{
id: 'visit-guide',
type: 'normal',
title: ctx.i18n.t('status-bar.help.guide'),
onClick: () => window.open(GUIDE_URL, '_blank')
},
{
id: 'show-readme',
type: 'normal',
@@ -53,12 +66,6 @@ export default {
title: ctx.i18n.t('status-bar.help.plugin'),
onClick: () => ctx.action.getActionHandler(showPluginAction.name)()
},
{
id: 'show-shortcuts',
type: 'normal',
title: ctx.i18n.t('status-bar.help.shortcuts'),
onClick: () => ctx.action.getActionHandler('keyboard-shortcuts.show-manager')()
},
{
id: 'show-features',
type: 'normal',
+5 -4
View File
@@ -57,7 +57,8 @@ export default {
ctx.theme.addStyles(`
html[premium="false"] .status-bar-menu-wrapper > .status-bar-menu[data-id="${id}"] {
background: rgb(0 122 204 / 47%);
background-color: rgb(0 122 204 / 47%);
background-image: linear-gradient(90deg, rgba(218, 119, 242, 0.4), rgba(218, 119, 242, 0));
animation: blink-${id} 1s 7;
}
@@ -67,13 +68,13 @@ export default {
@keyframes blink-${id} {
0% {
background: rgb(0 122 204 / 47%);
background-color: rgb(0 122 204 / 47%);
}
50% {
background: rgb(0 122 204 / 100%);
background-color: rgb(0 122 204 / 100%);
}
100% {
background: rgb(0 122 204 / 47%);
background-color: rgb(0 122 204 / 47%);
}
}
`)
+1
View File
@@ -65,6 +65,7 @@ export async function upload (file: File, belongDoc: Pick<Doc, 'repo' | 'path'>,
.replaceAll('{docName}', parentName.startsWith('.') ? 'upload' : filenamify(parentName))
.replaceAll('{docBasename}', parentName.startsWith('.') ? 'upload' : filenamify(parentNameWithoutMdExt))
.replaceAll('{date}', dayjs().format('YYYY-MM-DD'))
.replaceAll('{docHash}', binMd5(parentNameWithoutMdExt).slice(0, 8))
const path: string = resolve(parentPath, assetsDir, filename)
+11 -1
View File
@@ -590,7 +590,7 @@ export async function ensureCurrentFileSaved () {
const { currentFile, currentContent } = store.state
// do not check if current file is not plain file.
if (currentFile && !extensions.supported(currentFile.name)) {
if (!currentFile || !currentFile.plain) {
return
}
@@ -909,6 +909,8 @@ export function hideHistory () {
}
function cacheSupportedExtension () {
const currentFileSupported = !!(store.state.currentFile && supported(store.state.currentFile))
supportedExtensionCache.types.clear()
supportedExtensionCache.sortedExtensions = []
@@ -922,6 +924,14 @@ function cacheSupportedExtension () {
}
supportedExtensionCache.sortedExtensions.sort((a, b) => b.length - a.length)
// refresh current file if change supported status
if (store.state.currentFile) {
const currentFileSupportedNow = supported(store.state.currentFile)
if (currentFileSupported !== currentFileSupportedNow) {
switchDoc(store.state.currentFile || null, { force: true })
}
}
}
/**
+1
View File
@@ -550,6 +550,7 @@ registerHook('MONACO_BEFORE_INIT', ({ monaco }) => {
'editor.background': '#ffffff',
'minimap.background': '#f2f2f2',
'editor.lineHighlightBackground': '#0000000f',
'list.focusHighlightForeground': '#2aaaff',
}
})
+3
View File
@@ -1,4 +1,5 @@
import type { VNode } from 'vue'
import type { OpenDialogOptions } from 'electron'
import type { Language, MsgPath } from '@share/i18n'
import type { Doc, FileItem, PathItem, Repo } from '@share/types'
import type MarkdownIt from 'markdown-it'
@@ -29,6 +30,7 @@ export type SettingSchema = {
defaultValue: BuildInSettings[K] extends any ? BuildInSettings[K] : any,
enum?: string[] | number [],
group: SettingGroup,
openDialogOptions?: OpenDialogOptions,
needReloadWindowWhenChanged?: boolean,
validator?: (schema: SettingSchema['properties'][K], value: BuildInSettings[K], path: string) =>
{path: string, property: K, message: string}[]
@@ -43,6 +45,7 @@ export type SettingSchema = {
options: {
inputAttributes: { placeholder: TTitle }
}
openDialogOptions?: OpenDialogOptions,
}
}
},
+3 -1
View File
@@ -3,11 +3,13 @@ import merge from 'lodash/merge'
import en, { BaseLanguage } from './languages/en'
import zhCN from './languages/zh-CN'
import zhTW from './languages/zh-TW'
import ru from './languages/ru'
const languages = {
en,
'zh-CN': zhCN,
'zh-TW': zhTW
'zh-TW': zhTW,
ru,
}
export type Flat<T extends Record<string, any>, P extends string = ''> =(
+2 -1
View File
@@ -271,6 +271,7 @@ const data = {
'readme': 'Introduction',
'features': 'Features',
'shortcuts': 'Shortcuts',
'guide': 'Guide',
'plugin': 'Create Plugin'
},
'terminal': 'Terminal',
@@ -425,7 +426,7 @@ const data = {
'language': 'Language',
'custom-css': 'Custom CSS',
'assets-dir': 'Image Dir',
'assets-desc': 'Relative or absolute path (in document repository). Variables: docName, docBasename, docSlug, date.',
'assets-desc': 'Relative or absolute path (in document repository). Variables: docName, docBasename, docSlug, docHash, date.',
'assets': {
'path-type': 'Path Type',
},
+774
View File
@@ -0,0 +1,774 @@
/* eslint-disable quote-props */
import type { BaseLanguage } from './en'
const data: BaseLanguage = {
'app-name': 'Yank Note',
'about': 'О проекте',
'feedback': 'Поддержка',
'slogan': 'Гибкий, расширяемый редактор Markdown, создан для повышения производительности.',
'cancel': 'Отмена',
'undo': 'Отменить',
'ok': 'OK',
'demo-tips': 'Некоторые функции недоступны в ДЕМО режиме.',
'more': 'Ещё',
'copied': 'Скопировано',
'others': 'Другие',
'insert-different-repo-doc': 'Документы не могут быть вставлены из другого репозитория',
'need-clipboard-permission': 'Пожалуйста, предоставьте разрешения на использование буфера обмена',
'click-to-copy': 'Нажмите, чтобы скопировать',
'click-to-copy-link': 'Нажмите, чтобы скопировать ссылку',
'copy-code': 'Скопировать код',
'loading': 'Загрузка',
'add-image': 'Добавить изображение',
'upload-image': 'Загрузить изображение',
'exit-presentation-msg': 'Нажмите клавишу Esc, чтобы выйти',
'reload': 'Перезагрузить',
'open-in-new-window': 'Новое окно',
'view-figure': 'Посмотреть рисунок',
'export': 'Экспорт',
'no-password': 'Пароль не введён',
'save': 'Сохранить',
'close': 'Закрыть',
'discard': 'Отказаться',
'edit': 'Изменить',
'outline': 'Конспект',
'files': 'Файлы',
'install-extension-tips': 'Пожалуйста, сначала установите и включите расширение "%s"',
'not-support-mas': 'Yank Note загруженный из Mac Apple Store, не поддерживает это расширение.',
'learn-more': 'Узнать больше',
'default': 'По умолчанию',
'print': 'Печать',
'markdown-file': 'Markdown файл',
'encrypted-markdown-file': 'Защищенный Markdown файл',
'switch-repo-n': 'Переключиться на репозиторий [%s]',
'switch-the-last-repo': 'Переключиться на последний репозиторий',
'edit-or-generate-text-using-ai': 'Изменить или создать текс с помощью ИИ',
'file-readonly-desc': 'Файл доступен только для чтения. Вы можете [переключиться в режим записи](%s) в системе, а затем [обновить](%s) документ для редактирования.',
'can-not-edit-this-file-type': 'Невозможно редактировать данный тип файла',
'read-only-mode-desc': 'В настоящее время приложение находится в режиме "только для чтения".',
'premium': {
'confetti': 'Конфетти',
'need-purchase': 'Для [%s] требуется премиум',
'buy-license': 'Купить лицензию',
'free': 'Бесплатно',
'premium': 'Премиум',
'upgrade': 'Перейти на премиум',
'intro': {
'intro': 'Описание',
'current-plan': 'Текущий план',
'included': 'Включено',
'desc': 'Yank Note это проект с открытым исходным кодом, я постоянно развиваю его с 2018 года. На это уходят мои силы и деньги. Теперь доступна премиум-версия. Если вы хотите поддержать мое развитие или вам нужны дополнительные функции, вы можете купить лицензию.',
'free-desc': 'Для большинства пользователей',
'premium-desc': 'Дополнительные возможности',
'free-list': 'Basic Editing\nGraphic Embedding\nRun Code Snippet\nHTML Applets\nEncryption\nTerminal Integration\nDocument History\nExtension',
'premium-list': 'Basic Editing\nGraphic Embedding\nRun Code Snippet\nHTML Applets\nEncryption\nTerminal Integration\nDocument History (Advanced)\nExtension (More)\nMacro Replacement\nDark Mode',
},
'buy': {
'buy': 'Купить',
},
'activation': {
'license': 'Лицензия',
'activation': 'Введите лицензию',
'placeholder': 'Введите лицензию',
'get-license': 'Получить лицензию',
'info': 'Информация',
'expired': 'Истекший срок действия',
'expiring': 'Истекает через %s дней',
'need-refresh': 'Необходимо обновить информацию об активации',
'refresh': 'Обновить',
'renewal': 'Обновление',
'devices': 'Устройства',
'this-machine': 'Это устройство',
'unbind': 'Отвязать',
'unbind-confirm': 'Вы уверены, что хотите отвязать "%s"?',
'name': 'Имя: %s',
'email': 'Email: %s',
'expires': 'Истекает: %s',
'plan': 'План: %s',
'success': 'Успешно',
'activating': 'Активация',
'tips': 'Если у вас возникнут проблемы, пожалуйста, свяжитесь со мной',
'tips-wechat': 'Wechat',
'activation-tips': 'Перед активацией убедитесь, что у вас есть доступ к <a href="https://yank-note.com" target="_blank">https://yank-note.com</a>',
'offline-activation': 'Оффлайн активация',
'online-activation': 'Онлайн активация',
'get-activation-token': 'Получить токен активации',
},
},
'app': {
'quit': 'Выход',
'preferences': 'Настройки',
'close-window': 'Закрыть окно',
'toggle-fullscreen': 'Включить полноэкранный режим',
'hide-main-window': 'Скрыть главное окно',
'tray': {
'open-main-window': 'Открыть главное окно',
'open-in-browser': 'Открыть в браузере',
'open-main-dir': 'Открыть папку',
'preferences': 'Настройки',
'start-at-login': 'Запускать при входе',
'version': 'Версия %s',
'quit': 'Выход',
'dev': {
'dev': 'Разработка',
'port-prod': 'Prod порт (%s)',
'port-dev': 'Dev порт (%s)',
'reload': 'Перезагрузить',
'dev-tool': 'Инструменты разработчика',
'restart': 'Перезапустить',
'force-quit': 'Принудительный выход',
}
},
'updater': {
'found-dialog': {
'title': 'Yank Note - доступна новая версия',
'desc': 'Текущая версия: %s\nНовая версия: %s',
'buttons': {
'download': 'Скачать',
'view-changes': 'Посмотреть изменения',
'download-and-view-changes': 'Скачать и посмотреть изменения',
'cancel': 'Отмена',
'ignore': 'Не спрашивать больше'
}
},
'progress-bar': {
'title': 'Yank Note - обновление',
'detail': 'Загрузка %s',
'failed': 'Не удалось загрузить: %s'
},
'failed-dialog': {
'title': 'Yank Note - что-то пошло не так',
},
'install-dialog': {
'title': 'Yank Note - загрузка завершена',
'desc': 'Установить прямо сейчас?',
'buttons': {
'install': 'Установить',
'delay': 'Установить позже',
}
},
'no-newer-dialog': {
'title': 'Yank Note - нет новых версий',
'desc': 'У вас установлена самая последняя версия'
}
},
'error': {
'EADDRINUSE': 'Порт (%s) используется или не имеет достаточных разрешений, пожалуйста, настройте другой порт в настройках',
},
},
'quit-check-dialog': {
'title': 'Внимание',
'desc': 'В документе есть несохраненные изменения. Вы действительно хотите выйти из документа без сохранения?',
'buttons': {
'cancel': 'Отмена',
'discard': 'Сбросить изменения и выйти',
},
},
'save-check-dialog': {
'title': 'Внимание',
'desc': 'Документ не был сохранен, хотите его сохранить?',
},
'change-setting-reload-main-widow-dialog': {
'title': 'Внимание',
'desc': 'Необходимо перезагрузить главное окно, чтобы некоторые настройки вступили в силу. Перезагрузить сейчас?',
},
'file-status': {
'unsaved': 'Не сохранено',
'saving': 'Сохранение',
'saved': 'Сохранено',
'save-failed': 'Не удалось сохранить!',
'loaded': 'Загружено',
'loading': 'Загрузка',
'no-file': 'Нет открытого файла'
},
'modal': {
'info': 'Информация',
'input-placeholder': 'Пожалуйста, введите...',
},
'document': {
'current-path': 'Текущий путь: %s',
'invalid-filename': 'Имя файла не может содержать следующие символы: %s',
'password-create': '[Создание] Пожалуйста, введите пароль',
'password-save': '[Сохранение] Пожалуйста, введите пароль к файлу',
'password-open': '[Открытие] Пожалуйста, введите пароль к файлу',
'wrong-password': 'Неверный пароль',
'file-transform-error': 'Зашифрованные и незашифрованные файлы не могут быть преобразованы друг в друга',
'custom-extension': 'Пользовательское расширение',
'create-dialog': {
'title': 'Создать файл',
'hint': 'Имя файл',
},
'create-dir-dialog': {
'title': 'Создать папку',
'hint': 'Имя папки',
},
'duplicate-dialog': {
'title': 'Дублировать файл',
'hint': 'Путь назначения',
},
'delete-dialog': {
'title': 'Удалить файл',
'content': 'Вы уверены, что хотите удалить %s?'
},
'move-dialog': {
'title': 'Переместить/переименовать файл',
'content': 'Новый путь'
},
'save-encrypted-file-dialog': {
'title': 'Внимание',
'content': 'Пароль не совпадает со старым паролем, сохранить с новым паролем?',
},
'switch-noent-dialog': {
'title': 'Файл не найден',
'content': 'Файл [%s] не найден, хотите его создать?',
}
},
'status-bar': {
'view': {
'view': 'Вид',
'xterm': 'Показать терминал',
'preview': 'Предварительный просмотр',
'editor': 'Показать редактор',
'side-bar': 'Показать боковую панель',
'word-wrap': 'Перенос снов',
'typewriter-mode': 'Режим печатной машинки',
'editor-preview-exclusive': 'Только режим редактора/просмотра',
},
'setting': 'Настройки',
'repo': {
'repo': 'Репозиторий: %s',
'no-data': 'Нет репозитория',
},
'nav': {
'nav': 'Навигация',
'goto': 'Перейти',
'reveal-current-file-in-sidebar': 'Показать текущий файл в боковой панели',
'forward': 'Вперёд',
'back': 'Назад',
},
'insert': {
'insert': 'Вставка',
'paste-rt': 'Вставить форматированный текст',
'paste-img-base64': 'Вставить изображение',
},
'tool': {
'tool': 'Утилиты',
'convert-img-link': 'Скачать удалённое изображение',
'macro-copy-markdown': 'Копировать Markdown после замены макроса',
'copy-content': 'Копировать содержимое',
'doc-history': 'История изменений',
'share-preview': 'Поделиться',
'print': 'Печать документа',
'export': 'Экспорт документа',
},
'document-info': {
'selected': 'Выделено',
'lines': 'Строки',
'chars': 'Знаки',
'selections': 'Выделения',
},
'help': {
'help': 'Помощь',
'readme': 'Введение',
'features': 'Функции',
'shortcuts': 'Сочетания клавиш',
'guide': 'Руководство',
'plugin': 'Создать плагин'
},
'terminal': 'Терминал',
'present': 'Презентация',
'get': {
'get-application': 'Скачать приложение',
},
'extension': {
'extension-manager': 'Менеджер расширений',
},
'theme': {
'tips': 'Тема: %s',
'dark': 'Тёмная',
'light': 'Светлая',
'system': 'Системная',
},
},
'view': {
'outline': 'Конспект',
'print': 'Печать',
},
'tree': {
'db-click-refresh': 'Двойной клик, чтобы обновить',
'add-repo': 'Добавить репозиторий',
'add-repo-hint': 'Выберите место для хранения заметок',
'created-at': 'Создан: %s',
'updated-at': 'Обновлён: %s',
'context-menu': {
'mark': 'Отметить файл',
'unmark': 'Снять отметку',
'duplicate': 'Дублировать',
'create-doc': 'Новый файл',
'create-dir': 'Новая папка',
'add-item': 'Добавить элемент',
'rename': 'Переименовать/переместить',
'delete': 'Удалить',
'open-in-os': 'Открыть с помощью',
'reveal-in-os': 'Показать в проводнике',
'refresh': 'Обновить',
'open-in-terminal': 'Открыть в терминале',
'create-in-cd': 'Новый файл',
'copy-name': 'Копировать имя',
'copy-path': 'Копировать путь',
'find-in-folder': 'Поиск в папке',
},
'toast': {
'moved': '[%s] перемещён в [%s]',
'copied': '[%s] скопирован в [%s]',
},
'sort': {
'asc': 'по возрастанию',
'desc': 'по убыванию',
'by-name': 'Сортировать по имени (%s)',
'by-mtime': 'Сортировать по изменённым (%s)',
'by-birthtime': 'Сортировать по дате создания (%s)',
'by-serial': 'Сортировать по серийному номеру (%s)',
},
},
'tabs': {
'close-others': 'Закрыть другие',
'close-right': 'Закрыть справа',
'close-left': 'Закрыть слева',
'close-all': 'Закрыть все',
'pin': 'Прикрепить',
'unpin': 'Открепить',
'search-tabs': 'Поиск вкладки',
'new-tab': 'Новая вкладка',
},
'export-panel': {
'export': 'Экспорт',
'format': 'Формат',
'pdf': {
'orientation': 'Ориентация',
'portrait': 'Портретная',
'landscape': 'Ландшафтная',
'size': 'Размер',
'zoom': 'Увеличение',
'use-browser': 'Будет использоваться функция печати через браузер.',
'include-bg': 'Включить фон',
},
'use-html': 'Использовать отображаемый HTML',
'use-markdown': 'Использовать исходный код разметки',
'loading': 'Конвертация, пожалуйста, подождите...',
},
'title-bar': {
'pin': 'Прикрепить',
'minimize': 'Свернуть',
'unmaximize': 'Вернуть',
'maximize': 'Развернуть',
},
'setting-panel': {
'setting': 'Настройка',
'add': 'Добавить %s',
'delete-warning': 'Вы уверены, что хотите удалить этот узел?',
'error-choose-repo-path': 'Пожалуйста, выберите путь к репозиторию',
'change-keyboard-shortcuts': 'Изменить сочетания клавиш',
'tabs': {
'repos': 'Репозитории',
'appearance': 'Внешний вид',
'editor': 'Редактор',
'render': 'Отображение',
'image': 'Изображения',
'proxy': 'Прокси',
'macros': 'Макросы',
'other': 'Другое',
},
'schema': {
'repos': {
'repos': 'Репозитории',
'repo': 'Репозиторий',
'name': 'Имя',
'name-placeholder': 'Имя',
'path': 'Путь',
'path-placeholder': 'Пожалуйста, выберите место хранения'
},
'editor': {
'mouse-wheel-zoom': 'Масштабирование колёсиком мыши',
'font-size': 'Размер шрифта',
'tab-size': 'Размер табуляции',
'ordered-list-completion': 'Упорядоченный список',
'minimap': 'Мини-карта',
'line-numbers': 'Номера строк',
'enable-preview': 'Включить предпросмотр - открывать новые файлы с помощью временных вкладок, двойной клик по вкладке для изменения',
'font-family': 'Семейство шрифтов',
'font-ligatures': 'Шрифтовые лигатуры',
'complete-emoji': 'Полный список эмодзи - введите : для отображения списка эмодзи',
'todo-with-time': 'Добавлять время при проверке TODO',
'suggest-on-trigger-characters': 'Подсказки при вводе - вы также можете использовать Ctrl+Space (в зависимости от сочетания клавиш) для запуска',
'sticky-scroll-enabled': 'Включить липкую прокрутку - при прокрутке редактора заголовок документа фиксируется',
'quick-suggestions': 'Быстрые предложения - предлагайте по мере ввода текста',
'enable-ai-copilot-action': 'Включить AI Copilot - показать лампочку действия AI Copilot, если она доступна',
},
'render': {
'md-html': 'Включить HTML',
'md-breaks': 'Преобразовать \\n в &lt;br&gt;',
'md-linkify': 'Автоматическое преобразование текста, похожего на URL, в ссылки',
'md-wiki-links': 'Включить Wiki ссылки - [[ссылка]]',
'md-typographer': 'Включите некоторые языковые замены + улучшение кавычек',
'md-sup': 'Включить надстрочный синтаксис: 29^th^',
'md-sub': 'Включить подстрочный синтаксис: H~2~O',
'md-emoji': 'Включите синтаксис эмодзи: :smile:',
'multimd-multiline': 'Включить многострочный синтаксис [multimd]:',
'multimd-rowspan': 'Включить синтаксис объединением рядов [multimd]:',
'multimd-headerless': 'Включить синтаксис без заголовков [multimd]:',
'multimd-multibody': 'Включить многокомпонентный синтаксис [multimd]:',
},
'view': {
'default-previewer-max-width': 'Максимальная ширина окна предпросмотра',
'default-previewer-max-width-desc': '≤ 100 означает процент, > 100 - пиксели',
},
'theme': 'Тема',
'language': 'Язык',
'custom-css': 'Пользовательский CSS',
'assets-dir': 'Папка для изображений',
'assets-desc': 'Относительный или абсолютный путь (в хранилище документов). Переменные: docName, docBasename, docSlug, docHash, date.',
'assets': {
'path-type': 'Тип пути',
},
'shell': 'Оболочка',
'envs': 'Окружение',
'auto-save': 'Автосохранение',
'plantuml-api': 'PlantUML точка',
'updater': {
'source': 'Обновить источник',
},
'doc-history': {
'number-limit': 'Версии сохранены',
},
'search': {
'number-limit': 'Результаты поиска',
},
'server': {
'host': 'Хост',
'port': 'Порт',
'port-desc': 'Необходимо перезапустить приложение.'
},
'tree': {
'exclude': 'Исключить файлы',
},
'proxy': {
'enabled': 'Включено',
'server': 'Прокси сервер',
'server-hint': '127.0.0.1:8080',
'bypass-list': 'Cписок обходных адресов',
'pac-url': 'PAC URL',
},
'macros': {
'macros': 'Макросы',
'match': 'Соответствие',
'replace': 'Замена',
'match-placeholder': '%foo%',
'replace-placeholder': '%foo% -> BAR',
},
'hide-main-window-on-startup': 'Скрыть главное окно при запуске',
'keep-running-after-closing-window': 'Продолжать работу после закрытия окна',
}
},
'quick-open': {
'input-placeholder': 'Введите...',
'empty': 'Пусто',
'files': 'Файлы',
'marked': 'Отмеченные',
},
'editor': {
'context-menu': {
'paste-image': 'Вставить изображение',
'paste-image-as-base64': 'Вставить изображение как Base64',
'paste-rt-as-markdown': 'Вставить форматированный текст как Markdown',
'add-attachment': 'Добавить вложение',
'link-doc': 'Ссылка на документ',
'link-file': 'Ссылка на файл',
'insert-date': 'Вставить сегодняшнюю дату',
'insert-time': 'Вставить текущее время',
'reveal-line-in-preview': 'Показать строку в предпросмотре',
'force-insert-new-line': 'Принудительная вставка новой строки',
'force-insert-indent': 'Принудительная вставка отступа',
},
'switch-editor': 'Переключить редактор',
'default-editor': 'Редактор по умолчанию',
'action-label': {
'reveal-current-file-in-os': 'Показать текущий файл',
'refresh-current-document': 'Обновить текущий документ',
},
},
'previewer': {
'default-previewer': 'Предпросмотр по умолчанию',
'switch-previewer': 'Переключить просмотрщик',
},
'picgo': {
'setting': {
'api-title': 'PicGo API',
'api-desc': 'URL-адрес PicGo по умолчанию: http://127.0.0.1:36677/upload',
'api-msg': 'Должен начинаться с http://',
'paste-title': 'Вставить изображение с помощью PicGo'
},
'uploading': 'Загрузка',
'upload-failed': 'Загрузка не удалась',
'need-api': 'Сначала настройте PicGo API.',
'upload-all-images': 'Загрузить все изображения',
},
'code-run': {
'run': 'Запустить',
'stop': 'Остановить',
'run-in-xterm-tips': 'Запустить код в терминале, %s + клик не выходить',
'run-in-xterm': 'Запустить в терминале',
'running': 'Запуск...',
'clear': 'Очистить',
},
'mind-map': {
'zoom-in': 'Увеличить масштаб',
'zoom-out': 'Уменьшить масштаб',
'fit-height': 'Подходящая высота',
'switch-layout': 'Компоновка',
'switch-loose': 'Компактный/Свободный',
'convert-error': 'Ошибка преобразования\n 1. Убедитесь, что в конспекте есть только один корневой элемент.\n 2. Убедитесь, что уровень конспекта правильный.',
},
'table-cell-edit': {
'esc-to-cancel': 'Нажмите Esc для отмены',
'db-click-edit': 'Двойной клик для редактирования',
'canceled': 'Отменено',
'edit-hint': 'Содержимое',
'edit-title': 'Редактировать ячейку',
'edit-error': 'Что-то не так',
'limit-single-line': 'Редактирование только отдельных строк',
'context-menu': {
'edit': 'Изменить',
'quick-edit': 'Выйти из режима редактирования',
'sort-mode': 'Режим сортировки',
'sort-asc': 'Сортировать по возрастанию',
'sort-desc': 'Сортировка по убыванию',
'align-left': 'Выравнивание по левому краю',
'align-center': 'Выровнять по центру',
'align-right': 'Выравнивание по правому краю',
'align-normal': 'Выровнять нормаль',
'add-row-above': 'Добавить строку выше',
'add-row-below': 'Добавить строку ниже',
'delete-row': 'Удалить строку',
'add-col-left': 'Добавить столбец слева',
'add-col-right': 'Добавить столбец справа',
'delete-col': 'Удалить столбец',
},
},
'markdown-link': {
'convert-to-titled-link': 'Преобразование в ссылку с названием',
},
'custom-css': {
'change-confirm': {
'title': 'Внимание',
'content': 'Изменение пользовательского CSS требует перезагрузки страницы. Вы хотите продолжить?',
}
},
'control-center': {
'control-center': 'Центр управления %s',
'switch': {
'side-bar': 'Боковая панель %s',
'editor': 'Редактор %s',
'view': 'Редактор %s',
'sync-scroll': 'Синхронная прокрутка',
'sync-rendering': 'Синхронное отображение',
'word-wrap': 'Перенос слов %s',
'typewriter-mode': 'Режим печатной машинки',
'find-in-preview': 'Найти в предпросмотре %s',
},
'navigation': {
'goto': 'Перейти %s',
'forward': 'Вперёд %s',
'back': 'Назад %s',
'refresh': 'Обновить %s',
}
},
'doc-history': {
'clear': 'Очистить',
'apply-version': 'Применить выбранную версию',
'no-history': 'Нет истории',
'content': 'Содержимое',
'diff': 'Изменения',
'history': 'История',
'current': 'Текущий',
'all': 'Все',
'marked': 'Отмечено',
'mark': 'Отметить',
'unmark': 'Снять отметку',
'delete': 'Удалить',
'edit-message': 'Изменить сообщение',
'delete-dialog': {
'title': 'Удалить',
'content': 'Вы уверены, что хотите удалить [%s]?',
},
'clear-dialog': {
'title': 'Очистить',
'content': 'Вы уверены, что хотите очистить неотмеченные версии?',
},
'mark-dialog': {
'title': 'Отметить версию [%s]',
'hint': 'Введите сообщение (необязательно)',
},
'content-too-long-alert': {
'title': 'Предупреждение',
'content': 'По соображениям производительности документы, содержащие более [%s] символов, не будут сохранять историю. Текущая длина документа [%s] символов.',
},
},
'copy-content': {
'options': 'Настройки: ',
'type': 'Тип копии: ',
'inline-style': 'Встроенный стиль',
'include-style': 'Включить стиль',
'inline-image': 'Встроенное локальное изображение',
'upload-image': 'Загрузить локальное изображение',
'highlight-code': 'Выделить код',
'rt': 'Форматированный текст',
'complete': 'Конвертация завершена, нажмите ОК, чтобы скопировать',
'copy-tips': 'Если вам необходимо скопировать часть содержимого, сначала выделите его в области предпросмотра.',
'copy-tips-selected': 'Копировать выбранное содержимое, %s символов.',
},
'share-preview': {
'expire': 'Истекает',
'tips': 'Сначала настройте хост "0.0.0.0" в настройках.',
},
'electron-zoom': {
'zoom-in': 'Увеличить масштаб',
'zoom-out': 'Уменьшить масштаб',
'zoom-reset': 'Фактический размер',
},
'extension': {
'extension-manager': 'Менеджер расширений',
'all': 'Все',
'installed': 'Установлено',
'official': 'Официальный',
'unofficial': 'Неофициальный',
'unknown': 'Неизвестно',
'author': 'Автор',
'origin': 'Источник',
'unpacked-size': 'Размер в распакованном виде',
'latest-version': 'Последняя версия',
'installed-version': 'Установленная версия',
'homepage': 'Домашняя страница',
'download': 'Скачать',
'toast-loaded': 'Расширение загружено',
'upgradable': 'Обновляемый',
'incompatible': 'Несовместимо',
'not-installed': 'Не установлено',
'enabled': 'Включено',
'disabled': 'Отключено',
'reload-required': 'Требуется перезагрузка',
'no-extension': 'Нет расширения',
'reload': 'Перезагрузить',
'install': 'Установить',
'uninstall': 'Удалить',
'installing': 'Установка',
'uninstalling': 'Удаление',
'upgrade': 'Обновить',
'disable': 'Отключить',
'enable': 'Включить',
'uninstall-confirm': 'Вы уверены, что хотите удалить [%s]?',
'registry': 'Реестр',
'activation-time': 'Время активации',
'requirement': 'Требование',
'auto-upgrade': 'Автообновление',
'unknown-origin-tips': 'Использование расширений из неизвестных источников может быть рискованным, вы все еще хотите включить их?',
'extensions-auto-upgraded': 'Расширения были обновлены: %s шт.',
'fetch-registry-failed': 'Не удалось загрузить реестр, пожалуйста, переключитесь на другой реестр или повторите попытку позже',
},
'get-started': {
'get-started': 'Начать',
'start': 'Начало',
'help': 'Помощь',
'recent': 'Последние',
},
'search-panel': {
'search-files': 'Поиск файлов',
'placeholder-search': 'Поиск',
'for-history': '(⇅ для истории)',
'files-to-include': 'Файлы для включения',
'files-to-exclude': 'Файлы для исключения',
'match-case': 'Регистр важен',
'match-whole-word': 'Искать целое слово',
'use-regex': 'Использовать регулярное выражение',
'expand-all': 'Развернуть все',
'collapse-all': 'Свернуть все',
},
'file-changed-alert': {
'title': 'Файл изменен',
'content': 'Файл был изменен на диске. Хотите перезагрузить его?',
'reload': 'Перезагрузить',
},
'command-desc': {
'base_find-in-repository': 'Найти содержимое в репозитории',
'control-center_toggle': 'Показать/скрыть центр управления',
'doc_show-history': 'Показать историю документа',
'editor_toggle-wrap': 'Включить/выключить перенос слов',
'file-tabs_close-current': 'Закрыть текущий файл',
'file-tabs_search-tabs': 'Поиск вкладки',
'file-tabs_show-welcome': 'Показать приветствие',
'file-tabs_switch-left': 'Переключиться на левую вкладку',
'file-tabs_switch-right': 'Переключиться на правую вкладку',
'layout_toggle-editor': 'Показать/скрыть редактор',
'layout_toggle-side': 'Показать/скрыть боковую панель',
'layout_toggle-view': 'Показать/скрыть предпросмотр',
'layout_toggle-xterm': 'Показать/скрыть терминал',
'plugin_copy-content_copy-content': 'Показать панель копирования содержимого',
'plugin_document-history-stack_back': 'Вернуться к предыдущему документу',
'plugin_document-history-stack_forward': 'Перейти к следующему документу',
'plugin_editor_focus-editor': 'Переключиться на редактор',
'plugin_switch-todo_switch': 'Отметить/снять отметку с TODO (сначала необходимо выбрать содержимое в редакторе)',
'view_enter-presentation': 'Войти в режим презентации',
'workbench_show-quick-open': 'Показать быстрое открытие',
'workbench_toggle-outline': 'Показать/скрыть конспект',
'plugin_electron-zoom_zoom-in': 'Увеличить масштаб',
'plugin_electron-zoom_zoom-out': 'Уменьшить масштаб',
'plugin_electron-zoom_zoom-reset': 'Сбросить масштаб',
'view_refresh': 'Обновить предпросмотр',
'extension_show-manager': 'Показать менеджер расширений',
'keyboard-shortcuts_show-manager': 'Показать сочетания клавиш',
'plugin_image-localization_all': 'Скачать все удаленные изображения',
'tree_refresh': 'Обновить дерево файлов',
'plugin_status-bar-theme_switch': 'Переключить тему',
'editor_rotate-custom-editors': 'Повернуть пользовательские редакторы',
'view_show-find-in-preview-widget': 'Показать поиск в виджете предпросмотра',
'tree_reveal-current-node': 'Показать текущий документ в дереве файлов',
},
'keyboard-shortcuts': {
'workbench': 'Рабочее пространство',
'editor': 'Редактор',
'application': 'Приложение',
'keyboard-shortcuts': 'Сочетания клавиш',
'unavailable': 'Недоступно',
'command': 'Команда',
'keybinding': 'Привязка клавиш',
'not-set': 'Не установлен',
'clear': 'Очистить',
'change': 'Сменить',
'reset': 'Сбросить',
'search': 'Поиск, "*" для отображения измененных',
'empty': 'Нет результатов',
'recorder': {
'tip': 'Нажмите нужную комбинацию клавиш, а затем нажмите Enter, Esc для отмены.',
'conflict-commands': 'Есть команды (%s шт.) с одинаковыми сочетаниями клавиш',
},
'conflict': 'Конфликт',
'conflict-title': 'Конфликт привязки клавиш (%s)',
'conflict-commands': 'Следующие команды имеют одинаковые сочетания клавиш:',
},
'find-in-preview': {
'action-tips': {
'prev': 'Предыдущее совпадение (Shift + Enter)',
'next': 'Следующее совпадение (Enter)',
'close': 'Закрыть (Esc)',
},
'results': '%s совпадений',
'toast-no-more': 'Больше нет совпадений',
},
'view-context-menu': {
'copy-image': 'Копировать изображение',
'delete-image': 'Удалить изображение',
'open-in-new-tab': 'Открыть в новой вкладке',
},
}
export default data
+2 -1
View File
@@ -272,6 +272,7 @@ const data: BaseLanguage = {
'readme': '应用介绍',
'features': '特色功能说明',
'shortcuts': '快捷键',
'guide': '使用指引',
'plugin': '插件开发'
},
'terminal': '终端',
@@ -416,7 +417,7 @@ const data: BaseLanguage = {
'language': '语言',
'custom-css': '自定义 CSS',
'assets-dir': '图片存放目录',
'assets-desc': '支持相对路径和绝对路径(限于仓库内部),可用变量:docName, docBasename, docSlug, date',
'assets-desc': '支持相对路径和绝对路径(限于仓库内部),可用变量:docName, docBasename, docSlug, docHash, date',
'assets': {
'path-type': '路径类型',
},
+2 -1
View File
@@ -272,6 +272,7 @@ const data: BaseLanguage = {
'readme': '應用介紹',
'features': '特色功能說明',
'shortcuts': '快捷鍵',
'guide': '使用指引',
'plugin': '插件開發'
},
'terminal': '終端',
@@ -416,7 +417,7 @@ const data: BaseLanguage = {
'language': '語言',
'custom-css': '自訂 CSS',
'assets-dir': '圖片存放目錄',
'assets-desc': '支援相對路徑和絕對路徑(限於倉庫內部),可用變數:docName, docBasename, docSlug, date',
'assets-desc': '支援相對路徑和絕對路徑(限於倉庫內部),可用變數:docName, docBasename, docSlug, docHash, date',
'assets': {
'path-type': '路徑類型',
},
+1
View File
@@ -21,6 +21,7 @@ DQIDAQAB
export const API_BASE_URL = 'https://yank-note.com'
export const HOMEPAGE_URL = 'https://yank-note.com'
export const GUIDE_URL = 'https://help.yank-note.com'
export function isMarkdownFile (path: string) {
return path.endsWith(MARKDOWN_FILE_EXT)
+39 -9
View File
@@ -3105,7 +3105,7 @@ brace-expansion@^2.0.1:
dependencies:
balanced-match "^1.0.0"
braces@^3.0.1, braces@~3.0.2:
braces@^3.0.3, braces@~3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
@@ -7127,12 +7127,12 @@ merge2@^1.3.0, merge2@^1.4.1:
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
micromatch@^4.0.2, micromatch@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
dependencies:
braces "^3.0.1"
picomatch "^2.2.3"
braces "^3.0.3"
picomatch "^2.3.1"
mime-db@1.48.0:
version "1.48.0"
@@ -7809,6 +7809,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
pirates@^4.0.4:
version "4.0.6"
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
@@ -8763,7 +8768,16 @@ string-length@^4.0.1:
char-regex "^1.0.2"
strip-ansi "^6.0.0"
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3:
"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -8831,7 +8845,7 @@ string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1:
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -8845,6 +8859,13 @@ strip-ansi@^6.0.0:
dependencies:
ansi-regex "^5.0.0"
strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-ansi@^7.0.1:
version "7.1.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
@@ -9593,7 +9614,7 @@ wide-align@^1.1.5:
dependencies:
string-width "^1.0.2 || 2 || 3 || 4"
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -9611,6 +9632,15 @@ wrap-ansi@^6.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"