From 345cc8f40406bb3eafa4ec3115791536005e5003 Mon Sep 17 00:00:00 2001 From: crschnick Date: Fri, 27 Dec 2024 22:54:19 +0000 Subject: [PATCH] Various fixes --- .../app/browser/file/BrowserFileListComp.java | 17 ++++++---- app/src/main/java/io/xpipe/app/comp/Comp.java | 4 ++- .../comp/base/AppMainWindowContentComp.java | 2 +- .../xpipe/app/comp/store/StoreEntryComp.java | 12 ++++--- .../app/comp/store/StoreEntryWrapper.java | 2 ++ .../app/comp/store/StoreSectionComp.java | 4 +++ .../java/io/xpipe/app/ext/ShellSession.java | 6 +++- .../xpipe/app/prefs/AppPrefsSidebarComp.java | 2 +- .../app/resources/style/store-entry-comp.css | 8 +++++ .../xpipe/core/store/NetworkTunnelStore.java | 1 - .../io/xpipe/core/store/SessionChain.java | 33 ++++++++++++++++--- lang/strings/translations_da.properties | 6 ++++ lang/strings/translations_de.properties | 6 ++++ lang/strings/translations_en.properties | 3 +- lang/strings/translations_es.properties | 6 ++++ lang/strings/translations_fr.properties | 6 ++++ lang/strings/translations_id.properties | 6 ++++ lang/strings/translations_it.properties | 6 ++++ lang/strings/translations_ja.properties | 6 ++++ lang/strings/translations_nl.properties | 6 ++++ lang/strings/translations_pl.properties | 6 ++++ lang/strings/translations_pt.properties | 6 ++++ lang/strings/translations_ru.properties | 6 ++++ lang/strings/translations_sv.properties | 6 ++++ lang/strings/translations_tr.properties | 6 ++++ lang/strings/translations_zh.properties | 6 ++++ 26 files changed, 157 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java index 78784f670..066df41e5 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java @@ -29,10 +29,7 @@ import atlantafx.base.theme.Styles; import java.time.Duration; import java.time.Instant; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Objects; +import java.util.*; import java.util.concurrent.atomic.AtomicReference; import static io.xpipe.app.util.HumanReadableFormat.byteCount; @@ -283,12 +280,20 @@ public final class BrowserFileListComp extends SimpleComp { } try (var ignored = updateFromModel) { - fileList.getSelection().setAll(c.getList()); + // Attempt to preserve ordering. Works at least when selecting single entries + var existing = new HashSet<>(fileList.getSelection()); + c.getList().forEach(browserEntry -> { + if (!existing.contains(browserEntry)) { + fileList.getSelection().add(browserEntry); + } + }); } }); fileList.getSelection().addListener((ListChangeListener) c -> { - if (c.getList().equals(table.getSelectionModel().getSelectedItems())) { + var existing = new HashSet<>(fileList.getSelection()); + var toApply = new HashSet<>(c.getList()); + if (existing.equals(toApply)) { return; } diff --git a/app/src/main/java/io/xpipe/app/comp/Comp.java b/app/src/main/java/io/xpipe/app/comp/Comp.java index 68125c4ca..318f09e31 100644 --- a/app/src/main/java/io/xpipe/app/comp/Comp.java +++ b/app/src/main/java/io/xpipe/app/comp/Comp.java @@ -97,7 +97,9 @@ public abstract class Comp> { onSceneAssign(struc -> { Platform.runLater(() -> { Platform.runLater(() -> { - struc.get().requestFocus(); + Platform.runLater(() -> { + struc.get().requestFocus(); + }); }); }); }); diff --git a/app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java b/app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java index b09e0127f..444caf6d2 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java @@ -48,7 +48,7 @@ public class AppMainWindowContentComp extends SimpleComp { loadingIcon.setImage(AppImages.loadImage(path.resolve("loading.png"))); }); - var version = new LabelComp("XPipe " + AppProperties.get().getVersion()); + var version = new LabelComp((AppProperties.get().isStaging() ? "XPipe PTB" : "XPipe") + " " + AppProperties.get().getVersion()); version.apply(struc -> { AppFont.setSize(struc.get(), 1); struc.get().setOpacity(0.6); diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java index dc92adcc8..d463c36e8 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java @@ -178,11 +178,13 @@ public abstract class StoreEntryComp extends SimpleComp { protected Comp createUserIcon() { var button = new IconButtonComp("mdi2a-account"); - button.disable(new SimpleBooleanProperty(true)); - button.hide(Bindings.createBooleanBinding(() -> { - var cat = getWrapper().getCategory().getValue(); - return cat.getRoot().equals(StoreViewState.get().getAllIdentitiesCategory()) || !getWrapper().getEntry().isPerUserStore(); - },getWrapper().getStore())); + button.styleClass("user-icon"); + button.tooltipKey("personalConnection"); + button.apply(struc -> { + AppFont.medium(struc.get()); + struc.get().setOpacity(1.0); + }); + button.hide(getWrapper().getPerUser()); return button; } diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java index f329ead9f..2992b1249 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java @@ -52,6 +52,7 @@ public class StoreEntryWrapper { private final BooleanProperty sessionActive = new SimpleBooleanProperty(); private final Property store = new SimpleObjectProperty<>(); private final Property information = new SimpleStringProperty(); + private final BooleanProperty perUser = new SimpleBooleanProperty(); public StoreEntryWrapper(DataStoreEntry entry) { this.entry = entry; @@ -183,6 +184,7 @@ public class StoreEntryWrapper { .getCategoryWrapper(DataStorage.get() .getStoreCategoryIfPresent(entry.getCategoryUuid()) .orElseThrow())); + perUser.setValue(!category.getValue().getRoot().equals(StoreViewState.get().getAllIdentitiesCategory()) && entry.isPerUserStore()); if (!entry.getValidity().isUsable()) { summary.setValue(null); diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreSectionComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreSectionComp.java index e086e3d62..2a607379b 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreSectionComp.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreSectionComp.java @@ -191,6 +191,10 @@ public class StoreSectionComp extends Comp> { } struc.get().getStyleClass().setAll(newList); }); + + section.getWrapper().getPerUser().subscribe(val -> { + struc.get().pseudoClassStateChanged(PseudoClass.getPseudoClass("per-user"), val); + }); }) .createStructure(); } diff --git a/app/src/main/java/io/xpipe/app/ext/ShellSession.java b/app/src/main/java/io/xpipe/app/ext/ShellSession.java index 806c14ead..02d00737d 100644 --- a/app/src/main/java/io/xpipe/app/ext/ShellSession.java +++ b/app/src/main/java/io/xpipe/app/ext/ShellSession.java @@ -29,7 +29,11 @@ public class ShellSession extends Session { try { shellControl.start(); } catch (Exception ex) { - stop(); + try { + stop(); + } catch (Exception stopEx) { + ex.addSuppressed(stopEx); + } throw ex; } } diff --git a/app/src/main/java/io/xpipe/app/prefs/AppPrefsSidebarComp.java b/app/src/main/java/io/xpipe/app/prefs/AppPrefsSidebarComp.java index 34b75c828..2898d2d38 100644 --- a/app/src/main/java/io/xpipe/app/prefs/AppPrefsSidebarComp.java +++ b/app/src/main/java/io/xpipe/app/prefs/AppPrefsSidebarComp.java @@ -42,7 +42,7 @@ public class AppPrefsSidebarComp extends SimpleComp { }) .collect(Collectors.toCollection(ArrayList::new)); - var restartButton = new ButtonComp(AppI18n.observable("restart"), new FontIcon("mdi2r-restart"), () -> { + var restartButton = new ButtonComp(AppI18n.observable("restartApp"), new FontIcon("mdi2r-restart"), () -> { OperationMode.restart(); }); restartButton.grow(true, false); diff --git a/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css b/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css index 1fa8476e2..fa58d0952 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css @@ -32,6 +32,10 @@ -fx-text-fill: #851908; } +.store-entry-grid .user-icon .ikonli-font-icon { + -fx-icon-color: #5b2cffff; +} + .store-entry-grid:incomplete .icon { -fx-opacity: 0.5; } @@ -163,6 +167,10 @@ -fx-spacing: 0.2em; } +.root .store-entry-section-comp.color-box.vertical-comp:per-user { + -fx-border-color: #5b2cffcc; +} + /* Light sub backgrounds */ .root:light .store-entry-section-comp:sub:expanded { diff --git a/core/src/main/java/io/xpipe/core/store/NetworkTunnelStore.java b/core/src/main/java/io/xpipe/core/store/NetworkTunnelStore.java index f5d104142..925c286b4 100644 --- a/core/src/main/java/io/xpipe/core/store/NetworkTunnelStore.java +++ b/core/src/main/java/io/xpipe/core/store/NetworkTunnelStore.java @@ -53,7 +53,6 @@ public interface NetworkTunnelStore extends DataStore { sessions.isEmpty() ? remotePort : sessions.getLast().getLocalPort(); var t = current.createTunnelSession( currentLocalPort, currentRemotePort, current == this ? address : "localhost"); - t.start(); sessions.add(t); } while ((current = (NetworkTunnelStore) current.getNetworkParent()) != null); diff --git a/core/src/main/java/io/xpipe/core/store/SessionChain.java b/core/src/main/java/io/xpipe/core/store/SessionChain.java index 4e587e2a6..6af878843 100644 --- a/core/src/main/java/io/xpipe/core/store/SessionChain.java +++ b/core/src/main/java/io/xpipe/core/store/SessionChain.java @@ -33,15 +33,40 @@ public class SessionChain extends NetworkTunnelSession { @Override public void start() throws Exception { - for (Session session : sessions) { - session.start(); + for (var i = 0; i < sessions.size(); i++) { + try { + sessions.get(i).start(); + } catch (Exception e) { + for (var j = 0; j < i; j++) { + var started = sessions.get(j); + try { + started.stop(); + } catch (Exception stopEx) { + e.addSuppressed(stopEx); + } + } + throw e; + } } } @Override public void stop() throws Exception { - for (Session session : sessions) { - session.stop(); + Exception ex = null; + for (var i = sessions.size() - 1; i >= 0; i--) { + try { + sessions.get(i).stop(); + } catch (Exception e) { + if (ex == null) { + ex = e; + } else { + ex.addSuppressed(e); + } + } + + } + if (ex != null) { + throw ex; } } } diff --git a/lang/strings/translations_da.properties b/lang/strings/translations_da.properties index c2b9d4bcd..1064fb694 100644 --- a/lang/strings/translations_da.properties +++ b/lang/strings/translations_da.properties @@ -1247,9 +1247,15 @@ activate=Aktiver validUntil=Gyldig indtil licenseActivated=Licens aktiveret restart=Genstart +restartApp=Genstart XPipe free=Gratis upgradeInfo=Du kan finde oplysninger om opgradering til en professionel licens nedenfor. upgradeInfoPreview=Du kan finde oplysninger om opgradering til en professionel licens nedenfor eller prøve forhåndsvisningen. enterLicenseKey=Indtast licensnøgle for at opgradere isOnlySupported=understøttes kun med mindst en $TYPE$ -licens areOnlySupported=understøttes kun med mindst en $TYPE$ -licens +openApiDocs=API-dokumentation +openApiDocsDescription=HTTP API-dokumentationen følger med XPipe, inklusive en OpenAPI .yaml-specifikation. Du kan åbne den i din webbrowser. +openApiDocsButton=Åbn dokumenter +pythonApi=Python API +personalConnection=Denne forbindelse og alle dens børn er kun tilgængelige for din bruger, da de afhænger af en personlig identitet. diff --git a/lang/strings/translations_de.properties b/lang/strings/translations_de.properties index d10667f05..727ece76a 100644 --- a/lang/strings/translations_de.properties +++ b/lang/strings/translations_de.properties @@ -1227,9 +1227,15 @@ activate=Aktivieren validUntil=Gültig bis licenseActivated=Lizenz aktiviert restart=Neustart +restartApp=XPipe neu starten free=Kostenlos upgradeInfo=Informationen zum Upgrade auf eine professionelle Lizenz findest du weiter unten. upgradeInfoPreview=Informationen zum Upgrade auf eine professionelle Lizenz findest du weiter unten oder du kannst die Vorschau ausprobieren. enterLicenseKey=Lizenzschlüssel für das Upgrade eingeben isOnlySupported=wird nur mit mindestens einer $TYPE$ Lizenz unterstützt areOnlySupported=werden nur mit mindestens einer $TYPE$ Lizenz unterstützt +openApiDocs=API-Dokumentation +openApiDocsDescription=Die HTTP-API-Dokumentation ist im Lieferumfang von XPipe enthalten, einschließlich einer OpenAPI .yaml-Spezifikation. Du kannst sie in deinem Webbrowser öffnen. +openApiDocsButton=Docs öffnen +pythonApi=Python-API +personalConnection=Diese Verbindung und alle ihre Kinder sind nur für deinen Nutzer verfügbar, da sie von einer persönlichen Identität abhängen. diff --git a/lang/strings/translations_en.properties b/lang/strings/translations_en.properties index ef735ab56..0c5a25117 100644 --- a/lang/strings/translations_en.properties +++ b/lang/strings/translations_en.properties @@ -1247,6 +1247,7 @@ activate=Activate validUntil=Valid until licenseActivated=License activated restart=Restart +restartApp=Restart XPipe #context: No payment required free=Free upgradeInfo=You can find information about upgrading to a professional license below. @@ -1258,4 +1259,4 @@ openApiDocs=API documentation openApiDocsDescription=The HTTP API documentation is bundled with XPipe, including an OpenAPI .yaml specification. You can open it in your web browser. openApiDocsButton=Open docs pythonApi=Python API - +personalConnection=This connection and all its children are only available to your user as they depend on a personal identity. diff --git a/lang/strings/translations_es.properties b/lang/strings/translations_es.properties index 2db6eb9dd..128302551 100644 --- a/lang/strings/translations_es.properties +++ b/lang/strings/translations_es.properties @@ -1198,9 +1198,15 @@ activate=Activa validUntil=Válido hasta licenseActivated=Licencia activada restart=Reinicia +restartApp=Reiniciar XPipe free=Gratis upgradeInfo=A continuación encontrarás información sobre cómo obtener una licencia profesional. upgradeInfoPreview=A continuación puedes encontrar información sobre cómo pasar a una licencia profesional o probar la vista previa. enterLicenseKey=Introduce la clave de licencia para actualizar isOnlySupported=sólo es compatible al menos con la licencia $TYPE$ areOnlySupported=sólo se admiten con una licencia de al menos $TYPE$ +openApiDocs=Documentación API +openApiDocsDescription=La documentación de la API HTTP se incluye con XPipe, incluida una especificación OpenAPI .yaml. Puedes abrirla en tu navegador web. +openApiDocsButton=Abrir documentos +pythonApi=API de Python +personalConnection=Esta conexión y todos sus hijos sólo están disponibles para tu usuario, ya que dependen de una identidad personal. diff --git a/lang/strings/translations_fr.properties b/lang/strings/translations_fr.properties index df1b30f55..ef4a77cde 100644 --- a/lang/strings/translations_fr.properties +++ b/lang/strings/translations_fr.properties @@ -1233,9 +1233,15 @@ activate=Activer validUntil=Valable jusqu'au licenseActivated=Licence activée restart=Redémarrer +restartApp=Redémarrer XPipe free=Gratuit upgradeInfo=Tu trouveras ci-dessous des informations sur la mise à niveau vers une licence professionnelle. upgradeInfoPreview=Tu peux trouver des informations sur la mise à niveau vers une licence professionnelle ci-dessous ou essayer l'aperçu. enterLicenseKey=Saisis la clé de licence pour la mise à niveau isOnlySupported=n'est pris en charge qu'avec au moins une licence $TYPE$ areOnlySupported=ne sont pris en charge qu'avec au moins une licence $TYPE$ +openApiDocs=Documentation de l'API +openApiDocsDescription=La documentation de l'API HTTP est fournie avec XPipe, y compris une spécification OpenAPI .yaml. Tu peux l'ouvrir dans ton navigateur web. +openApiDocsButton=Open docs +pythonApi=API Python +personalConnection=Cette connexion et tous ses enfants ne sont disponibles que pour ton utilisateur car ils dépendent d'une identité personnelle. diff --git a/lang/strings/translations_id.properties b/lang/strings/translations_id.properties index 97975ba8f..7e932e6e6 100644 --- a/lang/strings/translations_id.properties +++ b/lang/strings/translations_id.properties @@ -1198,9 +1198,15 @@ activate=Mengaktifkan validUntil=Berlaku hingga licenseActivated=Lisensi diaktifkan restart=Mulai ulang +restartApp=Mulai ulang XPipe free=Gratis upgradeInfo=Anda dapat menemukan informasi tentang meningkatkan ke lisensi profesional di bawah ini. upgradeInfoPreview=Anda dapat menemukan informasi tentang meningkatkan ke lisensi profesional di bawah ini atau mencoba pratinjau. enterLicenseKey=Masukkan kunci lisensi untuk meningkatkan isOnlySupported=hanya didukung dengan setidaknya lisensi $TYPE$ areOnlySupported=hanya didukung dengan setidaknya lisensi $TYPE$ +openApiDocs=Dokumentasi API +openApiDocsDescription=Dokumentasi API HTTP dibundel dengan XPipe, termasuk spesifikasi OpenAPI .yaml. Anda dapat membukanya di browser web Anda. +openApiDocsButton=Buka dokumen +pythonApi=API Python +personalConnection=Sambungan ini dan semua anak sambungannya hanya tersedia untuk pengguna Anda karena bergantung pada identitas pribadi. diff --git a/lang/strings/translations_it.properties b/lang/strings/translations_it.properties index 7b0ca6783..943f8ae35 100644 --- a/lang/strings/translations_it.properties +++ b/lang/strings/translations_it.properties @@ -1198,9 +1198,15 @@ activate=Attivare validUntil=Valido fino a licenseActivated=Licenza attivata restart=Riavvio +restartApp=Riavviare XPipe free=Gratuito upgradeInfo=Qui di seguito puoi trovare informazioni sull'aggiornamento a una licenza professionale. upgradeInfoPreview=Puoi trovare informazioni sull'aggiornamento a una licenza professionale qui sotto o provare l'anteprima. enterLicenseKey=Inserisci la chiave di licenza per aggiornare isOnlySupported=è supportato solo con almeno una licenza $TYPE$ areOnlySupported=sono supportati solo con una licenza di almeno $TYPE$ +openApiDocs=Documentazione API +openApiDocsDescription=La documentazione dell'API HTTP viene fornita con XPipe e include una specifica OpenAPI .yaml. Puoi aprirla nel tuo browser web. +openApiDocsButton=Documenti aperti +pythonApi=API Python +personalConnection=Questa connessione e tutti i suoi figli sono disponibili solo per il tuo utente in quanto dipendono da un'identità personale. diff --git a/lang/strings/translations_ja.properties b/lang/strings/translations_ja.properties index 4ced1fc49..1b766e473 100644 --- a/lang/strings/translations_ja.properties +++ b/lang/strings/translations_ja.properties @@ -1198,9 +1198,15 @@ activate=アクティブにする validUntil=有効期限 licenseActivated=ライセンスの有効化 restart=再起動 +restartApp=XPipeを再起動する free=無料 upgradeInfo=プロフェッショナル・ライセンスへのアップグレードに関する情報は以下を参照のこと。 upgradeInfoPreview=プロフェッショナル・ライセンスへのアップグレードについては、下記を参照するか、プレビューをお試しいただきたい。 enterLicenseKey=ライセンスキーを入力してアップグレードする isOnlySupported=は、少なくとも$TYPE$ ライセンスでのみサポートされる。 areOnlySupported=は、少なくとも$TYPE$ ライセンスでのみサポートされる。 +openApiDocs=APIドキュメント +openApiDocsDescription=XPipeには、OpenAPI .yaml仕様を含むHTTP APIドキュメントがバンドルされている。ウェブブラウザで開くことができる。 +openApiDocsButton=ドキュメントを開く +pythonApi=Python API +personalConnection=この接続とそのすべての子は、個人のIDに依存するため、あなたのユーザーのみが利用できる。 diff --git a/lang/strings/translations_nl.properties b/lang/strings/translations_nl.properties index 832b5d6c5..3319e5bae 100644 --- a/lang/strings/translations_nl.properties +++ b/lang/strings/translations_nl.properties @@ -1198,9 +1198,15 @@ activate=Activeer validUntil=Geldig tot licenseActivated=Licentie geactiveerd restart=Herstart +restartApp=XPipe opnieuw opstarten free=Gratis upgradeInfo=Informatie over upgraden naar een professionele licentie vind je hieronder. upgradeInfoPreview=Je kunt hieronder informatie vinden over het upgraden naar een professionele licentie of de preview uitproberen. enterLicenseKey=Licentiesleutel invoeren om te upgraden isOnlySupported=wordt alleen ondersteund met minimaal een $TYPE$ licentie areOnlySupported=worden alleen ondersteund met minimaal een $TYPE$ licentie +openApiDocs=API-documentatie +openApiDocsDescription=De HTTP API documentatie is gebundeld met XPipe, inclusief een OpenAPI .yaml specificatie. Je kunt deze openen in je webbrowser. +openApiDocsButton=Open documenten +pythonApi=Python API +personalConnection=Deze verbinding en al haar kinderen zijn alleen beschikbaar voor jouw gebruiker omdat ze afhankelijk zijn van een persoonlijke identiteit. diff --git a/lang/strings/translations_pl.properties b/lang/strings/translations_pl.properties index 70fcf1c1c..e20c8a5be 100644 --- a/lang/strings/translations_pl.properties +++ b/lang/strings/translations_pl.properties @@ -1198,9 +1198,15 @@ activate=Aktywuj validUntil=Ważny do licenseActivated=Aktywowana licencja restart=Restart +restartApp=Uruchom ponownie XPipe free=Darmowy upgradeInfo=Poniżej znajdziesz informacje na temat uaktualnienia do licencji profesjonalnej. upgradeInfoPreview=Poniżej znajdziesz informacje na temat uaktualnienia do licencji profesjonalnej lub wypróbowania wersji zapoznawczej. enterLicenseKey=Wprowadź klucz licencyjny do aktualizacji isOnlySupported=jest obsługiwany tylko z licencją $TYPE$ areOnlySupported=są obsługiwane tylko z co najmniej licencją $TYPE$ +openApiDocs=Dokumentacja API +openApiDocsDescription=Dokumentacja API HTTP jest dołączona do XPipe, w tym specyfikacja OpenAPI .yaml. Możesz ją otworzyć w przeglądarce internetowej. +openApiDocsButton=Otwórz dokumenty +pythonApi=API Python +personalConnection=To połączenie i wszystkie jego elementy podrzędne są dostępne tylko dla Twojego użytkownika, ponieważ zależą od tożsamości osobistej. diff --git a/lang/strings/translations_pt.properties b/lang/strings/translations_pt.properties index c95fe797c..03d9f5d19 100644 --- a/lang/strings/translations_pt.properties +++ b/lang/strings/translations_pt.properties @@ -1198,9 +1198,15 @@ activate=Ativar validUntil=Válido até licenseActivated=Licença activada restart=Reinicia +restartApp=Reinicia o XPipe free=Gratuito upgradeInfo=Podes encontrar informações sobre a atualização para uma licença profissional abaixo. upgradeInfoPreview=Podes encontrar informações sobre a atualização para uma licença profissional abaixo ou experimentar a pré-visualização. enterLicenseKey=Introduzir a chave de licença para atualizar isOnlySupported=só é suportado com, pelo menos, uma licença $TYPE$ areOnlySupported=só são suportados com, pelo menos, uma licença $TYPE$ +openApiDocs=Documentação API +openApiDocsDescription=A documentação da API HTTP é fornecida com o XPipe, incluindo uma especificação OpenAPI .yaml. Podes abri-la no teu navegador web. +openApiDocsButton=Abre documentos +pythonApi=API Python +personalConnection=Esta ligação e todos os seus filhos só estão disponíveis para o teu utilizador, uma vez que dependem de uma identidade pessoal. diff --git a/lang/strings/translations_ru.properties b/lang/strings/translations_ru.properties index b6abfe849..062e4df85 100644 --- a/lang/strings/translations_ru.properties +++ b/lang/strings/translations_ru.properties @@ -1198,9 +1198,15 @@ activate=Активируй validUntil=Действует до licenseActivated=Лицензия активирована restart=Перезапустите +restartApp=Перезапустить XPipe free=Бесплатно upgradeInfo=Информацию о переходе на профессиональную лицензию ты найдешь ниже. upgradeInfoPreview=Ниже ты можешь найти информацию о переходе на профессиональную лицензию или попробовать предварительный просмотр. enterLicenseKey=Введите лицензионный ключ для обновления isOnlySupported=поддерживается только при наличии лицензии $TYPE$ areOnlySupported=поддерживаются только при наличии лицензии $TYPE$ +openApiDocs=Документация по API +openApiDocsDescription=В комплекте с XPipe идет документация по HTTP API, включая спецификацию OpenAPI в формате .yaml. Ты можешь открыть ее в своем веб-браузере. +openApiDocsButton=Открытые документы +pythonApi=Python API +personalConnection=Это соединение и все его дочерние элементы доступны только твоему пользователю, так как зависят от персональной идентификации. diff --git a/lang/strings/translations_sv.properties b/lang/strings/translations_sv.properties index 44ba4b1b7..10d6e9a30 100644 --- a/lang/strings/translations_sv.properties +++ b/lang/strings/translations_sv.properties @@ -1198,9 +1198,15 @@ activate=Aktivera validUntil=Giltig till licenseActivated=Licens aktiverad restart=Starta om +restartApp=Starta om XPipe free=Gratis upgradeInfo=Du hittar information om uppgradering till en professionell licens nedan. upgradeInfoPreview=Du kan hitta information om uppgradering till en professionell licens nedan eller prova förhandsgranskningen. enterLicenseKey=Ange licensnyckel för att uppgradera isOnlySupported=stöds endast med minst en $TYPE$ -licens areOnlySupported=stöds endast med minst en $TYPE$ -licens +openApiDocs=API-dokumentation +openApiDocsDescription=HTTP API-dokumentationen levereras tillsammans med XPipe, inklusive en OpenAPI .yaml-specifikation. Du kan öppna den i din webbläsare. +openApiDocsButton=Öppna dokument +pythonApi=Python API +personalConnection=Denna anslutning och alla dess barn är endast tillgängliga för din användare eftersom de är beroende av en personlig identitet. diff --git a/lang/strings/translations_tr.properties b/lang/strings/translations_tr.properties index 51acfddb3..969af955d 100644 --- a/lang/strings/translations_tr.properties +++ b/lang/strings/translations_tr.properties @@ -1198,9 +1198,15 @@ activate=Etkinleştir validUntil=Şu tarihe kadar geçerlidir licenseActivated=Lisans etkinleştirildi restart=Yeniden Başlat +restartApp=XPipe'ı yeniden başlatın free=Ücretsiz upgradeInfo=Profesyonel lisansa yükseltme ile ilgili bilgileri aşağıda bulabilirsiniz. upgradeInfoPreview=Aşağıda profesyonel lisansa yükseltme hakkında bilgi bulabilir veya önizlemeyi deneyebilirsiniz. enterLicenseKey=Yükseltmek için lisans anahtarını girin isOnlySupported=yalnızca en az $TYPE$ lisansı ile desteklenir areOnlySupported=yalnızca en az bir $TYPE$ lisansı ile desteklenir +openApiDocs=API belgeleri +openApiDocsDescription=HTTP API belgeleri, OpenAPI .yaml belirtimi de dahil olmak üzere XPipe ile birlikte gelir. Web tarayıcınızda açabilirsiniz. +openApiDocsButton=Açık dokümanlar +pythonApi=Python API +personalConnection=Bu bağlantı ve tüm çocukları, kişisel bir kimliğe bağlı oldukları için yalnızca kullanıcınız tarafından kullanılabilir. diff --git a/lang/strings/translations_zh.properties b/lang/strings/translations_zh.properties index e9c9c068e..4bc3018cc 100644 --- a/lang/strings/translations_zh.properties +++ b/lang/strings/translations_zh.properties @@ -1198,9 +1198,15 @@ activate=激活 validUntil=有效期至 licenseActivated=许可证已激活 restart=重新启动 +restartApp=重新启动 XPipe free=免费 upgradeInfo=您可以在下面找到有关升级到专业许可证的信息。 upgradeInfoPreview=您可以在下面找到有关升级到专业许可证的信息,或试用预览版。 enterLicenseKey=输入许可证密钥进行升级 isOnlySupported=至少要有$TYPE$ 许可证才支持 areOnlySupported=至少需要$TYPE$ 许可证才能支持 +openApiDocs=API 文档 +openApiDocsDescription=XPipe 中捆绑了 HTTP API 文档,包括 OpenAPI .yaml 规范。您可以在网络浏览器中打开它。 +openApiDocsButton=打开文档 +pythonApi=Python API +personalConnection=此连接及其所有子连接仅对您的用户开放,因为它们取决于个人身份。