You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2026-02-28 09:22:25 +02:00
Compare commits
8 Commits
v2.0.2
...
testing_up
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
84a793270d | ||
|
|
5f8b73350d | ||
|
|
a733cb0394 | ||
|
|
7da4cb0d80 | ||
|
|
3233082b4c | ||
|
|
c782f5e981 | ||
|
|
db51e2dd4b | ||
|
|
f00f3d7f04 |
@@ -83,9 +83,6 @@ packages/app-cli/tests/MdToHtml.js.map
|
||||
packages/app-cli/tests/MdToMd.d.ts
|
||||
packages/app-cli/tests/MdToMd.js
|
||||
packages/app-cli/tests/MdToMd.js.map
|
||||
packages/app-cli/tests/services/keychain/KeychainService.d.ts
|
||||
packages/app-cli/tests/services/keychain/KeychainService.js
|
||||
packages/app-cli/tests/services/keychain/KeychainService.js.map
|
||||
packages/app-cli/tests/services/plugins/PluginService.d.ts
|
||||
packages/app-cli/tests/services/plugins/PluginService.js
|
||||
packages/app-cli/tests/services/plugins/PluginService.js.map
|
||||
@@ -1169,6 +1166,9 @@ packages/lib/services/keychain/KeychainServiceDriver.node.js.map
|
||||
packages/lib/services/keychain/KeychainServiceDriverBase.d.ts
|
||||
packages/lib/services/keychain/KeychainServiceDriverBase.js
|
||||
packages/lib/services/keychain/KeychainServiceDriverBase.js.map
|
||||
packages/lib/services/keychain/keychainService.test.d.ts
|
||||
packages/lib/services/keychain/keychainService.test.js
|
||||
packages/lib/services/keychain/keychainService.test.js.map
|
||||
packages/lib/services/plugins/BasePluginRunner.d.ts
|
||||
packages/lib/services/plugins/BasePluginRunner.js
|
||||
packages/lib/services/plugins/BasePluginRunner.js.map
|
||||
|
||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -69,9 +69,6 @@ packages/app-cli/tests/MdToHtml.js.map
|
||||
packages/app-cli/tests/MdToMd.d.ts
|
||||
packages/app-cli/tests/MdToMd.js
|
||||
packages/app-cli/tests/MdToMd.js.map
|
||||
packages/app-cli/tests/services/keychain/KeychainService.d.ts
|
||||
packages/app-cli/tests/services/keychain/KeychainService.js
|
||||
packages/app-cli/tests/services/keychain/KeychainService.js.map
|
||||
packages/app-cli/tests/services/plugins/PluginService.d.ts
|
||||
packages/app-cli/tests/services/plugins/PluginService.js
|
||||
packages/app-cli/tests/services/plugins/PluginService.js.map
|
||||
@@ -1155,6 +1152,9 @@ packages/lib/services/keychain/KeychainServiceDriver.node.js.map
|
||||
packages/lib/services/keychain/KeychainServiceDriverBase.d.ts
|
||||
packages/lib/services/keychain/KeychainServiceDriverBase.js
|
||||
packages/lib/services/keychain/KeychainServiceDriverBase.js.map
|
||||
packages/lib/services/keychain/keychainService.test.d.ts
|
||||
packages/lib/services/keychain/keychainService.test.js
|
||||
packages/lib/services/keychain/keychainService.test.js.map
|
||||
packages/lib/services/plugins/BasePluginRunner.d.ts
|
||||
packages/lib/services/plugins/BasePluginRunner.js
|
||||
packages/lib/services/plugins/BasePluginRunner.js.map
|
||||
|
||||
2
packages/app-desktop/package-lock.json
generated
2
packages/app-desktop/package-lock.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@joplin/app-desktop",
|
||||
"version": "2.0.2",
|
||||
"version": "2.0.1",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@joplin/app-desktop",
|
||||
"version": "2.0.2",
|
||||
"version": "2.0.1",
|
||||
"description": "Joplin for Desktop",
|
||||
"main": "main.js",
|
||||
"private": true,
|
||||
|
||||
@@ -3,11 +3,8 @@ import { _ } from './locale';
|
||||
const { rtrimSlashes } = require('./path-utils.js');
|
||||
import JoplinError from './JoplinError';
|
||||
import { Env } from './models/Setting';
|
||||
import Logger from './Logger';
|
||||
const { stringify } = require('query-string');
|
||||
|
||||
const logger = Logger.create('JoplinServerApi');
|
||||
|
||||
interface Options {
|
||||
baseUrl(): string;
|
||||
username(): string;
|
||||
@@ -136,78 +133,71 @@ export default class JoplinServerApi {
|
||||
url += stringify(query);
|
||||
}
|
||||
|
||||
try {
|
||||
if (this.debugRequests_) {
|
||||
logger.debug(this.requestToCurl_(url, fetchOptions));
|
||||
}
|
||||
let response: any = null;
|
||||
|
||||
let response: any = null;
|
||||
|
||||
if (options.source == 'file' && (method == 'POST' || method == 'PUT')) {
|
||||
if (fetchOptions.path) {
|
||||
const fileStat = await shim.fsDriver().stat(fetchOptions.path);
|
||||
if (fileStat) fetchOptions.headers['Content-Length'] = `${fileStat.size}`;
|
||||
}
|
||||
response = await shim.uploadBlob(url, fetchOptions);
|
||||
} else if (options.target == 'string') {
|
||||
if (typeof body === 'string') fetchOptions.headers['Content-Length'] = `${shim.stringByteLength(body)}`;
|
||||
response = await shim.fetch(url, fetchOptions);
|
||||
} else {
|
||||
// file
|
||||
response = await shim.fetchBlob(url, fetchOptions);
|
||||
}
|
||||
|
||||
const responseText = await response.text();
|
||||
|
||||
if (this.debugRequests_) {
|
||||
logger.debug('Response', responseText);
|
||||
}
|
||||
|
||||
// Creates an error object with as much data as possible as it will appear in the log, which will make debugging easier
|
||||
const newError = (message: string, code: number = 0) => {
|
||||
// Gives a shorter response for error messages. Useful for cases where a full HTML page is accidentally loaded instead of
|
||||
// JSON. That way the error message will still show there's a problem but without filling up the log or screen.
|
||||
const shortResponseText = (`${responseText}`).substr(0, 1024);
|
||||
// return new JoplinError(`${method} ${path}: ${message} (${code}): ${shortResponseText}`, code);
|
||||
return new JoplinError(message, code, `${method} ${path}: ${message} (${code}): ${shortResponseText}`);
|
||||
};
|
||||
|
||||
let responseJson_: any = null;
|
||||
const loadResponseJson = async () => {
|
||||
if (!responseText) return null;
|
||||
if (responseJson_) return responseJson_;
|
||||
responseJson_ = JSON.parse(responseText);
|
||||
if (!responseJson_) throw newError('Cannot parse JSON response', response.status);
|
||||
return responseJson_;
|
||||
};
|
||||
|
||||
if (!response.ok) {
|
||||
if (options.target === 'file') throw newError('fetchBlob error', response.status);
|
||||
|
||||
let json = null;
|
||||
try {
|
||||
json = await loadResponseJson();
|
||||
} catch (error) {
|
||||
// Just send back the plain text in newErro()
|
||||
}
|
||||
|
||||
if (json && json.error) {
|
||||
throw newError(`${json.error}`, json.code ? json.code : response.status);
|
||||
}
|
||||
|
||||
throw newError('Unknown error', response.status);
|
||||
}
|
||||
|
||||
if (options.responseFormat === 'text') return responseText;
|
||||
|
||||
const output = await loadResponseJson();
|
||||
return output;
|
||||
} catch (error) {
|
||||
if (error.code !== 404) {
|
||||
logger.warn(this.requestToCurl_(url, fetchOptions));
|
||||
logger.warn(error);
|
||||
}
|
||||
throw error;
|
||||
if (this.debugRequests_) {
|
||||
console.info('Joplin API Call', `${method} ${url}`, headers, options);
|
||||
console.info(this.requestToCurl_(url, fetchOptions));
|
||||
}
|
||||
|
||||
if (options.source == 'file' && (method == 'POST' || method == 'PUT')) {
|
||||
if (fetchOptions.path) {
|
||||
const fileStat = await shim.fsDriver().stat(fetchOptions.path);
|
||||
if (fileStat) fetchOptions.headers['Content-Length'] = `${fileStat.size}`;
|
||||
}
|
||||
response = await shim.uploadBlob(url, fetchOptions);
|
||||
} else if (options.target == 'string') {
|
||||
if (typeof body === 'string') fetchOptions.headers['Content-Length'] = `${shim.stringByteLength(body)}`;
|
||||
response = await shim.fetch(url, fetchOptions);
|
||||
} else {
|
||||
// file
|
||||
response = await shim.fetchBlob(url, fetchOptions);
|
||||
}
|
||||
|
||||
const responseText = await response.text();
|
||||
|
||||
if (this.debugRequests_) {
|
||||
console.info('Joplin API Response', responseText);
|
||||
}
|
||||
|
||||
// Creates an error object with as much data as possible as it will appear in the log, which will make debugging easier
|
||||
const newError = (message: string, code: number = 0) => {
|
||||
// Gives a shorter response for error messages. Useful for cases where a full HTML page is accidentally loaded instead of
|
||||
// JSON. That way the error message will still show there's a problem but without filling up the log or screen.
|
||||
const shortResponseText = (`${responseText}`).substr(0, 1024);
|
||||
// return new JoplinError(`${method} ${path}: ${message} (${code}): ${shortResponseText}`, code);
|
||||
return new JoplinError(message, code, `${method} ${path}: ${message} (${code}): ${shortResponseText}`);
|
||||
};
|
||||
|
||||
let responseJson_: any = null;
|
||||
const loadResponseJson = async () => {
|
||||
if (!responseText) return null;
|
||||
if (responseJson_) return responseJson_;
|
||||
responseJson_ = JSON.parse(responseText);
|
||||
if (!responseJson_) throw newError('Cannot parse JSON response', response.status);
|
||||
return responseJson_;
|
||||
};
|
||||
|
||||
if (!response.ok) {
|
||||
if (options.target === 'file') throw newError('fetchBlob error', response.status);
|
||||
|
||||
let json = null;
|
||||
try {
|
||||
json = await loadResponseJson();
|
||||
} catch (error) {
|
||||
// Just send back the plain text in newErro()
|
||||
}
|
||||
|
||||
if (json && json.error) {
|
||||
throw newError(`${json.error}`, json.code ? json.code : response.status);
|
||||
}
|
||||
|
||||
throw newError('Unknown error', response.status);
|
||||
}
|
||||
|
||||
if (options.responseFormat === 'text') return responseText;
|
||||
|
||||
const output = await loadResponseJson();
|
||||
return output;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,17 @@
|
||||
const { afterEachCleanUp } = require('./testing/test-utils.js');
|
||||
const { shimInit } = require('./shim-init-node.js');
|
||||
const shim = require('./shim').default;
|
||||
const sharp = require('sharp');
|
||||
|
||||
shimInit(sharp, null);
|
||||
let keytar;
|
||||
try {
|
||||
keytar = shim.platformSupportsKeyChain() ? require('keytar') : null;
|
||||
} catch (error) {
|
||||
console.error('Cannot load keytar - keychain support will be disabled', error);
|
||||
keytar = null;
|
||||
}
|
||||
|
||||
shimInit(sharp, keytar);
|
||||
|
||||
global.afterEach(async () => {
|
||||
await afterEachCleanUp();
|
||||
|
||||
18
packages/lib/package-lock.json
generated
18
packages/lib/package-lock.json
generated
@@ -4059,6 +4059,24 @@
|
||||
"verror": "1.10.0"
|
||||
}
|
||||
},
|
||||
"keytar": {
|
||||
"version": "7.7.0",
|
||||
"resolved": "https://registry.npmjs.org/keytar/-/keytar-7.7.0.tgz",
|
||||
"integrity": "sha512-YEY9HWqThQc5q5xbXbRwsZTh2PJ36OSYRjSv3NN2xf5s5dpLTjEZnC2YikR29OaVybf9nQ0dJ/80i40RS97t/A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"node-addon-api": "^3.0.0",
|
||||
"prebuild-install": "^6.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"node-addon-api": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.0.tgz",
|
||||
"integrity": "sha512-kcwSAWhPi4+QzAtsL2+2s/awvDo2GKLsvMCwNRxb5BUshteXU8U97NCyvQDsGKs/m0He9WcG4YWew/BnuLx++w==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
"@types/fs-extra": "^9.0.6",
|
||||
"jest": "^26.6.3",
|
||||
"sharp": "^0.26.2",
|
||||
"keytar": "^7.0.0",
|
||||
"typescript": "^4.0.5",
|
||||
"clean-html": "^1.5.0"
|
||||
},
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import KeychainService from '@joplin/lib/services/keychain/KeychainService';
|
||||
import shim from '@joplin/lib/shim';
|
||||
import Setting from '@joplin/lib/models/Setting';
|
||||
import { db, setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/test-utils';
|
||||
import KeychainService from '../../services/keychain/KeychainService';
|
||||
import shim from '../../shim';
|
||||
import Setting from '../../models/Setting';
|
||||
|
||||
const { db, setupDatabaseAndSynchronizer, switchClient } = require('../../testing/test-utils.js');
|
||||
|
||||
function describeIfCompatible(name: string, fn: any, elseFn: any) {
|
||||
if (['win32', 'darwin'].includes(shim.platformName())) {
|
||||
@@ -6,13 +6,13 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: 南宫小骏 <jackytsu@vip.qq.com>\n"
|
||||
"Language-Team: zh_CN <jackytsu.vip.qq.com>\n"
|
||||
"Last-Translator: Yang Zhang <zyangmath@gmail.com>\n"
|
||||
"Language-Team: zh_CN <yaozeye@yaozeye.onmicrosoft.com>\n"
|
||||
"Language: zh_CN\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.4.3\n"
|
||||
"X-Generator: Poedit 2.4.2\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: packages/app-desktop/bridge.js:106 packages/app-desktop/bridge.js:110
|
||||
@@ -119,11 +119,11 @@ msgstr "下载"
|
||||
|
||||
#: packages/app-desktop/checkForUpdates.js:189
|
||||
msgid "Skip this version"
|
||||
msgstr "跳过该版本"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/checkForUpdates.js:189
|
||||
msgid "Full changelog"
|
||||
msgstr "完整更新记录"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/NoteRevisionViewer.min.js:75
|
||||
#, javascript-format
|
||||
@@ -267,10 +267,12 @@ msgid "Retry"
|
||||
msgstr "重试"
|
||||
|
||||
#: packages/app-desktop/gui/StatusScreen/StatusScreen.js:113
|
||||
#, fuzzy
|
||||
msgid "Advanced tools"
|
||||
msgstr "高级工具"
|
||||
msgstr "高级选项"
|
||||
|
||||
#: packages/app-desktop/gui/StatusScreen/StatusScreen.js:115
|
||||
#, fuzzy
|
||||
msgid "Export debug report"
|
||||
msgstr "导出调试报告"
|
||||
|
||||
@@ -328,23 +330,23 @@ msgstr "复选框列表"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/setupToolbarButtons.js:17
|
||||
msgid "Highlight"
|
||||
msgstr "突出显示"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/setupToolbarButtons.js:22
|
||||
msgid "Strikethrough"
|
||||
msgstr "删除线"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/setupToolbarButtons.js:27
|
||||
msgid "Insert"
|
||||
msgstr "插入"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/setupToolbarButtons.js:33
|
||||
msgid "Superscript"
|
||||
msgstr "上标"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/setupToolbarButtons.js:39
|
||||
msgid "Subscript"
|
||||
msgstr "订阅"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js:544
|
||||
#: packages/app-mobile/components/screens/Note.js:1016
|
||||
@@ -505,8 +507,9 @@ msgid "Delete line"
|
||||
msgstr "删除行"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/commands/editorCommandDeclarations.js:92
|
||||
#, fuzzy
|
||||
msgid "Duplicate line"
|
||||
msgstr "复制行"
|
||||
msgstr "创建副本"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/commands/editorCommandDeclarations.js:96
|
||||
msgid "Undo"
|
||||
@@ -697,11 +700,11 @@ msgstr "保存"
|
||||
msgid ""
|
||||
"Safe mode is currently active. Note rendering and all plugins are "
|
||||
"temporarily disabled."
|
||||
msgstr "安全模式当前已被激活。笔记渲染和所有的插件被临时禁用。"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/MainScreen.js:438
|
||||
msgid "Disable safe mode and restart"
|
||||
msgstr "禁用安全模式并重启"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/MainScreen.js:442
|
||||
msgid ""
|
||||
@@ -743,15 +746,15 @@ msgstr "更多信息"
|
||||
#: packages/app-desktop/gui/MainScreen/MainScreen.js:468
|
||||
#, javascript-format
|
||||
msgid "%s (%s) would like to share a notebook with you."
|
||||
msgstr "%s (%s) 想要分享笔记本给你。"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/MainScreen.js:470
|
||||
msgid "Accept"
|
||||
msgstr "接受"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/MainScreen.js:472
|
||||
msgid "Reject"
|
||||
msgstr "拒绝"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/MainScreen.js:476
|
||||
msgid "Some items cannot be synchronised."
|
||||
@@ -791,11 +794,11 @@ msgstr "新建待办事项"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/toggleNoteList.js:18
|
||||
msgid "Toggle note list"
|
||||
msgstr "切换笔记列表"
|
||||
msgstr "显示/隐藏笔记列表"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/toggleSideBar.js:18
|
||||
msgid "Toggle sidebar"
|
||||
msgstr "切换边栏"
|
||||
msgstr "显示/隐藏边栏"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/editAlarm.js:20
|
||||
#: packages/app-mobile/components/SelectDateTimeDialog.js:84
|
||||
@@ -835,8 +838,9 @@ msgid "Toggle editors"
|
||||
msgstr "切换编辑器"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/showShareFolderDialog.js:16
|
||||
#, fuzzy
|
||||
msgid "Share notebook..."
|
||||
msgstr "分享笔记本..."
|
||||
msgstr "分享笔记..."
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/toggleLayoutMoveMode.js:16
|
||||
msgid "Change application layout"
|
||||
@@ -913,7 +917,7 @@ msgstr "令牌已复制到剪贴板!"
|
||||
|
||||
#: packages/app-desktop/gui/ClipperConfigScreen.min.js:44
|
||||
msgid "Are you sure you want to renew the authorisation token?"
|
||||
msgstr "确定要更新授权令牌吗?"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/ClipperConfigScreen.min.js:84
|
||||
msgid "The web clipper service is enabled and set to auto-start."
|
||||
@@ -992,7 +996,7 @@ msgstr "该授权令牌仅用于允许第三方应用程序访问 Joplin。"
|
||||
|
||||
#: packages/app-desktop/gui/ClipperConfigScreen.min.js:222
|
||||
msgid "Renew token"
|
||||
msgstr "更新令牌"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/MenuBar.js:167
|
||||
#, javascript-format
|
||||
@@ -1171,7 +1175,7 @@ msgstr "以下笔记已被导入: %s"
|
||||
|
||||
#: packages/app-desktop/gui/utils/NoteListUtils.js:44
|
||||
msgid "Duplicate"
|
||||
msgstr "复制"
|
||||
msgstr "创建副本"
|
||||
|
||||
#: packages/app-desktop/gui/utils/NoteListUtils.js:49
|
||||
#, javascript-format
|
||||
@@ -1464,12 +1468,13 @@ msgid "You do not have any installed plugin."
|
||||
msgstr "您尚未安装任何插件。"
|
||||
|
||||
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js:232
|
||||
#, fuzzy
|
||||
msgid "Could not connect to plugin repository"
|
||||
msgstr "无法连接到插件库"
|
||||
msgstr "无法安装插件:%s"
|
||||
|
||||
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js:234
|
||||
msgid "Try again"
|
||||
msgstr "重试"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.js:242
|
||||
msgid "Plugin tools"
|
||||
@@ -1679,18 +1684,19 @@ msgid_plural "Copy Shareable Links"
|
||||
msgstr[0] "复制分享链接"
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:138
|
||||
#, fuzzy
|
||||
msgid "Unshare"
|
||||
msgstr "取消分享"
|
||||
msgstr "分享"
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:180
|
||||
msgid ""
|
||||
"Delete this invitation? The recipient will no longer have access to this "
|
||||
"shared notebook."
|
||||
msgstr "删除这个邀请?接受者将无法再访问到这个共享的笔记本。"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:194
|
||||
msgid "Add recipient:"
|
||||
msgstr "添加接受者:"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:197
|
||||
#: packages/app-mobile/components/NoteBodyViewer/hooks/useOnResourceLongPress.js:28
|
||||
@@ -1700,41 +1706,45 @@ msgstr "分享"
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:206
|
||||
msgid "Recipient has not yet accepted the invitation"
|
||||
msgstr "接受者还没有接受邀请"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:207
|
||||
msgid "Recipient has rejected the invitation"
|
||||
msgstr "接受者拒绝了邀请"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:208
|
||||
msgid "Recipient has accepted the invitation"
|
||||
msgstr "接受者接受了邀请"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:218
|
||||
msgid "Recipients:"
|
||||
msgstr "接受者:"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:230
|
||||
#, fuzzy
|
||||
msgid "Synchronizing..."
|
||||
msgstr "正在同步..."
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:231
|
||||
#, fuzzy
|
||||
msgid "Sharing notebook..."
|
||||
msgstr "分享笔记本..."
|
||||
msgstr "分享笔记..."
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:241
|
||||
msgid ""
|
||||
"Unshare this notebook? The recipients will no longer have access to its "
|
||||
"content."
|
||||
msgstr "取消分享这个笔记本?接受者将无法再访问到它的内容。"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.js:251
|
||||
#, fuzzy
|
||||
msgid "Share Notebook"
|
||||
msgstr "分享笔记本"
|
||||
msgstr "分享笔记"
|
||||
|
||||
#: packages/app-desktop/commands/toggleSafeMode.js:18
|
||||
#, fuzzy
|
||||
msgid "Toggle safe mode"
|
||||
msgstr "切换安全模式"
|
||||
msgstr "显示/隐藏边栏"
|
||||
|
||||
#: packages/app-desktop/commands/toggleExternalEditing.js:18
|
||||
msgid "Toggle external editing"
|
||||
@@ -1826,7 +1836,7 @@ msgstr "配置"
|
||||
|
||||
#: packages/app-mobile/components/side-menu-content.js:351
|
||||
msgid "Mobile data - auto-sync disabled"
|
||||
msgstr "手机数据自动同步被禁用"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-mobile/components/note-list.js:97
|
||||
msgid "You currently have no notebooks."
|
||||
@@ -2339,8 +2349,9 @@ msgid "Joplin Server URL"
|
||||
msgstr "Joplin 服务器 URL"
|
||||
|
||||
#: packages/lib/models/Setting.js:335
|
||||
#, fuzzy
|
||||
msgid "Joplin Server email"
|
||||
msgstr "Joplin Server 邮箱"
|
||||
msgstr "Joplin 服务器"
|
||||
|
||||
#: packages/lib/models/Setting.js:346
|
||||
msgid "Joplin Server password"
|
||||
@@ -2582,11 +2593,11 @@ msgid ""
|
||||
"Used for most text in the markdown editor. If not found, a generic "
|
||||
"proportional (variable width) font is used."
|
||||
msgstr ""
|
||||
"用于 markdown 编辑器中的大多数文本。如果没找到,会使用默认(非等宽)字体。"
|
||||
|
||||
#: packages/lib/models/Setting.js:726
|
||||
#, fuzzy
|
||||
msgid "Editor monospace font family"
|
||||
msgstr "编辑器等宽字体族"
|
||||
msgstr "编辑器字体族"
|
||||
|
||||
#: packages/lib/models/Setting.js:727
|
||||
msgid ""
|
||||
@@ -2594,8 +2605,6 @@ msgid ""
|
||||
"tables, checkboxes, code). If not found, a generic monospace (fixed width) "
|
||||
"font is used."
|
||||
msgstr ""
|
||||
"用于那些需要使用固定宽度的字体来清晰地布局文本的场景(例如:表格、多选框和代"
|
||||
"码块)。如果没有找到,会使用默认(等宽)字体。"
|
||||
|
||||
#: packages/lib/models/Setting.js:748
|
||||
msgid "Custom stylesheet for rendered Markdown"
|
||||
@@ -2648,7 +2657,7 @@ msgstr "%d 小时"
|
||||
|
||||
#: packages/lib/models/Setting.js:817
|
||||
msgid "Synchronise only over WiFi connection"
|
||||
msgstr "只通过 WiFi 网络同步数据"
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/models/Setting.js:824
|
||||
msgid "Text editor command"
|
||||
@@ -3725,7 +3734,7 @@ msgstr "将选定文件添加到笔记中。"
|
||||
msgid ""
|
||||
"Runs the commands contained in the text file. There should be one command "
|
||||
"per line."
|
||||
msgstr "执行文本文件中包含的命令。每个命令占一行。"
|
||||
msgstr ""
|
||||
|
||||
#: packages/app-cli/app/command-version.js:11
|
||||
msgid "Displays version information"
|
||||
|
||||
Reference in New Issue
Block a user