Add custom service open action

This commit is contained in:
crschnick
2025-01-21 14:00:26 +00:00
parent 5877d741b0
commit bae90df7dc
21 changed files with 171 additions and 38 deletions
@@ -96,7 +96,7 @@ public abstract class AbstractServiceStoreProvider implements SingletonSessionSt
() -> {
var desc = formatService(s);
var type = s.getServiceProtocolType() != null
&& !(s.getServiceProtocolType() instanceof ServiceProtocolType.None)
&& !(s.getServiceProtocolType() instanceof ServiceProtocolType.Undefined)
? AppI18n.get(s.getServiceProtocolType().getTranslationKey())
: null;
var state = !s.requiresTunnel()
@@ -9,7 +9,7 @@ import javafx.beans.value.ObservableValue;
import lombok.Value;
public class ServiceCopyUrlAction implements ActionProvider {
public class ServiceCopyAddressAction implements ActionProvider {
@Override
public LeafDataStoreCallSite<?> getLeafDataStoreCallSite() {
@@ -37,7 +37,7 @@ public class ServiceCopyUrlAction implements ActionProvider {
@Override
public ObservableValue<String> getName(DataStoreEntryRef<AbstractServiceStore> store) {
return AppI18n.observable("copyUrl");
return AppI18n.observable("copyAddress");
}
@Override
@@ -59,7 +59,7 @@ public class ServiceCopyUrlAction implements ActionProvider {
? serviceStore.getSession().getLocalPort()
: serviceStore.getRemotePort();
var base = "localhost:" + l;
var full = serviceStore.getServiceProtocolType().formatUrl(base);
var full = serviceStore.getServiceProtocolType().formatAddress(base);
ClipboardHelper.copyUrl(full);
}
}
@@ -34,7 +34,7 @@ public class ServiceOpenAction implements ActionProvider {
? serviceStore.getSession().getLocalPort()
: serviceStore.getRemotePort();
var base = "localhost:" + l;
var full = serviceStore.getServiceProtocolType().formatUrl(base);
var full = serviceStore.getServiceProtocolType().formatAddress(base);
serviceStore.getServiceProtocolType().open(full);
}
}
@@ -1,25 +1,35 @@
package io.xpipe.ext.base.service;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.prefs.ExternalApplicationHelper;
import io.xpipe.app.util.CommandSupport;
import io.xpipe.app.util.Hyperlinks;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.xpipe.app.util.LocalShell;
import io.xpipe.core.process.CommandBuilder;
import io.xpipe.core.process.OsType;
import lombok.Builder;
import lombok.Value;
import lombok.extern.jackson.Jacksonized;
import java.util.Locale;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = ServiceProtocolType.None.class),
@JsonSubTypes.Type(value = ServiceProtocolType.Undefined.class),
@JsonSubTypes.Type(value = ServiceProtocolType.Http.class),
@JsonSubTypes.Type(value = ServiceProtocolType.Https.class)
@JsonSubTypes.Type(value = ServiceProtocolType.Https.class),
@JsonSubTypes.Type(value = ServiceProtocolType.Custom.class)
})
public interface ServiceProtocolType {
String formatUrl(String base);
String formatAddress(String base);
void open(String url);
void open(String url) throws Exception;
String getTranslationKey();
@@ -27,10 +37,10 @@ public interface ServiceProtocolType {
@Value
@Jacksonized
@Builder
class None implements ServiceProtocolType {
class Undefined implements ServiceProtocolType {
@Override
public String formatUrl(String base) {
public String formatAddress(String base) {
return base;
}
@@ -39,7 +49,7 @@ public interface ServiceProtocolType {
@Override
public String getTranslationKey() {
return "none";
return "undefined";
}
}
@@ -52,7 +62,7 @@ public interface ServiceProtocolType {
String path;
@Override
public String formatUrl(String base) {
public String formatAddress(String base) {
var url = "http://" + base;
if (path != null && !path.isEmpty()) {
url += (!path.startsWith("/") ? "/" : "") + path;
@@ -80,7 +90,7 @@ public interface ServiceProtocolType {
String path;
@Override
public String formatUrl(String base) {
public String formatAddress(String base) {
var url = "https://" + base;
if (path != null && !path.isEmpty()) {
url += (!path.startsWith("/") ? "/" : "") + path;
@@ -98,4 +108,40 @@ public interface ServiceProtocolType {
return "https";
}
}
@JsonTypeName("custom")
@Value
@Jacksonized
@Builder
class Custom implements ServiceProtocolType {
String commandTemplate;
@Override
public String formatAddress(String base) {
return base;
}
@Override
public void open(String url) throws Exception {
if (commandTemplate == null || commandTemplate.isBlank()) {
return;
}
var format = commandTemplate.toLowerCase(Locale.ROOT).contains("$address") ? commandTemplate : commandTemplate + " $ADDRESS";
try (var pc = LocalShell.getShell().start()) {
var toExecute = ExternalApplicationHelper.replaceFileArgument(format, "ADDRESS", url);
var command = CommandBuilder.of().add(toExecute);
// We can't be sure whether the command is blocking or not, so always make it not blocking
command = pc.getShellDialect().launchAsnyc(command);
pc.command(command).execute();
}
}
@Override
public String getTranslationKey() {
return "custom";
}
}
}
@@ -1,18 +1,41 @@
package io.xpipe.ext.base.service;
import io.xpipe.app.comp.Comp;
import io.xpipe.app.comp.CompStructure;
import io.xpipe.app.comp.base.TextFieldComp;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.util.OptionsBuilder;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.*;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TextField;
import java.util.LinkedHashMap;
public class ServiceProtocolTypeHelper {
private static OptionsBuilder custom(Property<ServiceProtocolType.Custom> p) {
var firstFocus = new SimpleBooleanProperty(false);
var path = new SimpleStringProperty(p.getValue() != null ? p.getValue().getCommandTemplate() : null);
var comp = new TextFieldComp(path).apply(struc -> {
struc.get().focusedProperty().addListener((observable, oldValue, newValue) -> {
if (!firstFocus.get()) {
struc.get().getParent().requestFocus();
firstFocus.set(true);
}
});
struc.get().setPromptText("mycommand open $ADDRESS");
});
return new OptionsBuilder()
.nameAndDescription("serviceCommand")
.addComp(comp, path)
.bind(
() -> {
return new ServiceProtocolType.Custom(path.get());
},
p);
}
private static OptionsBuilder http(Property<ServiceProtocolType.Http> p) {
var path = new SimpleStringProperty(p.getValue() != null ? p.getValue().getPath() : null);
return new OptionsBuilder()
@@ -41,25 +64,29 @@ public class ServiceProtocolTypeHelper {
var ex = serviceProtocolType.getValue();
var http = new SimpleObjectProperty<>(ex instanceof ServiceProtocolType.Http h ? h : null);
var https = new SimpleObjectProperty<>(ex instanceof ServiceProtocolType.Https h ? h : null);
var custom = new SimpleObjectProperty<>(ex instanceof ServiceProtocolType.Custom c ? c : null);
var selected = new SimpleIntegerProperty(
ex instanceof ServiceProtocolType.None
ex instanceof ServiceProtocolType.Undefined
? 0
: ex instanceof ServiceProtocolType.Http
? 1
: ex instanceof ServiceProtocolType.Https ? 2 : -1);
: ex instanceof ServiceProtocolType.Https ? 2 :
ex instanceof ServiceProtocolType.Custom ? 3 : -1);
var available = new LinkedHashMap<ObservableValue<String>, OptionsBuilder>();
available.put(AppI18n.observable("none"), new OptionsBuilder());
available.put(AppI18n.observable("undefined"), new OptionsBuilder());
available.put(AppI18n.observable("http"), http(http));
available.put(AppI18n.observable("https"), https(https));
available.put(AppI18n.observable("custom"), custom(custom));
return new OptionsBuilder()
.nameAndDescription("serviceProtocolType")
.choice(selected, available)
.bindChoice(
() -> {
return switch (selected.get()) {
case 0 -> new SimpleObjectProperty<>(new ServiceProtocolType.None());
case 0 -> new SimpleObjectProperty<>(new ServiceProtocolType.Undefined());
case 1 -> http;
case 2 -> https;
case 3 -> custom;
default -> new SimpleObjectProperty<>();
};
},
+1 -1
View File
@@ -81,7 +81,7 @@ open module io.xpipe.ext.base {
StorePauseAction,
StoreRestartAction,
ServiceOpenAction,
ServiceCopyUrlAction,
ServiceCopyAddressAction,
CloneStoreAction,
RefreshChildrenStoreAction,
RunScriptActionMenu,
+5 -1
View File
@@ -1263,7 +1263,9 @@ updateNagTitle=Påmindelse om opdatering
updateNagButton=Se udgivelser
refreshServices=Opdater tjenester
serviceProtocolType=Type serviceprotokol
serviceProtocolTypeDescription=Den protokol, der skal bruges til at åbne tjenesten
serviceProtocolTypeDescription=Kontrollerer, hvordan man åbner tjenesten
serviceCommand=Den kommando, der skal køres, når tjenesten er aktiv
serviceCommandDescription=Pladsholderen $ADDRESS vil blive erstattet med den faktiske tunnelerede adresse
value=Værdi
showAdvancedOptions=Vis avancerede indstillinger
sshAdditionalConfigOptions=Yderligere konfigurationsmuligheder
@@ -1272,3 +1274,5 @@ clearUserData=Sletning af brugerdata
clearUserDataDescription=Slet alle brugerkonfigurationsdata, herunder forbindelser
clearUserDataTitle=Sletning af brugerdata
clearUserDataContent=Dette vil slette alle lokale brugerdata for xpipe og genstarte. Hvis du er interesseret i dine forbindelser, skal du sørge for at synkronisere dem først med et git-repository.
undefined=Udefineret
copyAddress=Kopier adresse
+5 -1
View File
@@ -1245,7 +1245,9 @@ updateNagTitle=Update-Erinnerung
updateNagButton=Siehe Veröffentlichungen
refreshServices=Dienste aktualisieren
serviceProtocolType=Dienstprotokolltyp
serviceProtocolTypeDescription=Das Protokoll, das zum Öffnen des Dienstes verwendet wird
serviceProtocolTypeDescription=Steuern, wie der Dienst geöffnet werden soll
serviceCommand=Der Befehl, der ausgeführt wird, sobald der Dienst aktiv ist
serviceCommandDescription=Der Platzhalter $ADDRESS wird durch die tatsächliche getunnelte Adresse ersetzt
value=Wert
showAdvancedOptions=Erweiterte Optionen anzeigen
sshAdditionalConfigOptions=Zusätzliche Konfigurationsoptionen
@@ -1254,3 +1256,5 @@ clearUserData=Benutzerdaten löschen
clearUserDataDescription=Löschen aller Benutzerkonfigurationsdaten, einschließlich der Verbindungen
clearUserDataTitle=Löschung von Benutzerdaten
clearUserDataContent=Dadurch werden alle lokalen Benutzerdaten für xpipe gelöscht und neu gestartet. Wenn du dich um deine Verbindungen sorgst, solltest du sie vorher mit einem Git-Repository synchronisieren.
undefined=Undefiniert
copyAddress=Adresse kopieren
+5 -1
View File
@@ -1266,7 +1266,9 @@ updateNagTitle=Update reminder
updateNagButton=See releases
refreshServices=Refresh services
serviceProtocolType=Service protocol type
serviceProtocolTypeDescription=The protocol to use to open the service
serviceProtocolTypeDescription=Control how to open the service
serviceCommand=The command to run once the service is active
serviceCommandDescription=The placeholder $ADDRESS will be replaced with the actual tunneled address
value=Value
showAdvancedOptions=Show advanced options
sshAdditionalConfigOptions=Additional config options
@@ -1275,3 +1277,5 @@ clearUserData=Delete user data
clearUserDataDescription=Delete all user configuration data, including connections
clearUserDataTitle=User data deletion
clearUserDataContent=This will delete all local user data for xpipe and restart. If you care about your connections, make sure to synchronize them first with a git repository.
undefined=Undefined
copyAddress=Copy address
+5 -1
View File
@@ -1216,7 +1216,9 @@ updateNagTitle=Recordatorio de actualización
updateNagButton=Ver liberaciones
refreshServices=Actualizar servicios
serviceProtocolType=Tipo de protocolo de servicio
serviceProtocolTypeDescription=El protocolo a utilizar para abrir el servicio
serviceProtocolTypeDescription=Controla cómo abrir el servicio
serviceCommand=El comando a ejecutar una vez que el servicio esté activo
serviceCommandDescription=El marcador de posición $ADDRESS se sustituirá por la dirección real del túnel
value=Valor
showAdvancedOptions=Mostrar opciones avanzadas
sshAdditionalConfigOptions=Opciones de configuración adicionales
@@ -1225,3 +1227,5 @@ clearUserData=Borrar datos de usuario
clearUserDataDescription=Borrar todos los datos de configuración del usuario, incluidas las conexiones
clearUserDataTitle=Eliminación de datos de usuario
clearUserDataContent=Esto borrará todos los datos de usuario locales de xpipe y se reiniciará. Si te preocupan tus conexiones, asegúrate de sincronizarlas primero con un repositorio git.
undefined=Sin definir
copyAddress=Copiar dirección
+5 -1
View File
@@ -1251,7 +1251,9 @@ updateNagTitle=Rappel de mise à jour
updateNagButton=Voir les communiqués
refreshServices=Services de rafraîchissement
serviceProtocolType=Type de protocole de service
serviceProtocolTypeDescription=Le protocole à utiliser pour ouvrir le service
serviceProtocolTypeDescription=Contrôle la façon d'ouvrir le service
serviceCommand=La commande à exécuter une fois que le service est actif
serviceCommandDescription=L'espace réservé $ADDRESS sera remplacé par l'adresse réelle du tunnel
value=Valeur
showAdvancedOptions=Afficher les options avancées
sshAdditionalConfigOptions=Options de configuration supplémentaires
@@ -1260,3 +1262,5 @@ clearUserData=Effacer les données de l'utilisateur
clearUserDataDescription=Supprimer toutes les données de configuration de l'utilisateur, y compris les connexions
clearUserDataTitle=Suppression des données de l'utilisateur
clearUserDataContent=Cela supprimera toutes les données utilisateur locales pour xpipe et redémarrera. Si tu tiens à tes connexions, assure-toi de les synchroniser d'abord avec un dépôt git.
undefined=Non défini
copyAddress=Adresse de copie
+5 -1
View File
@@ -1216,7 +1216,9 @@ updateNagTitle=Pengingat pembaruan
updateNagButton=Lihat rilis
refreshServices=Menyegarkan layanan
serviceProtocolType=Jenis protokol layanan
serviceProtocolTypeDescription=Protokol yang digunakan untuk membuka layanan
serviceProtocolTypeDescription=Mengontrol cara membuka layanan
serviceCommand=Perintah untuk dijalankan setelah layanan aktif
serviceCommandDescription=Penampung $ADDRESS akan diganti dengan alamat yang sebenarnya
value=Nilai
showAdvancedOptions=Menampilkan opsi lanjutan
sshAdditionalConfigOptions=Opsi konfigurasi tambahan
@@ -1225,3 +1227,5 @@ clearUserData=Menghapus data pengguna
clearUserDataDescription=Menghapus semua data konfigurasi pengguna, termasuk koneksi
clearUserDataTitle=Penghapusan data pengguna
clearUserDataContent=Ini akan menghapus semua data pengguna lokal untuk xpipe dan memulai ulang. Jika Anda peduli dengan koneksi Anda, pastikan untuk menyinkronkannya terlebih dahulu dengan repositori git.
undefined=Tidak terdefinisi
copyAddress=Alamat salinan
+5 -1
View File
@@ -1216,7 +1216,9 @@ updateNagTitle=Promemoria di aggiornamento
updateNagButton=Vedere i comunicati
refreshServices=Aggiorna i servizi
serviceProtocolType=Tipo di protocollo di servizio
serviceProtocolTypeDescription=Il protocollo da utilizzare per aprire il servizio
serviceProtocolTypeDescription=Controlla come aprire il servizio
serviceCommand=Il comando da eseguire una volta che il servizio è attivo
serviceCommandDescription=Il segnaposto $ADDRESS sarà sostituito dall'indirizzo effettivo del tunnel
value=Valore
showAdvancedOptions=Mostra opzioni avanzate
sshAdditionalConfigOptions=Opzioni di configurazione aggiuntive
@@ -1225,3 +1227,5 @@ clearUserData=Cancellare i dati dell'utente
clearUserDataDescription=Elimina tutti i dati di configurazione dell'utente, comprese le connessioni
clearUserDataTitle=Cancellazione dei dati dell'utente
clearUserDataContent=In questo modo verranno cancellati tutti i dati degli utenti locali di xpipe e verrà riavviato. Se tieni alle tue connessioni, assicurati di sincronizzarle prima con un repository git.
undefined=Non definito
copyAddress=Indirizzo di copia
+5 -1
View File
@@ -1216,7 +1216,9 @@ updateNagTitle=更新リマインダー
updateNagButton=リリースを見る
refreshServices=リフレッシュ・サービス
serviceProtocolType=サービスプロトコルタイプ
serviceProtocolTypeDescription=サービスを開くために使用するプロトコル
serviceProtocolTypeDescription=サービスを開く方法を制御する
serviceCommand=サービスがアクティブになったら実行するコマンド
serviceCommandDescription=プレースホルダー$ADDRESSは実際のトンネルアドレスに置き換えられる
value=価値
showAdvancedOptions=詳細オプションを表示する
sshAdditionalConfigOptions=追加設定オプション
@@ -1225,3 +1227,5 @@ clearUserData=ユーザーデータを削除する
clearUserDataDescription=接続を含むすべてのユーザー設定データを削除する
clearUserDataTitle=ユーザーデータの削除
clearUserDataContent=これでxpipeのローカルユーザーデータがすべて削除され、再起動する。接続が気になるなら、まずgitリポジトリと同期させること。
undefined=未定義
copyAddress=コピーアドレス
+5 -1
View File
@@ -1216,7 +1216,9 @@ updateNagTitle=Herinnering bijwerken
updateNagButton=Bekijk uitgaven
refreshServices=Diensten verversen
serviceProtocolType=Type serviceprotocol
serviceProtocolTypeDescription=Het te gebruiken protocol om de service te openen
serviceProtocolTypeDescription=Bepalen hoe de service moet worden geopend
serviceCommand=Het commando dat wordt uitgevoerd zodra de service actief is
serviceCommandDescription=De placeholder $ADDRESS wordt vervangen door het werkelijke getunnelde adres
value=Waarde
showAdvancedOptions=Geavanceerde opties weergeven
sshAdditionalConfigOptions=Extra configuratie-opties
@@ -1225,3 +1227,5 @@ clearUserData=Gebruikersgegevens verwijderen
clearUserDataDescription=Alle configuratiegegevens van gebruikers verwijderen, inclusief verbindingen
clearUserDataTitle=Verwijderen van gebruikersgegevens
clearUserDataContent=Hierdoor worden alle lokale gebruikersgegevens voor xpipe verwijderd en opnieuw opgestart. Als je om je verbindingen geeft, zorg er dan voor dat je ze eerst synchroniseert met een git repository.
undefined=Ongedefinieerd
copyAddress=Adres kopiëren
+5 -1
View File
@@ -1216,7 +1216,9 @@ updateNagTitle=Przypomnienie o aktualizacji
updateNagButton=Zobacz wydania
refreshServices=Usługi odświeżania
serviceProtocolType=Typ protokołu usługi
serviceProtocolTypeDescription=Protokół używany do otwarcia usługi
serviceProtocolTypeDescription=Kontroluj sposób otwierania usługi
serviceCommand=Polecenie do uruchomienia, gdy usługa jest aktywna
serviceCommandDescription=Symbol zastępczy $ADDRESS zostanie zastąpiony rzeczywistym adresem tunelowanym
value=Wartość
showAdvancedOptions=Pokaż opcje zaawansowane
sshAdditionalConfigOptions=Dodatkowe opcje konfiguracji
@@ -1225,3 +1227,5 @@ clearUserData=Usuń dane użytkownika
clearUserDataDescription=Usuń wszystkie dane konfiguracyjne użytkownika, w tym połączenia
clearUserDataTitle=Usuwanie danych użytkownika
clearUserDataContent=Spowoduje to usunięcie wszystkich lokalnych danych użytkownika dla xpipe i ponowne uruchomienie. Jeśli zależy ci na połączeniach, zsynchronizuj je najpierw z repozytorium git.
undefined=Niezdefiniowany
copyAddress=Kopiuj adres
+5 -1
View File
@@ -1216,7 +1216,9 @@ updateNagTitle=Lembrete de atualização
updateNagButton=Ver lançamentos
refreshServices=Atualizar serviços
serviceProtocolType=Tipo de protocolo de serviço
serviceProtocolTypeDescription=O protocolo a utilizar para abrir o serviço
serviceProtocolTypeDescription=Controla a forma de abrir o serviço
serviceCommand=O comando a executar quando o serviço estiver ativo
serviceCommandDescription=O espaço reservado $ADDRESS será substituído pelo endereço real do túnel
value=Valoriza
showAdvancedOptions=Mostra opções avançadas
sshAdditionalConfigOptions=Opções de configuração adicionais
@@ -1225,3 +1227,5 @@ clearUserData=Eliminar dados do utilizador
clearUserDataDescription=Elimina todos os dados de configuração do utilizador, incluindo as ligações
clearUserDataTitle=Eliminação de dados do utilizador
clearUserDataContent=Isto irá apagar todos os dados do utilizador local para o xpipe e reiniciar. Se te preocupas com as tuas ligações, certifica-te que as sincronizas primeiro com um repositório git.
undefined=Não definido
copyAddress=Copia o endereço
+5 -1
View File
@@ -1216,7 +1216,9 @@ updateNagTitle=Напоминание об обновлении
updateNagButton=Смотри релизы
refreshServices=Обновление сервисов
serviceProtocolType=Тип протокола обслуживания
serviceProtocolTypeDescription=Протокол, который нужно использовать для открытия сервиса
serviceProtocolTypeDescription=Управление тем, как открыть сервис
serviceCommand=Команда, которую нужно выполнить, как только служба станет активной
serviceCommandDescription=Заполнитель $ADDRESS будет заменен на реальный туннелируемый адрес
value=Значение
showAdvancedOptions=Показать дополнительные опции
sshAdditionalConfigOptions=Дополнительные параметры конфигурации
@@ -1225,3 +1227,5 @@ clearUserData=Удаление пользовательских данных
clearUserDataDescription=Удалить все данные о конфигурации пользователя, включая соединения
clearUserDataTitle=Удаление пользовательских данных
clearUserDataContent=Это приведет к удалению всех локальных пользовательских данных для xpipe и перезапуску. Если ты заботишься о своих подключениях, не забудь сначала синхронизировать их с git-репозиторием.
undefined=Неопределенный
copyAddress=Адрес копирования
+5 -1
View File
@@ -1216,7 +1216,9 @@ updateNagTitle=Påminnelse om uppdatering
updateNagButton=Se releaser
refreshServices=Uppdatera tjänster
serviceProtocolType=Typ av serviceprotokoll
serviceProtocolTypeDescription=Protokollet som ska användas för att öppna tjänsten
serviceProtocolTypeDescription=Styr hur tjänsten ska öppnas
serviceCommand=Kommandot som ska köras när tjänsten är aktiv
serviceCommandDescription=Platshållaren $ADDRESS kommer att ersättas med den faktiska tunnlade adressen
value=Värde
showAdvancedOptions=Visa avancerade alternativ
sshAdditionalConfigOptions=Ytterligare konfigurationsalternativ
@@ -1225,3 +1227,5 @@ clearUserData=Ta bort användardata
clearUserDataDescription=Ta bort alla användarkonfigurationsdata, inklusive anslutningar
clearUserDataTitle=Radering av användardata
clearUserDataContent=Detta kommer att radera alla lokala användardata för xpipe och starta om. Om du bryr dig om dina anslutningar, se till att synkronisera dem först med ett git-arkiv.
undefined=Odefinierad
copyAddress=Kopiera adress
+5 -1
View File
@@ -1216,7 +1216,9 @@ updateNagTitle=Güncelleme hatırlatması
updateNagButton=Yayınlara bakın
refreshServices=Yenileme hizmetleri
serviceProtocolType=Hizmet protokolü türü
serviceProtocolTypeDescription=Hizmeti açmak için kullanılacak protokol
serviceProtocolTypeDescription=Hizmetin nasıl açılacağını kontrol edin
serviceCommand=Hizmet etkin olduğunda çalıştırılacak komut
serviceCommandDescription=ADDRESS yer tutucusu gerçek tünellenmiş adres ile değiştirilecektir
value=Değer
showAdvancedOptions=Gelişmiş seçenekleri göster
sshAdditionalConfigOptions=Ek yapılandırma seçenekleri
@@ -1225,3 +1227,5 @@ clearUserData=Kullanıcı verilerini silme
clearUserDataDescription=Bağlantılar da dahil olmak üzere tüm kullanıcı yapılandırma verilerini silme
clearUserDataTitle=Kullanıcı verilerinin silinmesi
clearUserDataContent=Bu, xpipe için tüm yerel kullanıcı verilerini silecek ve yeniden başlatacaktır. Bağlantılarınızı önemsiyorsanız, önce bir git deposu ile senkronize ettiğinizden emin olun.
undefined=Tanımsız
copyAddress=Adres kopyalayın
+5 -1
View File
@@ -1216,7 +1216,9 @@ updateNagTitle=更新提醒
updateNagButton=参见发布
refreshServices=刷新服务
serviceProtocolType=服务协议类型
serviceProtocolTypeDescription=用于打开服务的协议
serviceProtocolTypeDescription=控制如何打开服务
serviceCommand=服务激活后运行的命令
serviceCommandDescription=占位符 $ADDRESS 将被替换为实际的隧道地址
value=价值
showAdvancedOptions=显示高级选项
sshAdditionalConfigOptions=附加配置选项
@@ -1225,3 +1227,5 @@ clearUserData=删除用户数据
clearUserDataDescription=删除所有用户配置数据,包括连接
clearUserDataTitle=用户数据删除
clearUserDataContent=这将删除 xpipe 的所有本地用户数据并重新启动。如果你关心你的连接,请确保先用 git 仓库同步它们。
undefined=未定义
copyAddress=复制地址