From ac221b3b85978700c09bd58600d933502510d591 Mon Sep 17 00:00:00 2001 From: crschnick Date: Wed, 14 Aug 2024 12:29:14 +0000 Subject: [PATCH] Various fixes --- .../beacon/impl/SshLaunchExchangeImpl.java | 3 +- .../app/comp/store/StoreEntryWrapper.java | 3 +- .../ContextualFileReferenceChoiceComp.java | 10 +- .../xpipe/app/launcher/LauncherCommand.java | 103 ++++++++---------- .../java/io/xpipe/app/util/ScanAlert.java | 11 +- .../app/util/TerminalLauncherManager.java | 87 ++++++++------- .../java/io/xpipe/beacon/BeaconClient.java | 9 -- dist/changelogs/11.0.md | 6 +- .../ext/base/action/BrowseStoreAction.java | 14 --- .../ext/base/action/RunScriptActionMenu.java | 11 +- .../ext/base/action/ScanStoreAction.java | 6 +- .../ext/base/store/ShellStoreProvider.java | 3 +- lang/app/strings/translations_da.properties | 1 + lang/app/strings/translations_de.properties | 3 +- lang/app/strings/translations_en.properties | 3 +- lang/app/strings/translations_es.properties | 3 +- lang/app/strings/translations_fr.properties | 3 +- lang/app/strings/translations_it.properties | 3 +- lang/app/strings/translations_ja.properties | 3 +- lang/app/strings/translations_nl.properties | 3 +- lang/app/strings/translations_pt.properties | 3 +- lang/app/strings/translations_ru.properties | 3 +- lang/app/strings/translations_tr.properties | 3 +- lang/app/strings/translations_zh.properties | 3 +- 24 files changed, 148 insertions(+), 152 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java index 951a8367..6be23968 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java @@ -23,8 +23,7 @@ public class SshLaunchExchangeImpl extends SshLaunchExchange { TerminalInitScriptConfig.ofName(DataStorage.get().getStoreEntryDisplayName(found.get())),null); } } - TerminalLauncherManager.submitAsync(UUID.randomUUID(), ((ShellStore) DataStorage.get().local().getStore()).control(), - TerminalInitScriptConfig.ofName("abc"),null); + var r = TerminalLauncherManager.waitForNextLaunch(); var c = ProcessControlProvider.get().getEffectiveLocalDialect().getOpenScriptCommand(r.toString()).buildBaseParts(null); return Response.builder().command(c).build(); diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java index 294cac4f..90d0e58a 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java @@ -203,7 +203,8 @@ public class StoreEntryWrapper { var branch = p.getBranchDataStoreCallSite(); if (branch != null && entry.getStore() != null - && branch.getApplicableClass().isAssignableFrom(entry.getStore().getClass())) { + && branch.getApplicableClass().isAssignableFrom(entry.getStore().getClass()) + && branch.isApplicable(entry.ref())) { return branch.getChildren(entry.ref()).stream().anyMatch(child -> { return showActionProvider(child); }); diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/ContextualFileReferenceChoiceComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/ContextualFileReferenceChoiceComp.java index 50a5b0fd..ea0d4ec7 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/impl/ContextualFileReferenceChoiceComp.java +++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/ContextualFileReferenceChoiceComp.java @@ -3,7 +3,6 @@ package io.xpipe.app.fxcomps.impl; import atlantafx.base.theme.Styles; import io.xpipe.app.browser.session.BrowserChooserComp; import io.xpipe.app.comp.base.ButtonComp; -import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.AppLayoutModel; import io.xpipe.app.core.window.AppWindowHelper; import io.xpipe.app.fxcomps.Comp; @@ -19,7 +18,6 @@ import io.xpipe.core.store.FileSystemStore; import javafx.application.Platform; import javafx.beans.property.Property; import javafx.beans.property.SimpleObjectProperty; -import javafx.scene.control.Alert; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import org.kordamp.ikonli.javafx.FontIcon; @@ -94,13 +92,7 @@ public class ContextualFileReferenceChoiceComp extends Comp> var f = data.resolve(FileNames.getFileName(currentPath.trim())); var source = Path.of(currentPath.trim()); if (Files.exists(source)) { - var shouldCopy = AppWindowHelper.showBlockingAlert(alert -> { - alert.setTitle(AppI18n.get("confirmGitShareTitle")); - alert.setHeaderText(AppI18n.get("confirmGitShareHeader")); - alert.setAlertType(Alert.AlertType.CONFIRMATION); - }) - .map(buttonType -> buttonType.getButtonData().isDefaultButton()) - .orElse(false); + var shouldCopy = AppWindowHelper.showConfirmationAlert("confirmGitShareTitle","confirmGitShareHeader", "confirmGitShareContent"); if (!shouldCopy) { return; } diff --git a/app/src/main/java/io/xpipe/app/launcher/LauncherCommand.java b/app/src/main/java/io/xpipe/app/launcher/LauncherCommand.java index 3c4d9f8f..2f9743a4 100644 --- a/app/src/main/java/io/xpipe/app/launcher/LauncherCommand.java +++ b/app/src/main/java/io/xpipe/app/launcher/LauncherCommand.java @@ -12,6 +12,7 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.ThreadHelper; import io.xpipe.beacon.BeaconClient; import io.xpipe.beacon.BeaconClientInformation; +import io.xpipe.beacon.BeaconServer; import io.xpipe.beacon.api.DaemonFocusExchange; import io.xpipe.beacon.api.DaemonOpenExchange; import io.xpipe.core.process.OsType; @@ -82,65 +83,57 @@ public class LauncherCommand implements Callable { private void checkStart() { var port = AppBeaconServer.get().getPort(); + var reachable = BeaconServer.isReachable(port); + if (!reachable) { + // Even in case we are unable to reach another beacon server + // there might be another instance running, for example + // starting up or listening on another port + if (!AppDataLock.lock()) { + TrackEvent.info("Data directory " + AppProperties.get().getDataDir().toString() + + " is already locked. Is another instance running?"); + OperationMode.halt(1); + } + + // We are good to start up! + return; + } + var client = BeaconClient.tryEstablishConnection( port, BeaconClientInformation.Daemon.builder().build()); - if (client.isPresent()) { - try { - client.get() - .performRequest(DaemonFocusExchange.Request.builder() - .mode(getEffectiveMode()) - .build()); - if (!inputs.isEmpty()) { - client.get() - .performRequest(DaemonOpenExchange.Request.builder() - .arguments(inputs) - .build()); + if (client.isEmpty()) { + // If an instance is running as another user, we cannot connect to it as the xpipe_auth file is inaccessible + // Therefore the beacon client is not present. + // We still should check whether it is somehow occupied, otherwise beacon server startup will fail + TrackEvent.info("Another instance is already running on this port as another user or is not reachable. Quitting ..."); + OperationMode.halt(1); + return; + } + + try { + client.get().performRequest(DaemonFocusExchange.Request.builder().mode(getEffectiveMode()).build()); + if (!inputs.isEmpty()) { + client.get().performRequest(DaemonOpenExchange.Request.builder().arguments(inputs).build()); + } + } catch (Exception ex) { + var cli = XPipeInstallation.getLocalDefaultCliExecutable(); + ErrorEvent.fromThrowable("Unable to connect to existing running daemon instance as it did not respond." + + " Either try to kill the process xpiped manually or use the command \"" + + cli + + "\" daemon stop --force.", ex).term().expected().handle(); + } + + if (OsType.getLocal().equals(OsType.MACOS)) { + Desktop.getDesktop().setOpenURIHandler(e -> { + try { + client.get().performRequest(DaemonOpenExchange.Request.builder().arguments(List.of(e.getURI().toString())).build()); + } catch (Exception ex) { + ErrorEvent.fromThrowable(ex).expected().omit().handle(); } - } catch (Exception ex) { - var cli = XPipeInstallation.getLocalDefaultCliExecutable(); - ErrorEvent.fromThrowable( - "Unable to connect to existing running daemon instance as it did not respond." - + " Either try to kill the process xpiped manually or use the command \"" + cli - + "\" daemon stop --force.", - ex) - .term() - .expected() - .handle(); - } - - if (OsType.getLocal().equals(OsType.MACOS)) { - Desktop.getDesktop().setOpenURIHandler(e -> { - try { - client.get() - .performRequest(DaemonOpenExchange.Request.builder() - .arguments(List.of(e.getURI().toString())) - .build()); - } catch (Exception ex) { - ErrorEvent.fromThrowable(ex).expected().omit().handle(); - } - }); - ThreadHelper.sleep(1000); - } - TrackEvent.info("Another instance is already running on this port. Quitting ..."); - OperationMode.halt(1); - } - - // Even in case we are unable to reach another beacon server - // there might be another instance running, for example - // starting up or listening on another port - if (!AppDataLock.lock()) { - TrackEvent.info("Data directory " + AppProperties.get().getDataDir().toString() - + " is already locked. Is another instance running?"); - OperationMode.halt(1); - } - - // If an instance is running as another user, we cannot connect to it as the xpipe_auth file is inaccessible - // Therefore the beacon client is not present. - // We still should check whether it is somehow occupied, otherwise beacon server startup will fail - if (BeaconClient.isOccupied(port)) { - TrackEvent.info("Another instance is already running on this port as another user. Quitting ..."); - OperationMode.halt(1); + }); + ThreadHelper.sleep(1000); } + TrackEvent.info("Another instance is already running on this port. Quitting ..."); + OperationMode.halt(1); } private XPipeDaemonMode getEffectiveMode() { diff --git a/app/src/main/java/io/xpipe/app/util/ScanAlert.java b/app/src/main/java/io/xpipe/app/util/ScanAlert.java index c2d8a7f8..be130654 100644 --- a/app/src/main/java/io/xpipe/app/util/ScanAlert.java +++ b/app/src/main/java/io/xpipe/app/util/ScanAlert.java @@ -12,6 +12,8 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.core.process.ShellControl; +import io.xpipe.core.process.ShellStoreState; +import io.xpipe.core.process.ShellTtyState; import io.xpipe.core.store.ShellStore; import javafx.application.Platform; @@ -34,7 +36,10 @@ public class ScanAlert { public static void showAsync(DataStoreEntry entry) { ThreadHelper.runAsync(() -> { - if (entry == null || entry.getStore() instanceof ShellStore) { + var showForCon = entry == null || (entry.getStore() instanceof ShellStore && ( + !(entry.getStorePersistentState() instanceof ShellStoreState shellStoreState) || + shellStoreState.getTtyState() == null || shellStoreState.getTtyState() == ShellTtyState.NONE)); + if (showForCon) { showForShellStore(entry); } }); @@ -46,6 +51,10 @@ public class ScanAlert { return null; } + if (sc.getTtyState() != ShellTtyState.NONE) { + return null; + } + var providers = ScanProvider.getAll(); var applicable = new ArrayList(); for (ScanProvider scanProvider : providers) { diff --git a/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java b/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java index 6b97ca3e..f840e338 100644 --- a/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java +++ b/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java @@ -12,9 +12,7 @@ import lombok.Value; import lombok.experimental.NonFinal; import java.nio.file.Path; -import java.util.LinkedHashMap; -import java.util.SequencedMap; -import java.util.UUID; +import java.util.*; import java.util.concurrent.CountDownLatch; public class TerminalLauncherManager { @@ -53,69 +51,78 @@ public class TerminalLauncherManager { } } - public static void submitSync( - UUID request, ProcessControl processControl, TerminalInitScriptConfig config, String directory) { - var entry = new Entry(request, processControl, config, directory, null); - entries.put(request, entry); - prepare(processControl, config, directory, entry); - } - public static CountDownLatch submitAsync( UUID request, ProcessControl processControl, TerminalInitScriptConfig config, String directory) { - var entry = new Entry(request, processControl, config, directory, null); - entries.put(request, entry); - var latch = new CountDownLatch(1); - ThreadHelper.runAsync(() -> { - prepare(processControl, config, directory, entry); - latch.countDown(); - }); - return latch; + synchronized (entries) { + var entry = new Entry(request, processControl, config, directory, null); + entries.put(request, entry); + var latch = new CountDownLatch(1); + ThreadHelper.runAsync(() -> { + prepare(processControl, config, directory, entry); + latch.countDown(); + }); + return latch; + } } public static Path waitForNextLaunch() throws BeaconClientException, BeaconServerException { - if (entries.isEmpty()) { - throw new BeaconClientException("Unknown launch request"); - } + Map.Entry first; + synchronized (entries) { + if (entries.isEmpty()) { + throw new BeaconClientException("Unknown launch request"); + } - var first = entries.firstEntry(); - entries.remove(first.getKey()); - return waitForCompletion(first.getKey()); + first = entries.firstEntry(); + entries.remove(first.getKey()); + } + return waitForCompletion(first.getValue()); } public static Path waitForCompletion(UUID request) throws BeaconClientException, BeaconServerException { - var e = entries.get(request); + Entry e; + synchronized (entries) { + e = entries.get(request); + } if (e == null) { throw new BeaconClientException("Unknown launch request " + request); } + return waitForCompletion(e); + } + + public static Path waitForCompletion(Entry e) throws BeaconClientException, BeaconServerException { while (true) { if (e.result == null) { ThreadHelper.sleep(10); continue; } - var r = e.getResult(); - if (r instanceof ResultFailure failure) { - entries.remove(request); - var t = failure.getThrowable(); - throw new BeaconServerException(t); - } + synchronized (entries) { + var r = e.getResult(); + if (r instanceof ResultFailure failure) { + entries.remove(e.getRequest()); + var t = failure.getThrowable(); + throw new BeaconServerException(t); + } - return ((ResultSuccess) r).getTargetScript(); + return ((ResultSuccess) r).getTargetScript(); + } } } public static Path performLaunch(UUID request) throws BeaconClientException { - var e = entries.remove(request); - if (e == null) { - throw new BeaconClientException("Unknown launch request " + request); - } + synchronized (entries) { + var e = entries.remove(request); + if (e == null) { + throw new BeaconClientException("Unknown launch request " + request); + } - if (!(e.result instanceof ResultSuccess)) { - throw new BeaconClientException("Invalid launch request state " + request); - } + if (!(e.result instanceof ResultSuccess)) { + throw new BeaconClientException("Invalid launch request state " + request); + } - return ((ResultSuccess) e.getResult()).getTargetScript(); + return ((ResultSuccess) e.getResult()).getTargetScript(); + } } public interface Result {} diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconClient.java b/beacon/src/main/java/io/xpipe/beacon/BeaconClient.java index 16dbbec7..08e7e45f 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconClient.java +++ b/beacon/src/main/java/io/xpipe/beacon/BeaconClient.java @@ -24,15 +24,6 @@ public class BeaconClient { this.port = port; } - public static boolean isOccupied(int port) { - var file = XPipeInstallation.getLocalBeaconAuthFile(); - var reachable = BeaconServer.isReachable(port); - if (!Files.exists(file) && !reachable) { - return false; - } - return reachable; - } - public static BeaconClient establishConnection(int port, BeaconClientInformation information) throws Exception { var client = new BeaconClient(port); var auth = Files.readString(XPipeInstallation.getLocalBeaconAuthFile()); diff --git a/dist/changelogs/11.0.md b/dist/changelogs/11.0.md index bca13a08..439ec0b6 100644 --- a/dist/changelogs/11.0.md +++ b/dist/changelogs/11.0.md @@ -10,11 +10,11 @@ The main concern here is to verify that the existing normal shell implementation There is now support to add your teleport connections that are available via tsh. -## Profiles +## Workspaces -You can now create multiple user profiles in the settings menu. +You can now create multiple user workspaces in the settings menu. -This will create desktop shortcuts that you can use to start XPipe with different profiles active. +This will create desktop shortcuts that you can use to start XPipe with different workspaces active. ## Serial connection support diff --git a/ext/base/src/main/java/io/xpipe/ext/base/action/BrowseStoreAction.java b/ext/base/src/main/java/io/xpipe/ext/base/action/BrowseStoreAction.java index 1d82465d..74f7282b 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/action/BrowseStoreAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/action/BrowseStoreAction.java @@ -6,12 +6,9 @@ import io.xpipe.app.core.AppLayoutModel; import io.xpipe.app.ext.ActionProvider; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; -import io.xpipe.core.process.ShellStoreState; import io.xpipe.core.store.ShellStore; - import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.value.ObservableValue; - import lombok.Value; public class BrowseStoreAction implements ActionProvider { @@ -20,17 +17,6 @@ public class BrowseStoreAction implements ActionProvider { public LeafDataStoreCallSite getLeafDataStoreCallSite() { return new LeafDataStoreCallSite() { - @Override - public boolean isApplicable(DataStoreEntryRef o) { - var state = o.get().getStorePersistentState(); - if (state instanceof ShellStoreState shellStoreState) { - return shellStoreState.getShellDialect() == null - || shellStoreState.getShellDialect().getDumbMode().supportsAnyPossibleInteraction(); - } else { - return true; - } - } - @Override public ActionProvider.Action createAction(DataStoreEntryRef store) { return new Action(store.get()); diff --git a/ext/base/src/main/java/io/xpipe/ext/base/action/RunScriptActionMenu.java b/ext/base/src/main/java/io/xpipe/ext/base/action/RunScriptActionMenu.java index 8380aa77..635084d6 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/action/RunScriptActionMenu.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/action/RunScriptActionMenu.java @@ -7,6 +7,7 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.TerminalLauncher; import io.xpipe.core.process.ShellStoreState; +import io.xpipe.core.process.ShellTtyState; import io.xpipe.core.store.ShellStore; import io.xpipe.ext.base.script.ScriptHierarchy; import javafx.beans.property.SimpleStringProperty; @@ -251,12 +252,14 @@ public class RunScriptActionMenu implements ActionProvider { @Override public boolean isApplicable(DataStoreEntryRef o) { - var state = o.getEntry().getStorePersistentState(); - if (!(state instanceof ShellStoreState shellStoreState) || shellStoreState.getShellDialect() == null) { + var state = o.get().getStorePersistentState(); + if (state instanceof ShellStoreState shellStoreState) { + return (shellStoreState.getShellDialect() == null + || shellStoreState.getShellDialect().getDumbMode().supportsAnyPossibleInteraction()) && + (shellStoreState.getTtyState() == null || shellStoreState.getTtyState() == ShellTtyState.NONE); + } else { return false; } - - return true; } @Override diff --git a/ext/base/src/main/java/io/xpipe/ext/base/action/ScanStoreAction.java b/ext/base/src/main/java/io/xpipe/ext/base/action/ScanStoreAction.java index a236f930..afcd4cdb 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/action/ScanStoreAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/action/ScanStoreAction.java @@ -6,6 +6,7 @@ import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.ScanAlert; import io.xpipe.core.process.ShellStoreState; +import io.xpipe.core.process.ShellTtyState; import io.xpipe.core.store.ShellStore; import javafx.beans.value.ObservableValue; import lombok.Value; @@ -39,8 +40,9 @@ public class ScanStoreAction implements ActionProvider { var state = o.get().getStorePersistentState(); if (state instanceof ShellStoreState shellStoreState) { - return shellStoreState.getShellDialect() == null - || shellStoreState.getShellDialect().getDumbMode().supportsAnyPossibleInteraction(); + return (shellStoreState.getShellDialect() == null + || shellStoreState.getShellDialect().getDumbMode().supportsAnyPossibleInteraction()) && + (shellStoreState.getTtyState() == null || shellStoreState.getTtyState() == ShellTtyState.NONE); } else { return true; } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java index 424b176a..dafece86 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java @@ -26,7 +26,8 @@ public interface ShellStoreProvider extends DataStoreProvider { @Override public void execute() throws Exception { ShellStore store = entry.getStore().asNeeded(); - TerminalLauncher.open(entry, DataStorage.get().getStoreEntryDisplayName(entry), null, ScriptStore.controlWithDefaultScripts(store.control())); + TerminalLauncher.open(entry, DataStorage.get().getStoreEntryDisplayName(entry), null, + ScriptStore.controlWithDefaultScripts(store.control())); } }; } diff --git a/lang/app/strings/translations_da.properties b/lang/app/strings/translations_da.properties index 6fea7fda..fdeb9f31 100644 --- a/lang/app/strings/translations_da.properties +++ b/lang/app/strings/translations_da.properties @@ -281,6 +281,7 @@ dontAutomaticallyStartVmSshServerDescription=Enhver shell-forbindelse til en VM, confirmGitShareTitle=Bekræft git-deling #custom confirmGitShareHeader=Dette vil kopiere filen til din git-vault og overføre dine ændringer. Ønsker du at fortsætte? +confirmGitShareContent=Dette vil kopiere filen til din git vault og overføre dine ændringer. Ønsker du at fortsætte? gitShareFileTooltip=Tilføj en fil til git vault-datakataloget, så den automatisk bliver synkroniseret.\n\nDenne handling kan kun bruges, når git vault er aktiveret i indstillingerne. performanceMode=Performance-tilstand performanceModeDescription=Deaktiverer alle visuelle effekter, der ikke er nødvendige for at forbedre programmets ydeevne. diff --git a/lang/app/strings/translations_de.properties b/lang/app/strings/translations_de.properties index 43d00ca5..8f9e0ad8 100644 --- a/lang/app/strings/translations_de.properties +++ b/lang/app/strings/translations_de.properties @@ -274,7 +274,8 @@ themeDescription=Dein bevorzugtes Anzeigethema dontAutomaticallyStartVmSshServer=SSH-Server für VMs bei Bedarf nicht automatisch starten dontAutomaticallyStartVmSshServerDescription=Jede Shell-Verbindung zu einer VM, die in einem Hypervisor läuft, wird über SSH hergestellt. XPipe kann bei Bedarf automatisch den installierten SSH-Server starten. Wenn du das aus Sicherheitsgründen nicht möchtest, kannst du dieses Verhalten mit dieser Option einfach deaktivieren. confirmGitShareTitle=Bestätige die Git-Freigabe -confirmGitShareHeader=Dadurch wird die Datei in deinen Git-Datenspeicher kopiert und deine Änderungen werden übertragen. Willst du fortfahren? +confirmGitShareHeader=Willst du die ausgewählte Datei zu deinem Git Vault Repository hinzufügen? +confirmGitShareContent=Damit kopierst du die Datei in deinen Git-Depot und überträgst deine Änderungen. Willst du fortfahren? gitShareFileTooltip=Füge die Datei zum Git Vault-Datenverzeichnis hinzu, damit sie automatisch synchronisiert wird.\n\nDiese Aktion kann nur verwendet werden, wenn der Git Tresor in den Einstellungen aktiviert ist. performanceMode=Leistungsmodus performanceModeDescription=Deaktiviert alle visuellen Effekte, die nicht benötigt werden, um die Leistung der Anwendung zu verbessern. diff --git a/lang/app/strings/translations_en.properties b/lang/app/strings/translations_en.properties index 9e748713..e9c8c78a 100644 --- a/lang/app/strings/translations_en.properties +++ b/lang/app/strings/translations_en.properties @@ -276,7 +276,8 @@ themeDescription=Your preferred display theme dontAutomaticallyStartVmSshServer=Don't automatically start SSH server for VMs when needed dontAutomaticallyStartVmSshServerDescription=Any shell connection to a VM running in a hypervisor is made through SSH. XPipe can automatically start the installed SSH server when needed. If you don't want this for security reasons, then you can just disable this behavior with this option. confirmGitShareTitle=Confirm git sharing -confirmGitShareHeader=This will copy the file into your git vault and commit your changes. Do you want to continue? +confirmGitShareHeader=Do you want to add the selected file to your git vault repository? +confirmGitShareContent=This will copy an encrypted version of the file into your git vault and commit your changes. Do you want to continue? gitShareFileTooltip=Add file to the git vault data directory so that it is automatically synced.\n\nThis action can only be used when the git vault is enabled in the settings. performanceMode=Performance mode performanceModeDescription=Disables all visual effects that are not required in order to improve the application performance. diff --git a/lang/app/strings/translations_es.properties b/lang/app/strings/translations_es.properties index ce354fd6..eb5b627b 100644 --- a/lang/app/strings/translations_es.properties +++ b/lang/app/strings/translations_es.properties @@ -265,7 +265,8 @@ themeDescription=Tu tema de visualización preferido dontAutomaticallyStartVmSshServer=No iniciar automáticamente el servidor SSH para las máquinas virtuales cuando sea necesario dontAutomaticallyStartVmSshServerDescription=Cualquier conexión shell a una máquina virtual que se ejecute en un hipervisor se realiza a través de SSH. XPipe puede iniciar automáticamente el servidor SSH instalado cuando sea necesario. Si no quieres esto por razones de seguridad, puedes desactivar este comportamiento con esta opción. confirmGitShareTitle=Confirmar compartición git -confirmGitShareHeader=Esto copiará el archivo en tu almacén git y confirmará tus cambios. ¿Quieres continuar? +confirmGitShareHeader=¿Quieres añadir el archivo seleccionado a tu repositorio git vault? +confirmGitShareContent=Esto copiará el archivo en tu bóveda git y confirmará tus cambios. ¿Quieres continuar? gitShareFileTooltip=Añade el archivo al directorio de datos de la bóveda git para que se sincronice automáticamente.\n\nEsta acción sólo puede utilizarse cuando la bóveda git está activada en los ajustes. performanceMode=Modo de funcionamiento performanceModeDescription=Desactiva todos los efectos visuales que no sean necesarios para mejorar el rendimiento de la aplicación. diff --git a/lang/app/strings/translations_fr.properties b/lang/app/strings/translations_fr.properties index eb0d8877..3b40b5cb 100644 --- a/lang/app/strings/translations_fr.properties +++ b/lang/app/strings/translations_fr.properties @@ -265,7 +265,8 @@ themeDescription=Ton thème d'affichage préféré dontAutomaticallyStartVmSshServer=Ne démarre pas automatiquement le serveur SSH pour les machines virtuelles lorsque c'est nécessaire dontAutomaticallyStartVmSshServerDescription=Toute connexion shell à une VM fonctionnant dans un hyperviseur se fait par l'intermédiaire de SSH. XPipe peut démarrer automatiquement le serveur SSH installé lorsque cela est nécessaire. Si tu ne le souhaites pas pour des raisons de sécurité, tu peux simplement désactiver ce comportement avec cette option. confirmGitShareTitle=Confirmer le partage git -confirmGitShareHeader=Cela copiera le fichier dans ton coffre-fort git et validera tes modifications. Veux-tu continuer ? +confirmGitShareHeader=Veux-tu ajouter le fichier sélectionné à ton dépôt git vault ? +confirmGitShareContent=Cela copiera le fichier dans ton coffre-fort git et validera tes modifications. Veux-tu continuer ? gitShareFileTooltip=Ajoute un fichier au répertoire de données de git vault pour qu'il soit automatiquement synchronisé.\n\nCette action ne peut être utilisée que lorsque le git vault est activé dans les paramètres. performanceMode=Mode performance performanceModeDescription=Désactive tous les effets visuels qui ne sont pas nécessaires afin d'améliorer les performances de l'application. diff --git a/lang/app/strings/translations_it.properties b/lang/app/strings/translations_it.properties index ed713c4e..161e0733 100644 --- a/lang/app/strings/translations_it.properties +++ b/lang/app/strings/translations_it.properties @@ -265,7 +265,8 @@ themeDescription=Il tema di visualizzazione che preferisci dontAutomaticallyStartVmSshServer=Non avviare automaticamente il server SSH per le macchine virtuali quando necessario dontAutomaticallyStartVmSshServerDescription=Qualsiasi connessione shell a una macchina virtuale in esecuzione in un hypervisor viene effettuata tramite SSH. XPipe può avviare automaticamente il server SSH installato quando necessario. Se non vuoi che ciò avvenga per motivi di sicurezza, puoi disabilitare questo comportamento con questa opzione. confirmGitShareTitle=Conferma la condivisione di git -confirmGitShareHeader=In questo modo il file verrà copiato nel tuo git vault e le tue modifiche verranno inviate. Vuoi continuare? +confirmGitShareHeader=Vuoi aggiungere il file selezionato al tuo repository git vault? +confirmGitShareContent=Questo copierà il file nel tuo vault git e apporterà le modifiche. Vuoi continuare? gitShareFileTooltip=Aggiungi un file alla directory dei dati di git vault in modo che venga sincronizzato automaticamente.\n\nQuesta azione può essere utilizzata solo se il git vault è abilitato nelle impostazioni. performanceMode=Modalità di prestazione performanceModeDescription=Disattiva tutti gli effetti visivi non necessari per migliorare le prestazioni dell'applicazione. diff --git a/lang/app/strings/translations_ja.properties b/lang/app/strings/translations_ja.properties index 8c57615f..419a3497 100644 --- a/lang/app/strings/translations_ja.properties +++ b/lang/app/strings/translations_ja.properties @@ -265,7 +265,8 @@ themeDescription=お好みの表示テーマ dontAutomaticallyStartVmSshServer=必要なときにVM用のSSHサーバーを自動的に起動しない dontAutomaticallyStartVmSshServerDescription=ハイパーバイザーで稼働しているVMへのシェル接続は、SSHを介して行われる。XPipeは、必要に応じてインストールされたSSHサーバを自動的に起動することができる。セキュリティ上の理由でこれを望まない場合は、このオプションでこの動作を無効にすることができる。 confirmGitShareTitle=git共有を確認する -confirmGitShareHeader=これでファイルが git vault にコピーされ、変更がコミットされる。続行する? +confirmGitShareHeader=選択したファイルを git vault リポジトリに追加するか? +confirmGitShareContent=これでファイルが git vault にコピーされ、変更がコミットされる。続行する? gitShareFileTooltip=git vaultのデータディレクトリにファイルを追加し、自動的に同期されるようにする。\n\nこのアクションは、設定で git vault が有効になっている場合にのみ使用できる。 performanceMode=パフォーマンスモード performanceModeDescription=アプリケーションのパフォーマンスを向上させるために不要な視覚効果をすべて無効にする。 diff --git a/lang/app/strings/translations_nl.properties b/lang/app/strings/translations_nl.properties index 78917b34..86c54356 100644 --- a/lang/app/strings/translations_nl.properties +++ b/lang/app/strings/translations_nl.properties @@ -265,7 +265,8 @@ themeDescription=Het weergavethema van je voorkeur dontAutomaticallyStartVmSshServer=SSH-server voor VM's niet automatisch starten wanneer nodig dontAutomaticallyStartVmSshServerDescription=Elke shellverbinding met een VM die draait in een hypervisor wordt gemaakt via SSH. XPipe kan automatisch de geïnstalleerde SSH-server starten wanneer dat nodig is. Als je dit om veiligheidsredenen niet wilt, dan kun je dit gedrag gewoon uitschakelen met deze optie. confirmGitShareTitle=Git delen bevestigen -confirmGitShareHeader=Dit kopieert het bestand naar je git vault en commit je wijzigingen. Wil je doorgaan? +confirmGitShareHeader=Wil je het geselecteerde bestand toevoegen aan je git vault repository? +confirmGitShareContent=Dit kopieert het bestand naar je git vault en commit je wijzigingen. Wil je doorgaan? gitShareFileTooltip=Voeg een bestand toe aan de git vault datamap zodat het automatisch gesynchroniseerd wordt.\n\nDeze actie kan alleen worden gebruikt als de git vault is ingeschakeld in de instellingen. performanceMode=Prestatiemodus performanceModeDescription=Schakelt alle visuele effecten uit die niet nodig zijn om de prestaties van de toepassing te verbeteren. diff --git a/lang/app/strings/translations_pt.properties b/lang/app/strings/translations_pt.properties index 7b767555..27c57273 100644 --- a/lang/app/strings/translations_pt.properties +++ b/lang/app/strings/translations_pt.properties @@ -265,7 +265,8 @@ themeDescription=O teu tema de visualização preferido dontAutomaticallyStartVmSshServer=Não inicia automaticamente o servidor SSH para VMs quando necessário dontAutomaticallyStartVmSshServerDescription=Qualquer ligação shell a uma VM em execução num hipervisor é feita através de SSH. O XPipe pode iniciar automaticamente o servidor SSH instalado quando necessário. Se não quiseres isto por razões de segurança, então podes simplesmente desativar este comportamento com esta opção. confirmGitShareTitle=Confirma a partilha do git -confirmGitShareHeader=Isto irá copiar o ficheiro para o teu cofre git e confirmar as tuas alterações. Queres continuar? +confirmGitShareHeader=Queres adicionar o ficheiro selecionado ao teu repositório git vault? +confirmGitShareContent=Isto irá copiar o ficheiro para o teu cofre git e confirmar as tuas alterações. Queres continuar? gitShareFileTooltip=Adiciona o ficheiro ao diretório de dados do git vault para que seja sincronizado automaticamente.\n\nEsta ação só pode ser utilizada quando o git vault está ativado nas definições. performanceMode=Modo de desempenho performanceModeDescription=Desactiva todos os efeitos visuais que não são necessários para melhorar o desempenho da aplicação. diff --git a/lang/app/strings/translations_ru.properties b/lang/app/strings/translations_ru.properties index 855ee656..12ecc629 100644 --- a/lang/app/strings/translations_ru.properties +++ b/lang/app/strings/translations_ru.properties @@ -265,7 +265,8 @@ themeDescription=Предпочитаемая тобой тема отображ dontAutomaticallyStartVmSshServer=Не запускай автоматически SSH-сервер для виртуальных машин, когда это необходимо dontAutomaticallyStartVmSshServerDescription=Любое shell-подключение к виртуальной машине, запущенной в гипервизоре, осуществляется через SSH. XPipe может автоматически запускать установленный SSH-сервер, когда это необходимо. Если тебе это не нужно по соображениям безопасности, то ты можешь просто отключить такое поведение с помощью этой опции. confirmGitShareTitle=Подтверждение совместного использования git -confirmGitShareHeader=Это скопирует файл в твое хранилище git и зафиксирует твои изменения. Хочешь продолжить? +confirmGitShareHeader=Хочешь добавить выбранный файл в свой репозиторий git vault? +confirmGitShareContent=Это скопирует файл в твое хранилище git и зафиксирует твои изменения. Хочешь продолжить? gitShareFileTooltip=Добавь файл в каталог данных git vault, чтобы он автоматически синхронизировался.\n\nЭто действие можно использовать, только если в настройках включено git-хранилище. performanceMode=Режим производительности performanceModeDescription=Отключи все визуальные эффекты, которые не нужны, чтобы повысить производительность приложения. diff --git a/lang/app/strings/translations_tr.properties b/lang/app/strings/translations_tr.properties index 35ce7275..01d77586 100644 --- a/lang/app/strings/translations_tr.properties +++ b/lang/app/strings/translations_tr.properties @@ -265,7 +265,8 @@ themeDescription=Tercih ettiğiniz ekran teması dontAutomaticallyStartVmSshServer=Gerektiğinde VM'ler için SSH sunucusunu otomatik olarak başlatma dontAutomaticallyStartVmSshServerDescription=Bir hipervizörde çalışan bir sanal makineye herhangi bir kabuk bağlantısı SSH aracılığıyla yapılır. XPipe gerektiğinde kurulu SSH sunucusunu otomatik olarak başlatabilir. Güvenlik nedeniyle bunu istemiyorsanız, bu seçenekle bu davranışı devre dışı bırakabilirsiniz. confirmGitShareTitle=Git paylaşımını onayla -confirmGitShareHeader=Bu, dosyayı git kasanıza kopyalayacak ve değişikliklerinizi işleyecektir. Devam etmek istiyor musunuz? +confirmGitShareHeader=Seçilen dosyayı git vault deponuza eklemek istiyor musunuz? +confirmGitShareContent=Bu, dosyayı git kasanıza kopyalayacak ve değişikliklerinizi işleyecektir. Devam etmek istiyor musunuz? gitShareFileTooltip=Dosyayı git vault veri dizinine ekleyin, böylece otomatik olarak senkronize edilir.\n\nBu eylem yalnızca ayarlarda git vault etkinleştirildiğinde kullanılabilir. performanceMode=Performans modu performanceModeDescription=Uygulama performansını artırmak için gerekli olmayan tüm görsel efektleri devre dışı bırakır. diff --git a/lang/app/strings/translations_zh.properties b/lang/app/strings/translations_zh.properties index 1c7142e5..568a6917 100644 --- a/lang/app/strings/translations_zh.properties +++ b/lang/app/strings/translations_zh.properties @@ -265,7 +265,8 @@ themeDescription=您首选的显示主题 dontAutomaticallyStartVmSshServer=需要时不自动为虚拟机启动 SSH 服务器 dontAutomaticallyStartVmSshServerDescription=与在管理程序中运行的虚拟机的任何 shell 连接都是通过 SSH 进行的。XPipe可在需要时自动启动已安装的SSH服务器。如果出于安全原因不希望这样做,则可以通过此选项禁用此行为。 confirmGitShareTitle=确认 git 共享 -confirmGitShareHeader=这将把文件复制到您的 git 目录,并提交您的修改。要继续吗? +confirmGitShareHeader=您想将所选文件添加到您的 git vault 仓库吗? +confirmGitShareContent=这将把文件复制到您的 git 目录,并提交您的修改。要继续吗? gitShareFileTooltip=将文件添加到 git vault 数据目录,使其自动同步。\n\n此操作只有在设置中启用 git vault 后才能使用。 performanceMode=性能模式 performanceModeDescription=禁用所有不需要的视觉效果,以提高应用程序性能。