aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--apps/mobile/app/dashboard/search.tsx15
-rw-r--r--apps/web/app/dashboard/search/page.tsx10
-rw-r--r--apps/web/components/dashboard/bookmarks/UpdatableBookmarksGrid.tsx2
-rw-r--r--apps/web/lib/hooks/bookmark-search.ts32
-rw-r--r--apps/web/lib/i18n/locales/es/translation.json154
-rw-r--r--apps/web/lib/i18n/locales/nl/translation.json302
-rw-r--r--apps/web/lib/i18n/locales/pl/translation.json488
-rw-r--r--packages/shared/langs.ts1
-rw-r--r--packages/trpc/routers/bookmarks.ts35
10 files changed, 550 insertions, 492 deletions
diff --git a/.gitignore b/.gitignore
index eca8879e..8bc17e43 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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)