1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-08-30 20:39:46 +02:00

Compare commits

...

28 Commits

Author SHA1 Message Date
Laurent Cozic
51cc458e55 Android 2.6.9 2021-12-20 15:59:32 +01:00
Laurent Cozic
667d6420f2 All: Fixed issue where synchroniser would try to update a shared folder that is not longer accessible 2021-12-20 15:47:50 +01:00
Laurent Cozic
98fba37cd3 Desktop release v2.6.10 2021-12-19 11:58:42 +01:00
Laurent Cozic
5f1c78c0c1 Merge branch 'dev' into release-2.6 2021-12-19 11:58:15 +01:00
Laurent Cozic
2db2a1ccac Desktop: Fixes #5879 (Regression): Fixed exporting notes that contain Mermaid diagrams as PDF or HTML 2021-12-19 11:55:18 +01:00
Laurent Cozic
78d2190767 Tools: Update release-website.sh 2021-12-19 10:49:00 +01:00
Laurent Cozic
2788521607 Tools: Update release-website.sh 2021-12-19 10:39:40 +01:00
Joplin Bot
2de344eeca Doc: Updated Markdown files
Auto-updated using release-website.sh
2021-12-19 09:34:43 +00:00
Laurent Cozic
19dba16099 Tools: Update release-website.sh 2021-12-19 10:25:34 +01:00
Laurent Cozic
d1c77bdcfa Tools: Update release-website.sh 2021-12-19 10:23:49 +01:00
Laurent Cozic
b14956afbd Tools: Build website to separate repository 2021-12-19 08:53:19 +01:00
Elaborendum
250e97247f All: Translation: Update es_ES.po (#5880) 2021-12-19 02:43:56 -05:00
NiceYoyo
41cb47b6c8 All: Translation: Update de_DE.po (#5877)
Added new translations and edited one or two.
2021-12-18 18:40:24 -05:00
Laurent Cozic
7c3cf8ce84 Merge branch 'dev' into release-2.6 2021-12-17 12:59:03 +01:00
Laurent Cozic
c8f4c3f4ee CLI v2.6.2 2021-12-17 12:20:13 +01:00
Laurent Cozic
95e79d5dc0 Releasing sub-packages 2021-12-17 12:17:21 +01:00
Laurent Cozic
58654d35a2 Desktop release v2.6.9 2021-12-17 12:11:59 +01:00
Laurent Cozic
14bef046f9 timesteamp 2021-12-17 12:11:45 +01:00
Laurent Cozic
9e0bbdf912 iOS 12.6.2 2021-12-17 10:59:27 +01:00
Laurent Cozic
9eacb6eb1b Set iOS min supported version to 11.0 2021-12-17 10:59:07 +01:00
Laurent Cozic
97c5493bc1 Desktop release v2.6.8 2021-12-17 01:21:04 +01:00
Laurent Cozic
eb960a516c Merge branch 'dev' into release-2.6 2021-12-17 01:19:45 +01:00
Laurent Cozic
fb5ffa562f fix iOS build 2021-12-17 01:18:08 +01:00
Laurent Cozic
864b3c710c lock file 2021-12-16 14:02:19 +01:00
Laurent Cozic
198287f86a ios-v12.6.1 2021-12-16 13:55:54 +01:00
Laurent Cozic
b903542aed Merge branch 'dev' into release-2.6 2021-12-16 13:54:32 +01:00
Laurent Cozic
bda4c3a667 Android 2.6.7 2021-12-16 11:08:08 +01:00
Laurent Cozic
23617c9409 Desktop release v2.6.7 2021-12-16 10:34:49 +01:00
24 changed files with 425 additions and 237 deletions

View File

@@ -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
View File

@@ -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

View File

@@ -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&amp;mtm_kwd=joplinapp&amp;mtm_source=joplinapp-github&amp;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&amp;mtm_kwd=joplinapp&amp;mtm_source=joplinapp-github&amp;mtm_medium=banner"><img title="Hosting.de" width="256" src="https://joplinapp.org/images/sponsors/HostingDe.png"/></a>
<!-- SPONSORS-ORG -->
* * *

View File

@@ -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": {

View File

@@ -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));

View File

@@ -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",

View File

@@ -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,

View File

@@ -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"
}

View File

@@ -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 => {

View File

@@ -94,8 +94,10 @@ class Logger {
};
}
setLevel(level: LogLevel) {
public setLevel(level: LogLevel) {
const previous = this.level_;
this.level_ = level;
return previous;
}
level() {

View File

@@ -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);

View File

@@ -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 != ""');
}

View File

@@ -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);
});
});

View File

@@ -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}`);

View File

@@ -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

View File

@@ -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;

View File

@@ -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."

View File

@@ -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."

View 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

View File

@@ -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[] = [];

View 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);
});

View File

@@ -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,

View 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(' '));
}

View File

@@ -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 -&gt; 8.13.5 (#5831 by Helmut K. C. Tessarek)