You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2026-01-05 00:12:33 +02:00
Compare commits
22 Commits
server-v3.
...
alt_instan
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
04666be15f | ||
|
|
64d0bec2c5 | ||
|
|
ab28f2a794 | ||
|
|
ab86b95fad | ||
|
|
0f07c0f53a | ||
|
|
a6d04c4781 | ||
|
|
bc27f47881 | ||
|
|
d1d75449f5 | ||
|
|
bbea5388ed | ||
|
|
99e773855e | ||
|
|
55b73347e5 | ||
|
|
7e8dee4906 | ||
|
|
69fb1ab104 | ||
|
|
67ae0ea2d1 | ||
|
|
cdb61b922b | ||
|
|
da80443796 | ||
|
|
1924dd31d2 | ||
|
|
b831d8c068 | ||
|
|
4ad1b49769 | ||
|
|
0d6c1067e3 | ||
|
|
0bdc38a6be | ||
|
|
5c35569b5b |
@@ -1026,6 +1026,7 @@ packages/lib/commands/renderMarkup.test.js
|
||||
packages/lib/commands/renderMarkup.js
|
||||
packages/lib/commands/showEditorPlugin.js
|
||||
packages/lib/commands/synchronize.js
|
||||
packages/lib/commands/toggleAllFolders.test.js
|
||||
packages/lib/commands/toggleAllFolders.js
|
||||
packages/lib/commands/toggleEditorPlugin.js
|
||||
packages/lib/components/EncryptionConfigScreen/utils.test.js
|
||||
|
||||
4
.github/workflows/github-actions-main.yml
vendored
4
.github/workflows/github-actions-main.yml
vendored
@@ -9,7 +9,7 @@ jobs:
|
||||
matrix:
|
||||
# Do not use unbuntu-latest because it causes `The operation was canceled` failures:
|
||||
# https://github.com/actions/runner-images/issues/6709
|
||||
os: [macos-13, ubuntu-20.04, windows-2019]
|
||||
os: [macos-13, ubuntu-22.04, windows-2019]
|
||||
steps:
|
||||
|
||||
# Trying to fix random networking issues on Windows
|
||||
@@ -150,7 +150,7 @@ jobs:
|
||||
matrix:
|
||||
# Do not use unbuntu-latest because it causes `The operation was canceled` failures:
|
||||
# https://github.com/actions/runner-images/issues/6709
|
||||
os: [ubuntu-20.04]
|
||||
os: [ubuntu-22.04]
|
||||
steps:
|
||||
|
||||
- name: Install Docker Engine
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1001,6 +1001,7 @@ packages/lib/commands/renderMarkup.test.js
|
||||
packages/lib/commands/renderMarkup.js
|
||||
packages/lib/commands/showEditorPlugin.js
|
||||
packages/lib/commands/synchronize.js
|
||||
packages/lib/commands/toggleAllFolders.test.js
|
||||
packages/lib/commands/toggleAllFolders.js
|
||||
packages/lib/commands/toggleEditorPlugin.js
|
||||
packages/lib/components/EncryptionConfigScreen/utils.test.js
|
||||
|
||||
@@ -80,7 +80,7 @@ async function setupDownloadPage() {
|
||||
|
||||
if (href.indexOf('-Setup') > 0) downloadLinks['windows'] = href;
|
||||
if (href.indexOf('.dmg') > 0) downloadLinks['macOs'] = href;
|
||||
if (href.endsWith('arm64.DMG')) downloadLinks['macOsM1'] = href;
|
||||
if (href.indexOf('arm64.DMG') > 0) downloadLinks['macOsM1'] = href;
|
||||
if (href.indexOf('.AppImage') > 0) downloadLinks['linux'] = href;
|
||||
});
|
||||
|
||||
@@ -98,6 +98,8 @@ async function setupDownloadPage() {
|
||||
} else {
|
||||
const os = await getOs();
|
||||
|
||||
console.info('Found OS: ' + os);
|
||||
|
||||
if (os === 'macOsUndefined') {
|
||||
// If we don't know which macOS version it is, we let the user choose.
|
||||
$('.main-content .intro').html('<p class="macos-m1-info">The macOS release is available for Intel processors or for Apple Silicon (M1) processors. Please select your version:</p>');
|
||||
|
||||
@@ -67,10 +67,23 @@ showHelp() {
|
||||
fi
|
||||
}
|
||||
|
||||
#-----------------------------------------------------
|
||||
# Setup Download Helper: DL
|
||||
#-----------------------------------------------------
|
||||
if [[ `command -v wget2` ]]; then
|
||||
DL='wget2 -qO'
|
||||
elif [[ `command -v wget` ]]; then
|
||||
DL='wget -qO'
|
||||
elif [[ `command -v curl` ]]; then
|
||||
DL='curl -sLo'
|
||||
else
|
||||
print "${COLOR_RED}Error: wget2, wget, and curl not found. Please install one of these tools.${COLOR_RESET}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#-----------------------------------------------------
|
||||
# PARSE ARGUMENTS
|
||||
#-----------------------------------------------------
|
||||
|
||||
optspec=":h-:"
|
||||
while getopts "${optspec}" OPT; do
|
||||
[ "${OPT}" = " " ] && continue
|
||||
@@ -140,9 +153,9 @@ fi
|
||||
|
||||
# Get the latest version to download
|
||||
if [[ "$INCLUDE_PRE_RELEASE" == true ]]; then
|
||||
RELEASE_VERSION=$(wget -qO - "https://api.github.com/repos/laurent22/joplin/releases" | grep -Po '"tag_name": ?"v\K.*?(?=")' | sort -rV | head -1)
|
||||
RELEASE_VERSION=$($DL - "https://api.github.com/repos/laurent22/joplin/releases" | grep -Po '"tag_name": ?"v\K.*?(?=")' | sort -rV | head -1)
|
||||
else
|
||||
RELEASE_VERSION=$(wget -qO - "https://api.github.com/repos/laurent22/joplin/releases/latest" | grep -Po '"tag_name": ?"v\K.*?(?=")')
|
||||
RELEASE_VERSION=$($DL - "https://api.github.com/repos/laurent22/joplin/releases/latest" | grep -Po '"tag_name": ?"v\K.*?(?=")')
|
||||
fi
|
||||
|
||||
# Check if it's in the latest version
|
||||
@@ -163,8 +176,8 @@ fi
|
||||
#-----------------------------------------------------
|
||||
print 'Downloading Joplin...'
|
||||
TEMP_DIR=$(mktemp -d)
|
||||
wget -O "${TEMP_DIR}/Joplin.AppImage" "https://objects.joplinusercontent.com/v${RELEASE_VERSION}/Joplin-${RELEASE_VERSION}.AppImage?source=LinuxInstallScript&type=$DOWNLOAD_TYPE"
|
||||
wget -O "${TEMP_DIR}/joplin.png" https://joplinapp.org/images/Icon512.png
|
||||
$DL "${TEMP_DIR}/Joplin.AppImage" "https://objects.joplinusercontent.com/v${RELEASE_VERSION}/Joplin-${RELEASE_VERSION}.AppImage?source=LinuxInstallScript&type=$DOWNLOAD_TYPE"
|
||||
$DL "${TEMP_DIR}/joplin.png" https://joplinapp.org/images/Icon512.png
|
||||
|
||||
#-----------------------------------------------------
|
||||
print 'Installing Joplin...'
|
||||
@@ -287,7 +300,7 @@ echo "$RELEASE_VERSION" > "${INSTALL_DIR}/VERSION"
|
||||
|
||||
#-----------------------------------------------------
|
||||
if [[ "$SHOW_CHANGELOG" == true ]]; then
|
||||
NOTES=$(wget -qO - https://api.github.com/repos/laurent22/joplin/releases/latest | grep -Po '"body": "\K.*(?=")')
|
||||
NOTES=$($DL - https://api.github.com/repos/laurent22/joplin/releases/latest | grep -Po '"body": "\K.*(?=")')
|
||||
print "${COLOR_BLUE}Changelog:${COLOR_RESET}\n${NOTES}"
|
||||
fi
|
||||
|
||||
|
||||
@@ -4,15 +4,12 @@ import AutoUpdaterService, { defaultUpdateInterval, initialUpdateStartup } from
|
||||
import type ShimType from '@joplin/lib/shim';
|
||||
const shim: typeof ShimType = require('@joplin/lib/shim').default;
|
||||
import { isCallbackUrl } from '@joplin/lib/callbackUrlUtils';
|
||||
|
||||
import { BrowserWindow, Tray, WebContents, screen } from 'electron';
|
||||
import { BrowserWindow, Tray, WebContents, screen, App, Event, dialog, ipcMain } from 'electron';
|
||||
import bridge from './bridge';
|
||||
const url = require('url');
|
||||
const path = require('path');
|
||||
const { dirname } = require('@joplin/lib/path-utils');
|
||||
const fs = require('fs-extra');
|
||||
|
||||
import { dialog, ipcMain } from 'electron';
|
||||
import { _ } from '@joplin/lib/locale';
|
||||
import restartInSafeModeFromMain from './utils/restartInSafeModeFromMain';
|
||||
import handleCustomProtocols, { CustomProtocolHandler } from './utils/customProtocols/handleCustomProtocols';
|
||||
@@ -36,8 +33,7 @@ interface SecondaryWindowData {
|
||||
|
||||
export default class ElectronAppWrapper {
|
||||
private logger_: Logger = null;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||
private electronApp_: any;
|
||||
private electronApp_: App;
|
||||
private env_: string;
|
||||
private isDebugMode_: boolean;
|
||||
private profilePath_: string;
|
||||
@@ -48,8 +44,7 @@ export default class ElectronAppWrapper {
|
||||
private secondaryWindows_: Map<SecondaryWindowId, SecondaryWindowData> = new Map();
|
||||
|
||||
private willQuitApp_ = false;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||
private tray_: any = null;
|
||||
private tray_: Tray = null;
|
||||
private buildDir_: string = null;
|
||||
private rendererProcessQuitReply_: RendererProcessQuitReply = null;
|
||||
|
||||
@@ -57,14 +52,15 @@ export default class ElectronAppWrapper {
|
||||
private updaterService_: AutoUpdaterService = null;
|
||||
private customProtocolHandler_: CustomProtocolHandler = null;
|
||||
private updatePollInterval_: ReturnType<typeof setTimeout>|null = null;
|
||||
private isAltInstance_: boolean;
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||
public constructor(electronApp: any, env: string, profilePath: string|null, isDebugMode: boolean, initialCallbackUrl: string) {
|
||||
public constructor(electronApp: App, env: string, profilePath: string|null, isDebugMode: boolean, initialCallbackUrl: string, isAltInstance: boolean) {
|
||||
this.electronApp_ = electronApp;
|
||||
this.env_ = env;
|
||||
this.isDebugMode_ = isDebugMode;
|
||||
this.profilePath_ = profilePath;
|
||||
this.initialCallbackUrl_ = initialCallbackUrl;
|
||||
this.isAltInstance_ = isAltInstance;
|
||||
}
|
||||
|
||||
public electronApp() {
|
||||
@@ -87,6 +83,10 @@ export default class ElectronAppWrapper {
|
||||
return BrowserWindow.getFocusedWindow() ?? this.win_;
|
||||
}
|
||||
|
||||
public isAltInstance() {
|
||||
return this.isAltInstance_;
|
||||
}
|
||||
|
||||
public windowById(joplinId: string) {
|
||||
if (joplinId === defaultWindowId) {
|
||||
return this.mainWindow();
|
||||
@@ -538,6 +538,7 @@ export default class ElectronAppWrapper {
|
||||
|
||||
public ensureSingleInstance() {
|
||||
if (this.env_ === 'dev') return false;
|
||||
if (this.isAltInstance_) return false;
|
||||
|
||||
const gotTheLock = this.electronApp_.requestSingleInstanceLock();
|
||||
|
||||
@@ -548,8 +549,7 @@ export default class ElectronAppWrapper {
|
||||
}
|
||||
|
||||
// Someone tried to open a second instance - focus our window instead
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||
this.electronApp_.on('second-instance', (_e: any, argv: string[]) => {
|
||||
this.electronApp_.on('second-instance', (_event: Event, argv: string[], _workingDirectory: string) => {
|
||||
const win = this.mainWindow();
|
||||
if (!win) return;
|
||||
if (win.isMinimized()) win.restore();
|
||||
|
||||
@@ -617,10 +617,11 @@ class Application extends BaseApplication {
|
||||
clipperLogger.addTarget(TargetType.Console);
|
||||
|
||||
ClipperServer.instance().initialize(actionApi);
|
||||
ClipperServer.instance().setEnabled(!Setting.value('isAltInstance'));
|
||||
ClipperServer.instance().setLogger(clipperLogger);
|
||||
ClipperServer.instance().setDispatch(this.store().dispatch);
|
||||
|
||||
if (Setting.value('clipperServer.autoStart')) {
|
||||
if (ClipperServer.instance().enabled() && Setting.value('clipperServer.autoStart')) {
|
||||
void ClipperServer.instance().start();
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ class ClipperConfigScreenComponent extends React.Component {
|
||||
}
|
||||
|
||||
private enableClipperServer_click() {
|
||||
if (!ClipperServer.instance().enabled()) return;
|
||||
Setting.setValue('clipperServer.autoStart', true);
|
||||
void ClipperServer.instance().start();
|
||||
}
|
||||
@@ -70,6 +71,8 @@ class ClipperConfigScreenComponent extends React.Component {
|
||||
|
||||
const webClipperStatusComps = [];
|
||||
|
||||
const clipperEnabled = ClipperServer.instance().enabled();
|
||||
|
||||
if (this.props.clipperServerAutoStart) {
|
||||
webClipperStatusComps.push(
|
||||
<p key="text_1" style={theme.textStyle}>
|
||||
@@ -95,13 +98,22 @@ class ClipperConfigScreenComponent extends React.Component {
|
||||
</button>,
|
||||
);
|
||||
} else {
|
||||
if (!clipperEnabled) {
|
||||
webClipperStatusComps.push(
|
||||
<p key="text_4" style={theme.textStyle}>
|
||||
{_('The web clipper service cannot be enabled in this instance of Joplin.')}
|
||||
</p>,
|
||||
);
|
||||
} else {
|
||||
webClipperStatusComps.push(
|
||||
<p key="text_4" style={theme.textStyle}>
|
||||
{_('The web clipper service is not enabled.')}
|
||||
</p>,
|
||||
);
|
||||
}
|
||||
|
||||
webClipperStatusComps.push(
|
||||
<p key="text_4" style={theme.textStyle}>
|
||||
{_('The web clipper service is not enabled.')}
|
||||
</p>,
|
||||
);
|
||||
webClipperStatusComps.push(
|
||||
<button key="enable_button" style={buttonStyle} onClick={this.enableClipperServer_click}>
|
||||
<button key="enable_button" style={buttonStyle} onClick={this.enableClipperServer_click} disabled={!clipperEnabled}>
|
||||
{_('Enable Web Clipper Service')}
|
||||
</button>,
|
||||
);
|
||||
|
||||
@@ -789,6 +789,7 @@ function useMenu(props: Props) {
|
||||
shim.isMac() ? noItem : menuItemDic.toggleMenuBar,
|
||||
menuItemDic.toggleNoteList,
|
||||
menuItemDic.toggleVisiblePanes,
|
||||
menuItemDic.toggleEditorPlugin,
|
||||
{
|
||||
label: _('Layout button sequence'),
|
||||
submenu: layoutButtonSequenceMenuItems,
|
||||
|
||||
@@ -22,13 +22,14 @@ interface CollapseExpandAllButtonProps {
|
||||
}
|
||||
|
||||
const CollapseExpandAllButton = (props: CollapseExpandAllButtonProps) => {
|
||||
// To allow it to be accessed by accessibility tools, the new folder button
|
||||
// To allow it to be accessed by accessibility tools, the toggle button
|
||||
// is not included in the portion of the list with role='tree'.
|
||||
const icon = props.allFoldersCollapsed ? 'far fa-caret-square-right' : 'far fa-caret-square-down';
|
||||
const label = props.allFoldersCollapsed ? _('Expand all notebooks') : _('Collapse all notebooks');
|
||||
|
||||
return <button onClick={() => onToggleAllFolders(props.allFoldersCollapsed)} className='sidebar-header-button -collapseall'>
|
||||
<i
|
||||
aria-label={_('Collapse / Expand all notebooks')}
|
||||
aria-label={label}
|
||||
role='img'
|
||||
className={icon}
|
||||
/>
|
||||
|
||||
@@ -43,6 +43,7 @@ export default function() {
|
||||
'togglePerFolderSortOrder',
|
||||
'toggleSideBar',
|
||||
'toggleVisiblePanes',
|
||||
'toggleEditorPlugin',
|
||||
'toggleTabMovesFocus',
|
||||
'editor.deleteLine',
|
||||
'editor.duplicateLine',
|
||||
|
||||
@@ -40,6 +40,7 @@ Logger.fsDriver_ = new FsDriverNode();
|
||||
const env = envFromArgs(process.argv);
|
||||
const profileFromArgs = getProfileFromArgs(process.argv);
|
||||
const isDebugMode = !!process.argv && process.argv.indexOf('--debug') >= 0;
|
||||
const isAltInstance = !!process.argv && process.argv.indexOf('--is-alt-instance') >= 0;
|
||||
|
||||
// We initialize all these variables here because they are needed from the main process. They are
|
||||
// then passed to the renderer process via the bridge.
|
||||
@@ -65,7 +66,7 @@ void registerCustomProtocols();
|
||||
|
||||
const initialCallbackUrl = process.argv.find((arg) => isCallbackUrl(arg));
|
||||
|
||||
const wrapper = new ElectronAppWrapper(electronApp, env, rootProfileDir, isDebugMode, initialCallbackUrl);
|
||||
const wrapper = new ElectronAppWrapper(electronApp, env, rootProfileDir, isDebugMode, initialCallbackUrl, isAltInstance);
|
||||
|
||||
initBridge(wrapper, appId, appName, rootProfileDir, autoUploadCrashDumps);
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ const restartInSafeModeFromMain = async () => {
|
||||
shimInit({});
|
||||
|
||||
const startFlags = await processStartFlags(bridge().processArgv());
|
||||
const { rootProfileDir } = determineBaseAppDirs(startFlags.matched.profileDir, appName);
|
||||
const { rootProfileDir } = determineBaseAppDirs(startFlags.matched.profileDir, appName, Setting.value('isAltInstance'));
|
||||
const { profileDir } = await initProfile(rootProfileDir);
|
||||
|
||||
// We can't access the database, so write to a file instead.
|
||||
|
||||
@@ -86,8 +86,8 @@ android {
|
||||
applicationId "net.cozic.joplin"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 2097764
|
||||
versionName "3.3.1"
|
||||
versionCode 2097765
|
||||
versionName "3.3.2"
|
||||
ndk {
|
||||
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ const baseStyle = {
|
||||
fontSizeSmaller: 14,
|
||||
disabledOpacity: 0.2,
|
||||
lineHeight: '1.6em',
|
||||
listTabSize: '1.7em',
|
||||
// The default, may be overridden in settings:
|
||||
noteViewerFontSize: 16,
|
||||
};
|
||||
|
||||
@@ -1701,7 +1701,7 @@ SPEC CHECKSUMS:
|
||||
JoplinCommonShareExtension: a8b60b02704d85a7305627912c0240e94af78db7
|
||||
JoplinRNShareExtension: e158a4b53ee0aa9cd3037a16221dc8adbd6f7860
|
||||
OpenSSL-Universal: b60a3702c9fea8b3145549d421fdb018e53ab7b4
|
||||
RCT-Folly: 02617c592a293bd6d418e0a88ff4ee1f88329b47
|
||||
RCT-Folly: 5dc73daec3476616d19e8a53f0156176f7b55461
|
||||
RCTDeprecation: efb313d8126259e9294dc4ee0002f44a6f676aba
|
||||
RCTRequired: f49ea29cece52aee20db633ae7edc4b271435562
|
||||
RCTTypeSafety: a11979ff0570d230d74de9f604f7d19692157bc4
|
||||
|
||||
@@ -268,8 +268,6 @@ const createEditor = (
|
||||
},
|
||||
}),
|
||||
|
||||
EditorState.tabSize.of(4),
|
||||
|
||||
// Apply styles to entire lines (block-display decorations)
|
||||
decoratorExtension,
|
||||
dropCursor(),
|
||||
|
||||
8
packages/editor/CodeMirror/theme.ts
vendored
8
packages/editor/CodeMirror/theme.ts
vendored
@@ -106,6 +106,14 @@ const createTheme = (theme: EditorTheme): Extension[] => {
|
||||
marginLeft: `${theme.marginLeft}px`,
|
||||
marginRight: `${theme.marginRight}px`,
|
||||
},
|
||||
|
||||
'& .cm-listItem': {
|
||||
// Needs to be !important because the tab-size is directly set on the element style
|
||||
// attribute by CodeMirror. And the `EditorState.tabSize` function only accepts a
|
||||
// number, while we need a "em" value to make it match the viewer tab size.
|
||||
tabSize: `${theme.listTabSize} !important`,
|
||||
},
|
||||
|
||||
'&.cm-focused .cm-cursor': baseCursorStyle,
|
||||
|
||||
// The desktop app sets the font for these elements to a specific font.
|
||||
|
||||
@@ -146,6 +146,7 @@ export interface EditorTheme extends Theme {
|
||||
contentMaxWidth?: number;
|
||||
marginLeft?: number;
|
||||
marginRight?: number;
|
||||
listTabSize?: string;
|
||||
}
|
||||
|
||||
export interface EditorSettings {
|
||||
|
||||
@@ -687,7 +687,7 @@ export default class BaseApplication {
|
||||
// https://immerjs.github.io/immer/docs/freezing
|
||||
setAutoFreeze(initArgs.env === 'dev');
|
||||
|
||||
const { rootProfileDir, homeDir } = determineProfileAndBaseDir(options.rootProfileDir ?? initArgs.profileDir, appName);
|
||||
const { rootProfileDir, homeDir } = determineProfileAndBaseDir(options.rootProfileDir ?? initArgs.profileDir, appName, initArgs.isAltInstance);
|
||||
const { profileDir, profileConfig, isSubProfile } = await initProfile(rootProfileDir);
|
||||
this.profileConfig_ = profileConfig;
|
||||
|
||||
@@ -806,6 +806,8 @@ export default class BaseApplication {
|
||||
Setting.setValue('sync.interval', 3600);
|
||||
}
|
||||
|
||||
Setting.setValue('isAltInstance', initArgs.isAltInstance);
|
||||
|
||||
Setting.setValue('firstStart', false);
|
||||
} else {
|
||||
Setting.applyDefaultMigrations();
|
||||
|
||||
@@ -23,6 +23,7 @@ export default class ClipperServer {
|
||||
private api_: Api = null;
|
||||
// eslint-disable-next-line @typescript-eslint/ban-types -- Old code before rule was applied
|
||||
private dispatch_: Function;
|
||||
private enabled_ = true;
|
||||
|
||||
private static instance_: ClipperServer = null;
|
||||
|
||||
@@ -40,6 +41,18 @@ export default class ClipperServer {
|
||||
return this.api_;
|
||||
}
|
||||
|
||||
public enabled() {
|
||||
return this.enabled_;
|
||||
}
|
||||
|
||||
public setEnabled(v: boolean) {
|
||||
this.enabled_ = v;
|
||||
|
||||
if (!this.enabled_ && this.isRunning()) {
|
||||
void this.stop();
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||
public initialize(actionApi: any = null) {
|
||||
this.api_ = new Api(() => {
|
||||
@@ -106,6 +119,8 @@ export default class ClipperServer {
|
||||
}
|
||||
|
||||
public async start() {
|
||||
if (!this.enabled()) throw new Error('Cannot start clipper server because it is disabled');
|
||||
|
||||
this.setPort(null);
|
||||
|
||||
this.setStartState(StartState.Starting);
|
||||
@@ -251,8 +266,10 @@ export default class ClipperServer {
|
||||
}
|
||||
|
||||
public async stop() {
|
||||
this.server_.destroy();
|
||||
this.server_ = null;
|
||||
if (this.server_) {
|
||||
this.server_.destroy();
|
||||
this.server_ = null;
|
||||
}
|
||||
this.setStartState(StartState.Idle);
|
||||
this.setPort(null);
|
||||
}
|
||||
|
||||
36
packages/lib/commands/toggleAllFolders.test.ts
Normal file
36
packages/lib/commands/toggleAllFolders.test.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import { setupDatabase, switchClient } from '../testing/test-utils';
|
||||
import { runtime } from './toggleAllFolders';
|
||||
import Setting from '../models/Setting';
|
||||
import { CommandContext } from '../services/CommandService';
|
||||
import { defaultState } from '../reducer';
|
||||
|
||||
const command = runtime();
|
||||
|
||||
const makeContext = (): CommandContext => {
|
||||
return {
|
||||
state: defaultState,
|
||||
dispatch: ()=>{},
|
||||
};
|
||||
};
|
||||
|
||||
describe('toggleAllFolders', () => {
|
||||
|
||||
beforeEach(async () => {
|
||||
await setupDatabase(0);
|
||||
await switchClient(0);
|
||||
});
|
||||
|
||||
test('expanding all should expand the folders header, if previously collapsed', async () => {
|
||||
Setting.setValue('folderHeaderIsExpanded', false);
|
||||
|
||||
// Collapsing all should leave the folder header as-is
|
||||
const context = makeContext();
|
||||
await command.execute(context, true);
|
||||
expect(Setting.value('folderHeaderIsExpanded')).toBe(false);
|
||||
|
||||
// Expanding all should also expand the folder header
|
||||
await command.execute(context, false);
|
||||
expect(Setting.value('folderHeaderIsExpanded')).toBe(true);
|
||||
});
|
||||
|
||||
});
|
||||
@@ -1,6 +1,7 @@
|
||||
import { CommandRuntime, CommandDeclaration, CommandContext } from '../services/CommandService';
|
||||
import { _ } from '../locale';
|
||||
import getCanBeCollapsedFolderIds from '../models/utils/getCanBeCollapsedFolderIds';
|
||||
import Setting from '../models/Setting';
|
||||
|
||||
export const declaration: CommandDeclaration = {
|
||||
name: 'toggleAllFolders',
|
||||
@@ -10,6 +11,10 @@ export const declaration: CommandDeclaration = {
|
||||
export const runtime = (): CommandRuntime => {
|
||||
return {
|
||||
execute: async (context: CommandContext, collapseAll: boolean) => {
|
||||
if (!collapseAll && !Setting.value('folderHeaderIsExpanded')) {
|
||||
Setting.setValue('folderHeaderIsExpanded', true);
|
||||
}
|
||||
|
||||
context.dispatch({
|
||||
type: 'FOLDER_SET_COLLAPSED',
|
||||
ids: collapseAll ? getCanBeCollapsedFolderIds(context.state.folders) : [],
|
||||
|
||||
@@ -45,5 +45,7 @@ export const runtime = (): CommandRuntime => {
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
enabledCondition: 'hasActivePluginEditor',
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { homedir } from 'os';
|
||||
import { toSystemSlashes } from './path-utils';
|
||||
|
||||
export default (profileFromArgs: string, appName: string) => {
|
||||
export default (profileFromArgs: string, appName: string, isAltInstance: boolean) => {
|
||||
let profileDir = '';
|
||||
let homeDir = '';
|
||||
|
||||
@@ -12,7 +12,8 @@ export default (profileFromArgs: string, appName: string) => {
|
||||
profileDir = `${process.env.PORTABLE_EXECUTABLE_DIR}/JoplinProfile`;
|
||||
homeDir = process.env.PORTABLE_EXECUTABLE_DIR;
|
||||
} else {
|
||||
profileDir = `${homedir()}/.config/${appName}`;
|
||||
const suffix = isAltInstance ? '-alt' : '';
|
||||
profileDir = `${homedir()}/.config/${appName}${suffix}`;
|
||||
homeDir = homedir();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
const time = require('../time').default;
|
||||
const { setupDatabaseAndSynchronizer, switchClient } = require('../testing/test-utils.js');
|
||||
const { setupDatabaseAndSynchronizer, switchClient, msleep } = require('../testing/test-utils.js');
|
||||
const Folder = require('../models/Folder').default;
|
||||
const Note = require('../models/Note').default;
|
||||
|
||||
@@ -95,6 +95,8 @@ describe('models/Note_CustomSortOrder', () => {
|
||||
|
||||
const timeBefore = time.unixMs();
|
||||
|
||||
await msleep(10);
|
||||
|
||||
await Note.insertNotesAt(folder1.id, [note2.id], 0);
|
||||
await Note.insertNotesAt(folder1.id, [note1.id], 1);
|
||||
|
||||
|
||||
@@ -91,8 +91,7 @@ interface SettingSections {
|
||||
|
||||
interface DefaultMigration {
|
||||
name: string;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
|
||||
previousDefault: any;
|
||||
previousDefault: string | boolean | number;
|
||||
}
|
||||
|
||||
// To create a default migration:
|
||||
@@ -117,6 +116,10 @@ const defaultMigrations: DefaultMigration[] = [
|
||||
name: 'themeAutoDetect',
|
||||
previousDefault: false,
|
||||
},
|
||||
{
|
||||
name: 'ocr.enabled',
|
||||
previousDefault: false,
|
||||
},
|
||||
];
|
||||
|
||||
// "UserSettingMigration" are used to migrate existing user setting to a new setting. With a way
|
||||
|
||||
@@ -62,6 +62,16 @@ const builtInMetadata = (Setting: typeof SettingType) => {
|
||||
type: SettingItemType.String,
|
||||
public: false,
|
||||
},
|
||||
|
||||
'isAltInstance': {
|
||||
value: false,
|
||||
type: SettingItemType.Bool,
|
||||
public: false,
|
||||
appTypes: [AppType.Desktop],
|
||||
storage: SettingStorage.File,
|
||||
isGlobal: true,
|
||||
},
|
||||
|
||||
'editor.codeView': {
|
||||
value: true,
|
||||
type: SettingItemType.Bool,
|
||||
|
||||
@@ -42,6 +42,7 @@ const defaultKeymapItems = {
|
||||
{ accelerator: 'Option+Cmd+S', command: 'toggleSideBar' },
|
||||
{ accelerator: 'Option+Cmd+L', command: 'toggleNoteList' },
|
||||
{ accelerator: 'Cmd+L', command: 'toggleVisiblePanes' },
|
||||
{ accelerator: 'Option+Cmd+V', command: 'toggleEditorPlugin' },
|
||||
{ accelerator: 'Cmd+0', command: 'zoomActualSize' },
|
||||
{ accelerator: 'Cmd+E', command: 'toggleExternalEditing' },
|
||||
{ accelerator: 'Option+Cmd+T', command: 'setTags' },
|
||||
@@ -93,6 +94,7 @@ const defaultKeymapItems = {
|
||||
{ accelerator: 'Ctrl+Shift+M', command: 'toggleMenuBar' },
|
||||
{ accelerator: 'F11', command: 'toggleNoteList' },
|
||||
{ accelerator: 'Ctrl+L', command: 'toggleVisiblePanes' },
|
||||
{ accelerator: 'Alt+Ctrl+V', command: 'toggleEditorPlugin' },
|
||||
{ accelerator: 'Ctrl+0', command: 'zoomActualSize' },
|
||||
{ accelerator: 'Ctrl+E', command: 'toggleExternalEditing' },
|
||||
{ accelerator: 'Ctrl+Alt+T', command: 'setTags' },
|
||||
|
||||
@@ -7,6 +7,7 @@ import { FolderEntity, NoteEntity } from '../database/types';
|
||||
import { itemIsReadOnlySync, ItemSlice } from '../../models/utils/readOnly';
|
||||
import ItemChange from '../../models/ItemChange';
|
||||
import { getTrashFolderId } from '../trash';
|
||||
import getActivePluginEditorView from '../plugins/utils/getActivePluginEditorView';
|
||||
|
||||
export interface WhenClauseContextOptions {
|
||||
commandFolderId?: string;
|
||||
@@ -43,6 +44,7 @@ export interface WhenClauseContext {
|
||||
oneNoteSelected: boolean;
|
||||
someNotesSelected: boolean;
|
||||
syncStarted: boolean;
|
||||
hasActivePluginEditor: boolean;
|
||||
}
|
||||
|
||||
export default function stateToWhenClauseContext(state: State, options: WhenClauseContextOptions = null): WhenClauseContext {
|
||||
@@ -61,6 +63,8 @@ export default function stateToWhenClauseContext(state: State, options: WhenClau
|
||||
const commandFolderId = options.commandFolderId || windowState.selectedFolderId;
|
||||
const commandFolder: FolderEntity = commandFolderId ? BaseModel.byId(state.folders, commandFolderId) : null;
|
||||
|
||||
const { editorPlugin } = state.pluginService ? getActivePluginEditorView(state.pluginService.plugins) : { editorPlugin: null };
|
||||
|
||||
const settings = state.settings || {};
|
||||
|
||||
return {
|
||||
@@ -108,5 +112,7 @@ export default function stateToWhenClauseContext(state: State, options: WhenClau
|
||||
joplinServerConnected: [9, 10].includes(settings['sync.target']),
|
||||
joplinCloudAccountType: settings['sync.target'] === 10 ? settings['sync.10.accountType'] : 0,
|
||||
hasMultiProfiles: state.profileConfig && state.profileConfig.profiles.length > 1,
|
||||
|
||||
hasActivePluginEditor: !!editorPlugin,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -329,6 +329,7 @@ export default class ShareService {
|
||||
let recipientMasterKey: MasterKeyEntity = null;
|
||||
|
||||
if (getEncryptionEnabled()) {
|
||||
if (!recipientEmail) throw new Error(_('Please provide the recipient email'));
|
||||
const syncInfo = localSyncInfo();
|
||||
const masterKey = syncInfo.masterKeys.find(m => m.id === masterKeyId);
|
||||
if (!masterKey) throw new Error(`Cannot find master key with ID "${masterKeyId}"`);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
const { shimInit } = require('./shim-init-node');
|
||||
import shim from './shim';
|
||||
import { setupDatabaseAndSynchronizer, supportDir } from './testing/test-utils';
|
||||
import { createTempDir, setupDatabaseAndSynchronizer, supportDir } from './testing/test-utils';
|
||||
import { copyFile } from 'fs-extra';
|
||||
|
||||
describe('shim-init-node', () => {
|
||||
@@ -19,8 +19,11 @@ describe('shim-init-node', () => {
|
||||
});
|
||||
|
||||
test('should preserve the file extension if one is provided regardless of the mime type', async () => {
|
||||
const tempDir = await createTempDir();
|
||||
|
||||
const originalFilePath = `${supportDir}/valid_pdf_without_ext`;
|
||||
const fileWithDifferentExtension = `${originalFilePath}.mscz`;
|
||||
const fileWithDifferentExtension = `${tempDir}/valid_pdf.mscz`;
|
||||
|
||||
await copyFile(originalFilePath, fileWithDifferentExtension);
|
||||
|
||||
const resource = await shim.createResourceFromPath(fileWithDifferentExtension);
|
||||
|
||||
@@ -52,6 +52,7 @@ const globalStyle = (() => {
|
||||
mainPadding: 12,
|
||||
topRowHeight: 50,
|
||||
editorPaddingLeft: 8,
|
||||
listTabSize: '1.7em',
|
||||
|
||||
margin: margin,
|
||||
marginRight: margin,
|
||||
|
||||
@@ -13,6 +13,7 @@ export interface MatchedStartFlags {
|
||||
logLevel?: LogLevel;
|
||||
allowOverridingDnsResultOrder?: boolean;
|
||||
devPlugins?: string[];
|
||||
isAltInstance?: boolean;
|
||||
}
|
||||
|
||||
// Handles the initial flags passed to main script and
|
||||
@@ -181,6 +182,12 @@ const processStartFlags = async (argv: string[], setDefaults = true) => {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg === '--is-alt-instance') {
|
||||
matched.isAltInstance = true;
|
||||
argv.splice(0, 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.length && arg[0] === '-') {
|
||||
throw new JoplinError(_('Unknown flag: %s', arg), 'flagError');
|
||||
} else {
|
||||
|
||||
@@ -89,6 +89,7 @@ export default function versionInfo(packageInfo: PackageInfo, plugins: Plugins)
|
||||
_('Sync Version: %s', Setting.value('syncVersion')),
|
||||
_('Profile Version: %s', reg.db().version()),
|
||||
_('Keychain Supported: %s', keychainSupported ? _('Yes') : _('No')),
|
||||
_('Is alternative instance: %s', Setting.value('isAltInstance') ? _('Yes') : _('No')),
|
||||
];
|
||||
|
||||
if (gitInfo) {
|
||||
|
||||
@@ -216,7 +216,7 @@ export default function(theme: any, options: Options = null) {
|
||||
}
|
||||
ul, ol {
|
||||
padding-left: 0;
|
||||
margin-left: 1.7em;
|
||||
margin-left: ${theme.listTabSize};
|
||||
}
|
||||
li {
|
||||
margin-bottom: .4em;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,9 +6,11 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
||||
"Project-Id-Version: Joplin-CLI 3.2.13\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: Dmitriy Q <atsip-help@yandex.ru>\n"
|
||||
"POT-Creation-Date: \n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: Dmitriy Q <krotesk@yandex.ru>\n"
|
||||
"Language-Team: Sergey Segeda <thesermanarm@gmail.com>\n"
|
||||
"Language: ru_RU\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -16,7 +18,7 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 3.4.2\n"
|
||||
"X-Generator: Poedit 3.5\n"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/ConfigScreen.tsx:593
|
||||
msgid "- Camera: to allow taking a picture and attaching it to a note."
|
||||
@@ -50,7 +52,7 @@ msgstr "(В плагине: %s)"
|
||||
|
||||
#: packages/app-mobile/components/side-menu-content.tsx:265
|
||||
msgid "(level %d)"
|
||||
msgstr ""
|
||||
msgstr "(уровень %d)"
|
||||
|
||||
#: packages/lib/SyncTargetNone.ts:16
|
||||
msgid "(None)"
|
||||
@@ -264,9 +266,8 @@ msgstr ""
|
||||
"\"clear\" преобразует выбранную задачу в обычную заметку."
|
||||
|
||||
#: packages/app-desktop/gui/UpdateNotification/UpdateNotification.tsx:62
|
||||
#, fuzzy
|
||||
msgid "A new update (%s) is available"
|
||||
msgstr "Доступно обновление"
|
||||
msgstr "Доступно новое (%s) обновление"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:1253
|
||||
msgid "A3"
|
||||
@@ -375,7 +376,7 @@ msgstr "Добавить получателя:"
|
||||
|
||||
#: packages/app-mobile/components/screens/NoteTagsDialog.tsx:94
|
||||
msgid "Add tag %s to note"
|
||||
msgstr ""
|
||||
msgstr "Добавить тег %s к заметке"
|
||||
|
||||
#: packages/app-mobile/components/screens/Note/Note.tsx:1574
|
||||
msgid "Add title"
|
||||
@@ -386,9 +387,9 @@ msgid "Add to dictionary"
|
||||
msgstr "Добавить в словарь"
|
||||
|
||||
#: packages/app-mobile/components/CameraView/ScannedBarcodes.tsx:98
|
||||
#, fuzzy
|
||||
msgid "Add to note"
|
||||
msgstr "Добавить заголовок"
|
||||
msgstr "Добавить к заметке"
|
||||
|
||||
|
||||
#: packages/server/src/services/MustacheService.ts:162
|
||||
#: packages/server/src/services/MustacheService.ts:286
|
||||
@@ -412,9 +413,8 @@ msgid "Advanced tools"
|
||||
msgstr "Расширенные инструменты"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:18
|
||||
#, fuzzy
|
||||
msgid "all"
|
||||
msgstr "Установить"
|
||||
msgstr "все"
|
||||
|
||||
#: packages/app-mobile/components/ProfileSwitcher/ProfileSwitcher.tsx:109
|
||||
msgid ""
|
||||
@@ -521,13 +521,13 @@ msgid "Apply"
|
||||
msgstr "Применить"
|
||||
|
||||
#: packages/app-mobile/components/EditorToolbar/ToolbarEditorDialog.tsx:146
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Are you sure that you want to restore the default toolbar layout?\n"
|
||||
"This cannot be undone."
|
||||
msgstr ""
|
||||
"Вы уверены, что хотите вернуться к макету по умолчанию? Текущая конфигурация "
|
||||
"макета будет потеряна."
|
||||
"Вы уверены, что хотите восстановить расположение панели инструментов по "
|
||||
"умолчанию?\n"
|
||||
"Это нельзя отменить."
|
||||
|
||||
#: packages/app-desktop/gui/ClipperConfigScreen.tsx:38
|
||||
msgid "Are you sure you want to renew the authorisation token?"
|
||||
@@ -554,6 +554,8 @@ msgid ""
|
||||
"At present, Joplin Web can only be open in one tab at a time. Please close "
|
||||
"the other instance of Joplin."
|
||||
msgstr ""
|
||||
"В настоящее время Joplin Web может быть одновременно открыт только в одной "
|
||||
"вкладке. Пожалуйста, закройте другую вкладку Joplin."
|
||||
|
||||
#: packages/app-mobile/components/NoteEditor/ImageEditor/promptRestoreAutosave.ts:25
|
||||
msgid "Attach"
|
||||
@@ -640,7 +642,7 @@ msgstr "Автоматическое закрытие скобок, кавыче
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:656
|
||||
msgid "Autocomplete Markdown and HTML"
|
||||
msgstr ""
|
||||
msgstr "Автозавершение Markdown и HTML"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:1198
|
||||
msgid "Automatically check for updates"
|
||||
@@ -704,7 +706,7 @@ msgstr "к %s"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:20
|
||||
msgid "by word"
|
||||
msgstr ""
|
||||
msgstr "словом"
|
||||
|
||||
#: packages/server/src/routes/admin/users.ts:160
|
||||
msgid "Can Share"
|
||||
@@ -877,13 +879,12 @@ msgid "Change language"
|
||||
msgstr "Изменить язык"
|
||||
|
||||
#: packages/app-mobile/components/CameraView/ActionButtons.tsx:124
|
||||
#, fuzzy
|
||||
msgid "Change ratio"
|
||||
msgstr "Конфигурация"
|
||||
msgstr "Коэффициент изменений"
|
||||
|
||||
#: packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.tsx:98
|
||||
msgid "Change shortcut for \"%s\""
|
||||
msgstr ""
|
||||
msgstr "Изменить ярлык для \"%s\""
|
||||
|
||||
#: packages/app-desktop/gui/NoteContentPropertiesDialog.tsx:106
|
||||
msgid "Characters"
|
||||
@@ -895,7 +896,7 @@ msgstr "Символы за исключением пробелов"
|
||||
|
||||
#: packages/app-mobile/components/EditorToolbar/ToolbarEditorDialog.tsx:168
|
||||
msgid "Check elements to display in the toolbar"
|
||||
msgstr ""
|
||||
msgstr "Отметьте элементы для отображения на панели инструментов"
|
||||
|
||||
#: packages/app-desktop/gui/MenuBar.tsx:634
|
||||
#: packages/app-desktop/gui/MenuBar.tsx:929
|
||||
@@ -960,9 +961,8 @@ msgid "Client ID: %s"
|
||||
msgstr "Идентификатор клиента: %s"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:23
|
||||
#, fuzzy
|
||||
msgid "close"
|
||||
msgstr "Закрыть"
|
||||
msgstr "закрыть"
|
||||
|
||||
#: packages/app-desktop/gui/MenuBar.tsx:359
|
||||
#: packages/app-desktop/gui/NoteContentPropertiesDialog.tsx:175
|
||||
@@ -982,13 +982,12 @@ msgid "Close dropdown"
|
||||
msgstr "Закрыть выпадающий список"
|
||||
|
||||
#: packages/app-mobile/components/accessibility/AccessibleModalMenu.tsx:46
|
||||
#, fuzzy
|
||||
msgid "Close menu"
|
||||
msgstr "Закрыть"
|
||||
msgstr "Закрыть меню"
|
||||
|
||||
#: packages/app-mobile/components/SideMenu.tsx:300
|
||||
msgid "Close side menu"
|
||||
msgstr ""
|
||||
msgstr "Закрыть боковое меню"
|
||||
|
||||
#: packages/lib/models/settings/settingValidations.ts:33
|
||||
msgid ""
|
||||
@@ -1036,7 +1035,7 @@ msgstr "Совместная работа над блокнотами с дру
|
||||
|
||||
#: packages/app-desktop/gui/Sidebar/listItemComponents/ExpandIcon.tsx:28
|
||||
msgid "Collapsed, press space to expand."
|
||||
msgstr ""
|
||||
msgstr "Свернуто, нажмите пробел чтобы развернуть."
|
||||
|
||||
#: packages/lib/services/ReportService.ts:351
|
||||
msgid "Coming alarms"
|
||||
@@ -1076,14 +1075,12 @@ msgid "Compact"
|
||||
msgstr "Компактный"
|
||||
|
||||
#: packages/app-desktop/gui/NoteList/utils/useOnKeyDown.ts:153
|
||||
#, fuzzy
|
||||
msgid "Complete"
|
||||
msgstr "Завершено"
|
||||
msgstr "Завершенные"
|
||||
|
||||
#: packages/app-desktop/gui/NoteListItem/utils/prepareViewProps.ts:40
|
||||
#, fuzzy
|
||||
msgid "Complete to-do"
|
||||
msgstr "Завершено"
|
||||
msgstr "Завершенные дела"
|
||||
|
||||
#: packages/app-desktop/gui/NoteListHeader/utils/getColumnTitle.ts:12
|
||||
#: packages/app-desktop/gui/NotePropertiesDialog.tsx:70
|
||||
@@ -1156,12 +1153,11 @@ msgid "Consolidated billing"
|
||||
msgstr "Консолидированный биллинг"
|
||||
|
||||
#: packages/app-desktop/gui/Sidebar/listItemComponents/NoteCount.tsx:11
|
||||
#, fuzzy
|
||||
msgid "Contains %d note"
|
||||
msgid_plural "Contains %d notes"
|
||||
msgstr[0] "Преобразовать в заметку"
|
||||
msgstr[1] "Преобразовать в заметку"
|
||||
msgstr[2] "Преобразовать в заметку"
|
||||
msgstr[0] "Содержит %d заметку"
|
||||
msgstr[1] "Содержит %d заметки"
|
||||
msgstr[2] "Содержит %d заметок"
|
||||
|
||||
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/SearchPlugins.tsx:106
|
||||
msgid "Content provided by %s"
|
||||
@@ -1176,9 +1172,8 @@ msgid "Continue"
|
||||
msgstr "Продолжить"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:6
|
||||
#, fuzzy
|
||||
msgid "Control character"
|
||||
msgstr "Символы"
|
||||
msgstr "Управляющий символ"
|
||||
|
||||
#: packages/app-mobile/components/screens/Note/Note.tsx:1221
|
||||
msgid "Convert to note"
|
||||
@@ -1415,14 +1410,12 @@ msgid "Ctrl-click to open: %s"
|
||||
msgstr "Нажмите Ctrl для открытия: %s"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:24
|
||||
#, fuzzy
|
||||
msgid "current match"
|
||||
msgstr "Следующее совпадение"
|
||||
msgstr "текущее совпадение"
|
||||
|
||||
#: packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx:153
|
||||
#, fuzzy
|
||||
msgid "Current password"
|
||||
msgstr "Введите пароль"
|
||||
msgstr "Текущий пароль"
|
||||
|
||||
#: packages/app-desktop/checkForUpdates.ts:90
|
||||
msgid "Current version is up-to-date."
|
||||
@@ -1544,6 +1537,8 @@ msgid ""
|
||||
"Delete model and re-download?\n"
|
||||
"This cannot be undone."
|
||||
msgstr ""
|
||||
"Удалить модель и перезагрузить?\n"
|
||||
"Это невозможно отменить."
|
||||
|
||||
#: packages/lib/commands/deleteNote.ts:7
|
||||
msgid "Delete note"
|
||||
@@ -1624,14 +1619,12 @@ msgid "Deletes the notes without asking for confirmation."
|
||||
msgstr "Удаляет заметки без запроса подтверждения."
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/ConfigScreen.tsx:551
|
||||
#, fuzzy
|
||||
msgid "Deletion log"
|
||||
msgstr "Удалить строку"
|
||||
msgstr "Журнал удаления"
|
||||
|
||||
#: packages/app-mobile/components/NoteItem.tsx:144
|
||||
#, fuzzy
|
||||
msgid "Deselect"
|
||||
msgstr "Выбрать"
|
||||
msgstr "Отменить выбор"
|
||||
|
||||
#: packages/app-cli/app/command-export.ts:24
|
||||
msgid "Destination format: %s"
|
||||
@@ -1643,9 +1636,8 @@ msgid "Detailed"
|
||||
msgstr "Подробный"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/plugins/PluginBox/PluginChips.tsx:99
|
||||
#, fuzzy
|
||||
msgid "Dev"
|
||||
msgstr "Due"
|
||||
msgstr "Разр"
|
||||
|
||||
#: packages/lib/services/interop/Module.ts:62
|
||||
msgid "Directory"
|
||||
@@ -1682,9 +1674,8 @@ msgid "Disabled"
|
||||
msgstr "Отключено"
|
||||
|
||||
#: packages/app-mobile/components/screens/encryption-config.tsx:323
|
||||
#, fuzzy
|
||||
msgid "Disabled keys"
|
||||
msgstr "Скрыть отключенные ключи"
|
||||
msgstr "Отключенные клавиши"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:200
|
||||
#: packages/app-mobile/components/screens/encryption-config.tsx:251
|
||||
@@ -1795,9 +1786,8 @@ msgid "Download and install the relevant extension for your browser:"
|
||||
msgstr "Скачайте и установите расширение для вашего браузера:"
|
||||
|
||||
#: packages/app-mobile/components/voiceTyping/VoiceTypingDialog.tsx:206
|
||||
#, fuzzy
|
||||
msgid "Download updated model"
|
||||
msgstr "Загружено"
|
||||
msgstr "Скачать обновленную модель"
|
||||
|
||||
#: packages/lib/models/Resource.ts:409
|
||||
msgid "Downloaded"
|
||||
@@ -1894,12 +1884,11 @@ msgstr "Редактировать во внешнем редакторе"
|
||||
|
||||
#: packages/app-desktop/commands/openNoteInNewWindow.ts:10
|
||||
msgid "Edit in new window"
|
||||
msgstr ""
|
||||
msgstr "Редактировать в новом окне"
|
||||
|
||||
#: packages/app-desktop/gui/utils/NoteListUtils.ts:70
|
||||
#, fuzzy
|
||||
msgid "Edit in..."
|
||||
msgstr "Редактирование ссылки"
|
||||
msgstr "Редактировать в..."
|
||||
|
||||
#: packages/app-mobile/components/NoteEditor/EditLinkDialog.tsx:143
|
||||
msgid "Edit link"
|
||||
@@ -1930,9 +1919,8 @@ msgid "Editor"
|
||||
msgstr "Редактор"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/Toolbar.tsx:38
|
||||
#, fuzzy
|
||||
msgid "Editor actions"
|
||||
msgstr "Шрифт редактора"
|
||||
msgstr "Действия редактора"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:1074
|
||||
msgid "Editor font"
|
||||
@@ -2048,7 +2036,7 @@ msgstr "Включить шифрование"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:994
|
||||
msgid "Enable file:// URLs for images and videos"
|
||||
msgstr ""
|
||||
msgstr "Включить URL-адреса file:// для изображений и видео"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:975
|
||||
msgid "Enable footnotes"
|
||||
@@ -2104,9 +2092,8 @@ msgid "Enable soft breaks"
|
||||
msgstr "Включить мягкие отступы"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:1303
|
||||
#, fuzzy
|
||||
msgid "Enable spell checking in Markdown editor"
|
||||
msgstr "Включить проверку орфографии в текстовом редакторе"
|
||||
msgstr "Включить проверку орфографии в редакторе Markdown"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:789
|
||||
msgid "Enable spellcheck in the text editor"
|
||||
@@ -2145,6 +2132,8 @@ msgid ""
|
||||
"Enables Markdown list continuation, auto-closing HTML tags, and other markup "
|
||||
"autocompletions."
|
||||
msgstr ""
|
||||
"Включает продолжение списка Markdown, автозакрытие HTML-тегов и другие "
|
||||
"автодополнения разметки."
|
||||
|
||||
#: packages/lib/components/EncryptionConfigScreen/utils.ts:50
|
||||
msgid ""
|
||||
@@ -2191,9 +2180,8 @@ msgid "End-to-end encryption"
|
||||
msgstr "Сквозное шифрование"
|
||||
|
||||
#: packages/app-mobile/components/voiceTyping/VoiceTypingDialog.tsx:244
|
||||
#, fuzzy
|
||||
msgid "Ends voice typing"
|
||||
msgstr "Голосовой набор"
|
||||
msgstr "Завершение голосового набора"
|
||||
|
||||
#: packages/app-mobile/components/screens/dropbox-login.tsx:70
|
||||
msgid "Enter code here"
|
||||
@@ -2213,9 +2201,8 @@ msgid "Enter password"
|
||||
msgstr "Введите пароль"
|
||||
|
||||
#: packages/app-mobile/components/NoteItem.tsx:120
|
||||
#, fuzzy
|
||||
msgid "Entering selection mode"
|
||||
msgstr "Открытие раздела %s"
|
||||
msgstr "Вход в режим выбора"
|
||||
|
||||
#: packages/app-cli/app/help-utils.js:56
|
||||
msgid "Enum"
|
||||
@@ -2282,7 +2269,7 @@ msgstr "Расширить %s"
|
||||
|
||||
#: packages/app-desktop/gui/Sidebar/listItemComponents/ExpandIcon.tsx:26
|
||||
msgid "Expanded, press space to collapse."
|
||||
msgstr ""
|
||||
msgstr "Развернуто, нажмите пробел чтобы свернуть."
|
||||
|
||||
#: packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.tsx:182
|
||||
#: packages/app-desktop/gui/Sidebar/hooks/useOnRenderItem.tsx:213
|
||||
@@ -2308,9 +2295,8 @@ msgid "Export Debug Report"
|
||||
msgstr "Экспортировать отладочный отчет"
|
||||
|
||||
#: packages/app-desktop/commands/exportDeletionLog.ts:11
|
||||
#, fuzzy
|
||||
msgid "Export deletion log"
|
||||
msgstr "Экспортировать все"
|
||||
msgstr "Экспорт журнала удаления"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/ExportProfileButton.tsx:16
|
||||
msgid "Export profile"
|
||||
@@ -2396,9 +2382,8 @@ msgid "Filter tags"
|
||||
msgstr "Фильтр тегов"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:14
|
||||
#, fuzzy
|
||||
msgid "Find"
|
||||
msgstr "Найти: "
|
||||
msgstr "Поиск"
|
||||
|
||||
#: packages/app-mobile/components/NoteEditor/SearchPanel.tsx:253
|
||||
msgid "Find: "
|
||||
@@ -2436,7 +2421,7 @@ msgstr "Фокус на названии"
|
||||
|
||||
#: packages/app-mobile/components/CameraView/ScannedBarcodes.tsx:97
|
||||
msgid "Follow link"
|
||||
msgstr ""
|
||||
msgstr "Перейти по ссылке"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/ExportProfileButton.tsx:38
|
||||
msgid "For debugging purpose only: export your profile to an external SD card."
|
||||
@@ -2532,11 +2517,11 @@ msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:13
|
||||
msgid "go"
|
||||
msgstr ""
|
||||
msgstr "перейти"
|
||||
|
||||
#: packages/app-mobile/components/CameraView/CameraView.tsx:165
|
||||
msgid "Go back"
|
||||
msgstr ""
|
||||
msgstr "Вернуться"
|
||||
|
||||
#: packages/app-desktop/gui/JoplinCloudConfigScreen.tsx:44
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/JoplinCloudConfig.tsx:59
|
||||
@@ -2545,7 +2530,7 @@ msgstr "Перейти в профиль Joplin Cloud"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:12
|
||||
msgid "Go to line"
|
||||
msgstr ""
|
||||
msgstr "Перейти к строке"
|
||||
|
||||
#: packages/app-mobile/components/screens/Note/Note.tsx:1051
|
||||
msgid "Go to source URL"
|
||||
@@ -2612,9 +2597,8 @@ msgid "Hide keyboard"
|
||||
msgstr "Скрыть клавиатуру"
|
||||
|
||||
#: packages/app-desktop/gui/PasswordInput/PasswordInput.tsx:21
|
||||
#, fuzzy
|
||||
msgid "Hide password"
|
||||
msgstr "Неверный пароль"
|
||||
msgstr "Скрыть пароль"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/utils/setupToolbarButtons.ts:14
|
||||
msgid "Highlight"
|
||||
@@ -2833,14 +2817,12 @@ msgid "Incompatible"
|
||||
msgstr "Несовместимые"
|
||||
|
||||
#: packages/app-desktop/gui/NoteList/utils/useOnKeyDown.ts:153
|
||||
#, fuzzy
|
||||
msgid "Incomplete"
|
||||
msgstr "Завершено"
|
||||
msgstr "Незавершенный"
|
||||
|
||||
#: packages/app-desktop/gui/NoteListItem/utils/prepareViewProps.ts:40
|
||||
#, fuzzy
|
||||
msgid "Incomplete to-do"
|
||||
msgstr "Показать завершенные задачи"
|
||||
msgstr "Незавершенные задачи"
|
||||
|
||||
#: packages/app-mobile/components/NoteEditor/commandDeclarations.ts:97
|
||||
msgid "Increase indent level"
|
||||
@@ -2856,7 +2838,7 @@ msgstr "Увеличить отступ"
|
||||
|
||||
#: packages/app-mobile/components/DialogManager/hooks/useDialogControl.ts:21
|
||||
msgid "Info"
|
||||
msgstr ""
|
||||
msgstr "Информация"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/ConfigScreen.tsx:223
|
||||
msgid "Information"
|
||||
@@ -2958,9 +2940,8 @@ msgid "Items that cannot be synchronised"
|
||||
msgstr "Элементы, которые не могут быть синхронизированы"
|
||||
|
||||
#: packages/app-desktop/gui/MenuBar.tsx:923
|
||||
#, fuzzy
|
||||
msgid "Join us on %s"
|
||||
msgstr "Присоединяйтесь к нам в Twitter"
|
||||
msgstr "Присоединяйтесь к нам в %s"
|
||||
|
||||
#: packages/app-desktop/gui/SyncWizard/Dialog.tsx:267
|
||||
msgid ""
|
||||
@@ -3016,9 +2997,8 @@ msgid "Joplin Forum"
|
||||
msgstr "Форум Joplin"
|
||||
|
||||
#: packages/app-mobile/utils/lockToSingleInstance.ts:16
|
||||
#, fuzzy
|
||||
msgid "Joplin is already running."
|
||||
msgstr "Сервер уже запущен. Порт: %d"
|
||||
msgstr "Сервер уже запущен."
|
||||
|
||||
#: packages/lib/services/plugins/PluginService.ts:523
|
||||
msgid "Joplin Mobile"
|
||||
@@ -3272,9 +3252,8 @@ msgid "Manage shared notebooks"
|
||||
msgstr "Управление общими блокнотами"
|
||||
|
||||
#: packages/app-mobile/components/EditorToolbar/ToolbarEditorDialog.tsx:165
|
||||
#, fuzzy
|
||||
msgid "Manage toolbar options"
|
||||
msgstr "Управлять плагинами"
|
||||
msgstr "Управление параметрами панели инструментов"
|
||||
|
||||
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginsStates.tsx:331
|
||||
msgid "Manage your plugins"
|
||||
@@ -3307,9 +3286,8 @@ msgstr "Markdown + Front Matter"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/CodeMirror.tsx:375
|
||||
#: packages/app-mobile/components/NoteEditor/NoteEditor.tsx:352
|
||||
#, fuzzy
|
||||
msgid "Markdown editor"
|
||||
msgstr "Markdown"
|
||||
msgstr "Редактор Markdown"
|
||||
|
||||
#: packages/app-cli/app/command-done.ts:15
|
||||
msgid "Marks a to-do as done."
|
||||
@@ -3340,11 +3318,11 @@ msgstr "Главный пароль:"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:19
|
||||
msgid "match case"
|
||||
msgstr ""
|
||||
msgstr "подходящий вариант"
|
||||
|
||||
#: packages/app-mobile/components/NoteEditor/commandDeclarations.ts:72
|
||||
msgid "Math"
|
||||
msgstr ""
|
||||
msgstr "Математика"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:421
|
||||
msgid "Max concurrent connections"
|
||||
@@ -3371,9 +3349,8 @@ msgid "Minimise"
|
||||
msgstr "Минимизировать"
|
||||
|
||||
#: packages/app-mobile/components/CameraView/CameraView.tsx:163
|
||||
#, fuzzy
|
||||
msgid "Missing camera permission"
|
||||
msgstr "Недостающие мастер-ключи"
|
||||
msgstr "Отсутствует разрешение для камеры"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:320
|
||||
msgid "Missing keys"
|
||||
@@ -3463,14 +3440,12 @@ msgid "Never resize"
|
||||
msgstr "Никогда не изменять размер"
|
||||
|
||||
#: packages/app-mobile/setupQuickActions.ts:33
|
||||
#, fuzzy
|
||||
msgid "New attachment"
|
||||
msgstr "Вложения заметки"
|
||||
msgstr "Новое вложение"
|
||||
|
||||
#: packages/app-mobile/setupQuickActions.ts:34
|
||||
#, fuzzy
|
||||
msgid "New drawing"
|
||||
msgstr "Рисунок"
|
||||
msgstr "Новый рисунок"
|
||||
|
||||
#: packages/app-mobile/components/screens/ShareManager/index.tsx:120
|
||||
msgid "New invitations"
|
||||
@@ -3500,9 +3475,8 @@ msgstr ""
|
||||
"Будет создан новый блокнот \"%s\" и файл \"%s\" будет импортирован в него"
|
||||
|
||||
#: packages/app-mobile/setupQuickActions.ts:32
|
||||
#, fuzzy
|
||||
msgid "New photo"
|
||||
msgstr "Сделать фото"
|
||||
msgstr "Новое фото"
|
||||
|
||||
#: packages/app-desktop/gui/WindowCommandsAndDialogs/commands/newSubFolder.ts:6
|
||||
msgid "New sub-notebook"
|
||||
@@ -3526,7 +3500,7 @@ msgstr "Новая версия: %s"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:16
|
||||
msgid "next"
|
||||
msgstr ""
|
||||
msgstr "далее"
|
||||
|
||||
#: packages/app-mobile/components/NoteEditor/SearchPanel.tsx:271
|
||||
msgid "Next match"
|
||||
@@ -3610,14 +3584,12 @@ msgstr ""
|
||||
"path>`"
|
||||
|
||||
#: packages/app-desktop/gui/UpdateNotification/UpdateNotification.tsx:93
|
||||
#, fuzzy
|
||||
msgid "No updates available"
|
||||
msgstr "Доступно обновление"
|
||||
msgstr "Нет доступных обновлений"
|
||||
|
||||
#: packages/app-desktop/gui/WindowCommandsAndDialogs/commands/moveToFolder.ts:44
|
||||
#, fuzzy
|
||||
msgid "None"
|
||||
msgstr "(Нет)"
|
||||
msgstr "Нет"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:47
|
||||
msgid "Nord"
|
||||
@@ -3780,12 +3752,11 @@ msgstr "Нумерованный список"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:531
|
||||
msgid "OCR: Clear cache and re-download language data files"
|
||||
msgstr ""
|
||||
msgstr "OCR: очистите кэш и заново загрузите языковые файлы"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:512
|
||||
#, fuzzy
|
||||
msgid "OCR: Language data URL or path"
|
||||
msgstr "Язык, формат даты"
|
||||
msgstr "OCR: URL-адрес или путь к языковым данным"
|
||||
|
||||
#: packages/app-desktop/bridge.ts:360 packages/app-desktop/bridge.ts:373
|
||||
#: packages/app-desktop/bridge.ts:387 packages/app-desktop/bridge.ts:403
|
||||
@@ -3821,7 +3792,7 @@ msgstr "В %s: %s"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:27
|
||||
msgid "on line"
|
||||
msgstr ""
|
||||
msgstr "он-лайн"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen.tsx:525
|
||||
msgid "One of your master keys use an obsolete encryption method."
|
||||
@@ -3852,9 +3823,8 @@ msgid "OneDrive Login"
|
||||
msgstr "Вход в OneDrive"
|
||||
|
||||
#: packages/lib/services/interop/InteropService.ts:144
|
||||
#, fuzzy
|
||||
msgid "OneNote Notebook"
|
||||
msgstr "Новый блокнот"
|
||||
msgstr "Блокнот OneNote"
|
||||
|
||||
#: packages/app-desktop/gui/WindowCommandsAndDialogs/commands/print.ts:18
|
||||
msgid "Only one note can be printed at a time."
|
||||
@@ -3881,9 +3851,8 @@ msgid "Open profile directory"
|
||||
msgstr "Открыть директорию с настройками"
|
||||
|
||||
#: packages/app-mobile/components/CameraView/CameraView.tsx:164
|
||||
#, fuzzy
|
||||
msgid "Open settings"
|
||||
msgstr "Открытие раздела %s"
|
||||
msgstr "Открыть настройки"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/plugins/EnablePluginSupportPage.tsx:115
|
||||
msgid "Open Source"
|
||||
@@ -3902,19 +3871,16 @@ msgid "Opening section %s"
|
||||
msgstr "Открытие раздела %s"
|
||||
|
||||
#: packages/app-mobile/components/Dropdown.tsx:215
|
||||
#, fuzzy
|
||||
msgid "Opens dropdown"
|
||||
msgstr "Закрыть выпадающий список"
|
||||
msgstr "Открыть выпадающий список"
|
||||
|
||||
#: packages/app-mobile/components/NoteItem.tsx:162
|
||||
#, fuzzy
|
||||
msgid "Opens note"
|
||||
msgstr "Откройте"
|
||||
msgstr "Открыть заметку"
|
||||
|
||||
#: packages/app-mobile/components/side-menu-content.tsx:273
|
||||
#, fuzzy
|
||||
msgid "Opens notebook"
|
||||
msgstr "Новый блокнот"
|
||||
msgstr "Открыть блокнот"
|
||||
|
||||
#: packages/app-cli/app/command-e2ee.ts:41
|
||||
#: packages/app-cli/app/command-e2ee.ts:87
|
||||
@@ -4183,11 +4149,11 @@ msgstr "Предпочитаемая светлая тема"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:1704
|
||||
msgid "Preferred voice typing provider"
|
||||
msgstr ""
|
||||
msgstr "Предпочитаемый провайдер голосового ввода текста"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:667
|
||||
msgid "Preserve colours when pasting text in Rich Text Editor"
|
||||
msgstr ""
|
||||
msgstr "Сохранение цветов при вставке текста в редактор свободного текста"
|
||||
|
||||
#: packages/app-cli/app/app-gui.js:758
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
@@ -4210,9 +4176,8 @@ msgid "Press to set the decryption password."
|
||||
msgstr "Нажмите, чтобы установить пароль для расшифровки."
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:17
|
||||
#, fuzzy
|
||||
msgid "previous"
|
||||
msgstr "Предыдущее совпадение"
|
||||
msgstr "предыдущее"
|
||||
|
||||
#: packages/app-mobile/components/NoteEditor/SearchPanel.tsx:281
|
||||
msgid "Previous match"
|
||||
@@ -4255,9 +4220,8 @@ msgid "Processing"
|
||||
msgstr "Обработка"
|
||||
|
||||
#: packages/app-mobile/components/CameraView/ActionButtons.tsx:111
|
||||
#, fuzzy
|
||||
msgid "Processing photo..."
|
||||
msgstr "Обработка"
|
||||
msgstr "Обработка фото..."
|
||||
|
||||
#: packages/server/src/routes/admin/users.ts:254
|
||||
msgid "Profile"
|
||||
@@ -4313,9 +4277,8 @@ msgid "Publish notes to the internet"
|
||||
msgstr "Опубликовать заметки в Интернет"
|
||||
|
||||
#: packages/app-mobile/components/CameraView/ScannedBarcodes.tsx:78
|
||||
#, fuzzy
|
||||
msgid "QR Code"
|
||||
msgstr "Код"
|
||||
msgstr "QR код"
|
||||
|
||||
#: packages/app-desktop/app.ts:219
|
||||
#: packages/app-desktop/ElectronAppWrapper.ts:123
|
||||
@@ -4326,7 +4289,7 @@ msgstr "Выход"
|
||||
|
||||
#: packages/app-mobile/components/voiceTyping/VoiceTypingDialog.tsx:206
|
||||
msgid "Re-download model"
|
||||
msgstr ""
|
||||
msgstr "Скачать модель заново"
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:342
|
||||
msgid "Re-encrypt data"
|
||||
@@ -4337,9 +4300,8 @@ msgid "Re-encryption"
|
||||
msgstr "Зашифровать заново"
|
||||
|
||||
#: packages/app-desktop/gui/MasterPasswordDialog/Dialog.tsx:181
|
||||
#, fuzzy
|
||||
msgid "Re-enter password"
|
||||
msgstr "Введите пароль"
|
||||
msgstr "Введите пароль повторно"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:1180
|
||||
msgid "Re-upload local data to sync target"
|
||||
@@ -4405,9 +4367,8 @@ msgid "Remove"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.tsx:330
|
||||
#, fuzzy
|
||||
msgid "Remove %s from share"
|
||||
msgstr "Удалить метку “%s” из всех заметок?"
|
||||
msgstr "Удалить %s из общего ресурса"
|
||||
|
||||
#: packages/app-desktop/gui/Sidebar/hooks/useOnRenderItem.tsx:111
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
@@ -4439,9 +4400,8 @@ msgid "Renew token"
|
||||
msgstr "Обновить токен"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:21
|
||||
#, fuzzy
|
||||
msgid "replace"
|
||||
msgstr "Замена"
|
||||
msgstr "заменить"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:15
|
||||
#: packages/app-mobile/components/NoteEditor/SearchPanel.tsx:291
|
||||
@@ -4449,9 +4409,8 @@ msgid "Replace"
|
||||
msgstr "Замена"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:22
|
||||
#, fuzzy
|
||||
msgid "replace all"
|
||||
msgstr "Заменить все"
|
||||
msgstr "заменить все"
|
||||
|
||||
#: packages/app-mobile/components/NoteEditor/SearchPanel.tsx:301
|
||||
msgid "Replace all"
|
||||
@@ -4467,11 +4426,11 @@ msgstr "Замена: "
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:25
|
||||
msgid "replaced $ matches"
|
||||
msgstr ""
|
||||
msgstr "заменено $ совпадений"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:26
|
||||
msgid "replaced match on line $"
|
||||
msgstr ""
|
||||
msgstr "заменено совпадение в строке $"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/plugins/PluginInfoModal.tsx:162
|
||||
msgid "Report an issue"
|
||||
@@ -4534,9 +4493,8 @@ msgid "Restore"
|
||||
msgstr "Восстановить"
|
||||
|
||||
#: packages/app-mobile/components/EditorToolbar/ToolbarEditorDialog.tsx:156
|
||||
#, fuzzy
|
||||
msgid "Restore defaults"
|
||||
msgstr "Восстановить объекты"
|
||||
msgstr "Восстановить настройки по умолчанию"
|
||||
|
||||
#: packages/app-desktop/gui/WindowCommandsAndDialogs/commands/restoreNote.ts:10
|
||||
msgid "Restore note"
|
||||
@@ -4594,11 +4552,12 @@ msgstr "Изменения: %s (%s)"
|
||||
|
||||
#: packages/app-desktop/gui/ToggleEditorsButton/ToggleEditorsButton.tsx:28
|
||||
msgid "Rich Text"
|
||||
msgstr ""
|
||||
msgstr "Свободный текст"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.tsx:686
|
||||
msgid "Rich Text editor. Press Escape then Tab to escape focus."
|
||||
msgstr ""
|
||||
"Редактор свободного текста. Нажмите Escape, затем Tab, чтобы выйти из фокуса."
|
||||
|
||||
#: packages/app-cli/app/command-batch.js:10
|
||||
msgid ""
|
||||
@@ -4679,7 +4638,7 @@ msgstr "Сохранять информацию о географическом
|
||||
|
||||
#: packages/app-mobile/components/CameraView/ScannedBarcodes.tsx:89
|
||||
msgid "Scanned code"
|
||||
msgstr ""
|
||||
msgstr "Сканировать код"
|
||||
|
||||
#: packages/app-desktop/gui/lib/SearchInput/SearchInput.tsx:62
|
||||
#: packages/app-mobile/components/NoteEditor/commandDeclarations.ts:102
|
||||
@@ -4712,9 +4671,8 @@ msgid "Search in current note"
|
||||
msgstr "Поиск в текущей заметке"
|
||||
|
||||
#: packages/app-desktop/plugins/GotoAnything.tsx:665
|
||||
#, fuzzy
|
||||
msgid "Search results"
|
||||
msgstr "Нет данных"
|
||||
msgstr "Результаты поиска"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/ConfigScreen.tsx:170
|
||||
msgid "Search shown"
|
||||
@@ -4737,9 +4695,8 @@ msgid "Searches for the given <pattern> in all the notes."
|
||||
msgstr "Осуществляет поиск по шаблону <pattern> во всех заметках."
|
||||
|
||||
#: packages/app-desktop/gui/UpdateNotification/UpdateNotification.tsx:63
|
||||
#, fuzzy
|
||||
msgid "See changelog"
|
||||
msgstr "Полный список изменений"
|
||||
msgstr "Посмотреть список изменений"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:1199
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
@@ -4770,14 +4727,12 @@ msgid "Select parent notebook"
|
||||
msgstr "Выбрать родительский блокнот"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/v6/utils/localisation.ts:9
|
||||
#, fuzzy
|
||||
msgid "Selection deleted"
|
||||
msgstr "дата завершения"
|
||||
msgstr "Выбранное удалено"
|
||||
|
||||
#: packages/app-mobile/components/FolderPicker.tsx:68
|
||||
#, fuzzy
|
||||
msgid "Selects a notebook"
|
||||
msgstr "Выбрать родительский блокнот"
|
||||
msgstr "Выбор блокнота"
|
||||
|
||||
#: packages/app-desktop/gui/MenuBar.tsx:359
|
||||
msgid "Send bug report"
|
||||
@@ -4833,7 +4788,7 @@ msgstr ""
|
||||
|
||||
#: packages/app-mobile/components/EditorToolbar/EditorToolbar.tsx:47
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
msgstr "Настройки"
|
||||
|
||||
#: packages/app-desktop/gui/ShareFolderDialog/ShareFolderDialog.tsx:281
|
||||
#: packages/app-mobile/components/NoteBodyViewer/hooks/useOnResourceLongPress.ts:44
|
||||
@@ -4872,7 +4827,6 @@ msgid "Share permissions"
|
||||
msgstr "Разрешения для общего доступа"
|
||||
|
||||
#: packages/app-desktop/gui/Sidebar/listItemComponents/FolderItem.tsx:56
|
||||
#, fuzzy
|
||||
msgid "Shared"
|
||||
msgstr "Поделиться"
|
||||
|
||||
@@ -4921,14 +4875,12 @@ msgid "Show note counts"
|
||||
msgstr "Показывать число заметок"
|
||||
|
||||
#: packages/app-mobile/components/side-menu-content.tsx:258
|
||||
#, fuzzy
|
||||
msgid "Show notebook options"
|
||||
msgstr "Показывать число заметок"
|
||||
msgstr "Показать параметры блокнота"
|
||||
|
||||
#: packages/app-desktop/gui/PasswordInput/PasswordInput.tsx:21
|
||||
#, fuzzy
|
||||
msgid "Show password"
|
||||
msgstr "Установить пароль"
|
||||
msgstr "Показать пароль"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:698
|
||||
msgid "Show sort order buttons"
|
||||
@@ -4943,9 +4895,8 @@ msgid "Show/hide the sidebar"
|
||||
msgstr "Показать/скрыть боковую панель"
|
||||
|
||||
#: packages/app-mobile/components/screens/tags.tsx:76
|
||||
#, fuzzy
|
||||
msgid "Shows notes for tag"
|
||||
msgstr "Показывать число заметок"
|
||||
msgstr "Показать заметки для тега"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:863
|
||||
msgid "Shrink large images before adding them to notes."
|
||||
@@ -5031,11 +4982,11 @@ msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/ResourceScreen.tsx:92
|
||||
msgid "Sort \"%s\" in ascending order"
|
||||
msgstr ""
|
||||
msgstr "Сортировка \"%s\" в порядке возрастания"
|
||||
|
||||
#: packages/app-desktop/gui/ResourceScreen.tsx:92
|
||||
msgid "Sort \"%s\" in descending order"
|
||||
msgstr ""
|
||||
msgstr "Сортировка \"%s\" в порядке убывания"
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:754
|
||||
msgid "Sort notebooks by"
|
||||
@@ -5219,12 +5170,11 @@ msgstr "Переключение профиля"
|
||||
|
||||
#: packages/app-mobile/components/CameraView/ActionButtons.tsx:101
|
||||
msgid "Switch to back-facing camera"
|
||||
msgstr ""
|
||||
msgstr "Переключение на основную камеру"
|
||||
|
||||
#: packages/app-mobile/components/CameraView/ActionButtons.tsx:101
|
||||
#, fuzzy
|
||||
msgid "Switch to front-facing camera"
|
||||
msgstr "Переключение на профиль %d"
|
||||
msgstr "Переключение на фронтальную камеру"
|
||||
|
||||
#: packages/app-desktop/gui/utils/NoteListUtils.ts:93
|
||||
msgid "Switch to note type"
|
||||
@@ -5237,14 +5187,12 @@ msgid "Switch to profile %d"
|
||||
msgstr "Переключение на профиль %d"
|
||||
|
||||
#: packages/app-desktop/gui/ToggleEditorsButton/ToggleEditorsButton.tsx:28
|
||||
#, fuzzy
|
||||
msgid "Switch to the %s Editor"
|
||||
msgstr "Конвертировать в заметку"
|
||||
msgstr "Переключение на редактор %s"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx:78
|
||||
#, fuzzy
|
||||
msgid "Switch to the legacy editor"
|
||||
msgstr "Конвертировать в заметку"
|
||||
msgstr "Переключение на старый редактор"
|
||||
|
||||
#: packages/app-desktop/gui/utils/NoteListUtils.ts:102
|
||||
msgid "Switch to to-do type"
|
||||
@@ -5355,7 +5303,7 @@ msgstr "тег1, тег2, ..."
|
||||
#: packages/app-cli/app/command-import.ts:55
|
||||
#: packages/app-desktop/gui/ImportScreen.tsx:94
|
||||
msgid "Tagged: %d."
|
||||
msgstr "С метками: %d."
|
||||
msgstr "Тегировано: %d."
|
||||
|
||||
#: packages/app-desktop/gui/NoteListHeader/utils/getColumnTitle.ts:10
|
||||
#: packages/app-desktop/gui/Sidebar/hooks/useSidebarListData.ts:69
|
||||
@@ -5527,7 +5475,7 @@ msgstr ""
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/WarningBanner/WarningBanner.tsx:83
|
||||
msgid "The following plugins may not support the current markdown editor:"
|
||||
msgstr ""
|
||||
msgstr "Следующие плагины могут не поддерживать текущий редактор markdown:"
|
||||
|
||||
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginBox.tsx:257
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/plugins/PluginBox/RecommendedBadge.tsx:49
|
||||
@@ -5655,6 +5603,11 @@ msgid ""
|
||||
"\n"
|
||||
"Error: \"%s\""
|
||||
msgstr ""
|
||||
"Веб-клиент не поддерживает прием зашифрованных общих блокнотов. Пожалуйста, "
|
||||
"переключитесь на ПК или мобильное приложение, прежде чем принимать общий "
|
||||
"доступ.\n"
|
||||
"\n"
|
||||
"Ошибка: \"%s\""
|
||||
|
||||
#: packages/app-desktop/gui/Root.tsx:150
|
||||
msgid "The Web Clipper needs your authorisation to access your data."
|
||||
@@ -6013,9 +5966,8 @@ msgid "Toggle editor layout"
|
||||
msgstr "Переключить вид редактора"
|
||||
|
||||
#: packages/app-desktop/gui/WindowCommandsAndDialogs/commands/toggleEditorPlugin.ts:11
|
||||
#, fuzzy
|
||||
msgid "Toggle editor plugin"
|
||||
msgstr "Переключить вид редактора"
|
||||
msgstr "Переключить плагин редактора"
|
||||
|
||||
#: packages/app-desktop/gui/WindowCommandsAndDialogs/commands/toggleEditors.ts:8
|
||||
msgid "Toggle editors"
|
||||
@@ -6162,9 +6114,8 @@ msgstr ""
|
||||
"версии"
|
||||
|
||||
#: packages/app-mobile/utils/getVersionInfoText.ts:28
|
||||
#, fuzzy
|
||||
msgid "Unknown platform"
|
||||
msgstr "Неизвестный флаг: %s"
|
||||
msgstr "Неизвестная платформа"
|
||||
|
||||
#: packages/app-mobile/components/NoteEditor/commandDeclarations.ts:82
|
||||
msgid "Unordered list"
|
||||
@@ -6196,11 +6147,12 @@ msgid "Unsupported link or message: %s"
|
||||
msgstr "Неподдерживаемая ссылка или сообщение: %s"
|
||||
|
||||
#: packages/app-mobile/commands/openItem.ts:60
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Unsupported link or message: %s.\n"
|
||||
"Error: %s"
|
||||
msgstr "Неподдерживаемая ссылка или сообщение: %s"
|
||||
msgstr ""
|
||||
"Неподдерживаемая ссылка или сообщение: %s\n"
|
||||
"Ошибка: %s"
|
||||
|
||||
#: packages/app-desktop/gui/ResourceScreen.tsx:123
|
||||
#: packages/lib/models/BaseItem.ts:921 packages/lib/path-utils.ts:27
|
||||
@@ -6218,9 +6170,8 @@ msgid "Update available"
|
||||
msgstr "Доступно обновление"
|
||||
|
||||
#: packages/app-desktop/gui/UpdateNotification/UpdateNotification.tsx:65
|
||||
#, fuzzy
|
||||
msgid "Update later"
|
||||
msgstr "дата обновления"
|
||||
msgstr "Обновить позже"
|
||||
|
||||
#: packages/server/src/routes/admin/users.ts:257
|
||||
#: packages/server/src/routes/index/users.ts:91
|
||||
@@ -6320,9 +6271,8 @@ msgstr ""
|
||||
"выхода."
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:1347
|
||||
#, fuzzy
|
||||
msgid "Use the legacy Markdown editor"
|
||||
msgstr "Включить панель инструментов Markdown"
|
||||
msgstr "Использовать старый редактор Markdown"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen/ConfigScreen.tsx:552
|
||||
msgid ""
|
||||
@@ -6418,7 +6368,7 @@ msgstr "Голосовой набор..."
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:1712
|
||||
msgid "Vosk"
|
||||
msgstr ""
|
||||
msgstr "Vosk"
|
||||
|
||||
#: packages/lib/services/joplinCloudUtils.ts:27
|
||||
msgid "Waiting for authorisation..."
|
||||
@@ -6523,7 +6473,7 @@ msgstr ""
|
||||
|
||||
#: packages/lib/models/settings/builtInMetadata.ts:1713
|
||||
msgid "Whisper"
|
||||
msgstr ""
|
||||
msgstr "Шепот"
|
||||
|
||||
#: packages/app-desktop/ElectronAppWrapper.ts:222
|
||||
msgid "Window unresponsive."
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -134,6 +134,7 @@
|
||||
"v3.3.2": true,
|
||||
"android-v3.3.1": true,
|
||||
"ios-v13.3.1": true,
|
||||
"v3.2.13": true
|
||||
"v3.2.13": true,
|
||||
"android-v3.3.2": true
|
||||
}
|
||||
}
|
||||
@@ -36,7 +36,7 @@ const path = require('path');
|
||||
const md5File = require('md5-file');
|
||||
const docDir = `${dirname(dirname(dirname(dirname(__dirname))))}/joplin-website/docs`;
|
||||
|
||||
if (!pathExistsSync(docDir)) throw new Error(`"docs" directory does not exist: ${docDir}`);
|
||||
if (!pathExistsSync(docDir)) throw new Error(`"docs" directory does not exist - create it first. At: ${docDir}`);
|
||||
|
||||
const websiteAssetDir = `${rootDir}/Assets/WebsiteAssets`;
|
||||
const readmeDir = `${rootDir}/readme`;
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# Joplin Android Changelog
|
||||
|
||||
## [android-v3.3.2](https://github.com/laurent22/joplin/releases/tag/android-v3.3.2) (Pre-release) - 2025-03-03T22:35:08Z
|
||||
|
||||
- Improved: Improve encryption config screen accessibility (#11874) (#11846 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
|
||||
- Improved: Switch default library used for Whisper voice typing (#11881 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
|
||||
- Improved: Updated packages @bam.tech/react-native-image-resizer (v3.0.11)
|
||||
- Fixed: Accessibility: Fix "new note" and "new to-do" buttons are focusable even while invisible (#11899 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
|
||||
- Fixed: Fix disabled encryption keys list showing enabled keys (#11861) (#11858 by [@pedr](https://github.com/pedr))
|
||||
- Fixed: Fix voice recorder crash (#11876) (#11864 by [@personalizedrefrigerator](https://github.com/personalizedrefrigerator))
|
||||
|
||||
## [android-v3.3.1](https://github.com/laurent22/joplin/releases/tag/android-v3.3.1) (Pre-release) - 2025-02-19T16:01:54Z
|
||||
|
||||
- New: Add support for plugin editor views (#11831)
|
||||
|
||||
@@ -25,3 +25,17 @@ To remove a member from your team click on the Profile icon (👤) for that user
|
||||
|
||||
The team admin account is only for managing users and billing. To collaborate with the other members of your team, add yourself as a member using a different email address.
|
||||
|
||||
## Migrating to a Team account
|
||||
|
||||
If you already have a Basic or Pro account, it is not currently possible to migrate your data to a Team account, as they work very differently.
|
||||
|
||||
You can however follow these steps to manually migrate your data to a Team account:
|
||||
|
||||
- Open the Joplin desktop app
|
||||
- Click Synchronise and wait for it to complete
|
||||
- Export all your notes as JEX (File => Export => JEX)
|
||||
- Create a new profile (File => Switch profile)
|
||||
- Import your JEX file
|
||||
- Cancel your current Joplin Cloud subscription
|
||||
- Open a new Joplin Cloud Team subscription
|
||||
- Synchronise your new profile with this new subscription
|
||||
Reference in New Issue
Block a user