From 12b6b348047ed9b3d013bf95f11e34f383fc938a Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Sun, 14 Nov 2021 07:58:12 +0200 Subject: Updated AUTHORS --- AUTHORS.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index 81f3bb45..a809d9e3 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -5,25 +5,25 @@ Lagrange was created by Jaakko Keränen () in July 2020. Legend: `C` code, `T` translation ``` -C 2609 Jaakko Keränen +C 2631 Jaakko Keränen CT 39 Nikolay Korotkiy - T 38 Olga Smirnova + T 39 Olga Smirnova + T 27 Alyssa Liddell T 27 jan Anja - T 26 Alyssa Liddell T 25 Shibo Lyu - T 21 Страхиња Радић + T 22 Страхиња Радић T 17 MCMic - T 14 Wally Hackenslacker + T 15 Wally Hackenslacker + T 10 Tadeáš Erban + T 10 Xosé M T 9 Aaron Fischer - T 9 Xosé M T 8 El Mau - T 8 Tadeáš Erban T 7 Waterrail T 5 roy niang + T 3 Botond Balázs T 2 Alex Schroeder C 2 Alyssa Rosenzweig T 2 Arns Udovič - T 2 Botond Balázs C 2 Br0000k <77938600+Br0000k@users.noreply.github.com> T 2 Gabriel de Oliveira Ferreira Machado C 2 Manos Pitsidianakis @@ -38,8 +38,8 @@ C 1 David Gillies C 1 Raph M C 1 SolidHal C 1 Thomas Adam -C 1 Waweic C 1 Waweic +C 1 Waweic C 1 Zach DeCook C 1 zocker ``` -- cgit v1.2.3 From dba89c9ca5a0ad49f8b24ac07ae1ad5a9409aa19 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Sun, 14 Nov 2021 08:37:46 +0200 Subject: Bumped version number to 1.8.3 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 55984ddf..55537a08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ cmake_minimum_required (VERSION 3.9) project (Lagrange - VERSION 1.8.2 + VERSION 1.8.3 DESCRIPTION "A Beautiful Gemini Client" LANGUAGES C ) -- cgit v1.2.3 From 7de74d5ed0b1424defcbe41342f6c544f0a813a2 Mon Sep 17 00:00:00 2001 From: Anna “CyberTailor” Date: Thu, 4 Nov 2021 07:27:23 +0500 Subject: CMake: use GNUInstallDirs for *nix --- CMakeLists.txt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 55537a08..08b4c053 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -438,6 +438,7 @@ elseif (HAIKU) install (FILES ${EMB_BIN} DESTINATION .) endif () elseif (UNIX AND NOT APPLE) + include (GNUInstallDirs) set_target_properties (app PROPERTIES INSTALL_RPATH_USE_LINK_PATH YES ) @@ -453,20 +454,20 @@ StartupWMClass=lagrange Icon=fi.skyjake.Lagrange MimeType=x-scheme-handler/gemini;x-scheme-handler/gopher; ") - install (TARGETS app DESTINATION bin) - install (FILES ${desktop} DESTINATION share/applications) + install (TARGETS app DESTINATION ${CMAKE_INSTALL_BINDIR}) + install (FILES ${desktop} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) install (FILES res/lagrange-256.png - DESTINATION share/icons/hicolor/256x256/apps + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps RENAME fi.skyjake.Lagrange.png ) install (FILES res/fi.skyjake.Lagrange.appdata.xml - DESTINATION share/metainfo + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo ) if (NOT ENABLE_RESOURCE_EMBED) if (NOT ENABLE_RELATIVE_EMBED) target_compile_definitions (app PUBLIC - LAGRANGE_EMB_BIN="${CMAKE_INSTALL_PREFIX}/share/lagrange/resources.lgr") + LAGRANGE_EMB_BIN="${CMAKE_INSTALL_FULL_DATADIR}/lagrange/resources.lgr") endif () - install (FILES ${EMB_BIN} DESTINATION share/lagrange) + install (FILES ${EMB_BIN} DESTINATION ${CMAKE_INSTALL_DATADIR}/lagrange) endif () endif () -- cgit v1.2.3 From d368b2b41bf45b3a3a8a2ab5f8b61fb3dac5b7ea Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Sun, 14 Nov 2021 22:20:26 +0200 Subject: Localized language names in Preferences Each dropdown item now uses its own language. This avoids the need to translate all language names to every language, and also helps the user to find the language(s) they understand. The name strings are incorporated as C11 u8"" string literals, which hopefully won't cause compatibility issues as the_Foundation already requires C11. Note that the Translation dialog retains the localized language labels because the user may not speak the source language, so they need to see it in their own language. IssueID #391 --- CMakeLists.txt | 1 + po/en.po | 59 +++++++++++----------------------------------------------- src/ui/util.c | 42 ++++++++++++++++++++--------------------- 3 files changed, 33 insertions(+), 69 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08b4c053..314505c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -281,6 +281,7 @@ endif () # Target. add_executable (app ${SOURCES} ${RESOURCES}) +set_property (TARGET app PROPERTY C_STANDARD 11) if (TARGET ext-deps) add_dependencies (app ext-deps) endif () diff --git a/po/en.po b/po/en.po index 24fed59f..80fee8ae 100644 --- a/po/en.po +++ b/po/en.po @@ -1050,87 +1050,50 @@ msgstr "From:" msgid "dlg.translate.to" msgstr "To:" +# A language choice in the Translation dialog. msgid "lang.ar" msgstr "Arabic" +# A language choice in the Translation dialog. msgid "lang.zh" msgstr "Chinese" -msgid "lang.zh.hans" -msgstr "Chinese (Simplified)" - -msgid "lang.zh.hant" -msgstr "Chinese (Traditional)" - +# A language choice in the Translation dialog. msgid "lang.de" msgstr "German" +# A language choice in the Translation dialog. msgid "lang.en" msgstr "English" -msgid "lang.ia" -msgstr "Interlingua" - -msgid "lang.ie" -msgstr "Interlingue" - -msgid "lang.fi" -msgstr "Finnish" - +# A language choice in the Translation dialog. msgid "lang.fr" msgstr "French" -msgid "lang.gl" -msgstr "Galician" - +# A language choice in the Translation dialog. msgid "lang.hi" msgstr "Hindi" +# A language choice in the Translation dialog. msgid "lang.it" msgstr "Italian" +# A language choice in the Translation dialog. msgid "lang.ja" msgstr "Japanese" -msgid "lang.pl" -msgstr "Polish" - +# A language choice in the Translation dialog. msgid "lang.pt" msgstr "Portuguese" +# A language choice in the Translation dialog. msgid "lang.ru" msgstr "Russian" -msgid "lang.hu" -msgstr "Hungarian" - -msgid "lang.uk" -msgstr "Ukrainian" - -msgid "lang.eo" -msgstr "Esperanto" - +# A language choice in the Translation dialog. msgid "lang.es" msgstr "Spanish" -msgid "lang.es.mx" -msgstr "Spanish (Mexico)" - -msgid "lang.cs" -msgstr "Czech" - -msgid "lang.sk" -msgstr "Slovak" - -msgid "lang.sr" -msgstr "Serbian" - -msgid "lang.isv" -msgstr "Interslavic" - -msgid "lang.tok" -msgstr "Toki Pona" - msgid "heading.newident" msgstr "NEW IDENTITY" diff --git a/src/ui/util.c b/src/ui/util.c index 88348ff8..2624bf2b 100644 --- a/src/ui/util.c +++ b/src/ui/util.c @@ -2199,27 +2199,27 @@ iWidget *makeDialog_Widget(const char *id, iWidget *makePreferences_Widget(void) { /* Common items. */ - const iMenuItem langItems[] = { { "${lang.cs} - cs", 0, 0, "uilang id:cs" }, - { "${lang.de} - de", 0, 0, "uilang id:de" }, - { "${lang.en} - en", 0, 0, "uilang id:en" }, - { "${lang.es} - es", 0, 0, "uilang id:es" }, - { "${lang.es.mx} - es", 0, 0, "uilang id:es_MX" }, - { "${lang.eo} - eo", 0, 0, "uilang id:eo" }, - { "${lang.fi} - fi", 0, 0, "uilang id:fi" }, - { "${lang.fr} - fr", 0, 0, "uilang id:fr" }, - { "${lang.gl} - gl", 0, 0, "uilang id:gl" }, - { "${lang.hu} - hu", 0, 0, "uilang id:hu" }, - { "${lang.ia} - ia", 0, 0, "uilang id:ia" }, - { "${lang.ie} - ie", 0, 0, "uilang id:ie" }, - { "${lang.isv} - isv", 0, 0, "uilang id:isv" }, - { "${lang.pl} - pl", 0, 0, "uilang id:pl" }, - { "${lang.ru} - ru", 0, 0, "uilang id:ru" }, - { "${lang.sk} - sk", 0, 0, "uilang id:sk" }, - { "${lang.sr} - sr", 0, 0, "uilang id:sr" }, - { "${lang.tok} - tok", 0, 0, "uilang id:tok" }, - { "${lang.uk} - uk", 0, 0, "uilang id:uk" }, - { "${lang.zh.hans} - zh", 0, 0, "uilang id:zh_Hans" }, - { "${lang.zh.hant} - zh", 0, 0, "uilang id:zh_Hant" }, + const iMenuItem langItems[] = { { u8"Čeština - cs", 0, 0, "uilang id:cs" }, + { u8"Deutsch - de", 0, 0, "uilang id:de" }, + { u8"English - en", 0, 0, "uilang id:en" }, + { u8"Español - es", 0, 0, "uilang id:es" }, + { u8"Español (México) - es", 0, 0, "uilang id:es_MX" }, + { u8"Esperanto - eo", 0, 0, "uilang id:eo" }, + { u8"Suomi - fi", 0, 0, "uilang id:fi" }, + { u8"Français - fr", 0, 0, "uilang id:fr" }, + { u8"Galego - gl", 0, 0, "uilang id:gl" }, + { u8"Magyar - hu", 0, 0, "uilang id:hu" }, + { u8"Interlingua - ia", 0, 0, "uilang id:ia" }, + { u8"Interlingue - ie", 0, 0, "uilang id:ie" }, + { u8"Interslavic - isv", 0, 0, "uilang id:isv" }, + { u8"Polski - pl", 0, 0, "uilang id:pl" }, + { u8"Русский - ru", 0, 0, "uilang id:ru" }, + { u8"Slovak - sk", 0, 0, "uilang id:sk" }, + { u8"Српски - sr", 0, 0, "uilang id:sr" }, + { u8"Toki pona - tok", 0, 0, "uilang id:tok" }, + { u8"Українська - uk", 0, 0, "uilang id:uk" }, + { u8"简体中文 - zh", 0, 0, "uilang id:zh_Hans" }, + { u8"繁體/正體中文 - zh", 0, 0, "uilang id:zh_Hant" }, { NULL } }; const iMenuItem returnKeyBehaviors[] = { { "${prefs.returnkey.linebreak} " uiTextAction_ColorEscape shift_Icon return_Icon -- cgit v1.2.3 From a20a9a6a3c06ddac6eefcb73bd0485e33bbe6cc6 Mon Sep 17 00:00:00 2001 From: Alex Schroeder Date: Sat, 13 Nov 2021 14:36:00 +0000 Subject: Translated using Weblate (German) Currently translated at 98.8% (620 of 627 strings) Translation: Lagrange/User Interface Translate-URL: http://weblate.skyjake.fi/projects/lagrange/ui/de/ --- po/de.po | 506 ++++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 402 insertions(+), 104 deletions(-) diff --git a/po/de.po b/po/de.po index 50f8a160..0f9b2fa5 100644 --- a/po/de.po +++ b/po/de.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: jaakko.keranen@iki.fi\n" -"PO-Revision-Date: 2021-09-20 20:49+0000\n" +"PO-Revision-Date: 2021-11-14 20:50+0000\n" "Last-Translator: Alex Schroeder \n" "Language-Team: German \n" "Language: de\n" @@ -12,13 +12,13 @@ msgstr "" "X-Generator: Weblate 4.5.1\n" msgid "menu.opentab" -msgstr "In neuem Tab öffnen" +msgstr "In neuem Reiter öffnen" msgid "menu.feeds.entrylist" msgstr "Feed-Einträge anzeigen" msgid "feeds.entry.newtab" -msgstr "Eintrag in neuem Tab öffnen" +msgstr "Eintrag in neuem Reiter öffnen" msgid "cancel" msgstr "Abbrechen" @@ -33,10 +33,10 @@ msgid "dlg.default" msgstr " Ok " msgid "toggle.yes" -msgstr "JA" +msgstr "Ja" msgid "toggle.no" -msgstr "NEIN" +msgstr "Nein" msgid "menu.title.file" msgstr "Datei" @@ -57,22 +57,22 @@ msgid "menu.title.help" msgstr "Hilfe" msgid "menu.newtab" -msgstr "Neuer Tab" +msgstr "Neuer Reiter" msgid "menu.closetab" -msgstr "Tab schließen" +msgstr "Reiter schließen" msgid "menu.closetab.other" -msgstr "Andere Tabs schließen" +msgstr "Andere Reiter schließen" msgid "menu.closetab.left" -msgstr "Tabs links schließen" +msgstr "Reiter links schließen" msgid "menu.closetab.right" -msgstr "Tabs rechts schließen" +msgstr "Reiter rechts schließen" msgid "menu.duptab" -msgstr "Tab duplizieren" +msgstr "Reiter duplizieren" msgid "feeds.entry.markread" msgstr "Als gelesen markieren" @@ -81,7 +81,7 @@ msgid "feeds.entry.markunread" msgstr "Als ungelesen markieren" msgid "menu.opentab.background" -msgstr "Tab im Hintergrund öffnen" +msgstr "Reiter im Hintergrund öffnen" msgid "about.logo" msgstr "ASCII-Kunst: Das Wort \"Lagrange\" in großer Schrift" @@ -135,7 +135,7 @@ msgid "menu.bookmarks.list" msgstr "Alle Lesezeichen auflisten" msgid "menu.bookmarks.bytag" -msgstr "Lesezeichen nach Tags auflisten" +msgstr "Lesezeichen nach Schlagworten auflisten" msgid "menu.sidebar.right" msgstr "Rechte Seitenleiste ein-/ausblenden" @@ -144,13 +144,13 @@ msgid "menu.zoom.in" msgstr "Vergrößern" msgid "macos.menu.bookmarks.bytag" -msgstr "Nach Tags auflisten" +msgstr "Nach Schlagworten auflisten" msgid "menu.bookmarks.bytime" msgstr "Lesezeichen nach Erstellungszeitpunkt auflisten" msgid "menu.preferences" -msgstr "Einstellungen…" +msgstr "Präferenzen…" msgid "menu.help" msgstr "Hilfe" @@ -195,7 +195,7 @@ msgid "menu.parent" msgstr "Nach oben" msgid "keys.tab.next" -msgstr "Nächster Tab" +msgstr "Nächster Reiter" msgid "menu.sidebar.left" msgstr "Linke Seitenleiste ein-/ausblenden" @@ -204,7 +204,7 @@ msgid "menu.root" msgstr "Zum Hauptknoten" msgid "menu.reload" -msgstr "Seite neu laden" +msgstr "Seite aktualisieren" msgid "menu.autoreload" msgstr "Automatische Aktualisierung…" @@ -298,10 +298,10 @@ msgid "feeds.entry.bookmark" msgstr "Lesezeichen hinzufügen…" msgid "dlg.confirm.history.clear" -msgstr "Wollen Sie wirklich die Chronik aller besuchten Seiten löschen?" +msgstr "Wollen Sie wirklich den Verlauf aller besuchten Seiten löschen?" msgid "heading.bookmark.edit" -msgstr "LESEZEICHEN BEARBEITEN" +msgstr "Lesezeichen bearbeiten" msgid "dlg.openlink" msgstr "Link öffnen" @@ -319,10 +319,10 @@ msgid "dlg.save.incomplete" msgstr "Die Seiteninhalte werden noch heruntergeladen." msgid "heading.save.incomplete" -msgstr "SEITE UNVOLLSTÄNDIG" +msgstr "Seite unvollständig" msgid "heading.save" -msgstr "DATEI GESPEICHERT" +msgstr "Datei gespeichert" msgid "dlg.input.send" msgstr "Senden" @@ -375,7 +375,7 @@ msgid "heading.prefs.colors" msgstr "Farben" msgid "dlg.bookmark.tags" -msgstr "Stichwörter:" +msgstr "Schlagworte:" msgid "dlg.bookmark.url" msgstr "URL:" @@ -384,7 +384,7 @@ msgid "dlg.feed.title" msgstr "Titel:" msgid "heading.feedcfg" -msgstr "FEED EINSTELLUNGEN" +msgstr "Feed Einstellungen" msgid "dlg.newident.country" msgstr "Land:" @@ -396,7 +396,7 @@ msgid "dlg.newident.email" msgstr "Email:" msgid "heading.bookmark.add" -msgstr "LESEZEICHEN HINZUFÜGEN" +msgstr "Lesezeichen hinzufügen" msgid "dlg.feed.sub" msgstr "Abonnieren" @@ -414,7 +414,7 @@ msgid "link.noproxy" msgstr "Ohne Proxy öffnen" msgid "link.newtab" -msgstr "Link in neuem Tab öffnen" +msgstr "Link in neuem Reiter öffnen" #, c-format msgid "dlg.import.add" @@ -423,7 +423,7 @@ msgstr[0] "%sLesezeichen hinzufügen" msgstr[1] "" msgid "heading.import.bookmarks" -msgstr "LESEZEICHEN IMPORTIEREN" +msgstr "Lesezeichen importieren" msgid "sidebar.entry.bookmark" msgstr "Lesezeichen hinzufügen…" @@ -447,10 +447,10 @@ msgid "menu.forgeturl" msgstr "URL vergessen" msgid "dlg.history.clear" -msgstr "Chronik löschen" +msgstr "Verlauf löschen" msgid "history.clear" -msgstr "Chronik löschen…" +msgstr "Verlauf löschen…" msgid "bookmark.tag.home" msgstr "Als Startseite verwenden" @@ -494,7 +494,7 @@ msgid "dlg.translate.fail" msgstr "Anfrage fehlgeschlagen" msgid "heading.translate" -msgstr "SEITE ÜBERSETZEN" +msgstr "Seite übersetzen" msgid "bookmark.title.blank" msgstr "Leere Seite" @@ -549,7 +549,7 @@ msgid "heading.prefs.network" msgstr "Netzwerk" msgid "heading.prefs.paragraph" -msgstr "ABSATZ" +msgstr "Absatz" msgid "prefs.theme.dark" msgstr "Dunkel" @@ -583,16 +583,16 @@ msgid "prefs.proxy.gemini" msgstr "Gemini Proxy:" msgid "keys.reload" -msgstr "Seite neu laden" +msgstr "Seite aktualisieren" msgid "keys.bookmark.add" msgstr "Lesezeichen hinzufügen" msgid "keys.tab.new" -msgstr "Neuer Tab" +msgstr "Neuer Reiter" msgid "keys.tab.close" -msgstr "Tab schließen" +msgstr "Reiter schließen" msgid "error.cert.invalid" msgstr "Ungültiges Zertifikat" @@ -632,8 +632,8 @@ msgstr "Eine Seite zurück" msgid "num.bytes" msgid_plural "num.bytes.n" -msgstr[0] "%zu Byte" -msgstr[1] "%zu Bytes" +msgstr[0] "%u Byte" +msgstr[1] "%u Bytes" # strftime() formatted, split on two lines #, c-format @@ -652,19 +652,19 @@ msgid "menu.bookmarks.refresh" msgstr "Remote-Lesezeichen aktualisieren" msgid "feeds.unsubscribe" -msgstr "Deabonnieren…" +msgstr "Abonnement abbestellen…" msgid "menu.dup" msgstr "Duplizieren …" msgid "heading.history.clear" -msgstr "VERLAUF LÖSCHEN" +msgstr "Verlauf löschen" msgid "bookmark.tag.remote" msgstr "Als Lesezeichen-Quelle verwenden" msgid "bookmark.untag.sub" -msgstr "Feed-Abonnement kündigen" +msgstr "Feed-Abonnement abbestellen" msgid "bookmark.untag.remote" msgstr "Lesezeichen-Quelle entfernen" @@ -688,7 +688,7 @@ msgstr "Laden" # Inline download status message. msgid "media.download.warnclose" -msgstr "Der Download wird abgebrochen, wenn Sie diesen Tab schließen." +msgstr "Der Download wird abgebrochen, wenn Sie diesen Reiter schließen." # Inline download status message. msgid "media.download.complete" @@ -728,8 +728,8 @@ msgstr "Feed-Einträge" #, c-format msgid "feeds.list.entrycount" msgid_plural "feeds.list.entrycount.n" -msgstr[0] "insgesamt %zu Eintrag" -msgstr[1] "insgesamt %zu Einträge" +msgstr[0] "insgesamt einen Eintrag" +msgstr[1] "insgesamt %u Einträge" #, c-format msgid "feeds.list.refreshtime" @@ -780,22 +780,22 @@ msgid "ident.delete" msgstr "Identität löschen …" msgid "heading.ident.delete" -msgstr "IDENTITÄT LÖSCHEN" +msgstr "Identität löschen" #, c-format msgid "ident.usedonurls" msgid_plural "ident.usedonurls.n" -msgstr[0] "Verwendet bei %zu URL" -msgstr[1] "Verwendet bei %zu URLs" +msgstr[0] "Verwendet für eine URL" +msgstr[1] "Verwendet für %u URLs" msgid "ident.using" msgstr "Verwenden für diese Seite" msgid "heading.ident.use" -msgstr "IDENTITÄTSVERWENDUNG" +msgstr "Identitätsverwendung" msgid "heading.ident.notes" -msgstr "IDENTITÄTSANMERKUNGEN" +msgstr "Identitätsanmerkungen" msgid "ident.showuse" msgstr "Verwendung anzeigen" @@ -807,20 +807,17 @@ msgid "sidebar.empty.idents" msgstr "keine Identitäten" msgid "heading.unsub" -msgstr "ABONNEMENT KÜNDIGEN" +msgstr "Abonnement abbestellen" #, c-format msgid "dlg.confirm.unsub" -msgstr "" -"Feed wirklich abbestellen:\n" -"\"%s\"?" +msgstr "Feed wirklich abbestellen: \"%s\"?" #, c-format msgid "dlg.confirm.ident.delete" msgstr "" -"Wollen Sie wirklich die Identität\n" -" %s%s%s\n" -"einschließlich ihrer Zertifikats- und privaten Schlüsseldateien löschen?" +"Wollen Sie wirklich die Identität %s\"%s\"%s einschließlich ihrer " +"Zertifikats- und privaten Schlüsseldateien löschen?" # The %s format characters are used to highlight the word "Help" and must be used in the translation in same way as here. #, c-format @@ -829,7 +826,7 @@ msgstr "" "Weitere Informationen zu TLS-Client-Zertifikaten finden Sie unter %sHelp%s." msgid "heading.openlink" -msgstr "LINK ÖFFNEN" +msgstr "Link öffnen" msgid "prefs.boldlink" msgstr "Fettgedruckte Links:" @@ -846,7 +843,7 @@ msgid "lang.zh.hant" msgstr "Chinesisch (traditionell)" msgid "heading.newident" -msgstr "NEUE IDENTITÄT" +msgstr "Neue Identität" msgid "dlg.newident.rsa.selfsign" msgstr "Erstellen eines selbstsignierten 2048-Bit-RSA-Zertifikats." @@ -890,11 +887,11 @@ msgstr[1] "" # Interpret as "Results from bookmarks..." msgid "heading.lookup.bookmarks" -msgstr "LESEZEICHEN" +msgstr "Lesezeichen" # Interpret as "Results from feeds..." msgid "heading.lookup.feeds" -msgstr "FEEDS" +msgstr "Feeds" msgid "dlg.newident.until" msgstr "Gültig bis:" @@ -931,7 +928,7 @@ msgid "dlg.unsub" msgstr "Abbestellen" msgid "heading.pageinfo" -msgstr "SEITENINFORMATION" +msgstr "Seiteninformation" msgid "pageinfo.header.cached" msgstr "(zwischengespeicherter Inhalt)" @@ -952,13 +949,14 @@ msgid "pageinfo.domain.match" msgstr "Domänenname stimmt überein" msgid "heading.save.error" -msgstr "FEHLER BEIM SPEICHERN DER DATEI" +msgstr "Fehler beim Speichern der Datei" msgid "dlg.autoreload" -msgstr "Wählen Sie das Intervall für das automatische Neuladen für diese Tab." +msgstr "" +"Wählen Sie das Intervall für die automatische Aktualisierung des Reiters." msgid "link.newtab.background" -msgstr "Link im Hintergrund-Tab öffnen" +msgstr "Link in einem neuen Reiter im Hintergrund öffnen" msgid "link.browser" msgstr "Link im Standardbrowser öffnen" @@ -973,23 +971,23 @@ msgstr "" "Problem der Serverkonfiguration sein." msgid "heading.certimport" -msgstr "IDENTITÄT IMPORTIEREN" +msgstr "Identität importieren" # Interpret as "Results from history..." msgid "heading.lookup.history" -msgstr "Chronik" +msgstr "Verlauf" # Interpret as "Results from page content..." msgid "heading.lookup.pagecontent" -msgstr "SEITENINHALT" +msgstr "Seiteninhalt" # Interpret as "Results from identitites..." msgid "heading.lookup.identities" -msgstr "IDENTITÄTEN" +msgstr "Identitäten" # Interpret as "Other results..." msgid "heading.lookup.other" -msgstr "ANDERE" +msgstr "Andere" msgid "dlg.translate.unavail" msgstr "Dienst nicht verfügbar" @@ -1010,7 +1008,7 @@ msgid "dlg.newident.userid" msgstr "Benutzer-ID:" msgid "heading.subscribe" -msgstr "SEITE ABONNIEREN" +msgstr "Seite abonnieren" msgid "dlg.feed.entrytype" msgstr "Eintragstyp:" @@ -1022,13 +1020,13 @@ msgid "dlg.bookmark.icon" msgstr "Symbol:" msgid "heading.prefs.scrolling" -msgstr "BLÄTTERN" +msgstr "Blättern" msgid "heading.prefs.sizing" -msgstr "GRÖßENEINTEILUNG" +msgstr "Größeneinteilung" msgid "heading.prefs.widelayout" -msgstr "BREITES LAYOUT" +msgstr "Breites Layout" msgid "prefs.hoverlink" msgstr "URL bei Mauszeiger anzeigen:" @@ -1064,7 +1062,7 @@ msgid "prefs.accent.teal" msgstr "Türkisblau" msgid "prefs.uiscale" -msgstr "UI-Skalierungsfaktor:" +msgstr "Skalierungsfaktor der Oberfläche :" msgid "prefs.customframe" msgstr "Individueller Fensterrahmen:" @@ -1154,10 +1152,10 @@ msgid "heading.certwarn" msgstr "NICHT VERTRAUENSWÜRDIGES ZERTIFIKAT" msgid "heading.certimport.pasted" -msgstr "AUS DER ZWISCHENABLAGE EINGEFÜGT" +msgstr "Aus der Zwischenablage eingefügt" msgid "heading.certimport.dropped" -msgstr "VERLORENE DATEI" +msgstr "Abgelegte Datei" msgid "hint.certimport.description" msgstr "Beschreibung" @@ -1191,23 +1189,23 @@ msgid "dlg.newident.create" msgstr "Identität erstellen" msgid "heading.prefs" -msgstr "PREFERENZEN" +msgstr "Präferenzen" msgid "heading.prefs.certs" -msgstr "ZERTIFIKATE" +msgstr "Zertifikate" msgid "heading.prefs.fonts" msgstr "Schriftarten" # tab button msgid "heading.prefs.keys" -msgstr "TASTEN" +msgstr "Tasten" msgid "heading.prefs.pagecontent" -msgstr "PAGE COLORS" +msgstr "Seitenfarben" msgid "heading.prefs.proxies" -msgstr "PROXIES" +msgstr "Proxies" msgid "gempub.meta.lang" msgstr "Sprache" @@ -1367,8 +1365,8 @@ msgstr "Server nicht erreichbar" #, c-format msgid "feeds.list.counts" msgid_plural "feeds.list.counts.n" -msgstr[0] "Sie haben %zu Feed mit %%s abonniert.\n" -msgstr[1] "Sie haben %zu Feeds mit %%s abonniert.\n" +msgstr[0] "Sie haben einen Feed mit %%s abonniert.\n" +msgstr[1] "Sie haben %u Feeds mit %%s abonniert.\n" msgid "upload.port" msgstr "Port…" @@ -1393,7 +1391,7 @@ msgid "prefs.linespacing" msgstr "Zeilenabstand:" msgid "error.tls.msg" -msgstr "Die Kommunikation mit dem Server ist fehlgeschlagen. Die Fehlermeldung:" +msgstr "Die Kommunikation mit dem Server ist fehlgeschlagen." msgid "error.certexpired" msgstr "Zertifikat abgelaufen" @@ -1452,7 +1450,7 @@ msgid "sidebar.action.ident.import" msgstr "Importieren…" msgid "keys.parent" -msgstr "Zum darüber liegenden Verzeichnis" +msgstr "Zum darüber liegenden Ordner" msgid "feeds.atom.translated" msgstr "" @@ -1478,13 +1476,13 @@ msgid "bookmark.export.format.tags" msgstr "Schlagworte werden mit Überschriften der Stufe 2 definiert." msgid "menu.page.upload" -msgstr "Seite mit Titan hochladen" +msgstr "Seite mit Titan hochladen…" msgid "heading.upload" -msgstr "UPLOAD WITH TITAN" +msgstr "Hochladen mit Titan" msgid "hint.upload.text" -msgstr "Texteingabe für den Upload" +msgstr "Texteingabe für das Hochladen" msgid "heading.upload.file" msgstr "Datei" @@ -1502,10 +1500,10 @@ msgid "upload.token" msgstr "Kennwort:" msgid "dlg.upload.send" -msgstr "Upload" +msgstr "Hochladen" msgid "heading.uploadport" -msgstr "TITAN UPLOAD PORT" +msgstr "Titan Port" msgid "lang.ia" msgstr "Interlingua" @@ -1526,13 +1524,13 @@ msgid "prefs.pinsplit.right" msgstr "Rechter Reiter" msgid "heading.newident.missing" -msgstr "MISSING INFO" +msgstr "Fehlende Information" msgid "heading.newident.date.bad" -msgstr "INVALID DATE" +msgstr "Ungültiges Datum" msgid "heading.prefs.uitheme" -msgstr "UI COLORS" +msgstr "Oberflächenfarben" msgid "prefs.scrollspeed.keyboard" msgstr "Tastaturgeschwindigkeit:" @@ -1626,13 +1624,13 @@ msgid "menu.split.horizontal" msgstr "Horizontal" msgid "menu.downloads" -msgstr "Download Verzeichnis anzeigen" +msgstr "Downloads anzeigen" msgid "menu.unexpire" msgstr "Ablaufdatum ignorieren und weiter laden" msgid "menu.save.downloads.open" -msgstr "Im Downloadverzeichnis speichern und Datei öffnen" +msgstr "In den Downloads speichern und Datei öffnen" msgid "menu.select.clear" msgstr "Auswahl aufheben" @@ -1656,7 +1654,7 @@ msgid "dlg.save.opendownload" msgstr "Runtergeladene Datei öffnen" msgid "heading.autoreload" -msgstr "AUTO-RELOAD" +msgstr "Automatische Aktualisierung" msgid "link.side" msgstr "Link seitlich öffnen" @@ -1668,7 +1666,7 @@ msgid "link.file.delete" msgstr "Datei löschen" msgid "heading.file.delete" -msgstr "DELETE FILE" +msgstr "Datei löschen" msgid "dlg.file.delete.confirm" msgstr "Wollen Sie die Datei wirklich löschen?" @@ -1680,7 +1678,7 @@ msgid "menu.pageinfo" msgstr "Seiteninformation anzeigen" msgid "bookmark.export.title.tag" -msgstr "Schlagworte für Lesenzeichen" +msgstr "Schlagworte für Lesezeichen" msgid "bookmark.export.count" msgid_plural "bookmark.export.count.n" @@ -1698,8 +1696,8 @@ msgstr "Links seitlich öffnen" msgid "bookmark.export.taginfo" msgstr "" "In diese Liste steht jede Überschrift für ein Lesezeichenschlagwort. Nur " -"verschlagwortete Lesezeichen werden aufgeführt. Lesezeichen mir mehreren " -"Schlagworten werden jedem dieser Schlagworte aufgeführt." +"verschlagwortete Lesezeichen werden aufgeführt. Lesezeichen mit mehreren " +"Schlagworten werden unter jedem dieser Schlagworte aufgeführt." msgid "prefs.memorysize" msgstr "Speichergrösse:" @@ -1710,17 +1708,17 @@ msgstr "Archiv verlassen" #, c-format msgid "archive.summary" msgid_plural "archive.summary.n" -msgstr[0] "Dieses Archiv enthält %zu Eintrag und wurde auf %.1f MB komprimiert." -msgstr[1] "Dieses Archiv enthält %zu Einträge und wurde auf %.1f MB komprimiert." +msgstr[0] "Dieses Archiv enthält einen Eintrag und wurde auf %.1f MB komprimiert." +msgstr[1] "Dieses Archiv enthält %u Einträge und wurde auf %.1f MB komprimiert." msgid "dir.empty" -msgstr "Dieses Verzeichnis ist leer." +msgstr "Dieser Ordner ist leer." #, c-format msgid "dir.summary" msgid_plural "dir.summary.n" -msgstr[0] "Dieses Verzeichnis enthält %zu Eintrag." -msgstr[1] "Dieses Verzeichnis enthält %zu Einträge." +msgstr[0] "Dieser Ordner enthält einen Eintrag." +msgstr[1] "Dieser Ordner enthält %u Einträge." msgid "keys.zoom.out" msgstr "Verkleinern" @@ -1745,8 +1743,8 @@ msgstr "siehe Instruktionen des Servers" msgid "dlg.uploadport.msg" msgstr "" -"Setzt den Port des Titanservers für diese URL.\n" -"Der Port wird für diesen Site gespeichert." +"Setzt den Port des Titanservers für diese URL. Der Port wird in der " +"Konfiguration für diesen Seiten gespeichert." msgid "lang.tok" msgstr "Toki Pona" @@ -1814,3 +1812,303 @@ msgstr "" msgid "error.unsupported.protocol.msg" msgstr "Das gewünschte Protokoll wird von dieser Applikation nicht unterstützt." + +msgid "dlg.addfolder.defaulttitle" +msgstr "Neuer Ordner" + +# used on mobile +msgid "heading.settings" +msgstr "Einstellungen" + +msgid "prefs.imagestyle" +msgstr "Bilder einfärben:" + +msgid "prefs.imagestyle.original" +msgstr "Keine" + +msgid "prefs.imagestyle.grayscale" +msgstr "Graustufen" + +msgid "prefs.imagestyle.text" +msgstr "Textfarbe" + +msgid "prefs.imagestyle.preformat" +msgstr "Textfarbe für vorformatierten Text" + +msgid "prefs.font.heading" +msgstr "Titel:" + +msgid "prefs.font.body" +msgstr "Textkörper:" + +msgid "prefs.font.ui" +msgstr "Oberfläche :" + +# Font to use for headings and body when Monospace body is enabled. +msgid "prefs.font.monodoc" +msgstr "Nichtproportionale Schrift:" + +msgid "prefs.boldlink.visited" +msgstr "Besucht" + +msgid "prefs.gemtext.ansi" +msgstr "ANSI Code-Umschaltungen:" + +msgid "prefs.gemtext.ansi.fg" +msgstr "Vordergrundfarbe" + +msgid "prefs.gemtext.ansi.fontstyle" +msgstr "Schriftstil" + +msgid "prefs.font.warnmissing" +msgstr "Glyphenwarnungen:" + +msgid "prefs.font.smooth" +msgstr "Glättung:" + +msgid "keys.bookmark.addfolder" +msgstr "Lesezeichenordner hinzufügen" + +msgid "keys.split.item" +msgstr "Aufteilungsmenü:" + +msgid "keys.hoverurl" +msgstr "URL beim Darüberfahren anzeigen" + +msgid "error.ansi" +msgstr "Terminalemulation" + +msgid "error.glyphs" +msgstr "Fehlende Glyphen" + +msgid "error.glyphs.msg" +msgstr "" +"Diese Seite kann nicht vollständig angezeigt werden, weil gewisse Charaktere " +"fehlen. Mit der Installation zusätzlicher Schriftarten kann dies behoben " +"werden." + +#, c-format +msgid "dlg.fontpack.delete.confirm" +msgstr "Wollen Sie das Schriftartenpaket \"%s\" wirklich für immer löschen?" + +msgid "dlg.fontpack.delete" +msgstr "Schriftartenpaket löschen" + +msgid "fontpack.install.ttf" +msgstr "TrueType Schriftart installieren" + +msgid "fontpack.open.aboutfonts" +msgstr "Installierte Schriftarten anzeigen" + +msgid "fontpack.open.fontsdir" +msgstr "Benutzerschriftartenordner öffnen" + +#, c-format +msgid "dlg.dismiss.ansi" +msgstr "Die Warnung zur Terminalemulation für %s zukünftig ignorieren?" + +msgid "dlg.dismiss.warning" +msgstr "Warnung ignorieren" + +msgid "dlg.fontpack.classic.msg" +msgstr "" +"Die Schriftarten, welche bisher mit der Applikation verteilt wurden, gibt es " +"nun als separates Download. Wollen Sie das \"Klassik\" Set runterladen?" + +msgid "dlg.fontpack.classic" +msgstr "Schriftartenpaket runterladen (25 MB)" + +msgid "heading.dismiss.warning" +msgstr "Warnung ignorieren?" + +msgid "heading.fontpack.classic" +msgstr "Schriftartenpaket runterladen" + +msgid "truetype.help" +msgstr "" +"Lagrange probiert alle TrueType Schriftartendateien zu laden, welche im " +"Benutzerschriftartenordner liegen." + +msgid "truetype.help.installed" +msgstr "Diese Schriftart ist im Benutzerschriftartenordner installiert." + +msgid "lang.gl" +msgstr "Galizisch" + +msgid "dlg.feed.ignoreweb" +msgstr "HTTP(S) Links ignorieren:" + +msgid "heading.bookmark.tags" +msgstr "Spezielle Schlagworte" + +msgid "heading.addfolder" +msgstr "Ordner hinzufügen" + +msgid "keys.link.homerow.next" +msgstr "Nächster Satz von Mittelzeiletastenlinks" + +msgid "menu.newfolder" +msgstr "Neuer Ordner…" + +msgid "menu.sort.alpha" +msgstr "Alphabetisch sortieren" + +# used for Preferences on mobile +msgid "menu.settings" +msgstr "Einstellungen" + +# keep this short (3x1 horiz layout) +msgid "menu.selectall" +msgstr "Alles auswählen" + +# keep this short (3x1 horiz layout) +msgid "menu.delete" +msgstr "Löschen" + +# keep this short (3x1 horiz layout) +msgid "menu.undo" +msgstr "Rückgängig" + +msgid "heading.fontpack.meta.disabled" +msgstr "Deaktivierte Schriftartenpakete" + +# Action label +msgid "fontpack.meta.viewfile" +msgstr "Datei anzeigen" + +#, c-format +msgid "fontpack.meta.version" +msgstr "Version %d" + +msgid "fontpack.meta.installed" +msgstr "Installiert" + +msgid "fontpack.meta.notinstalled" +msgstr "Nicht installiert" + +msgid "fontpack.meta.disabled" +msgstr ", deaktiviert" + +msgid "dlg.addfolder.prompt" +msgstr "Name des neuen Ordners:" + +msgid "dlg.addfolder" +msgstr "Ordner hinzufügen" + +msgid "menu.website" +msgstr "Projektwebseite…" + +msgid "menu.fonts" +msgstr "Schriftarten verwalten…" + +msgid "heading.confirm.bookmarks.delete" +msgstr "Lesezeichen löschen" + +# button in the mobile New Identity dialog +msgid "dlg.certimport.pickfile" +msgstr "Zertifikats- und privaten Schlüsseldateien importieren" + +#, c-format +msgid "dlg.confirm.bookmarks.delete" +msgid_plural "dlg.confirm.bookmarks.delete.n" +msgstr[0] "Wollen Sie das Lesezeichen in diesem Ordner wirklich löschen?" +msgstr[1] "Wollen Sie die %u Lesezeichen in diesem Ordner wirklich löschen?" + +msgid "num.files" +msgid_plural "num.files.n" +msgstr[0] "eine Datei" +msgstr[1] "%u Dateien" + +msgid "num.fonts" +msgid_plural "num.fonts.n" +msgstr[0] "eine Schriftart" +msgstr[1] "%u Schriftarten" + +msgid "upload.id" +msgstr "Identität:" + +msgid "dlg.upload.id.none" +msgstr "Keine" + +msgid "dlg.upload.id.default" +msgstr "Default" + +# used on mobile +msgid "dlg.upload.text" +msgstr "Text hochladen" + +# used on mobile +msgid "dlg.upload.file" +msgstr "Datei hochladen" + +# used on mobile +msgid "dlg.upload.pickfile" +msgstr "Datei auswählen" + +msgid "prefs.font.mono" +msgstr "Vorformatiert:" + +#, c-format +msgid "fontpack.install" +msgstr "Installation von \"%s\"" + +msgid "heading.fontpack.delete" +msgstr "Schriftartenpaket löschen" + +#, c-format +msgid "dlg.bookmarks.delete" +msgid_plural "dlg.bookmarks.delete.n" +msgstr[0] "Lesezeichen löschen" +msgstr[1] "%u Lesezeichen löschen" + +msgid "dlg.certwarn.title" +msgstr "Sicherheitsproblem" + +msgid "prefs.bookmarks.addbottom" +msgstr "Lesezeichen am Ende hinzufügen:" + +msgid "error.ansi.msg" +msgstr "" +"Diese Seite wird möglicherweise nicht richtig dargestellt. Es werden ANSI-" +"Code-Umschaltungen verwendet um die Darstellung zu kontrollieren, und das " +"wird nur teilweise unterstützt. Verwenden Sie einen Terminalemulator, um " +"diese Seite darzustellen." + +# Abbrevation: background-to-foreground +msgid "prefs.imagestyle.bgfg" +msgstr "Hintergrund zu Vordergrund" + +msgid "keys.split.next" +msgstr "Fokus zur nächsten Aufteilung" + +msgid "fontpack.help" +msgstr "" +"Lagrange Schriftartenpakete sind ZIP Dateien, welche Schriftarten und " +"dazugehörige Konfigurationen enthalten. Einmal installiert, können diese " +"Schriftarten für die Dokumenteninhalte und die Oberfläche verwendet werden. " +"Die aktive Schriftart wählen sie unter Präferenzen > Schriftarten." + +msgid "heading.fontpack.meta" +msgstr "Schriftarten" + +msgid "heading.fontpack.meta.enabled" +msgstr "Aktivierte Schriftartenpakete" + +#, c-format +msgid "fontpack.enable" +msgstr "Aktivierung von \"%s\"" + +#, c-format +msgid "fontpack.disable" +msgstr "Deaktivierung von \"%s\"" + +msgid "fontpack.export" +msgstr "Anzeige der fontpack.ini Vorlage" + +#, c-format +msgid "fontpack.upgrade" +msgstr "Aktualisieren von \"%s\" auf Version %d" + +#, c-format +msgid "fontpack.delete" +msgstr "\"%s\" für immer löschen" -- cgit v1.2.3 From 984b005bd01a57e53212bc1176b57b617414e75d Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Fri, 19 Nov 2021 14:32:55 +0200 Subject: Fixed clicking on tabs when banner is underneath Banner was too eager to eat all mouse events. --- res/about/version.gmi | 3 +++ src/ui/banner.c | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/res/about/version.gmi b/res/about/version.gmi index ffd91f7f..020373e4 100644 --- a/res/about/version.gmi +++ b/res/about/version.gmi @@ -6,6 +6,9 @@ ``` # Release notes +## 1.8.3 +* Fixed clicking on UI elements that are over the page top banner. The banner would always get clicked instead. + ## 1.8.2 * Fixed encoding of `+` characters in URLs as per RFC 3986. * Fixed crash when fontpack.ini specifies a file that cannot be found. diff --git a/src/ui/banner.c b/src/ui/banner.c index 0ffb1d9f..7168f4b2 100644 --- a/src/ui/banner.c +++ b/src/ui/banner.c @@ -257,8 +257,26 @@ static size_t itemAtCoord_Banner_(const iBanner *d, iInt2 coord) { return iInvalidPos; } +static iBool isInside_Banner(const iBanner *d, const SDL_Event *ev) { + if (ev->type == SDL_MOUSEMOTION || ev->type == SDL_MOUSEBUTTONDOWN || + ev->type == SDL_MOUSEBUTTONDOWN) { + iInt2 coord; + if (ev->type == SDL_MOUSEMOTION) { + coord = init_I2(ev->motion.x, ev->motion.y); + } + else { + coord = init_I2(ev->button.x, ev->button.y); + } + return contains_Rect(bounds_Widget(constAs_Widget(d->doc)), coord); + } + return iTrue; +} + iBool processEvent_Banner(iBanner *d, const SDL_Event *ev) { iWidget *w = as_Widget(d->doc); + if (!isInside_Banner(d, ev)) { + return iFalse; + } switch (ev->type) { case SDL_MOUSEMOTION: { const iInt2 coord = init_I2(ev->motion.x, ev->motion.y); -- cgit v1.2.3 From 4f18b568d40be7f6d80e2dd73dd6ae2fdf515a2f Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Fri, 19 Nov 2021 14:34:22 +0200 Subject: Cleanup --- src/ui/banner.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/banner.c b/src/ui/banner.c index 7168f4b2..2d166fd2 100644 --- a/src/ui/banner.c +++ b/src/ui/banner.c @@ -257,7 +257,7 @@ static size_t itemAtCoord_Banner_(const iBanner *d, iInt2 coord) { return iInvalidPos; } -static iBool isInside_Banner(const iBanner *d, const SDL_Event *ev) { +static iBool isInside_Banner_(const iBanner *d, const SDL_Event *ev) { if (ev->type == SDL_MOUSEMOTION || ev->type == SDL_MOUSEBUTTONDOWN || ev->type == SDL_MOUSEBUTTONDOWN) { iInt2 coord; -- cgit v1.2.3 From 42fb4f7d2190b32871d7d0a6336618b8e3500203 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Fri, 19 Nov 2021 14:34:34 +0200 Subject: Cleanup --- src/ui/banner.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/banner.c b/src/ui/banner.c index 2d166fd2..7ec189a4 100644 --- a/src/ui/banner.c +++ b/src/ui/banner.c @@ -274,7 +274,7 @@ static iBool isInside_Banner_(const iBanner *d, const SDL_Event *ev) { iBool processEvent_Banner(iBanner *d, const SDL_Event *ev) { iWidget *w = as_Widget(d->doc); - if (!isInside_Banner(d, ev)) { + if (!isInside_Banner_(d, ev)) { return iFalse; } switch (ev->type) { -- cgit v1.2.3 From 67f1a5b152ca90fd8346bd39957905edaf3fb1cc Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Sun, 21 Nov 2021 07:38:50 +0200 Subject: Update README Mention of MacPorts and older macOS versions. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 82ac77d8..5e66ea3c 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,14 @@ Like Gemini, Lagrange has been designed with minimalism in mind. It depends on a ## Downloads -Prebuilt binaries for Windows, macOS and Linux can be found in [Releases][rel]. You can also find [Lagrange on Flathub for Linux](https://flathub.org/apps/details/fi.skyjake.Lagrange). +Prebuilt binaries for Windows, macOS (10.13 or later) and Linux can be found in [Releases][rel]. You can also find [Lagrange on Flathub for Linux](https://flathub.org/apps/details/fi.skyjake.Lagrange). On macOS you can install and upgrade via Homebrew: brew install --cask lagrange +Please check [MacPorts](https://www.macports.org) if you are using macOS 10.12 or older. + On openSUSE Tumbleweed: sudo zypper install lagrange -- cgit v1.2.3 From c58985ed3105ff7fc29fc0d53ba81ba55882e05e Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Sun, 21 Nov 2021 14:35:32 +0200 Subject: Site-specific Titan upload identity The identity to be used for uploads is now in sitespec.ini, so it applies to an entire site root. This should match actual use cases better than having URL-specific identities. Also fixed an issue with native menus. Replacing the items with new ones was not implemented. IssueID #379 --- res/about/version.gmi | 2 ++ src/gmcerts.c | 6 ++++++ src/sitespec.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- src/sitespec.h | 9 +++++++-- src/ui/uploadwidget.c | 45 +++++++++++++++++++++++++++++++++------------ src/ui/util.c | 50 +++++++++++++++++++++++++++++++------------------- src/ui/util.h | 1 + 7 files changed, 129 insertions(+), 35 deletions(-) diff --git a/res/about/version.gmi b/res/about/version.gmi index 020373e4..b5750c8c 100644 --- a/res/about/version.gmi +++ b/res/about/version.gmi @@ -8,6 +8,8 @@ ## 1.8.3 * Fixed clicking on UI elements that are over the page top banner. The banner would always get clicked instead. +* Titan upload identity is remembered as a site-specific setting. It is no longer affected by selections in the Identities sidebar. +* macOS: Fixed updating items in native menus, e.g., upload identity selection. ## 1.8.2 * Fixed encoding of `+` characters in URLs as per RFC 3986. diff --git a/src/gmcerts.c b/src/gmcerts.c index 36fd7d55..f95fea7d 100644 --- a/src/gmcerts.c +++ b/src/gmcerts.c @@ -295,6 +295,9 @@ static void loadIdentities_GmCerts_(iGmCerts *d) { } iGmIdentity *findIdentity_GmCerts(iGmCerts *d, const iBlock *fingerprint) { + if (isEmpty_Block(fingerprint)) { + return NULL; + } iForEach(PtrArray, i, &d->idents) { iGmIdentity *ident = i.ptr; if (cmp_Block(fingerprint, &ident->fingerprint) == 0) { /* TODO: could use a hash */ @@ -549,6 +552,9 @@ const iGmIdentity *constIdentity_GmCerts(const iGmCerts *d, unsigned int id) { } const iGmIdentity *identityForUrl_GmCerts(const iGmCerts *d, const iString *url) { + if (isEmpty_String(url)) { + return NULL; + } lock_Mutex(d->mtx); const iGmIdentity *found = NULL; iConstForEach(PtrArray, i, &d->idents) { diff --git a/src/sitespec.c b/src/sitespec.c index 0332af2d..6f4546f0 100644 --- a/src/sitespec.c +++ b/src/sitespec.c @@ -33,17 +33,19 @@ iDeclareObjectConstruction(SiteParams) struct Impl_SiteParams { iObject object; uint16_t titanPort; + iString titanIdentity; /* fingerprint */ int dismissWarnings; /* TODO: theme seed, style settings */ }; void init_SiteParams(iSiteParams *d) { - d->titanPort = 0; /* undefined */ + d->titanPort = 0; /* undefined */ + init_String(&d->titanIdentity); d->dismissWarnings = 0; } void deinit_SiteParams(iSiteParams *d) { - iUnused(d); + deinit_String(&d->titanIdentity); } iDefineClass(SiteParams) @@ -122,6 +124,9 @@ static void handleIniKeyValue_SiteSpec_(void *context, const iString *table, con if (!cmp_String(key, "titanPort")) { d->loadParams->titanPort = number_TomlValue(value); } + else if (!cmp_String(key, "titanIdentity") && value->type == string_TomlType) { + set_String(&d->loadParams->titanIdentity, value->value.string); + } else if (!cmp_String(key, "dismissWarnings") && value->type == int64_TomlType) { d->loadParams->dismissWarnings = value->value.int64; } @@ -152,6 +157,10 @@ static void save_SiteSpec_(iSiteSpec *d) { if (params->titanPort) { appendFormat_String(buf, "titanPort = %u\n", params->titanPort); } + if (!isEmpty_String(¶ms->titanIdentity)) { + appendFormat_String( + buf, "titanIdentity = \"%s\"\n", cstr_String(¶ms->titanIdentity)); + } if (params->dismissWarnings) { appendFormat_String(buf, "dismissWarnings = 0x%x\n", params->dismissWarnings); } @@ -205,6 +214,30 @@ void setValue_SiteSpec(const iString *site, enum iSiteSpecKey key, int value) { } } +void setValueString_SiteSpec(const iString *site, enum iSiteSpecKey key, const iString *value) { + iSiteSpec *d = &siteSpec_; + const iString *hashKey = collect_String(lower_String(site)); + iSiteParams *params = value_StringHash(&d->sites, hashKey); + if (!params) { + params = new_SiteParams(); + insert_StringHash(&d->sites, hashKey, params); + } + iBool needSave = iFalse; + switch (key) { + case titanIdentity_SiteSpecKey: + if (!equal_String(¶ms->titanIdentity, value)) { + needSave = iTrue; + set_String(¶ms->titanIdentity, value); + } + break; + default: + break; + } + if (needSave) { + save_SiteSpec_(d); + } +} + int value_SiteSpec(const iString *site, enum iSiteSpecKey key) { iSiteSpec *d = &siteSpec_; const iSiteParams *params = constValue_StringHash(&d->sites, collect_String(lower_String(site))); @@ -220,3 +253,17 @@ int value_SiteSpec(const iString *site, enum iSiteSpecKey key) { return 0; } } + +const iString *valueString_SiteSpec(const iString *site, enum iSiteSpecKey key) { + iSiteSpec *d = &siteSpec_; + const iSiteParams *params = constValue_StringHash(&d->sites, collect_String(lower_String(site))); + if (!params) { + return 0; + } + switch (key) { + case titanIdentity_SiteSpecKey: + return ¶ms->titanIdentity; + default: + return collectNew_String(); + } +} diff --git a/src/sitespec.h b/src/sitespec.h index 6b64f073..5adaeb8c 100644 --- a/src/sitespec.h +++ b/src/sitespec.h @@ -28,11 +28,16 @@ iDeclareType(SiteSpec) enum iSiteSpecKey { titanPort_SiteSpecKey, + titanIdentity_SiteSpecKey, dismissWarnings_SiteSpecKey, }; void init_SiteSpec (const char *saveDir); void deinit_SiteSpec (void); -void setValue_SiteSpec (const iString *site, enum iSiteSpecKey key, int value); /* changes saved immediately */ -int value_SiteSpec (const iString *site, enum iSiteSpecKey key); +/* changes saved immediately */ +void setValue_SiteSpec (const iString *site, enum iSiteSpecKey key, int value); +void setValueString_SiteSpec (const iString *site, enum iSiteSpecKey key, const iString *value); + +int value_SiteSpec (const iString *site, enum iSiteSpecKey key); +const iString * valueString_SiteSpec (const iString *site, enum iSiteSpecKey key); diff --git a/src/ui/uploadwidget.c b/src/ui/uploadwidget.c index 90df1958..bad00071 100644 --- a/src/ui/uploadwidget.c +++ b/src/ui/uploadwidget.c @@ -45,7 +45,7 @@ iDefineObjectConstruction(UploadWidget) enum iUploadIdentity { none_UploadIdentity, - defaultForUrl_UploadIdentity, + defaultForSite_UploadIdentity, dropdown_UploadIdentity, }; @@ -104,9 +104,16 @@ static void updateInputMaxHeight_UploadWidget_(iUploadWidget *d) { (avail - inputPos.y) / lineHeight_Text(font_InputWidget(d->input)))); } +static const iGmIdentity *titanIdentityForUrl_(const iString *url) { + return findIdentity_GmCerts( + certs_App(), + collect_Block(hexDecode_Rangecc(range_String(valueString_SiteSpec( + collectNewRange_String(urlRoot_String(url)), titanIdentity_SiteSpecKey))))); +} + static const iArray *makeIdentityItems_UploadWidget_(const iUploadWidget *d) { iArray *items = collectNew_Array(sizeof(iMenuItem)); - const iGmIdentity *urlId = identityForUrl_GmCerts(certs_App(), &d->url); + const iGmIdentity *urlId = titanIdentityForUrl_(&d->url); pushBack_Array(items, &(iMenuItem){ format_CStr("${dlg.upload.id.default} (%s)", urlId ? cstr_String(name_GmIdentity(urlId)) @@ -147,7 +154,7 @@ void init_UploadWidget(iUploadWidget *d) { d->request = NULL; init_String(&d->filePath); d->fileSize = 0; - d->idMode = defaultForUrl_UploadIdentity; + d->idMode = defaultForSite_UploadIdentity; init_Block(&d->idFingerprint, 0); const iMenuItem actions[] = { { "${upload.port}", 0, 0, "upload.setport" }, @@ -289,16 +296,22 @@ void deinit_UploadWidget(iUploadWidget *d) { static void remakeIdentityItems_UploadWidget_(iUploadWidget *d) { iWidget *dropMenu = findChild_Widget(findChild_Widget(as_Widget(d), "upload.id"), "menu"); - releaseChildren_Widget(dropMenu); const iArray *items = makeIdentityItems_UploadWidget_(d); - makeMenuItems_Widget(dropMenu, constData_Array(items), size_Array(items)); + /* TODO: Make the following a utility method. */ + if (flags_Widget(dropMenu) & nativeMenu_WidgetFlag) { + setNativeMenuItems_Widget(dropMenu, constData_Array(items), size_Array(items)); + } + else { + releaseChildren_Widget(dropMenu); + makeMenuItems_Widget(dropMenu, constData_Array(items), size_Array(items)); + } } static void updateIdentityDropdown_UploadWidget_(iUploadWidget *d) { updateDropdownSelection_LabelWidget( findChild_Widget(as_Widget(d), "upload.id"), d->idMode == none_UploadIdentity ? " arg:0" - : d->idMode == defaultForUrl_UploadIdentity + : d->idMode == defaultForSite_UploadIdentity ? " arg:1" : format_CStr(" fp:%s", cstrCollect_String(hexEncode_Block(&d->idFingerprint)))); } @@ -422,7 +435,7 @@ static iBool processEvent_UploadWidget_(iUploadWidget *d, const SDL_Event *ev) { } else if (arg_Command(cmd)) { clear_Block(&d->idFingerprint); - d->idMode = defaultForUrl_UploadIdentity; + d->idMode = defaultForSite_UploadIdentity; } else { clear_Block(&d->idFingerprint); @@ -452,19 +465,27 @@ static iBool processEvent_UploadWidget_(iUploadWidget *d, const SDL_Event *ev) { setSendProgressFunc_GmRequest(d->request, updateProgress_UploadWidget_); setUserData_Object(d->request, d); setUrl_GmRequest(d->request, &d->url); + const iString *site = collectNewRange_String(urlRoot_String(&d->url)); switch (d->idMode) { - case defaultForUrl_UploadIdentity: - break; /* GmRequest handles it */ case none_UploadIdentity: - setIdentity_GmRequest(d->request, NULL); + /* Ensure no identity will be used for this specific URL. */ signOut_GmCerts(certs_App(), url_GmRequest(d->request)); + setValueString_SiteSpec(site, titanIdentity_SiteSpecKey, collectNew_String()); break; case dropdown_UploadIdentity: { iGmIdentity *ident = findIdentity_GmCerts(certs_App(), &d->idFingerprint); - setIdentity_GmRequest(d->request, ident); - signIn_GmCerts(certs_App(), ident, url_GmRequest(d->request)); + if (ident) { + setValueString_SiteSpec(site, + titanIdentity_SiteSpecKey, + collect_String(hexEncode_Block(&ident->fingerprint))); + } break; } + default: + break; + } + if (d->idMode != none_UploadIdentity) { + setIdentity_GmRequest(d->request, titanIdentityForUrl_(&d->url)); } if (isText) { /* Uploading text. */ diff --git a/src/ui/util.c b/src/ui/util.c index 2624bf2b..0a9dde0c 100644 --- a/src/ui/util.c +++ b/src/ui/util.c @@ -809,14 +809,27 @@ static void deleteMenuItems_(iArray *items) { delete_Array(items); } -iWidget *makeMenu_Widget(iWidget *parent, const iMenuItem *items, size_t n) { - iWidget *menu = new_Widget(); +void releaseNativeMenu_Widget(iWidget *d) { #if defined (iHaveNativeContextMenus) - setFlags_Widget(menu, hidden_WidgetFlag | nativeMenu_WidgetFlag, iTrue); + iArray *items = userData_Object(d); + if (items) { + iAssert(flags_Widget(d) & nativeMenu_WidgetFlag); + iAssert(items); + deleteMenuItems_(items); + setUserData_Object(d, NULL); + } +#else + iUnused(d); +#endif +} + +void setNativeMenuItems_Widget(iWidget *menu, const iMenuItem *items, size_t n) { +#if defined (iHaveNativeContextMenus) + iAssert(flags_Widget(menu) & nativeMenu_WidgetFlag); + releaseNativeMenu_Widget(menu); setUserData_Object(menu, deepCopyMenuItems_(menu, items, n)); - addChild_Widget(parent, menu); - iRelease(menu); /* owned by parent now */ /* Keyboard shortcuts still need to triggerable via the menu, although the items don't exist. */ { + releaseChildren_Widget(menu); for (size_t i = 0; i < n; i++) { const iMenuItem *item = &items[i]; if (item->key) { @@ -824,6 +837,17 @@ iWidget *makeMenu_Widget(iWidget *parent, const iMenuItem *items, size_t n) { } } } +#endif +} + +iWidget *makeMenu_Widget(iWidget *parent, const iMenuItem *items, size_t n) { + iWidget *menu = new_Widget(); +#if defined (iHaveNativeContextMenus) + setFlags_Widget(menu, hidden_WidgetFlag | nativeMenu_WidgetFlag, iTrue); + addChild_Widget(parent, menu); + iRelease(menu); /* owned by parent now */ + setUserData_Object(menu, NULL); + setNativeMenuItems_Widget(menu, items, n); #else /* Non-native custom popup menu. This may still be displayed inside a separate window. */ setDrawBufferEnabled_Widget(menu, iTrue); @@ -990,18 +1014,6 @@ iLocalDef iBool isUsingMenuPopupWindows_(void) { #endif } -void releaseNativeMenu_Widget(iWidget *d) { -#if defined (iHaveNativeContextMenus) - iArray *items = userData_Object(d); - iAssert(flags_Widget(d) & nativeMenu_WidgetFlag); - iAssert(items); - deleteMenuItems_(items); - setUserData_Object(d, NULL); -#else - iUnused(d); -#endif -} - void openMenuFlags_Widget(iWidget *d, iInt2 windowCoord, int menuOpenFlags) { const iBool postCommands = (menuOpenFlags & postCommands_MenuOpenFlags) != 0; #if defined (iHaveNativeContextMenus) @@ -1263,8 +1275,8 @@ void updateDropdownSelection_LabelWidget(iLabelWidget *dropButton, const char *s iMenuItem *item = findNativeMenuItem_Widget(menu, selectedCommand); if (item) { setSelected_NativeMenuItem(item, iTrue); - updateText_LabelWidget(dropButton, - removeMenuItemLabelPrefixes_String(collectNewCStr_String(item->label))); + updateText_LabelWidget( + dropButton, removeMenuItemLabelPrefixes_String(collectNewCStr_String(item->label))); } return; } diff --git a/src/ui/util.h b/src/ui/util.h index cf96dfe4..52b3a692 100644 --- a/src/ui/util.h +++ b/src/ui/util.h @@ -249,6 +249,7 @@ void setMenuItemDisabled_Widget (iWidget *menu, const char *comm void setMenuItemDisabledByIndex_Widget(iWidget *menu, size_t index, iBool disable); void setMenuItemLabel_Widget (iWidget *menu, const char *command, const char *newLabel); void setMenuItemLabelByIndex_Widget (iWidget *menu, size_t index, const char *newLabel); +void setNativeMenuItems_Widget (iWidget *, const iMenuItem *items, size_t n); int checkContextMenu_Widget (iWidget *, const SDL_Event *ev); /* see macro below */ -- cgit v1.2.3 From e38df6392244d2b4b465222f0f8a0f58893a3e41 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Sun, 21 Nov 2021 15:10:28 +0200 Subject: Depends: Logic for building HarfBuzz/FriBidi IssueID #390 --- Depends.cmake | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Depends.cmake b/Depends.cmake index c3decd7a..aaa2e8ea 100644 --- a/Depends.cmake +++ b/Depends.cmake @@ -43,12 +43,13 @@ else () endif () endif () -if (ENABLE_HARFBUZZ AND EXISTS ${CMAKE_SOURCE_DIR}/lib/harfbuzz/CMakeLists.txt) +if (ENABLE_HARFBUZZ) # Find HarfBuzz with pkg-config. if (NOT ENABLE_HARFBUZZ_MINIMAL AND PKG_CONFIG_FOUND) pkg_check_modules (HARFBUZZ IMPORTED_TARGET harfbuzz) endif () - if (ENABLE_HARFBUZZ_MINIMAL OR NOT HARFBUZZ_FOUND) + if (EXISTS ${CMAKE_SOURCE_DIR}/lib/harfbuzz/CMakeLists.txt AND + (ENABLE_HARFBUZZ_MINIMAL OR NOT HARFBUZZ_FOUND)) # Build HarfBuzz with minimal dependencies. if (MESON_EXECUTABLE AND NINJA_EXECUTABLE) set (_dst ${CMAKE_BINARY_DIR}/lib/harfbuzz) @@ -107,12 +108,12 @@ if (ENABLE_HARFBUZZ AND EXISTS ${CMAKE_SOURCE_DIR}/lib/harfbuzz/CMakeLists.txt) endif () endif () -if (ENABLE_FRIBIDI AND EXISTS ${CMAKE_SOURCE_DIR}/lib/fribidi) +if (ENABLE_FRIBIDI) # Find FriBidi with pkg-config. if (NOT ENABLE_FRIBIDI_BUILD AND PKG_CONFIG_FOUND) pkg_check_modules (FRIBIDI IMPORTED_TARGET fribidi) endif () - if (ENABLE_FRIBIDI_BUILD OR NOT FRIBIDI_FOUND) + if (EXISTS ${CMAKE_SOURCE_DIR}/lib/fribidi AND (ENABLE_FRIBIDI_BUILD OR NOT FRIBIDI_FOUND)) # Build FriBidi with Meson. set (_dst ${CMAKE_BINARY_DIR}/lib/fribidi) if (MESON_EXECUTABLE AND NINJA_EXECUTABLE) -- cgit v1.2.3 From d55d3ce2089193aae1a33ea59626202ecfada56f Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Sun, 21 Nov 2021 15:24:36 +0200 Subject: Help: `zip` options for creating fontpacks IssueID #387 --- res/about/help.gmi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/about/help.gmi b/res/about/help.gmi index 4af1581e..3c332f81 100644 --- a/res/about/help.gmi +++ b/res/about/help.gmi @@ -825,7 +825,7 @@ semibold = "FiraSans-SemiBold.ttf" bold = "FiraSans-Bold.ttf" ``` -Fontpacks may use the Deflate compression method, but that can slow down launching the app because each font must then be decompressed before loading. +Fontpacks may use the Deflate compression method, but that can slow down launching the app because each font must then be decompressed before loading. Therefore, it is recommended to use the -0 (--compression-method store) option when creating the archive. You may also find the -j (--junk-paths) option helpful if the current working directory is not the one where fontpack.ini is located. Each fontpack has an ID that comes from the file name: the ID of "firasans.fontpack" would be "firasans". Space characters are not allowed in the ID. -- cgit v1.2.3 From 33fe87051f3c4e293f47618adced141b1183b324 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Sun, 21 Nov 2021 16:18:34 +0200 Subject: Updated AppData --- res/fi.skyjake.Lagrange.appdata.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/res/fi.skyjake.Lagrange.appdata.xml b/res/fi.skyjake.Lagrange.appdata.xml index 7cb12f2e..e69cbcf7 100644 --- a/res/fi.skyjake.Lagrange.appdata.xml +++ b/res/fi.skyjake.Lagrange.appdata.xml @@ -45,6 +45,25 @@ jaakko.keranen@iki.fi + + +

Version 1.8 adds a customizable font library and improves warning + and errors messages. The bundled hardcoded fonts have been + removed, and font configuration is now more flexible. Tabs have + close buttons that appear on mouse hover.

+

Changes in v1.8.3:

+
    +
  • Fixed clicking on UI elements that are over the page top + banner. The banner would always get clicked instead.
  • +
  • Titan upload identity is remembered as a site-specific + setting. It is no longer affected by selections in the + Identities sidebar.
  • +
+

The full release notes can be viewed inside the app by opening + the "about:version" page.

+
+ https://github.com/skyjake/lagrange/releases/tag/v1.8.3 +

Version 1.8 adds a customizable font library and improves warning -- cgit v1.2.3