You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-08-30 20:39:46 +02:00
Compare commits
28 Commits
external-w
...
android-v2
Author | SHA1 | Date | |
---|---|---|---|
|
51cc458e55 | ||
|
667d6420f2 | ||
|
98fba37cd3 | ||
|
5f1c78c0c1 | ||
|
2db2a1ccac | ||
|
78d2190767 | ||
|
2788521607 | ||
|
2de344eeca | ||
|
19dba16099 | ||
|
d1c77bdcfa | ||
|
b14956afbd | ||
|
250e97247f | ||
|
41cb47b6c8 | ||
|
7c3cf8ce84 | ||
|
c8f4c3f4ee | ||
|
95e79d5dc0 | ||
|
58654d35a2 | ||
|
14bef046f9 | ||
|
9e0bbdf912 | ||
|
9eacb6eb1b | ||
|
97c5493bc1 | ||
|
eb960a516c | ||
|
fb5ffa562f | ||
|
864b3c710c | ||
|
198287f86a | ||
|
b903542aed | ||
|
bda4c3a667 | ||
|
23617c9409 |
@@ -1974,9 +1974,15 @@ packages/tools/update-readme-download.js.map
|
||||
packages/tools/update-readme-sponsors.d.ts
|
||||
packages/tools/update-readme-sponsors.js
|
||||
packages/tools/update-readme-sponsors.js.map
|
||||
packages/tools/updateMarkdownDoc.d.ts
|
||||
packages/tools/updateMarkdownDoc.js
|
||||
packages/tools/updateMarkdownDoc.js.map
|
||||
packages/tools/website/build.d.ts
|
||||
packages/tools/website/build.js
|
||||
packages/tools/website/build.js.map
|
||||
packages/tools/website/updateDownloadPage.d.ts
|
||||
packages/tools/website/updateDownloadPage.js
|
||||
packages/tools/website/updateDownloadPage.js.map
|
||||
packages/tools/website/utils/frontMatter.d.ts
|
||||
packages/tools/website/utils/frontMatter.js
|
||||
packages/tools/website/utils/frontMatter.js.map
|
||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@@ -1957,9 +1957,15 @@ packages/tools/update-readme-download.js.map
|
||||
packages/tools/update-readme-sponsors.d.ts
|
||||
packages/tools/update-readme-sponsors.js
|
||||
packages/tools/update-readme-sponsors.js.map
|
||||
packages/tools/updateMarkdownDoc.d.ts
|
||||
packages/tools/updateMarkdownDoc.js
|
||||
packages/tools/updateMarkdownDoc.js.map
|
||||
packages/tools/website/build.d.ts
|
||||
packages/tools/website/build.js
|
||||
packages/tools/website/build.js.map
|
||||
packages/tools/website/updateDownloadPage.d.ts
|
||||
packages/tools/website/updateDownloadPage.js
|
||||
packages/tools/website/updateDownloadPage.js.map
|
||||
packages/tools/website/utils/frontMatter.d.ts
|
||||
packages/tools/website/utils/frontMatter.js
|
||||
packages/tools/website/utils/frontMatter.js.map
|
||||
|
@@ -64,7 +64,7 @@ The Web Clipper is a browser extension that allows you to save web pages and scr
|
||||
# Sponsors
|
||||
|
||||
<!-- SPONSORS-ORG -->
|
||||
<a href="https://usrigging.com/"><img title="U.S. Ringing Supply" width="256" src="https://joplinapp.org/images/sponsors/RingingSupply.svg"/></a> <a href="https://www.hosting.de/nextcloud/?mtm_campaign=managed-nextcloud&mtm_kwd=joplinapp&mtm_source=joplinapp-github&mtm_medium=banner"><img title="Hosting.de" width="256" src="https://joplinapp.org/images/sponsors/HostingDe.png"/></a> <a href="https://seirei.ne.jp"><img title="Serei Network" width="256" src="https://joplinapp.org/images/sponsors/SeireiNetwork.png"/></a>
|
||||
<a href="https://seirei.ne.jp"><img title="Serei Network" width="256" src="https://joplinapp.org/images/sponsors/SeireiNetwork.png"/></a> <a href="https://usrigging.com/"><img title="U.S. Ringing Supply" width="256" src="https://joplinapp.org/images/sponsors/RingingSupply.svg"/></a> <a href="https://www.hosting.de/nextcloud/?mtm_campaign=managed-nextcloud&mtm_kwd=joplinapp&mtm_source=joplinapp-github&mtm_medium=banner"><img title="Hosting.de" width="256" src="https://joplinapp.org/images/sponsors/HostingDe.png"/></a>
|
||||
<!-- SPONSORS-ORG -->
|
||||
|
||||
* * *
|
||||
|
10
package.json
10
package.json
@@ -12,12 +12,12 @@
|
||||
"build": "lerna run build && npm run tsc",
|
||||
"buildApiDoc": "npm start --prefix=packages/app-cli -- apidoc ../../readme/api/references/rest_api.md",
|
||||
"buildCommandIndex": "gulp buildCommandIndex",
|
||||
"buildDoc": "./packages/tools/build-all.sh",
|
||||
"buildPluginDoc": "typedoc --name 'Joplin Plugin API Documentation' --mode file -theme './Assets/PluginDocTheme/' --readme './Assets/PluginDocTheme/index.md' --excludeNotExported --excludeExternals --excludePrivate --excludeProtected --out docs/api/references/plugin_api packages/lib/services/plugins/api/",
|
||||
"buildSettingJsonSchema": "npm start --prefix=packages/app-cli -- settingschema ../../docs/schema/settings.json",
|
||||
"updateMarkdownDoc": "node ./packages/tools/updateMarkdownDoc",
|
||||
"buildPluginDoc": "typedoc --name 'Joplin Plugin API Documentation' --mode file -theme './Assets/PluginDocTheme/' --readme './Assets/PluginDocTheme/index.md' --excludeNotExported --excludeExternals --excludePrivate --excludeProtected --out ../joplin-website/docs/api/references/plugin_api packages/lib/services/plugins/api/",
|
||||
"buildSettingJsonSchema": "npm start --prefix=packages/app-cli -- settingschema ../../../joplin-website/docs/schema/settings.json",
|
||||
"buildTranslations": "npm run tsc && node packages/tools/build-translation.js",
|
||||
"buildTranslationsNoTsc": "node packages/tools/build-translation.js",
|
||||
"buildWebsite": "npm run buildApiDoc && node ./packages/tools/website/build.js && npm run buildPluginDoc && npm run buildSettingJsonSchema",
|
||||
"buildWebsite": "node ./packages/tools/website/build.js && npm run buildPluginDoc && npm run buildSettingJsonSchema",
|
||||
"circularDependencyCheck": "madge --warning --circular --extensions js ./",
|
||||
"clean": "lerna clean -y && lerna run clean",
|
||||
"dependencyTree": "madge",
|
||||
@@ -45,7 +45,7 @@
|
||||
"updateIgnored": "gulp updateIgnoredTypeScriptBuild",
|
||||
"updatePluginTypes": "./packages/generator-joplin/updateTypes.sh",
|
||||
"watch": "lerna run watch --stream --parallel",
|
||||
"watchWebsite": "nodemon --verbose --watch Assets/WebsiteAssets --watch packages/tools/website/build.js --ext md,ts,js,mustache,css,tsx,gif,png,svg --exec \"node packages/tools/website/build.js && http-server --port 8077 docs -a localhost\"",
|
||||
"watchWebsite": "nodemon --verbose --watch Assets/WebsiteAssets --watch packages/tools/website/build.js --ext md,ts,js,mustache,css,tsx,gif,png,svg --exec \"node packages/tools/website/build.js && http-server --port 8077 ../joplin-website/docs -a localhost\"",
|
||||
"i": "node packages/tools/lernaInstall"
|
||||
},
|
||||
"husky": {
|
||||
|
@@ -1,7 +1,6 @@
|
||||
import { CommandRuntime, CommandDeclaration, CommandContext } from '@joplin/lib/services/CommandService';
|
||||
import { _ } from '@joplin/lib/locale';
|
||||
import ShareService from '@joplin/lib/services/share/ShareService';
|
||||
import Setting from '@joplin/lib/models/Setting';
|
||||
import Logger from '@joplin/lib/Logger';
|
||||
|
||||
const logger = Logger.create('leaveSharedFolder');
|
||||
@@ -26,10 +25,7 @@ export const runtime = (): CommandRuntime => {
|
||||
const share = shares.find(s => s.folder_id === folderId);
|
||||
if (!share) throw new Error(_('Could not verify the share status of this notebook - aborting. Please try again when you are connected to the internet.'));
|
||||
|
||||
const userId = Setting.value('sync.userId');
|
||||
if (share.user.id === userId) throw new Error('Cannot leave own notebook');
|
||||
|
||||
await ShareService.instance().leaveSharedFolder(folderId);
|
||||
await ShareService.instance().leaveSharedFolder(folderId, share.user.id);
|
||||
} catch (error) {
|
||||
logger.error(error);
|
||||
alert(_('Error: %s', error.message));
|
||||
|
4
packages/app-desktop/package-lock.json
generated
4
packages/app-desktop/package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@joplin/app-desktop",
|
||||
"version": "2.6.9",
|
||||
"version": "2.6.10",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@joplin/app-desktop",
|
||||
"version": "2.6.9",
|
||||
"version": "2.6.10",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@electron/remote": "^2.0.1",
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@joplin/app-desktop",
|
||||
"version": "2.6.9",
|
||||
"version": "2.6.10",
|
||||
"description": "Joplin for Desktop",
|
||||
"main": "main.js",
|
||||
"private": true,
|
||||
|
@@ -146,8 +146,8 @@ android {
|
||||
applicationId "net.cozic.joplin"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 2097664
|
||||
versionName "2.6.8"
|
||||
versionCode 2097665
|
||||
versionName "2.6.9"
|
||||
ndk {
|
||||
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
|
||||
}
|
||||
|
@@ -87,6 +87,7 @@ const processLinkTag = (baseDir: string, _name: string, attrs: any): string => {
|
||||
if (!href) return null;
|
||||
|
||||
const filePath = `${baseDir}/${href}`;
|
||||
|
||||
const content = fs.readFileSync(filePath, 'utf8');
|
||||
return `<style>${processCssContent(dirname(filePath), content)}</style>`;
|
||||
};
|
||||
@@ -95,8 +96,26 @@ const processScriptTag = (baseDir: string, _name: string, attrs: any): string =>
|
||||
const src = attrValue(attrs, 'src');
|
||||
if (!src) return null;
|
||||
|
||||
const content = fs.readFileSync(`${baseDir}/${src}`, 'utf8');
|
||||
return `<script>${htmlentities(content)}</script>`;
|
||||
const scriptFilePath = `${baseDir}/${src}`;
|
||||
let content = fs.readFileSync(scriptFilePath, 'utf8');
|
||||
|
||||
// There's no simple way to insert arbitrary content in <script> tags.
|
||||
// Encoding HTML entities doesn't work because the JS parser will not decode
|
||||
// them before parsing. We also can't put the code verbatim since it may
|
||||
// contain strings such as `</script>` or `<!--` which would break the HTML
|
||||
// file.
|
||||
//
|
||||
// So it seems the only way is to escape these specific sequences with a
|
||||
// backslash. It shouldn't break the JS code and should allow the HTML
|
||||
// parser to work as expected.
|
||||
//
|
||||
// https://stackoverflow.com/a/41302266/561309
|
||||
|
||||
content = content.replace(/<script>/g, '<\\script>');
|
||||
content = content.replace(/<\/script>/g, '<\\/script>');
|
||||
content = content.replace(/<!--/g, '<\\!--');
|
||||
|
||||
return `<script>${content}</script>`;
|
||||
};
|
||||
|
||||
const processImgTag = (baseDir: string, _name: string, attrs: any): string => {
|
||||
|
@@ -94,8 +94,10 @@ class Logger {
|
||||
};
|
||||
}
|
||||
|
||||
setLevel(level: LogLevel) {
|
||||
public setLevel(level: LogLevel) {
|
||||
const previous = this.level_;
|
||||
this.level_ = level;
|
||||
return previous;
|
||||
}
|
||||
|
||||
level() {
|
||||
|
@@ -424,6 +424,7 @@ export default class Synchronizer {
|
||||
// Before synchronising make sure all share_id properties are set
|
||||
// correctly so as to share/unshare the right items.
|
||||
await Folder.updateAllShareIds(this.resourceService());
|
||||
if (this.shareService_) await this.shareService_.checkShareConsistency();
|
||||
|
||||
const itemUploader = new ItemUploader(this.api(), this.apiCall);
|
||||
|
||||
|
@@ -282,7 +282,7 @@ export default class Folder extends BaseItem {
|
||||
return this.db().selectAll(sql, [folderId]);
|
||||
}
|
||||
|
||||
private static async rootSharedFolders(): Promise<FolderEntity[]> {
|
||||
public static async rootSharedFolders(): Promise<FolderEntity[]> {
|
||||
return this.db().selectAll('SELECT id, share_id FROM folders WHERE parent_id = "" AND share_id != ""');
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import Note from '../../models/Note';
|
||||
import { encryptionService, msleep, setupDatabaseAndSynchronizer, switchClient } from '../../testing/test-utils';
|
||||
import ShareService from './ShareService';
|
||||
import reducer from '../../reducer';
|
||||
import reducer, { defaultState } from '../../reducer';
|
||||
import { createStore } from 'redux';
|
||||
import { FolderEntity, NoteEntity } from '../database/types';
|
||||
import Folder from '../../models/Folder';
|
||||
@@ -10,10 +10,15 @@ import { generateKeyPair } from '../e2ee/ppk';
|
||||
import MasterKey from '../../models/MasterKey';
|
||||
import { MasterKeyEntity } from '../e2ee/types';
|
||||
import { updateMasterPassword } from '../e2ee/utils';
|
||||
import Logger, { LogLevel } from '../../Logger';
|
||||
|
||||
const testReducer = (state: any = defaultState, action: any) => {
|
||||
return reducer(state, action);
|
||||
};
|
||||
|
||||
function mockService(api: any) {
|
||||
const service = new ShareService();
|
||||
const store = createStore(reducer as any);
|
||||
const store = createStore(testReducer as any);
|
||||
service.initialize(store, encryptionService(), api);
|
||||
return service;
|
||||
}
|
||||
@@ -149,4 +154,26 @@ describe('ShareService', function() {
|
||||
expect(content.ppkId).toBe(recipientPpk.id);
|
||||
});
|
||||
|
||||
it('should leave folders that are no longer with the user', async () => {
|
||||
// `checkShareConsistency` will emit a warning so we need to silent it
|
||||
// in tests.
|
||||
const previousLogLevel = Logger.globalLogger.setLevel(LogLevel.Error);
|
||||
|
||||
const service = testShareFolderService({
|
||||
'GET api/shares': async (_query: Record<string, any>, _body: any): Promise<any> => {
|
||||
return {
|
||||
items: [],
|
||||
has_more: false,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
const folder = await Folder.save({ share_id: 'nolongershared' });
|
||||
await service.checkShareConsistency();
|
||||
expect(await Folder.load(folder.id)).toBeFalsy();
|
||||
|
||||
Logger.globalLogger.setLevel(previousLogLevel);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
@@ -181,10 +181,53 @@ export default class ShareService {
|
||||
//
|
||||
// We don't delete the children here because that would delete them for the
|
||||
// other share participants too.
|
||||
public async leaveSharedFolder(folderId: string): Promise<void> {
|
||||
//
|
||||
// If `folderShareUserId` is provided, the function will check that the user
|
||||
// does not own the share. It would be an error to leave such a folder
|
||||
// (instead "unshareFolder" should be called).
|
||||
public async leaveSharedFolder(folderId: string, folderShareUserId: string = null): Promise<void> {
|
||||
if (folderShareUserId !== null) {
|
||||
const userId = Setting.value('sync.userId');
|
||||
if (folderShareUserId === userId) throw new Error('Cannot leave own notebook');
|
||||
}
|
||||
|
||||
await Folder.delete(folderId, { deleteChildren: false });
|
||||
}
|
||||
|
||||
// Finds any folder that is associated with a share, but the user no longer
|
||||
// has access to the share, and remove these folders. This check is
|
||||
// necessary otherwise sync will try to update items that are not longer
|
||||
// accessible and will throw the error "Could not find share with ID: xxxx")
|
||||
public async checkShareConsistency() {
|
||||
const rootSharedFolders = await Folder.rootSharedFolders();
|
||||
let hasRefreshedShares = false;
|
||||
let shares = this.shares;
|
||||
|
||||
for (const folder of rootSharedFolders) {
|
||||
let share = shares.find(s => s.id === folder.share_id);
|
||||
|
||||
if (!share && !hasRefreshedShares) {
|
||||
shares = await this.refreshShares();
|
||||
share = shares.find(s => s.id === folder.share_id);
|
||||
hasRefreshedShares = true;
|
||||
}
|
||||
|
||||
if (!share) {
|
||||
// This folder is a associated with a share, but the user no
|
||||
// longer has access to this share. It can happen for two
|
||||
// reasons:
|
||||
//
|
||||
// - It no longer exists
|
||||
// - Or the user rejected that share from a different device,
|
||||
// and the folder was not deleted as it should have been.
|
||||
//
|
||||
// In that case we need to leave the notebook.
|
||||
logger.warn(`Found a folder that was associated with a share, but the user not longer has access to the share - leaving the folder. Folder: ${folder.title} (${folder.id}). Share: ${folder.share_id}`);
|
||||
await this.leaveSharedFolder(folder.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async shareNote(noteId: string): Promise<StateShare> {
|
||||
const note = await Note.load(noteId);
|
||||
if (!note) throw new Error(`No such note: ${noteId}`);
|
||||
|
@@ -1,37 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
git pull
|
||||
|
||||
echo "---------------------------------------------------"
|
||||
echo "$ROOT_DIR/update-readme-download.js..."
|
||||
echo "---------------------------------------------------"
|
||||
node "$ROOT_DIR/update-readme-download.js"
|
||||
|
||||
echo "---------------------------------------------------"
|
||||
echo "$ROOT_DIR/build-release-stats.js..."
|
||||
echo "---------------------------------------------------"
|
||||
node "$ROOT_DIR/build-release-stats.js"
|
||||
|
||||
echo "---------------------------------------------------"
|
||||
echo "$ROOT_DIR/build-welcome.js..."
|
||||
echo "---------------------------------------------------"
|
||||
node "$ROOT_DIR/build-welcome.js"
|
||||
|
||||
echo "---------------------------------------------------"
|
||||
echo "$ROOT_DIR/update-readme-sponsors.js..."
|
||||
echo "---------------------------------------------------"
|
||||
node "$ROOT_DIR/update-readme-sponsors.js"
|
||||
|
||||
cd "$ROOT_DIR/.."
|
||||
echo "---------------------------------------------------"
|
||||
echo "npm run buildWebsite..."
|
||||
echo "---------------------------------------------------"
|
||||
npm run buildWebsite
|
||||
|
||||
echo "---------------------------------------------------"
|
||||
echo "Commit changes..."
|
||||
echo "---------------------------------------------------"
|
||||
git add -A && git commit -m "Update website" && git pull && git push
|
@@ -4,6 +4,7 @@ const fetch = require('node-fetch');
|
||||
const fs = require('fs-extra');
|
||||
const { dirname } = require('@joplin/lib/path-utils');
|
||||
const markdownUtils = require('@joplin/lib/markdownUtils').default;
|
||||
const yargParser = require('yargs-parser');
|
||||
|
||||
const rootDir = dirname(dirname(__dirname));
|
||||
|
||||
@@ -55,6 +56,11 @@ function createChangeLog(releases) {
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const argv = yargParser(process.argv);
|
||||
const types = argv.types ? argv.types.split(',') : ['stats', 'changelog'];
|
||||
|
||||
console.info(`Building docs: ${types.join(', ')}`);
|
||||
|
||||
const rows = [];
|
||||
|
||||
const totals = {
|
||||
@@ -99,8 +105,15 @@ async function main() {
|
||||
pageNum++;
|
||||
}
|
||||
|
||||
const changelogText = createChangeLog(rows);
|
||||
await fs.writeFile(`${rootDir}/readme/changelog.md`, changelogText);
|
||||
if (types.includes('changelog')) {
|
||||
console.info('Build stats: Updating changelog...');
|
||||
const changelogText = createChangeLog(rows);
|
||||
await fs.writeFile(`${rootDir}/readme/changelog.md`, changelogText);
|
||||
}
|
||||
|
||||
if (!types.includes('stats')) return;
|
||||
|
||||
console.info('Build stats: Updating stats...');
|
||||
|
||||
const grandTotal = totals.windows_count + totals.mac_count + totals.linux_count;
|
||||
totals.windows_percent = totals.windows_count / grandTotal;
|
||||
|
@@ -7,14 +7,16 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: \n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: MrKanister <s.robin@tutanota.de>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: de_DE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 3.0\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 3.0.1\n"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen.tsx:565
|
||||
msgid "- Camera: to allow taking a picture and attaching it to a note."
|
||||
@@ -411,28 +413,24 @@ msgid "Automatically update the application"
|
||||
msgstr "Die Anwendung automatisch aktualisieren"
|
||||
|
||||
#: packages/lib/models/Setting.ts:546
|
||||
#, fuzzy
|
||||
msgid "AWS access key"
|
||||
msgstr "AWS-Schlüssel"
|
||||
msgstr "AWS Zugriffsschlüssel-ID"
|
||||
|
||||
#: packages/lib/models/Setting.ts:535
|
||||
msgid "AWS region"
|
||||
msgstr ""
|
||||
msgstr "AWS Region"
|
||||
|
||||
#: packages/lib/models/Setting.ts:506
|
||||
#, fuzzy
|
||||
msgid "AWS S3 bucket"
|
||||
msgstr "Amazon S3-Bucket"
|
||||
msgstr "Amazon S3 Bucket"
|
||||
|
||||
#: packages/lib/models/Setting.ts:521
|
||||
#, fuzzy
|
||||
msgid "AWS S3 URL"
|
||||
msgstr "AWS S3 URL"
|
||||
msgstr "Amazon S3 URL"
|
||||
|
||||
#: packages/lib/models/Setting.ts:557
|
||||
#, fuzzy
|
||||
msgid "AWS secret key"
|
||||
msgstr "AWS-Geheimnis"
|
||||
msgstr "AWS geheimer Zugriffsschlüssel"
|
||||
|
||||
#: packages/app-desktop/gui/ConfigScreen/ButtonBar.tsx:42
|
||||
#: packages/app-desktop/gui/ConfigScreen/ConfigScreen.tsx:715
|
||||
@@ -880,6 +878,9 @@ msgid ""
|
||||
"Could not verify the share status of this notebook - aborting. Please try "
|
||||
"again when you are connected to the internet."
|
||||
msgstr ""
|
||||
"Der Freigabestatus dieses Notizbuchs konnte nicht überprüft werden - Vorgang "
|
||||
"wird abgebrochen. Bitte versuche es erneut, wenn eine Internetverbindung "
|
||||
"besteht."
|
||||
|
||||
#: packages/app-mobile/components/note-list.js:101
|
||||
msgid "Create a notebook"
|
||||
@@ -1700,7 +1701,7 @@ msgstr ""
|
||||
|
||||
#: packages/lib/models/Setting.ts:568
|
||||
msgid "Force path style"
|
||||
msgstr ""
|
||||
msgstr "Pfadstil erzwingen"
|
||||
|
||||
#: packages/lib/commands/historyForward.ts:6
|
||||
msgid "Forward"
|
||||
@@ -1790,7 +1791,7 @@ msgstr "Hervorheben"
|
||||
|
||||
#: packages/server/src/services/MustacheService.ts:196
|
||||
msgid "Home"
|
||||
msgstr ""
|
||||
msgstr "Startseite"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:78
|
||||
msgid "Horizontal Rule"
|
||||
@@ -2003,9 +2004,8 @@ msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Ungültiger Optionswert: „%s“. Mögliche Werte sind: %s."
|
||||
|
||||
#: packages/app-cli/app/command-e2ee.ts:46
|
||||
#, fuzzy
|
||||
msgid "Invalid password"
|
||||
msgstr "Ungültige Antwort: %s"
|
||||
msgstr "Ungültiges Passwort"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:38
|
||||
msgid "Italic"
|
||||
@@ -2017,15 +2017,15 @@ msgstr "Element „%s“ konnte nicht heruntergeladen werden: %s"
|
||||
|
||||
#: packages/server/src/services/MustacheService.ts:198
|
||||
msgid "Items"
|
||||
msgstr ""
|
||||
msgstr "Elemente"
|
||||
|
||||
#: packages/lib/services/ReportService.ts:208
|
||||
msgid "Items that cannot be decrypted"
|
||||
msgstr "Elemente, die nicht entschlüsselt werden konnten"
|
||||
msgstr "Elemente, die nicht entschlüsselt werden können"
|
||||
|
||||
#: packages/lib/services/ReportService.ts:173
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr "Elemente können nicht synchronisiert werden"
|
||||
msgstr "Elemente, die nicht synchronisiert werden können"
|
||||
|
||||
#: packages/app-desktop/gui/SyncWizard/Dialog.tsx:328
|
||||
msgid ""
|
||||
@@ -2237,7 +2237,7 @@ msgstr "Mit OneDrive anmelden"
|
||||
|
||||
#: packages/server/src/services/MustacheService.ts:202
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
msgstr "Abmelden"
|
||||
|
||||
#: packages/app-desktop/gui/MenuBar.tsx:705
|
||||
#: packages/app-mobile/components/screens/ConfigScreen.tsx:583
|
||||
@@ -2571,9 +2571,8 @@ msgid "Note&book"
|
||||
msgstr "Notizbücher"
|
||||
|
||||
#: packages/lib/models/Setting.ts:2143
|
||||
#, fuzzy
|
||||
msgid "Notebook"
|
||||
msgstr "Notizbücher"
|
||||
msgstr "Notizbuch"
|
||||
|
||||
#: packages/lib/models/Setting.ts:1378
|
||||
msgid "Notebook list growth factor"
|
||||
@@ -2600,9 +2599,8 @@ msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/toggleNotesSortOrderField.ts:8
|
||||
#: packages/app-desktop/gui/MainScreen/commands/toggleNotesSortOrderReverse.ts:9
|
||||
#, fuzzy
|
||||
msgid "Notes"
|
||||
msgstr "Notiz"
|
||||
msgstr "Notizen"
|
||||
|
||||
#: packages/lib/models/Setting.ts:2159
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
@@ -3099,7 +3097,7 @@ msgstr ""
|
||||
|
||||
#: packages/lib/SyncTargetAmazonS3.js:28
|
||||
msgid "S3"
|
||||
msgstr ""
|
||||
msgstr "S3"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/MainScreen.tsx:579
|
||||
msgid ""
|
||||
@@ -3265,9 +3263,8 @@ msgid "Show note counts"
|
||||
msgstr "Notizanzahl anzeigen"
|
||||
|
||||
#: packages/lib/models/Setting.ts:866
|
||||
#, fuzzy
|
||||
msgid "Show sort order buttons"
|
||||
msgstr "Notizanzahl anzeigen"
|
||||
msgstr "Knöpfe zur Einstellung der Sortierreihenfolge anzeigen"
|
||||
|
||||
#: packages/lib/models/Setting.ts:1042
|
||||
msgid "Show tray icon"
|
||||
@@ -3604,7 +3601,7 @@ msgstr "Foto aufnehmen"
|
||||
|
||||
#: packages/server/src/services/MustacheService.ts:200
|
||||
msgid "Tasks"
|
||||
msgstr ""
|
||||
msgstr "Aufgaben"
|
||||
|
||||
#: packages/lib/models/Setting.ts:1228
|
||||
msgid "Text editor command"
|
||||
@@ -4102,9 +4099,8 @@ msgid "Toggle note list"
|
||||
msgstr "Notiz-Liste ein-/ausschalten"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/togglePerFolderSortOrder.ts:7
|
||||
#, fuzzy
|
||||
msgid "Toggle own sort order"
|
||||
msgstr "Sicheren Modus ein-/ausschalten"
|
||||
msgstr "Eigene Sortierreihenfolge ein-/ausschalten"
|
||||
|
||||
#: packages/app-desktop/commands/toggleSafeMode.ts:8
|
||||
msgid "Toggle safe mode"
|
||||
@@ -4115,9 +4111,8 @@ msgid "Toggle sidebar"
|
||||
msgstr "Seitenleiste ein-/ausschalten"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/toggleNotesSortOrderField.ts:7
|
||||
#, fuzzy
|
||||
msgid "Toggle sort order field"
|
||||
msgstr "Sicheren Modus ein-/ausschalten"
|
||||
msgstr "Ändere die Sortierreihenfolge"
|
||||
|
||||
#: packages/app-desktop/gui/ClipperConfigScreen.min.js:40
|
||||
#: packages/app-desktop/gui/ClipperConfigScreen.tsx:41
|
||||
@@ -4326,7 +4321,7 @@ msgstr ""
|
||||
|
||||
#: packages/server/src/services/MustacheService.ts:197
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
msgstr "Benutzer"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:182
|
||||
msgid "Valid"
|
||||
@@ -4480,14 +4475,16 @@ msgstr "Deine Daten werden neu verschlüsselt und erneut synchronisiert."
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:271
|
||||
msgid "Your master password is needed to decrypt some of your data."
|
||||
msgstr "Das Master-Passwort ist nötig um einige deiner Daten zu entschlüsseln."
|
||||
msgstr ""
|
||||
"Dein Master-Passwort ist nötig um einige deiner Daten zu entschlüsseln."
|
||||
|
||||
#: packages/app-cli/app/command-sync.ts:242
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Your password is needed to decrypt some of your data. Type `:e2ee decrypt` "
|
||||
"to set it."
|
||||
msgstr "Das Master-Passwort ist nötig um einige deiner Daten zu entschlüsseln."
|
||||
msgstr ""
|
||||
"Dein Passwort ist nötig um einige deiner Daten zu entschlüsseln. Tippe „:"
|
||||
"e2ee decrypt“ um es zu setzen."
|
||||
|
||||
#: packages/app-mobile/components/CameraView.tsx:189
|
||||
msgid "Your permission to use your camera is required."
|
||||
|
@@ -21,9 +21,11 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 3.0\n"
|
||||
"X-Generator: Poedit 2.4.3\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
"POT-Creation-Date: \n"
|
||||
"PO-Revision-Date: \n"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen.tsx:565
|
||||
msgid "- Camera: to allow taking a picture and attaching it to a note."
|
||||
@@ -258,7 +260,7 @@ msgstr "Añadir cuerpo"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/setTags.ts:38
|
||||
msgid "Add or remove tags:"
|
||||
msgstr "Agregar o borrar etiquetas:"
|
||||
msgstr "Agregar o eliminar etiquetas:"
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.tsx:245
|
||||
msgid "Add recipient:"
|
||||
@@ -409,28 +411,24 @@ msgid "Automatically update the application"
|
||||
msgstr "Actualizar la aplicación automáticamente"
|
||||
|
||||
#: packages/lib/models/Setting.ts:546
|
||||
#, fuzzy
|
||||
msgid "AWS access key"
|
||||
msgstr "Clave de AWS"
|
||||
msgstr "Clave de acceso de AWS"
|
||||
|
||||
#: packages/lib/models/Setting.ts:535
|
||||
msgid "AWS region"
|
||||
msgstr ""
|
||||
msgstr "Región de AWS"
|
||||
|
||||
#: packages/lib/models/Setting.ts:506
|
||||
#, fuzzy
|
||||
msgid "AWS S3 bucket"
|
||||
msgstr "AWS S3 bucket"
|
||||
|
||||
#: packages/lib/models/Setting.ts:521
|
||||
#, fuzzy
|
||||
msgid "AWS S3 URL"
|
||||
msgstr "URL de AWS S3"
|
||||
|
||||
#: packages/lib/models/Setting.ts:557
|
||||
#, fuzzy
|
||||
msgid "AWS secret key"
|
||||
msgstr "Secreto de AWS"
|
||||
msgstr "Clave secreta de AWS"
|
||||
|
||||
#: packages/app-desktop/gui/ConfigScreen/ButtonBar.tsx:42
|
||||
#: packages/app-desktop/gui/ConfigScreen/ConfigScreen.tsx:715
|
||||
@@ -584,6 +582,9 @@ msgid ""
|
||||
"enabled end-to-end encryption. They may do so from the screen Configuration "
|
||||
"> Encryption."
|
||||
msgstr ""
|
||||
"No se puede compartir la libreta cifrada con el destinatario %s porque este "
|
||||
"no ha habilitado el cifrado de extremo a extremo. Puede hacerlo desde la "
|
||||
"pantalla Configuración > Cifrado."
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/toggleLayoutMoveMode.ts:7
|
||||
msgid "Change application layout"
|
||||
@@ -761,9 +762,8 @@ msgid "Conflicts (attachments)"
|
||||
msgstr "Conflictos (adjuntos)"
|
||||
|
||||
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/SearchPlugins.tsx:108
|
||||
#, fuzzy
|
||||
msgid "Content provided by %s"
|
||||
msgstr "Propiedades de nota"
|
||||
msgstr "Contenido provisto por %s"
|
||||
|
||||
#: packages/app-mobile/components/screens/Note.tsx:938
|
||||
msgid "Convert to note"
|
||||
@@ -787,9 +787,8 @@ msgstr "Copiar comando del modo de desarrollador al portapapeles"
|
||||
#: packages/app-desktop/gui/Sidebar/Sidebar.tsx:350
|
||||
#: packages/app-desktop/gui/Sidebar/Sidebar.tsx:364
|
||||
#: packages/app-desktop/gui/utils/NoteListUtils.ts:139
|
||||
#, fuzzy
|
||||
msgid "Copy external link"
|
||||
msgstr "Detener la edición externa"
|
||||
msgstr "Copiar enlace externo"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:164
|
||||
msgid "Copy Link Address"
|
||||
@@ -860,6 +859,10 @@ msgid ""
|
||||
"\n"
|
||||
"The error was: \"%s\""
|
||||
msgstr ""
|
||||
"No se ha podido responder a la invitación. Por favor, inténtelo de nuevo, o "
|
||||
"compruebe con el propietario de la libreta si todavía la está compartiendo.\n"
|
||||
"\n"
|
||||
"El error fue: \"%s\""
|
||||
|
||||
#: packages/lib/components/EncryptionConfigScreen/utils.ts:219
|
||||
msgid "Could not upgrade master key: %s"
|
||||
@@ -870,6 +873,8 @@ msgid ""
|
||||
"Could not verify the share status of this notebook - aborting. Please try "
|
||||
"again when you are connected to the internet."
|
||||
msgstr ""
|
||||
"No se ha podido verificar el estado de compartición de esta libreta - "
|
||||
"abortando. Por favor, inténtelo de nuevo cuando esté conectado a Internet."
|
||||
|
||||
#: packages/app-mobile/components/note-list.js:101
|
||||
msgid "Create a notebook"
|
||||
@@ -1209,17 +1214,14 @@ msgid "Do not ask for confirmation."
|
||||
msgstr "No pedir confirmación."
|
||||
|
||||
#: packages/lib/components/EncryptionConfigScreen/utils.ts:56
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Do not lose the password as, for security purposes, this will be the *only* "
|
||||
"way to decrypt the data! To enable encryption, please enter your password "
|
||||
"below."
|
||||
msgstr ""
|
||||
"Habilitar el cifrado significa que *todas* sus notas y adjuntos van a ser "
|
||||
"resincronizados y enviados cifrados al destino. No pierda la contraseña, "
|
||||
"pues, por cuestiones de seguridad, ¡es la *única* forma de descifrar los "
|
||||
"datos! Para habilitar el cifrado, por favor introduzca su contraseña a "
|
||||
"continuación."
|
||||
"No pierda la contraseña, pues, por cuestiones de seguridad, ¡es la *única* "
|
||||
"forma de descifrar los datos! Para habilitar el cifrado, por favor "
|
||||
"introduzca su contraseña a continuación."
|
||||
|
||||
#: packages/app-desktop/checkForUpdates.ts:199
|
||||
msgid "Download"
|
||||
@@ -1322,7 +1324,7 @@ msgstr "Tamaño de fuente del editor"
|
||||
|
||||
#: packages/lib/models/Setting.ts:1125
|
||||
msgid "Editor maximum width"
|
||||
msgstr ""
|
||||
msgstr "Ancho máximo del editor"
|
||||
|
||||
#: packages/lib/models/Setting.ts:1119
|
||||
msgid "Editor monospace font family"
|
||||
@@ -1442,14 +1444,12 @@ msgid "Enabled"
|
||||
msgstr "Habilitado"
|
||||
|
||||
#: packages/lib/components/EncryptionConfigScreen/utils.ts:51
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Enabling encryption means *all* your notes and attachments are going to be "
|
||||
"re-synchronised and sent encrypted to the sync target."
|
||||
msgstr ""
|
||||
"Deshabilitar el cifrado significa que *todas* sus notas y adjuntos van a ser "
|
||||
"resincronizados y enviados descifrados al objetivo de sincronización. ¿Desea "
|
||||
"continuar?"
|
||||
"Habilitar el cifrado significa que *todas* sus notas y adjuntos van a ser "
|
||||
"resincronizados y enviados cifrados al objetivo de sincronización."
|
||||
|
||||
#: packages/lib/models/BaseItem.ts:808
|
||||
msgid "Encrypted"
|
||||
@@ -1478,19 +1478,16 @@ msgid "Encryption is: %s"
|
||||
msgstr "El cifrado está: %s"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:172
|
||||
#, fuzzy
|
||||
msgid "Encryption keys"
|
||||
msgstr "El cifrado está:"
|
||||
msgstr "Claves de cifrado"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:249
|
||||
#, fuzzy
|
||||
msgid "Encryption:"
|
||||
msgstr "Cifrado"
|
||||
msgstr "Cifrado:"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:247
|
||||
#, fuzzy
|
||||
msgid "End-to-end encryption"
|
||||
msgstr "Habilitar cifrado"
|
||||
msgstr "Cifrado de Extremo a Extremo"
|
||||
|
||||
#: packages/app-mobile/components/screens/dropbox-login.js:66
|
||||
msgid "Enter code here"
|
||||
@@ -1539,11 +1536,11 @@ msgstr "Solo errores"
|
||||
|
||||
#: packages/lib/services/interop/InteropService.ts:89
|
||||
msgid "Evernote Export File (as HTML)"
|
||||
msgstr "Exportar como Archivo de Evernote (como HTML)"
|
||||
msgstr "Exportar como Archivo de Ever(como HTML)"
|
||||
|
||||
#: packages/lib/services/interop/InteropService.ts:80
|
||||
msgid "Evernote Export File (as Markdown)"
|
||||
msgstr "Exportar como Archivo de Evernote (como Markdown)"
|
||||
msgstr "Exportar como Archivo de Ever(como Markdown)"
|
||||
|
||||
#: packages/app-cli/app/command-exit.js:11
|
||||
msgid "Exits the application."
|
||||
@@ -1691,7 +1688,7 @@ msgstr ""
|
||||
|
||||
#: packages/lib/models/Setting.ts:568
|
||||
msgid "Force path style"
|
||||
msgstr ""
|
||||
msgstr "Forzar estilo de ruta"
|
||||
|
||||
#: packages/lib/commands/historyForward.ts:6
|
||||
msgid "Forward"
|
||||
@@ -1715,9 +1712,8 @@ msgid "General"
|
||||
msgstr "General"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:252
|
||||
#, fuzzy
|
||||
msgid "Generated"
|
||||
msgstr "General"
|
||||
msgstr "Generado"
|
||||
|
||||
#: packages/app-desktop/gui/ShareNoteDialog.tsx:207
|
||||
msgid "Generating link..."
|
||||
@@ -1769,9 +1765,8 @@ msgid "Hide %s"
|
||||
msgstr "Ocultar %s"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:172
|
||||
#, fuzzy
|
||||
msgid "Hide disabled keys"
|
||||
msgstr "Ocultar las llaves maestras desactivadas"
|
||||
msgstr "Ocultar las claves desactivadas"
|
||||
|
||||
#: packages/app-desktop/gui/KeymapConfig/utils/getLabel.ts:22
|
||||
msgid "Hide Joplin"
|
||||
@@ -1783,7 +1778,7 @@ msgstr "Resaltado"
|
||||
|
||||
#: packages/server/src/services/MustacheService.ts:196
|
||||
msgid "Home"
|
||||
msgstr ""
|
||||
msgstr "Inicio"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:78
|
||||
msgid "Horizontal Rule"
|
||||
@@ -1998,9 +1993,8 @@ msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Opción inválida: «%s». Los valores posibles son: %s."
|
||||
|
||||
#: packages/app-cli/app/command-e2ee.ts:46
|
||||
#, fuzzy
|
||||
msgid "Invalid password"
|
||||
msgstr "Respuesta inválida: %s"
|
||||
msgstr "Contraseña inválida"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:38
|
||||
msgid "Italic"
|
||||
@@ -2012,7 +2006,7 @@ msgstr "El elemento «%s» no se pudo descargar: %s"
|
||||
|
||||
#: packages/server/src/services/MustacheService.ts:198
|
||||
msgid "Items"
|
||||
msgstr ""
|
||||
msgstr "Elementos"
|
||||
|
||||
#: packages/lib/services/ReportService.ts:208
|
||||
msgid "Items that cannot be decrypted"
|
||||
@@ -2125,9 +2119,8 @@ msgid "Keychain Supported: %s"
|
||||
msgstr "Llavero Soportado: %s"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:71
|
||||
#, fuzzy
|
||||
msgid "Keys that need upgrading"
|
||||
msgstr "Claves maestras que necesitan actualizarse"
|
||||
msgstr "Claves que necesitan actualizarse"
|
||||
|
||||
#: packages/lib/models/Setting.ts:1242
|
||||
msgid "Landscape"
|
||||
@@ -2154,9 +2147,8 @@ msgid "Layout button sequence"
|
||||
msgstr "Secuencia del botón de diseño"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/leaveSharedFolder.ts:11
|
||||
#, fuzzy
|
||||
msgid "Leave notebook..."
|
||||
msgstr "Compartir libreta..."
|
||||
msgstr "Abandonar libreta..."
|
||||
|
||||
#: packages/lib/models/Setting.ts:1236
|
||||
msgid "Legal"
|
||||
@@ -2216,7 +2208,7 @@ msgstr "Registro"
|
||||
|
||||
#: packages/app-desktop/gui/SyncWizard/Dialog.tsx:238
|
||||
msgid "Login"
|
||||
msgstr "Identifiicación"
|
||||
msgstr "Identificación"
|
||||
|
||||
#: packages/app-desktop/gui/SyncWizard/Dialog.tsx:233
|
||||
msgid "Login below."
|
||||
@@ -2232,7 +2224,7 @@ msgstr "Acceder con OneDrive"
|
||||
|
||||
#: packages/server/src/services/MustacheService.ts:202
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
msgstr "Cerrar sesión"
|
||||
|
||||
#: packages/app-desktop/gui/MenuBar.tsx:705
|
||||
#: packages/app-mobile/components/screens/ConfigScreen.tsx:583
|
||||
@@ -2240,14 +2232,12 @@ msgid "Make a donation"
|
||||
msgstr "Hacer una donación"
|
||||
|
||||
#: packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx:212
|
||||
#, fuzzy
|
||||
msgid "Manage master password"
|
||||
msgstr "Introduzca la contraseña maestra:"
|
||||
msgstr "Administrar contraseña maestra"
|
||||
|
||||
#: packages/lib/commands/openMasterPasswordDialog.ts:6
|
||||
#, fuzzy
|
||||
msgid "Manage master password..."
|
||||
msgstr "Introduzca la contraseña maestra:"
|
||||
msgstr "Administrar contraseña maestra..."
|
||||
|
||||
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.tsx:314
|
||||
msgid "Manage your plugins"
|
||||
@@ -2255,13 +2245,12 @@ msgstr "Administre sus plugins"
|
||||
|
||||
#. `generate-ppk`
|
||||
#: packages/app-cli/app/command-e2ee.ts:20
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status`, `decrypt-file`, and `target-status`."
|
||||
msgstr ""
|
||||
"Gestiona la configuración E2EE. Los comandos disponibles son `enable`, "
|
||||
"`disable`, `decrypt`, `status`, `decrypt-file` y `target-status`."
|
||||
"Administra la configuración E2EE. Los comandos son `enable`, `disable`, "
|
||||
"`decrypt`, `status`, `decrypt-file` y `target-status`."
|
||||
|
||||
#: packages/lib/models/Setting.ts:666
|
||||
msgid "Manual"
|
||||
@@ -2276,7 +2265,7 @@ msgstr "Markdown"
|
||||
#: packages/lib/services/interop/InteropService.ts:120
|
||||
#: packages/lib/services/interop/InteropService.ts:67
|
||||
msgid "Markdown + Front Matter"
|
||||
msgstr ""
|
||||
msgstr "Markdown + Front Matter"
|
||||
|
||||
#: packages/app-cli/app/command-done.js:14
|
||||
msgid "Marks a to-do as done."
|
||||
@@ -2310,9 +2299,8 @@ msgid "Max concurrent connections"
|
||||
msgstr "Conexiones simultáneas máximas"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:324
|
||||
#, fuzzy
|
||||
msgid "Missing keys"
|
||||
msgstr "Claves Maestras Faltantes"
|
||||
msgstr "Claves faltantes"
|
||||
|
||||
#: packages/app-mobile/components/screens/encryption-config.tsx:271
|
||||
msgid "Missing Master Keys"
|
||||
@@ -2487,7 +2475,7 @@ msgstr "No descargado"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:252
|
||||
msgid "Not generated"
|
||||
msgstr ""
|
||||
msgstr "No generado"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteTitle/NoteTitleBar.tsx:110
|
||||
#: packages/server/src/models/UserModel.ts:214
|
||||
@@ -2564,9 +2552,8 @@ msgid "Note&book"
|
||||
msgstr "Libreta"
|
||||
|
||||
#: packages/lib/models/Setting.ts:2143
|
||||
#, fuzzy
|
||||
msgid "Notebook"
|
||||
msgstr "Libretas"
|
||||
msgstr "Libreta"
|
||||
|
||||
#: packages/lib/models/Setting.ts:1378
|
||||
msgid "Notebook list growth factor"
|
||||
@@ -2592,9 +2579,8 @@ msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/toggleNotesSortOrderField.ts:8
|
||||
#: packages/app-desktop/gui/MainScreen/commands/toggleNotesSortOrderReverse.ts:9
|
||||
#, fuzzy
|
||||
msgid "Notes"
|
||||
msgstr "Nota"
|
||||
msgstr "Notas"
|
||||
|
||||
#: packages/lib/models/Setting.ts:2159
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
@@ -2755,7 +2741,7 @@ msgstr "Permiso para usar la cámara"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:271
|
||||
msgid "Please click on \"%s\" to proceed"
|
||||
msgstr ""
|
||||
msgstr "Por favor, haga clic en \"%s\" para proceder"
|
||||
|
||||
#: packages/lib/components/EncryptionConfigScreen/utils.ts:65
|
||||
msgid ""
|
||||
@@ -2776,6 +2762,9 @@ msgid ""
|
||||
"Please note that if it is a large notebook, it may take a few minutes for "
|
||||
"all the notes to show up on the recipient's device."
|
||||
msgstr ""
|
||||
"Tenga en cuenta de que si se trata de una libreta grande, puede tardar unos "
|
||||
"minutos para que todas las notas aparezcan en el dispositivo del "
|
||||
"destinatario."
|
||||
|
||||
#: packages/lib/onedrive-api-node-utils.js:116
|
||||
msgid ""
|
||||
@@ -2882,7 +2871,7 @@ msgstr ""
|
||||
|
||||
#: packages/app-mobile/components/screen-header.js:459
|
||||
msgid "Press to set the decryption password."
|
||||
msgstr "Presione para establecer la contraseña de descifrado."
|
||||
msgstr "Pulse para establecer la contraseña de descifrado."
|
||||
|
||||
#: packages/app-desktop/gui/NotePropertiesDialog.min.js:307
|
||||
msgid "Previous versions of this note"
|
||||
@@ -2906,7 +2895,7 @@ msgstr "Propiedades"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:252
|
||||
msgid "Public-private key pair:"
|
||||
msgstr ""
|
||||
msgstr "Par de claves públicas y privadas:"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/showShareNoteDialog.ts:6
|
||||
msgid "Publish note..."
|
||||
@@ -3014,9 +3003,8 @@ msgstr "Renovar token"
|
||||
|
||||
#: packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx:212
|
||||
#: packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx:213
|
||||
#, fuzzy
|
||||
msgid "Reset master password"
|
||||
msgstr "Introduzca la contraseña maestra:"
|
||||
msgstr "Restablecer contraseña maestra"
|
||||
|
||||
#: packages/app-cli/app/command-import.js:51
|
||||
#: packages/app-desktop/gui/ImportScreen.min.js:72
|
||||
@@ -3077,7 +3065,7 @@ msgstr ""
|
||||
|
||||
#: packages/lib/SyncTargetAmazonS3.js:28
|
||||
msgid "S3"
|
||||
msgstr ""
|
||||
msgstr "S3"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/MainScreen.tsx:579
|
||||
msgid ""
|
||||
@@ -3181,6 +3169,8 @@ msgid ""
|
||||
"Set it to 0 to make it take the complete available space. Recommended width "
|
||||
"is 600."
|
||||
msgstr ""
|
||||
"Establézcalo como 0 para que ocupe todo el espacio disponible. El ancho "
|
||||
"recomendado es de 600."
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/MainScreen.tsx:627
|
||||
msgid "Set the password"
|
||||
@@ -3233,18 +3223,16 @@ msgid "Show completed to-dos"
|
||||
msgstr "Mostrar tareas completadas"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:172
|
||||
#, fuzzy
|
||||
msgid "Show disabled keys"
|
||||
msgstr "Mostrar llaves maestras desactivadas"
|
||||
msgstr "Mostrar claves desactivadas"
|
||||
|
||||
#: packages/lib/models/Setting.ts:810
|
||||
msgid "Show note counts"
|
||||
msgstr "Mostrar número de notas"
|
||||
|
||||
#: packages/lib/models/Setting.ts:866
|
||||
#, fuzzy
|
||||
msgid "Show sort order buttons"
|
||||
msgstr "Mostrar número de notas"
|
||||
msgstr "Mostrar botones de ordenación"
|
||||
|
||||
#: packages/lib/models/Setting.ts:1042
|
||||
msgid "Show tray icon"
|
||||
@@ -3580,7 +3568,7 @@ msgstr "Tomar una foto"
|
||||
|
||||
#: packages/server/src/services/MustacheService.ts:200
|
||||
msgid "Tasks"
|
||||
msgstr ""
|
||||
msgstr "Tareas"
|
||||
|
||||
#: packages/lib/models/Setting.ts:1228
|
||||
msgid "Text editor command"
|
||||
@@ -3681,15 +3669,14 @@ msgid "The following attachments are being watched for changes:"
|
||||
msgstr "Los adjuntos siguientes están siendo vigilados en busca de cambios:"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:72
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"The following keys use an out-dated encryption algorithm and it is "
|
||||
"recommended to upgrade them. The upgraded key will still be able to decrypt "
|
||||
"and encrypt your data as usual."
|
||||
msgstr ""
|
||||
"Las siguientes claves maestras utilizan un algoritmo de cifrado obsoleto y "
|
||||
"se recomienda actualizarlas. La clave maestra actualizada todavía será capaz "
|
||||
"de descifrar y cifrar sus datos como de costumbre."
|
||||
"Las siguientes claves utilizan un algoritmo de cifrado obsoleto y se "
|
||||
"recomienda actualizarlas. La clave actualizada todavía será capaz de "
|
||||
"descifrar y cifrar sus datos como de costumbre."
|
||||
|
||||
#: packages/app-mobile/components/screens/Note.tsx:196
|
||||
msgid "The Joplin mobile app does not currently support this type of link: %s"
|
||||
@@ -3701,17 +3688,18 @@ msgid ""
|
||||
"The Joplin team has vetted this plugin and it meets our standards for "
|
||||
"security and performance."
|
||||
msgstr ""
|
||||
"El equipo de Joplin ha examinado este plugin y cumple con nuestros "
|
||||
"estándares de seguridad y rendimiento."
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:325
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"The keys with these IDs are used to encrypt some of your items, however the "
|
||||
"application does not currently have access to them. It is likely they will "
|
||||
"eventually be downloaded via synchronisation."
|
||||
msgstr ""
|
||||
"Las claves maestras con estos ID son utilizadas para cifrar algunos de sus "
|
||||
"elementos, pero la aplicación no tiene acceso a ellas actualmente. Serán "
|
||||
"descargadas a través de la sincronización."
|
||||
"Las claves con estos ID son utilizadas para cifrar algunos de sus elementos, "
|
||||
"pero la aplicación no tiene acceso a ellas actualmente. Es probable que sean "
|
||||
"descargadas eventualmente a través de la sincronización."
|
||||
|
||||
#: packages/lib/components/EncryptionConfigScreen/utils.ts:217
|
||||
msgid "The master key has been upgraded successfully!"
|
||||
@@ -3750,6 +3738,10 @@ msgid ""
|
||||
"\n"
|
||||
"The error was: \"%s\""
|
||||
msgstr ""
|
||||
"El destinatario no ha podido ser eliminado de la lista. Por favor, inténtelo "
|
||||
"de nuevo\n"
|
||||
"\n"
|
||||
"El error fue: \"%s\""
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/MainScreen.tsx:585
|
||||
msgid ""
|
||||
@@ -3763,10 +3755,9 @@ msgstr ""
|
||||
"en el enlace."
|
||||
|
||||
#: packages/app-mobile/components/screen-header.js:461
|
||||
#, fuzzy
|
||||
msgid "The sync target needs to be upgraded. Press this banner to proceed."
|
||||
msgstr ""
|
||||
"¡El objetivo de sincronización debe ser actualizado! Ejecute `%s` para "
|
||||
"El objetivo de sincronización debe ser actualizado. Pulse este aviso para "
|
||||
"proceder."
|
||||
|
||||
#: packages/lib/models/Tag.ts:204
|
||||
@@ -3950,13 +3941,12 @@ msgid "This will open a new screen. Save your current changes?"
|
||||
msgstr "Esto abrirá una nueva pantalla. ¿Desea guardar los cambios actuales?"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/leaveSharedFolder.ts:17
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"This will remove the notebook from your collection and you will no longer "
|
||||
"have access to its content. Do you wish to continue?"
|
||||
msgstr ""
|
||||
"¿Dejar de compartir esta libreta? Los destinatarios ya no tendrán acceso a "
|
||||
"su contenido."
|
||||
"Esto eliminará la libreta de su colección y ya no tendrá acceso a su "
|
||||
"contenido. ¿Desea continuar?"
|
||||
|
||||
#: packages/lib/models/Setting.ts:738
|
||||
msgid "Time format"
|
||||
@@ -3981,9 +3971,9 @@ msgstr ""
|
||||
"pasos:"
|
||||
|
||||
#: packages/lib/components/EncryptionConfigScreen/utils.ts:54
|
||||
#, fuzzy
|
||||
msgid "To continue, please enter your master password below."
|
||||
msgstr "Introduzca su contraseña maestra"
|
||||
msgstr ""
|
||||
"Para continuar, por favor, introduzca su contraseña maestra a continuación."
|
||||
|
||||
#: packages/app-cli/app/app-gui.js:452
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
@@ -4062,9 +4052,8 @@ msgid "Toggle note list"
|
||||
msgstr "Alternar la lista de notas"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/togglePerFolderSortOrder.ts:7
|
||||
#, fuzzy
|
||||
msgid "Toggle own sort order"
|
||||
msgstr "Alternar modo seguro"
|
||||
msgstr "Alternar orden propio"
|
||||
|
||||
#: packages/app-desktop/commands/toggleSafeMode.ts:8
|
||||
msgid "Toggle safe mode"
|
||||
@@ -4075,9 +4064,8 @@ msgid "Toggle sidebar"
|
||||
msgstr "Alternar la barra lateral"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/toggleNotesSortOrderField.ts:7
|
||||
#, fuzzy
|
||||
msgid "Toggle sort order field"
|
||||
msgstr "Alternar modo seguro"
|
||||
msgstr "Alternar el campo de orden"
|
||||
|
||||
#: packages/app-desktop/gui/ClipperConfigScreen.min.js:40
|
||||
#: packages/app-desktop/gui/ClipperConfigScreen.tsx:41
|
||||
@@ -4288,7 +4276,7 @@ msgstr ""
|
||||
|
||||
#: packages/server/src/services/MustacheService.ts:197
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
msgstr "Usuarios"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:182
|
||||
msgid "Valid"
|
||||
@@ -4441,12 +4429,15 @@ msgstr "Sus datos van a ser cifrados y sincronizados nuevamente."
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:271
|
||||
msgid "Your master password is needed to decrypt some of your data."
|
||||
msgstr ""
|
||||
"Su contraseña maestra es necesaria para descifrar algunos de sus datos."
|
||||
|
||||
#: packages/app-cli/app/command-sync.ts:242
|
||||
msgid ""
|
||||
"Your password is needed to decrypt some of your data. Type `:e2ee decrypt` "
|
||||
"to set it."
|
||||
msgstr ""
|
||||
"Su contraseña es necesaria para descrifrar algunos de sus datos. Escriba `:"
|
||||
"e2ee decrypt` para establecerla."
|
||||
|
||||
#: packages/app-mobile/components/CameraView.tsx:189
|
||||
msgid "Your permission to use your camera is required."
|
||||
|
73
packages/tools/release-website.sh
Executable file
73
packages/tools/release-website.sh
Executable file
@@ -0,0 +1,73 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Setup environment
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
SCRIPT_NAME=`basename "$0"`
|
||||
JOPLIN_ROOT_DIR="$SCRIPT_DIR/../.."
|
||||
JOPLIN_WEBSITE_ROOT_DIR="$JOPLIN_ROOT_DIR/../joplin-website"
|
||||
|
||||
echo "IS_CONTINUOUS_INTEGRATION=$IS_CONTINUOUS_INTEGRATION"
|
||||
echo "GIT_USER_NAME=$GIT_USER_NAME"
|
||||
|
||||
if [[ "$IS_CONTINUOUS_INTEGRATION" == "1" ]]; then
|
||||
echo "Running on CI - setting up Git username and email"
|
||||
git config --global user.email "$GIT_USER_EMAIL"
|
||||
git config --global user.name "$GIT_USER_NAME"
|
||||
else
|
||||
echo "*Not* running on CI - using the global Git username and email"
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Update the Markdown files inside the Joplin directory. This is for example the
|
||||
# download links README.md or the desktop app changelog.
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
cd "$JOPLIN_ROOT_DIR"
|
||||
|
||||
# Will fail if there's any local change in the repo, which is what we want
|
||||
git checkout dev
|
||||
git pull --rebase
|
||||
|
||||
npm install
|
||||
|
||||
# Clean up npm's mess
|
||||
git reset --hard
|
||||
|
||||
npm run updateMarkdownDoc
|
||||
|
||||
# We commit and push the change. It will be a noop if nothing was actually
|
||||
# changed
|
||||
|
||||
git add -A
|
||||
|
||||
git commit -m "Doc: Updated Markdown files
|
||||
|
||||
Auto-updated using $SCRIPT_NAME" || true
|
||||
|
||||
git pull --rebase
|
||||
git push
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Build and deploy the website
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
cd "$JOPLIN_WEBSITE_ROOT_DIR"
|
||||
git checkout master
|
||||
git pull --rebase
|
||||
|
||||
cd "$JOPLIN_ROOT_DIR"
|
||||
npm run buildWebsite
|
||||
|
||||
cd "$JOPLIN_WEBSITE_ROOT_DIR"
|
||||
git add -A
|
||||
git commit -m "Updated website
|
||||
|
||||
Auto-updated using $SCRIPT_NAME" || true
|
||||
|
||||
git pull --rebase
|
||||
git push
|
@@ -1,9 +1,8 @@
|
||||
import { readFile } from 'fs-extra';
|
||||
import { insertContentIntoFile, rootDir } from './tool-utils';
|
||||
import markdownUtils, { MarkdownTableHeader, MarkdownTableJustify, MarkdownTableRow } from '@joplin/lib/markdownUtils';
|
||||
const ArrayUtils = require('@joplin/lib/ArrayUtils');
|
||||
const { escapeHtml } = require('@joplin/lib/string-utils');
|
||||
import { GithubSponsor, OrgSponsor, Sponsors } from './website/utils/types';
|
||||
const { escapeHtml } = require('@joplin/lib/string-utils');
|
||||
|
||||
const readmePath = `${rootDir}/README.md`;
|
||||
const sponsorsPath = `${rootDir}/packages/tools/sponsors.json`;
|
||||
@@ -51,7 +50,7 @@ async function createGitHubSponsorTable(sponsors: GithubSponsor[]): Promise<stri
|
||||
}
|
||||
|
||||
async function createOrgSponsorTable(sponsors: OrgSponsor[]): Promise<string> {
|
||||
sponsors = ArrayUtils.shuffle(sponsors);
|
||||
// sponsors = ArrayUtils.shuffle(sponsors);
|
||||
|
||||
const output: string[] = [];
|
||||
|
||||
|
32
packages/tools/updateMarkdownDoc.ts
Normal file
32
packages/tools/updateMarkdownDoc.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import { chdir } from 'process';
|
||||
import { execCommand2, rootDir, gitRepoCleanTry } from './tool-utils';
|
||||
import updateDownloadPage from './website/updateDownloadPage';
|
||||
|
||||
async function main() {
|
||||
const doGitOperations = false;
|
||||
|
||||
if (doGitOperations) {
|
||||
await gitRepoCleanTry();
|
||||
await execCommand2(['git', 'pull', '--rebase']);
|
||||
}
|
||||
|
||||
await execCommand2(['node', `${rootDir}/packages/tools/update-readme-download.js`]);
|
||||
await execCommand2(['node', `${rootDir}/packages/tools/build-release-stats.js`, '--types=changelog']);
|
||||
await execCommand2(['node', `${rootDir}/packages/tools/update-readme-sponsors.js`]);
|
||||
await execCommand2(['node', `${rootDir}/packages/tools/build-welcome.js`]);
|
||||
chdir(rootDir);
|
||||
await execCommand2(['npm', 'run', 'buildApiDoc']);
|
||||
await updateDownloadPage();
|
||||
|
||||
if (doGitOperations) {
|
||||
await execCommand2(['git', 'add', '-A']);
|
||||
await execCommand2(['git', 'commit', '-m', 'Update Markdown doc']);
|
||||
await execCommand2(['git', 'pull', '--rebase']);
|
||||
await execCommand2(['git', 'push']);
|
||||
}
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
console.error('Fatal error', error);
|
||||
process.exit(1);
|
||||
});
|
@@ -1,20 +1,24 @@
|
||||
import { readFileSync, readFile, mkdirpSync, writeFileSync, remove, copy } from 'fs-extra';
|
||||
import { insertContentIntoFile, rootDir } from '../tool-utils';
|
||||
import { readFileSync, readFile, mkdirpSync, writeFileSync, remove, copy, pathExistsSync } from 'fs-extra';
|
||||
import { rootDir } from '../tool-utils';
|
||||
import { pressCarouselItems } from './utils/pressCarousel';
|
||||
import { getMarkdownIt, loadMustachePartials, markdownToPageHtml, renderMustache } from './utils/render';
|
||||
import { AssetUrls, Env, OrgSponsor, PlanPageParams, Sponsors, TemplateParams } from './utils/types';
|
||||
import { getPlans, loadStripeConfig } from '@joplin/lib/utils/joplinCloud';
|
||||
import { shuffle } from '@joplin/lib/array';
|
||||
import { stripOffFrontMatter } from './utils/frontMatter';
|
||||
import { dirname, basename } from 'path';
|
||||
const moment = require('moment');
|
||||
|
||||
const dirname = require('path').dirname;
|
||||
const glob = require('glob');
|
||||
const path = require('path');
|
||||
const md5File = require('md5-file/promise');
|
||||
|
||||
const env = Env.Prod;
|
||||
|
||||
const docDir = `${dirname(dirname(dirname(dirname(__dirname))))}/joplin-website/docs`;
|
||||
|
||||
if (!pathExistsSync(docDir)) throw new Error(`Doc directory does not exist: ${docDir}`);
|
||||
|
||||
const websiteAssetDir = `${rootDir}/Assets/WebsiteAssets`;
|
||||
const mainTemplateHtml = readFileSync(`${websiteAssetDir}/templates/main-new.mustache`, 'utf8');
|
||||
const frontTemplateHtml = readFileSync(`${websiteAssetDir}/templates/front.mustache`, 'utf8');
|
||||
@@ -165,37 +169,6 @@ function makeHomePageMd() {
|
||||
return md;
|
||||
}
|
||||
|
||||
async function createDownloadButtonsHtml(readmeMd: string): Promise<Record<string, string>> {
|
||||
const output: Record<string, string> = {};
|
||||
output['windows'] = readmeMd.match(/(<a href=.*?Joplin-Setup-.*?<\/a>)/)[0];
|
||||
output['macOs'] = readmeMd.match(/(<a href=.*?Joplin-.*\.dmg.*?<\/a>)/)[0];
|
||||
output['linux'] = readmeMd.match(/(<a href=.*?Joplin-.*\.AppImage.*?<\/a>)/)[0];
|
||||
output['android'] = readmeMd.match(/(<a href='https:\/\/play.google.com\/store\/apps\/details\?id=net\.cozic\.joplin.*?<\/a>)/)[0];
|
||||
output['ios'] = readmeMd.match(/(<a href='https:\/\/itunes\.apple\.com\/us\/app\/joplin\/id1315599797.*?<\/a>)/)[0];
|
||||
|
||||
for (const [k, v] of Object.entries(output)) {
|
||||
if (!v) throw new Error(`Could not get download element for: ${k}`);
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
async function updateDownloadPage(downloadButtonsHtml: Record<string, string>) {
|
||||
const desktopButtonsHtml = [
|
||||
downloadButtonsHtml['windows'],
|
||||
downloadButtonsHtml['macOs'],
|
||||
downloadButtonsHtml['linux'],
|
||||
];
|
||||
|
||||
const mobileButtonsHtml = [
|
||||
downloadButtonsHtml['android'],
|
||||
downloadButtonsHtml['ios'],
|
||||
];
|
||||
|
||||
await insertContentIntoFile(`${rootDir}/readme/download.md`, '<!-- DESKTOP-DOWNLOAD-LINKS -->', '<!-- DESKTOP-DOWNLOAD-LINKS -->', desktopButtonsHtml.join(' '));
|
||||
await insertContentIntoFile(`${rootDir}/readme/download.md`, '<!-- MOBILE-DOWNLOAD-LINKS -->', '<!-- MOBILE-DOWNLOAD-LINKS -->', mobileButtonsHtml.join(' '));
|
||||
}
|
||||
|
||||
async function loadSponsors(): Promise<Sponsors> {
|
||||
const sponsorsPath = `${rootDir}/packages/tools/sponsors.json`;
|
||||
const output: Sponsors = JSON.parse(await readFile(sponsorsPath, 'utf8'));
|
||||
@@ -231,8 +204,8 @@ const isNewsFile = (filePath: string): boolean => {
|
||||
};
|
||||
|
||||
async function main() {
|
||||
await remove(`${rootDir}/docs`);
|
||||
await copy(websiteAssetDir, `${rootDir}/docs`);
|
||||
await remove(`${docDir}`);
|
||||
await copy(websiteAssetDir, `${docDir}`);
|
||||
|
||||
const sponsors = await loadSponsors();
|
||||
const partials = await loadMustachePartials(partialDir);
|
||||
@@ -240,20 +213,19 @@ async function main() {
|
||||
|
||||
const readmeMd = makeHomePageMd();
|
||||
|
||||
const downloadButtonsHtml = await createDownloadButtonsHtml(readmeMd);
|
||||
await updateDownloadPage(downloadButtonsHtml);
|
||||
// await updateDownloadPage(readmeMd);
|
||||
|
||||
// =============================================================
|
||||
// HELP PAGE
|
||||
// =============================================================
|
||||
|
||||
renderPageToHtml(readmeMd, `${rootDir}/docs/help/index.html`, { sourceMarkdownFile: 'README.md', partials, sponsors, assetUrls });
|
||||
renderPageToHtml(readmeMd, `${docDir}/help/index.html`, { sourceMarkdownFile: 'README.md', partials, sponsors, assetUrls });
|
||||
|
||||
// =============================================================
|
||||
// FRONT PAGE
|
||||
// =============================================================
|
||||
|
||||
renderPageToHtml('', `${rootDir}/docs/index.html`, {
|
||||
renderPageToHtml('', `${docDir}/index.html`, {
|
||||
templateHtml: frontTemplateHtml,
|
||||
partials,
|
||||
pressCarouselRegular: {
|
||||
@@ -290,7 +262,7 @@ async function main() {
|
||||
|
||||
const planPageContentHtml = renderMustache('', planPageParams);
|
||||
|
||||
renderPageToHtml('', `${rootDir}/docs/plans/index.html`, {
|
||||
renderPageToHtml('', `${docDir}/plans/index.html`, {
|
||||
...defaultTemplateParams(assetUrls),
|
||||
pageName: 'plans',
|
||||
partials,
|
||||
@@ -310,10 +282,12 @@ async function main() {
|
||||
const donateLinksMd = await getDonateLinks();
|
||||
|
||||
const makeTargetFilePath = (input: string): string => {
|
||||
const filenameNoExt = basename(input, '.md');
|
||||
|
||||
if (isNewsFile(input)) {
|
||||
return `${input.replace(/\.md/, '').replace(/readme\/news\//, 'docs/news/')}/index.html`;
|
||||
return `${docDir}/news/${filenameNoExt}/index.html`; // `${input.replace(/\.md/, '').replace(/readme\/news\//, 'docs/news/')}/index.html`;
|
||||
} else {
|
||||
return `${input.replace(/\.md/, '').replace(/readme\//, 'docs/')}/index.html`;
|
||||
return `${docDir}/${filenameNoExt}/index.html`;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -338,9 +312,10 @@ async function main() {
|
||||
source[2].sourceMarkdownName = path.basename(source[0], path.extname(source[0]));
|
||||
|
||||
const sourceFilePath = `${rootDir}/${source[0]}`;
|
||||
const targetFilePath = source[1];
|
||||
const isNews = isNewsFile(sourceFilePath);
|
||||
|
||||
renderFileToHtml(sourceFilePath, `${rootDir}/${source[1]}`, {
|
||||
renderFileToHtml(sourceFilePath, targetFilePath, {
|
||||
...source[2],
|
||||
templateHtml: mainTemplateHtml,
|
||||
pageName: isNews ? 'news-item' : '',
|
||||
@@ -355,7 +330,7 @@ async function main() {
|
||||
return a.toLowerCase() > b.toLowerCase() ? -1 : +1;
|
||||
});
|
||||
|
||||
await makeNewsFrontPage(newsFilePaths, `${rootDir}/docs/news/index.html`, {
|
||||
await makeNewsFrontPage(newsFilePaths, `${docDir}/news/index.html`, {
|
||||
...defaultTemplateParams(assetUrls),
|
||||
pageName: 'news',
|
||||
partials,
|
||||
|
41
packages/tools/website/updateDownloadPage.ts
Normal file
41
packages/tools/website/updateDownloadPage.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import { readFile } from 'fs-extra';
|
||||
import { rootDir, insertContentIntoFile } from '../tool-utils';
|
||||
|
||||
async function getReadmeMd() {
|
||||
return readFile(`${rootDir}/README.md`, 'utf8');
|
||||
}
|
||||
|
||||
async function createDownloadButtonsHtml(readmeMd: string): Promise<Record<string, string>> {
|
||||
const output: Record<string, string> = {};
|
||||
output['windows'] = readmeMd.match(/(<a href=.*?Joplin-Setup-.*?<\/a>)/)[0];
|
||||
output['macOs'] = readmeMd.match(/(<a href=.*?Joplin-.*\.dmg.*?<\/a>)/)[0];
|
||||
output['linux'] = readmeMd.match(/(<a href=.*?Joplin-.*\.AppImage.*?<\/a>)/)[0];
|
||||
output['android'] = readmeMd.match(/(<a href='https:\/\/play.google.com\/store\/apps\/details\?id=net\.cozic\.joplin.*?<\/a>)/)[0];
|
||||
output['ios'] = readmeMd.match(/(<a href='https:\/\/itunes\.apple\.com\/us\/app\/joplin\/id1315599797.*?<\/a>)/)[0];
|
||||
|
||||
for (const [k, v] of Object.entries(output)) {
|
||||
if (!v) throw new Error(`Could not get download element for: ${k}`);
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
export default async function updateDownloadPage(readmeMd: string = null) {
|
||||
readmeMd = readmeMd === null ? await getReadmeMd() : readmeMd;
|
||||
|
||||
const downloadButtonsHtml = await createDownloadButtonsHtml(readmeMd);
|
||||
|
||||
const desktopButtonsHtml = [
|
||||
downloadButtonsHtml['windows'],
|
||||
downloadButtonsHtml['macOs'],
|
||||
downloadButtonsHtml['linux'],
|
||||
];
|
||||
|
||||
const mobileButtonsHtml = [
|
||||
downloadButtonsHtml['android'],
|
||||
downloadButtonsHtml['ios'],
|
||||
];
|
||||
|
||||
await insertContentIntoFile(`${rootDir}/readme/download.md`, '<!-- DESKTOP-DOWNLOAD-LINKS -->', '<!-- DESKTOP-DOWNLOAD-LINKS -->', desktopButtonsHtml.join(' '));
|
||||
await insertContentIntoFile(`${rootDir}/readme/download.md`, '<!-- MOBILE-DOWNLOAD-LINKS -->', '<!-- MOBILE-DOWNLOAD-LINKS -->', mobileButtonsHtml.join(' '));
|
||||
}
|
@@ -1,5 +1,9 @@
|
||||
# Joplin Android app changelog
|
||||
|
||||
## [android-v2.6.9](https://github.com/laurent22/joplin/releases/tag/android-v2.6.9) - 2021-12-20T14:58:42Z
|
||||
|
||||
- Fixed: Fixed issue where synchroniser would try to update a shared folder that is not longer accessible (667d642)
|
||||
|
||||
## [android-v2.6.8](https://github.com/laurent22/joplin/releases/tag/android-v2.6.8) - 2021-12-17T10:15:00Z
|
||||
|
||||
- Improved: Update Mermaid: 8.12.1 -> 8.13.5 (#5831 by Helmut K. C. Tessarek)
|
||||
|
Reference in New Issue
Block a user