From 780feba19c26f01274e457744f099480668ed763 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 10:26:20 -0700 Subject: [PATCH] Translate the member page --- messages/en-US.json | 45 +++++- src/components/MemberResourcesPortal.tsx | 170 +++++++++++++++-------- 2 files changed, 154 insertions(+), 61 deletions(-) diff --git a/messages/en-US.json b/messages/en-US.json index ee4ef143d..3e1b29d88 100644 --- a/messages/en-US.json +++ b/messages/en-US.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Wildcard resources may require additional configuration to work properly.", "domainPickerWildcardCertWarningLink": "Learn more", "health": "Health", - "domainPendingErrorTitle": "Verification Issue" + "domainPendingErrorTitle": "Verification Issue", + "memberPortalTitle": "Resources", + "memberPortalDescription": "Resources you have access to in this organization", + "memberPortalSortBy": "Sort by...", + "memberPortalSortNameAsc": "Name A-Z", + "memberPortalSortNameDesc": "Name Z-A", + "memberPortalSortDomainAsc": "Domain A-Z", + "memberPortalSortDomainDesc": "Domain Z-A", + "memberPortalSortEnabledFirst": "Enabled First", + "memberPortalSortDisabledFirst": "Disabled First", + "memberPortalRefresh": "Refresh", + "memberPortalRefreshResources": "Refresh Resources", + "memberPortalFailedToLoad": "Failed to load resources", + "memberPortalFailedToLoadDescription": "Failed to load resources. Please check your connection and try again.", + "memberPortalUnableToLoad": "Unable to Load Resources", + "memberPortalTryAgain": "Try Again", + "memberPortalNoResourcesFound": "No Resources Found", + "memberPortalNoResourcesAvailable": "No Resources Available", + "memberPortalNoResourcesMatchSearch": "No resources match \"{query}\". Try adjusting your search terms or clearing the search to see all resources.", + "memberPortalNoResourcesAccess": "You don't have access to any resources yet. Contact your administrator to get access to resources you need.", + "memberPortalClearSearch": "Clear Search", + "memberPortalPublicResources": "Public Resources", + "memberPortalPublicResourcesDescription": "Web applications and services accessible via browser", + "memberPortalCopiedToClipboard": "Copied to clipboard", + "memberPortalCopiedUrlDescription": "Resource URL has been copied to your clipboard.", + "memberPortalOpenResource": "Open Resource", + "memberPortalPrivateResources": "Private Resources", + "memberPortalPrivateResourcesDescription": "Internal network resources accessible via client", + "memberPortalResourceDetails": "Resource Details", + "memberPortalMode": "Mode", + "memberPortalDestination": "Destination", + "memberPortalAlias": "Alias", + "memberPortalCopiedAliasDescription": "Resource alias has been copied to your clipboard.", + "memberPortalCopiedDestinationDescription": "Resource destination has been copied to your clipboard.", + "memberPortalRequiresClientConnection": "Requires Client Connection", + "memberPortalAuthMethods": "Authentication Methods", + "memberPortalSso": "Single Sign-On (SSO)", + "memberPortalPasswordProtected": "Password Protected", + "memberPortalPinCode": "PIN Code", + "memberPortalEmailWhitelist": "Email Whitelist", + "memberPortalResourceDisabled": "Resource Disabled", + "memberPortalShowingResources": "Showing {start}-{end} of {total} resources", + "memberPortalPrevious": "Previous", + "memberPortalNext": "Next" } diff --git a/src/components/MemberResourcesPortal.tsx b/src/components/MemberResourcesPortal.tsx index 0ca6c550b..b350be06b 100644 --- a/src/components/MemberResourcesPortal.tsx +++ b/src/components/MemberResourcesPortal.tsx @@ -123,6 +123,7 @@ const ResourceFavicon = ({ // Resource Info component const ResourceInfo = ({ resource }: { resource: Resource }) => { + const t = useTranslations(); const hasAuthMethods = resource.sso || resource.password || @@ -141,7 +142,9 @@ const ResourceInfo = ({ resource }: { resource: Resource }) => { {/* Site Information */} {resource.siteName && (
-
Site
+
+ {t("site")} +
{resource.siteName} @@ -157,7 +160,7 @@ const ResourceInfo = ({ resource }: { resource: Resource }) => { } >
- Authentication Methods + {t("memberPortalAuthMethods")}
{resource.sso && ( @@ -166,7 +169,7 @@ const ResourceInfo = ({ resource }: { resource: Resource }) => {
- Single Sign-On (SSO) + {t("memberPortalSso")}
)} @@ -176,7 +179,7 @@ const ResourceInfo = ({ resource }: { resource: Resource }) => {
- Password Protected + {t("memberPortalPasswordProtected")} )} @@ -185,7 +188,9 @@ const ResourceInfo = ({ resource }: { resource: Resource }) => {
- PIN Code + + {t("memberPortalPinCode")} + )} {resource.whitelist && ( @@ -193,7 +198,9 @@ const ResourceInfo = ({ resource }: { resource: Resource }) => {
- Email Whitelist + + {t("memberPortalEmailWhitelist")} + )} @@ -208,7 +215,7 @@ const ResourceInfo = ({ resource }: { resource: Resource }) => {
- Resource Disabled + {t("memberPortalResourceDisabled")}
@@ -233,6 +240,7 @@ const PaginationControls = ({ totalItems: number; itemsPerPage: number; }) => { + const t = useTranslations(); const startItem = (currentPage - 1) * itemsPerPage + 1; const endItem = Math.min(currentPage * itemsPerPage, totalItems); @@ -241,7 +249,11 @@ const PaginationControls = ({ return (
- Showing {startItem}-{endItem} of {totalItems} resources + {t("memberPortalShowingResources", { + start: startItem, + end: endItem, + total: totalItems + })}
@@ -253,7 +265,7 @@ const PaginationControls = ({ className="gap-1" > - Previous + {t("memberPortalPrevious")}
@@ -309,7 +321,7 @@ const PaginationControls = ({ disabled={currentPage === totalPages} className="gap-1" > - Next + {t("memberPortalNext")}
@@ -389,13 +401,11 @@ export default function MemberResourcesPortal({ response.data.data.siteResources || [] ); } else { - setError("Failed to load resources"); + setError(t("memberPortalFailedToLoad")); } } catch (err) { console.error("Error fetching user resources:", err); - setError( - "Failed to load resources. Please check your connection and try again." - ); + setError(t("memberPortalFailedToLoadDescription")); } finally { setLoading(false); setRefreshing(false); @@ -526,8 +536,8 @@ export default function MemberResourcesPortal({ return (
{/* Search and Sort Controls - Skeleton */} @@ -554,8 +564,8 @@ export default function MemberResourcesPortal({ return (
@@ -563,7 +573,7 @@ export default function MemberResourcesPortal({

- Unable to Load Resources + {t("memberPortalUnableToLoad")}

{error} @@ -574,7 +584,7 @@ export default function MemberResourcesPortal({ className="gap-2" > - Try Again + {t("memberPortalTryAgain")} @@ -585,8 +595,8 @@ export default function MemberResourcesPortal({ return (

{/* Search and Sort Controls with Refresh */} @@ -595,7 +605,7 @@ export default function MemberResourcesPortal({ {/* Search */}
setSearchQuery(e.target.value)} className="w-full pl-8 bg-card" @@ -607,26 +617,28 @@ export default function MemberResourcesPortal({
@@ -644,7 +656,7 @@ export default function MemberResourcesPortal({ - Refresh + {t("memberPortalRefresh")}
@@ -663,13 +675,15 @@ export default function MemberResourcesPortal({

{searchQuery - ? "No Resources Found" - : "No Resources Available"} + ? t("memberPortalNoResourcesFound") + : t("memberPortalNoResourcesAvailable")}

{searchQuery - ? `No resources match "${searchQuery}". Try adjusting your search terms or clearing the search to see all resources.` - : "You don't have access to any resources yet. Contact your administrator to get access to resources you need."} + ? t("memberPortalNoResourcesMatchSearch", { + query: searchQuery + }) + : t("memberPortalNoResourcesAccess")}

{searchQuery ? ( @@ -678,7 +692,7 @@ export default function MemberResourcesPortal({ variant="outline" className="gap-2" > - Clear Search + {t("memberPortalClearSearch")} ) : ( )}
@@ -704,11 +718,12 @@ export default function MemberResourcesPortal({

- Public Resources + {t("memberPortalPublicResources")}

- Web applications and services accessible via - browser + {t( + "memberPortalPublicResourcesDescription" + )}

@@ -768,9 +783,12 @@ export default function MemberResourcesPortal({ resource.domain ); toast({ - title: "Copied to clipboard", - description: - "Resource URL has been copied to your clipboard.", + title: t( + "memberPortalCopiedToClipboard" + ), + description: t( + "memberPortalCopiedUrlDescription" + ), duration: 2000 }); }} @@ -791,7 +809,7 @@ export default function MemberResourcesPortal({ disabled={!resource.enabled} > - Open Resource + {t("memberPortalOpenResource")}
@@ -806,11 +824,12 @@ export default function MemberResourcesPortal({

- Private Resources + {t("memberPortalPrivateResources")}

- Internal network resources accessible via - client + {t( + "memberPortalPrivateResourcesDescription" + )}

@@ -843,11 +862,16 @@ export default function MemberResourcesPortal({
- Resource Details + {t( + "memberPortalResourceDetails" + )}
- Mode: + {t( + "memberPortalMode" + )} + : { @@ -858,7 +882,10 @@ export default function MemberResourcesPortal({ {siteResource.protocol && (
- Protocol: + {t( + "protocol" + )} + : { @@ -869,7 +896,10 @@ export default function MemberResourcesPortal({ )}
- Destination: + {t( + "memberPortalDestination" + )} + : { @@ -880,7 +910,10 @@ export default function MemberResourcesPortal({ {siteResource.alias && (
- Alias: + {t( + "memberPortalAlias" + )} + : { @@ -891,14 +924,21 @@ export default function MemberResourcesPortal({ )}
- Status: + {t( + "status" + )} + : {siteResource.enabled - ? "Enabled" - : "Disabled"} + ? t( + "enabled" + ) + : t( + "disabled" + )}
@@ -925,9 +965,13 @@ export default function MemberResourcesPortal({ siteResource.alias! ); toast({ - title: "Copied to clipboard", + title: t( + "memberPortalCopiedToClipboard" + ), description: - "Resource alias has been copied to your clipboard.", + t( + "memberPortalCopiedAliasDescription" + ), duration: 2000 }); }} @@ -959,9 +1003,13 @@ export default function MemberResourcesPortal({ siteResource.destination ); toast({ - title: "Copied to clipboard", + title: t( + "memberPortalCopiedToClipboard" + ), description: - "Resource destination has been copied to your clipboard.", + t( + "memberPortalCopiedDestinationDescription" + ), duration: 2000 }); }} @@ -976,7 +1024,9 @@ export default function MemberResourcesPortal({
- Requires Client Connection + {t( + "memberPortalRequiresClientConnection" + )}