From 9db5ff9ff73c885959e1e42977345f4a9a2001ec Mon Sep 17 00:00:00 2001 From: Fred KISSIE Date: Thu, 23 Apr 2026 04:22:18 +0200 Subject: [PATCH 01/99] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20small=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ui/controlled-data-table.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ui/controlled-data-table.tsx b/src/components/ui/controlled-data-table.tsx index 58081783a..5f17f1887 100644 --- a/src/components/ui/controlled-data-table.tsx +++ b/src/components/ui/controlled-data-table.tsx @@ -563,7 +563,7 @@ export function ControlledDataTable({ ))} - {table.getRowModel().rows?.length ? ( + {(table.getRowModel().rows ?? []).length > 0 ? ( table.getRowModel().rows.map((row) => ( Date: Thu, 23 Apr 2026 05:17:33 +0200 Subject: [PATCH 02/99] =?UTF-8?q?=F0=9F=8C=90=20update=20french=20translat?= =?UTF-8?q?ions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- messages/fr-FR.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/messages/fr-FR.json b/messages/fr-FR.json index 8b9cd90b9..f2ed46e2c 100644 --- a/messages/fr-FR.json +++ b/messages/fr-FR.json @@ -1334,7 +1334,7 @@ "sidebarSites": "Nœuds", "sidebarApprovals": "Demandes d'approbation", "sidebarResources": "Ressource", - "sidebarProxyResources": "Publique", + "sidebarProxyResources": "Publiques", "sidebarClientResources": "Privé", "sidebarAccessControl": "Contrôle d'accès", "sidebarLogsAndAnalytics": "Journaux & Analytiques", @@ -2430,8 +2430,8 @@ "manageUserDevicesDescription": "Voir et gérer les appareils que les utilisateurs utilisent pour se connecter en privé aux ressources", "downloadClientBannerTitle": "Télécharger le client Pangolin", "downloadClientBannerDescription": "Téléchargez le client Pangolin pour votre système afin de vous connecter au réseau Pangolin et accéder aux ressources de manière privée.", - "manageMachineClients": "Gérer les clients de la machine", - "manageMachineClientsDescription": "Créer et gérer des clients que les serveurs et les systèmes utilisent pour se connecter en privé aux ressources", + "manageMachineClients": "Gérer les machines", + "manageMachineClientsDescription": "Créer et gérer les clients que les serveurs et systèmes utilisent pour se connecter en privé aux ressources", "machineClientsBannerTitle": "Serveurs & Systèmes automatisés", "machineClientsBannerDescription": "Les clients de machine sont conçus pour les serveurs et les systèmes automatisés qui ne sont pas associés à un utilisateur spécifique. Ils s'authentifient avec un identifiant et une clé secrète, et peuvent être exécutés avec Pangolin CLI, Olm CLI ou Olm en tant que conteneur.", "machineClientsBannerPangolinCLI": "Pangolin CLI", @@ -3123,6 +3123,7 @@ "healthCheckTabAdvanced": "Avancé", "healthCheckStrategyNotAvailable": "Cette stratégie n'est pas disponible. Veuillez contacter le service commercial pour activer cette fonctionnalité.", "uptime30d": "Disponibilité (30j)", + "uptimeNoData": "Aucune donnée", "idpAddActionCreateNew": "Créer un nouveau fournisseur d'identité", "idpAddActionImportFromOrg": "Importer d'une autre organisation", "idpImportDialogTitle": "Importer le fournisseur d'identité", From b9bee2836b1973fbd31ad060ee60c2061c4da295 Mon Sep 17 00:00:00 2001 From: Fred KISSIE Date: Thu, 23 Apr 2026 06:33:57 +0200 Subject: [PATCH 03/99] =?UTF-8?q?=F0=9F=9A=A7=20wip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/InternalResourceForm.tsx | 124 ++++++++++-------- src/components/machines-selector.tsx | 2 +- .../multi-select/multi-select-input.tsx | 61 +++++++++ .../{ => multi-select}/multi-select-tags.tsx | 2 +- 4 files changed, 135 insertions(+), 54 deletions(-) create mode 100644 src/components/multi-select/multi-select-input.tsx rename src/components/{ => multi-select}/multi-select-tags.tsx (99%) diff --git a/src/components/InternalResourceForm.tsx b/src/components/InternalResourceForm.tsx index 3a693d82b..559da4cce 100644 --- a/src/components/InternalResourceForm.tsx +++ b/src/components/InternalResourceForm.tsx @@ -40,7 +40,12 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { tierMatrix } from "@server/lib/billing/tierMatrix"; import { UserType } from "@server/types/UserTypes"; import { useQuery } from "@tanstack/react-query"; -import { ChevronsUpDown, ExternalLink } from "lucide-react"; +import { + ArrowDownIcon, + ChevronDownIcon, + ChevronsUpDown, + ExternalLink +} from "lucide-react"; import { useTranslations } from "next-intl"; import { useEffect, useRef, useState } from "react"; import { useForm } from "react-hook-form"; @@ -50,7 +55,7 @@ import { formatMultiSitesSelectorLabel } from "./multi-site-selector"; import type { Selectedsite } from "./site-selector"; -import { CaretSortIcon } from "@radix-ui/react-icons"; + import { MachinesSelector } from "./machines-selector"; import DomainPicker from "@app/components/DomainPicker"; import { SwitchInput } from "@app/components/SwitchInput"; @@ -155,7 +160,7 @@ export type InternalResourceData = { const tagSchema = z.object({ id: z.string(), text: z.string() }); function buildSelectedSitesForResource( - resource: InternalResourceData, + resource: InternalResourceData ): Selectedsite[] { return resource.siteIds.map((siteId, idx) => ({ name: resource.siteNames[idx] ?? "", @@ -608,9 +613,7 @@ export function InternalResourceForm({ users: [], clients: [] }); - setSelectedSites( - buildSelectedSitesForResource(resource) - ); + setSelectedSites(buildSelectedSitesForResource(resource)); setTcpPortMode( getPortModeFromString(resource.tcpPortRangeString) ); @@ -877,7 +880,9 @@ export function InternalResourceForm({ field.value ?? "http" } - disabled={httpSectionDisabled} + disabled={ + httpSectionDisabled + } > @@ -918,7 +923,10 @@ export function InternalResourceForm({ @@ -974,7 +982,9 @@ export function InternalResourceForm({ field.value ?? "" } - disabled={httpSectionDisabled} + disabled={ + httpSectionDisabled + } onChange={(e) => { const raw = e.target @@ -1009,7 +1019,9 @@ export function InternalResourceForm({ {isHttpMode && ( - + )} {isHttpMode ? ( @@ -1022,55 +1034,61 @@ export function InternalResourceForm({ {t(httpConfigurationDescriptionKey)} -
- { - if (res === null) { + > + { + if (res === null) { + form.setValue( + "httpConfigSubdomain", + null + ); + form.setValue( + "httpConfigDomainId", + null + ); + form.setValue( + "httpConfigFullDomain", + null + ); + return; + } form.setValue( "httpConfigSubdomain", - null + res.subdomain ?? null ); form.setValue( "httpConfigDomainId", - null + res.domainId ); form.setValue( "httpConfigFullDomain", - null + res.fullDomain ); - return; - } - form.setValue( - "httpConfigSubdomain", - res.subdomain ?? null - ); - form.setValue( - "httpConfigDomainId", - res.domainId - ); - form.setValue( - "httpConfigFullDomain", - res.fullDomain - ); - }} - /> + }} + />
@@ -1511,7 +1531,7 @@ export function InternalResourceForm({ role="combobox" className={cn( "justify-between w-full", - "text-muted-foreground pl-1.5" + "text-muted-foreground pl-1.5 cursor-text" )} > - + diff --git a/src/components/machines-selector.tsx b/src/components/machines-selector.tsx index 99515135e..f6ef463b8 100644 --- a/src/components/machines-selector.tsx +++ b/src/components/machines-selector.tsx @@ -5,7 +5,7 @@ import { useMemo, useState } from "react"; import { useDebounce } from "use-debounce"; import { useTranslations } from "next-intl"; -import { MultiSelectTags } from "./multi-select-tags"; +import { MultiSelectTags } from "./multi-select/multi-select-tags"; export type SelectedMachine = Pick< ListClientsResponse["clients"][number], diff --git a/src/components/multi-select/multi-select-input.tsx b/src/components/multi-select/multi-select-input.tsx new file mode 100644 index 000000000..d0d8e2873 --- /dev/null +++ b/src/components/multi-select/multi-select-input.tsx @@ -0,0 +1,61 @@ +import { + Popover, + PopoverContent, + PopoverTrigger +} from "@app/components/ui/popover"; +import { Button } from "@app/components/ui/button"; +import { cn } from "@app/lib/cn"; +import { ChevronDownIcon } from "lucide-react"; +import { + type TagValue, + type MultiSelectTagsProps, + MultiSelectTags +} from "./multi-select-tags"; + +export interface MultiSelectInputProps< + T extends TagValue +> extends MultiSelectTagsProps { + buttonText?: string; +} + +export function MultiSelectInput({ + buttonText, + ...props +}: MultiSelectInputProps) { + return ( + + +
+ + {/* {(field.value ?? []).map((client) => ( + + {client.name} + + ))} */} + {buttonText} + + +
+
+ + + +
+ ); +} diff --git a/src/components/multi-select-tags.tsx b/src/components/multi-select/multi-select-tags.tsx similarity index 99% rename from src/components/multi-select-tags.tsx rename to src/components/multi-select/multi-select-tags.tsx index 2fb9b097d..67ce9e8f5 100644 --- a/src/components/multi-select-tags.tsx +++ b/src/components/multi-select/multi-select-tags.tsx @@ -6,7 +6,7 @@ import { CommandInput, CommandItem, CommandList -} from "./ui/command"; +} from "../ui/command"; import { cn } from "@app/lib/cn"; import { CheckIcon } from "lucide-react"; From c746e1bc8dd9f2f2181f517ab9f86e45c17f342d Mon Sep 17 00:00:00 2001 From: Fred KISSIE Date: Fri, 24 Apr 2026 08:33:43 +0200 Subject: [PATCH 04/99] =?UTF-8?q?=F0=9F=9A=A7=20wip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/InternalResourceForm.tsx | 19 ++- src/components/machines-selector.tsx | 102 ++++++++++++---- src/components/tags/autocomplete.tsx | 47 +++++-- src/components/tags/tag-input.tsx | 156 +++++++++++++++++++----- 4 files changed, 257 insertions(+), 67 deletions(-) diff --git a/src/components/InternalResourceForm.tsx b/src/components/InternalResourceForm.tsx index 5e87509e6..f63192129 100644 --- a/src/components/InternalResourceForm.tsx +++ b/src/components/InternalResourceForm.tsx @@ -1572,7 +1572,22 @@ export function InternalResourceForm({ {t("machineClients")} - + { + form.setValue( + "clients", + machines + ); + }} + /> + {/* + + + + + + + + {t("noResults")} + + {suggestedOptions.map((option) => { + const isChosen = tags.some( + (tag) => tag.text === option.text + ); + return ( + toggleTag(option)} + className={ + styleClasses?.autoComplete + ?.commandItem + } + > + + {option.text} + + ); + })} + + + + + + ); +} diff --git a/src/components/tags/tag-input.tsx b/src/components/tags/tag-input.tsx index b20787e0c..3241912c5 100644 --- a/src/components/tags/tag-input.tsx +++ b/src/components/tags/tag-input.tsx @@ -88,7 +88,6 @@ export interface TagInputProps searchQuery?: string; onSearchQueryChange?: (value: string) => void; autocompleteContent?: React.ReactNode; - suggestedOptions?: Tag[]; customTagRenderer?: (tag: Tag, isActiveTag: boolean) => React.ReactNode; onFocus?: React.FocusEventHandler; onBlur?: React.FocusEventHandler; @@ -164,8 +163,7 @@ export function TagInput({ ref, ...props }: TagInputProps) { generateTagId = uuid, searchQuery, onSearchQueryChange, - autocompleteContent, - suggestedOptions + autocompleteContent } = props; const [inputValue, setInputValue] = React.useState(""); @@ -196,7 +194,6 @@ export function TagInput({ ref, ...props }: TagInputProps) { } const handleInputChange = (e: React.ChangeEvent) => { - if (suggestedOptions !== undefined) return; const newValue = e.target.value; if (addOnPaste && newValue.includes(delimiter)) { const splitValues = newValue @@ -440,14 +437,6 @@ export function TagInput({ ref, ...props }: TagInputProps) { onClearAll?.(); }; - const mainInputValue = - suggestedOptions !== undefined ? "" : effectiveQuery; - - const useAutocompleteComponent = - enableAutocomplete || suggestedOptions !== undefined; - const resolvedAutocompleteOptions = suggestedOptions ?? autocompleteOptions; - const disableAutocompleteSearch = suggestedOptions !== undefined; - const displayedTags = sortTags ? [...tags].sort() : tags; const truncatedTags = truncate @@ -500,7 +489,7 @@ export function TagInput({ ref, ...props }: TagInputProps) { disabled={disabled} /> ) : ( - !useAutocompleteComponent && !autocompleteContent && ( + !enableAutocomplete && !autocompleteContent && (
) ))} - {!useAutocompleteComponent && autocompleteContent && ( + {!enableAutocomplete && autocompleteContent && (
)} - {useAutocompleteComponent ? ( + {enableAutocomplete ? (
= maxTags ? placeholderWhenFull : placeholder} // ref={inputRef} - // value={mainInputValue} + // value={effectiveQuery} // disabled={disabled || (maxTags !== undefined && tags.length >= maxTags)} // onChangeCapture={handleInputChange} // onKeyDown={handleKeyDown} @@ -697,7 +680,7 @@ export function TagInput({ ref, ...props }: TagInputProps) { ? placeholderWhenFull : placeholder } - value={mainInputValue} + value={effectiveQuery} onChange={handleInputChange} onKeyDown={handleKeyDown} onFocus={handleInputFocus} @@ -758,7 +741,7 @@ export function TagInput({ ref, ...props }: TagInputProps) { {/* = maxTags ? placeholderWhenFull : placeholder} ref={inputRef} - value={mainInputValue} + value={effectiveQuery} disabled={disabled || (maxTags !== undefined && tags.length >= maxTags)} onChangeCapture={handleInputChange} onKeyDown={handleKeyDown} @@ -781,7 +764,7 @@ export function TagInput({ ref, ...props }: TagInputProps) { ? placeholderWhenFull : placeholder } - value={mainInputValue} + value={effectiveQuery} onChange={handleInputChange} onKeyDown={handleKeyDown} onFocus={handleInputFocus} @@ -837,7 +820,7 @@ export function TagInput({ ref, ...props }: TagInputProps) { {/* = maxTags ? placeholderWhenFull : placeholder} ref={inputRef} - value={mainInputValue} + value={effectiveQuery} disabled={disabled || (maxTags !== undefined && tags.length >= maxTags)} onChangeCapture={handleInputChange} onKeyDown={handleKeyDown} @@ -859,7 +842,7 @@ export function TagInput({ ref, ...props }: TagInputProps) { ? placeholderWhenFull : placeholder } - value={mainInputValue} + value={effectiveQuery} onChange={handleInputChange} onKeyDown={handleKeyDown} onFocus={handleInputFocus} @@ -902,7 +885,7 @@ export function TagInput({ ref, ...props }: TagInputProps) { ? placeholderWhenFull : placeholder } - value={mainInputValue} + value={effectiveQuery} onChange={handleInputChange} onKeyDown={handleKeyDown} onFocus={handleInputFocus} @@ -962,7 +945,7 @@ export function TagInput({ ref, ...props }: TagInputProps) { ? placeholderWhenFull : placeholder } - value={mainInputValue} + value={effectiveQuery} onChange={handleInputChange} onKeyDown={handleKeyDown} onFocus={handleInputFocus} From 955aa41f53556a2d5c60eef29f64ea3b5ce14e81 Mon Sep 17 00:00:00 2001 From: Fred KISSIE Date: Sat, 25 Apr 2026 04:47:17 +0200 Subject: [PATCH 06/99] =?UTF-8?q?=E2=8F=AA=20revert=20changes=20modifying?= =?UTF-8?q?=20existing=20tag=20input?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/tags/suggestions-tag-input.tsx | 266 ------------------ src/components/tags/tag-input.tsx | 69 +---- 2 files changed, 3 insertions(+), 332 deletions(-) delete mode 100644 src/components/tags/suggestions-tag-input.tsx diff --git a/src/components/tags/suggestions-tag-input.tsx b/src/components/tags/suggestions-tag-input.tsx deleted file mode 100644 index decb1d444..000000000 --- a/src/components/tags/suggestions-tag-input.tsx +++ /dev/null @@ -1,266 +0,0 @@ -"use client"; - -import React, { useEffect, useRef, useState } from "react"; -import { type VariantProps } from "class-variance-authority"; -import { Check } from "lucide-react"; -import { useTranslations } from "next-intl"; -import { - Command, - CommandEmpty, - CommandGroup, - CommandInput, - CommandItem, - CommandList -} from "@app/components/ui/command"; -import { - Popover, - PopoverAnchor, - PopoverContent, - PopoverTrigger -} from "@app/components/ui/popover"; -import { Button } from "@app/components/ui/button"; -import { cn } from "@app/lib/cn"; -import { tagVariants } from "./tag"; -import { TagList } from "./tag-list"; -import type { Tag, TagInputStyleClassesProps } from "./tag-input"; - -export type SuggestionsTagInputProps = { - tags: Tag[]; - setTags: React.Dispatch>; - suggestedOptions: Tag[]; - searchQuery: string; - onSearchQueryChange: (value: string) => void; - activeTagIndex: number | null; - setActiveTagIndex: React.Dispatch>; - placeholder?: string; - maxTags?: number; - onTagAdd?: (tag: string) => void; - onTagRemove?: (tag: string) => void; - allowDuplicates?: boolean; - disabled?: boolean; - usePortal?: boolean; - styleClasses?: TagInputStyleClassesProps; -} & VariantProps; - -export function SuggestionsTagInput({ - tags, - setTags, - suggestedOptions, - searchQuery, - onSearchQueryChange, - activeTagIndex, - setActiveTagIndex, - placeholder, - maxTags, - onTagAdd, - onTagRemove, - allowDuplicates = false, - disabled = false, - usePortal = false, - styleClasses = {}, - variant, - size, - shape, - borderStyle, - textCase, - interaction, - animation, - textStyle -}: SuggestionsTagInputProps) { - const t = useTranslations(); - const triggerRef = useRef(null); - const popoverContentRef = useRef(null); - const [isOpen, setIsOpen] = useState(false); - const [popoverWidth, setPopoverWidth] = useState(0); - - useEffect(() => { - const handleOutsideClick = (event: MouseEvent | TouchEvent) => { - if ( - isOpen && - triggerRef.current && - popoverContentRef.current && - !triggerRef.current.contains(event.target as Node) && - !popoverContentRef.current.contains(event.target as Node) - ) { - setIsOpen(false); - } - }; - document.addEventListener("mousedown", handleOutsideClick); - return () => - document.removeEventListener("mousedown", handleOutsideClick); - }, [isOpen]); - - const handleOpenChange = (open: boolean) => { - if (open && triggerRef.current) { - setPopoverWidth(triggerRef.current.getBoundingClientRect().width); - } - if (open) setIsOpen(true); - }; - - const toggleTag = (option: Tag) => { - const index = tags.findIndex((tag) => tag.text === option.text); - if (index >= 0) { - setTags(tags.filter((_, i) => i !== index)); - onTagRemove?.(option.text); - } else { - if ( - !allowDuplicates && - tags.some((tag) => tag.text === option.text) - ) - return; - if (!maxTags || tags.length < maxTags) { - setTags([...tags, option]); - onTagAdd?.(option.text); - } - } - }; - - const removeTag = (idToRemove: string) => { - const removed = tags.find((tag) => tag.id === idToRemove); - setTags(tags.filter((tag) => tag.id !== idToRemove)); - if (removed) onTagRemove?.(removed.text); - }; - - const onSortEnd = (oldIndex: number, newIndex: number) => { - setTags((current) => { - const next = [...current]; - const [moved] = next.splice(oldIndex, 1); - next.splice(newIndex, 0, moved); - return next; - }); - }; - - return ( - - -
- - - - -
-
- - - - - {t("noResults")} - - {suggestedOptions.map((option) => { - const isChosen = tags.some( - (tag) => tag.text === option.text - ); - return ( - toggleTag(option)} - className={ - styleClasses?.autoComplete - ?.commandItem - } - > - - {option.text} - - ); - })} - - - - -
- ); -} diff --git a/src/components/tags/tag-input.tsx b/src/components/tags/tag-input.tsx index 3241912c5..1ea93b468 100644 --- a/src/components/tags/tag-input.tsx +++ b/src/components/tags/tag-input.tsx @@ -87,7 +87,6 @@ export interface TagInputProps onInputChange?: (value: string) => void; searchQuery?: string; onSearchQueryChange?: (value: string) => void; - autocompleteContent?: React.ReactNode; customTagRenderer?: (tag: Tag, isActiveTag: boolean) => React.ReactNode; onFocus?: React.FocusEventHandler; onBlur?: React.FocusEventHandler; @@ -162,8 +161,7 @@ export function TagInput({ ref, ...props }: TagInputProps) { addOnPaste = false, generateTagId = uuid, searchQuery, - onSearchQueryChange, - autocompleteContent + onSearchQueryChange } = props; const [inputValue, setInputValue] = React.useState(""); @@ -489,7 +487,7 @@ export function TagInput({ ref, ...props }: TagInputProps) { disabled={disabled} /> ) : ( - !enableAutocomplete && !autocompleteContent && ( + !enableAutocomplete && (
) ))} - {!enableAutocomplete && autocompleteContent && ( -
-
- - = maxTags - ? placeholderWhenFull - : placeholder - } - value={effectiveQuery} - onChange={handleInputChange} - onKeyDown={handleKeyDown} - onFocus={handleInputFocus} - onBlur={handleInputBlur} - {...inputProps} - className={cn( - "border-0 px-2 h-5 bg-transparent focus-visible:ring-0 focus-visible:ring-transparent focus-visible:ring-offset-0 flex-1 w-fit shadow-none inset-shadow-none", - styleClasses?.input - )} - autoComplete="off" - disabled={ - disabled || - (maxTags !== undefined && tags.length >= maxTags) - } - /> -
- {autocompleteContent} -
- )} + {enableAutocomplete ? (
Date: Sat, 25 Apr 2026 04:47:31 +0200 Subject: [PATCH 07/99] =?UTF-8?q?=E2=9C=A8=20new=20multi=20select=20tag=20?= =?UTF-8?q?input?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/machines-selector.tsx | 62 ++++++------------- .../multi-select/multi-select-input.tsx | 51 +++++++++++---- 2 files changed, 58 insertions(+), 55 deletions(-) diff --git a/src/components/machines-selector.tsx b/src/components/machines-selector.tsx index d4aef49d6..8c4757fd0 100644 --- a/src/components/machines-selector.tsx +++ b/src/components/machines-selector.tsx @@ -5,10 +5,7 @@ import { useMemo, useState } from "react"; import { useDebounce } from "use-debounce"; import { useTranslations } from "next-intl"; -import { - SuggestionsTagInput, - type SuggestionsTagInputProps -} from "./tags/suggestions-tag-input"; +import { MultiSelectInput } from "./multi-select/multi-select-input"; export type SelectedMachine = Pick< ListClientsResponse["clients"][number], @@ -19,22 +16,12 @@ export type MachineSelectorProps = { orgId: string; selectedMachines?: SelectedMachine[]; onSelectMachines: (machine: SelectedMachine[]) => void; -} & Omit< - SuggestionsTagInputProps, - | "tags" - | "setTags" - | "suggestedOptions" - | "searchQuery" - | "onSearchQueryChange" - | "activeTagIndex" - | "setActiveTagIndex" ->; +}; export function MachinesSelector({ orgId, selectedMachines = [], - onSelectMachines, - ...props + onSelectMachines }: MachineSelectorProps) { const t = useTranslations(); const [machineSearchQuery, setMachineSearchQuery] = useState(""); @@ -60,42 +47,29 @@ export function MachinesSelector({ return allMachines; }, [machines, selectedMachines, debouncedValue]); - const [activeTagIndex, setActiveTagIndex] = useState(null); - return ( - ({ + ({ id: mc.clientId.toString(), text: mc.name }))} - setTags={(newTags) => { - const tags = - typeof newTags === "function" - ? newTags( - selectedMachines.map((mc) => ({ - id: mc.clientId.toString(), - text: mc.name - })) - ) - : newTags; + value={selectedMachines.map((mc) => ({ + id: mc.clientId.toString(), + text: mc.name + }))} + onChange={(newValues) => { onSelectMachines( - tags.map((tag) => ({ - clientId: Number(tag.id), - name: tag.text + newValues.map((v) => ({ + clientId: Number(v.id), + name: v.text })) ); }} - searchQuery={machineSearchQuery} - onSearchQueryChange={setMachineSearchQuery} - suggestedOptions={machinesShown.map((mc) => ({ - id: mc.clientId.toString(), - text: mc.name - }))} - allowDuplicates={false} /> ); } diff --git a/src/components/multi-select/multi-select-input.tsx b/src/components/multi-select/multi-select-input.tsx index d0d8e2873..4f4fec528 100644 --- a/src/components/multi-select/multi-select-input.tsx +++ b/src/components/multi-select/multi-select-input.tsx @@ -3,14 +3,15 @@ import { PopoverContent, PopoverTrigger } from "@app/components/ui/popover"; -import { Button } from "@app/components/ui/button"; +import { Button, buttonVariants } from "@app/components/ui/button"; import { cn } from "@app/lib/cn"; -import { ChevronDownIcon } from "lucide-react"; +import { ChevronDownIcon, XIcon } from "lucide-react"; import { type TagValue, type MultiSelectTagsProps, MultiSelectTags } from "./multi-select-tags"; +import { useState } from "react"; export interface MultiSelectInputProps< T extends TagValue @@ -22,13 +23,20 @@ export function MultiSelectInput({ buttonText, ...props }: MultiSelectInputProps) { + const selectedValues = new Set(props.value.map((v) => v.id)); + return ( - +
({ "overflow-x-auto" )} > - {/* {(field.value ?? []).map((client) => ( + {props.value.map((option) => ( e.stopPropagation()} > - {client.name} + {option.text} + - ))} */} + ))} {buttonText} - +
From 2ea9d272379e6bbb88803b9da42f88f40be6d2bd Mon Sep 17 00:00:00 2001 From: Fred KISSIE Date: Sat, 25 Apr 2026 05:26:41 +0200 Subject: [PATCH 08/99] =?UTF-8?q?=E2=9C=A8=20machine=20selector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/machines-selector.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/machines-selector.tsx b/src/components/machines-selector.tsx index 8c4757fd0..d4b37bb74 100644 --- a/src/components/machines-selector.tsx +++ b/src/components/machines-selector.tsx @@ -28,8 +28,10 @@ export function MachinesSelector({ const [debouncedValue] = useDebounce(machineSearchQuery, 150); + const perPage = 7; + const { data: machines = [] } = useQuery( - orgQueries.machineClients({ orgId, perPage: 3, query: debouncedValue }) + orgQueries.machineClients({ orgId, perPage, query: debouncedValue }) ); // always include the selected machines in the list (if the user isn't searching) @@ -44,7 +46,7 @@ export function MachinesSelector({ } } } - return allMachines; + return allMachines.slice(0, perPage); }, [machines, selectedMachines, debouncedValue]); return ( From 91ce8bea4bdd01d2ce15409fb8b00ac47502e8e2 Mon Sep 17 00:00:00 2001 From: Fred KISSIE Date: Sat, 25 Apr 2026 05:59:43 +0200 Subject: [PATCH 09/99] =?UTF-8?q?=F0=9F=94=A8=20add=20local=20mailer=20for?= =?UTF-8?q?=20catching=20emails?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.mailpit.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 docker-compose.mailpit.yml diff --git a/docker-compose.mailpit.yml b/docker-compose.mailpit.yml new file mode 100644 index 000000000..b801ec735 --- /dev/null +++ b/docker-compose.mailpit.yml @@ -0,0 +1,12 @@ +services: + mailer: + image: axllent/mailpit + ports: + - 8025:8025 + - 1025:1025 + volumes: + - mailpit-storage:/data + environment: + - MP_DATABASE=/data/mailpit.db +volumes: + mailpit-storage: From 27b2ec309d18e598d6297fc46a377bea9029ed88 Mon Sep 17 00:00:00 2001 From: Fred KISSIE Date: Sat, 25 Apr 2026 06:18:13 +0200 Subject: [PATCH 10/99] =?UTF-8?q?=F0=9F=9A=A7=20users=20selector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/InternalResourceForm.tsx | 21 +++++- src/components/machines-selector.tsx | 6 +- ...lect-tags.tsx => multi-select-content.tsx} | 5 +- ...t-input.tsx => multi-select-tag-input.tsx} | 8 +-- src/components/roles-selector.tsx | 1 + src/components/ui/command.tsx | 2 +- src/components/users-selector.tsx | 64 +++++++++++++++++++ src/lib/queries.ts | 22 ++++++- 8 files changed, 114 insertions(+), 15 deletions(-) rename src/components/multi-select/{multi-select-tags.tsx => multi-select-content.tsx} (93%) rename src/components/multi-select/{multi-select-input.tsx => multi-select-tag-input.tsx} (95%) create mode 100644 src/components/roles-selector.tsx create mode 100644 src/components/users-selector.tsx diff --git a/src/components/InternalResourceForm.tsx b/src/components/InternalResourceForm.tsx index f63192129..af3841818 100644 --- a/src/components/InternalResourceForm.tsx +++ b/src/components/InternalResourceForm.tsx @@ -60,6 +60,7 @@ import { MachinesSelector } from "./machines-selector"; import DomainPicker from "@app/components/DomainPicker"; import { SwitchInput } from "@app/components/SwitchInput"; import CertificateStatus from "@app/components/CertificateStatus"; +import { UsersSelector } from "./users-selector"; // --- Helpers (shared) --- @@ -1522,7 +1523,7 @@ export function InternalResourceForm({ render={({ field }) => ( {t("users")} - + {/* - + */} + { + form.setValue( + "users", + newUsers as [ + Tag, + ...Tag[] + ] + ); + }} + /> )} diff --git a/src/components/machines-selector.tsx b/src/components/machines-selector.tsx index d4b37bb74..cfae4c2d8 100644 --- a/src/components/machines-selector.tsx +++ b/src/components/machines-selector.tsx @@ -5,7 +5,7 @@ import { useMemo, useState } from "react"; import { useDebounce } from "use-debounce"; import { useTranslations } from "next-intl"; -import { MultiSelectInput } from "./multi-select/multi-select-input"; +import { MultiSelectTagInput } from "./multi-select/multi-select-tag-input"; export type SelectedMachine = Pick< ListClientsResponse["clients"][number], @@ -46,11 +46,11 @@ export function MachinesSelector({ } } } - return allMachines.slice(0, perPage); + return allMachines; }, [machines, selectedMachines, debouncedValue]); return ( - = { ref?: Ref; }; -export function MultiSelectTags({ +export function MultiSelectContent({ emptyPlaceholder, searchPlaceholder, searchQuery, @@ -40,7 +40,8 @@ export function MultiSelectTags({ value={searchQuery} onValueChange={onSearch} /> - + {/* FIXME: why isn't this list scrolling ????? */} + {emptyPlaceholder} {options.map((option) => ( diff --git a/src/components/multi-select/multi-select-input.tsx b/src/components/multi-select/multi-select-tag-input.tsx similarity index 95% rename from src/components/multi-select/multi-select-input.tsx rename to src/components/multi-select/multi-select-tag-input.tsx index 4f4fec528..dfca035a7 100644 --- a/src/components/multi-select/multi-select-input.tsx +++ b/src/components/multi-select/multi-select-tag-input.tsx @@ -9,8 +9,8 @@ import { ChevronDownIcon, XIcon } from "lucide-react"; import { type TagValue, type MultiSelectTagsProps, - MultiSelectTags -} from "./multi-select-tags"; + MultiSelectContent +} from "./multi-select-content"; import { useState } from "react"; export interface MultiSelectInputProps< @@ -19,7 +19,7 @@ export interface MultiSelectInputProps< buttonText?: string; } -export function MultiSelectInput({ +export function MultiSelectTagInput({ buttonText, ...props }: MultiSelectInputProps) { @@ -83,7 +83,7 @@ export function MultiSelectInput({
- + ); diff --git a/src/components/roles-selector.tsx b/src/components/roles-selector.tsx new file mode 100644 index 000000000..70b786d12 --- /dev/null +++ b/src/components/roles-selector.tsx @@ -0,0 +1 @@ +// TODO diff --git a/src/components/ui/command.tsx b/src/components/ui/command.tsx index 8b2b6748a..67cffeec3 100644 --- a/src/components/ui/command.tsx +++ b/src/components/ui/command.tsx @@ -87,7 +87,7 @@ function CommandList({ void; +}; + +export function UsersSelector({ + orgId, + selectedUsers = [], + onSelectUsers +}: UsersSelectorProps) { + const t = useTranslations(); + const [userSearchQuery, setUserSearchQuery] = useState(""); + + const [debouncedValue] = useDebounce(userSearchQuery, 150); + + // TODO: switch back to 7 items + const perPage = 1; + + const { data: users = [] } = useQuery( + orgQueries.users({ orgId, perPage, query: debouncedValue }) + ); + + // always include the selected users in the list (if the user isn't searching) + const usersShown = useMemo(() => { + const allUsers: Array = users.map((u) => ({ + id: u.id, + text: getUserDisplayName(u) + })); + if (debouncedValue.trim().length === 0) { + for (const user of selectedUsers) { + if (!allUsers.find((u) => u.id === user.id)) { + allUsers.unshift(user); + } + } + } + return allUsers; + }, [users, selectedUsers, debouncedValue]); + + return ( + + ); +} diff --git a/src/lib/queries.ts b/src/lib/queries.ts index 3e38a7ba0..ab22b5b57 100644 --- a/src/lib/queries.ts +++ b/src/lib/queries.ts @@ -125,13 +125,29 @@ export const orgQueries = { return res.data.data.clients; } }), - users: ({ orgId }: { orgId: string }) => + users: ({ + orgId, + query, + perPage = 10_000 + }: { + orgId: string; + query?: string; + perPage?: number; + }) => queryOptions({ - queryKey: ["ORG", orgId, "USERS"] as const, + queryKey: ["ORG", orgId, "USERS", { query, perPage }] as const, queryFn: async ({ signal, meta }) => { + const sp = new URLSearchParams({ + pageSize: perPage.toString() + }); + + if (query?.trim()) { + sp.set("query", query); + } + const res = await meta!.api.get< AxiosResponse - >(`/org/${orgId}/users`, { signal }); + >(`/org/${orgId}/users?${sp.toString()}`, { signal }); return res.data.data.users; } From ddaa9c32a776018ac590cf896861b989e0f2ad84 Mon Sep 17 00:00:00 2001 From: Fred KISSIE Date: Tue, 28 Apr 2026 05:08:20 +0200 Subject: [PATCH 11/99] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20replace=20roles=20&?= =?UTF-8?q?=20user=20selectors=20in=20machines=20&=20create=20user?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../users/[userId]/access-controls/page.tsx | 114 +++++--------- .../settings/access/users/create/page.tsx | 124 ++++++--------- src/components/Credenza.tsx | 2 +- src/components/InternalResourceForm.tsx | 145 ++---------------- src/components/OrgRolesTagField.tsx | 58 +++---- .../multi-select/multi-select-content.tsx | 4 +- .../multi-select/multi-select-tag-input.tsx | 9 +- src/components/roles-selector.tsx | 65 +++++++- src/components/ui/command.tsx | 2 +- src/components/users-selector.tsx | 3 +- src/lib/queries.ts | 22 ++- 11 files changed, 211 insertions(+), 337 deletions(-) diff --git a/src/app/[orgId]/settings/access/users/[userId]/access-controls/page.tsx b/src/app/[orgId]/settings/access/users/[userId]/access-controls/page.tsx index 9ab9e93fa..717d7f211 100644 --- a/src/app/[orgId]/settings/access/users/[userId]/access-controls/page.tsx +++ b/src/app/[orgId]/settings/access/users/[userId]/access-controls/page.tsx @@ -1,44 +1,40 @@ "use client"; +import IdpTypeBadge from "@app/components/IdpTypeBadge"; +import OrgRolesTagField from "@app/components/OrgRolesTagField"; +import { + SettingsContainer, + SettingsSection, + SettingsSectionBody, + SettingsSectionDescription, + SettingsSectionFooter, + SettingsSectionForm, + SettingsSectionHeader, + SettingsSectionTitle +} from "@app/components/Settings"; +import { Button } from "@app/components/ui/button"; +import { Checkbox } from "@app/components/ui/checkbox"; import { Form, FormControl, FormField, FormItem, - FormLabel, - FormMessage + FormLabel } from "@app/components/ui/form"; -import { Checkbox } from "@app/components/ui/checkbox"; -import OrgRolesTagField from "@app/components/OrgRolesTagField"; +import { useEnvContext } from "@app/hooks/useEnvContext"; +import { userOrgUserContext } from "@app/hooks/useOrgUserContext"; +import { usePaidStatus } from "@app/hooks/usePaidStatus"; import { toast } from "@app/hooks/useToast"; +import { createApiClient, formatAxiosError } from "@app/lib/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import { AxiosResponse } from "axios"; -import { useEffect, useState } from "react"; +import { build } from "@server/build"; +import { tierMatrix } from "@server/lib/billing/tierMatrix"; +import { UserType } from "@server/types/UserTypes"; +import { useTranslations } from "next-intl"; +import { useParams } from "next/navigation"; +import { useActionState, useEffect } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; -import { ListRolesResponse } from "@server/routers/role"; -import { userOrgUserContext } from "@app/hooks/useOrgUserContext"; -import { useParams } from "next/navigation"; -import { Button } from "@app/components/ui/button"; -import { - SettingsContainer, - SettingsSection, - SettingsSectionHeader, - SettingsSectionTitle, - SettingsSectionDescription, - SettingsSectionBody, - SettingsSectionForm, - SettingsSectionFooter -} from "@app/components/Settings"; -import { formatAxiosError } from "@app/lib/api"; -import { createApiClient } from "@app/lib/api"; -import { useEnvContext } from "@app/hooks/useEnvContext"; -import { useTranslations } from "next-intl"; -import IdpTypeBadge from "@app/components/IdpTypeBadge"; -import { UserType } from "@server/types/UserTypes"; -import { usePaidStatus } from "@app/hooks/usePaidStatus"; -import { tierMatrix } from "@server/lib/billing/tierMatrix"; -import { build } from "@server/build"; const accessControlsFormSchema = z.object({ username: z.string(), @@ -59,12 +55,6 @@ export default function AccessControlsPage() { const { orgId } = useParams(); - const [loading, setLoading] = useState(false); - const [roles, setRoles] = useState<{ roleId: number; name: string }[]>([]); - const [activeRoleTagIndex, setActiveRoleTagIndex] = useState( - null - ); - const t = useTranslations(); const { isPaidUser } = usePaidStatus(); const isPaid = isPaidUser(tierMatrix.fullRbac); @@ -97,44 +87,21 @@ export default function AccessControlsPage() { text: r.name })) ); - }, [user.userId, currentRoleIds.join(",")]); - - useEffect(() => { - async function fetchRoles() { - const res = await api - .get>(`/org/${orgId}/roles`) - .catch((e) => { - console.error(e); - toast({ - variant: "destructive", - title: t("accessRoleErrorFetch"), - description: formatAxiosError( - e, - t("accessRoleErrorFetchDescription") - ) - }); - }); - - if (res?.status === 200) { - setRoles(res.data.data.roles); - } - } - - fetchRoles(); form.setValue("autoProvisioned", user.autoProvisioned || false); - }, []); - - const allRoleOptions = roles.map((role) => ({ - id: role.roleId.toString(), - text: role.name - })); + }, [user.userId, user.autoProvisioned, currentRoleIds.join(",")]); const paywallMessage = build === "saas" ? t("singleRolePerUserPlanNotice") : t("singleRolePerUserEditionNotice"); - async function onSubmit(values: z.infer) { + const [, action, isSubmitting] = useActionState(onSubmit, null); + async function onSubmit() { + const isValid = await form.trigger(); + if (!isValid) return; + + const values = form.getValues(); + if (values.roles.length === 0) { toast({ variant: "destructive", @@ -144,7 +111,6 @@ export default function AccessControlsPage() { return; } - setLoading(true); try { const roleIds = values.roles.map((r) => parseInt(r.id, 10)); const updateRoleRequest = supportsMultipleRolesPerUser @@ -184,7 +150,6 @@ export default function AccessControlsPage() { ) }); } - setLoading(false); } return ( @@ -203,7 +168,7 @@ export default function AccessControlsPage() {
@@ -226,9 +191,7 @@ export default function AccessControlsPage() { {user.idpAutoProvision && ( @@ -277,8 +237,8 @@ export default function AccessControlsPage() { - - - - { - form.setValue( - "clients", - machines - ); - }} - /> - - */} )} diff --git a/src/components/OrgRolesTagField.tsx b/src/components/OrgRolesTagField.tsx index dcd679663..bc8e5a0b5 100644 --- a/src/components/OrgRolesTagField.tsx +++ b/src/components/OrgRolesTagField.tsx @@ -8,51 +8,42 @@ import { FormLabel, FormMessage } from "@app/components/ui/form"; -import { Tag, TagInput } from "@app/components/tags/tag-input"; + import { toast } from "@app/hooks/useToast"; import { useTranslations } from "next-intl"; -import type { Dispatch, SetStateAction } from "react"; -import type { FieldValues, Path, UseFormReturn } from "react-hook-form"; -export type RoleTag = { - id: string; - text: string; -}; +import type { FieldValues, Path, UseFormReturn } from "react-hook-form"; +import { RolesSelector, type SelectedRole } from "./roles-selector"; type OrgRolesTagFieldProps = { - form: Pick, "control" | "getValues" | "setValue">; + form: Pick< + UseFormReturn, + "control" | "getValues" | "setValue" + >; + orgId: string; /** Field in the form that holds Tag[] (role tags). Default: `"roles"`. */ name?: Path; - label: string; - placeholder: string; - allRoleOptions: Tag[]; + label?: string; supportsMultipleRolesPerUser: boolean; showMultiRolePaywallMessage: boolean; paywallMessage: string; - loading?: boolean; - activeTagIndex: number | null; - setActiveTagIndex: Dispatch>; + disabled?: boolean; }; export default function OrgRolesTagField({ form, name = "roles" as Path, label, - placeholder, - allRoleOptions, + orgId, supportsMultipleRolesPerUser, showMultiRolePaywallMessage, paywallMessage, - loading = false, - activeTagIndex, - setActiveTagIndex + disabled }: OrgRolesTagFieldProps) { const t = useTranslations(); - function setRoleTags(updater: Tag[] | ((prev: Tag[]) => Tag[])) { - const prev = form.getValues(name) as Tag[]; - const nextValue = - typeof updater === "function" ? updater(prev) : updater; + function setRoleTags(nextValue: SelectedRole[]) { + const prev = form.getValues(name) as SelectedRole[]; const next = supportsMultipleRolesPerUser ? nextValue : nextValue.length > 1 @@ -88,22 +79,13 @@ export default function OrgRolesTagField({ name={name} render={({ field }) => ( - {label} + {label ?? t("roles")} - {showMultiRolePaywallMessage && ( diff --git a/src/components/multi-select/multi-select-content.tsx b/src/components/multi-select/multi-select-content.tsx index 00a1cf870..0ea54d897 100644 --- a/src/components/multi-select/multi-select-content.tsx +++ b/src/components/multi-select/multi-select-content.tsx @@ -21,6 +21,7 @@ export type MultiSelectTagsProps = { onChange: (newValue: Array) => void; onSearch: (query: string) => void; ref?: Ref; + disabled?: boolean; }; export function MultiSelectContent({ @@ -40,8 +41,7 @@ export function MultiSelectContent({ value={searchQuery} onValueChange={onSearch} /> - {/* FIXME: why isn't this list scrolling ????? */} - + {emptyPlaceholder} {options.map((option) => ( diff --git a/src/components/multi-select/multi-select-tag-input.tsx b/src/components/multi-select/multi-select-tag-input.tsx index dfca035a7..6b3e0fb0f 100644 --- a/src/components/multi-select/multi-select-tag-input.tsx +++ b/src/components/multi-select/multi-select-tag-input.tsx @@ -1,17 +1,16 @@ +import { buttonVariants } from "@app/components/ui/button"; import { Popover, PopoverContent, PopoverTrigger } from "@app/components/ui/popover"; -import { Button, buttonVariants } from "@app/components/ui/button"; import { cn } from "@app/lib/cn"; import { ChevronDownIcon, XIcon } from "lucide-react"; import { - type TagValue, type MultiSelectTagsProps, + type TagValue, MultiSelectContent } from "./multi-select-content"; -import { useState } from "react"; export interface MultiSelectInputProps< T extends TagValue @@ -36,7 +35,8 @@ export function MultiSelectTagInput({ }), "justify-between w-full inline-flex", "text-muted-foreground pl-1.5 cursor-text", - "hover:bg-transparent hover:text-muted-foreground" + "hover:bg-transparent hover:text-muted-foreground", + props.disabled && "pointer-events-none opacity-50" )} > ({ {option.text}
@@ -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" + )}
From adf4a1ffda5a7398594b1b5500886c4d3d941155 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 11:03:38 -0700 Subject: [PATCH 31/99] Link to http private resources --- server/routers/resource/getUserResources.ts | 8 +++++ src/components/MemberResourcesPortal.tsx | 36 +++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/server/routers/resource/getUserResources.ts b/server/routers/resource/getUserResources.ts index c0f21a440..7b82870ea 100644 --- a/server/routers/resource/getUserResources.ts +++ b/server/routers/resource/getUserResources.ts @@ -151,6 +151,8 @@ export async function getUserResources( destination: string; mode: string; scheme: string | null; + ssl: boolean; + fullDomain: string | null; enabled: boolean; alias: string | null; aliasAddress: string | null; @@ -164,6 +166,8 @@ export async function getUserResources( destination: siteResources.destination, mode: siteResources.mode, scheme: siteResources.scheme, + ssl: siteResources.ssl, + fullDomain: siteResources.fullDomain, enabled: siteResources.enabled, alias: siteResources.alias, aliasAddress: siteResources.aliasAddress @@ -251,6 +255,8 @@ export async function getUserResources( destination: siteResource.destination, mode: siteResource.mode, protocol: siteResource.scheme, + ssl: siteResource.ssl, + fullDomain: siteResource.fullDomain, enabled: siteResource.enabled, alias: siteResource.alias, aliasAddress: siteResource.aliasAddress, @@ -296,6 +302,8 @@ export type GetUserResourcesResponse = { destination: string; mode: string; protocol: string | null; + ssl: boolean; + fullDomain: string | null; enabled: boolean; alias: string | null; aliasAddress: string | null; diff --git a/src/components/MemberResourcesPortal.tsx b/src/components/MemberResourcesPortal.tsx index b350be06b..87d527e11 100644 --- a/src/components/MemberResourcesPortal.tsx +++ b/src/components/MemberResourcesPortal.tsx @@ -40,6 +40,7 @@ import { TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; +import CopyToClipboard from "@app/components/CopyToClipboard"; // Update Resource type to include site information type Resource = { @@ -64,6 +65,8 @@ type SiteResource = { destination: string; mode: string; protocol: string | null; + ssl: boolean; + fullDomain: string | null; enabled: boolean; alias: string | null; aliasAddress: string | null; @@ -947,7 +950,14 @@ export default function MemberResourcesPortal({
- {siteResource.alias ? ( + {siteResource.mode === "http" && + siteResource.fullDomain ? ( + /* HTTP mode - show as clickable link */ + + ) : siteResource.alias ? ( <> {/* Alias as primary */}
@@ -1021,7 +1031,29 @@ export default function MemberResourcesPortal({
-
+
+ {siteResource.mode === "http" && + siteResource.fullDomain ? ( + + ) : null}
{t( From 5426031cd41c724a9dab656358714833a953544d Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 11:05:08 -0700 Subject: [PATCH 32/99] Remove duplicate ssl toggle --- src/components/InternalResourceForm.tsx | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/src/components/InternalResourceForm.tsx b/src/components/InternalResourceForm.tsx index bdf8dab48..3d4febe44 100644 --- a/src/components/InternalResourceForm.tsx +++ b/src/components/InternalResourceForm.tsx @@ -1125,30 +1125,6 @@ export function InternalResourceForm({ }} />
- ( - - - - - - )} - />
Date: Wed, 6 May 2026 11:09:14 -0700 Subject: [PATCH 33/99] New translations en-us.json (French) [ci skip] --- messages/fr-FR.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/fr-FR.json b/messages/fr-FR.json index 58eb7d628..8d119e2ea 100644 --- a/messages/fr-FR.json +++ b/messages/fr-FR.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Les ressources Joker peuvent nécessiter une configuration supplémentaire pour fonctionner correctement.", "domainPickerWildcardCertWarningLink": "En savoir plus", "health": "Santé", - "domainPendingErrorTitle": "Problème de vérification" + "domainPendingErrorTitle": "Problème de vérification", + "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" } From 65908fa00f91ac4409974311cc8a88709912a02f Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:16 -0700 Subject: [PATCH 34/99] New translations en-us.json (Bulgarian) [ci skip] --- messages/bg-BG.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/bg-BG.json b/messages/bg-BG.json index e9ca96733..4373a1bfd 100644 --- a/messages/bg-BG.json +++ b/messages/bg-BG.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Ресурсите с уайлдкард може да изискват допълнителна конфигурация за правилна работа.", "domainPickerWildcardCertWarningLink": "Научете повече", "health": "Здраве", - "domainPendingErrorTitle": "Проблем при проверка" + "domainPendingErrorTitle": "Проблем при проверка", + "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" } From 342b4aeddf5263d24b12123d713aea00cadebc71 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:18 -0700 Subject: [PATCH 35/99] New translations en-us.json (Czech) [ci skip] --- messages/cs-CZ.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/cs-CZ.json b/messages/cs-CZ.json index 2a1803486..5b8730010 100644 --- a/messages/cs-CZ.json +++ b/messages/cs-CZ.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Zástupné zdroje mohou vyžadovat dodatečnou konfiguraci pro správnou funkci.", "domainPickerWildcardCertWarningLink": "Zjistit více", "health": "Zdraví", - "domainPendingErrorTitle": "Problém s ověřením" + "domainPendingErrorTitle": "Problém s ověřením", + "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" } From 7dd50f65fcea511001941f1d58907f4101c9b49f Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:20 -0700 Subject: [PATCH 36/99] New translations en-us.json (German) [ci skip] --- messages/de-DE.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/de-DE.json b/messages/de-DE.json index 376e934c9..530e113bb 100644 --- a/messages/de-DE.json +++ b/messages/de-DE.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Wildcard-Ressourcen erfordern möglicherweise zusätzliche Konfigurationen, um ordnungsgemäß zu funktionieren.", "domainPickerWildcardCertWarningLink": "Mehr erfahren", "health": "Gesundheit", - "domainPendingErrorTitle": "Verifizierungsproblem" + "domainPendingErrorTitle": "Verifizierungsproblem", + "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" } From 3c6b1781bc9ff0b92abb173e66682a564e044564 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:23 -0700 Subject: [PATCH 37/99] New translations en-us.json (Italian) [ci skip] --- messages/it-IT.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/it-IT.json b/messages/it-IT.json index d98df3cc2..24a7cbab4 100644 --- a/messages/it-IT.json +++ b/messages/it-IT.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Le risorse wildcard potrebbero richiedere configurazioni aggiuntive per funzionare correttamente.", "domainPickerWildcardCertWarningLink": "Scopri di più", "health": "Salute", - "domainPendingErrorTitle": "Problema di Verifica" + "domainPendingErrorTitle": "Problema di Verifica", + "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" } From d649a8353597cd6b59d8204a2105fd366c8ee219 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:25 -0700 Subject: [PATCH 38/99] New translations en-us.json (Korean) [ci skip] --- messages/ko-KR.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/ko-KR.json b/messages/ko-KR.json index e82112f10..8835dc46b 100644 --- a/messages/ko-KR.json +++ b/messages/ko-KR.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "와일드카드 리소스는 올바르게 작동하려면 추가 구성이 필요할 수 있습니다.", "domainPickerWildcardCertWarningLink": "자세히 알아보기", "health": "건강", - "domainPendingErrorTitle": "확인 문제" + "domainPendingErrorTitle": "확인 문제", + "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" } From 3bce57c65cb5cccc57202890c393898c12b22713 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:27 -0700 Subject: [PATCH 39/99] New translations en-us.json (Dutch) [ci skip] --- messages/nl-NL.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/nl-NL.json b/messages/nl-NL.json index 60a35cc5d..e4359dd62 100644 --- a/messages/nl-NL.json +++ b/messages/nl-NL.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Wildcard-bronnen hebben mogelijk extra configuratie nodig om correct te werken.", "domainPickerWildcardCertWarningLink": "Meer informatie", "health": "Gezondheid", - "domainPendingErrorTitle": "Verificatieprobleem" + "domainPendingErrorTitle": "Verificatieprobleem", + "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" } From 31d3b314e9110776a013a766b4509938bf7908f7 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:29 -0700 Subject: [PATCH 40/99] New translations en-us.json (Polish) [ci skip] --- messages/pl-PL.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/pl-PL.json b/messages/pl-PL.json index 45046ce79..fd21f786a 100644 --- a/messages/pl-PL.json +++ b/messages/pl-PL.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Uniwersalne zasoby mogą wymagać dodatkowej konfiguracji, aby działać poprawnie.", "domainPickerWildcardCertWarningLink": "Dowiedz się więcej", "health": "Zdrowie", - "domainPendingErrorTitle": "Problem z weryfikacją" + "domainPendingErrorTitle": "Problem z weryfikacją", + "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" } From e11527b43030ccd9f461ee4bf55e683d9b8603a7 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:31 -0700 Subject: [PATCH 41/99] New translations en-us.json (Portuguese) [ci skip] --- messages/pt-PT.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/pt-PT.json b/messages/pt-PT.json index 691e25e6d..a7c60c38c 100644 --- a/messages/pt-PT.json +++ b/messages/pt-PT.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Recursos curinga podem exigir configurações adicionais para funcionarem corretamente.", "domainPickerWildcardCertWarningLink": "Saiba mais", "health": "Saúde", - "domainPendingErrorTitle": "Problema de Verificação" + "domainPendingErrorTitle": "Problema de Verificação", + "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" } From f1bdb25497a53c19699f533ce902539b6b7b8d64 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:33 -0700 Subject: [PATCH 42/99] New translations en-us.json (Russian) [ci skip] --- messages/ru-RU.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/ru-RU.json b/messages/ru-RU.json index c036dde3a..73fb6de94 100644 --- a/messages/ru-RU.json +++ b/messages/ru-RU.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Wildcard ресурсы могут потребовать дополнительной настройки для правильной работы.", "domainPickerWildcardCertWarningLink": "Узнать больше", "health": "Состояние", - "domainPendingErrorTitle": "Проблема с подтверждением" + "domainPendingErrorTitle": "Проблема с подтверждением", + "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" } From b17ba96235626c03924c7eadc16ace8525dc2b46 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:35 -0700 Subject: [PATCH 43/99] New translations en-us.json (Turkish) [ci skip] --- messages/tr-TR.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/tr-TR.json b/messages/tr-TR.json index a7c63be56..9684557e7 100644 --- a/messages/tr-TR.json +++ b/messages/tr-TR.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Genel kaynaklar düzgün çalışmak için ek yapılandırma gerektirebilir.", "domainPickerWildcardCertWarningLink": "Daha fazla bilgi", "health": "Sağlık", - "domainPendingErrorTitle": "Doğrulama Sorunu" + "domainPendingErrorTitle": "Doğrulama Sorunu", + "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" } From 35ce947e199925f0b71cdd256f5a22d1881cbac9 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:37 -0700 Subject: [PATCH 44/99] New translations en-us.json (Chinese Simplified) [ci skip] --- messages/zh-CN.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/zh-CN.json b/messages/zh-CN.json index 47beca7dd..24f2e1f26 100644 --- a/messages/zh-CN.json +++ b/messages/zh-CN.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "通配符资源可能需要额外配置才能正常工作。", "domainPickerWildcardCertWarningLink": "了解更多", "health": "健康", - "domainPendingErrorTitle": "验证问题" + "domainPendingErrorTitle": "验证问题", + "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" } From 6d9bfbf08f732c9a06458279ca928a62b3f7a4e5 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:39 -0700 Subject: [PATCH 45/99] New translations en-us.json (Norwegian Bokmal) [ci skip] --- messages/nb-NO.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/nb-NO.json b/messages/nb-NO.json index b33c457f7..7f428a59f 100644 --- a/messages/nb-NO.json +++ b/messages/nb-NO.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Jokertegnressurser kan kreve ekstra konfigurasjon for å fungere skikkelig.", "domainPickerWildcardCertWarningLink": "Lær mer", "health": "Helse", - "domainPendingErrorTitle": "Verifiseringsproblem" + "domainPendingErrorTitle": "Verifiseringsproblem", + "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" } From b8e942478d17f61b387f399afbffdd9dd6d3e8c0 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:09:41 -0700 Subject: [PATCH 46/99] New translations en-us.json (Spanish) [ci skip] --- messages/es-ES.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/messages/es-ES.json b/messages/es-ES.json index e93aff379..f5b81e55c 100644 --- a/messages/es-ES.json +++ b/messages/es-ES.json @@ -3208,5 +3208,48 @@ "domainPickerWildcardCertWarning": "Los recursos comodín pueden requerir configuración adicional para funcionar correctamente.", "domainPickerWildcardCertWarningLink": "Más información", "health": "Salud", - "domainPendingErrorTitle": "Problema de verificación" + "domainPendingErrorTitle": "Problema de verificación", + "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" } From b63eda64f4855c9dc44f81c77efe11a0db70a4ad Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:26 -0700 Subject: [PATCH 47/99] New translations en-us.json (French) [ci skip] --- messages/fr-FR.json | 80 ++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/messages/fr-FR.json b/messages/fr-FR.json index 8d119e2ea..dfbee6967 100644 --- a/messages/fr-FR.json +++ b/messages/fr-FR.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "En savoir plus", "health": "Santé", "domainPendingErrorTitle": "Problème de vérification", - "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", + "memberPortalTitle": "Ressources", + "memberPortalDescription": "Ressources auxquelles vous avez accès dans cette organisation", + "memberPortalSortBy": "Trier par...", + "memberPortalSortNameAsc": "Nom A-Z", + "memberPortalSortNameDesc": "Nom Z-A", + "memberPortalSortDomainAsc": "Domaine A-Z", + "memberPortalSortDomainDesc": "Domaine Z-A", + "memberPortalSortEnabledFirst": "Activé en premier", + "memberPortalSortDisabledFirst": "Désactivé en premier", + "memberPortalRefresh": "Actualiser", + "memberPortalRefreshResources": "Actualiser les ressources", + "memberPortalFailedToLoad": "Échec du chargement des ressources", + "memberPortalFailedToLoadDescription": "Échec du chargement des ressources. Veuillez vérifier votre connexion et réessayer.", + "memberPortalUnableToLoad": "Impossible de charger les ressources", + "memberPortalTryAgain": "Réessayer", + "memberPortalNoResourcesFound": "Aucune ressource trouvée", + "memberPortalNoResourcesAvailable": "Aucune ressource disponible", + "memberPortalNoResourcesMatchSearch": "Aucune ressource ne correspond à \"{query}\". Essayez d'ajuster vos termes de recherche ou de vider la recherche pour voir toutes les ressources.", + "memberPortalNoResourcesAccess": "Vous n'avez encore accès à aucune ressource. Contactez votre administrateur pour obtenir l'accès aux ressources dont vous avez besoin.", + "memberPortalClearSearch": "Effacer la recherche", + "memberPortalPublicResources": "Ressources publiques", + "memberPortalPublicResourcesDescription": "Applications et services web accessibles via un navigateur", + "memberPortalCopiedToClipboard": "Copié dans le presse-papiers", + "memberPortalCopiedUrlDescription": "L'URL de la ressource a été copiée dans votre presse-papiers.", + "memberPortalOpenResource": "Ouvrir la ressource", + "memberPortalPrivateResources": "Ressources privées", + "memberPortalPrivateResourcesDescription": "Ressources réseau internes accessibles via un client", + "memberPortalResourceDetails": "Détails de la ressource", "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" + "memberPortalCopiedAliasDescription": "L'alias de la ressource a été copié dans votre presse-papiers.", + "memberPortalCopiedDestinationDescription": "La destination de la ressource a été copiée dans votre presse-papiers.", + "memberPortalRequiresClientConnection": "Nécessite une connexion client", + "memberPortalAuthMethods": "Méthodes d'authentification", + "memberPortalSso": "Authentification unique (SSO)", + "memberPortalPasswordProtected": "Protégé par un mot de passe", + "memberPortalPinCode": "Code PIN", + "memberPortalEmailWhitelist": "Liste blanche des e-mails", + "memberPortalResourceDisabled": "Ressource désactivée", + "memberPortalShowingResources": "Affichage de {start}-{end} sur {total} ressources", + "memberPortalPrevious": "Précédent", + "memberPortalNext": "Suivant" } From 864d1d5cc42c86b9a68ec631238f8164ff1eb937 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:28 -0700 Subject: [PATCH 48/99] New translations en-us.json (Bulgarian) [ci skip] --- messages/bg-BG.json | 86 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/messages/bg-BG.json b/messages/bg-BG.json index 4373a1bfd..11fc53fe5 100644 --- a/messages/bg-BG.json +++ b/messages/bg-BG.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "Научете повече", "health": "Здраве", "domainPendingErrorTitle": "Проблем при проверка", - "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" + "memberPortalTitle": "Ресурси", + "memberPortalDescription": "Ресурси, до които имате достъп в тази организация", + "memberPortalSortBy": "Сортиране по...", + "memberPortalSortNameAsc": "Име А-Я", + "memberPortalSortNameDesc": "Име Я-А", + "memberPortalSortDomainAsc": "Домен А-Я", + "memberPortalSortDomainDesc": "Домен Я-А", + "memberPortalSortEnabledFirst": "Активирани Първи", + "memberPortalSortDisabledFirst": "Деактивирани Първи", + "memberPortalRefresh": "Обнови", + "memberPortalRefreshResources": "Обнови ресурсите", + "memberPortalFailedToLoad": "Грешка при зареждане на ресурсите", + "memberPortalFailedToLoadDescription": "Грешка при зареждане на ресурсите. Моля, проверете връзката си и опитайте отново.", + "memberPortalUnableToLoad": "Неуспешно зареждане на ресурси", + "memberPortalTryAgain": "Опитай отново", + "memberPortalNoResourcesFound": "Няма намерени ресурси", + "memberPortalNoResourcesAvailable": "Няма налични ресурси", + "memberPortalNoResourcesMatchSearch": "Няма ресурси, съвпадащи с \"{query}\". Опитайте да промените търсените условия или нулирайте търсенето, за да видите всички ресурси.", + "memberPortalNoResourcesAccess": "Още нямате достъп до ресурси. Свържете се с вашия администратор, за да получите достъп до нужните ресурси.", + "memberPortalClearSearch": "Изчисти търсенето", + "memberPortalPublicResources": "Публични ресурси", + "memberPortalPublicResourcesDescription": "Уеб приложения и услуги, достъпни през браузър", + "memberPortalCopiedToClipboard": "Копирано в клипборда", + "memberPortalCopiedUrlDescription": "URL адресът на ресурса е копиран в клипборда.", + "memberPortalOpenResource": "Отвори ресурса", + "memberPortalPrivateResources": "Частни ресурси", + "memberPortalPrivateResourcesDescription": "Ресурси на вътрешната мрежа, достъпни чрез клиент", + "memberPortalResourceDetails": "Детайли за ресурса", + "memberPortalMode": "Режим", + "memberPortalDestination": "Дестинация", + "memberPortalAlias": "Алиас", + "memberPortalCopiedAliasDescription": "Алиасът на ресурса е копиран в клипборда.", + "memberPortalCopiedDestinationDescription": "Дестинацията на ресурса е копирана в клипборда.", + "memberPortalRequiresClientConnection": "Изисква връзка с клиента", + "memberPortalAuthMethods": "Методи на удостоверяване", + "memberPortalSso": "Единно вход (SSO)", + "memberPortalPasswordProtected": "Защитено с парола", + "memberPortalPinCode": "ПИН код", + "memberPortalEmailWhitelist": "Бял списък на имейли", + "memberPortalResourceDisabled": "Ресурсът е деактивиран", + "memberPortalShowingResources": "Показва {start}-{end} от {total} ресурси", + "memberPortalPrevious": "Предишен", + "memberPortalNext": "Следващ" } From 6270dce86af28e911751fe8300667d54cb34f3dd Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:30 -0700 Subject: [PATCH 49/99] New translations en-us.json (Czech) [ci skip] --- messages/cs-CZ.json | 86 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/messages/cs-CZ.json b/messages/cs-CZ.json index 5b8730010..86571a022 100644 --- a/messages/cs-CZ.json +++ b/messages/cs-CZ.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "Zjistit více", "health": "Zdraví", "domainPendingErrorTitle": "Problém s ověřením", - "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" + "memberPortalTitle": "Zdroje", + "memberPortalDescription": "Zdroje, ke kterým máte v této organizaci přístup", + "memberPortalSortBy": "Řadit podle...", + "memberPortalSortNameAsc": "Názvu A-Z", + "memberPortalSortNameDesc": "Názvu Z-A", + "memberPortalSortDomainAsc": "Domény A-Z", + "memberPortalSortDomainDesc": "Domény Z-A", + "memberPortalSortEnabledFirst": "Nejprve povoleno", + "memberPortalSortDisabledFirst": "Nejprve zakázáno", + "memberPortalRefresh": "Aktualizovat", + "memberPortalRefreshResources": "Aktualizovat zdroje", + "memberPortalFailedToLoad": "Nepodařilo se načíst zdroje", + "memberPortalFailedToLoadDescription": "Nepodařilo se načíst zdroje. Zkontrolujte prosím své připojení a zkuste to znovu.", + "memberPortalUnableToLoad": "Nelze načíst zdroje", + "memberPortalTryAgain": "Zkusit znovu", + "memberPortalNoResourcesFound": "Žádné zdroje nebyly nalezeny", + "memberPortalNoResourcesAvailable": "Žádné zdroje nejsou k dispozici", + "memberPortalNoResourcesMatchSearch": "Žádné zdroje neodpovídají \"{query}\". Zkuste přizpůsobit své vyhledávací termíny nebo vyčistit hledání, abyste viděli všechny zdroje.", + "memberPortalNoResourcesAccess": "Zatím nemáte přístup k žádným zdrojům. Kontaktujte svého správce, aby vám poskytl přístup k potřebným zdrojům.", + "memberPortalClearSearch": "Vymazat hledání", + "memberPortalPublicResources": "Veřejné zdroje", + "memberPortalPublicResourcesDescription": "Webové aplikace a služby přístupné přes prohlížeč", + "memberPortalCopiedToClipboard": "Zkopírováno do schránky", + "memberPortalCopiedUrlDescription": "URL zdroje byla zkopírována do vaší schránky.", + "memberPortalOpenResource": "Otevřít zdroj", + "memberPortalPrivateResources": "Soukromé zdroje", + "memberPortalPrivateResourcesDescription": "Interní síťové zdroje přístupné přes klienta", + "memberPortalResourceDetails": "Podrobnosti o zdroji", + "memberPortalMode": "Režim", + "memberPortalDestination": "Cíl", + "memberPortalAlias": "Přezdívka", + "memberPortalCopiedAliasDescription": "Alias zdroje byl zkopírován do vaší schránky.", + "memberPortalCopiedDestinationDescription": "Cíl zdroje byl zkopírován do vaší schránky.", + "memberPortalRequiresClientConnection": "Vyžaduje klientské připojení", + "memberPortalAuthMethods": "Metody ověřování", + "memberPortalSso": "Jedno přihlášení (SSO)", + "memberPortalPasswordProtected": "Heslo chráněno", + "memberPortalPinCode": "PIN kód", + "memberPortalEmailWhitelist": "Seznam povolených emailů", + "memberPortalResourceDisabled": "Zdroj je zakázán", + "memberPortalShowingResources": "Zobrazeny {start}-{end} z {total} zdrojů", + "memberPortalPrevious": "Předchozí", + "memberPortalNext": "Následující" } From 47b3d26d0e60da9128790f249b8de661fdf29646 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:32 -0700 Subject: [PATCH 50/99] New translations en-us.json (German) [ci skip] --- messages/de-DE.json | 74 ++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/messages/de-DE.json b/messages/de-DE.json index 530e113bb..d0b8e9115 100644 --- a/messages/de-DE.json +++ b/messages/de-DE.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "Mehr erfahren", "health": "Gesundheit", "domainPendingErrorTitle": "Verifizierungsproblem", - "memberPortalTitle": "Resources", - "memberPortalDescription": "Resources you have access to in this organization", - "memberPortalSortBy": "Sort by...", + "memberPortalTitle": "Ressourcen", + "memberPortalDescription": "Ressourcen, auf die Sie in dieser Organisation Zugriff haben", + "memberPortalSortBy": "Sortieren nach...", "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", + "memberPortalSortEnabledFirst": "Zuerst aktiviert", + "memberPortalSortDisabledFirst": "Zuerst deaktiviert", + "memberPortalRefresh": "Aktualisieren", + "memberPortalRefreshResources": "Ressourcen aktualisieren", + "memberPortalFailedToLoad": "Fehler beim Laden der Ressourcen", + "memberPortalFailedToLoadDescription": "Fehler beim Laden der Ressourcen. Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.", + "memberPortalUnableToLoad": "Ressourcen konnten nicht geladen werden", + "memberPortalTryAgain": "Nochmal versuchen", + "memberPortalNoResourcesFound": "Keine Ressourcen gefunden", + "memberPortalNoResourcesAvailable": "Keine Ressourcen verfügbar", + "memberPortalNoResourcesMatchSearch": "Keine Ressourcen passen zu \"{query}\". Versuchen Sie, Ihre Suchbegriffe anzupassen oder die Suche zu löschen, um alle Ressourcen anzuzeigen.", + "memberPortalNoResourcesAccess": "Sie haben noch keinen Zugriff auf Ressourcen. Wenden Sie sich an Ihren Administrator, um Zugriff auf die benötigten Ressourcen zu erhalten.", + "memberPortalClearSearch": "Suchverlauf löschen", + "memberPortalPublicResources": "Öffentliche Ressourcen", + "memberPortalPublicResourcesDescription": "Webanwendungen und Dienste, die über den Browser zugänglich sind", + "memberPortalCopiedToClipboard": "In die Zwischenablage kopiert", + "memberPortalCopiedUrlDescription": "Ressourcen-URL wurde in Ihre Zwischenablage kopiert.", + "memberPortalOpenResource": "Ressource öffnen", + "memberPortalPrivateResources": "Private Ressourcen", + "memberPortalPrivateResourcesDescription": "Interne Netzwerkressourcen, die über den Client zugänglich sind", + "memberPortalResourceDetails": "Ressourcendetails", + "memberPortalMode": "Modus", + "memberPortalDestination": "Ziel", "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", + "memberPortalCopiedAliasDescription": "Ressourcenalias wurde in Ihre Zwischenablage kopiert.", + "memberPortalCopiedDestinationDescription": "Ressourcenziel wurde in Ihre Zwischenablage kopiert.", + "memberPortalRequiresClientConnection": "Erfordert Client-Verbindung", + "memberPortalAuthMethods": "Authentifizierungsmethoden", "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" + "memberPortalPasswordProtected": "Passwortgeschützt", + "memberPortalPinCode": "PIN-Code", + "memberPortalEmailWhitelist": "E-Mail-Whitelist", + "memberPortalResourceDisabled": "Ressource deaktiviert", + "memberPortalShowingResources": "Zeige {start}-{end} von {total} Ressourcen", + "memberPortalPrevious": "Vorherige", + "memberPortalNext": "Nächste" } From ff928b846db7cfb35319ed954176adb466583d20 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:35 -0700 Subject: [PATCH 51/99] New translations en-us.json (Italian) [ci skip] --- messages/it-IT.json | 84 ++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/messages/it-IT.json b/messages/it-IT.json index 24a7cbab4..17040fa30 100644 --- a/messages/it-IT.json +++ b/messages/it-IT.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "Scopri di più", "health": "Salute", "domainPendingErrorTitle": "Problema di Verifica", - "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", + "memberPortalTitle": "Risorse", + "memberPortalDescription": "Risorse a cui hai accesso in questa organizzazione", + "memberPortalSortBy": "Ordina per...", + "memberPortalSortNameAsc": "Nome A-Z", + "memberPortalSortNameDesc": "Nome Z-A", + "memberPortalSortDomainAsc": "Dominio A-Z", + "memberPortalSortDomainDesc": "Dominio Z-A", + "memberPortalSortEnabledFirst": "Abilitati per primi", + "memberPortalSortDisabledFirst": "Disabilitati per primi", + "memberPortalRefresh": "Aggiorna", + "memberPortalRefreshResources": "Aggiorna Risorse", + "memberPortalFailedToLoad": "Caricamento delle risorse non riuscito", + "memberPortalFailedToLoadDescription": "Caricamento delle risorse non riuscito. Controlla la tua connessione e riprova.", + "memberPortalUnableToLoad": "Impossibile caricare le risorse", + "memberPortalTryAgain": "Riprova", + "memberPortalNoResourcesFound": "Nessuna risorsa trovata", + "memberPortalNoResourcesAvailable": "Nessuna risorsa disponibile", + "memberPortalNoResourcesMatchSearch": "Nessuna risorsa corrisponde a \"{query}\". Prova ad aggiustare i termini di ricerca o a cancellare la ricerca per vedere tutte le risorse.", + "memberPortalNoResourcesAccess": "Non hai ancora accesso a nessuna risorsa. Contatta il tuo amministratore per ottenere l'accesso alle risorse di cui hai bisogno.", + "memberPortalClearSearch": "Cancella Ricerca", + "memberPortalPublicResources": "Risorse Pubbliche", + "memberPortalPublicResourcesDescription": "Applicazioni web e servizi accessibili tramite browser", + "memberPortalCopiedToClipboard": "Copiato negli appunti", + "memberPortalCopiedUrlDescription": "L'URL della risorsa è stato copiato negli appunti.", + "memberPortalOpenResource": "Apri Risorsa", + "memberPortalPrivateResources": "Risorse Private", + "memberPortalPrivateResourcesDescription": "Risorse di rete interne accessibili tramite client", + "memberPortalResourceDetails": "Dettagli della Risorsa", + "memberPortalMode": "Modalità", + "memberPortalDestination": "Destinazione", "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" + "memberPortalCopiedAliasDescription": "L'alias della risorsa è stato copiato negli appunti.", + "memberPortalCopiedDestinationDescription": "La destinazione della risorsa è stata copiata negli appunti.", + "memberPortalRequiresClientConnection": "Richiede Connessione Client", + "memberPortalAuthMethods": "Metodi di Autenticazione", + "memberPortalSso": "Accesso unico (Single Sign-On, SSO)", + "memberPortalPasswordProtected": "Protetto da password", + "memberPortalPinCode": "Codice PIN", + "memberPortalEmailWhitelist": "Lista Autorizzazioni Email", + "memberPortalResourceDisabled": "Risorsa Disabilitata", + "memberPortalShowingResources": "Mostrando {start}-{end} di {total} risorse", + "memberPortalPrevious": "Precedente", + "memberPortalNext": "Successivo" } From 08a5785cc5bb3409f60890eecf0c821fe6e4b13a Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:37 -0700 Subject: [PATCH 52/99] New translations en-us.json (Korean) [ci skip] --- messages/ko-KR.json | 86 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/messages/ko-KR.json b/messages/ko-KR.json index 8835dc46b..2fd449a63 100644 --- a/messages/ko-KR.json +++ b/messages/ko-KR.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "자세히 알아보기", "health": "건강", "domainPendingErrorTitle": "확인 문제", - "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" + "memberPortalTitle": "리소스", + "memberPortalDescription": "이 조직에서 접근할 수 있는 리소스", + "memberPortalSortBy": "정렬 기준...", + "memberPortalSortNameAsc": "이름 A-Z", + "memberPortalSortNameDesc": "이름 Z-A", + "memberPortalSortDomainAsc": "도메인 A-Z", + "memberPortalSortDomainDesc": "도메인 Z-A", + "memberPortalSortEnabledFirst": "사용 활성화 우선", + "memberPortalSortDisabledFirst": "사용 비활성화 우선", + "memberPortalRefresh": "새로 고침", + "memberPortalRefreshResources": "리소스 새로 고침", + "memberPortalFailedToLoad": "리소스를 불러오는 데 실패했습니다", + "memberPortalFailedToLoadDescription": "리소스를 불러오는 데 실패했습니다. 연결을 확인하고 다시 시도해 주십시오.", + "memberPortalUnableToLoad": "리소스를 가져오는 데 실패했습니다", + "memberPortalTryAgain": "다시 시도", + "memberPortalNoResourcesFound": "리소스를 발견하지 못했습니다", + "memberPortalNoResourcesAvailable": "사용 가능한 리소스가 없습니다", + "memberPortalNoResourcesMatchSearch": "\"{query}\"와 일치하는 리소스가 없습니다. 검색어를 수정하거나 검색을 초기화하여 모든 리소스를 확인하십시오.", + "memberPortalNoResourcesAccess": "아직 접근할 수 있는 리소스가 없습니다. 필요한 리소스 접근을 위해 관리자에게 문의하세요.", + "memberPortalClearSearch": "검색 초기화", + "memberPortalPublicResources": "공공 리소스", + "memberPortalPublicResourcesDescription": "브라우저를 통해 접근 가능한 웹 애플리케이션 및 서비스", + "memberPortalCopiedToClipboard": "클립보드에 복사됨", + "memberPortalCopiedUrlDescription": "리소스 URL이 클립보드에 복사되었습니다.", + "memberPortalOpenResource": "리소스 열기", + "memberPortalPrivateResources": "비공개 리소스", + "memberPortalPrivateResourcesDescription": "클라이언트를 통해 접근 가능한 내부 네트워크 리소스", + "memberPortalResourceDetails": "리소스 세부 정보", + "memberPortalMode": "모드", + "memberPortalDestination": "대상지", + "memberPortalAlias": "별칭", + "memberPortalCopiedAliasDescription": "리소스 별칭이 클립보드에 복사되었습니다.", + "memberPortalCopiedDestinationDescription": "리소스 대상지가 클립보드에 복사되었습니다.", + "memberPortalRequiresClientConnection": "클라이언트 연결 필요", + "memberPortalAuthMethods": "인증 방법", + "memberPortalSso": "싱글 사인온 (SSO)", + "memberPortalPasswordProtected": "비밀번호 보호", + "memberPortalPinCode": "PIN 코드", + "memberPortalEmailWhitelist": "이메일 화이트리스트", + "memberPortalResourceDisabled": "리소스 비활성화됨", + "memberPortalShowingResources": "{start}-{end} 중 {total}개의 리소스를 표시 중", + "memberPortalPrevious": "이전", + "memberPortalNext": "다음" } From a53da85fb493fe661ffeb50c86c21168f46dd4f1 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:39 -0700 Subject: [PATCH 53/99] New translations en-us.json (Dutch) [ci skip] --- messages/nl-NL.json | 82 ++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/messages/nl-NL.json b/messages/nl-NL.json index e4359dd62..e91c84276 100644 --- a/messages/nl-NL.json +++ b/messages/nl-NL.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "Meer informatie", "health": "Gezondheid", "domainPendingErrorTitle": "Verificatieprobleem", - "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", + "memberPortalTitle": "Bronnen", + "memberPortalDescription": "Bronnen waartoe je toegang hebt binnen deze organisatie", + "memberPortalSortBy": "Sorteren op...", + "memberPortalSortNameAsc": "Naam A-Z", + "memberPortalSortNameDesc": "Naam Z-A", + "memberPortalSortDomainAsc": "Domein A-Z", + "memberPortalSortDomainDesc": "Domein Z-A", + "memberPortalSortEnabledFirst": "Ingeschakeld Eerst", + "memberPortalSortDisabledFirst": "Uitgeschakeld Eerst", + "memberPortalRefresh": "Vernieuwen", + "memberPortalRefreshResources": "Bronnen Vernieuwen", + "memberPortalFailedToLoad": "Fout bij het laden van bronnen", + "memberPortalFailedToLoadDescription": "Fout bij het laden van bronnen. Controleer uw verbinding en probeer het opnieuw.", + "memberPortalUnableToLoad": "Niet in staat om bronnen te laden", + "memberPortalTryAgain": "Probeer Opnieuw", + "memberPortalNoResourcesFound": "Geen Bronnen Gevonden", + "memberPortalNoResourcesAvailable": "Geen Bronnen Beschikbaar", + "memberPortalNoResourcesMatchSearch": "Geen bronnen komen overeen met \"{query}\". Probeer uw zoektermen aan te passen of wis de zoekopdracht om alle bronnen te zien.", + "memberPortalNoResourcesAccess": "Je hebt nog geen toegang tot bronnen. Neem contact op met je beheerder om toegang te krijgen tot de benodigde bronnen.", + "memberPortalClearSearch": "Zoekopdracht Wissen", + "memberPortalPublicResources": "Publieke Bronnen", + "memberPortalPublicResourcesDescription": "Webapplicaties en services toegankelijk via browser", + "memberPortalCopiedToClipboard": "Gekopieerd naar klembord", + "memberPortalCopiedUrlDescription": "Bron URL is naar uw klembord gekopieerd.", + "memberPortalOpenResource": "Bron Openen", + "memberPortalPrivateResources": "Privé Bronnen", + "memberPortalPrivateResourcesDescription": "Interne netwerkbronnen toegankelijk via client", + "memberPortalResourceDetails": "Bron Details", + "memberPortalMode": "Modus", + "memberPortalDestination": "Bestemming", "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", + "memberPortalCopiedAliasDescription": "Bron alias is naar uw klembord gekopieerd.", + "memberPortalCopiedDestinationDescription": "Bron bestemming is naar uw klembord gekopieerd.", + "memberPortalRequiresClientConnection": "Clientverbinding Vereist", + "memberPortalAuthMethods": "Authenticatiemethoden", "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" + "memberPortalPasswordProtected": "Wachtwoord Beveiligd", + "memberPortalPinCode": "Pincode", + "memberPortalEmailWhitelist": "E-mail whitelist", + "memberPortalResourceDisabled": "Bron Uitgeschakeld", + "memberPortalShowingResources": "Toont {start}-{end} van {total} bronnen", + "memberPortalPrevious": "Vorige", + "memberPortalNext": "Volgende" } From 8f52a48937254b62a6babb0c56c5ad827bb245af Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:41 -0700 Subject: [PATCH 54/99] New translations en-us.json (Polish) [ci skip] --- messages/pl-PL.json | 86 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/messages/pl-PL.json b/messages/pl-PL.json index fd21f786a..4b69190c5 100644 --- a/messages/pl-PL.json +++ b/messages/pl-PL.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "Dowiedz się więcej", "health": "Zdrowie", "domainPendingErrorTitle": "Problem z weryfikacją", - "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" + "memberPortalTitle": "Zasoby", + "memberPortalDescription": "Zasoby, do których masz dostęp w tej organizacji", + "memberPortalSortBy": "Sortuj według...", + "memberPortalSortNameAsc": "Nazwa A-Z", + "memberPortalSortNameDesc": "Nazwa Z-A", + "memberPortalSortDomainAsc": "Domena A-Z", + "memberPortalSortDomainDesc": "Domena Z-A", + "memberPortalSortEnabledFirst": "Włączone najpierw", + "memberPortalSortDisabledFirst": "Wyłączone najpierw", + "memberPortalRefresh": "Odśwież", + "memberPortalRefreshResources": "Odśwież zasoby", + "memberPortalFailedToLoad": "Nie udało się załadować zasobów", + "memberPortalFailedToLoadDescription": "Nie udało się załadować zasobów. Sprawdź połączenie i spróbuj ponownie.", + "memberPortalUnableToLoad": "Nie można załadować zasobów", + "memberPortalTryAgain": "Spróbuj ponownie", + "memberPortalNoResourcesFound": "Nie znaleziono zasobów", + "memberPortalNoResourcesAvailable": "Brak dostępnych zasobów", + "memberPortalNoResourcesMatchSearch": "Żadne zasoby nie pasują do „{query}”. Spróbuj dostosować swoje warunki wyszukiwania lub wyczyść wyszukiwanie, aby zobaczyć wszystkie zasoby.", + "memberPortalNoResourcesAccess": "Nie masz jeszcze dostępu do żadnych zasobów. Skontaktuj się z administratorem, aby uzyskać dostęp do potrzebnych zasobów.", + "memberPortalClearSearch": "Wyczyść wyszukiwanie", + "memberPortalPublicResources": "Publiczne zasoby", + "memberPortalPublicResourcesDescription": "Aplikacje i usługi internetowe dostępne za pośrednictwem przeglądarki", + "memberPortalCopiedToClipboard": "Skopiowano do schowka", + "memberPortalCopiedUrlDescription": "URL zasobu został skopiowany do schowka.", + "memberPortalOpenResource": "Otwórz zasób", + "memberPortalPrivateResources": "Prywatne zasoby", + "memberPortalPrivateResourcesDescription": "Zasoby sieci wewnętrznej dostępne za pośrednictwem klienta", + "memberPortalResourceDetails": "Szczegóły zasobu", + "memberPortalMode": "Tryb", + "memberPortalDestination": "Miejsce docelowe", + "memberPortalAlias": "Pseudonim", + "memberPortalCopiedAliasDescription": "Alias zasobu został skopiowany do schowka.", + "memberPortalCopiedDestinationDescription": "Miejsce docelowe zasobu zostało skopiowane do schowka.", + "memberPortalRequiresClientConnection": "Wymaga połączenia z klientem", + "memberPortalAuthMethods": "Metody uwierzytelniania", + "memberPortalSso": "Jednorazowe logowanie (SSO)", + "memberPortalPasswordProtected": "Chronione hasłem", + "memberPortalPinCode": "Kod PIN", + "memberPortalEmailWhitelist": "Biała lista e-mail", + "memberPortalResourceDisabled": "Zasób wyłączony", + "memberPortalShowingResources": "Wyświetlanie zasobów od {start} do {end} z {total}", + "memberPortalPrevious": "Poprzedni", + "memberPortalNext": "Następny" } From 4df27b316c67c89eb900f6493dc3d8158b5371bd Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:43 -0700 Subject: [PATCH 55/99] New translations en-us.json (Portuguese) [ci skip] --- messages/pt-PT.json | 86 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/messages/pt-PT.json b/messages/pt-PT.json index a7c60c38c..ce674a81a 100644 --- a/messages/pt-PT.json +++ b/messages/pt-PT.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "Saiba mais", "health": "Saúde", "domainPendingErrorTitle": "Problema de Verificação", - "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" + "memberPortalTitle": "Recursos", + "memberPortalDescription": "Recursos aos quais você tem acesso nesta organização", + "memberPortalSortBy": "Ordenar por...", + "memberPortalSortNameAsc": "Nome A-Z", + "memberPortalSortNameDesc": "Nome Z-A", + "memberPortalSortDomainAsc": "Domínio A-Z", + "memberPortalSortDomainDesc": "Domínio Z-A", + "memberPortalSortEnabledFirst": "Habilitados Primeiro", + "memberPortalSortDisabledFirst": "Desabilitados Primeiro", + "memberPortalRefresh": "Atualizar", + "memberPortalRefreshResources": "Atualizar Recursos", + "memberPortalFailedToLoad": "Falha ao carregar recursos", + "memberPortalFailedToLoadDescription": "Falha ao carregar recursos. Por favor, verifique sua conexão e tente novamente.", + "memberPortalUnableToLoad": "Incapaz de Carregar Recursos", + "memberPortalTryAgain": "Tentar Novamente", + "memberPortalNoResourcesFound": "Nenhum Recurso Encontrado", + "memberPortalNoResourcesAvailable": "Nenhum Recurso Disponível", + "memberPortalNoResourcesMatchSearch": "Nenhum recurso corresponde a \"{query}\". Tente ajustar seus termos de pesquisa ou limpe a pesquisa para ver todos os recursos.", + "memberPortalNoResourcesAccess": "Você ainda não tem acesso a nenhum recurso. Entre em contato com seu administrador para obter acesso aos recursos que precisa.", + "memberPortalClearSearch": "Limpar Pesquisa", + "memberPortalPublicResources": "Recursos Públicos", + "memberPortalPublicResourcesDescription": "Aplicações e serviços web acessíveis via navegador", + "memberPortalCopiedToClipboard": "Copiado para a área de transferência", + "memberPortalCopiedUrlDescription": "A URL do recurso foi copiada para sua área de transferência.", + "memberPortalOpenResource": "Abrir Recurso", + "memberPortalPrivateResources": "Recursos Privados", + "memberPortalPrivateResourcesDescription": "Recursos da rede interna acessíveis via cliente", + "memberPortalResourceDetails": "Detalhes do Recurso", + "memberPortalMode": "Modo", + "memberPortalDestination": "Destino", + "memberPortalAlias": "Apelido", + "memberPortalCopiedAliasDescription": "O apelido do recurso foi copiado para sua área de transferência.", + "memberPortalCopiedDestinationDescription": "O destino do recurso foi copiado para sua área de transferência.", + "memberPortalRequiresClientConnection": "Requer Conexão de Cliente", + "memberPortalAuthMethods": "Métodos de Autenticação", + "memberPortalSso": "Logon Único (SSO)", + "memberPortalPasswordProtected": "Protegido por Senha", + "memberPortalPinCode": "Código PIN", + "memberPortalEmailWhitelist": "Lista de E-mails Permitidos", + "memberPortalResourceDisabled": "Recurso Desativado", + "memberPortalShowingResources": "Mostrando {start}-{end} de {total} recursos", + "memberPortalPrevious": "Anterior", + "memberPortalNext": "Próximo" } From caaae77f74b457a874265ad491c927be227075cc Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:46 -0700 Subject: [PATCH 56/99] New translations en-us.json (Russian) [ci skip] --- messages/ru-RU.json | 86 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/messages/ru-RU.json b/messages/ru-RU.json index 73fb6de94..8f8579fa9 100644 --- a/messages/ru-RU.json +++ b/messages/ru-RU.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "Узнать больше", "health": "Состояние", "domainPendingErrorTitle": "Проблема с подтверждением", - "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" + "memberPortalTitle": "Ресурсы", + "memberPortalDescription": "Ресурсы, к которым у вас есть доступ в этой организации", + "memberPortalSortBy": "Сортировать по...", + "memberPortalSortNameAsc": "Имя A-Я", + "memberPortalSortNameDesc": "Имя Я-A", + "memberPortalSortDomainAsc": "Домен A-Я", + "memberPortalSortDomainDesc": "Домен Я-A", + "memberPortalSortEnabledFirst": "Включённые сначала", + "memberPortalSortDisabledFirst": "Отключённые сначала", + "memberPortalRefresh": "Обновить", + "memberPortalRefreshResources": "Обновить ресурсы", + "memberPortalFailedToLoad": "Не удалось загрузить ресурсы", + "memberPortalFailedToLoadDescription": "Не удалось загрузить ресурсы. Пожалуйста, проверьте подключение и попробуйте снова.", + "memberPortalUnableToLoad": "Не удалось загрузить ресурсы", + "memberPortalTryAgain": "Попробуйте снова", + "memberPortalNoResourcesFound": "Ресурсы не найдены", + "memberPortalNoResourcesAvailable": "Нет доступных ресурсов", + "memberPortalNoResourcesMatchSearch": "Нет ресурсов, соответствующих \"{query}\". Попробуйте изменить условия поиска или очистить поиск, чтобы увидеть все ресурсы.", + "memberPortalNoResourcesAccess": "У вас пока нет доступа к ресурсам. Свяжитесь с администратором, чтобы получить доступ к нужным вам ресурсам.", + "memberPortalClearSearch": "Очистить поиск", + "memberPortalPublicResources": "Публичные ресурсы", + "memberPortalPublicResourcesDescription": "Веб-приложения и сервисы, доступные через браузер", + "memberPortalCopiedToClipboard": "Скопировано в буфер обмена", + "memberPortalCopiedUrlDescription": "URL ресурса был скопирован в ваш буфер обмена.", + "memberPortalOpenResource": "Открыть ресурс", + "memberPortalPrivateResources": "Приватные ресурсы", + "memberPortalPrivateResourcesDescription": "Ресурсы внутренней сети, доступные через клиент", + "memberPortalResourceDetails": "Детали ресурса", + "memberPortalMode": "Режим", + "memberPortalDestination": "Назначение", + "memberPortalAlias": "Псевдоним", + "memberPortalCopiedAliasDescription": "Псевдоним ресурса был скопирован в ваш буфер обмена.", + "memberPortalCopiedDestinationDescription": "Назначение ресурса было скопировано в ваш буфер обмена.", + "memberPortalRequiresClientConnection": "Требуется подключение клиента", + "memberPortalAuthMethods": "Методы аутентификации", + "memberPortalSso": "Единый вход (SSO)", + "memberPortalPasswordProtected": "Защищено паролем", + "memberPortalPinCode": "PIN-код", + "memberPortalEmailWhitelist": "Белый список email", + "memberPortalResourceDisabled": "Ресурс отключён", + "memberPortalShowingResources": "Показаны {start}-{end} из {total} ресурсов", + "memberPortalPrevious": "Предыдущий", + "memberPortalNext": "Следующий" } From 428f91b5fa34f33d296f6b738e68e5bfa1759990 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:48 -0700 Subject: [PATCH 57/99] New translations en-us.json (Turkish) [ci skip] --- messages/tr-TR.json | 86 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/messages/tr-TR.json b/messages/tr-TR.json index 9684557e7..6aa50e636 100644 --- a/messages/tr-TR.json +++ b/messages/tr-TR.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "Daha fazla bilgi", "health": "Sağlık", "domainPendingErrorTitle": "Doğrulama Sorunu", - "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" + "memberPortalTitle": "Kaynaklar", + "memberPortalDescription": "Bu organizasyondaki erişiminiz olan kaynaklar", + "memberPortalSortBy": "Şuna göre sırala...", + "memberPortalSortNameAsc": "İsim A-Z", + "memberPortalSortNameDesc": "İsim Z-A", + "memberPortalSortDomainAsc": "Alan A-Z", + "memberPortalSortDomainDesc": "Alan Z-A", + "memberPortalSortEnabledFirst": "İlk Etkinleştirilenler", + "memberPortalSortDisabledFirst": "İlk Devre Dışı Bırakılanlar", + "memberPortalRefresh": "Yenile", + "memberPortalRefreshResources": "Kaynakları Yenile", + "memberPortalFailedToLoad": "Kaynaklar yüklenemedi", + "memberPortalFailedToLoadDescription": "Kaynaklar yüklenemedi. Lütfen bağlantınızı kontrol edin ve tekrar deneyin.", + "memberPortalUnableToLoad": "Kaynaklar Yüklenemiyor", + "memberPortalTryAgain": "Tekrar Dene", + "memberPortalNoResourcesFound": "Hiçbir Kaynak Bulunamadı", + "memberPortalNoResourcesAvailable": "Uygun Kaynak Yok", + "memberPortalNoResourcesMatchSearch": "Hiçbir kaynak \"{query}\" ile eşleşmiyor. Arama terimlerinizi değiştirerek veya tüm kaynakları görmek için aramayı temizleyerek deneyin.", + "memberPortalNoResourcesAccess": "Henüz herhangi bir kaynağa erişiminiz yok. İhtiyacınız olan kaynaklara erişim sağlamak için yöneticinizle iletişime geçin.", + "memberPortalClearSearch": "Aramayı Temizle", + "memberPortalPublicResources": "Genel Kaynaklar", + "memberPortalPublicResourcesDescription": "Tarayıcı üzerinden erişilebilen web uygulamaları ve hizmetler", + "memberPortalCopiedToClipboard": "Panoya kopyalandı", + "memberPortalCopiedUrlDescription": "Kaynak URL'si panonuza kopyalandı.", + "memberPortalOpenResource": "Kaynağı Aç", + "memberPortalPrivateResources": "Özel Kaynaklar", + "memberPortalPrivateResourcesDescription": "İstemci üzerinden erişilebilen dahili ağ kaynakları", + "memberPortalResourceDetails": "Kaynak Detayları", + "memberPortalMode": "Mod", + "memberPortalDestination": "Hedef", + "memberPortalAlias": "Takma İsim", + "memberPortalCopiedAliasDescription": "Kaynak takma adı panonuza kopyalandı.", + "memberPortalCopiedDestinationDescription": "Kaynak hedefi panonuza kopyalandı.", + "memberPortalRequiresClientConnection": "İstemci Bağlantısı Gerektirir", + "memberPortalAuthMethods": "Kimlik Doğrulama Yöntemleri", + "memberPortalSso": "Tek Oturum Açma (SSO)", + "memberPortalPasswordProtected": "Parola ile Korunan", + "memberPortalPinCode": "PIN Kodu", + "memberPortalEmailWhitelist": "E-posta Beyaz Listesi", + "memberPortalResourceDisabled": "Kaynak Devre Dışı", + "memberPortalShowingResources": "{total} kaynaktan {start}-{end} gösteriliyor", + "memberPortalPrevious": "Önceki", + "memberPortalNext": "Sonraki" } From 4b777b1488a95934c696460a5589d7c0260360cc Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:50 -0700 Subject: [PATCH 58/99] New translations en-us.json (Chinese Simplified) [ci skip] --- messages/zh-CN.json | 86 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/messages/zh-CN.json b/messages/zh-CN.json index 24f2e1f26..2f80cbe30 100644 --- a/messages/zh-CN.json +++ b/messages/zh-CN.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "了解更多", "health": "健康", "domainPendingErrorTitle": "验证问题", - "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" + "memberPortalTitle": "资源", + "memberPortalDescription": "您在此组织中可以访问的资源", + "memberPortalSortBy": "排序依据……", + "memberPortalSortNameAsc": "名称 A-Z", + "memberPortalSortNameDesc": "名称 Z-A", + "memberPortalSortDomainAsc": "域名 A-Z", + "memberPortalSortDomainDesc": "域名 Z-A", + "memberPortalSortEnabledFirst": "启用优先", + "memberPortalSortDisabledFirst": "禁用优先", + "memberPortalRefresh": "刷新", + "memberPortalRefreshResources": "刷新资源", + "memberPortalFailedToLoad": "加载资源失败", + "memberPortalFailedToLoadDescription": "加载资源失败。请检查您的连接并再试一次。", + "memberPortalUnableToLoad": "无法加载资源", + "memberPortalTryAgain": "再试一次", + "memberPortalNoResourcesFound": "找不到资源", + "memberPortalNoResourcesAvailable": "无可用资源", + "memberPortalNoResourcesMatchSearch": "没有与\"{query}\"匹配的资源。尝试调整您的搜索词或清除搜索以查看所有资源。", + "memberPortalNoResourcesAccess": "您尚无访问任何资源的权限。请联系您的管理员获取所需资源的访问权限。", + "memberPortalClearSearch": "清除搜索", + "memberPortalPublicResources": "公共资源", + "memberPortalPublicResourcesDescription": "通过浏览器可访问的网络应用和服务", + "memberPortalCopiedToClipboard": "已复制到剪贴板", + "memberPortalCopiedUrlDescription": "资源 URL 已复制到您的剪贴板。", + "memberPortalOpenResource": "打开资源", + "memberPortalPrivateResources": "私有资源", + "memberPortalPrivateResourcesDescription": "通过客户端可访问的内部网络资源", + "memberPortalResourceDetails": "资源详情", + "memberPortalMode": "模式", + "memberPortalDestination": "目标", + "memberPortalAlias": "别名", + "memberPortalCopiedAliasDescription": "资源别名已复制到您的剪贴板。", + "memberPortalCopiedDestinationDescription": "资源目的地已复制到您的剪贴板。", + "memberPortalRequiresClientConnection": "需要客户端连接", + "memberPortalAuthMethods": "身份验证方法", + "memberPortalSso": "单一登录 (SSO)", + "memberPortalPasswordProtected": "密码保护", + "memberPortalPinCode": "PIN 码", + "memberPortalEmailWhitelist": "电子邮件白名单", + "memberPortalResourceDisabled": "资源已禁用", + "memberPortalShowingResources": "显示 {start}-{end} 共 {total} 个资源", + "memberPortalPrevious": "上一页", + "memberPortalNext": "下一页" } From 7bb2a5a0a58f2225211e5900f11becddb70300e9 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:52 -0700 Subject: [PATCH 59/99] New translations en-us.json (Norwegian Bokmal) [ci skip] --- messages/nb-NO.json | 86 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/messages/nb-NO.json b/messages/nb-NO.json index 7f428a59f..18ab00bbf 100644 --- a/messages/nb-NO.json +++ b/messages/nb-NO.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "Lær mer", "health": "Helse", "domainPendingErrorTitle": "Verifiseringsproblem", - "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" + "memberPortalTitle": "Ressurser", + "memberPortalDescription": "Ressurser du har tilgang til i denne organisasjonen", + "memberPortalSortBy": "Sorter etter...", + "memberPortalSortNameAsc": "Navn A-Å", + "memberPortalSortNameDesc": "Navn Å-A", + "memberPortalSortDomainAsc": "Domene A-Å", + "memberPortalSortDomainDesc": "Domene Å-A", + "memberPortalSortEnabledFirst": "Aktivert først", + "memberPortalSortDisabledFirst": "Deaktivert først", + "memberPortalRefresh": "Oppdater", + "memberPortalRefreshResources": "Oppdater ressurser", + "memberPortalFailedToLoad": "Kunne ikke laste inn ressurser", + "memberPortalFailedToLoadDescription": "Kunne ikke laste inn ressurser. Vennligst sjekk tilkoblingen din og prøv igjen.", + "memberPortalUnableToLoad": "Kan ikke laste inn ressurser", + "memberPortalTryAgain": "Prøv igjen", + "memberPortalNoResourcesFound": "Ingen ressurser funnet", + "memberPortalNoResourcesAvailable": "Ingen ressurser tilgjengelig", + "memberPortalNoResourcesMatchSearch": "Ingen ressurser samsvarer med \"{query}\". Prøv å justere søkeordene dine eller fjern søket for å se alle ressurser.", + "memberPortalNoResourcesAccess": "Du har ennå ikke tilgang til noen ressurser. Kontakt administratoren din for å få tilgang til de ressursene du trenger.", + "memberPortalClearSearch": "Fjern søk", + "memberPortalPublicResources": "Offentlige ressurser", + "memberPortalPublicResourcesDescription": "Webapplikasjoner og -tjenester tilgjengelige via nettleser", + "memberPortalCopiedToClipboard": "Kopiert til utklippstavlen", + "memberPortalCopiedUrlDescription": "Ressurs-URL er kopiert til utklippstavlen din.", + "memberPortalOpenResource": "Åpne ressurs", + "memberPortalPrivateResources": "Private ressurser", + "memberPortalPrivateResourcesDescription": "Interne nettverksressurser tilgjengelige via klient", + "memberPortalResourceDetails": "Ressursdetaljer", + "memberPortalMode": "Modus", + "memberPortalDestination": "Destinasjon", + "memberPortalAlias": "Navn", + "memberPortalCopiedAliasDescription": "Ressursalias er kopiert til utklippstavlen din.", + "memberPortalCopiedDestinationDescription": "Ressursdestinasjon er kopiert til utklippstavlen din.", + "memberPortalRequiresClientConnection": "Krever klienttilkobling", + "memberPortalAuthMethods": "Autentiseringsmetoder", + "memberPortalSso": "Enkeltpålogging (SSO)", + "memberPortalPasswordProtected": "Passordbeskyttet", + "memberPortalPinCode": "PIN-kode", + "memberPortalEmailWhitelist": "E-post-hviteliste", + "memberPortalResourceDisabled": "Ressurs deaktivert", + "memberPortalShowingResources": "Viser {start}-{end} av {total} ressurser", + "memberPortalPrevious": "Forrige", + "memberPortalNext": "Neste" } From 46b72b9e8c8e0a82fce0445c0ac6c1f01ce03ea8 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 11:14:54 -0700 Subject: [PATCH 60/99] New translations en-us.json (Spanish) [ci skip] --- messages/es-ES.json | 84 ++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/messages/es-ES.json b/messages/es-ES.json index f5b81e55c..75c465fdd 100644 --- a/messages/es-ES.json +++ b/messages/es-ES.json @@ -3209,47 +3209,47 @@ "domainPickerWildcardCertWarningLink": "Más información", "health": "Salud", "domainPendingErrorTitle": "Problema de verificación", - "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", + "memberPortalTitle": "Recursos", + "memberPortalDescription": "Recursos a los que tiene acceso en esta organización", + "memberPortalSortBy": "Ordenar por...", + "memberPortalSortNameAsc": "Nombre A-Z", + "memberPortalSortNameDesc": "Nombre Z-A", + "memberPortalSortDomainAsc": "Dominio A-Z", + "memberPortalSortDomainDesc": "Dominio Z-A", + "memberPortalSortEnabledFirst": "Habilitado Primero", + "memberPortalSortDisabledFirst": "Deshabilitado Primero", + "memberPortalRefresh": "Actualizar", + "memberPortalRefreshResources": "Actualizar Recursos", + "memberPortalFailedToLoad": "No se pudieron cargar los recursos", + "memberPortalFailedToLoadDescription": "No se pudieron cargar los recursos. Por favor, revise su conexión e intente de nuevo.", + "memberPortalUnableToLoad": "No se pudieron cargar los recursos", + "memberPortalTryAgain": "Intentar de Nuevo", + "memberPortalNoResourcesFound": "No se encontraron Recursos", + "memberPortalNoResourcesAvailable": "No Hay Recursos Disponibles", + "memberPortalNoResourcesMatchSearch": "No hay recursos que coincidan con \"{query}\". Intenta ajustar tus términos de búsqueda o limpiar la búsqueda para ver todos los recursos.", + "memberPortalNoResourcesAccess": "Aún no tiene acceso a ningún recurso. Comuníquese con su administrador para obtener acceso a los recursos que necesita.", + "memberPortalClearSearch": "Limpiar Búsqueda", + "memberPortalPublicResources": "Recursos Públicos", + "memberPortalPublicResourcesDescription": "Aplicaciones web y servicios accesibles vía navegador", + "memberPortalCopiedToClipboard": "Copiado al portapapeles", + "memberPortalCopiedUrlDescription": "La URL del recurso ha sido copiada a su portapapeles.", + "memberPortalOpenResource": "Abrir Recurso", + "memberPortalPrivateResources": "Recursos Privados", + "memberPortalPrivateResourcesDescription": "Recursos de red interna accesibles vía cliente", + "memberPortalResourceDetails": "Detalles del Recurso", + "memberPortalMode": "Modo", + "memberPortalDestination": "Destino", "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" + "memberPortalCopiedAliasDescription": "El alias del recurso ha sido copiado a su portapapeles.", + "memberPortalCopiedDestinationDescription": "El destino del recurso ha sido copiado a su portapapeles.", + "memberPortalRequiresClientConnection": "Requiere Conexión de Cliente", + "memberPortalAuthMethods": "Métodos de Autenticación", + "memberPortalSso": "Inicio de Sesión Único (SSO)", + "memberPortalPasswordProtected": "Protegido por Contraseña", + "memberPortalPinCode": "Código PIN", + "memberPortalEmailWhitelist": "Lista Blanca de Correo", + "memberPortalResourceDisabled": "Recurso Deshabilitado", + "memberPortalShowingResources": "Mostrando {start}-{end} de {total} recursos", + "memberPortalPrevious": "Anterior", + "memberPortalNext": "Siguiente" } From dd18375f233872ed97c0d1cc18b7678a42cd5621 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 13:57:17 -0700 Subject: [PATCH 61/99] Fix org selectors --- .../(private)/idp/[idpId]/general/page.tsx | 1 + .../settings/(private)/idp/create/page.tsx | 990 +++++++++--------- src/app/admin/idp/[idpId]/policies/page.tsx | 3 + src/components/AutoProvisionConfigWidget.tsx | 5 +- src/components/RoleMappingConfigFields.tsx | 14 +- 5 files changed, 529 insertions(+), 484 deletions(-) diff --git a/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx b/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx index 69d57345c..b2ad61d67 100644 --- a/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx +++ b/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx @@ -500,6 +500,7 @@ export default function GeneralPage() { onAutoProvisionChange={(checked) => { form.setValue("autoProvision", checked); }} + orgId={orgId as string} roleMappingMode={roleMappingMode} onRoleMappingModeChange={(data) => { setRoleMappingMode(data); diff --git a/src/app/[orgId]/settings/(private)/idp/create/page.tsx b/src/app/[orgId]/settings/(private)/idp/create/page.tsx index a7796e2a9..33ef71eee 100644 --- a/src/app/[orgId]/settings/(private)/idp/create/page.tsx +++ b/src/app/[orgId]/settings/(private)/idp/create/page.tsx @@ -246,523 +246,559 @@ export default function Page() { -
- - - - - {t("idpTitle")} - - - {t("idpCreateSettingsDescription")} - - - - { - applyOidcIdpProviderType(form.setValue, next); - }} - /> +
+ + + + + {t("idpTitle")} + + + {t("idpCreateSettingsDescription")} + + + + { + applyOidcIdpProviderType( + form.setValue, + next + ); + }} + /> - + +
+ + ( + + + {t("name")} + + + + + + {t("idpDisplayName")} + + + + )} + /> + + +
+
+
+ + {/* Auto Provision Settings */} + + + + {t("idpAutoProvisionUsers")} + + + + + + +
- ( - - - {t("name")} - - - - - - {t("idpDisplayName")} - - - - )} + { + form.setValue( + "autoProvision", + checked + ); + }} + orgId={params.orgId as string} + roleMappingMode={roleMappingMode} + onRoleMappingModeChange={(data) => { + setRoleMappingMode(data); + }} + roles={roles} + fixedRoleNames={fixedRoleNames} + onFixedRoleNamesChange={ + setFixedRoleNames + } + mappingBuilderClaimPath={ + mappingBuilderClaimPath + } + onMappingBuilderClaimPathChange={ + setMappingBuilderClaimPath + } + mappingBuilderRules={ + mappingBuilderRules + } + onMappingBuilderRulesChange={ + setMappingBuilderRules + } + rawExpression={rawRoleExpression} + onRawExpressionChange={ + setRawRoleExpression + } + orgMappingField={{ + control: form.control, + name: "orgMapping" + }} /> - -
-
- - {/* Auto Provision Settings */} - - - - {t("idpAutoProvisionUsers")} - - - - - - - -
- - { - form.setValue("autoProvision", checked); - }} - roleMappingMode={roleMappingMode} - onRoleMappingModeChange={(data) => { - setRoleMappingMode(data); - }} - roles={roles} - fixedRoleNames={fixedRoleNames} - onFixedRoleNamesChange={setFixedRoleNames} - mappingBuilderClaimPath={ - mappingBuilderClaimPath - } - onMappingBuilderClaimPathChange={ - setMappingBuilderClaimPath - } - mappingBuilderRules={mappingBuilderRules} - onMappingBuilderRulesChange={ - setMappingBuilderRules - } - rawExpression={rawRoleExpression} - onRawExpressionChange={setRawRoleExpression} - orgMappingField={{ - control: form.control, - name: "orgMapping" - }} - /> - - -
-
- - {form.watch("type") === "google" && ( - - - - {t("idpGoogleConfigurationTitle")} - - - {t("idpGoogleConfigurationDescription")} - - - - -
- - ( - - - {t("idpClientId")} - - - - - - {t( - "idpGoogleClientIdDescription" - )} - - - - )} - /> - - ( - - - {t("idpClientSecret")} - - - - - - {t( - "idpGoogleClientSecretDescription" - )} - - - - )} - /> - - -
- )} - {form.watch("type") === "azure" && ( - - - - {t("idpAzureConfigurationTitle")} - - - {t("idpAzureConfigurationDescription")} - - - - -
- - ( - - - {t("idpTenantIdLabel")} - - - - - - {t( - "idpAzureTenantIdDescription" - )} - - - - )} - /> - - ( - - - {t("idpClientId")} - - - - - - {t( - "idpAzureClientIdDescription2" - )} - - - - )} - /> - - ( - - - {t("idpClientSecret")} - - - - - - {t( - "idpAzureClientSecretDescription2" - )} - - - - )} - /> - - -
-
-
- )} - - {form.watch("type") === "oidc" && ( - + {form.watch("type") === "google" && ( - {t("idpOidcConfigure")} + {t("idpGoogleConfigurationTitle")} - {t("idpOidcConfigureDescription")} + {t("idpGoogleConfigurationDescription")} -
- - ( - - - {t("idpClientId")} - - - - - - {t( - "idpClientIdDescription" - )} - - - + + + + > + ( + + + {t("idpClientId")} + + + + + + {t( + "idpGoogleClientIdDescription" + )} + + + + )} + /> - ( - - - {t("idpClientSecret")} - - - - - - {t( - "idpClientSecretDescription" - )} - - - - )} - /> - - ( - - - {t("idpAuthUrl")} - - - - - - {t( - "idpAuthUrlDescription" - )} - - - - )} - /> - - ( - - - {t("idpTokenUrl")} - - - - - - {t( - "idpTokenUrlDescription" - )} - - - - )} - /> - - + ( + + + {t( + "idpClientSecret" + )} + + + + + + {t( + "idpGoogleClientSecretDescription" + )} + + + + )} + /> + + +
+ )} + {form.watch("type") === "azure" && ( - {t("idpToken")} + {t("idpAzureConfigurationTitle")} - {t("idpTokenDescription")} + {t("idpAzureConfigurationDescription")} -
- - ( - - - {t("idpJmespathLabel")} - - - - - - {t( - "idpJmespathLabelDescription" - )} - - - + + + + > + ( + + + {t( + "idpTenantIdLabel" + )} + + + + + + {t( + "idpAzureTenantIdDescription" + )} + + + + )} + /> - ( - - - {t( - "idpJmespathEmailPathOptional" - )} - - - - - - {t( - "idpJmespathEmailPathOptionalDescription" - )} - - - - )} - /> + ( + + + {t("idpClientId")} + + + + + + {t( + "idpAzureClientIdDescription2" + )} + + + + )} + /> - ( - - - {t( - "idpJmespathNamePathOptional" - )} - - - - - - {t( - "idpJmespathNamePathOptionalDescription" - )} - - - - )} - /> - - ( - - - {t( - "idpOidcConfigureScopes" - )} - - - - - - {t( - "idpOidcConfigureScopesDescription" - )} - - - - )} - /> - - + ( + + + {t( + "idpClientSecret" + )} + + + + + + {t( + "idpAzureClientSecretDescription2" + )} + + + + )} + /> + + +
-
- )} -
+ )} -
- - -
+ {form.watch("type") === "oidc" && ( + + + + + {t("idpOidcConfigure")} + + + {t("idpOidcConfigureDescription")} + + + +
+ + ( + + + {t("idpClientId")} + + + + + + {t( + "idpClientIdDescription" + )} + + + + )} + /> + + ( + + + {t( + "idpClientSecret" + )} + + + + + + {t( + "idpClientSecretDescription" + )} + + + + )} + /> + + ( + + + {t("idpAuthUrl")} + + + + + + {t( + "idpAuthUrlDescription" + )} + + + + )} + /> + + ( + + + {t("idpTokenUrl")} + + + + + + {t( + "idpTokenUrlDescription" + )} + + + + )} + /> + + +
+
+ + + + + {t("idpToken")} + + + {t("idpTokenDescription")} + + + +
+ + ( + + + {t( + "idpJmespathLabel" + )} + + + + + + {t( + "idpJmespathLabelDescription" + )} + + + + )} + /> + + ( + + + {t( + "idpJmespathEmailPathOptional" + )} + + + + + + {t( + "idpJmespathEmailPathOptionalDescription" + )} + + + + )} + /> + + ( + + + {t( + "idpJmespathNamePathOptional" + )} + + + + + + {t( + "idpJmespathNamePathOptionalDescription" + )} + + + + )} + /> + + ( + + + {t( + "idpOidcConfigureScopes" + )} + + + + + + {t( + "idpOidcConfigureScopesDescription" + )} + + + + )} + /> + + +
+
+
+ )} + + +
+ + +
); diff --git a/src/app/admin/idp/[idpId]/policies/page.tsx b/src/app/admin/idp/[idpId]/policies/page.tsx index e9438da33..e1a098e83 100644 --- a/src/app/admin/idp/[idpId]/policies/page.tsx +++ b/src/app/admin/idp/[idpId]/policies/page.tsx @@ -681,6 +681,9 @@ export default function PoliciesPage() { control: form.control, name: "orgMapping" }} + orgId={ + editingPolicy?.orgId || policyFormOrgId + } roleMappingFieldIdPrefix="admin-idp-policy-role" roleMappingMode={policyRoleMappingMode} onRoleMappingModeChange={ diff --git a/src/components/AutoProvisionConfigWidget.tsx b/src/components/AutoProvisionConfigWidget.tsx index 4767544d0..4cf939444 100644 --- a/src/components/AutoProvisionConfigWidget.tsx +++ b/src/components/AutoProvisionConfigWidget.tsx @@ -47,6 +47,7 @@ type AutoProvisionConfigWidgetProps = { roleMappingFieldIdPrefix?: string; showFreeformRoleNamesHint?: boolean; autoProvisionSwitchId?: string; + orgId?: string; }; export default function AutoProvisionConfigWidget({ @@ -67,7 +68,8 @@ export default function AutoProvisionConfigWidget({ showAutoProvisionSwitch = true, roleMappingFieldIdPrefix = "org-idp-auto-provision", showFreeformRoleNamesHint = false, - autoProvisionSwitchId = "auto-provision-toggle" + autoProvisionSwitchId = "auto-provision-toggle", + orgId }: AutoProvisionConfigWidgetProps) { const t = useTranslations(); const { isPaidUser } = usePaidStatus(); @@ -106,6 +108,7 @@ export default function AutoProvisionConfigWidget({ showFreeformRoleNamesHint={ showFreeformRoleNamesHint } + orgId={orgId} roleMappingMode={roleMappingMode} onRoleMappingModeChange={onRoleMappingModeChange} roles={roles} diff --git a/src/components/RoleMappingConfigFields.tsx b/src/components/RoleMappingConfigFields.tsx index 906f85f62..08b4e36bc 100644 --- a/src/components/RoleMappingConfigFields.tsx +++ b/src/components/RoleMappingConfigFields.tsx @@ -17,7 +17,6 @@ import { useEnvContext } from "@app/hooks/useEnvContext"; import { tierMatrix } from "@server/lib/billing/tierMatrix"; import { build } from "@server/build"; import { RolesSelector } from "./roles-selector"; -import { useParams } from "next/navigation"; export type RoleMappingRoleOption = { roleId: number; @@ -40,6 +39,8 @@ export type RoleMappingConfigFieldsProps = { fieldIdPrefix?: string; /** When true, show extra hint for global default policies (no org role list). */ showFreeformRoleNamesHint?: boolean; + /** Org ID to use for role lookup. Falls back to URL params when not provided. */ + orgId?: string; }; export default function RoleMappingConfigFields({ @@ -55,14 +56,13 @@ export default function RoleMappingConfigFields({ rawExpression, onRawExpressionChange, fieldIdPrefix = "role-mapping", - showFreeformRoleNamesHint = false + showFreeformRoleNamesHint = false, + orgId }: RoleMappingConfigFieldsProps) { const t = useTranslations(); const { env } = useEnvContext(); const { isPaidUser } = usePaidStatus(); - const { orgId } = useParams(); - const supportsMultipleRolesPerUser = isPaidUser(tierMatrix.fullRbac); const showSingleRoleDisclaimer = !env.flags.disableEnterpriseFeatures && @@ -242,6 +242,7 @@ export default function RoleMappingConfigFields({ showFreeformRoleNamesHint={ showFreeformRoleNamesHint } + orgId={orgId} supportsMultipleRolesPerUser={ supportsMultipleRolesPerUser } @@ -318,7 +319,8 @@ function BuilderRuleRow({ supportsMultipleRolesPerUser, showRemoveButton, onChange, - onRemove + onRemove, + orgId }: { rule: MappingBuilderRule; roleOptions: Tag[]; @@ -330,10 +332,10 @@ function BuilderRuleRow({ showRemoveButton: boolean; onChange: (rule: MappingBuilderRule) => void; onRemove: () => void; + orgId?: string; }) { const t = useTranslations(); const [activeTagIndex, setActiveTagIndex] = useState(null); - const { orgId } = useParams(); return (
Date: Wed, 6 May 2026 14:05:18 -0700 Subject: [PATCH 62/99] Fix the input to be tags --- src/components/RoleMappingConfigFields.tsx | 118 ++++++++++++++++----- 1 file changed, 89 insertions(+), 29 deletions(-) diff --git a/src/components/RoleMappingConfigFields.tsx b/src/components/RoleMappingConfigFields.tsx index 08b4e36bc..3fa96fc86 100644 --- a/src/components/RoleMappingConfigFields.tsx +++ b/src/components/RoleMappingConfigFields.tsx @@ -95,6 +95,10 @@ export default function RoleMappingConfigFields({ } }, [supportsMultipleRolesPerUser, fixedRoleNames, onFixedRoleNamesChange]); + const [fixedRolesActiveTagIndex, setFixedRolesActiveTagIndex] = useState< + number | null + >(null); + const fixedRadioId = `${fieldIdPrefix}-fixed-roles-mode`; const builderRadioId = `${fieldIdPrefix}-mapping-builder-mode`; const rawRadioId = `${fieldIdPrefix}-raw-expression-mode`; @@ -161,38 +165,94 @@ export default function RoleMappingConfigFields({ {roleMappingMode === "fixedRoles" && (
- ({ - id: name, - text: name - }))} - mapRolesByName - orgId={orgId as string} - onSelectRoles={(nextTags) => { - let names = [ - ...new Set(nextTags.map((tag) => tag.text)) - ]; + {restrictToOrgRoles ? ( + ({ + id: name, + text: name + }))} + mapRolesByName + orgId={orgId as string} + onSelectRoles={(nextTags) => { + let names = [ + ...new Set(nextTags.map((tag) => tag.text)) + ]; - if (!supportsMultipleRolesPerUser) { - if ( - names.length === 0 && - fixedRoleNames.length > 0 - ) { - onFixedRoleNamesChange([ - fixedRoleNames[ - fixedRoleNames.length - 1 - ]! - ]); - return; + if (!supportsMultipleRolesPerUser) { + if ( + names.length === 0 && + fixedRoleNames.length > 0 + ) { + onFixedRoleNamesChange([ + fixedRoleNames[ + fixedRoleNames.length - 1 + ]! + ]); + return; + } + if (names.length > 1) { + names = [names[names.length - 1]!]; + } } - if (names.length > 1) { - names = [names[names.length - 1]!]; - } - } - onFixedRoleNamesChange(names); - }} - /> + onFixedRoleNamesChange(names); + }} + /> + ) : ( + ({ + id: name, + text: name + }))} + setTags={(nextTags) => { + const prev = fixedRoleNames.map((name) => ({ + id: name, + text: name + })); + const next = + typeof nextTags === "function" + ? nextTags(prev) + : nextTags; + + let names = [ + ...new Set(next.map((tag) => tag.text)) + ]; + + if (!supportsMultipleRolesPerUser) { + if ( + names.length === 0 && + fixedRoleNames.length > 0 + ) { + onFixedRoleNamesChange([ + fixedRoleNames[ + fixedRoleNames.length - 1 + ]! + ]); + return; + } + if (names.length > 1) { + names = [names[names.length - 1]!]; + } + } + + onFixedRoleNamesChange(names); + }} + activeTagIndex={fixedRolesActiveTagIndex} + setActiveTagIndex={setFixedRolesActiveTagIndex} + placeholder={t( + "roleMappingAssignRolesPlaceholderFreeform" + )} + enableAutocomplete={false} + autocompleteOptions={roleOptions} + restrictTagsToAutocompleteOptions={false} + allowDuplicates={false} + sortTags={true} + size="sm" + styleClasses={{ + inlineTagsContainer: "min-w-0 max-w-full" + }} + /> + )} {showFreeformRoleNamesHint ? t("roleMappingFixedRolesDescriptionDefaultPolicy") From a8c50b86185f10e98322ad4bd2e9e7e7a34bc754 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 14:08:28 -0700 Subject: [PATCH 63/99] Add clear certificates pangctl command --- cli/commands/clearCertificates.ts | 28 ++++++++++++++++++++++++++++ cli/index.ts | 2 ++ 2 files changed, 30 insertions(+) create mode 100644 cli/commands/clearCertificates.ts diff --git a/cli/commands/clearCertificates.ts b/cli/commands/clearCertificates.ts new file mode 100644 index 000000000..ff6ef8239 --- /dev/null +++ b/cli/commands/clearCertificates.ts @@ -0,0 +1,28 @@ +import { CommandModule } from "yargs"; +import { db, certificates } from "@server/db"; + +type ClearCertificatesArgs = {}; + +export const clearCertificates: CommandModule<{}, ClearCertificatesArgs> = { + command: "clear-certificates", + describe: "Delete all entries from the certificates table", + builder: (yargs) => { + return yargs; + }, + handler: async (argv: {}) => { + try { + console.log("Clearing all certificates from the database..."); + + const deleted = await db.delete(certificates).returning(); + + console.log( + `Deleted ${deleted.length} certificate(s) from the database` + ); + + process.exit(0); + } catch (error) { + console.error("Error:", error); + process.exit(1); + } + } +}; diff --git a/cli/index.ts b/cli/index.ts index 7605904ee..3664bb8f8 100644 --- a/cli/index.ts +++ b/cli/index.ts @@ -9,6 +9,7 @@ import { rotateServerSecret } from "./commands/rotateServerSecret"; import { clearLicenseKeys } from "./commands/clearLicenseKeys"; import { deleteClient } from "./commands/deleteClient"; import { generateOrgCaKeys } from "./commands/generateOrgCaKeys"; +import { clearCertificates } from "./commands/clearCertificates"; yargs(hideBin(process.argv)) .scriptName("pangctl") @@ -19,5 +20,6 @@ yargs(hideBin(process.argv)) .command(clearLicenseKeys) .command(deleteClient) .command(generateOrgCaKeys) + .command(clearCertificates) .demandCommand() .help().argv; From 19f89562189ef7f2c9367473d2b1205159e82bfd Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 14:30:57 -0700 Subject: [PATCH 64/99] Support flattened data fields --- server/private/lib/alerts/sendAlertWebhook.ts | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/server/private/lib/alerts/sendAlertWebhook.ts b/server/private/lib/alerts/sendAlertWebhook.ts index dd5088a6c..27e142cc4 100644 --- a/server/private/lib/alerts/sendAlertWebhook.ts +++ b/server/private/lib/alerts/sendAlertWebhook.ts @@ -236,15 +236,43 @@ interface TemplateContext { } /** - * Render a body template with {{event}}, {{timestamp}}, {{status}}, and - * {{data}} placeholders, mirroring the logic in HttpLogDestination. + * Render a body template with {{event}}, {{timestamp}}, {{status}}, {{data}}, + * and individual data-field placeholders (e.g. {{orgId}}, {{siteId}}, …). * - * {{data}} is replaced first (as raw JSON) so that any literal "{{…}}" - * strings inside data values are not re-expanded. + * Replacement order: + * 1. {{data}} → raw JSON of the full data object (prevents re-expansion of + * nested values that might look like placeholders). + * 2. Top-level scalar fields from data (string values are JSON-escaped; + * numbers and booleans are rendered as-is). Unknown placeholders are + * left untouched. + * 3. The fixed top-level keys: event, timestamp, status. */ function renderTemplate(template: string, ctx: TemplateContext): string { - const rendered = template - .replace(/\{\{data\}\}/g, JSON.stringify(ctx.data)) + // Step 1 – expand {{data}} first so its contents are already serialised + // and won't be touched by later passes. + let rendered = template.replace(/\{\{data\}\}/g, JSON.stringify(ctx.data)); + + // Step 2 – expand individual data fields. Only replace placeholders whose + // key actually exists in ctx.data; leave everything else as-is. + for (const [key, value] of Object.entries(ctx.data)) { + if (value === null || value === undefined) continue; + const placeholder = new RegExp( + `\\{\\{${key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\}\\}`, + "g" + ); + let serialised: string; + if (typeof value === "string") { + serialised = escapeJsonString(value); + } else if (typeof value === "number" || typeof value === "boolean") { + serialised = String(value); + } else { + serialised = escapeJsonString(JSON.stringify(value)); + } + rendered = rendered.replace(placeholder, serialised); + } + + // Step 3 – expand the fixed top-level keys. + rendered = rendered .replace(/\{\{event\}\}/g, escapeJsonString(ctx.event)) .replace(/\{\{timestamp\}\}/g, escapeJsonString(ctx.timestamp)) .replace(/\{\{status\}\}/g, escapeJsonString(ctx.status)); From f01c9ee41cd8332d01de496a0811e66e70aa1890 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 14:45:18 -0700 Subject: [PATCH 65/99] Try to fix time issue Fixes #3007 --- server/lib/statusHistory.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/server/lib/statusHistory.ts b/server/lib/statusHistory.ts index 3a9b1f6ef..8db76bbb0 100644 --- a/server/lib/statusHistory.ts +++ b/server/lib/statusHistory.ts @@ -24,8 +24,11 @@ export async function getCachedStatusHistory( return cached; } - const nowSec = Math.floor(Date.now() / 1000); - const startSec = nowSec - days * 86400; + // Anchor to UTC midnight so the query window aligns with stable calendar days + const utcToday = new Date(); + utcToday.setUTCHours(0, 0, 0, 0); + const todayMidnightSec = Math.floor(utcToday.getTime() / 1000); + const startSec = todayMidnightSec - days * 86400; const events = await logsDb .select() @@ -110,11 +113,18 @@ export function computeBuckets( days: number ): { buckets: StatusHistoryDayBucket[]; totalDowntime: number } { const nowSec = Math.floor(Date.now() / 1000); + + // Anchor bucket boundaries to UTC midnight so dates are stable calendar days + // and don't drift as the cache expires and is recomputed + const utcToday = new Date(); + utcToday.setUTCHours(0, 0, 0, 0); + const todayMidnightSec = Math.floor(utcToday.getTime() / 1000); + const buckets: StatusHistoryDayBucket[] = []; let totalDowntime = 0; for (let d = 0; d < days; d++) { - const dayStartSec = nowSec - (days - d) * 86400; + const dayStartSec = todayMidnightSec - (days - d) * 86400; const dayEndSec = dayStartSec + 86400; const dayEvents = events.filter( From af1739fbcb84bfd7ece7ca199de8bc2f187fd7a7 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 15:15:03 -0700 Subject: [PATCH 66/99] Bump version --- server/lib/consts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/consts.ts b/server/lib/consts.ts index 3d290d93b..b71b3299f 100644 --- a/server/lib/consts.ts +++ b/server/lib/consts.ts @@ -2,7 +2,7 @@ import path from "path"; import { fileURLToPath } from "url"; // This is a placeholder value replaced by the build process -export const APP_VERSION = "1.18.2"; +export const APP_VERSION = "1.18.3"; export const __FILENAME = fileURLToPath(import.meta.url); export const __DIRNAME = path.dirname(__FILENAME); From ce7df5ddaa8c99136c352e380debaaa7556b1420 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 15:19:13 -0700 Subject: [PATCH 67/99] Update log message --- server/setup/scriptsPg/1.18.3.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/setup/scriptsPg/1.18.3.ts b/server/setup/scriptsPg/1.18.3.ts index 301ed820c..e71de3f89 100644 --- a/server/setup/scriptsPg/1.18.3.ts +++ b/server/setup/scriptsPg/1.18.3.ts @@ -3,6 +3,8 @@ import { sql } from "drizzle-orm"; const version = "1.18.3"; +await migration(); + export default async function migration() { console.log(`Running setup script ${version}...`); @@ -77,7 +79,7 @@ export default async function migration() { } console.log( - `Migrated ${existingHealthChecks.length} targetHealthCheck row(s) with corrected IDs` + `Updated names for ${existingHealthChecks.length} existing targetHealthCheck row(s)` ); } catch (e) { console.error("Error while migrating targetHealthCheck rows:", e); From 49c73193422a6ed6b210a12e2d6b0bc2f6241e3a Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 15:51:05 -0700 Subject: [PATCH 68/99] Format and make the error a warning --- server/private/lib/alerts/processAlerts.ts | 25 ++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/server/private/lib/alerts/processAlerts.ts b/server/private/lib/alerts/processAlerts.ts index a08a55494..c6e7ded9a 100644 --- a/server/private/lib/alerts/processAlerts.ts +++ b/server/private/lib/alerts/processAlerts.ts @@ -29,7 +29,10 @@ import { decrypt } from "@server/lib/crypto"; import logger from "@server/logger"; import { sendAlertWebhook } from "./sendAlertWebhook"; import { sendAlertEmail } from "./sendAlertEmail"; -import { AlertContext, WebhookAlertConfig } from "@server/routers/alertRule/types"; +import { + AlertContext, + WebhookAlertConfig +} from "@server/routers/alertRule/types"; /** * Core alert processing pipeline. @@ -99,7 +102,10 @@ export async function processAlerts(context: AlertContext): Promise { baseConditions, or( eq(alertRules.allHealthChecks, true), - eq(alertHealthChecks.healthCheckId, context.healthCheckId) + eq( + alertHealthChecks.healthCheckId, + context.healthCheckId + ) ) ) ); @@ -208,14 +214,19 @@ async function processRule( for (const action of emailActions) { try { - const recipients = await resolveEmailRecipients(action.emailActionId); + const recipients = await resolveEmailRecipients( + action.emailActionId + ); if (recipients.length > 0) { await sendAlertEmail(recipients, context); await db .update(alertEmailActions) .set({ lastSentAt: now }) .where( - eq(alertEmailActions.emailActionId, action.emailActionId) + eq( + alertEmailActions.emailActionId, + action.emailActionId + ) ); } } catch (err) { @@ -269,7 +280,7 @@ async function processRule( ) ); } catch (err) { - logger.error( + logger.warn( `processAlerts: failed to send alert webhook for action ${action.webhookActionId}`, err ); @@ -289,7 +300,9 @@ async function processRule( * - All users in a role (by `roleId`, resolved via `userOrgRoles`) * - Direct external email addresses */ -async function resolveEmailRecipients(emailActionId: number): Promise { +async function resolveEmailRecipients( + emailActionId: number +): Promise { const rows = await db .select() .from(alertEmailRecipients) From 65ee9b9544ad4587379b95f0565424046f153e5e Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 15:53:46 -0700 Subject: [PATCH 69/99] Add transaction to alias address picking --- server/lib/blueprints/clientResources.ts | 2 +- server/lib/ip.ts | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/server/lib/blueprints/clientResources.ts b/server/lib/blueprints/clientResources.ts index 21476b580..22b951870 100644 --- a/server/lib/blueprints/clientResources.ts +++ b/server/lib/blueprints/clientResources.ts @@ -361,7 +361,7 @@ export async function updateClientResources( } else { let aliasAddress: string | null = null; if (resourceData.mode === "host" || resourceData.mode === "http") { - aliasAddress = await getNextAvailableAliasAddress(orgId); + aliasAddress = await getNextAvailableAliasAddress(orgId, trx); } let domainInfo: diff --git a/server/lib/ip.ts b/server/lib/ip.ts index 929399f7b..1d72a5f43 100644 --- a/server/lib/ip.ts +++ b/server/lib/ip.ts @@ -372,9 +372,10 @@ export async function getNextAvailableClientSubnet( } export async function getNextAvailableAliasAddress( - orgId: string + orgId: string, + trx: Transaction | typeof db = db ): Promise { - const [org] = await db.select().from(orgs).where(eq(orgs.orgId, orgId)); + const [org] = await trx.select().from(orgs).where(eq(orgs.orgId, orgId)); if (!org) { throw new Error(`Organization with ID ${orgId} not found`); @@ -390,7 +391,7 @@ export async function getNextAvailableAliasAddress( ); } - const existingAddresses = await db + const existingAddresses = await trx .select({ aliasAddress: siteResources.aliasAddress }) @@ -478,7 +479,12 @@ export type Alias = { alias: string | null; aliasAddress: string | null }; export function generateAliasConfig(allSiteResources: SiteResource[]): Alias[] { return allSiteResources - .filter((sr) => sr.aliasAddress && ((sr.alias && sr.mode == "host") || (sr.fullDomain && sr.mode == "http"))) + .filter( + (sr) => + sr.aliasAddress && + ((sr.alias && sr.mode == "host") || + (sr.fullDomain && sr.mode == "http")) + ) .map((sr) => ({ alias: sr.alias || sr.fullDomain, aliasAddress: sr.aliasAddress From b046ab75134deffb06fe71c08b20fbb7cc23e514 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 15:58:51 -0700 Subject: [PATCH 70/99] Add locks to allocations --- server/lib/ip.ts | 202 ++++++++++++++++++++++++++--------------------- 1 file changed, 114 insertions(+), 88 deletions(-) diff --git a/server/lib/ip.ts b/server/lib/ip.ts index 1d72a5f43..9989b978f 100644 --- a/server/lib/ip.ts +++ b/server/lib/ip.ts @@ -6,6 +6,7 @@ import z from "zod"; import logger from "@server/logger"; import semver from "semver"; import { getValidCertificatesForDomains } from "#dynamic/lib/certificates"; +import { lockManager } from "#dynamic/lib/lock"; interface IPRange { start: bigint; @@ -327,121 +328,146 @@ export async function getNextAvailableClientSubnet( orgId: string, transaction: Transaction | typeof db = db ): Promise { - const [org] = await transaction - .select() - .from(orgs) - .where(eq(orgs.orgId, orgId)); + return await lockManager.withLock( + `client-subnet-allocation:${orgId}`, + async () => { + const [org] = await transaction + .select() + .from(orgs) + .where(eq(orgs.orgId, orgId)); - if (!org) { - throw new Error(`Organization with ID ${orgId} not found`); - } + if (!org) { + throw new Error(`Organization with ID ${orgId} not found`); + } - if (!org.subnet) { - throw new Error(`Organization with ID ${orgId} has no subnet defined`); - } + if (!org.subnet) { + throw new Error( + `Organization with ID ${orgId} has no subnet defined` + ); + } - const existingAddressesSites = await transaction - .select({ - address: sites.address - }) - .from(sites) - .where(and(isNotNull(sites.address), eq(sites.orgId, orgId))); + const existingAddressesSites = await transaction + .select({ + address: sites.address + }) + .from(sites) + .where(and(isNotNull(sites.address), eq(sites.orgId, orgId))); - const existingAddressesClients = await transaction - .select({ - address: clients.subnet - }) - .from(clients) - .where(and(isNotNull(clients.subnet), eq(clients.orgId, orgId))); + const existingAddressesClients = await transaction + .select({ + address: clients.subnet + }) + .from(clients) + .where( + and(isNotNull(clients.subnet), eq(clients.orgId, orgId)) + ); - const addresses = [ - ...existingAddressesSites.map( - (site) => `${site.address?.split("/")[0]}/32` - ), // we are overriding the 32 so that we pick individual addresses in the subnet of the org for the site and the client even though they are stored with the /block_size of the org - ...existingAddressesClients.map( - (client) => `${client.address.split("/")}/32` - ) - ].filter((address) => address !== null) as string[]; + const addresses = [ + ...existingAddressesSites.map( + (site) => `${site.address?.split("/")[0]}/32` + ), // we are overriding the 32 so that we pick individual addresses in the subnet of the org for the site and the client even though they are stored with the /block_size of the org + ...existingAddressesClients.map( + (client) => `${client.address.split("/")}/32` + ) + ].filter((address) => address !== null) as string[]; - const subnet = findNextAvailableCidr(addresses, 32, org.subnet); // pick the sites address in the org - if (!subnet) { - throw new Error("No available subnets remaining in space"); - } + const subnet = findNextAvailableCidr(addresses, 32, org.subnet); // pick the sites address in the org + if (!subnet) { + throw new Error("No available subnets remaining in space"); + } - return subnet; + return subnet; + } + ); } export async function getNextAvailableAliasAddress( orgId: string, trx: Transaction | typeof db = db ): Promise { - const [org] = await trx.select().from(orgs).where(eq(orgs.orgId, orgId)); + return await lockManager.withLock( + `alias-address-allocation:${orgId}`, + async () => { + const [org] = await trx + .select() + .from(orgs) + .where(eq(orgs.orgId, orgId)); - if (!org) { - throw new Error(`Organization with ID ${orgId} not found`); - } + if (!org) { + throw new Error(`Organization with ID ${orgId} not found`); + } - if (!org.subnet) { - throw new Error(`Organization with ID ${orgId} has no subnet defined`); - } + if (!org.subnet) { + throw new Error( + `Organization with ID ${orgId} has no subnet defined` + ); + } - if (!org.utilitySubnet) { - throw new Error( - `Organization with ID ${orgId} has no utility subnet defined` - ); - } + if (!org.utilitySubnet) { + throw new Error( + `Organization with ID ${orgId} has no utility subnet defined` + ); + } - const existingAddresses = await trx - .select({ - aliasAddress: siteResources.aliasAddress - }) - .from(siteResources) - .where( - and( - isNotNull(siteResources.aliasAddress), - eq(siteResources.orgId, orgId) - ) - ); + const existingAddresses = await trx + .select({ + aliasAddress: siteResources.aliasAddress + }) + .from(siteResources) + .where( + and( + isNotNull(siteResources.aliasAddress), + eq(siteResources.orgId, orgId) + ) + ); - const addresses = [ - ...existingAddresses.map( - (site) => `${site.aliasAddress?.split("/")[0]}/32` - ), - // reserve a /29 for the dns server and other stuff - `${org.utilitySubnet.split("/")[0]}/29` - ].filter((address) => address !== null) as string[]; + const addresses = [ + ...existingAddresses.map( + (site) => `${site.aliasAddress?.split("/")[0]}/32` + ), + // reserve a /29 for the dns server and other stuff + `${org.utilitySubnet.split("/")[0]}/29` + ].filter((address) => address !== null) as string[]; - let subnet = findNextAvailableCidr(addresses, 32, org.utilitySubnet); - if (!subnet) { - throw new Error("No available subnets remaining in space"); - } + let subnet = findNextAvailableCidr( + addresses, + 32, + org.utilitySubnet + ); + if (!subnet) { + throw new Error("No available subnets remaining in space"); + } - // remove the cidr - subnet = subnet.split("/")[0]; + // remove the cidr + subnet = subnet.split("/")[0]; - return subnet; + return subnet; + } + ); } export async function getNextAvailableOrgSubnet(): Promise { - const existingAddresses = await db - .select({ - subnet: orgs.subnet - }) - .from(orgs) - .where(isNotNull(orgs.subnet)); + return await lockManager.withLock("org-subnet-allocation", async () => { + const existingAddresses = await db + .select({ + subnet: orgs.subnet + }) + .from(orgs) + .where(isNotNull(orgs.subnet)); - const addresses = existingAddresses.map((org) => org.subnet!); + const addresses = existingAddresses.map((org) => org.subnet!); - const subnet = findNextAvailableCidr( - addresses, - config.getRawConfig().orgs.block_size, - config.getRawConfig().orgs.subnet_group - ); - if (!subnet) { - throw new Error("No available subnets remaining in space"); - } + const subnet = findNextAvailableCidr( + addresses, + config.getRawConfig().orgs.block_size, + config.getRawConfig().orgs.subnet_group + ); + if (!subnet) { + throw new Error("No available subnets remaining in space"); + } - return subnet; + return subnet; + }); } export function generateRemoteSubnets( From 998364b09d90cd18897aff4dcf767e2566310b95 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 6 May 2026 16:13:07 -0700 Subject: [PATCH 71/99] Properly respect flags.disableEnterpriseFeatures --- messages/en-US.json | 8 ++++---- src/app/navigation.tsx | 14 ++++++++------ src/components/InternalResourceForm.tsx | 16 ++++++++++------ src/components/UptimeAlertSection.tsx | 8 ++++++-- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/messages/en-US.json b/messages/en-US.json index 3e1b29d88..a598dcc39 100644 --- a/messages/en-US.json +++ b/messages/en-US.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Reason", - "requestLogs": "HTTPS Request Logs", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Request Analytics", "host": "Host", "location": "Location", "actionLogs": "Admin Action Logs", - "sidebarLogsRequest": "HTTPS Request Logs", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Authentication Logs", "sidebarLogsAction": "Admin Action Logs", "logRetention": "Log Retention", "logRetentionDescription": "Manage how long different types of logs are retained for this organization or disable them", "requestLogsDescription": "View detailed request logs for HTTPS resources in this organization", "requestAnalyticsDescription": "View detailed request analytics for resources in this organization", - "logRetentionRequestLabel": "HTTPS Request Log Retention", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "How long to retain request logs", "logRetentionAccessLabel": "Authentication Log Retention", "logRetentionAccessDescription": "How long to retain access logs", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Administrative actions performed by users within the organization.", "httpDestConnectionLogsTitle": "Network Logs", "httpDestConnectionLogsDescription": "Site and tunnel connection events, including connects and disconnects.", - "httpDestRequestLogsTitle": "HTTPS Request Logs", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "HTTP request logs for proxied resources, including method, path, and response code.", "httpDestSaveChanges": "Save Changes", "httpDestCreateDestination": "Create Destination", diff --git a/src/app/navigation.tsx b/src/app/navigation.tsx index 1989161a9..3cfe867e3 100644 --- a/src/app/navigation.tsx +++ b/src/app/navigation.tsx @@ -217,15 +217,17 @@ export const orgNavSections = ( { title: "sidebarAlerting", href: "/{orgId}/settings/alerting", - icon: + icon: ( + + ) + }, + { + title: "sidebarProvisioning", + href: "/{orgId}/settings/provisioning", + icon: } ] : []), - { - title: "sidebarProvisioning", - href: "/{orgId}/settings/provisioning", - icon: - }, { title: "sidebarBluePrints", href: "/{orgId}/settings/blueprints", diff --git a/src/components/InternalResourceForm.tsx b/src/components/InternalResourceForm.tsx index 3d4febe44..357353d8e 100644 --- a/src/components/InternalResourceForm.tsx +++ b/src/components/InternalResourceForm.tsx @@ -840,12 +840,16 @@ export function InternalResourceForm({ modeCidrKey ) }, - { - value: "http", - label: t( - modeHttpKey - ) - } + ...(!disableEnterpriseFeatures + ? [ + { + value: "http" as const, + label: t( + modeHttpKey + ) + } + ] + : []) ]; return ( diff --git a/src/components/UptimeAlertSection.tsx b/src/components/UptimeAlertSection.tsx index 6c9edc923..a671a2dd5 100644 --- a/src/components/UptimeAlertSection.tsx +++ b/src/components/UptimeAlertSection.tsx @@ -53,10 +53,12 @@ export default function UptimeAlertSection({ days = 90 }: UptimeAlertSectionProps) { const t = useTranslations(); - const api = createApiClient(useEnvContext()); + const envContext = useEnvContext(); + const api = createApiClient(envContext); const queryClient = useQueryClient(); const { isPaidUser } = usePaidStatus(); const isPaid = isPaidUser(tierMatrix.alertingRules); + const { env } = envContext; const [open, setOpen] = useState(false); const [name, setName] = useState( @@ -176,7 +178,9 @@ export default function UptimeAlertSection({ {t("uptimeSectionDescription", { days })}
- {alertButton} + {!env.flags.disableEnterpriseFeatures + ? alertButton + : null}
From 508966038185218067b51cdecfb90202d67d8d36 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:33 -0700 Subject: [PATCH 72/99] New translations en-us.json (French) [ci skip] --- messages/fr-FR.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/fr-FR.json b/messages/fr-FR.json index dfbee6967..16bfd5161 100644 --- a/messages/fr-FR.json +++ b/messages/fr-FR.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Raison", - "requestLogs": "Journal des requêtes", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Demander des analyses", "host": "Hôte", "location": "Localisation", "actionLogs": "Journaux des actions", - "sidebarLogsRequest": "Journal des requêtes", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Journaux d'accès", "sidebarLogsAction": "Journaux des actions", "logRetention": "Journaliser la rétention", "logRetentionDescription": "Gérer la durée de conservation des différents types de logs pour cette organisation ou les désactiver", "requestLogsDescription": "Voir les journaux détaillés des requêtes pour les ressources de cette organisation", "requestAnalyticsDescription": "Voir les analyses détaillées des demandes pour les ressources de cette organisation", - "logRetentionRequestLabel": "Demander la rétention des journaux", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "Durée de conservation des journaux de requêtes", "logRetentionAccessLabel": "Rétention du journal d'accès", "logRetentionAccessDescription": "Durée de conservation des journaux d'accès", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Actions administratives effectuées par les utilisateurs au sein de l'organisation.", "httpDestConnectionLogsTitle": "Journaux de connexion", "httpDestConnectionLogsDescription": "Événements de connexion du site et du tunnel, y compris les connexions et les déconnexions.", - "httpDestRequestLogsTitle": "Journal des requêtes", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "Journaux des requêtes HTTP pour les ressources proxiées, y compris la méthode, le chemin et le code de réponse.", "httpDestSaveChanges": "Enregistrer les modifications", "httpDestCreateDestination": "Créer une destination", From 428e9b546e10fef4ecc39f0cd29511fc263a67f4 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:35 -0700 Subject: [PATCH 73/99] New translations en-us.json (Bulgarian) [ci skip] --- messages/bg-BG.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/bg-BG.json b/messages/bg-BG.json index 11fc53fe5..4bec9dcae 100644 --- a/messages/bg-BG.json +++ b/messages/bg-BG.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "Няма валидни методи за удостоверение", "ip": "IP", "reason": "Причина", - "requestLogs": "Заявка за логове", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Анализи На Заявки", "host": "Хост", "location": "Местоположение", "actionLogs": "Дневници на действията", - "sidebarLogsRequest": "Заявка за логове", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Достъп до логове", "sidebarLogsAction": "Дневници на действията", "logRetention": "Задържане на логове", "logRetentionDescription": "Управлявайте времето за задържане на различни видове логове за тази организация или ги деактивирайте", "requestLogsDescription": "Прегледайте подробни логове на заявки за ресурси в тази организация", "requestAnalyticsDescription": "Вижте подробни анализи на заявки за ресурсите в тази организация", - "logRetentionRequestLabel": "Задържане на логове на заявки", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "Колко дълго да се задържат логовете на заявките", "logRetentionAccessLabel": "Задържане на логове за достъп", "logRetentionAccessDescription": "Колко дълго да се задържат логовете за достъп", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Административни действия, извършени от потребители в организацията.", "httpDestConnectionLogsTitle": "Логове на връзката", "httpDestConnectionLogsDescription": "Събития на свързване и прекъсване на сайта и тунела, включително свръзки и прекъсвания.", - "httpDestRequestLogsTitle": "Заявки за логове", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "Регистри за HTTP заявките към проксирани ресурси, включително метод, път и код на отговор.", "httpDestSaveChanges": "Запази промените", "httpDestCreateDestination": "Създаване на дестинация", From 2b0e6649faedf15e28da36758a78bfbb362e5534 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:37 -0700 Subject: [PATCH 74/99] New translations en-us.json (Czech) [ci skip] --- messages/cs-CZ.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/cs-CZ.json b/messages/cs-CZ.json index 86571a022..4bb04def6 100644 --- a/messages/cs-CZ.json +++ b/messages/cs-CZ.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP adresa", "reason": "Důvod", - "requestLogs": "Záznamy požadavků", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Vyžádat analýzu", "host": "Hostitel", "location": "Poloha", "actionLogs": "Záznamy akcí", - "sidebarLogsRequest": "Záznamy požadavků", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Protokoly přístupu", "sidebarLogsAction": "Záznamy akcí", "logRetention": "Zaznamenávání záznamu", "logRetentionDescription": "Spravovat, jak dlouho jsou různé typy logů uloženy pro tuto organizaci nebo je zakázat", "requestLogsDescription": "Zobrazit podrobné protokoly požadavků pro zdroje v této organizaci", "requestAnalyticsDescription": "Zobrazit podrobnou analýzu požadavků pro zdroje v této organizaci", - "logRetentionRequestLabel": "Zachování logu žádosti", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "Jak dlouho uchovávat záznamy požadavků", "logRetentionAccessLabel": "Zachování záznamu přístupu", "logRetentionAccessDescription": "Jak dlouho uchovávat přístupové záznamy", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Správní opatření prováděná uživateli v rámci organizace.", "httpDestConnectionLogsTitle": "Protokoly připojení", "httpDestConnectionLogsDescription": "Události týkající se připojení lokality a tunelu, včetně připojení a odpojení.", - "httpDestRequestLogsTitle": "Záznamy požadavků", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "HTTP záznamy požadavků pro proxy zdroje, včetně metod, cesty a kódu odpovědi.", "httpDestSaveChanges": "Uložit změny", "httpDestCreateDestination": "Vytvořit cíl", From c59505be8d1b68adc9dd65f4f13f6aa608ff9a8d Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:38 -0700 Subject: [PATCH 75/99] New translations en-us.json (German) [ci skip] --- messages/de-DE.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/de-DE.json b/messages/de-DE.json index d0b8e9115..4fa9eea9a 100644 --- a/messages/de-DE.json +++ b/messages/de-DE.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "Keine gültige Authentifizierungsmethode verfügbar", "ip": "IP", "reason": "Grund", - "requestLogs": "Logs anfordern", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Anfrage-Analyse anzeigen", "host": "Host", "location": "Standort", "actionLogs": "Aktionsprotokolle", - "sidebarLogsRequest": "Logs anfordern", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Zugriffsprotokolle", "sidebarLogsAction": "Aktionsprotokolle", "logRetention": "Log-Speicherung", "logRetentionDescription": "Verwalten, wie lange verschiedene Logs für diese Organisation gespeichert werden oder deaktivieren", "requestLogsDescription": "Detaillierte Request-Logs für Ressourcen in dieser Organisation anzeigen", "requestAnalyticsDescription": "Detaillierte Anfrage-Analyse für Ressourcen in dieser Organisation anzeigen", - "logRetentionRequestLabel": "Log-Speicherung anfordern", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "Wie lange sollen Request-Logs gespeichert werden", "logRetentionAccessLabel": "Zugriffsprotokoll-Speicherung", "logRetentionAccessDescription": "Wie lange Zugriffsprotokolle beibehalten werden sollen", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Administrative Maßnahmen, die von Benutzern innerhalb der Organisation durchgeführt werden.", "httpDestConnectionLogsTitle": "Verbindungsprotokolle", "httpDestConnectionLogsDescription": "Site- und Tunnelverbindungen, einschließlich Verbindungen und Trennungen.", - "httpDestRequestLogsTitle": "Logs anfordern", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "HTTP-Request-Protokolle für proxiierte Ressourcen, einschließlich Methode, Pfad und Antwort-Code.", "httpDestSaveChanges": "Änderungen speichern", "httpDestCreateDestination": "Ziel erstellen", From 5ff2569ece0787cc4fa1162db92c7170fa49153b Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:40 -0700 Subject: [PATCH 76/99] New translations en-us.json (Italian) [ci skip] --- messages/it-IT.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/it-IT.json b/messages/it-IT.json index 17040fa30..93b5cbc9c 100644 --- a/messages/it-IT.json +++ b/messages/it-IT.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Motivo", - "requestLogs": "Log Richiesta", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Richiedi Analisi", "host": "Host", "location": "Posizione", "actionLogs": "Log Azioni", - "sidebarLogsRequest": "Log Richiesta", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Log Accesso", "sidebarLogsAction": "Log Azioni", "logRetention": "Ritenzione Registro", "logRetentionDescription": "Gestisci per quanto tempo i diversi tipi di log sono mantenuti per questa organizzazione o disabilitali", "requestLogsDescription": "Visualizza i registri di richiesta dettagliati per le risorse in questa organizzazione", "requestAnalyticsDescription": "Visualizza le analisi dettagliate della richiesta per le risorse in questa organizzazione", - "logRetentionRequestLabel": "Richiedi Ritenzione Log", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "Per quanto tempo conservare i log delle richieste", "logRetentionAccessLabel": "Ritenzione Registro Accesso", "logRetentionAccessDescription": "Per quanto tempo conservare i log di accesso", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Azioni amministrative eseguite dagli utenti all'interno dell'organizzazione.", "httpDestConnectionLogsTitle": "Log Di Connessione", "httpDestConnectionLogsDescription": "Eventi di connessione al sito e al tunnel, inclusi collegamenti e disconnessioni.", - "httpDestRequestLogsTitle": "Log Richiesta", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "Registri di richiesta HTTP per le risorse proxy, inclusi metodo, percorso e codice di risposta.", "httpDestSaveChanges": "Salva Modifiche", "httpDestCreateDestination": "Crea Destinazione", From 7eab2cc0bb9d806b0c881eabd703adbd2a71b45a Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:42 -0700 Subject: [PATCH 77/99] New translations en-us.json (Korean) [ci skip] --- messages/ko-KR.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/ko-KR.json b/messages/ko-KR.json index 2fd449a63..f4b11ba83 100644 --- a/messages/ko-KR.json +++ b/messages/ko-KR.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "유효한 인증 없음", "ip": "IP", "reason": "이유", - "requestLogs": "요청 로그", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "요청 분석", "host": "호스트", "location": "위치", "actionLogs": "작업 로그", - "sidebarLogsRequest": "요청 로그", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "접근 로그", "sidebarLogsAction": "작업 로그", "logRetention": "로그 보관", "logRetentionDescription": "다양한 유형의 로그를 이 조직에 대해 얼마나 오래 보관할지 관리하거나 비활성화합니다", "requestLogsDescription": "이 조직의 자원에 대한 상세한 요청 로그를 봅니다", "requestAnalyticsDescription": "이 조직의 리소스에 대한 자세한 요청 분석 보기", - "logRetentionRequestLabel": "요청 로그 보관", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "요청 로그를 얼마나 오래 보관할지", "logRetentionAccessLabel": "접근 로그 보관", "logRetentionAccessDescription": "접근 로그를 얼마나 오래 보관할지", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "조직 내에서 사용자가 수행한 관리 작업.", "httpDestConnectionLogsTitle": "연결 로그", "httpDestConnectionLogsDescription": "사이트 및 터널 연결 이벤트, 연결 및 연결 끊기를 포함합니다.", - "httpDestRequestLogsTitle": "요청 로그", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "프록시된 리소스에 대한 HTTP 요청 로그, 메서드, 경로 및 응답 코드를 포함합니다.", "httpDestSaveChanges": "변경 사항 저장", "httpDestCreateDestination": "대상지 생성", From b46c9485220bb5e599bc947877d89c770a18b977 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:44 -0700 Subject: [PATCH 78/99] New translations en-us.json (Dutch) [ci skip] --- messages/nl-NL.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/nl-NL.json b/messages/nl-NL.json index e91c84276..05d763079 100644 --- a/messages/nl-NL.json +++ b/messages/nl-NL.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP-adres", "reason": "Reden", - "requestLogs": "Logboeken aanvragen", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Analytics opvragen", "host": "Hostnaam", "location": "Locatie", "actionLogs": "Actie logs", - "sidebarLogsRequest": "Logboeken aanvragen", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Toegang tot logboek", "sidebarLogsAction": "Actie logs", "logRetention": "Log bewaring", "logRetentionDescription": "Beheren hoe lang verschillende soorten logs bewaard worden voor deze organisatie of schakel ze uit", "requestLogsDescription": "Bekijk gedetailleerde verzoeklogboeken voor resources in deze organisatie", "requestAnalyticsDescription": "Bekijk gedetailleerde request analytics voor resources in deze organisatie", - "logRetentionRequestLabel": "Logboekbewaring aanvragen", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "Hoe lang de aanvraaglogboeken te behouden", "logRetentionAccessLabel": "Toegang logboek bewaring", "logRetentionAccessDescription": "Hoe lang de toegangslogboeken behouden blijven", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Administratieve acties uitgevoerd door gebruikers binnen de organisatie.", "httpDestConnectionLogsTitle": "Connectie Logs", "httpDestConnectionLogsDescription": "Verbinding met de Site en tunnel maken verbroken, inclusief verbindingen en verbindingen.", - "httpDestRequestLogsTitle": "Logboeken aanvragen", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "HTTP request logs voor proxied hulpmiddelen, waaronder methode, pad en response code.", "httpDestSaveChanges": "Wijzigingen opslaan", "httpDestCreateDestination": "Maak bestemming aan", From a784cd307e59439225be2d35f29d82d5e3ff750b Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:46 -0700 Subject: [PATCH 79/99] New translations en-us.json (Polish) [ci skip] --- messages/pl-PL.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/pl-PL.json b/messages/pl-PL.json index 4b69190c5..e47b01110 100644 --- a/messages/pl-PL.json +++ b/messages/pl-PL.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Powód", - "requestLogs": "Dzienniki żądań", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Żądanie Analityki", "host": "Host", "location": "Lokalizacja", "actionLogs": "Dzienniki działań", - "sidebarLogsRequest": "Dzienniki żądań", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Logi dostępu", "sidebarLogsAction": "Dzienniki działań", "logRetention": "Zachowanie dziennika", "logRetentionDescription": "Zarządzaj jak długo różne typy logów są zachowane dla tej organizacji lub wyłącz je", "requestLogsDescription": "Zobacz szczegółowe dzienniki żądań zasobów w tej organizacji", "requestAnalyticsDescription": "Zobacz szczegółowe analizy żądań dla zasobów w tej organizacji", - "logRetentionRequestLabel": "Zachowanie dziennika żądań", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "Jak długo zachować dzienniki żądań", "logRetentionAccessLabel": "Zachowanie dziennika dostępu", "logRetentionAccessDescription": "Jak długo zachować dzienniki dostępu", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Działania administracyjne wykonywane przez użytkowników w organizacji.", "httpDestConnectionLogsTitle": "Dzienniki połączeń", "httpDestConnectionLogsDescription": "Zdarzenia związane z miejscem i tunelem, w tym połączenia i rozłączenia.", - "httpDestRequestLogsTitle": "Dzienniki żądań", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "Logi żądań HTTP dla zasobów proxy, w tym metody, ścieżki i kodu odpowiedzi.", "httpDestSaveChanges": "Zapisz zmiany", "httpDestCreateDestination": "Utwórz cel", From 961cbfcacce40ca04bbdca58d3b5bb37d8f908b4 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:47 -0700 Subject: [PATCH 80/99] New translations en-us.json (Portuguese) [ci skip] --- messages/pt-PT.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/pt-PT.json b/messages/pt-PT.json index ce674a81a..1f658d18d 100644 --- a/messages/pt-PT.json +++ b/messages/pt-PT.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "PI", "reason": "Motivo", - "requestLogs": "Registro de pedidos", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Solicitar análise", "host": "Servidor", "location": "Local:", "actionLogs": "Logs de Ações", - "sidebarLogsRequest": "Registro de pedidos", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Logs de Acesso", "sidebarLogsAction": "Logs de Ações", "logRetention": "Retenção de Log", "logRetentionDescription": "Gerenciar quanto tempo os diferentes tipos de logs são mantidos para esta organização ou desativá-los", "requestLogsDescription": "Ver registros de pedidos detalhados de recursos nesta organização", "requestAnalyticsDescription": "Exibir análise detalhada de pedidos para recursos nesta organização", - "logRetentionRequestLabel": "Solicitar retenção de registro", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "Por quanto tempo manter os registros de pedidos", "logRetentionAccessLabel": "Retenção de Log de Acesso", "logRetentionAccessDescription": "Por quanto tempo manter os registros de acesso", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Ações administrativas realizadas por usuários dentro da organização.", "httpDestConnectionLogsTitle": "Logs da conexão", "httpDestConnectionLogsDescription": "Eventos de conexão de site e túnel, incluindo conexões e desconexões.", - "httpDestRequestLogsTitle": "Registro de pedidos", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "Logs de solicitação HTTP para recursos proxy incluindo o método, o caminho e o código de resposta.", "httpDestSaveChanges": "Salvar as alterações", "httpDestCreateDestination": "Criar destino", From 54820d1db0e08d357dd4725fbede1d6d625c6c8b Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:49 -0700 Subject: [PATCH 81/99] New translations en-us.json (Russian) [ci skip] --- messages/ru-RU.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/ru-RU.json b/messages/ru-RU.json index 8f8579fa9..185e00006 100644 --- a/messages/ru-RU.json +++ b/messages/ru-RU.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Причина", - "requestLogs": "Запросить журналы", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Аналитика запроса", "host": "Хост", "location": "Местоположение", "actionLogs": "Журнал действий", - "sidebarLogsRequest": "Запросить журналы", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Журналы доступа", "sidebarLogsAction": "Журнал действий", "logRetention": "Сохранение журнала", "logRetentionDescription": "Управление сохранением различных типов журналов для этой организации или отключение их", "requestLogsDescription": "Просмотреть подробные журналы запроса ресурсов в этой организации", "requestAnalyticsDescription": "Просмотреть подробную аналитику запроса для ресурсов в этой организации", - "logRetentionRequestLabel": "Запросить сохранение журнала", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "Как долго сохранять журналы запросов", "logRetentionAccessLabel": "Хранение журнала доступа", "logRetentionAccessDescription": "Как долго сохранять журналы доступа", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Административные меры, осуществляемые пользователями в рамках организации.", "httpDestConnectionLogsTitle": "Журнал подключений", "httpDestConnectionLogsDescription": "События связи с сайтами и туннелями, включая соединения и отключения.", - "httpDestRequestLogsTitle": "Запросить журналы", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "Журналы запросов HTTP для проксируемых ресурсов, включая метод, путь и код ответа.", "httpDestSaveChanges": "Сохранить изменения", "httpDestCreateDestination": "Создать адрес назначения", From 0444d3490be727e38be23ffeb1d8cf5dff2f3c9b Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:51 -0700 Subject: [PATCH 82/99] New translations en-us.json (Turkish) [ci skip] --- messages/tr-TR.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/tr-TR.json b/messages/tr-TR.json index 6aa50e636..b9d992276 100644 --- a/messages/tr-TR.json +++ b/messages/tr-TR.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "Daha Fazla Kimlik Doğrulama Yöntemi Yok", "ip": "IP", "reason": "Sebep", - "requestLogs": "İstek Günlükleri", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "İstek Analizi", "host": "Sunucu", "location": "Konum", "actionLogs": "Eylem Günlükleri", - "sidebarLogsRequest": "İstek Günlükleri", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Erişim Günlükleri", "sidebarLogsAction": "Eylem Günlükleri", "logRetention": "Kayıt Saklama", "logRetentionDescription": "Bu organizasyon için farklı türdeki günlüklerin ne kadar süre saklanacağını yönetin veya devre dışı bırakın", "requestLogsDescription": "Bu organizasyondaki kaynaklar için ayrıntılı istek günlüklerini görüntüleyin", "requestAnalyticsDescription": "Bu organizasyondaki kaynaklar için ayrıntılı istek analizlerini görüntüleyin.", - "logRetentionRequestLabel": "İstek Günlüğü Saklama", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "İstek günlüklerini ne kadar süre tutacağını belirle", "logRetentionAccessLabel": "Erişim Günlüğü Saklama", "logRetentionAccessDescription": "Erişim günlüklerini ne kadar süre tutacağını belirle", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Kullanıcılar tarafından organizasyon içerisinde yapılan yönetici eylemleri.", "httpDestConnectionLogsTitle": "Bağlantı Kayıtları", "httpDestConnectionLogsDescription": "Site ve tünel bağlantı olayları, bağlantılar ve bağlantı kesilmeleri dahil.", - "httpDestRequestLogsTitle": "İstek Kayıtları", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "Yönlendirilmiş kaynaklar için HTTP istek kayıtları, yöntem, yol ve yanıt kodu dahil.", "httpDestSaveChanges": "Değişiklikleri Kaydet", "httpDestCreateDestination": "Hedef Oluştur", From 98bc199c8ef7619b4750054441b6a995fcb09cc7 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:53 -0700 Subject: [PATCH 83/99] New translations en-us.json (Chinese Simplified) [ci skip] --- messages/zh-CN.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/zh-CN.json b/messages/zh-CN.json index 2f80cbe30..430faaf36 100644 --- a/messages/zh-CN.json +++ b/messages/zh-CN.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "原因", - "requestLogs": "请求日志", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "请求分析", "host": "主机", "location": "地点", "actionLogs": "操作日志", - "sidebarLogsRequest": "请求日志", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "访问日志", "sidebarLogsAction": "操作日志", "logRetention": "日志保留", "logRetentionDescription": "管理不同类型的日志为这个机构保留多长时间或禁用这些日志", "requestLogsDescription": "查看此机构资源的详细请求日志", "requestAnalyticsDescription": "查看此机构资源的详细请求分析", - "logRetentionRequestLabel": "请求日志保留", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "保留请求日志的时间", "logRetentionAccessLabel": "访问日志保留", "logRetentionAccessDescription": "保留访问日志的时间", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "组织内部用户采取的行政行动。", "httpDestConnectionLogsTitle": "连接日志", "httpDestConnectionLogsDescription": "站点和隧道连接事件,包括连接和断开连接。", - "httpDestRequestLogsTitle": "请求日志", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "HTTP 请求代理资源日志,包括方法、路径和响应代码。", "httpDestSaveChanges": "保存更改", "httpDestCreateDestination": "创建目标", From 56ef3a934a20a94097445f4e5b8d96d8ad5a2622 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:55 -0700 Subject: [PATCH 84/99] New translations en-us.json (Norwegian Bokmal) [ci skip] --- messages/nb-NO.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/nb-NO.json b/messages/nb-NO.json index 18ab00bbf..05686eaee 100644 --- a/messages/nb-NO.json +++ b/messages/nb-NO.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Grunn", - "requestLogs": "Forespørselslogger (Automatic Translation)", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Be om analyser", "host": "Vert", "location": "Sted", "actionLogs": "Handlingslogger", - "sidebarLogsRequest": "Forespørselslogger (Automatic Translation)", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Tilgangslogger (Automatic Translation)", "sidebarLogsAction": "Handlingslogger", "logRetention": "Logg tilbaketrekning", "logRetentionDescription": "Håndter hvor lenge ulike typer logger beholdes for denne organisasjonen, eller deaktiver dem", "requestLogsDescription": "Se detaljerte forespørselslogger for ressurser i denne organisasjonen", "requestAnalyticsDescription": "Se detaljert rekvisisjonsanalyse for ressurser i denne organisasjonen", - "logRetentionRequestLabel": "Be om loggoverføring", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "Hvor lenge du vil beholde forespørselslogger", "logRetentionAccessLabel": "Få tilgang til loggoverføring", "logRetentionAccessDescription": "Hvor lenge du vil beholde adgangslogger", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Administrative tiltak som utføres av brukere innenfor organisasjonen.", "httpDestConnectionLogsTitle": "Loggfiler for tilkobling", "httpDestConnectionLogsDescription": "Utstyrs- og tunneltilkoblingshendelser, inkludert forbindelser og frakobling.", - "httpDestRequestLogsTitle": "Forespørselslogger (Automatic Translation)", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "HTTP-forespørsel logger for bekreftede ressurser, inkludert metode, bane og responskode.", "httpDestSaveChanges": "Lagre endringer", "httpDestCreateDestination": "Opprett mål", From 885b9e638d4031a514e7ede129d6149e1b0dbbac Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:15:56 -0700 Subject: [PATCH 85/99] New translations en-us.json (Spanish) [ci skip] --- messages/es-ES.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/es-ES.json b/messages/es-ES.json index 75c465fdd..5ead411d0 100644 --- a/messages/es-ES.json +++ b/messages/es-ES.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Razón", - "requestLogs": "Registros de Solicitud", + "requestLogs": "HTTP Request Logs", "requestAnalytics": "Analítica de Solicitud", "host": "Anfitrión", "location": "Ubicación", "actionLogs": "Registros de acción", - "sidebarLogsRequest": "Registros de Solicitud", + "sidebarLogsRequest": "HTTP Request Logs", "sidebarLogsAccess": "Registros de acceso", "sidebarLogsAction": "Registros de acción", "logRetention": "Retención de Log", "logRetentionDescription": "Administrar cuánto tiempo se conservan los diferentes tipos de registros para esta organización o desactivarlos", "requestLogsDescription": "Ver registros de solicitudes detallados para los recursos de esta organización", "requestAnalyticsDescription": "Ver análisis de solicitudes detalladas de recursos en esta organización", - "logRetentionRequestLabel": "Retención de Registro de Solicitud", + "logRetentionRequestLabel": "HTTP Request Log Retention", "logRetentionRequestDescription": "Cuánto tiempo conservar los registros de solicitudes", "logRetentionAccessLabel": "Retención de Log de Acceso", "logRetentionAccessDescription": "Cuánto tiempo retener los registros de acceso", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Acciones administrativas realizadas por los usuarios dentro de la organización.", "httpDestConnectionLogsTitle": "Registros de conexión", "httpDestConnectionLogsDescription": "Eventos de conexión de sitios y túneles, incluyendo conexiones y desconexiones.", - "httpDestRequestLogsTitle": "Registros de Solicitud", + "httpDestRequestLogsTitle": "HTTP Request Logs", "httpDestRequestLogsDescription": "Registros de peticiones HTTP para recursos proxyficados, incluyendo método, ruta y código de respuesta.", "httpDestSaveChanges": "Guardar Cambios", "httpDestCreateDestination": "Crear destino", From 5e51b8ad746dd83bddf70ccb5a24a11488fb0003 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:23 -0700 Subject: [PATCH 86/99] New translations en-us.json (French) [ci skip] --- messages/fr-FR.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/fr-FR.json b/messages/fr-FR.json index 16bfd5161..5250a684d 100644 --- a/messages/fr-FR.json +++ b/messages/fr-FR.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Raison", - "requestLogs": "HTTP Request Logs", + "requestLogs": "Journal des Requêtes HTTP", "requestAnalytics": "Demander des analyses", "host": "Hôte", "location": "Localisation", "actionLogs": "Journaux des actions", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "Journal des Requêtes HTTP", "sidebarLogsAccess": "Journaux d'accès", "sidebarLogsAction": "Journaux des actions", "logRetention": "Journaliser la rétention", "logRetentionDescription": "Gérer la durée de conservation des différents types de logs pour cette organisation ou les désactiver", "requestLogsDescription": "Voir les journaux détaillés des requêtes pour les ressources de cette organisation", "requestAnalyticsDescription": "Voir les analyses détaillées des demandes pour les ressources de cette organisation", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "Rétention des Journaux de Requêtes HTTP", "logRetentionRequestDescription": "Durée de conservation des journaux de requêtes", "logRetentionAccessLabel": "Rétention du journal d'accès", "logRetentionAccessDescription": "Durée de conservation des journaux d'accès", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Actions administratives effectuées par les utilisateurs au sein de l'organisation.", "httpDestConnectionLogsTitle": "Journaux de connexion", "httpDestConnectionLogsDescription": "Événements de connexion du site et du tunnel, y compris les connexions et les déconnexions.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "Journal des Requêtes HTTP", "httpDestRequestLogsDescription": "Journaux des requêtes HTTP pour les ressources proxiées, y compris la méthode, le chemin et le code de réponse.", "httpDestSaveChanges": "Enregistrer les modifications", "httpDestCreateDestination": "Créer une destination", From d96e930679b69e211425eaa615046be81bff7b3e Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:25 -0700 Subject: [PATCH 87/99] New translations en-us.json (Bulgarian) [ci skip] --- messages/bg-BG.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/bg-BG.json b/messages/bg-BG.json index 4bec9dcae..46327afd0 100644 --- a/messages/bg-BG.json +++ b/messages/bg-BG.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "Няма валидни методи за удостоверение", "ip": "IP", "reason": "Причина", - "requestLogs": "HTTP Request Logs", + "requestLogs": "Логове за HTTP заявки", "requestAnalytics": "Анализи На Заявки", "host": "Хост", "location": "Местоположение", "actionLogs": "Дневници на действията", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "Логове за HTTP заявки", "sidebarLogsAccess": "Достъп до логове", "sidebarLogsAction": "Дневници на действията", "logRetention": "Задържане на логове", "logRetentionDescription": "Управлявайте времето за задържане на различни видове логове за тази организация или ги деактивирайте", "requestLogsDescription": "Прегледайте подробни логове на заявки за ресурси в тази организация", "requestAnalyticsDescription": "Вижте подробни анализи на заявки за ресурсите в тази организация", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "Задържане на логове за HTTP заявки", "logRetentionRequestDescription": "Колко дълго да се задържат логовете на заявките", "logRetentionAccessLabel": "Задържане на логове за достъп", "logRetentionAccessDescription": "Колко дълго да се задържат логовете за достъп", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Административни действия, извършени от потребители в организацията.", "httpDestConnectionLogsTitle": "Логове на връзката", "httpDestConnectionLogsDescription": "Събития на свързване и прекъсване на сайта и тунела, включително свръзки и прекъсвания.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "Логове за HTTP заявки", "httpDestRequestLogsDescription": "Регистри за HTTP заявките към проксирани ресурси, включително метод, път и код на отговор.", "httpDestSaveChanges": "Запази промените", "httpDestCreateDestination": "Създаване на дестинация", From 19de12b12e89dc1abd3a2d4e0237648954556ad2 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:26 -0700 Subject: [PATCH 88/99] New translations en-us.json (Czech) [ci skip] --- messages/cs-CZ.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/cs-CZ.json b/messages/cs-CZ.json index 4bb04def6..38da0604a 100644 --- a/messages/cs-CZ.json +++ b/messages/cs-CZ.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP adresa", "reason": "Důvod", - "requestLogs": "HTTP Request Logs", + "requestLogs": "Záznamy HTTP požadavků", "requestAnalytics": "Vyžádat analýzu", "host": "Hostitel", "location": "Poloha", "actionLogs": "Záznamy akcí", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "Záznamy HTTP požadavků", "sidebarLogsAccess": "Protokoly přístupu", "sidebarLogsAction": "Záznamy akcí", "logRetention": "Zaznamenávání záznamu", "logRetentionDescription": "Spravovat, jak dlouho jsou různé typy logů uloženy pro tuto organizaci nebo je zakázat", "requestLogsDescription": "Zobrazit podrobné protokoly požadavků pro zdroje v této organizaci", "requestAnalyticsDescription": "Zobrazit podrobnou analýzu požadavků pro zdroje v této organizaci", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "Zachování logu HTTP požadavků", "logRetentionRequestDescription": "Jak dlouho uchovávat záznamy požadavků", "logRetentionAccessLabel": "Zachování záznamu přístupu", "logRetentionAccessDescription": "Jak dlouho uchovávat přístupové záznamy", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Správní opatření prováděná uživateli v rámci organizace.", "httpDestConnectionLogsTitle": "Protokoly připojení", "httpDestConnectionLogsDescription": "Události týkající se připojení lokality a tunelu, včetně připojení a odpojení.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "Záznamy HTTP požadavků", "httpDestRequestLogsDescription": "HTTP záznamy požadavků pro proxy zdroje, včetně metod, cesty a kódu odpovědi.", "httpDestSaveChanges": "Uložit změny", "httpDestCreateDestination": "Vytvořit cíl", From 36e7054386536e7df21a95a739ebbba786641344 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:28 -0700 Subject: [PATCH 89/99] New translations en-us.json (German) [ci skip] --- messages/de-DE.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/de-DE.json b/messages/de-DE.json index 4fa9eea9a..367c95cd3 100644 --- a/messages/de-DE.json +++ b/messages/de-DE.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "Keine gültige Authentifizierungsmethode verfügbar", "ip": "IP", "reason": "Grund", - "requestLogs": "HTTP Request Logs", + "requestLogs": "HTTP Anforderungsprotokolle", "requestAnalytics": "Anfrage-Analyse anzeigen", "host": "Host", "location": "Standort", "actionLogs": "Aktionsprotokolle", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "HTTP Anforderungsprotokolle", "sidebarLogsAccess": "Zugriffsprotokolle", "sidebarLogsAction": "Aktionsprotokolle", "logRetention": "Log-Speicherung", "logRetentionDescription": "Verwalten, wie lange verschiedene Logs für diese Organisation gespeichert werden oder deaktivieren", "requestLogsDescription": "Detaillierte Request-Logs für Ressourcen in dieser Organisation anzeigen", "requestAnalyticsDescription": "Detaillierte Anfrage-Analyse für Ressourcen in dieser Organisation anzeigen", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "HTTP Anforderungsprotokoll Aufbewahrung", "logRetentionRequestDescription": "Wie lange sollen Request-Logs gespeichert werden", "logRetentionAccessLabel": "Zugriffsprotokoll-Speicherung", "logRetentionAccessDescription": "Wie lange Zugriffsprotokolle beibehalten werden sollen", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Administrative Maßnahmen, die von Benutzern innerhalb der Organisation durchgeführt werden.", "httpDestConnectionLogsTitle": "Verbindungsprotokolle", "httpDestConnectionLogsDescription": "Site- und Tunnelverbindungen, einschließlich Verbindungen und Trennungen.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "HTTP Anforderungsprotokolle", "httpDestRequestLogsDescription": "HTTP-Request-Protokolle für proxiierte Ressourcen, einschließlich Methode, Pfad und Antwort-Code.", "httpDestSaveChanges": "Änderungen speichern", "httpDestCreateDestination": "Ziel erstellen", From 5a5feccc768609e55675d155ad377f307853f56d Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:30 -0700 Subject: [PATCH 90/99] New translations en-us.json (Italian) [ci skip] --- messages/it-IT.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/it-IT.json b/messages/it-IT.json index 93b5cbc9c..c739b269d 100644 --- a/messages/it-IT.json +++ b/messages/it-IT.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Motivo", - "requestLogs": "HTTP Request Logs", + "requestLogs": "Log Richieste HTTP", "requestAnalytics": "Richiedi Analisi", "host": "Host", "location": "Posizione", "actionLogs": "Log Azioni", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "Log Richieste HTTP", "sidebarLogsAccess": "Log Accesso", "sidebarLogsAction": "Log Azioni", "logRetention": "Ritenzione Registro", "logRetentionDescription": "Gestisci per quanto tempo i diversi tipi di log sono mantenuti per questa organizzazione o disabilitali", "requestLogsDescription": "Visualizza i registri di richiesta dettagliati per le risorse in questa organizzazione", "requestAnalyticsDescription": "Visualizza le analisi dettagliate della richiesta per le risorse in questa organizzazione", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "Conservazione Log Richieste HTTP", "logRetentionRequestDescription": "Per quanto tempo conservare i log delle richieste", "logRetentionAccessLabel": "Ritenzione Registro Accesso", "logRetentionAccessDescription": "Per quanto tempo conservare i log di accesso", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Azioni amministrative eseguite dagli utenti all'interno dell'organizzazione.", "httpDestConnectionLogsTitle": "Log Di Connessione", "httpDestConnectionLogsDescription": "Eventi di connessione al sito e al tunnel, inclusi collegamenti e disconnessioni.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "Log Richieste HTTP", "httpDestRequestLogsDescription": "Registri di richiesta HTTP per le risorse proxy, inclusi metodo, percorso e codice di risposta.", "httpDestSaveChanges": "Salva Modifiche", "httpDestCreateDestination": "Crea Destinazione", From 9c8ffdb661eba0d0e90f1d45a8f723b036d18b75 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:32 -0700 Subject: [PATCH 91/99] New translations en-us.json (Korean) [ci skip] --- messages/ko-KR.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/ko-KR.json b/messages/ko-KR.json index f4b11ba83..1d3d77fe2 100644 --- a/messages/ko-KR.json +++ b/messages/ko-KR.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "유효한 인증 없음", "ip": "IP", "reason": "이유", - "requestLogs": "HTTP Request Logs", + "requestLogs": "HTTP 요청 로그", "requestAnalytics": "요청 분석", "host": "호스트", "location": "위치", "actionLogs": "작업 로그", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "HTTP 요청 로그", "sidebarLogsAccess": "접근 로그", "sidebarLogsAction": "작업 로그", "logRetention": "로그 보관", "logRetentionDescription": "다양한 유형의 로그를 이 조직에 대해 얼마나 오래 보관할지 관리하거나 비활성화합니다", "requestLogsDescription": "이 조직의 자원에 대한 상세한 요청 로그를 봅니다", "requestAnalyticsDescription": "이 조직의 리소스에 대한 자세한 요청 분석 보기", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "HTTP 요청 로그 보관", "logRetentionRequestDescription": "요청 로그를 얼마나 오래 보관할지", "logRetentionAccessLabel": "접근 로그 보관", "logRetentionAccessDescription": "접근 로그를 얼마나 오래 보관할지", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "조직 내에서 사용자가 수행한 관리 작업.", "httpDestConnectionLogsTitle": "연결 로그", "httpDestConnectionLogsDescription": "사이트 및 터널 연결 이벤트, 연결 및 연결 끊기를 포함합니다.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "HTTP 요청 로그", "httpDestRequestLogsDescription": "프록시된 리소스에 대한 HTTP 요청 로그, 메서드, 경로 및 응답 코드를 포함합니다.", "httpDestSaveChanges": "변경 사항 저장", "httpDestCreateDestination": "대상지 생성", From 385f57ec937c7dee76b53316cd0a2588dd845905 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:33 -0700 Subject: [PATCH 92/99] New translations en-us.json (Dutch) [ci skip] --- messages/nl-NL.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/nl-NL.json b/messages/nl-NL.json index 05d763079..5218c3388 100644 --- a/messages/nl-NL.json +++ b/messages/nl-NL.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP-adres", "reason": "Reden", - "requestLogs": "HTTP Request Logs", + "requestLogs": "HTTP-aanvraaglogboeken", "requestAnalytics": "Analytics opvragen", "host": "Hostnaam", "location": "Locatie", "actionLogs": "Actie logs", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "HTTP-aanvraaglogboeken", "sidebarLogsAccess": "Toegang tot logboek", "sidebarLogsAction": "Actie logs", "logRetention": "Log bewaring", "logRetentionDescription": "Beheren hoe lang verschillende soorten logs bewaard worden voor deze organisatie of schakel ze uit", "requestLogsDescription": "Bekijk gedetailleerde verzoeklogboeken voor resources in deze organisatie", "requestAnalyticsDescription": "Bekijk gedetailleerde request analytics voor resources in deze organisatie", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "Bewaring van HTTP-aanvraaglogboeken", "logRetentionRequestDescription": "Hoe lang de aanvraaglogboeken te behouden", "logRetentionAccessLabel": "Toegang logboek bewaring", "logRetentionAccessDescription": "Hoe lang de toegangslogboeken behouden blijven", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Administratieve acties uitgevoerd door gebruikers binnen de organisatie.", "httpDestConnectionLogsTitle": "Connectie Logs", "httpDestConnectionLogsDescription": "Verbinding met de Site en tunnel maken verbroken, inclusief verbindingen en verbindingen.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "HTTP-aanvraaglogboeken", "httpDestRequestLogsDescription": "HTTP request logs voor proxied hulpmiddelen, waaronder methode, pad en response code.", "httpDestSaveChanges": "Wijzigingen opslaan", "httpDestCreateDestination": "Maak bestemming aan", From 10d2bc1e9e835f5e147ed86062f405af6eec8986 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:35 -0700 Subject: [PATCH 93/99] New translations en-us.json (Polish) [ci skip] --- messages/pl-PL.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/pl-PL.json b/messages/pl-PL.json index e47b01110..df4a391fc 100644 --- a/messages/pl-PL.json +++ b/messages/pl-PL.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Powód", - "requestLogs": "HTTP Request Logs", + "requestLogs": "Dzienniki żądań HTTP", "requestAnalytics": "Żądanie Analityki", "host": "Host", "location": "Lokalizacja", "actionLogs": "Dzienniki działań", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "Dzienniki żądań HTTP", "sidebarLogsAccess": "Logi dostępu", "sidebarLogsAction": "Dzienniki działań", "logRetention": "Zachowanie dziennika", "logRetentionDescription": "Zarządzaj jak długo różne typy logów są zachowane dla tej organizacji lub wyłącz je", "requestLogsDescription": "Zobacz szczegółowe dzienniki żądań zasobów w tej organizacji", "requestAnalyticsDescription": "Zobacz szczegółowe analizy żądań dla zasobów w tej organizacji", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "Przechowywanie dzienników żądań HTTP", "logRetentionRequestDescription": "Jak długo zachować dzienniki żądań", "logRetentionAccessLabel": "Zachowanie dziennika dostępu", "logRetentionAccessDescription": "Jak długo zachować dzienniki dostępu", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Działania administracyjne wykonywane przez użytkowników w organizacji.", "httpDestConnectionLogsTitle": "Dzienniki połączeń", "httpDestConnectionLogsDescription": "Zdarzenia związane z miejscem i tunelem, w tym połączenia i rozłączenia.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "Dzienniki żądań HTTP", "httpDestRequestLogsDescription": "Logi żądań HTTP dla zasobów proxy, w tym metody, ścieżki i kodu odpowiedzi.", "httpDestSaveChanges": "Zapisz zmiany", "httpDestCreateDestination": "Utwórz cel", From 70bb42f1fcf66dad7f2d82d9c67c40f9864f47eb Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:37 -0700 Subject: [PATCH 94/99] New translations en-us.json (Portuguese) [ci skip] --- messages/pt-PT.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/pt-PT.json b/messages/pt-PT.json index 1f658d18d..bc683dc77 100644 --- a/messages/pt-PT.json +++ b/messages/pt-PT.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "PI", "reason": "Motivo", - "requestLogs": "HTTP Request Logs", + "requestLogs": "Registros de Pedidos HTTP", "requestAnalytics": "Solicitar análise", "host": "Servidor", "location": "Local:", "actionLogs": "Logs de Ações", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "Registros de Pedidos HTTP", "sidebarLogsAccess": "Logs de Acesso", "sidebarLogsAction": "Logs de Ações", "logRetention": "Retenção de Log", "logRetentionDescription": "Gerenciar quanto tempo os diferentes tipos de logs são mantidos para esta organização ou desativá-los", "requestLogsDescription": "Ver registros de pedidos detalhados de recursos nesta organização", "requestAnalyticsDescription": "Exibir análise detalhada de pedidos para recursos nesta organização", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "Retenção de Registro de Pedido HTTP", "logRetentionRequestDescription": "Por quanto tempo manter os registros de pedidos", "logRetentionAccessLabel": "Retenção de Log de Acesso", "logRetentionAccessDescription": "Por quanto tempo manter os registros de acesso", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Ações administrativas realizadas por usuários dentro da organização.", "httpDestConnectionLogsTitle": "Logs da conexão", "httpDestConnectionLogsDescription": "Eventos de conexão de site e túnel, incluindo conexões e desconexões.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "Registros de Pedidos HTTP", "httpDestRequestLogsDescription": "Logs de solicitação HTTP para recursos proxy incluindo o método, o caminho e o código de resposta.", "httpDestSaveChanges": "Salvar as alterações", "httpDestCreateDestination": "Criar destino", From cc2a416a929c75ccac7d59a329cf18bfa84381c5 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:39 -0700 Subject: [PATCH 95/99] New translations en-us.json (Russian) [ci skip] --- messages/ru-RU.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/ru-RU.json b/messages/ru-RU.json index 185e00006..46bb5911a 100644 --- a/messages/ru-RU.json +++ b/messages/ru-RU.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Причина", - "requestLogs": "HTTP Request Logs", + "requestLogs": "HTTP Запросы Логи", "requestAnalytics": "Аналитика запроса", "host": "Хост", "location": "Местоположение", "actionLogs": "Журнал действий", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "HTTP Запросы Логи", "sidebarLogsAccess": "Журналы доступа", "sidebarLogsAction": "Журнал действий", "logRetention": "Сохранение журнала", "logRetentionDescription": "Управление сохранением различных типов журналов для этой организации или отключение их", "requestLogsDescription": "Просмотреть подробные журналы запроса ресурсов в этой организации", "requestAnalyticsDescription": "Просмотреть подробную аналитику запроса для ресурсов в этой организации", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "Сохранение HTTP Запросов Лога", "logRetentionRequestDescription": "Как долго сохранять журналы запросов", "logRetentionAccessLabel": "Хранение журнала доступа", "logRetentionAccessDescription": "Как долго сохранять журналы доступа", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Административные меры, осуществляемые пользователями в рамках организации.", "httpDestConnectionLogsTitle": "Журнал подключений", "httpDestConnectionLogsDescription": "События связи с сайтами и туннелями, включая соединения и отключения.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "HTTP Запросы Логи", "httpDestRequestLogsDescription": "Журналы запросов HTTP для проксируемых ресурсов, включая метод, путь и код ответа.", "httpDestSaveChanges": "Сохранить изменения", "httpDestCreateDestination": "Создать адрес назначения", From c95e66d53180e0056cc2a068c37f700dae119136 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:40 -0700 Subject: [PATCH 96/99] New translations en-us.json (Turkish) [ci skip] --- messages/tr-TR.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/tr-TR.json b/messages/tr-TR.json index b9d992276..0bcd5d313 100644 --- a/messages/tr-TR.json +++ b/messages/tr-TR.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "Daha Fazla Kimlik Doğrulama Yöntemi Yok", "ip": "IP", "reason": "Sebep", - "requestLogs": "HTTP Request Logs", + "requestLogs": "HTTP İstek Günlükleri", "requestAnalytics": "İstek Analizi", "host": "Sunucu", "location": "Konum", "actionLogs": "Eylem Günlükleri", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "HTTP İstek Günlükleri", "sidebarLogsAccess": "Erişim Günlükleri", "sidebarLogsAction": "Eylem Günlükleri", "logRetention": "Kayıt Saklama", "logRetentionDescription": "Bu organizasyon için farklı türdeki günlüklerin ne kadar süre saklanacağını yönetin veya devre dışı bırakın", "requestLogsDescription": "Bu organizasyondaki kaynaklar için ayrıntılı istek günlüklerini görüntüleyin", "requestAnalyticsDescription": "Bu organizasyondaki kaynaklar için ayrıntılı istek analizlerini görüntüleyin.", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "HTTP İstek Günlüğü Saklama", "logRetentionRequestDescription": "İstek günlüklerini ne kadar süre tutacağını belirle", "logRetentionAccessLabel": "Erişim Günlüğü Saklama", "logRetentionAccessDescription": "Erişim günlüklerini ne kadar süre tutacağını belirle", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Kullanıcılar tarafından organizasyon içerisinde yapılan yönetici eylemleri.", "httpDestConnectionLogsTitle": "Bağlantı Kayıtları", "httpDestConnectionLogsDescription": "Site ve tünel bağlantı olayları, bağlantılar ve bağlantı kesilmeleri dahil.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "HTTP İstek Günlükleri", "httpDestRequestLogsDescription": "Yönlendirilmiş kaynaklar için HTTP istek kayıtları, yöntem, yol ve yanıt kodu dahil.", "httpDestSaveChanges": "Değişiklikleri Kaydet", "httpDestCreateDestination": "Hedef Oluştur", From 05e738e0f4e7912daf4e0b4974faf561f12d2111 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:42 -0700 Subject: [PATCH 97/99] New translations en-us.json (Chinese Simplified) [ci skip] --- messages/zh-CN.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/zh-CN.json b/messages/zh-CN.json index 430faaf36..e61e0c61a 100644 --- a/messages/zh-CN.json +++ b/messages/zh-CN.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "原因", - "requestLogs": "HTTP Request Logs", + "requestLogs": "请求日志", "requestAnalytics": "请求分析", "host": "主机", "location": "地点", "actionLogs": "操作日志", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "请求日志", "sidebarLogsAccess": "访问日志", "sidebarLogsAction": "操作日志", "logRetention": "日志保留", "logRetentionDescription": "管理不同类型的日志为这个机构保留多长时间或禁用这些日志", "requestLogsDescription": "查看此机构资源的详细请求日志", "requestAnalyticsDescription": "查看此机构资源的详细请求分析", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "HTTP 请求日志保留", "logRetentionRequestDescription": "保留请求日志的时间", "logRetentionAccessLabel": "访问日志保留", "logRetentionAccessDescription": "保留访问日志的时间", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "组织内部用户采取的行政行动。", "httpDestConnectionLogsTitle": "连接日志", "httpDestConnectionLogsDescription": "站点和隧道连接事件,包括连接和断开连接。", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "请求日志", "httpDestRequestLogsDescription": "HTTP 请求代理资源日志,包括方法、路径和响应代码。", "httpDestSaveChanges": "保存更改", "httpDestCreateDestination": "创建目标", From ed35d255985872e78273376e226d8b96096f94c6 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:44 -0700 Subject: [PATCH 98/99] New translations en-us.json (Norwegian Bokmal) [ci skip] --- messages/nb-NO.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/nb-NO.json b/messages/nb-NO.json index 05686eaee..72a7c21df 100644 --- a/messages/nb-NO.json +++ b/messages/nb-NO.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Grunn", - "requestLogs": "HTTP Request Logs", + "requestLogs": "HTTP-forespørselslogger", "requestAnalytics": "Be om analyser", "host": "Vert", "location": "Sted", "actionLogs": "Handlingslogger", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "HTTP-forespørselslogger", "sidebarLogsAccess": "Tilgangslogger (Automatic Translation)", "sidebarLogsAction": "Handlingslogger", "logRetention": "Logg tilbaketrekning", "logRetentionDescription": "Håndter hvor lenge ulike typer logger beholdes for denne organisasjonen, eller deaktiver dem", "requestLogsDescription": "Se detaljerte forespørselslogger for ressurser i denne organisasjonen", "requestAnalyticsDescription": "Se detaljert rekvisisjonsanalyse for ressurser i denne organisasjonen", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "Be om loggbevaring", "logRetentionRequestDescription": "Hvor lenge du vil beholde forespørselslogger", "logRetentionAccessLabel": "Få tilgang til loggoverføring", "logRetentionAccessDescription": "Hvor lenge du vil beholde adgangslogger", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Administrative tiltak som utføres av brukere innenfor organisasjonen.", "httpDestConnectionLogsTitle": "Loggfiler for tilkobling", "httpDestConnectionLogsDescription": "Utstyrs- og tunneltilkoblingshendelser, inkludert forbindelser og frakobling.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "HTTP-forespørselslogger", "httpDestRequestLogsDescription": "HTTP-forespørsel logger for bekreftede ressurser, inkludert metode, bane og responskode.", "httpDestSaveChanges": "Lagre endringer", "httpDestCreateDestination": "Opprett mål", From 181bcffe7dec723160c50334ec824669803b2a93 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Wed, 6 May 2026 16:17:46 -0700 Subject: [PATCH 99/99] New translations en-us.json (Spanish) [ci skip] --- messages/es-ES.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/messages/es-ES.json b/messages/es-ES.json index 5ead411d0..e610233f7 100644 --- a/messages/es-ES.json +++ b/messages/es-ES.json @@ -2660,19 +2660,19 @@ "noMoreAuthMethods": "No Valid Auth", "ip": "IP", "reason": "Razón", - "requestLogs": "HTTP Request Logs", + "requestLogs": "Registros de Solicitud HTTP", "requestAnalytics": "Analítica de Solicitud", "host": "Anfitrión", "location": "Ubicación", "actionLogs": "Registros de acción", - "sidebarLogsRequest": "HTTP Request Logs", + "sidebarLogsRequest": "Registros de Solicitud HTTP", "sidebarLogsAccess": "Registros de acceso", "sidebarLogsAction": "Registros de acción", "logRetention": "Retención de Log", "logRetentionDescription": "Administrar cuánto tiempo se conservan los diferentes tipos de registros para esta organización o desactivarlos", "requestLogsDescription": "Ver registros de solicitudes detallados para los recursos de esta organización", "requestAnalyticsDescription": "Ver análisis de solicitudes detalladas de recursos en esta organización", - "logRetentionRequestLabel": "HTTP Request Log Retention", + "logRetentionRequestLabel": "Retención de Registro de Solicitud HTTP", "logRetentionRequestDescription": "Cuánto tiempo conservar los registros de solicitudes", "logRetentionAccessLabel": "Retención de Log de Acceso", "logRetentionAccessDescription": "Cuánto tiempo retener los registros de acceso", @@ -3134,7 +3134,7 @@ "httpDestActionLogsDescription": "Acciones administrativas realizadas por los usuarios dentro de la organización.", "httpDestConnectionLogsTitle": "Registros de conexión", "httpDestConnectionLogsDescription": "Eventos de conexión de sitios y túneles, incluyendo conexiones y desconexiones.", - "httpDestRequestLogsTitle": "HTTP Request Logs", + "httpDestRequestLogsTitle": "Registros de Solicitud HTTP", "httpDestRequestLogsDescription": "Registros de peticiones HTTP para recursos proxyficados, incluyendo método, ruta y código de respuesta.", "httpDestSaveChanges": "Guardar Cambios", "httpDestCreateDestination": "Crear destino",