mirror of
https://github.com/xpipe-io/xpipe.git
synced 2024-11-24 08:30:27 +00:00
Various fixes
This commit is contained in:
parent
51121d2301
commit
ac221b3b85
24 changed files with 148 additions and 152 deletions
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
|
|
|
@ -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<CompStructure<HBox>>
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -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<Integer> {
|
|||
|
||||
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() {
|
||||
|
|
|
@ -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<ScanProvider.ScanOperation>();
|
||||
for (ScanProvider scanProvider : providers) {
|
||||
|
|
|
@ -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<UUID, 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 {}
|
||||
|
|
|
@ -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());
|
||||
|
|
6
dist/changelogs/11.0.md
vendored
6
dist/changelogs/11.0.md
vendored
|
@ -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
|
||||
|
||||
|
|
|
@ -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<ShellStore>() {
|
||||
|
||||
@Override
|
||||
public boolean isApplicable(DataStoreEntryRef<ShellStore> 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<ShellStore> store) {
|
||||
return new Action(store.get());
|
||||
|
|
|
@ -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<ShellStore> 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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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=アプリケーションのパフォーマンスを向上させるために不要な視覚効果をすべて無効にする。
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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=Отключи все визуальные эффекты, которые не нужны, чтобы повысить производительность приложения.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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=禁用所有不需要的视觉效果,以提高应用程序性能。
|
||||
|
|
Loading…
Reference in a new issue