Replace simple change listener

This commit is contained in:
crschnick 2024-04-03 06:26:29 +00:00
parent 6bd105b1de
commit 6860feaa80
109 changed files with 2136 additions and 709 deletions

View file

@ -3,7 +3,6 @@ package io.xpipe.app.browser;
import atlantafx.base.controls.Breadcrumbs;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.core.store.FileNames;
import javafx.scene.Node;
import javafx.scene.control.Button;
@ -40,7 +39,7 @@ public class BrowserBreadcrumbBar extends SimpleComp {
var breadcrumbs = new Breadcrumbs<String>();
breadcrumbs.setMinWidth(0);
SimpleChangeListener.apply(PlatformThread.sync(model.getCurrentPath()), val -> {
PlatformThread.sync(model.getCurrentPath()).subscribe( val -> {
if (val == null) {
breadcrumbs.setSelectedCrumb(null);
return;

View file

@ -16,7 +16,6 @@ import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
import io.xpipe.app.fxcomps.impl.VerticalComp;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.util.BooleanScope;
import io.xpipe.app.util.ThreadHelper;
@ -284,7 +283,7 @@ public class BrowserComp extends SimpleComp {
var id = UUID.randomUUID().toString();
tab.setId(id);
SimpleChangeListener.apply(tabs.skinProperty(), newValue -> {
tabs.skinProperty().subscribe(newValue -> {
if (newValue != null) {
Platform.runLater(() -> {
Label l = (Label) tabs.lookup("#" + id + " .tab-label");

View file

@ -5,7 +5,6 @@ import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.impl.FancyTooltipAugment;
import io.xpipe.app.fxcomps.impl.TextFieldComp;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.geometry.Pos;
@ -47,7 +46,7 @@ public class BrowserFilterComp extends Comp<BrowserFilterComp.Structure> {
text.setMinWidth(0);
Styles.toggleStyleClass(text, Styles.LEFT_PILL);
SimpleChangeListener.apply(filterString, val -> {
filterString.subscribe(val -> {
if (val == null) {
text.getStyleClass().remove(Styles.SUCCESS);
} else {

View file

@ -10,7 +10,6 @@ import io.xpipe.app.fxcomps.impl.HorizontalComp;
import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
import io.xpipe.app.fxcomps.impl.StackComp;
import io.xpipe.app.fxcomps.impl.TextFieldComp;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.util.BooleanScope;
import io.xpipe.app.util.ThreadHelper;
import javafx.application.Platform;
@ -42,7 +41,7 @@ public class BrowserNavBar extends SimpleComp {
@Override
protected Region createSimple() {
var path = new SimpleStringProperty(model.getCurrentPath().get());
SimpleChangeListener.apply(model.getCurrentPath(), (newValue) -> {
model.getCurrentPath().subscribe((newValue) -> {
path.set(newValue);
});
path.addListener((observable, oldValue, newValue) -> {
@ -58,7 +57,7 @@ public class BrowserNavBar extends SimpleComp {
.styleClass(Styles.CENTER_PILL)
.styleClass("path-text")
.apply(struc -> {
SimpleChangeListener.apply(struc.get().focusedProperty(), val -> {
struc.get().focusedProperty().subscribe(val -> {
struc.get()
.pseudoClassStateChanged(
INVISIBLE,
@ -71,7 +70,7 @@ public class BrowserNavBar extends SimpleComp {
}
});
SimpleChangeListener.apply(model.getInOverview(), val -> {
model.getInOverview().subscribe(val -> {
// Pseudo classes do not apply if set instantly before shown
// If we start a new tab with a directory set, we have to set the pseudo class one pulse later
Platform.runLater(() -> {

View file

@ -5,6 +5,7 @@ import io.xpipe.app.comp.base.ButtonComp;
import io.xpipe.app.comp.base.ListBoxViewComp;
import io.xpipe.app.comp.base.TileButtonComp;
import io.xpipe.app.core.AppFont;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.impl.HorizontalComp;
@ -54,7 +55,8 @@ public class BrowserWelcomeComp extends SimpleComp {
hbox.setSpacing(15);
if (state == null) {
var header = new Label("Here you will be able to see where you left off last time.");
var header = new Label();
header.textProperty().bind(AppI18n.observable("browserWelcomeEmpty"));
vbox.getChildren().add(header);
hbox.setPadding(new Insets(40, 40, 40, 50));
return new VBox(hbox);
@ -74,13 +76,14 @@ public class BrowserWelcomeComp extends SimpleComp {
});
var empty = Bindings.createBooleanBinding(() -> list.isEmpty(), list);
var header = new LabelComp(Bindings.createStringBinding(
() -> {
return !empty.get()
? "You were recently connected to the following systems:"
: "Here you will be able to see where you left off last time.";
},
empty))
var headerBinding = BindingsHelper.mappedBinding(empty,b -> {
if (b) {
return AppI18n.observable("browserWelcomeEmpty");
} else {
return AppI18n.observable("browserWelcomeSystems");
}
});
var header = new LabelComp(headerBinding)
.createRegion();
AppFont.setSize(header, 1);
vbox.getChildren().add(header);

View file

@ -3,7 +3,6 @@ package io.xpipe.app.comp.base;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.SimpleCompStructure;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue;
@ -50,7 +49,7 @@ public class ButtonComp extends Comp<CompStructure<Button>> {
var graphic = getGraphic();
if (graphic instanceof FontIcon f) {
// f.iconColorProperty().bind(button.textFillProperty());
SimpleChangeListener.apply(button.fontProperty(), c -> {
button.fontProperty().subscribe(c -> {
f.setIconSize((int) new Size(c.getSize(), SizeUnits.PT).pixels());
});
}

View file

@ -5,7 +5,6 @@ import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.SimpleCompStructure;
import io.xpipe.app.fxcomps.augment.ContextMenuAugment;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.css.Size;
import javafx.css.SizeUnits;
import javafx.scene.control.Button;
@ -43,7 +42,7 @@ public class DropdownComp extends Comp<CompStructure<Button>> {
.toList()));
var graphic = new FontIcon("mdi2c-chevron-double-down");
SimpleChangeListener.apply(button.fontProperty(), c -> {
button.fontProperty().subscribe(c -> {
graphic.setIconSize((int) new Size(c.getSize(), SizeUnits.PT).pixels());
});

View file

@ -3,7 +3,6 @@ package io.xpipe.app.comp.base;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TextField;
@ -65,7 +64,7 @@ public class LazyTextFieldComp extends Comp<LazyTextFieldComp.Structure> {
sp.prefHeightProperty().bind(r.prefHeightProperty());
r.setDisable(true);
SimpleChangeListener.apply(currentValue, n -> {
currentValue.subscribe(n -> {
PlatformThread.runLaterIfNeeded(() -> {
// Check if control value is the same. Then don't set it as that might cause bugs
if (Objects.equals(r.getText(), n) || (n == null && r.getText().isEmpty())) {

View file

@ -6,7 +6,6 @@ import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.SimpleCompStructure;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.util.Hyperlinks;
@ -59,7 +58,7 @@ public class MarkdownComp extends Comp<CompStructure<StackPane>> {
var url = AppResources.getResourceURL(AppResources.XPIPE_MODULE, theme).orElseThrow();
wv.getEngine().setUserStyleSheetLocation(url.toString());
SimpleChangeListener.apply(PlatformThread.sync(markdown), val -> {
PlatformThread.sync(markdown).subscribe(val -> {
// Workaround for https://bugs.openjdk.org/browse/JDK-8199014
try {
var file = Files.createTempFile(null, ".html");

View file

@ -3,7 +3,6 @@ package io.xpipe.app.comp.base;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
@ -25,7 +24,7 @@ public class MultiContentComp extends SimpleComp {
for (Map.Entry<Comp<?>, ObservableValue<Boolean>> entry : content.entrySet()) {
var region = entry.getKey().createRegion();
stack.getChildren().add(region);
SimpleChangeListener.apply(PlatformThread.sync(entry.getValue()), val -> {
PlatformThread.sync(entry.getValue()).subscribe(val -> {
region.setManaged(val);
region.setVisible(val);
});

View file

@ -5,7 +5,6 @@ import io.xpipe.app.comp.store.StoreEntryWrapper;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.core.process.ShellStoreState;
import javafx.beans.binding.Bindings;
import javafx.beans.value.ObservableValue;
@ -35,7 +34,7 @@ public class SystemStateComp extends SimpleComp {
state));
var fi = new FontIcon();
fi.getStyleClass().add("inner-icon");
SimpleChangeListener.apply(icon, val -> fi.setIconLiteral(val));
icon.subscribe(val -> fi.setIconLiteral(val));
var border = new FontIcon("mdi2c-circle-outline");
border.getStyleClass().add("outer-icon");
@ -63,7 +62,7 @@ public class SystemStateComp extends SimpleComp {
""";
pane.getStylesheets().add(Styles.toDataURI(dataClass1));
SimpleChangeListener.apply(PlatformThread.sync(state), val -> {
PlatformThread.sync(state).subscribe(val -> {
pane.getStylesheets().removeAll(success, failure, other);
pane.getStylesheets().add(val == State.SUCCESS ? success : val == State.FAILURE ? failure : other);
});

View file

@ -5,7 +5,6 @@ import io.xpipe.app.core.AppI18n;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
@ -57,7 +56,7 @@ public class TileButtonComp extends Comp<TileButtonComp.Structure> {
text.setSpacing(2);
var fi = new FontIcon();
SimpleChangeListener.apply(PlatformThread.sync(icon), val -> {
PlatformThread.sync(icon).subscribe(val -> {
fi.setIconLiteral(val);
});

View file

@ -12,7 +12,6 @@ import io.xpipe.app.ext.DataStoreProviders;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.augment.GrowAugment;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.issue.ExceptionConverter;
import io.xpipe.app.issue.TrackEvent;
@ -381,7 +380,7 @@ public class StoreCreationComp extends DialogComp {
providerChoice.apply(GrowAugment.create(true, false));
providerChoice.onSceneAssign(struc -> struc.get().requestFocus());
SimpleChangeListener.apply(provider, n -> {
provider.subscribe(n -> {
if (n != null) {
var d = n.guiDialog(existingEntry, store);
var propVal = new SimpleValidator();

View file

@ -15,7 +15,6 @@ import io.xpipe.app.fxcomps.augment.GrowAugment;
import io.xpipe.app.fxcomps.impl.*;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreColor;
@ -138,7 +137,7 @@ public abstract class StoreEntryComp extends SimpleComp {
}
protected void applyState(Node node) {
SimpleChangeListener.apply(PlatformThread.sync(wrapper.getValidity()), val -> {
PlatformThread.sync(wrapper.getValidity()).subscribe(val -> {
switch (val) {
case LOAD_FAILED -> {
node.pseudoClassStateChanged(FAILED, true);

View file

@ -9,7 +9,6 @@ import io.xpipe.app.fxcomps.impl.FancyTooltipAugment;
import io.xpipe.app.fxcomps.impl.FilterComp;
import io.xpipe.app.fxcomps.impl.IconButtonComp;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.util.ThreadHelper;
import io.xpipe.core.process.OsType;
import javafx.beans.binding.Bindings;
@ -36,7 +35,7 @@ public class StoreEntryListStatusComp extends SimpleComp {
public StoreEntryListStatusComp() {
this.sortMode = new SimpleObjectProperty<>();
SimpleChangeListener.apply(StoreViewState.get().getActiveCategory(), val -> {
StoreViewState.get().getActiveCategory().subscribe(val -> {
sortMode.setValue(val.getSortMode().getValue());
});
sortMode.addListener((observable, oldValue, newValue) -> {
@ -51,18 +50,9 @@ public class StoreEntryListStatusComp extends SimpleComp {
private Region createGroupListHeader() {
var label = new Label();
label.textProperty()
.bind(Bindings.createStringBinding(
() -> {
return StoreViewState.get()
.getActiveCategory()
.getValue()
.getRoot()
.equals(StoreViewState.get().getAllConnectionsCategory())
? "Connections"
: "Scripts";
},
StoreViewState.get().getActiveCategory()));
var name = BindingsHelper.flatMap(StoreViewState.get().getActiveCategory(),
categoryWrapper -> AppI18n.observable(categoryWrapper.getRoot().equals(StoreViewState.get().getAllConnectionsCategory()) ? "connections" : "scripts"));
label.textProperty().bind(name);
label.getStyleClass().add("name");
var all = BindingsHelper.filteredContentBinding(

View file

@ -8,7 +8,6 @@ import io.xpipe.app.fxcomps.impl.HorizontalComp;
import io.xpipe.app.fxcomps.impl.IconButtonComp;
import io.xpipe.app.fxcomps.impl.VerticalComp;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.storage.DataStoreColor;
import io.xpipe.app.util.ThreadHelper;
import javafx.beans.binding.Bindings;
@ -162,7 +161,7 @@ public class StoreSectionComp extends Comp<CompStructure<VBox>> {
return full.styleClass("store-entry-section-comp")
.apply(struc -> {
struc.get().setFillWidth(true);
SimpleChangeListener.apply(expanded, val -> {
expanded.subscribe(val -> {
struc.get().pseudoClassStateChanged(EXPANDED, val);
});
struc.get().pseudoClassStateChanged(EVEN, section.getDepth() % 2 == 0);
@ -170,7 +169,7 @@ public class StoreSectionComp extends Comp<CompStructure<VBox>> {
struc.get().pseudoClassStateChanged(ROOT, topLevel);
struc.get().pseudoClassStateChanged(SUB, !topLevel);
SimpleChangeListener.apply(section.getWrapper().getColor(), val -> {
section.getWrapper().getColor().subscribe(val -> {
if (!topLevel) {
return;
}

View file

@ -9,7 +9,6 @@ import io.xpipe.app.fxcomps.impl.IconButtonComp;
import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
import io.xpipe.app.fxcomps.impl.VerticalComp;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.storage.DataStoreColor;
import javafx.beans.binding.Bindings;
import javafx.beans.property.BooleanProperty;
@ -160,7 +159,7 @@ public class StoreSectionMiniComp extends Comp<CompStructure<VBox>> {
return vert.styleClass("store-section-mini-comp")
.apply(struc -> {
struc.get().setFillWidth(true);
SimpleChangeListener.apply(expanded, val -> {
expanded.subscribe(val -> {
struc.get().pseudoClassStateChanged(EXPANDED, val);
});
struc.get().pseudoClassStateChanged(EVEN, section.getDepth() % 2 == 0);
@ -171,7 +170,7 @@ public class StoreSectionMiniComp extends Comp<CompStructure<VBox>> {
})
.apply(struc -> {
if (section.getWrapper() != null) {
SimpleChangeListener.apply(section.getWrapper().getColor(), val -> {
section.getWrapper().getColor().subscribe(val -> {
if (section.getDepth() != 1) {
return;
}

View file

@ -10,101 +10,70 @@ import io.xpipe.app.prefs.SupportedLocale;
import io.xpipe.app.util.OptionsBuilder;
import io.xpipe.app.util.Translatable;
import io.xpipe.core.util.ModuleHelper;
import io.xpipe.core.util.XPipeInstallation;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.StringBinding;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue;
import lombok.SneakyThrows;
import lombok.Value;
import org.apache.commons.io.FilenameUtils;
import org.ocpsoft.prettytime.PrettyTime;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Duration;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.UnaryOperator;
import java.util.regex.Pattern;
public class AppI18n {
private static final Pattern VAR_PATTERN = Pattern.compile("\\$\\w+?\\$");
private static final AppI18n INSTANCE = new AppI18n();
private Map<String, String> translations;
private Map<String, String> markdownDocumentations;
private PrettyTime prettyTime;
@Value
static class LoadedTranslations {
public static void init() {
var i = INSTANCE;
if (i.translations != null) {
return;
Map<String, String> translations;
Map<String, String> markdownDocumentations;
PrettyTime prettyTime;
}
i.load();
private static final Pattern VAR_PATTERN = Pattern.compile("\\$\\w+?\\$");
private static AppI18n INSTANCE;
private LoadedTranslations english;
private final Property<LoadedTranslations> currentLanguage = new SimpleObjectProperty<>();
public static void init() throws Exception {
INSTANCE = new AppI18n();
INSTANCE.load();
}
private void load() throws Exception {
if (english == null) {
english = load(Locale.ENGLISH);
}
if (AppPrefs.get() != null) {
AppPrefs.get().language().addListener((c, o, n) -> {
i.clear();
i.load();
AppPrefs.get().language().subscribe(n -> {
try {
currentLanguage.setValue(n != null ? load(n.getLocale()) : null);
} catch (Exception e) {
ErrorEvent.fromThrowable(e).handle();
}
});
}
}
public static AppI18n getInstance() {
public static AppI18n get() {
return INSTANCE;
}
public static StringBinding readableInstant(String s, ObservableValue<Instant> instant) {
return readableInstant(instant, rs -> getValue(getInstance().getLocalised(s), rs));
}
public static StringBinding readableInstant(ObservableValue<Instant> instant, UnaryOperator<String> op) {
return Bindings.createStringBinding(
() -> {
if (instant.getValue() == null) {
return "null";
}
return op.apply(
getInstance().prettyTime.format(instant.getValue().minus(Duration.ofSeconds(1))));
},
instant);
}
public static StringBinding readableInstant(ObservableValue<Instant> instant) {
return Bindings.createStringBinding(
() -> {
if (instant.getValue() == null) {
return "null";
}
return getInstance().prettyTime.format(instant.getValue().minus(Duration.ofSeconds(1)));
},
instant);
}
public static StringBinding readableDuration(ObservableValue<Duration> duration) {
return Bindings.createStringBinding(
() -> {
if (duration.getValue() == null) {
return "null";
}
return getInstance()
.prettyTime
.formatDuration(getInstance()
.prettyTime
.approximateDuration(Instant.now().plus(duration.getValue())));
},
duration);
private LoadedTranslations getLoaded() {
return currentLanguage.getValue() != null ? currentLanguage.getValue() : english;
}
public static ObservableValue<String> observable(String s, Object... vars) {
@ -115,7 +84,7 @@ public class AppI18n {
var key = INSTANCE.getKey(s);
return Bindings.createStringBinding(() -> {
return get(key, vars);
});
}, INSTANCE.currentLanguage);
}
public static String get(String s, Object... vars) {
@ -160,11 +129,6 @@ public class AppI18n {
return "";
}
private void clear() {
translations.clear();
prettyTime = null;
}
public String getKey(String s) {
var key = s;
if (!s.contains(".")) {
@ -173,62 +137,62 @@ public class AppI18n {
return key;
}
public boolean containsKey(String s) {
var key = getKey(s);
if (translations == null) {
return false;
}
return translations.containsKey(key);
}
public String getLocalised(String s, Object... vars) {
var key = getKey(s);
if (translations == null) {
if (english == null) {
TrackEvent.warn("Translations not initialized for " + key);
return s;
}
if (!translations.containsKey(key)) {
if (currentLanguage.getValue() != null && currentLanguage.getValue().getTranslations().containsKey(key)) {
var localisedString = currentLanguage.getValue().getTranslations().get(key);
return getValue(localisedString, vars);
}
if (english.getTranslations().containsKey(key)) {
var localisedString = english.getTranslations().get(key);
return getValue(localisedString, vars);
}
TrackEvent.warn("Translation key not found for " + key);
return key;
}
var localisedString = translations.get(key);
return getValue(localisedString, vars);
}
public boolean isLoaded() {
return translations != null;
}
private boolean matchesLocale(Path f) {
var l = AppPrefs.get() != null
? AppPrefs.get().language().getValue().getLocale()
: SupportedLocale.ENGLISH.getLocale();
private boolean matchesLocale(Path f, Locale l) {
var name = FilenameUtils.getBaseName(f.getFileName().toString());
var ending = "_" + l.toLanguageTag();
return name.endsWith(ending);
}
public String getMarkdownDocumentation(String name) {
if (!markdownDocumentations.containsKey(name)) {
if (currentLanguage.getValue() != null && currentLanguage.getValue().getMarkdownDocumentations().containsKey(name)) {
var localisedString = currentLanguage.getValue().getMarkdownDocumentations().get(name);
return localisedString;
}
if (english.getMarkdownDocumentations().containsKey(name)) {
var localisedString = english.getMarkdownDocumentations().get(name);
return localisedString;
}
TrackEvent.withWarn("Markdown documentation for key " + name + " not found")
.handle();
return "";
}
return markdownDocumentations.getOrDefault(name, "");
private Path getModuleLangPath(String module) {
return XPipeInstallation.getLangPath().resolve(module);
}
private void load() {
private LoadedTranslations load(Locale l) throws Exception {
TrackEvent.info("Loading translations ...");
translations = new HashMap<>();
var translations = new HashMap<String, String>();
for (var module : AppExtensionManager.getInstance().getContentModules()) {
AppResources.with(module.getName(), "lang", basePath -> {
var basePath = getModuleLangPath(FilenameUtils.getExtension(module.getName())).resolve("strings");
if (!Files.exists(basePath)) {
return;
continue;
}
AtomicInteger fileCounter = new AtomicInteger();
@ -238,7 +202,7 @@ public class AppI18n {
Files.walkFileTree(basePath, new SimpleFileVisitor<>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (!matchesLocale(file)) {
if (!matchesLocale(file, l)) {
return FileVisitResult.CONTINUE;
}
@ -249,7 +213,7 @@ public class AppI18n {
fileCounter.incrementAndGet();
try (var in = Files.newInputStream(file)) {
var props = new Properties();
props.load(in);
props.load(new InputStreamReader(in, StandardCharsets.UTF_8));
props.forEach((key, value) -> {
var hasPrefix = key.toString().contains(".");
var usedPrefix = hasPrefix ? "" : defaultPrefix;
@ -267,21 +231,20 @@ public class AppI18n {
.tag("fileCount", fileCounter.get())
.tag("lineCount", lineCounter.get())
.handle();
});
}
markdownDocumentations = new HashMap<>();
var markdownDocumentations = new HashMap<String, String>();
for (var module : AppExtensionManager.getInstance().getContentModules()) {
AppResources.with(module.getName(), "lang", basePath -> {
var basePath = getModuleLangPath(FilenameUtils.getExtension(module.getName())).resolve("texts");
if (!Files.exists(basePath)) {
return;
continue;
}
var moduleName = FilenameUtils.getExtension(module.getName());
Files.walkFileTree(basePath, new SimpleFileVisitor<>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (!matchesLocale(file)) {
if (!matchesLocale(file, l)) {
return FileVisitResult.CONTINUE;
}
@ -302,13 +265,14 @@ public class AppI18n {
return FileVisitResult.CONTINUE;
}
});
});
}
this.prettyTime = new PrettyTime(
var prettyTime = new PrettyTime(
AppPrefs.get() != null
? AppPrefs.get().language().getValue().getLocale()
: SupportedLocale.ENGLISH.getLocale());
return new LoadedTranslations(translations,markdownDocumentations, prettyTime);
}
@SuppressWarnings("removal")

View file

@ -3,7 +3,6 @@ package io.xpipe.app.core;
import atlantafx.base.theme.*;
import io.xpipe.app.ext.PrefsChoiceValue;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
@ -44,7 +43,7 @@ public class AppTheme {
return;
}
SimpleChangeListener.apply(AppPrefs.get().theme, t -> {
AppPrefs.get().theme.subscribe(t -> {
Theme.ALL.forEach(
theme -> stage.getScene().getRoot().getStyleClass().remove(theme.getCssId()));
if (t == null) {
@ -56,7 +55,7 @@ public class AppTheme {
stage.getScene().getRoot().pseudoClassStateChanged(DARK, t.isDark());
});
SimpleChangeListener.apply(AppPrefs.get().performanceMode(), val -> {
AppPrefs.get().performanceMode().subscribe(val -> {
stage.getScene().getRoot().pseudoClassStateChanged(PRETTY, !val);
stage.getScene().getRoot().pseudoClassStateChanged(PERFORMANCE, val);
});

View file

@ -47,6 +47,7 @@ public class BaseMode extends OperationMode {
AppI18n.init();
LicenseProvider.get().init();
AppPrefs.initLocal();
AppI18n.init();
AppCertutilCheck.check();
AppAvCheck.check();
AppSid.init();

View file

@ -6,7 +6,6 @@ import io.xpipe.app.fxcomps.augment.Augment;
import io.xpipe.app.fxcomps.augment.GrowAugment;
import io.xpipe.app.fxcomps.impl.FancyTooltipAugment;
import io.xpipe.app.fxcomps.util.Shortcuts;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.application.Platform;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
@ -144,7 +143,7 @@ public abstract class Comp<S extends CompStructure<?>> {
public Comp<S> hide(ObservableValue<Boolean> o) {
return apply(struc -> {
var region = struc.get();
SimpleChangeListener.apply(o, n -> {
o.subscribe(n -> {
if (!n) {
region.setVisible(true);
region.setManaged(true);

View file

@ -6,7 +6,6 @@ import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.SimpleCompStructure;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.util.Translatable;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleObjectProperty;
@ -72,7 +71,7 @@ public class ChoiceComp<T> extends Comp<CompStructure<ComboBox<T>>> {
throw new UnsupportedOperationException();
}
});
SimpleChangeListener.apply(range, c -> {
range.subscribe(c -> {
var list = FXCollections.observableArrayList(c.keySet());
if (!list.contains(null) && includeNone) {
list.add(null);
@ -84,7 +83,7 @@ public class ChoiceComp<T> extends Comp<CompStructure<ComboBox<T>>> {
cb.valueProperty().addListener((observable, oldValue, newValue) -> {
value.setValue(newValue);
});
SimpleChangeListener.apply(value, val -> {
value.subscribe(val -> {
PlatformThread.runLaterIfNeeded(() -> cb.valueProperty().set(val));
});

View file

@ -4,7 +4,6 @@ import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.SimpleCompStructure;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.property.Property;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
@ -58,7 +57,7 @@ public class ChoicePaneComp extends Comp<CompStructure<VBox>> {
var vbox = new VBox(transformer.apply(cb));
vbox.setFillWidth(true);
cb.prefWidthProperty().bind(vbox.widthProperty());
SimpleChangeListener.apply(cb.valueProperty(), n -> {
cb.valueProperty().subscribe(n -> {
if (n == null) {
if (vbox.getChildren().size() > 1) {
vbox.getChildren().remove(1);
@ -82,7 +81,7 @@ public class ChoicePaneComp extends Comp<CompStructure<VBox>> {
cb.valueProperty().addListener((observable, oldValue, newValue) -> {
selected.setValue(newValue);
});
SimpleChangeListener.apply(selected, val -> {
selected.subscribe(val -> {
PlatformThread.runLaterIfNeeded(() -> cb.valueProperty().set(val));
});

View file

@ -7,7 +7,6 @@ import io.xpipe.app.core.AppI18n;
import io.xpipe.app.core.AppWindowHelper;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.storage.ContextualFileReference;
@ -39,7 +38,7 @@ public class ContextualFileReferenceChoiceComp extends SimpleComp {
public <T extends FileSystemStore> ContextualFileReferenceChoiceComp(
ObservableValue<DataStoreEntryRef<T>> fileSystem, Property<String> filePath) {
this.fileSystem = new SimpleObjectProperty<>();
SimpleChangeListener.apply(fileSystem, val -> {
fileSystem.subscribe(val -> {
this.fileSystem.setValue(val);
});
this.filePath = filePath;

View file

@ -3,8 +3,10 @@ package io.xpipe.app.fxcomps.impl;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.augment.Augment;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.Shortcuts;
import javafx.beans.binding.Bindings;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.Tooltip;
@ -24,11 +26,15 @@ public class FancyTooltipAugment<S extends CompStructure<?>> implements Augment<
public void augment(S struc) {
var region = struc.get();
var tt = new Tooltip();
var toDisplay = text.getValue();
if (Shortcuts.getDisplayShortcut(region) != null) {
toDisplay = toDisplay + "\n\nShortcut: " + Shortcuts.getDisplayShortcut(region).getDisplayText();
var s = AppI18n.observable("shortcut");
var binding = Bindings.createStringBinding(() -> {
return text.getValue() + "\n\n" + s.getValue() + ": " + Shortcuts.getDisplayShortcut(region).getDisplayText();
}, text, s);
BindingsHelper.bindStrong(tt.textProperty(), binding);
} else {
BindingsHelper.bindStrong(tt.textProperty(),text);
}
tt.textProperty().setValue(toDisplay);
tt.setStyle("-fx-font-size: 11pt;");
tt.setWrapText(true);
tt.setMaxWidth(400);

View file

@ -1,10 +1,10 @@
package io.xpipe.app.fxcomps.impl;
import io.xpipe.app.core.AppActionLinkDetector;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.binding.Bindings;
import javafx.beans.property.Property;
import javafx.scene.Node;
@ -28,12 +28,13 @@ public class FilterComp extends Comp<FilterComp.Structure> {
@Override
public Structure createBase() {
var fi = new FontIcon("mdi2m-magnify");
var bgLabel = new Label("Search", fi);
var bgLabel = new Label(null, fi);
bgLabel.textProperty().bind(AppI18n.observable("searchFilter"));
bgLabel.getStyleClass().add("filter-background");
var filter = new TextField();
filter.setAccessibleText("Filter");
SimpleChangeListener.apply(filterText, val -> {
filterText.subscribe(val -> {
PlatformThread.runLaterIfNeeded(() -> {
if (!Objects.equals(filter.getText(), val)) {
filter.setText(val);

View file

@ -3,6 +3,7 @@ package io.xpipe.app.fxcomps.impl;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.SimpleCompStructure;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.PlatformThread;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
@ -24,6 +25,7 @@ public class LabelComp extends Comp<CompStructure<Label>> {
@Override
public CompStructure<Label> createBase() {
var label = new Label();
BindingsHelper.linkPersistently(label,text);
text.subscribe(t -> {
PlatformThread.runLaterIfNeeded(() -> label.setText(t));
});

View file

@ -3,7 +3,6 @@ package io.xpipe.app.fxcomps.impl;
import io.xpipe.app.core.AppImages;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.core.store.FileNames;
@ -106,7 +105,7 @@ public class PrettyImageComp extends SimpleComp {
}
};
SimpleChangeListener.apply(PlatformThread.sync(value), val -> update.accept(val));
PlatformThread.sync(value).subscribe(val -> update.accept(val));
AppPrefs.get().theme.addListener((observable, oldValue, newValue) -> {
update.accept(value.getValue());
});

View file

@ -3,7 +3,6 @@ package io.xpipe.app.fxcomps.impl;
import io.xpipe.app.core.AppImages;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.core.store.FileNames;
import javafx.beans.binding.Bindings;
@ -92,7 +91,7 @@ public class PrettySvgComp extends SimpleComp {
image.set(fixed);
};
SimpleChangeListener.apply(syncValue, val -> update.accept(val));
syncValue.subscribe(val -> update.accept(val));
AppPrefs.get().theme.addListener((observable, oldValue, newValue) -> {
update.accept(syncValue.getValue());
});

View file

@ -12,7 +12,6 @@ import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.augment.ContextMenuAugment;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreCategory;
import io.xpipe.app.util.ContextMenuHelper;
@ -115,7 +114,7 @@ public class StoreCategoryComp extends SimpleComp {
var v = new VerticalComp(List.of(categoryButton, children.hide(emptyBinding)));
v.styleClass("category");
v.apply(struc -> {
SimpleChangeListener.apply(StoreViewState.get().getActiveCategory(), val -> {
StoreViewState.get().getActiveCategory().subscribe(val -> {
struc.get().pseudoClassStateChanged(SELECTED, val.equals(category));
});
});

View file

@ -3,7 +3,6 @@ package io.xpipe.app.fxcomps.impl;
import io.xpipe.app.core.AppProperties;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ObservableValue;
@ -37,7 +36,7 @@ public class SvgView {
public static SvgView create(ObservableValue<String> content) {
var widthProperty = new SimpleIntegerProperty();
var heightProperty = new SimpleIntegerProperty();
SimpleChangeListener.apply(content, val -> {
content.subscribe(val -> {
if (val == null || val.isBlank()) {
return;
}
@ -69,7 +68,7 @@ public class SvgView {
wv.setDisable(true);
wv.getEngine().loadContent(svgContent.getValue() != null ? getHtml(svgContent.getValue()) : null);
SimpleChangeListener.apply(svgContent, n -> {
svgContent.subscribe( n -> {
if (n == null) {
wv.setOpacity(0.0);
return;

View file

@ -3,7 +3,6 @@ package io.xpipe.app.fxcomps.impl;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.binding.Bindings;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleStringProperty;
@ -28,7 +27,7 @@ public class TextAreaComp extends Comp<TextAreaComp.Structure> {
this.lastAppliedValue = value;
this.currentValue = new SimpleStringProperty(value.getValue());
this.lazy = lazy;
SimpleChangeListener.apply(value, val -> {
value.subscribe(val -> {
this.currentValue.setValue(val);
});
}

View file

@ -4,7 +4,6 @@ import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.SimpleCompStructure;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.TextField;
@ -27,7 +26,7 @@ public class TextFieldComp extends Comp<CompStructure<TextField>> {
this.currentValue = new SimpleStringProperty(value.getValue());
this.lazy = lazy;
if (!lazy) {
SimpleChangeListener.apply(currentValue, val -> {
currentValue.subscribe(val -> {
value.setValue(val);
});
}

View file

@ -5,7 +5,6 @@ import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.SimpleCompStructure;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.property.Property;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.ToggleButton;
@ -29,7 +28,7 @@ public class ToggleGroupComp<T> extends Comp<CompStructure<HBox>> {
var box = new HBox();
box.getStyleClass().add("toggle-group-comp");
ToggleGroup group = new ToggleGroup();
SimpleChangeListener.apply(PlatformThread.sync(range), val -> {
PlatformThread.sync(range).subscribe(val -> {
if (!val.containsKey(value.getValue())) {
this.value.setValue(null);
}

View file

@ -45,6 +45,11 @@ public class BindingsHelper {
.start();
}
public static <T> void bindStrong(Property<T> property, ObservableValue<T> value) {
property.bind(value);
linkPersistently(property, value);
}
public static <T, V> void bindExclusive(
Property<V> selected, Map<V, ? extends Property<T>> map, Property<T> toBind) {
selected.addListener((c, o, n) -> {
@ -219,7 +224,7 @@ public class BindingsHelper {
// public static <T,U> ObservableValue<U> mappedBinding(ObservableValue<T> observableValue, Function<? super T, ?
// extends ObservableValue<? extends U>> mapper) {
// var v = new SimpleObjectProperty<U>();
// SimpleChangeListener.apply(observableValue, val -> {
// observableValue, val -> {
// v.unbind();
// v.bind(mapper.apply(val));
// });

View file

@ -41,7 +41,7 @@ public class Shortcuts {
DISPLAY_SHORTCUTS.put(region, comb);
AtomicReference<Scene> scene = new AtomicReference<>();
SimpleChangeListener.apply(region.sceneProperty(), s -> {
region.sceneProperty().subscribe(s -> {
if (Objects.equals(s, scene.get())) {
return;
}

View file

@ -1,19 +0,0 @@
package io.xpipe.app.fxcomps.util;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
@FunctionalInterface
public interface SimpleChangeListener<T> {
static <T> void apply(ObservableValue<T> obs, SimpleChangeListener<T> cl) {
obs.addListener(cl.wrapped());
cl.onChange(obs.getValue());
}
void onChange(T val);
default ChangeListener<T> wrapped() {
return (observable, oldValue, newValue) -> this.onChange(newValue);
}
}

View file

@ -104,7 +104,7 @@ public class AppPrefs {
map(new SimpleBooleanProperty(false), "developerDisableGuiRestrictions", Boolean.class);
private final ObservableBooleanValue developerDisableGuiRestrictionsEffective =
bindDeveloperTrue(developerDisableGuiRestrictions);
private final ObjectProperty<SupportedLocale> language =
final ObjectProperty<SupportedLocale> language =
map(new SimpleObjectProperty<>(SupportedLocale.ENGLISH), "language", SupportedLocale.class);
@Getter

View file

@ -3,7 +3,6 @@ package io.xpipe.app.prefs;
import io.xpipe.app.core.AppFont;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.ScrollPane;
@ -28,7 +27,7 @@ public class AppPrefsComp extends SimpleComp {
.createRegion();
}));
var pfxSp = new ScrollPane();
SimpleChangeListener.apply(AppPrefs.get().getSelectedCategory(), val -> {
AppPrefs.get().getSelectedCategory().subscribe(val -> {
PlatformThread.runLaterIfNeeded(() -> {
pfxSp.setContent(map.get(val));
});

View file

@ -6,7 +6,6 @@ import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.impl.VerticalComp;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.css.PseudoClass;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
@ -27,7 +26,7 @@ public class AppPrefsSidebarComp extends SimpleComp {
.apply(struc -> {
struc.get().setTextAlignment(TextAlignment.LEFT);
struc.get().setAlignment(Pos.CENTER_LEFT);
SimpleChangeListener.apply(AppPrefs.get().getSelectedCategory(), val -> {
AppPrefs.get().getSelectedCategory().subscribe(val -> {
struc.get().pseudoClassStateChanged(SELECTED, appPrefsCategory.equals(val));
});
})
@ -36,7 +35,8 @@ public class AppPrefsSidebarComp extends SimpleComp {
.toList();
var vbox = new VerticalComp(buttons).styleClass("sidebar");
vbox.apply(struc -> {
SimpleChangeListener.apply(PlatformThread.sync(AppPrefs.get().getSelectedCategory()), val -> {
AppPrefs.get().getSelectedCategory().subscribe(val -> {
PlatformThread.runLaterIfNeeded(() -> {
var index = val != null ? AppPrefs.get().getCategories().indexOf(val) : 0;
if (index >= struc.get().getChildren().size()) {
return;
@ -45,6 +45,7 @@ public class AppPrefsSidebarComp extends SimpleComp {
((Button) struc.get().getChildren().get(index)).fire();
});
});
});
return vbox.createRegion();
}
}

View file

@ -9,6 +9,8 @@ import io.xpipe.app.fxcomps.impl.IntFieldComp;
import io.xpipe.app.util.OptionsBuilder;
import javafx.scene.control.Slider;
import java.util.Arrays;
public class AppearanceCategory extends AppPrefsCategory {
@Override
@ -22,6 +24,10 @@ public class AppearanceCategory extends AppPrefsCategory {
return new OptionsBuilder()
.addTitle("uiOptions")
.sub(new OptionsBuilder()
.nameAndDescription("language")
.addComp(
ChoiceComp.ofTranslatable(prefs.language, Arrays.asList(SupportedLocale.values()), false),
prefs.language)
.nameAndDescription("theme")
.addComp(
ChoiceComp.ofTranslatable(prefs.theme, AppTheme.Theme.ALL, false)

View file

@ -11,8 +11,8 @@ import java.util.Locale;
@AllArgsConstructor
@Getter
public enum SupportedLocale implements PrefsChoiceValue {
ENGLISH(Locale.ENGLISH, "english");
// GERMAN(Locale.GERMAN, "german");
ENGLISH(Locale.ENGLISH, "english"),
GERMAN(Locale.GERMAN, "german");
private final Locale locale;
private final String id;

View file

@ -4,7 +4,6 @@ import io.xpipe.app.comp.store.StoreCategoryWrapper;
import io.xpipe.app.comp.store.StoreViewState;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.property.Property;
import javafx.geometry.Insets;
import javafx.scene.control.ComboBox;
@ -28,7 +27,7 @@ public class DataStoreCategoryChoiceComp extends SimpleComp {
@Override
protected Region createSimple() {
SimpleChangeListener.apply(external, newValue -> {
external.subscribe(newValue -> {
if (newValue == null) {
value.setValue(root);
} else if (root == null) {

View file

@ -297,7 +297,7 @@ public class OptionsBuilder {
public OptionsBuilder longDescription(String descriptionKey) {
finishCurrent();
longDescription = AppI18n.getInstance().getMarkdownDocumentation(descriptionKey);
longDescription = AppI18n.get().getMarkdownDocumentation(descriptionKey);
return this;
}

View file

@ -7,7 +7,6 @@ import io.xpipe.app.core.AppI18n;
import io.xpipe.app.ext.ScanProvider;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.impl.DataStoreChoiceComp;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntry;
@ -168,7 +167,7 @@ public class ScanAlert {
})
.padding(new Insets(20));
SimpleChangeListener.apply(entry, newValue -> {
entry.subscribe(newValue -> {
selected.clear();
stackPane.getChildren().clear();

View file

@ -1,392 +0,0 @@
# Interface
addCollection=Add collection
newCollection=New collection
delete=Delete
rename=Rename
properties=Properties
usedDate=Used $DATE$
cols=$COLS$ columns
rowsCols=$ROWS$ rows / $COLS$ columns
lines=$LINES$ lines
objects=$OBJECTS$ objects
bytes=$BYTES$ bytes
entries=$ENTRIES$ entries
unknownLength=Unknown length
temporaryCollection=Temporary
entrySettings=Settings
pipe=Pipe
openDir=Open Directory
failedToLoad=Failed to Load
stores=Stores
# Dialogs
confirmCollectionDeletionTitle=Confirm collection deletion
confirmCollectionDeletionHeader=Do you really want to delete the collection $NAME$?
confirmCollectionDeletionContent=This will delete all ($COUNT$) contained data sources as well.
retrieveDataSource=Retrieve Data Source
# Tooltips
addCollectionFolder=Create new collection folder
collectionOptions=Collection options
addStreamDataSource=Add stream data source
addDatabaseDataSource=Add database data source
displayList=Display as list
displayTiles=Display as tiles
sortLastUsed=Sort by last used date
sortAlphabetical=Sort alphabetical by name
temporaryCollectionNote=All data sources inside the temporary collection are only stored while until the next system restart.
storeForLaterUse=Store for later use
localFile=Local File
network=Network
recentFiles=Recent files
newDataSource=New data source
newDataStore=New data store
selectInput=Select Input
configure=Configure
retrieve=Retrieve
internet=Internet
table=Table
update=Update
selectStreamStore=Select Stream Store
openStreamStoreWizard=Open Stream Store Wizard
updateDataSource=Update Data Source
structure=Structure
text=Text
raw=Raw
collection=Collection
anyFile=Any file
anyStream=Any Stream Type
noMatchingStoreFound=No suitable saved store was found
addStore=Add Store
anyStreamDescription=Or choose specific type
restart=Restart XPipe
restartDescription=A restart can often be a quick fix
reportIssue=Report Issue
reportIssueDescription=Open the integrated issue reporter
usefulActions=Useful actions
stored=Saved
troubleshootingOptions=Troubleshooting tools
troubleshoot=Troubleshoot
remote=Remote File
addShellStore=Add Shell ...
addShellTitle=Add Shell Connection
savedConnections=Saved Connections
save=Save
clean=Clean
refresh=Refresh
moveTo=Move to ...
addDatabase=Database ...
browseInternalStorage=Browse internal storage
addTunnel=Tunnel ...
addScript=Script ...
addHost=Remote Host ...
addShell=Shell Environment ...
addCommand=Custom Command ...
addAutomatically=Search Automatically ...
addOther=Add Other ...
addStreamTitle=Add Stream Store
addConnection=Add Connection
skip=Skip
addConnections=New
selectType=Select Type
selectTypeDescription=Select connection type
selectDatabaseType=Database Type
selectDatabaseTypeDescription=Select Type of the Database
selectShellType=Shell Type
selectShellTypeDescription=Select the Type of the Shell Connection
selectStreamType=Stream Type
selectStreamTypeDescription=Select type of the stream
name=Name
storeIntroTitle=Connection Hub
storeIntroDescription=Here you can manage all your local and remote shell connections in one place. To start off, you can quickly detect available connections automatically and choose which ones to add.
detectConnections=Search for connections
configuration=Configuration
dragAndDropFilesHere=Or just drag and drop a file here
confirmDsCreationAbortTitle=Confirm abort
confirmDsCreationAbortHeader=Do you want to abort the data source creation?
confirmDsCreationAbortContent=Any data source creation progress will be lost.
confirmInvalidStoreTitle=Failed connection
confirmInvalidStoreHeader=Do you want to skip connection validation?
confirmInvalidStoreContent=You can add this connection even if it could not be validated and fix the connection problems later on.
charset=Charset
newLine=Newline
crlf=CRLF (Windows)
lf=LF (Linux)
none=None
expand=Expand
accessSubConnections=Access sub connections
common=Common
key=Key
color=Color
roadmap=Roadmap and feature requests
alwaysConfirmElevation=Always confirm elevation
alwaysConfirmElevationDescription=Controls how to handle cases when elevated access is required to run a command on a system, e.g. with sudo.\n\nBy default, any sudo credentials are cached during a session and automatically provided when needed. If this option is enabled, it will ask you to confirm the elevation access every time.
allow=Allow
ask=Ask
deny=Deny
elevationRequestTitle=Elevation request
elevationRequestHeader=A command on $SYSTEM$ requires elevation. Do you want to allow this?
elevationRequestDescription=Continuing from here XPipe will try to elevate commands when needed. Aborting will cancel the operation.
share=Add to git repository
unshare=Remove from git repository
remove=Remove
newCategory=New subcategory
passwordManager=Password manager
prompt=Prompt
customCommand=Custom command
other=Other
setLock=Set lock
selectConnection=Select connection
changeLock=Change passphrase
test=Test
lockCreationAlertTitle=Set passphrase
lockCreationAlertHeader=Set your new master passphrase
finish=Finish
error=An error occurred
downloadStageDescription=Downloads files to your local machine, so you can drag and drop them into your native desktop environment.
ok=Ok
search=Search
newFile=New file
newDirectory=New directory
passphrase=Passphrase
repeatPassphrase=Repeat passphrase
password=Password
unlockAlertTitle=Unlock workspace
unlockAlertHeader=Enter your vault passphrase to continue
enterLockPassword=Enter lock password
repeatPassword=Repeat password
askpassAlertTitle=Askpass
nullPointer=Null Pointer
unsupportedOperation=Unsupported operation: $MSG$
fileConflictAlertTitle=Resolve conflict
fileConflictAlertHeader=A conflict was encountered. How would you like to proceed?
fileConflictAlertContent=The file $FILE$ does already exist on the target system.
fileConflictAlertContentMultiple=The file $FILE$ already exists. There might be more conflicts that you can automatically resolve by choosing an option that applies to all.
moveAlertTitle=Confirm move
moveAlertHeader=Do you want to move the ($COUNT$) selected elements into $TARGET$?
deleteAlertTitle=Confirm deletion
deleteAlertHeader=Do you want to delete the ($COUNT$) selected elements?
selectedElements=Selected elements:
mustNotBeEmpty=$VALUE$ must not be empty
valueMustNotBeEmpty=Value must not be empty
transferDescription=Drop files to transfer
dragFiles=Drag files within browser
dragLocalFiles=Drag local files from here
null=$VALUE$ must be not null
roots=Roots
terminator=Terminator
kitty=Kitty
terminology=Terminology
coolRetroTerm=Cool Retro Term
guake=Guake
alacritty=Alacritty
tilda=Tilda
xterm=XTerm
deepinTerminal=Deepin Terminal
qTerminal=QTerminal
recent=Recent
hostFeatureUnsupported=$FEATURE$ is not installed on the host
missingStore=$NAME$ does not exist
connectionName=Connection name
connectionNameDescription=Give this connection a custom name
openFileTitle=Open file
unknown=Unknown
scanAlertTitle=Add connections
scanAlertChoiceHeader=Target
scanAlertChoiceHeaderDescription=Choose where to search for connections. This will look for all available connections first.
scanAlertHeader=Connection types
scanAlertHeaderDescription=Select types of connections you want to automatically add for the system.
namedHostFeatureUnsupported=$HOST$ does not support this feature
namedHostNotActive=$HOST$ is not active
noInformationAvailable=No information available
localMachine=Local Machine
input=Input
output=Output
inout=Transformation
inputDescription=This store only produces input for data sources to read
outputDescription=This store only accepts output from data sources to write
inoutDescription=This store uses both input and output to essentially create a data transformation
replace=Replace
append=Append
prepend=Prepend
replaceDescription=Replaces all content
appendDescription=Appends the new content to the existing content
prependDescription=Prepends the new content to the existing content
yes=Yes
no=No
connectorInstallationTitle=XPipe Connector
connectorInstallationHeader=Would you like to install the XPipe connector on that host?
connectorInstallationContent=Some operations require the XPipe connector to be installed on the host. Note that this operation may take some time.
errorOccured=An error occured
terminalErrorOccured=A terminal error occured
errorTypeOccured=An exception of type $TYPE$ was thrown
permissionsAlertTitle=Permissions required
permissionsAlertHeader=Additional permissions are required to perform this operation.
permissionsAlertContent=Please follow the pop-up to give XPipe the required permissions in the settings menu.
errorDetails=Show details
target=Target
data=Data
more=More
pipeDataSource=Pipe Data Source
updateReadyAlertTitle=Update Ready
updateReadyAlertHeader=An update to version $VERSION$ is ready to be installed
updateReadyAlertContent=This will install the new version and restart XPipe once the installation finished.
errorNoDetail=No error details are available
updateAvailableTitle=Update Available
updateAvailableHeader=An XPipe update to version $VERSION$ is available to install
updateAvailableContent=Even though XPipe could not be started, you can attempt to install the update to potentially fix the issue.
clipboardActionDetectedTitle=Clipboard Action detected
clipboardActionDetectedHeader=Do you want to import your clipboard content?
clipboardActionDetectedContent=XPipe detected content in your clipboard that can be opened. Do you want to open it now?
install=Install ...
ignore=Ignore
possibleActions=Possible actions
reportError=Report error
reportOnGithub=Report on GitHub
reportOnGithubDescription=Open a new issue in the GitHub repository
reportErrorDescription=Send an error report with optional user feedback and diagnostics info
ignoreError=Ignore error
ignoreErrorDescription=Ignore this error and continue like nothing happened
provideEmail=How to contact you (optional, only if you want to get notified about fixes)
additionalErrorInfo=Provide additional information (optional)
additionalErrorAttachments=Select attachments (optional)
dataHandlingPolicies=Privacy policy
sendReport=Send report
errorHandler=Error handler
events=Events
method=Method
validate=Validate
confirmTableMappingTitle=Confirm Table Mapping
confirmTableMapping=Please confirm the automatically determined table mapping:
changeTableMapping=In case you are not satisfied with this mapping, take a look at how to customize data flows:
discarded=Discarded
stackTrace=Stack trace
previousStep=< Previous
nextStep=Next >
finishStep=Finish
machine=Machine
noMatchingSourceFound=No matching source found
addSource=Add Source
edit=Edit
addStream=Add File
pipeStream=Pipe File
pipeDatabase=Pipe Database
transfer=Transfer
browseInternal=Browse Internal
checkOutUpdate=Check out update
# Tray
open=Open
quit=Quit
# DS preview
normal=Normal
normalDescription=The data source contents are queried from the original source each time it is accessed.
cached=Cache
cachedDescription=The data source contents are cached, i.e. stored temporarily such that the original data source does not have to accessed every time. The caching state can be refreshed at any time.
managed=Manage copy
editDataSource=Edit Data Source
managedDescription=The data source contents are copied to an internally managed file, i.e. the original data source is never accessed again after creation.
storageType=Access mode:
setupGuide=Guide
recentlyUsed=Recently used
programmingLanguages=Programming languages
applications=Applications
addMore=Add more
vscode=Visual Studio Code
vscodium=VSCodium
vscodeInsiders=Visual Studio Code Insiders
kate=Kate
gedit=GEdit
gnomeTextEditor=Gnome Text Editor
leafpad=Leafpad
mousepad=Mousepad
pluma=Pluma
noTerminalSet=No terminal application has been set automatically. You can do so manually in the settings menu.
textEdit=Text Edit
sublime=Sublime Text
newTable=new_table
editRaw=Edit Raw
file=File
# Sidebar
overview=Sources
connections=Connections
settings=Settings
explorePlans=License
help=Help
account=Account
about=About
developer=Developer
# Comps
browseFileTitle=Browse file
browse=Browse
browser=Browser
selectFileFromComputer=Select a file from this computer
# About
links=Useful links
website=Website
documentation=Documentation
discord=Discord
discordDescription=Join the Discord server
security=Security
securityPolicy=Security information
securityPolicyDescription=Read the detailed security policy
privacy=Privacy Policy
privacyDescription=Read the privacy policy for the XPipe application
slack=Slack
slackDescription=Join the Slack workspace
support=Support
github=GitHub
githubDescription=Check out the GitHub repository
openSourceNotices=Open Source Notices
xPipeClient=XPipe Desktop
checkForUpdates=Check for updates
checkForUpdatesDescription=Download an update if there is one
lastChecked=Last checked
version=Version
build=Build
runtimeVersion=Runtime version
virtualMachine=Virtual machine
updateReady=Install update
updateReadyPortable=Check out update
updateReadyDescription=An update was downloaded and is ready to be installed
updateReadyDescriptionPortable=An update is available to download
updateRestart=Restart to update
never=Never
updateAvailableTooltip=Update available
visitGithubRepository=Visit GitHub repository
updateAvailable=Update available: $VERSION$
downloadUpdate=Download update
legalAccept=I accept the End User License Agreement
confirm=Confirm
print=Print
whatsNew=What's new in version $VERSION$ ($DATE$)
antivirusNoticeTitle=A note on Antivirus programs
malwarebytesNoticeTitle=A note on Malwarebytes
updateChangelogAlertTitle=Changelog
greetingsAlertTitle=Welcome to XPipe
gotIt=Got It
eula=End User License Agreement
news=News
introduction=Introduction
privacyPolicy=Privacy Policy
agree=Agree
disagree=Disagree
directories=Directories
logFile=Log File
logFiles=Log Files
logFilesAttachment=Log Files
issueReporter=Issue Reporter
openCurrentLogFile=Log files
openCurrentLogFileDescription=Open the log file of the current session
openLogsDirectory=Open logs directory
installationFiles=Installation Files
openInstallationDirectory=Installation files
openInstallationDirectoryDescription=Open XPipe installation directory
launchDebugMode=Debug mode
launchDebugModeDescription=Restart XPipe in debug mode
extensionInstallTitle=Download
extensionInstallDescription=This action requires additional third party libraries that are not distributed by XPipe. You can automatically install them here. The components are then downloaded from the vendor website:
extensionInstallLicenseNote=By performing the download and automatic installation you agree to the terms of the third party licenses:
license=License
installRequired=Installation Required
restore=Restore
restoreAllSessions=Restore all sessions

View file

@ -104,6 +104,7 @@ project.ext {
if (signingPassword == null) {
signingPassword = ''
}
deeplApiKey = findProperty('DEEPL_API_KEY')
}
if (org.gradle.internal.os.OperatingSystem.current() == org.gradle.internal.os.OperatingSystem.LINUX) {

View file

@ -295,6 +295,22 @@ public class XPipeInstallation {
return path;
}
public static Path getLangPath() {
if (!ModuleHelper.isImage()) {
return getCurrentInstallationBasePath().resolve("lang");
}
var install = getCurrentInstallationBasePath();
var type = OsType.getLocal();
if (type.equals(OsType.WINDOWS)) {
return install.resolve("app").resolve("lang");
} else if (type.equals(OsType.LINUX)) {
return install.resolve("app").resolve("lang");
} else {
return install.resolve("Contents").resolve("Resources").resolve("lang");
}
}
public static Path getBundledFontsPath() {
if (!ModuleHelper.isImage()) {
return Path.of("dist", "fonts");

1
dist/build.gradle vendored
View file

@ -91,6 +91,7 @@ if (rootProject.fullVersion) {
apply from: 'choco.gradle'
apply from: 'winget.gradle'
apply from: 'install.gradle'
apply from: 'i18n.gradle'
signing {
useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword)

View file

@ -1,3 +0,0 @@
displayName=Mein Dateiformat
description=Meine Dateiformat-Beschreibung
fileName=Mein Dateiformat Datei

View file

@ -0,0 +1,56 @@
cmd=cmd.exe
powershell=Powershell
pwsh=Powershell Core
windowsTerminal=Windows Terminal
windowsTerminalPreview=Windows Terminal Preview
gnomeTerminal=Gnome Terminal
createLock=Create lock
tilix=Tilix
wezterm=WezTerm
konsole=Konsole
xfce=Xfce 4
elementaryTerminal=Elementary Terminal
macosTerminal=Terminal.app
iterm2=iTerm2
warp=Warp
tabby=Tabby
alacritty=Alacritty
alacrittyMacOs=Alacritty
kittyMacOs=Kitty
bbedit=BBEdit
fleet=Fleet
intellij=IntelliJ IDEA
pycharm=PyCharm
webstorm=WebStorm
clion=CLion
tabbyMacOs=Tabby
notepad++=Notepad++
notepad++Windows=Notepad++
notepad++Linux=Notepad++
notepad=Notepad
terminator=Terminator
kitty=Kitty
terminology=Terminology
coolRetroTerm=Cool Retro Term
guake=Guake
tilda=Tilda
xterm=XTerm
deepinTerminal=Deepin Terminal
qTerminal=QTerminal
vscode=Visual Studio Code
vscodium=VSCodium
vscodeInsiders=Visual Studio Code Insiders
kate=Kate
gedit=GEdit
gnomeTextEditor=Gnome Text Editor
leafpad=Leafpad
mousepad=Mousepad
pluma=Pluma
textEdit=Text Edit
sublime=Sublime Text
customTerminalPlaceholder=myterminal -e $CMD
customEditorPlaceholder=myeditor $FILE
nullPointer=Null Pointer
discord=Discord
slack=Slack
github=GitHub

View file

@ -0,0 +1,407 @@
delete=Löschen
rename=Umbenennen
properties=Eigenschaften
usedDate=Verwendet $DATE$
openDir=Verzeichnis öffnen
sortLastUsed=Nach dem Datum der letzten Verwendung sortieren
sortAlphabetical=Alphabetisch nach Namen sortieren
restart=XPipe neu starten
restartDescription=Ein Neustart kann oft eine schnelle Lösung sein
reportIssue=Bericht Ausgabe
reportIssueDescription=Öffne den integrierten Issue Reporter
usefulActions=Nützliche Aktionen
stored=Gespeicherte
troubleshootingOptions=Werkzeuge zur Fehlersuche
troubleshoot=Fehlerbehebung
remote=Entfernte Datei
addShellStore=Shell hinzufügen ...
addShellTitle=Shell-Verbindung hinzufügen
savedConnections=Gespeicherte Verbindungen
save=Speichern
clean=Reinigen
refresh=Aktualisieren
moveTo=Wechseln zu ...
addDatabase=Datenbank ...
browseInternalStorage=Internen Speicher durchsuchen
addTunnel=Tunnel ...
addScript=Skript ...
#custom
addHost=Remote Host ...
addShell=Shell-Umgebung ...
addCommand=Benutzerdefinierter Befehl ...
addAutomatically=Automatisch suchen ...
addOther=Andere hinzufügen ...
addConnection=Verbindung hinzufügen
skip=Überspringen
addConnections=Neu
selectType=Typ auswählen
selectTypeDescription=Verbindungstyp auswählen
selectShellType=Shell-Typ
selectShellTypeDescription=Wählen Sie den Typ der Shell-Verbindung
name=Name
storeIntroTitle=Verbindungs-Hub
storeIntroDescription=Hier kannst du alle deine lokalen und entfernten Shell-Verbindungen an einem Ort verwalten. Für den Anfang kannst du verfügbare Verbindungen schnell und automatisch erkennen und auswählen, welche du hinzufügen möchtest.
detectConnections=Suche nach Verbindungen
configuration=Konfiguration
dragAndDropFilesHere=Oder ziehe eine Datei einfach per Drag & Drop hierher
confirmDsCreationAbortTitle=Abbruch bestätigen
confirmDsCreationAbortHeader=Willst du die Erstellung der Datenquelle abbrechen?
confirmDsCreationAbortContent=Alle Fortschritte bei der Erstellung von Datenquellen gehen verloren.
confirmInvalidStoreTitle=Fehlgeschlagene Verbindung
confirmInvalidStoreHeader=Willst du die Verbindungsüberprüfung überspringen?
confirmInvalidStoreContent=Du kannst diese Verbindung hinzufügen, auch wenn sie nicht validiert werden konnte, und die Verbindungsprobleme später beheben.
none=Keine
expand=Erweitern Sie
accessSubConnections=Zugang zu Unterverbindungen
common=Allgemein
color=Farbe
alwaysConfirmElevation=Höhe immer bestätigen
alwaysConfirmElevationDescription=Legt fest, wie mit Fällen umgegangen werden soll, in denen erhöhter Zugriff erforderlich ist, um einen Befehl auf einem System auszuführen, z. B. mit sudo.\n\ Standardmäßig werden alle sudo-Anmeldedaten während einer Sitzung zwischengespeichert und bei Bedarf automatisch bereitgestellt. Wenn diese Option aktiviert ist, wirst du jedes Mal aufgefordert, den erweiterten Zugriff zu bestätigen.
allow=Erlaube
ask=Frag
deny=Verweigern
share=Zum Git-Repository hinzufügen
unshare=Aus dem Git-Repository entfernen
remove=Entfernen
newCategory=Neue Unterkategorie
passwordManager=Passwort-Manager
prompt=Eingabeaufforderung
customCommand=Benutzerdefinierter Befehl
other=Andere
setLock=Sperre setzen
selectConnection=Verbindung auswählen
changeLock=Passphrase ändern
test=Test
lockCreationAlertTitle=Passphrase festlegen
lockCreationAlertHeader=Lege deine neue Master-Passphrase fest
finish=Beende
error=Ein Fehler ist aufgetreten
downloadStageDescription=Lädt Dateien auf deinen lokalen Rechner herunter, damit du sie per Drag & Drop in deine native Desktopumgebung ziehen kannst.
ok=Ok
search=Suche
newFile=Neue Datei
newDirectory=Neues Verzeichnis
passphrase=Passphrase
repeatPassphrase=Passphrase wiederholen
password=Passwort
unlockAlertTitle=Arbeitsbereich freischalten
unlockAlertHeader=Gib deine Tresor-Passphrase ein, um fortzufahren
enterLockPassword=Passwort für die Sperre eingeben
repeatPassword=Passwort wiederholen
askpassAlertTitle=Askpass
unsupportedOperation=Nicht unterstützte Operation: $MSG$
fileConflictAlertTitle=Konflikt auflösen
fileConflictAlertHeader=Es ist ein Konflikt aufgetreten. Wie möchtest du vorgehen?
fileConflictAlertContent=Die Datei $FILE$ existiert bereits auf dem Zielsystem.
fileConflictAlertContentMultiple=Die Datei $FILE$ existiert bereits. Es kann weitere Konflikte geben, die du automatisch lösen kannst, indem du eine Option wählst, die für alle gilt.
moveAlertTitle=Umzug bestätigen
moveAlertHeader=Willst du die ($COUNT$) ausgewählten Elemente in $TARGET$ verschieben?
deleteAlertTitle=Bestätigung der Löschung
deleteAlertHeader=Willst du die ($COUNT$) ausgewählten Elemente löschen?
selectedElements=Ausgewählte Elemente:
mustNotBeEmpty=$VALUE$ darf nicht leer sein
valueMustNotBeEmpty=Der Wert darf nicht leer sein
transferDescription=Dateien zum Übertragen ablegen
dragFiles=Dateien im Browser ziehen
dragLocalFiles=Lokale Dateien von hier ziehen
null=$VALUE$ muss nicht null sein
roots=Wurzeln
scripts=Skripte
searchFilter=Suche ...
recent=Zuletzt
shortcut=Shortcut
browserWelcomeEmpty=Hier kannst du sehen, wo du beim letzten Mal aufgehört hast.
browserWelcomeSystems=Du warst vor kurzem mit den folgenden Systemen verbunden:
hostFeatureUnsupported=$FEATURE$ ist nicht auf dem Host installiert
missingStore=$NAME$ gibt es nicht
connectionName=Name der Verbindung
connectionNameDescription=Gib dieser Verbindung einen eigenen Namen
openFileTitle=Datei öffnen
unknown=Unbekannt
scanAlertTitle=Verbindungen hinzufügen
scanAlertChoiceHeader=Ziel
scanAlertChoiceHeaderDescription=Wähle aus, wo du nach Verbindungen suchen willst. Es wird zuerst nach allen verfügbaren Verbindungen gesucht.
scanAlertHeader=Verbindungsarten
scanAlertHeaderDescription=Wähle die Arten von Verbindungen aus, die du automatisch für das System hinzufügen möchtest.
noInformationAvailable=Keine Informationen verfügbar
localMachine=Lokale Maschine
yes=Ja
no=Nein
errorOccured=Ein Fehler ist aufgetreten
terminalErrorOccured=Ein Terminalfehler ist aufgetreten
errorTypeOccured=Eine Ausnahme des Typs $TYPE$ wurde ausgelöst
permissionsAlertTitle=Erforderliche Berechtigungen
permissionsAlertHeader=Für die Durchführung dieses Vorgangs sind zusätzliche Berechtigungen erforderlich.
permissionsAlertContent=Bitte folge dem Pop-up, um XPipe im Einstellungsmenü die erforderlichen Berechtigungen zu erteilen.
errorDetails=Details anzeigen
updateReadyAlertTitle=Update bereit
updateReadyAlertHeader=Ein Update auf die Version $VERSION$ ist bereit zur Installation
updateReadyAlertContent=Dadurch wird die neue Version installiert und XPipe neu gestartet, sobald die Installation abgeschlossen ist.
errorNoDetail=Es sind keine Fehlerdetails verfügbar
updateAvailableTitle=Update verfügbar
updateAvailableHeader=Ein XPipe-Update auf die Version $VERSION$ steht zur Installation bereit
updateAvailableContent=Auch wenn XPipe nicht gestartet werden konnte, kannst du versuchen, das Update zu installieren, um das Problem möglicherweise zu beheben.
clipboardActionDetectedTitle=Zwischenablage Aktion erkannt
clipboardActionDetectedHeader=Willst du den Inhalt deiner Zwischenablage importieren?
clipboardActionDetectedContent=XPipe hat einen Inhalt in deiner Zwischenablage gefunden, der geöffnet werden kann. Willst du ihn jetzt öffnen?
install=Installieren ...
ignore=Ignorieren
possibleActions=Mögliche Aktionen
reportError=Fehler melden
reportOnGithub=Bericht auf GitHub
reportOnGithubDescription=Eröffne ein neues Thema im GitHub-Repository
reportErrorDescription=Senden eines Fehlerberichts mit optionalem Benutzerfeedback und Diagnoseinformationen
ignoreError=Fehler ignorieren
ignoreErrorDescription=Ignoriere diesen Fehler und mach weiter, als wäre nichts passiert
provideEmail=Wie kann ich dich kontaktieren (optional, nur wenn du über Korrekturen benachrichtigt werden möchtest)
additionalErrorInfo=Zusätzliche Informationen bereitstellen (optional)
additionalErrorAttachments=Anhänge auswählen (optional)
dataHandlingPolicies=Datenschutzrichtlinie
sendReport=Bericht senden
errorHandler=Fehlerhandler
events=Ereignisse
method=Methode
validate=Validieren
stackTrace=Stack-Trace
previousStep=< Vorherige
nextStep=Weiter >
finishStep=Beende
edit=Bearbeiten
browseInternal=Intern durchsuchen
checkOutUpdate=Update auschecken
open=Öffnen
quit=Beenden
noTerminalSet=Es wurde keine Terminalanwendung automatisch eingestellt. Du kannst dies manuell im Einstellungsmenü tun.
connections=Verbindungen
settings=Einstellungen
explorePlans=Lizenz
help=Hilfe
about=Über
developer=Entwickler
browseFileTitle=Datei durchsuchen
browse=Durchsuchen
browser=Browser
selectFileFromComputer=Eine Datei von diesem Computer auswählen
links=Nützliche Links
website=Website
documentation=Dokumentation
discordDescription=Dem Discord-Server beitreten
security=Sicherheit
securityPolicy=Sicherheitsinformationen
securityPolicyDescription=Lies die detaillierte Sicherheitsrichtlinie
privacy=Datenschutzrichtlinie
privacyDescription=Lies die Datenschutzbestimmungen für die XPipe-Anwendung
slackDescription=Dem Slack-Arbeitsbereich beitreten
support=Unterstützung
githubDescription=Schau dir das GitHub-Repository an
openSourceNotices=Open-Source-Hinweise
xPipeClient=XPipe Desktop
checkForUpdates=Nach Updates suchen
checkForUpdatesDescription=Ein Update herunterladen, wenn es eins gibt
lastChecked=Zuletzt geprüft
version=Version
build=Version erstellen
runtimeVersion=Laufzeitversion
virtualMachine=Virtuelle Maschine
updateReady=Update installieren
updateReadyPortable=Update auschecken
updateReadyDescription=Ein Update wurde heruntergeladen und ist bereit zur Installation
updateReadyDescriptionPortable=Ein Update ist zum Download verfügbar
updateRestart=Neustart zur Aktualisierung
never=Niemals
updateAvailableTooltip=Update verfügbar
visitGithubRepository=GitHub Repository besuchen
updateAvailable=Update verfügbar: $VERSION$
downloadUpdate=Update herunterladen
legalAccept=Ich akzeptiere die Endbenutzer-Lizenzvereinbarung
confirm=Bestätige
print=Drucken
whatsNew=Was ist neu in der Version $VERSION$ ($DATE$)
antivirusNoticeTitle=Ein Hinweis auf Antivirenprogramme
updateChangelogAlertTitle=Changelog
greetingsAlertTitle=Willkommen bei XPipe
gotIt=Verstanden
eula=Endbenutzer-Lizenzvertrag
news=Nachrichten
introduction=Einführung
privacyPolicy=Datenschutzrichtlinie
agree=Zustimmen
disagree=Widerspreche
directories=Verzeichnisse
logFile=Log-Datei
logFiles=Log-Dateien
logFilesAttachment=Log-Dateien
issueReporter=Ausgabe Reporter
openCurrentLogFile=Log-Dateien
openCurrentLogFileDescription=Die Protokolldatei der aktuellen Sitzung öffnen
openLogsDirectory=Logs-Verzeichnis öffnen
installationFiles=Installationsdateien
openInstallationDirectory=Installationsdateien
openInstallationDirectoryDescription=XPipe-Installationsverzeichnis öffnen
launchDebugMode=Debug-Modus
launchDebugModeDescription=XPipe im Debug-Modus neu starten
extensionInstallTitle=Herunterladen
extensionInstallDescription=Diese Aktion erfordert zusätzliche Bibliotheken von Drittanbietern, die nicht von XPipe vertrieben werden. Du kannst sie hier automatisch installieren. Die Komponenten werden dann von der Website des Anbieters heruntergeladen:
extensionInstallLicenseNote=Durch das Herunterladen und die automatische Installation erklärst du dich mit den Bedingungen der Lizenzen von Drittanbietern einverstanden:
license=Lizenz
installRequired=Installation erforderlich
restore=Wiederherstellen
restoreAllSessions=Alle Sitzungen wiederherstellen
connectionTimeout=Zeitüberschreitung beim Verbindungsstart
connectionTimeoutDescription=Die Zeit in Sekunden, die auf eine Antwort gewartet wird, bevor eine Verbindung als beendet gilt. Wenn einige deiner Fernsysteme lange brauchen, um sich zu verbinden, kannst du versuchen, diesen Wert zu erhöhen.
useBundledTools=Gebündelte OpenSSH-Tools verwenden
useBundledToolsDescription=Ziehe die gebündelte Version des openssh-Clients deiner lokal installierten Version vor.\n\nDiese Version ist in der Regel aktueller als die auf deinem System mitgelieferte und unterstützt möglicherweise zusätzliche Funktionen. Damit entfällt auch die Notwendigkeit, diese Tools überhaupt zu installieren.\n\nZur Anwendung ist ein Neustart erforderlich.
appearance=Erscheinungsbild
integrations=Integrationen
uiOptions=UI Optionen
theme=Thema
localShell=Lokale Shell
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?
gitShareFileTooltip=Datei zum Git Vault-Datenverzeichnis hinzufügen, damit sie automatisch synchronisiert wird.\n\n Diese Aktion kann nur verwendet werden, wenn der Git Vault in den Einstellungen aktiviert ist.
performanceMode=Leistungsmodus
performanceModeDescription=Deaktiviert alle visuellen Effekte, die nicht zur Verbesserung der Anwendungsleistung erforderlich sind.
dontAcceptNewHostKeys=Neue SSH-Hostschlüssel nicht automatisch akzeptieren
dontAcceptNewHostKeysDescription=XPipe akzeptiert standardmäßig automatisch Hostschlüssel von Systemen, auf denen dein SSH-Client keinen bekannten Hostschlüssel gespeichert hat. Wenn sich jedoch ein bekannter Host-Schlüssel geändert hat, wird die Verbindung verweigert, bis du den neuen Schlüssel akzeptierst.\n\nWenn du dieses Verhalten deaktivierst, kannst du alle Host-Schlüssel überprüfen, auch wenn es zunächst keinen Konflikt gibt.
uiScale=UI-Skala
uiScaleDescription=Ein benutzerdefinierter Skalierungswert, der unabhängig von der systemweiten Anzeigeskala eingestellt werden kann. Die Werte sind in Prozent angegeben, d.h. ein Wert von 150 führt zu einer Skalierung der Benutzeroberfläche von 150%.\n\nDie Anwendung erfordert einen Neustart.
editorProgram=Editor Programm
editorProgramDescription=Der Standard-Texteditor, der beim Bearbeiten von Textdaten aller Art verwendet wird.
windowOpacity=Fenster-Opazität
windowOpacityDescription=Ändert die Deckkraft des Fensters, um zu verfolgen, was im Hintergrund passiert.
useSystemFont=Systemschriftart verwenden
openDataDir=Verzeichnis der Tresordaten
openDataDirButton=Datenverzeichnis öffnen
openDataDirDescription=Wenn du zusätzliche Dateien, wie z.B. SSH-Schlüssel, systemübergreifend mit deinem Git-Repository synchronisieren möchtest, kannst du sie in das Verzeichnis Speicherdaten legen. Bei allen Dateien, die dort referenziert werden, werden die Dateipfade auf allen synchronisierten Systemen automatisch angepasst.
updates=Aktualisiert
passwordKey=Passwortschlüssel
selectAll=Alles auswählen
command=Befehl
advanced=Fortgeschrittene
thirdParty=Open-Source-Hinweise
eulaDescription=Lies die Endbenutzer-Lizenzvereinbarung für die XPipe-Anwendung
thirdPartyDescription=Die Open-Source-Lizenzen von Bibliotheken Dritter anzeigen
workspaceLock=Master-Passphrase
enableGitStorage=Git-Synchronisation einschalten
sharing=Teilen
sync=Synchronisation
enableGitStorageDescription=Wenn diese Funktion aktiviert ist, initialisiert XPipe ein Git-Repository für die Speicherung der Verbindungsdaten und überträgt alle Änderungen in dieses Repository. Beachte, dass dafür git installiert sein muss und dass dies die Lade- und Speichervorgänge verlangsamen kann.\n\nAlle Kategorien, die synchronisiert werden sollen, müssen explizit als gemeinsam genutzt gekennzeichnet werden.\n\nErfordert einen Neustart, um angewendet zu werden.
storageGitRemote=Git Remote URL
storageGitRemoteDescription=Wenn diese Option gesetzt ist, zieht XPipe beim Laden automatisch alle Änderungen und überträgt sie beim Speichern an das entfernte Repository. So kannst du deine Konfigurationsdaten zwischen mehreren XPipe-Installationen austauschen. Es werden sowohl HTTP- als auch SSH-URLs unterstützt. Beachte, dass dies die Lade- und Speichervorgänge verlangsamen kann.\n\nErfordert einen Neustart zur Anwendung.
vault=Tresor
workspaceLockDescription=Legt ein benutzerdefiniertes Passwort fest, um alle in XPipe gespeicherten sensiblen Daten zu verschlüsseln. Dies erhöht die Sicherheit, da es eine zusätzliche Verschlüsselungsebene für deine gespeicherten sensiblen Daten bietet. Du wirst dann beim Start von XPipe aufgefordert, das Passwort einzugeben.
useSystemFontDescription=Legt fest, ob deine Systemschriftart oder die von XPipe verwendete Standardschriftart (Roboto) verwendet werden soll.
tooltipDelay=Tooltip-Verzögerung
tooltipDelayDescription=Die Anzahl der Millisekunden, die gewartet wird, bis ein Tooltip angezeigt wird.
fontSize=Schriftgröße
windowOptions=Fensteroptionen
saveWindowLocation=Speicherort des Fensters
saveWindowLocationDescription=Legt fest, ob die Fensterkoordinaten gespeichert und bei Neustarts wiederhergestellt werden sollen.
startupShutdown=Starten / Herunterfahren
showChildCategoriesInParentCategory=Unterkategorien in der übergeordneten Kategorie anzeigen
showChildCategoriesInParentCategoryDescription=Ob alle Verbindungen, die sich in Unterkategorien befinden, einbezogen werden sollen, wenn eine bestimmte übergeordnete Kategorie ausgewählt wird.\n\nWenn dies deaktiviert ist, verhalten sich die Kategorien eher wie klassische Ordner, die nur ihren direkten Inhalt zeigen, ohne Unterordner einzubeziehen.
condenseConnectionDisplay=Verbindungsanzeige verdichten
condenseConnectionDisplayDescription=Nimm für jede Verbindung der obersten Ebene weniger Platz in der Vertikalen ein, um die Verbindungsliste zu komprimieren.
enforceWindowModality=Fenstermodalität erzwingen
enforceWindowModalityDescription=Bewirkt, dass sekundäre Fenster, wie z. B. das Dialogfeld zum Herstellen einer Verbindung, alle Eingaben für das Hauptfenster blockieren, solange sie geöffnet sind. Das ist nützlich, wenn du manchmal falsch klickst.
openConnectionSearchWindowOnConnectionCreation=Fenster für die Verbindungssuche bei der Verbindungserstellung öffnen
openConnectionSearchWindowOnConnectionCreationDescription=Ob beim Hinzufügen einer neuen Shell-Verbindung automatisch das Fenster zur Suche nach verfügbaren Unterverbindungen geöffnet werden soll oder nicht.
workflow=Workflow
system=System
application=Anwendung
storage=Speicherung
runOnStartup=Beim Starten ausführen
closeBehaviour=Verhalten schließen
closeBehaviourDescription=Legt fest, wie XPipe beim Schließen des Hauptfensters vorgehen soll.
language=Sprache
languageDescription=Die zu verwendende Anzeigesprache.\n\nBeachte, dass diese automatische Übersetzungen als Basis verwenden und über Beiträge angepasst werden.
lightTheme=Licht-Thema
darkTheme=Dunkles Thema
exit=XPipe beenden
continueInBackground=Weiter im Hintergrund
minimizeToTray=In die Taskleiste minimieren
closeBehaviourAlertTitle=Schließverhalten einstellen
closeBehaviourAlertTitleHeader=Wähle aus, was beim Schließen des Fensters passieren soll. Alle aktiven Verbindungen werden geschlossen, wenn die Anwendung heruntergefahren wird.
startupBehaviour=Startverhalten
startupBehaviourDescription=Steuert das Standardverhalten der Desktop-Anwendung, wenn XPipe gestartet wird.
clearCachesAlertTitle=Cache säubern
clearCachesAlertTitleHeader=Willst du alle XPipe-Caches löschen?
clearCachesAlertTitleContent=Beachte, dass dadurch alle Daten gelöscht werden, die zur Verbesserung des Nutzererlebnisses gespeichert wurden.
startGui=GUI starten
startInTray=Start im Tray
startInBackground=Start im Hintergrund
clearCaches=Caches löschen ...
clearCachesDescription=Alle Cache-Daten löschen
apply=Anwenden
cancel=Abbrechen
notAnAbsolutePath=Kein absoluter Pfad
notADirectory=Nicht ein Verzeichnis
notAnEmptyDirectory=Kein leeres Verzeichnis
automaticallyUpdate=Nach Updates suchen
automaticallyUpdateDescription=Wenn diese Funktion aktiviert ist, werden Informationen über neue Versionen automatisch abgerufen, während XPipe läuft. Es wird kein Updater im Hintergrund ausgeführt, und du musst die Installation von Updates immer noch explizit bestätigen.
sendAnonymousErrorReports=Anonyme Fehlerberichte senden
sendUsageStatistics=Anonyme Nutzungsstatistiken senden
storageDirectory=Speicherverzeichnis
storageDirectoryDescription=Der Ort, an dem XPipe alle Verbindungsinformationen speichern soll. Diese Einstellung wird erst beim nächsten Neustart übernommen. Wenn du diese Einstellung änderst, werden die Daten aus dem alten Verzeichnis nicht in das neue kopiert.
logLevel=Log-Level
appBehaviour=Verhalten der Anwendung
logLevelDescription=Die Protokollstufe, die beim Schreiben von Protokolldateien verwendet werden sollte.
developerMode=Entwickler-Modus
developerModeDescription=Wenn diese Option aktiviert ist, hast du Zugriff auf eine Reihe von zusätzlichen Optionen, die für die Entwicklung nützlich sind. Nur aktiv nach einem Neustart.
editor=Editor
custom=Benutzerdefiniert
passwordManagerCommand=Passwortmanager-Befehl
passwordManagerCommandDescription=Der Befehl, der ausgeführt werden soll, um Passwörter abzurufen. Der Platzhalterstring $KEY wird beim Aufruf durch den zitierten Passwortschlüssel ersetzt. Dies sollte deinen Passwortmanager CLI aufrufen, um das Passwort auf stdout auszugeben, z.B. mypassmgr get $KEY.\n\nDann kannst du den Schlüssel so einstellen, dass er immer dann abgerufen wird, wenn du eine Verbindung aufbaust, die ein Passwort erfordert.
passwordManagerCommandTest=Passwort-Manager testen
passwordManagerCommandTestDescription=Du kannst hier testen, ob die Ausgabe korrekt aussieht, wenn du einen Passwortmanager-Befehl eingerichtet hast. Der Befehl sollte nur das Passwort selbst auf stdout ausgeben, keine andere Formatierung sollte in der Ausgabe enthalten sein.
preferEditorTabs=Lieber neue Tabs öffnen
preferEditorTabsDescription=Legt fest, ob XPipe versuchen soll, neue Tabs in dem von dir gewählten Editor zu öffnen, anstatt neue Fenster zu öffnen.\n\nBeachte, dass nicht jeder Editor dies unterstützt.
customEditorCommand=Benutzerdefinierter Editor-Befehl
customEditorCommandDescription=Der Befehl, der ausgeführt werden soll, um den benutzerdefinierten Editor zu starten.\n\nDie Platzhalterzeichenfolge $FILE wird beim Aufruf durch den absoluten Dateinamen in Anführungszeichen ersetzt. Denke daran, den ausführbaren Pfad deines Editors in Anführungszeichen zu setzen, wenn er Leerzeichen enthält.
editorReloadTimeout=Zeitüberschreitung beim Neuladen des Editors
editorReloadTimeoutDescription=Die Anzahl der Millisekunden, die gewartet wird, bevor eine Datei nach einer Aktualisierung gelesen wird. Dadurch werden Probleme vermieden, wenn dein Editor beim Schreiben oder Freigeben von Dateisperren langsam ist.
encryptAllVaultData=Alle Tresordaten verschlüsseln
encryptAllVaultDataDescription=Wenn diese Option aktiviert ist, wird jeder Teil der Verbindungsdaten im Tresor verschlüsselt und nicht nur die Geheimnisse innerhalb der Daten. Dadurch wird eine weitere Sicherheitsebene für andere Parameter wie Benutzernamen, Hostnamen usw. geschaffen, die im Tresor standardmäßig nicht verschlüsselt sind.\n\nDiese Option macht den Verlauf und die Diffs deines Git-Tresors unbrauchbar, da du die ursprünglichen Änderungen nicht mehr sehen kannst, sondern nur noch die binären Änderungen.
vaultSecurity=Tresor-Sicherheit
developerDisableUpdateVersionCheck=Update-Versionsprüfung deaktivieren
developerDisableUpdateVersionCheckDescription=Legt fest, ob der Update-Checker die Versionsnummer bei der Suche nach einem Update ignorieren soll.
developerDisableGuiRestrictions=GUI-Einschränkungen deaktivieren
developerDisableGuiRestrictionsDescription=Steuert, ob bestimmte deaktivierte Aktionen noch über die Benutzeroberfläche ausgeführt werden können.
developerShowHiddenEntries=Versteckte Einträge anzeigen
developerShowHiddenEntriesDescription=Wenn aktiviert, werden versteckte und interne Datenquellen angezeigt.
developerShowHiddenProviders=Versteckte Anbieter anzeigen
developerShowHiddenProvidersDescription=Legt fest, ob versteckte und interne Verbindungs- und Datenquellenanbieter im Erstellungsdialog angezeigt werden sollen.
developerDisableConnectorInstallationVersionCheck=Connector-Versionsprüfung deaktivieren
developerDisableConnectorInstallationVersionCheckDescription=Legt fest, ob der Update-Checker die Versionsnummer ignoriert, wenn er die Version eines XPipe-Anschlusses prüft, der auf einem entfernten Computer installiert ist.
shellCommandTest=Shell-Befehlstest
shellCommandTestDescription=Führe einen Befehl in der Shell-Sitzung aus, die intern von XPipe verwendet wird.
terminal=Terminal
terminalEmulator=Terminal-Emulator
terminalConfiguration=Terminal-Konfiguration
editorConfiguration=Editor-Konfiguration
defaultApplication=Standardanwendung
terminalEmulatorDescription=Das Standardterminal, das beim Öffnen einer beliebigen Shell-Verbindung verwendet wird. Diese Anwendung wird nur zu Anzeigezwecken verwendet, das gestartete Shell-Programm hängt von der Shell-Verbindung selbst ab.
program=Programm
customTerminalCommand=Benutzerdefinierter Terminalbefehl
customTerminalCommandDescription=Der auszuführende Befehl, um das benutzerdefinierte Terminal mit einem bestimmten Befehl zu öffnen.\n\nXPipe erstellt ein temporäres Launcher-Shell-Skript für dein Terminal, das ausgeführt wird. Die Platzhalterzeichenfolge $CMD in dem von dir angegebenen Befehl wird beim Aufruf durch das eigentliche Launcher-Skript ersetzt. Denke daran, den ausführbaren Pfad deines Terminals in Anführungszeichen zu setzen, wenn er Leerzeichen enthält.
preferTerminalTabs=Lieber neue Tabs öffnen
preferTerminalTabsDisabled=Ziehe es vor, neue Tabs zu öffnen.\n\n Das aktuell ausgewählte Terminal $TERM$ unterstützt das Öffnen von Tabs über das CLI nicht.
preferTerminalTabsDescription=Legt fest, ob XPipe versucht, neue Tabs in dem von dir gewählten Terminal zu öffnen, anstatt neue Fenster zu öffnen.\n\nBeachte, dass nicht jedes Terminal dies unterstützt.
clearTerminalOnInit=Terminal bei Init löschen
clearTerminalOnInitDescription=Wenn diese Funktion aktiviert ist, führt XPipe einen Löschbefehl aus, wenn eine neue Terminalsitzung gestartet wird, um unnötige Ausgaben zu entfernen.
enableFastTerminalStartup=Schnelles Starten des Terminals aktivieren
enableFastTerminalStartupDescription=Wenn diese Option aktiviert ist, werden Terminalsitzungen nach Möglichkeit schneller gestartet.\n\n Dadurch werden einige Startprüfungen übersprungen und die angezeigten Systeminformationen nicht aktualisiert. Eventuelle Verbindungsfehler werden nur im Terminal angezeigt.
dontCachePasswords=Aufgeforderte Passwörter nicht zwischenspeichern
dontCachePasswordsDescription=Legt fest, ob abgefragte Passwörter von XPipe intern zwischengespeichert werden sollen, damit du sie in der aktuellen Sitzung nicht erneut eingeben musst.\n\nIst dieses Verhalten deaktiviert, musst du die abgefragten Anmeldedaten jedes Mal neu eingeben, wenn sie vom System verlangt werden.
denyTempScriptCreation=Temporäre Skripterstellung verweigern
denyTempScriptCreationDescription=Um einige seiner Funktionen zu realisieren, erstellt XPipe manchmal temporäre Shell-Skripte auf einem Zielsystem, um die einfache Ausführung einfacher Befehle zu ermöglichen. Diese enthalten keine sensiblen Informationen und werden nur zu Implementierungszwecken erstellt.\n\nWenn dieses Verhalten deaktiviert ist, erstellt XPipe keine temporären Dateien auf einem entfernten System. Diese Option ist in hochsicheren Kontexten nützlich, in denen jede Dateisystemänderung überwacht wird. Wenn diese Option deaktiviert ist, funktionieren einige Funktionen, z. B. Shell-Umgebungen und Skripte, nicht wie vorgesehen.
disableCertutilUse=Die Verwendung von certutil unter Windows deaktivieren
useLocalFallbackShell=Lokale Fallback-Shell verwenden
useLocalFallbackShellDescription=Wechsle zu einer anderen lokalen Shell, um lokale Vorgänge zu bearbeiten. Unter Windows ist dies die PowerShell, auf anderen Systemen die Bourne Shell.\n\nDiese Option kann verwendet werden, wenn die normale lokale Standard-Shell deaktiviert oder bis zu einem gewissen Grad beschädigt ist. Einige Funktionen funktionieren möglicherweise nicht wie erwartet, wenn diese Option aktiviert ist.\n\nDie Anwendung erfordert einen Neustart.
disableCertutilUseDescription=Aufgrund verschiedener Unzulänglichkeiten und Bugs in cmd.exe werden temporäre Shell-Skripte mit certutil erstellt, indem es zur Dekodierung von base64-Eingaben verwendet wird, da cmd.exe bei Nicht-ASCII-Eingaben versagt. XPipe kann dafür auch die PowerShell verwenden, aber das ist langsamer.\n\nDamit wird die Verwendung von certutil auf Windows-Systemen deaktiviert, um einige Funktionen zu realisieren und stattdessen auf die PowerShell zurückzugreifen. Das könnte einige AVs freuen, da einige von ihnen die Verwendung von certutil blockieren.
disableTerminalRemotePasswordPreparation=Terminal-Fernpasswortvorbereitung deaktivieren
disableTerminalRemotePasswordPreparationDescription=In Situationen, in denen eine Remote-Shell-Verbindung, die über mehrere Zwischensysteme geht, im Terminal aufgebaut werden soll, kann es erforderlich sein, alle erforderlichen Kennwörter auf einem der Zwischensysteme vorzubereiten, damit alle Abfragen automatisch ausgefüllt werden können.\n\nWenn du nicht möchtest, dass die Kennwörter jemals an ein Zwischensystem übertragen werden, kannst du dieses Verhalten deaktivieren. Jedes erforderliche Zwischenpasswort wird dann beim Öffnen im Terminal selbst abgefragt.
more=Mehr

View file

@ -1,14 +1,270 @@
delete=Delete
rename=Rename
properties=Properties
usedDate=Used $DATE$
openDir=Open Directory
sortLastUsed=Sort by last used date
sortAlphabetical=Sort alphabetical by name
restart=Restart XPipe
restartDescription=A restart can often be a quick fix
reportIssue=Report Issue
reportIssueDescription=Open the integrated issue reporter
usefulActions=Useful actions
stored=Saved
troubleshootingOptions=Troubleshooting tools
troubleshoot=Troubleshoot
remote=Remote File
addShellStore=Add Shell ...
addShellTitle=Add Shell Connection
savedConnections=Saved Connections
save=Save
#context: verb
clean=Clean
refresh=Refresh
moveTo=Move to ...
addDatabase=Database ...
browseInternalStorage=Browse internal storage
addTunnel=Tunnel ...
addScript=Script ...
addHost=Remote Host ...
addShell=Shell Environment ...
addCommand=Custom Command ...
addAutomatically=Search Automatically ...
addOther=Add Other ...
addConnection=Add Connection
skip=Skip
addConnections=New
selectType=Select Type
selectTypeDescription=Select connection type
selectShellType=Shell Type
selectShellTypeDescription=Select the Type of the Shell Connection
name=Name
storeIntroTitle=Connection Hub
storeIntroDescription=Here you can manage all your local and remote shell connections in one place. To start off, you can quickly detect available connections automatically and choose which ones to add.
detectConnections=Search for connections
configuration=Configuration
dragAndDropFilesHere=Or just drag and drop a file here
confirmDsCreationAbortTitle=Confirm abort
confirmDsCreationAbortHeader=Do you want to abort the data source creation?
confirmDsCreationAbortContent=Any data source creation progress will be lost.
confirmInvalidStoreTitle=Failed connection
confirmInvalidStoreHeader=Do you want to skip connection validation?
confirmInvalidStoreContent=You can add this connection even if it could not be validated and fix the connection problems later on.
none=None
expand=Expand
accessSubConnections=Access sub connections
#context: noun, not rare
common=Common
color=Color
alwaysConfirmElevation=Always confirm elevation
alwaysConfirmElevationDescription=Controls how to handle cases when elevated access is required to run a command on a system, e.g. with sudo.\n\nBy default, any sudo credentials are cached during a session and automatically provided when needed. If this option is enabled, it will ask you to confirm the elevation access every time.
allow=Allow
ask=Ask
deny=Deny
share=Add to git repository
unshare=Remove from git repository
remove=Remove
newCategory=New subcategory
passwordManager=Password manager
prompt=Prompt
customCommand=Custom command
other=Other
setLock=Set lock
selectConnection=Select connection
changeLock=Change passphrase
test=Test
lockCreationAlertTitle=Set passphrase
lockCreationAlertHeader=Set your new master passphrase
#context: verb, exit
finish=Finish
error=An error occurred
downloadStageDescription=Downloads files to your local machine, so you can drag and drop them into your native desktop environment.
ok=Ok
search=Search
newFile=New file
newDirectory=New directory
passphrase=Passphrase
repeatPassphrase=Repeat passphrase
password=Password
unlockAlertTitle=Unlock workspace
unlockAlertHeader=Enter your vault passphrase to continue
enterLockPassword=Enter lock password
repeatPassword=Repeat password
askpassAlertTitle=Askpass
unsupportedOperation=Unsupported operation: $MSG$
fileConflictAlertTitle=Resolve conflict
fileConflictAlertHeader=A conflict was encountered. How would you like to proceed?
fileConflictAlertContent=The file $FILE$ does already exist on the target system.
fileConflictAlertContentMultiple=The file $FILE$ already exists. There might be more conflicts that you can automatically resolve by choosing an option that applies to all.
moveAlertTitle=Confirm move
moveAlertHeader=Do you want to move the ($COUNT$) selected elements into $TARGET$?
deleteAlertTitle=Confirm deletion
deleteAlertHeader=Do you want to delete the ($COUNT$) selected elements?
selectedElements=Selected elements:
mustNotBeEmpty=$VALUE$ must not be empty
valueMustNotBeEmpty=Value must not be empty
transferDescription=Drop files to transfer
dragFiles=Drag files within browser
dragLocalFiles=Drag local files from here
null=$VALUE$ must be not null
roots=Roots
scripts=Scripts
searchFilter=Search ...
#context: last used
recent=Recent
shortcut=Shortcut
browserWelcomeEmpty=Here you will be able to see where you left off last time.
browserWelcomeSystems=You were recently connected to the following systems:
hostFeatureUnsupported=$FEATURE$ is not installed on the host
missingStore=$NAME$ does not exist
connectionName=Connection name
connectionNameDescription=Give this connection a custom name
openFileTitle=Open file
unknown=Unknown
scanAlertTitle=Add connections
scanAlertChoiceHeader=Target
scanAlertChoiceHeaderDescription=Choose where to search for connections. This will look for all available connections first.
scanAlertHeader=Connection types
scanAlertHeaderDescription=Select types of connections you want to automatically add for the system.
noInformationAvailable=No information available
localMachine=Local Machine
yes=Yes
no=No
errorOccured=An error occured
terminalErrorOccured=A terminal error occured
errorTypeOccured=An exception of type $TYPE$ was thrown
permissionsAlertTitle=Permissions required
permissionsAlertHeader=Additional permissions are required to perform this operation.
permissionsAlertContent=Please follow the pop-up to give XPipe the required permissions in the settings menu.
errorDetails=Show details
updateReadyAlertTitle=Update Ready
updateReadyAlertHeader=An update to version $VERSION$ is ready to be installed
updateReadyAlertContent=This will install the new version and restart XPipe once the installation finished.
errorNoDetail=No error details are available
updateAvailableTitle=Update Available
updateAvailableHeader=An XPipe update to version $VERSION$ is available to install
updateAvailableContent=Even though XPipe could not be started, you can attempt to install the update to potentially fix the issue.
clipboardActionDetectedTitle=Clipboard Action detected
clipboardActionDetectedHeader=Do you want to import your clipboard content?
clipboardActionDetectedContent=XPipe detected content in your clipboard that can be opened. Do you want to open it now?
install=Install ...
ignore=Ignore
possibleActions=Possible actions
reportError=Report error
reportOnGithub=Report on GitHub
reportOnGithubDescription=Open a new issue in the GitHub repository
reportErrorDescription=Send an error report with optional user feedback and diagnostics info
ignoreError=Ignore error
ignoreErrorDescription=Ignore this error and continue like nothing happened
provideEmail=How to contact you (optional, only if you want to get notified about fixes)
additionalErrorInfo=Provide additional information (optional)
additionalErrorAttachments=Select attachments (optional)
dataHandlingPolicies=Privacy policy
sendReport=Send report
errorHandler=Error handler
events=Events
method=Method
validate=Validate
stackTrace=Stack trace
previousStep=< Previous
nextStep=Next >
finishStep=Finish
edit=Edit
browseInternal=Browse Internal
checkOutUpdate=Check out update
open=Open
quit=Quit
noTerminalSet=No terminal application has been set automatically. You can do so manually in the settings menu.
connections=Connections
settings=Settings
explorePlans=License
help=Help
about=About
developer=Developer
browseFileTitle=Browse file
browse=Browse
browser=Browser
selectFileFromComputer=Select a file from this computer
links=Useful links
website=Website
documentation=Documentation
discordDescription=Join the Discord server
security=Security
securityPolicy=Security information
securityPolicyDescription=Read the detailed security policy
privacy=Privacy Policy
privacyDescription=Read the privacy policy for the XPipe application
slackDescription=Join the Slack workspace
support=Support
githubDescription=Check out the GitHub repository
openSourceNotices=Open Source Notices
xPipeClient=XPipe Desktop
checkForUpdates=Check for updates
checkForUpdatesDescription=Download an update if there is one
lastChecked=Last checked
version=Version
build=Build version
runtimeVersion=Runtime version
virtualMachine=Virtual machine
updateReady=Install update
updateReadyPortable=Check out update
updateReadyDescription=An update was downloaded and is ready to be installed
updateReadyDescriptionPortable=An update is available to download
updateRestart=Restart to update
never=Never
updateAvailableTooltip=Update available
visitGithubRepository=Visit GitHub repository
updateAvailable=Update available: $VERSION$
downloadUpdate=Download update
legalAccept=I accept the End User License Agreement
#context: verb
confirm=Confirm
#context: verb
print=Print
whatsNew=What's new in version $VERSION$ ($DATE$)
antivirusNoticeTitle=A note on Antivirus programs
updateChangelogAlertTitle=Changelog
greetingsAlertTitle=Welcome to XPipe
#context: understood
gotIt=Got It
eula=End User License Agreement
news=News
introduction=Introduction
privacyPolicy=Privacy Policy
agree=Agree
disagree=Disagree
directories=Directories
logFile=Log File
logFiles=Log Files
logFilesAttachment=Log Files
issueReporter=Issue Reporter
openCurrentLogFile=Log files
openCurrentLogFileDescription=Open the log file of the current session
openLogsDirectory=Open logs directory
installationFiles=Installation Files
openInstallationDirectory=Installation files
openInstallationDirectoryDescription=Open XPipe installation directory
launchDebugMode=Debug mode
launchDebugModeDescription=Restart XPipe in debug mode
extensionInstallTitle=Download
extensionInstallDescription=This action requires additional third party libraries that are not distributed by XPipe. You can automatically install them here. The components are then downloaded from the vendor website:
extensionInstallLicenseNote=By performing the download and automatic installation you agree to the terms of the third party licenses:
license=License
installRequired=Installation Required
restore=Restore
restoreAllSessions=Restore all sessions
connectionTimeout=Connection start timeout
connectionTimeoutDescription=The time in seconds to wait for a response before considering a connection to be timed out. If some of your remote systems take long to connect, you can try to increase this value.
useBundledTools=Use bundled OpenSSH tools
useBundledToolsDescription=Prefer to use bundled version of the openssh client instead of your locally installed one.\n\nThis version is usually more up-to-date than the ones shipped on your system and might support additional features. This also removes the requirement to have these tools installed in the first place.\n\nRequires restart to apply.
connections=Connections
appearance=Appearance
integrations=Integrations
uiOptions=UI Options
#context: display theme
theme=Theme
localShell=Local shell
themeDescription=You preferred theme
#context: display theme
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
@ -23,8 +279,6 @@ uiScaleDescription=A custom scaling value that can be set independently of your
editorProgram=Editor Program
editorProgramDescription=The default text editor to use when editing any kind of text data.
windowOpacity=Window opacity
customTerminalPlaceholder=myterminal -e $CMD
customEditorPlaceholder=myeditor $FILE
windowOpacityDescription=Changes the window opacity to keep track of what is happening in the background.
useSystemFont=Use system font
openDataDir=Vault data directory
@ -66,14 +320,16 @@ openConnectionSearchWindowOnConnectionCreationDescription=Whether or not to auto
workflow=Workflow
system=System
application=Application
updateToPrereleases=Include prereleases
updateToPrereleasesDescription=When enabled, the update check will also look for available prereleases in addition to full releases.
storage=Storage
runOnStartup=Run on startup
#context: setting
closeBehaviour=Close behaviour
closeBehaviourDescription=Controls how XPipe should proceed upon closing its main window.
language=Language
languageDescription=The display language to use.\n\nNote that these use automatic translations as a base and are adapted via contributions.
#context: display theme
lightTheme=Light Theme
#context: display theme
darkTheme=Dark Theme
exit=Quit XPipe
continueInBackground=Continue in background
@ -90,7 +346,6 @@ startInTray=Start in tray
startInBackground=Start in background
clearCaches=Clear caches ...
clearCachesDescription=Delete all cache data
ok=OK
apply=Apply
cancel=Cancel
notAnAbsolutePath=Not an absolute path
@ -122,13 +377,6 @@ editorReloadTimeoutDescription=The amount of milliseconds to wait before reading
encryptAllVaultData=Encrypt all vault data
encryptAllVaultDataDescription=When enabled, every part of the vault connection data will be encrypted as opposed to only secrets within in that data. This adds another layer of security for other parameters like usernames, hostnames, etc., that are not encrypted by default in the vault.\n\nThis option will render your git vault history and diffs useless as you can't see the original changes anymore, only binary changes.
vaultSecurity=Vault security
securityPolicy=Security policy
notepad++=Notepad++
notepad++Windows=Notepad++
notepad++Linux=Notepad++
notepad=Notepad
security=Security
developer=Developer
developerDisableUpdateVersionCheck=Disable Update Version Check
developerDisableUpdateVersionCheckDescription=Controls whether the update checker will ignore the version number when looking for an update.
developerDisableGuiRestrictions=Disable GUI restrictions
@ -141,23 +389,6 @@ developerDisableConnectorInstallationVersionCheck=Disable Connector Version Chec
developerDisableConnectorInstallationVersionCheckDescription=Controls whether the update checker will ignore the version number when inspecting the version of an XPipe connector installed on a remote machine.
shellCommandTest=Shell Command Test
shellCommandTestDescription=Run a command in the shell session used internally by XPipe.
konsole=Konsole
xfce=Xfce 4
elementaryTerminal=Elementary Terminal
macosTerminal=Terminal.app
iterm2=iTerm2
warp=Warp
tabby=Tabby
alacritty=Alacritty
alacrittyMacOs=Alacritty
kittyMacOs=Kitty
bbedit=BBEdit
fleet=Fleet
intellij=IntelliJ IDEA
pycharm=PyCharm
webstorm=WebStorm
clion=CLion
tabbyMacOs=Tabby
terminal=Terminal
terminalEmulator=Terminal emulator
terminalConfiguration=Terminal configuration
@ -184,12 +415,4 @@ useLocalFallbackShellDescription=Switch to using another local shell to handle l
disableCertutilUseDescription=Due to several shortcomings and bugs in cmd.exe, temporary shell scripts are created with certutil by using it to decode base64 input as cmd.exe breaks on non-ASCII input. XPipe can also use PowerShell for that but this will be slower.\n\nThis disables any use of certutil on Windows systems to realize some functionality and fall back to PowerShell instead. This might please some AVs as some of them block certutil usage.
disableTerminalRemotePasswordPreparation=Disable terminal remote password preparation
disableTerminalRemotePasswordPreparationDescription=In situations where a remote shell connection that goes through multiple intermediate systems should be established in the terminal, there might be a requirement to prepare any required passwords on one of the intermediate systems to allow for an automatic filling of any prompts.\n\nIf you don't want the passwords to ever be transferred to any intermediate system, you can disable this behavior. Any required intermediate password will then be queried in the terminal itself when opened.
cmd=cmd.exe
powershell=Powershell
pwsh=Powershell Core
windowsTerminal=Windows Terminal
windowsTerminalPreview=Windows Terminal Preview
gnomeTerminal=Gnome Terminal
createLock=Create lock
tilix=Tilix
wezterm=WezTerm
more=More

View file

@ -0,0 +1,76 @@
localMachine=Lokale Maschine
destination=Ziel
configuration=Konfiguration
launch=Starten
start=Start
stop=Stopp
pause=Pause
refresh=Aktualisieren
options=Optionen
newFile=Neue Datei
newLink=Neuer Link
linkName=Link-Name
scanConnections=Verfügbare Verbindungen finden ...
observe=Beobachten beginnen
stopObserve=Beobachten stoppen
createShortcut=Desktop-Verknüpfung erstellen
browseFiles=Dateien durchsuchen
clone=Klonen
targetPath=Zielpfad
newDirectory=Neues Verzeichnis
copyShareLink=Link kopieren
selectStore=Laden auswählen
saveSource=Für später speichern
execute=Führen Sie aus
deleteChildren=Alle Kinder entfernen
descriptionDescription=Gib dieser Gruppe eine optionale Beschreibung
selectSource=Quelle auswählen
commandLineRead=Aktualisieren
commandLineWrite=Schreibe
wslHost=WSL-Host
timeout=Timeout
additionalOptions=Zusätzliche Optionen
type=Typ
input=Eingabe
machine=Maschine
container=Container
host=Host
port=Port
user=Benutzer
password=Passwort
method=Methode
uri=URL
distribution=Vertrieb
username=Benutzername
shellType=Shell-Typ
command=Befehl
browseFile=Datei durchsuchen
openShell=Shell öffnen
editFile=Datei bearbeiten
usage=Verwendung
description=Beschreibung
open=Öffnen
edit=Bearbeiten
scriptContents=Skript-Inhalte
scriptContentsDescription=Die auszuführenden Skriptbefehle
snippets=Skript-Abhängigkeiten
snippetsDescription=Andere Skripte, die zuerst ausgeführt werden sollen
snippetsDependenciesDescription=Alle möglichen Skripte, die ggf. ausgeführt werden sollten
isDefault=Wird in allen kompatiblen Shells auf init ausgeführt
bringToShells=An alle kompatiblen Shells bringen
isDefaultGroup=Alle Gruppenskripte auf der Shell init ausführen
executionType=Ausführungsart
executionTypeDescription=Wann dieses Snippet ausgeführt werden soll
minimumShellDialect=Shell-Typ
minimumShellDialectDescription=Der erforderliche Shell-Typ für dieses Skript
dumbOnly=Nur stumm
terminalOnly=Nur Terminal
both=Beide
shouldElevate=Sollte erheben
shouldElevateDescription=Ob dieses Skript mit erhöhten Rechten ausgeführt werden soll
script.displayName=Skript
script.displayDescription=Ein wiederverwendbares Skript erstellen
scriptGroup.displayName=Skript-Gruppe
scriptGroup.displayDescription=Eine Gruppe für Skripte erstellen
scriptGroup=Gruppe
scriptGroupDescription=Die Gruppe, der dieses Skript zugewiesen werden soll

View file

@ -1,13 +1,6 @@
anyBinaryFile=Any binary file
dataFile=Data file
binaryFile=Binary file
commandLine=Command Line
java=Java
fileOutput=File Output
localMachine=Local Machine
destination=Destination
configuration=Configuration
selectOutput=Select Output
launch=Launch
start=Start
stop=Stop
@ -37,12 +30,9 @@ commandLineWrite=Write
wslHost=WSL Host
timeout=Timeout
additionalOptions=Additional Options
rawFileOutput=Raw File Output
dataSourceOutput=Data Source Output
type=Type
input=Input
machine=Machine
bytes=$N$ bytes
container=Container
host=Host
port=Port
@ -52,24 +42,14 @@ method=Method
uri=URL
distribution=Distribution
username=Username
shellType=Shell Type
shellType=Shell type
command=Command
target=Target
writeMode=Write Mode
exportStream=Export Stream
browseFile=Browse File
openShell=Open Shell
editFile=Edit File
browseFile=Browse file
openShell=Open shell
editFile=Edit file
usage=Usage
description=Description
unconnected=Unconnected
waitingForConsumer=Waiting for Consumer
waitingForProducer=Waiting for Producer
open=Open
closed=Closed
internalStream.displayName=Internal Stream
local.displayName=Local machine
local.displayDescription=
edit=Edit
scriptContents=Script contents
scriptContentsDescription=The script commands to execute

View file

@ -0,0 +1,14 @@
## Elevation
Der Prozess der Elevation ist betriebssystemspezifisch.
### Linux & macOS
Jeder erhobene Befehl wird mit `sudo` ausgeführt. Das optionale `sudo` Passwort wird bei Bedarf über XPipe abgefragt.
Du kannst in den Einstellungen festlegen, ob du dein Passwort jedes Mal eingeben willst, wenn es gebraucht wird, oder ob du es für die aktuelle Sitzung zwischenspeichern willst.
### Windows
Unter Windows ist es nicht möglich, einen untergeordneten Prozess zu aktivieren, wenn der übergeordnete Prozess nicht auch aktiviert ist.
Wenn XPipe also nicht als Administrator ausgeführt wird, kannst du lokal keine Berechtigungserweiterung nutzen.
Bei Fernverbindungen muss das verbundene Benutzerkonto über Administratorrechte verfügen.

View file

@ -0,0 +1,15 @@
## Ausführungsarten
Es gibt zwei verschiedene Ausführungsarten, wenn XPipe eine Verbindung zu einem System herstellt.
### Im Hintergrund
Die erste Verbindung zu einem System wird im Hintergrund in einer stummen Terminalsitzung hergestellt.
Blockierende Befehle, die Benutzereingaben erfordern, können den Shell-Prozess einfrieren, wenn XPipe ihn intern zuerst im Hintergrund startet. Um dies zu vermeiden, solltest du diese blockierenden Befehle nur im Terminalmodus aufrufen.
Der Dateibrowser z. B. verwendet für seine Operationen ausschließlich den dummen Hintergrundmodus. Wenn du also möchtest, dass deine Skriptumgebung für die Dateibrowser-Sitzung gilt, sollte sie im dummen Modus ausgeführt werden.
### In den Terminals
Nachdem die anfängliche Dumb-Terminal-Verbindung erfolgreich war, öffnet XPipe eine separate Verbindung im eigentlichen Terminal. Wenn du möchtest, dass das Skript ausgeführt wird, wenn du die Verbindung in einem Terminal öffnest, dann wähle den Terminalmodus.

View file

@ -2,16 +2,14 @@
There are two distinct execution types when XPipe connects to a system.
### Dumb terminals
### In the background
The first connection to a system is made in the background in a dumb terminal.
The first connection to a system is made in the background in a dumb terminal session.
Blocking commands that require user input can freeze the shell process when XPipe starts it up internally first in the background.
To avoid this, you should only call these blocking commands in the terminal mode.
Blocking commands that require user input can freeze the shell process when XPipe starts it up internally first in the background. To avoid this, you should only call these blocking commands in the terminal mode.
The file browser for example entirely uses the dumb background mode to handle its operations, so if you want your script environment to apply to the file browser session, it should run in the dumb mode.
### Proper terminals
### In the terminals
After a dumb terminal connection has succeeded, XPipe will open a separate connection in the actual terminal.
If you want the script to be run when you open the connection in a terminal, then choose the terminal mode.
After the initial dumb terminal connection has succeeded, XPipe will open a separate connection in the actual terminal. If you want the script to be run when you open the connection in a terminal, then choose the terminal mode.

View file

@ -0,0 +1,13 @@
## Skript-Kompatibilität
Der Shell-Typ bestimmt, wo das Skript ausgeführt werden kann.
Abgesehen von einer exakten Übereinstimmung, d.h. der Ausführung eines `zsh`-Skripts in `zsh`, führt XPipe auch eine breitere Kompatibilitätsprüfung durch.
### Posix-Shells
Jedes Skript, das als `sh`-Skript deklariert ist, kann in jeder Posix-Shell-Umgebung wie `bash` oder `zsh` ausgeführt werden.
Wenn du ein grundlegendes Skript auf vielen verschiedenen Systemen ausführen willst, ist die Verwendung von Skripten mit `sh`-Syntax die beste Lösung dafür.
### PowerShell
Skripte, die als normale `powershell`-Skripte deklariert sind, können auch in `pwsh`-Umgebungen ausgeführt werden.

View file

@ -10,4 +10,4 @@ If you intend to run a basic script on many different systems, then using only `
### PowerShell
Scripts declared as normal PowerShell scripts are also able to run in PowerShell Core environments.
Scripts declared as normal `powershell` scripts are also able to run in `pwsh` environments.

View file

@ -0,0 +1,5 @@
## Skriptabhängigkeiten
Die Skripte und Skriptgruppen, die zuerst ausgeführt werden sollen. Wenn eine ganze Gruppe zu einer Abhängigkeit gemacht wird, werden alle Skripte in dieser Gruppe als Abhängigkeiten betrachtet.
Der aufgelöste Abhängigkeitsgraph von Skripten wird abgeflacht, gefiltert und eindeutig gemacht. D.h. es werden nur kompatible Skripte ausgeführt und wenn ein Skript mehrmals ausgeführt werden würde, wird es nur beim ersten Mal ausgeführt.

View file

@ -0,0 +1,5 @@
## Skriptinhalt
Der Inhalt des Skripts, das ausgeführt werden soll. Du kannst ihn entweder direkt bearbeiten oder die Schaltfläche "Externe Bearbeitung" in der oberen rechten Ecke verwenden, um einen externen Texteditor zu starten.
Bei Shells, die dies unterstützen, musst du keine Shebang-Zeile angeben, sie wird automatisch mit dem entsprechenden Shell-Typ hinzugefügt.

View file

@ -0,0 +1,20 @@
postgres.displayName=PostgreSQL
postgres.displayDescription=Eine psql-Shell für einen PostgreSQL-Server öffnen
query=Abfrage
proxy=Proxy
peerAuth=Peer-Authentifizierung
port=Port
url=URL
instance=Instanz
username=Benutzername
usernameDescription=Der Benutzer, als der man sich anmeldet
password=Passwort
passwordDescription=Das Passwort zur Authentifizierung
authentication=Authentifizierung
authenticationType=Methode
connection=Verbindung
connectionUrl=Verbindungs-URL
connectionString=Verbindungsstring
passwordAuth=Passwort-Authentifizierung
windowsAuth=Windows-Authentifizierung
psqlShell=PSQL-Shell im Terminal öffnen

View file

@ -0,0 +1,20 @@
postgres.displayName=PostgreSQL
postgres.displayDescription=Open a psql shell to a PostgreSQL Server
query=Query
proxy=Proxy
peerAuth=Peer Authentication
port=Port
url=URL
instance=Instance
username=Username
usernameDescription=The user to log in as
password=Password
passwordDescription=The password to authenticate
authentication=Authentication
authenticationType=Method
connection=Connection
connectionUrl=Connection URL
connectionString=Connection String
passwordAuth=Password Authentication
windowsAuth=Windows Authentication
psqlShell=Open PSQL Shell in Terminal

View file

@ -0,0 +1,273 @@
showInternalPods=Interne Pods anzeigen
showAllNamespaces=Alle Namespaces anzeigen
showInternalContainers=Interne Container anzeigen
refresh=Aktualisieren
vmwareGui=GUI starten
monitorVm=VM überwachen
addCluster=Cluster hinzufügen ...
showNonRunningInstances=Nicht laufende Instanzen anzeigen
vmwareGuiDescription=Ob eine virtuelle Maschine im Hintergrund oder in einem Fenster gestartet werden soll.
vmwareEncryptionPassword=Verschlüsselungspasswort
vmwareEncryptionPasswordDescription=Das optionale Passwort, das zur Verschlüsselung der VM verwendet wird.
vmwarePasswordDescription=Das erforderliche Passwort für den Gastbenutzer.
vmwarePassword=Benutzer-Passwort
vmwareUser=Gast-Benutzer
runTempContainer=Temporärer Container ausführen
vmwareUserDescription=Der Benutzername deines primären Gastbenutzers
dockerTempRunAlertTitle=Temporärer Container ausführen
dockerTempRunAlertHeader=Damit wird ein Shell-Prozess in einem temporären Container ausgeführt, der automatisch entfernt wird, sobald er gestoppt wird.
imageName=Bildname
imageNameDescription=Die zu verwendende Kennung des Containerbildes
containerName=Container-Name
containerNameDescription=Der optionale benutzerdefinierte Containername
vm=Virtuelle Maschine
yubikeyPiv=Yubikey PIV (Pro)
vmDescription=Die zugehörige Konfigurationsdatei.
vmwareScan=VMware Desktop-Hypervisoren
library=Bibliothek
customPkcs11Library=Benutzerdefinierte PKCS#11-Bibliothek (Pro)
vmwareMachine.displayName=VMware Virtuelle Maschine
vmwareMachine.displayDescription=Verbindung zu einer virtuellen Maschine über SSH
vmwareInstallation.displayName=VMware Desktop Hypervisor Installation
vmwareInstallation.displayDescription=Interaktion mit den installierten VMs über deren CLI
start=Start
stop=Stopp
pause=Pause
requiredSshServerAlertTitle=SSH-Server einrichten
requiredSshServerAlertHeader=Es kann kein installierter SSH-Server in der VM gefunden werden.
requiredSshServerAlertContent=Um sich mit der VM zu verbinden, sucht XPipe nach einem laufenden SSH-Server, aber es wurde kein verfügbarer SSH-Server für die VM gefunden.
computerName=Computer Name
pssComputerNameDescription=Der Computername, zu dem eine Verbindung hergestellt werden soll. Es wird angenommen, dass er bereits in deinen vertrauenswürdigen Hosts enthalten ist.
credentialUser=Berechtigungsnachweis Benutzer
pssCredentialUserDescription=Der Benutzer, als der du dich anmeldest.
credentialPassword=Berechtigungsnachweis Passwort
pssCredentialPasswordDescription=Das Passwort des Benutzers.
sshConfig=SSH-Konfigurationsdateien
autostart=Automatisches Verbinden beim Start von XPipe
acceptHostKey=Host-Schlüssel akzeptieren
modifyHostKeyPermissions=Host Key Berechtigungen ändern
attachContainer=Am Container anhängen
openInVsCode=In VSCode öffnen
containerLogs=Containerprotokolle anzeigen
openSftpClient=In einem externen SFTP-Client öffnen
openTermius=In Termius öffnen
showInternalInstances=Interne Instanzen anzeigen
editPod=Pod bearbeiten
acceptHostKeyDescription=Vertraue dem neuen Host-Schlüssel und fahre fort
modifyHostKeyPermissionsDescription=Versuchen Sie, die Berechtigungen der Originaldatei zu entfernen, damit OpenSSH zufrieden ist
psSession.displayName=PowerShell Remote-Sitzung
psSession.displayDescription=Verbinden über New-PSSession und Enter-PSSession
sshLocalTunnel.displayName=Lokaler SSH-Tunnel
sshLocalTunnel.displayDescription=Einen SSH-Tunnel zu einem entfernten Host einrichten
sshRemoteTunnel.displayName=Entfernter SSH-Tunnel
sshRemoteTunnel.displayDescription=Einen umgekehrten SSH-Tunnel von einem entfernten Host aus aufbauen
sshDynamicTunnel.displayName=Dynamischer SSH-Tunnel
sshDynamicTunnel.displayDescription=Einen SOCKS-Proxy über eine SSH-Verbindung einrichten
shellEnvironmentGroup.displayName=Shell-Umgebungen
shellEnvironmentGroup.displayDescription=Shell-Umgebungen
shellEnvironment.displayName=Benutzerdefinierte Shell-Umgebung
shellEnvironment.displayDescription=Eine angepasste Shell-Init-Umgebung erstellen
shellEnvironment.informationFormat=$TYPE$ umgebung
shellEnvironment.elevatedInformationFormat=$ELEVATION$ $TYPE$ umgebung
environmentConnectionDescription=Die Basisverbindung zum Erstellen einer Umgebung aus
environmentScriptDescription=Das optionale benutzerdefinierte Init-Skript, das in der Shell ausgeführt wird
environmentSnippets=Skript-Schnipsel
commandSnippetsDescription=Die optionalen vordefinierten Skriptschnipsel, die zuerst ausgeführt werden
environmentSnippetsDescription=Die optionalen vordefinierten Skript-Snippets, die bei der Initialisierung ausgeführt werden
shellTypeDescription=Der explizite Shell-Typ zum Starten
originPort=Ursprungsport
originAddress=Herkunftsadresse
remoteAddress=Entfernte Adresse
remotePort=Entfernter Anschluss
remoteSourceAddress=Entfernte Quelladresse
remoteSourcePort=Entfernter Quellport
originDestinationPort=Ursprung Zielhafen
originDestinationAddress=Herkunft Zieladresse
origin=Herkunft
remoteHost=Entfernter Host
address=Adresse
proxmox=Proxmox
proxmox.displayName=Proxmox
proxmox.displayDescription=Verbindung zu Systemen in einer virtuellen Umgebung von Proxmox
proxmoxVm.displayName=Proxmox VM
proxmoxVm.displayDescription=Verbindung zu einer virtuellen Maschine in einer Proxmox VE über SSH
proxmoxContainer.displayName=Proxmox Container
proxmoxContainer.displayDescription=Verbindung zu einem Container in einer Proxmox VE
sshDynamicTunnel.originDescription=Das System, von dem aus die ssh-Verbindung geöffnet werden soll
sshDynamicTunnel.hostDescription=Das System, das als SOCKS-Proxy verwendet werden soll
sshDynamicTunnel.bindingDescription=An welche Adressen der Tunnel gebunden werden soll
sshRemoteTunnel.originDescription=Das System, von dem aus die ssh-Verbindung geöffnet werden soll und zu dem der Tunnel geöffnet werden soll
sshRemoteTunnel.hostDescription=Das System, von dem aus der Ferntunnel zum Ursprung gestartet werden soll
sshRemoteTunnel.bindingDescription=An welche Adressen der Tunnel gebunden werden soll
sshLocalTunnel.originDescription=Das System, von dem aus der Tunnel gestartet werden soll
sshLocalTunnel.hostDescription=Das System, zu dem der Tunnel geöffnet werden soll
sshLocalTunnel.bindingDescription=An welche Adressen der Tunnel gebunden werden soll
sshLocalTunnel.localAddressDescription=Die lokale Adresse zum Binden
sshLocalTunnel.remoteAddressDescription=Die zu bindende Remote-Adresse
active=Aktiv
inactive=Inaktiv
cmd.displayName=Benutzerdefinierter Terminal-Befehl
cmd.displayDescription=Einen benutzerdefinierten Befehl auf einem System in deinem Terminal ausführen
k8sPod.displayName=Kubernetes Pod
k8sPod.displayDescription=Verbinden mit einem Pod und seinen Containern über kubectl
k8sContainer.displayName=Kubernetes Container
k8sContainer.displayDescription=Eine Shell für einen Container öffnen
k8sCluster.displayName=Kubernetes Cluster
k8sCluster.displayDescription=Verbinden mit einem Cluster und seinen Pods über kubectl
sshTunnelGroup.displayName=SSH-Tunnel
sshTunnelGroup.displayCategory=Alle Arten von SSH-Tunneln
podmanCmd.displayName=Podman CLI
podmanCmd.displayCategory=Zugriff auf Podman-Container über den CLI-Client
podmanContainers=Podman Container
local.displayName=Lokale Maschine
local.displayDescription=Die Shell des lokalen Rechners
cygwin=Cygwin
msys2=MSYS2
gitWindows=Git für Windows
gitForWindows.displayName=Git für Windows
gitForWindows.displayDescription=Zugriff auf deine lokale Git For Windows-Umgebung
msys2.displayName=MSYS2
msys2.displayDescription=Zugriff auf die Shells deiner MSYS2 Umgebung
cygwin.displayName=Cygwin
cygwin.displayDescription=Zugriff auf die Shells deiner Cygwin-Umgebung
namespace=Namespace
gitVaultIdentityStrategy=Git SSH Identität
gitVaultIdentityStrategyDescription=Wenn du dich entschieden hast, eine SSH-Git-URL als Remote zu verwenden und dein Remote-Repository eine SSH-Identität erfordert, dann setze diese Option.\n\n Falls du eine HTTP-URL angegeben hast, kannst du diese Option ignorieren.
dockerContainers=Docker-Container
lxdContainers=LXD-Container
dockerCmd.displayName=docker CLI-Client
dockerCmd.displayDescription=Zugriff auf Docker-Container über den Docker CLI-Client
lxdCmd.displayName=LXD CLI-Client
lxdCmd.displayDescription=Zugriff auf LXD-Container über das lxc CLI cient
wslCmd.displayName=wsl-Client
wslCmd.displayDescription=Zugriff auf WSL-Instanzen über das wsl CLI cient
k8sCmd.displayName=kubectl-Client
k8sCmd.displayDescription=Zugriff auf Kubernetes-Cluster über kubectl
k8sClusters=Kubernetes-Cluster
shells=Verfügbare Muscheln
startContainer=Container starten
stopContainer=Container anhalten
inspectContainer=Container inspizieren
k8sClusterNameDescription=Der Name des Kontexts, in dem sich der Cluster befindet.
pod=Pod
podName=Pod-Name
k8sClusterContext=Kontext
k8sClusterContextDescription=Der Name des Kontexts, in dem sich der Cluster befindet
k8sClusterNamespace=Namespace
k8sClusterNamespaceDescription=Der benutzerdefinierte Namespace oder der Standard-Namespace, falls leer
k8sConfigLocation=Config-Datei
k8sConfigLocationDescription=Die benutzerdefinierte kubeconfig-Datei oder die Standarddatei, wenn sie leer ist
inspectPod=Pod inspizieren
showAllContainers=Nicht laufende Container anzeigen
showAllPods=Nicht laufende Pods anzeigen
wsl=WSL
docker=Docker
k8sPodHostDescription=Der Host, auf dem sich der Pod befindet
k8sContainerDescription=Der Name des Kubernetes-Containers
k8sPodDescription=Der Name des Kubernetes-Pods
podDescription=Der Pod, auf dem sich der Container befindet
k8sClusterHostDescription=Der Host, über den auf den Cluster zugegriffen werden soll. Muss kubectl installiert und konfiguriert haben, um auf den Cluster zugreifen zu können.
script=Init-Skript
connection=Verbindung
shellCommand.displayName=Benutzerdefinierter Shell-Öffner-Befehl
shellCommand.displayDescription=Öffnen einer Standard-Shell durch einen benutzerdefinierten Befehl
ssh.displayName=Einfache SSH-Verbindung
ssh.displayDescription=Verbindung über einen SSH-Befehlszeilen-Client
sshConfig.displayName=SSH-Konfigurationsdatei
sshConfig.displayDescription=Verbindung zu Hosts, die in einer SSH-Konfigurationsdatei definiert sind
sshConfigHost.displayName=SSH-Konfigurationsdatei Host
sshConfigHost.displayDescription=Sich mit einem in einer SSH-Konfigurationsdatei definierten Host verbinden
sshConfigHost.password=Passwort
sshConfigHost.passwordDescription=Gib das optionale Passwort für die Benutzeranmeldung an.
sshConfigHost.identityPassphrase=Identitäts-Passphrase
sshConfigHost.identityPassphraseDescription=Gib die optionale Passphrase für deinen Identitätsschlüssel an.
binary.displayName=Binär
binary.displayDescription=Binäre Daten
text.displayName=Text
shellCommand.hostDescription=Der Host, auf dem der Befehl ausgeführt werden soll
shellCommand.commandDescription=Der Befehl, mit dem eine Shell geöffnet wird
sshAgent=SSH-Agent
none=Keine
commandDescription=Die Befehle, die in einem Shell-Skript auf dem Host ausgeführt werden sollen.
commandHostDescription=Der Host, auf dem der Befehl ausgeführt werden soll
commandDataFlowDescription=Wie dieser Befehl Ein- und Ausgaben behandelt
commandElevationDescription=Ob dieser Befehl mit erweiterten Rechten ausgeführt werden soll
commandShellTypeDescription=Die Shell, die für diesen Befehl verwendet werden soll
ssh.passwordDescription=Das optionale Passwort, das bei der Authentifizierung verwendet wird
keyAuthentication=Schlüsselbasierte Authentifizierung
keyAuthenticationDescription=Die zu verwendende Authentifizierungsmethode, wenn eine schlüsselbasierte Authentifizierung erforderlich ist.
customAgent=Benutzerdefinierter Agent
identityAgent=Identitätsagent
ssh.proxyDescription=Der optionale Proxy-Host, der beim Aufbau der SSH-Verbindung verwendet wird. Es muss ein SSH-Client installiert sein.
usage=Verwendung
wslHostDescription=Der Host, auf dem sich die WSL-Instanz befindet. Muss wsl installiert haben.
wslDistributionDescription=Der Name der WSL-Instanz
wslUsernameDescription=Der explizite Benutzername, mit dem du dich anmeldest. Wenn er nicht angegeben wird, wird der Standardbenutzername verwendet.
wslPasswordDescription=Das Passwort des Benutzers, das für sudo-Befehle verwendet werden kann.
dockerHostDescription=Der Host, auf dem sich der Docker-Container befindet. Muss Docker installiert haben.
dockerContainerDescription=Der Name des Docker-Containers
lxdHostDescription=Der Host, auf dem sich der LXD-Container befindet. Muss lxc installiert haben.
lxdContainerDescription=Der Name des LXD-Containers
localMachine=Lokale Maschine
rootScan=Root-Shell-Umgebung
loginEnvironmentScan=Benutzerdefinierte Anmeldeumgebung
k8sScan=Kubernetes-Cluster
options=Optionen
dockerRunningScan=Docker-Container ausführen
dockerAllScan=Alle Docker-Container
wslScan=WSL-Instanzen
sshScan=SSH-Konfigurationsverbindungen
requiresElevation=Erhöht ausführen
default=Standard
wslHost=WSL-Host
timeout=Timeout
installLocation=Installationsort
installLocationDescription=Der Ort, an dem deine $NAME$ Umgebung installiert ist
wsl.displayName=Windows Subsystem für Linux
wsl.displayDescription=Verbindung zu einer WSL-Instanz unter Windows
docker.displayName=Docker Container
docker.displayDescription=Mit einem Docker-Container verbinden
podman.displayName=Podman Container
podman.displayDescription=Mit einem Podman-Container verbinden
lxd.displayName=LXD-Container
lxd.displayDescription=Verbindung zu einem LXD-Container über lxc
container=Container
host=Host
port=Port
user=Benutzer
password=Passwort
method=Methode
uri=URL
proxy=Proxy
distribution=Vertrieb
username=Benutzername
shellType=Shell-Typ
browseFile=Datei durchsuchen
openShell=Shell im Terminal öffnen
openCommand=Befehl im Terminal ausführen
editFile=Datei bearbeiten
description=Beschreibung
keyFile=Identitätsdatei
keyPassword=Passphrase
key=Schlüssel
furtherCustomization=Weitere Anpassungen
furtherCustomizationDescription=Weitere Konfigurationsoptionen findest du in den ssh-Konfigurationsdateien
location=Standort
browse=Durchsuchen
locationDescription=Der Dateipfad deines entsprechenden privaten Schlüssels
configHost=Host
configHostDescription=Der Host, auf dem sich die Konfiguration befindet
configLocation=Config-Speicherort
configLocationDescription=Der Dateipfad der Konfigurationsdatei
pageant=Pageant
gpgAgent=GPG Agent (Pro)
gateway=Gateway
gatewayDescription=Das optionale Gateway, das bei der Verbindung verwendet wird.
connectionInformation=Verbindungsinformationen
connectionInformationDescription=Wo die Verbindung zu
passwordAuthentication=Passwort-Authentifizierung
passwordDescription=Das optionale Passwort, das zur Authentifizierung verwendet wird.
sshConfigString.displayName=Angepasste SSH-Verbindung
sshConfigString.displayDescription=Eine vollständig angepasste SSH-Verbindung erstellen
sshConfigStringContent=Konfiguration
sshConfigStringContentDescription=SSH-Optionen für die Verbindung im OpenSSH-Config-Format

View file

@ -0,0 +1,273 @@
showInternalPods=Show internal pods
showAllNamespaces=Show all namespaces
showInternalContainers=Show internal containers
refresh=Refresh
vmwareGui=Start GUI
monitorVm=Monitor VM
addCluster=Add cluster ...
showNonRunningInstances=Show non-running instances
vmwareGuiDescription=Whether to start a virtual machine in the background or in a window.
vmwareEncryptionPassword=Encryption password
vmwareEncryptionPasswordDescription=The optional password used to encrypt the VM.
vmwarePasswordDescription=The required password for the guest user.
vmwarePassword=User password
vmwareUser=Guest user
runTempContainer=Run temporary container
vmwareUserDescription=The username of your primary guest user
dockerTempRunAlertTitle=Run temporary container
dockerTempRunAlertHeader=This will run a shell process in a temporary container that will get automatically removed once it is stopped.
imageName=Image name
imageNameDescription=The container image identifier to use
containerName=Container name
containerNameDescription=The optional custom container name
vm=Virtual machine
yubikeyPiv=Yubikey PIV (Pro)
vmDescription=The associated configuration file.
vmwareScan=VMware desktop hypervisors
library=Library
customPkcs11Library=Custom PKCS#11 library (Pro)
vmwareMachine.displayName=VMware Virtual Machine
vmwareMachine.displayDescription=Connect to a virtual machine via SSH
vmwareInstallation.displayName=VMware desktop hypervisor installation
vmwareInstallation.displayDescription=Interact with the installed VMs via its CLI
start=Start
stop=Stop
pause=Pause
requiredSshServerAlertTitle=Setup SSH server
requiredSshServerAlertHeader=Unable to find an installed SSH server in the VM.
requiredSshServerAlertContent=To connect to the VM, XPipe is looking for a running SSH server but no available SSH server was detected for the VM..
computerName=Computer Name
pssComputerNameDescription=The computer name to connect to. It is assumed that it is already included in your trusted hosts.
credentialUser=Credential User
pssCredentialUserDescription=The user to login as.
credentialPassword=Credential Password
pssCredentialPasswordDescription=The password of the user.
sshConfig=SSH config files
autostart=Automatically connect on XPipe startup
acceptHostKey=Accept host key
modifyHostKeyPermissions=Modify host key permissions
attachContainer=Attach to container
openInVsCode=Open in VSCode
containerLogs=Show container logs
openSftpClient=Open in external SFTP client
openTermius=Open in Termius
showInternalInstances=Show internal instances
editPod=Edit pod
acceptHostKeyDescription=Trust the new host key and continue
modifyHostKeyPermissionsDescription=Attempt to remove permissions of the original file so that OpenSSH is happy
psSession.displayName=PowerShell Remote Session
psSession.displayDescription=Connect via New-PSSession and Enter-PSSession
sshLocalTunnel.displayName=Local SSH tunnel
sshLocalTunnel.displayDescription=Establish an SSH tunnel to a remote host
sshRemoteTunnel.displayName=Remote SSH tunnel
sshRemoteTunnel.displayDescription=Establish a reverse SSH tunnel from a remote host
sshDynamicTunnel.displayName=Dynamic SSH tunnel
sshDynamicTunnel.displayDescription=Establish a SOCKS proxy through an SSH connection
shellEnvironmentGroup.displayName=Shell Environments
shellEnvironmentGroup.displayDescription=Shell Environments
shellEnvironment.displayName=Custom Shell Environment
shellEnvironment.displayDescription=Create a customized shell init environment
shellEnvironment.informationFormat=$TYPE$ environment
shellEnvironment.elevatedInformationFormat=$ELEVATION$ $TYPE$ environment
environmentConnectionDescription=The base connection to create an environment from
environmentScriptDescription=The optional custom init script to run in the shell
environmentSnippets=Script snippets
commandSnippetsDescription=The optional predefined script snippets to run first
environmentSnippetsDescription=The optional predefined script snippets to run on initialization
shellTypeDescription=The explicit shell type to launch
originPort=Origin port
originAddress=Origin address
remoteAddress=Remote address
remotePort=Remote port
remoteSourceAddress=Remote source address
remoteSourcePort=Remote source port
originDestinationPort=Origin destination port
originDestinationAddress=Origin destination address
origin=Origin
remoteHost=Remote host
address=Address
proxmox=Proxmox
proxmox.displayName=Proxmox
proxmox.displayDescription=Connect to systems in a Proxmox Virtual Environment
proxmoxVm.displayName=Proxmox VM
proxmoxVm.displayDescription=Connect to a virtual machine in a Proxmox VE via SSH
proxmoxContainer.displayName=Proxmox Container
proxmoxContainer.displayDescription=Connect to a container in a Proxmox VE
sshDynamicTunnel.originDescription=The system from where to open the ssh connection
sshDynamicTunnel.hostDescription=The system to use as SOCKS proxy
sshDynamicTunnel.bindingDescription=What addresses to bind the tunnel to
sshRemoteTunnel.originDescription=The system from where to open the ssh connection and to open the tunnel to
sshRemoteTunnel.hostDescription=The system from which to start the remote tunnel to the origin
sshRemoteTunnel.bindingDescription=What addresses to bind the tunnel to
sshLocalTunnel.originDescription=The system from where to start the tunnel
sshLocalTunnel.hostDescription=The system to open the tunnel to
sshLocalTunnel.bindingDescription=What addresses to bind the tunnel to
sshLocalTunnel.localAddressDescription=The local address to bind
sshLocalTunnel.remoteAddressDescription=The remote address to bind
active=Active
inactive=Inactive
cmd.displayName=Custom Terminal Command
cmd.displayDescription=Run a custom command on a system in your terminal
k8sPod.displayName=Kubernetes Pod
k8sPod.displayDescription=Connect to a pod and its containers via kubectl
k8sContainer.displayName=Kubernetes Container
k8sContainer.displayDescription=Open a shell to a container
k8sCluster.displayName=Kubernetes Cluster
k8sCluster.displayDescription=Connect to a cluster and its pods via kubectl
sshTunnelGroup.displayName=SSH Tunnels
sshTunnelGroup.displayCategory=All types of SSH tunnels
podmanCmd.displayName=Podman CLI
podmanCmd.displayCategory=Access Podman containers via the CLI client
podmanContainers=Podman containers
local.displayName=Local machine
local.displayDescription=The shell of the local machine
cygwin=Cygwin
msys2=MSYS2
gitWindows=Git For Windows
gitForWindows.displayName=Git For Windows
gitForWindows.displayDescription=Access your local Git For Windows environment
msys2.displayName=MSYS2
msys2.displayDescription=Access shells of your MSYS2 environment
cygwin.displayName=Cygwin
cygwin.displayDescription=Access shells of your Cygwin environment
namespace=Namespace
gitVaultIdentityStrategy=Git SSH identity
gitVaultIdentityStrategyDescription=If you chose to use an SSH git URL as the remote and your remote repository requires an SSH identity, then set this option.\n\nIn case you provided an HTTP url, you can ignore this option.
dockerContainers=Docker containers
lxdContainers=LXD containers
dockerCmd.displayName=docker CLI client
dockerCmd.displayDescription=Access Docker containers via the docker CLI client
lxdCmd.displayName=LXD CLI client
lxdCmd.displayDescription=Access LXD containers via the lxc CLI cient
wslCmd.displayName=wsl client
wslCmd.displayDescription=Access WSL instances via the wsl CLI cient
k8sCmd.displayName=kubectl client
k8sCmd.displayDescription=Access Kubernetes clusters via kubectl
k8sClusters=Kubernetes clusters
shells=Available shells
startContainer=Start container
stopContainer=Stop container
inspectContainer=Inspect container
k8sClusterNameDescription=The name of the context the cluster is in.
pod=Pod
podName=Pod name
k8sClusterContext=Context
k8sClusterContextDescription=The name of the context the cluster is in
k8sClusterNamespace=Namespace
k8sClusterNamespaceDescription=The custom namespace or the default one if empty
k8sConfigLocation=Config file
k8sConfigLocationDescription=The custom kubeconfig file or the default one if left empty
inspectPod=Inspect pod
showAllContainers=Show non-running containers
showAllPods=Show non-running pods
wsl=WSL
docker=Docker
k8sPodHostDescription=The host on which the pod is located
k8sContainerDescription=The name of the Kubernetes container
k8sPodDescription=The name of the Kubernetes pod
podDescription=The pod on which the container is located
k8sClusterHostDescription=The host through which the cluster should be accessed. Must have kubectl installed and configured to be able to access the cluster.
script=Init Script
connection=Connection
shellCommand.displayName=Custom Shell Opener Command
shellCommand.displayDescription=Open a standard shell through a custom command
ssh.displayName=Simple SSH Connection
ssh.displayDescription=Connect via an SSH command-line client
sshConfig.displayName=SSH Config File
sshConfig.displayDescription=Connect to hosts defined in an SSH config file
sshConfigHost.displayName=SSH Config File Host
sshConfigHost.displayDescription=Connect to a host defined in an SSH config file
sshConfigHost.password=Password
sshConfigHost.passwordDescription=Provide the optional password for the user login.
sshConfigHost.identityPassphrase=Identity passphrase
sshConfigHost.identityPassphraseDescription=Provide the optional passphrase for your identity key.
binary.displayName=Binary
binary.displayDescription=Binary data
text.displayName=Text
shellCommand.hostDescription=The host to execute the command on
shellCommand.commandDescription=The command that will open a shell
sshAgent=SSH-Agent
none=None
commandDescription=The commands to execute in a shell script on the host.
commandHostDescription=The host to run the command on
commandDataFlowDescription=How this command handles input and output
commandElevationDescription=Whether to run this command with elevated permissions
commandShellTypeDescription=The shell to use for this command
ssh.passwordDescription=The optional password to use when authenticating
keyAuthentication=Key-based authentication
keyAuthenticationDescription=The authentication method to use if key-based authentication is required.
customAgent=Custom agent
identityAgent=Identity agent
ssh.proxyDescription=The optional proxy host to use when establishing the SSH connection. Must have an ssh client installed.
usage=Usage
wslHostDescription=The host on which the WSL instance is located on. Must have wsl installed.
wslDistributionDescription=The name of the WSL instance
wslUsernameDescription=The explicit username to login as. If not specified, the default username will be used.
wslPasswordDescription=The user's password which can be used for sudo commands.
dockerHostDescription=The host on which the docker container is located on. Must have docker installed.
dockerContainerDescription=The name of the docker container
lxdHostDescription=The host on which the LXD container is located on. Must have lxc installed.
lxdContainerDescription=The name of the LXD container
localMachine=Local Machine
rootScan=Root shell environment
loginEnvironmentScan=Custom login environment
k8sScan=Kubernetes cluster
options=Options
dockerRunningScan=Running docker containers
dockerAllScan=All docker containers
wslScan=WSL instances
sshScan=SSH config connections
requiresElevation=Run Elevated
default=Default
wslHost=WSL Host
timeout=Timeout
installLocation=Install location
installLocationDescription=The location where your $NAME$ environment is installed
wsl.displayName=Windows Subsystem for Linux
wsl.displayDescription=Connect to a WSL instance running on Windows
docker.displayName=Docker Container
docker.displayDescription=Connect to a docker container
podman.displayName=Podman Container
podman.displayDescription=Connect to a Podman container
lxd.displayName=LXD Container
lxd.displayDescription=Connect to a LXD container via lxc
container=Container
host=Host
port=Port
user=User
password=Password
method=Method
uri=URL
proxy=Proxy
distribution=Distribution
username=Username
shellType=Shell Type
browseFile=Browse File
openShell=Open Shell in Terminal
openCommand=Execute Command in Terminal
editFile=Edit File
description=Description
keyFile=Identity File
keyPassword=Passphrase
key=Key
furtherCustomization=Further customization
furtherCustomizationDescription=For more configuration options, use the ssh config files
location=Location
browse=Browse
locationDescription=The file path of your corresponding private key
configHost=Host
configHostDescription=The host on which the config is located on
configLocation=Config location
configLocationDescription=The file path of the config file
pageant=Pageant
gpgAgent=GPG Agent (Pro)
gateway=Gateway
gatewayDescription=The optional gateway to use when connecting.
connectionInformation=Connection information
connectionInformationDescription=Where to connect to
passwordAuthentication=Password authentication
passwordDescription=The optional password to use to authenticate.
sshConfigString.displayName=Customized SSH Connection
sshConfigString.displayDescription=Create a fully customized SSH connection
sshConfigStringContent=Configuration
sshConfigStringContentDescription=SSH options for the connection in OpenSSH config format

View file

@ -0,0 +1,11 @@
## Elevation
Der Prozess der Berechtigungserweiterung ist betriebssystemspezifisch.
### Linux & macOS
Jeder erweiterte Befehl wird mit `sudo` ausgeführt. Das optionale `sudo` Passwort wird bei Bedarf über XPipe abgefragt. Du kannst in den Einstellungen festlegen, ob du dein Passwort jedes Mal eingeben willst, wenn es gebraucht wird, oder ob du es für die aktuelle Sitzung zwischenspeichern willst.
### Windows
Unter Windows ist es nicht möglich, die Berechtigungen eines untergeordneten Prozesses zu erhöhen, wenn der übergeordnete Prozess nicht ebenfalls mit erhöhten Berechtigungen ausgeführt wird. Wenn XPipe also nicht als Administrator ausgeführt wird, kannst du lokal keine Berechtigungserweiterung nutzen. Bei Fernverbindungen muss das verbundene Benutzerkonto mit Administratorrechten ausgestattet sein.

View file

@ -0,0 +1,11 @@
## Elevation
The process of permissions elevation is operating system specific.
### Linux & macOS
Any elevated command is executed with `sudo`. The optional `sudo` password is queried via XPipe when needed. You have the ability to adjust the elevation behavior in the settings to control whether you want to enter your password every time it is needed or if you want to cache it for the current session.
### Windows
On Windows, it is not possible to elevate the permissions of a child process if the parent process is not running with elevated permissions as well. Therefore, if XPipe is not run as an administrator, you will be unable to use any elevation locally. For remote connections, the connected user account has to be given administrator privileges.

View file

@ -0,0 +1,9 @@
## Init-Skript
Die optionalen Befehle, die ausgeführt werden, nachdem die Init-Dateien und -Profile der Shell ausgeführt worden sind.
Du kannst dies wie ein normales Shell-Skript behandeln, d.h. du kannst die gesamte Syntax verwenden, die die Shell in Skripten unterstützt. Alle Befehle, die du ausführst, werden von der Shell übernommen und verändern die Umgebung. Wenn du also zum Beispiel eine Variable setzt, hast du in dieser Shell-Sitzung Zugriff auf diese Variable.
### Blockierende Befehle
Beachte, dass blockierende Befehle, die Benutzereingaben erfordern, den Shell-Prozess einfrieren können, wenn XPipe ihn zuerst intern im Hintergrund startet. Um dies zu vermeiden, rufe diese blockierenden Befehle nur auf, wenn die Variable `TERM` nicht auf `dumb` gesetzt ist. XPipe setzt die Variable `TERM=dumb` automatisch, wenn es die Shell-Sitzung im Hintergrund vorbereitet und setzt dann `TERM=xterm-256color`, wenn es das Terminal tatsächlich öffnet.

View file

@ -0,0 +1,9 @@
## Init script
The optional commands to run after the shell's init files and profiles have been executed.
You can treat this as a normal shell script, i.e. make use of all the syntax that the shell supports in scripts. All commands you execute are sourced by the shell and modify the environment. So if you for example set a variable, you will have access to this variable in this shell session.
### Blocking commands
Note that blocking commands that require user input can freeze the shell process when XPipe starts it up internally first in the background. To avoid this, only call these blocking commands if the variable `TERM` is not set to `dumb`. XPipe automatically sets the variable `TERM=dumb` when it is preparing the shell session in the background and then sets `TERM=xterm-256color` when actually opening the terminal.

View file

@ -0,0 +1,3 @@
## Passwort
Wenn du auf deiner VM eine komplexere SSH-Authentifizierung als ein einfaches Passwort verwendest, kannst du das System einfach als normale SSH-Verbindung in XPipe hinzufügen. Wenn es von außen nicht zugänglich ist, kannst du das übergeordnete PVE-System als SSH-Gateway einrichten.

View file

@ -0,0 +1,3 @@
## Password
If you are using a more complex SSH authentication on your VM rather than a simple password, you can just add the system as a normal SSH connection in XPipe. If it is not accessible from the outside, you can set the parent PVE system as an SSH gateway.

View file

@ -0,0 +1,5 @@
## Benutzername
Der Benutzername, mit dem du dich anmeldest. XPipe versucht, sich über SSH mit den angegebenen Anmeldedaten zu verbinden.
Wenn kein SSH-Server läuft, wird versucht, den installierten SSH-Server zu starten. Beachte, dass du dieses Verhalten im Menü Sicherheitseinstellungen deaktivieren kannst.

View file

@ -0,0 +1,5 @@
## Username
The username to log in as. XPipe will attempt to connect via SSH using the provided credentials.
If no SSH server is running it will attempt to start the installed SSH server. Note that you can disable this behavior in the security settings menu.

View file

@ -0,0 +1,5 @@
## Temporäre Container
Hiermit wird ein temporärer Container mit dem angegebenen Image gestartet, der automatisch entfernt wird, sobald er gestoppt wird. Der Container läuft auch dann weiter, wenn im Container-Image kein Befehl angegeben ist, der ausgeführt werden soll.
Das kann nützlich sein, wenn du schnell eine bestimmte Umgebung mit einem bestimmten Container-Image einrichten willst. Du kannst den Container dann wie gewohnt in XPipe betreten, deine Operationen durchführen und den Container stoppen, sobald er nicht mehr benötigt wird. Er wird dann automatisch entfernt.

View file

@ -0,0 +1,5 @@
## Temporary containers
This will run a temporary container using the specified image that will get automatically removed once it is stopped. The container will keep running even if the container image does not have any command specified that will run.
This can be useful if you quickly want to set up a certain environment by using a certain container image. You can then enter the container as normal in XPipe, perform your operations, and stop the container once it's no longer needed. It is then removed automatically.

View file

@ -0,0 +1,30 @@
## Benutzerdefinierte Shell-Verbindungen
Öffnet eine Shell mit dem benutzerdefinierten Befehl, indem es den angegebenen Befehl auf dem ausgewählten Hostsystem ausführt. Diese Shell kann entweder lokal oder remote sein.
Beachte, dass diese Funktion erwartet, dass die Shell von einem Standardtyp wie `cmd`, `bash`, etc. ist. Wenn du andere Arten von Shells und Befehlen in einem Terminal öffnen willst, kannst du stattdessen den benutzerdefinierten Terminalbefehlstyp verwenden. Wenn du Standardshells verwendest, kannst du diese Verbindung auch im Dateibrowser öffnen.
### Interaktive Eingabeaufforderungen
Der Shell-Prozess kann eine Zeitüberschreitung verursachen oder sich aufhängen, wenn eine unerwartete
eingabeaufforderung, wie z. B. eine Passwortabfrage. Deshalb solltest du immer darauf achten, dass es keine interaktiven Eingabeaufforderungen gibt.
Ein Befehl wie `ssh user@host` funktioniert hier zum Beispiel problemlos, solange kein Passwort verlangt wird.
### Benutzerdefinierte lokale Shells
In vielen Fällen ist es sinnvoll, eine Shell mit bestimmten Optionen zu starten, die normalerweise standardmäßig deaktiviert sind, damit einige Skripte und Befehle richtig funktionieren. Zum Beispiel:
- [Verzögerte Erweiterung in
cmd](https://ss64.com/nt/delayedexpansion.html)
- [Powershell-Ausführung
richtlinien](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.3)
- [Bash POSIX
Modus](https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html)
- Und jede andere mögliche Startoption für eine Shell deiner Wahl
Dies kannst du erreichen, indem du benutzerdefinierte Shell-Befehle erstellst, zum Beispiel mit den folgenden Befehlen:
- `cmd /v`
- `powershell -ExecutionMode Bypass`
- `bash --posix`

View file

@ -0,0 +1,30 @@
## Custom shell connections
Opens a shell using the custom command by executing the given command on the selected host system. This shell can either be local or remote.
Note that this functionality expects the shell to be of a standard type such as `cmd`, `bash`, etc. If you want to open any other types of shells and commands in a terminal, you can use the custom terminal command type instead. Using standard shells allows you to also open this connection in the file browser.
### Interactive prompts
The shell process might time out or hang in case there is an unexpected required
input prompt, like a password prompt. Therefore, you should always make sure that there are no interactive input prompts.
For example, a command like `ssh user@host` will work fine here as long there is no password required.
### Custom local shells
In many cases, it is useful to launch a shell with certain options that are usually disabled by default in order to make some scripts and commands work properly. For example:
- [Delayed Expansion in
cmd](https://ss64.com/nt/delayedexpansion.html)
- [Powershell execution
policies](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.3)
- [Bash POSIX
Mode](https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html)
- And any other possible launch option for a shell of your choice
This can be achieved by creating custom shell commands with for example the following commands:
- `cmd /v`
- `powershell -ExecutionMode Bypass`
- `bash --posix`

View file

@ -0,0 +1,9 @@
### SSH-Konfigurationen
XPipe lädt alle Hosts und wendet alle Einstellungen an, die du in der ausgewählten Datei konfiguriert hast. Wenn du also eine Konfigurationsoption entweder auf globaler oder hostspezifischer Basis angibst, wird sie automatisch auf die von XPipe aufgebaute Verbindung angewendet.
Wenn du mehr über die Verwendung von SSH-Konfigurationen erfahren möchtest, kannst du `man ssh_config` verwenden oder diese [Anleitung](https://www.ssh.com/academy/ssh/config) lesen.
### Identitäten
Beachte, dass du hier auch eine `IdentityFile` Option angeben kannst. Wenn du hier eine Identität angibst, werden alle anderen Identitäten, die weiter unten angegeben werden, ignoriert.

View file

@ -0,0 +1,9 @@
### SSH configs
XPipe loads all hosts and applies all settings that you have configured in the selected file. So by specifying a configuration option on either a global or host-specific basis, it will automatically be applied to the connection established by XPipe.
If you want to learn more about how to use SSH configs, you can use `man ssh_config` or read this [guide](https://www.ssh.com/academy/ssh/config).
### Identities
Note that you can also specify an `IdentityFile` option in here. If any identity is specified in here, any otherwise specified identity later down below will be ignored.

View file

@ -0,0 +1,5 @@
## Tunnelbindung
Die Bindungsinformationen, die du angibst, werden direkt an den `ssh`-Client wie folgt weitergegeben: `-D [Adresse:]Port`.
Standardmäßig wird die Adresse an die Loopback-Schnittstelle gebunden. Du kannst auch beliebige Platzhalter für die Adresse verwenden, z.B. die Adresse `0.0.0.0`, um an alle Netzwerkschnittstellen zu binden, die über IPv4 erreichbar sind. Wenn du die Adresse komplett weglässt, wird der Platzhalter `*` verwendet, der Verbindungen zu allen Netzwerkschnittstellen erlaubt. Beachte, dass manche Netzwerkschnittstellen-Notation nicht von allen Betriebssystemen unterstützt wird. Windows-Server zum Beispiel unterstützen den Platzhalter `*` nicht.

View file

@ -0,0 +1,5 @@
## Tunnel binding
The binding information you provide is passed straight to the `ssh` client as follows: `-D [address:]port`.
By default, the address will bind to the loopback interface. You can also make use of any address wildcards, e.g. setting the address to `0.0.0.0` in order to bind to all network interfaces accessible via IPv4. When you completely omit the address, the wildcard `*`, which allows connections on all network interfaces, will be used. Note that some network interfaces notation might not be supported on all operating systems. Windows servers for example don't support the wildcard `*`.

View file

@ -0,0 +1,5 @@
## Tunnelherkunft
XPipe ist völlig flexibel, wenn es darum geht, wo ein Befehl ausgeführt werden soll. Deshalb kannst du einen Tunnel nicht nur auf deinem lokalen Rechner, sondern auf jedem beliebigen System einrichten.
Der Tunnel-Opener-Befehl wird auf dem System ausgeführt, das du hier angibst. Du musst also einen `ssh`-Client auf diesem System installiert haben. Wenn der Ursprung nicht der lokale Rechner ist, hält XPipe im Hintergrund eine Verbindung zu diesem entfernten System offen, um den Tunnel zu verwalten.

View file

@ -0,0 +1,5 @@
## Tunnel Origin
XPipe is fully flexible with regards on where to execute a command. Therefore, you can establish a tunnel on any system in addition to your local machine.
The tunnel opener command will be executed on the system you specify here, so you need to have an `ssh` client installed on that system. If the origin is not the local machine, XPipe will keep a connection open to that remote system in the background to manage the tunnel.

View file

@ -0,0 +1,9 @@
## Shell-Verbindungsgateways
Wenn diese Option aktiviert ist, öffnet XPipe zuerst eine Shell-Verbindung zum Gateway und von dort aus eine SSH-Verbindung zum angegebenen Host. Der `ssh`-Befehl muss verfügbar sein und sich im `PATH` des gewählten Gateways befinden.
### Server springen
Dieser Mechanismus ist den Jump Servern ähnlich, aber nicht gleichwertig. Er ist völlig unabhängig vom SSH-Protokoll, so dass du jede Shell-Verbindung als Gateway verwenden kannst.
Wenn du auf der Suche nach richtigen SSH-Sprungservern bist, vielleicht auch in Kombination mit einer Agentenweiterleitung, verwende die benutzerdefinierte SSH-Verbindungsfunktion mit der Konfigurationsoption `ProxyJump`.

View file

@ -0,0 +1,9 @@
## Shell connection gateways
If enabled, XPipe first opens a shell connection to the gateway and from there opens a SSH connection to the specified host. The `ssh` command must be available and located in the `PATH` on your chosen gateway.
### Jump servers
This mechanism is similar to jump servers, but not equivalent. It is completely independent of the SSH protocol, so you can use any shell connection as a gateway.
If you are looking for proper SSH jump servers, maybe also in combination with agent forwarding, use the custom SSH connection functionality with the `ProxyJump` configuration option.

View file

@ -0,0 +1,55 @@
### Keine
Deaktiviert die `publickey`-Authentifizierung.
### SSH-Agent
Wenn deine Identitäten im SSH-Agenten gespeichert sind, kann das ssh-Programm sie verwenden, wenn der Agent gestartet ist.
XPipe startet den Agentenprozess automatisch, wenn er noch nicht läuft.
### Pageant (Windows)
Wenn du Pageant unter Windows verwendest, prüft XPipe zuerst, ob Pageant läuft.
Aufgrund der Natur von Pageant liegt es in deiner Verantwortung, dass es
da du jedes Mal alle Schlüssel, die du hinzufügen möchtest, manuell eingeben musst.
Wenn es läuft, übergibt XPipe die richtig benannte Pipe über
`-oIdentityAgent=...` an ssh weiter, du musst keine eigenen Konfigurationsdateien einbinden.
Beachte, dass es einige Implementierungsfehler im OpenSSH-Client gibt, die Probleme verursachen können
wenn dein Benutzername Leerzeichen enthält oder zu lang ist.
### Pageant (Linux & macOS)
Wenn deine Identitäten im Pageant-Agent gespeichert sind, kann das ssh-Programm sie verwenden, wenn der Agent gestartet wird.
XPipe startet den Agentenprozess automatisch, wenn er noch nicht läuft.
### Identitätsdatei
Du kannst auch eine Identitätsdatei mit einer optionalen Passphrase angeben.
Diese Option ist das Äquivalent zu `ssh -i <file>`.
Beachte, dass dies der *private* Schlüssel sein sollte, nicht der öffentliche.
Wenn du das verwechselst, wird dir ssh nur kryptische Fehlermeldungen geben.
### GPG Agent
Wenn deine Identitäten zum Beispiel auf einer Smartcard gespeichert sind, kannst du sie dem SSH-Client über den `gpg-agent` zur Verfügung stellen.
Diese Option aktiviert automatisch die SSH-Unterstützung des Agenten, falls sie noch nicht aktiviert ist, und startet den GPG-Agent-Daemon mit den richtigen Einstellungen neu.
### Yubikey PIV
Wenn deine Identitäten mit der PIV-Chipkartenfunktion des Yubikey gespeichert sind, kannst du sie mit
kannst du sie mit der YKCS11-Bibliothek von Yubico abrufen, die im Lieferumfang des Yubico PIV Tools enthalten ist.
Beachte, dass du eine aktuelle Version von OpenSSH benötigst, um diese Funktion nutzen zu können.
### Benutzerdefinierter Agent
Du kannst auch einen benutzerdefinierten Agenten verwenden, indem du hier entweder den Socket-Speicherort oder den benannten Pipe-Speicherort angibst.
Er wird dann über die Option `IdentityAgent` übergeben.
### Benutzerdefinierte PKCS#11-Bibliothek
Hiermit wird der OpenSSH-Client angewiesen, die angegebene Shared-Library-Datei zu laden, die die Authentifizierung übernimmt.
Beachte, dass du einen aktuellen Build von OpenSSH brauchst, um diese Funktion zu nutzen.

View file

@ -0,0 +1,55 @@
### None
Disables `publickey` authentication.
### SSH-Agent
In case your identities are stored in the SSH-Agent, the ssh executable can use them if the agent is started.
XPipe will automatically start the agent process if it is not running yet.
### Pageant (Windows)
In case you are using pageant on Windows, XPipe will check whether pageant is running first.
Due to the nature of pageant, it is your responsibility to have it
running as you manually have to specify all keys you would like to add every time.
If it is running, XPipe will pass the proper named pipe via
`-oIdentityAgent=...` to ssh, you don't have to include any custom config files.
Note that there are some implementation bugs in the OpenSSH client that can cause issues
if your username contains spaces or is too long, so try to use the latest version.
### Pageant (Linux & macOS)
In case your identities are stored in the pageant agent, the ssh executable can use them if the agent is started.
XPipe will automatically start the agent process if it is not running yet.
### Identity file
You can also specify an identity file with an optional passphrase.
This option is the equivalent of `ssh -i <file>`.
Note that this should be the *private* key, not the public one.
If you mix that up, ssh will only give you cryptic error messages.
### GPG Agent
If your identities are stored for example on a smartcard, you can choose to provide them to the SSH client via the `gpg-agent`.
This option will automatically enable SSH support of the agent if not enabled yet and restart the GPG agent daemon with the correct settings.
### Yubikey PIV
If your identities are stored with the PIV smart card function of the Yubikey, you can retreive
them with Yubico's YKCS11 library, which comes bundled with Yubico PIV Tool.
Note that you need an up-to-date build of OpenSSH in order to use this feature.
### Custom agent
You can also use a custom agent by providing either the socket location or named pipe location here.
This will pass it via the `IdentityAgent` option.
### Custom PKCS#11 library
This will instruct the OpenSSH client to load the specified shared library file, which will handle the authentication.
Note that you need an up-to-date build of OpenSSH in order to use this feature.

View file

@ -0,0 +1,5 @@
## Bindung
Die Bindungsinformationen, die du angibst, werden direkt an den `ssh`-Client wie folgt übergeben: `-L [origin_address:]origin_port:remote_address:remote_port`.
Standardmäßig wird der Ursprung an die Loopback-Schnittstelle gebunden, wenn nicht anders angegeben. Du kannst auch beliebige Adressplatzhalter verwenden, z.B. indem du die Adresse auf `0.0.0.0` setzt, um an alle Netzwerkschnittstellen zu binden, die über IPv4 erreichbar sind. Wenn du die Adresse komplett weglässt, wird der Platzhalter `*` verwendet, der Verbindungen zu allen Netzwerkschnittstellen erlaubt. Beachte, dass manche Netzwerkschnittstellen-Notation nicht von allen Betriebssystemen unterstützt wird. Windows-Server zum Beispiel unterstützen den Platzhalter `*` nicht.

View file

@ -0,0 +1,5 @@
## Binding
The binding information you provide is passed straight to the `ssh` client as follows: `-L [origin_address:]origin_port:remote_address:remote_port`.
By default, the origin will bind to the loopback interface if not specified otherwise. You can also make use of any address wildcards, e.g. setting the address to `0.0.0.0` in order to bind to all network interfaces accessible via IPv4. When you completely omit the address, the wildcard `*`, which allows connections on all network interfaces, will be used. Note that some network interfaces notation might not be supported on all operating systems. Windows servers for example don't support the wildcard `*`.

View file

@ -0,0 +1,7 @@
## Tunnelherkunft
XPipe ist völlig flexibel, wenn es darum geht, wo ein Befehl ausgeführt werden soll.
Deshalb kannst du einen Tunnel nicht nur auf deinem lokalen Rechner, sondern auch auf jedem anderen System starten.
Der Befehl zum Öffnen des Tunnels wird auf dem System ausgeführt, das du hier angibst. Du musst also einen `ssh`-Client auf diesem System installiert haben.
Wenn der Ursprung nicht der lokale Rechner ist, hält XPipe im Hintergrund eine Verbindung zu diesem entfernten System offen, um den Tunnel zu verwalten.

View file

@ -0,0 +1,7 @@
## Tunnel Origin
XPipe is fully flexible with regards on where to execute a command.
Therefore, you can establish a tunnel starting on any remote system in addition to your local machine.
The tunnel opener command will be executed on the system you specify here, so you need to have an `ssh` client installed on that system.
If the origin is not the local machine, XPipe will keep a connection open to that remote system in the background to manage the tunnel.

View file

@ -0,0 +1,22 @@
## SSH-Konfigurationen
Hier kannst du alle SSH-Optionen angeben, die an die Verbindung übergeben werden sollen.
Während einige Optionen für einen erfolgreichen Verbindungsaufbau unbedingt erforderlich sind, wie z.B. `HostName`,
sind viele andere Optionen rein optional.
Um einen Überblick über alle möglichen Optionen zu bekommen, kannst du [`man ssh_config`](https://linux.die.net/man/5/ssh_config) verwenden oder diesen [guide](https://www.ssh.com/academy/ssh/config) lesen.
Die genaue Anzahl der unterstützten Optionen hängt ausschließlich von deinem installierten SSH-Client ab.
### Formatierung
Der Inhalt hier entspricht einem Host-Abschnitt in einer SSH-Konfigurationsdatei.
Beachte, dass du den `Host`-Eintrag nicht explizit definieren musst, denn das wird automatisch erledigt.
Wenn du mehr als einen Host-Abschnitt definieren willst, z. B. bei abhängigen Verbindungen wie einem Proxy-Jump-Host, der von einem anderen Config-Host abhängt, solltest du stattdessen eine richtige SSH-Konfigurationsdatei verwenden, da hier nur genau eine Host-Definition unterstützt wird.
Du musst keine Formatierung mit Leerzeichen oder Einrückung vornehmen, das ist für die Funktion nicht erforderlich.
### Identitäten
Beachte, dass du hier auch eine `IdentityFile` Option angeben kannst.
Wenn diese Option hier angegeben wird, werden alle anderen Optionen für die schlüsselbasierte Authentifizierung weiter unten ignoriert.

View file

@ -0,0 +1,22 @@
## SSH configurations
Here you can specify any SSH options that should be passed to the connection.
While some options are essentially required to successfully establish a connection, such as `HostName`,
many other options are purely optional.
To get an overview over all possible options, you can use [`man ssh_config`](https://linux.die.net/man/5/ssh_config) or read this [guide](https://www.ssh.com/academy/ssh/config).
The exact amount of supported options purely depends on your installed SSH client.
### Formatting
The content here is equivalent to one host section in an SSH config file.
Note that you don't have to explicitly define the `Host` entry, as that will be done automatically.
If you intend to define more than one host section, e.g. with dependent connections such as a proxy jump host that depends on another config host, you should use a proper SSH config file instead as only exactly one host definition is supported here.
You don't have to perform any formatting with whitespace or indentation, this is not needed for it to function.
### Identities
Note that you can also specify an `IdentityFile` option in here.
If this option is specified in here, any otherwise specified key-based authentication option later down below will be ignored.

View file

@ -0,0 +1,5 @@
## Bindung
Die Bindungsinformationen, die du angibst, werden direkt an den `ssh`-Client wie folgt weitergegeben: `-R [remote_source_address:]remote_source_port:origin_destination_address:origin_destination_port`.
Standardmäßig wird die entfernte Quelladresse an die Loopback-Schnittstelle gebunden. Du kannst auch beliebige Adressplatzhalter verwenden, z.B. die Adresse `0.0.0.0`, um an alle über IPv4 erreichbaren Netzwerkschnittstellen zu binden. Wenn du die Adresse komplett weglässt, wird der Platzhalter `*` verwendet, der Verbindungen zu allen Netzwerkschnittstellen erlaubt. Beachte, dass manche Netzwerkschnittstellen-Notation nicht von allen Betriebssystemen unterstützt wird. Windows-Server zum Beispiel unterstützen den Platzhalter `*` nicht.

View file

@ -0,0 +1,5 @@
## Binding
The binding information you provide is passed straight to the `ssh` client as follows: `-R [remote_source_address:]remote_source_port:origin_destination_address:origin_destination_port`.
By default, the remote source address will bind to the loopback interface. You can also make use of any address wildcards, e.g. setting the address to `0.0.0.0` in order to bind to all network interfaces accessible via IPv4. When you completely omit the address, the wildcard `*`, which allows connections on all network interfaces, will be used. Note that some network interfaces notation might not be supported on all operating systems. Windows servers for example don't support the wildcard `*`.

View file

@ -0,0 +1,7 @@
## Tunnelherkunft
XPipe ist völlig flexibel, wenn es darum geht, wo ein Befehl ausgeführt werden soll.
Deshalb kannst du einen Tunnel nicht nur auf deinem lokalen Rechner, sondern auf jedem beliebigen System einrichten.
Der Tunnel-Opener-Befehl wird auf dem System ausgeführt, das du hier angibst. Du musst also einen `ssh`-Client auf diesem System installiert haben.
Wenn der Ursprung nicht der lokale Rechner ist, hält XPipe im Hintergrund eine Verbindung zu diesem entfernten System offen, um den Tunnel zu verwalten.

Some files were not shown because too many files have changed in this diff Show more