diff options
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | apps/mobile/app/dashboard/search.tsx | 15 | ||||
| -rw-r--r-- | apps/web/app/dashboard/search/page.tsx | 10 | ||||
| -rw-r--r-- | apps/web/components/dashboard/bookmarks/UpdatableBookmarksGrid.tsx | 2 | ||||
| -rw-r--r-- | apps/web/lib/hooks/bookmark-search.ts | 32 | ||||
| -rw-r--r-- | apps/web/lib/i18n/locales/es/translation.json | 154 | ||||
| -rw-r--r-- | apps/web/lib/i18n/locales/nl/translation.json | 302 | ||||
| -rw-r--r-- | apps/web/lib/i18n/locales/pl/translation.json | 488 | ||||
| -rw-r--r-- | packages/shared/langs.ts | 1 | ||||
| -rw-r--r-- | packages/trpc/routers/bookmarks.ts | 35 |
10 files changed, 550 insertions, 492 deletions
@@ -52,4 +52,5 @@ data # Idea .idea -*.iml
\ No newline at end of file +*.iml +.aider* diff --git a/apps/mobile/app/dashboard/search.tsx b/apps/mobile/app/dashboard/search.tsx index 884345e7..de3d0f46 100644 --- a/apps/mobile/app/dashboard/search.tsx +++ b/apps/mobile/app/dashboard/search.tsx @@ -17,10 +17,15 @@ export default function Search() { const onRefresh = api.useUtils().bookmarks.searchBookmarks.invalidate; - const { data, error, refetch, isPending } = - api.bookmarks.searchBookmarks.useQuery( + const { data, error, refetch, isPending, fetchNextPage, isFetchingNextPage } = + api.bookmarks.searchBookmarks.useInfiniteQuery( { text: query }, - { placeholderData: keepPreviousData }, + { + placeholderData: keepPreviousData, + gcTime: 0, + initialCursor: null, + getNextPageParam: (lastPage) => lastPage.nextCursor, + }, ); if (error) { @@ -45,7 +50,9 @@ export default function Search() { {!data && <FullPageSpinner />} {data && ( <BookmarkList - bookmarks={data.bookmarks} + bookmarks={data.pages.flatMap((p) => p.bookmarks)} + fetchNextPage={fetchNextPage} + isFetchingNextPage={isFetchingNextPage} onRefresh={onRefresh} isRefreshing={isPending} /> diff --git a/apps/web/app/dashboard/search/page.tsx b/apps/web/app/dashboard/search/page.tsx index a239550c..beae73b8 100644 --- a/apps/web/app/dashboard/search/page.tsx +++ b/apps/web/app/dashboard/search/page.tsx @@ -6,12 +6,18 @@ import { FullPageSpinner } from "@/components/ui/full-page-spinner"; import { useBookmarkSearch } from "@/lib/hooks/bookmark-search"; function SearchComp() { - const { data } = useBookmarkSearch(); + const { data, hasNextPage, fetchNextPage, isFetchingNextPage } = + useBookmarkSearch(); return ( <div className="flex flex-col gap-3"> {data ? ( - <BookmarksGrid bookmarks={data.bookmarks} /> + <BookmarksGrid + hasNextPage={hasNextPage} + fetchNextPage={fetchNextPage} + isFetchingNextPage={isFetchingNextPage} + bookmarks={data.pages.flatMap((b) => b.bookmarks)} + /> ) : ( <FullPageSpinner /> )} diff --git a/apps/web/components/dashboard/bookmarks/UpdatableBookmarksGrid.tsx b/apps/web/components/dashboard/bookmarks/UpdatableBookmarksGrid.tsx index bc6cd6db..d18eeb1b 100644 --- a/apps/web/components/dashboard/bookmarks/UpdatableBookmarksGrid.tsx +++ b/apps/web/components/dashboard/bookmarks/UpdatableBookmarksGrid.tsx @@ -38,7 +38,7 @@ export default function UpdatableBookmarksGrid({ <BookmarksGrid bookmarks={data!.pages.flatMap((b) => b.bookmarks)} hasNextPage={hasNextPage} - fetchNextPage={() => fetchNextPage()} + fetchNextPage={fetchNextPage} isFetchingNextPage={isFetchingNextPage} showEditorCard={showEditorCard} /> diff --git a/apps/web/lib/hooks/bookmark-search.ts b/apps/web/lib/hooks/bookmark-search.ts index ffdf402d..9890ac6f 100644 --- a/apps/web/lib/hooks/bookmark-search.ts +++ b/apps/web/lib/hooks/bookmark-search.ts @@ -50,16 +50,25 @@ export function useDoBookmarkSearch() { export function useBookmarkSearch() { const { searchQuery } = useSearchQuery(); - const { data, isPending, isPlaceholderData, error } = - api.bookmarks.searchBookmarks.useQuery( - { - text: searchQuery, - }, - { - placeholderData: keepPreviousData, - gcTime: 0, - }, - ); + const { + data, + isPending, + isPlaceholderData, + error, + hasNextPage, + fetchNextPage, + isFetchingNextPage, + } = api.bookmarks.searchBookmarks.useInfiniteQuery( + { + text: searchQuery, + }, + { + placeholderData: keepPreviousData, + gcTime: 0, + initialCursor: null, + getNextPageParam: (lastPage) => lastPage.nextCursor, + }, + ); if (error) { throw error; @@ -71,5 +80,8 @@ export function useBookmarkSearch() { data, isPending, isPlaceholderData, + hasNextPage, + fetchNextPage, + isFetchingNextPage, }; } diff --git a/apps/web/lib/i18n/locales/es/translation.json b/apps/web/lib/i18n/locales/es/translation.json index 76df5908..27bb90c0 100644 --- a/apps/web/lib/i18n/locales/es/translation.json +++ b/apps/web/lib/i18n/locales/es/translation.json @@ -1,82 +1,82 @@ { - "common": { - "tags": "Etiquetas", - "roles": { - "user": "Usuario", - "admin": "Admin" - }, - "attachments": "Adjuntos", - "name": "Nombre", - "email": "Email", - "role": "Rol", - "url": "URL", - "action": "Acción", - "actions": "Acciones", - "created_at": "Creado a", - "something_went_wrong": "Algo ha ido mal", - "search": "Buscar", - "screenshot": "Captura de pantalla", - "video": "Vídeo", - "archive": "Archivo", - "home": "Inicio", - "password": "Contraseña", - "key": "Clave", - "experimental": "Experimental", - "note": "Nota" + "common": { + "tags": "Etiquetas", + "roles": { + "user": "Usuario", + "admin": "Admin" }, - "settings": { - "info": { - "change_password": "Cambiar contraseña", - "new_password": "Nueva contraseña", - "interface_lang": "Idioma de la interfaz", - "user_info": "Información del usuario", - "basic_details": "Detalles básicos", - "current_password": "Contraseña actual", - "confirm_new_password": "Confirmar nueva contraseña", - "options": "Ajustes" - }, - "back_to_app": "Volver a la aplicación", - "ai": { - "ai_settings": "Ajustes de IA", - "tagging_rules": "Reglas de etiquetado", - "tagging_rule_description": "Los prompts que añadas aquí se incluirán como reglas durante la generación de etiquetas. Puedes comprobar el prompt final en la sección de previsualización.", - "prompt_preview": "Previsualización de prompt" - }, - "user_settings": "Ajustes de usuario" + "attachments": "Adjuntos", + "name": "Nombre", + "email": "Email", + "role": "Rol", + "url": "URL", + "action": "Acción", + "actions": "Acciones", + "created_at": "Creado a", + "something_went_wrong": "Algo ha ido mal", + "search": "Buscar", + "screenshot": "Captura de pantalla", + "video": "Vídeo", + "archive": "Archivo", + "home": "Inicio", + "password": "Contraseña", + "key": "Clave", + "experimental": "Experimental", + "note": "Nota" + }, + "settings": { + "info": { + "change_password": "Cambiar contraseña", + "new_password": "Nueva contraseña", + "interface_lang": "Idioma de la interfaz", + "user_info": "Información del usuario", + "basic_details": "Detalles básicos", + "current_password": "Contraseña actual", + "confirm_new_password": "Confirmar nueva contraseña", + "options": "Ajustes" }, - "actions": { - "unselect_all": "Deseleccionar todo", - "select_all": "Seleccionar todo", - "change_layout": "Cambiar diseño", - "unfavorite": "Descargar como favorito", - "delete": "Eliminar", - "refresh": "Actualizar", - "download_full_page_archive": "Descargar la página completa", - "edit_tags": "Editar las etiquetas", - "remove_from_list": "Eliminar de la lista", - "save": "Guardar", - "add": "Añadir", - "edit": "Editar", - "create": "Crear", - "fetch_now": "Actualizar ahora", - "summarize_with_ai": "Resumir con IA", - "edit_title": "Editar título", - "sign_out": "Cerrar sesión", - "close": "Cerrar", - "merge": "Unir", - "ignore": "Ignorar", - "archive": "Archivar", - "unarchive": "Desarchivar", - "favorite": "Marcar como favorito", - "add_to_list": "Añadir a la lista", - "copy_link": "Copiar enlace", - "cancel": "Cancelar", - "apply_all": "Aplicar todo" + "back_to_app": "Volver a la aplicación", + "ai": { + "ai_settings": "Ajustes de IA", + "tagging_rules": "Reglas de etiquetado", + "tagging_rule_description": "Los prompts que añadas aquí se incluirán como reglas durante la generación de etiquetas. Puedes comprobar el prompt final en la sección de previsualización.", + "prompt_preview": "Previsualización de prompt" }, - "layouts": { - "compact": "Compacto", - "masonry": "Masonería", - "grid": "Rejilla", - "list": "Lista" - } + "user_settings": "Ajustes de usuario" + }, + "actions": { + "unselect_all": "Deseleccionar todo", + "select_all": "Seleccionar todo", + "change_layout": "Cambiar diseño", + "unfavorite": "Descargar como favorito", + "delete": "Eliminar", + "refresh": "Actualizar", + "download_full_page_archive": "Descargar la página completa", + "edit_tags": "Editar las etiquetas", + "remove_from_list": "Eliminar de la lista", + "save": "Guardar", + "add": "Añadir", + "edit": "Editar", + "create": "Crear", + "fetch_now": "Actualizar ahora", + "summarize_with_ai": "Resumir con IA", + "edit_title": "Editar título", + "sign_out": "Cerrar sesión", + "close": "Cerrar", + "merge": "Unir", + "ignore": "Ignorar", + "archive": "Archivar", + "unarchive": "Desarchivar", + "favorite": "Marcar como favorito", + "add_to_list": "Añadir a la lista", + "copy_link": "Copiar enlace", + "cancel": "Cancelar", + "apply_all": "Aplicar todo" + }, + "layouts": { + "compact": "Compacto", + "masonry": "Masonería", + "grid": "Rejilla", + "list": "Lista" + } } diff --git a/apps/web/lib/i18n/locales/nl/translation.json b/apps/web/lib/i18n/locales/nl/translation.json index 4b25c91f..32c8473e 100644 --- a/apps/web/lib/i18n/locales/nl/translation.json +++ b/apps/web/lib/i18n/locales/nl/translation.json @@ -1,163 +1,163 @@ { - "common": { - "created_at": "Gemaakt op", - "archive": "Archiveer", - "url": "URL", - "name": "Naam", - "email": "E-mail", - "actions": "Acties", - "role": "Rol", - "roles": { - "user": "Gebruiker", - "admin": "Admin" - }, - "something_went_wrong": "Er is iets fout gegaan", - "experimental": "Experimenteel", - "search": "Zoeken", - "tags": "Labels", - "note": "Notitie", - "attachments": "Bijlagen", - "screenshot": "Schermopname", - "video": "Video", - "home": "Home", - "password": "Wachtwoord", - "action": "Actie", - "key": "Sleutel" + "common": { + "created_at": "Gemaakt op", + "archive": "Archiveer", + "url": "URL", + "name": "Naam", + "email": "E-mail", + "actions": "Acties", + "role": "Rol", + "roles": { + "user": "Gebruiker", + "admin": "Admin" }, - "layouts": { - "list": "Lijst", - "masonry": "Metselwerk", - "grid": "Rooster", - "compact": "Compact" + "something_went_wrong": "Er is iets fout gegaan", + "experimental": "Experimenteel", + "search": "Zoeken", + "tags": "Labels", + "note": "Notitie", + "attachments": "Bijlagen", + "screenshot": "Schermopname", + "video": "Video", + "home": "Home", + "password": "Wachtwoord", + "action": "Actie", + "key": "Sleutel" + }, + "layouts": { + "list": "Lijst", + "masonry": "Metselwerk", + "grid": "Rooster", + "compact": "Compact" + }, + "actions": { + "close_bulk_edit": "Bulkbewerking sluiten", + "delete": "Verwijderen", + "change_layout": "Wijzig Layout", + "archive": "Archiveer", + "unarchive": "Verwijderen uit het archief", + "unfavorite": "Verwijder uit favorieten", + "refresh": "Vernieuwen", + "download_full_page_archive": "Download pagina archief", + "edit_tags": "Wijzig Labels", + "add_to_list": "Toevoegen aan lijst", + "select_all": "Selecteer alles", + "unselect_all": "Deselecteer alles", + "bulk_edit": "Bulkbewerking", + "remove_from_list": "Verwijderen uit lijst", + "add": "Toevoegen", + "edit": "Wijzigen", + "create": "Creëer", + "fetch_now": "Nu ophalen", + "summarize_with_ai": "Samenvatten met AI", + "manage_lists": "Lijsten beheren", + "favorite": "Favoriet", + "copy_link": "Kopieer link", + "save": "Bewaar", + "recrawl": "Opnieuw crawlen", + "apply_all": "Alles Toepassen", + "edit_title": "Wijzig Titel", + "sign_out": "Afmelden", + "close": "Sluiten", + "merge": "Samenvoegen", + "cancel": "Annuleer", + "ignore": "Negeren" + }, + "settings": { + "ai": { + "ai_settings": "AI Instellingen", + "tagging_rules": "Labels Regels" }, - "actions": { - "close_bulk_edit": "Bulkbewerking sluiten", - "delete": "Verwijderen", - "change_layout": "Wijzig Layout", - "archive": "Archiveer", - "unarchive": "Verwijderen uit het archief", - "unfavorite": "Verwijder uit favorieten", - "refresh": "Vernieuwen", - "download_full_page_archive": "Download pagina archief", - "edit_tags": "Wijzig Labels", - "add_to_list": "Toevoegen aan lijst", - "select_all": "Selecteer alles", - "unselect_all": "Deselecteer alles", - "bulk_edit": "Bulkbewerking", - "remove_from_list": "Verwijderen uit lijst", - "add": "Toevoegen", - "edit": "Wijzigen", - "create": "Creëer", - "fetch_now": "Nu ophalen", - "summarize_with_ai": "Samenvatten met AI", - "manage_lists": "Lijsten beheren", - "favorite": "Favoriet", - "copy_link": "Kopieer link", - "save": "Bewaar", - "recrawl": "Opnieuw crawlen", - "apply_all": "Alles Toepassen", - "edit_title": "Wijzig Titel", - "sign_out": "Afmelden", - "close": "Sluiten", - "merge": "Samenvoegen", - "cancel": "Annuleer", - "ignore": "Negeren" + "import": { + "import_export": "Importeren / Exporteren", + "imported_bookmarks": "Geïmporteerde Bladwijzers", + "import_export_bookmarks": "Importeer / Exporteer Bladwijzers", + "import_bookmarks_from_html_file": "Importeer Bladwijzers van HTML bestand", + "import_bookmarks_from_pocket_export": "Importeer Bladwijzers van Pocket export" }, - "settings": { - "ai": { - "ai_settings": "AI Instellingen", - "tagging_rules": "Labels Regels" - }, - "import": { - "import_export": "Importeren / Exporteren", - "imported_bookmarks": "Geïmporteerde Bladwijzers", - "import_export_bookmarks": "Importeer / Exporteer Bladwijzers", - "import_bookmarks_from_html_file": "Importeer Bladwijzers van HTML bestand", - "import_bookmarks_from_pocket_export": "Importeer Bladwijzers van Pocket export" - }, - "broken_links": { - "broken_links": "Gebroken Links", - "last_crawled_at": "Laatste Crawl Op", - "crawling_status": "Crawl Status", - "crawling_failed": "Crawl Mislukt" - }, - "api_keys": { - "key_success_please_copy": "Kopieer de sleutel en bewaar het op een veilige plaats. Wanneer je de dialoog sluit, zal je deze niet meer opnieuw kunnen raadplegen.", - "key_success": "Sleutel werd succesvol aangemaakt", - "api_keys": "API Sleutels", - "new_api_key": "Nieuwe API Sleutel", - "new_api_key_desc": "Geef je API sleutel een unieke naam" - }, - "info": { - "user_info": "Gebruiker Info", - "basic_details": "Algemene Details", - "change_password": "Wijzig Wachtwoord", - "current_password": "Huidige Wachtwoord", - "new_password": "Nieuwe Wachtwoord", - "options": "Opties", - "confirm_new_password": "Confirmeer Nieuwe Wachtwoord", - "interface_lang": "Interface Taal" - }, - "back_to_app": "Terug Naar App", - "user_settings": "Gebruikersinstellingen", - "feeds": { - "rss_subscriptions": "RSS Abonnementen", - "add_a_subscription": "Abonnement Toevoegen" - } + "broken_links": { + "broken_links": "Gebroken Links", + "last_crawled_at": "Laatste Crawl Op", + "crawling_status": "Crawl Status", + "crawling_failed": "Crawl Mislukt" }, - "admin": { - "server_stats": { - "server_stats": "Server Statistieken", - "total_users": "Totaal Gebruikers", - "total_bookmarks": "Totaal Bladwijzers", - "server_version": "Server Versie" - }, - "background_jobs": { - "failed": "Mislukt", - "crawler_jobs": "Crawl Taken", - "background_jobs": "Achtergrondtaken", - "indexing_jobs": "Indexeer Taken", - "inference_jobs": "Inferentie Taken" - }, - "users_list": { - "users_list": "Gebruikerslijst", - "delete_user": "Verwijder Gebruiker", - "num_bookmarks": "Aantal Bladwijzers", - "local_user": "Lokale Gebruiker", - "reset_password": "Reset Wachtwoord", - "create_user": "Maak Gebruiker Aan", - "change_role": "Wijzig Rol" - }, - "admin_settings": "Admin Instellingen" + "api_keys": { + "key_success_please_copy": "Kopieer de sleutel en bewaar het op een veilige plaats. Wanneer je de dialoog sluit, zal je deze niet meer opnieuw kunnen raadplegen.", + "key_success": "Sleutel werd succesvol aangemaakt", + "api_keys": "API Sleutels", + "new_api_key": "Nieuwe API Sleutel", + "new_api_key_desc": "Geef je API sleutel een unieke naam" }, - "tags": { - "ai_tags": "AI Labels", - "sort_by_name": "Sorteer op naam", - "your_tags_info": "Labels die ten minste eenmaal toegekend zijn door jou", - "ai_tags_info": "Labels die automatisch toegekend zijn (door AI)", - "all_tags": "Alle Labels", - "your_tags": "Jouw Labels", - "drag_and_drop_merging": "Drag & Drop Samenvoegen", - "unused_tags": "Ongebruikte Labels", - "drag_and_drop_merging_info": "Sleep labels naar elkaar toe om ze samen te voegen", - "unused_tags_info": "Labels die niet toegekend zijn aan een bladwijzer", - "delete_all_unused_tags": "Verwijder Alle Ongebruikte Labels" + "info": { + "user_info": "Gebruiker Info", + "basic_details": "Algemene Details", + "change_password": "Wijzig Wachtwoord", + "current_password": "Huidige Wachtwoord", + "new_password": "Nieuwe Wachtwoord", + "options": "Opties", + "confirm_new_password": "Confirmeer Nieuwe Wachtwoord", + "interface_lang": "Interface Taal" }, - "preview": { - "view_original": "Toon origineel" + "back_to_app": "Terug Naar App", + "user_settings": "Gebruikersinstellingen", + "feeds": { + "rss_subscriptions": "RSS Abonnementen", + "add_a_subscription": "Abonnement Toevoegen" + } + }, + "admin": { + "server_stats": { + "server_stats": "Server Statistieken", + "total_users": "Totaal Gebruikers", + "total_bookmarks": "Totaal Bladwijzers", + "server_version": "Server Versie" }, - "editor": { - "text_toolbar": { - "bold": "Vetgedrukt" - } + "background_jobs": { + "failed": "Mislukt", + "crawler_jobs": "Crawl Taken", + "background_jobs": "Achtergrondtaken", + "indexing_jobs": "Indexeer Taken", + "inference_jobs": "Inferentie Taken" }, - "options": { - "dark_mode": "Donkere Modus", - "light_mode": "Lichte Modus" + "users_list": { + "users_list": "Gebruikerslijst", + "delete_user": "Verwijder Gebruiker", + "num_bookmarks": "Aantal Bladwijzers", + "local_user": "Lokale Gebruiker", + "reset_password": "Reset Wachtwoord", + "create_user": "Maak Gebruiker Aan", + "change_role": "Wijzig Rol" }, - "lists": { - "all_lists": "Alle Lijsten", - "favourites": "Favorieten", - "new_list": "Nieuwe Lijst" + "admin_settings": "Admin Instellingen" + }, + "tags": { + "ai_tags": "AI Labels", + "sort_by_name": "Sorteer op naam", + "your_tags_info": "Labels die ten minste eenmaal toegekend zijn door jou", + "ai_tags_info": "Labels die automatisch toegekend zijn (door AI)", + "all_tags": "Alle Labels", + "your_tags": "Jouw Labels", + "drag_and_drop_merging": "Drag & Drop Samenvoegen", + "unused_tags": "Ongebruikte Labels", + "drag_and_drop_merging_info": "Sleep labels naar elkaar toe om ze samen te voegen", + "unused_tags_info": "Labels die niet toegekend zijn aan een bladwijzer", + "delete_all_unused_tags": "Verwijder Alle Ongebruikte Labels" + }, + "preview": { + "view_original": "Toon origineel" + }, + "editor": { + "text_toolbar": { + "bold": "Vetgedrukt" } + }, + "options": { + "dark_mode": "Donkere Modus", + "light_mode": "Lichte Modus" + }, + "lists": { + "all_lists": "Alle Lijsten", + "favourites": "Favorieten", + "new_list": "Nieuwe Lijst" + } } diff --git a/apps/web/lib/i18n/locales/pl/translation.json b/apps/web/lib/i18n/locales/pl/translation.json index d126825d..b072b56d 100644 --- a/apps/web/lib/i18n/locales/pl/translation.json +++ b/apps/web/lib/i18n/locales/pl/translation.json @@ -1,261 +1,261 @@ { - "common": { - "url": "URL", - "email": "E-mail", - "password": "Hasło", - "name": "Nazwa", - "action": "Akcja", - "created_at": "Utworzono", - "actions": "Akcje", - "roles": { - "user": "Użytkownik", - "admin": "Administrator" - }, - "key": "Klucz", - "role": "Rola", - "something_went_wrong": "Coś poszło nie tak", - "experimental": "Eksperymentalne", - "search": "Szukaj", - "tags": "Tagi", - "note": "Notatka", - "attachments": "Załączniki", - "screenshot": "Zrzut ekranu", - "video": "Wideo", - "archive": "Archiwum", - "home": "Strona główna" + "common": { + "url": "URL", + "email": "E-mail", + "password": "Hasło", + "name": "Nazwa", + "action": "Akcja", + "created_at": "Utworzono", + "actions": "Akcje", + "roles": { + "user": "Użytkownik", + "admin": "Administrator" }, - "actions": { - "remove_from_list": "Usuń z listy", - "summarize_with_ai": "Streszcz z AI", - "close": "Zamknij", - "ignore": "Ignoruj", - "change_layout": "Zmień układ", - "archive": "Zarchiwizuj", - "unarchive": "Odarchiwizuj", - "favorite": "Dodaj do ulubionych", - "delete": "Usuń", - "refresh": "Odśwież", - "recrawl": "Ponowne skanowanie", - "download_full_page_archive": "Pobierz pełne archiwum strony", - "unfavorite": "Usuń z ulubionych", - "edit_tags": "Edytuj tagi", - "add_to_list": "Dodaj do listy", - "select_all": "Zaznacz wszystko", - "unselect_all": "Odznacz wszystko", - "copy_link": "Kopiuj link", - "close_bulk_edit": "Zamknij masową edycję", - "bulk_edit": "Masowa edycja", - "manage_lists": "Zarządzaj listami", - "save": "Zapisz", - "add": "Dodaj", - "edit": "Edytuj", - "create": "Utwórz", - "fetch_now": "Pobierz teraz", - "edit_title": "Edytuj tytuł", - "sign_out": "Wyloguj się", - "merge": "Scal", - "cancel": "Anuluj", - "apply_all": "Zastosuj wszystko" + "key": "Klucz", + "role": "Rola", + "something_went_wrong": "Coś poszło nie tak", + "experimental": "Eksperymentalne", + "search": "Szukaj", + "tags": "Tagi", + "note": "Notatka", + "attachments": "Załączniki", + "screenshot": "Zrzut ekranu", + "video": "Wideo", + "archive": "Archiwum", + "home": "Strona główna" + }, + "actions": { + "remove_from_list": "Usuń z listy", + "summarize_with_ai": "Streszcz z AI", + "close": "Zamknij", + "ignore": "Ignoruj", + "change_layout": "Zmień układ", + "archive": "Zarchiwizuj", + "unarchive": "Odarchiwizuj", + "favorite": "Dodaj do ulubionych", + "delete": "Usuń", + "refresh": "Odśwież", + "recrawl": "Ponowne skanowanie", + "download_full_page_archive": "Pobierz pełne archiwum strony", + "unfavorite": "Usuń z ulubionych", + "edit_tags": "Edytuj tagi", + "add_to_list": "Dodaj do listy", + "select_all": "Zaznacz wszystko", + "unselect_all": "Odznacz wszystko", + "copy_link": "Kopiuj link", + "close_bulk_edit": "Zamknij masową edycję", + "bulk_edit": "Masowa edycja", + "manage_lists": "Zarządzaj listami", + "save": "Zapisz", + "add": "Dodaj", + "edit": "Edytuj", + "create": "Utwórz", + "fetch_now": "Pobierz teraz", + "edit_title": "Edytuj tytuł", + "sign_out": "Wyloguj się", + "merge": "Scal", + "cancel": "Anuluj", + "apply_all": "Zastosuj wszystko" + }, + "settings": { + "info": { + "confirm_new_password": "Potwierdź nowe hasło", + "user_info": "Informacje o użytkowniku", + "basic_details": "Podstawowe dane", + "change_password": "Zmień hasło", + "current_password": "Obecne hasło", + "new_password": "Nowe hasło", + "options": "Opcje", + "interface_lang": "Język interfejsu" }, - "settings": { - "info": { - "confirm_new_password": "Potwierdź nowe hasło", - "user_info": "Informacje o użytkowniku", - "basic_details": "Podstawowe dane", - "change_password": "Zmień hasło", - "current_password": "Obecne hasło", - "new_password": "Nowe hasło", - "options": "Opcje", - "interface_lang": "Język interfejsu" - }, - "import": { - "import_bookmarks_from_html_file": "Importuj zakładki z pliku HTML", - "import_bookmarks_from_pocket_export": "Importuj zakładki z eksportu Pocket", - "import_export": "Import / Eksport", - "import_export_bookmarks": "Import / Eksport zakładek", - "import_bookmarks_from_omnivore_export": "Importuj zakładki z eksportu Omnivore", - "import_bookmarks_from_hoarder_export": "Importuj zakładki z eksportu Hoarder", - "export_links_and_notes": "Eksportuj linki i notatki", - "imported_bookmarks": "Zaimportowane zakładki" - }, - "back_to_app": "Powrót do aplikacji", - "user_settings": "Ustawienia użytkownika", - "ai": { - "ai_settings": "Ustawienia AI", - "tagging_rules": "Zasady tagowania", - "tagging_rule_description": "Wpisane tutaj podpowiedzi będą uwzględniane jako zasady podczas generowania tagów. Możesz zobaczyć ostateczne podpowiedzi w sekcji podglądu.", - "prompt_preview": "Podgląd podpowiedzi", - "text_prompt": "Podpowiedź tekstowa", - "images_prompt": "Podpowiedź obrazowa" - }, - "feeds": { - "rss_subscriptions": "Subskrypcje RSS", - "add_a_subscription": "Dodaj subskrypcję" - }, - "api_keys": { - "api_keys": "Klucze API", - "new_api_key": "Nowy klucz API", - "new_api_key_desc": "Nadaj swojemu kluczowi API unikalną nazwę", - "key_success": "Klucz został pomyślnie utworzony", - "key_success_please_copy": "Skopiuj klucz i przechowaj go w bezpiecznym miejscu. Po zamknięciu tego okna dialogowego nie będzie można go ponownie zobaczyć." - }, - "broken_links": { - "broken_links": "Uszkodzone linki", - "last_crawled_at": "Ostatnie skanowanie", - "crawling_status": "Status skanowania", - "crawling_failed": "Skanowanie nieudane" - } + "import": { + "import_bookmarks_from_html_file": "Importuj zakładki z pliku HTML", + "import_bookmarks_from_pocket_export": "Importuj zakładki z eksportu Pocket", + "import_export": "Import / Eksport", + "import_export_bookmarks": "Import / Eksport zakładek", + "import_bookmarks_from_omnivore_export": "Importuj zakładki z eksportu Omnivore", + "import_bookmarks_from_hoarder_export": "Importuj zakładki z eksportu Hoarder", + "export_links_and_notes": "Eksportuj linki i notatki", + "imported_bookmarks": "Zaimportowane zakładki" + }, + "back_to_app": "Powrót do aplikacji", + "user_settings": "Ustawienia użytkownika", + "ai": { + "ai_settings": "Ustawienia AI", + "tagging_rules": "Zasady tagowania", + "tagging_rule_description": "Wpisane tutaj podpowiedzi będą uwzględniane jako zasady podczas generowania tagów. Możesz zobaczyć ostateczne podpowiedzi w sekcji podglądu.", + "prompt_preview": "Podgląd podpowiedzi", + "text_prompt": "Podpowiedź tekstowa", + "images_prompt": "Podpowiedź obrazowa" + }, + "feeds": { + "rss_subscriptions": "Subskrypcje RSS", + "add_a_subscription": "Dodaj subskrypcję" + }, + "api_keys": { + "api_keys": "Klucze API", + "new_api_key": "Nowy klucz API", + "new_api_key_desc": "Nadaj swojemu kluczowi API unikalną nazwę", + "key_success": "Klucz został pomyślnie utworzony", + "key_success_please_copy": "Skopiuj klucz i przechowaj go w bezpiecznym miejscu. Po zamknięciu tego okna dialogowego nie będzie można go ponownie zobaczyć." + }, + "broken_links": { + "broken_links": "Uszkodzone linki", + "last_crawled_at": "Ostatnie skanowanie", + "crawling_status": "Status skanowania", + "crawling_failed": "Skanowanie nieudane" + } + }, + "admin": { + "users_list": { + "reset_password": "Resetuj hasło", + "num_bookmarks": "Liczba zakładek", + "asset_sizes": "Rozmiary zasobów", + "users_list": "Lista użytkowników", + "create_user": "Utwórz użytkownika", + "change_role": "Zmień rolę", + "delete_user": "Usuń użytkownika", + "local_user": "Lokalny użytkownik", + "confirm_password": "Potwierdź hasło" + }, + "admin_settings": "Ustawienia administratora", + "server_stats": { + "server_stats": "Statystyki serwera", + "total_users": "Łączna liczba użytkowników", + "total_bookmarks": "Łączna liczba zakładek", + "server_version": "Wersja serwera" + }, + "background_jobs": { + "background_jobs": "Zadania w tle", + "crawler_jobs": "Zadania skanowania", + "indexing_jobs": "Zadania indeksowania", + "inference_jobs": "Zadania wnioskowania", + "tidy_assets_jobs": "Zadania porządkowania zasobów", + "job": "Zadanie", + "queued": "W kolejce", + "pending": "Oczekujące", + "failed": "Nieudane" }, - "admin": { - "users_list": { - "reset_password": "Resetuj hasło", - "num_bookmarks": "Liczba zakładek", - "asset_sizes": "Rozmiary zasobów", - "users_list": "Lista użytkowników", - "create_user": "Utwórz użytkownika", - "change_role": "Zmień rolę", - "delete_user": "Usuń użytkownika", - "local_user": "Lokalny użytkownik", - "confirm_password": "Potwierdź hasło" + "actions": { + "recrawl_failed_links_only": "Ponowne skanowanie tylko nieudanych linków", + "recrawl_all_links": "Ponowne skanowanie wszystkich linków", + "without_inference": "Bez wnioskowania", + "regenerate_ai_tags_for_failed_bookmarks_only": "Regeneruj tagi AI tylko dla nieudanych zakładek", + "regenerate_ai_tags_for_all_bookmarks": "Regeneruj tagi AI dla wszystkich zakładek", + "reindex_all_bookmarks": "Ponowne indeksowanie wszystkich zakładek", + "compact_assets": "Kompaktuj zasoby" + } + }, + "tags": { + "delete_all_unused_tags": "Usuń wszystkie nieużywane tagi", + "all_tags": "Wszystkie tagi", + "your_tags": "Twoje tagi", + "your_tags_info": "Tagi, które były przynajmniej raz przez Ciebie użyte", + "ai_tags": "Tagi AI", + "drag_and_drop_merging": "Scalanie za pomocą przeciągania", + "ai_tags_info": "Tagi, które zostały dodane automatycznie (przez AI)", + "unused_tags": "Nieużywane tagi", + "unused_tags_info": "Tagi, które nie są przypisane do żadnych zakładek", + "drag_and_drop_merging_info": "Przeciągnij i upuść tagi na siebie, aby je scalić", + "sort_by_name": "Sortuj według nazwy" + }, + "editor": { + "text_toolbar": { + "markdown_shortcuts": { + "italic": { + "label": "Kursywa", + "example": "*Kursywa* lub _Kursywa_ lub CTRL+i" }, - "admin_settings": "Ustawienia administratora", - "server_stats": { - "server_stats": "Statystyki serwera", - "total_users": "Łączna liczba użytkowników", - "total_bookmarks": "Łączna liczba zakładek", - "server_version": "Wersja serwera" + "unordered_list": { + "example": "- Element listy", + "label": "Lista nieuporządkowana" }, - "background_jobs": { - "background_jobs": "Zadania w tle", - "crawler_jobs": "Zadania skanowania", - "indexing_jobs": "Zadania indeksowania", - "inference_jobs": "Zadania wnioskowania", - "tidy_assets_jobs": "Zadania porządkowania zasobów", - "job": "Zadanie", - "queued": "W kolejce", - "pending": "Oczekujące", - "failed": "Nieudane" + "label": "Skróty Markdown", + "heading": { + "label": "Nagłówek", + "example": "# H1, ## H2, ### H3" }, - "actions": { - "recrawl_failed_links_only": "Ponowne skanowanie tylko nieudanych linków", - "recrawl_all_links": "Ponowne skanowanie wszystkich linków", - "without_inference": "Bez wnioskowania", - "regenerate_ai_tags_for_failed_bookmarks_only": "Regeneruj tagi AI tylko dla nieudanych zakładek", - "regenerate_ai_tags_for_all_bookmarks": "Regeneruj tagi AI dla wszystkich zakładek", - "reindex_all_bookmarks": "Ponowne indeksowanie wszystkich zakładek", - "compact_assets": "Kompaktuj zasoby" - } - }, - "tags": { - "delete_all_unused_tags": "Usuń wszystkie nieużywane tagi", - "all_tags": "Wszystkie tagi", - "your_tags": "Twoje tagi", - "your_tags_info": "Tagi, które były przynajmniej raz przez Ciebie użyte", - "ai_tags": "Tagi AI", - "drag_and_drop_merging": "Scalanie za pomocą przeciągania", - "ai_tags_info": "Tagi, które zostały dodane automatycznie (przez AI)", - "unused_tags": "Nieużywane tagi", - "unused_tags_info": "Tagi, które nie są przypisane do żadnych zakładek", - "drag_and_drop_merging_info": "Przeciągnij i upuść tagi na siebie, aby je scalić", - "sort_by_name": "Sortuj według nazwy" - }, - "editor": { - "text_toolbar": { - "markdown_shortcuts": { - "italic": { - "label": "Kursywa", - "example": "*Kursywa* lub _Kursywa_ lub CTRL+i" - }, - "unordered_list": { - "example": "- Element listy", - "label": "Lista nieuporządkowana" - }, - "label": "Skróty Markdown", - "heading": { - "label": "Nagłówek", - "example": "# H1, ## H2, ### H3" - }, - "bold": { - "label": "Pogrubienie", - "example": "**tekst** lub CTRL+b" - }, - "blockquote": { - "label": "Cytat", - "example": "> Cytat" - }, - "ordered_list": { - "label": "Lista uporządkowana", - "example": "1. Element listy" - }, - "inline_code": { - "label": "Kod w linii", - "example": "`Kod`" - }, - "block_code": { - "label": "Kod blokowy", - "example": "``` + spacja" - } - }, - "undo": "Cofnij", - "redo": "Ponów", - "bold": "Pogrubienie", - "italic": "Kursywa", - "underline": "Podkreślenie", - "strikethrough": "Przekreślenie", - "code": "Kod", - "highlight": "Podświetlenie", - "align_left": "Wyrównaj do lewej", - "align_center": "Wyśrodkuj", - "align_right": "Wyrównaj do prawej" + "bold": { + "label": "Pogrubienie", + "example": "**tekst** lub CTRL+b" }, - "quickly_focus": "Możesz szybko skupić się na tym polu, naciskając ⌘ + E", - "multiple_urls_dialog_desc": "Wprowadzone dane zawierają wiele adresów URL w osobnych liniach. Czy chcesz zaimportować je jako oddzielne zakładki?", - "multiple_urls_dialog_title": "Importować URL jako oddzielne zakładki?", - "import_as_text": "Importuj jako zakładkę tekstową", - "import_as_separate_bookmarks": "Importuj jako oddzielne zakładki", - "new_item": "NOWY ELEMENT", - "disabled_submissions": "Dodawanie jest wyłączone", - "placeholder": "Wklej link lub obraz, napisz notatkę lub przeciągnij obraz tutaj..." - }, - "cleanups": { - "duplicate_tags": { - "merge_all_suggestions": "Scal wszystkie sugestie?", - "title": "Zduplikowane tagi" + "blockquote": { + "label": "Cytat", + "example": "> Cytat" }, - "cleanups": "Porządki" - }, - "toasts": { - "lists": { - "created": "Lista została utworzona!", - "updated": "Lista została zaktualizowana!" + "ordered_list": { + "label": "Lista uporządkowana", + "example": "1. Element listy" + }, + "inline_code": { + "label": "Kod w linii", + "example": "`Kod`" }, - "bookmarks": { - "updated": "Zakładka została zaktualizowana!", - "deleted": "Zakładka została usunięta!", - "refetch": "Pobieranie ponownie zostało zaplanowane!", - "full_page_archive": "Tworzenie pełnego archiwum strony zostało rozpoczęte", - "delete_from_list": "Zakładka została usunięta z listy", - "clipboard_copied": "Link został skopiowany do schowka!" + "block_code": { + "label": "Kod blokowy", + "example": "``` + spacja" } + }, + "undo": "Cofnij", + "redo": "Ponów", + "bold": "Pogrubienie", + "italic": "Kursywa", + "underline": "Podkreślenie", + "strikethrough": "Przekreślenie", + "code": "Kod", + "highlight": "Podświetlenie", + "align_left": "Wyrównaj do lewej", + "align_center": "Wyśrodkuj", + "align_right": "Wyrównaj do prawej" }, - "layouts": { - "masonry": "Mozaika", - "grid": "Siatka", - "list": "Lista", - "compact": "Kompaktowy" - }, - "options": { - "dark_mode": "Tryb ciemny", - "light_mode": "Tryb jasny" + "quickly_focus": "Możesz szybko skupić się na tym polu, naciskając ⌘ + E", + "multiple_urls_dialog_desc": "Wprowadzone dane zawierają wiele adresów URL w osobnych liniach. Czy chcesz zaimportować je jako oddzielne zakładki?", + "multiple_urls_dialog_title": "Importować URL jako oddzielne zakładki?", + "import_as_text": "Importuj jako zakładkę tekstową", + "import_as_separate_bookmarks": "Importuj jako oddzielne zakładki", + "new_item": "NOWY ELEMENT", + "disabled_submissions": "Dodawanie jest wyłączone", + "placeholder": "Wklej link lub obraz, napisz notatkę lub przeciągnij obraz tutaj..." + }, + "cleanups": { + "duplicate_tags": { + "merge_all_suggestions": "Scal wszystkie sugestie?", + "title": "Zduplikowane tagi" }, + "cleanups": "Porządki" + }, + "toasts": { "lists": { - "all_lists": "Wszystkie listy", - "favourites": "Ulubione", - "new_list": "Nowa lista", - "new_nested_list": "Nowa zagnieżdżona lista" + "created": "Lista została utworzona!", + "updated": "Lista została zaktualizowana!" }, - "preview": { - "view_original": "Zobacz oryginał", - "cached_content": "Zbuforowana zawartość" + "bookmarks": { + "updated": "Zakładka została zaktualizowana!", + "deleted": "Zakładka została usunięta!", + "refetch": "Pobieranie ponownie zostało zaplanowane!", + "full_page_archive": "Tworzenie pełnego archiwum strony zostało rozpoczęte", + "delete_from_list": "Zakładka została usunięta z listy", + "clipboard_copied": "Link został skopiowany do schowka!" } + }, + "layouts": { + "masonry": "Mozaika", + "grid": "Siatka", + "list": "Lista", + "compact": "Kompaktowy" + }, + "options": { + "dark_mode": "Tryb ciemny", + "light_mode": "Tryb jasny" + }, + "lists": { + "all_lists": "Wszystkie listy", + "favourites": "Ulubione", + "new_list": "Nowa lista", + "new_nested_list": "Nowa zagnieżdżona lista" + }, + "preview": { + "view_original": "Zobacz oryginał", + "cached_content": "Zbuforowana zawartość" + } } diff --git a/packages/shared/langs.ts b/packages/shared/langs.ts index 82e1fe37..7c6226eb 100644 --- a/packages/shared/langs.ts +++ b/packages/shared/langs.ts @@ -2,6 +2,7 @@ export const langNameMappings: Record<string, string> = { en: "English", de: "German", fr: "French", + pl: "Polish", sv: "Swedish", zh: "Simplified Chinese", zhtw: "Traditional Chinese", diff --git a/packages/trpc/routers/bookmarks.ts b/packages/trpc/routers/bookmarks.ts index 9708706a..8a4170cd 100644 --- a/packages/trpc/routers/bookmarks.ts +++ b/packages/trpc/routers/bookmarks.ts @@ -515,9 +515,25 @@ export const bookmarksAppRouter = router({ .input( z.object({ text: z.string(), + cursor: z + .object({ + offset: z.number(), + limit: z.number(), + }) + .nullish(), + }), + ) + .output( + z.object({ + bookmarks: z.array(zBookmarkSchema), + nextCursor: z + .object({ + offset: z.number(), + limit: z.number(), + }) + .nullable(), }), ) - .output(zGetBookmarksResponseSchema) .query(async ({ input, ctx }) => { const client = await getSearchIdxClient(); if (!client) { @@ -531,6 +547,12 @@ export const bookmarksAppRouter = router({ showRankingScore: true, attributesToRetrieve: ["id"], sort: ["createdAt:desc"], + ...(input.cursor + ? { + offset: input.cursor.offset, + limit: input.cursor.limit, + } + : {}), }); if (resp.hits.length == 0) { @@ -562,7 +584,16 @@ export const bookmarksAppRouter = router({ }); results.sort((a, b) => idToRank[b.id] - idToRank[a.id]); - return { bookmarks: results.map(toZodSchema), nextCursor: null }; + return { + bookmarks: results.map(toZodSchema), + nextCursor: + resp.hits.length + resp.offset >= resp.estimatedTotalHits + ? null + : { + offset: resp.hits.length + resp.offset, + limit: resp.limit, + }, + }; }), getBookmarks: authedProcedure .input(zGetBookmarksRequestSchema) |
