diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-11-21 18:28:08 +0200 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-11-21 18:28:08 +0200 |
commit | 58955605b89a47f2a438ec1eca77bef91c4af032 (patch) | |
tree | a7fc31e31c134023843ebdf0e6ef465e9b639941 | |
parent | 9908cc3ec9c6697070f23a9da52e25e95830fb01 (diff) | |
parent | 33fe87051f3c4e293f47618adced141b1183b324 (diff) |
Merge branch 'dev' into work/v1.9
# Conflicts:
# CMakeLists.txt
# res/about/version.gmi
-rw-r--r-- | AUTHORS.md | 18 | ||||
-rw-r--r-- | CMakeLists.txt | 15 | ||||
-rw-r--r-- | Depends.cmake | 9 | ||||
-rw-r--r-- | README.md | 4 | ||||
-rw-r--r-- | po/de.po | 506 | ||||
-rw-r--r-- | po/en.po | 59 | ||||
-rw-r--r-- | res/about/help.gmi | 2 | ||||
-rw-r--r-- | res/about/version.gmi | 5 | ||||
-rw-r--r-- | res/fi.skyjake.Lagrange.appdata.xml | 19 | ||||
-rw-r--r-- | src/gmcerts.c | 6 | ||||
-rw-r--r-- | src/sitespec.c | 51 | ||||
-rw-r--r-- | src/sitespec.h | 9 | ||||
-rw-r--r-- | src/ui/banner.c | 18 | ||||
-rw-r--r-- | src/ui/uploadwidget.c | 45 | ||||
-rw-r--r-- | src/ui/util.c | 92 | ||||
-rw-r--r-- | src/ui/util.h | 1 |
16 files changed, 630 insertions, 229 deletions
@@ -5,25 +5,25 @@ Lagrange was created by Jaakko Keränen (<jaakko.keranen@iki.fi>) in July 2020. | |||
5 | Legend: `C` code, `T` translation | 5 | Legend: `C` code, `T` translation |
6 | 6 | ||
7 | ``` | 7 | ``` |
8 | C 2609 Jaakko Keränen <jaakko.keranen@iki.fi> | 8 | C 2631 Jaakko Keränen <jaakko.keranen@iki.fi> |
9 | CT 39 Nikolay Korotkiy <sikmir@gmail.com> | 9 | CT 39 Nikolay Korotkiy <sikmir@gmail.com> |
10 | T 38 Olga Smirnova <mistresssilvara@hotmail.com> | 10 | T 39 Olga Smirnova <mistresssilvara@hotmail.com> |
11 | T 27 Alyssa Liddell <e-liss@tuta.io> | ||
11 | T 27 jan Anja <cyber@sysrq.in> | 12 | T 27 jan Anja <cyber@sysrq.in> |
12 | T 26 Alyssa Liddell <e-liss@tuta.io> | ||
13 | T 25 Shibo Lyu <github@of.sb> | 13 | T 25 Shibo Lyu <github@of.sb> |
14 | T 21 Страхиња Радић <contact@strahinja.org> | 14 | T 22 Страхиња Радић <contact@strahinja.org> |
15 | T 17 MCMic <come@chilliet.eu> | 15 | T 17 MCMic <come@chilliet.eu> |
16 | T 14 Wally Hackenslacker <mastor89@protonmail.com> | 16 | T 15 Wally Hackenslacker <mastor89@protonmail.com> |
17 | T 10 Tadeáš Erban <tadysekerbosek@gmail.com> | ||
18 | T 10 Xosé M <correoxm@disroot.org> | ||
17 | T 9 Aaron Fischer <mail@aaron-fischer.net> | 19 | T 9 Aaron Fischer <mail@aaron-fischer.net> |
18 | T 9 Xosé M <correoxm@disroot.org> | ||
19 | T 8 El Mau <public@correolibre.net> | 20 | T 8 El Mau <public@correolibre.net> |
20 | T 8 Tadeáš Erban <tadysekerbosek@gmail.com> | ||
21 | T 7 Waterrail <maksymiliankrol03@gmail.com> | 21 | T 7 Waterrail <maksymiliankrol03@gmail.com> |
22 | T 5 roy niang <roy@royniang.com> | 22 | T 5 roy niang <roy@royniang.com> |
23 | T 3 Botond Balázs <balazsbotond@gmail.com> | ||
23 | T 2 Alex Schroeder <alex@alexschroeder.ch> | 24 | T 2 Alex Schroeder <alex@alexschroeder.ch> |
24 | C 2 Alyssa Rosenzweig <alyssa@rosenzweig.io> | 25 | C 2 Alyssa Rosenzweig <alyssa@rosenzweig.io> |
25 | T 2 Arns Udovič <zordsdavini@arns.lt> | 26 | T 2 Arns Udovič <zordsdavini@arns.lt> |
26 | T 2 Botond Balázs <balazsbotond@gmail.com> | ||
27 | C 2 Br0000k <77938600+Br0000k@users.noreply.github.com> | 27 | C 2 Br0000k <77938600+Br0000k@users.noreply.github.com> |
28 | T 2 Gabriel de Oliveira Ferreira Machado <goliv04053@tutanota.com> | 28 | T 2 Gabriel de Oliveira Ferreira Machado <goliv04053@tutanota.com> |
29 | C 2 Manos Pitsidianakis <el13635@mail.ntua.gr> | 29 | C 2 Manos Pitsidianakis <el13635@mail.ntua.gr> |
@@ -38,8 +38,8 @@ C 1 David Gillies <dave.gillies@gmail.com> | |||
38 | C 1 Raph M <raph@raphm.com> | 38 | C 1 Raph M <raph@raphm.com> |
39 | C 1 SolidHal <hal@halemmerich.com> | 39 | C 1 SolidHal <hal@halemmerich.com> |
40 | C 1 Thomas Adam <thomas.adam@smoothwall.net> | 40 | C 1 Thomas Adam <thomas.adam@smoothwall.net> |
41 | C 1 Waweic <waweic@protonmail.com> | ||
42 | C 1 Waweic <waweic@activ.ism.rocks> | 41 | C 1 Waweic <waweic@activ.ism.rocks> |
42 | C 1 Waweic <waweic@protonmail.com> | ||
43 | C 1 Zach DeCook <zachdecook@librem.one> | 43 | C 1 Zach DeCook <zachdecook@librem.one> |
44 | C 1 zocker <zocker@10zen.eu> | 44 | C 1 zocker <zocker@10zen.eu> |
45 | ``` | 45 | ``` |
diff --git a/CMakeLists.txt b/CMakeLists.txt index b0a8ba04..69b7c5c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt | |||
@@ -285,6 +285,7 @@ endif () | |||
285 | 285 | ||
286 | # Target. | 286 | # Target. |
287 | add_executable (app ${SOURCES} ${RESOURCES}) | 287 | add_executable (app ${SOURCES} ${RESOURCES}) |
288 | set_property (TARGET app PROPERTY C_STANDARD 11) | ||
288 | if (TARGET ext-deps) | 289 | if (TARGET ext-deps) |
289 | add_dependencies (app ext-deps) | 290 | add_dependencies (app ext-deps) |
290 | endif () | 291 | endif () |
@@ -444,6 +445,7 @@ elseif (HAIKU) | |||
444 | LAGRANGE_EMB_BIN="${CMAKE_INSTALL_PREFIX}/resources.lgr") | 445 | LAGRANGE_EMB_BIN="${CMAKE_INSTALL_PREFIX}/resources.lgr") |
445 | install (FILES ${EMB_BIN} DESTINATION .) | 446 | install (FILES ${EMB_BIN} DESTINATION .) |
446 | elseif (UNIX AND NOT APPLE) | 447 | elseif (UNIX AND NOT APPLE) |
448 | include (GNUInstallDirs) | ||
447 | set_target_properties (app PROPERTIES | 449 | set_target_properties (app PROPERTIES |
448 | INSTALL_RPATH_USE_LINK_PATH YES | 450 | INSTALL_RPATH_USE_LINK_PATH YES |
449 | ) | 451 | ) |
@@ -459,18 +461,19 @@ StartupWMClass=lagrange | |||
459 | Icon=fi.skyjake.Lagrange | 461 | Icon=fi.skyjake.Lagrange |
460 | MimeType=x-scheme-handler/gemini;x-scheme-handler/gopher; | 462 | MimeType=x-scheme-handler/gemini;x-scheme-handler/gopher; |
461 | ") | 463 | ") |
462 | install (TARGETS app DESTINATION bin) | 464 | install (TARGETS app DESTINATION ${CMAKE_INSTALL_BINDIR}) |
463 | install (FILES ${desktop} DESTINATION share/applications) | 465 | install (FILES ${desktop} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) |
464 | install (FILES res/lagrange-256.png | 466 | install (FILES res/lagrange-256.png |
465 | DESTINATION share/icons/hicolor/256x256/apps | 467 | DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps |
466 | RENAME fi.skyjake.Lagrange.png | 468 | RENAME fi.skyjake.Lagrange.png |
467 | ) | 469 | ) |
468 | install (FILES res/fi.skyjake.Lagrange.appdata.xml | 470 | install (FILES res/fi.skyjake.Lagrange.appdata.xml |
469 | DESTINATION share/metainfo | 471 | DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo |
470 | ) | 472 | ) |
471 | if (NOT ENABLE_RELATIVE_EMBED) | 473 | if (NOT ENABLE_RELATIVE_EMBED) |
472 | target_compile_definitions (app PUBLIC | 474 | target_compile_definitions (app PUBLIC |
473 | LAGRANGE_EMB_BIN="${CMAKE_INSTALL_PREFIX}/share/lagrange/resources.lgr") | 475 | LAGRANGE_EMB_BIN="${CMAKE_INSTALL_FULL_DATADIR}/lagrange/resources.lgr") |
476 | endif () | ||
474 | endif () | 477 | endif () |
475 | install (FILES ${EMB_BIN} DESTINATION share/lagrange) | 478 | install (FILES ${EMB_BIN} DESTINATION ${CMAKE_INSTALL_DATADIR}/lagrange) |
476 | endif () | 479 | endif () |
diff --git a/Depends.cmake b/Depends.cmake index d7031035..0ea313f3 100644 --- a/Depends.cmake +++ b/Depends.cmake | |||
@@ -43,12 +43,13 @@ else () | |||
43 | endif () | 43 | endif () |
44 | endif () | 44 | endif () |
45 | 45 | ||
46 | if (ENABLE_HARFBUZZ AND EXISTS ${CMAKE_SOURCE_DIR}/lib/harfbuzz/CMakeLists.txt) | 46 | if (ENABLE_HARFBUZZ) |
47 | # Find HarfBuzz with pkg-config. | 47 | # Find HarfBuzz with pkg-config. |
48 | if (NOT ENABLE_HARFBUZZ_MINIMAL AND PKG_CONFIG_FOUND) | 48 | if (NOT ENABLE_HARFBUZZ_MINIMAL AND PKG_CONFIG_FOUND) |
49 | pkg_check_modules (HARFBUZZ IMPORTED_TARGET harfbuzz) | 49 | pkg_check_modules (HARFBUZZ IMPORTED_TARGET harfbuzz) |
50 | endif () | 50 | endif () |
51 | if (ENABLE_HARFBUZZ_MINIMAL OR NOT HARFBUZZ_FOUND) | 51 | if (EXISTS ${CMAKE_SOURCE_DIR}/lib/harfbuzz/CMakeLists.txt AND |
52 | (ENABLE_HARFBUZZ_MINIMAL OR NOT HARFBUZZ_FOUND)) | ||
52 | # Build HarfBuzz with minimal dependencies. | 53 | # Build HarfBuzz with minimal dependencies. |
53 | if (MESON_EXECUTABLE AND NINJA_EXECUTABLE) | 54 | if (MESON_EXECUTABLE AND NINJA_EXECUTABLE) |
54 | set (_dst ${CMAKE_BINARY_DIR}/lib/harfbuzz) | 55 | set (_dst ${CMAKE_BINARY_DIR}/lib/harfbuzz) |
@@ -107,12 +108,12 @@ if (ENABLE_HARFBUZZ AND EXISTS ${CMAKE_SOURCE_DIR}/lib/harfbuzz/CMakeLists.txt) | |||
107 | endif () | 108 | endif () |
108 | endif () | 109 | endif () |
109 | 110 | ||
110 | if (ENABLE_FRIBIDI AND EXISTS ${CMAKE_SOURCE_DIR}/lib/fribidi) | 111 | if (ENABLE_FRIBIDI) |
111 | # Find FriBidi with pkg-config. | 112 | # Find FriBidi with pkg-config. |
112 | if (NOT ENABLE_FRIBIDI_BUILD AND PKG_CONFIG_FOUND) | 113 | if (NOT ENABLE_FRIBIDI_BUILD AND PKG_CONFIG_FOUND) |
113 | pkg_check_modules (FRIBIDI IMPORTED_TARGET fribidi) | 114 | pkg_check_modules (FRIBIDI IMPORTED_TARGET fribidi) |
114 | endif () | 115 | endif () |
115 | if (ENABLE_FRIBIDI_BUILD OR NOT FRIBIDI_FOUND) | 116 | if (EXISTS ${CMAKE_SOURCE_DIR}/lib/fribidi AND (ENABLE_FRIBIDI_BUILD OR NOT FRIBIDI_FOUND)) |
116 | # Build FriBidi with Meson. | 117 | # Build FriBidi with Meson. |
117 | set (_dst ${CMAKE_BINARY_DIR}/lib/fribidi) | 118 | set (_dst ${CMAKE_BINARY_DIR}/lib/fribidi) |
118 | if (MESON_EXECUTABLE AND NINJA_EXECUTABLE) | 119 | if (MESON_EXECUTABLE AND NINJA_EXECUTABLE) |
@@ -19,12 +19,14 @@ Like Gemini, Lagrange has been designed with minimalism in mind. It depends on a | |||
19 | 19 | ||
20 | ## Downloads | 20 | ## Downloads |
21 | 21 | ||
22 | 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). | 22 | 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). |
23 | 23 | ||
24 | On macOS you can install and upgrade via Homebrew: | 24 | On macOS you can install and upgrade via Homebrew: |
25 | 25 | ||
26 | brew install --cask lagrange | 26 | brew install --cask lagrange |
27 | 27 | ||
28 | Please check [MacPorts](https://www.macports.org) if you are using macOS 10.12 or older. | ||
29 | |||
28 | On openSUSE Tumbleweed: | 30 | On openSUSE Tumbleweed: |
29 | 31 | ||
30 | sudo zypper install lagrange | 32 | sudo zypper install lagrange |
@@ -1,7 +1,7 @@ | |||
1 | msgid "" | 1 | msgid "" |
2 | msgstr "" | 2 | msgstr "" |
3 | "Report-Msgid-Bugs-To: jaakko.keranen@iki.fi\n" | 3 | "Report-Msgid-Bugs-To: jaakko.keranen@iki.fi\n" |
4 | "PO-Revision-Date: 2021-09-20 20:49+0000\n" | 4 | "PO-Revision-Date: 2021-11-14 20:50+0000\n" |
5 | "Last-Translator: Alex Schroeder <alex@alexschroeder.ch>\n" | 5 | "Last-Translator: Alex Schroeder <alex@alexschroeder.ch>\n" |
6 | "Language-Team: German <http://weblate.skyjake.fi/projects/lagrange/ui/de/>\n" | 6 | "Language-Team: German <http://weblate.skyjake.fi/projects/lagrange/ui/de/>\n" |
7 | "Language: de\n" | 7 | "Language: de\n" |
@@ -12,13 +12,13 @@ msgstr "" | |||
12 | "X-Generator: Weblate 4.5.1\n" | 12 | "X-Generator: Weblate 4.5.1\n" |
13 | 13 | ||
14 | msgid "menu.opentab" | 14 | msgid "menu.opentab" |
15 | msgstr "In neuem Tab öffnen" | 15 | msgstr "In neuem Reiter öffnen" |
16 | 16 | ||
17 | msgid "menu.feeds.entrylist" | 17 | msgid "menu.feeds.entrylist" |
18 | msgstr "Feed-Einträge anzeigen" | 18 | msgstr "Feed-Einträge anzeigen" |
19 | 19 | ||
20 | msgid "feeds.entry.newtab" | 20 | msgid "feeds.entry.newtab" |
21 | msgstr "Eintrag in neuem Tab öffnen" | 21 | msgstr "Eintrag in neuem Reiter öffnen" |
22 | 22 | ||
23 | msgid "cancel" | 23 | msgid "cancel" |
24 | msgstr "Abbrechen" | 24 | msgstr "Abbrechen" |
@@ -33,10 +33,10 @@ msgid "dlg.default" | |||
33 | msgstr " Ok " | 33 | msgstr " Ok " |
34 | 34 | ||
35 | msgid "toggle.yes" | 35 | msgid "toggle.yes" |
36 | msgstr "JA" | 36 | msgstr "Ja" |
37 | 37 | ||
38 | msgid "toggle.no" | 38 | msgid "toggle.no" |
39 | msgstr "NEIN" | 39 | msgstr "Nein" |
40 | 40 | ||
41 | msgid "menu.title.file" | 41 | msgid "menu.title.file" |
42 | msgstr "Datei" | 42 | msgstr "Datei" |
@@ -57,22 +57,22 @@ msgid "menu.title.help" | |||
57 | msgstr "Hilfe" | 57 | msgstr "Hilfe" |
58 | 58 | ||
59 | msgid "menu.newtab" | 59 | msgid "menu.newtab" |
60 | msgstr "Neuer Tab" | 60 | msgstr "Neuer Reiter" |
61 | 61 | ||
62 | msgid "menu.closetab" | 62 | msgid "menu.closetab" |
63 | msgstr "Tab schließen" | 63 | msgstr "Reiter schließen" |
64 | 64 | ||
65 | msgid "menu.closetab.other" | 65 | msgid "menu.closetab.other" |
66 | msgstr "Andere Tabs schließen" | 66 | msgstr "Andere Reiter schließen" |
67 | 67 | ||
68 | msgid "menu.closetab.left" | 68 | msgid "menu.closetab.left" |
69 | msgstr "Tabs links schließen" | 69 | msgstr "Reiter links schließen" |
70 | 70 | ||
71 | msgid "menu.closetab.right" | 71 | msgid "menu.closetab.right" |
72 | msgstr "Tabs rechts schließen" | 72 | msgstr "Reiter rechts schließen" |
73 | 73 | ||
74 | msgid "menu.duptab" | 74 | msgid "menu.duptab" |
75 | msgstr "Tab duplizieren" | 75 | msgstr "Reiter duplizieren" |
76 | 76 | ||
77 | msgid "feeds.entry.markread" | 77 | msgid "feeds.entry.markread" |
78 | msgstr "Als gelesen markieren" | 78 | msgstr "Als gelesen markieren" |
@@ -81,7 +81,7 @@ msgid "feeds.entry.markunread" | |||
81 | msgstr "Als ungelesen markieren" | 81 | msgstr "Als ungelesen markieren" |
82 | 82 | ||
83 | msgid "menu.opentab.background" | 83 | msgid "menu.opentab.background" |
84 | msgstr "Tab im Hintergrund öffnen" | 84 | msgstr "Reiter im Hintergrund öffnen" |
85 | 85 | ||
86 | msgid "about.logo" | 86 | msgid "about.logo" |
87 | msgstr "ASCII-Kunst: Das Wort \"Lagrange\" in großer Schrift" | 87 | msgstr "ASCII-Kunst: Das Wort \"Lagrange\" in großer Schrift" |
@@ -135,7 +135,7 @@ msgid "menu.bookmarks.list" | |||
135 | msgstr "Alle Lesezeichen auflisten" | 135 | msgstr "Alle Lesezeichen auflisten" |
136 | 136 | ||
137 | msgid "menu.bookmarks.bytag" | 137 | msgid "menu.bookmarks.bytag" |
138 | msgstr "Lesezeichen nach Tags auflisten" | 138 | msgstr "Lesezeichen nach Schlagworten auflisten" |
139 | 139 | ||
140 | msgid "menu.sidebar.right" | 140 | msgid "menu.sidebar.right" |
141 | msgstr "Rechte Seitenleiste ein-/ausblenden" | 141 | msgstr "Rechte Seitenleiste ein-/ausblenden" |
@@ -144,13 +144,13 @@ msgid "menu.zoom.in" | |||
144 | msgstr "Vergrößern" | 144 | msgstr "Vergrößern" |
145 | 145 | ||
146 | msgid "macos.menu.bookmarks.bytag" | 146 | msgid "macos.menu.bookmarks.bytag" |
147 | msgstr "Nach Tags auflisten" | 147 | msgstr "Nach Schlagworten auflisten" |
148 | 148 | ||
149 | msgid "menu.bookmarks.bytime" | 149 | msgid "menu.bookmarks.bytime" |
150 | msgstr "Lesezeichen nach Erstellungszeitpunkt auflisten" | 150 | msgstr "Lesezeichen nach Erstellungszeitpunkt auflisten" |
151 | 151 | ||
152 | msgid "menu.preferences" | 152 | msgid "menu.preferences" |
153 | msgstr "Einstellungen…" | 153 | msgstr "Präferenzen…" |
154 | 154 | ||
155 | msgid "menu.help" | 155 | msgid "menu.help" |
156 | msgstr "Hilfe" | 156 | msgstr "Hilfe" |
@@ -195,7 +195,7 @@ msgid "menu.parent" | |||
195 | msgstr "Nach oben" | 195 | msgstr "Nach oben" |
196 | 196 | ||
197 | msgid "keys.tab.next" | 197 | msgid "keys.tab.next" |
198 | msgstr "Nächster Tab" | 198 | msgstr "Nächster Reiter" |
199 | 199 | ||
200 | msgid "menu.sidebar.left" | 200 | msgid "menu.sidebar.left" |
201 | msgstr "Linke Seitenleiste ein-/ausblenden" | 201 | msgstr "Linke Seitenleiste ein-/ausblenden" |
@@ -204,7 +204,7 @@ msgid "menu.root" | |||
204 | msgstr "Zum Hauptknoten" | 204 | msgstr "Zum Hauptknoten" |
205 | 205 | ||
206 | msgid "menu.reload" | 206 | msgid "menu.reload" |
207 | msgstr "Seite neu laden" | 207 | msgstr "Seite aktualisieren" |
208 | 208 | ||
209 | msgid "menu.autoreload" | 209 | msgid "menu.autoreload" |
210 | msgstr "Automatische Aktualisierung…" | 210 | msgstr "Automatische Aktualisierung…" |
@@ -298,10 +298,10 @@ msgid "feeds.entry.bookmark" | |||
298 | msgstr "Lesezeichen hinzufügen…" | 298 | msgstr "Lesezeichen hinzufügen…" |
299 | 299 | ||
300 | msgid "dlg.confirm.history.clear" | 300 | msgid "dlg.confirm.history.clear" |
301 | msgstr "Wollen Sie wirklich die Chronik aller besuchten Seiten löschen?" | 301 | msgstr "Wollen Sie wirklich den Verlauf aller besuchten Seiten löschen?" |
302 | 302 | ||
303 | msgid "heading.bookmark.edit" | 303 | msgid "heading.bookmark.edit" |
304 | msgstr "LESEZEICHEN BEARBEITEN" | 304 | msgstr "Lesezeichen bearbeiten" |
305 | 305 | ||
306 | msgid "dlg.openlink" | 306 | msgid "dlg.openlink" |
307 | msgstr "Link öffnen" | 307 | msgstr "Link öffnen" |
@@ -319,10 +319,10 @@ msgid "dlg.save.incomplete" | |||
319 | msgstr "Die Seiteninhalte werden noch heruntergeladen." | 319 | msgstr "Die Seiteninhalte werden noch heruntergeladen." |
320 | 320 | ||
321 | msgid "heading.save.incomplete" | 321 | msgid "heading.save.incomplete" |
322 | msgstr "SEITE UNVOLLSTNDIG" | 322 | msgstr "Seite unvollstndig" |
323 | 323 | ||
324 | msgid "heading.save" | 324 | msgid "heading.save" |
325 | msgstr "DATEI GESPEICHERT" | 325 | msgstr "Datei gespeichert" |
326 | 326 | ||
327 | msgid "dlg.input.send" | 327 | msgid "dlg.input.send" |
328 | msgstr "Senden" | 328 | msgstr "Senden" |
@@ -375,7 +375,7 @@ msgid "heading.prefs.colors" | |||
375 | msgstr "Farben" | 375 | msgstr "Farben" |
376 | 376 | ||
377 | msgid "dlg.bookmark.tags" | 377 | msgid "dlg.bookmark.tags" |
378 | msgstr "Stichwörter:" | 378 | msgstr "Schlagworte:" |
379 | 379 | ||
380 | msgid "dlg.bookmark.url" | 380 | msgid "dlg.bookmark.url" |
381 | msgstr "URL:" | 381 | msgstr "URL:" |
@@ -384,7 +384,7 @@ msgid "dlg.feed.title" | |||
384 | msgstr "Titel:" | 384 | msgstr "Titel:" |
385 | 385 | ||
386 | msgid "heading.feedcfg" | 386 | msgid "heading.feedcfg" |
387 | msgstr "FEED EINSTELLUNGEN" | 387 | msgstr "Feed Einstellungen" |
388 | 388 | ||
389 | msgid "dlg.newident.country" | 389 | msgid "dlg.newident.country" |
390 | msgstr "Land:" | 390 | msgstr "Land:" |
@@ -396,7 +396,7 @@ msgid "dlg.newident.email" | |||
396 | msgstr "Email:" | 396 | msgstr "Email:" |
397 | 397 | ||
398 | msgid "heading.bookmark.add" | 398 | msgid "heading.bookmark.add" |
399 | msgstr "LESEZEICHEN HINZUFGEN" | 399 | msgstr "Lesezeichen hinzufgen" |
400 | 400 | ||
401 | msgid "dlg.feed.sub" | 401 | msgid "dlg.feed.sub" |
402 | msgstr "Abonnieren" | 402 | msgstr "Abonnieren" |
@@ -414,7 +414,7 @@ msgid "link.noproxy" | |||
414 | msgstr "Ohne Proxy öffnen" | 414 | msgstr "Ohne Proxy öffnen" |
415 | 415 | ||
416 | msgid "link.newtab" | 416 | msgid "link.newtab" |
417 | msgstr "Link in neuem Tab öffnen" | 417 | msgstr "Link in neuem Reiter öffnen" |
418 | 418 | ||
419 | #, c-format | 419 | #, c-format |
420 | msgid "dlg.import.add" | 420 | msgid "dlg.import.add" |
@@ -423,7 +423,7 @@ msgstr[0] "%sLesezeichen hinzufügen" | |||
423 | msgstr[1] "" | 423 | msgstr[1] "" |
424 | 424 | ||
425 | msgid "heading.import.bookmarks" | 425 | msgid "heading.import.bookmarks" |
426 | msgstr "LESEZEICHEN IMPORTIEREN" | 426 | msgstr "Lesezeichen importieren" |
427 | 427 | ||
428 | msgid "sidebar.entry.bookmark" | 428 | msgid "sidebar.entry.bookmark" |
429 | msgstr "Lesezeichen hinzufügen…" | 429 | msgstr "Lesezeichen hinzufügen…" |
@@ -447,10 +447,10 @@ msgid "menu.forgeturl" | |||
447 | msgstr "URL vergessen" | 447 | msgstr "URL vergessen" |
448 | 448 | ||
449 | msgid "dlg.history.clear" | 449 | msgid "dlg.history.clear" |
450 | msgstr "Chronik löschen" | 450 | msgstr "Verlauf löschen" |
451 | 451 | ||
452 | msgid "history.clear" | 452 | msgid "history.clear" |
453 | msgstr "Chronik löschen…" | 453 | msgstr "Verlauf löschen…" |
454 | 454 | ||
455 | msgid "bookmark.tag.home" | 455 | msgid "bookmark.tag.home" |
456 | msgstr "Als Startseite verwenden" | 456 | msgstr "Als Startseite verwenden" |
@@ -494,7 +494,7 @@ msgid "dlg.translate.fail" | |||
494 | msgstr "Anfrage fehlgeschlagen" | 494 | msgstr "Anfrage fehlgeschlagen" |
495 | 495 | ||
496 | msgid "heading.translate" | 496 | msgid "heading.translate" |
497 | msgstr "SEITE BERSETZEN" | 497 | msgstr "Seite bersetzen" |
498 | 498 | ||
499 | msgid "bookmark.title.blank" | 499 | msgid "bookmark.title.blank" |
500 | msgstr "Leere Seite" | 500 | msgstr "Leere Seite" |
@@ -549,7 +549,7 @@ msgid "heading.prefs.network" | |||
549 | msgstr "Netzwerk" | 549 | msgstr "Netzwerk" |
550 | 550 | ||
551 | msgid "heading.prefs.paragraph" | 551 | msgid "heading.prefs.paragraph" |
552 | msgstr "ABSATZ" | 552 | msgstr "Absatz" |
553 | 553 | ||
554 | msgid "prefs.theme.dark" | 554 | msgid "prefs.theme.dark" |
555 | msgstr "Dunkel" | 555 | msgstr "Dunkel" |
@@ -583,16 +583,16 @@ msgid "prefs.proxy.gemini" | |||
583 | msgstr "Gemini Proxy:" | 583 | msgstr "Gemini Proxy:" |
584 | 584 | ||
585 | msgid "keys.reload" | 585 | msgid "keys.reload" |
586 | msgstr "Seite neu laden" | 586 | msgstr "Seite aktualisieren" |
587 | 587 | ||
588 | msgid "keys.bookmark.add" | 588 | msgid "keys.bookmark.add" |
589 | msgstr "Lesezeichen hinzufügen" | 589 | msgstr "Lesezeichen hinzufügen" |
590 | 590 | ||
591 | msgid "keys.tab.new" | 591 | msgid "keys.tab.new" |
592 | msgstr "Neuer Tab" | 592 | msgstr "Neuer Reiter" |
593 | 593 | ||
594 | msgid "keys.tab.close" | 594 | msgid "keys.tab.close" |
595 | msgstr "Tab schließen" | 595 | msgstr "Reiter schließen" |
596 | 596 | ||
597 | msgid "error.cert.invalid" | 597 | msgid "error.cert.invalid" |
598 | msgstr "Ungültiges Zertifikat" | 598 | msgstr "Ungültiges Zertifikat" |
@@ -632,8 +632,8 @@ msgstr "Eine Seite zurück" | |||
632 | 632 | ||
633 | msgid "num.bytes" | 633 | msgid "num.bytes" |
634 | msgid_plural "num.bytes.n" | 634 | msgid_plural "num.bytes.n" |
635 | msgstr[0] "%zu Byte" | 635 | msgstr[0] "%u Byte" |
636 | msgstr[1] "%zu Bytes" | 636 | msgstr[1] "%u Bytes" |
637 | 637 | ||
638 | # strftime() formatted, split on two lines | 638 | # strftime() formatted, split on two lines |
639 | #, c-format | 639 | #, c-format |
@@ -652,19 +652,19 @@ msgid "menu.bookmarks.refresh" | |||
652 | msgstr "Remote-Lesezeichen aktualisieren" | 652 | msgstr "Remote-Lesezeichen aktualisieren" |
653 | 653 | ||
654 | msgid "feeds.unsubscribe" | 654 | msgid "feeds.unsubscribe" |
655 | msgstr "Deabonnieren…" | 655 | msgstr "Abonnement abbestellen…" |
656 | 656 | ||
657 | msgid "menu.dup" | 657 | msgid "menu.dup" |
658 | msgstr "Duplizieren …" | 658 | msgstr "Duplizieren …" |
659 | 659 | ||
660 | msgid "heading.history.clear" | 660 | msgid "heading.history.clear" |
661 | msgstr "VERLAUF LSCHEN" | 661 | msgstr "Verlauf lschen" |
662 | 662 | ||
663 | msgid "bookmark.tag.remote" | 663 | msgid "bookmark.tag.remote" |
664 | msgstr "Als Lesezeichen-Quelle verwenden" | 664 | msgstr "Als Lesezeichen-Quelle verwenden" |
665 | 665 | ||
666 | msgid "bookmark.untag.sub" | 666 | msgid "bookmark.untag.sub" |
667 | msgstr "Feed-Abonnement kündigen" | 667 | msgstr "Feed-Abonnement abbestellen" |
668 | 668 | ||
669 | msgid "bookmark.untag.remote" | 669 | msgid "bookmark.untag.remote" |
670 | msgstr "Lesezeichen-Quelle entfernen" | 670 | msgstr "Lesezeichen-Quelle entfernen" |
@@ -688,7 +688,7 @@ msgstr "Laden" | |||
688 | 688 | ||
689 | # Inline download status message. | 689 | # Inline download status message. |
690 | msgid "media.download.warnclose" | 690 | msgid "media.download.warnclose" |
691 | msgstr "Der Download wird abgebrochen, wenn Sie diesen Tab schließen." | 691 | msgstr "Der Download wird abgebrochen, wenn Sie diesen Reiter schließen." |
692 | 692 | ||
693 | # Inline download status message. | 693 | # Inline download status message. |
694 | msgid "media.download.complete" | 694 | msgid "media.download.complete" |
@@ -728,8 +728,8 @@ msgstr "Feed-Einträge" | |||
728 | #, c-format | 728 | #, c-format |
729 | msgid "feeds.list.entrycount" | 729 | msgid "feeds.list.entrycount" |
730 | msgid_plural "feeds.list.entrycount.n" | 730 | msgid_plural "feeds.list.entrycount.n" |
731 | msgstr[0] "insgesamt %zu Eintrag" | 731 | msgstr[0] "insgesamt einen Eintrag" |
732 | msgstr[1] "insgesamt %zu Einträge" | 732 | msgstr[1] "insgesamt %u Einträge" |
733 | 733 | ||
734 | #, c-format | 734 | #, c-format |
735 | msgid "feeds.list.refreshtime" | 735 | msgid "feeds.list.refreshtime" |
@@ -780,22 +780,22 @@ msgid "ident.delete" | |||
780 | msgstr "Identität löschen …" | 780 | msgstr "Identität löschen …" |
781 | 781 | ||
782 | msgid "heading.ident.delete" | 782 | msgid "heading.ident.delete" |
783 | msgstr "IDENTITT LSCHEN" | 783 | msgstr "Identitt lschen" |
784 | 784 | ||
785 | #, c-format | 785 | #, c-format |
786 | msgid "ident.usedonurls" | 786 | msgid "ident.usedonurls" |
787 | msgid_plural "ident.usedonurls.n" | 787 | msgid_plural "ident.usedonurls.n" |
788 | msgstr[0] "Verwendet bei %zu URL" | 788 | msgstr[0] "Verwendet für eine URL" |
789 | msgstr[1] "Verwendet bei %zu URLs" | 789 | msgstr[1] "Verwendet für %u URLs" |
790 | 790 | ||
791 | msgid "ident.using" | 791 | msgid "ident.using" |
792 | msgstr "Verwenden für diese Seite" | 792 | msgstr "Verwenden für diese Seite" |
793 | 793 | ||
794 | msgid "heading.ident.use" | 794 | msgid "heading.ident.use" |
795 | msgstr "IDENTITTSVERWENDUNG" | 795 | msgstr "Identittsverwendung" |
796 | 796 | ||
797 | msgid "heading.ident.notes" | 797 | msgid "heading.ident.notes" |
798 | msgstr "IDENTITTSANMERKUNGEN" | 798 | msgstr "Identittsanmerkungen" |
799 | 799 | ||
800 | msgid "ident.showuse" | 800 | msgid "ident.showuse" |
801 | msgstr "Verwendung anzeigen" | 801 | msgstr "Verwendung anzeigen" |
@@ -807,20 +807,17 @@ msgid "sidebar.empty.idents" | |||
807 | msgstr "keine Identitäten" | 807 | msgstr "keine Identitäten" |
808 | 808 | ||
809 | msgid "heading.unsub" | 809 | msgid "heading.unsub" |
810 | msgstr "ABONNEMENT KÜNDIGEN" | 810 | msgstr "Abonnement abbestellen" |
811 | 811 | ||
812 | #, c-format | 812 | #, c-format |
813 | msgid "dlg.confirm.unsub" | 813 | msgid "dlg.confirm.unsub" |
814 | msgstr "" | 814 | msgstr "Feed wirklich abbestellen: \"%s\"?" |
815 | "Feed wirklich abbestellen:\n" | ||
816 | "\"%s\"?" | ||
817 | 815 | ||
818 | #, c-format | 816 | #, c-format |
819 | msgid "dlg.confirm.ident.delete" | 817 | msgid "dlg.confirm.ident.delete" |
820 | msgstr "" | 818 | msgstr "" |
821 | "Wollen Sie wirklich die Identität\n" | 819 | "Wollen Sie wirklich die Identität %s\"%s\"%s einschließlich ihrer " |
822 | " %s%s%s\n" | 820 | "Zertifikats- und privaten Schlüsseldateien löschen?" |
823 | "einschließlich ihrer Zertifikats- und privaten Schlüsseldateien löschen?" | ||
824 | 821 | ||
825 | # The %s format characters are used to highlight the word "Help" and must be used in the translation in same way as here. | 822 | # The %s format characters are used to highlight the word "Help" and must be used in the translation in same way as here. |
826 | #, c-format | 823 | #, c-format |
@@ -829,7 +826,7 @@ msgstr "" | |||
829 | "Weitere Informationen zu TLS-Client-Zertifikaten finden Sie unter %sHelp%s." | 826 | "Weitere Informationen zu TLS-Client-Zertifikaten finden Sie unter %sHelp%s." |
830 | 827 | ||
831 | msgid "heading.openlink" | 828 | msgid "heading.openlink" |
832 | msgstr "LINK FFNEN" | 829 | msgstr "Link ffnen" |
833 | 830 | ||
834 | msgid "prefs.boldlink" | 831 | msgid "prefs.boldlink" |
835 | msgstr "Fettgedruckte Links:" | 832 | msgstr "Fettgedruckte Links:" |
@@ -846,7 +843,7 @@ msgid "lang.zh.hant" | |||
846 | msgstr "Chinesisch (traditionell)" | 843 | msgstr "Chinesisch (traditionell)" |
847 | 844 | ||
848 | msgid "heading.newident" | 845 | msgid "heading.newident" |
849 | msgstr "NEUE IDENTITT" | 846 | msgstr "Neue Identitt" |
850 | 847 | ||
851 | msgid "dlg.newident.rsa.selfsign" | 848 | msgid "dlg.newident.rsa.selfsign" |
852 | msgstr "Erstellen eines selbstsignierten 2048-Bit-RSA-Zertifikats." | 849 | msgstr "Erstellen eines selbstsignierten 2048-Bit-RSA-Zertifikats." |
@@ -890,11 +887,11 @@ msgstr[1] "" | |||
890 | 887 | ||
891 | # Interpret as "Results from bookmarks..." | 888 | # Interpret as "Results from bookmarks..." |
892 | msgid "heading.lookup.bookmarks" | 889 | msgid "heading.lookup.bookmarks" |
893 | msgstr "LESEZEICHEN" | 890 | msgstr "Lesezeichen" |
894 | 891 | ||
895 | # Interpret as "Results from feeds..." | 892 | # Interpret as "Results from feeds..." |
896 | msgid "heading.lookup.feeds" | 893 | msgid "heading.lookup.feeds" |
897 | msgstr "FEEDS" | 894 | msgstr "Feeds" |
898 | 895 | ||
899 | msgid "dlg.newident.until" | 896 | msgid "dlg.newident.until" |
900 | msgstr "Gültig bis:" | 897 | msgstr "Gültig bis:" |
@@ -931,7 +928,7 @@ msgid "dlg.unsub" | |||
931 | msgstr "Abbestellen" | 928 | msgstr "Abbestellen" |
932 | 929 | ||
933 | msgid "heading.pageinfo" | 930 | msgid "heading.pageinfo" |
934 | msgstr "SEITENINFORMATION" | 931 | msgstr "Seiteninformation" |
935 | 932 | ||
936 | msgid "pageinfo.header.cached" | 933 | msgid "pageinfo.header.cached" |
937 | msgstr "(zwischengespeicherter Inhalt)" | 934 | msgstr "(zwischengespeicherter Inhalt)" |
@@ -952,13 +949,14 @@ msgid "pageinfo.domain.match" | |||
952 | msgstr "Domänenname stimmt überein" | 949 | msgstr "Domänenname stimmt überein" |
953 | 950 | ||
954 | msgid "heading.save.error" | 951 | msgid "heading.save.error" |
955 | msgstr "FEHLER BEIM SPEICHERN DER DATEI" | 952 | msgstr "Fehler beim Speichern der Datei" |
956 | 953 | ||
957 | msgid "dlg.autoreload" | 954 | msgid "dlg.autoreload" |
958 | msgstr "Wählen Sie das Intervall für das automatische Neuladen für diese Tab." | 955 | msgstr "" |
956 | "Wählen Sie das Intervall für die automatische Aktualisierung des Reiters." | ||
959 | 957 | ||
960 | msgid "link.newtab.background" | 958 | msgid "link.newtab.background" |
961 | msgstr "Link im Hintergrund-Tab öffnen" | 959 | msgstr "Link in einem neuen Reiter im Hintergrund öffnen" |
962 | 960 | ||
963 | msgid "link.browser" | 961 | msgid "link.browser" |
964 | msgstr "Link im Standardbrowser öffnen" | 962 | msgstr "Link im Standardbrowser öffnen" |
@@ -973,23 +971,23 @@ msgstr "" | |||
973 | "Problem der Serverkonfiguration sein." | 971 | "Problem der Serverkonfiguration sein." |
974 | 972 | ||
975 | msgid "heading.certimport" | 973 | msgid "heading.certimport" |
976 | msgstr "IDENTITT IMPORTIEREN" | 974 | msgstr "Identitt importieren" |
977 | 975 | ||
978 | # Interpret as "Results from history..." | 976 | # Interpret as "Results from history..." |
979 | msgid "heading.lookup.history" | 977 | msgid "heading.lookup.history" |
980 | msgstr "Chronik" | 978 | msgstr "Verlauf" |
981 | 979 | ||
982 | # Interpret as "Results from page content..." | 980 | # Interpret as "Results from page content..." |
983 | msgid "heading.lookup.pagecontent" | 981 | msgid "heading.lookup.pagecontent" |
984 | msgstr "SEITENINHALT" | 982 | msgstr "Seiteninhalt" |
985 | 983 | ||
986 | # Interpret as "Results from identitites..." | 984 | # Interpret as "Results from identitites..." |
987 | msgid "heading.lookup.identities" | 985 | msgid "heading.lookup.identities" |
988 | msgstr "IDENTITTEN" | 986 | msgstr "Identitten" |
989 | 987 | ||
990 | # Interpret as "Other results..." | 988 | # Interpret as "Other results..." |
991 | msgid "heading.lookup.other" | 989 | msgid "heading.lookup.other" |
992 | msgstr "ANDERE" | 990 | msgstr "Andere" |
993 | 991 | ||
994 | msgid "dlg.translate.unavail" | 992 | msgid "dlg.translate.unavail" |
995 | msgstr "Dienst nicht verfügbar" | 993 | msgstr "Dienst nicht verfügbar" |
@@ -1010,7 +1008,7 @@ msgid "dlg.newident.userid" | |||
1010 | msgstr "Benutzer-ID:" | 1008 | msgstr "Benutzer-ID:" |
1011 | 1009 | ||
1012 | msgid "heading.subscribe" | 1010 | msgid "heading.subscribe" |
1013 | msgstr "SEITE ABONNIEREN" | 1011 | msgstr "Seite abonnieren" |
1014 | 1012 | ||
1015 | msgid "dlg.feed.entrytype" | 1013 | msgid "dlg.feed.entrytype" |
1016 | msgstr "Eintragstyp:" | 1014 | msgstr "Eintragstyp:" |
@@ -1022,13 +1020,13 @@ msgid "dlg.bookmark.icon" | |||
1022 | msgstr "Symbol:" | 1020 | msgstr "Symbol:" |
1023 | 1021 | ||
1024 | msgid "heading.prefs.scrolling" | 1022 | msgid "heading.prefs.scrolling" |
1025 | msgstr "BLTTERN" | 1023 | msgstr "Blttern" |
1026 | 1024 | ||
1027 | msgid "heading.prefs.sizing" | 1025 | msgid "heading.prefs.sizing" |
1028 | msgstr "GRßENEINTEILUNG" | 1026 | msgstr "Grßeneinteilung" |
1029 | 1027 | ||
1030 | msgid "heading.prefs.widelayout" | 1028 | msgid "heading.prefs.widelayout" |
1031 | msgstr "BREITES LAYOUT" | 1029 | msgstr "Breites Layout" |
1032 | 1030 | ||
1033 | msgid "prefs.hoverlink" | 1031 | msgid "prefs.hoverlink" |
1034 | msgstr "URL bei Mauszeiger anzeigen:" | 1032 | msgstr "URL bei Mauszeiger anzeigen:" |
@@ -1064,7 +1062,7 @@ msgid "prefs.accent.teal" | |||
1064 | msgstr "Türkisblau" | 1062 | msgstr "Türkisblau" |
1065 | 1063 | ||
1066 | msgid "prefs.uiscale" | 1064 | msgid "prefs.uiscale" |
1067 | msgstr "UI-Skalierungsfaktor:" | 1065 | msgstr "Skalierungsfaktor der Oberfläche :" |
1068 | 1066 | ||
1069 | msgid "prefs.customframe" | 1067 | msgid "prefs.customframe" |
1070 | msgstr "Individueller Fensterrahmen:" | 1068 | msgstr "Individueller Fensterrahmen:" |
@@ -1154,10 +1152,10 @@ msgid "heading.certwarn" | |||
1154 | msgstr "NICHT VERTRAUENSWÜRDIGES ZERTIFIKAT" | 1152 | msgstr "NICHT VERTRAUENSWÜRDIGES ZERTIFIKAT" |
1155 | 1153 | ||
1156 | msgid "heading.certimport.pasted" | 1154 | msgid "heading.certimport.pasted" |
1157 | msgstr "AUS DER ZWISCHENABLAGE EINGEFGT" | 1155 | msgstr "Aus der Zwischenablage eingefgt" |
1158 | 1156 | ||
1159 | msgid "heading.certimport.dropped" | 1157 | msgid "heading.certimport.dropped" |
1160 | msgstr "VERLORENE DATEI" | 1158 | msgstr "Abgelegte Datei" |
1161 | 1159 | ||
1162 | msgid "hint.certimport.description" | 1160 | msgid "hint.certimport.description" |
1163 | msgstr "Beschreibung" | 1161 | msgstr "Beschreibung" |
@@ -1191,23 +1189,23 @@ msgid "dlg.newident.create" | |||
1191 | msgstr "Identität erstellen" | 1189 | msgstr "Identität erstellen" |
1192 | 1190 | ||
1193 | msgid "heading.prefs" | 1191 | msgid "heading.prefs" |
1194 | msgstr "PREFERENZEN" | 1192 | msgstr "Präferenzen" |
1195 | 1193 | ||
1196 | msgid "heading.prefs.certs" | 1194 | msgid "heading.prefs.certs" |
1197 | msgstr "ZERTIFIKATE" | 1195 | msgstr "Zertifikate" |
1198 | 1196 | ||
1199 | msgid "heading.prefs.fonts" | 1197 | msgid "heading.prefs.fonts" |
1200 | msgstr "Schriftarten" | 1198 | msgstr "Schriftarten" |
1201 | 1199 | ||
1202 | # tab button | 1200 | # tab button |
1203 | msgid "heading.prefs.keys" | 1201 | msgid "heading.prefs.keys" |
1204 | msgstr "TASTEN" | 1202 | msgstr "Tasten" |
1205 | 1203 | ||
1206 | msgid "heading.prefs.pagecontent" | 1204 | msgid "heading.prefs.pagecontent" |
1207 | msgstr "PAGE COLORS" | 1205 | msgstr "Seitenfarben" |
1208 | 1206 | ||
1209 | msgid "heading.prefs.proxies" | 1207 | msgid "heading.prefs.proxies" |
1210 | msgstr "PROXIES" | 1208 | msgstr "Proxies" |
1211 | 1209 | ||
1212 | msgid "gempub.meta.lang" | 1210 | msgid "gempub.meta.lang" |
1213 | msgstr "Sprache" | 1211 | msgstr "Sprache" |
@@ -1367,8 +1365,8 @@ msgstr "Server nicht erreichbar" | |||
1367 | #, c-format | 1365 | #, c-format |
1368 | msgid "feeds.list.counts" | 1366 | msgid "feeds.list.counts" |
1369 | msgid_plural "feeds.list.counts.n" | 1367 | msgid_plural "feeds.list.counts.n" |
1370 | msgstr[0] "Sie haben %zu Feed mit %%s abonniert.\n" | 1368 | msgstr[0] "Sie haben einen Feed mit %%s abonniert.\n" |
1371 | msgstr[1] "Sie haben %zu Feeds mit %%s abonniert.\n" | 1369 | msgstr[1] "Sie haben %u Feeds mit %%s abonniert.\n" |
1372 | 1370 | ||
1373 | msgid "upload.port" | 1371 | msgid "upload.port" |
1374 | msgstr "Port…" | 1372 | msgstr "Port…" |
@@ -1393,7 +1391,7 @@ msgid "prefs.linespacing" | |||
1393 | msgstr "Zeilenabstand:" | 1391 | msgstr "Zeilenabstand:" |
1394 | 1392 | ||
1395 | msgid "error.tls.msg" | 1393 | msgid "error.tls.msg" |
1396 | msgstr "Die Kommunikation mit dem Server ist fehlgeschlagen. Die Fehlermeldung:" | 1394 | msgstr "Die Kommunikation mit dem Server ist fehlgeschlagen." |
1397 | 1395 | ||
1398 | msgid "error.certexpired" | 1396 | msgid "error.certexpired" |
1399 | msgstr "Zertifikat abgelaufen" | 1397 | msgstr "Zertifikat abgelaufen" |
@@ -1452,7 +1450,7 @@ msgid "sidebar.action.ident.import" | |||
1452 | msgstr "Importieren…" | 1450 | msgstr "Importieren…" |
1453 | 1451 | ||
1454 | msgid "keys.parent" | 1452 | msgid "keys.parent" |
1455 | msgstr "Zum darüber liegenden Verzeichnis" | 1453 | msgstr "Zum darüber liegenden Ordner" |
1456 | 1454 | ||
1457 | msgid "feeds.atom.translated" | 1455 | msgid "feeds.atom.translated" |
1458 | msgstr "" | 1456 | msgstr "" |
@@ -1478,13 +1476,13 @@ msgid "bookmark.export.format.tags" | |||
1478 | msgstr "Schlagworte werden mit Überschriften der Stufe 2 definiert." | 1476 | msgstr "Schlagworte werden mit Überschriften der Stufe 2 definiert." |
1479 | 1477 | ||
1480 | msgid "menu.page.upload" | 1478 | msgid "menu.page.upload" |
1481 | msgstr "Seite mit Titan hochladen" | 1479 | msgstr "Seite mit Titan hochladen…" |
1482 | 1480 | ||
1483 | msgid "heading.upload" | 1481 | msgid "heading.upload" |
1484 | msgstr "UPLOAD WITH TITAN" | 1482 | msgstr "Hochladen mit Titan" |
1485 | 1483 | ||
1486 | msgid "hint.upload.text" | 1484 | msgid "hint.upload.text" |
1487 | msgstr "Texteingabe für den Upload" | 1485 | msgstr "Texteingabe für das Hochladen" |
1488 | 1486 | ||
1489 | msgid "heading.upload.file" | 1487 | msgid "heading.upload.file" |
1490 | msgstr "Datei" | 1488 | msgstr "Datei" |
@@ -1502,10 +1500,10 @@ msgid "upload.token" | |||
1502 | msgstr "Kennwort:" | 1500 | msgstr "Kennwort:" |
1503 | 1501 | ||
1504 | msgid "dlg.upload.send" | 1502 | msgid "dlg.upload.send" |
1505 | msgstr "Upload" | 1503 | msgstr "Hochladen" |
1506 | 1504 | ||
1507 | msgid "heading.uploadport" | 1505 | msgid "heading.uploadport" |
1508 | msgstr "TITAN UPLOAD PORT" | 1506 | msgstr "Titan Port" |
1509 | 1507 | ||
1510 | msgid "lang.ia" | 1508 | msgid "lang.ia" |
1511 | msgstr "Interlingua" | 1509 | msgstr "Interlingua" |
@@ -1526,13 +1524,13 @@ msgid "prefs.pinsplit.right" | |||
1526 | msgstr "Rechter Reiter" | 1524 | msgstr "Rechter Reiter" |
1527 | 1525 | ||
1528 | msgid "heading.newident.missing" | 1526 | msgid "heading.newident.missing" |
1529 | msgstr "MISSING INFO" | 1527 | msgstr "Fehlende Information" |
1530 | 1528 | ||
1531 | msgid "heading.newident.date.bad" | 1529 | msgid "heading.newident.date.bad" |
1532 | msgstr "INVALID DATE" | 1530 | msgstr "Ungültiges Datum" |
1533 | 1531 | ||
1534 | msgid "heading.prefs.uitheme" | 1532 | msgid "heading.prefs.uitheme" |
1535 | msgstr "UI COLORS" | 1533 | msgstr "Oberflächenfarben" |
1536 | 1534 | ||
1537 | msgid "prefs.scrollspeed.keyboard" | 1535 | msgid "prefs.scrollspeed.keyboard" |
1538 | msgstr "Tastaturgeschwindigkeit:" | 1536 | msgstr "Tastaturgeschwindigkeit:" |
@@ -1626,13 +1624,13 @@ msgid "menu.split.horizontal" | |||
1626 | msgstr "Horizontal" | 1624 | msgstr "Horizontal" |
1627 | 1625 | ||
1628 | msgid "menu.downloads" | 1626 | msgid "menu.downloads" |
1629 | msgstr "Download Verzeichnis anzeigen" | 1627 | msgstr "Downloads anzeigen" |
1630 | 1628 | ||
1631 | msgid "menu.unexpire" | 1629 | msgid "menu.unexpire" |
1632 | msgstr "Ablaufdatum ignorieren und weiter laden" | 1630 | msgstr "Ablaufdatum ignorieren und weiter laden" |
1633 | 1631 | ||
1634 | msgid "menu.save.downloads.open" | 1632 | msgid "menu.save.downloads.open" |
1635 | msgstr "Im Downloadverzeichnis speichern und Datei öffnen" | 1633 | msgstr "In den Downloads speichern und Datei öffnen" |
1636 | 1634 | ||
1637 | msgid "menu.select.clear" | 1635 | msgid "menu.select.clear" |
1638 | msgstr "Auswahl aufheben" | 1636 | msgstr "Auswahl aufheben" |
@@ -1656,7 +1654,7 @@ msgid "dlg.save.opendownload" | |||
1656 | msgstr "Runtergeladene Datei öffnen" | 1654 | msgstr "Runtergeladene Datei öffnen" |
1657 | 1655 | ||
1658 | msgid "heading.autoreload" | 1656 | msgid "heading.autoreload" |
1659 | msgstr "AUTO-RELOAD" | 1657 | msgstr "Automatische Aktualisierung" |
1660 | 1658 | ||
1661 | msgid "link.side" | 1659 | msgid "link.side" |
1662 | msgstr "Link seitlich öffnen" | 1660 | msgstr "Link seitlich öffnen" |
@@ -1668,7 +1666,7 @@ msgid "link.file.delete" | |||
1668 | msgstr "Datei löschen" | 1666 | msgstr "Datei löschen" |
1669 | 1667 | ||
1670 | msgid "heading.file.delete" | 1668 | msgid "heading.file.delete" |
1671 | msgstr "DELETE FILE" | 1669 | msgstr "Datei löschen" |
1672 | 1670 | ||
1673 | msgid "dlg.file.delete.confirm" | 1671 | msgid "dlg.file.delete.confirm" |
1674 | msgstr "Wollen Sie die Datei wirklich löschen?" | 1672 | msgstr "Wollen Sie die Datei wirklich löschen?" |
@@ -1680,7 +1678,7 @@ msgid "menu.pageinfo" | |||
1680 | msgstr "Seiteninformation anzeigen" | 1678 | msgstr "Seiteninformation anzeigen" |
1681 | 1679 | ||
1682 | msgid "bookmark.export.title.tag" | 1680 | msgid "bookmark.export.title.tag" |
1683 | msgstr "Schlagworte für Lesenzeichen" | 1681 | msgstr "Schlagworte für Lesezeichen" |
1684 | 1682 | ||
1685 | msgid "bookmark.export.count" | 1683 | msgid "bookmark.export.count" |
1686 | msgid_plural "bookmark.export.count.n" | 1684 | msgid_plural "bookmark.export.count.n" |
@@ -1698,8 +1696,8 @@ msgstr "Links seitlich öffnen" | |||
1698 | msgid "bookmark.export.taginfo" | 1696 | msgid "bookmark.export.taginfo" |
1699 | msgstr "" | 1697 | msgstr "" |
1700 | "In diese Liste steht jede Überschrift für ein Lesezeichenschlagwort. Nur " | 1698 | "In diese Liste steht jede Überschrift für ein Lesezeichenschlagwort. Nur " |
1701 | "verschlagwortete Lesezeichen werden aufgeführt. Lesezeichen mir mehreren " | 1699 | "verschlagwortete Lesezeichen werden aufgeführt. Lesezeichen mit mehreren " |
1702 | "Schlagworten werden jedem dieser Schlagworte aufgeführt." | 1700 | "Schlagworten werden unter jedem dieser Schlagworte aufgeführt." |
1703 | 1701 | ||
1704 | msgid "prefs.memorysize" | 1702 | msgid "prefs.memorysize" |
1705 | msgstr "Speichergrösse:" | 1703 | msgstr "Speichergrösse:" |
@@ -1710,17 +1708,17 @@ msgstr "Archiv verlassen" | |||
1710 | #, c-format | 1708 | #, c-format |
1711 | msgid "archive.summary" | 1709 | msgid "archive.summary" |
1712 | msgid_plural "archive.summary.n" | 1710 | msgid_plural "archive.summary.n" |
1713 | msgstr[0] "Dieses Archiv enthält %zu Eintrag und wurde auf %.1f MB komprimiert." | 1711 | msgstr[0] "Dieses Archiv enthält einen Eintrag und wurde auf %.1f MB komprimiert." |
1714 | msgstr[1] "Dieses Archiv enthält %zu Einträge und wurde auf %.1f MB komprimiert." | 1712 | msgstr[1] "Dieses Archiv enthält %u Einträge und wurde auf %.1f MB komprimiert." |
1715 | 1713 | ||
1716 | msgid "dir.empty" | 1714 | msgid "dir.empty" |
1717 | msgstr "Dieses Verzeichnis ist leer." | 1715 | msgstr "Dieser Ordner ist leer." |
1718 | 1716 | ||
1719 | #, c-format | 1717 | #, c-format |
1720 | msgid "dir.summary" | 1718 | msgid "dir.summary" |
1721 | msgid_plural "dir.summary.n" | 1719 | msgid_plural "dir.summary.n" |
1722 | msgstr[0] "Dieses Verzeichnis enthält %zu Eintrag." | 1720 | msgstr[0] "Dieser Ordner enthält einen Eintrag." |
1723 | msgstr[1] "Dieses Verzeichnis enthält %zu Einträge." | 1721 | msgstr[1] "Dieser Ordner enthält %u Einträge." |
1724 | 1722 | ||
1725 | msgid "keys.zoom.out" | 1723 | msgid "keys.zoom.out" |
1726 | msgstr "Verkleinern" | 1724 | msgstr "Verkleinern" |
@@ -1745,8 +1743,8 @@ msgstr "siehe Instruktionen des Servers" | |||
1745 | 1743 | ||
1746 | msgid "dlg.uploadport.msg" | 1744 | msgid "dlg.uploadport.msg" |
1747 | msgstr "" | 1745 | msgstr "" |
1748 | "Setzt den Port des Titanservers für diese URL.\n" | 1746 | "Setzt den Port des Titanservers für diese URL. Der Port wird in der " |
1749 | "Der Port wird für diesen Site gespeichert." | 1747 | "Konfiguration für diesen Seiten gespeichert." |
1750 | 1748 | ||
1751 | msgid "lang.tok" | 1749 | msgid "lang.tok" |
1752 | msgstr "Toki Pona" | 1750 | msgstr "Toki Pona" |
@@ -1814,3 +1812,303 @@ msgstr "" | |||
1814 | 1812 | ||
1815 | msgid "error.unsupported.protocol.msg" | 1813 | msgid "error.unsupported.protocol.msg" |
1816 | msgstr "Das gewünschte Protokoll wird von dieser Applikation nicht unterstützt." | 1814 | msgstr "Das gewünschte Protokoll wird von dieser Applikation nicht unterstützt." |
1815 | |||
1816 | msgid "dlg.addfolder.defaulttitle" | ||
1817 | msgstr "Neuer Ordner" | ||
1818 | |||
1819 | # used on mobile | ||
1820 | msgid "heading.settings" | ||
1821 | msgstr "Einstellungen" | ||
1822 | |||
1823 | msgid "prefs.imagestyle" | ||
1824 | msgstr "Bilder einfärben:" | ||
1825 | |||
1826 | msgid "prefs.imagestyle.original" | ||
1827 | msgstr "Keine" | ||
1828 | |||
1829 | msgid "prefs.imagestyle.grayscale" | ||
1830 | msgstr "Graustufen" | ||
1831 | |||
1832 | msgid "prefs.imagestyle.text" | ||
1833 | msgstr "Textfarbe" | ||
1834 | |||
1835 | msgid "prefs.imagestyle.preformat" | ||
1836 | msgstr "Textfarbe für vorformatierten Text" | ||
1837 | |||
1838 | msgid "prefs.font.heading" | ||
1839 | msgstr "Titel:" | ||
1840 | |||
1841 | msgid "prefs.font.body" | ||
1842 | msgstr "Textkörper:" | ||
1843 | |||
1844 | msgid "prefs.font.ui" | ||
1845 | msgstr "Oberfläche :" | ||
1846 | |||
1847 | # Font to use for headings and body when Monospace body is enabled. | ||
1848 | msgid "prefs.font.monodoc" | ||
1849 | msgstr "Nichtproportionale Schrift:" | ||
1850 | |||
1851 | msgid "prefs.boldlink.visited" | ||
1852 | msgstr "Besucht" | ||
1853 | |||
1854 | msgid "prefs.gemtext.ansi" | ||
1855 | msgstr "ANSI Code-Umschaltungen:" | ||
1856 | |||
1857 | msgid "prefs.gemtext.ansi.fg" | ||
1858 | msgstr "Vordergrundfarbe" | ||
1859 | |||
1860 | msgid "prefs.gemtext.ansi.fontstyle" | ||
1861 | msgstr "Schriftstil" | ||
1862 | |||
1863 | msgid "prefs.font.warnmissing" | ||
1864 | msgstr "Glyphenwarnungen:" | ||
1865 | |||
1866 | msgid "prefs.font.smooth" | ||
1867 | msgstr "Glättung:" | ||
1868 | |||
1869 | msgid "keys.bookmark.addfolder" | ||
1870 | msgstr "Lesezeichenordner hinzufügen" | ||
1871 | |||
1872 | msgid "keys.split.item" | ||
1873 | msgstr "Aufteilungsmenü:" | ||
1874 | |||
1875 | msgid "keys.hoverurl" | ||
1876 | msgstr "URL beim Darüberfahren anzeigen" | ||
1877 | |||
1878 | msgid "error.ansi" | ||
1879 | msgstr "Terminalemulation" | ||
1880 | |||
1881 | msgid "error.glyphs" | ||
1882 | msgstr "Fehlende Glyphen" | ||
1883 | |||
1884 | msgid "error.glyphs.msg" | ||
1885 | msgstr "" | ||
1886 | "Diese Seite kann nicht vollständig angezeigt werden, weil gewisse Charaktere " | ||
1887 | "fehlen. Mit der Installation zusätzlicher Schriftarten kann dies behoben " | ||
1888 | "werden." | ||
1889 | |||
1890 | #, c-format | ||
1891 | msgid "dlg.fontpack.delete.confirm" | ||
1892 | msgstr "Wollen Sie das Schriftartenpaket \"%s\" wirklich für immer löschen?" | ||
1893 | |||
1894 | msgid "dlg.fontpack.delete" | ||
1895 | msgstr "Schriftartenpaket löschen" | ||
1896 | |||
1897 | msgid "fontpack.install.ttf" | ||
1898 | msgstr "TrueType Schriftart installieren" | ||
1899 | |||
1900 | msgid "fontpack.open.aboutfonts" | ||
1901 | msgstr "Installierte Schriftarten anzeigen" | ||
1902 | |||
1903 | msgid "fontpack.open.fontsdir" | ||
1904 | msgstr "Benutzerschriftartenordner öffnen" | ||
1905 | |||
1906 | #, c-format | ||
1907 | msgid "dlg.dismiss.ansi" | ||
1908 | msgstr "Die Warnung zur Terminalemulation für %s zukünftig ignorieren?" | ||
1909 | |||
1910 | msgid "dlg.dismiss.warning" | ||
1911 | msgstr "Warnung ignorieren" | ||
1912 | |||
1913 | msgid "dlg.fontpack.classic.msg" | ||
1914 | msgstr "" | ||
1915 | "Die Schriftarten, welche bisher mit der Applikation verteilt wurden, gibt es " | ||
1916 | "nun als separates Download. Wollen Sie das \"Klassik\" Set runterladen?" | ||
1917 | |||
1918 | msgid "dlg.fontpack.classic" | ||
1919 | msgstr "Schriftartenpaket runterladen (25 MB)" | ||
1920 | |||
1921 | msgid "heading.dismiss.warning" | ||
1922 | msgstr "Warnung ignorieren?" | ||
1923 | |||
1924 | msgid "heading.fontpack.classic" | ||
1925 | msgstr "Schriftartenpaket runterladen" | ||
1926 | |||
1927 | msgid "truetype.help" | ||
1928 | msgstr "" | ||
1929 | "Lagrange probiert alle TrueType Schriftartendateien zu laden, welche im " | ||
1930 | "Benutzerschriftartenordner liegen." | ||
1931 | |||
1932 | msgid "truetype.help.installed" | ||
1933 | msgstr "Diese Schriftart ist im Benutzerschriftartenordner installiert." | ||
1934 | |||
1935 | msgid "lang.gl" | ||
1936 | msgstr "Galizisch" | ||
1937 | |||
1938 | msgid "dlg.feed.ignoreweb" | ||
1939 | msgstr "HTTP(S) Links ignorieren:" | ||
1940 | |||
1941 | msgid "heading.bookmark.tags" | ||
1942 | msgstr "Spezielle Schlagworte" | ||
1943 | |||
1944 | msgid "heading.addfolder" | ||
1945 | msgstr "Ordner hinzufügen" | ||
1946 | |||
1947 | msgid "keys.link.homerow.next" | ||
1948 | msgstr "Nächster Satz von Mittelzeiletastenlinks" | ||
1949 | |||
1950 | msgid "menu.newfolder" | ||
1951 | msgstr "Neuer Ordner…" | ||
1952 | |||
1953 | msgid "menu.sort.alpha" | ||
1954 | msgstr "Alphabetisch sortieren" | ||
1955 | |||
1956 | # used for Preferences on mobile | ||
1957 | msgid "menu.settings" | ||
1958 | msgstr "Einstellungen" | ||
1959 | |||
1960 | # keep this short (3x1 horiz layout) | ||
1961 | msgid "menu.selectall" | ||
1962 | msgstr "Alles auswählen" | ||
1963 | |||
1964 | # keep this short (3x1 horiz layout) | ||
1965 | msgid "menu.delete" | ||
1966 | msgstr "Löschen" | ||
1967 | |||
1968 | # keep this short (3x1 horiz layout) | ||
1969 | msgid "menu.undo" | ||
1970 | msgstr "Rückgängig" | ||
1971 | |||
1972 | msgid "heading.fontpack.meta.disabled" | ||
1973 | msgstr "Deaktivierte Schriftartenpakete" | ||
1974 | |||
1975 | # Action label | ||
1976 | msgid "fontpack.meta.viewfile" | ||
1977 | msgstr "Datei anzeigen" | ||
1978 | |||
1979 | #, c-format | ||
1980 | msgid "fontpack.meta.version" | ||
1981 | msgstr "Version %d" | ||
1982 | |||
1983 | msgid "fontpack.meta.installed" | ||
1984 | msgstr "Installiert" | ||
1985 | |||
1986 | msgid "fontpack.meta.notinstalled" | ||
1987 | msgstr "Nicht installiert" | ||
1988 | |||
1989 | msgid "fontpack.meta.disabled" | ||
1990 | msgstr ", deaktiviert" | ||
1991 | |||
1992 | msgid "dlg.addfolder.prompt" | ||
1993 | msgstr "Name des neuen Ordners:" | ||
1994 | |||
1995 | msgid "dlg.addfolder" | ||
1996 | msgstr "Ordner hinzufügen" | ||
1997 | |||
1998 | msgid "menu.website" | ||
1999 | msgstr "Projektwebseite…" | ||
2000 | |||
2001 | msgid "menu.fonts" | ||
2002 | msgstr "Schriftarten verwalten…" | ||
2003 | |||
2004 | msgid "heading.confirm.bookmarks.delete" | ||
2005 | msgstr "Lesezeichen löschen" | ||
2006 | |||
2007 | # button in the mobile New Identity dialog | ||
2008 | msgid "dlg.certimport.pickfile" | ||
2009 | msgstr "Zertifikats- und privaten Schlüsseldateien importieren" | ||
2010 | |||
2011 | #, c-format | ||
2012 | msgid "dlg.confirm.bookmarks.delete" | ||
2013 | msgid_plural "dlg.confirm.bookmarks.delete.n" | ||
2014 | msgstr[0] "Wollen Sie das Lesezeichen in diesem Ordner wirklich löschen?" | ||
2015 | msgstr[1] "Wollen Sie die %u Lesezeichen in diesem Ordner wirklich löschen?" | ||
2016 | |||
2017 | msgid "num.files" | ||
2018 | msgid_plural "num.files.n" | ||
2019 | msgstr[0] "eine Datei" | ||
2020 | msgstr[1] "%u Dateien" | ||
2021 | |||
2022 | msgid "num.fonts" | ||
2023 | msgid_plural "num.fonts.n" | ||
2024 | msgstr[0] "eine Schriftart" | ||
2025 | msgstr[1] "%u Schriftarten" | ||
2026 | |||
2027 | msgid "upload.id" | ||
2028 | msgstr "Identität:" | ||
2029 | |||
2030 | msgid "dlg.upload.id.none" | ||
2031 | msgstr "Keine" | ||
2032 | |||
2033 | msgid "dlg.upload.id.default" | ||
2034 | msgstr "Default" | ||
2035 | |||
2036 | # used on mobile | ||
2037 | msgid "dlg.upload.text" | ||
2038 | msgstr "Text hochladen" | ||
2039 | |||
2040 | # used on mobile | ||
2041 | msgid "dlg.upload.file" | ||
2042 | msgstr "Datei hochladen" | ||
2043 | |||
2044 | # used on mobile | ||
2045 | msgid "dlg.upload.pickfile" | ||
2046 | msgstr "Datei auswählen" | ||
2047 | |||
2048 | msgid "prefs.font.mono" | ||
2049 | msgstr "Vorformatiert:" | ||
2050 | |||
2051 | #, c-format | ||
2052 | msgid "fontpack.install" | ||
2053 | msgstr "Installation von \"%s\"" | ||
2054 | |||
2055 | msgid "heading.fontpack.delete" | ||
2056 | msgstr "Schriftartenpaket löschen" | ||
2057 | |||
2058 | #, c-format | ||
2059 | msgid "dlg.bookmarks.delete" | ||
2060 | msgid_plural "dlg.bookmarks.delete.n" | ||
2061 | msgstr[0] "Lesezeichen löschen" | ||
2062 | msgstr[1] "%u Lesezeichen löschen" | ||
2063 | |||
2064 | msgid "dlg.certwarn.title" | ||
2065 | msgstr "Sicherheitsproblem" | ||
2066 | |||
2067 | msgid "prefs.bookmarks.addbottom" | ||
2068 | msgstr "Lesezeichen am Ende hinzufügen:" | ||
2069 | |||
2070 | msgid "error.ansi.msg" | ||
2071 | msgstr "" | ||
2072 | "Diese Seite wird möglicherweise nicht richtig dargestellt. Es werden ANSI-" | ||
2073 | "Code-Umschaltungen verwendet um die Darstellung zu kontrollieren, und das " | ||
2074 | "wird nur teilweise unterstützt. Verwenden Sie einen Terminalemulator, um " | ||
2075 | "diese Seite darzustellen." | ||
2076 | |||
2077 | # Abbrevation: background-to-foreground | ||
2078 | msgid "prefs.imagestyle.bgfg" | ||
2079 | msgstr "Hintergrund zu Vordergrund" | ||
2080 | |||
2081 | msgid "keys.split.next" | ||
2082 | msgstr "Fokus zur nächsten Aufteilung" | ||
2083 | |||
2084 | msgid "fontpack.help" | ||
2085 | msgstr "" | ||
2086 | "Lagrange Schriftartenpakete sind ZIP Dateien, welche Schriftarten und " | ||
2087 | "dazugehörige Konfigurationen enthalten. Einmal installiert, können diese " | ||
2088 | "Schriftarten für die Dokumenteninhalte und die Oberfläche verwendet werden. " | ||
2089 | "Die aktive Schriftart wählen sie unter Präferenzen > Schriftarten." | ||
2090 | |||
2091 | msgid "heading.fontpack.meta" | ||
2092 | msgstr "Schriftarten" | ||
2093 | |||
2094 | msgid "heading.fontpack.meta.enabled" | ||
2095 | msgstr "Aktivierte Schriftartenpakete" | ||
2096 | |||
2097 | #, c-format | ||
2098 | msgid "fontpack.enable" | ||
2099 | msgstr "Aktivierung von \"%s\"" | ||
2100 | |||
2101 | #, c-format | ||
2102 | msgid "fontpack.disable" | ||
2103 | msgstr "Deaktivierung von \"%s\"" | ||
2104 | |||
2105 | msgid "fontpack.export" | ||
2106 | msgstr "Anzeige der fontpack.ini Vorlage" | ||
2107 | |||
2108 | #, c-format | ||
2109 | msgid "fontpack.upgrade" | ||
2110 | msgstr "Aktualisieren von \"%s\" auf Version %d" | ||
2111 | |||
2112 | #, c-format | ||
2113 | msgid "fontpack.delete" | ||
2114 | msgstr "\"%s\" für immer löschen" | ||
@@ -1050,87 +1050,50 @@ msgstr "From:" | |||
1050 | msgid "dlg.translate.to" | 1050 | msgid "dlg.translate.to" |
1051 | msgstr "To:" | 1051 | msgstr "To:" |
1052 | 1052 | ||
1053 | # A language choice in the Translation dialog. | ||
1053 | msgid "lang.ar" | 1054 | msgid "lang.ar" |
1054 | msgstr "Arabic" | 1055 | msgstr "Arabic" |
1055 | 1056 | ||
1057 | # A language choice in the Translation dialog. | ||
1056 | msgid "lang.zh" | 1058 | msgid "lang.zh" |
1057 | msgstr "Chinese" | 1059 | msgstr "Chinese" |
1058 | 1060 | ||
1059 | msgid "lang.zh.hans" | 1061 | # A language choice in the Translation dialog. |
1060 | msgstr "Chinese (Simplified)" | ||
1061 | |||
1062 | msgid "lang.zh.hant" | ||
1063 | msgstr "Chinese (Traditional)" | ||
1064 | |||
1065 | msgid "lang.de" | 1062 | msgid "lang.de" |
1066 | msgstr "German" | 1063 | msgstr "German" |
1067 | 1064 | ||
1065 | # A language choice in the Translation dialog. | ||
1068 | msgid "lang.en" | 1066 | msgid "lang.en" |
1069 | msgstr "English" | 1067 | msgstr "English" |
1070 | 1068 | ||
1071 | msgid "lang.ia" | 1069 | # A language choice in the Translation dialog. |
1072 | msgstr "Interlingua" | ||
1073 | |||
1074 | msgid "lang.ie" | ||
1075 | msgstr "Interlingue" | ||
1076 | |||
1077 | msgid "lang.fi" | ||
1078 | msgstr "Finnish" | ||
1079 | |||
1080 | msgid "lang.fr" | 1070 | msgid "lang.fr" |
1081 | msgstr "French" | 1071 | msgstr "French" |
1082 | 1072 | ||
1083 | msgid "lang.gl" | 1073 | # A language choice in the Translation dialog. |
1084 | msgstr "Galician" | ||
1085 | |||
1086 | msgid "lang.hi" | 1074 | msgid "lang.hi" |
1087 | msgstr "Hindi" | 1075 | msgstr "Hindi" |
1088 | 1076 | ||
1077 | # A language choice in the Translation dialog. | ||
1089 | msgid "lang.it" | 1078 | msgid "lang.it" |
1090 | msgstr "Italian" | 1079 | msgstr "Italian" |
1091 | 1080 | ||
1081 | # A language choice in the Translation dialog. | ||
1092 | msgid "lang.ja" | 1082 | msgid "lang.ja" |
1093 | msgstr "Japanese" | 1083 | msgstr "Japanese" |
1094 | 1084 | ||
1095 | msgid "lang.pl" | 1085 | # A language choice in the Translation dialog. |
1096 | msgstr "Polish" | ||
1097 | |||
1098 | msgid "lang.pt" | 1086 | msgid "lang.pt" |
1099 | msgstr "Portuguese" | 1087 | msgstr "Portuguese" |
1100 | 1088 | ||
1089 | # A language choice in the Translation dialog. | ||
1101 | msgid "lang.ru" | 1090 | msgid "lang.ru" |
1102 | msgstr "Russian" | 1091 | msgstr "Russian" |
1103 | 1092 | ||
1104 | msgid "lang.hu" | 1093 | # A language choice in the Translation dialog. |
1105 | msgstr "Hungarian" | ||
1106 | |||
1107 | msgid "lang.uk" | ||
1108 | msgstr "Ukrainian" | ||
1109 | |||
1110 | msgid "lang.eo" | ||
1111 | msgstr "Esperanto" | ||
1112 | |||
1113 | msgid "lang.es" | 1094 | msgid "lang.es" |
1114 | msgstr "Spanish" | 1095 | msgstr "Spanish" |
1115 | 1096 | ||
1116 | msgid "lang.es.mx" | ||
1117 | msgstr "Spanish (Mexico)" | ||
1118 | |||
1119 | msgid "lang.cs" | ||
1120 | msgstr "Czech" | ||
1121 | |||
1122 | msgid "lang.sk" | ||
1123 | msgstr "Slovak" | ||
1124 | |||
1125 | msgid "lang.sr" | ||
1126 | msgstr "Serbian" | ||
1127 | |||
1128 | msgid "lang.isv" | ||
1129 | msgstr "Interslavic" | ||
1130 | |||
1131 | msgid "lang.tok" | ||
1132 | msgstr "Toki Pona" | ||
1133 | |||
1134 | msgid "heading.newident" | 1097 | msgid "heading.newident" |
1135 | msgstr "NEW IDENTITY" | 1098 | msgstr "NEW IDENTITY" |
1136 | 1099 | ||
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" | |||
825 | bold = "FiraSans-Bold.ttf" | 825 | bold = "FiraSans-Bold.ttf" |
826 | ``` | 826 | ``` |
827 | 827 | ||
828 | Fontpacks may use the Deflate compression method, but that can slow down launching the app because each font must then be decompressed before loading. | 828 | 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. |
829 | 829 | ||
830 | 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. | 830 | 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. |
831 | 831 | ||
diff --git a/res/about/version.gmi b/res/about/version.gmi index 66b83cf5..a5e0d01f 100644 --- a/res/about/version.gmi +++ b/res/about/version.gmi | |||
@@ -17,6 +17,11 @@ Changes and enhancements: | |||
17 | 17 | ||
18 | Fixes: | 18 | Fixes: |
19 | 19 | ||
20 | ## 1.8.3 | ||
21 | * Fixed clicking on UI elements that are over the page top banner. The banner would always get clicked instead. | ||
22 | * Titan upload identity is remembered as a site-specific setting. It is no longer affected by selections in the Identities sidebar. | ||
23 | * macOS: Fixed updating items in native menus, e.g., upload identity selection. | ||
24 | |||
20 | ## 1.8.2 | 25 | ## 1.8.2 |
21 | * Fixed encoding of `+` characters in URLs as per RFC 3986. | 26 | * Fixed encoding of `+` characters in URLs as per RFC 3986. |
22 | * Fixed crash when fontpack.ini specifies a file that cannot be found. | 27 | * Fixed crash when fontpack.ini specifies a file that cannot be found. |
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 @@ | |||
45 | <update_contact>jaakko.keranen@iki.fi</update_contact> | 45 | <update_contact>jaakko.keranen@iki.fi</update_contact> |
46 | 46 | ||
47 | <releases> | 47 | <releases> |
48 | <release version="1.8.3" date="2021-11-21"> | ||
49 | <description> | ||
50 | <p>Version 1.8 adds a customizable font library and improves warning | ||
51 | and errors messages. The bundled hardcoded fonts have been | ||
52 | removed, and font configuration is now more flexible. Tabs have | ||
53 | close buttons that appear on mouse hover.</p> | ||
54 | <p>Changes in v1.8.3:</p> | ||
55 | <ul> | ||
56 | <li>Fixed clicking on UI elements that are over the page top | ||
57 | banner. The banner would always get clicked instead.</li> | ||
58 | <li>Titan upload identity is remembered as a site-specific | ||
59 | setting. It is no longer affected by selections in the | ||
60 | Identities sidebar.</li> | ||
61 | </ul> | ||
62 | <p>The full release notes can be viewed inside the app by opening | ||
63 | the "about:version" page.</p> | ||
64 | </description> | ||
65 | <url>https://github.com/skyjake/lagrange/releases/tag/v1.8.3</url> | ||
66 | </release> | ||
48 | <release version="1.8.2" date="2021-11-13"> | 67 | <release version="1.8.2" date="2021-11-13"> |
49 | <description> | 68 | <description> |
50 | <p>Version 1.8 adds a customizable font library and improves warning | 69 | <p>Version 1.8 adds a customizable font library and improves warning |
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) { | |||
295 | } | 295 | } |
296 | 296 | ||
297 | iGmIdentity *findIdentity_GmCerts(iGmCerts *d, const iBlock *fingerprint) { | 297 | iGmIdentity *findIdentity_GmCerts(iGmCerts *d, const iBlock *fingerprint) { |
298 | if (isEmpty_Block(fingerprint)) { | ||
299 | return NULL; | ||
300 | } | ||
298 | iForEach(PtrArray, i, &d->idents) { | 301 | iForEach(PtrArray, i, &d->idents) { |
299 | iGmIdentity *ident = i.ptr; | 302 | iGmIdentity *ident = i.ptr; |
300 | if (cmp_Block(fingerprint, &ident->fingerprint) == 0) { /* TODO: could use a hash */ | 303 | 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) { | |||
549 | } | 552 | } |
550 | 553 | ||
551 | const iGmIdentity *identityForUrl_GmCerts(const iGmCerts *d, const iString *url) { | 554 | const iGmIdentity *identityForUrl_GmCerts(const iGmCerts *d, const iString *url) { |
555 | if (isEmpty_String(url)) { | ||
556 | return NULL; | ||
557 | } | ||
552 | lock_Mutex(d->mtx); | 558 | lock_Mutex(d->mtx); |
553 | const iGmIdentity *found = NULL; | 559 | const iGmIdentity *found = NULL; |
554 | iConstForEach(PtrArray, i, &d->idents) { | 560 | 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) | |||
33 | struct Impl_SiteParams { | 33 | struct Impl_SiteParams { |
34 | iObject object; | 34 | iObject object; |
35 | uint16_t titanPort; | 35 | uint16_t titanPort; |
36 | iString titanIdentity; /* fingerprint */ | ||
36 | int dismissWarnings; | 37 | int dismissWarnings; |
37 | /* TODO: theme seed, style settings */ | 38 | /* TODO: theme seed, style settings */ |
38 | }; | 39 | }; |
39 | 40 | ||
40 | void init_SiteParams(iSiteParams *d) { | 41 | void init_SiteParams(iSiteParams *d) { |
41 | d->titanPort = 0; /* undefined */ | 42 | d->titanPort = 0; /* undefined */ |
43 | init_String(&d->titanIdentity); | ||
42 | d->dismissWarnings = 0; | 44 | d->dismissWarnings = 0; |
43 | } | 45 | } |
44 | 46 | ||
45 | void deinit_SiteParams(iSiteParams *d) { | 47 | void deinit_SiteParams(iSiteParams *d) { |
46 | iUnused(d); | 48 | deinit_String(&d->titanIdentity); |
47 | } | 49 | } |
48 | 50 | ||
49 | iDefineClass(SiteParams) | 51 | iDefineClass(SiteParams) |
@@ -122,6 +124,9 @@ static void handleIniKeyValue_SiteSpec_(void *context, const iString *table, con | |||
122 | if (!cmp_String(key, "titanPort")) { | 124 | if (!cmp_String(key, "titanPort")) { |
123 | d->loadParams->titanPort = number_TomlValue(value); | 125 | d->loadParams->titanPort = number_TomlValue(value); |
124 | } | 126 | } |
127 | else if (!cmp_String(key, "titanIdentity") && value->type == string_TomlType) { | ||
128 | set_String(&d->loadParams->titanIdentity, value->value.string); | ||
129 | } | ||
125 | else if (!cmp_String(key, "dismissWarnings") && value->type == int64_TomlType) { | 130 | else if (!cmp_String(key, "dismissWarnings") && value->type == int64_TomlType) { |
126 | d->loadParams->dismissWarnings = value->value.int64; | 131 | d->loadParams->dismissWarnings = value->value.int64; |
127 | } | 132 | } |
@@ -152,6 +157,10 @@ static void save_SiteSpec_(iSiteSpec *d) { | |||
152 | if (params->titanPort) { | 157 | if (params->titanPort) { |
153 | appendFormat_String(buf, "titanPort = %u\n", params->titanPort); | 158 | appendFormat_String(buf, "titanPort = %u\n", params->titanPort); |
154 | } | 159 | } |
160 | if (!isEmpty_String(¶ms->titanIdentity)) { | ||
161 | appendFormat_String( | ||
162 | buf, "titanIdentity = \"%s\"\n", cstr_String(¶ms->titanIdentity)); | ||
163 | } | ||
155 | if (params->dismissWarnings) { | 164 | if (params->dismissWarnings) { |
156 | appendFormat_String(buf, "dismissWarnings = 0x%x\n", params->dismissWarnings); | 165 | appendFormat_String(buf, "dismissWarnings = 0x%x\n", params->dismissWarnings); |
157 | } | 166 | } |
@@ -205,6 +214,30 @@ void setValue_SiteSpec(const iString *site, enum iSiteSpecKey key, int value) { | |||
205 | } | 214 | } |
206 | } | 215 | } |
207 | 216 | ||
217 | void setValueString_SiteSpec(const iString *site, enum iSiteSpecKey key, const iString *value) { | ||
218 | iSiteSpec *d = &siteSpec_; | ||
219 | const iString *hashKey = collect_String(lower_String(site)); | ||
220 | iSiteParams *params = value_StringHash(&d->sites, hashKey); | ||
221 | if (!params) { | ||
222 | params = new_SiteParams(); | ||
223 | insert_StringHash(&d->sites, hashKey, params); | ||
224 | } | ||
225 | iBool needSave = iFalse; | ||
226 | switch (key) { | ||
227 | case titanIdentity_SiteSpecKey: | ||
228 | if (!equal_String(¶ms->titanIdentity, value)) { | ||
229 | needSave = iTrue; | ||
230 | set_String(¶ms->titanIdentity, value); | ||
231 | } | ||
232 | break; | ||
233 | default: | ||
234 | break; | ||
235 | } | ||
236 | if (needSave) { | ||
237 | save_SiteSpec_(d); | ||
238 | } | ||
239 | } | ||
240 | |||
208 | int value_SiteSpec(const iString *site, enum iSiteSpecKey key) { | 241 | int value_SiteSpec(const iString *site, enum iSiteSpecKey key) { |
209 | iSiteSpec *d = &siteSpec_; | 242 | iSiteSpec *d = &siteSpec_; |
210 | const iSiteParams *params = constValue_StringHash(&d->sites, collect_String(lower_String(site))); | 243 | 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) { | |||
220 | return 0; | 253 | return 0; |
221 | } | 254 | } |
222 | } | 255 | } |
256 | |||
257 | const iString *valueString_SiteSpec(const iString *site, enum iSiteSpecKey key) { | ||
258 | iSiteSpec *d = &siteSpec_; | ||
259 | const iSiteParams *params = constValue_StringHash(&d->sites, collect_String(lower_String(site))); | ||
260 | if (!params) { | ||
261 | return 0; | ||
262 | } | ||
263 | switch (key) { | ||
264 | case titanIdentity_SiteSpecKey: | ||
265 | return ¶ms->titanIdentity; | ||
266 | default: | ||
267 | return collectNew_String(); | ||
268 | } | ||
269 | } | ||
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) | |||
28 | 28 | ||
29 | enum iSiteSpecKey { | 29 | enum iSiteSpecKey { |
30 | titanPort_SiteSpecKey, | 30 | titanPort_SiteSpecKey, |
31 | titanIdentity_SiteSpecKey, | ||
31 | dismissWarnings_SiteSpecKey, | 32 | dismissWarnings_SiteSpecKey, |
32 | }; | 33 | }; |
33 | 34 | ||
34 | void init_SiteSpec (const char *saveDir); | 35 | void init_SiteSpec (const char *saveDir); |
35 | void deinit_SiteSpec (void); | 36 | void deinit_SiteSpec (void); |
36 | 37 | ||
37 | void setValue_SiteSpec (const iString *site, enum iSiteSpecKey key, int value); /* changes saved immediately */ | 38 | /* changes saved immediately */ |
38 | int value_SiteSpec (const iString *site, enum iSiteSpecKey key); | 39 | void setValue_SiteSpec (const iString *site, enum iSiteSpecKey key, int value); |
40 | void setValueString_SiteSpec (const iString *site, enum iSiteSpecKey key, const iString *value); | ||
41 | |||
42 | int value_SiteSpec (const iString *site, enum iSiteSpecKey key); | ||
43 | const iString * valueString_SiteSpec (const iString *site, enum iSiteSpecKey key); | ||
diff --git a/src/ui/banner.c b/src/ui/banner.c index 0ffb1d9f..7ec189a4 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) { | |||
257 | return iInvalidPos; | 257 | return iInvalidPos; |
258 | } | 258 | } |
259 | 259 | ||
260 | static iBool isInside_Banner_(const iBanner *d, const SDL_Event *ev) { | ||
261 | if (ev->type == SDL_MOUSEMOTION || ev->type == SDL_MOUSEBUTTONDOWN || | ||
262 | ev->type == SDL_MOUSEBUTTONDOWN) { | ||
263 | iInt2 coord; | ||
264 | if (ev->type == SDL_MOUSEMOTION) { | ||
265 | coord = init_I2(ev->motion.x, ev->motion.y); | ||
266 | } | ||
267 | else { | ||
268 | coord = init_I2(ev->button.x, ev->button.y); | ||
269 | } | ||
270 | return contains_Rect(bounds_Widget(constAs_Widget(d->doc)), coord); | ||
271 | } | ||
272 | return iTrue; | ||
273 | } | ||
274 | |||
260 | iBool processEvent_Banner(iBanner *d, const SDL_Event *ev) { | 275 | iBool processEvent_Banner(iBanner *d, const SDL_Event *ev) { |
261 | iWidget *w = as_Widget(d->doc); | 276 | iWidget *w = as_Widget(d->doc); |
277 | if (!isInside_Banner_(d, ev)) { | ||
278 | return iFalse; | ||
279 | } | ||
262 | switch (ev->type) { | 280 | switch (ev->type) { |
263 | case SDL_MOUSEMOTION: { | 281 | case SDL_MOUSEMOTION: { |
264 | const iInt2 coord = init_I2(ev->motion.x, ev->motion.y); | 282 | const iInt2 coord = init_I2(ev->motion.x, ev->motion.y); |
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) | |||
45 | 45 | ||
46 | enum iUploadIdentity { | 46 | enum iUploadIdentity { |
47 | none_UploadIdentity, | 47 | none_UploadIdentity, |
48 | defaultForUrl_UploadIdentity, | 48 | defaultForSite_UploadIdentity, |
49 | dropdown_UploadIdentity, | 49 | dropdown_UploadIdentity, |
50 | }; | 50 | }; |
51 | 51 | ||
@@ -104,9 +104,16 @@ static void updateInputMaxHeight_UploadWidget_(iUploadWidget *d) { | |||
104 | (avail - inputPos.y) / lineHeight_Text(font_InputWidget(d->input)))); | 104 | (avail - inputPos.y) / lineHeight_Text(font_InputWidget(d->input)))); |
105 | } | 105 | } |
106 | 106 | ||
107 | static const iGmIdentity *titanIdentityForUrl_(const iString *url) { | ||
108 | return findIdentity_GmCerts( | ||
109 | certs_App(), | ||
110 | collect_Block(hexDecode_Rangecc(range_String(valueString_SiteSpec( | ||
111 | collectNewRange_String(urlRoot_String(url)), titanIdentity_SiteSpecKey))))); | ||
112 | } | ||
113 | |||
107 | static const iArray *makeIdentityItems_UploadWidget_(const iUploadWidget *d) { | 114 | static const iArray *makeIdentityItems_UploadWidget_(const iUploadWidget *d) { |
108 | iArray *items = collectNew_Array(sizeof(iMenuItem)); | 115 | iArray *items = collectNew_Array(sizeof(iMenuItem)); |
109 | const iGmIdentity *urlId = identityForUrl_GmCerts(certs_App(), &d->url); | 116 | const iGmIdentity *urlId = titanIdentityForUrl_(&d->url); |
110 | pushBack_Array(items, | 117 | pushBack_Array(items, |
111 | &(iMenuItem){ format_CStr("${dlg.upload.id.default} (%s)", | 118 | &(iMenuItem){ format_CStr("${dlg.upload.id.default} (%s)", |
112 | urlId ? cstr_String(name_GmIdentity(urlId)) | 119 | urlId ? cstr_String(name_GmIdentity(urlId)) |
@@ -147,7 +154,7 @@ void init_UploadWidget(iUploadWidget *d) { | |||
147 | d->request = NULL; | 154 | d->request = NULL; |
148 | init_String(&d->filePath); | 155 | init_String(&d->filePath); |
149 | d->fileSize = 0; | 156 | d->fileSize = 0; |
150 | d->idMode = defaultForUrl_UploadIdentity; | 157 | d->idMode = defaultForSite_UploadIdentity; |
151 | init_Block(&d->idFingerprint, 0); | 158 | init_Block(&d->idFingerprint, 0); |
152 | const iMenuItem actions[] = { | 159 | const iMenuItem actions[] = { |
153 | { "${upload.port}", 0, 0, "upload.setport" }, | 160 | { "${upload.port}", 0, 0, "upload.setport" }, |
@@ -289,16 +296,22 @@ void deinit_UploadWidget(iUploadWidget *d) { | |||
289 | 296 | ||
290 | static void remakeIdentityItems_UploadWidget_(iUploadWidget *d) { | 297 | static void remakeIdentityItems_UploadWidget_(iUploadWidget *d) { |
291 | iWidget *dropMenu = findChild_Widget(findChild_Widget(as_Widget(d), "upload.id"), "menu"); | 298 | iWidget *dropMenu = findChild_Widget(findChild_Widget(as_Widget(d), "upload.id"), "menu"); |
292 | releaseChildren_Widget(dropMenu); | ||
293 | const iArray *items = makeIdentityItems_UploadWidget_(d); | 299 | const iArray *items = makeIdentityItems_UploadWidget_(d); |
294 | makeMenuItems_Widget(dropMenu, constData_Array(items), size_Array(items)); | 300 | /* TODO: Make the following a utility method. */ |
301 | if (flags_Widget(dropMenu) & nativeMenu_WidgetFlag) { | ||
302 | setNativeMenuItems_Widget(dropMenu, constData_Array(items), size_Array(items)); | ||
303 | } | ||
304 | else { | ||
305 | releaseChildren_Widget(dropMenu); | ||
306 | makeMenuItems_Widget(dropMenu, constData_Array(items), size_Array(items)); | ||
307 | } | ||
295 | } | 308 | } |
296 | 309 | ||
297 | static void updateIdentityDropdown_UploadWidget_(iUploadWidget *d) { | 310 | static void updateIdentityDropdown_UploadWidget_(iUploadWidget *d) { |
298 | updateDropdownSelection_LabelWidget( | 311 | updateDropdownSelection_LabelWidget( |
299 | findChild_Widget(as_Widget(d), "upload.id"), | 312 | findChild_Widget(as_Widget(d), "upload.id"), |
300 | d->idMode == none_UploadIdentity ? " arg:0" | 313 | d->idMode == none_UploadIdentity ? " arg:0" |
301 | : d->idMode == defaultForUrl_UploadIdentity | 314 | : d->idMode == defaultForSite_UploadIdentity |
302 | ? " arg:1" | 315 | ? " arg:1" |
303 | : format_CStr(" fp:%s", cstrCollect_String(hexEncode_Block(&d->idFingerprint)))); | 316 | : format_CStr(" fp:%s", cstrCollect_String(hexEncode_Block(&d->idFingerprint)))); |
304 | } | 317 | } |
@@ -422,7 +435,7 @@ static iBool processEvent_UploadWidget_(iUploadWidget *d, const SDL_Event *ev) { | |||
422 | } | 435 | } |
423 | else if (arg_Command(cmd)) { | 436 | else if (arg_Command(cmd)) { |
424 | clear_Block(&d->idFingerprint); | 437 | clear_Block(&d->idFingerprint); |
425 | d->idMode = defaultForUrl_UploadIdentity; | 438 | d->idMode = defaultForSite_UploadIdentity; |
426 | } | 439 | } |
427 | else { | 440 | else { |
428 | clear_Block(&d->idFingerprint); | 441 | clear_Block(&d->idFingerprint); |
@@ -452,19 +465,27 @@ static iBool processEvent_UploadWidget_(iUploadWidget *d, const SDL_Event *ev) { | |||
452 | setSendProgressFunc_GmRequest(d->request, updateProgress_UploadWidget_); | 465 | setSendProgressFunc_GmRequest(d->request, updateProgress_UploadWidget_); |
453 | setUserData_Object(d->request, d); | 466 | setUserData_Object(d->request, d); |
454 | setUrl_GmRequest(d->request, &d->url); | 467 | setUrl_GmRequest(d->request, &d->url); |
468 | const iString *site = collectNewRange_String(urlRoot_String(&d->url)); | ||
455 | switch (d->idMode) { | 469 | switch (d->idMode) { |
456 | case defaultForUrl_UploadIdentity: | ||
457 | break; /* GmRequest handles it */ | ||
458 | case none_UploadIdentity: | 470 | case none_UploadIdentity: |
459 | setIdentity_GmRequest(d->request, NULL); | 471 | /* Ensure no identity will be used for this specific URL. */ |
460 | signOut_GmCerts(certs_App(), url_GmRequest(d->request)); | 472 | signOut_GmCerts(certs_App(), url_GmRequest(d->request)); |
473 | setValueString_SiteSpec(site, titanIdentity_SiteSpecKey, collectNew_String()); | ||
461 | break; | 474 | break; |
462 | case dropdown_UploadIdentity: { | 475 | case dropdown_UploadIdentity: { |
463 | iGmIdentity *ident = findIdentity_GmCerts(certs_App(), &d->idFingerprint); | 476 | iGmIdentity *ident = findIdentity_GmCerts(certs_App(), &d->idFingerprint); |
464 | setIdentity_GmRequest(d->request, ident); | 477 | if (ident) { |
465 | signIn_GmCerts(certs_App(), ident, url_GmRequest(d->request)); | 478 | setValueString_SiteSpec(site, |
479 | titanIdentity_SiteSpecKey, | ||
480 | collect_String(hexEncode_Block(&ident->fingerprint))); | ||
481 | } | ||
466 | break; | 482 | break; |
467 | } | 483 | } |
484 | default: | ||
485 | break; | ||
486 | } | ||
487 | if (d->idMode != none_UploadIdentity) { | ||
488 | setIdentity_GmRequest(d->request, titanIdentityForUrl_(&d->url)); | ||
468 | } | 489 | } |
469 | if (isText) { | 490 | if (isText) { |
470 | /* Uploading text. */ | 491 | /* Uploading text. */ |
diff --git a/src/ui/util.c b/src/ui/util.c index 88348ff8..0a9dde0c 100644 --- a/src/ui/util.c +++ b/src/ui/util.c | |||
@@ -809,14 +809,27 @@ static void deleteMenuItems_(iArray *items) { | |||
809 | delete_Array(items); | 809 | delete_Array(items); |
810 | } | 810 | } |
811 | 811 | ||
812 | iWidget *makeMenu_Widget(iWidget *parent, const iMenuItem *items, size_t n) { | 812 | void releaseNativeMenu_Widget(iWidget *d) { |
813 | iWidget *menu = new_Widget(); | ||
814 | #if defined (iHaveNativeContextMenus) | 813 | #if defined (iHaveNativeContextMenus) |
815 | setFlags_Widget(menu, hidden_WidgetFlag | nativeMenu_WidgetFlag, iTrue); | 814 | iArray *items = userData_Object(d); |
815 | if (items) { | ||
816 | iAssert(flags_Widget(d) & nativeMenu_WidgetFlag); | ||
817 | iAssert(items); | ||
818 | deleteMenuItems_(items); | ||
819 | setUserData_Object(d, NULL); | ||
820 | } | ||
821 | #else | ||
822 | iUnused(d); | ||
823 | #endif | ||
824 | } | ||
825 | |||
826 | void setNativeMenuItems_Widget(iWidget *menu, const iMenuItem *items, size_t n) { | ||
827 | #if defined (iHaveNativeContextMenus) | ||
828 | iAssert(flags_Widget(menu) & nativeMenu_WidgetFlag); | ||
829 | releaseNativeMenu_Widget(menu); | ||
816 | setUserData_Object(menu, deepCopyMenuItems_(menu, items, n)); | 830 | setUserData_Object(menu, deepCopyMenuItems_(menu, items, n)); |
817 | addChild_Widget(parent, menu); | ||
818 | iRelease(menu); /* owned by parent now */ | ||
819 | /* Keyboard shortcuts still need to triggerable via the menu, although the items don't exist. */ { | 831 | /* Keyboard shortcuts still need to triggerable via the menu, although the items don't exist. */ { |
832 | releaseChildren_Widget(menu); | ||
820 | for (size_t i = 0; i < n; i++) { | 833 | for (size_t i = 0; i < n; i++) { |
821 | const iMenuItem *item = &items[i]; | 834 | const iMenuItem *item = &items[i]; |
822 | if (item->key) { | 835 | if (item->key) { |
@@ -824,6 +837,17 @@ iWidget *makeMenu_Widget(iWidget *parent, const iMenuItem *items, size_t n) { | |||
824 | } | 837 | } |
825 | } | 838 | } |
826 | } | 839 | } |
840 | #endif | ||
841 | } | ||
842 | |||
843 | iWidget *makeMenu_Widget(iWidget *parent, const iMenuItem *items, size_t n) { | ||
844 | iWidget *menu = new_Widget(); | ||
845 | #if defined (iHaveNativeContextMenus) | ||
846 | setFlags_Widget(menu, hidden_WidgetFlag | nativeMenu_WidgetFlag, iTrue); | ||
847 | addChild_Widget(parent, menu); | ||
848 | iRelease(menu); /* owned by parent now */ | ||
849 | setUserData_Object(menu, NULL); | ||
850 | setNativeMenuItems_Widget(menu, items, n); | ||
827 | #else | 851 | #else |
828 | /* Non-native custom popup menu. This may still be displayed inside a separate window. */ | 852 | /* Non-native custom popup menu. This may still be displayed inside a separate window. */ |
829 | setDrawBufferEnabled_Widget(menu, iTrue); | 853 | setDrawBufferEnabled_Widget(menu, iTrue); |
@@ -990,18 +1014,6 @@ iLocalDef iBool isUsingMenuPopupWindows_(void) { | |||
990 | #endif | 1014 | #endif |
991 | } | 1015 | } |
992 | 1016 | ||
993 | void releaseNativeMenu_Widget(iWidget *d) { | ||
994 | #if defined (iHaveNativeContextMenus) | ||
995 | iArray *items = userData_Object(d); | ||
996 | iAssert(flags_Widget(d) & nativeMenu_WidgetFlag); | ||
997 | iAssert(items); | ||
998 | deleteMenuItems_(items); | ||
999 | setUserData_Object(d, NULL); | ||
1000 | #else | ||
1001 | iUnused(d); | ||
1002 | #endif | ||
1003 | } | ||
1004 | |||
1005 | void openMenuFlags_Widget(iWidget *d, iInt2 windowCoord, int menuOpenFlags) { | 1017 | void openMenuFlags_Widget(iWidget *d, iInt2 windowCoord, int menuOpenFlags) { |
1006 | const iBool postCommands = (menuOpenFlags & postCommands_MenuOpenFlags) != 0; | 1018 | const iBool postCommands = (menuOpenFlags & postCommands_MenuOpenFlags) != 0; |
1007 | #if defined (iHaveNativeContextMenus) | 1019 | #if defined (iHaveNativeContextMenus) |
@@ -1263,8 +1275,8 @@ void updateDropdownSelection_LabelWidget(iLabelWidget *dropButton, const char *s | |||
1263 | iMenuItem *item = findNativeMenuItem_Widget(menu, selectedCommand); | 1275 | iMenuItem *item = findNativeMenuItem_Widget(menu, selectedCommand); |
1264 | if (item) { | 1276 | if (item) { |
1265 | setSelected_NativeMenuItem(item, iTrue); | 1277 | setSelected_NativeMenuItem(item, iTrue); |
1266 | updateText_LabelWidget(dropButton, | 1278 | updateText_LabelWidget( |
1267 | removeMenuItemLabelPrefixes_String(collectNewCStr_String(item->label))); | 1279 | dropButton, removeMenuItemLabelPrefixes_String(collectNewCStr_String(item->label))); |
1268 | } | 1280 | } |
1269 | return; | 1281 | return; |
1270 | } | 1282 | } |
@@ -2199,27 +2211,27 @@ iWidget *makeDialog_Widget(const char *id, | |||
2199 | 2211 | ||
2200 | iWidget *makePreferences_Widget(void) { | 2212 | iWidget *makePreferences_Widget(void) { |
2201 | /* Common items. */ | 2213 | /* Common items. */ |
2202 | const iMenuItem langItems[] = { { "${lang.cs} - cs", 0, 0, "uilang id:cs" }, | 2214 | const iMenuItem langItems[] = { { u8"Čeština - cs", 0, 0, "uilang id:cs" }, |
2203 | { "${lang.de} - de", 0, 0, "uilang id:de" }, | 2215 | { u8"Deutsch - de", 0, 0, "uilang id:de" }, |
2204 | { "${lang.en} - en", 0, 0, "uilang id:en" }, | 2216 | { u8"English - en", 0, 0, "uilang id:en" }, |
2205 | { "${lang.es} - es", 0, 0, "uilang id:es" }, | 2217 | { u8"Español - es", 0, 0, "uilang id:es" }, |
2206 | { "${lang.es.mx} - es", 0, 0, "uilang id:es_MX" }, | 2218 | { u8"Español (México) - es", 0, 0, "uilang id:es_MX" }, |
2207 | { "${lang.eo} - eo", 0, 0, "uilang id:eo" }, | 2219 | { u8"Esperanto - eo", 0, 0, "uilang id:eo" }, |
2208 | { "${lang.fi} - fi", 0, 0, "uilang id:fi" }, | 2220 | { u8"Suomi - fi", 0, 0, "uilang id:fi" }, |
2209 | { "${lang.fr} - fr", 0, 0, "uilang id:fr" }, | 2221 | { u8"Français - fr", 0, 0, "uilang id:fr" }, |
2210 | { "${lang.gl} - gl", 0, 0, "uilang id:gl" }, | 2222 | { u8"Galego - gl", 0, 0, "uilang id:gl" }, |
2211 | { "${lang.hu} - hu", 0, 0, "uilang id:hu" }, | 2223 | { u8"Magyar - hu", 0, 0, "uilang id:hu" }, |
2212 | { "${lang.ia} - ia", 0, 0, "uilang id:ia" }, | 2224 | { u8"Interlingua - ia", 0, 0, "uilang id:ia" }, |
2213 | { "${lang.ie} - ie", 0, 0, "uilang id:ie" }, | 2225 | { u8"Interlingue - ie", 0, 0, "uilang id:ie" }, |
2214 | { "${lang.isv} - isv", 0, 0, "uilang id:isv" }, | 2226 | { u8"Interslavic - isv", 0, 0, "uilang id:isv" }, |
2215 | { "${lang.pl} - pl", 0, 0, "uilang id:pl" }, | 2227 | { u8"Polski - pl", 0, 0, "uilang id:pl" }, |
2216 | { "${lang.ru} - ru", 0, 0, "uilang id:ru" }, | 2228 | { u8"Русский - ru", 0, 0, "uilang id:ru" }, |
2217 | { "${lang.sk} - sk", 0, 0, "uilang id:sk" }, | 2229 | { u8"Slovak - sk", 0, 0, "uilang id:sk" }, |
2218 | { "${lang.sr} - sr", 0, 0, "uilang id:sr" }, | 2230 | { u8"Српски - sr", 0, 0, "uilang id:sr" }, |
2219 | { "${lang.tok} - tok", 0, 0, "uilang id:tok" }, | 2231 | { u8"Toki pona - tok", 0, 0, "uilang id:tok" }, |
2220 | { "${lang.uk} - uk", 0, 0, "uilang id:uk" }, | 2232 | { u8"Українська - uk", 0, 0, "uilang id:uk" }, |
2221 | { "${lang.zh.hans} - zh", 0, 0, "uilang id:zh_Hans" }, | 2233 | { u8"简体中文 - zh", 0, 0, "uilang id:zh_Hans" }, |
2222 | { "${lang.zh.hant} - zh", 0, 0, "uilang id:zh_Hant" }, | 2234 | { u8"繁體/正體中文 - zh", 0, 0, "uilang id:zh_Hant" }, |
2223 | { NULL } }; | 2235 | { NULL } }; |
2224 | const iMenuItem returnKeyBehaviors[] = { | 2236 | const iMenuItem returnKeyBehaviors[] = { |
2225 | { "${prefs.returnkey.linebreak} " uiTextAction_ColorEscape shift_Icon return_Icon | 2237 | { "${prefs.returnkey.linebreak} " uiTextAction_ColorEscape shift_Icon return_Icon |
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 | |||
249 | void setMenuItemDisabledByIndex_Widget(iWidget *menu, size_t index, iBool disable); | 249 | void setMenuItemDisabledByIndex_Widget(iWidget *menu, size_t index, iBool disable); |
250 | void setMenuItemLabel_Widget (iWidget *menu, const char *command, const char *newLabel); | 250 | void setMenuItemLabel_Widget (iWidget *menu, const char *command, const char *newLabel); |
251 | void setMenuItemLabelByIndex_Widget (iWidget *menu, size_t index, const char *newLabel); | 251 | void setMenuItemLabelByIndex_Widget (iWidget *menu, size_t index, const char *newLabel); |
252 | void setNativeMenuItems_Widget (iWidget *, const iMenuItem *items, size_t n); | ||
252 | 253 | ||
253 | int checkContextMenu_Widget (iWidget *, const SDL_Event *ev); /* see macro below */ | 254 | int checkContextMenu_Widget (iWidget *, const SDL_Event *ev); /* see macro below */ |
254 | 255 | ||