From 3bcb1e10d3e97309ff8ede707dc5c3c057ba27ca Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Thu, 2 Jan 2025 11:45:31 +0000 Subject: fix: Add i18n for query explainer and add missing url matcher --- apps/browser-extension/tsconfig.json | 2 +- .../dashboard/search/QueryExplainerTooltip.tsx | 71 +++++++++++++++++----- apps/web/lib/i18n/locales/en/translation.json | 23 +++++++ 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 ( - {matcher.inverse ? "Doesn't have" : "Has"} Tag + {matcher.inverse + ? t("search.does_not_have_tag") + : t("search.has_tag")} {matcher.tagName} @@ -32,7 +36,9 @@ export default function QueryExplainerTooltip({ return ( - {matcher.inverse ? "Is not in" : "Is in "} List + {matcher.inverse + ? t("search.is_not_in_list") + : t("search.is_in_list")} {matcher.listName} @@ -40,50 +46,72 @@ export default function QueryExplainerTooltip({ case "dateAfter": return ( - {matcher.inverse ? "Not" : ""} Created After + + {matcher.inverse + ? t("search.not_created_on_or_after") + : t("search.created_on_or_after")} + {matcher.dateAfter.toDateString()} ); case "dateBefore": return ( - {matcher.inverse ? "Not" : ""} Created Before + + {matcher.inverse + ? t("search.not_created_on_or_before") + : t("search.created_on_or_before")} + {matcher.dateBefore.toDateString()} ); case "favourited": return ( - Favourited - {matcher.favourited.toString()} + + {matcher.favourited + ? t("search.is_favorited") + : t("search.is_not_favorited")} + ); case "archived": return ( - Archived - {matcher.archived.toString()} + + {matcher.archived + ? t("search.is_archived") + : t("search.is_not_archived")} + ); case "tagged": return ( - Has Tags - {matcher.tagged.toString()} + + {matcher.tagged + ? t("search.has_any_tag") + : t("search.has_no_tags")} + ); case "inlist": return ( - In Any List - {matcher.inList.toString()} + + {matcher.inList + ? t("search.is_in_any_list") + : t("search.is_not_in_any_list")} + ); case "and": case "or": return ( - {matcher.type} + + {matcher.type === "and" ? t("search.and") : t("search.or")} + @@ -95,6 +123,21 @@ export default function QueryExplainerTooltip({ ); + case "url": + return ( + + + {matcher.inverse + ? t("search.url_does_not_contain") + : t("search.url_contains")} + + {matcher.url} + + ); + default: { + const _exhaustiveCheck: never = matcher; + return null; + } } }; @@ -105,7 +148,7 @@ export default function QueryExplainerTooltip({ {parsedSearchQuery.text && ( - Text + {t("search.full_text_search")} {parsedSearchQuery.text} )} 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"); } } -- cgit v1.2.3-70-g09d2