diff options
| author | Mohamed Bassem <me@mbassem.com> | 2025-01-02 11:45:31 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2025-01-02 11:45:51 +0000 |
| commit | 3bcb1e10d3e97309ff8ede707dc5c3c057ba27ca (patch) | |
| tree | 3e91a26863a1476059bbac111f6d6bf39a909fba | |
| parent | 5ecdc36b7d60aa66b49e01e9fec8ba61ad537376 (diff) | |
| download | karakeep-3bcb1e10d3e97309ff8ede707dc5c3c057ba27ca.tar.zst | |
fix: Add i18n for query explainer and add missing url matcher
| -rw-r--r-- | apps/browser-extension/tsconfig.json | 2 | ||||
| -rw-r--r-- | apps/web/components/dashboard/search/QueryExplainerTooltip.tsx | 71 | ||||
| -rw-r--r-- | apps/web/lib/i18n/locales/en/translation.json | 23 | ||||
| -rw-r--r-- | packages/trpc/lib/search.ts | 1 |
4 files changed, 82 insertions, 15 deletions
diff --git a/apps/browser-extension/tsconfig.json b/apps/browser-extension/tsconfig.json index f77e7f00..b9bc1c46 100644 --- a/apps/browser-extension/tsconfig.json +++ b/apps/browser-extension/tsconfig.json @@ -16,7 +16,7 @@ "jsx": "react-jsx", "strict": true, - "noUnusedLocals": true, + "noUnusedLocals": false, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true }, diff --git a/apps/web/components/dashboard/search/QueryExplainerTooltip.tsx b/apps/web/components/dashboard/search/QueryExplainerTooltip.tsx index 13174fb2..f5f73be3 100644 --- a/apps/web/components/dashboard/search/QueryExplainerTooltip.tsx +++ b/apps/web/components/dashboard/search/QueryExplainerTooltip.tsx @@ -1,5 +1,6 @@ import InfoTooltip from "@/components/ui/info-tooltip"; import { Table, TableBody, TableCell, TableRow } from "@/components/ui/table"; +import { useTranslation } from "@/lib/i18n/client"; import { TextAndMatcher } from "@hoarder/shared/searchQueryParser"; import { Matcher } from "@hoarder/shared/types/search"; @@ -13,6 +14,7 @@ export default function QueryExplainerTooltip({ parsedSearchQuery: TextAndMatcher & { result: string }; className?: string; }) { + const { t } = useTranslation(); if (parsedSearchQuery.result == "invalid") { return null; } @@ -23,7 +25,9 @@ export default function QueryExplainerTooltip({ return ( <TableRow> <TableCell> - {matcher.inverse ? "Doesn't have" : "Has"} Tag + {matcher.inverse + ? t("search.does_not_have_tag") + : t("search.has_tag")} </TableCell> <TableCell>{matcher.tagName}</TableCell> </TableRow> @@ -32,7 +36,9 @@ export default function QueryExplainerTooltip({ return ( <TableRow> <TableCell> - {matcher.inverse ? "Is not in" : "Is in "} List + {matcher.inverse + ? t("search.is_not_in_list") + : t("search.is_in_list")} </TableCell> <TableCell>{matcher.listName}</TableCell> </TableRow> @@ -40,50 +46,72 @@ export default function QueryExplainerTooltip({ case "dateAfter": return ( <TableRow> - <TableCell>{matcher.inverse ? "Not" : ""} Created After</TableCell> + <TableCell> + {matcher.inverse + ? t("search.not_created_on_or_after") + : t("search.created_on_or_after")} + </TableCell> <TableCell>{matcher.dateAfter.toDateString()}</TableCell> </TableRow> ); case "dateBefore": return ( <TableRow> - <TableCell>{matcher.inverse ? "Not" : ""} Created Before</TableCell> + <TableCell> + {matcher.inverse + ? t("search.not_created_on_or_before") + : t("search.created_on_or_before")} + </TableCell> <TableCell>{matcher.dateBefore.toDateString()}</TableCell> </TableRow> ); case "favourited": return ( <TableRow> - <TableCell>Favourited</TableCell> - <TableCell>{matcher.favourited.toString()}</TableCell> + <TableCell colSpan={2} className="text-center"> + {matcher.favourited + ? t("search.is_favorited") + : t("search.is_not_favorited")} + </TableCell> </TableRow> ); case "archived": return ( <TableRow> - <TableCell>Archived</TableCell> - <TableCell>{matcher.archived.toString()}</TableCell> + <TableCell colSpan={2} className="text-center"> + {matcher.archived + ? t("search.is_archived") + : t("search.is_not_archived")} + </TableCell> </TableRow> ); case "tagged": return ( <TableRow> - <TableCell>Has Tags</TableCell> - <TableCell>{matcher.tagged.toString()}</TableCell> + <TableCell colSpan={2} className="text-center"> + {matcher.tagged + ? t("search.has_any_tag") + : t("search.has_no_tags")} + </TableCell> </TableRow> ); case "inlist": return ( <TableRow> - <TableCell>In Any List</TableCell> - <TableCell>{matcher.inList.toString()}</TableCell> + <TableCell colSpan={2} className="text-center"> + {matcher.inList + ? t("search.is_in_any_list") + : t("search.is_not_in_any_list")} + </TableCell> </TableRow> ); case "and": case "or": return ( <TableRow> - <TableCell className="capitalize">{matcher.type}</TableCell> + <TableCell> + {matcher.type === "and" ? t("search.and") : t("search.or")} + </TableCell> <TableCell> <Table> <TableBody> @@ -95,6 +123,21 @@ export default function QueryExplainerTooltip({ </TableCell> </TableRow> ); + case "url": + return ( + <TableRow> + <TableCell> + {matcher.inverse + ? t("search.url_does_not_contain") + : t("search.url_contains")} + </TableCell> + <TableCell>{matcher.url}</TableCell> + </TableRow> + ); + default: { + const _exhaustiveCheck: never = matcher; + return null; + } } }; @@ -105,7 +148,7 @@ export default function QueryExplainerTooltip({ <TableBody> {parsedSearchQuery.text && ( <TableRow> - <TableCell>Text</TableCell> + <TableCell>{t("search.full_text_search")}</TableCell> <TableCell>{parsedSearchQuery.text}</TableCell> </TableRow> )} diff --git a/apps/web/lib/i18n/locales/en/translation.json b/apps/web/lib/i18n/locales/en/translation.json index 27799121..e1bd443a 100644 --- a/apps/web/lib/i18n/locales/en/translation.json +++ b/apps/web/lib/i18n/locales/en/translation.json @@ -188,6 +188,29 @@ "drag_and_drop_merging_info": "Drag and drop tags on each other to merge them", "sort_by_name": "Sort by Name" }, + "search": { + "is_favorited": "Is Favorited", + "is_not_favorited": "Is Not Favorited", + "is_archived": "Is Archived", + "is_not_archived": "Is Not Archived", + "has_any_tag": "Has Any Tag", + "has_no_tags": "Has No Tag", + "is_in_any_list": "Is In Any List", + "is_not_in_any_list": "Is not In Any List", + "created_on_or_after": "Created on or After", + "not_created_on_or_after": "Not Created on or After", + "created_on_or_before": "Created on or Before", + "not_created_on_or_before": "Not Created on or Before", + "url_contains": "URL Contains", + "url_does_not_contain": "URL Does Not Contain", + "is_in_list": "Is In List", + "is_not_in_list": "Is not In List", + "has_tag": "Has Tag", + "does_not_have_tag": "Does Not Have Tag", + "full_text_search": "Full Text Search", + "and": "And", + "or": "Or" + }, "preview": { "view_original": "View Original", "cached_content": "Cached Content" diff --git a/packages/trpc/lib/search.ts b/packages/trpc/lib/search.ts index e7e6b5f7..74aaf51b 100644 --- a/packages/trpc/lib/search.ts +++ b/packages/trpc/lib/search.ts @@ -246,6 +246,7 @@ async function getIds( return union(vals); } default: { + const _exhaustiveCheck: never = matcher; throw new Error("Unknown matcher type"); } } |
