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({
-
+
- Name A-Z
+ {t("memberPortalSortNameAsc")}
- Name Z-A
+ {t("memberPortalSortNameDesc")}
- Domain A-Z
+ {t("memberPortalSortDomainAsc")}
- Domain Z-A
+ {t("memberPortalSortDomainDesc")}
- Enabled First
+ {t("memberPortalSortEnabledFirst")}
- Disabled First
+ {t("memberPortalSortDisabledFirst")}
@@ -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")}
) : (
- Refresh Resources
+ {t("memberPortalRefreshResources")}
)}
@@ -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"
+ )}