Rework state and license checks

This commit is contained in:
crschnick
2024-11-24 14:29:08 +00:00
parent 51288823e6
commit b18f44eaf5
27 changed files with 102 additions and 84 deletions
@@ -5,7 +5,7 @@ import io.xpipe.app.comp.base.PrettyImageHelper;
import io.xpipe.app.comp.base.StackComp;
import io.xpipe.app.resources.AppResources;
import io.xpipe.app.util.BindingsHelper;
import io.xpipe.core.process.OsNameState;
import io.xpipe.core.process.SystemState;
import io.xpipe.core.store.FileNames;
import javafx.beans.binding.Bindings;
@@ -43,7 +43,7 @@ public class OsLogoComp extends SimpleComp {
}
var ps = wrapper.getPersistentState().getValue();
if (!(ps instanceof OsNameState ons)) {
if (!(ps instanceof SystemState ons)) {
return null;
}
@@ -1,9 +1,6 @@
package io.xpipe.app.resources;
import io.xpipe.core.process.OsType;
import io.xpipe.core.process.ShellControl;
import io.xpipe.core.process.ShellDialects;
import io.xpipe.core.process.ShellStoreState;
import io.xpipe.core.process.*;
import io.xpipe.core.store.DataStore;
import io.xpipe.core.store.StatefulDataStore;
@@ -23,16 +20,16 @@ public class SystemIcons {
@Override
public boolean isApplicable(DataStore store) {
return store instanceof StatefulDataStore<?> statefulDataStore
&& statefulDataStore.getState() instanceof ShellStoreState shellStoreState
&& shellStoreState.getShellDialect() == ShellDialects.OPNSENSE;
&& statefulDataStore.getState() instanceof SystemState systemState
&& systemState.getShellDialect() == ShellDialects.OPNSENSE;
}
},
new SystemIcon("pfsense", "pfsense") {
@Override
public boolean isApplicable(DataStore store) {
return store instanceof StatefulDataStore<?> statefulDataStore
&& statefulDataStore.getState() instanceof ShellStoreState shellStoreState
&& shellStoreState.getShellDialect() == ShellDialects.PFSENSE;
&& statefulDataStore.getState() instanceof SystemState systemState
&& systemState.getShellDialect() == ShellDialects.PFSENSE;
}
},
new ContainerAutoSystemIcon("file-browser", "file browser", name -> name.contains("filebrowser")),
@@ -129,6 +129,7 @@ public class AppDownloads {
req.put("version", AppProperties.get().getVersion());
req.put("first", first);
req.put("license", LicenseProvider.get().getLicenseId());
req.put("dist", XPipeDistributionType.get().getId());
var url = URI.create("https://api.xpipe.io/version");
var builder = HttpRequest.newBuilder();
@@ -53,10 +53,10 @@ public class OptionsBuilder {
return new ChainedValidator(allValidators);
}
public OptionsBuilder choice(IntegerProperty selectedIndex, Map<String, OptionsBuilder> options) {
public OptionsBuilder choice(IntegerProperty selectedIndex, Map<ObservableValue<String>, OptionsBuilder> options) {
var list = options.entrySet().stream()
.map(e -> new ChoicePaneComp.Entry(
AppI18n.observable(e.getKey()),
e.getKey(),
e.getValue() != null ? e.getValue().buildComp() : Comp.empty()))
.toList();
var validatorList = options.values().stream()
@@ -8,6 +8,7 @@ import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.core.process.ShellControl;
import io.xpipe.core.process.ShellStoreState;
import io.xpipe.core.process.ShellTtyState;
import io.xpipe.core.process.SystemState;
import java.util.ArrayList;
import java.util.List;
@@ -19,9 +20,9 @@ public class ScanAlert {
ThreadHelper.runAsync(() -> {
var showForCon = entry == null
|| (entry.getStore() instanceof ShellStore
&& (!(entry.getStorePersistentState() instanceof ShellStoreState shellStoreState)
|| shellStoreState.getTtyState() == null
|| shellStoreState.getTtyState() == ShellTtyState.NONE));
&& (!(entry.getStorePersistentState() instanceof SystemState systemState)
|| systemState.getTtyState() == null
|| systemState.getTtyState() == ShellTtyState.NONE));
if (showForCon) {
showForShellStore(entry);
}
@@ -5,6 +5,7 @@ import io.xpipe.app.comp.base.HorizontalComp;
import io.xpipe.app.comp.base.SecretFieldComp;
import io.xpipe.app.comp.base.TextFieldComp;
import io.xpipe.app.core.App;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.storage.DataStoreSecret;
@@ -12,6 +13,7 @@ import javafx.beans.property.Property;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue;
import org.kordamp.ikonli.javafx.FontIcon;
import java.util.Arrays;
@@ -88,14 +90,14 @@ public class SecretRetrievalStrategyHelper {
new SimpleObjectProperty<>(strat instanceof SecretRetrievalStrategy.PasswordManager i ? i : null);
var customCommand =
new SimpleObjectProperty<>(strat instanceof SecretRetrievalStrategy.CustomCommand i ? i : null);
var map = new LinkedHashMap<String, OptionsBuilder>();
var map = new LinkedHashMap<ObservableValue<String>, OptionsBuilder>();
if (allowNone) {
map.put("app.none", new OptionsBuilder());
map.put(AppI18n.observable("app.none"), new OptionsBuilder());
}
map.put("app.password", inPlace(inPlace));
map.put("app.passwordManager", passwordManager(passwordManager));
map.put("app.customCommand", customCommand(customCommand));
map.put("app.prompt", new OptionsBuilder());
map.put(AppI18n.observable("app.password"), inPlace(inPlace));
map.put(AppI18n.observable("app.passwordManager"), passwordManager(passwordManager));
map.put(AppI18n.observable("app.customCommand"), customCommand(customCommand));
map.put(AppI18n.observable("app.prompt"), new OptionsBuilder());
int offset = allowNone ? 0 : -1;
var selected = new SimpleIntegerProperty(
@@ -1,6 +0,0 @@
package io.xpipe.core.process;
public interface OsNameState {
String getOsName();
}
@@ -56,10 +56,10 @@ public interface ShellControl extends ProcessControl {
String getOsName();
boolean isLicenseCheck();
ReentrantLock getLock();
void requireLicensedFeature(String id);
ShellDialect getOriginalShellDialect();
void setOriginalShellDialect(ShellDialect dialect);
@@ -14,7 +14,7 @@ import lombok.extern.jackson.Jacksonized;
@EqualsAndHashCode(callSuper = true)
@SuperBuilder(toBuilder = true)
@Jacksonized
public class ShellStoreState extends DataStoreState implements OsNameState {
public class ShellStoreState extends DataStoreState implements SystemState {
OsType.Any osType;
String osName;
@@ -6,6 +6,11 @@ public class StubShellControl extends WrapperShellControl {
super(parent);
}
@Override
public boolean canHaveSubshells() {
return parent.canHaveSubshells();
}
@Override
public void close() throws Exception {}
}
@@ -0,0 +1,12 @@
package io.xpipe.core.process;
public interface SystemState {
OsType getOsType();
String getOsName();
ShellDialect getShellDialect();
ShellTtyState getTtyState();
}
@@ -112,13 +112,13 @@ public class WrapperShellControl implements ShellControl {
}
@Override
public boolean isLicenseCheck() {
return parent.isLicenseCheck();
public ReentrantLock getLock() {
return parent.getLock();
}
@Override
public ReentrantLock getLock() {
return parent.getLock();
public void requireLicensedFeature(String id) {
parent.requireLicensedFeature(id);
}
@Override
@@ -10,6 +10,7 @@ import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.app.terminal.TerminalLauncher;
import io.xpipe.core.process.ShellStoreState;
import io.xpipe.core.process.ShellTtyState;
import io.xpipe.core.process.SystemState;
import io.xpipe.ext.base.script.ScriptHierarchy;
import javafx.beans.property.SimpleStringProperty;
@@ -259,14 +260,14 @@ public class RunScriptActionMenu implements ActionProvider {
@Override
public boolean isApplicable(DataStoreEntryRef<ShellStore> o) {
var state = o.get().getStorePersistentState();
if (state instanceof ShellStoreState shellStoreState) {
return (shellStoreState.getShellDialect() == null
|| shellStoreState
if (state instanceof SystemState systemState) {
return (systemState.getShellDialect() == null
|| systemState
.getShellDialect()
.getDumbMode()
.supportsAnyPossibleInteraction())
&& (shellStoreState.getTtyState() == null
|| shellStoreState.getTtyState() == ShellTtyState.NONE);
&& (systemState.getTtyState() == null
|| systemState.getTtyState() == ShellTtyState.NONE);
} else {
return false;
}
@@ -276,7 +277,7 @@ public class RunScriptActionMenu implements ActionProvider {
public List<? extends ActionProvider> getChildren(DataStoreEntryRef<ShellStore> store) {
var replacement = ProcessControlProvider.get().replace(store);
var state = replacement.getEntry().getStorePersistentState();
if (!(state instanceof ShellStoreState shellStoreState) || shellStoreState.getShellDialect() == null) {
if (!(state instanceof SystemState systemState) || systemState.getShellDialect() == null) {
return List.of(new NoScriptsActionProvider());
}
@@ -285,7 +286,7 @@ public class RunScriptActionMenu implements ActionProvider {
return false;
}
if (!ref.getStore().isCompatible(shellStoreState.getShellDialect())) {
if (!ref.getStore().isCompatible(systemState.getShellDialect())) {
return false;
}
@@ -9,6 +9,7 @@ import io.xpipe.app.util.ScanAlert;
import io.xpipe.core.process.ShellStoreState;
import io.xpipe.core.process.ShellTtyState;
import io.xpipe.core.process.SystemState;
import javafx.beans.value.ObservableValue;
import lombok.Value;
@@ -37,14 +38,14 @@ public class ScanStoreAction implements ActionProvider {
@Override
public boolean isApplicable(DataStoreEntryRef<ShellStore> o) {
var state = o.get().getStorePersistentState();
if (state instanceof ShellStoreState shellStoreState) {
return (shellStoreState.getShellDialect() == null
|| shellStoreState
if (state instanceof SystemState systemState) {
return (systemState.getShellDialect() == null
|| systemState
.getShellDialect()
.getDumbMode()
.supportsAnyPossibleInteraction())
&& (shellStoreState.getTtyState() == null
|| shellStoreState.getTtyState() == ShellTtyState.NONE);
&& (systemState.getTtyState() == null
|| systemState.getTtyState() == ShellTtyState.NONE);
} else {
return true;
}
@@ -13,6 +13,7 @@ import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.terminal.TerminalLauncher;
import io.xpipe.app.util.ShellStoreFormat;
import io.xpipe.core.process.ShellStoreState;
import io.xpipe.core.process.SystemState;
import io.xpipe.ext.base.script.ScriptStore;
import javafx.beans.property.BooleanProperty;
@@ -29,8 +30,8 @@ public interface ShellStoreProvider extends DataStoreProvider {
ShellStore store = replacement.getStore().asNeeded();
var control = ScriptStore.controlWithDefaultScripts(store.tempControl());
control.onInit(sc -> {
if (entry.getStorePersistentState() instanceof ShellStoreState shellStoreState
&& shellStoreState.getShellDialect() == null) {
if (entry.getStorePersistentState() instanceof SystemState systemState
&& systemState.getShellDialect() == null) {
var found = SystemIcons.detectForSystem(sc);
if (found.isPresent()) {
entry.setIcon(found.get().getIconName(), false);
+3 -3
View File
@@ -25,11 +25,11 @@ containerName=Navn på container
#custom
containerNameDescription=Det brugerdefinerede container navn
vm=Virtuel maskine
yubikeyPiv=Yubikey PIV (Pro)
yubikeyPiv=Yubikey PIV
vmDescription=Den tilknyttede konfigurationsfil.
vmwareScan=VMware desktop hypervisors
library=Bibliotek
customPkcs11Library=Brugerdefineret PKCS#11-bibliotek (Pro)
customPkcs11Library=Brugerdefineret PKCS#11-bibliotek
vmwareMachine.displayName=VMware Virtual Machine
vmwareMachine.displayDescription=Opret forbindelse til en virtuel maskine via SSH
vmwareInstallation.displayName=Installation af VMware desktop hypervisor
@@ -285,7 +285,7 @@ configLocation=Konfig-placering
configLocationDescription=Filstien til konfigurationsfilen
#custom
pageant=Pageant agent
gpgAgent=GPG Agent (Pro)
gpgAgent=GPG-agent
gateway=Gateway
#custom
gatewayDescription=Den gateway, der skal bruges når der oprettes forbindelse.
+3 -3
View File
@@ -22,11 +22,11 @@ imageNameDescription=Die zu verwendende Kennung des Containerbildes
containerName=Container-Name
containerNameDescription=Der optionale benutzerdefinierte Containername
vm=Virtuelle Maschine
yubikeyPiv=Yubikey PIV (Pro)
yubikeyPiv=Yubikey PIV
vmDescription=Die zugehörige Konfigurationsdatei.
vmwareScan=VMware Desktop-Hypervisoren
library=Bibliothek
customPkcs11Library=Benutzerdefinierte PKCS#11-Bibliothek (Pro)
customPkcs11Library=Benutzerdefinierte PKCS#11-Bibliothek
vmwareMachine.displayName=VMware Virtuelle Maschine
vmwareMachine.displayDescription=Verbindung zu einer virtuellen Maschine über SSH
vmwareInstallation.displayName=VMware Desktop Hypervisor Installation
@@ -266,7 +266,7 @@ configHostDescription=Der Host, auf dem sich die Konfiguration befindet
configLocation=Config-Speicherort
configLocationDescription=Der Dateipfad der Konfigurationsdatei
pageant=Pageant
gpgAgent=GPG Agent (Pro)
gpgAgent=GPG-Agent
gateway=Gateway
gatewayDescription=Das optionale Gateway, das bei der Verbindung verwendet wird.
connectionInformation=Verbindungsinformationen
+6 -3
View File
@@ -21,11 +21,13 @@ imageNameDescription=The container image identifier to use
containerName=Container name
containerNameDescription=The optional custom container name
vm=Virtual machine
yubikeyPiv=Yubikey PIV (Pro)
#force
yubikeyPiv=Yubikey PIV
vmDescription=The associated configuration file.
vmwareScan=VMware desktop hypervisors
library=Library
customPkcs11Library=Custom PKCS#11 library (Pro)
#force
customPkcs11Library=Custom PKCS#11 library
vmwareMachine.displayName=VMware Virtual Machine
vmwareMachine.displayDescription=Connect to a virtual machine via SSH
vmwareInstallation.displayName=VMware desktop hypervisor installation
@@ -264,7 +266,8 @@ 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)
#force
gpgAgent=GPG Agent
gateway=Gateway
gatewayDescription=The optional gateway to use when connecting.
connectionInformation=Connection information
+3 -3
View File
@@ -21,11 +21,11 @@ imageNameDescription=El identificador de la imagen contenedora a utilizar
containerName=Nombre del contenedor
containerNameDescription=El nombre opcional del contenedor personalizado
vm=Máquina virtual
yubikeyPiv=Yubikey PIV (Pro)
yubikeyPiv=Yubikey PIV
vmDescription=El archivo de configuración asociado.
vmwareScan=Hipervisores de escritorio VMware
library=Biblioteca
customPkcs11Library=Biblioteca PKCS#11 personalizada (Pro)
customPkcs11Library=Biblioteca PKCS#11 personalizada
vmwareMachine.displayName=Máquina virtual VMware
vmwareMachine.displayDescription=Conectarse a una máquina virtual mediante SSH
vmwareInstallation.displayName=Instalación del hipervisor de escritorio VMware
@@ -263,7 +263,7 @@ configHostDescription=El host en el que se encuentra la configuración
configLocation=Ubicación de la configuración
configLocationDescription=La ruta del archivo de configuración
pageant=Concurso
gpgAgent=Agente GPG (Pro)
gpgAgent=Agente GPG
gateway=Pasarela
gatewayDescription=La puerta de enlace opcional que se utilizará al conectarse.
connectionInformation=Información de conexión
+3 -3
View File
@@ -21,11 +21,11 @@ imageNameDescription=L'identifiant de l'image du conteneur à utiliser
containerName=Nom du conteneur
containerNameDescription=Le nom facultatif du conteneur personnalisé
vm=Machine virtuelle
yubikeyPiv=Yubikey PIV (Pro)
yubikeyPiv=Yubikey PIV
vmDescription=Le fichier de configuration associé.
vmwareScan=Hyperviseurs de bureau VMware
library=Bibliothèque
customPkcs11Library=Bibliothèque PKCS#11 personnalisée (Pro)
customPkcs11Library=Bibliothèque PKCS#11 personnalisée
vmwareMachine.displayName=Machine virtuelle VMware
vmwareMachine.displayDescription=Se connecter à une machine virtuelle via SSH
vmwareInstallation.displayName=Installation de l'hyperviseur de bureau VMware
@@ -263,7 +263,7 @@ configHostDescription=L'hôte sur lequel se trouve le config
configLocation=Emplacement de la configuration
configLocationDescription=Le chemin d'accès au fichier de configuration
pageant=Pageant
gpgAgent=Agent GPG (Pro)
gpgAgent=Agent GPG
gateway=Passerelle
gatewayDescription=La passerelle optionnelle à utiliser lors de la connexion.
connectionInformation=Informations sur la connexion
+3 -3
View File
@@ -21,11 +21,11 @@ imageNameDescription=L'identificatore dell'immagine del contenitore da utilizzar
containerName=Nome del contenitore
containerNameDescription=Il nome opzionale del contenitore personalizzato
vm=Macchina virtuale
yubikeyPiv=Yubikey PIV (Pro)
yubikeyPiv=Yubikey PIV
vmDescription=Il file di configurazione associato.
vmwareScan=Ipervisori desktop VMware
library=Biblioteca
customPkcs11Library=Libreria PKCS#11 personalizzata (Pro)
customPkcs11Library=Libreria PKCS#11 personalizzata
vmwareMachine.displayName=Macchina virtuale VMware
vmwareMachine.displayDescription=Connettersi a una macchina virtuale tramite SSH
vmwareInstallation.displayName=Installazione dell'hypervisor desktop VMware
@@ -263,7 +263,7 @@ configHostDescription=L'host su cui si trova la configurazione
configLocation=Posizione della configurazione
configLocationDescription=Il percorso del file di configurazione
pageant=Pagina
gpgAgent=Agente GPG (Pro)
gpgAgent=Agente GPG
gateway=Gateway
gatewayDescription=Il gateway opzionale da utilizzare per la connessione.
connectionInformation=Informazioni sulla connessione
+3 -3
View File
@@ -21,11 +21,11 @@ imageNameDescription=使用するコンテナ画像識別子
containerName=コンテナ名
containerNameDescription=オプションのカスタムコンテナ名
vm=仮想マシン
yubikeyPiv=ユビキーPIV(プロ)
yubikeyPiv=ユビキーPIV
vmDescription=関連する設定ファイル。
vmwareScan=VMwareデスクトップハイパーバイザー
library=ライブラリ
customPkcs11Library=カスタムPKCS#11ライブラリ(Pro)
customPkcs11Library=カスタムPKCS#11ライブラリ
vmwareMachine.displayName=VMware仮想マシン
vmwareMachine.displayDescription=SSH経由で仮想マシンに接続する
vmwareInstallation.displayName=VMwareデスクトップハイパーバイザーのインストール
@@ -263,7 +263,7 @@ configHostDescription=コンフィグが置かれているホスト
configLocation=設定場所
configLocationDescription=コンフィグファイルのファイルパス
pageant=ページェント
gpgAgent=GPGエージェント(Pro)
gpgAgent=GPGエージェント
gateway=ゲートウェイ
gatewayDescription=接続時に使用するオプションのゲートウェイ。
connectionInformation=接続情報
+3 -3
View File
@@ -21,11 +21,11 @@ imageNameDescription=De te gebruiken container image identifier
containerName=Containernaam
containerNameDescription=De optionele aangepaste containernaam
vm=Virtuele machine
yubikeyPiv=Yubikey PIV (Pro)
yubikeyPiv=Yubikey PIV
vmDescription=Het bijbehorende configuratiebestand.
vmwareScan=VMware desktop hypervisors
library=Bibliotheek
customPkcs11Library=Aangepaste PKCS#11-bibliotheek (Pro)
customPkcs11Library=Aangepaste PKCS#11-bibliotheek
vmwareMachine.displayName=VMware virtuele machine
vmwareMachine.displayDescription=Verbinding maken met een virtuele machine via SSH
vmwareInstallation.displayName=VMware desktop hypervisor installatie
@@ -263,7 +263,7 @@ configHostDescription=De host waarop de config zich bevindt
configLocation=Configuratie locatie
configLocationDescription=Het bestandspad van het configuratiebestand
pageant=Verkiezing
gpgAgent=GPG Agent (Pro)
gpgAgent=GPG-agent
gateway=Gateway
gatewayDescription=De optionele gateway om te gebruiken bij het verbinden.
connectionInformation=Verbindingsinformatie
+3 -3
View File
@@ -21,11 +21,11 @@ imageNameDescription=O identificador de imagem de contentor a utilizar
containerName=Nome do contentor
containerNameDescription=O nome opcional do contentor personalizado
vm=Máquina virtual
yubikeyPiv=Yubikey PIV (Pro)
yubikeyPiv=Yubikey PIV
vmDescription=O ficheiro de configuração associado.
vmwareScan=Hipervisores de desktop VMware
library=Biblioteca
customPkcs11Library=Biblioteca PKCS#11 personalizada (Pro)
customPkcs11Library=Biblioteca PKCS#11 personalizada
vmwareMachine.displayName=Máquina virtual VMware
vmwareMachine.displayDescription=Liga-te a uma máquina virtual através de SSH
vmwareInstallation.displayName=Instalação do hipervisor de ambiente de trabalho VMware
@@ -263,7 +263,7 @@ configHostDescription=O host no qual a configuração está localizada
configLocation=Local de configuração
configLocationDescription=O caminho do ficheiro de configuração
pageant=Concurso
gpgAgent=Agente GPG (Pro)
gpgAgent=Agente GPG
gateway=Gateway
gatewayDescription=O gateway opcional a utilizar quando estabelece a ligação.
connectionInformation=Informação de ligação
+3 -3
View File
@@ -21,11 +21,11 @@ imageNameDescription=Идентификатор образа контейнер
containerName=Название контейнера
containerNameDescription=Необязательное пользовательское название контейнера
vm=Виртуальная машина
yubikeyPiv=Yubikey PIV (Pro)
yubikeyPiv=Yubikey PIV
vmDescription=Связанный с ним файл конфигурации.
vmwareScan=Гипервизоры VMware для настольных компьютеров
library=Библиотека
customPkcs11Library=Пользовательская библиотека PKCS#11 (Pro)
customPkcs11Library=Пользовательская библиотека PKCS#11
vmwareMachine.displayName=Виртуальная машина VMware
vmwareMachine.displayDescription=Подключение к виртуальной машине через SSH
vmwareInstallation.displayName=Установка гипервизора VMware для настольных компьютеров
@@ -263,7 +263,7 @@ configHostDescription=Хост, на котором расположен кон
configLocation=Расположение конфигурации
configLocationDescription=Путь к файлу конфигурации
pageant=Pageant
gpgAgent=GPG Agent (Pro)
gpgAgent=Агент GPG
gateway=Шлюз
gatewayDescription=Дополнительный шлюз, который нужно использовать при подключении.
connectionInformation=Информация о подключении
+3 -3
View File
@@ -21,11 +21,11 @@ imageNameDescription=Kullanılacak konteyner imaj tanımlayıcısı
containerName=Konteyner adı
containerNameDescription=İsteğe bağlı özel konteyner adı
vm=Sanal makine
yubikeyPiv=Yubikey PIV (Pro)
yubikeyPiv=Yubikey PIV
vmDescription=İlişkili yapılandırma dosyası.
vmwareScan=VMware masaüstü hipervizörleri
library=Kütüphane
customPkcs11Library=Özel PKCS#11 kütüphanesi (Pro)
customPkcs11Library=Özel PKCS#11 kütüphanesi
vmwareMachine.displayName=VMware Sanal Makinesi
vmwareMachine.displayDescription=SSH aracılığıyla bir sanal makineye bağlanma
vmwareInstallation.displayName=VMware masaüstü hipervizör kurulumu
@@ -263,7 +263,7 @@ configHostDescription=Yapılandırmanın üzerinde bulunduğu ana bilgisayar
configLocation=Konfigürasyon konumu
configLocationDescription=Yapılandırma dosyasının dosya yolu
pageant=Pageant
gpgAgent=GPG Agent (Pro)
gpgAgent=GPG Temsilcisi
gateway=Ağ Geçidi
gatewayDescription=Bağlanırken kullanılacak isteğe bağlı ağ geçidi.
connectionInformation=Bağlantı bilgileri
+3 -3
View File
@@ -21,11 +21,11 @@ imageNameDescription=要使用的容器图像标识符
containerName=容器名称
containerNameDescription=可选的自定义容器名称
vm=虚拟机
yubikeyPiv=Yubikey PIV (Pro)
yubikeyPiv=Yubikey PIV
vmDescription=相关的配置文件。
vmwareScan=VMware 桌面管理程序
library=图书馆
customPkcs11Library=自定义 PKCS#11 库(专业版)
customPkcs11Library=自定义 PKCS#11 库
vmwareMachine.displayName=VMware 虚拟机
vmwareMachine.displayDescription=通过 SSH 连接虚拟机
vmwareInstallation.displayName=安装 VMware 桌面管理程序
@@ -263,7 +263,7 @@ configHostDescription=配置所在的主机
configLocation=配置位置
configLocationDescription=配置文件的文件路径
pageant=页面
gpgAgent=GPG 代理(专业版)
gpgAgent=GPG 代理
gateway=网关
gatewayDescription=连接时使用的可选网关。
connectionInformation=连接信息