1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-24 10:27:10 +02:00

Merge branch 'release-3.0' into dev

This commit is contained in:
Laurent Cozic 2024-07-06 13:41:53 +02:00
commit 1a4ba2c74a
16 changed files with 234 additions and 118 deletions

View File

@ -204,7 +204,7 @@ class Application extends BaseApplication {
public updateEditorFont() { public updateEditorFont() {
const fontFamilies = []; const fontFamilies = [];
if (Setting.value('style.editor.fontFamily')) fontFamilies.push(`"${Setting.value('style.editor.fontFamily')}"`); if (Setting.value('style.editor.fontFamily')) fontFamilies.push(`"${Setting.value('style.editor.fontFamily')}"`);
fontFamilies.push('Avenir, Arial, sans-serif'); fontFamilies.push('\'Avenir Next\', Avenir, Arial, sans-serif');
// The '*' and '!important' parts are necessary to make sure Russian text is displayed properly // The '*' and '!important' parts are necessary to make sure Russian text is displayed properly
// https://github.com/laurent22/joplin/issues/155 // https://github.com/laurent22/joplin/issues/155

View File

@ -104,10 +104,17 @@ const useOnKeyDown = (
event.preventDefault(); event.preventDefault();
} }
if (noteIds.length && (key === 'Delete' || (key === 'Backspace' && event.metaKey))) { if (noteIds.length) {
event.preventDefault(); if (key === 'Delete' && event.shiftKey) {
if (CommandService.instance().isEnabled('deleteNote')) { event.preventDefault();
void CommandService.instance().execute('deleteNote', noteIds); if (CommandService.instance().isEnabled('permanentlyDeleteNote')) {
void CommandService.instance().execute('permanentlyDeleteNote', noteIds);
}
} else if (key === 'Delete' || (key === 'Backspace' && event.metaKey)) {
event.preventDefault();
if (CommandService.instance().isEnabled('deleteNote')) {
void CommandService.instance().execute('deleteNote', noteIds);
}
} }
} }

View File

@ -1,7 +1,7 @@
import { useMemo } from 'react'; import { useMemo } from 'react';
import { FolderListItem, HeaderId, HeaderListItem, ListItem, ListItemType, TagListItem } from '../types'; import { FolderListItem, HeaderId, HeaderListItem, ListItem, ListItemType, TagListItem } from '../types';
import { FolderEntity, TagsWithNoteCountEntity } from '@joplin/lib/services/database/types'; import { FolderEntity, TagsWithNoteCountEntity } from '@joplin/lib/services/database/types';
import { renderFolders, renderTags } from '@joplin/lib/components/shared/side-menu-shared'; import { buildFolderTree, renderFolders, renderTags } from '@joplin/lib/components/shared/side-menu-shared';
import { _ } from '@joplin/lib/locale'; import { _ } from '@joplin/lib/locale';
import CommandService from '@joplin/lib/services/CommandService'; import CommandService from '@joplin/lib/services/CommandService';
import Setting from '@joplin/lib/models/Setting'; import Setting from '@joplin/lib/models/Setting';
@ -35,10 +35,13 @@ const useSidebarListData = (props: Props): ListItem[] => {
}); });
}, [props.tags]); }, [props.tags]);
const folderTree = useMemo(() => {
return buildFolderTree(props.folders);
}, [props.folders]);
const folderItems = useMemo(() => { const folderItems = useMemo(() => {
const renderProps = { const renderProps = {
folders: props.folders, folderTree,
collapsedFolderIds: props.collapsedFolderIds, collapsedFolderIds: props.collapsedFolderIds,
}; };
return renderFolders<ListItem>(renderProps, (folder, hasChildren, depth): FolderListItem => { return renderFolders<ListItem>(renderProps, (folder, hasChildren, depth): FolderListItem => {
@ -50,7 +53,7 @@ const useSidebarListData = (props: Props): ListItem[] => {
key: folder.id, key: folder.id,
}; };
}); });
}, [props.folders, props.collapsedFolderIds]); }, [folderTree, props.collapsedFolderIds]);
return useMemo(() => { return useMemo(() => {
const foldersHeader: HeaderListItem = { const foldersHeader: HeaderListItem = {

View File

@ -1,5 +1,7 @@
import { test, expect } from './util/test'; import { test, expect } from './util/test';
import MainScreen from './models/MainScreen'; import MainScreen from './models/MainScreen';
import activateMainMenuItem from './util/activateMainMenuItem';
import setMessageBoxResponse from './util/setMessageBoxResponse';
test.describe('noteList', () => { test.describe('noteList', () => {
test('should be possible to edit notes in a different notebook when searching', async ({ mainWindow }) => { test('should be possible to edit notes in a different notebook when searching', async ({ mainWindow }) => {
@ -35,4 +37,42 @@ test.describe('noteList', () => {
// Updating the title should force the sidebar to update sooner // Updating the title should force the sidebar to update sooner
await expect(editor.noteTitleInput).toHaveValue('note-1'); await expect(editor.noteTitleInput).toHaveValue('note-1');
}); });
test('shift-delete should ask to permanently delete notes, but only when the note list is focused', async ({ electronApp, mainWindow }) => {
const mainScreen = new MainScreen(mainWindow);
const sidebar = mainScreen.sidebar;
const folderBHeader = await sidebar.createNewFolder('Folder B');
const folderAHeader = await sidebar.createNewFolder('Folder A');
await expect(folderAHeader).toBeVisible();
await mainScreen.createNewNote('test note 1');
await mainScreen.createNewNote('test note 2');
await activateMainMenuItem(electronApp, 'Note list', 'Focus');
await expect(mainScreen.noteListContainer.getByText('test note 1')).toBeVisible();
await setMessageBoxResponse(electronApp, /^Delete/i);
const pressShiftDelete = async () => {
await mainWindow.keyboard.press('Shift');
await mainWindow.keyboard.press('Delete');
await mainWindow.keyboard.up('Delete');
await mainWindow.keyboard.up('Shift');
};
await pressShiftDelete();
await folderBHeader.click();
await folderAHeader.click();
await expect(mainScreen.noteListContainer.getByText('test note 2')).not.toBeVisible();
// Should not delete when the editor is focused
await mainScreen.noteEditor.focusCodeMirrorEditor();
await mainWindow.keyboard.type('test');
await pressShiftDelete();
await folderBHeader.click();
await folderAHeader.click();
await expect(mainScreen.noteListContainer.getByText('test note 1')).toBeVisible();
});
}); });

View File

@ -1,6 +1,6 @@
{ {
"name": "@joplin/app-desktop", "name": "@joplin/app-desktop",
"version": "3.0.12", "version": "3.0.13",
"description": "Joplin for Desktop", "description": "Joplin for Desktop",
"main": "main.js", "main": "main.js",
"private": true, "private": true,

View File

@ -79,8 +79,8 @@ android {
applicationId "net.cozic.joplin" applicationId "net.cozic.joplin"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 2097746 versionCode 2097747
versionName "3.0.7" versionName "3.0.8"
ndk { ndk {
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64" abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
} }

View File

@ -8,7 +8,7 @@ import Synchronizer from '@joplin/lib/Synchronizer';
import NavService from '@joplin/lib/services/NavService'; import NavService from '@joplin/lib/services/NavService';
import { _ } from '@joplin/lib/locale'; import { _ } from '@joplin/lib/locale';
import { ThemeStyle, themeStyle } from './global-style'; import { ThemeStyle, themeStyle } from './global-style';
import { isFolderSelected, renderFolders } from '@joplin/lib/components/shared/side-menu-shared'; import { buildFolderTree, isFolderSelected, renderFolders } from '@joplin/lib/components/shared/side-menu-shared';
import { FolderEntity, FolderIcon, FolderIconType } from '@joplin/lib/services/database/types'; import { FolderEntity, FolderIcon, FolderIconType } from '@joplin/lib/services/database/types';
import { AppState } from '../utils/types'; import { AppState } from '../utils/types';
import Setting from '@joplin/lib/models/Setting'; import Setting from '@joplin/lib/models/Setting';
@ -560,8 +560,16 @@ const SideMenuContentComponent = (props: Props) => {
items.push(renderSidebarButton('folder_header', _('Notebooks'), 'folder')); items.push(renderSidebarButton('folder_header', _('Notebooks'), 'folder'));
const folderTree = useMemo(() => {
return buildFolderTree(props.folders);
}, [props.folders]);
if (props.folders.length) { if (props.folders.length) {
const result = renderFolders(props, renderFolderItem); const result = renderFolders({
folderTree,
collapsedFolderIds: props.collapsedFolderIds,
}, renderFolderItem);
const folderItems = result.items; const folderItems = result.items;
items = items.concat(folderItems); items = items.concat(folderItems);
} }

View File

@ -503,13 +503,13 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Joplin/Joplin.entitlements; CODE_SIGN_ENTITLEMENTS = Joplin/Joplin.entitlements;
CURRENT_PROJECT_VERSION = 119; CURRENT_PROJECT_VERSION = 120;
DEVELOPMENT_TEAM = A9BXAFS6CT; DEVELOPMENT_TEAM = A9BXAFS6CT;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Joplin/Info.plist; INFOPLIST_FILE = Joplin/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.4; IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 13.0.5; MARKETING_VERSION = 13.0.6;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"$(inherited)", "$(inherited)",
"-ObjC", "-ObjC",
@ -534,12 +534,12 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Joplin/Joplin.entitlements; CODE_SIGN_ENTITLEMENTS = Joplin/Joplin.entitlements;
CURRENT_PROJECT_VERSION = 119; CURRENT_PROJECT_VERSION = 120;
DEVELOPMENT_TEAM = A9BXAFS6CT; DEVELOPMENT_TEAM = A9BXAFS6CT;
INFOPLIST_FILE = Joplin/Info.plist; INFOPLIST_FILE = Joplin/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.4; IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 13.0.5; MARKETING_VERSION = 13.0.6;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"$(inherited)", "$(inherited)",
"-ObjC", "-ObjC",
@ -724,14 +724,14 @@
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 119; CURRENT_PROJECT_VERSION = 120;
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = A9BXAFS6CT; DEVELOPMENT_TEAM = A9BXAFS6CT;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = ShareExtension/Info.plist; INFOPLIST_FILE = ShareExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.4; IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 13.0.5; MARKETING_VERSION = 13.0.6;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
@ -762,14 +762,14 @@
CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 119; CURRENT_PROJECT_VERSION = 120;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = A9BXAFS6CT; DEVELOPMENT_TEAM = A9BXAFS6CT;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = ShareExtension/Info.plist; INFOPLIST_FILE = ShareExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.4; IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 13.0.5; MARKETING_VERSION = 13.0.6;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"$(inherited)", "$(inherited)",

View File

@ -1,6 +1,6 @@
import { FolderEntity } from '../../services/database/types'; import { FolderEntity } from '../../services/database/types';
import { getTrashFolder, getTrashFolderId } from '../../services/trash'; import { getTrashFolder, getTrashFolderId } from '../../services/trash';
import { renderFolders } from './side-menu-shared'; import { buildFolderTree, renderFolders } from './side-menu-shared';
const renderItem = (folder: FolderEntity, hasChildren: boolean, depth: number) => { const renderItem = (folder: FolderEntity, hasChildren: boolean, depth: number) => {
return [folder.id, hasChildren, depth]; return [folder.id, hasChildren, depth];
@ -86,8 +86,52 @@ describe('side-menu-shared', () => {
order: ['1', getTrashFolderId(), '2'], order: ['1', getTrashFolderId(), '2'],
}, },
], ],
])('should render folders', (props, expected) => {
const actual = renderFolders(props, renderItem); // Should not render id: 4 because it's contained within the child of a collapsed folder.
[
{
collapsedFolderIds: ['2'],
folders: [
{
id: '1',
parent_id: '',
deleted_time: 0,
},
{
id: '2',
parent_id: '',
deleted_time: 0,
},
{
id: '3',
parent_id: '2',
deleted_time: 0,
},
{
id: '4',
parent_id: '3',
deleted_time: 0,
},
getTrashFolder(),
],
notesParentType: 'Folder',
selectedFolderId: '',
selectedTagId: '',
},
{
items: [
['1', false, 0],
['2', true, 0],
[getTrashFolderId(), false, 0],
],
order: ['1', '2', getTrashFolderId()],
},
],
])('should render folders (case %#)', (props, expected) => {
const actual = renderFolders({
folderTree: buildFolderTree(props.folders),
collapsedFolderIds: props.collapsedFolderIds,
}, renderItem);
expect(actual).toEqual(expected); expect(actual).toEqual(expected);
}); });

View File

@ -1,39 +1,10 @@
import Folder from '../../models/Folder';
import BaseModel from '../../BaseModel';
import { FolderEntity, TagEntity, TagsWithNoteCountEntity } from '../../services/database/types'; import { FolderEntity, TagEntity, TagsWithNoteCountEntity } from '../../services/database/types';
import { getDisplayParentId, getTrashFolderId } from '../../services/trash'; import { getDisplayParentId } from '../../services/trash';
import { getCollator } from '../../models/utils/getCollator'; import { getCollator } from '../../models/utils/getCollator';
export type RenderFolderItem<T> = (folder: FolderEntity, hasChildren: boolean, depth: number)=> T; export type RenderFolderItem<T> = (folder: FolderEntity, hasChildren: boolean, depth: number)=> T;
export type RenderTagItem<T> = (tag: TagsWithNoteCountEntity)=> T; export type RenderTagItem<T> = (tag: TagsWithNoteCountEntity)=> T;
function folderHasChildren_(folders: FolderEntity[], folderId: string) {
if (folderId === getTrashFolderId()) {
return !!folders.find(f => !!f.deleted_time);
}
for (let i = 0; i < folders.length; i++) {
const folder = folders[i];
const folderParentId = getDisplayParentId(folder, folders.find(f => f.id === folder.parent_id));
if (folderParentId === folderId) return true;
}
return false;
}
function folderIsCollapsed(folders: FolderEntity[], folderId: string, collapsedFolderIds: string[]) {
if (!collapsedFolderIds || !collapsedFolderIds.length) return false;
while (true) {
const folder: FolderEntity = BaseModel.byId(folders, folderId);
if (!folder) throw new Error(`No folder with id ${folder.id}`);
const folderParentId = getDisplayParentId(folder, folders.find(f => f.id === folder.parent_id));
if (!folderParentId) return false;
if (collapsedFolderIds.indexOf(folderParentId) >= 0) return true;
folderId = folderParentId;
}
}
interface FolderSelectedContext { interface FolderSelectedContext {
selectedFolderId: string; selectedFolderId: string;
notesParentType: string; notesParentType: string;
@ -48,21 +19,36 @@ type ItemsWithOrder<ItemType> = {
order: string[]; order: string[];
}; };
interface RenderFoldersProps { interface FolderTree {
folders: FolderEntity[]; folders: FolderEntity[];
parentIdToChildren: Map<string, FolderEntity[]>;
idToItem: Map<string, FolderEntity>;
}
interface RenderFoldersProps {
folderTree: FolderTree;
collapsedFolderIds: string[]; collapsedFolderIds: string[];
} }
function folderIsCollapsed(context: RenderFoldersProps, folderId: string) {
if (!context.collapsedFolderIds || !context.collapsedFolderIds.length) return false;
while (true) {
const folder = context.folderTree.idToItem.get(folderId);
const folderParentId = getDisplayParentId(folder, context.folderTree.idToItem.get(folder.parent_id));
if (!folderParentId) return false;
if (context.collapsedFolderIds.includes(folderParentId)) return true;
folderId = folderParentId;
}
}
function renderFoldersRecursive_<T>(props: RenderFoldersProps, renderItem: RenderFolderItem<T>, items: T[], parentId: string, depth: number, order: string[]): ItemsWithOrder<T> { function renderFoldersRecursive_<T>(props: RenderFoldersProps, renderItem: RenderFolderItem<T>, items: T[], parentId: string, depth: number, order: string[]): ItemsWithOrder<T> {
const folders = props.folders; const folders = props.folderTree.parentIdToChildren.get(parentId ?? '') ?? [];
for (let i = 0; i < folders.length; i++) { const parentIdToChildren = props.folderTree.parentIdToChildren;
const folder = folders[i]; for (const folder of folders) {
if (folderIsCollapsed(props, folder.id)) continue;
const folderParentId = getDisplayParentId(folder, props.folders.find(f => f.id === folder.parent_id)); const hasChildren = parentIdToChildren.has(folder.id);
if (!Folder.idsEqual(folderParentId, parentId)) continue;
if (folderIsCollapsed(props.folders, folder.id, props.collapsedFolderIds)) continue;
const hasChildren = folderHasChildren_(folders, folder.id);
order.push(folder.id); order.push(folder.id);
items.push(renderItem(folder, hasChildren, depth)); items.push(renderItem(folder, hasChildren, depth));
if (hasChildren) { if (hasChildren) {
@ -81,6 +67,24 @@ export const renderFolders = <T> (props: RenderFoldersProps, renderItem: RenderF
return renderFoldersRecursive_(props, renderItem, [], '', 0, []); return renderFoldersRecursive_(props, renderItem, [], '', 0, []);
}; };
export const buildFolderTree = (folders: FolderEntity[]): FolderTree => {
const idToItem = new Map<string, FolderEntity>();
for (const folder of folders) {
idToItem.set(folder.id, folder);
}
const parentIdToChildren = new Map<string, FolderEntity[]>();
for (const folder of folders) {
const displayParentId = getDisplayParentId(folder, idToItem.get(folder.parent_id)) ?? '';
if (!parentIdToChildren.has(displayParentId)) {
parentIdToChildren.set(displayParentId, []);
}
parentIdToChildren.get(displayParentId).push(folder);
}
return { folders, parentIdToChildren, idToItem };
};
const sortTags = (tags: TagEntity[]) => { const sortTags = (tags: TagEntity[]) => {
tags = tags.slice(); tags = tags.slice();
const collator = getCollator(); const collator = getCollator();

View File

@ -108,7 +108,6 @@ const defaultKeymapItems = {
{ accelerator: 'Ctrl+Alt+1', command: 'switchProfile1' }, { accelerator: 'Ctrl+Alt+1', command: 'switchProfile1' },
{ accelerator: 'Ctrl+Alt+2', command: 'switchProfile2' }, { accelerator: 'Ctrl+Alt+2', command: 'switchProfile2' },
{ accelerator: 'Ctrl+Alt+3', command: 'switchProfile3' }, { accelerator: 'Ctrl+Alt+3', command: 'switchProfile3' },
{ accelerator: 'Shift+Delete', command: 'permanentlyDeleteNote' },
], ],
}; };

View File

@ -58,7 +58,7 @@ export default function(theme: any, options: Options = null) {
theme = theme ? theme : {}; theme = theme ? theme : {};
const fontFamily = '\'Avenir\', \'Arial\', sans-serif'; const fontFamily = '\'Avenir Next\', \'Avenir\', \'Arial\', sans-serif';
const maxWidthTarget = options.contentMaxWidthTarget ? options.contentMaxWidthTarget : '#rendered-md'; const maxWidthTarget = options.contentMaxWidthTarget ? options.contentMaxWidthTarget : '#rendered-md';
const maxWidthCss = options.contentMaxWidth ? ` const maxWidthCss = options.contentMaxWidth ? `

View File

@ -269,7 +269,9 @@ function filterLogs(logs: LogEntry[], platform: Platform) {
// but that's not useful in a changelog especially since most people // but that's not useful in a changelog especially since most people
// don't know country and language codes. So we catch all these and // don't know country and language codes. So we catch all these and
// bundle them all up in a single "Updated translations" at the end. // bundle them all up in a single "Updated translations" at the end.
if (log.message.match(/Translation:\sUpdate\s.*?(\.po|[a-zA-Z][a-zA-Z]|[a-zA-Z][a-zA-Z]_[a-zA-Z][a-zA-Z])/)) { if (log.message.match(/Translation:\sUpdate\s.*?(\.po|[a-zA-Z][a-zA-Z]|[a-zA-Z][a-zA-Z]_[a-zA-Z][a-zA-Z])/)
|| log.message.match(/Update.+\.po/)
) {
// updatedTranslations = true; // updatedTranslations = true;
addIt = false; addIt = false;
} }

View File

@ -7,6 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Joplin-CLI 1.0.0\n" "Project-Id-Version: Joplin-CLI 1.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: cedecode <christoph.eder@phsalzburg.at>\n" "Last-Translator: cedecode <christoph.eder@phsalzburg.at>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: de_DE\n" "Language: de_DE\n"
@ -484,7 +486,7 @@ msgid ""
"Any email sent to this address will be converted into a note and added to " "Any email sent to this address will be converted into a note and added to "
"your collection. The note will be saved into the Inbox notebook" "your collection. The note will be saved into the Inbox notebook"
msgstr "" msgstr ""
"Jede an diese Adresse gerichtete E-Mail wird zu einer Notiz konvertiert und " "Jedes an diese Adresse gerichtete Email wird zu einer Notiz umgewandelt und "
"deiner Kollektion hinzugefügt. Die Notiz wird im Inbox-Notizbuch gespeichert" "deiner Kollektion hinzugefügt. Die Notiz wird im Inbox-Notizbuch gespeichert"
#: packages/lib/models/Setting.ts:2804 #: packages/lib/models/Setting.ts:2804
@ -1208,7 +1210,7 @@ msgid ""
msgstr "" msgstr ""
"Es konnte keine Verbindung zum Joplin-Server hergestellt werden. Bitte " "Es konnte keine Verbindung zum Joplin-Server hergestellt werden. Bitte "
"überprüfe die Synchronisationsoptionen in der Konfigurationsmaske. " "überprüfe die Synchronisationsoptionen in der Konfigurationsmaske. "
"Vollständiger Fehler war:\n" "Vollständiger Fehler:\n"
"\n" "\n"
"%s" "%s"
@ -1250,12 +1252,12 @@ msgid ""
"again when you are connected to the internet." "again when you are connected to the internet."
msgstr "" msgstr ""
"Der Freigabestatus dieses Notizbuchs konnte nicht überprüft werden - Vorgang " "Der Freigabestatus dieses Notizbuchs konnte nicht überprüft werden - Vorgang "
"wird abgebrochen. Bitte versuche es erneut, wenn eine Internetverbindung " "abgebrochen. Bitte versuche es erneut, sobald eine Internetverbindung "
"besteht." "besteht."
#: packages/app-mobile/components/biometrics/biometricAuthenticate.ts:20 #: packages/app-mobile/components/biometrics/biometricAuthenticate.ts:20
msgid "Could not verify your identity: %s" msgid "Could not verify your identity: %s"
msgstr "Konnte deine Identität nicht verifizieren: %s" msgstr "Konnte deine Identität nicht überprüfen: %s"
#: packages/app-desktop/gui/PromptDialog.tsx:301 #: packages/app-desktop/gui/PromptDialog.tsx:301
msgid "Create" msgid "Create"
@ -1492,7 +1494,7 @@ msgid ""
msgstr "" msgstr ""
"Das Inbox-Notizbuch löschen?\n" "Das Inbox-Notizbuch löschen?\n"
"\n" "\n"
"Wenn du das Inbox-Notizbuch löschst, gehen in ihm gespeicherte E-Mails " "Wenn du das Inbox-Notizbuch löschst, gehen kürzlich dort eingegangene Emails "
"möglicherweise verloren." "möglicherweise verloren."
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.tsx:245 #: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.tsx:245
@ -1854,25 +1856,25 @@ msgstr "Emacs"
#: packages/server/src/routes/admin/emails.ts:127 #: packages/server/src/routes/admin/emails.ts:127
#: packages/server/src/routes/admin/users.ts:140 #: packages/server/src/routes/admin/users.ts:140
msgid "Email" msgid "Email"
msgstr "E-Mail" msgstr "Email"
#: packages/app-desktop/gui/JoplinCloudConfigScreen.tsx:47 #: packages/app-desktop/gui/JoplinCloudConfigScreen.tsx:47
#: packages/app-mobile/components/screens/ConfigScreen/JoplinCloudConfig.tsx:23 #: packages/app-mobile/components/screens/ConfigScreen/JoplinCloudConfig.tsx:23
msgid "Email to note" msgid "Email to note"
msgstr "E-Mail zu Notiz" msgstr "Email zu Notiz"
#: packages/lib/utils/joplinCloud/index.ts:187 #: packages/lib/utils/joplinCloud/index.ts:187
msgid "Email to Note" msgid "Email to Note"
msgstr "E-Mail zu Notiz" msgstr "Email zu Notiz"
#: packages/lib/models/Setting.ts:2843 #: packages/lib/models/Setting.ts:2843
msgid "Email To Note, login information" msgid "Email To Note, login information"
msgstr "E-Mail zu Notiz, Login-Informationen" msgstr "Email zu Notiz, Login-Informationen"
#: packages/server/src/routes/admin/emails.ts:111 #: packages/server/src/routes/admin/emails.ts:111
#: packages/server/src/services/MustacheService.ts:133 #: packages/server/src/services/MustacheService.ts:133
msgid "Emails" msgid "Emails"
msgstr "E-Mails" msgstr "Emails"
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/CodeMirror.tsx:191 #: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v5/CodeMirror.tsx:191
msgid "emphasised text" msgid "emphasised text"
@ -1983,7 +1985,7 @@ msgstr "Weiche Zeilenumbrüche aktivieren"
#: packages/lib/models/Setting.ts:1110 #: packages/lib/models/Setting.ts:1110
msgid "Enable spellcheck in the text editor" msgid "Enable spellcheck in the text editor"
msgstr "Aktiviere die Rechtschreibprüfung im Text-Editor" msgstr "Aktiviere die Rechtschreibprüfung im Texteditor"
#: packages/lib/models/Setting.ts:1276 #: packages/lib/models/Setting.ts:1276
msgid "Enable table of contents extension" msgid "Enable table of contents extension"
@ -2017,8 +2019,8 @@ msgid ""
"Enabling encryption means *all* your notes and attachments are going to be " "Enabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent encrypted to the sync target." "re-synchronised and sent encrypted to the sync target."
msgstr "" msgstr ""
"Durch die Aktivierung der Verschlüsselung werden *alle* Notizen und Anhänge " "Durch Aktivierung der Verschlüsselung werden *alle* Notizen und Anhänge neu "
"neu synchronisiert und verschlüsselt an das Synchronisationsziel gesendet." "synchronisiert und verschlüsselt an das Synchronisationsziel gesendet."
#: packages/lib/models/BaseItem.ts:913 #: packages/lib/models/BaseItem.ts:913
msgid "Encrypted" msgid "Encrypted"
@ -2849,7 +2851,7 @@ msgstr "Joplin Server"
#: packages/lib/models/Setting.ts:709 #: packages/lib/models/Setting.ts:709
msgid "Joplin Server email" msgid "Joplin Server email"
msgstr "Joplin Server E-Mail" msgstr "Joplin Server-Email"
#: packages/lib/models/Setting.ts:721 #: packages/lib/models/Setting.ts:721
msgid "Joplin Server password" msgid "Joplin Server password"
@ -2864,7 +2866,7 @@ msgid ""
"Joplin Web Clipper allows saving web pages and screenshots from your browser " "Joplin Web Clipper allows saving web pages and screenshots from your browser "
"to Joplin." "to Joplin."
msgstr "" msgstr ""
"Joplin Web-Clipper ermöglicht das Speichern von Webseiten und Screenshots " "Joplin Web Clipper ermöglicht das Speichern von Webseiten und Screenshots "
"aus deinem Browser in Joplin." "aus deinem Browser in Joplin."
#: packages/app-mobile/components/screens/ConfigScreen/ConfigScreen.tsx:612 #: packages/app-mobile/components/screens/ConfigScreen/ConfigScreen.tsx:612
@ -3052,9 +3054,8 @@ msgid "Log"
msgstr "Protokoll" msgstr "Protokoll"
#: packages/app-desktop/gui/MainScreen/MainScreen.tsx:698 #: packages/app-desktop/gui/MainScreen/MainScreen.tsx:698
#, fuzzy
msgid "Login to Joplin Cloud." msgid "Login to Joplin Cloud."
msgstr "Mit Joplin Cloud verbinden" msgstr "Mit Joplin Cloud verbinden."
#: packages/app-mobile/components/screens/dropbox-login.js:55 #: packages/app-mobile/components/screens/dropbox-login.js:55
msgid "Login with Dropbox" msgid "Login with Dropbox"
@ -3202,7 +3203,7 @@ msgstr "Mobile Daten - Auto-Synchronisierung deaktiviert"
#: packages/app-desktop/gui/MainScreen/MainScreen.tsx:667 #: packages/app-desktop/gui/MainScreen/MainScreen.tsx:667
msgid "More info" msgid "More info"
msgstr "Weitere Information" msgstr "Weitere Infos"
#: packages/lib/models/Setting.ts:2817 #: packages/lib/models/Setting.ts:2817
msgid "More information" msgid "More information"
@ -3211,7 +3212,8 @@ msgstr "Weitere Informationen"
#: packages/app-cli/app/app.ts:67 #: packages/app-cli/app/app.ts:67
msgid "More than one item match \"%s\". Please narrow down your query." msgid "More than one item match \"%s\". Please narrow down your query."
msgstr "" msgstr ""
"Mehr als ein Element stimmt mit „%s“ überein. Bitte schränke deine Suche ein." "Mehr als ein Element stimmt mit „%s“ überein. Bitte schränke deine "
"Suchabfrage ein."
#: packages/app-mobile/components/screens/ConfigScreen/plugins/EnablePluginSupportPage.tsx:115 #: packages/app-mobile/components/screens/ConfigScreen/plugins/EnablePluginSupportPage.tsx:115
msgid "" msgid ""
@ -3266,7 +3268,7 @@ msgstr "N"
#: packages/lib/models/Setting.ts:1189 #: packages/lib/models/Setting.ts:1189
msgid "Never resize" msgid "Never resize"
msgstr "Größe niemals anpassen" msgstr "Größe nie anpassen"
#: packages/app-desktop/gui/Sidebar/listItemComponents/HeaderItem.tsx:46 #: packages/app-desktop/gui/Sidebar/listItemComponents/HeaderItem.tsx:46
msgid "New" msgid "New"
@ -3341,7 +3343,7 @@ msgstr "Nextcloud-WebDAV-URL"
#: packages/lib/models/Setting.ts:418 #: packages/lib/models/Setting.ts:418
msgid "no" msgid "no"
msgstr "Nein" msgstr "nein"
#: packages/app-desktop/services/plugins/UserWebviewDialogButtonBar.tsx:32 #: packages/app-desktop/services/plugins/UserWebviewDialogButtonBar.tsx:32
#: packages/app-mobile/components/screens/Note.tsx:747 #: packages/app-mobile/components/screens/Note.tsx:747
@ -3402,8 +3404,8 @@ msgstr "Kein Tab ausgewählt"
msgid "" msgid ""
"No text editor is defined. Please set it using `config editor <editor-path>`" "No text editor is defined. Please set it using `config editor <editor-path>`"
msgstr "" msgstr ""
"Kein Texteditor festgelegt. Bitte stelle einen mit `config editor <Pfad-Zum-" "Kein Texteditor festgelegt. Bitte wähle einen mit `config editor <Pfad-Zum-"
"Texteditor>` ein" "Texteditor>`"
#: packages/lib/models/Setting.ts:435 #: packages/lib/models/Setting.ts:435
msgid "Nord" msgid "Nord"
@ -3440,11 +3442,11 @@ msgstr "Notiz"
#: packages/lib/models/Setting.ts:1805 #: packages/lib/models/Setting.ts:1805
msgid "Note area growth factor" msgid "Note area growth factor"
msgstr "Notiz-Flächenwachstumsfaktor" msgstr "Notizbereich-Wachstumsfaktor"
#: packages/app-desktop/gui/Root.tsx:233 #: packages/app-desktop/gui/Root.tsx:233
msgid "Note attachments" msgid "Note attachments"
msgstr "Anhänge" msgstr "Notiz-Anhänge"
#: packages/app-desktop/gui/MenuBar.tsx:561 #: packages/app-desktop/gui/MenuBar.tsx:561
msgid "Note attachments..." msgid "Note attachments..."
@ -3481,7 +3483,7 @@ msgstr "Notizliste"
#: packages/lib/models/Setting.ts:1790 #: packages/lib/models/Setting.ts:1790
msgid "Note list growth factor" msgid "Note list growth factor"
msgstr "Notiz-Listenwachstumsfaktor" msgstr "Notizlisten-Wachstumsfaktor"
#: packages/app-desktop/gui/MenuBar.tsx:781 #: packages/app-desktop/gui/MenuBar.tsx:781
msgid "Note list style" msgid "Note list style"
@ -3498,18 +3500,18 @@ msgstr "Notiz-Titel"
#: packages/lib/models/Setting.ts:1297 #: packages/lib/models/Setting.ts:1297
msgid "Note: Does not work in all desktop environments." msgid "Note: Does not work in all desktop environments."
msgstr "Hinweis: Funktioniert nicht in allen Desktopumgebungen." msgstr "Hinweis: Funktioniert nicht in allen Desktop-Umgebungen."
#: packages/app-desktop/gui/ShareNoteDialog.tsx:192 #: packages/app-desktop/gui/ShareNoteDialog.tsx:192
msgid "" msgid ""
"Note: When a note is shared, it will no longer be encrypted on the server." "Note: When a note is shared, it will no longer be encrypted on the server."
msgstr "" msgstr ""
"Achtung: Wenn eine Notiz geteilt wird, wird sie auf dem Server nicht mehr " "Hinweis: Wenn eine Notiz geteilt wird, wird sie auf dem Server nicht länger "
"verschlüsselt sein." "verschlüsselt sein."
#: packages/app-desktop/gui/MenuBar.tsx:860 #: packages/app-desktop/gui/MenuBar.tsx:860
msgid "Note&book" msgid "Note&book"
msgstr "Notizbücher" msgstr "Notiz&bücher"
#: packages/lib/models/Setting.ts:2806 #: packages/lib/models/Setting.ts:2806
msgid "Notebook" msgid "Notebook"
@ -3898,8 +3900,8 @@ msgid ""
"can extend Joplin's editor, viewer, and more." "can extend Joplin's editor, viewer, and more."
msgstr "" msgstr ""
"Mit Erweiterungen lassen sich in Joplin zusätzliche Funktionen hinzufügen, " "Mit Erweiterungen lassen sich in Joplin zusätzliche Funktionen hinzufügen, "
"die standardmäßig nicht verfügbar sind. Sie können den Editor, die Ansicht " "die standardmäßig nicht verfügbar sind. Erweiterungen können den Editor, die "
"und vieles mehr erweitern." "Ansicht und vieles mehr ergänzen."
#: packages/lib/models/Setting.ts:1543 #: packages/lib/models/Setting.ts:1543
msgid "Portrait" msgid "Portrait"
@ -4570,11 +4572,11 @@ msgstr "Mehr Aktionen anzeigen"
#: packages/lib/models/Setting.ts:952 #: packages/lib/models/Setting.ts:952
msgid "Show note counts" msgid "Show note counts"
msgstr "Notizanzahl anzeigen" msgstr "Anzahl der Notizen anzeigen"
#: packages/lib/models/Setting.ts:1020 #: packages/lib/models/Setting.ts:1020
msgid "Show sort order buttons" msgid "Show sort order buttons"
msgstr "Knöpfe zur Einstellung der Sortierreihenfolge anzeigen" msgstr "Buttons für die Sortierreihenfolge anzeigen"
#: packages/lib/models/Setting.ts:1295 #: packages/lib/models/Setting.ts:1295
msgid "Show tray icon" msgid "Show tray icon"
@ -4747,8 +4749,8 @@ msgstr "Synchronisation starten..."
#: packages/app-cli/app/command-edit.ts:76 #: packages/app-cli/app/command-edit.ts:76
msgid "Starting to edit note. Close the editor to get back to the prompt." msgid "Starting to edit note. Close the editor to get back to the prompt."
msgstr "" msgstr ""
"Beginne die Notiz zu bearbeiten. Schließe das Textverarbeitungsprogramm, um " "Bearbeite die Notiz jetzt. Schließe den Editor, um zurück zum Terminal zu "
"zurück zum Terminal zu gelangen." "gelangen."
#: packages/app-desktop/gui/NoteContentPropertiesDialog.tsx:164 #: packages/app-desktop/gui/NoteContentPropertiesDialog.tsx:164
msgid "Statistics" msgid "Statistics"
@ -5151,8 +5153,8 @@ msgid ""
"The Joplin team has vetted this plugin and it meets our standards for " "The Joplin team has vetted this plugin and it meets our standards for "
"security and performance." "security and performance."
msgstr "" msgstr ""
"Das Joplin-Team hat dieses Plugin auf unsere Standards für Sicherheit und " "Das Joplin-Team hat dieses Plugin überprüft und es erfüllt unsere Standards "
"Leistung überprüft." "für Sicherheit und Leistung."
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:321 #: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:321
msgid "" msgid ""
@ -5655,7 +5657,7 @@ msgstr "Menüleiste umschalten"
#: packages/lib/models/Setting.ts:2846 #: packages/lib/models/Setting.ts:2846
msgid "Toggle note history, keep notes for" msgid "Toggle note history, keep notes for"
msgstr "Notizverlauf umschalten, Notizen aufbewahren für" msgstr "Notizenverlauf umschalten, Notizen aufbewahren für"
#: packages/app-desktop/gui/MainScreen/commands/toggleNoteList.ts:9 #: packages/app-desktop/gui/MainScreen/commands/toggleNoteList.ts:9
msgid "Toggle note list" msgid "Toggle note list"
@ -5927,8 +5929,8 @@ msgid ""
"Use this to rebuild the search index if there is a problem with search. It " "Use this to rebuild the search index if there is a problem with search. It "
"may take a long time depending on the number of notes." "may take a long time depending on the number of notes."
msgstr "" msgstr ""
"Verwende dies, um den Suchindex neu aufzubauen, wenn es ein Problem mit der " "Verwende dies zum Neuaufbau des Suchindex, falls es ein Problem mit der "
"Suche gibt. Dies kann je nach Anzahl der Notizen eine lange Zeit dauern." "Suche gibt. Dies kann je nach Anzahl der Notizen etwas länger dauern."
#: packages/app-mobile/components/biometrics/BiometricPopup.tsx:83 #: packages/app-mobile/components/biometrics/BiometricPopup.tsx:83
msgid "" msgid ""
@ -5973,7 +5975,7 @@ msgstr "Gültig"
#: packages/app-mobile/components/biometrics/biometricAuthenticate.ts:10 #: packages/app-mobile/components/biometrics/biometricAuthenticate.ts:10
msgid "Verify your identity" msgid "Verify your identity"
msgstr "Verifiziere deine Identität" msgstr "Überprüfe deine Identität"
#: packages/app-desktop/gui/NoteList/utils/canManuallySortNotes.ts:10 #: packages/app-desktop/gui/NoteList/utils/canManuallySortNotes.ts:10
msgid "View" msgid "View"
@ -6024,7 +6026,7 @@ msgstr "Warnung"
#: packages/app-desktop/gui/ResourceScreen.tsx:302 #: packages/app-desktop/gui/ResourceScreen.tsx:302
msgid "Warning: not all resources shown for performance reasons (limit: %s)." msgid "Warning: not all resources shown for performance reasons (limit: %s)."
msgstr "" msgstr ""
"Warnung: Aus Leistungsgründen werden nicht alle Anhänge angezeigt " "Warnung: Aus Kapazitätsgründen werden nicht alle Anhänge angezeigt "
"(Obergrenze: %s)." "(Obergrenze: %s)."
#: packages/app-mobile/components/screens/ConfigScreen/plugins/EnablePluginSupportPage.tsx:116 #: packages/app-mobile/components/screens/ConfigScreen/plugins/EnablePluginSupportPage.tsx:116
@ -6038,7 +6040,7 @@ msgid ""
"We mark plugins developed by trusted Joplin community members as " "We mark plugins developed by trusted Joplin community members as "
"\"recommended\"." "\"recommended\"."
msgstr "" msgstr ""
"Wir kennzeichen Erweiterungen, die von vertrauenswürdigen Mitgliedern der " "Wir kennzeichnen Erweiterungen, die von vertrauenswürdigen Mitgliedern der "
"Joplin-Community entwickelt wurden, als „empfohlen“." "Joplin-Community entwickelt wurden, als „empfohlen“."
#: packages/lib/models/Setting.ts:2812 #: packages/lib/models/Setting.ts:2812
@ -6086,8 +6088,8 @@ msgid ""
msgstr "" msgstr ""
"Willkommen bei Joplin!\n" "Willkommen bei Joplin!\n"
"\n" "\n"
"Tippe `:help shortcuts` für eine Liste der Shortcuts oder `:help` für " "Gib `:help shortcuts` für eine Liste der Shortcuts oder `:help` für Infos "
"Informationen zur Benutzung ein.\n" "zur Benutzung ein.\n"
"\n" "\n"
"Um zum Beispiel ein Notizbuch zu erstellen, drücke `mb`; um eine Notiz zu " "Um zum Beispiel ein Notizbuch zu erstellen, drücke `mb`; um eine Notiz zu "
"erstellen drücke `mn`." "erstellen drücke `mn`."
@ -6102,11 +6104,11 @@ msgstr "Was sind Erweiterungen?"
#: packages/lib/models/Setting.ts:1166 #: packages/lib/models/Setting.ts:1166
msgid "When creating a new note:" msgid "When creating a new note:"
msgstr "Wenn eine neue Notiz erstellt wird:" msgstr "Beim Erstellen einer neuen Notiz:"
#: packages/lib/models/Setting.ts:1149 #: packages/lib/models/Setting.ts:1149
msgid "When creating a new to-do:" msgid "When creating a new to-do:"
msgstr "Wenn eine neue Aufgabe erstellt wird:" msgstr "Beim Erstellen einer neuen Aufgabe:"
#: packages/lib/models/Setting.ts:882 #: packages/lib/models/Setting.ts:882
msgid "" msgid ""
@ -6114,8 +6116,7 @@ msgid ""
"text from it. This will allow you to search for text in these attachments." "text from it. This will allow you to search for text in these attachments."
msgstr "" msgstr ""
"Wenn aktiviert, wird die Anwendung deine Anhänge einlesen und Text aus ihnen " "Wenn aktiviert, wird die Anwendung deine Anhänge einlesen und Text aus ihnen "
"extrahieren. Dies wird dir ermöglichen, nach Text innerhalb dieser Anhänge " "extrahieren. Damit kannst du innerhalb dieser Anhänge nach Text suchen."
"zu suchen."
#: packages/app-desktop/ElectronAppWrapper.ts:184 #: packages/app-desktop/ElectronAppWrapper.ts:184
msgid "Window unresponsive." msgid "Window unresponsive."
@ -6197,7 +6198,7 @@ msgstr "Dein Konto hat keinen Zugriff auf diese Funktion"
#: packages/app-cli/app/cli-utils.js:160 #: packages/app-cli/app/cli-utils.js:160
msgid "Your choice: " msgid "Your choice: "
msgstr "Deine Auswahl: " msgstr "Deine Wahl: "
#: packages/lib/components/EncryptionConfigScreen/utils.ts:70 #: packages/lib/components/EncryptionConfigScreen/utils.ts:70
msgid "Your data is going to be re-encrypted and synced again." msgid "Your data is going to be re-encrypted and synced again."
@ -6206,7 +6207,7 @@ msgstr "Deine Daten werden neu verschlüsselt und erneut synchronisiert."
#: packages/app-desktop/gui/MainScreen/MainScreen.tsx:697 #: packages/app-desktop/gui/MainScreen/MainScreen.tsx:697
#: packages/app-mobile/components/ScreenHeader/WarningBanner.tsx:55 #: packages/app-mobile/components/ScreenHeader/WarningBanner.tsx:55
msgid "Your Joplin Cloud credentials are invalid, please login." msgid "Your Joplin Cloud credentials are invalid, please login."
msgstr "" msgstr "Deine Zugangsdaten für Joplin Cloud sind ungültig, bitte einloggen."
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:259 #: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:259
msgid "Your password is needed to decrypt some of your data." msgid "Your password is needed to decrypt some of your data."
@ -6808,7 +6809,7 @@ msgstr "Herauszoomen"
#~ msgstr "\"%s\": \"%s\"" #~ msgstr "\"%s\": \"%s\""
#~ msgid "File system synchronisation target directory" #~ msgid "File system synchronisation target directory"
#~ msgstr "Dateisystem-Synchronisation Zielpfad" #~ msgstr "Dateisystem-Zielpfad für Synchronisation"
#~ msgid "Set or clear alarm:" #~ msgid "Set or clear alarm:"
#~ msgstr "Erstelle oder entferne Alarm:" #~ msgstr "Erstelle oder entferne Alarm:"

View File

@ -1,5 +1,9 @@
# Joplin Android Changelog # Joplin Android Changelog
## [android-v3.0.8](https://github.com/laurent22/joplin/releases/tag/android-v3.0.8) (Pre-release) - 2024-07-06T10:26:06Z
- Fixed: Fix sidebar performance regression with many nested notebooks (#10676) (#10674 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
## [android-v3.0.7](https://github.com/laurent22/joplin/releases/tag/android-v3.0.7) (Pre-release) - 2024-07-01T15:47:15Z ## [android-v3.0.7](https://github.com/laurent22/joplin/releases/tag/android-v3.0.7) (Pre-release) - 2024-07-01T15:47:15Z
- Improved: Set min version for synchronising to 3.0.0 (e4b8976) - Improved: Set min version for synchronising to 3.0.0 (e4b8976)

View File

@ -1,5 +1,9 @@
# Joplin iOS Changelog # Joplin iOS Changelog
## [ios-v13.0.6](https://github.com/laurent22/joplin/releases/tag/ios-v13.0.6) - 2024-07-06T11:22:58Z
- Fixed: Fix sidebar performance regression with many nested notebooks (#10676) (#10674 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
## [ios-v13.0.5](https://github.com/laurent22/joplin/releases/tag/ios-v13.0.5) - 2024-07-01T15:47:53Z ## [ios-v13.0.5](https://github.com/laurent22/joplin/releases/tag/ios-v13.0.5) - 2024-07-01T15:47:53Z
- Improved: Set min version for synchronising to 3.0.0 (e4b8976) - Improved: Set min version for synchronising to 3.0.0 (e4b8976)