diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-03-15 12:47:20 +0200 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-03-15 19:03:41 +0200 |
commit | eeb9f8b6306524782e7dcc8ef90797dd5bdae1bf (patch) | |
tree | acfde64b0304d563769f73a7288cacb0568bb179 /src/ui/documentwidget.c | |
parent | eb8da869cf87692a5cbb38803644643cd2e192f6 (diff) |
Added a page translation service
This is quite experimental.
The page contents are sent to an instance of LibreTranslate (powered by Argos Translate), which may or may not successfully translate the contents without mangling the gemtext markup.
Diffstat (limited to 'src/ui/documentwidget.c')
-rw-r--r-- | src/ui/documentwidget.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 79e8b727..a468e2df 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c | |||
@@ -43,6 +43,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |||
43 | #include "paint.h" | 43 | #include "paint.h" |
44 | #include "mediaui.h" | 44 | #include "mediaui.h" |
45 | #include "scrollwidget.h" | 45 | #include "scrollwidget.h" |
46 | #include "translation.h" | ||
46 | #include "util.h" | 47 | #include "util.h" |
47 | #include "visbuf.h" | 48 | #include "visbuf.h" |
48 | #include "visited.h" | 49 | #include "visited.h" |
@@ -218,6 +219,7 @@ struct Impl_DocumentWidget { | |||
218 | iPtrSet * invalidRuns; | 219 | iPtrSet * invalidRuns; |
219 | SDL_Texture * sideIconBuf; | 220 | SDL_Texture * sideIconBuf; |
220 | iTextBuf * timestampBuf; | 221 | iTextBuf * timestampBuf; |
222 | iTranslation * translation; | ||
221 | }; | 223 | }; |
222 | 224 | ||
223 | iDefineObjectConstruction(DocumentWidget) | 225 | iDefineObjectConstruction(DocumentWidget) |
@@ -273,6 +275,7 @@ void init_DocumentWidget(iDocumentWidget *d) { | |||
273 | d->playerMenu = NULL; | 275 | d->playerMenu = NULL; |
274 | d->sideIconBuf = NULL; | 276 | d->sideIconBuf = NULL; |
275 | d->timestampBuf = NULL; | 277 | d->timestampBuf = NULL; |
278 | d->translation = NULL; | ||
276 | addChildFlags_Widget(w, | 279 | addChildFlags_Widget(w, |
277 | iClob(new_IndicatorWidget()), | 280 | iClob(new_IndicatorWidget()), |
278 | resizeToParentWidth_WidgetFlag | resizeToParentHeight_WidgetFlag); | 281 | resizeToParentWidth_WidgetFlag | resizeToParentHeight_WidgetFlag); |
@@ -289,6 +292,7 @@ void init_DocumentWidget(iDocumentWidget *d) { | |||
289 | } | 292 | } |
290 | 293 | ||
291 | void deinit_DocumentWidget(iDocumentWidget *d) { | 294 | void deinit_DocumentWidget(iDocumentWidget *d) { |
295 | delete_Translation(d->translation); | ||
292 | if (d->sideIconBuf) { | 296 | if (d->sideIconBuf) { |
293 | SDL_DestroyTexture(d->sideIconBuf); | 297 | SDL_DestroyTexture(d->sideIconBuf); |
294 | } | 298 | } |
@@ -751,7 +755,7 @@ static void documentRunsInvalidated_DocumentWidget_(iDocumentWidget *d) { | |||
751 | d->lastVisibleRun = NULL; | 755 | d->lastVisibleRun = NULL; |
752 | } | 756 | } |
753 | 757 | ||
754 | static void setSource_DocumentWidget_(iDocumentWidget *d, const iString *source) { | 758 | void setSource_DocumentWidget(iDocumentWidget *d, const iString *source) { |
755 | setUrl_GmDocument(d->doc, d->mod.url); | 759 | setUrl_GmDocument(d->doc, d->mod.url); |
756 | setSource_GmDocument(d->doc, source, documentWidth_DocumentWidget_(d)); | 760 | setSource_GmDocument(d->doc, source, documentWidth_DocumentWidget_(d)); |
757 | documentRunsInvalidated_DocumentWidget_(d); | 761 | documentRunsInvalidated_DocumentWidget_(d); |
@@ -825,7 +829,7 @@ static void showErrorPage_DocumentWidget_(iDocumentWidget *d, enum iGmStatusCode | |||
825 | } | 829 | } |
826 | setBanner_GmDocument(d->doc, useBanner ? bannerType_DocumentWidget_(d) : none_GmDocumentBanner); | 830 | setBanner_GmDocument(d->doc, useBanner ? bannerType_DocumentWidget_(d) : none_GmDocumentBanner); |
827 | setFormat_GmDocument(d->doc, gemini_GmDocumentFormat); | 831 | setFormat_GmDocument(d->doc, gemini_GmDocumentFormat); |
828 | setSource_DocumentWidget_(d, src); | 832 | setSource_DocumentWidget(d, src); |
829 | updateTheme_DocumentWidget_(d); | 833 | updateTheme_DocumentWidget_(d); |
830 | init_Anim(&d->scrollY, 0); | 834 | init_Anim(&d->scrollY, 0); |
831 | init_Anim(&d->sideOpacity, 0); | 835 | init_Anim(&d->sideOpacity, 0); |
@@ -947,7 +951,7 @@ static void updateDocument_DocumentWidget_(iDocumentWidget *d, const iGmResponse | |||
947 | } | 951 | } |
948 | } | 952 | } |
949 | if (setSource) { | 953 | if (setSource) { |
950 | setSource_DocumentWidget_(d, &str); | 954 | setSource_DocumentWidget(d, &str); |
951 | } | 955 | } |
952 | deinit_String(&str); | 956 | deinit_String(&str); |
953 | } | 957 | } |
@@ -1777,6 +1781,20 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
1777 | cacheDocumentGlyphs_DocumentWidget_(d); | 1781 | cacheDocumentGlyphs_DocumentWidget_(d); |
1778 | return iFalse; | 1782 | return iFalse; |
1779 | } | 1783 | } |
1784 | else if (equalWidget_Command(cmd, w, "document.translate")) { | ||
1785 | if (!d->translation) { | ||
1786 | d->translation = new_Translation(d); | ||
1787 | } | ||
1788 | return iTrue; | ||
1789 | } | ||
1790 | else if (startsWith_CStr(cmd, "translation.") && d->translation) { | ||
1791 | const iBool wasHandled = handleCommand_Translation(d->translation, cmd); | ||
1792 | if (isFinished_Translation(d->translation)) { | ||
1793 | delete_Translation(d->translation); | ||
1794 | d->translation = NULL; | ||
1795 | } | ||
1796 | return wasHandled; | ||
1797 | } | ||
1780 | else if (equal_Command(cmd, "media.updated") || equal_Command(cmd, "media.finished")) { | 1798 | else if (equal_Command(cmd, "media.updated") || equal_Command(cmd, "media.finished")) { |
1781 | return handleMediaCommand_DocumentWidget_(d, cmd); | 1799 | return handleMediaCommand_DocumentWidget_(d, cmd); |
1782 | } | 1800 | } |
@@ -2524,9 +2542,10 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e | |||
2524 | { star_Icon " Subscribe to Page...", subscribeToPage_KeyModifier, "feeds.subscribe" }, | 2542 | { star_Icon " Subscribe to Page...", subscribeToPage_KeyModifier, "feeds.subscribe" }, |
2525 | { "---", 0, 0, NULL }, | 2543 | { "---", 0, 0, NULL }, |
2526 | { book_Icon " Import Links as Bookmarks...", 0, 0, "bookmark.links confirm:1" }, | 2544 | { book_Icon " Import Links as Bookmarks...", 0, 0, "bookmark.links confirm:1" }, |
2545 | { "Translate...", 0, 0, "document.translate" }, | ||
2527 | { "---", 0, 0, NULL }, | 2546 | { "---", 0, 0, NULL }, |
2528 | { "Copy Page URL", 0, 0, "document.copylink" } }, | 2547 | { "Copy Page URL", 0, 0, "document.copylink" } }, |
2529 | 11); | 2548 | 12); |
2530 | if (isEmpty_Range(&d->selectMark)) { | 2549 | if (isEmpty_Range(&d->selectMark)) { |
2531 | pushBackN_Array( | 2550 | pushBackN_Array( |
2532 | &items, | 2551 | &items, |