From 97b436534f0b27df9465f984484ac18010d6b9c0 Mon Sep 17 00:00:00 2001 From: "xiaoqi.cxq" Date: Fri, 27 May 2022 07:55:37 +0800 Subject: [PATCH 1/5] trans zh --- README.md | 4 +- chrome-app/manifest.json | 4 +- index.html | 2 +- src/components/ButtonBar.vue | 10 +- src/components/Explorer.vue | 10 +- src/components/NavigationBar.vue | 12 +- src/components/SideBar.vue | 18 +- src/components/Tour.vue | 45 +++-- src/components/menus/HistoryMenu.vue | 2 +- src/components/menus/ImportExportMenu.vue | 24 +-- src/components/menus/MainMenu.vue | 70 ++++---- src/components/menus/PublishMenu.vue | 54 +++--- src/components/menus/SyncMenu.vue | 52 +++--- src/components/menus/WorkspaceBackupMenu.vue | 4 +- src/components/menus/WorkspacesMenu.vue | 24 +-- src/components/modals/AboutModal.vue | 19 +- .../modals/WorkspaceManagementModal.vue | 22 +-- .../providers/CouchdbWorkspaceModal.vue | 3 +- src/data/defaults/defaultWorkspaces.js | 2 +- src/data/features.js | 38 ++-- src/data/pagedownButtons.js | 24 +-- src/data/simpleModals.js | 22 +-- src/data/welcomeFile.md | 162 ++++++++++-------- src/services/badgeSvc.js | 4 +- src/store/explorer.js | 4 +- static/landing/index.html | 92 +++++----- static/landing/providers.png | Bin 36047 -> 40371 bytes static/sitemap.xml | 2 +- 28 files changed, 376 insertions(+), 353 deletions(-) diff --git a/README.md b/README.md index c21a0642..1f1d13ae 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# StackEdit +# StackEdit中文版 从 [StackEdit 官方](https://github.com/benweet/stackedit) fork出来,然后加上了 **Gitee** 的支持,并且已经重新打了镜像,以下官方的部署方式,除了Docker镜像地址不同,其他均一致。 @@ -34,6 +34,8 @@ https://edit.qicoder.com/ # 以下是官方原有README内容 +# StackEdit + [![Build Status](https://img.shields.io/travis/benweet/stackedit.svg?style=flat)](https://travis-ci.org/benweet/stackedit) [![NPM version](https://img.shields.io/npm/v/stackedit.svg?style=flat)](https://www.npmjs.org/package/stackedit) > Full-featured, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites. diff --git a/chrome-app/manifest.json b/chrome-app/manifest.json index cc047edb..d13a5f37 100644 --- a/chrome-app/manifest.json +++ b/chrome-app/manifest.json @@ -1,6 +1,6 @@ { - "name": "StackEdit", - "description": "In-browser Markdown editor", + "name": "StackEdit中文版", + "description": "浏览器内 Markdown 编辑器", "version": "1.0.13", "manifest_version": 2, "container" : "GOOGLE_DRIVE", diff --git a/index.html b/index.html index 890a9459..0b2d6255 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ - StackEdit + StackEdit中文版 diff --git a/src/components/ButtonBar.vue b/src/components/ButtonBar.vue index b3213109..85564891 100644 --- a/src/components/ButtonBar.vue +++ b/src/components/ButtonBar.vue @@ -1,10 +1,10 @@ diff --git a/src/components/menus/MainMenu.vue b/src/components/menus/MainMenu.vue index fa0d4f7d..d7e6c379 100644 --- a/src/components/menus/MainMenu.vue +++ b/src/components/menus/MainMenu.vue @@ -12,116 +12,116 @@ - {{currentWorkspace.name}} synced with your Google Drive app data folder. + {{currentWorkspace.name}} 与您的 Google Drive 应用数据文件夹同步。 - {{currentWorkspace.name}} synced with a Google Drive folder. + {{currentWorkspace.name}}Google Drive 文件夹同步。 - {{currentWorkspace.name}} synced with a CouchDB database. + {{currentWorkspace.name}}CouchDB 数据库同步。 - {{currentWorkspace.name}} synced with a GitHub repo. + {{currentWorkspace.name}}GitHub repo 同步。 - {{currentWorkspace.name}} synced with a Gitee repo. + {{currentWorkspace.name}}Gitee repo 同步。 - {{currentWorkspace.name}} synced with a GitLab project. + {{currentWorkspace.name}}GitLab 项目同步。 - {{currentWorkspace.name}} synced with a Gitea project. + {{currentWorkspace.name}}Gitea 项目同步。
- {{currentWorkspace.name}} not synced. + {{currentWorkspace.name}} 未同步。
-
Sign in with Google
- Sync your main workspace and unlock functionalities. +
使用 Google 登录
+ 同步您的主工作区并解锁功能。
-
Workspaces
- Switch to another workspace. +
工作区
+ 切换到另一个工作区。

-
Synchronize
- Sync your files in the Cloud. +
同步
+ 在云端同步您的文件。
-
Publish
- Export your files to the web. +
发布
+ 将您的文件导出到 Web。
-
History
- Track and restore file revisions. +
历史
+ 跟踪和恢复文件修订。
-
File properties
- Add metadata and configure extensions. +
文件属性
+ 添加元数据并配置扩展。

- Table of contents + 目录 - Markdown cheat sheet + Markdown 帮助
- Import/export + 导入/导出 - Print + 打印
-
Badges
- List application features and earned badges. +
徽章
+ 列出应用程序功能和获得的徽章。
-
Accounts
- Manage access to your external accounts. +
账户
+ 管理对您的外部帐户的访问。
-
Templates
- Configure Handlebars templates for your exports. +
模板
+ 为您的导出配置 Handlebars 模板。
-
Settings
- Tweak application and keyboard shortcuts. +
配置
+ 调整应用程序和键盘快捷键。

- Workspace backups + 工作区备份 - Reset application + 重置应用程序 - About StackEdit + 关于 StackEdit diff --git a/src/components/menus/PublishMenu.vue b/src/components/menus/PublishMenu.vue index f3d1255c..61d7daf1 100644 --- a/src/components/menus/PublishMenu.vue +++ b/src/components/menus/PublishMenu.vue @@ -1,135 +1,135 @@ diff --git a/src/components/modals/AboutModal.vue b/src/components/modals/AboutModal.vue index 2351b573..2bd3ad93 100644 --- a/src/components/modals/AboutModal.vue +++ b/src/components/modals/AboutModal.vue @@ -2,28 +2,25 @@ diff --git a/src/components/modals/WorkspaceManagementModal.vue b/src/components/modals/WorkspaceManagementModal.vue index 3e9b49ac..04b6aa53 100644 --- a/src/components/modals/WorkspaceManagementModal.vue +++ b/src/components/modals/WorkspaceManagementModal.vue @@ -4,7 +4,7 @@ -

The following workspaces are accessible:

+


可以访问以下工作区:

@@ -14,10 +14,10 @@
{{workspace.name}}
- -
@@ -27,10 +27,10 @@ {{workspace.url}}
- - +
@@ -40,24 +40,24 @@ {{workspace.locationUrl}}
- - +
- available offline + 离线可用
@@ -117,9 +117,9 @@ export default { }, async remove(id) { if (id === this.mainWorkspace.id) { - this.info('Your main workspace can not be removed.'); + this.info('您的主工作区无法删除。'); } else if (id === this.currentWorkspace.id) { - this.info('Please close the workspace before removing it.'); + this.info('请先关闭工作区,然后再将其删除。'); } else { try { await store.dispatch('modal/open', 'removeWorkspace'); diff --git a/src/components/modals/providers/CouchdbWorkspaceModal.vue b/src/components/modals/providers/CouchdbWorkspaceModal.vue index 9a59fa02..c7f9c85a 100644 --- a/src/components/modals/providers/CouchdbWorkspaceModal.vue +++ b/src/components/modals/providers/CouchdbWorkspaceModal.vue @@ -11,7 +11,8 @@ Example: https://instance.smileupps.com/stackedit-workspace
- How to setup? + + How to setup?
diff --git a/src/data/defaults/defaultWorkspaces.js b/src/data/defaults/defaultWorkspaces.js index 28340b7a..9ffe67a5 100644 --- a/src/data/defaults/defaultWorkspaces.js +++ b/src/data/defaults/defaultWorkspaces.js @@ -1,7 +1,7 @@ export default () => ({ main: { id: 'main', - name: 'Main workspace', + name: '主工作区', // The rest will be filled by the workspace/workspacesById getter }, }); diff --git a/src/data/features.js b/src/data/features.js index 27836d66..13f32fcd 100644 --- a/src/data/features.js +++ b/src/data/features.js @@ -26,35 +26,35 @@ class Feature { export default [ new Feature( 'navigationBar', - 'Nav bar expert', - 'Master the navigation bar by formatting some Markdown and renaming the current file.', + '丰富的导航栏', + '通过格式化一些Markdown和重命名当前文件掌握导航栏', [ new Feature( 'formatButtons', - 'Formatter', - 'Use the format buttons to change formatting in your Markdown file.', + '格式化', + '使用格式化按钮更改 Markdown 文件中的格式。', ), new Feature( 'editCurrentFileName', - 'Renamer', - 'Use the name field in the navigation bar to rename the current file.', + '重命名', + '使用导航栏中的名称字段重命名当前文件。', ), new Feature( 'toggleExplorer', - 'Explorer toggler', - 'Use the navigation bar to toggle the explorer.', + '资源管理器切换', + '使用导航栏切换资源管理器。', ), new Feature( 'toggleSideBar', - 'Side bar toggler', - 'Use the navigation bar to toggle the side bar.', + '切换侧边栏', + '使用导航栏来切换侧边栏。', ), ], ), new Feature( 'explorer', - 'Explorer', - 'Use the file explorer to manage files and folders in your workspace.', + '资源管理器', + '使用文件资源管理器管理工作区中的文件和文件夹。', [ new Feature( 'createFile', @@ -142,25 +142,25 @@ export default [ ), new Feature( 'signIn', - 'Signed in', - 'Sign in with Google, sync your main workspace and unlock functionalities.', + '登录', + '使用 Google 登录,同步您的主工作区并解锁功能。', [ new Feature( 'syncMainWorkspace', - 'Main workspace synced', - 'Sign in with Google to sync your main workspace with your Google Drive app data folder.', + '主工作区已同步', + '使用 Google 登录以将您的主工作区与您的 Google Drive 应用数据文件夹同步。', ), new Feature( 'sponsor', - 'Sponsor', - 'Sign in with Google and sponsor StackEdit to unlock PDF and Pandoc exports.', + '赞助', + '使用 Google 登录并赞助 StackEdit 以解锁 PDF 和 Pandoc 导出。', ), ], ), new Feature( 'workspaces', 'Workspace expert', - 'Use the workspace menu to create all kinds of workspaces and to manage them.', + '使用工作区菜单创建各种工作区并对其进行管理。', [ new Feature( 'addCouchdbWorkspace', diff --git a/src/data/pagedownButtons.js b/src/data/pagedownButtons.js index cf5dc89e..84bcf47f 100644 --- a/src/data/pagedownButtons.js +++ b/src/data/pagedownButtons.js @@ -1,52 +1,52 @@ export default [{ }, { method: 'bold', - title: 'Bold', + title: '加粗', icon: 'format-bold', }, { method: 'italic', - title: 'Italic', + title: '斜体', icon: 'format-italic', }, { method: 'heading', - title: 'Heading', + title: '标题', icon: 'format-size', }, { method: 'strikethrough', - title: 'Strikethrough', + title: '删除线', icon: 'format-strikethrough', }, { }, { method: 'ulist', - title: 'Unordered list', + title: '无序列表', icon: 'format-list-bulleted', }, { method: 'olist', - title: 'Ordered list', + title: '有序列表', icon: 'format-list-numbers', }, { method: 'clist', - title: 'Check list', + title: '可选列表', icon: 'format-list-checks', }, { }, { method: 'quote', - title: 'Blockquote', + title: '块引用', icon: 'format-quote-close', }, { method: 'code', - title: 'Code', + title: '代码', icon: 'code-tags', }, { method: 'table', - title: 'Table', + title: '表格', icon: 'table', }, { method: 'link', - title: 'Link', + title: '链接', icon: 'link-variant', }, { method: 'image', - title: 'Image', + title: '图片', icon: 'file-image', }]; diff --git a/src/data/simpleModals.js b/src/data/simpleModals.js index 109fc80b..408e7ad8 100644 --- a/src/data/simpleModals.js +++ b/src/data/simpleModals.js @@ -46,21 +46,21 @@ export default { 'Yes, remove', ), reset: simpleModal( - '

This will clean all your workspaces locally. Are you sure?

', - 'No', - 'Yes, clean', + '

这将在本地清理所有工作区,你确定吗?

', + '取消', + '确认清理', ), signInForComment: simpleModal( - `

You have to sign in with Google to start commenting.

- `, - 'Cancel', - 'Ok, sign in', + `

您必须使用 Google 登录才能开始评论。

+ `, + '取消', + '确认登录', ), signInForSponsorship: simpleModal( - `

You have to sign in with Google to sponsor.

- `, - 'Cancel', - 'Ok, sign in', + `

您必须使用 Google 登录才能赞助。

+ `, + '取消', + '确认登录', ), sponsorOnly: simpleModal( '

This feature is restricted to sponsors as it relies on server resources.

', diff --git a/src/data/welcomeFile.md b/src/data/welcomeFile.md index 9de422a2..972fc39b 100644 --- a/src/data/welcomeFile.md +++ b/src/data/welcomeFile.md @@ -1,143 +1,167 @@ -# Welcome to StackEdit! +# 欢迎来到 StackEdit! -Hi! I'm your first Markdown file in **StackEdit**. If you want to learn about StackEdit, you can read me. If you want to play with Markdown, you can edit me. Once you have finished with me, you can create new files by opening the **file explorer** on the left corner of the navigation bar. +你好!我是你在 **StackEdit** 中的第一个 Markdown 文件。如果你想了解 StackEdit,可以阅读我的文章。如果你想玩 Markdown,你可以编辑我。完成后,您可以通过打开导航栏左角的**文件资源管理器**来创建新文件。 -# Files +# 文件 -StackEdit stores your files in your browser, which means all your files are automatically saved locally and are accessible **offline!** +StackEdit 将您的文件存储在您的浏览器中,这意味着您的所有文件都会自动保存在本地并且可以**离线访问!** -## Create files and folders +## 创建文件和文件夹 -The file explorer is accessible using the button in left corner of the navigation bar. You can create a new file by clicking the **New file** button in the file explorer. You can also create folders by clicking the **New folder** button. +使用导航栏左角的按钮可以访问文件资源管理器。您可以通过单击文件资源管理器中的 **创建文件** 按钮来创建新文件。您还可以通过单击 **创建文件夹** 按钮来创建文件夹。 -## Switch to another file +## 切换到另一个文件 -All your files and folders are presented as a tree in the file explorer. You can switch from one to another by clicking a file in the tree. +您的所有文件和文件夹在文件资源管理器中都显示为树。您可以通过单击树中的文件从一个文件切换到另一个文件。 -## Rename a file +##重命名文件 -You can rename the current file by clicking the file name in the navigation bar or by clicking the **Rename** button in the file explorer. +您可以通过单击导航栏中的文件名或单击文件资源管理器中的**重命名**按钮来重命名当前文件。 -## Delete a file +## 删除一个文件 -You can delete the current file by clicking the **Remove** button in the file explorer. The file will be moved into the **Trash** folder and automatically deleted after 7 days of inactivity. +您可以通过单击文件资源管理器中的 **删除** 按钮来删除当前文件。该文件将被移至 **Trash** 文件夹并在 7 天不活动后自动删除。 -## Export a file +## 导出文件 -You can export the current file by clicking **Export to disk** in the menu. You can choose to export the file as plain Markdown, as HTML using a Handlebars template or as a PDF. +您可以通过单击菜单中的 **导出到磁盘** 来导出当前文件。您可以选择将文件导出为纯 Markdown、使用 Handlebars 模板的 HTML 或 PDF。 -# Synchronization +# 同步 -Synchronization is one of the biggest features of StackEdit. It enables you to synchronize any file in your workspace with other files stored in your **Google Drive**, your **Dropbox** and your **GitHub** accounts. This allows you to keep writing on other devices, collaborate with people you share the file with, integrate easily into your workflow... The synchronization mechanism takes place every minute in the background, downloading, merging, and uploading file modifications. +同步是 StackEdit 的最大特点之一。它使您可以将工作区中的任何文件与存储在 **Google Drive**、**Dropbox** 和 **GitHub** 帐户中的其他文件同步。这使您可以继续在其他设备上写作,与您共享文件的人协作,轻松集成到您的工作流程中......同步机制在后台每分钟发生一次,下载、合并和上传文件修改。 -There are two types of synchronization and they can complement each other: +有两种类型的同步,它们可以相互补充: -- The workspace synchronization will sync all your files, folders and settings automatically. This will allow you to fetch your workspace on any other device. - > To start syncing your workspace, just sign in with Google in the menu. +- 工作区同步将自动同步您的所有文件、文件夹和设置。这将允许您在任何其他设备上获取您的工作区。 +> 要开始同步您的工作区,只需在菜单中使用 Google 登录。 -- The file synchronization will keep one file of the workspace synced with one or multiple files in **Google Drive**, **Dropbox** or **GitHub**. - > Before starting to sync files, you must link an account in the **Synchronize** sub-menu. +- 文件同步将保持工作区的一个文件与**Google Drive**、**Dropbox**或**GitHub**中的一个或多个文件同步。 +> 在开始同步文件之前,您必须在**同步**子菜单中链接一个帐户。 -## Open a file +## 打开一个文件 -You can open a file from **Google Drive**, **Dropbox** or **GitHub** by opening the **Synchronize** sub-menu and clicking **Open from**. Once opened in the workspace, any modification in the file will be automatically synced. +您可以通过打开 **同步** 子菜单并单击 **Open from** 从 **Google Drive**、**Dropbox** 或 **GitHub** 打开文件。在工作区中打开后,文件中的任何修改都将自动同步。 -## Save a file +## 保存文件 -You can save any file of the workspace to **Google Drive**, **Dropbox** or **GitHub** by opening the **Synchronize** sub-menu and clicking **Save on**. Even if a file in the workspace is already synced, you can save it to another location. StackEdit can sync one file with multiple locations and accounts. +您可以通过打开 **同步** 子菜单并单击 **Save on** 将工作区的任何文件保存到 **Google Drive**、**Dropbox** 或 **GitHub**。即使工作区中的文件已经同步,您也可以将其保存到另一个位置。 StackEdit 可以将一个文件与多个位置和帐户同步。 -## Synchronize a file +##同步文件 -Once your file is linked to a synchronized location, StackEdit will periodically synchronize it by downloading/uploading any modification. A merge will be performed if necessary and conflicts will be resolved. +一旦您的文件链接到同步位置,StackEdit 将通过下载/上传任何修改来定期同步它。如有必要,将执行合并并解决冲突。 -If you just have modified your file and you want to force syncing, click the **Synchronize now** button in the navigation bar. +如果您刚刚修改了文件并且想要强制同步,请单击导航栏中的 **Synchronize now** 按钮。 -> **Note:** The **Synchronize now** button is disabled if you have no file to synchronize. +> **注意:** 如果您没有要同步的文件,**立即同步**按钮将被禁用。 -## Manage file synchronization +## 管理文件同步 -Since one file can be synced with multiple locations, you can list and manage synchronized locations by clicking **File synchronization** in the **Synchronize** sub-menu. This allows you to list and remove synchronized locations that are linked to your file. +由于一个文件可以与多个位置同步,您可以通过单击**同步**子菜单中的**文件同步**列出和管理同步位置。这允许您列出和删除链接到您的文件的同步位置。 -# Publication +# 出版物 -Publishing in StackEdit makes it simple for you to publish online your files. Once you're happy with a file, you can publish it to different hosting platforms like **Blogger**, **Dropbox**, **Gist**, **GitHub**, **Google Drive**, **WordPress** and **Zendesk**. With [Handlebars templates](http://handlebarsjs.com/), you have full control over what you export. +在 StackEdit 中发布使您可以轻松地在线发布文件。对文件感到满意后,您可以将其发布到不同的托管平台,例如 **Blogger**、**Dropbox**、**Gist**、**GitHub**、**Google Drive**、* *WordPress** 和 **Zendesk**。使用 [Handlebars 模板](http://handlebarsjs.com/),您可以完全控制导出的内容。 -> Before starting to publish, you must link an account in the **Publish** sub-menu. +> 在开始发布之前,您必须在**发布**子菜单中链接一个帐户。 -## Publish a File +## 发布文件 -You can publish your file by opening the **Publish** sub-menu and by clicking **Publish to**. For some locations, you can choose between the following formats: +您可以通过打开 **发布** 子菜单并单击 **发布到** 来发布您的文件。对于某些位置,您可以选择以下格式: -- Markdown: publish the Markdown text on a website that can interpret it (**GitHub** for instance), -- HTML: publish the file converted to HTML via a Handlebars template (on a blog for example). +- Markdown:在可以解释的网站上发布 Markdown 文本(例如**GitHub**), +- HTML:通过 Handlebars 模板发布转换为 HTML 的文件(例如在博客上)。 -## Update a publication +## 更新出版物 -After publishing, StackEdit keeps your file linked to that publication which makes it easy for you to re-publish it. Once you have modified your file and you want to update your publication, click on the **Publish now** button in the navigation bar. +发布后,StackEdit 会将您的文件链接到该出版物,这使您可以轻松地重新发布它。一旦您修改了文件并想要更新您的出版物,请单击导航栏中的**立即发布**按钮。 -> **Note:** The **Publish now** button is disabled if your file has not been published yet. +> **注意:** 如果您没有要同步的文件,**立即同步**按钮将被禁用。 -## Manage file publication +## 管理文件同步 -Since one file can be published to multiple locations, you can list and manage publish locations by clicking **File publication** in the **Publish** sub-menu. This allows you to list and remove publication locations that are linked to your file. +由于一个文件可以与多个位置同步,您可以通过单击**同步**子菜单中的**文件同步**列出和管理同步位置。这允许您列出和删除链接到您的文件的同步位置。 -# Markdown extensions +# 出版物 -StackEdit extends the standard Markdown syntax by adding extra **Markdown extensions**, providing you with some nice features. +在 StackEdit 中发布使您可以轻松地在线发布文件。对文件感到满意后,您可以将其发布到不同的托管平台,例如 **Blogger**、**Dropbox**、**Gist**、**GitHub**、**Google Drive**、* *WordPress** 和 **Zendesk**。使用 [Handlebars 模板](http://handlebarsjs.com/),您可以完全控制导出的内容。 -> **ProTip:** You can disable any **Markdown extension** in the **File properties** dialog. +> 在开始发布之前,您必须在**发布**子菜单中链接一个帐户。 + +## 发布文件 + +您可以通过打开 **发布** 子菜单并单击 **发布到** 来发布您的文件。对于某些位置,您可以选择以下格式: + +- Markdown:在可以解释的网站上发布 Markdown 文本(例如**GitHub**), +- HTML:通过 Handlebars 模板发布转换为 HTML 的文件(例如在博客上)。 + +## 更新出版物 + +发布后,StackEdit 会将您的文件链接到该出版物,这使您可以轻松地重新发布它。一旦您修改了文件并想要更新您的出版物,请单击导航栏中的**立即发布**按钮。 + +> **注意:** 如果您的文件尚未发布,则 **立即发布** 按钮将被禁用。 + +## 管理文件发布 + +由于一个文件可以发布到多个位置,您可以通过单击**发布**子菜单中的**文件发布**来列出和管理发布位置。这允许您列出和删除链接到您的文件的发布位置。 + + +# Markdown扩展 + +StackEdit 通过添加额外的 **Markdown扩展** 扩展了标准 Markdown 语法,为您提供了一些不错的功能。 + +> **专业提示:** 您可以在 **文件属性** 对话框中禁用任何 **Markdown 扩展名**。 ## SmartyPants -SmartyPants converts ASCII punctuation characters into "smart" typographic punctuation HTML entities. For example: +SmartyPants 将 ASCII 标点字符转换为“智能”印刷标点 HTML 实体。例如: -| |ASCII |HTML | -|----------------|-------------------------------|-----------------------------| -|Single backticks|`'Isn't this fun?'` |'Isn't this fun?' | -|Quotes |`"Isn't this fun?"` |"Isn't this fun?" | -|Dashes |`-- is en-dash, --- is em-dash`|-- is en-dash, --- is em-dash| +| |ASCII |HTML | +|----------------|--------------------------------| ------------------------------| +|单反引号|`'这不好玩吗?'` |'这不好玩吗? | +|引用|`“这不好玩吗?”` |“这不好玩吗?” | +|破折号 |`-- 是破折号,--- 是破折号`|-- 是破折号,--- 是破折号| ## KaTeX -You can render LaTeX mathematical expressions using [KaTeX](https://khan.github.io/KaTeX/): +您可以使用 [KaTeX](https://khan.github.io/KaTeX/) 渲染 LaTeX 数学表达式: -The *Gamma function* satisfying $\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$ is via the Euler integral +满足 $\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$ 的 *Gamma 函数* 是通过欧拉积分 $$ \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. $$ -> You can find more information about **LaTeX** mathematical expressions [here](http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference). +> 您可以在 [这里](http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference) 找到有关 **LaTeX** 数学表达式的更多信息。 -## UML diagrams +## UML 图 -You can render UML diagrams using [Mermaid](https://mermaidjs.github.io/). For example, this will produce a sequence diagram: +您可以使用 [Mermaid](https://mermaidjs.github.io/) 渲染 UML 图。例如,这将产生一个序列图: ```mermaid sequenceDiagram -Alice ->> Bob: Hello Bob, how are you? -Bob-->>John: How about you John? -Bob--x Alice: I am good thanks! -Bob-x John: I am good thanks! -Note right of John: Bob thinks a long
long time, so long
that the text does
not fit on a row. +爱丽丝 ->> 鲍勃: 你好鲍勃,你好吗? +鲍勃-->>约翰: 约翰,你呢? +鲍勃--x 爱丽丝: 我很好,谢谢! +鲍勃-x 约翰: 我很好,谢谢! +Note right of 约翰: 鲍勃想了很长
很长的时间,太长了
文本确实
不能放在一行中。 -Bob-->Alice: Checking with John... -Alice->John: Yes... John, how are you? +鲍勃-->爱丽丝: 正在和 John 核对... +爱丽丝->约翰: 是的……约翰,你好吗? ``` -And this will produce a flow chart: +这将产生一个流程图: ```mermaid graph LR -A[Square Rect] -- Link text --> B((Circle)) -A --> C(Round Rect) -B --> D{Rhombus} +A[Square Rect] -- 链接文本 --> B((Circle)) +A --> C(圆角矩形) +B --> D{菱形} C --> D -``` +``` \ No newline at end of file diff --git a/src/services/badgeSvc.js b/src/services/badgeSvc.js index d627d349..964aea85 100644 --- a/src/services/badgeSvc.js +++ b/src/services/badgeSvc.js @@ -8,8 +8,8 @@ const showInfo = () => { .filter(badge => badge.isEarned && !lastEarnedFeatureIds.has(badge.featureId)); if (earnedBadges.length) { store.dispatch('notification/badge', earnedBadges.length > 1 - ? `You've earned ${earnedBadges.length} badges: ${earnedBadges.map(badge => `"${badge.name}"`).join(', ')}.` - : `You've earned 1 badge: "${earnedBadges[0].name}".`); + ? `您已获得 ${earnedBadges.length} 个徽章: ${earnedBadges.map(badge => `"${badge.name}"`).join(', ')}.` + : `您已获得 1 个徽章: "${earnedBadges[0].name}".`); } lastEarnedFeatureIds = null; }; diff --git a/src/store/explorer.js b/src/store/explorer.js index e4f1eb2f..98469815 100644 --- a/src/store/explorer.js +++ b/src/store/explorer.js @@ -89,7 +89,7 @@ export default { // Create Trash node const trashFolderNode = new Node(emptyFolder(), [], true); trashFolderNode.item.id = 'trash'; - trashFolderNode.item.name = 'Trash'; + trashFolderNode.item.name = '回收站'; trashFolderNode.noDrag = true; trashFolderNode.isTrash = true; trashFolderNode.parentNode = rootNode; @@ -97,7 +97,7 @@ export default { // Create Temp node const tempFolderNode = new Node(emptyFolder(), [], true); tempFolderNode.item.id = 'temp'; - tempFolderNode.item.name = 'Temp'; + tempFolderNode.item.name = '临时目录'; tempFolderNode.noDrag = true; tempFolderNode.noDrop = true; tempFolderNode.isTemp = true; diff --git a/static/landing/index.html b/static/landing/index.html index ecc21dd1..25b939bd 100644 --- a/static/landing/index.html +++ b/static/landing/index.html @@ -2,7 +2,7 @@ - StackEdit – In-browser Markdown editor + StackEdit中文版 – 浏览器内 Markdown 编辑器 @@ -271,20 +271,20 @@
-

Unrivalled writing experience

+

无与伦比的写作体验

-

Rich Markdown editor

-

StackEdit’s Markdown syntax highlighting is unique. The refined text formatting of the editor helps you visualize the final rendering of your files.

+

丰富的 Markdown 编辑器

+

StackEdit 的 Markdown 语法高亮是独一无二的。 编辑器的精致文本格式可帮助您可视化文件的最终呈现。

@@ -315,15 +315,15 @@
-

WYSIWYG controls

-

StackEdit provides very handy formatting buttons and shortcuts, thanks to PageDown, the WYSIWYG-style Markdown editor used by Stack Overflow.

+

所见即所得控件

+

StackEdit 提供了非常方便的格式化按钮和快捷方式,这要归功于 Stack Overflow 使用的所见即所得式 Markdown 编辑器 PageDown。

-

Smart layout

-

Whether you write, you review, you comment… StackEdit's layout provides you with the flexibility you need, without sacrifice.

+

智能布局

+

无论你是写作、阅读还是评论……StackEdit的布局都为你提供了所需的灵活性。

@@ -332,17 +332,17 @@
-

Live preview with Scroll Sync

-

StackEdit’s Scroll Sync feature accurately binds the scrollbars of the editor panel and the preview panel to ensure that you always keep an eye on the output while writing.

+

滚动同步实时预览

+

StackEdit的滚动同步功能精确地绑定了编辑器面板和预览面板的滚动条,以确保您在编写时始终关注输出。

-

Designed for web writers

+

专为网络写手设计

-

Stay connected

-

StackEdit can sync your files with Google Drive, Dropbox and GitHub. It can also publish them as blog posts to Blogger, WordPress and Zendesk. You can choose whether to upload in Markdown format, HTML, or to format the output using the Handlebars template engine.

+

保持同步

+

StackEdit 可以将您的文件与 Google Drive、Dropbox 和 GitHub 同步。 它还可以将它们作为博客文章发布到 Blogger、WordPress 和 Zendesk。 您可以选择是以 Markdown 格式、HTML 上传,还是使用 Handlebars 模板引擎格式化输出。

@@ -352,26 +352,26 @@
-

Collaborate

-

With StackEdit, you can share collaborative workspaces, thanks to the synchronization mechanism. If two collaborators are working on the same file at the same time, StackEdit takes care of merging the changes.

+

协作

+

借助 StackEdit,您可以共享协作工作空间,这要归功于同步机制。 如果两个协作者同时处理同一个文件,StackEdit 会负责合并更改。

-

Comment

-

StackEdit allows you to insert inline comments and embed collaborator discussions in your files, just as well as Microsoft Word and Google Docs.

+

评论

+

StackEdit 允许您在文件中插入内联评论和嵌入协作者讨论,就像 Microsoft Word 和 Google Docs 一样。

-

Write offline!

-

Even when you travel, StackEdit is still accessible and lets you write offline just like any desktop application. You have no excuse!

+

离线写作!

+

即使在旅行时,StackEdit 仍然可以访问,让您可以像任何桌面应用程序一样离线编写。 你没有借口再偷懒!

-

Extended Markdown support

+

扩展的 Markdown 支持


@@ -381,8 +381,8 @@
-

GitHub Flavored Markdown

-

StackEdit supports different Markdown flavors such as Markdown Extra, GFM and CommonMark. Each Markdown feature can be enabled or disabled at your convenience.

+

GitHub 风格的 Markdown

+

StackEdit 支持不同的 Markdown 风格,例如 Markdown Extra、GFM 和 CommonMark。 每个 Markdown 功能都可以在您方便的时候启用或禁用。

@@ -395,8 +395,8 @@
-

LaTeX mathematical expressions

-

StackEdit renders mathematics from LaTeX expressions inside your markdown file, as you would do on Stack Exchange.

+

LaTeX 数学表达式

+

StackEdit 从您的 Markdown 文件中的 LaTeX 表达式呈现数学公式。

@@ -408,8 +408,8 @@
-

UML diagrams

-

StackEdit enables you to write sequence diagrams and flow charts using a simple syntax.

+

UML 图

+

StackEdit 使您能够使用简单的语法编写序列图和流程图。

@@ -421,8 +421,8 @@
-

Scores

-

StackEdit can render musical scores using the ABC notation.

+

乐谱

+

StackEdit 可以使用 ABC 表示法渲染乐谱。

@@ -434,26 +434,26 @@
-

Emojis

-

StackEdit supports inserting emojis in your file using the Markdown emoji markup.

+

Emojis表情

+

StackEdit 支持使用 Markdown 表情符号标记在文件中插入表情符号。

diff --git a/static/landing/providers.png b/static/landing/providers.png index d031a9d10ff7a7c93c482b4e36016c8dc3d59263..309ef180bbd282989aa36bf6daf313670f34b047 100644 GIT binary patch literal 40371 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

B~NZCe5kvP`_gHqPAr(AlA`l z9+y*y=W2E#`OPZ8S<*v38Au)#9fWXn)c z+1j>Gu;v>XQ6TDpi(KSf%G&^?sC?3%%3JOV#*o~A@=LZ2R7CM$r^eEeZaaQKf;ZYt zA5Ro~*3dhssj1};t#zr#4y>s_y1XpoP{4+qa(W7 zHW?!!9;4-d?wD0cG{`fNAIq1^Fy!~8Nx?RN-Sw}!{_^eiJpC5f2#<&FJ0*Hxt+-OA zIU>8z8spCJJrg?At^V_j#aN0>LhRT{oE!w*`rfNl6@%xv=NN8ch z2R8vWn*u2y&Mb0^&YY=veq<7#1^$Yd;6cf$h-W|K;k5@rLDoKGjo);9%ujvNyU=a| zyfe)#9igUXlC1G(b?s*RG3Rsl?m(^WX*8@*IH4dv{*r_E__f?4x-C;edh>$|HuHIH zUQ?e; z^=6KkL&?1|EKI)l?5mX8cX_Tivaxy7(~bG^(Zk@31I;Q@( z#l}6B>p+pfyFn;(iDr&*36K|jX`Gswq1q;wtC;!@zSR}!=dMTv;AAI5KP+6qUEwu8 ztBS%;bE_V`G{V@*`4X)xRkv?s`ND*)i*rj+I}waFeb*%Ta+uzM@NY+i0W6;0MXZxL zUw1T9TQDORHYefQ9NF)NJK0LRY+MJ71-Cn8xXn(GSrmxb!G7df(Orlw8x^k=xX!Et zSCh5Lj5ln+c?eYipip*9SL!FNzW(oTSD)AQ$MkLkpknj$^_odxz#jx$w%EDPqB|ud zHFYX{J+rQA%t2iA7}wm0!rbop=^0s?0U3*HxX|8hB$^!FrNik1{isRF`!1#) zL^zM?j#>yFqR)RBHy7|NK90$l`^Aq>zjhRra&K{NcY)s5@?-KtPUXWD;%hU84lZ=` zU7M@(mSHVxm(j}shAdnr~wRYSaSVjY!0|d0?HA; zY=3S1Nv}^cg9cdhzz7i6d`jbdmUeDBkwlvm(+v#_nn$OgaRosHEopCXApdtT>f;F< zv+bKB`3FC^n&G56!q3(m@gZnoOjq{YM4iV^kNm5`vv?EcXBu-(;k=<7E&iDowSpTl z(1;=?II{fEp)tF!@2|xT0iUHcNe9xPV3uN96CDV zZBn_(DYDBvCJJ<1=VKN0hO@T>@$Xi#f4lcv)OWqf6O*SzEf5036f3gzn+h4w0`W*( zy*_d^AOVPqiXtJs;En-!!dM5*2O?nLm}s$zp}oSlbFmyzO+=THw!G?>7Grl z9v&kKt08rQX&m|!GDi~DU6equs1SPb!mchREUtS%@u@)IK`#-FE|_u*OBo$~Gj>~G zBtQvssPjRDqt7 zm#ZW&DFZ^4g8zV*#onTHAnp@_2-{@9c7a-lfXMg|FjJ2^Oy)e255udMo;@BGxX+Ml z_=Q0CBQ1k`jN4ep?rpb|n~{OkLx6VO+~~&X|E&#xzIgKSlMn=mP zEs-4~Tmvii^0J|ryjjs5==>UdCak))&Zkcbtyx67!O(~Wsl49+`6_u@kmTP99df&&hJL`Sj%2opcWc%Xxo=S;_hN!K+(5=3CtQI;IL1#!fpW zmaJYeSLrY>;4%IoCf+6cOGI%Zy;1o5SJQ}oV=;MN2if#IlN6mIYO>tO$NQ+;V4T0F zbb2)Oj9S#aBKtdsH%fE-(L5lFW8v+&!P6O5B^}lPHb9^}@NAqB_=qV}F&a7=AN`>* zF6-JN$GJbSbiIIokgI{u;Ou69`iG7vTA@@PXYz7i`%Ztx0Tb(X*Vs2q>ZJ0l8f5crj7S!2%(}TS>abv}RXaYOJ7ZDW zcD!>qp}pT@{7(T4Kt#;k8By?Iz5t8eC; zoLSZd4_OEGB^1s>r>u-ugyhdV1o9pdFF3&@&LOWY?y+w*g>Bl4iIVjBFf(O+5{1IJ zmU2CB3FUwh1BDryh8s+af8^ArP?oSR{_%h3o5;`nm#_5C-}H~){y+Y@fALN4UNGFr XJvV%a${It#e~ukdJ)CgJ$n(DeCK(Jc diff --git a/static/sitemap.xml b/static/sitemap.xml index 87d71abe..0b1b860c 100644 --- a/static/sitemap.xml +++ b/static/sitemap.xml @@ -11,7 +11,7 @@ 1.0 - https://community.stackedit.io/ + https://gitee.com/mafgwo/stackedit/issues weekly 0.8 From cb58d05147ee23355a673a60310602bcee4fe3dd Mon Sep 17 00:00:00 2001 From: "xiaoqi.cxq" Date: Fri, 27 May 2022 08:54:38 +0800 Subject: [PATCH 2/5] trans zh --- src/components/Tour.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Tour.vue b/src/components/Tour.vue index c8332294..be3efc11 100644 --- a/src/components/Tour.vue +++ b/src/components/Tour.vue @@ -3,7 +3,7 @@

欢迎回来!

-

新的StackEdit中文版这里!

+

新的StackEdit中文版在这里!

请单击下一步快速浏览。

From 198c8cb647440d2422fcfc9e34c8e457de7a7d27 Mon Sep 17 00:00:00 2001 From: "xiaoqi.cxq" Date: Wed, 1 Jun 2022 17:37:31 +0800 Subject: [PATCH 3/5] =?UTF-8?q?gitee=20gitea=20=E6=94=AF=E6=8C=81bugfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/dev.env.js | 2 +- server/conf.js | 2 - src/components/menus/HistoryMenu.vue | 10 +- src/data/welcomeFile.md | 2 +- src/services/providers/giteaProvider.js | 27 ++-- .../providers/giteaWorkspaceProvider.js | 30 +++-- src/services/providers/giteeProvider.js | 3 + .../providers/giteeWorkspaceProvider.js | 3 + src/services/providers/helpers/giteaHelper.js | 126 ++++++++++++++---- src/services/providers/helpers/giteeHelper.js | 2 +- src/services/timeSvc.js | 16 +-- 11 files changed, 156 insertions(+), 67 deletions(-) diff --git a/config/dev.env.js b/config/dev.env.js index 0620891b..f31dba18 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -8,5 +8,5 @@ module.exports = merge(prodEnv, { GITHUB_CLIENT_SECRET: '"80df676597abded1450926861965cc3f9bead6a0"', GITEE_CLIENT_ID: '"925ba7c78b85dec984f7877e4aca5cab10ae333c6d68e761bdb0b9dfb8f55672"', GITEE_CLIENT_SECRET: '"f05731066e42d307339dc8ebbb037a103881dafc7207a359a393b87749f1c562"', - GITEE_CALLBACK: '"http://test.local.com/oauth2/callback"' + CLIENT_ID: '"thF3qCGLN39OtafjGnqHyj6n02WwE6xD"', }) \ No newline at end of file diff --git a/server/conf.js b/server/conf.js index e71d6dd8..9b2d550b 100644 --- a/server/conf.js +++ b/server/conf.js @@ -10,7 +10,6 @@ const githubClientId = process.env.GITHUB_CLIENT_ID; const githubClientSecret = process.env.GITHUB_CLIENT_SECRET; const giteeClientId = process.env.GITEE_CLIENT_ID; const giteeClientSecret = process.env.GITEE_CLIENT_SECRET; -const giteeCallback = process.env.GITEE_CALLBACK; const googleClientId = process.env.GOOGLE_CLIENT_ID; const googleApiKey = process.env.GOOGLE_API_KEY; const wordpressClientId = process.env.WORDPRESS_CLIENT_ID; @@ -27,7 +26,6 @@ exports.values = { githubClientSecret, giteeClientId, giteeClientSecret, - giteeCallback, googleClientId, googleApiKey, wordpressClientId, diff --git a/src/components/menus/HistoryMenu.vue b/src/components/menus/HistoryMenu.vue index 3389cffc..c8c9f63f 100644 --- a/src/components/menus/HistoryMenu.vue +++ b/src/components/menus/HistoryMenu.vue @@ -9,17 +9,17 @@

同步 {{currentFileName}} 以启用修订历史 或者 登录 Google 以同步您的主工作区。

-

Loading history…

-

{{currentFileName}} has no history.

+

历史版本加载中…

+

{{currentFileName}} 没有历史版本.

@@ -39,7 +39,7 @@
- +
diff --git a/src/data/welcomeFile.md b/src/data/welcomeFile.md index 972fc39b..1bb5c10e 100644 --- a/src/data/welcomeFile.md +++ b/src/data/welcomeFile.md @@ -15,7 +15,7 @@ StackEdit 将您的文件存储在您的浏览器中,这意味着您的所有 您的所有文件和文件夹在文件资源管理器中都显示为树。您可以通过单击树中的文件从一个文件切换到另一个文件。 -##重命名文件 +## 重命名文件 您可以通过单击导航栏中的文件名或单击文件资源管理器中的**重命名**按钮来重命名当前文件。 diff --git a/src/services/providers/giteaProvider.js b/src/services/providers/giteaProvider.js index bb77496f..df88d84c 100644 --- a/src/services/providers/giteaProvider.js +++ b/src/services/providers/giteaProvider.js @@ -135,17 +135,24 @@ export default new Provider({ token, }); - return entries.map((entry) => { - const email = entry.author_email || entry.committer_email; - const sub = `${giteaHelper.subPrefix}:${token.serverUrl}/${email}`; - userSvc.addUserInfo({ - id: sub, - name: entry.author_name || entry.committer_name, - imageUrl: '', - }); - const date = entry.authored_date || entry.committed_date || 1; + return entries.map(({ + author, + committer, + commit, + sha, + }) => { + let user; + if (author && author.login) { + user = author; + } else if (committer && committer.login) { + user = committer; + } + const sub = `${giteaHelper.subPrefix}:${user.login}`; + userSvc.addUserInfo({ id: sub, name: user.login, imageUrl: user.avatar_url }); + const date = (commit.author && commit.author.date) + || (commit.committer && commit.committer.date); return { - id: entry.id, + id: sha, sub, created: date ? new Date(date).getTime() : 1, }; diff --git a/src/services/providers/giteaWorkspaceProvider.js b/src/services/providers/giteaWorkspaceProvider.js index 0ae8d0d5..fc1cd52a 100644 --- a/src/services/providers/giteaWorkspaceProvider.js +++ b/src/services/providers/giteaWorkspaceProvider.js @@ -251,19 +251,27 @@ export default new Provider({ path: getAbsolutePath({ id: fileSyncDataId }), }); - return entries.map((entry) => { - const email = entry.author_email || entry.committer_email; - const sub = `${giteaHelper.subPrefix}:${token.serverUrl}/${email}`; - userSvc.addUserInfo({ - id: sub, - name: entry.author_name || entry.committer_name, - imageUrl: '', // No way to get user's avatar url... - }); - const date = entry.authored_date || entry.committed_date || 1; + return entries.map(({ + author, + committer, + commit, + sha, + }) => { + let user; + if (author && author.login) { + user = author; + } else if (committer && committer.login) { + user = committer; + } + const sub = `${giteaHelper.subPrefix}:${user.login}`; + userSvc.addUserInfo({ id: sub, name: user.login, imageUrl: user.avatar_url }); + const date = (commit.author && commit.author.date) + || (commit.committer && commit.committer.date) + || 1; return { - id: entry.id, + id: sha, sub, - created: date ? new Date(date).getTime() : 1, + created: new Date(date).getTime(), }; }); }, diff --git a/src/services/providers/giteeProvider.js b/src/services/providers/giteeProvider.js index 9c68dacd..0e719d47 100644 --- a/src/services/providers/giteeProvider.js +++ b/src/services/providers/giteeProvider.js @@ -135,6 +135,9 @@ export default new Provider({ user = committer; } const sub = `${giteeHelper.subPrefix}:${user.login}`; + if (user.avatar_url && user.avatar_url.endsWith('.png')) { + user.avatar_url = `${user.avatar_url}!avatar60`; + } userSvc.addUserInfo({ id: sub, name: user.login, imageUrl: user.avatar_url }); const date = (commit.author && commit.author.date) || (commit.committer && commit.committer.date); diff --git a/src/services/providers/giteeWorkspaceProvider.js b/src/services/providers/giteeWorkspaceProvider.js index 3d5ec740..4617d3a5 100644 --- a/src/services/providers/giteeWorkspaceProvider.js +++ b/src/services/providers/giteeWorkspaceProvider.js @@ -249,6 +249,9 @@ export default new Provider({ user = committer; } const sub = `${giteeHelper.subPrefix}:${user.login}`; + if (user.avatar_url && user.avatar_url.endsWith('.png')) { + user.avatar_url = `${user.avatar_url}!avatar60`; + } userSvc.addUserInfo({ id: sub, name: user.login, imageUrl: user.avatar_url }); const date = (commit.author && commit.author.date) || (commit.committer && commit.committer.date) diff --git a/src/services/providers/helpers/giteaHelper.js b/src/services/providers/helpers/giteaHelper.js index 62d5268d..53fc8618 100644 --- a/src/services/providers/helpers/giteaHelper.js +++ b/src/services/providers/helpers/giteaHelper.js @@ -5,6 +5,8 @@ import userSvc from '../../userSvc'; import badgeSvc from '../../badgeSvc'; import constants from '../../../data/constants'; +const tokenExpirationMargin = 5 * 60 * 1000; + const request = ({ accessToken, serverUrl }, options) => networkSvc.request({ ...options, url: `${serverUrl}/api/v1/${options.url}`, @@ -51,30 +53,50 @@ export default { /** * https://docs.gitea.io/en-us/oauth2-provider/ */ - async startOauth2(serverUrl, applicationId, applicationSecret, sub = null, silent = false) { - // Get an OAuth2 code - const { code } = await networkSvc.startOauth2( - `${serverUrl}/login/oauth/authorize`, - { - client_id: applicationId, - response_type: 'code', - redirect_uri: constants.oauth2RedirectUri, - }, - silent, - ); + async startOauth2( + serverUrl, applicationId, applicationSecret, + sub = null, silent = false, refreshToken, + ) { + let tokenBody; + if (!silent) { + // Get an OAuth2 code + const { code } = await networkSvc.startOauth2( + `${serverUrl}/login/oauth/authorize`, + { + client_id: applicationId, + response_type: 'code', + redirect_uri: constants.oauth2RedirectUri, + }, + silent, + ); + // Exchange code with token + tokenBody = (await networkSvc.request({ + method: 'POST', + url: `${serverUrl}/login/oauth/access_token`, + body: { + client_id: applicationId, + client_secret: applicationSecret, + code, + grant_type: 'authorization_code', + redirect_uri: constants.oauth2RedirectUri, + }, + })).body; + } else { + // Exchange refreshToken with token + tokenBody = (await networkSvc.request({ + method: 'POST', + url: `${serverUrl}/login/oauth/access_token`, + body: { + client_id: applicationId, + client_secret: applicationSecret, + refresh_token: refreshToken, + grant_type: 'refresh_token', + redirect_uri: constants.oauth2RedirectUri, + }, + })).body; + } - // Exchange code with token - const accessToken = (await networkSvc.request({ - method: 'POST', - url: `${serverUrl}/login/oauth/access_token`, - body: { - client_id: applicationId, - client_secret: applicationSecret, - code, - grant_type: 'authorization_code', - redirect_uri: constants.oauth2RedirectUri, - }, - })).body.access_token; + const accessToken = tokenBody.access_token; // Call the user info endpoint const user = await request({ accessToken, serverUrl }, { @@ -96,6 +118,8 @@ export default { const token = { accessToken, name: user.username, + refreshToken: tokenBody.refresh_token, + expiresOn: Date.now() + (tokenBody.expires_in * 1000), serverUrl, sub: uniqueSub, }; @@ -104,6 +128,47 @@ export default { store.dispatch('data/addGiteaToken', token); return token; }, + // 刷新token + async refreshToken(token) { + const { + serverUrl, + applicationId, + applicationSecret, + sub, + } = token; + const lastToken = store.getters['data/giteaTokensBySub'][sub]; + // 兼容旧的没有过期时间 + if (!lastToken.expiresOn) { + await store.dispatch('modal/open', { + type: 'providerRedirection', + name: 'Gitea', + }); + return this.startOauth2(serverUrl, applicationId, applicationSecret, sub); + } + // lastToken is not expired + if (lastToken.expiresOn > Date.now() + tokenExpirationMargin) { + return lastToken; + } + + // existing token is about to expire. + // Try to get a new token in background + try { + return await this.startOauth2( + serverUrl, applicationId, applicationSecret, + sub, true, lastToken.refreshToken, + ); + } catch (err) { + // If it fails try to popup a window + if (store.state.offline) { + throw err; + } + await store.dispatch('modal/open', { + type: 'providerRedirection', + name: 'Gitea', + }); + return this.startOauth2(serverUrl, applicationId, applicationSecret, sub); + } + }, async addAccount(serverUrl, applicationId, applicationSecret, sub = null) { const token = await this.startOauth2(serverUrl, applicationId, applicationSecret, sub); badgeSvc.addBadge('addGiteaAccount'); @@ -129,7 +194,8 @@ export default { projectId, branch, }) { - return request(token, { + const refreshedToken = await this.refreshToken(token); + return request(refreshedToken, { url: `repos/${projectId}/git/trees/${branch}`, params: { recursive: true, @@ -147,7 +213,8 @@ export default { branch, path, }) { - return request(token, { + const refreshedToken = await this.refreshToken(token); + return request(refreshedToken, { url: `repos/${projectId}/commits`, params: { sha: branch, @@ -168,7 +235,8 @@ export default { content, sha, }) { - return request(token, { + const refreshedToken = await this.refreshToken(token); + return request(refreshedToken, { method: sha ? 'PUT' : 'POST', url: `repos/${projectId}/contents/${encodeURIComponent(path)}`, body: { @@ -190,7 +258,8 @@ export default { path, sha, }) { - return request(token, { + const refreshedToken = await this.refreshToken(token); + return request(refreshedToken, { method: 'DELETE', url: `repos/${projectId}/contents/${encodeURIComponent(path)}`, body: { @@ -210,7 +279,8 @@ export default { branch, path, }) { - const { sha, content } = await request(token, { + const refreshedToken = await this.refreshToken(token); + const { sha, content } = await request(refreshedToken, { url: `repos/${projectId}/contents/${encodeURIComponent(path)}`, params: { ref: branch }, }); diff --git a/src/services/providers/helpers/giteeHelper.js b/src/services/providers/helpers/giteeHelper.js index ffae68ab..59b02227 100644 --- a/src/services/providers/helpers/giteeHelper.js +++ b/src/services/providers/helpers/giteeHelper.js @@ -139,7 +139,7 @@ export default { return this.startOauth2(); } // lastToken is not expired - if (lastToken.expiresOn > Date.now() - tokenExpirationMargin) { + if (lastToken.expiresOn > Date.now() + tokenExpirationMargin) { return lastToken; } diff --git a/src/services/timeSvc.js b/src/services/timeSvc.js index 8b157ed2..f8895639 100644 --- a/src/services/timeSvc.js +++ b/src/services/timeSvc.js @@ -138,21 +138,21 @@ class RelativeTime { const hr = Math.round(min / 60); const day = Math.round(hr / 24); if (ms < 0) { - return 'just now'; + return '刚刚'; } else if (sec < 45) { - return 'just now'; + return '刚刚'; } else if (sec < 90) { - return 'a minute ago'; + return '1分钟前'; } else if (min < 45) { - return `${min} minutes ago`; + return `${min}分钟前`; } else if (min < 90) { - return 'an hour ago'; + return '1小时前'; } else if (hr < 24) { - return `${hr} hours ago`; + return `${hr}小时前`; } else if (hr < 36) { - return 'a day ago'; + return '1天前'; } else if (day < 30) { - return `${day} days ago`; + return `${day}天前`; } return null; } From 74b0fc4635a88cc8f7bd84a19ae4641557d5275e Mon Sep 17 00:00:00 2001 From: "xiaoqi.cxq" Date: Wed, 1 Jun 2022 17:45:31 +0800 Subject: [PATCH 4/5] update readme --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1f1d13ae..f744c8da 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,8 @@ StackEdit的作者可能因为什么原因,已经很久不维护了,Github ### TODO: 关于后续的一些想法 - 支持**Gitea**、**Gogs**两个轻量级且适于自建的Git仓库(毕竟Gitlab对机器配置要求较高)。想支持这两个主要也是考虑到其实很多公司已经禁用了Github或Gitee仓库,在公司都没法连上自己的Git仓库。 - 汉化,毕竟大家最熟悉的还是母语,并且该编辑器功能页面也不多,汉化工作量并不会很大。 -- 引入mdnice,右边预览增加mdnice预览选项,主要含选主题(含mdnice常用20多个主题)、支持自定义主题、复制到公众号、复制到知乎、复制到稀土掘金等基本功能,便于喜欢写公众号、博客的你可以更好更快的排版。 +- 替换主工作区为Gitee(原版本主工作区是Google Drive,国内只有fan墙才可以用) +- 引入mdnice,右边预览增加mdnice预览选项,主要含选主题(含mdnice常用20多个主题)、支持自定义主题、复制到公众号、复制到知乎、复制到稀土掘金等基本功能,便于喜欢写公众号、博客的同学可以更好更快的排版。 - ... 另外,朋友们有好的想法也可以在Issue或者加我微信 qicoding 提给我。 #### TODO 进度 @@ -24,6 +25,10 @@ StackEdit的作者可能因为什么原因,已经很久不维护了,Github **Gogs目前无法支持,因为API目前不支持直接把Markdown推上去,如果后续Gogs的API支持了再添加** +**已汉化主要功能部分(2022-06-01)** + +**接下来修改主工作区为Gitee** + ### 目前已部署地址 From e53ee489b4492635157e882dc2677727596572ad Mon Sep 17 00:00:00 2001 From: "xiaoqi.cxq" Date: Wed, 1 Jun 2022 17:47:19 +0800 Subject: [PATCH 5/5] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f744c8da..4e255340 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ### Fork出来修改的原因 StackEdit的作者可能因为什么原因,已经很久不维护了,Github授权登录很早之前就登录不了了,并且还没法支持国内常用的Gitee,所以想到Fork出来改,大概花了周末一整天终于改好了。 -新的Docker镜像在中央仓库为:[mafgwo/stackedit](https://hub.docker.com/r/mafgwo/stackedit),当前最新版本为:5.15.4(延续原有版本号) +新的Docker镜像在中央仓库为:[mafgwo/stackedit](https://hub.docker.com/r/mafgwo/stackedit) 并增加了以下2个环境变量: - `GITEE_CLIENT_ID` Gitee 的 Client ID