diff --git a/app/src/main/java/io/xpipe/app/action/ActionShortcutComp.java b/app/src/main/java/io/xpipe/app/action/ActionShortcutComp.java index 793709fc0..70d65ebab 100644 --- a/app/src/main/java/io/xpipe/app/action/ActionShortcutComp.java +++ b/app/src/main/java/io/xpipe/app/action/ActionShortcutComp.java @@ -7,6 +7,7 @@ import io.xpipe.app.comp.base.ButtonComp; import io.xpipe.app.comp.base.InputGroupComp; import io.xpipe.app.comp.base.TextFieldComp; import io.xpipe.app.core.AppI18n; +import io.xpipe.app.core.AppInstallation; import io.xpipe.app.update.AppDistributionType; import io.xpipe.app.util.*; @@ -60,6 +61,7 @@ public class ActionShortcutComp extends SimpleComp { field.grow(true, false); field.apply(struc -> struc.get().setEditable(false)); var group = new InputGroupComp(List.of(field, copyButton)); + group.setHeightReference(copyButton); return group; } @@ -74,7 +76,8 @@ public class ActionShortcutComp extends SimpleComp { }); var copyButton = new ButtonComp(null, new FontIcon("mdi2f-file-move-outline"), () -> { ThreadHelper.runFailableAsync(() -> { - var file = DesktopShortcuts.createCliOpen(url.getValue(), name.getValue()); + var exec = AppInstallation.ofCurrent().getCliExecutablePath().toString(); + var file = DesktopShortcuts.create(exec, "open \"" + url.getValue() + "\"", name.getValue()); DesktopHelper.browseFileInDirectory(file); }); }) @@ -83,6 +86,7 @@ public class ActionShortcutComp extends SimpleComp { var field = new TextFieldComp(name); field.grow(true, false); var group = new InputGroupComp(List.of(field, copyButton)); + group.setHeightReference(copyButton); return group; } @@ -103,6 +107,7 @@ public class ActionShortcutComp extends SimpleComp { field.grow(true, false); field.apply(struc -> struc.get().setEditable(false)); var group = new InputGroupComp(List.of(field, copyButton)); + group.setHeightReference(copyButton); return group; } diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/DeleteMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/DeleteMenuProvider.java index e3834ec94..ed8281c29 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/DeleteMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/DeleteMenuProvider.java @@ -1,6 +1,7 @@ package io.xpipe.app.browser.menu.impl; import io.xpipe.app.action.AbstractAction; +import io.xpipe.app.browser.action.BrowserActionProvider; import io.xpipe.app.browser.action.impl.DeleteActionProvider; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.file.BrowserFileSystemTabModel; @@ -20,17 +21,8 @@ import java.util.List; public class DeleteMenuProvider implements BrowserMenuLeafProvider { @Override - public AbstractAction createAction(BrowserFileSystemTabModel model, List entries) { - var link = entries.stream() - .anyMatch(browserEntry -> browserEntry.getRawFileEntry().getKind() == FileKind.LINK); - var files = entries.stream() - .map(browserEntry -> !link - ? browserEntry.getRawFileEntry().resolved().getPath() - : browserEntry.getRawFileEntry().getPath()) - .toList(); - var builder = DeleteActionProvider.Action.builder(); - builder.initFiles(model, files); - return builder.build(); + public Class getDelegateActionProvider() { + return DeleteActionProvider.class; } @Override @@ -58,8 +50,8 @@ public class DeleteMenuProvider implements BrowserMenuLeafProvider { return AppI18n.observable( "deleteFile", entries.stream() - .anyMatch(browserEntry -> - browserEntry.getRawFileEntry().getKind() == FileKind.LINK) + .anyMatch(browserEntry -> + browserEntry.getRawFileEntry().getKind() == FileKind.LINK) ? "link" : ""); } diff --git a/app/src/main/java/io/xpipe/app/comp/base/InputGroupComp.java b/app/src/main/java/io/xpipe/app/comp/base/InputGroupComp.java index a917d167e..86e64fdae 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/InputGroupComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/InputGroupComp.java @@ -4,9 +4,12 @@ import io.xpipe.app.comp.Comp; import io.xpipe.app.comp.CompStructure; import io.xpipe.app.comp.SimpleCompStructure; +import io.xpipe.app.core.AppFontSizes; import javafx.geometry.Pos; import atlantafx.base.layout.InputGroup; +import javafx.scene.layout.Region; +import lombok.Setter; import java.util.List; @@ -14,6 +17,9 @@ public class InputGroupComp extends Comp> { private final List> entries; + @Setter + private Comp heightReference; + public InputGroupComp(List> comps) { entries = List.copyOf(comps); } @@ -30,6 +36,28 @@ public class InputGroupComp extends Comp> { b.getChildren().add(entry.createRegion()); } b.setAlignment(Pos.CENTER); + + if (heightReference != null && entries.contains(heightReference)) { + var refIndex = entries.indexOf(heightReference); + var ref = b.getChildren().get(refIndex); + if (ref instanceof Region refR) { + for (int i = 0; i < entries.size(); i++) { + if (i == refIndex) { + continue; + } + + var entry = b.getChildren().get(i); + if (!(entry instanceof Region entryR)) { + continue; + } + + entryR.minHeightProperty().bind(refR.heightProperty()); + entryR.maxHeightProperty().bind(refR.heightProperty()); + entryR.prefHeightProperty().bind(refR.heightProperty()); + } + } + } + return new SimpleCompStructure<>(b); } } diff --git a/app/src/main/java/io/xpipe/app/core/AppProperties.java b/app/src/main/java/io/xpipe/app/core/AppProperties.java index ceddc7aa8..83474c227 100644 --- a/app/src/main/java/io/xpipe/app/core/AppProperties.java +++ b/app/src/main/java/io/xpipe/app/core/AppProperties.java @@ -1,6 +1,6 @@ package io.xpipe.app.core; -import io.xpipe.app.core.check.AppUserDirectoryCheck; +import io.xpipe.app.core.check.AppDirectoryPermissionsCheck; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; import io.xpipe.core.XPipeDaemonMode; @@ -153,7 +153,7 @@ public class AppProperties { .orElse("info"); // We require the user dir from here - AppUserDirectoryCheck.check(dataDir); + AppDirectoryPermissionsCheck.checkDirectory(dataDir); AppCache.setBasePath(dataDir.resolve("cache")); dataBinDir = dataDir.resolve("cache", "bin"); UUID id = AppCache.getNonNull("uuid", UUID.class, () -> null); diff --git a/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java b/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java index 3f7581656..8f8a31fbc 100644 --- a/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java +++ b/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java @@ -64,6 +64,8 @@ public abstract class AppSystemInfo { public abstract Path getDesktop(); + public abstract Path getTemp(); + public static final class Windows extends AppSystemInfo { private Path userHome; @@ -281,6 +283,11 @@ public abstract class AppSystemInfo { var fallback = getUserHome().resolve("Desktop"); return (desktop = fallback); } + + @Override + public Path getTemp() { + return Path.of(System.getProperty("java.io.tmpdir")); + } } public static class MacOs extends AppSystemInfo { @@ -299,5 +306,10 @@ public abstract class AppSystemInfo { public Path getDesktop() { return getUserHome().resolve("Desktop"); } + + @Override + public Path getTemp() { + return Path.of(System.getProperty("java.io.tmpdir")); + } } } diff --git a/app/src/main/java/io/xpipe/app/core/check/AppUserDirectoryCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppDirectoryPermissionsCheck.java similarity index 53% rename from app/src/main/java/io/xpipe/app/core/check/AppUserDirectoryCheck.java rename to app/src/main/java/io/xpipe/app/core/check/AppDirectoryPermissionsCheck.java index 4b757ff2d..809ca71c5 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppUserDirectoryCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppDirectoryPermissionsCheck.java @@ -2,29 +2,33 @@ package io.xpipe.app.core.check; import io.xpipe.app.issue.ErrorEventFactory; +import io.xpipe.core.OsType; import org.apache.commons.io.FileUtils; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -public class AppUserDirectoryCheck { +public class AppDirectoryPermissionsCheck { - public static void check(Path dataDirectory) { + public static void checkDirectory(Path dataDirectory) { try { FileUtils.forceMkdir(dataDirectory.toFile()); var testDirectory = dataDirectory.resolve("permissions_check"); FileUtils.forceMkdir(testDirectory.toFile()); if (!Files.exists(testDirectory)) { - throw new IOException("Directory creation in user home directory failed silently"); + throw new IOException("Directory creation in " + dataDirectory + " failed silently"); } Files.delete(testDirectory); // if (true) throw new IOException(); } catch (IOException e) { + var message = "Unable to access directory " + dataDirectory + "."; + if (OsType.getLocal() == OsType.WINDOWS) { + message += " Please make sure that you have the appropriate permissions and no Antivirus program is blocking the access. " + + "In case you use cloud storage, verify that your cloud storage is working and you are logged in."; + } ErrorEventFactory.fromThrowable( - "Unable to access directory " + dataDirectory - + ". Please make sure that you have the appropriate permissions and no Antivirus program is blocking the access. " - + "In case you use cloud storage, verify that your cloud storage is working and you are logged in.", + message, e) .term() .expected() diff --git a/app/src/main/java/io/xpipe/app/core/check/AppTempCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppWindowsTempCheck.java similarity index 96% rename from app/src/main/java/io/xpipe/app/core/check/AppTempCheck.java rename to app/src/main/java/io/xpipe/app/core/check/AppWindowsTempCheck.java index 9b44a98cd..2aca8d2a1 100644 --- a/app/src/main/java/io/xpipe/app/core/check/AppTempCheck.java +++ b/app/src/main/java/io/xpipe/app/core/check/AppWindowsTempCheck.java @@ -9,7 +9,7 @@ import java.nio.file.Files; import java.nio.file.InvalidPathException; import java.nio.file.Path; -public class AppTempCheck { +public class AppWindowsTempCheck { private static void checkTemp(String tmpdir) { Path dir = null; diff --git a/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java b/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java index 4debf782f..261bb9c3e 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java @@ -61,12 +61,12 @@ public class BaseMode extends OperationMode { AppWindowTitle.init(); AppPathCorruptCheck.check(); AppHomebrewCoreutilsCheck.check(); + WindowsRegistry.init(); AppAvCheck.check(); AppJavaOptionsCheck.check(); AppSid.init(); AppBeaconServer.init(); AppLayoutModel.init(); - WindowsRegistry.init(); if (OperationMode.getStartupMode() == XPipeDaemonMode.GUI) { AppPtbDialog.showIfNeeded(); diff --git a/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java b/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java index 7338460cb..fe1e45df2 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java @@ -4,7 +4,8 @@ import io.xpipe.app.beacon.AppBeaconServer; import io.xpipe.app.browser.BrowserFullSessionModel; import io.xpipe.app.core.*; import io.xpipe.app.core.check.AppDebugModeCheck; -import io.xpipe.app.core.check.AppTempCheck; +import io.xpipe.app.core.check.AppDirectoryPermissionsCheck; +import io.xpipe.app.core.check.AppWindowsTempCheck; import io.xpipe.app.core.window.AppMainWindow; import io.xpipe.app.issue.*; import io.xpipe.app.prefs.AppPrefs; @@ -113,7 +114,8 @@ public abstract class OperationMode { AppProperties.init(args); NodeCallback.init(); AppLogs.init(); - AppTempCheck.check(); + AppWindowsTempCheck.check(); + AppDirectoryPermissionsCheck.checkDirectory(AppSystemInfo.ofCurrent().getTemp()); AppDebugModeCheck.printIfNeeded(); AppProperties.get().logArguments(); AppDistributionType.init(); diff --git a/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java b/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java index f2e4daf00..b9fd9ca86 100644 --- a/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java @@ -8,10 +8,12 @@ import io.xpipe.app.core.window.AppDialog; import io.xpipe.app.icon.SystemIconManager; import io.xpipe.app.icon.SystemIconSource; import io.xpipe.app.issue.ErrorEventFactory; +import io.xpipe.app.process.OsFileSystem; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.*; import io.xpipe.core.FilePath; +import io.xpipe.core.OsType; import javafx.beans.binding.Bindings; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleObjectProperty; @@ -101,7 +103,8 @@ public class IconsCategory extends AppPrefsCategory { if (path != null) { var name = FilenameUtils.getBaseName(path); if (!name.isBlank()) { - id = name; + // Windows has the most strict file name rules + id = OsFileSystem.of(OsType.WINDOWS).makeFileSystemCompatible(name); } } } catch (Exception ignored) {} diff --git a/app/src/main/java/io/xpipe/app/pwman/BitwardenPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/BitwardenPasswordManager.java index 0444eb525..10e20e28a 100644 --- a/app/src/main/java/io/xpipe/app/pwman/BitwardenPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/BitwardenPasswordManager.java @@ -58,7 +58,6 @@ public class BitwardenPasswordManager implements PasswordManager { var sc = getOrStartShell(); var command = sc.command(CommandBuilder.of().add("bw", "get", "item", "xpipe-test", "--nointeraction")); var r = command.readStdoutAndStderr(); - // Check for data file as bw seemingly breaks if it doesn't exist yet if (r[1].contains("You are not logged in")) { var script = ShellScript.lines( moveAppDir() diff --git a/app/src/main/java/io/xpipe/app/util/DesktopShortcuts.java b/app/src/main/java/io/xpipe/app/util/DesktopShortcuts.java index 846875181..21aac820e 100644 --- a/app/src/main/java/io/xpipe/app/util/DesktopShortcuts.java +++ b/app/src/main/java/io/xpipe/app/util/DesktopShortcuts.java @@ -123,11 +123,6 @@ public class DesktopShortcuts { return base; } - public static Path createCliOpen(String action, String name) throws Exception { - var exec = AppInstallation.ofCurrent().getCliExecutablePath().toString(); - return create(exec, "open " + action, name); - } - public static Path create(String executable, String args, String name) throws Exception { var compat = OsFileSystem.ofLocal().makeFileSystemCompatible(name); if (OsType.getLocal() == OsType.WINDOWS) { diff --git a/dist/changelog/18.4_incremental.md b/dist/changelog/18.4_incremental.md index dd6c4a67c..a6833126e 100644 --- a/dist/changelog/18.4_incremental.md +++ b/dist/changelog/18.4_incremental.md @@ -1,12 +1,12 @@ -- Show warning when invalid SSH gateway chain is configured -- Fix tunnel session restart not applying any changes made to connection config -- Reshow any existing configuration dialog if possible for connection when editing it -- Improve error handling on Windows when registry library handling load fails -- Automatically open connection configuration dialog when cloning a connection +- Fix desktop shortcuts for workspaces and actions not working on Linux and macOS - Fix computed directory file size being off by a factor of 1024 on Linux - Fix license check for entries limited in amount, e.g. Proxmox, potentially disabling all entries and not only one - Fix custom git icon sources not persisting after restart -- Derive custom git icon source directory name from repository URL -- Fix window possibly entering invalid state on Windows and not showing anymore - Fix docker integration not elevating with sudo if context config required root permissions -- Fix desktop shortcuts for workspaces and more not working on Linux and macOS +- Fix window possibly entering invalid state on Windows and not showing anymore +- Fix tunnel session restart not applying any changes made to connection config +- Show warning when invalid SSH gateway chain is configured +- Reshow any existing configuration dialog if possible for connection when editing it +- Improve error handling on Windows when registry library load fails +- Automatically open connection configuration dialog when cloning a connection +- Derive custom git icon source directory name from repository URL diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentitySelectComp.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentitySelectComp.java index 9152d68d2..eedc40f70 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentitySelectComp.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentitySelectComp.java @@ -6,8 +6,10 @@ import io.xpipe.app.comp.SimpleCompStructure; import io.xpipe.app.comp.base.*; import io.xpipe.app.core.AppFontSizes; import io.xpipe.app.core.AppI18n; +import io.xpipe.app.core.AppProperties; import io.xpipe.app.ext.DataStoreCreationCategory; import io.xpipe.app.hub.comp.*; +import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; @@ -62,12 +64,15 @@ public class IdentitySelectComp extends Comp> { } private void addNamedIdentity() { - var pwMan = DataStorage.get().getStoreEntries().stream() + var hasPwMan = AppPrefs.get().passwordManager().getValue() != null; + var pwManIdentity = DataStorage.get().getStoreEntries().stream() .map(entry -> entry.getStore() instanceof PasswordManagerIdentityStore p ? p : null) .filter(s -> s != null) .findFirst(); - if (pwMan.isPresent()) { - var perUser = pwMan.get().isPerUser(); + var hasPassword = password.getValue() != null && !(password.getValue() instanceof SecretRetrievalStrategy.None); + var hasSshIdentity = identityStrategy.getValue() != null && !(identityStrategy.getValue() instanceof NoneStrategy); + if (hasPwMan && pwManIdentity.isPresent() && !hasPassword && !hasSshIdentity) { + var perUser = pwManIdentity.get().isPerUser(); var id = PasswordManagerIdentityStore.builder() .key(inPlaceUser.getValue()) .perUser(perUser) diff --git a/lang/strings/translations_da.properties b/lang/strings/translations_da.properties index dd47f2f73..31f51aea3 100644 --- a/lang/strings/translations_da.properties +++ b/lang/strings/translations_da.properties @@ -661,7 +661,6 @@ fileNames=Filnavne linkFileNames=Link til filnavne fileNamesQuoted=Filnavne (citeret) deleteFile=Slet $FILE$ -deleteLink=Slet link editWithEditor=Rediger med $EDITOR$ followLink=Følg link goForward=Gå fremad diff --git a/lang/strings/translations_de.properties b/lang/strings/translations_de.properties index 60a514710..b18c56f88 100644 --- a/lang/strings/translations_de.properties +++ b/lang/strings/translations_de.properties @@ -667,7 +667,6 @@ fileNames=Dateinamen linkFileNames=Link Dateinamen fileNamesQuoted=Dateinamen (in Anführungszeichen) deleteFile=Löschen $FILE$ -deleteLink=Link löschen editWithEditor=Bearbeiten mit $EDITOR$ followLink=Link folgen goForward=Vorwärts gehen diff --git a/lang/strings/translations_en.properties b/lang/strings/translations_en.properties index 3b1c0cd03..cee6443f5 100644 --- a/lang/strings/translations_en.properties +++ b/lang/strings/translations_en.properties @@ -679,7 +679,6 @@ fileNames=File names linkFileNames=Link file names fileNamesQuoted=File names (Quoted) deleteFile=Delete $FILE$ -deleteLink=Delete link editWithEditor=Edit with $EDITOR$ followLink=Follow link goForward=Go forward diff --git a/lang/strings/translations_es.properties b/lang/strings/translations_es.properties index 6ca764c2f..3793e1563 100644 --- a/lang/strings/translations_es.properties +++ b/lang/strings/translations_es.properties @@ -645,7 +645,6 @@ fileNames=Nombres de archivo linkFileNames=Enlazar nombres de archivos fileNamesQuoted=Nombres de archivo (entre comillas) deleteFile=Borrar $FILE$ -deleteLink=Borrar enlace editWithEditor=Edita con $EDITOR$ followLink=Seguir enlace goForward=Avanzar diff --git a/lang/strings/translations_fr.properties b/lang/strings/translations_fr.properties index cb18573c6..2d3c282af 100644 --- a/lang/strings/translations_fr.properties +++ b/lang/strings/translations_fr.properties @@ -666,7 +666,6 @@ fileNames=Noms de fichiers linkFileNames=Noms de fichiers de liens fileNamesQuoted=Noms de fichiers (cités) deleteFile=Supprimer $FILE$ -deleteLink=Supprimer le lien editWithEditor=Éditer avec $EDITOR$ followLink=Suivre le lien goForward=Va de l'avant diff --git a/lang/strings/translations_id.properties b/lang/strings/translations_id.properties index 5f719ee7c..238581420 100644 --- a/lang/strings/translations_id.properties +++ b/lang/strings/translations_id.properties @@ -645,7 +645,6 @@ fileNames=Nama file linkFileNames=Menautkan nama file fileNamesQuoted=Nama file (Kutipan) deleteFile=Menghapus $FILE$ -deleteLink=Menghapus tautan editWithEditor=Mengedit dengan $EDITOR$ followLink=Ikuti tautan goForward=Maju diff --git a/lang/strings/translations_it.properties b/lang/strings/translations_it.properties index 577e551f3..66cf35dde 100644 --- a/lang/strings/translations_it.properties +++ b/lang/strings/translations_it.properties @@ -645,7 +645,6 @@ fileNames=Nomi di file linkFileNames=Nomi di file di collegamento fileNamesQuoted=Nomi di file (citati) deleteFile=Eliminare $FILE$ -deleteLink=Elimina il link editWithEditor=Modifica con $EDITOR$ followLink=Segui il link goForward=Vai avanti diff --git a/lang/strings/translations_ja.properties b/lang/strings/translations_ja.properties index 553492036..b1a07176e 100644 --- a/lang/strings/translations_ja.properties +++ b/lang/strings/translations_ja.properties @@ -645,7 +645,6 @@ fileNames=ファイル名 linkFileNames=リンクファイル名 fileNamesQuoted=ファイル名(引用) deleteFile=削除する$FILE$ -deleteLink=リンクを削除する editWithEditor=で編集する。$EDITOR$ followLink=リンクをたどる goForward=進む diff --git a/lang/strings/translations_ko.properties b/lang/strings/translations_ko.properties index cb8351471..f0dd5d526 100644 --- a/lang/strings/translations_ko.properties +++ b/lang/strings/translations_ko.properties @@ -645,7 +645,6 @@ fileNames=파일 이름 linkFileNames=링크 파일 이름 fileNamesQuoted=파일 이름(따옴표로 묶음) deleteFile=삭제 $FILE$ -deleteLink=링크 삭제 editWithEditor=다음으로 편집 $EDITOR$ followLink=팔로우 링크 goForward=앞으로 diff --git a/lang/strings/translations_nl.properties b/lang/strings/translations_nl.properties index 0966b66b6..514eca889 100644 --- a/lang/strings/translations_nl.properties +++ b/lang/strings/translations_nl.properties @@ -645,7 +645,6 @@ fileNames=Bestandsnamen linkFileNames=Bestandsnamen koppelen fileNamesQuoted=Bestandsnamen (Geciteerd) deleteFile=Verwijderen $FILE$ -deleteLink=Link verwijderen editWithEditor=Bewerken met $EDITOR$ followLink=Link volgen goForward=Doorgaan diff --git a/lang/strings/translations_pl.properties b/lang/strings/translations_pl.properties index f7eaacc09..0b00f1ee6 100644 --- a/lang/strings/translations_pl.properties +++ b/lang/strings/translations_pl.properties @@ -645,7 +645,6 @@ fileNames=Nazwy plików linkFileNames=Połącz nazwy plików fileNamesQuoted=Nazwy plików (cytowane) deleteFile=Usuń $FILE$ -deleteLink=Usuń łącze editWithEditor=Edytuj za pomocą $EDITOR$ followLink=Podążaj za linkiem goForward=Idź do przodu diff --git a/lang/strings/translations_pt.properties b/lang/strings/translations_pt.properties index 8adf4412c..6ce1d4395 100644 --- a/lang/strings/translations_pt.properties +++ b/lang/strings/translations_pt.properties @@ -645,7 +645,6 @@ fileNames=Nomes de ficheiros linkFileNames=Liga nomes de ficheiros fileNamesQuoted=Nomes de ficheiros (Citado) deleteFile=Elimina $FILE$ -deleteLink=Eliminar ligação editWithEditor=Edita com $EDITOR$ followLink=Segue a ligação goForward=Avança diff --git a/lang/strings/translations_ru.properties b/lang/strings/translations_ru.properties index 158008105..5a12bd080 100644 --- a/lang/strings/translations_ru.properties +++ b/lang/strings/translations_ru.properties @@ -707,7 +707,6 @@ fileNames=Имена файлов linkFileNames=Имена файлов ссылок fileNamesQuoted=Имена файлов (в кавычках) deleteFile=Удалить $FILE$ -deleteLink=Удалить ссылку editWithEditor=Редактируй с $EDITOR$ followLink=Перейдите по ссылке #custom diff --git a/lang/strings/translations_sv.properties b/lang/strings/translations_sv.properties index 2227e8515..2835d0776 100644 --- a/lang/strings/translations_sv.properties +++ b/lang/strings/translations_sv.properties @@ -645,7 +645,6 @@ fileNames=Filnamn linkFileNames=Namn på länkfiler fileNamesQuoted=Filnamn (citerad) deleteFile=Ta bort $FILE$ -deleteLink=Ta bort länk editWithEditor=Redigera med $EDITOR$ followLink=Följ länk goForward=Gå framåt diff --git a/lang/strings/translations_tr.properties b/lang/strings/translations_tr.properties index 9ae747c64..0235f89ef 100644 --- a/lang/strings/translations_tr.properties +++ b/lang/strings/translations_tr.properties @@ -645,7 +645,6 @@ fileNames=Dosya adları linkFileNames=Dosya adlarını bağlama fileNamesQuoted=Dosya adları (Alıntı) deleteFile=Silme $FILE$ -deleteLink=Bağlantıyı sil editWithEditor=İle düzenleyin $EDITOR$ followLink=Bağlantıyı takip edin goForward=İleri git diff --git a/lang/strings/translations_vi.properties b/lang/strings/translations_vi.properties index 1a5e4a891..d703c0d82 100644 --- a/lang/strings/translations_vi.properties +++ b/lang/strings/translations_vi.properties @@ -645,7 +645,6 @@ fileNames=Tên tệp linkFileNames=Tên tệp liên kết fileNamesQuoted=Tên tệp (Được trích dẫn) deleteFile=Xóa $FILE$ -deleteLink=Xóa liên kết editWithEditor=Chỉnh sửa với $EDITOR$ followLink=Theo liên kết goForward=Tiếp tục diff --git a/lang/strings/translations_zh.properties b/lang/strings/translations_zh.properties index d8a83d258..6b8b12739 100644 --- a/lang/strings/translations_zh.properties +++ b/lang/strings/translations_zh.properties @@ -943,7 +943,6 @@ linkFileNames=链接文件名 fileNamesQuoted=文件名(引用) #custom deleteFile=删除 $FILE$ -deleteLink=删除链接 #custom editWithEditor=使用 $EDITOR$ 编辑 #custom diff --git a/version b/version index 7d982511d..890e45270 100644 --- a/version +++ b/version @@ -1 +1 @@ -18.4-3 +18.4