Various fixes

This commit is contained in:
crschnick 2024-08-14 12:29:14 +00:00
parent 51121d2301
commit ac221b3b85
24 changed files with 148 additions and 152 deletions

View file

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

View file

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

View file

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

View file

@ -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() {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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=アプリケーションのパフォーマンスを向上させるために不要な視覚効果をすべて無効にする。

View file

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

View file

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

View file

@ -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=Отключи все визуальные эффекты, которые не нужны, чтобы повысить производительность приложения.

View file

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

View file

@ -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=禁用所有不需要的视觉效果,以提高应用程序性能。