diff --git a/Localize/locales/en/frontend-glossary.json b/Localize/locales/en/frontend-glossary.json index c6098a9c5..257f26f58 100644 --- a/Localize/locales/en/frontend-glossary.json +++ b/Localize/locales/en/frontend-glossary.json @@ -1,26 +1,35 @@ { "{{ restarts }} ({{ abbrevTime }} ago)": "{{ restarts }} ({{ abbrevTime }} ago)", + "a8r.io Metadata": "a8r.io Metadata", "About": "About", "About dialog tabs": "About dialog tabs", "Access Modes": "Access Modes", + "Active Deadline": "Active Deadline", + "Active Jobs": "Active Jobs", "Addresses": "Addresses", "AKS desktop Version": "AKS desktop Version", + "Allocatable": "Allocatable", "Allow Volume Expansion": "Allow Volume Expansion", "API Groups": "API Groups", "API Version": "API Version", "API Versions": "API Versions", + "App Protocol": "App Protocol", "Architecture": "Architecture", "Are you sure you want to drain the node {{name}}?": "Are you sure you want to drain the node {{name}}?", "Args": "Args", "Attach": "Attach", + "Automount Service Account Token": "Automount Service Account Token", + "Available": "Available", "Backend TLS Policies": "Backend TLS Policies", "Backend Traffic Policies": "Backend Traffic Policies", "Backends": "Backends", "BackendTLSPolicies": "BackendTLSPolicies", "BackendTrafficPolicies": "BackendTrafficPolicies", + "Backoff Limit": "Backoff Limit", "Binding Info": "Binding Info", "Binding Mode": "Binding Mode", "Boot ID": "Boot ID", + "Bound": "Bound", "Capacity": "Capacity", "Checking if Vertical Pod Autoscaler is enabled…": "Checking if Vertical Pod Autoscaler is enabled…", "Claim": "Claim", @@ -28,9 +37,14 @@ "Client Config: Ca Bundle": "Client Config: Ca Bundle", "Cluster": "Cluster", "Cluster IP": "Cluster IP", + "Cluster IPs": "Cluster IPs", "Cluster selector": "Cluster selector", "Command": "Command", + "Completed Indexes": "Completed Indexes", + "Completion Mode": "Completion Mode", + "Completion Time": "Completion Time", "Completions": "Completions", + "Concurrency Policy": "Concurrency Policy", "Condition": "Condition", "Conditions": "Conditions", "Config Maps": "Config Maps", @@ -49,6 +63,8 @@ "Cordoned node {{name}}.": "Cordoned node {{name}}.", "Cordoning node {{name}}…": "Cordoning node {{name}}…", "CPU": "CPU", + "CPU Limits": "CPU Limits", + "CPU Requests": "CPU Requests", "CRD: {{ crdName }}": "CRD: {{ crdName }}", "Cron Jobs": "Cron Jobs", "CronJobs": "CronJobs", @@ -67,6 +83,8 @@ "Drained node {{name}}.": "Drained node {{name}}.", "Draining node {{name}} cancelled.": "Draining node {{name}} cancelled.", "Draining node {{name}}…": "Draining node {{name}}…", + "Driver Name": "Driver Name", + "Duration": "Duration", "Egress": "Egress", "Endpoint Slices": "Endpoint Slices", "Endpoint: {{ name }}": "Endpoint: {{ name }}", @@ -76,6 +94,10 @@ "Events": "Events", "except: {{ cidrExceptions }}": "except: {{ cidrExceptions }}", "External IP": "External IP", + "External Name": "External Name", + "External Traffic Policy": "External Traffic Policy", + "Failed": "Failed", + "Failed Jobs History Limit": "Failed Jobs History Limit", "Failed to cordon node {{name}}.": "Failed to cordon node {{name}}.", "Failed to drain node {{name}}.": "Failed to drain node {{name}}.", "Failed to uncordon node {{name}}.": "Failed to uncordon node {{name}}.", @@ -95,6 +117,7 @@ "GRPCRoutes": "GRPCRoutes", "Headlamp Version": "Headlamp Version", "_Headlamp Version.comment": "{Locked=\"Headlamp\"}", + "Health Check Node Port": "Health Check Node Port", "Horizontal Pod Autoscalers": "Horizontal Pod Autoscalers", "Host IP": "Host IP", "Host IPs": "Host IPs", @@ -106,13 +129,18 @@ "HttpRoutes": "HttpRoutes", "Image": "Image", "Image Pull Policy": "Image Pull Policy", + "Image Pull Secrets": "Image Pull Secrets", "Images": "Images", "Ingress": "Ingress", "Ingress Classes": "Ingress Classes", "Ingresses": "Ingresses", + "Internal Traffic Policy": "Internal Traffic Policy", "IP": "IP", + "IP Families": "IP Families", + "IP Family Policy": "IP Family Policy", "ipBlock": "ipBlock", "_ipBlock.comment": "{Locked=\"ipBlock\"}", + "Job Sets": "Job Sets", "Jobs": "Jobs", "Kernel version": "Kernel version", "Kernel Version": "Kernel Version", @@ -122,6 +150,7 @@ "Kubernetes Version": "Kubernetes Version", "_Kubernetes Version.comment": "{Locked=\"Kubernetes\"}", "Last Schedule": "Last Schedule", + "Last Successful Time": "Last Successful Time", "Last Transition": "Last Transition", "Last Update": "Last Update", "Lease": "Lease", @@ -133,15 +162,22 @@ "List Kind": "List Kind", "Listeners": "Listeners", "Liveness Probes": "Liveness Probes", + "Load Balancer Class": "Load Balancer Class", + "Load Balancer Source Ranges": "Load Balancer Source Ranges", "Logs": "Logs", "Logs: {{ itemName }}": "Logs: {{ itemName }}", + "Lost": "Lost", "Lower Bound": "Lower Bound", "Machine ID": "Machine ID", "Map": "Map", "Match Policy": "Match Policy", "Max": "Max", "Memory": "Memory", + "Memory Limits": "Memory Limits", + "Memory Requests": "Memory Requests", "Min": "Min", + "Min Ready Seconds": "Min Ready Seconds", + "Mount Options": "Mount Options", "Mutating Webhook Configurations": "Mutating Webhook Configurations", "Namespace": "Namespace", "Namespace Selector": "Namespace Selector", @@ -156,7 +192,10 @@ "No targets defined": "No targets defined", "No validation settings": "No validation settings", "Node": "Node", + "Node Pool": "Node Pool", + "Node Port": "Node Port", "Node Selector": "Node Selector", + "Node Selectors": "Node Selectors", "Nodes": "Nodes", "Nominated Node": "Nominated Node", "Non Resources": "Non Resources", @@ -165,7 +204,9 @@ "OS": "OS", "OS image": "OS image", "Owner": "Owner", + "Parallelism": "Parallelism", "Parameters": "Parameters", + "Pending": "Pending", "Persistent Volume Claims": "Persistent Volume Claims", "Persistent Volumes": "Persistent Volumes", "Platform": "Platform", @@ -175,16 +216,21 @@ "Pod Disruption Budgets": "Pod Disruption Budgets", "Pod IP": "Pod IP", "Pod IPs": "Pod IPs", + "Pod Management Policy": "Pod Management Policy", "Pod Selector": "Pod Selector", "Pods": "Pods", + "Pods Status": "Pods Status", "podSelector": "podSelector", "_podSelector.comment": "{Locked=\"podSelector\"}", + "Policy Types": "Policy Types", "Port": "Port", "Port Forwarding": "Port Forwarding", "Ports": "Ports", "Priority": "Priority", + "Priority Class": "Priority Class", "Priority Classes": "Priority Classes", "PriorityClass": "PriorityClass", + "Progress Deadline": "Progress Deadline", "Protocol": "Protocol", "Provisioner": "Provisioner", "QoS Class": "QoS Class", @@ -196,19 +242,24 @@ "Reference Kind": "Reference Kind", "Reference Name": "Reference Name", "Reinvocation Policy": "Reinvocation Policy", + "Released": "Released", "Replica Sets": "Replica Sets", "Replicas": "Replicas", "Request": "Request", + "Requested": "Requested", "Resource": "Resource", + "Resource Allocation": "Resource Allocation", "Resource Quotas": "Resource Quotas", "Resources": "Resources", "Restarts": "Restarts", "Retry Constraint": "Retry Constraint", + "Revision History Limit": "Revision History Limit", "Role": "Role", "Role Bindings": "Role Bindings", "Roles": "Roles", "RollingUpdate. Max unavailable: {{ maxUnavailable }}, max surge: {{ maxSurge }}": "RollingUpdate. Max unavailable: {{ maxUnavailable }}, max surge: {{ maxSurge }}", "Rules": "Rules", + "Runtime Class": "Runtime Class", "Runtime Classes": "Runtime Classes", "RuntimeClass": "RuntimeClass", "Schedule": "Schedule", @@ -220,14 +271,17 @@ "Served": "Served", "Service Account": "Service Account", "Service Accounts": "Service Accounts", - "Service Information": "Service Information", + "Service Name": "Service Name", "Services": "Services", "Serving": "Serving", + "Session Affinity": "Session Affinity", "Session Persistence": "Session Persistence", "Shell: {{ itemName }}": "Shell: {{ itemName }}", "Show Logs": "Show Logs", "Side Effects": "Side Effects", "Singular": "Singular", + "Source": "Source", + "Start Time": "Start Time", "Starting deadline": "Starting deadline", "State": "State", "Stateful Sets": "Stateful Sets", @@ -237,17 +291,24 @@ "Strategy Type": "Strategy Type", "Subresources": "Subresources", "Subsets": "Subsets", + "Successful Jobs History Limit": "Successful Jobs History Limit", "System Info": "System Info", "System UUID": "System UUID", "Target": "Target", "Targets": "Targets", "Terminal / Exec": "Terminal / Exec", "Terminating": "Terminating", + "Termination Grace Period": "Termination Grace Period", + "This resource is only effective for compatible CSI drivers that support mutable volume attributes.": "This resource is only effective for compatible CSI drivers that support mutable volume attributes.", + "Time Zone": "Time Zone", "Timeout Seconds": "Timeout Seconds", "TLS Validation": "TLS Validation", "To": "To", "toggle field visibility": "toggle field visibility", "Tolerations": "Tolerations", + "Total limits may be over 100 percent, i.e., overcommitted.": "Total limits may be over 100 percent, i.e., overcommitted.", + "Traffic Distribution": "Traffic Distribution", + "TTL After Finished": "TTL After Finished", "Uncapped Target": "Uncapped Target", "Uncordon": "Uncordon", "Uncordon node {{name}} cancelled.": "Uncordon node {{name}} cancelled.", @@ -263,6 +324,7 @@ "Vertical Pod Autoscaler is not enabled. <1>Learn More": "Vertical Pod Autoscaler is not enabled. <1>Learn More", "Vertical Pod Autoscalers": "Vertical Pod Autoscalers", "Volume": "Volume", + "Volume Attributes Classes": "Volume Attributes Classes", "Volume Binding Mode": "Volume Binding Mode", "Volume Mode": "Volume Mode", "Volume Mounts": "Volume Mounts", diff --git a/Localize/locales/en/plugin-translation.json b/Localize/locales/en/plugin-translation.json index aee1bfb04..6f2d9cc64 100644 --- a/Localize/locales/en/plugin-translation.json +++ b/Localize/locales/en/plugin-translation.json @@ -49,6 +49,8 @@ "AKS Cluster": "AKS Cluster", "AKS desktop logo": "AKS desktop logo", "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.", + "AKS Hybrid & Edge": "AKS Hybrid & Edge", + "AKS Hybrid & Edge (Arc-connected)": "AKS Hybrid & Edge (Arc-connected)", "AKS Managed": "AKS Managed", "AKS Preview Extension installed successfully!": "AKS Preview Extension installed successfully!", "AKS Preview Extension Required": "AKS Preview Extension Required", @@ -111,6 +113,7 @@ "Canceling will discard your pipeline progress. Are you sure?": "Canceling will discard your pipeline progress. Are you sure?", "Cancelled deletion of project {{ projectId }}.": "Cancelled deletion of project {{ projectId }}.", "Cancelled update of namespace {{ name }}.": "Cancelled update of namespace {{ name }}.", + "Checking AKS Hybrid & Edge proxy…": "Checking AKS Hybrid & Edge proxy…", "Checking authentication status": "Checking authentication status", "Checking for existing identity...": "Checking for existing identity...", "Checking if another project exists with same name": "Checking if another project exists with same name", @@ -125,8 +128,10 @@ "Client ID": "Client ID", "Close": "Close", "Cluster": "Cluster", + "Cluster '{{cluster}}' successfully connected": "Cluster '{{cluster}}' successfully connected", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Cluster '{{cluster}}' successfully merged in kubeconfig", "_Cluster '{{cluster}}' successfully merged in kubeconfig.comment": "{Locked=\"kubeconfig\"}", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}", "Cluster {{clusterName}} must be registered before importing regular namespaces. Import a managed namespace from this cluster first.": "Cluster {{clusterName}} must be registered before importing regular namespaces. Import a managed namespace from this cluster first.", "Cluster Configuration": "Cluster Configuration", "Cluster is being deleted. Cannot deploy to this cluster.": "Cluster is being deleted. Cannot deploy to this cluster.", @@ -159,12 +164,14 @@ "Configuring...": "Configuring...", "Confirm & Import": "Confirm & Import", "Connect": "Connect", + "Connect AKS Hybrid & Edge cluster": "Connect AKS Hybrid & Edge cluster", "Connect GitHub": "Connect GitHub", "_Connect GitHub.comment": "{Locked=\"GitHub\"}", "Connect to GitHub": "Connect to GitHub", "_Connect to GitHub.comment": "{Locked=\"GitHub\"}", "Connected": "Connected", "Connected to '{{username}}'.": "Connected to '{{username}}'.", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "Connected to \"{{cluster}}\". Reload to view the cluster.", "Connecting to GitHub...": "Connecting to GitHub...", "_Connecting to GitHub....comment": "{Locked=\"GitHub\"}", "Connecting...": "Connecting...", @@ -297,6 +304,7 @@ "Error Rate": "Error Rate", "Failed to apply": "Failed to apply", "Failed to apply resources.": "Failed to apply resources.", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}", "Failed to convert namespace: {{message}}": "Failed to convert namespace: {{message}}", "Failed to create container registry": "Failed to create container registry", "Failed to create namespace": "Failed to create namespace", @@ -474,6 +482,8 @@ "Minimum CPU guaranteed (1000m = 1 CPU core)": "Minimum CPU guaranteed (1000m = 1 CPU core)", "Minimum memory guaranteed (1024 MiB = 1 GiB)": "Minimum memory guaranteed (1024 MiB = 1 GiB)", "Minimum Replicas": "Minimum Replicas", + "Missing Azure metadata for this cluster.": "Missing Azure metadata for this cluster.", + "_Missing Azure metadata for this cluster..comment": "{Locked=\"Azure\"}", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.", "_Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant..comment": "{Locked=\"Azure\"}", "Mounts the container's root filesystem as read-only to prevent write operations.": "Mounts the container's root filesystem as read-only to prevent write operations.", @@ -540,10 +550,13 @@ "Number of seconds after the container has started before startup probes are initiated.": "Number of seconds after the container has started before startup probes are initiated.", "Number of seconds after which the probe times out. Default is 1 second.": "Number of seconds after which the probe times out. Default is 1 second.", "Object ID": "Object ID", + "Offline": "Offline", "OIDC trust for": "OIDC trust for", "Once agent has created deployment PR, review the generated files and merge to start the deployment pipeline": "Once agent has created deployment PR, review the generated files and merge to start the deployment pipeline", "Only clusters with Azure Entra ID authentication are shown.": "Only clusters with Azure Entra ID authentication are shown.", "_Only clusters with Azure Entra ID authentication are shown..comment": "{Locked=\"Azure\"}", + "Open in Azure portal": "Open in Azure portal", + "_Open in Azure portal.comment": "{Locked=\"Azure\"}", "Performing final status verification": "Performing final status verification", "periodSeconds": "periodSeconds", "Pipeline": "Pipeline", @@ -556,6 +569,7 @@ "Please select at least one namespace to import": "Please select at least one namespace to import", "Please sign in to Azure to continue.": "Please sign in to Azure to continue.", "_Please sign in to Azure to continue..comment": "{Locked=\"Azure\"}", + "Please wait...": "Please wait...", "Pod Details": "Pod Details", "Pod Name": "Pod Name", "PR {{number}}": "PR {{number}}", @@ -601,6 +615,7 @@ "Regular": "Regular", "Regular Kubernetes namespace": "Regular Kubernetes namespace", "_Regular Kubernetes namespace.comment": "{Locked=\"Kubernetes\"}", + "Reload": "Reload", "remove": "remove", "Remove assignee": "Remove assignee", "Reopen install page": "Reopen install page", @@ -704,9 +719,12 @@ "SKU": "SKU", "Source": "Source", "Standard": "Standard", + "Start AKS Hybrid & Edge proxy": "Start AKS Hybrid & Edge proxy", + "Starting AKS Hybrid & Edge proxy...": "Starting AKS Hybrid & Edge proxy...", "Starting project creation": "Starting project creation", "Startup path": "Startup path", "Status": "Status", + "Stop AKS Hybrid & Edge proxy": "Stop AKS Hybrid & Edge proxy", "Stored as Kubernetes Secret": "Stored as Kubernetes Secret", "_Stored as Kubernetes Secret.comment": "{Locked=\"Kubernetes\"}", "Subscription": "Subscription", @@ -723,6 +741,8 @@ "_The AKS Desktop GitHub App must be installed on {{repoName}} to continue..comment": "{Locked=\"GitHub\"}", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "The aks-preview extension is required to create managed namespaces. Please install it to continue.", "_The aks-preview extension is required to create managed namespaces. Please install it to continue..comment": "{Locked=\"aks-preview\"}", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s", + "_The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s.comment": "{Locked=\"Azure\"}", "The Copilot coding agent is analyzing your repo and generating a deployment PR with Dockerfile, Kubernetes manifests and a GitHub Actions workflow.": "The Copilot coding agent is analyzing your repo and generating a deployment PR with Dockerfile, Kubernetes manifests and a GitHub Actions workflow.", "_The Copilot coding agent is analyzing your repo and generating a deployment PR with Dockerfile, Kubernetes manifests and a GitHub Actions workflow..comment": "{Locked=\"Kubernetes\",\"GitHub\",\"Docker\"}", "The following addons can be enabled on this cluster:": "The following addons can be enabled on this cluster:", @@ -790,6 +810,7 @@ "_User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID..comment": "{Locked=\"Azure\"}", "Validation failed": "Validation failed", "Value": "Value", + "Verifying cluster connection...": "Verifying cluster connection...", "View deployment": "View deployment", "View Deployment": "View Deployment", "View issue on GitHub": "View issue on GitHub", diff --git a/plugins/aks-desktop/locales/cs/translation.json b/plugins/aks-desktop/locales/cs/translation.json index 4ee1a4dcf..6aeba2aa1 100644 --- a/plugins/aks-desktop/locales/cs/translation.json +++ b/plugins/aks-desktop/locales/cs/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Aktualizovat", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Typ", + "Role": "Role", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Nepovedlo se načíst předplatná.", "Failed to load AKS clusters": "Nepovedlo se načíst clustery AKS.", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Cluster {{cluster}} se úspěšně sloučil v kubeconfig.", "Failed to register cluster: {{message}}": "Nepodařilo se zaregistrovat cluster: {{message}}.", "Register AKS Cluster": "Zaregistrovat cluster AKS", "Checking authentication status": "Kontroluje se stav ověřování.", "You need to be logged in to Azure to register AKS clusters.": "Abyste mohli registrovat clustery AKS, musíte být přihlášení k Azure.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Předplatné", "Select an Azure subscription": "Vyberte předplatné Azure", "Loading subscriptions": "Načítání předplatných", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "V tomto předplatném se nenašly žádné clustery AKS.", "AKS Cluster": "Cluster AKS", "Select an AKS cluster": "Vyberte cluster AKS", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Podrobnosti vybraného clusteru", "Name": "Název", "Resource Group": "Skupina prostředků", "Location": "Umístění", "Kubernetes Version": "Verze Kubernetes", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Hotovo", "Cancel": "Zrušit", "Registering": "Probíhá registrace", "Register Cluster": "Zaregistrovat cluster", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Neznámá chyba", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Zavřít", + "Open in Azure portal": "", + "Retry": "Zkusit znovu", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Zahajuje se přihlášení k Azure.", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Dokončete prosím ověření v prohlížeči. Toto okno se po dokončení přihlášení automaticky přesměruje.", "Login successful! Redirecting": "Přihlášení bylo úspěšné. Přesměrování", @@ -50,25 +84,10 @@ "Assignee": "Pověřená osoba", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Role", "Remove assignee": "Odebrat pověřenou osobu", "Add assignee": "Přidat pověřenou osobu", - "Only clusters with Azure Entra ID authentication are shown.": "Zobrazují se jenom clustery s ověřováním Azure Entra ID.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "Byl skryt tento počet clusterů: {{count}} – bez ID Azure Entra", - "{{count}} cluster(s) hidden — no Azure Entra ID_few": "", - "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "Byl skryt tento počet clusterů: {{count}} – bez ID Azure Entra", - "No eligible clusters found in this subscription.": "V tomto předplatném se nenašly žádné oprávněné clustery.", - "{{count}} eligible cluster(s) found._one": "Počet nalezených oprávněných clusterů: {{count}}", - "{{count}} eligible cluster(s) found._few": "", - "{{count}} eligible cluster(s) found._many": "", - "{{count}} eligible cluster(s) found._other": "Počet nalezených oprávněných clusterů: {{count}}", - "Cluster is currently updating. Deployment may fail.": "Cluster se právě aktualizuje. Nasazení může selhat.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Cluster se odstraňuje. Do tohoto clusteru nelze provést nasazení.", - "Cluster is still being created. Please wait until creation completes.": "Cluster se stále vytváří. Počkejte prosím, než se vytváření dokončí.", - "Cluster is in a failed state. Please check Azure portal.": "Cluster je v neúspěšném stavu. Podívejte se prosím na Azure Portal.", - "Cluster is stopped. Please start the cluster before deploying.": "Cluster je zastaven. Před nasazením prosím cluster spusťte.", - "Cluster is deallocated. Please start the cluster before deploying.": "Cluster je uvolněný. Před nasazením prosím cluster spusťte.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "V kubeconfig chybí vybraný cluster. Než budete pokračovat, zaregistrujte ho.", + "Registering cluster": "Registruje se cluster", "AKS Preview Extension Required": "Vyžaduje se rozšíření AKS Preview.", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "K vytvoření spravovaných oborů názvů se vyžaduje rozšíření aks-preview. Nainstalujte ho prosím, aby bylo možné pokračovat.", "Installing": "Instalace", @@ -89,7 +108,6 @@ "Select a subscription": "Vyberte předplatné", "Search subscriptions": "Hledat předplatná", "No subscriptions found": "Nenašla se žádná předplatná", - "Retry": "Zkusit znovu", "Cluster": "Cluster", "Please select a subscription first": "Nejdříve prosím vyberte předplatné.", "Loading clusters": "Načítání clusterů", @@ -98,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Pro toto předplatné se nenašly žádné clustery s ověřováním Azure Entra ID.", "Cluster Not Ready": "Cluster není připravený", "Refreshing": "Aktualizace", - "Refresh": "Aktualizovat", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "V kubeconfig chybí vybraný cluster. Než budete pokračovat, zaregistrujte ho.", - "Registering cluster": "Registruje se cluster", "Wizard steps": "Postup průvodce", "Azure Monitor Metrics (Managed Prometheus)": "Metriky Azure Monitoru (spravovaný Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (automatické škálování řízené událostmi)", @@ -162,6 +177,27 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Zobrazují se jenom clustery s ověřováním Azure Entra ID.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "Byl skryt tento počet clusterů: {{count}} – bez ID Azure Entra", + "{{count}} cluster(s) hidden — no Azure Entra ID_few": "", + "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "Byl skryt tento počet clusterů: {{count}} – bez ID Azure Entra", + "No eligible clusters found in this subscription.": "V tomto předplatném se nenašly žádné oprávněné clustery.", + "{{count}} eligible cluster(s) found._one": "Počet nalezených oprávněných clusterů: {{count}}", + "{{count}} eligible cluster(s) found._few": "", + "{{count}} eligible cluster(s) found._many": "", + "{{count}} eligible cluster(s) found._other": "Počet nalezených oprávněných clusterů: {{count}}", + "Cluster is currently updating. Deployment may fail.": "Cluster se právě aktualizuje. Nasazení může selhat.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Cluster se odstraňuje. Do tohoto clusteru nelze provést nasazení.", + "Cluster is still being created. Please wait until creation completes.": "Cluster se stále vytváří. Počkejte prosím, než se vytváření dokončí.", + "Cluster is in a failed state. Please check Azure portal.": "Cluster je v neúspěšném stavu. Podívejte se prosím na Azure Portal.", + "Cluster is stopped. Please start the cluster before deploying.": "Cluster je zastaven. Před nasazením prosím cluster spusťte.", + "Cluster is deallocated. Please start the cluster before deploying.": "Cluster je uvolněný. Před nasazením prosím cluster spusťte.", + "Status": "Stav", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_few": "", + "{{count}} nodes_many": "", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Spouští se vytváření projektu.", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "Časový limit vytvoření projektu vypršel po 10 minutách. Zkontrolujte prosím, jestli se obor názvů vytvořil, a zkuste to znovu.", "Initiating managed namespace creation": "Zahajuje se vytváření spravovaného oboru názvů.", @@ -192,7 +228,6 @@ "Namespace Name": "Název oboru názvů", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Musí obsahovat jenom malá písmena, číslice a spojovníky a začínat a končit alfanumerickým znakem", "The namespace will be created on the selected cluster and set up as a project": "Obor názvů se vytvoří ve vybraném clusteru a nastaví se jako projekt", - "Type": "Typ", "Regular Kubernetes namespace": "Běžný obor názvů Kubernetes", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "V clusteru se vytvoří nový obor názvů s použitými popisky projektu. Zobrazí se okamžitě v seznamu projektů.", "Create New Namespace": "Vytvořit nový obor názvů", @@ -239,7 +274,6 @@ "Source": "Zdroj", "Replicas": "Repliky", "Ready": "Připraveno", - "Status": "Stav", "Actions": "Akce", "Edit deployment": "Upravit nasazení", "View workflow run": "Zobrazit spuštění pracovního postupu", @@ -252,7 +286,6 @@ "Sign in": "Přihlásit se", "GitHub authentication required to trigger deployment.": "K aktivaci nasazení se vyžaduje ověřování GitHubu.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "Odeslání pracovního postupu se úspěšně aktivovalo. Průběh zkontrolujte v GitHub Actions.", - "Close": "Zavřít", "Triggering...": "Spouštění...", "Deploy": "Nasadit", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Pokud chcete používat nasazení kanálů, povolte kanály GitHubu tady: Nastavení → Funkce Preview.", @@ -495,7 +528,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Neznámá chyba", "Initializing...": "Inicializování...", "Checking repository readiness...": "Kontroluje se připravenost úložiště...", "Loading configuration...": "Načítání konfigurace...", @@ -627,7 +659,10 @@ "Import Selected Projects": "Importovat vybrané projekty", "Failed to fetch managed namespaces": "Nepovedlo se načíst spravované obory názvů.", "Failed to fetch managed namespace details": "Nepovedlo se načíst podrobnosti o spravovaném oboru názvů.", - "Failed to update managed namespace": "Nepovedlo se aktualizovat spravovaný obor názvů.", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Aktualizování", "Update": "Aktualizovat", "AKS desktop logo": "Logo AKS Desktop", @@ -672,6 +707,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Povolte nebo zakažte funkce, které jsou stále ve vývoji. Funkce Preview se můžou v budoucích verzích změnit nebo odebrat.", "GitHub Pipelines": "Kanály GitHubu", "Enable GitHub-based deployment pipelines for AKS projects.": "Povolte kanály nasazení založené na GitHubu pro projekty AKS.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Načítání metrik škálování ze služby Prometheus", "Scaling Chart Unavailable": "Graf škálování není k dispozici", "No scaling data available": "Nejsou k dispozici žádná data škálování.", @@ -716,6 +755,7 @@ "Allow traffic within same namespace": "Povolit provoz v rámci stejného oboru názvů", "Allow all traffic": "Povolit veškerý provoz", "Deny all traffic": "Odepřít veškerý provoz", + "An error occurred in this view.": "", "No cluster is associated with this project.": "K tomuto projektu není přidružen žádný cluster.", "Please sign in to Azure to continue.": "Pokud chcete pokračovat, přihlaste se prosím k Azure.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Chybí požadovaný kontext Azure. Ujistěte se prosím, že jste přihlášení a že je cluster přidružený k platnému předplatnému, skupině prostředků a tenantovi.", @@ -725,8 +765,5 @@ "{{minutes}} min ago": "před {{minutes}} min.", "{{hours}}h ago": "Před {{hours}} h", "{{days}}d ago": "Před {{days}} d", - "{{weeks}}w ago": "před {{weeks}} týd.", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "před {{weeks}} týd." } diff --git a/plugins/aks-desktop/locales/de/translation.json b/plugins/aks-desktop/locales/de/translation.json index 10f3e40c0..e913ba274 100644 --- a/plugins/aks-desktop/locales/de/translation.json +++ b/plugins/aks-desktop/locales/de/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Aktualisieren", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Typ", + "Role": "Rolle", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Fehler beim Laden von Abonnements.", "Failed to load AKS clusters": "Fehler beim Laden von AKS-Clustern", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Der Cluster „{{cluster}}“ wurde erfolgreich in kubeconfig zusammengeführt", "Failed to register cluster: {{message}}": "Fehler beim Registrieren des Clusters: {{message}}", "Register AKS Cluster": "AKS-Cluster registrieren", "Checking authentication status": "Der Authentifizierungsstatus wird überprüft", "You need to be logged in to Azure to register AKS clusters.": "Sie müssen bei Azure angemeldet sein, um AKS-Cluster zu registrieren.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Abonnement", "Select an Azure subscription": "Wählen Sie ein Azure-Abonnement aus.", "Loading subscriptions": "Abonnements werden geladen", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "In diesem Abonnement wurden keine AKS-Cluster gefunden.", "AKS Cluster": "AKS-Cluster", "Select an AKS cluster": "AKS-Cluster auswählen", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Details zum ausgewählten Cluster", "Name": "Name", "Resource Group": "Ressourcengruppe", "Location": "Speicherort", "Kubernetes Version": "Kubernetes-Version", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Fertig", "Cancel": "Abbrechen", "Registering": "Wird registriert", "Register Cluster": "Cluster registrieren", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Unbekannter Fehler", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Schließen", + "Open in Azure portal": "", + "Retry": "Wiederholen", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Die Azure-Anmeldung wird initiiert", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Schließen Sie die Authentifizierung in Ihrem Browser ab. Dieses Fenster wird automatisch umgeleitet, sobald die Anmeldung abgeschlossen ist.", "Login successful! Redirecting": "Die Anmeldung war erfolgreich! Umleitung", @@ -50,21 +84,10 @@ "Assignee": "Zugewiesene Person", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Rolle", "Remove assignee": "Zugewiesene Person entfernen", "Add assignee": "Zugewiesene Person hinzufügen", - "Only clusters with Azure Entra ID authentication are shown.": "Es werden nur Cluster mit Azure Entra ID-Authentifizierung angezeigt.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} Cluster ausgeblendet – keine Azure Entra-ID", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} Cluster ausgeblendet – keine Azure Entra-ID", - "No eligible clusters found in this subscription.": "In diesem Abonnement wurden keine geeigneten Cluster gefunden.", - "{{count}} eligible cluster(s) found._one": "{{count}} geeignete Cluster gefunden.", - "{{count}} eligible cluster(s) found._other": "{{count}} geeignete Cluster gefunden.", - "Cluster is currently updating. Deployment may fail.": "Der Cluster wird zurzeit aktualisiert. Bei der Bereitstellung kann ein Fehler auftreten.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Der Cluster wird gelöscht. Die Bereitstellung kann in diesem Cluster nicht erfolgen.", - "Cluster is still being created. Please wait until creation completes.": "Der Cluster wird noch erstellt. Warten Sie, bis die Erstellung abgeschlossen ist.", - "Cluster is in a failed state. Please check Azure portal.": "Der Cluster befindet sich in einem fehlerhaften Zustand. Überprüfen Sie das Azure-Portal.", - "Cluster is stopped. Please start the cluster before deploying.": "Der Cluster wurde beendet. Starten Sie den Cluster vor der Bereitstellung.", - "Cluster is deallocated. Please start the cluster before deploying.": "Die Zuordnung des Clusters wurde aufgehoben. Starten Sie den Cluster vor der Bereitstellung.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Der ausgewählte Cluster fehlt in kubeconfig. Registrieren Sie ihn, bevor Sie fortfahren.", + "Registering cluster": "Cluster wird registriert", "AKS Preview Extension Required": "AKS-Vorschauerweiterung erforderlich", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "Die aks-preview-Erweiterung ist erforderlich, um verwaltete Namespaces zu erstellen. Installieren Sie sie, um den Vorgang fortzusetzen.", "Installing": "Die Installation wird ausgeführt.", @@ -85,7 +108,6 @@ "Select a subscription": "Abonnement auswählen", "Search subscriptions": "Abonnements durchsuchen", "No subscriptions found": "Keine Abonnements gefunden", - "Retry": "Wiederholen", "Cluster": "Cluster", "Please select a subscription first": "Wählen Sie zuerst ein Abonnement aus", "Loading clusters": "Cluster werden geladen", @@ -94,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Für dieses Abonnement wurden keine Cluster mit Azure Entra ID-Authentifizierung gefunden", "Cluster Not Ready": "Cluster nicht bereit", "Refreshing": "Wird aktualisiert", - "Refresh": "Aktualisieren", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Der ausgewählte Cluster fehlt in kubeconfig. Registrieren Sie ihn, bevor Sie fortfahren.", - "Registering cluster": "Cluster wird registriert", "Wizard steps": "Assistentenschritte", "Azure Monitor Metrics (Managed Prometheus)": "Azure Monitor-Metriken (verwalteter Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (ereignisgesteuerte automatische Skalierung)", @@ -156,6 +175,21 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Es werden nur Cluster mit Azure Entra ID-Authentifizierung angezeigt.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} Cluster ausgeblendet – keine Azure Entra-ID", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} Cluster ausgeblendet – keine Azure Entra-ID", + "No eligible clusters found in this subscription.": "In diesem Abonnement wurden keine geeigneten Cluster gefunden.", + "{{count}} eligible cluster(s) found._one": "{{count}} geeignete Cluster gefunden.", + "{{count}} eligible cluster(s) found._other": "{{count}} geeignete Cluster gefunden.", + "Cluster is currently updating. Deployment may fail.": "Der Cluster wird zurzeit aktualisiert. Bei der Bereitstellung kann ein Fehler auftreten.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Der Cluster wird gelöscht. Die Bereitstellung kann in diesem Cluster nicht erfolgen.", + "Cluster is still being created. Please wait until creation completes.": "Der Cluster wird noch erstellt. Warten Sie, bis die Erstellung abgeschlossen ist.", + "Cluster is in a failed state. Please check Azure portal.": "Der Cluster befindet sich in einem fehlerhaften Zustand. Überprüfen Sie das Azure-Portal.", + "Cluster is stopped. Please start the cluster before deploying.": "Der Cluster wurde beendet. Starten Sie den Cluster vor der Bereitstellung.", + "Cluster is deallocated. Please start the cluster before deploying.": "Die Zuordnung des Clusters wurde aufgehoben. Starten Sie den Cluster vor der Bereitstellung.", + "Status": "Status", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Die Projekterstellung wird gestartet", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "Timeout bei der Projekterstellung nach 10 Minuten. Überprüfen Sie, ob der Namespace erstellt wurde, und versuchen Sie es noch mal.", "Initiating managed namespace creation": "Die Erstellung eines verwalteten Namespace wird initiiert", @@ -186,7 +220,6 @@ "Namespace Name": "Namespacename", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Darf nur Kleinbuchstaben, Zahlen und Bindestriche enthalten und muss mit einem alphanumerischen Zeichen beginnen und enden.", "The namespace will be created on the selected cluster and set up as a project": "Der Namespace wird auf dem ausgewählten Cluster erstellt und als Projekt eingerichtet.", - "Type": "Typ", "Regular Kubernetes namespace": "Namespace für reguläres Kubernetes", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Auf dem Cluster wird ein neuer Namespace mit angewendeten Projektlabels erstellt. Er erscheint sofort in Ihrer Projektliste.", "Create New Namespace": "Neuen Namespace erstellen", @@ -233,7 +266,6 @@ "Source": "Quelle", "Replicas": "Replikate", "Ready": "Bereit", - "Status": "Status", "Actions": "Aktionen", "Edit deployment": "Bereitstellung bearbeiten", "View workflow run": "Workflowausführung anzeigen", @@ -246,7 +278,6 @@ "Sign in": "Anmelden", "GitHub authentication required to trigger deployment.": "Zum Auslösen der Bereitstellung ist eine GitHub-Authentifizierung erforderlich.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "Die Workflowverteilung wurde erfolgreich ausgelöst. Überprüfen Sie den Status der GitHub Actions.", - "Close": "Schließen", "Triggering...": "Auslösen\u00a0...", "Deploy": "Bereitstellen", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "GitHub Pipelines in den Einstellungen aktivieren → Previewfunktionen für die Verwendung von Pipelinebereitstellungen.", @@ -483,7 +514,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Unbekannter Fehler", "Initializing...": "Initialisierung\u00a0...", "Checking repository readiness...": "Repositorybereitschaft wird überprüft\u00a0...", "Loading configuration...": "Konfiguration wird geladen…", @@ -603,7 +633,10 @@ "Import Selected Projects": "Ausgewählte Projekte importieren", "Failed to fetch managed namespaces": "Fehler beim Abrufen verwalteter Namespaces", "Failed to fetch managed namespace details": "Fehler beim Abrufen der Details des verwalteten Namespaces", - "Failed to update managed namespace": "Fehler beim Aktualisieren des verwalteten Namespace", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Wird aktualisiert", "Update": "Aktualisieren", "AKS desktop logo": "AKS-Desktoplogo", @@ -648,6 +681,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Aktivieren oder deaktivieren Sie Funktionen, die sich noch in der Entwicklung befinden. Vorschaufunktionen können in zukünftigen Versionen geändert oder entfernt werden.", "GitHub Pipelines": "GitHub-Pipelines", "Enable GitHub-based deployment pipelines for AKS projects.": "Aktivieren Sie GitHub-basierte Bereitstellungspipelines für AKS-Projekte.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Laden von Skalierungsmetriken aus Prometheus", "Scaling Chart Unavailable": "Skalierungsdiagramm nicht verfügbar", "No scaling data available": "Keine Skalierungsdaten verfügbar", @@ -692,6 +729,7 @@ "Allow traffic within same namespace": "Netzwerkdatenverkehr innerhalb desselben Namespace zulassen", "Allow all traffic": "Gesamten Datenverkehr zulassen", "Deny all traffic": "Den gesamten Datenverkehr verweigern", + "An error occurred in this view.": "", "No cluster is associated with this project.": "Diesem Projekt ist kein Cluster zugeordnet.", "Please sign in to Azure to continue.": "Melden Sie sich bei Azure an, um fortzufahren.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Erforderlicher Azure-Kontext fehlt. Stellen Sie sicher, dass Sie angemeldet sind und der Cluster einem gültigen Abonnement, einer gültigen Ressourcengruppe und einem gültigen Mandanten zugeordnet ist.", @@ -701,8 +739,5 @@ "{{minutes}} min ago": "Vor {{minutes}} Min.", "{{hours}}h ago": "Vor {{hours}} Stunde(n)", "{{days}}d ago": "Vor {{days}} Tag(en)", - "{{weeks}}w ago": "Vor {{weeks}} Woche(n)", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "Vor {{weeks}} Woche(n)" } diff --git a/plugins/aks-desktop/locales/en/translation.json b/plugins/aks-desktop/locales/en/translation.json index ec40fcb00..06e9b21e4 100644 --- a/plugins/aks-desktop/locales/en/translation.json +++ b/plugins/aks-desktop/locales/en/translation.json @@ -12,11 +12,17 @@ "Failed to load role assignments": "Failed to load role assignments", "Failed to load subscriptions": "Failed to load subscriptions", "Failed to load AKS clusters": "Failed to load AKS clusters", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}", + "Cluster '{{cluster}}' successfully connected": "Cluster '{{cluster}}' successfully connected", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Cluster '{{cluster}}' successfully merged in kubeconfig", "Failed to register cluster: {{message}}": "Failed to register cluster: {{message}}", "Register AKS Cluster": "Register AKS Cluster", "Checking authentication status": "Checking authentication status", "You need to be logged in to Azure to register AKS clusters.": "You need to be logged in to Azure to register AKS clusters.", + "Tenant": "Tenant", + "Select an Azure tenant": "Select an Azure tenant", "Subscription": "Subscription", "Select an Azure subscription": "Select an Azure subscription", "Loading subscriptions": "Loading subscriptions", @@ -24,15 +30,32 @@ "No AKS clusters found in this subscription.": "No AKS clusters found in this subscription.", "AKS Cluster": "AKS Cluster", "Select an AKS cluster": "Select an AKS cluster", + "AKS Hybrid & Edge": "AKS Hybrid & Edge", + "Offline": "Offline", "Selected Cluster Details": "Selected Cluster Details", "Name": "Name", "Resource Group": "Resource Group", "Location": "Location", "Kubernetes Version": "Kubernetes Version", + "AKS Hybrid & Edge (Arc-connected)": "AKS Hybrid & Edge (Arc-connected)", "Done": "Done", "Cancel": "Cancel", "Registering": "Registering", "Register Cluster": "Register Cluster", + "Checking AKS Hybrid & Edge proxy…": "Checking AKS Hybrid & Edge proxy…", + "Stop AKS Hybrid & Edge proxy": "Stop AKS Hybrid & Edge proxy", + "Start AKS Hybrid & Edge proxy": "Start AKS Hybrid & Edge proxy", + "Missing Azure metadata for this cluster.": "Missing Azure metadata for this cluster.", + "Unknown error": "Unknown error", + "Connect AKS Hybrid & Edge cluster": "Connect AKS Hybrid & Edge cluster", + "Starting AKS Hybrid & Edge proxy...": "Starting AKS Hybrid & Edge proxy...", + "Verifying cluster connection...": "Verifying cluster connection...", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "Connected to \"{{cluster}}\". Reload to view the cluster.", + "Close": "Close", + "Open in Azure portal": "Open in Azure portal", + "Retry": "Retry", + "Reload": "Reload", + "Please wait...": "Please wait...", "Initiating Azure login": "Initiating Azure login", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Please complete the authentication in your browser. This window will automatically redirect once login is complete.", "Login successful! Redirecting": "Login successful! Redirecting", @@ -63,18 +86,8 @@ "Select a user from the search results or enter a valid object ID (UUID)": "Select a user from the search results or enter a valid object ID (UUID)", "Remove assignee": "Remove assignee", "Add assignee": "Add assignee", - "Only clusters with Azure Entra ID authentication are shown.": "Only clusters with Azure Entra ID authentication are shown.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} cluster(s) hidden — no Azure Entra ID", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} cluster(s) hidden — no Azure Entra ID", - "No eligible clusters found in this subscription.": "No eligible clusters found in this subscription.", - "{{count}} eligible cluster(s) found._one": "{{count}} eligible cluster(s) found.", - "{{count}} eligible cluster(s) found._other": "{{count}} eligible cluster(s) found.", - "Cluster is currently updating. Deployment may fail.": "Cluster is currently updating. Deployment may fail.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Cluster is being deleted. Cannot deploy to this cluster.", - "Cluster is still being created. Please wait until creation completes.": "Cluster is still being created. Please wait until creation completes.", - "Cluster is in a failed state. Please check Azure portal.": "Cluster is in a failed state. Please check Azure portal.", - "Cluster is stopped. Please start the cluster before deploying.": "Cluster is stopped. Please start the cluster before deploying.", - "Cluster is deallocated. Please start the cluster before deploying.": "Cluster is deallocated. Please start the cluster before deploying.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Selected cluster is missing from the kubeconfig. Register it before proceeding.", + "Registering cluster": "Registering cluster", "AKS Preview Extension Required": "AKS Preview Extension Required", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "The aks-preview extension is required to create managed namespaces. Please install it to continue.", "Installing": "Installing", @@ -95,7 +108,6 @@ "Select a subscription": "Select a subscription", "Search subscriptions": "Search subscriptions", "No subscriptions found": "No subscriptions found", - "Retry": "Retry", "Cluster": "Cluster", "Please select a subscription first": "Please select a subscription first", "Loading clusters": "Loading clusters", @@ -104,8 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "No clusters with Azure Entra ID authentication found for this subscription", "Cluster Not Ready": "Cluster Not Ready", "Refreshing": "Refreshing", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Selected cluster is missing from the kubeconfig. Register it before proceeding.", - "Registering cluster": "Registering cluster", "Wizard steps": "Wizard steps", "Azure Monitor Metrics (Managed Prometheus)": "Azure Monitor Metrics (Managed Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (Event-Driven Autoscaling)", @@ -165,6 +175,21 @@ "Type at least 2 characters to search": "Type at least 2 characters to search", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.", "Object ID": "Object ID", + "Only clusters with Azure Entra ID authentication are shown.": "Only clusters with Azure Entra ID authentication are shown.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} cluster(s) hidden — no Azure Entra ID", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} cluster(s) hidden — no Azure Entra ID", + "No eligible clusters found in this subscription.": "No eligible clusters found in this subscription.", + "{{count}} eligible cluster(s) found._one": "{{count}} eligible cluster(s) found.", + "{{count}} eligible cluster(s) found._other": "{{count}} eligible cluster(s) found.", + "Cluster is currently updating. Deployment may fail.": "Cluster is currently updating. Deployment may fail.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Cluster is being deleted. Cannot deploy to this cluster.", + "Cluster is still being created. Please wait until creation completes.": "Cluster is still being created. Please wait until creation completes.", + "Cluster is in a failed state. Please check Azure portal.": "Cluster is in a failed state. Please check Azure portal.", + "Cluster is stopped. Please start the cluster before deploying.": "Cluster is stopped. Please start the cluster before deploying.", + "Cluster is deallocated. Please start the cluster before deploying.": "Cluster is deallocated. Please start the cluster before deploying.", + "Status": "Status", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Starting project creation", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.", "Initiating managed namespace creation": "Initiating managed namespace creation", @@ -241,7 +266,6 @@ "Source": "Source", "Replicas": "Replicas", "Ready": "Ready", - "Status": "Status", "Actions": "Actions", "Edit deployment": "Edit deployment", "View workflow run": "View workflow run", @@ -254,7 +278,6 @@ "Sign in": "Sign in", "GitHub authentication required to trigger deployment.": "GitHub authentication required to trigger deployment.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "Workflow dispatch triggered successfully. Check GitHub Actions for progress.", - "Close": "Close", "Triggering...": "Triggering...", "Deploy": "Deploy", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.", @@ -491,7 +514,6 @@ "AI improvement suggestions in progress": "AI improvement suggestions in progress", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.", "View issue on GitHub": "View issue on GitHub", - "Unknown error": "Unknown error", "Initializing...": "Initializing...", "Checking repository readiness...": "Checking repository readiness...", "Loading configuration...": "Loading configuration...", @@ -659,6 +681,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Enable or disable features that are still in development. Preview features may change or be removed in future releases.", "GitHub Pipelines": "GitHub Pipelines", "Enable GitHub-based deployment pipelines for AKS projects.": "Enable GitHub-based deployment pipelines for AKS projects.", + "Telemetry": "Telemetry", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.", + "Send pseudonymous usage data": "Send pseudonymous usage data", + "Restart AKS Desktop for this change to take effect.": "Restart AKS Desktop for this change to take effect.", "Loading scaling metrics from Prometheus": "Loading scaling metrics from Prometheus", "Scaling Chart Unavailable": "Scaling Chart Unavailable", "No scaling data available": "No scaling data available", @@ -703,6 +729,7 @@ "Allow traffic within same namespace": "Allow traffic within same namespace", "Allow all traffic": "Allow all traffic", "Deny all traffic": "Deny all traffic", + "An error occurred in this view.": "An error occurred in this view.", "No cluster is associated with this project.": "No cluster is associated with this project.", "Please sign in to Azure to continue.": "Please sign in to Azure to continue.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.", @@ -712,13 +739,5 @@ "{{minutes}} min ago": "{{minutes}} min ago", "{{hours}}h ago": "{{hours}}h ago", "{{days}}d ago": "{{days}}d ago", - "{{weeks}}w ago": "{{weeks}}w ago", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes", - "Telemetry": "Telemetry", - "AKS Desktop sends anonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "AKS Desktop sends anonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.", - "Send anonymous usage data": "Send anonymous usage data", - "Restart AKS Desktop for this change to take effect.": "Restart AKS Desktop for this change to take effect.", - "An error occurred in this view.": "An error occurred in this view." + "{{weeks}}w ago": "{{weeks}}w ago" } diff --git a/plugins/aks-desktop/locales/es/translation.json b/plugins/aks-desktop/locales/es/translation.json index de3d62bf7..348f32e9c 100644 --- a/plugins/aks-desktop/locales/es/translation.json +++ b/plugins/aks-desktop/locales/es/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Actualizar", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Tipo", + "Role": "Rol", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Error al cargar las suscripciones.", "Failed to load AKS clusters": "No se pudieron cargar los clústeres de AKS", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "El clúster '{{cluster}}' se ha combinado correctamente en kubeconfig", "Failed to register cluster: {{message}}": "No se pudo registrar el clúster: {{message}}", "Register AKS Cluster": "Registro del clúster de AKS", "Checking authentication status": "Comprobando estado de autenticación", "You need to be logged in to Azure to register AKS clusters.": "Debe haber iniciado sesión en Azure para registrar clústeres de AKS.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Suscripción", "Select an Azure subscription": "Selecciona una suscripción de Azure.", "Loading subscriptions": "Cargando suscripciones", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "No se encontraron clústeres de AKS en esta suscripción.", "AKS Cluster": "Clúster de AKS", "Select an AKS cluster": "Seleccione un clúster de AKS", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Detalles del clúster seleccionado", "Name": "Nombre", "Resource Group": "Grupo de recursos", "Location": "Ubicación", "Kubernetes Version": "Versión de Kubernetes", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Listo", "Cancel": "Cancelar", "Registering": "Registrando", "Register Cluster": "Registrar clúster", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Error desconocido", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Cerrar", + "Open in Azure portal": "", + "Retry": "Reintentar", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Iniciando sesión en Azure", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Complete la autenticación en su navegador. Esta ventana se redirigirá automáticamente cuando finalice el inicio de sesión.", "Login successful! Redirecting": "Inicio de sesión correcto Redirigiendo", @@ -50,23 +84,10 @@ "Assignee": "Usuario asignado", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Rol", "Remove assignee": "Quitar usuario asignado", "Add assignee": "Agregar usuario asignado", - "Only clusters with Azure Entra ID authentication are shown.": "Solo se muestran los clústeres con autenticación de Azure Entra ID.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}}\u00a0clúster(es) oculto(s): sin Azure Entra ID", - "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}}\u00a0clúster(es) oculto(s): sin Azure Entra ID", - "No eligible clusters found in this subscription.": "No se encontraron clústeres aptos en esta suscripción.", - "{{count}} eligible cluster(s) found._one": "{{count}}\u00a0clúster(es) elegible(s) encontrado(s).", - "{{count}} eligible cluster(s) found._many": "", - "{{count}} eligible cluster(s) found._other": "{{count}}\u00a0clúster(es) elegible(s) encontrado(s).", - "Cluster is currently updating. Deployment may fail.": "El clúster se está actualizando. Es posible que falle la implementación.", - "Cluster is being deleted. Cannot deploy to this cluster.": "El clúster se está eliminando. No se puede implementar en este clúster.", - "Cluster is still being created. Please wait until creation completes.": "El clúster aún se está creando. Espere hasta que se complete la creación.", - "Cluster is in a failed state. Please check Azure portal.": "El clúster está en estado de error. Consulte Azure Portal.", - "Cluster is stopped. Please start the cluster before deploying.": "El clúster está detenido. Inicie el clúster antes de la implementación.", - "Cluster is deallocated. Please start the cluster before deploying.": "El clúster está desasignado. Inicie el clúster antes de la implementación.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Falta el clúster seleccionado en kubeconfig. Regístrelo antes de continuar.", + "Registering cluster": "Registrando clúster", "AKS Preview Extension Required": "Extensión de la versión preliminar de AKS requerida", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "La extensión aks-preview es necesaria para crear espacios de nombres administrados. Instálela para continuar.", "Installing": "Instalando", @@ -87,7 +108,6 @@ "Select a subscription": "Seleccionar una suscripción", "Search subscriptions": "Buscar suscripciones", "No subscriptions found": "No se encontraron suscripciones", - "Retry": "Reintentar", "Cluster": "Clúster", "Please select a subscription first": "Seleccione primero una suscripción", "Loading clusters": "Cargando los clústeres", @@ -96,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "No se encontraron clústeres con autenticación de Azure Entra ID para esta suscripción", "Cluster Not Ready": "El clúster no está listo", "Refreshing": "Actualización en curso", - "Refresh": "Actualizar", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Falta el clúster seleccionado en kubeconfig. Regístrelo antes de continuar.", - "Registering cluster": "Registrando clúster", "Wizard steps": "Pasos del asistente", "Azure Monitor Metrics (Managed Prometheus)": "Métricas de Azure Monitor (Prometheus gestionado)", "KEDA (Event-Driven Autoscaling)": "KEDA (escalado automático basado en eventos)", @@ -159,6 +176,24 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Solo se muestran los clústeres con autenticación de Azure Entra ID.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}}\u00a0clúster(es) oculto(s): sin Azure Entra ID", + "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}}\u00a0clúster(es) oculto(s): sin Azure Entra ID", + "No eligible clusters found in this subscription.": "No se encontraron clústeres aptos en esta suscripción.", + "{{count}} eligible cluster(s) found._one": "{{count}}\u00a0clúster(es) elegible(s) encontrado(s).", + "{{count}} eligible cluster(s) found._many": "", + "{{count}} eligible cluster(s) found._other": "{{count}}\u00a0clúster(es) elegible(s) encontrado(s).", + "Cluster is currently updating. Deployment may fail.": "El clúster se está actualizando. Es posible que falle la implementación.", + "Cluster is being deleted. Cannot deploy to this cluster.": "El clúster se está eliminando. No se puede implementar en este clúster.", + "Cluster is still being created. Please wait until creation completes.": "El clúster aún se está creando. Espere hasta que se complete la creación.", + "Cluster is in a failed state. Please check Azure portal.": "El clúster está en estado de error. Consulte Azure Portal.", + "Cluster is stopped. Please start the cluster before deploying.": "El clúster está detenido. Inicie el clúster antes de la implementación.", + "Cluster is deallocated. Please start the cluster before deploying.": "El clúster está desasignado. Inicie el clúster antes de la implementación.", + "Status": "Estado", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_many": "", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Iniciando la creación del proyecto", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "La creación del proyecto agotó el tiempo de espera después de 10\u00a0minutos. Compruebe si se creó el espacio de nombres e inténtelo de nuevo.", "Initiating managed namespace creation": "Iniciando creación de espacio de nombres administrado", @@ -189,7 +224,6 @@ "Namespace Name": "Nombre de espacio de nombres", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Debe contener solo letras minúsculas, números y guiones, y comenzar y terminar con un carácter alfanumérico", "The namespace will be created on the selected cluster and set up as a project": "El espacio de nombres se creará en el clúster seleccionado y se configurará como un proyecto", - "Type": "Tipo", "Regular Kubernetes namespace": "Espacio de nombres de Kubernetes normal", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Se creará un nuevo espacio de nombres en el clúster con las etiquetas de proyecto aplicadas. Aparecerá inmediatamente en tu lista de proyectos.", "Create New Namespace": "Crear un espacio de nombres nuevo", @@ -236,7 +270,6 @@ "Source": "Origen", "Replicas": "Réplicas", "Ready": "Listo", - "Status": "Estado", "Actions": "Acciones", "Edit deployment": "Editar implementación", "View workflow run": "Ver ejecución del flujo de trabajo", @@ -249,7 +282,6 @@ "Sign in": "Iniciar sesión", "GitHub authentication required to trigger deployment.": "Se requiere autenticación de GitHub para iniciar la implementación.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "La distribución del flujo de trabajo se realizó con éxito. Consulta el progreso en Acciones de GitHub.", - "Close": "Cerrar", "Triggering...": "Activando...", "Deploy": "Implementar", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Activa las canalizaciones de GitHub en Configuración → Funciones en versión preliminar para usar implementaciones de canalizaciones.", @@ -489,7 +521,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Error desconocido", "Initializing...": "Inicializando...", "Checking repository readiness...": "Comprobando la preparación del repositorio...", "Loading configuration...": "Cargando configuración...", @@ -615,7 +646,10 @@ "Import Selected Projects": "Importar los proyectos seleccionados", "Failed to fetch managed namespaces": "No se pudieron capturar los espacios de nombres administrados", "Failed to fetch managed namespace details": "No se pudieron obtener los detalles de los espacios de nombres administrados", - "Failed to update managed namespace": "No se ha podido actualizar el espacio de nombres administrado", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Actualizando", "Update": "Actualizar", "AKS desktop logo": "Logotipo de escritorio de AKS", @@ -660,6 +694,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Habilita o deshabilita funciones que aún están en desarrollo. Las características en vista previa pueden cambiar o eliminarse en futuras versiones.", "GitHub Pipelines": "Canalizaciones de GitHub", "Enable GitHub-based deployment pipelines for AKS projects.": "Habilita las canalizaciones de implementación basadas en GitHub para proyectos de AKS.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Cargando métricas de escalado desde Prometheus", "Scaling Chart Unavailable": "Gráfico de escalado no disponible", "No scaling data available": "No hay datos de escalado disponibles", @@ -704,6 +742,7 @@ "Allow traffic within same namespace": "Permitir el tráfico dentro del mismo espacio de nombres", "Allow all traffic": "Permitir todo el tráfico", "Deny all traffic": "Denegar todo el tráfico", + "An error occurred in this view.": "", "No cluster is associated with this project.": "No hay ningún clúster asociado a este proyecto.", "Please sign in to Azure to continue.": "Inicia sesión en Azure para continuar.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Falta el contexto de Azure necesario. Asegúrate de haber iniciado sesión y de que el clúster esté asociado a una suscripción, grupo de recursos e inquilino válidos.", @@ -713,8 +752,5 @@ "{{minutes}} min ago": "hace {{minutes}}\u00a0min", "{{hours}}h ago": "hace {{hours}}\u00a0h", "{{days}}d ago": "hace {{days}}\u00a0d", - "{{weeks}}w ago": "hace {{weeks}} sem.", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "hace {{weeks}} sem." } diff --git a/plugins/aks-desktop/locales/fr/translation.json b/plugins/aks-desktop/locales/fr/translation.json index cd0107824..c10830648 100644 --- a/plugins/aks-desktop/locales/fr/translation.json +++ b/plugins/aks-desktop/locales/fr/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Actualiser", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Type", + "Role": "Rôle", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Échec du chargement des abonnements", "Failed to load AKS clusters": "Nous n’avons pas pu charger de clusters AKS", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Le cluster «\u00a0{{cluster}}\u00a0» a été fusionné dans kubeconfig avec succès", "Failed to register cluster: {{message}}": "Nous n’avons pas pu enregistrer le cluster\u00a0: {{message}}", "Register AKS Cluster": "Inscrire un cluster AKS", "Checking authentication status": "Vérification du statut de l’authentification", "You need to be logged in to Azure to register AKS clusters.": "Vous devez être connecté à Azure pour inscrire des clusters AKS.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Abonnement", "Select an Azure subscription": "Sélectionnez un abonnement Azure", "Loading subscriptions": "Chargement des abonnements", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "Aucun cluster AKS trouvé dans cet abonnement.", "AKS Cluster": "Cluster AKS", "Select an AKS cluster": "Sélectionner un cluster AKS", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Détails du cluster sélectionné", "Name": "Nom", "Resource Group": "Groupe de ressources", "Location": "Emplacement", "Kubernetes Version": "Version de Kubernetes", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Terminé", "Cancel": "Annuler", "Registering": "Inscription", "Register Cluster": "Inscrire le cluster", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Erreur inconnue", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Fermer", + "Open in Azure portal": "", + "Retry": "Réessayer", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Initialisation de la connexion Azure", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Veuillez terminer l’authentification dans votre navigateur. Cette fenêtre sera automatiquement redirigée une fois la connexion terminée.", "Login successful! Redirecting": "Connexion réussie\u00a0! Redirection", @@ -50,23 +84,10 @@ "Assignee": "Personne responsable", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Rôle", "Remove assignee": "Supprimer une personne responsable", "Add assignee": "Ajouter une personne responsable", - "Only clusters with Azure Entra ID authentication are shown.": "Seuls les clusters avec authentification Azure Entra ID s’affichent.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}}\u00a0cluster(s) masqué(s) – pas d’ID Azure Entra", - "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}}\u00a0cluster(s) masqué(s) – pas d’ID Azure Entra", - "No eligible clusters found in this subscription.": "Aucun cluster éligible trouvé dans cet abonnement.", - "{{count}} eligible cluster(s) found._one": "{{count}}\u00a0cluster(s) éligible(s) trouvé(s).", - "{{count}} eligible cluster(s) found._many": "", - "{{count}} eligible cluster(s) found._other": "{{count}}\u00a0cluster(s) éligible(s) trouvé(s).", - "Cluster is currently updating. Deployment may fail.": "Le cluster est en cours de mise à jour. Le déploiement risque d’échouer.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Le cluster est en cours de suppression. Vous ne pouvez rien déployer sur ce cluster.", - "Cluster is still being created. Please wait until creation completes.": "Le cluster est toujours en cours de création. Veuillez patienter jusqu’à la fin de la création.", - "Cluster is in a failed state. Please check Azure portal.": "Le cluster est à l’état d’échec. Veuillez vérifier le Portail Azure.", - "Cluster is stopped. Please start the cluster before deploying.": "Le cluster est arrêté. Veuillez démarrer le cluster avant le déploiement.", - "Cluster is deallocated. Please start the cluster before deploying.": "Le cluster est libéré. Veuillez démarrer le cluster avant le déploiement.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Le cluster sélectionné est absent du kubeconfig. Inscrivez-le avant de continuer.", + "Registering cluster": "Inscription du cluster", "AKS Preview Extension Required": "Extension d’AKS en préversion requise", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "L’extension aks-preview est requise pour créer des espaces de noms managés. Veuillez l’installer pour continuer.", "Installing": "Installation en cours", @@ -87,7 +108,6 @@ "Select a subscription": "Sélectionner un abonnement", "Search subscriptions": "Rechercher des abonnements", "No subscriptions found": "Aucun abonnement trouvé", - "Retry": "Réessayer", "Cluster": "Cluster", "Please select a subscription first": "Veuillez sélectionner d’abord un abonnement", "Loading clusters": "Chargement des clusters", @@ -96,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Aucun cluster avec authentification Azure Entra ID n’a été trouvé pour cet abonnement", "Cluster Not Ready": "Cluster non prêt", "Refreshing": "Actualisation", - "Refresh": "Actualiser", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Le cluster sélectionné est absent du kubeconfig. Inscrivez-le avant de continuer.", - "Registering cluster": "Inscription du cluster", "Wizard steps": "Étapes de l’Assistant", "Azure Monitor Metrics (Managed Prometheus)": "Mesures Azure Monitor (Prometheus managé)", "KEDA (Event-Driven Autoscaling)": "KEDA (mise à l’échelle automatique pilotée par les événements)", @@ -159,6 +176,24 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Seuls les clusters avec authentification Azure Entra ID s’affichent.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}}\u00a0cluster(s) masqué(s) – pas d’ID Azure Entra", + "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}}\u00a0cluster(s) masqué(s) – pas d’ID Azure Entra", + "No eligible clusters found in this subscription.": "Aucun cluster éligible trouvé dans cet abonnement.", + "{{count}} eligible cluster(s) found._one": "{{count}}\u00a0cluster(s) éligible(s) trouvé(s).", + "{{count}} eligible cluster(s) found._many": "", + "{{count}} eligible cluster(s) found._other": "{{count}}\u00a0cluster(s) éligible(s) trouvé(s).", + "Cluster is currently updating. Deployment may fail.": "Le cluster est en cours de mise à jour. Le déploiement risque d’échouer.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Le cluster est en cours de suppression. Vous ne pouvez rien déployer sur ce cluster.", + "Cluster is still being created. Please wait until creation completes.": "Le cluster est toujours en cours de création. Veuillez patienter jusqu’à la fin de la création.", + "Cluster is in a failed state. Please check Azure portal.": "Le cluster est à l’état d’échec. Veuillez vérifier le Portail Azure.", + "Cluster is stopped. Please start the cluster before deploying.": "Le cluster est arrêté. Veuillez démarrer le cluster avant le déploiement.", + "Cluster is deallocated. Please start the cluster before deploying.": "Le cluster est libéré. Veuillez démarrer le cluster avant le déploiement.", + "Status": "Statut", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_many": "", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Démarrage de la création du projet", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "La création du projet a expiré après 10\u00a0minutes. Veuillez vérifier si l’espace de noms a été créé, puis réessayer.", "Initiating managed namespace creation": "Initialisation de la création de l’espace de noms managé", @@ -189,7 +224,6 @@ "Namespace Name": "Nom de l’espace de noms", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Doit contenir uniquement des lettres minuscules, des chiffres et des traits d’union, tout en commençant et en se terminant par un caractère alphanumérique", "The namespace will be created on the selected cluster and set up as a project": "L’espace de noms sera créé sur le cluster sélectionné et sera configuré en tant que projet", - "Type": "Type", "Regular Kubernetes namespace": "Espace de noms Kubernetes normal", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Un espace de noms sera créé sur le cluster avec des étiquettes de projet appliquées. Il apparaîtra immédiatement dans votre liste de projets.", "Create New Namespace": "Créer un espace de noms", @@ -236,7 +270,6 @@ "Source": "Source", "Replicas": "Réplicas", "Ready": "Prêt", - "Status": "Statut", "Actions": "Actions", "Edit deployment": "Modifier le déploiement", "View workflow run": "Afficher l’exécution du flux de travail", @@ -249,7 +282,6 @@ "Sign in": "Se connecter", "GitHub authentication required to trigger deployment.": "Authentification GitHub requise pour déclencher le déploiement.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "La répartition du workflow a été déclenchée. Vérifiez la progression dans GitHub Actions.", - "Close": "Fermer", "Triggering...": "Déclenchement...", "Deploy": "Déployer", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Activez GitHub Pipelines dans Paramètres → Fonctionnalités en préversion pour utiliser des déploiements de pipeline.", @@ -489,7 +521,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Erreur inconnue", "Initializing...": "Initialisation en cours... Merci de patienter.", "Checking repository readiness...": "Vérification de la préparation du référentiel...", "Loading configuration...": "Chargement en cours de la configuration...", @@ -615,7 +646,10 @@ "Import Selected Projects": "Importer les projets sélectionnés", "Failed to fetch managed namespaces": "Nous n’avons pas pu extraire les espaces de noms managés", "Failed to fetch managed namespace details": "Nous n’avons pas pu extraire les détails de l’espace de noms managé", - "Failed to update managed namespace": "Nous n’avons pas pu mettre à jour l’espace de noms managé", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Mise à jour en cours", "Update": "Mettre à jour", "AKS desktop logo": "Logo AKS Desktop", @@ -660,6 +694,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Activez ou désactivez les fonctionnalités encore en développement. Les fonctionnalités en préversion peuvent évoluer ou être supprimées dans les prochaines versions.", "GitHub Pipelines": "Pipelines GitHub", "Enable GitHub-based deployment pipelines for AKS projects.": "Activez les pipelines de déploiement basés sur GitHub pour les projets AKS.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Chargement des mesures de mise à l’échelle depuis Prometheus", "Scaling Chart Unavailable": "Le graphique de mise à l’échelle n’est pas disponible", "No scaling data available": "Aucune donnée de mise à l’échelle disponible", @@ -704,6 +742,7 @@ "Allow traffic within same namespace": "Autoriser le trafic dans le même espace de noms", "Allow all traffic": "Autoriser tout le trafic", "Deny all traffic": "Refuser tout le trafic", + "An error occurred in this view.": "", "No cluster is associated with this project.": "Aucun cluster n’est associé à ce projet.", "Please sign in to Azure to continue.": "Connectez-vous à Azure pour continuer.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Contexte Azure requis manquant. Veuillez vérifier que vous êtes connecté et que le cluster est associé à un abonnement, un groupe de ressources et un locataire valides.", @@ -713,8 +752,5 @@ "{{minutes}} min ago": "Il y a {{minutes}}\u00a0min", "{{hours}}h ago": "Il y a {{hours}}\u00a0heures", "{{days}}d ago": "Il y a {{days}}\u00a0jours", - "{{weeks}}w ago": "Il y a {{weeks}}\u00a0semaines", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "Il y a {{weeks}}\u00a0semaines" } diff --git a/plugins/aks-desktop/locales/hu/translation.json b/plugins/aks-desktop/locales/hu/translation.json index 267b02fa3..701ae4f15 100644 --- a/plugins/aks-desktop/locales/hu/translation.json +++ b/plugins/aks-desktop/locales/hu/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Frissítés", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Típus", + "Role": "Szerepkör", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Az előfizetéseket nem sikerült betölteni", "Failed to load AKS clusters": "Nem sikerült betölteni az AKS-fürtöket", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "A(z) {{cluster}} fürt sikeresen egyesítve a kubeconfig állományban", "Failed to register cluster: {{message}}": "Nem sikerült regisztrálni a fürtöt: {{message}}", "Register AKS Cluster": "AKS-fürt regisztrálása", "Checking authentication status": "Hitelesítési állapot ellenőrzése", "You need to be logged in to Azure to register AKS clusters.": "Az AKS-fürtök regisztrálásához be kell jelentkeznie az Azure-ba.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Előfizetés", "Select an Azure subscription": "Válasszon ki egy Azure-előfizetést", "Loading subscriptions": "Előfizetések betöltése folyamatban", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "Ebben az előfizetésben nem találhatók AKS-fürtök.", "AKS Cluster": "AKS-fürt", "Select an AKS cluster": "AKS-fürt kiválasztása", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Kijelölt fürt részletei", "Name": "Név", "Resource Group": "Erőforráscsoport", "Location": "Hely", "Kubernetes Version": "Kubernetes-verzió", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Kész", "Cancel": "Mégse", "Registering": "Regisztrálás folyamatban", "Register Cluster": "Fürt regisztrálása", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Ismeretlen hiba", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Bezárás", + "Open in Azure portal": "", + "Retry": "Újrapróbálkozás", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Azure-bejelentkezés kezdeményezése", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Végezze el a hitelesítést a böngészőben. Ez az ablak automatikusan átirányítja a bejelentkezés befejezése után.", "Login successful! Redirecting": "Sikeres bejelentkezés! Átirányítás", @@ -50,21 +84,10 @@ "Assignee": "Felelős", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Szerepkör", "Remove assignee": "Felelős eltávolítása", "Add assignee": "Felelős hozzáadása", - "Only clusters with Azure Entra ID authentication are shown.": "Csak az Azure Entra ID-hitelesítéssel rendelkező fürtök jelennek meg.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} fürt rejtett – nincs Azure Entra-ID", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} fürt rejtett – nincs Azure Entra-ID", - "No eligible clusters found in this subscription.": "Ebben az előfizetésben nem találhatók jogosult fürtök.", - "{{count}} eligible cluster(s) found._one": "{{count}} jogosult fürt található.", - "{{count}} eligible cluster(s) found._other": "{{count}} jogosult fürt található.", - "Cluster is currently updating. Deployment may fail.": "Fürt frissítése folyamatban. Az üzembe helyezés meghiúsulhat.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Fürt törlése folyamatban. Nem telepíthet erre a fürtre.", - "Cluster is still being created. Please wait until creation completes.": "A fürt létrehozása még folyamatban van. Várjon, amíg a létrehozás befejeződik.", - "Cluster is in a failed state. Please check Azure portal.": "A fürt hibás állapotban van. Ellenőrizze Azure Portált.", - "Cluster is stopped. Please start the cluster before deploying.": "A fürt leállt. Az üzembe helyezés előtt indítsa el a fürtöt.", - "Cluster is deallocated. Please start the cluster before deploying.": "Fürt felszabadítva. Az üzembe helyezés előtt indítsa el a fürtöt.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "A kiválasztott fürt hiányzik a kubeconfig állományból. A folytatás előtt regisztrálja.", + "Registering cluster": "Fürt regisztrálása", "AKS Preview Extension Required": "Előzetes verziójú AKS-bővítmény szükséges", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "Felügyelt névterek létrehozásához aks-preview bővítmény szükséges. A folytatáshoz telepítse.", "Installing": "Telepítés", @@ -85,7 +108,6 @@ "Select a subscription": "Válasszon ki egy előfizetést", "Search subscriptions": "Előfizetések keresése", "No subscriptions found": "Nem található előfizetés", - "Retry": "Újrapróbálkozás", "Cluster": "Fürt", "Please select a subscription first": "Először válasszon előfizetést", "Loading clusters": "Fürtök betöltése folyamatban", @@ -94,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Ehhez az előfizetéshez nem található Azure Entra ID-hitelesítéssel rendelkező fürt", "Cluster Not Ready": "A fürt nem áll készen", "Refreshing": "Frissítés", - "Refresh": "Frissítés", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "A kiválasztott fürt hiányzik a kubeconfig állományból. A folytatás előtt regisztrálja.", - "Registering cluster": "Fürt regisztrálása", "Wizard steps": "Varázsló lépései", "Azure Monitor Metrics (Managed Prometheus)": "Azure Monitor metrikák (felügyelt Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (eseményvezérelt automatikus skálázás)", @@ -156,6 +175,21 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Csak az Azure Entra ID-hitelesítéssel rendelkező fürtök jelennek meg.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} fürt rejtett – nincs Azure Entra-ID", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} fürt rejtett – nincs Azure Entra-ID", + "No eligible clusters found in this subscription.": "Ebben az előfizetésben nem találhatók jogosult fürtök.", + "{{count}} eligible cluster(s) found._one": "{{count}} jogosult fürt található.", + "{{count}} eligible cluster(s) found._other": "{{count}} jogosult fürt található.", + "Cluster is currently updating. Deployment may fail.": "Fürt frissítése folyamatban. Az üzembe helyezés meghiúsulhat.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Fürt törlése folyamatban. Nem telepíthet erre a fürtre.", + "Cluster is still being created. Please wait until creation completes.": "A fürt létrehozása még folyamatban van. Várjon, amíg a létrehozás befejeződik.", + "Cluster is in a failed state. Please check Azure portal.": "A fürt hibás állapotban van. Ellenőrizze Azure Portált.", + "Cluster is stopped. Please start the cluster before deploying.": "A fürt leállt. Az üzembe helyezés előtt indítsa el a fürtöt.", + "Cluster is deallocated. Please start the cluster before deploying.": "Fürt felszabadítva. Az üzembe helyezés előtt indítsa el a fürtöt.", + "Status": "Állapot", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Projektlétrehozás indítása", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "A projekt létrehozása 10 perc után túllépte az időkorlátot. Ellenőrizze, hogy létrejött-e a névtér, majd próbálkozzon újra.", "Initiating managed namespace creation": "Felügyelt névtér létrehozásának kezdeményezése", @@ -186,7 +220,6 @@ "Namespace Name": "Névtér neve", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Csak kisbetűket, számokat és kötőjeleket tartalmazhat, és alfanumerikus karakterrel kell kezdődnie és végződnie", "The namespace will be created on the selected cluster and set up as a project": "A névtér létrejön a kiválasztott fürtön, és projektként lesz beállítva", - "Type": "Típus", "Regular Kubernetes namespace": "Normál Kubernetes-névtér", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Új névtér jön létre a fürtön, amelyen projektcímkék lesznek alkalmazva. Azonnal megjelenik a projektlistában.", "Create New Namespace": "Új névtér létrehozása", @@ -233,7 +266,6 @@ "Source": "Forrás", "Replicas": "Replikák", "Ready": "Kész", - "Status": "Állapot", "Actions": "Műveletek", "Edit deployment": "Üzemelő példány szerkesztése", "View workflow run": "Munkafolyamat futtatásának megtekintése", @@ -246,7 +278,6 @@ "Sign in": "Bejelentkezés", "GitHub authentication required to trigger deployment.": "Az üzembe helyezés elindításához GitHub-hitelesítés szükséges.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "A munkafolyamat elküldése sikeresen aktiválva. Ellenőrizze a GitHub Actions előrehaladását.", - "Close": "Bezárás", "Triggering...": "Aktiválás...", "Deploy": "Üzembe helyezés", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Engedélyezze a GitHub-folyamatokat a Beállítások → Előzetes funkciók menüben a folyamattelepítések használatához.", @@ -483,7 +514,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Ismeretlen hiba", "Initializing...": "Inicializálás...", "Checking repository readiness...": "Az adattár készültségének ellenőrzése...", "Loading configuration...": "Konfiguráció betöltése...", @@ -603,7 +633,10 @@ "Import Selected Projects": "Kijelölt projektek importálása", "Failed to fetch managed namespaces": "Nem sikerült beolvasni a felügyelt névteret", "Failed to fetch managed namespace details": "Nem sikerült beolvasni a felügyelt névtér részleteit", - "Failed to update managed namespace": "A felügyelt névtér frissítése nem sikerült", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Frissítés folyamatban", "Update": "Frissítés", "AKS desktop logo": "AKS asztal embléma", @@ -648,6 +681,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "A még fejlesztés alatt álló funkciók engedélyezése vagy letiltása. Az előzetes funkciók a későbbi kiadásokban módosulhatnak vagy eltávolításra kerülhetnek.", "GitHub Pipelines": "GitHub-folyamatok", "Enable GitHub-based deployment pipelines for AKS projects.": "Engedélyezze a GitHub-alapú üzembe helyezési folyamatokat AKS-projektekhez.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Skálázási metrikák betöltése a Prometheusból", "Scaling Chart Unavailable": "A skálázási diagram nem érhető el", "No scaling data available": "Nem állnak rendelkezésre skálázási adatok", @@ -692,6 +729,7 @@ "Allow traffic within same namespace": "Adatforgalom engedélyezése ugyanazon a névtéren belül", "Allow all traffic": "Az összes forgalom engedélyezése", "Deny all traffic": "Az összes forgalom elutasítása", + "An error occurred in this view.": "", "No cluster is associated with this project.": "Ehhez a projekthez nincs fürt társítva.", "Please sign in to Azure to continue.": "A folytatáshoz jelentkezzen be az Azure-ba.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Hiányzik a szükséges Azure-környezet. Győződjön meg arról, hogy be van jelentkezve, és a fürt egy érvényes előfizetéshez, erőforráscsoporthoz és bérlőhöz van társítva.", @@ -701,8 +739,5 @@ "{{minutes}} min ago": "{{minutes}} perce", "{{hours}}h ago": "{{hours}} órája", "{{days}}d ago": "{{days}} napja", - "{{weeks}}w ago": "{{weeks}} hete", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "{{weeks}} hete" } diff --git a/plugins/aks-desktop/locales/id/translation.json b/plugins/aks-desktop/locales/id/translation.json index 842dcb7aa..59db0fc4c 100644 --- a/plugins/aks-desktop/locales/id/translation.json +++ b/plugins/aks-desktop/locales/id/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Refresh", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Jenis", + "Role": "Peran", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Gagal memuat langganan", "Failed to load AKS clusters": "Gagal memuat kluster AKS", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Kluster '{{cluster}}' berhasil digabungkan di kubeconfig", "Failed to register cluster: {{message}}": "Gagal mendaftarkan kluster: {{message}}", "Register AKS Cluster": "Daftarkan Kluster AKS", "Checking authentication status": "Memeriksa status autentikasi", "You need to be logged in to Azure to register AKS clusters.": "Anda harus masuk ke Azure untuk mendaftarkan kluster AKS.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Langganan", "Select an Azure subscription": "Pilih langganan Azure", "Loading subscriptions": "Memuat langganan", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "Tidak ada kluster AKS yang ditemukan dalam langganan ini.", "AKS Cluster": "Kluster AKS", "Select an AKS cluster": "Pilih kluster AKS", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Detail Kluster yang Dipilih", "Name": "Nama", "Resource Group": "Grup Sumber Daya", "Location": "Lokasi", "Kubernetes Version": "Versi Kubernetes", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Selesai", "Cancel": "Batal", "Registering": "Mendaftarkan", "Register Cluster": "Daftarkan Kluster", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Kesalahan tidak diketahui", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Tutup", + "Open in Azure portal": "", + "Retry": "Coba lagi", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Memulai proses masuk Azure", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Selesaikan autentikasi di browser Anda. Jendela ini akan otomatis dialihkan setelah proses masuk selesai.", "Login successful! Redirecting": "Berhasil masuk! Mengalihkan", @@ -50,19 +84,10 @@ "Assignee": "Penerima tugas", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Peran", "Remove assignee": "Hapus penerima tugas", "Add assignee": "Tambahkan penerima tugas", - "Only clusters with Azure Entra ID authentication are shown.": "Hanya kluster dengan autentikasi Azure Entra ID yang ditampilkan.", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} kluster disembunyikan — tidak ada Azure Entra ID", - "No eligible clusters found in this subscription.": "Tidak ditemukan kluster yang memenuhi syarat dalam langganan ini.", - "{{count}} eligible cluster(s) found._other": "{{count}} kluster yang memenuhi syarat ditemukan.", - "Cluster is currently updating. Deployment may fail.": "Kluster sedang diperbarui. Penyebaran mungkin gagal.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Kluster sedang dihapus. Tidak dapat menyebarkan ke kluster ini.", - "Cluster is still being created. Please wait until creation completes.": "Kluster masih sedang dibuat. Harap tunggu hingga pembuatan selesai.", - "Cluster is in a failed state. Please check Azure portal.": "Kluster dalam status gagal. Periksa portal Azure.", - "Cluster is stopped. Please start the cluster before deploying.": "Kluster dihentikan. Mulai kluster sebelum menyebarkan.", - "Cluster is deallocated. Please start the cluster before deploying.": "Kluster dibatalkan alokasinya. Mulai kluster sebelum menyebarkan.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Kluster yang dipilih hilang dari kubeconfig. Daftarkan sebelum melanjutkan.", + "Registering cluster": "Mendaftarkan kluster", "AKS Preview Extension Required": "Ekstensi Pratinjau AKS Diperlukan", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "Ekstensi aks-preview diperlukan untuk membuat namespace terkelola. Instal untuk melanjutkan.", "Installing": "Menginstal", @@ -83,7 +108,6 @@ "Select a subscription": "Pilih langganan", "Search subscriptions": "Cari langganan", "No subscriptions found": "Tidak menemukan langganan", - "Retry": "Coba lagi", "Cluster": "Kluster", "Please select a subscription first": "Pilih langganan terlebih dahulu", "Loading clusters": "Memuat kluster", @@ -92,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Tidak ada kluster dengan autentikasi Azure Entra ID yang ditemukan untuk langganan ini", "Cluster Not Ready": "Kluster Belum Siap", "Refreshing": "Melakukan refresh", - "Refresh": "Refresh", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Kluster yang dipilih hilang dari kubeconfig. Daftarkan sebelum melanjutkan.", - "Registering cluster": "Mendaftarkan kluster", "Wizard steps": "Langkah wizard", "Azure Monitor Metrics (Managed Prometheus)": "Metrik Azure Monitor (Prometheus Terkelola)", "KEDA (Event-Driven Autoscaling)": "KEDA (Penskalaan Berbasis Kejadian)", @@ -153,6 +174,18 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Hanya kluster dengan autentikasi Azure Entra ID yang ditampilkan.", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} kluster disembunyikan — tidak ada Azure Entra ID", + "No eligible clusters found in this subscription.": "Tidak ditemukan kluster yang memenuhi syarat dalam langganan ini.", + "{{count}} eligible cluster(s) found._other": "{{count}} kluster yang memenuhi syarat ditemukan.", + "Cluster is currently updating. Deployment may fail.": "Kluster sedang diperbarui. Penyebaran mungkin gagal.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Kluster sedang dihapus. Tidak dapat menyebarkan ke kluster ini.", + "Cluster is still being created. Please wait until creation completes.": "Kluster masih sedang dibuat. Harap tunggu hingga pembuatan selesai.", + "Cluster is in a failed state. Please check Azure portal.": "Kluster dalam status gagal. Periksa portal Azure.", + "Cluster is stopped. Please start the cluster before deploying.": "Kluster dihentikan. Mulai kluster sebelum menyebarkan.", + "Cluster is deallocated. Please start the cluster before deploying.": "Kluster dibatalkan alokasinya. Mulai kluster sebelum menyebarkan.", + "Status": "Status", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Memulai pembuatan proyek", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "Waktu pembuatan proyek habis setelah 10 menit. Periksa apakah namespace dibuat dan coba lagi.", "Initiating managed namespace creation": "Memulai pembuatan namespace terkelola", @@ -183,7 +216,6 @@ "Namespace Name": "Nama namespace", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Hanya boleh berisi huruf kecil, angka, dan tanda hubung, serta harus diawali dan diakhiri dengan karakter alfanumerik", "The namespace will be created on the selected cluster and set up as a project": "Namespace akan dibuat pada kluster yang dipilih dan disiapkan sebagai proyek", - "Type": "Jenis", "Regular Kubernetes namespace": "Namespace Kubernetes reguler", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Namespace baru akan dibuat di kluster yang menerapkan label proyek. Namespace akan langsung muncul dalam daftar proyek Anda.", "Create New Namespace": "Buat Namespace Baru", @@ -230,7 +262,6 @@ "Source": "Sumber", "Replicas": "Replika", "Ready": "Siap", - "Status": "Status", "Actions": "Tindakan", "Edit deployment": "Edit penyebaran", "View workflow run": "Tampilkan eksekusi alur kerja", @@ -243,7 +274,6 @@ "Sign in": "Masuk", "GitHub authentication required to trigger deployment.": "Autentikasi GitHub diperlukan untuk memicu penyebaran.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "Pengiriman alur kerja berhasil dipicu. Periksa kemajuan di GitHub Actions.", - "Close": "Tutup", "Triggering...": "Memicu...", "Deploy": "Sebarkan", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Aktifkan Alur GitHub di Pengaturan → Fitur Pratinjau untuk menggunakan penyebaran alur.", @@ -477,7 +507,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Kesalahan tidak diketahui", "Initializing...": "Memulai...", "Checking repository readiness...": "Memeriksa kesiapan repositori...", "Loading configuration...": "Memuat konfigurasi...", @@ -591,7 +620,10 @@ "Import Selected Projects": "Impor Proyek yang Dipilih", "Failed to fetch managed namespaces": "Gagal mengambil namespace terkelola", "Failed to fetch managed namespace details": "Gagal mengambil detail namespace terkelola", - "Failed to update managed namespace": "Gagal memperbarui namespace terkelola", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Memperbarui", "Update": "Perbarui", "AKS desktop logo": "Logo AKS desktop", @@ -636,6 +668,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Aktifkan atau nonaktifkan fitur yang masih dalam tahap pengembangan. Fitur pratinjau mungkin berubah atau dihapus dalam rilis mendatang.", "GitHub Pipelines": "Alur GitHub", "Enable GitHub-based deployment pipelines for AKS projects.": "Aktifkan alur penyebaran berbasis GitHub untuk proyek AKS.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Memuat metrik penskalaan dari Prometheus", "Scaling Chart Unavailable": "Bagan Penskalakan Tidak Tersedia", "No scaling data available": "Tidak ada data penskalan yang tersedia", @@ -680,6 +716,7 @@ "Allow traffic within same namespace": "Izinkan lalu lintas dalam namespace layanan yang sama", "Allow all traffic": "Izinkan semua lalu lintas", "Deny all traffic": "Tolak semua lalu lintas", + "An error occurred in this view.": "", "No cluster is associated with this project.": "Tidak ada kluster yang terkait dengan proyek ini.", "Please sign in to Azure to continue.": "Masuk ke Azure untuk melanjutkan.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Konteks Azure yang diperlukan tidak ada. Pastikan Anda masuk dan kluster terkait dengan langganan, grup sumber daya, dan penyewa yang valid.", @@ -701,7 +738,5 @@ "Resources to be deployed ({{count}} object)_one": "Sumber daya yang akan disebarkan ({{count}} objek)", "Successfully merged {{count}} cluster(s)_one": "Berhasil menggabungkan {{count}} kluster", "with {{count}} project(s)_one": "dengan {{count}} proyek", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{count}} nodes_one": "{{count}} node" } diff --git a/plugins/aks-desktop/locales/it/translation.json b/plugins/aks-desktop/locales/it/translation.json index 80f5ae57d..c4490a534 100644 --- a/plugins/aks-desktop/locales/it/translation.json +++ b/plugins/aks-desktop/locales/it/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Aggiorna", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Tipo", + "Role": "Ruolo", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Non è stato possibile caricare le sottoscrizioni", "Failed to load AKS clusters": "Non è possibile caricare i cluster del servizio Azure Kubernetes", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Il cluster '{{cluster}}' è stato unito in kubeconfig", "Failed to register cluster: {{message}}": "Non è possibile registrare il cluster: {{message}}", "Register AKS Cluster": "Registra cluster del servizio Azure Kubernetes", "Checking authentication status": "Controllo dello stato di autenticazione", "You need to be logged in to Azure to register AKS clusters.": "È necessario accedere ad Azure per registrare i cluster del servizio Azure Kubernetes.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Sottoscrizione", "Select an Azure subscription": "Consente di selezionare una sottoscrizione di Azure", "Loading subscriptions": "Caricamento delle sottoscrizioni", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "Non sono stati trovati cluster del servizio Azure Kubernetes in questa sottoscrizione.", "AKS Cluster": "Cluster del servizio Azure Kubernetes", "Select an AKS cluster": "Selezionare un cluster del servizio Azure Kubernetes", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Dettagli cluster selezionato", "Name": "Nome", "Resource Group": "Gruppo di risorse", "Location": "Posizione", "Kubernetes Version": "Versione Kubernetes", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Fine", "Cancel": "Annulla", "Registering": "Registrazione", "Register Cluster": "Registra cluster", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Errore sconosciuto", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Chiudi", + "Open in Azure portal": "", + "Retry": "Riprova", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Avvio dell'accesso ad Azure", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Completare l'autenticazione nel browser. Questa finestra verrà reindirizzata automaticamente una volta completato l'accesso.", "Login successful! Redirecting": "Accesso riuscito. Reindirizzamento", @@ -50,23 +84,10 @@ "Assignee": "Assegnatario", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Ruolo", "Remove assignee": "Rimuovi assegnatario", "Add assignee": "Aggiungi assegnatario", - "Only clusters with Azure Entra ID authentication are shown.": "Vengono visualizzati solo i cluster con l'autenticazione con Entra ID di Azure.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "Cluster nascosti: {{count}}. Nessun Entra ID di Azure", - "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "Cluster nascosti: {{count}}. Nessun Entra ID di Azure", - "No eligible clusters found in this subscription.": "Non sono stati trovati cluster idonei in questa sottoscrizione.", - "{{count}} eligible cluster(s) found._one": "Cluster idonei trovati: {{count}}.", - "{{count}} eligible cluster(s) found._many": "", - "{{count}} eligible cluster(s) found._other": "Cluster idonei trovati: {{count}}.", - "Cluster is currently updating. Deployment may fail.": "Aggiornamento del cluster in corso. La distribuzione potrebbe non riuscire.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Eliminazione del cluster in corso. Non è possibile eseguire la distribuzione in questo cluster.", - "Cluster is still being created. Please wait until creation completes.": "Il cluster è ancora in fase di creazione. Attendere il completamento della creazione.", - "Cluster is in a failed state. Please check Azure portal.": "Il cluster si trova in uno stato di errore. Controllare nel portale di Azure.", - "Cluster is stopped. Please start the cluster before deploying.": "Cluster arrestato. Avviare il cluster prima della distribuzione.", - "Cluster is deallocated. Please start the cluster before deploying.": "Il cluster è deallocato. Avviare il cluster prima della distribuzione.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Cluster selezionato mancante da kubeconfig. Registrarlo prima di procedere.", + "Registering cluster": "Registrazione del cluster", "AKS Preview Extension Required": "Estensione di anteprima del servizio Azure Kubernetes obbligatoria", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "L'estensione aks-preview è necessaria per creare spazi dei nomi gestiti. Installarla per continuare.", "Installing": "Installazione", @@ -87,7 +108,6 @@ "Select a subscription": "Selezionare una sottoscrizione", "Search subscriptions": "Cerca sottoscrizioni", "No subscriptions found": "Nessuna sottoscrizione trovata", - "Retry": "Riprova", "Cluster": "Cluster", "Please select a subscription first": "Selezionare prima una sottoscrizione", "Loading clusters": "Caricamento dei cluster", @@ -96,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Non sono stati trovati cluster con l'autenticazione Entra ID di Azure per questa sottoscrizione", "Cluster Not Ready": "Cluster non pronto", "Refreshing": "Aggiornamento", - "Refresh": "Aggiorna", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Cluster selezionato mancante da kubeconfig. Registrarlo prima di procedere.", - "Registering cluster": "Registrazione del cluster", "Wizard steps": "Passaggi della procedura guidata", "Azure Monitor Metrics (Managed Prometheus)": "Metriche di Monitoraggio di Azure (Prometheus gestito)", "KEDA (Event-Driven Autoscaling)": "KEDA (ridimensionamento automatico guidato dagli eventi)", @@ -159,6 +176,24 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Vengono visualizzati solo i cluster con l'autenticazione con Entra ID di Azure.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "Cluster nascosti: {{count}}. Nessun Entra ID di Azure", + "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "Cluster nascosti: {{count}}. Nessun Entra ID di Azure", + "No eligible clusters found in this subscription.": "Non sono stati trovati cluster idonei in questa sottoscrizione.", + "{{count}} eligible cluster(s) found._one": "Cluster idonei trovati: {{count}}.", + "{{count}} eligible cluster(s) found._many": "", + "{{count}} eligible cluster(s) found._other": "Cluster idonei trovati: {{count}}.", + "Cluster is currently updating. Deployment may fail.": "Aggiornamento del cluster in corso. La distribuzione potrebbe non riuscire.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Eliminazione del cluster in corso. Non è possibile eseguire la distribuzione in questo cluster.", + "Cluster is still being created. Please wait until creation completes.": "Il cluster è ancora in fase di creazione. Attendere il completamento della creazione.", + "Cluster is in a failed state. Please check Azure portal.": "Il cluster si trova in uno stato di errore. Controllare nel portale di Azure.", + "Cluster is stopped. Please start the cluster before deploying.": "Cluster arrestato. Avviare il cluster prima della distribuzione.", + "Cluster is deallocated. Please start the cluster before deploying.": "Il cluster è deallocato. Avviare il cluster prima della distribuzione.", + "Status": "Stato", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_many": "", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Avvio della creazione del progetto", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "Timeout della creazione del progetto dopo 10 minuti. Verificare se lo spazio dei nomi è stato creato e riprovare.", "Initiating managed namespace creation": "Avvio della creazione dello spazio dei nomi gestito", @@ -189,7 +224,6 @@ "Namespace Name": "Nome spazio dei nomi", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Deve contenere solo lettere minuscole, numeri e trattini, oltre a iniziare e terminare con un carattere alfanumerico", "The namespace will be created on the selected cluster and set up as a project": "Lo spazio dei nomi verrà creato nel cluster selezionato e configurato come progetto", - "Type": "Tipo", "Regular Kubernetes namespace": "Spazio dei nomi Kubernetes normale", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Verrà creato un nuovo spazio dei nomi nel cluster con le etichette di progetto applicate. Verrà visualizzato immediatamente nell'elenco di progetti.", "Create New Namespace": "Crea nuovo spazio dei nomi", @@ -236,7 +270,6 @@ "Source": "Origine", "Replicas": "Repliche", "Ready": "Pronto", - "Status": "Stato", "Actions": "Azioni", "Edit deployment": "Modifica distribuzione", "View workflow run": "Visualizza esecuzione del flusso di lavoro", @@ -249,7 +282,6 @@ "Sign in": "Accedi", "GitHub authentication required to trigger deployment.": "Autenticazione GitHub necessaria per attivare la distribuzione.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "L'invio del flusso di lavoro è stato attivato. Controllare GitHub Actions per verificare lo stato di avanzamento.", - "Close": "Chiudi", "Triggering...": "Attivazione in corso...", "Deploy": "Distribuisci", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Abilitare GitHub Pipelines in Impostazioni → Funzionalità di anteprima per usare le distribuzioni di pipeline.", @@ -489,7 +521,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Errore sconosciuto", "Initializing...": "Inizializzazione in corso...", "Checking repository readiness...": "Verifica dell'idoneità del repository in corso...", "Loading configuration...": "Caricamento della configurazione in corso...", @@ -615,7 +646,10 @@ "Import Selected Projects": "Importa progetti selezionati", "Failed to fetch managed namespaces": "Non è possibile recuperare gli spazi dei nomi gestiti", "Failed to fetch managed namespace details": "Non è possibile recuperare i dettagli dello spazio dei nomi gestito", - "Failed to update managed namespace": "Non è possibile aggiornare lo spazio dei nomi gestito", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Aggiornamento", "Update": "Aggiorna", "AKS desktop logo": "Logo del desktop del servizio Azure Kubernetes", @@ -660,6 +694,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Abilitare o disabilitare le funzionalità ancora in fase di sviluppo. Le funzionalità di anteprima potrebbero cambiare o essere rimosse nelle versioni future.", "GitHub Pipelines": "Pipeline GitHub", "Enable GitHub-based deployment pipelines for AKS projects.": "Abilitare le pipeline di distribuzione basate su GitHub per i progetti del servizio Azure Kubernetes.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Caricamento delle metriche di ridimensionamento da Prometheus", "Scaling Chart Unavailable": "Grafico di ridimensionamento non disponibile", "No scaling data available": "Nessun dato di ridimensionamento disponibile", @@ -704,6 +742,7 @@ "Allow traffic within same namespace": "Consenti traffico all'interno dello stesso spazio dei nomi", "Allow all traffic": "Consenti tutto il traffico", "Deny all traffic": "Nega tutto il traffico", + "An error occurred in this view.": "", "No cluster is associated with this project.": "Nessun cluster associato a questo progetto.", "Please sign in to Azure to continue.": "Accedere ad Azure per continuare.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Contesto di Azure obbligatorio mancante. Assicurarsi di aver eseguito l'accesso e che il cluster sia associato a una sottoscrizione, un gruppo di risorse e un tenant validi.", @@ -713,8 +752,5 @@ "{{minutes}} min ago": "{{minutes}} minuto/i fa", "{{hours}}h ago": "{{hours}} ora/e fa", "{{days}}d ago": "{{days}} giorno/i fa", - "{{weeks}}w ago": "{{weeks}} settimana/e fa", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "{{weeks}} settimana/e fa" } diff --git a/plugins/aks-desktop/locales/ja/translation.json b/plugins/aks-desktop/locales/ja/translation.json index ca75bb3c6..4df2e24a0 100644 --- a/plugins/aks-desktop/locales/ja/translation.json +++ b/plugins/aks-desktop/locales/ja/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "最新の情報に更新", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "型", + "Role": "ロール", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "サブスクリプションを読み込めませんでした", "Failed to load AKS clusters": "AKS クラスターを読み込めませんでした", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "クラスター '{{cluster}}' が kubeconfig に正常にマージされました", "Failed to register cluster: {{message}}": "クラスターを登録できませんでした: {{message}}", "Register AKS Cluster": "AKS クラスターの登録", "Checking authentication status": "認証状態を確認しています", "You need to be logged in to Azure to register AKS clusters.": "AKS クラスターを登録するには、Azure にログインする必要があります。", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "サブスクリプション", "Select an Azure subscription": "Azure サブスクリプションを選択します", "Loading subscriptions": "サブスクリプションを読み込んでいます", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "このサブスクリプションに AKS クラスターが見つかりません。", "AKS Cluster": "AKS クラスター", "Select an AKS cluster": "AKS クラスターを選択する", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "選択したクラスターの詳細", "Name": "名前", "Resource Group": "リソース グループ", "Location": "場所", "Kubernetes Version": "Kubernetes バージョン", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "完了", "Cancel": "キャンセル", "Registering": "登録しています", "Register Cluster": "クラスターの登録", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "不明なエラー", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "閉じる", + "Open in Azure portal": "", + "Retry": "再試行", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Azure ログインを開始しています", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "ブラウザーで認証を完了してください。ログイン完了後、このウィンドウは自動的にリダイレクトされます。", "Login successful! Redirecting": "ログインに成功しました。リダイレクトしています", @@ -50,19 +84,10 @@ "Assignee": "担当者", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "ロール", "Remove assignee": "担当者を削除する", "Add assignee": "担当者の追加", - "Only clusters with Azure Entra ID authentication are shown.": "Azure Entra ID 認証を使用しているクラスターのみが表示されています。", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} 個のクラスターが非表示です - Azure Entra ID がありません", - "No eligible clusters found in this subscription.": "このサブスクリプションに対象クラスターが見つかりません。", - "{{count}} eligible cluster(s) found._other": "{{count}} 個の対象クラスターが見つかりました。", - "Cluster is currently updating. Deployment may fail.": "クラスターは現在更新中です。デプロイが失敗する可能性があります。", - "Cluster is being deleted. Cannot deploy to this cluster.": "クラスターは削除中です。このクラスターにはデプロイできません。", - "Cluster is still being created. Please wait until creation completes.": "クラスターはまだ作成中です。作成が完了するまでお待ちください。", - "Cluster is in a failed state. Please check Azure portal.": "クラスターはエラー状態です。Azure portal を確認してください。", - "Cluster is stopped. Please start the cluster before deploying.": "クラスターは停止しています。デプロイする前にクラスターを開始してください。", - "Cluster is deallocated. Please start the cluster before deploying.": "クラスターの割り当てが解除されています。デプロイ前にクラスターを開始してください。", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "選択したクラスターが kubeconfig にありません。続行する前に登録してください。", + "Registering cluster": "クラスターを登録しています", "AKS Preview Extension Required": "AKS プレビュー拡張機能が必要です", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "マネージド名前空間を作成するには、aks-preview 拡張機能が必要です。続行するには、インストールしてください。", "Installing": "インストール中", @@ -83,7 +108,6 @@ "Select a subscription": "サブスクリプションを選択します", "Search subscriptions": "サブスクリプションを検索する", "No subscriptions found": "サブスクリプションが見つかりません", - "Retry": "再試行", "Cluster": "クラスター", "Please select a subscription first": "最初にサブスクリプションを選択してください", "Loading clusters": "クラスターを読み込んでいます", @@ -92,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "このサブスクリプションには Azure Entra ID 認証を使用しているクラスターが見つかりません", "Cluster Not Ready": "クラスターが準備できていません", "Refreshing": "更新中", - "Refresh": "最新の情報に更新", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "選択したクラスターが kubeconfig にありません。続行する前に登録してください。", - "Registering cluster": "クラスターを登録しています", "Wizard steps": "ウィザードの手順", "Azure Monitor Metrics (Managed Prometheus)": "Azure Monitor のメトリック (マネージド Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (イベント駆動型自動スケーリング)", @@ -153,6 +174,18 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Azure Entra ID 認証を使用しているクラスターのみが表示されています。", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} 個のクラスターが非表示です - Azure Entra ID がありません", + "No eligible clusters found in this subscription.": "このサブスクリプションに対象クラスターが見つかりません。", + "{{count}} eligible cluster(s) found._other": "{{count}} 個の対象クラスターが見つかりました。", + "Cluster is currently updating. Deployment may fail.": "クラスターは現在更新中です。デプロイが失敗する可能性があります。", + "Cluster is being deleted. Cannot deploy to this cluster.": "クラスターは削除中です。このクラスターにはデプロイできません。", + "Cluster is still being created. Please wait until creation completes.": "クラスターはまだ作成中です。作成が完了するまでお待ちください。", + "Cluster is in a failed state. Please check Azure portal.": "クラスターはエラー状態です。Azure portal を確認してください。", + "Cluster is stopped. Please start the cluster before deploying.": "クラスターは停止しています。デプロイする前にクラスターを開始してください。", + "Cluster is deallocated. Please start the cluster before deploying.": "クラスターの割り当てが解除されています。デプロイ前にクラスターを開始してください。", + "Status": "状態", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "プロジェクトの作成を開始しています", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "プロジェクトの作成が 10 分後にタイムアウトしました。名前空間が作成されたかを確認してから、もう一度お試しください。", "Initiating managed namespace creation": "マネージド名前空間の作成を開始しています", @@ -183,7 +216,6 @@ "Namespace Name": "名前空間の名前", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "小文字、数字、ハイフンのみを含み、先頭と末尾は英数字である必要があります", "The namespace will be created on the selected cluster and set up as a project": "選択したクラスターに名前空間が作成され、プロジェクトとして設定されます", - "Type": "型", "Regular Kubernetes namespace": "標準の Kubernetes 名前空間", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "プロジェクト ラベルが適用された新しい名前空間がクラスターに作成されます。それはプロジェクト リストにすぐに表示されます。", "Create New Namespace": "新しい名前空間の作成", @@ -230,7 +262,6 @@ "Source": "ソース", "Replicas": "レプリカ", "Ready": "準備完了", - "Status": "状態", "Actions": "アクション", "Edit deployment": "デプロイの編集", "View workflow run": "ワークフロー実行の表示", @@ -243,7 +274,6 @@ "Sign in": "サインイン", "GitHub authentication required to trigger deployment.": "デプロイをトリガーするには GitHub 認証が必要です。", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "ワークフロー ディスパッチが正常にトリガーされました。GitHub Actions で進行状況を確認してください。", - "Close": "閉じる", "Triggering...": "トリガーしています...", "Deploy": "デプロイ", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "パイプラインのデプロイを使用するには、[設定] → [プレビュー機能] で GitHub パイプラインを有効にします。", @@ -477,7 +507,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "不明なエラー", "Initializing...": "初期化しています...", "Checking repository readiness...": "リポジトリの準備状況を確認しています...", "Loading configuration...": "構成を読み込んでいます...", @@ -591,7 +620,10 @@ "Import Selected Projects": "選択したプロジェクトのインポート", "Failed to fetch managed namespaces": "マネージド名前空間を取得できませんでした", "Failed to fetch managed namespace details": "マネージド名前空間の詳細を取得できませんでした", - "Failed to update managed namespace": "マネージド名前空間を更新できませんでした", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "更新中", "Update": "更新", "AKS desktop logo": "AKS デスクトップ ロゴ", @@ -636,6 +668,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "まだ開発中の機能を有効または無効にします。プレビュー機能は今後のリリースで変更または削除される可能性があります。", "GitHub Pipelines": "GitHub パイプライン", "Enable GitHub-based deployment pipelines for AKS projects.": "AKS プロジェクトの GitHub ベースのデプロイ パイプラインを有効にします。", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Prometheus からスケーリング メトリックを読み込んでいます", "Scaling Chart Unavailable": "スケーリング チャートは使用できません", "No scaling data available": "使用可能なスケーリング データがありません", @@ -680,6 +716,7 @@ "Allow traffic within same namespace": "同じ名前空間内のトラフィックを許可する", "Allow all traffic": "すべてのトラフィックを許可する", "Deny all traffic": "すべてのトラフィックを拒否する", + "An error occurred in this view.": "", "No cluster is associated with this project.": "このプロジェクトに関連付けられているクラスターはありません。", "Please sign in to Azure to continue.": "続けるには Azure にサインインしてください。", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "必要な Azure コンテキストが不足しています。ご自分がログインしていることと、クラスターが有効なサブスクリプション、リソース グループ、テナントに関連付けられていることを確認してください。", @@ -701,7 +738,5 @@ "Resources to be deployed ({{count}} object)_one": "デプロイするリソース ({{count}} 個のオブジェクト)", "Successfully merged {{count}} cluster(s)_one": "{{count}} 個のクラスターが正常にマージされました", "with {{count}} project(s)_one": "{{count}} 個のプロジェクトを含む", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{count}} nodes_one": "{{count}} node" } diff --git a/plugins/aks-desktop/locales/ko/translation.json b/plugins/aks-desktop/locales/ko/translation.json index 14cb5f724..4f7bea8c8 100644 --- a/plugins/aks-desktop/locales/ko/translation.json +++ b/plugins/aks-desktop/locales/ko/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "새로 고침", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "유형", + "Role": "역할", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "구독을 로드하지 못했음", "Failed to load AKS clusters": "AKS 클러스터를 로드하지 못 함", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "클러스터 '{{cluster}}'이(가) kubeconfig에 병합됨", "Failed to register cluster: {{message}}": "클러스터를 등록하지 못 함: {{message}}", "Register AKS Cluster": "AKS 클러스터 등록", "Checking authentication status": "인증 상태를 확인하는 중", "You need to be logged in to Azure to register AKS clusters.": "AKS 클러스터를 등록하려면 Azure에 로그인해야 합니다.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "구독", "Select an Azure subscription": "Azure 구독을 선택합니다.", "Loading subscriptions": "구독을 로드하는 중", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "이 구독에서 AKS 클러스터를 찾을 수 없음", "AKS Cluster": "AKS 클러스터", "Select an AKS cluster": "AKS 클러스터 선택", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "선택한 클러스터 세부 정보", "Name": "이름", "Resource Group": "리소스 그룹", "Location": "위치", "Kubernetes Version": "Kubernetes 버전", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "완료", "Cancel": "취소", "Registering": "등록 중", "Register Cluster": "클러스터 등록", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "알 수 없는 오류", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "닫기", + "Open in Azure portal": "", + "Retry": "다시 시도", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Azure 로그인을 시작하는 중", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "브라우저에서 인증을 완료하세요. 로그인이 완료되면 이 창이 자동으로 리디렉션됩니다.", "Login successful! Redirecting": "로그인 성공! 리디렉션 중", @@ -50,19 +84,10 @@ "Assignee": "담당자", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "역할", "Remove assignee": "담당자 제거", "Add assignee": "담당자 추가", - "Only clusters with Azure Entra ID authentication are shown.": "Azure Entra ID 인증을 사용하는 클러스터만 표시됩니다.", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}}개의 클러스터 숨김 - Azure Entra ID 없음", - "No eligible clusters found in this subscription.": "이 구독에서 적합한 클러스터를 찾을 수 없습니다.", - "{{count}} eligible cluster(s) found._other": "{{count}}개의 적합한 클러스터를 찾았습니다.", - "Cluster is currently updating. Deployment may fail.": "클러스터가 현재 업데이트되는 중입니다. 배포가 실패할 수 있습니다.", - "Cluster is being deleted. Cannot deploy to this cluster.": "클러스터를 삭제하는 중입니다. 이 클러스터에 배포할 수 없습니다.", - "Cluster is still being created. Please wait until creation completes.": "클러스터가 아직 만들어지는 중입니다. 만들기가 완료될 때까지 기다리세요.", - "Cluster is in a failed state. Please check Azure portal.": "클러스터가 실패 상태입니다. Azure Portal을 확인하세요.", - "Cluster is stopped. Please start the cluster before deploying.": "클러스터가 중지되었습니다. 배포하기 전에 클러스터를 시작하세요.", - "Cluster is deallocated. Please start the cluster before deploying.": "클러스터가 할당 취소되었습니다. 배포하기 전에 클러스터를 시작하세요.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "선택한 클러스터가 kubeconfig에 없습니다. 계속하기 전에 등록하세요.", + "Registering cluster": "클러스터 등록 중", "AKS Preview Extension Required": "AKS 미리 보기 확장 필요", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "관리형 네임스페이스를 만드는 데 aks-preview 확장이 필요합니다. 계속하려면 설치하세요.", "Installing": "설치 중", @@ -83,7 +108,6 @@ "Select a subscription": "구독 선택", "Search subscriptions": "구독 검색", "No subscriptions found": "구독을 찾을 수 없음", - "Retry": "다시 시도", "Cluster": "클러스터", "Please select a subscription first": "먼저 구독을 선택하세요", "Loading clusters": "클러스터를 로드하는 중", @@ -92,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "이 구독에 Azure Entra ID 인증이 있는 클러스터가 없음", "Cluster Not Ready": "클러스터가 준비되지 않음", "Refreshing": "새로 고치는 중", - "Refresh": "새로 고침", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "선택한 클러스터가 kubeconfig에 없습니다. 계속하기 전에 등록하세요.", - "Registering cluster": "클러스터 등록 중", "Wizard steps": "마법사 단계", "Azure Monitor Metrics (Managed Prometheus)": "Azure Monitor 메트릭(관리 Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA(이벤트 기반 자동 크기 조정)", @@ -153,6 +174,18 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Azure Entra ID 인증을 사용하는 클러스터만 표시됩니다.", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}}개의 클러스터 숨김 - Azure Entra ID 없음", + "No eligible clusters found in this subscription.": "이 구독에서 적합한 클러스터를 찾을 수 없습니다.", + "{{count}} eligible cluster(s) found._other": "{{count}}개의 적합한 클러스터를 찾았습니다.", + "Cluster is currently updating. Deployment may fail.": "클러스터가 현재 업데이트되는 중입니다. 배포가 실패할 수 있습니다.", + "Cluster is being deleted. Cannot deploy to this cluster.": "클러스터를 삭제하는 중입니다. 이 클러스터에 배포할 수 없습니다.", + "Cluster is still being created. Please wait until creation completes.": "클러스터가 아직 만들어지는 중입니다. 만들기가 완료될 때까지 기다리세요.", + "Cluster is in a failed state. Please check Azure portal.": "클러스터가 실패 상태입니다. Azure Portal을 확인하세요.", + "Cluster is stopped. Please start the cluster before deploying.": "클러스터가 중지되었습니다. 배포하기 전에 클러스터를 시작하세요.", + "Cluster is deallocated. Please start the cluster before deploying.": "클러스터가 할당 취소되었습니다. 배포하기 전에 클러스터를 시작하세요.", + "Status": "상태", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "프로젝트 만들기 시작", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "프로젝트 만들기 시간이 10분 후 초과되었습니다. 네임스페이스가 만들어졌는지 확인하고 다시 시도하세요.", "Initiating managed namespace creation": "관리되는 네임스페이스 만들기를 시작하는 중", @@ -183,7 +216,6 @@ "Namespace Name": "네임스페이스 이름", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "소문자, 숫자, 하이픈만 포함할 수 있으며, 시작과 끝은 영숫자여야 합니다.", "The namespace will be created on the selected cluster and set up as a project": "선택한 클러스터에 네임스페이스가 생성되고 프로젝트로 설정됩니다.", - "Type": "유형", "Regular Kubernetes namespace": "일반 Kubernetes 네임스페이스", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "프로젝트 레이블이 적용된 새 네임스페이스가 클러스터에 생성됩니다. 새 네임스페이스는 프로젝트 목록에 즉시 표시됩니다.", "Create New Namespace": "새 네임스페이스 만들기", @@ -230,7 +262,6 @@ "Source": "원본", "Replicas": "복제본", "Ready": "준비 완료", - "Status": "상태", "Actions": "작업", "Edit deployment": "배포 편집", "View workflow run": "워크플로 실행 보기", @@ -243,7 +274,6 @@ "Sign in": "로그인", "GitHub authentication required to trigger deployment.": "배포를 트리거하는 데 필요한 GitHub 인증입니다.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "워크플로 디스패치가 트리거되었습니다. 진행 상황은 GitHub Actions를 확인하세요.", - "Close": "닫기", "Triggering...": "트리거 중...", "Deploy": "배포", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "설정 → 미리 보기 기능에서 GitHub Pipelines를 사용하도록 설정하여 파이프라인 배포를 사용합니다.", @@ -477,7 +507,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "알 수 없는 오류", "Initializing...": "초기화하는 중...", "Checking repository readiness...": "리포지토리 준비 상태를 확인하는 중...", "Loading configuration...": "구성을 로드하는 중...", @@ -591,7 +620,10 @@ "Import Selected Projects": "선택한 프로젝트 가져오기", "Failed to fetch managed namespaces": "관리되는 네임스페이스를 가져오지 못함", "Failed to fetch managed namespace details": "관리형 네임스페이스 세부 정보를 가져오지 못 함", - "Failed to update managed namespace": "관리되는 네임스페이스를 업데이트하지 못 함", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "업데이트 중", "Update": "업데이트", "AKS desktop logo": "AKS 데스크톱 로고", @@ -636,6 +668,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "아직 개발 중인 기능을 사용하거나 사용하지 않도록 설정합니다. 미리 보기 기능은 향후 릴리스에서 변경되거나 제거될 수 있습니다.", "GitHub Pipelines": "GitHub 파이프라인", "Enable GitHub-based deployment pipelines for AKS projects.": "AKS 프로젝트에 GitHub 기반 배포 파이프라인을 사용하도록 설정합니다.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Prometheus에서 크기 조정 메트릭을 로드하는 중", "Scaling Chart Unavailable": "크기 조정 차트 사용 불가", "No scaling data available": "사용 가능한 크기 조정 데이터 없음", @@ -680,6 +716,7 @@ "Allow traffic within same namespace": "동일한 네임스페이스 내에서 트래픽 허용", "Allow all traffic": "모든 트래픽 허용", "Deny all traffic": "모든 트래픽 거부", + "An error occurred in this view.": "", "No cluster is associated with this project.": "이 프로젝트에 연결된 클러스터가 없습니다.", "Please sign in to Azure to continue.": "계속하려면 Azure에 로그인하세요.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "필요한 Azure 컨텍스트가 없습니다. 로그인되어 있고 클러스터가 유효한 구독, 리소스 그룹 및 테넌트와 연결되어 있는지 확인하세요.", @@ -701,7 +738,5 @@ "Resources to be deployed ({{count}} object)_one": "배포할 리소스({{count}}개 개체)", "Successfully merged {{count}} cluster(s)_one": "클러스터를 {{count}}개를 병합함", "with {{count}} project(s)_one": "프로젝트 {{count}}개 포함", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{count}} nodes_one": "{{count}} node" } diff --git a/plugins/aks-desktop/locales/nl/translation.json b/plugins/aks-desktop/locales/nl/translation.json index 209565a27..8baa121fd 100644 --- a/plugins/aks-desktop/locales/nl/translation.json +++ b/plugins/aks-desktop/locales/nl/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Vernieuwen", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Type", + "Role": "Rol", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Kan de abonnementen niet laden", "Failed to load AKS clusters": "Kan AKS-clusters niet laden", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Het cluster '{{cluster}}' is samengevoegd in kubeconfig", "Failed to register cluster: {{message}}": "Kan cluster niet registreren: {{message}}", "Register AKS Cluster": "AKS-cluster registreren", "Checking authentication status": "Verificatiestatus controleren", "You need to be logged in to Azure to register AKS clusters.": "Je moet zijn aangemeld bij Azure om AKS-clusters te registreren.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Abonnement", "Select an Azure subscription": "Selecteer een Azure-abonnement", "Loading subscriptions": "Abonnementen worden geladen", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "Er zijn geen AKS-clusters gevonden in dit abonnement.", "AKS Cluster": "AKS-cluster", "Select an AKS cluster": "Een AKS-cluster selecteren", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Details van geselecteerde cluster", "Name": "Naam", "Resource Group": "Resourcegroep", "Location": "Locatie", "Kubernetes Version": "Kubernetes-versie", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Gereed", "Cancel": "Annuleren", "Registering": "Registreren", "Register Cluster": "Cluster registreren", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Onbekende fout", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Sluiten", + "Open in Azure portal": "", + "Retry": "Opnieuw proberen", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Azure-aanmelding starten", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Rond de verificatie af in je browser. Dit venster wordt automatisch doorgestuurd zodra je bent ingelogd.", "Login successful! Redirecting": "Je bent aangemeld! Omleiden", @@ -50,21 +84,10 @@ "Assignee": "Toegewezen gebruiker", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Rol", "Remove assignee": "Toegewezen gebruiker verwijderen", "Add assignee": "Toegewezen gebruiker toevoegen", - "Only clusters with Azure Entra ID authentication are shown.": "Alleen clusters met Azure Entra ID-verificatie worden weergegeven.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} cluster(s) verborgen, geen Azure Entra-id", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} cluster(s) verborgen, geen Azure Entra-id", - "No eligible clusters found in this subscription.": "Er zijn geen in aanmerking komende clusters gevonden in dit abonnement.", - "{{count}} eligible cluster(s) found._one": "{{count}} in aanmerking komende cluster(s) gevonden.", - "{{count}} eligible cluster(s) found._other": "{{count}} in aanmerking komende cluster(s) gevonden.", - "Cluster is currently updating. Deployment may fail.": "Het cluster wordt momenteel bijgewerkt. Implementatie kan mislukken.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Het cluster wordt verwijderd. Kan niet implementeren naar dit cluster.", - "Cluster is still being created. Please wait until creation completes.": "Het cluster wordt nog gemaakt. Wacht tot het maken is voltooid.", - "Cluster is in a failed state. Please check Azure portal.": "Het cluster heeft een foutstatus. Controleer de Azure-portal.", - "Cluster is stopped. Please start the cluster before deploying.": "Cluster is gestopt. Start het cluster voordat je gaat implementeren.", - "Cluster is deallocated. Please start the cluster before deploying.": "De toewijzing van het cluster is ongedaan gemaakt. Start het cluster voordat je implementeert.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Het geselecteerde cluster ontbreekt in de kubeconfig. Registreer het voordat je verdergaat.", + "Registering cluster": "Cluster registreren", "AKS Preview Extension Required": "AKS Preview-extensie vereist", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "De extensie aks-preview is vereist om beheerde naamruimten te maken. Installeer het om door te gaan.", "Installing": "Installeren", @@ -85,7 +108,6 @@ "Select a subscription": "Een abonnement selecteren", "Search subscriptions": "Abonnementen zoeken", "No subscriptions found": "Geen abonnementen gevonden", - "Retry": "Opnieuw proberen", "Cluster": "Cluster", "Please select a subscription first": "Selecteer eerst een abonnement", "Loading clusters": "Clusters laden", @@ -94,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Er zijn geen clusters met Azure Entra ID-verificatie gevonden voor dit abonnement", "Cluster Not Ready": "Cluster niet gereed", "Refreshing": "Vernieuwen", - "Refresh": "Vernieuwen", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Het geselecteerde cluster ontbreekt in de kubeconfig. Registreer het voordat je verdergaat.", - "Registering cluster": "Cluster registreren", "Wizard steps": "Wizardstappen", "Azure Monitor Metrics (Managed Prometheus)": "Metrische gegevens van Azure Monitor (beheerde Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (automatisch schalen op basis van gebeurtenissen)", @@ -156,6 +175,21 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Alleen clusters met Azure Entra ID-verificatie worden weergegeven.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} cluster(s) verborgen, geen Azure Entra-id", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} cluster(s) verborgen, geen Azure Entra-id", + "No eligible clusters found in this subscription.": "Er zijn geen in aanmerking komende clusters gevonden in dit abonnement.", + "{{count}} eligible cluster(s) found._one": "{{count}} in aanmerking komende cluster(s) gevonden.", + "{{count}} eligible cluster(s) found._other": "{{count}} in aanmerking komende cluster(s) gevonden.", + "Cluster is currently updating. Deployment may fail.": "Het cluster wordt momenteel bijgewerkt. Implementatie kan mislukken.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Het cluster wordt verwijderd. Kan niet implementeren naar dit cluster.", + "Cluster is still being created. Please wait until creation completes.": "Het cluster wordt nog gemaakt. Wacht tot het maken is voltooid.", + "Cluster is in a failed state. Please check Azure portal.": "Het cluster heeft een foutstatus. Controleer de Azure-portal.", + "Cluster is stopped. Please start the cluster before deploying.": "Cluster is gestopt. Start het cluster voordat je gaat implementeren.", + "Cluster is deallocated. Please start the cluster before deploying.": "De toewijzing van het cluster is ongedaan gemaakt. Start het cluster voordat je implementeert.", + "Status": "Status", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Het maken van het project wordt gestart", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "Er is na 10 minuten een time-out opgetreden bij het maken van het project. Controleer of de naamruimte is gemaakt en probeer het opnieuw.", "Initiating managed namespace creation": "Maken van beheerde naamruimte starten", @@ -186,7 +220,6 @@ "Namespace Name": "Naam van naamruimte", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Mag alleen kleine letters, cijfers en koppeltekens bevatten, en moet beginnen en eindigen met een alfanumeriek teken", "The namespace will be created on the selected cluster and set up as a project": "De naamruimte wordt op het geselecteerde cluster gemaakt en ingesteld als project", - "Type": "Type", "Regular Kubernetes namespace": "Standaard Kubernetes-naamruimte", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Er wordt een nieuwe naamruimte op het cluster gemaakt met toegepaste projectlabels. Deze verschijnt direct in je projectlijst.", "Create New Namespace": "Nieuwe naamruimte maken", @@ -233,7 +266,6 @@ "Source": "Bron", "Replicas": "Replica's", "Ready": "Gereed", - "Status": "Status", "Actions": "Acties", "Edit deployment": "Implementatie bewerken", "View workflow run": "Werkstroomuitvoering weergeven", @@ -246,7 +278,6 @@ "Sign in": "Aanmelden", "GitHub authentication required to trigger deployment.": "GitHub-verificatie is vereist om de implementatie te activeren.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "Verzenden van werkstroom is geactiveerd. Controleer GitHub Actions op voortgang.", - "Close": "Sluiten", "Triggering...": "Activeren...", "Deploy": "Implementeren", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "GitHub-pijplijnen inschakelen in Instellingen → Preview-functies om pijplijnimplementaties te gebruiken.", @@ -483,7 +514,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Onbekende fout", "Initializing...": "Initialiseren...", "Checking repository readiness...": "Gereedheid van opslagplaats controleren...", "Loading configuration...": "Configuratie laden...", @@ -603,7 +633,10 @@ "Import Selected Projects": "Geselecteerde projecten importeren", "Failed to fetch managed namespaces": "Kan de beheerde naamruimten niet ophalen", "Failed to fetch managed namespace details": "Kan details van beheerde naamruimte niet ophalen", - "Failed to update managed namespace": "Kan de beheerde naamruimte niet bijwerken", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Bijwerken...", "Update": "Bijwerken", "AKS desktop logo": "AKS-desktoplogo", @@ -648,6 +681,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Schakel functies in of uit die nog in ontwikkeling zijn. Preview-functies kunnen in toekomstige versies wijzigen of verdwijnen.", "GitHub Pipelines": "GitHub-pijplijnen", "Enable GitHub-based deployment pipelines for AKS projects.": "Schakel GitHub-gebaseerde implementatiepijplijnen in voor AKS-projecten.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Metrische schaalgegevens laden vanuit Prometheus", "Scaling Chart Unavailable": "Schaalgrafiek niet beschikbaar", "No scaling data available": "Er zijn geen schaalgegevens beschikbaar", @@ -692,6 +729,7 @@ "Allow traffic within same namespace": "Verkeer binnen dezelfde naamruimte toestaan", "Allow all traffic": "Al het netwerkverkeer toestaan", "Deny all traffic": "Alle verkeer weigeren", + "An error occurred in this view.": "", "No cluster is associated with this project.": "Er is geen cluster gekoppeld aan dit project.", "Please sign in to Azure to continue.": "Meld je aan bij Azure om door te gaan.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Vereiste Azure-context ontbreekt. Zorg ervoor dat u bent aangemeld en dat het cluster is gekoppeld aan een geldig abonnement, resourcegroep en tenant.", @@ -701,8 +739,5 @@ "{{minutes}} min ago": "{{minutes}} min. geleden", "{{hours}}h ago": "{{hours}}u geleden", "{{days}}d ago": "{{days}}d geleden", - "{{weeks}}w ago": "{{weeks}}w geleden", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "{{weeks}}w geleden" } diff --git a/plugins/aks-desktop/locales/pl/translation.json b/plugins/aks-desktop/locales/pl/translation.json index d7886a1cb..c33123e0d 100644 --- a/plugins/aks-desktop/locales/pl/translation.json +++ b/plugins/aks-desktop/locales/pl/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Odśwież", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Typ", + "Role": "Rola", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Nie można załadować subskrypcji", "Failed to load AKS clusters": "Nie można załadować klastrów usługi AKS", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Klaster „{{cluster}}” został pomyślnie scalony w pliku kubeconfig", "Failed to register cluster: {{message}}": "Nie można zarejestrować klastra: {{message}}", "Register AKS Cluster": "Rejestrowanie klastra usługi AKS", "Checking authentication status": "Sprawdzanie stanu uwierzytelniania", "You need to be logged in to Azure to register AKS clusters.": "Aby zarejestrować klastry usługi AKS, musisz zalogować się na platformie Azure.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Subskrypcja", "Select an Azure subscription": "Wybierz subskrypcję platform Azure", "Loading subscriptions": "Ładowanie subskrypcji", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "Nie znaleziono klastrów usługi AKS w tej subskrypcji.", "AKS Cluster": "Klaster środowiska AKS", "Select an AKS cluster": "Wybierz klaster usługi AKS", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Szczegóły wybranego klastra", "Name": "Nazwa", "Resource Group": "Grupa zasobów", "Location": "Lokalizacja", "Kubernetes Version": "Wersja platformy Kubernetes", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Gotowe", "Cancel": "Anuluj", "Registering": "Rejestrowanie", "Register Cluster": "Zarejestruj klaster", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Nieznany błąd", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Zamknij", + "Open in Azure portal": "", + "Retry": "Ponów próbę", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Inicjowanie logowania do platformy Azure", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Ukończ uwierzytelnianie w przeglądarce. To okno zostanie automatycznie przekierowane po zakończeniu logowania.", "Login successful! Redirecting": "Logowanie pomyślne! Przekierowywanie", @@ -50,25 +84,10 @@ "Assignee": "Osoba przydzielona", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Rola", "Remove assignee": "Usuń osoby przydzielone", "Add assignee": "Dodaj osoby przydzielone", - "Only clusters with Azure Entra ID authentication are shown.": "Wyświetlane są tylko klastry z uwierzytelnianiem Azure Entra ID.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "Ukryte klastry: {{count}} — brak usługi Azure Entra ID", - "{{count}} cluster(s) hidden — no Azure Entra ID_few": "", - "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "Ukryte klastry: {{count}} — brak usługi Azure Entra ID", - "No eligible clusters found in this subscription.": "Nie znaleziono kwalifikujących się klastrów w tej subskrypcji.", - "{{count}} eligible cluster(s) found._one": "Liczba znalezionych kwalifikujących się klastrów: {{count}}", - "{{count}} eligible cluster(s) found._few": "", - "{{count}} eligible cluster(s) found._many": "", - "{{count}} eligible cluster(s) found._other": "Liczba znalezionych kwalifikujących się klastrów: {{count}}", - "Cluster is currently updating. Deployment may fail.": "Trwa aktualizowanie klastra. Wdrożenie może zakończyć się niepowodzeniem.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Trwa usuwanie klastra. Nie można wdrożyć w tym klastrze.", - "Cluster is still being created. Please wait until creation completes.": "Trwa tworzenie klastra. Zaczekaj na zakończenie tworzenia.", - "Cluster is in a failed state. Please check Azure portal.": "Klaster jest w stanie niepowodzenia. Sprawdź witrynę Azure Portal.", - "Cluster is stopped. Please start the cluster before deploying.": "Klaster jest zatrzymany. Uruchom klaster przed wdrożeniem.", - "Cluster is deallocated. Please start the cluster before deploying.": "Cofnięto przydział klastra. Uruchom klaster przed wdrożeniem.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Brak wybranego klastra w pliku kubeconfig. Zarejestruj go przed kontynuowaniem.", + "Registering cluster": "Rejestrowanie klastra", "AKS Preview Extension Required": "Wymagane rozszerzenie wersji zapoznawczej usługi AKS", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "Rozszerzenie aks-preview jest wymagane do tworzenia zarządzanych przestrzeni nazw. Zainstaluj go, aby kontynuować.", "Installing": "Instalowanie", @@ -89,7 +108,6 @@ "Select a subscription": "Wybierz subskrypcję", "Search subscriptions": "Wyszukaj subskrypcje", "No subscriptions found": "Nie znaleziono żadnych subskrypcji", - "Retry": "Ponów próbę", "Cluster": "Klaster", "Please select a subscription first": "Najpierw wybierz subskrypcję", "Loading clusters": "Ładowanie klastrów", @@ -98,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Nie znaleziono klastrów z uwierzytelnianiem Azure Entra ID dla tej subskrypcji", "Cluster Not Ready": "Klaster nie jest gotowy", "Refreshing": "Odświeżanie", - "Refresh": "Odśwież", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Brak wybranego klastra w pliku kubeconfig. Zarejestruj go przed kontynuowaniem.", - "Registering cluster": "Rejestrowanie klastra", "Wizard steps": "Kroki kreatora", "Azure Monitor Metrics (Managed Prometheus)": "Metryki usługi Azure Monitor (zarządzany zestaw narzędzi Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (skalowanie automatyczne na podstawie zdarzeń)", @@ -162,6 +177,27 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Wyświetlane są tylko klastry z uwierzytelnianiem Azure Entra ID.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "Ukryte klastry: {{count}} — brak usługi Azure Entra ID", + "{{count}} cluster(s) hidden — no Azure Entra ID_few": "", + "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "Ukryte klastry: {{count}} — brak usługi Azure Entra ID", + "No eligible clusters found in this subscription.": "Nie znaleziono kwalifikujących się klastrów w tej subskrypcji.", + "{{count}} eligible cluster(s) found._one": "Liczba znalezionych kwalifikujących się klastrów: {{count}}", + "{{count}} eligible cluster(s) found._few": "", + "{{count}} eligible cluster(s) found._many": "", + "{{count}} eligible cluster(s) found._other": "Liczba znalezionych kwalifikujących się klastrów: {{count}}", + "Cluster is currently updating. Deployment may fail.": "Trwa aktualizowanie klastra. Wdrożenie może zakończyć się niepowodzeniem.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Trwa usuwanie klastra. Nie można wdrożyć w tym klastrze.", + "Cluster is still being created. Please wait until creation completes.": "Trwa tworzenie klastra. Zaczekaj na zakończenie tworzenia.", + "Cluster is in a failed state. Please check Azure portal.": "Klaster jest w stanie niepowodzenia. Sprawdź witrynę Azure Portal.", + "Cluster is stopped. Please start the cluster before deploying.": "Klaster jest zatrzymany. Uruchom klaster przed wdrożeniem.", + "Cluster is deallocated. Please start the cluster before deploying.": "Cofnięto przydział klastra. Uruchom klaster przed wdrożeniem.", + "Status": "Stan", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_few": "", + "{{count}} nodes_many": "", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Rozpoczynanie tworzenia projektu", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "Upłynął limit czasu tworzenia projektu po 10 minutach. Sprawdź, czy przestrzeń nazw została utworzona, i spróbuj ponownie.", "Initiating managed namespace creation": "Inicjowanie tworzenia zarządzanej przestrzeni nazw", @@ -192,7 +228,6 @@ "Namespace Name": "Nazwa obszaru nazw", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Musi zawierać tylko małe litery, cyfry i łączniki, zaczynać się i kończyć znakiem alfanumerycznym", "The namespace will be created on the selected cluster and set up as a project": "Przestrzeń nazw zostanie utworzona w wybranym klastrze i skonfigurowana jako projekt", - "Type": "Typ", "Regular Kubernetes namespace": "Zwykła przestrzeń nazw Kubernetes", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "W klastrze zostanie utworzona nowa przestrzeń nazw z zastosowanymi etykietami projektu. Zostanie ona natychmiast wyświetlona na liście projektów.", "Create New Namespace": "Utwórz nową przestrzeń nazw", @@ -239,7 +274,6 @@ "Source": "Źródło", "Replicas": "Repliki", "Ready": "Gotowa", - "Status": "Stan", "Actions": "Akcje", "Edit deployment": "Edytowanie wdrożenia", "View workflow run": "Wyświetl przebieg przepływu pracy", @@ -252,7 +286,6 @@ "Sign in": "Zaloguj się", "GitHub authentication required to trigger deployment.": "Do wyzwolenia wdrożenia wymagane jest uwierzytelnianie usługi GitHub.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "Wysyłanie przepływu pracy zostało wyzwolone pomyślnie. Sprawdź, czy funkcja GitHub Actions pod kątem postępów.", - "Close": "Zamknij", "Triggering...": "Trwa wyzwalanie...", "Deploy": "Wdróż", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Włącz potoki usługi GitHub w obszarze Ustawienia → Funkcji w wersji zapoznawczej, aby korzystać z wdrożeń potoków.", @@ -495,7 +528,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Nieznany błąd", "Initializing...": "Trwa inicjowanie...", "Checking repository readiness...": "Trwa sprawdzanie gotowości repozytorium...", "Loading configuration...": "Trwa ładowanie konfiguracji...", @@ -627,7 +659,10 @@ "Import Selected Projects": "Importuj wybrane projekty", "Failed to fetch managed namespaces": "Nie można pobrać zarządzanych przestrzeni nazw", "Failed to fetch managed namespace details": "Nie można pobrać szczegółów zarządzanej przestrzeni nazw", - "Failed to update managed namespace": "Nie można zaktualizować zarządzanej przestrzeni nazw", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Aktualizowanie", "Update": "Aktualizuj", "AKS desktop logo": "Logo pulpitu usługi AKS", @@ -672,6 +707,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Włącz lub wyłącz funkcje, które są nadal opracowywane. Funkcje w wersji zapoznawczej mogą ulec zmianie lub zostać usunięte w przyszłych wersjach.", "GitHub Pipelines": "Potoki usługi GitHub", "Enable GitHub-based deployment pipelines for AKS projects.": "Włącz potoki wdrażania oparte na usłudze GitHub dla projektów usługi AKS.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Ładowanie metryk skalowania z rozwiązania Prometheus", "Scaling Chart Unavailable": "Wykres skalowania jest niedostępny", "No scaling data available": "Brak dostępnych danych skalowania", @@ -716,6 +755,7 @@ "Allow traffic within same namespace": "Zezwalaj na ruch w tej samej przestrzeni nazw", "Allow all traffic": "Zezwalaj na cały ruch", "Deny all traffic": "Odmów całego ruchu", + "An error occurred in this view.": "", "No cluster is associated with this project.": "Z tym projektem nie jest skojarzony żaden klaster.", "Please sign in to Azure to continue.": "Zaloguj się na platformie Azure, aby kontynuować.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Brak wymaganego kontekstu platformy Azure. Upewnij się, że zalogowano się, a klaster jest skojarzony z prawidłową subskrypcją, grupą zasobów i dzierżawą.", @@ -725,8 +765,5 @@ "{{minutes}} min ago": "{{minutes}} min temu", "{{hours}}h ago": "{{hours}} godz. temu", "{{days}}d ago": "{{days}} dni temu", - "{{weeks}}w ago": "{{weeks}} tyg. temu", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "{{weeks}} tyg. temu" } diff --git a/plugins/aks-desktop/locales/pt-BR/translation.json b/plugins/aks-desktop/locales/pt-BR/translation.json index 468bf2e42..04ab43547 100644 --- a/plugins/aks-desktop/locales/pt-BR/translation.json +++ b/plugins/aks-desktop/locales/pt-BR/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Atualizar", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Tipo", + "Role": "Função", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Falha ao carregar as assinaturas", "Failed to load AKS clusters": "Falha ao carregar os clusters do\u00a0AKS", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Cluster '{{cluster}}' mesclado com êxito\u00a0no kubeconfig", "Failed to register cluster: {{message}}": "Falha\u00a0ao registrar o cluster: {{message}}", "Register AKS Cluster": "Registrar Cluster do AKS", "Checking authentication status": "Verificando status\u00a0de autenticação", "You need to be logged in to Azure to register AKS clusters.": "Você precisa estar conectado ao Azure para registrar clusters do AKS.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Assinatura", "Select an Azure subscription": "Selecionar uma assinatura do\u00a0Azure", "Loading subscriptions": "Carregando assinaturas", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "Nenhum cluster do AKS encontrado nessa assinatura.", "AKS Cluster": "Cluster do AKS", "Select an AKS cluster": "Selecionar um cluster do AKS", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Detalhes do Cluster Selecionado", "Name": "Nome", "Resource Group": "Grupo de Recursos", "Location": "Localização", "Kubernetes Version": "Versão do Kubernetes", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Concluído", "Cancel": "Cancelar", "Registering": "Registrando", "Register Cluster": "Registrar Cluster", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Erro desconhecido", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Fechar", + "Open in Azure portal": "", + "Retry": "Repetir", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Iniciando logon\u00a0no Azure", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Conclua a autenticação no navegador. Esta janela será redirecionada automaticamente quando o\u00a0logon for concluído.", "Login successful! Redirecting": "Logon bem-sucedido! Redirecionando", @@ -50,23 +84,10 @@ "Assignee": "Destinatário", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Função", "Remove assignee": "Remover destinatário", "Add assignee": "Adicionar\u00a0destinatário", - "Only clusters with Azure Entra ID authentication are shown.": "Somente os clusters com a autenticação do Entra ID do Azure são mostrados.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} cluster(s) oculto(s) — nenhum Entra ID do Azure", - "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} cluster(s) oculto(s) — nenhum Entra ID do Azure", - "No eligible clusters found in this subscription.": "Nenhum cluster qualificado encontrado nessa assinatura.", - "{{count}} eligible cluster(s) found._one": "{{count}} cluster(s) qualificado(s) encontrado(s).", - "{{count}} eligible cluster(s) found._many": "", - "{{count}} eligible cluster(s) found._other": "{{count}} cluster(s) qualificado(s) encontrado(s).", - "Cluster is currently updating. Deployment may fail.": "O\u00a0cluster está sendo atualizado. A implantação pode falhar.", - "Cluster is being deleted. Cannot deploy to this cluster.": "O cluster está sendo excluído. Não\u00a0é possível implantar neste cluster.", - "Cluster is still being created. Please wait until creation completes.": "O cluster ainda está sendo criado. Aguarde até que\u00a0a criação seja concluída.", - "Cluster is in a failed state. Please check Azure portal.": "O cluster está\u00a0em estado de falha. Verifique o portal do Azure.", - "Cluster is stopped. Please start the cluster before deploying.": "O cluster está parado. Inicie\u00a0o cluster antes de implantar.", - "Cluster is deallocated. Please start the cluster before deploying.": "O cluster está desalocado. Inicie\u00a0o cluster antes de implantar.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "O cluster selecionado está ausente do kubeconfig. Registre-o antes de continuar.", + "Registering cluster": "Registrando cluster", "AKS Preview Extension Required": "Extensão de Visualização do\u00a0AKS Necessária", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "A extensão aks-preview é necessária para criar namespaces gerenciados. Instale-a para continuar.", "Installing": "Instalando", @@ -87,7 +108,6 @@ "Select a subscription": "Selecione uma assinatura", "Search subscriptions": "Pesquisar assinaturas", "No subscriptions found": "Nenhuma assinatura encontrada", - "Retry": "Repetir", "Cluster": "Cluster", "Please select a subscription first": "Primeiro, selecione uma assinatura", "Loading clusters": "Carregando clusters", @@ -96,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Nenhum cluster com a autenticação do Entra ID do Azure foi encontrado para essa assinatura", "Cluster Not Ready": "Cluster não\u00a0está pronto", "Refreshing": "Atualizando", - "Refresh": "Atualizar", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "O cluster selecionado está ausente do kubeconfig. Registre-o antes de continuar.", - "Registering cluster": "Registrando cluster", "Wizard steps": "Etapas do assistente", "Azure Monitor Metrics (Managed Prometheus)": "Métricas do Azure Monitor (Prometheus Gerenciado)", "KEDA (Event-Driven Autoscaling)": "KEDA (Dimensionamento Automático Controlado por Eventos)", @@ -159,6 +176,24 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Somente os clusters com a autenticação do Entra ID do Azure são mostrados.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} cluster(s) oculto(s) — nenhum Entra ID do Azure", + "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} cluster(s) oculto(s) — nenhum Entra ID do Azure", + "No eligible clusters found in this subscription.": "Nenhum cluster qualificado encontrado nessa assinatura.", + "{{count}} eligible cluster(s) found._one": "{{count}} cluster(s) qualificado(s) encontrado(s).", + "{{count}} eligible cluster(s) found._many": "", + "{{count}} eligible cluster(s) found._other": "{{count}} cluster(s) qualificado(s) encontrado(s).", + "Cluster is currently updating. Deployment may fail.": "O\u00a0cluster está sendo atualizado. A implantação pode falhar.", + "Cluster is being deleted. Cannot deploy to this cluster.": "O cluster está sendo excluído. Não\u00a0é possível implantar neste cluster.", + "Cluster is still being created. Please wait until creation completes.": "O cluster ainda está sendo criado. Aguarde até que\u00a0a criação seja concluída.", + "Cluster is in a failed state. Please check Azure portal.": "O cluster está\u00a0em estado de falha. Verifique o portal do Azure.", + "Cluster is stopped. Please start the cluster before deploying.": "O cluster está parado. Inicie\u00a0o cluster antes de implantar.", + "Cluster is deallocated. Please start the cluster before deploying.": "O cluster está desalocado. Inicie\u00a0o cluster antes de implantar.", + "Status": "Status", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_many": "", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Iniciando a criação do projeto", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "A criação do projeto atingiu o tempo limite após dez minutos. Verifique se o namespace foi criado e tente novamente.", "Initiating managed namespace creation": "Iniciando a\u00a0criação do namespace gerenciado", @@ -189,7 +224,6 @@ "Namespace Name": "Nome do namespace", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Deve conter apenas letras minúsculas, números e hifens, começando e terminando com um caractere alfanumérico", "The namespace will be created on the selected cluster and set up as a project": "O namespace será criado no cluster selecionado e configurado como um projeto", - "Type": "Tipo", "Regular Kubernetes namespace": "Namespace regular do Kubernetes", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Um novo namespace será criado no cluster com rótulos de projeto aplicados. Ele aparecerá na lista de projetos imediatamente.", "Create New Namespace": "Criar Novo Namespace", @@ -236,7 +270,6 @@ "Source": "Origem", "Replicas": "Réplicas", "Ready": "Pronto", - "Status": "Status", "Actions": "Ações", "Edit deployment": "Editar a implantação", "View workflow run": "Exibir execução de fluxo de trabalho", @@ -249,7 +282,6 @@ "Sign in": "Entrar", "GitHub authentication required to trigger deployment.": "Autenticação do GitHub necessária para disparar a implantação.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "Expedição de fluxo de trabalho disparada com sucesso. Verifique o GitHub Actions para acompanhar o progresso.", - "Close": "Fechar", "Triggering...": "Desencadeando...", "Deploy": "Implantar", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Habilite os Pipelines do GitHub em Configurações → Versão Prévia dos Recursos para usar implantações via pipeline.", @@ -489,7 +521,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Erro desconhecido", "Initializing...": "Inicializando...", "Checking repository readiness...": "Verificando a preparação do repositório...", "Loading configuration...": "Carregando configuração...", @@ -615,7 +646,10 @@ "Import Selected Projects": "Importar\u00a0projetos selecionados", "Failed to fetch managed namespaces": "Falha ao buscar namespaces gerenciados", "Failed to fetch managed namespace details": "Falha\u00a0ao buscar detalhes do namespace gerenciado", - "Failed to update managed namespace": "Falha\u00a0ao atualizar namespace gerenciado", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Atualizando", "Update": "Atualizar", "AKS desktop logo": "Logotipo da área de trabalho do AKS", @@ -660,6 +694,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Habilite ou desabilite recursos que ainda estão em desenvolvimento. Os recursos de visualização podem ser alterados ou removidos em versões futuras.", "GitHub Pipelines": "Pipelines do GitHub", "Enable GitHub-based deployment pipelines for AKS projects.": "Habilite pipelines de implantação baseados no GitHub para projetos do AKS.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Carregando métricas de\u00a0escala do Prometheus", "Scaling Chart Unavailable": "Gráfico de Dimensionamento Indisponível", "No scaling data available": "Nenhum dado de escala disponível", @@ -704,6 +742,7 @@ "Allow traffic within same namespace": "Permitir tráfego dentro do mesmo namespace", "Allow all traffic": "Permitir todo\u00a0o tráfego", "Deny all traffic": "Negar todo\u00a0o tráfego", + "An error occurred in this view.": "", "No cluster is associated with this project.": "Nenhum cluster está associado a este projeto.", "Please sign in to Azure to continue.": "Entre no Azure para continuar.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Contexto do Azure necessário ausente. Verifique se você está conectado e se o cluster está associado a uma assinatura, um grupo de recursos e um locatário válidos.", @@ -713,8 +752,5 @@ "{{minutes}} min ago": "há {{minutes}} min", "{{hours}}h ago": "Há {{hours}} hora(s)", "{{days}}d ago": "{{days}} dia(s) atrás", - "{{weeks}}w ago": "Há {{weeks}} semanas", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "Há {{weeks}} semanas" } diff --git a/plugins/aks-desktop/locales/pt-PT/translation.json b/plugins/aks-desktop/locales/pt-PT/translation.json index ed86808b3..84f58b2f4 100644 --- a/plugins/aks-desktop/locales/pt-PT/translation.json +++ b/plugins/aks-desktop/locales/pt-PT/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Atualizar", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Tipo", + "Role": "Função", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Falha ao carregar subscrições", "Failed to load AKS clusters": "Falha ao carregar clusters AKS", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Cluster “{{cluster}}” intercalado com sucesso no kubeconfig", "Failed to register cluster: {{message}}": "Falha ao registar o cluster: {{message}}", "Register AKS Cluster": "Registar Cluster do AKS", "Checking authentication status": "A verificar o estado da autenticação", "You need to be logged in to Azure to register AKS clusters.": "Tem de ter sessão iniciada no Azure para registar clusters AKS.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Subscrição", "Select an Azure subscription": "Selecionar uma subscrição do Azure", "Loading subscriptions": "A carregar subscrições", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "Não foram encontrados clusters do AKS nesta subscrição.", "AKS Cluster": "Cluster do AKS", "Select an AKS cluster": "Parar um cluster do AKS", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Detalhes do Cluster Selecionado", "Name": "Nome", "Resource Group": "Grupo de Recursos", "Location": "Localização", "Kubernetes Version": "Versão do Kubernetes", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Concluído", "Cancel": "Cancelar", "Registering": "A registar", "Register Cluster": "Registar Cluster", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Erro desconhecido", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Fechar", + "Open in Azure portal": "", + "Retry": "Tentar novamente", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "A iniciar sessão no Azure", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Conclua a autenticação no seu browser. Esta janela será automaticamente redirecionada assim que o início de sessão estiver concluído.", "Login successful! Redirecting": "Início de sessão bem-sucedido! A redirecionar", @@ -50,23 +84,10 @@ "Assignee": "Detentor", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Função", "Remove assignee": "Remover detentor", "Add assignee": "Adicionar detentor", - "Only clusters with Azure Entra ID authentication are shown.": "Apenas são mostrados clusters com autenticação Azure Entra ID.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} cluster(es) oculto(s) - sem Azure Entra ID", - "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} cluster(es) oculto(s) - sem Azure Entra ID", - "No eligible clusters found in this subscription.": "Não foram encontrados clusters elegíveis nesta subscrição.", - "{{count}} eligible cluster(s) found._one": "{{count}} cluster(es) elegível(eis) encontrado(s).", - "{{count}} eligible cluster(s) found._many": "", - "{{count}} eligible cluster(s) found._other": "{{count}} cluster(es) elegível(eis) encontrado(s).", - "Cluster is currently updating. Deployment may fail.": "O cluster está atualmente a atualizar. A implementação pode falhar.", - "Cluster is being deleted. Cannot deploy to this cluster.": "O cluster está a ser eliminado. Não é possível implementar neste cluster.", - "Cluster is still being created. Please wait until creation completes.": "O cluster ainda está a ser criado. Aguarde até que a criação seja concluída.", - "Cluster is in a failed state. Please check Azure portal.": "O cluster está num estado com falhas. Verifique o portal Azure.", - "Cluster is stopped. Please start the cluster before deploying.": "O cluster está parado. Inicie o cluster antes de implementar.", - "Cluster is deallocated. Please start the cluster before deploying.": "O cluster foi desalocado. Inicie o cluster antes de fazer a implementação.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "O cluster selecionado está em falta no kubeconfig. Registe-o antes de continuar.", + "Registering cluster": "A registar cluster", "AKS Preview Extension Required": "Extensão da CLI de Pré-visualização do AKS", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "A extensão aks-preview é necessária para criar espaços de nomes geridos. Instale-a para continuar.", "Installing": "A instalar", @@ -87,7 +108,6 @@ "Select a subscription": "Selecionar uma subscrição", "Search subscriptions": "Procurar subscrições", "No subscriptions found": "Nenhuma subscrição encontrada", - "Retry": "Tentar novamente", "Cluster": "Cluster", "Please select a subscription first": "Selecione uma subscrição primeiro", "Loading clusters": "A carregar clusters", @@ -96,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Não foram encontrados clusters com autenticação Azure Entra ID para esta subscrição.", "Cluster Not Ready": "Cluster Não Preparado", "Refreshing": "A atualizar", - "Refresh": "Atualizar", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "O cluster selecionado está em falta no kubeconfig. Registe-o antes de continuar.", - "Registering cluster": "A registar cluster", "Wizard steps": "Passos do assistente", "Azure Monitor Metrics (Managed Prometheus)": "Métricas do Azure Monitor (Prometheus Gerido)", "KEDA (Event-Driven Autoscaling)": "KEDA (Event-Driven Autoscaling)", @@ -159,6 +176,24 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Apenas são mostrados clusters com autenticação Azure Entra ID.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} cluster(es) oculto(s) - sem Azure Entra ID", + "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} cluster(es) oculto(s) - sem Azure Entra ID", + "No eligible clusters found in this subscription.": "Não foram encontrados clusters elegíveis nesta subscrição.", + "{{count}} eligible cluster(s) found._one": "{{count}} cluster(es) elegível(eis) encontrado(s).", + "{{count}} eligible cluster(s) found._many": "", + "{{count}} eligible cluster(s) found._other": "{{count}} cluster(es) elegível(eis) encontrado(s).", + "Cluster is currently updating. Deployment may fail.": "O cluster está atualmente a atualizar. A implementação pode falhar.", + "Cluster is being deleted. Cannot deploy to this cluster.": "O cluster está a ser eliminado. Não é possível implementar neste cluster.", + "Cluster is still being created. Please wait until creation completes.": "O cluster ainda está a ser criado. Aguarde até que a criação seja concluída.", + "Cluster is in a failed state. Please check Azure portal.": "O cluster está num estado com falhas. Verifique o portal Azure.", + "Cluster is stopped. Please start the cluster before deploying.": "O cluster está parado. Inicie o cluster antes de implementar.", + "Cluster is deallocated. Please start the cluster before deploying.": "O cluster foi desalocado. Inicie o cluster antes de fazer a implementação.", + "Status": "Estado", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_many": "", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "A iniciar a criação do projeto", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "A criação do projeto excedeu o tempo limite após 10 minutos. Verifique se o espaço de nomes foi criado e tente novamente.", "Initiating managed namespace creation": "A iniciar a criação do espaço de nomes gerido", @@ -189,7 +224,6 @@ "Namespace Name": "Nome do Espaço de Nomes", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Tem de conter apenas letras minúsculas, números e hífenes, a começar e terminar num caráter alfanumérico", "The namespace will be created on the selected cluster and set up as a project": "O espaço de nomes será criado no cluster selecionado e configurado como projeto", - "Type": "Tipo", "Regular Kubernetes namespace": "Espaço de nomes do Kubernetes normal", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Será criado um novo espaço de nomes no cluster com etiquetas de projeto aplicadas. Aparecerá na sua lista de projetos imediatamente.", "Create New Namespace": "Criar Novo Espaço de Nomes", @@ -236,7 +270,6 @@ "Source": "Origem", "Replicas": "Réplicas", "Ready": "Preparada", - "Status": "Estado", "Actions": "Ações", "Edit deployment": "Editar implementação", "View workflow run": "Ver execução do fluxo de trabalho", @@ -249,7 +282,6 @@ "Sign in": "Iniciar sessão", "GitHub authentication required to trigger deployment.": "É necessária autenticação do GitHub para acionar a implementação.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "O acionamento do fluxo de trabalho foi efetuado com êxito. Consulte o GitHub Actions para monitorizar o progresso.", - "Close": "Fechar", "Triggering...": "A acionar...", "Deploy": "Implementar", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Ative Pipelines do GitHub em Definições → Funcionalidades de Pré-Visualização para utilizar implementações por pipeline.", @@ -489,7 +521,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Erro desconhecido", "Initializing...": "A inicializar...", "Checking repository readiness...": "A verificar a preparação do repositório...", "Loading configuration...": "A carregar a configuração...", @@ -615,7 +646,10 @@ "Import Selected Projects": "Importar Projetos Selecionados", "Failed to fetch managed namespaces": "Não foi possível obter os espaços de nomes geridos", "Failed to fetch managed namespace details": "Falha ao obter os detalhes do espaço de nomes gerido", - "Failed to update managed namespace": "Falha ao atualizar o espaço de nomes gerido", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "A atualizar", "Update": "Atualizar", "AKS desktop logo": "logótipo do AKS desktop", @@ -660,6 +694,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Ative ou desative funcionalidades que ainda estão em desenvolvimento. As funcionalidades de pré-visualização podem mudar ou ser removidas em versões futuras.", "GitHub Pipelines": "Pipelines do GitHub", "Enable GitHub-based deployment pipelines for AKS projects.": "Ative pipelines de implementação baseados no GitHub para projetos do AKS.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "A carregar métricas de dimensionamento a partir do Prometheus", "Scaling Chart Unavailable": "Gráfico de Dimensionamento Indisponível", "No scaling data available": "Não existem dados de dimensionamento disponíveis", @@ -704,6 +742,7 @@ "Allow traffic within same namespace": "Permitir tráfego no mesmo espaço de nomes", "Allow all traffic": "Permitir todo o tráfego", "Deny all traffic": "Negar todo o tráfego", + "An error occurred in this view.": "", "No cluster is associated with this project.": "Não existe nenhum cluster associado a este projeto.", "Please sign in to Azure to continue.": "Inicie sessão no Azure para continuar.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Contexto necessário do Azure em falta. Certifique-se de que tem sessão iniciada e de que o cluster está associado a uma subscrição, grupo de recursos e inquilino válidos.", @@ -713,8 +752,5 @@ "{{minutes}} min ago": "Há {{minutes}} min", "{{hours}}h ago": "Há {{hours}}\u00a0h", "{{days}}d ago": "Há {{days}} dia(s)", - "{{weeks}}w ago": "Há {{weeks}} semanas", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "Há {{weeks}} semanas" } diff --git a/plugins/aks-desktop/locales/ru/translation.json b/plugins/aks-desktop/locales/ru/translation.json index baabde185..4feb20753 100644 --- a/plugins/aks-desktop/locales/ru/translation.json +++ b/plugins/aks-desktop/locales/ru/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Обновить", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Тип", + "Role": "Роль", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Не удалось загрузить подписки.", "Failed to load AKS clusters": "Не удалось загрузить кластеры AKS", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Кластер \"{{cluster}}\" успешно добавлен в kubeconfig", "Failed to register cluster: {{message}}": "Не удалось зарегистрировать кластер: {{message}}", "Register AKS Cluster": "Зарегистрировать кластер AKS", "Checking authentication status": "Проверяется статус проверки подлинности", "You need to be logged in to Azure to register AKS clusters.": "Для регистрации кластеров AKS вам нужно войти в Azure.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Подписка", "Select an Azure subscription": "Выберите подписку Azure", "Loading subscriptions": "Загружаются подписки", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "В этой подписке не найдены кластеры AKS.", "AKS Cluster": "Кластер AKS", "Select an AKS cluster": "Выберите кластер AKS", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Сведения о выбранном кластере", "Name": "Имя", "Resource Group": "Группа ресурсов", "Location": "Расположение", "Kubernetes Version": "Версия Kubernetes", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Готово", "Cancel": "Отмена", "Registering": "Выполняется регистрация", "Register Cluster": "Регистрация кластера", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Неизвестная ошибка", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Закрыть", + "Open in Azure portal": "", + "Retry": "Повторить", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Инициируется вход в Azure", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Завершите проверку подлинности в браузере. Это окно будет автоматически перенаправлено после входа.", "Login successful! Redirecting": "Вход успешно выполнен! Выполняется перенаправление", @@ -50,25 +84,10 @@ "Assignee": "Уполномоченный", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Роль", "Remove assignee": "Удалить назначенного пользователя", "Add assignee": "Добавить назначенного пользователя", - "Only clusters with Azure Entra ID authentication are shown.": "Показаны только кластеры с аутентификацией Azure Entra ID.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} кластер скрыт\u00a0— отсутствует Azure Entra ID", - "{{count}} cluster(s) hidden — no Azure Entra ID_few": "", - "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} кластеров скрыто\u00a0— отсутствует Azure Entra ID", - "No eligible clusters found in this subscription.": "В этой подписке не найдено подходящих кластеров.", - "{{count}} eligible cluster(s) found._one": "Найден {{count}} подходящий кластер.", - "{{count}} eligible cluster(s) found._few": "", - "{{count}} eligible cluster(s) found._many": "", - "{{count}} eligible cluster(s) found._other": "Найдено {{count}} подходящих кластеров.", - "Cluster is currently updating. Deployment may fail.": "Кластер сейчас обновляется. Развертывание может завершиться сбоем.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Выполняется удаление данного кластера. Развертывание в нем невозможно.", - "Cluster is still being created. Please wait until creation completes.": "Кластер всё еще создается. Дождитесь завершения создания.", - "Cluster is in a failed state. Please check Azure portal.": "Кластер находится в состоянии сбоя. Проверьте портал Azure.", - "Cluster is stopped. Please start the cluster before deploying.": "Кластер остановлен. Перед развертыванием запустите кластер.", - "Cluster is deallocated. Please start the cluster before deploying.": "Ресурсы кластера освобождены. Перед развертыванием запустите кластер.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Выбранный кластер отсутствует в kubeconfig. Зарегистрируйте его, прежде чем продолжить работу.", + "Registering cluster": "Выполняется регистрация кластера", "AKS Preview Extension Required": "Требуется расширение предварительного просмотра AKS", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "Для создания управляемых пространств имен требуется расширение aks-preview. Установите его, чтобы продолжить.", "Installing": "Идет установка.", @@ -89,7 +108,6 @@ "Select a subscription": "Выберите подписку", "Search subscriptions": "Поиск подписок", "No subscriptions found": "Подписки не найдены", - "Retry": "Повторить", "Cluster": "Кластер", "Please select a subscription first": "Сначала выберите подписку", "Loading clusters": "Загружаются кластеры", @@ -98,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Для этой подписки не найдены кластеры с аутентификацией Azure Entra ID", "Cluster Not Ready": "Кластер не готов", "Refreshing": "Идет обновление", - "Refresh": "Обновить", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Выбранный кластер отсутствует в kubeconfig. Зарегистрируйте его, прежде чем продолжить работу.", - "Registering cluster": "Выполняется регистрация кластера", "Wizard steps": "Шаги мастера", "Azure Monitor Metrics (Managed Prometheus)": "Метрики Azure Monitor (управляемый Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (автомасштабирование на основе событий)", @@ -162,6 +177,27 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Показаны только кластеры с аутентификацией Azure Entra ID.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} кластер скрыт\u00a0— отсутствует Azure Entra ID", + "{{count}} cluster(s) hidden — no Azure Entra ID_few": "", + "{{count}} cluster(s) hidden — no Azure Entra ID_many": "", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} кластеров скрыто\u00a0— отсутствует Azure Entra ID", + "No eligible clusters found in this subscription.": "В этой подписке не найдено подходящих кластеров.", + "{{count}} eligible cluster(s) found._one": "Найден {{count}} подходящий кластер.", + "{{count}} eligible cluster(s) found._few": "", + "{{count}} eligible cluster(s) found._many": "", + "{{count}} eligible cluster(s) found._other": "Найдено {{count}} подходящих кластеров.", + "Cluster is currently updating. Deployment may fail.": "Кластер сейчас обновляется. Развертывание может завершиться сбоем.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Выполняется удаление данного кластера. Развертывание в нем невозможно.", + "Cluster is still being created. Please wait until creation completes.": "Кластер всё еще создается. Дождитесь завершения создания.", + "Cluster is in a failed state. Please check Azure portal.": "Кластер находится в состоянии сбоя. Проверьте портал Azure.", + "Cluster is stopped. Please start the cluster before deploying.": "Кластер остановлен. Перед развертыванием запустите кластер.", + "Cluster is deallocated. Please start the cluster before deploying.": "Ресурсы кластера освобождены. Перед развертыванием запустите кластер.", + "Status": "Состояние", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_few": "", + "{{count}} nodes_many": "", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Начинается создание проекта", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "Время ожидания создания проекта истекло через 10 минут. Проверьте, создано ли пространство имен, и попробуйте еще раз.", "Initiating managed namespace creation": "Инициируется создание управляемого пространства имен", @@ -192,7 +228,6 @@ "Namespace Name": "Имя пространства имен", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Должно содержать только строчные буквы, цифры и дефисы, при этом начинаться и заканчиваться буквенно-цифровым символом", "The namespace will be created on the selected cluster and set up as a project": "Пространство имен будет создано в выбранном кластере и настроено в качестве проекта", - "Type": "Тип", "Regular Kubernetes namespace": "Обычное пространство имен Kubernetes", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "В кластере будет создано новое пространство имен с примененными метками проектов. Оно сразу появится в вашем списке проектов.", "Create New Namespace": "Создать пространство имен", @@ -239,7 +274,6 @@ "Source": "Источник", "Replicas": "Реплики", "Ready": "Готово", - "Status": "Состояние", "Actions": "Действия", "Edit deployment": "Изменить развертывание", "View workflow run": "Просмотреть выполнение рабочего процесса", @@ -252,7 +286,6 @@ "Sign in": "Вход", "GitHub authentication required to trigger deployment.": "Чтобы активировать развертывание, требуется проверка подлинности GitHub.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "Подготовка к отправке рабочего процесса активирована. Проверьте ход выполнения в GitHub Actions.", - "Close": "Закрыть", "Triggering...": "Активация...", "Deploy": "Развернуть", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Включите конвейеры GitHub в разделе \"Параметры\" → \"Предварительные версии функций\", чтобы использовать развертывания конвейеров.", @@ -495,7 +528,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Неизвестная ошибка", "Initializing...": "Выполняется инициализация…", "Checking repository readiness...": "Проверка готовности репозитория...", "Loading configuration...": "Загрузка конфигурации...", @@ -627,7 +659,10 @@ "Import Selected Projects": "Импортировать выбранные проекты", "Failed to fetch managed namespaces": "Не удалось получить управляемые пространства имен", "Failed to fetch managed namespace details": "Не удалось получить сведения об управляемом пространстве имен", - "Failed to update managed namespace": "Не удалось изменить управляемое пространство имен", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Обновление", "Update": "Обновить", "AKS desktop logo": "Логотип классической версии AKS", @@ -672,6 +707,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Включайте или отключайте функции, которые еще находятся в разработке. Предварительные версии функций могут изменяться или удаляться в будущих выпусках.", "GitHub Pipelines": "Конвейеры GitHub", "Enable GitHub-based deployment pipelines for AKS projects.": "Включите конвейеры развертывания на основе GitHub для проектов AKS.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Загружаются метрики масштабирования из Prometheus", "Scaling Chart Unavailable": "Диаграмма масштабирования недоступна", "No scaling data available": "Данные о масштабировании отсутствуют", @@ -716,6 +755,7 @@ "Allow traffic within same namespace": "Разрешить трафик в пределах одного пространства имен", "Allow all traffic": "Разрешить весь трафик", "Deny all traffic": "Запретить весь трафик", + "An error occurred in this view.": "", "No cluster is associated with this project.": "С этим проектом не связан ни один кластер.", "Please sign in to Azure to continue.": "Чтобы продолжить, войдите в Azure.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Отсутствует необходимый контекст Azure. Убедитесь, что вы вошли в систему и кластер связан с действующей подпиской, группой ресурсов и клиентом.", @@ -725,8 +765,5 @@ "{{minutes}} min ago": "{{minutes}} мин. назад", "{{hours}}h ago": "{{hours}} ч назад", "{{days}}d ago": "{{days}}\u00a0дн. назад", - "{{weeks}}w ago": "{{weeks}} нед. назад", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "{{weeks}} нед. назад" } diff --git a/plugins/aks-desktop/locales/sv/translation.json b/plugins/aks-desktop/locales/sv/translation.json index 66c1c2ab6..11b8b1aea 100644 --- a/plugins/aks-desktop/locales/sv/translation.json +++ b/plugins/aks-desktop/locales/sv/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Uppdatera", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Typ", + "Role": "Roll", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Det gick inte att läsa in prenumerationer", "Failed to load AKS clusters": "Det gick inte att läsa in AKS-kluster", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "Klustret {{cluster}} har sammanslagits i kubeconfig", "Failed to register cluster: {{message}}": "Det gick inte att registrera klustret: {{message}}", "Register AKS Cluster": "Registrera AKS-kluster", "Checking authentication status": "Kontrollerar autentiseringsstatus", "You need to be logged in to Azure to register AKS clusters.": "Du måste vara inloggad i Azure för att registrera AKS-kluster.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Prenumeration", "Select an Azure subscription": "Välj en Azure-prenumeration", "Loading subscriptions": "Läser in prenumerationer", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "Inga AKS-kluster hittades i den här prenumerationen.", "AKS Cluster": "AKS-kluster", "Select an AKS cluster": "Välj ett AKS-kluster", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Information om valt kluster", "Name": "Namn", "Resource Group": "Resursgrupp", "Location": "Plats", "Kubernetes Version": "Kubernetes-version", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Klart", "Cancel": "Avbryt", "Registering": "Registrering", "Register Cluster": "Registrera kluster", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Okänt fel", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Stäng", + "Open in Azure portal": "", + "Retry": "Försök igen", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Initierar Azure-inloggning", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Slutför autentiseringen i webbläsaren. Det här fönstret omdirigeras automatiskt när inloggningen är klar.", "Login successful! Redirecting": "Inloggningen lyckades! Omdirigering", @@ -50,21 +84,10 @@ "Assignee": "Tilldelad person", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Roll", "Remove assignee": "Ta bort tilldelad person", "Add assignee": "Lägg till tilldelad person", - "Only clusters with Azure Entra ID authentication are shown.": "Endast kluster med Azure Entra ID-autentisering visas.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} kluster är dolda – inga Azure Entra ID", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} kluster är dolda – inga Azure Entra ID", - "No eligible clusters found in this subscription.": "Inga behöriga kluster hittades i den här prenumerationen.", - "{{count}} eligible cluster(s) found._one": "{{count}} berättigade kluster hittades.", - "{{count}} eligible cluster(s) found._other": "{{count}} berättigade kluster hittades.", - "Cluster is currently updating. Deployment may fail.": "Klustret uppdateras just nu. Det kanske inte går att distribuera.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Klustret håller på att tas bort. Det går inte att distribuera till det här klustret.", - "Cluster is still being created. Please wait until creation completes.": "Klustret håller fortfarande på att skapas. Vänta tills det är klart.", - "Cluster is in a failed state. Please check Azure portal.": "Klustret är i feltillstånd. Se efter på Azure Portal.", - "Cluster is stopped. Please start the cluster before deploying.": "Klustret har stoppats. Starta klustret innan du distribuerar.", - "Cluster is deallocated. Please start the cluster before deploying.": "Klustret har frigjorts. Starta klustret innan du distribuerar.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Det valda klustret saknas i kubeconfig. Registrera det innan du fortsätter.", + "Registering cluster": "Registrerar kluster", "AKS Preview Extension Required": "AKS Preview-tillägg krävs", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "Tillägget aks-preview krävs för att skapa hanterade namnrymder. Installera det om du vill fortsätta.", "Installing": "Installerar", @@ -85,7 +108,6 @@ "Select a subscription": "Välj en prenumeration", "Search subscriptions": "Sök efter prenumerationer", "No subscriptions found": "Inga prenumerationer hittades", - "Retry": "Försök igen", "Cluster": "Kluster", "Please select a subscription first": "Välj en prenumeration först", "Loading clusters": "Läser in kluster", @@ -94,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Inga kluster med Azure Entra ID-autentisering hittades för den här prenumerationen", "Cluster Not Ready": "Klustret är inte klart", "Refreshing": "Uppdaterar", - "Refresh": "Uppdatera", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Det valda klustret saknas i kubeconfig. Registrera det innan du fortsätter.", - "Registering cluster": "Registrerar kluster", "Wizard steps": "Guidesteg", "Azure Monitor Metrics (Managed Prometheus)": "Azure Monitor-mått (hanterad Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (händelsestyrd automatisk skalning)", @@ -156,6 +175,21 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Endast kluster med Azure Entra ID-autentisering visas.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} kluster är dolda – inga Azure Entra ID", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} kluster är dolda – inga Azure Entra ID", + "No eligible clusters found in this subscription.": "Inga behöriga kluster hittades i den här prenumerationen.", + "{{count}} eligible cluster(s) found._one": "{{count}} berättigade kluster hittades.", + "{{count}} eligible cluster(s) found._other": "{{count}} berättigade kluster hittades.", + "Cluster is currently updating. Deployment may fail.": "Klustret uppdateras just nu. Det kanske inte går att distribuera.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Klustret håller på att tas bort. Det går inte att distribuera till det här klustret.", + "Cluster is still being created. Please wait until creation completes.": "Klustret håller fortfarande på att skapas. Vänta tills det är klart.", + "Cluster is in a failed state. Please check Azure portal.": "Klustret är i feltillstånd. Se efter på Azure Portal.", + "Cluster is stopped. Please start the cluster before deploying.": "Klustret har stoppats. Starta klustret innan du distribuerar.", + "Cluster is deallocated. Please start the cluster before deploying.": "Klustret har frigjorts. Starta klustret innan du distribuerar.", + "Status": "Status", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Börjar skapa projekt", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "Tidsgränsen för att skapa projekt nåddes efter 10 minuter. Kontrollera om namnrymden har skapats och försök igen.", "Initiating managed namespace creation": "Initierar skapande av hanterad namnrymd", @@ -186,7 +220,6 @@ "Namespace Name": "Namn på namnområde", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Får bara innehålla gemener, siffror och bindestreck, som börjar och slutar med ett alfanumeriskt tecken", "The namespace will be created on the selected cluster and set up as a project": "Namnområdet skapas i det valda klustret och konfigureras som ett projekt", - "Type": "Typ", "Regular Kubernetes namespace": "Vanligt Kubernetes-namnområde", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Ett nytt namnområde skapas i klustret med projektetiketter tillämpade. Den visas direkt i projektlistan.", "Create New Namespace": "Skapa nytt namnområde", @@ -233,7 +266,6 @@ "Source": "Källa", "Replicas": "Repliker", "Ready": "Klart", - "Status": "Status", "Actions": "Åtgärder", "Edit deployment": "Redigera distribution", "View workflow run": "Visa arbetsflödeskörning", @@ -246,7 +278,6 @@ "Sign in": "Logga in", "GitHub authentication required to trigger deployment.": "GitHub-autentisering krävs för att utlösa distribution.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "Arbetsflöde har utlösts. Se förloppet i GitHub Actions.", - "Close": "Stäng", "Triggering...": "Utlöser...", "Deploy": "Distribuera", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "Aktivera GitHub-pipeliner i Inställningar → Förhandsgranskningsfunktioner för att använda pipeline-distributioner.", @@ -483,7 +514,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Okänt fel", "Initializing...": "Initierar...", "Checking repository readiness...": "Kontrollerar lagringsplatsens beredskap...", "Loading configuration...": "Läser in konfiguration...", @@ -603,7 +633,10 @@ "Import Selected Projects": "Importera valda projekt", "Failed to fetch managed namespaces": "Det gick inte att hämta hantera namnrymder", "Failed to fetch managed namespace details": "Det gick inte att hämta information om hanterad namnrymd", - "Failed to update managed namespace": "Det gick inte att uppdatera hanterad namnrymd", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Uppdaterar", "Update": "Uppdatera", "AKS desktop logo": "AKS Desktop-logotyp", @@ -648,6 +681,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Aktivera eller inaktivera funktioner som fortfarande är under utveckling. Förhandsgranskningsfunktioner kan ändras eller tas bort i framtida versioner.", "GitHub Pipelines": "GitHub-pipeliner", "Enable GitHub-based deployment pipelines for AKS projects.": "Aktivera GitHub-baserade distributionspipelines för AKS-projekt.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Läser in skalningsmått från Prometheus", "Scaling Chart Unavailable": "Skalningsdiagram är inte tillgängligt", "No scaling data available": "Inga skalningsdata är tillgängliga", @@ -692,6 +729,7 @@ "Allow traffic within same namespace": "Tillåt trafik inom samma namnområde", "Allow all traffic": "Tillåt all trafik", "Deny all traffic": "Neka all trafik", + "An error occurred in this view.": "", "No cluster is associated with this project.": "Inget kluster är kopplat till det här projektet.", "Please sign in to Azure to continue.": "Logga in på Azure för att fortsätta.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Saknar nödvändigt Azure-sammanhang. Kontrollera att du är inloggad och att klustret är kopplat till en giltig prenumeration, resursgrupp och klientorganisation.", @@ -701,8 +739,5 @@ "{{minutes}} min ago": "{{minutes}} min sedan", "{{hours}}h ago": "{{hours}}tim sedan", "{{days}}d ago": "{{days}} d sedan", - "{{weeks}}w ago": "{{weeks}} v sedan", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "{{weeks}} v sedan" } diff --git a/plugins/aks-desktop/locales/tr/translation.json b/plugins/aks-desktop/locales/tr/translation.json index 7a14818d3..aabcede67 100644 --- a/plugins/aks-desktop/locales/tr/translation.json +++ b/plugins/aks-desktop/locales/tr/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "Yenile", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "Tür", + "Role": "Rol", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "Abonelikler yüklenemedi", "Failed to load AKS clusters": "AKS kümeleri yüklenemedi", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "'{{cluster}}' kümesi kubeconfig dosyasına başarıyla eklendi", "Failed to register cluster: {{message}}": "Küme kaydedilemedi: {{message}}", "Register AKS Cluster": "AKS Kümesini Kaydet", "Checking authentication status": "Kimlik doğrulama durumu denetleniyor", "You need to be logged in to Azure to register AKS clusters.": "AKS kümelerini kaydetmek için Azure hesabınızda oturum açmanız gerekir.", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "Abonelik", "Select an Azure subscription": "Bir Azure aboneliği seçin", "Loading subscriptions": "Abonelikler yükleniyor", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "Bu abonelikte AKS kümesi bulunamadı.", "AKS Cluster": "AKS Kümesi", "Select an AKS cluster": "AKS kümesi seçin", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "Seçili Küme Ayrıntıları", "Name": "Ad", "Resource Group": "Kaynak Grubu", "Location": "Konum", "Kubernetes Version": "Kubernetes Sürümü", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "Bitti", "Cancel": "İptal", "Registering": "Kaydediliyor", "Register Cluster": "Kümeyi Kaydet", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "Bilinmeyen hata", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "Kapat", + "Open in Azure portal": "", + "Retry": "Yeniden dene", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "Azure oturumu açma başlatılıyor", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "Lütfen kimlik doğrulamasını tarayıcınızda tamamlayın. Oturum açma tamamlandığında bu pencere otomatik olarak yeniden yönlendirilir.", "Login successful! Redirecting": "Oturum açıldı! Yeniden yönlendiriyor", @@ -50,21 +84,10 @@ "Assignee": "Atanan", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "Rol", "Remove assignee": "Atananı kaldır", "Add assignee": "Atanan ekle", - "Only clusters with Azure Entra ID authentication are shown.": "Yalnızca Azure Entra ID kimlik doğrulamasına sahip kümeler gösterilir.", - "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} küme gizlendi — Azure Entra ID yok", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} küme gizlendi — Azure Entra ID yok", - "No eligible clusters found in this subscription.": "Bu abonelikte uygun küme bulunamadı.", - "{{count}} eligible cluster(s) found._one": "{{count}} uygun küme bulundu.", - "{{count}} eligible cluster(s) found._other": "{{count}} uygun küme bulundu.", - "Cluster is currently updating. Deployment may fail.": "Küme şu anda güncelleştiriliyor. Dağıtım başarısız olabilir.", - "Cluster is being deleted. Cannot deploy to this cluster.": "Küme siliniyor. Bu kümeye dağıtım yapılamaz.", - "Cluster is still being created. Please wait until creation completes.": "Kümeyi oluşturma işlemi devam ediyor. Lütfen oluşturma tamamlanana kadar bekleyin.", - "Cluster is in a failed state. Please check Azure portal.": "Küme başarısız durumda. Lütfen Azure portalı kontrol edin.", - "Cluster is stopped. Please start the cluster before deploying.": "Küme durduruldu. Dağıtımdan önce lütfen kümeyi başlatın.", - "Cluster is deallocated. Please start the cluster before deploying.": "Küme serbest bırakıldı. Dağıtımdan önce lütfen kümeyi başlatın.", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Seçilen küme kubeconfig dosyasında yok. Devam etmeden önce dosyaya kaydedin.", + "Registering cluster": "Küme kaydediliyor", "AKS Preview Extension Required": "AKS Önizleme Uzantısı Gerekiyor", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "Yönetilen ad alanları oluşturmak için aks-preview uzantısı gereklidir. Devam etmek için lütfen bunu yükleyin.", "Installing": "Yükleniyor", @@ -85,7 +108,6 @@ "Select a subscription": "Abonelik seçin", "Search subscriptions": "Abonelik ara", "No subscriptions found": "Abonelik bulunamadı", - "Retry": "Yeniden dene", "Cluster": "Küme", "Please select a subscription first": "Lütfen önce bir abonelik seçin", "Loading clusters": "Kümeler yükleniyor", @@ -94,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "Bu abonelik için Azure Entra ID kimlik doğrulamasına sahip küme bulunamadı", "Cluster Not Ready": "Küme Hazır Değil", "Refreshing": "Yenileniyor", - "Refresh": "Yenile", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "Seçilen küme kubeconfig dosyasında yok. Devam etmeden önce dosyaya kaydedin.", - "Registering cluster": "Küme kaydediliyor", "Wizard steps": "Sihirbaz adımları", "Azure Monitor Metrics (Managed Prometheus)": "Azure İzleyici Ölçümleri (Yönetilen Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (Olay Tabanlı Otomatik Ölçeklendirme)", @@ -156,6 +175,21 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "Yalnızca Azure Entra ID kimlik doğrulamasına sahip kümeler gösterilir.", + "{{count}} cluster(s) hidden — no Azure Entra ID_one": "{{count}} küme gizlendi — Azure Entra ID yok", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} küme gizlendi — Azure Entra ID yok", + "No eligible clusters found in this subscription.": "Bu abonelikte uygun küme bulunamadı.", + "{{count}} eligible cluster(s) found._one": "{{count}} uygun küme bulundu.", + "{{count}} eligible cluster(s) found._other": "{{count}} uygun küme bulundu.", + "Cluster is currently updating. Deployment may fail.": "Küme şu anda güncelleştiriliyor. Dağıtım başarısız olabilir.", + "Cluster is being deleted. Cannot deploy to this cluster.": "Küme siliniyor. Bu kümeye dağıtım yapılamaz.", + "Cluster is still being created. Please wait until creation completes.": "Kümeyi oluşturma işlemi devam ediyor. Lütfen oluşturma tamamlanana kadar bekleyin.", + "Cluster is in a failed state. Please check Azure portal.": "Küme başarısız durumda. Lütfen Azure portalı kontrol edin.", + "Cluster is stopped. Please start the cluster before deploying.": "Küme durduruldu. Dağıtımdan önce lütfen kümeyi başlatın.", + "Cluster is deallocated. Please start the cluster before deploying.": "Küme serbest bırakıldı. Dağıtımdan önce lütfen kümeyi başlatın.", + "Status": "Durum", + "{{count}} nodes_one": "{{count}} node", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "Proje oluşturma başlatılıyor", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "Proje oluşturma işlemi 10 dakika sonra zaman aşımına uğradı. Lütfen ad alanının oluşturulup oluşturulmadığını kontrol edin ve yeniden deneyin.", "Initiating managed namespace creation": "Yönetilen ad alanı oluşturma işlemi başlatılıyor", @@ -186,7 +220,6 @@ "Namespace Name": "Ad Alanı Adı", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "Yalnızca küçük harf, rakam ve kısa çizgi içermelidir. Başında ve sonunda alfasayısal karakter olmalıdır", "The namespace will be created on the selected cluster and set up as a project": "Ad alanı seçili kümede oluşturulacak ve proje olarak ayarlanacak", - "Type": "Tür", "Regular Kubernetes namespace": "Normal Kubernetes ad alanı", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "Kümede proje etiketleri uygulanmış yeni bir ad alanı oluşturulacak. Proje listenizde hemen görünecek.", "Create New Namespace": "Yeni Ad Alanı Oluştur", @@ -233,7 +266,6 @@ "Source": "Kaynak", "Replicas": "Çoğaltmalar", "Ready": "Hazır", - "Status": "Durum", "Actions": "Eylemler", "Edit deployment": "Dağıtımı düzenle", "View workflow run": "İş akışı çalıştırmasını görüntüle", @@ -246,7 +278,6 @@ "Sign in": "Oturum aç", "GitHub authentication required to trigger deployment.": "Dağıtımı tetiklemek için GitHub kimlik doğrulaması gereklidir.", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "İş akışı gönderme işlemi başarıyla tetiklendi. İlerlemeyi GitHub Actions'ta kontrol edin.", - "Close": "Kapat", "Triggering...": "Tetikleniyor...", "Deploy": "Dağıt", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "İşlem hattı dağıtımlarını kullanmak için Ayarlar → Önizleme Özellikleri bölümünden GitHub İşlem Hatları seçeneğini etkinleştirin.", @@ -483,7 +514,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "Bilinmeyen hata", "Initializing...": "Başlatılıyor...", "Checking repository readiness...": "Depo hazırlık durumu denetleniyor...", "Loading configuration...": "Yapılandırma yükleniyor...", @@ -603,7 +633,10 @@ "Import Selected Projects": "Seçili Projeleri İçeri Aktar", "Failed to fetch managed namespaces": "Yönetilen ad alanları getirilemedi", "Failed to fetch managed namespace details": "Yönetilen ad alanı ayrıntıları getirilemedi", - "Failed to update managed namespace": "Yönetilen ad alanı güncelleştirilemedi", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "Güncelleştiriliyor", "Update": "Güncelleştir", "AKS desktop logo": "AKS masaüstü logosu", @@ -648,6 +681,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "Hala geliştirme aşamasında olan özellikleri etkinleştirin veya devre dışı bırakın. Önizleme özellikleri gelecekteki sürümlerde değişebilir veya kaldırılabilir.", "GitHub Pipelines": "GitHub İşlem Hatları", "Enable GitHub-based deployment pipelines for AKS projects.": "AKS projeleri için GitHub tabanlı dağıtım işlem hatlarını etkinleştirin.", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "Prometheus'dan ölçeklendirme ölçümleri yükleniyor", "Scaling Chart Unavailable": "Ölçeklendirme Grafiği Kullanılamıyor", "No scaling data available": "Kullanılabilir ölçeklendirme verisi yok", @@ -692,6 +729,7 @@ "Allow traffic within same namespace": "Aynı ad alanı içindeki trafiğe izin ver", "Allow all traffic": "Tüm trafiğe izin ver", "Deny all traffic": "Tüm trafiği reddet", + "An error occurred in this view.": "", "No cluster is associated with this project.": "Bu projeyle ilişkili küme yok.", "Please sign in to Azure to continue.": "Devam etmek için lütfen Azure’da oturum açın.", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "Gerekli Azure bağlamı eksik. Lütfen oturum açtığınızdan ve kümenin geçerli bir abonelik, kaynak grubu ve kiracıyla ilişkili olduğundan emin olun.", @@ -701,8 +739,5 @@ "{{minutes}} min ago": "{{minutes}} dakika önce", "{{hours}}h ago": "{{hours}} saat önce", "{{days}}d ago": "{{days}} gün önce", - "{{weeks}}w ago": "{{weeks}} hafta önce", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{weeks}}w ago": "{{weeks}} hafta önce" } diff --git a/plugins/aks-desktop/locales/zh-Hans/translation.json b/plugins/aks-desktop/locales/zh-Hans/translation.json index 0c8a6b51a..2c58609e8 100644 --- a/plugins/aks-desktop/locales/zh-Hans/translation.json +++ b/plugins/aks-desktop/locales/zh-Hans/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "刷新", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "类型", + "Role": "角色", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "无法加载订阅", "Failed to load AKS clusters": "未能加载 AKS 群集", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "群集“{{cluster}}”已成功合并到 kubeconfig 中", "Failed to register cluster: {{message}}": "未能注册群集: {{message}}", "Register AKS Cluster": "注册 AKS 群集", "Checking authentication status": "正在检查身份验证状态", "You need to be logged in to Azure to register AKS clusters.": "你需要登录 Azure 才能注册 AKS 群集。", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "订阅", "Select an Azure subscription": "选择 Azure 订阅", "Loading subscriptions": "正在加载订阅", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "此订阅中未找到任何 AKS 群集。", "AKS Cluster": "AKS 群集", "Select an AKS cluster": "选择 AKS 群集", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "所选群集详细信息", "Name": "名称", "Resource Group": "资源组", "Location": "位置", "Kubernetes Version": "Kubernetes 版本", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "完成", "Cancel": "取消", "Registering": "正在注册", "Register Cluster": "注册群集", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "未知错误", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "关闭", + "Open in Azure portal": "", + "Retry": "重试", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "正在启动 Azure 登录", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "请在浏览器中完成身份验证。登录完成后,此窗口将自动重定向。", "Login successful! Redirecting": "登录成功!正在重定向", @@ -50,19 +84,10 @@ "Assignee": "代理人", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "角色", "Remove assignee": "移除被分派人", "Add assignee": "添加被分配者", - "Only clusters with Azure Entra ID authentication are shown.": "仅显示启用 Azure Entra ID 身份验证的群集。", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} 个群集隐藏 - 无 Azure Entra ID", - "No eligible clusters found in this subscription.": "此订阅中未找到符合条件的群集。", - "{{count}} eligible cluster(s) found._other": "找到 {{count}} 个符合条件的群集。", - "Cluster is currently updating. Deployment may fail.": "群集当前正在更新。部署可能会失败。", - "Cluster is being deleted. Cannot deploy to this cluster.": "正在删除群集。无法部署到此群集。", - "Cluster is still being created. Please wait until creation completes.": "仍在创建群集。请等待创建完成。", - "Cluster is in a failed state. Please check Azure portal.": "群集处于失败状态。请检查 Azure 门户。", - "Cluster is stopped. Please start the cluster before deploying.": "群集已停止。请在部署之前启动群集。", - "Cluster is deallocated. Please start the cluster before deploying.": "群集已解除分配。请在部署之前启动群集。", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "kubeconfig 中缺少所选群集。请先注册,然后继续。", + "Registering cluster": "正在注册群集", "AKS Preview Extension Required": "需要 AKS 预览扩展", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "创建托管命名空间需要 aks-preview 扩展。请先安装以继续。", "Installing": "正在安装", @@ -83,7 +108,6 @@ "Select a subscription": "选择订阅", "Search subscriptions": "搜索订阅", "No subscriptions found": "找不到任何订阅", - "Retry": "重试", "Cluster": "群集", "Please select a subscription first": "请先选择订阅", "Loading clusters": "正在加载群集", @@ -92,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "此订阅中未找到启用 Azure Entra ID 身份验证的群集", "Cluster Not Ready": "群集未就绪", "Refreshing": "正在刷新", - "Refresh": "刷新", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "kubeconfig 中缺少所选群集。请先注册,然后继续。", - "Registering cluster": "正在注册群集", "Wizard steps": "向导步骤", "Azure Monitor Metrics (Managed Prometheus)": "Azure Monitor 指标(托管 Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (事件驱动的自动缩放)", @@ -153,6 +174,18 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "仅显示启用 Azure Entra ID 身份验证的群集。", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "{{count}} 个群集隐藏 - 无 Azure Entra ID", + "No eligible clusters found in this subscription.": "此订阅中未找到符合条件的群集。", + "{{count}} eligible cluster(s) found._other": "找到 {{count}} 个符合条件的群集。", + "Cluster is currently updating. Deployment may fail.": "群集当前正在更新。部署可能会失败。", + "Cluster is being deleted. Cannot deploy to this cluster.": "正在删除群集。无法部署到此群集。", + "Cluster is still being created. Please wait until creation completes.": "仍在创建群集。请等待创建完成。", + "Cluster is in a failed state. Please check Azure portal.": "群集处于失败状态。请检查 Azure 门户。", + "Cluster is stopped. Please start the cluster before deploying.": "群集已停止。请在部署之前启动群集。", + "Cluster is deallocated. Please start the cluster before deploying.": "群集已解除分配。请在部署之前启动群集。", + "Status": "状态", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "正在开始项目创建", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "项目创建操作 10 分钟后超时。请检查命名空间是否已创建,并重试。", "Initiating managed namespace creation": "正在启动托管命名空间创建", @@ -183,7 +216,6 @@ "Namespace Name": "命名空间名称", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "必须仅包含小写字母、数字和连字符,并以字母数字字符开头和结尾", "The namespace will be created on the selected cluster and set up as a project": "命名空间将在所选群集上创建,并设置为项目", - "Type": "类型", "Regular Kubernetes namespace": "常规 Kubernetes 命名空间", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "将在该群集上创建新的命名空间并应用项目标签。它将立即显示在项目列表中。", "Create New Namespace": "创建新命名空间", @@ -230,7 +262,6 @@ "Source": "源", "Replicas": "副本", "Ready": "就绪", - "Status": "状态", "Actions": "操作", "Edit deployment": "编辑部署", "View workflow run": "查看工作流运行", @@ -243,7 +274,6 @@ "Sign in": "登录", "GitHub authentication required to trigger deployment.": "触发部署所需的 GitHub 身份验证。", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "已成功触发工作流调度。检查 GitHub Actions 进度。", - "Close": "关闭", "Triggering...": "正在触发...", "Deploy": "部署", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "在“设置”→“预览功能”中启用 GitHub 管道以使用管道部署。", @@ -477,7 +507,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "未知错误", "Initializing...": "正在初始化...", "Checking repository readiness...": "正在检查存储库就绪情况...", "Loading configuration...": "正在加载配置...", @@ -591,7 +620,10 @@ "Import Selected Projects": "导入所选项目", "Failed to fetch managed namespaces": "未能提取托管命名空间", "Failed to fetch managed namespace details": "未能提取托管命名空间详细信息", - "Failed to update managed namespace": "未能更新托管命名空间", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "正在更新", "Update": "更新", "AKS desktop logo": "AKS 桌面徽标", @@ -636,6 +668,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "启用或禁用仍在开发中的功能。预览功能可能会在将来的版本中发生更改或移除。", "GitHub Pipelines": "GitHub 管道", "Enable GitHub-based deployment pipelines for AKS projects.": "为 AKS 项目启用基于 GitHub 的部署管道。", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "正在从 Prometheus 加载缩放指标", "Scaling Chart Unavailable": "缩放图表不可用", "No scaling data available": "无缩放数据可用", @@ -680,6 +716,7 @@ "Allow traffic within same namespace": "允许同一命名空间中的流量", "Allow all traffic": "允许所有流量", "Deny all traffic": "拒绝所有流量", + "An error occurred in this view.": "", "No cluster is associated with this project.": "没有与此项目关联的群集。", "Please sign in to Azure to continue.": "请登录到 Azure 以继续。", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "缺少所需的 Azure 上下文。请确保已登录,并且群集与有效的订阅、资源组和租户相关联。", @@ -701,7 +738,5 @@ "Resources to be deployed ({{count}} object)_one": "要部署的资源({{count}} 个对象)", "Successfully merged {{count}} cluster(s)_one": "已成功合并 {{count}} 个群集", "with {{count}} project(s)_one": "具有 {{count}} 个项目", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{count}} nodes_one": "{{count}} node" } diff --git a/plugins/aks-desktop/locales/zh-Hant/translation.json b/plugins/aks-desktop/locales/zh-Hant/translation.json index eabab59bd..e452a74fe 100644 --- a/plugins/aks-desktop/locales/zh-Hant/translation.json +++ b/plugins/aks-desktop/locales/zh-Hant/translation.json @@ -1,11 +1,28 @@ { + "Loading role assignments…": "", + "Azure Role Assignments": "", + "Refresh": "重新整理", + "No role assignments found for {{ namespace }} on {{ cluster }}.": "", + "Showing assignments for {{ namespace }} on {{ cluster }}": "", + "Role assignments for {{ namespace }} on {{ cluster }}": "", + "Principal": "", + "Type": "類型", + "Role": "角色", + "Unknown principal": "", + "Failed to load role assignments": "", "Failed to load subscriptions": "無法載入訂用帳戶", "Failed to load AKS clusters": "無法載入 AKS 叢集", + "The Azure CLI \"connectedk8s\" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s": "", + "Failed to connect to the AKS Hybrid & Edge cluster: {{message}}": "", + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}": "", + "Cluster '{{cluster}}' successfully connected": "", "Cluster '{{cluster}}' successfully merged in kubeconfig": "已順利在 kubeconfig 中合併叢集 '{{cluster}}'", "Failed to register cluster: {{message}}": "無法註冊叢集: {{message}}", "Register AKS Cluster": "註冊 AKS 叢集", "Checking authentication status": "正在檢查驗證狀態", "You need to be logged in to Azure to register AKS clusters.": "您必須登入 Azure 以註冊 AKS 叢集。", + "Tenant": "Tenant", + "Select an Azure tenant": "", "Subscription": "訂用帳戶", "Select an Azure subscription": "選取 Azure 訂用帳戶", "Loading subscriptions": "正在載入訂閱", @@ -13,15 +30,32 @@ "No AKS clusters found in this subscription.": "在此訂用帳戶中找不到 AKS 叢集。", "AKS Cluster": "AKS 叢集", "Select an AKS cluster": "選取 AKS 叢集", + "AKS Hybrid & Edge": "", + "Offline": "", "Selected Cluster Details": "已選取的叢集詳細資料", "Name": "名稱", "Resource Group": "資源群組", "Location": "位置", "Kubernetes Version": "Kubernetes 版本", + "AKS Hybrid & Edge (Arc-connected)": "", "Done": "完成", "Cancel": "取消", "Registering": "正在註冊", "Register Cluster": "註冊叢集", + "Checking AKS Hybrid & Edge proxy…": "", + "Stop AKS Hybrid & Edge proxy": "", + "Start AKS Hybrid & Edge proxy": "", + "Missing Azure metadata for this cluster.": "", + "Unknown error": "未知的錯誤", + "Connect AKS Hybrid & Edge cluster": "", + "Starting AKS Hybrid & Edge proxy...": "", + "Verifying cluster connection...": "", + "Connected to \"{{cluster}}\". Reload to view the cluster.": "", + "Close": "關閉", + "Open in Azure portal": "", + "Retry": "重試", + "Reload": "", + "Please wait...": "", "Initiating Azure login": "正在起始 Azure 登入", "Please complete the authentication in your browser. This window will automatically redirect once login is complete.": "請在瀏覽器中完成驗證。登入完成後,此視窗會自動重新導向。", "Login successful! Redirecting": "登入成功!正在重新導向", @@ -50,19 +84,10 @@ "Assignee": "受託人", "Search for a user or remove this entry": "", "Select a user from the search results or enter a valid object ID (UUID)": "", - "Role": "角色", "Remove assignee": "移除受託人", "Add assignee": "新增受託人", - "Only clusters with Azure Entra ID authentication are shown.": "僅顯示具有 Azure Entra ID 驗證的叢集。", - "{{count}} cluster(s) hidden — no Azure Entra ID_other": "已隱藏 {{count}} 個叢集 - 沒有 Azure Entra ID", - "No eligible clusters found in this subscription.": "在此訂用帳戶中找不到合格的叢集。", - "{{count}} eligible cluster(s) found._other": "找到 {{count}} 個合格的叢集。", - "Cluster is currently updating. Deployment may fail.": "正在更新叢集。部署可能會失敗。", - "Cluster is being deleted. Cannot deploy to this cluster.": "正在刪除叢集。無法部署到此叢集。", - "Cluster is still being created. Please wait until creation completes.": "仍在建立叢集。請等待建立完成。", - "Cluster is in a failed state. Please check Azure portal.": "叢集處於失敗狀態。請檢查 Azure 入口網站。", - "Cluster is stopped. Please start the cluster before deploying.": "已停止叢集。部署之前,請先啟動該叢集。", - "Cluster is deallocated. Please start the cluster before deploying.": "叢集已解除配置。部署之前,請先啟動該叢集。", + "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "kubeconfig 遺漏已選取的叢集。在繼續之前請先註冊。", + "Registering cluster": "正在註冊叢集", "AKS Preview Extension Required": "需要 AKS 預覽延伸模組", "The aks-preview extension is required to create managed namespaces. Please install it to continue.": "要求 aks-preview 延伸模組才能建立受控命名空間。請安裝它以繼續。", "Installing": "正在安裝", @@ -83,7 +108,6 @@ "Select a subscription": "選取訂閱", "Search subscriptions": "搜尋訂用帳戶", "No subscriptions found": "找不到訂用帳戶", - "Retry": "重試", "Cluster": "叢集", "Please select a subscription first": "請先選取訂用帳戶", "Loading clusters": "正在載入叢集", @@ -92,9 +116,6 @@ "No clusters with Azure Entra ID authentication found for this subscription": "找不到此訂用帳戶具有 Azure Entra ID 驗證的叢集", "Cluster Not Ready": "叢集未就緒", "Refreshing": "正在重新整理", - "Refresh": "重新整理", - "Selected cluster is missing from the kubeconfig. Register it before proceeding.": "kubeconfig 遺漏已選取的叢集。在繼續之前請先註冊。", - "Registering cluster": "正在註冊叢集", "Wizard steps": "精靈步驟", "Azure Monitor Metrics (Managed Prometheus)": "Azure 監視器計量 (受控 Prometheus)", "KEDA (Event-Driven Autoscaling)": "KEDA (事件驅動自動調整)", @@ -153,6 +174,18 @@ "Type at least 2 characters to search": "", "User search is not available. Enter the Azure AD object ID (UUID) directly. Find it in Azure Portal > Microsoft Entra ID > Users > select user > Object ID.": "", "Object ID": "", + "Only clusters with Azure Entra ID authentication are shown.": "僅顯示具有 Azure Entra ID 驗證的叢集。", + "{{count}} cluster(s) hidden — no Azure Entra ID_other": "已隱藏 {{count}} 個叢集 - 沒有 Azure Entra ID", + "No eligible clusters found in this subscription.": "在此訂用帳戶中找不到合格的叢集。", + "{{count}} eligible cluster(s) found._other": "找到 {{count}} 個合格的叢集。", + "Cluster is currently updating. Deployment may fail.": "正在更新叢集。部署可能會失敗。", + "Cluster is being deleted. Cannot deploy to this cluster.": "正在刪除叢集。無法部署到此叢集。", + "Cluster is still being created. Please wait until creation completes.": "仍在建立叢集。請等待建立完成。", + "Cluster is in a failed state. Please check Azure portal.": "叢集處於失敗狀態。請檢查 Azure 入口網站。", + "Cluster is stopped. Please start the cluster before deploying.": "已停止叢集。部署之前,請先啟動該叢集。", + "Cluster is deallocated. Please start the cluster before deploying.": "叢集已解除配置。部署之前,請先啟動該叢集。", + "Status": "狀態", + "{{count}} nodes_other": "{{count}} nodes", "Starting project creation": "開始建立專案", "Project creation timed out after 10 minutes. Please check if the namespace was created and try again.": "專案建立在 10 分鐘後逾時。請檢查是否已建立命名空間,然後再試一次。", "Initiating managed namespace creation": "正在起始受控命名空間建立", @@ -183,7 +216,6 @@ "Namespace Name": "命名空間名稱", "Must contain only lowercase letters, numbers, and hyphens, starting and ending with an alphanumeric character": "必須只包含小寫字母、數字和連字號,且開頭和結尾必須為英數字元", "The namespace will be created on the selected cluster and set up as a project": "將在選取的叢集上建立命名空間,並設定為專案", - "Type": "類型", "Regular Kubernetes namespace": "一般 Kubernetes 命名空間", "A new namespace will be created on the cluster with project labels applied. It will appear in your project list immediately.": "將在已套用專案標籤的叢集上建立新的命名空間。該命名空間會立即出現在您的專案清單中。", "Create New Namespace": "建立新的命名空間", @@ -230,7 +262,6 @@ "Source": "來源", "Replicas": "複本", "Ready": "就緒", - "Status": "狀態", "Actions": "動作", "Edit deployment": "編輯部署", "View workflow run": "檢視工作流程執行", @@ -243,7 +274,6 @@ "Sign in": "登入", "GitHub authentication required to trigger deployment.": "觸發部署需要 GitHub 驗證。", "Workflow dispatch triggered successfully. Check GitHub Actions for progress.": "工作流程分派已成功觸發。檢查 GitHub Actions 以了解進度。", - "Close": "關閉", "Triggering...": "正在觸發...", "Deploy": "部署", "Enable GitHub Pipelines in Settings → Preview Features to use pipeline deployments.": "在 [設定] → [預覽功能] 中啟用 GitHub 管線,以使用管線部署。", @@ -477,7 +507,6 @@ "AI improvement suggestions in progress": "", "Copilot is analyzing your Dockerfile and manifests. You'll receive a PR with optimization suggestions shortly.": "", "View issue on GitHub": "", - "Unknown error": "未知的錯誤", "Initializing...": "正在初始化...", "Checking repository readiness...": "正在檢查存放庫整備度...", "Loading configuration...": "正在載入設定...", @@ -591,7 +620,10 @@ "Import Selected Projects": "匯入選取的專案", "Failed to fetch managed namespaces": "無法擷取受控命名空間", "Failed to fetch managed namespace details": "無法擷取受控命名空間詳細資料", - "Failed to update managed namespace": "無法更新受控命名空間", + "Updating namespace {{ name }}…": "", + "Cancelled update of namespace {{ name }}.": "", + "Updated namespace {{ name }}.": "", + "Failed to update namespace {{ name }}.": "", "Updating": "正在更新", "Update": "更新", "AKS desktop logo": "AKS Desktop 標誌", @@ -636,6 +668,10 @@ "Enable or disable features that are still in development. Preview features may change or be removed in future releases.": "啟用或停用仍在開發中的功能。預覽功能可能會在未來版本中變更或移除。", "GitHub Pipelines": "GitHub 管線", "Enable GitHub-based deployment pipelines for AKS projects.": "啟用 AKS 專案的 GitHub 型部署管線。", + "Telemetry": "", + "AKS Desktop sends pseudonymous usage data (feature usage, app version, OS, error classes) to help us improve the product. A random pseudonymous installation identifier stored on this device is included so sessions from the same installation can be counted. No cluster names, namespaces, resource names, error messages, or stack traces are ever sent. Telemetry changes take effect on next launch.": "", + "Send pseudonymous usage data": "", + "Restart AKS Desktop for this change to take effect.": "", "Loading scaling metrics from Prometheus": "正在從 Prometheus 載入縮放計量", "Scaling Chart Unavailable": "無法取得縮放圖表", "No scaling data available": "沒有可用的縮放資料", @@ -680,6 +716,7 @@ "Allow traffic within same namespace": "允許相同命名空間內的流量", "Allow all traffic": "允許所有流量", "Deny all traffic": "拒絕所有流量", + "An error occurred in this view.": "", "No cluster is associated with this project.": "沒有與此專案關聯的叢集。", "Please sign in to Azure to continue.": "請登入 Azure 以繼續。", "Missing required Azure context. Please ensure you are logged in and the cluster is associated with a valid subscription, resource group, and tenant.": "遺失必要的 Azure 內容。請確保您已登入,且叢集與有效的訂用帳戶、資源群組和租用戶相關聯。", @@ -701,7 +738,5 @@ "Resources to be deployed ({{count}} object)_one": "要部署的資源 ({{count}} 個物件)", "Successfully merged {{count}} cluster(s)_one": "已成功合併 {{count}} 個叢集", "with {{count}} project(s)_one": "具有 {{count}} 個專案", - "Tenant": "Tenant", - "{{count}} nodes_one": "{{count}} node", - "{{count}} nodes_other": "{{count}} nodes" + "{{count}} nodes_one": "{{count}} node" } diff --git a/plugins/aks-desktop/src/components/AKS/RegisterAKSClusterDialog.tsx b/plugins/aks-desktop/src/components/AKS/RegisterAKSClusterDialog.tsx index cf75c6aa5..4edee87cb 100644 --- a/plugins/aks-desktop/src/components/AKS/RegisterAKSClusterDialog.tsx +++ b/plugins/aks-desktop/src/components/AKS/RegisterAKSClusterDialog.tsx @@ -7,7 +7,18 @@ import { useHistory } from 'react-router-dom'; import { useAzureAuth } from '../../hooks/useAzureAuth'; import type { ClusterCapabilities } from '../../types/ClusterCapabilities'; import { getAKSClusters, getSubscriptions, registerAKSCluster } from '../../utils/azure/aks'; +import { + startProxy, + stopProxy, + verifyAksHybridEdgeCluster, +} from '../../utils/azure/aksHybridEdgeProxy'; import { getClusterCapabilities } from '../../utils/azure/az-clusters'; +import { isExtensionInstalled } from '../../utils/azure/az-extensions'; +import { + getClusterSettings, + markAksHybridEdgeAppearance, + setClusterSettings, +} from '../../utils/shared/clusterSettings'; import type { AKSCluster, Subscription, Tenant } from './RegisterAKSClusterDialogPure'; import RegisterAKSClusterDialogPure from './RegisterAKSClusterDialogPure'; @@ -231,11 +242,127 @@ export default function RegisterAKSClusterDialog({ } }; + /** + * Registers an AKS Hybrid & Edge (Arc-connected) cluster by starting `az connectedk8s + * proxy`, which registers the cluster on the shared local proxy daemon and + * writes its kubeconfig context. Multiple AKS Hybrid & Edge clusters can be connected + * at once (they multiplex on the shared daemon). + */ + const handleAksHybridEdgeRegister = async () => { + if (!selectedCluster || !selectedSubscription) { + return; + } + + setLoading(true); + setError(''); + setSuccess(''); + + const target = { + subscriptionId: selectedSubscription.id, + resourceGroup: selectedCluster.resourceGroup, + clusterName: selectedCluster.name, + }; + + const finish = () => { + if (isMountedRef.current) { + setLoading(false); + } + }; + + try { + // The proxy is driven by the `connectedk8s` Azure CLI extension. + const ext = await isExtensionInstalled('connectedk8s'); + if (!ext.installed) { + // Surface the underlying reason when the check failed for something other + // than a missing extension (e.g. "Authentication required…"), so a + // login/CLI failure isn't masked by the generic install message. + setError( + ext.error || + t( + 'The Azure CLI "connectedk8s" extension is required for AKS Hybrid & Edge clusters. Install it with: az extension add --name connectedk8s' + ) + ); + finish(); + return; + } + + const startResult = await startProxy(target); + + if (!startResult.success) { + setError( + t('Failed to connect to the AKS Hybrid & Edge cluster: {{message}}', { + message: startResult.error || t('Unknown error'), + }) + ); + finish(); + return; + } + + // Confirm the cluster actually answers through the proxy. If it doesn't, + // the cluster is typically stopped or its Azure Arc agents aren't running + // — but surface the underlying proxy/probe error so a genuine failure + // (extension, auth, spawn error) isn't masked as "cluster offline". + const verify = await verifyAksHybridEdgeCluster(selectedCluster.name, { + target: { + subscriptionId: target.subscriptionId, + resourceGroup: target.resourceGroup, + }, + }); + if (!verify.success) { + console.error('[AKS] AKS Hybrid & Edge verify failed:', verify); + await stopProxy(selectedCluster.name); + setError( + t( + "Cluster '{{cluster}}' was added, but it did not become reachable. Details: {{message}}", + { cluster: selectedCluster.name, message: verify.error || t('Unknown error') } + ) + ); + finish(); + return; + } + + // Persist metadata so the cluster is recognised as AKS Hybrid & Edge in the list + // view and by the proxy actions. + const existing = getClusterSettings(selectedCluster.name); + setClusterSettings(selectedCluster.name, { + ...existing, + clusterType: 'aksarc', + subscriptionId: selectedSubscription.id, + resourceGroup: selectedCluster.resourceGroup, + }); + // Give the cluster a distinct name badge (server icon + Azure-blue accent) + // on the Home table, so AKS Hybrid & Edge clusters stand out next to their name. + markAksHybridEdgeAppearance(selectedCluster.name); + + finish(); + setSuccess( + t("Cluster '{{cluster}}' successfully connected", { + cluster: selectedCluster.name, + }) + ); + onClusterRegistered?.(); + } catch (err) { + console.error('Error connecting AKS Hybrid & Edge cluster:', err); + await stopProxy(selectedCluster.name); + setError( + t('Failed to connect to the AKS Hybrid & Edge cluster: {{message}}', { + message: err instanceof Error ? err.message : t('Unknown error'), + }) + ); + finish(); + } + }; + const handleRegister = async () => { if (!selectedCluster || !selectedSubscription) { return; } + if (selectedCluster.clusterType === 'aksarc') { + await handleAksHybridEdgeRegister(); + return; + } + setLoading(true); setError(''); setSuccess(''); diff --git a/plugins/aks-desktop/src/components/AKS/RegisterAKSClusterDialogPure.tsx b/plugins/aks-desktop/src/components/AKS/RegisterAKSClusterDialogPure.tsx index 58b0b1f03..37cb7ce7d 100644 --- a/plugins/aks-desktop/src/components/AKS/RegisterAKSClusterDialogPure.tsx +++ b/plugins/aks-desktop/src/components/AKS/RegisterAKSClusterDialogPure.tsx @@ -8,6 +8,7 @@ import { Autocomplete, Box, Button, + Chip, CircularProgress, Dialog, DialogActions, @@ -39,6 +40,15 @@ export interface AKSCluster { location: string; kubernetesVersion: string; provisioningState: string; + /** `'aks'` for managed clusters, `'aksarc'` for Arc-connected (AKS Hybrid & Edge) clusters. */ + clusterType?: 'aks' | 'aksarc'; + /** For AKS Hybrid & Edge clusters: Arc agent status (`'Connected'` when online). */ + connectivityStatus?: string; +} + +/** AKS Hybrid & Edge cluster is online only when its Arc agent reports 'Connected'. */ +export function isAksHybridEdgeOnline(cluster: AKSCluster): boolean { + return cluster.clusterType !== 'aksarc' || cluster.connectivityStatus === 'Connected'; } export interface RegisterAKSClusterDialogPureProps { @@ -111,6 +121,7 @@ export default function RegisterAKSClusterDialogPure({ onConfigured, }: RegisterAKSClusterDialogPureProps) { const { t } = useTranslation(); + const isAksHybridEdgeSelected = selectedCluster?.clusterType === 'aksarc'; return ( x} getOptionKey={option => `${option.resourceGroup}/${option.name}`} getOptionLabel={option => option.name} + getOptionDisabled={option => !isAksHybridEdgeOnline(option)} isOptionEqualToValue={(option, value) => option.name === value.name && option.resourceGroup === value.resourceGroup } @@ -330,17 +342,40 @@ export default function RegisterAKSClusterDialogPure({ placeholder={t('Select an AKS cluster')} /> )} - renderOption={(props, option) => ( -
  • - - {option.name} - - {option.location} • v{option.kubernetesVersion} •{' '} - {option.provisioningState} - - -
  • - )} + renderOption={(props, option) => { + const offline = !isAksHybridEdgeOnline(option); + return ( +
  • + + + {option.name} + {option.clusterType === 'aksarc' && ( + + + {option.location} • v{option.kubernetesVersion} •{' '} + {offline ? option.connectivityStatus : option.provisioningState} + + +
  • + ); + }} /> )} @@ -367,6 +402,11 @@ export default function RegisterAKSClusterDialogPure({ {t('Kubernetes Version')}: {selectedCluster.kubernetesVersion} + {isAksHybridEdgeSelected && ( + + {t('Type')}: {t('AKS Hybrid & Edge (Arc-connected)')} + + )} )} diff --git a/plugins/aks-desktop/src/components/AksHybridEdge/AksHybridEdgeProxyControls.guidepup.test.tsx b/plugins/aks-desktop/src/components/AksHybridEdge/AksHybridEdgeProxyControls.guidepup.test.tsx new file mode 100644 index 000000000..2f1e19127 --- /dev/null +++ b/plugins/aks-desktop/src/components/AksHybridEdge/AksHybridEdgeProxyControls.guidepup.test.tsx @@ -0,0 +1,256 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache 2.0. + +/** + * Virtual screen-reader + axe-core a11y tests for the AKS Hybrid & Edge proxy + * controls: {@link AksHybridEdgeProxyMenuItem} (the cluster action-menu item) and + * {@link AksHybridEdgeProxyStartDialog} (the connect dialog). + * + * Components are rendered directly with props (their reachability/start + * side-effects are mocked) — mirroring the direct-render a11y tests under + * `CreateAKSProject/__a11y__`. + * + * Coverage: + * AksHybridEdgeProxyMenuItem + * ├── probing — disabled "Checking AKS Hybrid & Edge proxy…" menuitem + * ├── reachable — "Stop AKS Hybrid & Edge proxy" menuitem + * ├── offline — "Start AKS Hybrid & Edge proxy" menuitem + * └── non-aksarc — renders nothing (no menuitem announced) + * AksHybridEdgeProxyStartDialog + * ├── error phase — labelled dialog; error alert; Close/Retry buttons + * └── done phase — success alert; Reload button + */ + +import '@testing-library/jest-dom/vitest'; +import { virtual } from '@guidepup/virtual-screen-reader'; +import { cleanup, render, screen } from '@testing-library/react'; +import axe from 'axe-core'; +import React from 'react'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +// ── Mocks (must live in the test file so Vitest can hoist them) ─────────────── +vi.mock('@kinvolk/headlamp-plugin/lib', async () => { + const i18n = (await import('i18next')).default; + const { initReactI18next, useTranslation } = await import('react-i18next'); + if (!i18n.isInitialized) { + await i18n.use(initReactI18next).init({ + lng: 'en', + fallbackLng: 'en', + resources: { en: { translation: {} } }, + interpolation: { escapeValue: false }, + returnEmptyString: false, + }); + } + return { useTranslation }; +}); + +const mockCheckClusterReachable = vi.hoisted(() => vi.fn()); +const mockStartProxy = vi.hoisted(() => vi.fn()); +const mockStopProxy = vi.hoisted(() => vi.fn()); +const mockVerify = vi.hoisted(() => vi.fn()); +const mockGetClusterSettings = vi.hoisted(() => vi.fn()); +const mockMarkAppearance = vi.hoisted(() => vi.fn()); + +vi.mock('../../utils/azure/aksHybridEdgeProxy', () => ({ + azurePortalClusterUrl: () => 'https://portal.azure.com/#@/resource/x/overview', + checkClusterReachable: mockCheckClusterReachable, + startProxy: mockStartProxy, + stopProxy: mockStopProxy, + verifyAksHybridEdgeCluster: mockVerify, +})); + +vi.mock('../../utils/shared/clusterSettings', () => ({ + getClusterSettings: mockGetClusterSettings, + markAksHybridEdgeAppearance: mockMarkAppearance, +})); + +vi.mock('../../utils/shared/openExternalUrl', () => ({ + openExternalUrl: vi.fn(), +})); + +import { + AksHybridEdgeProxyMenuItem, + AksHybridEdgeProxyStartDialog, +} from './AksHybridEdgeProxyControls'; + +const START_DIALOG_ID = 'aks-hybrid-edge-proxy-start'; +const AKSARC_SETTINGS = { clusterType: 'aksarc', subscriptionId: 'sub-a', resourceGroup: 'rg-a' }; +const CLUSTER = { name: 'edge-1' }; + +// ── Helpers ────────────────────────────────────────────────────────────────── + +/** Collect all spoken phrases to "end of document" (bounded to avoid loops). */ +async function phrases(maxSteps = 300): Promise { + const log: string[] = []; + for (let i = 0; i < maxSteps; i++) { + const p = await virtual.lastSpokenPhrase(); + log.push(p); + if (p === 'end of document') break; + await virtual.next(); + } + return log; +} + +/** Run axe-core on the rendered document and return violations. */ +async function runAxe() { + const results = await axe.run(document.body, { + // MUI Dialog uses aria-hidden on the backdrop; the region rule conflicts with portals. + rules: { region: { enabled: false } }, + }); + return results.violations; +} + +/** Render the menu item inside a menu (its real context) and wait for its label. */ +function renderMenuItem() { + return render( + + ); +} + +function renderDialog() { + return render( + {}} + /> + ); +} + +beforeEach(() => { + vi.clearAllMocks(); // reset call history between tests (implementations set per test) +}); + +afterEach(async () => { + try { + await virtual.stop(); + } catch { + // virtual may not have been started (axe-only tests) — ignore. + } + cleanup(); +}); + +// ═══════════════════════════════════════════════════════════════════════════ +// AksHybridEdgeProxyMenuItem — screen reader +// ═══════════════════════════════════════════════════════════════════════════ +describe('SR: AksHybridEdgeProxyMenuItem', () => { + it('announces a disabled "Checking…" item while probing reachability', async () => { + mockGetClusterSettings.mockReturnValue(AKSARC_SETTINGS); + mockCheckClusterReachable.mockReturnValue(new Promise(() => {})); // never resolves + + renderMenuItem(); + await screen.findByText('Checking AKS Hybrid & Edge proxy…'); + await virtual.start({ container: document.body }); + const ps = await phrases(); + + expect(ps.some(p => /Checking AKS Hybrid & Edge proxy/i.test(p))).toBe(true); + expect(ps.some(p => /disabled/i.test(p))).toBe(true); + }); + + it('announces "Stop AKS Hybrid & Edge proxy" when the cluster is reachable', async () => { + mockGetClusterSettings.mockReturnValue(AKSARC_SETTINGS); + mockCheckClusterReachable.mockResolvedValue({ success: true }); + + renderMenuItem(); + await screen.findByText('Stop AKS Hybrid & Edge proxy'); + await virtual.start({ container: document.body }); + const ps = await phrases(); + + expect(ps.some(p => /Stop AKS Hybrid & Edge proxy/i.test(p))).toBe(true); + expect(ps.some(p => /disabled/i.test(p))).toBe(false); + }); + + it('announces "Start AKS Hybrid & Edge proxy" when the cluster is not reachable', async () => { + mockGetClusterSettings.mockReturnValue(AKSARC_SETTINGS); + mockCheckClusterReachable.mockResolvedValue({ success: false }); + + renderMenuItem(); + await screen.findByText('Start AKS Hybrid & Edge proxy'); + await virtual.start({ container: document.body }); + const ps = await phrases(); + + expect(ps.some(p => /Start AKS Hybrid & Edge proxy/i.test(p))).toBe(true); + }); + + it('renders nothing (no menuitem) for a non-AKS-Hybrid-&-Edge cluster', async () => { + mockGetClusterSettings.mockReturnValue({}); // no clusterType + renderMenuItem(); + await virtual.start({ container: document.body }); + const ps = await phrases(); + + expect(ps.every(p => !/AKS Hybrid & Edge proxy/i.test(p))).toBe(true); + expect(mockCheckClusterReachable).not.toHaveBeenCalled(); + }); +}); + +// ═══════════════════════════════════════════════════════════════════════════ +// AksHybridEdgeProxyStartDialog — screen reader +// ═══════════════════════════════════════════════════════════════════════════ +describe('SR: AksHybridEdgeProxyStartDialog', () => { + it('labels the dialog and announces the error alert + Retry on start failure', async () => { + mockGetClusterSettings.mockReturnValue(AKSARC_SETTINGS); + mockStartProxy.mockResolvedValue({ success: false, error: 'Proxy failed to start' }); + + renderDialog(); + await screen.findByText('Proxy failed to start'); + await virtual.start({ container: document.body }); + const ps = await phrases(); + + // Dialog is a labelled landmark carrying its title. + expect(ps.some(p => /dialog/i.test(p))).toBe(true); + expect(ps.some(p => /Connect AKS Hybrid & Edge cluster/i.test(p))).toBe(true); + // Error is exposed via an alert and the Retry affordance is reachable. + expect(ps.some(p => /Proxy failed to start/i.test(p))).toBe(true); + expect(ps.some(p => /button, Retry/i.test(p))).toBe(true); + }); + + it('announces the success alert + Reload button once connected', async () => { + mockGetClusterSettings.mockReturnValue(AKSARC_SETTINGS); + mockStartProxy.mockResolvedValue({ success: true }); + mockVerify.mockResolvedValue({ success: true, inKubeconfig: true, reachable: true }); + + renderDialog(); + await screen.findByText(/Connected to/); + await virtual.start({ container: document.body }); + const ps = await phrases(); + + expect(ps.some(p => /Connected to/i.test(p))).toBe(true); + expect(ps.some(p => /button, Reload/i.test(p))).toBe(true); + }); +}); + +// ═══════════════════════════════════════════════════════════════════════════ +// Axe (WCAG) — key states +// ═══════════════════════════════════════════════════════════════════════════ +describe('Axe: AKS Hybrid & Edge proxy controls', () => { + it('Start menu item has no axe violations', async () => { + mockGetClusterSettings.mockReturnValue(AKSARC_SETTINGS); + mockCheckClusterReachable.mockResolvedValue({ success: false }); + renderMenuItem(); + await screen.findByText('Start AKS Hybrid & Edge proxy'); + expect(await runAxe()).toEqual([]); + }); + + it('dialog error phase has no axe violations', async () => { + mockGetClusterSettings.mockReturnValue(AKSARC_SETTINGS); + mockStartProxy.mockResolvedValue({ success: false, error: 'Proxy failed to start' }); + renderDialog(); + await screen.findByText('Proxy failed to start'); + expect(await runAxe()).toEqual([]); + }); + + it('dialog success phase has no axe violations', async () => { + mockGetClusterSettings.mockReturnValue(AKSARC_SETTINGS); + mockStartProxy.mockResolvedValue({ success: true }); + mockVerify.mockResolvedValue({ success: true, inKubeconfig: true, reachable: true }); + renderDialog(); + await screen.findByText(/Connected to/); + expect(await runAxe()).toEqual([]); + }); +}); diff --git a/plugins/aks-desktop/src/components/AksHybridEdge/AksHybridEdgeProxyControls.tsx b/plugins/aks-desktop/src/components/AksHybridEdge/AksHybridEdgeProxyControls.tsx new file mode 100644 index 000000000..1496dbf33 --- /dev/null +++ b/plugins/aks-desktop/src/components/AksHybridEdge/AksHybridEdgeProxyControls.tsx @@ -0,0 +1,275 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache 2.0. + +import { useTranslation } from '@kinvolk/headlamp-plugin/lib'; +import { + Alert, + Box, + Button, + CircularProgress, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + ListItemText, + MenuItem, + Typography, +} from '@mui/material'; +import React from 'react'; +import { + azurePortalClusterUrl, + checkClusterReachable, + startProxy, + stopProxy, + verifyAksHybridEdgeCluster, +} from '../../utils/azure/aksHybridEdgeProxy'; +import { + getClusterSettings, + markAksHybridEdgeAppearance, +} from '../../utils/shared/clusterSettings'; +import { openExternalUrl } from '../../utils/shared/openExternalUrl'; + +/** Confirm-dialog id used to coordinate the start-proxy dialog with its menu item. */ +const START_DIALOG_ID = 'aks-hybrid-edge-proxy-start'; + +/** + * Cluster action-menu item to start or stop the AKS Hybrid & Edge proxy. + * Registered via `registerClusterProviderMenuItem`. + * + * Driven purely by **reachability** — the observable truth of whether a proxy is + * serving the cluster, which is independent of renderer reloads (the proxy is + * owned by the app/main layer, not the renderer): + * - reachable → the proxy is up → offer **Stop**; + * - not reachable → offer **Start**; + * - still probing → a disabled placeholder so the item doesn't flip. + */ +export function AksHybridEdgeProxyMenuItem({ + cluster, + handleMenuClose, + setOpenConfirmDialog, +}: { + cluster: any; + handleMenuClose: () => void; + setOpenConfirmDialog: (value: string) => void; +}) { + const { t } = useTranslation(); + const settings = getClusterSettings(cluster?.name); + const clusterName: string = cluster?.name; + const isAksHybridEdge = + settings.clusterType === 'aksarc' && !!settings.subscriptionId && !!settings.resourceGroup; + + const [reachable, setReachable] = React.useState(null); + React.useEffect(() => { + if (!isAksHybridEdge || !clusterName) { + return; + } + let cancelled = false; + checkClusterReachable(clusterName).then(r => { + if (!cancelled) { + setReachable(r.success); + } + }); + return () => { + cancelled = true; + }; + }, [isAksHybridEdge, clusterName]); + + if (!isAksHybridEdge) { + return null; + } + + // Still probing — show a disabled placeholder rather than flipping the label. + if (reachable === null) { + return ( + + {t('Checking AKS Hybrid & Edge proxy…')} + + ); + } + + // Reachable → a proxy is serving the cluster → offer to stop it. + if (reachable) { + return ( + { + handleMenuClose(); + stopProxy(clusterName).catch(err => + console.error('[AKS] Failed to stop AKS Hybrid & Edge proxy:', err) + ); + }} + > + {t('Stop AKS Hybrid & Edge proxy')} + + ); + } + + // Not reachable → offer to start (idempotent in the app layer). + return ( + { + handleMenuClose(); + setOpenConfirmDialog(START_DIALOG_ID); + }} + > + {t('Start AKS Hybrid & Edge proxy')} + + ); +} + +type StartPhase = 'starting' | 'verifying' | 'error' | 'done'; + +/** + * Dialog that drives starting the AKS Hybrid & Edge proxy for a cluster and verifying + * connectivity. Registered via `registerClusterProviderDialog`. Used to + * (re)connect a cluster after a full app restart, when the proxy is gone. + */ +export function AksHybridEdgeProxyStartDialog({ + cluster, + openConfirmDialog, + setOpenConfirmDialog, +}: { + cluster: any; + openConfirmDialog: string | null; + setOpenConfirmDialog: (value: string) => void; +}) { + const { t } = useTranslation(); + const open = openConfirmDialog === START_DIALOG_ID; + const settings = getClusterSettings(cluster?.name); + + const [phase, setPhase] = React.useState('starting'); + const [errorMsg, setErrorMsg] = React.useState(''); + // Set when the failure is an unhealthy-cluster case, so we can offer a link to + // inspect the cluster in the Azure portal (where the state can be remediated). + const [showPortalLink, setShowPortalLink] = React.useState(false); + const startedRef = React.useRef(false); + + const clusterName: string = cluster?.name; + const subscriptionId = settings.subscriptionId; + const resourceGroup = settings.resourceGroup; + + const run = React.useCallback(async () => { + if (!subscriptionId || !resourceGroup || !clusterName) { + setErrorMsg(t('Missing Azure metadata for this cluster.')); + setPhase('error'); + return; + } + const target = { subscriptionId, resourceGroup, clusterName }; + setPhase('starting'); + setErrorMsg(''); + setShowPortalLink(false); + + try { + const start = await startProxy(target); + if (!start.success) { + setErrorMsg(start.error || t('Unknown error')); + setPhase('error'); + return; + } + + setPhase('verifying'); + const verify = await verifyAksHybridEdgeCluster(clusterName, { + target: { subscriptionId, resourceGroup }, + }); + if (!verify.success) { + await stopProxy(clusterName); + setErrorMsg(verify.error || t('Unknown error')); + // A non-Succeeded currentState means the cluster is unhealthy in + // Azure — offer a link to inspect/remediate it there. + setShowPortalLink(!!verify.currentState && verify.currentState !== 'Succeeded'); + setPhase('error'); + return; + } + + // Ensure the distinct name badge is present (covers clusters registered + // before badge support existed, reconnected via this dialog). + markAksHybridEdgeAppearance(clusterName); + setPhase('done'); + } catch (err) { + await stopProxy(clusterName); + setErrorMsg(err instanceof Error ? err.message : t('Unknown error')); + setPhase('error'); + } + }, [subscriptionId, resourceGroup, clusterName, t]); + + // Kick off the start flow once when the dialog opens; reset when it closes. + React.useEffect(() => { + if (open && !startedRef.current) { + startedRef.current = true; + run(); + } else if (!open) { + startedRef.current = false; + setPhase('starting'); + setErrorMsg(''); + } + }, [open, run]); + + if (!open || settings.clusterType !== 'aksarc') { + return null; + } + + const close = () => setOpenConfirmDialog(''); + const busy = phase === 'starting' || phase === 'verifying'; + + return ( + + {t('Connect AKS Hybrid & Edge cluster')} + + + {phase === 'starting' && ( + + + )} + {phase === 'verifying' && ( + + + )} + {phase === 'error' && {errorMsg}} + {phase === 'done' && ( + + {t('Connected to "{{cluster}}". Reload to view the cluster.', { + cluster: clusterName, + })} + + )} + + + + {phase === 'error' && ( + <> + + {showPortalLink && subscriptionId && resourceGroup && ( + + )} + + + )} + {phase === 'done' && ( + + )} + {busy && } + + + ); +} diff --git a/plugins/aks-desktop/src/components/AksHybridEdge/aksHybridEdgePreOpen.test.ts b/plugins/aks-desktop/src/components/AksHybridEdge/aksHybridEdgePreOpen.test.ts new file mode 100644 index 000000000..6b22398f6 --- /dev/null +++ b/plugins/aks-desktop/src/components/AksHybridEdge/aksHybridEdgePreOpen.test.ts @@ -0,0 +1,100 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache 2.0. + +import { beforeEach, describe, expect, test, vi } from 'vitest'; + +const mockCheckClusterReachable = vi.hoisted(() => vi.fn()); +const mockStartProxy = vi.hoisted(() => vi.fn()); +const mockStopProxy = vi.hoisted(() => vi.fn()); +const mockVerify = vi.hoisted(() => vi.fn()); +const mockGetClusterSettings = vi.hoisted(() => vi.fn()); +const mockMarkAppearance = vi.hoisted(() => vi.fn()); + +vi.mock('../../utils/azure/aksHybridEdgeProxy', () => ({ + checkClusterReachable: mockCheckClusterReachable, + startProxy: mockStartProxy, + stopProxy: mockStopProxy, + verifyAksHybridEdgeCluster: mockVerify, +})); + +vi.mock('../../utils/shared/clusterSettings', () => ({ + getClusterSettings: mockGetClusterSettings, + markAksHybridEdgeAppearance: mockMarkAppearance, +})); + +import { aksHybridEdgePreOpenHook, looksLikeArcProxiedCluster } from './aksHybridEdgePreOpen'; + +// A real `az connectedk8s proxy` kubeconfig server URL. +const PROXY_SERVER = + 'https://127.0.0.1:47011/proxies/b7aaf9dd06bfe352324393a15dd45da70bc8277cda39814daa7911a56a65b481'; + +describe('looksLikeArcProxiedCluster', () => { + test('true for a loopback host with the /proxies/ path (any port)', () => { + expect(looksLikeArcProxiedCluster({ server: PROXY_SERVER })).toBe(true); + expect( + looksLikeArcProxiedCluster({ server: 'https://localhost:47011/proxies/deadbeefdeadbeef' }) + ).toBe(true); + // Custom --port still matches — the path is the signature, not the port. + expect( + looksLikeArcProxiedCluster({ server: 'https://127.0.0.1:8080/proxies/deadbeefdeadbeef' }) + ).toBe(true); + }); + + test('false for a loopback host without the /proxies path (e.g. minikube/kind)', () => { + expect(looksLikeArcProxiedCluster({ server: 'https://127.0.0.1:47011' })).toBe(false); + expect(looksLikeArcProxiedCluster({ server: 'https://127.0.0.1:6443' })).toBe(false); + expect(looksLikeArcProxiedCluster({ server: 'https://127.0.0.1:8443/api' })).toBe(false); + }); + + test('false for a non-loopback host even with the /proxies path', () => { + expect( + looksLikeArcProxiedCluster({ server: 'https://10.0.0.5:47011/proxies/deadbeefdeadbeef' }) + ).toBe(false); + }); + + test('false for missing / non-string / unparseable server', () => { + expect(looksLikeArcProxiedCluster({})).toBe(false); + expect(looksLikeArcProxiedCluster(null)).toBe(false); + expect(looksLikeArcProxiedCluster(undefined)).toBe(false); + expect(looksLikeArcProxiedCluster({ server: 42 })).toBe(false); + expect(looksLikeArcProxiedCluster({ server: 'not a url' })).toBe(false); + }); +}); + +describe('aksHybridEdgePreOpenHook — manually-added cluster handling', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + test('no-op for a genuine non-Arc cluster (not proxy-looking)', async () => { + mockGetClusterSettings.mockReturnValue({}); // no clusterType + await expect( + aksHybridEdgePreOpenHook({ + cluster: 'kind-dev', + clusterConf: { server: 'https://127.0.0.1:6443' }, + }) + ).resolves.toBeUndefined(); + expect(mockCheckClusterReachable).not.toHaveBeenCalled(); + expect(mockStartProxy).not.toHaveBeenCalled(); + }); + + test('guides the user when a proxy-looking cluster is unregistered and unreachable', async () => { + mockGetClusterSettings.mockReturnValue({}); // added manually — no metadata + mockCheckClusterReachable.mockResolvedValue({ success: false }); + + await expect( + aksHybridEdgePreOpenHook({ cluster: 'manual-arc', clusterConf: { server: PROXY_SERVER } }) + ).rejects.toThrow(/Register it via "Register AKS cluster"/); + expect(mockStartProxy).not.toHaveBeenCalled(); + }); + + test('lets a proxy-looking cluster open if it is already reachable (user-run proxy)', async () => { + mockGetClusterSettings.mockReturnValue({}); + mockCheckClusterReachable.mockResolvedValue({ success: true }); + + await expect( + aksHybridEdgePreOpenHook({ cluster: 'manual-arc-up', clusterConf: { server: PROXY_SERVER } }) + ).resolves.toBeUndefined(); + expect(mockStartProxy).not.toHaveBeenCalled(); + }); +}); diff --git a/plugins/aks-desktop/src/components/AksHybridEdge/aksHybridEdgePreOpen.ts b/plugins/aks-desktop/src/components/AksHybridEdge/aksHybridEdgePreOpen.ts new file mode 100644 index 000000000..33395ae79 --- /dev/null +++ b/plugins/aks-desktop/src/components/AksHybridEdge/aksHybridEdgePreOpen.ts @@ -0,0 +1,142 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache 2.0. + +import { + checkClusterReachable, + startProxy, + stopProxy, + verifyAksHybridEdgeCluster, +} from '../../utils/azure/aksHybridEdgeProxy'; +import { + getClusterSettings, + markAksHybridEdgeAppearance, +} from '../../utils/shared/clusterSettings'; + +/** + * Path signature of an `az connectedk8s proxy` server URL. The proxy points the + * kubeconfig context at a loopback URL of the form + * `https://127.0.0.1:/proxies/` — the `/proxies/` path + * is the distinctive fingerprint (unlike the port, it doesn't change with a + * custom `--port`). + */ +const ARC_PROXY_PATH_RE = /^\/proxies\/[0-9a-f]{16,}\/?$/i; + +/** + * Best-effort detection of an Arc-proxied cluster from its kubeconfig server + * URL: a loopback host whose path is the `az connectedk8s proxy` `/proxies/` + * signature. Used to recognise an AKS Hybrid & Edge cluster that was **added + * manually** (so it carries no plugin metadata — no `clusterType`/subscription/ + * resource group) and guide the user, instead of silently failing to connect. + * + * @param clusterConf - The cluster's config (from Headlamp's `/config`), which + * carries the kubeconfig `server` URL. Loosely typed by the extension point. + */ +export function looksLikeArcProxiedCluster(clusterConf: unknown): boolean { + const server = (clusterConf as { server?: unknown } | null | undefined)?.server; + if (typeof server !== 'string' || !server) { + return false; + } + try { + const url = new URL(server); + const isLoopback = url.hostname === '127.0.0.1' || url.hostname === 'localhost'; + return isLoopback && ARC_PROXY_PATH_RE.test(url.pathname); + } catch { + return false; + } +} + +/** + * Pre-open hook (registered via `registerClusterProviderPreOpen`) that + * transparently connects an AKS Hybrid & Edge (Arc-connected) cluster when the + * user opens it. + * + * For clusters this plugin does not own (no `aksarc` marker) it resolves + * immediately — unless the cluster looks Arc-proxied but was added manually + * (no plugin metadata) and isn't reachable, in which case it throws a message + * guiding the user to register it (we can't start its proxy without the Azure + * subscription/resource group). For registered AKS Hybrid & Edge clusters it + * makes sure the local `az connectedk8s proxy` is serving the cluster before its + * views load, so connecting no longer has to be done by hand from the cluster + * action menu — opening the cluster is enough. + * + * It throws (rejecting the returned promise) when the cluster can't be made + * reachable; Headlamp core surfaces the thrown message with a retry affordance. + * + * @param context.cluster - The kubeconfig context / cluster name being opened. + * @param context.clusterConf - The cluster's config (carries the server URL). + */ +export async function aksHybridEdgePreOpenHook({ + cluster, + clusterConf, + reportProgress, +}: { + cluster: string; + clusterConf?: any; + /** Reports progress text to the "connecting" popup Headlamp shows while we prepare. */ + reportProgress?: (message: string) => void; +}): Promise { + if (!cluster) { + return; + } + + const settings = getClusterSettings(cluster); + if (settings.clusterType !== 'aksarc') { + // Not registered as AKS Hybrid & Edge. It may still be an Arc-proxied cluster + // that was added manually — its context points at the local connectedk8s + // proxy port, but we have no Azure metadata to start/manage its proxy. If + // such a cluster isn't already reachable (i.e. no proxy is running for it), + // guide the user to register it instead of failing opaquely. Genuine non-Arc + // clusters, and manually-proxied clusters that are already up, are left + // untouched. + if (looksLikeArcProxiedCluster(clusterConf)) { + const reachable = await checkClusterReachable(cluster); + if (!reachable.success) { + throw new Error( + `"${cluster}" looks like an AKS Hybrid & Edge (Arc-connected) cluster but is not ` + + 'registered in AKS Desktop, so its connection cannot be started automatically. ' + + 'Register it via "Register AKS cluster" to connect.' + ); + } + } + return; + } + + // A proxy started earlier (this session, or one that outlived a renderer + // reload) may still be serving the cluster. Re-launching would bounce the + // shared arc-proxy daemon and drop other clusters' connections, so if the + // cluster is already reachable we're done. + const reachable = await checkClusterReachable(cluster); + if (reachable.success) { + markAksHybridEdgeAppearance(cluster); + return; + } + + const { subscriptionId, resourceGroup } = settings; + if (!subscriptionId || !resourceGroup) { + throw new Error( + 'Missing Azure metadata for this AKS Hybrid & Edge cluster. Re-register it to reconnect.' + ); + } + + reportProgress?.('Starting AKS Hybrid & Edge proxy…'); + const start = await startProxy({ subscriptionId, resourceGroup, clusterName: cluster }); + if (!start.success) { + throw new Error(start.error || 'Failed to start the AKS Hybrid & Edge proxy.'); + } + + reportProgress?.('Verifying cluster connection…'); + const verify = await verifyAksHybridEdgeCluster(cluster, { + target: { subscriptionId, resourceGroup }, + }); + if (!verify.success) { + // Leave nothing half-connected behind if verification fails. + await stopProxy(cluster); + throw new Error( + verify.error || + 'The AKS Hybrid & Edge cluster did not become reachable. ' + + 'It may be stopped or its Azure Arc agents may be offline.' + ); + } + + markAksHybridEdgeAppearance(cluster); +} diff --git a/plugins/aks-desktop/src/components/CreateAKSProject/hooks/useExtensionCheck.ts b/plugins/aks-desktop/src/components/CreateAKSProject/hooks/useExtensionCheck.ts index 88887d6b8..12f8fafef 100644 --- a/plugins/aks-desktop/src/components/CreateAKSProject/hooks/useExtensionCheck.ts +++ b/plugins/aks-desktop/src/components/CreateAKSProject/hooks/useExtensionCheck.ts @@ -9,9 +9,12 @@ import { import type { ExtensionStatus } from '../types'; /** - * Custom hook for managing AKS Preview Extension status + * Custom hook for managing an Azure CLI extension's status. + * + * @param extensionName - The `az` extension to check/install. Defaults to + * `'aks-preview'`; pass `'connectedk8s'` for the AKS Hybrid & Edge proxy path. */ -export const useExtensionCheck = () => { +export const useExtensionCheck = (extensionName: string = 'aks-preview') => { const [status, setStatus] = useState({ installed: null, installing: false, @@ -21,7 +24,7 @@ export const useExtensionCheck = () => { const checkExtension = useCallback(async () => { try { - const result = await isExtensionInstalled('aks-preview'); + const result = await isExtensionInstalled(extensionName); setStatus(prev => ({ ...prev, installed: result.installed, @@ -35,12 +38,12 @@ export const useExtensionCheck = () => { error: 'Failed to check extension status', })); } - }, []); + }, [extensionName]); const installExtension = useCallback(async () => { try { setStatus(prev => ({ ...prev, installing: true, error: null })); - const result = await installAzExtension('aks-preview'); + const result = await installAzExtension(extensionName); if (result.success) { setStatus(prev => ({ @@ -69,7 +72,7 @@ export const useExtensionCheck = () => { } finally { setStatus(prev => ({ ...prev, installing: false })); } - }, []); + }, [extensionName]); const clearError = useCallback(() => { setStatus(prev => ({ ...prev, error: null })); diff --git a/plugins/aks-desktop/src/headlamp-plugin.d.ts b/plugins/aks-desktop/src/headlamp-plugin.d.ts index 011b13c2c..fe5bbb516 100644 --- a/plugins/aks-desktop/src/headlamp-plugin.d.ts +++ b/plugins/aks-desktop/src/headlamp-plugin.d.ts @@ -2,3 +2,30 @@ // Licensed under the Apache 2.0. /// + +// Local type augmentation for the `registerClusterProviderPreOpen` extension +// point added to Headlamp core (frontend `plugin/registry`). It is available on +// the runtime plugin lib, but the pinned `@kinvolk/headlamp-plugin` types do not +// declare it yet. Remove this block once the published types include it. +declare module '@kinvolk/headlamp-plugin/lib' { + /** Context passed to a pre-open hook when a cluster is about to be opened. */ + export interface ClusterPreOpenContext { + /** The name of the cluster being opened. */ + cluster: string; + /** The cluster's configuration, if known. */ + clusterConf?: any; + /** Reports progress text to the connecting popup shown while preparing. */ + reportProgress?: (message: string) => void; + } + + /** + * A hook run once, before a cluster's views are rendered. Resolve to allow the + * cluster to open; reject to block it and surface the error to the user. + */ + export type ClusterPreOpenHook = (context: ClusterPreOpenContext) => Promise; + + /** Register a hook that runs before a cluster is opened. */ + export function registerClusterProviderPreOpen(hook: ClusterPreOpenHook): void; +} + +export {}; diff --git a/plugins/aks-desktop/src/index.tsx b/plugins/aks-desktop/src/index.tsx index 69cc0c655..b657479e9 100644 --- a/plugins/aks-desktop/src/index.tsx +++ b/plugins/aks-desktop/src/index.tsx @@ -7,6 +7,9 @@ import { registerAppBarAction, registerAppLogo, registerAppTheme, + registerClusterProviderDialog, + registerClusterProviderMenuItem, + registerClusterProviderPreOpen, registerCustomCreateProject, registerPluginSettings, registerProjectDeleteButton, @@ -21,6 +24,11 @@ import React from 'react'; import { Redirect } from 'react-router-dom'; import AccessTab from './components/AccessTab/AccessTab'; import RegisterAKSClusterPage from './components/AKS/RegisterAKSClusterPage'; +import { aksHybridEdgePreOpenHook } from './components/AksHybridEdge/aksHybridEdgePreOpen'; +import { + AksHybridEdgeProxyMenuItem, + AksHybridEdgeProxyStartDialog, +} from './components/AksHybridEdge/AksHybridEdgeProxyControls'; import AzureLoginPage from './components/AzureAuth/AzureLoginPage'; import AzureProfilePage from './components/AzureAuth/AzureProfilePage'; import ClusterCapabilityCard from './components/ClusterCapabilityCard/ClusterCapabilityCard'; @@ -341,6 +349,21 @@ if (Headlamp.isRunningAsApp()) { noAuthRequired: true, }); + // AKS Hybrid & Edge (Arc-connected) cluster list integration. + // - AKS Hybrid & Edge clusters are differentiated on the Home list by a distinct + // name badge (server icon + Azure-blue accent) set via the shared cluster + // appearance settings at registration time — no custom status column. + // - A menu item starts/stops the local `az connectedk8s proxy`. The proxy is + // not persisted across app restarts, so this is how connectivity is + // re-established after a reload. + // - A dialog drives the start flow and verifies the cluster becomes reachable. + // - A pre-open hook auto-starts and verifies the proxy when the user opens an + // AKS Hybrid & Edge cluster, so connecting is seamless (no manual menu step); + // the menu item/dialog remain as an explicit fallback. + registerClusterProviderMenuItem(AksHybridEdgeProxyMenuItem); + registerClusterProviderDialog(AksHybridEdgeProxyStartDialog); + registerClusterProviderPreOpen(aksHybridEdgePreOpenHook); + // Project details tabs wrap in TelemetryErrorBoundary, which reports // through the telemetry chokepoint. Telemetry is only booted in the // app context (TelemetryBoot is registered via registerAppBarAction diff --git a/plugins/aks-desktop/src/utils/azure/aks.test.ts b/plugins/aks-desktop/src/utils/azure/aks.test.ts new file mode 100644 index 000000000..6cc894875 --- /dev/null +++ b/plugins/aks-desktop/src/utils/azure/aks.test.ts @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache 2.0. + +import { beforeEach, describe, expect, test, vi } from 'vitest'; + +const mockGetClusters = vi.hoisted(() => vi.fn()); +const mockGetConnectedClusters = vi.hoisted(() => vi.fn()); + +vi.mock('./az-clusters', () => ({ + getClusters: mockGetClusters, + getConnectedClusters: mockGetConnectedClusters, +})); + +vi.mock('./az-subscriptions', () => ({ + getSubscriptions: vi.fn(), +})); + +import { getAKSClusters } from './aks'; + +describe('getAKSClusters — merges AKS and AKS Hybrid & Edge clusters', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + test('tags managed clusters as aks and connected clusters as aksarc', async () => { + mockGetClusters.mockResolvedValue([ + { + name: 'managed', + resourceGroup: 'rg1', + location: 'eastus', + version: '1.30', + status: 'Succeeded', + }, + ]); + mockGetConnectedClusters.mockResolvedValue([ + { + name: 'aks-hybrid-edge', + resourceGroup: 'rg2', + location: 'westus', + version: '1.29', + status: 'Connected', + clusterType: 'aksarc', + }, + ]); + + const result = await getAKSClusters('sub-1'); + expect(result.success).toBe(true); + expect(result.clusters).toHaveLength(2); + + const managed = result.clusters!.find(c => c.name === 'managed'); + const hybridEdge = result.clusters!.find(c => c.name === 'aks-hybrid-edge'); + expect(managed?.clusterType).toBe('aks'); + expect(hybridEdge?.clusterType).toBe('aksarc'); + }); + + test('an AKS Hybrid & Edge discovery failure never breaks the AKS list (review bug #1)', async () => { + mockGetClusters.mockResolvedValue([ + { + name: 'managed', + resourceGroup: 'rg1', + location: 'eastus', + version: '1.30', + status: 'Succeeded', + }, + ]); + mockGetConnectedClusters.mockRejectedValue(new Error('connectedk8s exploded')); + + const result = await getAKSClusters('sub-1'); + expect(result.success).toBe(true); + expect(result.clusters).toHaveLength(1); + expect(result.clusters![0].name).toBe('managed'); + expect(result.clusters![0].clusterType).toBe('aks'); + }); + + test('propagates a failure when the AKS list itself fails', async () => { + mockGetClusters.mockRejectedValue(new Error('az aks list failed')); + mockGetConnectedClusters.mockResolvedValue([]); + + const result = await getAKSClusters('sub-1'); + expect(result.success).toBe(false); + expect(result.message).toContain('az aks list failed'); + }); +}); diff --git a/plugins/aks-desktop/src/utils/azure/aks.ts b/plugins/aks-desktop/src/utils/azure/aks.ts index 2ce4f9a7b..5c91c18b5 100644 --- a/plugins/aks-desktop/src/utils/azure/aks.ts +++ b/plugins/aks-desktop/src/utils/azure/aks.ts @@ -1,4 +1,4 @@ -import { getClusters } from './az-clusters'; +import { getClusters, getConnectedClusters } from './az-clusters'; import { getSubscriptions as getAzSubscriptions } from './az-subscriptions'; export interface Subscription { @@ -10,6 +10,9 @@ export interface Subscription { isDefault: boolean; } +/** Discriminator distinguishing managed AKS clusters from Arc-connected AKS Hybrid & Edge clusters. */ +export type ClusterType = 'aks' | 'aksarc'; + export interface AKSCluster { name: string; resourceGroup: string; @@ -18,6 +21,13 @@ export interface AKSCluster { provisioningState: string; fqdn: string; isAzureRBACEnabled: boolean; + /** `'aks'` for managed clusters, `'aksarc'` for Arc-connected (AKS Hybrid & Edge) clusters. */ + clusterType: ClusterType; + /** + * For AKS Hybrid & Edge (`aksarc`) clusters: the Azure Arc agent heartbeat status + * (`'Connected'` when online). Undefined for managed AKS clusters. + */ + connectivityStatus?: string; } /** @@ -61,7 +71,23 @@ export async function getAKSClusters(subscriptionId: string): Promise<{ clusters?: AKSCluster[]; }> { try { - const clusters = await getClusters(subscriptionId); + const aksClusters = await getClusters(subscriptionId); + + // AKS Hybrid & Edge (Arc-connected) discovery is additive and best-effort: a + // failure here must never prevent the managed AKS clusters from listing. + // getConnectedClusters already swallows its own errors, but we guard again + // so the AKS path is resilient regardless of that contract. + let arcClusters: any[] = []; + try { + arcClusters = await getConnectedClusters(subscriptionId); + } catch (arcError) { + console.warn( + 'AKS Hybrid & Edge cluster discovery failed; continuing with AKS clusters only:', + arcError + ); + } + + const clusters = [...aksClusters, ...arcClusters]; return { success: true, @@ -70,10 +96,12 @@ export async function getAKSClusters(subscriptionId: string): Promise<{ name: cluster.name, resourceGroup: cluster.resourceGroup, location: cluster.location, - kubernetesVersion: cluster.version, + kubernetesVersion: cluster.version || '', provisioningState: cluster.status, fqdn: '', // Not returned by getClusters - isAzureRBACEnabled: cluster.aadProfile !== null, + isAzureRBACEnabled: !!cluster.aadProfile, + clusterType: (cluster.clusterType as ClusterType) || 'aks', + connectivityStatus: cluster.connectivityStatus, })), }; } catch (error) { diff --git a/plugins/aks-desktop/src/utils/azure/aksHybridEdgeProxy.test.ts b/plugins/aks-desktop/src/utils/azure/aksHybridEdgeProxy.test.ts new file mode 100644 index 000000000..4d4617f36 --- /dev/null +++ b/plugins/aks-desktop/src/utils/azure/aksHybridEdgeProxy.test.ts @@ -0,0 +1,204 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache 2.0. + +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; + +const mockClusterRequest = vi.hoisted(() => vi.fn()); +const mockRequest = vi.hoisted(() => vi.fn()); +const mockSend = vi.hoisted(() => vi.fn()); +const mockRunCommandAsync = vi.hoisted(() => vi.fn()); + +vi.mock('@kinvolk/headlamp-plugin/lib', () => ({ + ApiProxy: { + clusterRequest: mockClusterRequest, + request: mockRequest, + }, +})); + +// `getClusterCurrentState` runs `az rest` via the shared command runner; mock +// it so verification tests can simulate Azure states. +vi.mock('../shared/runCommandAsync', () => ({ + runCommandAsync: mockRunCommandAsync, +})); + +import { + azurePortalClusterUrl, + checkClusterReachable, + getClusterCurrentState, + isClusterInKubeconfig, + startProxy, + stopProxy, + verifyAksHybridEdgeCluster, +} from './aksHybridEdgeProxy'; + +const targetA = { subscriptionId: 'sub-a', resourceGroup: 'rg-a', clusterName: 'cluster-a' }; + +describe('aksHybridEdgeProxy — start/stop delegate to the app layer', () => { + beforeEach(() => { + vi.clearAllMocks(); + (window as any).desktopApi = { send: mockSend }; + }); + + afterEach(() => { + delete (window as any).desktopApi; + }); + + test('startProxy sends a cluster-keyed start intent to the main process', async () => { + const res = await startProxy(targetA); + expect(res.success).toBe(true); + expect(mockSend).toHaveBeenCalledWith('start-aks-hybrid-edge-proxy', { + cluster: 'cluster-a', + subscriptionId: 'sub-a', + resourceGroup: 'rg-a', + }); + }); + + test('startProxy fails cleanly when the desktop bridge is unavailable', async () => { + delete (window as any).desktopApi; + const res = await startProxy(targetA); + expect(res.success).toBe(false); + expect(mockSend).not.toHaveBeenCalled(); + }); + + test('stopProxy sends a cluster-keyed stop intent', async () => { + const res = await stopProxy('cluster-a'); + expect(res.success).toBe(true); + expect(mockSend).toHaveBeenCalledWith('stop-aks-hybrid-edge-proxy', { cluster: 'cluster-a' }); + }); + + test('stopProxy is a safe no-op without a desktop bridge', async () => { + delete (window as any).desktopApi; + const res = await stopProxy('cluster-a'); + expect(res.success).toBe(true); + expect(mockSend).not.toHaveBeenCalled(); + }); +}); + +describe('aksHybridEdgeProxy — reachability & verification', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + test('checkClusterReachable succeeds when the API responds', async () => { + mockClusterRequest.mockResolvedValue({ items: [] }); + const res = await checkClusterReachable('cluster-a'); + expect(res.success).toBe(true); + expect(mockClusterRequest).toHaveBeenCalledWith( + '/api/v1/namespaces', + expect.objectContaining({ cluster: 'cluster-a' }), + { limit: '1' } + ); + }); + + test('checkClusterReachable reports failure when the API rejects', async () => { + mockClusterRequest.mockRejectedValue(new Error('connection refused')); + const res = await checkClusterReachable('cluster-a'); + expect(res.success).toBe(false); + expect(res.error).toContain('connection refused'); + }); + + test('isClusterInKubeconfig checks Headlamp /config (array of clusters) for the context', async () => { + mockRequest.mockResolvedValue({ clusters: [{ name: 'cluster-a' }, { name: 'other' }] }); + expect(await isClusterInKubeconfig('cluster-a')).toBe(true); + expect(await isClusterInKubeconfig('missing')).toBe(false); + }); + + describe('verifyAksHybridEdgeCluster', () => { + test('succeeds once the context is loaded and the cluster is reachable', async () => { + mockRequest.mockResolvedValue({ clusters: [{ name: 'cluster-a' }] }); + mockClusterRequest.mockResolvedValue({ items: [] }); + + const res = await verifyAksHybridEdgeCluster('cluster-a', { timeoutMs: 100, intervalMs: 5 }); + expect(res.success).toBe(true); + expect(res.inKubeconfig).toBe(true); + expect(res.reachable).toBe(true); + }); + + test('fails (not in kubeconfig) when /config never lists the context', async () => { + mockRequest.mockResolvedValue({ clusters: [] }); + mockClusterRequest.mockRejectedValue(new Error('cluster not found')); + + const res = await verifyAksHybridEdgeCluster('cluster-a', { timeoutMs: 30, intervalMs: 5 }); + expect(res.success).toBe(false); + expect(res.inKubeconfig).toBe(false); + // Phase 1 gates Phase 2: no API probe until the context is loaded. + expect(mockClusterRequest).not.toHaveBeenCalled(); + }); + + test('fails (in kubeconfig but unreachable) when the API never answers', async () => { + mockRequest.mockResolvedValue({ clusters: [{ name: 'cluster-a' }] }); + mockClusterRequest.mockRejectedValue(new Error('timeout')); + + const res = await verifyAksHybridEdgeCluster('cluster-a', { timeoutMs: 30, intervalMs: 5 }); + expect(res.success).toBe(false); + expect(res.inKubeconfig).toBe(true); + expect(res.reachable).toBe(false); + }); + + test('explains a Failed cluster when a target is supplied and it is unreachable', async () => { + mockRequest.mockResolvedValue({ clusters: [{ name: 'cluster-a' }] }); + mockClusterRequest.mockRejectedValue(new Error('timeout')); + // az rest ... --query properties.status -o json → Failed currentState + reason + mockRunCommandAsync.mockResolvedValue({ + stdout: JSON.stringify({ + currentState: 'Failed', + errorMessage: 'Timed out waiting for target cluster to be ready.', + }), + stderr: '', + }); + + const res = await verifyAksHybridEdgeCluster('cluster-a', { + timeoutMs: 30, + intervalMs: 5, + target: { subscriptionId: 'sub-a', resourceGroup: 'rg-a' }, + }); + expect(res.success).toBe(false); + expect(res.reachable).toBe(false); + expect(res.currentState).toBe('Failed'); + expect(res.error).toContain('Failed'); + // Azure's own reason is surfaced verbatim to the user. + expect(res.error).toContain('Timed out waiting for target cluster to be ready.'); + expect(res.error).toContain('Azure portal'); + }); + }); + + describe('getClusterCurrentState', () => { + test('returns the currentState and errorMessage from the provisioned instance', async () => { + mockRunCommandAsync.mockResolvedValue({ + stdout: JSON.stringify({ currentState: 'Failed', errorMessage: 'not reachable' }), + stderr: '', + }); + const health = await getClusterCurrentState({ + subscriptionId: 'sub-a', + resourceGroup: 'rg-a', + clusterName: 'cluster-a', + }); + expect(health.currentState).toBe('Failed'); + expect(health.errorMessage).toBe('not reachable'); + }); + + test('returns null currentState when the az command errors (e.g. generic Arc cluster 404)', async () => { + mockRunCommandAsync.mockResolvedValue({ stdout: '', stderr: 'ERROR: not found' }); + const health = await getClusterCurrentState({ + subscriptionId: 'sub-a', + resourceGroup: 'rg-a', + clusterName: 'cluster-a', + }); + expect(health.currentState).toBeNull(); + }); + }); + + describe('azurePortalClusterUrl', () => { + test('builds a connectedClusters overview deep link', () => { + const url = azurePortalClusterUrl({ + subscriptionId: 'sub-a', + resourceGroup: 'rg-a', + clusterName: 'cluster-a', + }); + expect(url).toContain( + '/subscriptions/sub-a/resourceGroups/rg-a/providers/Microsoft.Kubernetes/connectedClusters/cluster-a/overview' + ); + expect(url.startsWith('https://portal.azure.com/')).toBe(true); + }); + }); +}); diff --git a/plugins/aks-desktop/src/utils/azure/aksHybridEdgeProxy.ts b/plugins/aks-desktop/src/utils/azure/aksHybridEdgeProxy.ts new file mode 100644 index 000000000..400a115b5 --- /dev/null +++ b/plugins/aks-desktop/src/utils/azure/aksHybridEdgeProxy.ts @@ -0,0 +1,335 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache 2.0. + +import { ApiProxy } from '@kinvolk/headlamp-plugin/lib'; +import { getErrorMessage, runAzCommand } from './az-cli-core'; + +// The Electron preload exposes `window.desktopApi.send(channel, data)`. Proxy +// lifecycle is owned by the app (main) layer, so the plugin only sends +// start/stop intents by cluster name and observes the result via reachability. +// `desktopApi` is declared `any` globally by the app types, so we read it via a +// narrowly-typed cast rather than redeclaring the Window interface. +type DesktopApiSend = (channel: string, data: unknown) => void; +function getDesktopApiSend(): DesktopApiSend | undefined { + const api = (window as any)?.desktopApi; + return typeof api?.send === 'function' ? (api.send as DesktopApiSend) : undefined; +} + +/** Identifies an AKS Hybrid & Edge (Arc-connected) cluster the proxy can target. */ +export interface ProxyTarget { + /** Azure subscription GUID. */ + subscriptionId: string; + /** Azure resource group containing the cluster. */ + resourceGroup: string; + /** Arc-connected cluster name (also the kubeconfig context name). */ + clusterName: string; +} + +/** Result of a {@link startProxy} call. */ +export interface StartProxyResult { + success: boolean; + /** Error detail when `success` is false. */ + error?: string; +} + +/** How long a single reachability probe may take. */ +const REACHABILITY_TIMEOUT_MS = 5_000; + +/** + * Builds the Azure portal deep link to a connected cluster's Overview blade, + * where a user can inspect its health / "Current state" when it's Failed. + */ +export function azurePortalClusterUrl( + target: Pick +): string { + const resourceId = + `/subscriptions/${target.subscriptionId}/resourceGroups/${target.resourceGroup}` + + `/providers/Microsoft.Kubernetes/connectedClusters/${target.clusterName}`; + return `https://portal.azure.com/#@/resource${resourceId}/overview`; +} + +/** + * Asks the app (main) layer to start `az connectedk8s proxy` for a cluster. + * + * Fire-and-forget by design: the proxy is a long-running process owned by the + * main process, which is idempotent per cluster (a duplicate start is a no-op, + * so it never launches a second proxy or bounces the shared arcProxy daemon) and + * kills it on app quit. Real connectivity is confirmed by the caller via + * {@link verifyAksHybridEdgeCluster}. + * + * @param target - The cluster to proxy to. + */ +export async function startProxy(target: ProxyTarget): Promise { + const send = getDesktopApiSend(); + if (!send) { + return { success: false, error: 'Desktop bridge is not available.' }; + } + try { + send('start-aks-hybrid-edge-proxy', { + cluster: target.clusterName, + subscriptionId: target.subscriptionId, + resourceGroup: target.resourceGroup, + }); + return { success: true }; + } catch (error) { + return { success: false, error: getErrorMessage(error) }; + } +} + +/** + * Asks the app (main) layer to stop the proxy for a cluster. Keyed by cluster + * name, so it works even after a renderer reload (the renderer keeps no proxy + * state). The main process group-kills the proxy and its arcProxy daemon. + * + * @param clusterName - The cluster (context) name whose proxy to stop. + */ +export async function stopProxy( + clusterName: string +): Promise<{ success: boolean; error?: string }> { + const send = getDesktopApiSend(); + if (!send) { + // No bridge (e.g. non-app mode) — nothing to stop. + return { success: true }; + } + try { + send('stop-aks-hybrid-edge-proxy', { cluster: clusterName }); + return { success: true }; + } catch (error) { + return { success: false, error: getErrorMessage(error) }; + } +} + +/** + * Probes whether a cluster is reachable through Headlamp by listing a single + * namespace. This is the source of truth for whether the proxy is serving the + * cluster (the menu shows Stop when reachable, Start when not). + * + * @param clusterName - The kubeconfig context / Headlamp cluster name to probe. + */ +export async function checkClusterReachable( + clusterName: string +): Promise<{ success: boolean; error?: string }> { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), REACHABILITY_TIMEOUT_MS); + + try { + await ApiProxy.clusterRequest( + '/api/v1/namespaces', + { + cluster: clusterName, + isJSON: true, + autoLogoutOnAuthError: false, + signal: controller.signal, + }, + { limit: '1' } + ); + return { success: true }; + } catch (error) { + const aborted = + (error instanceof Error && error.name === 'AbortError') || controller.signal.aborted; + if (aborted) { + return { success: false, error: 'Timed out checking cluster reachability.' }; + } + return { success: false, error: getErrorMessage(error) }; + } finally { + clearTimeout(timer); + } +} + +/** Fetches the set of cluster (context) names Headlamp currently knows about. */ +async function getHeadlampClusterNames(): Promise> { + try { + // `/config` is a Headlamp-server endpoint (not cluster-scoped), so pass + // useCluster=false. It returns `{ clusters: [{ name, server, ... }] }` — an + // ARRAY of cluster objects (kubeconfig contexts the backend has loaded). + const config = await ApiProxy.request('/config', {}, false, false); + const clusters = (config && (config as any).clusters) ?? []; + const names = Array.isArray(clusters) + ? clusters.map((c: any) => c?.name).filter(Boolean) + : Object.keys(clusters); // defensive: tolerate a name-keyed object too + return new Set(names); + } catch { + return new Set(); + } +} + +/** + * Whether the cluster's context is present in Headlamp's kubeconfig-derived + * cluster list. `az connectedk8s proxy` writes the context to `~/.kube/config`; + * Headlamp's backend watches that file and loads new contexts within its watch + * interval, so this may only become true a few seconds after the proxy starts. + * + * @param clusterName - The kubeconfig context / Headlamp cluster name. + */ +export async function isClusterInKubeconfig(clusterName: string): Promise { + const names = await getHeadlampClusterNames(); + return names.has(clusterName); +} + +/** Outcome of {@link verifyAksHybridEdgeCluster}. */ +export interface VerifyResult { + success: boolean; + /** Whether the proxy added the cluster's context to kubeconfig. */ + inKubeconfig: boolean; + /** Whether the cluster answered a Kubernetes API probe through the proxy. */ + reachable: boolean; + /** + * The Azure runtime **"Current state"** (`status.currentState`), when it could + * be determined (only queried when a reachability failure needs explaining). + * A non-`Succeeded` value means the cluster is unhealthy in Azure — distinct + * from Arc connectivity, which may still be "Connected". + */ + currentState?: string; + error?: string; +} + +/** Runtime health of an AKS-Arc cluster, as reported by Azure. */ +export interface ClusterHealth { + /** + * The runtime **"Current state"** shown in the Azure portal (e.g. `Succeeded` + * or `Failed`). This is `status.currentState` on the provisioned-cluster + * instance — distinct from the connected cluster's `provisioningState` (which + * only reflects whether the ARM deployment finished) and from Arc + * connectivity ("Status"). A cluster can be Arc-Connected and have a + * `Succeeded` provisioningState yet a `Failed` currentState. + */ + currentState: string | null; + /** Azure's human-readable reason when the cluster is unhealthy. */ + errorMessage?: string; +} + +/** ARM API version for the HybridContainerService provisioned-cluster instance. */ +const PROVISIONED_CLUSTER_API_VERSION = '2024-01-01'; + +/** + * Reads the AKS-Arc cluster's runtime health (`status.currentState` and its + * `errorMessage`) from the `provisionedClusterInstances/default` resource via + * `az rest`. This is the "Current state" a user sees in the Azure portal — the + * field that actually goes `Failed` when the cluster is up in ARM but its + * Kubernetes API isn't reachable. + * + * Degrades gracefully: for a generic Arc-connected cluster (no AKS-Arc + * provisioned instance) the call 404s and this returns `{ currentState: null }`. + */ +export async function getClusterCurrentState( + target: Pick +): Promise { + const url = + `https://management.azure.com/subscriptions/${target.subscriptionId}` + + `/resourceGroups/${target.resourceGroup}` + + `/providers/Microsoft.Kubernetes/connectedClusters/${target.clusterName}` + + `/providers/Microsoft.HybridContainerService/provisionedClusterInstances/default` + + `?api-version=${PROVISIONED_CLUSTER_API_VERSION}`; + + const res = await runAzCommand( + ['rest', '--method', 'get', '--url', url, '--query', 'properties.status', '-o', 'json'], + '[AKS] Querying cluster current state:', + 'query cluster current state', + stdout => { + try { + const status = JSON.parse(stdout) as { currentState?: string; errorMessage?: string }; + return { currentState: status?.currentState ?? null, errorMessage: status?.errorMessage }; + } catch { + return { currentState: null }; + } + } + ); + return res.success && res.data ? res.data : { currentState: null }; +} + +/** + * Confirms a freshly-started AKS Hybrid & Edge cluster is usable in two ordered + * phases, so we never probe the cluster API before Headlamp knows about it: + * + * 1. **In kubeconfig** — poll `/config` until the backend has loaded the + * proxy-written context (`az connectedk8s proxy` writes it to + * `~/.kube/config`; the backend picks it up on its file-watch cycle). + * Probing the cluster API before this returns "cluster not found", so we + * wait for the context to appear first. + * 2. **Reachable** — then poll the Kubernetes API (`/api/v1/namespaces`) until + * the cluster answers (the Arc cluster-connect endpoint warms up in the + * background). + * + * Both phases share the overall budget and poll on a short fixed interval. + * + * @param clusterName - The kubeconfig context / Headlamp cluster name. + * @param options.timeoutMs - Overall budget (default 60s). + * @param options.intervalMs - Delay between poll attempts (default 2s). + * @param options.target - When provided, a Phase-2 (unreachable) failure queries + * the cluster's Azure `provisioningState` to explain *why* it's unreachable + * (e.g. the cluster is in a `Failed` state, not a proxy problem). + */ +export async function verifyAksHybridEdgeCluster( + clusterName: string, + options: { + timeoutMs?: number; + intervalMs?: number; + target?: Pick; + } = {} +): Promise { + const timeoutMs = options.timeoutMs ?? 60_000; + const intervalMs = options.intervalMs ?? 2_000; + const deadline = Date.now() + timeoutMs; + + const delay = () => new Promise(resolve => setTimeout(resolve, intervalMs)); + + // Phase 1 — wait for the backend to load the proxy-written context. No + // cluster-API probe happens until this succeeds. + while (!(await isClusterInKubeconfig(clusterName))) { + if (Date.now() >= deadline) { + return { + success: false, + inKubeconfig: false, + reachable: false, + error: + 'The proxy did not add the cluster to kubeconfig in time. ' + + 'The cluster may be stopped or its Azure Arc agents may be offline.', + }; + } + await delay(); + } + + // Phase 2 — context is loaded; now wait until the cluster answers the API. + // eslint-disable-next-line no-constant-condition + while (true) { + const reachable = await checkClusterReachable(clusterName); + if (reachable.success) { + return { success: true, inKubeconfig: true, reachable: true }; + } + if (Date.now() >= deadline) { + // The proxy is up (context is loaded) but the cluster's API never + // answered. When we have the Azure coordinates, ask Azure *why*: a + // non-`Succeeded` currentState means the cluster itself is unhealthy — + // something AKS Desktop can't fix — as opposed to a transient timeout. + let currentState: string | undefined; + let azureReason: string | undefined; + if (options.target) { + const health = await getClusterCurrentState({ + subscriptionId: options.target.subscriptionId, + resourceGroup: options.target.resourceGroup, + clusterName, + }); + currentState = health.currentState ?? undefined; + azureReason = health.errorMessage; + } + + const unhealthy = !!currentState && currentState !== 'Succeeded'; + const error = unhealthy + ? `Cluster "${clusterName}" is in a "${currentState}" state in Azure` + + (azureReason ? `: ${azureReason}` : '.') + + ' Azure Arc connectivity is fine, but the cluster is not responding, so it ' + + "cannot be reached. This can't be fixed from AKS Desktop — check the " + + "cluster's health in the Azure portal." + : reachable.error; + + return { + success: false, + inKubeconfig: true, + reachable: false, + currentState, + error, + }; + } + await delay(); + } +} diff --git a/plugins/aks-desktop/src/utils/azure/az-clusters.test.ts b/plugins/aks-desktop/src/utils/azure/az-clusters.test.ts new file mode 100644 index 000000000..f6ab23c4f --- /dev/null +++ b/plugins/aks-desktop/src/utils/azure/az-clusters.test.ts @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache 2.0. + +import { beforeEach, describe, expect, test, vi } from 'vitest'; + +const mockRunCommandAsync = vi.hoisted(() => vi.fn()); + +// `getConnectedClusters` runs `az connectedk8s list` through the shared command +// runner; mock it so we can feed representative discovery output. +vi.mock('../shared/runCommandAsync', () => ({ + runCommandAsync: mockRunCommandAsync, +})); + +import { getConnectedClusters } from './az-clusters'; + +// A realistic `az connectedk8s list` payload mixing AKS-Arc (kind +// "ProvisionedCluster") and generic Arc clusters (kind null). +const LIST_OUTPUT = [ + { + name: 'santhosh-new-bm-aks', + resourceGroup: 'santhosh-new-bm-aks', + kind: 'ProvisionedCluster', + distribution: 'aks_workload', + infrastructure: 'BareMetalLinux', + connectivityStatus: 'Connected', + }, + { + name: 'onpremk8s05', + resourceGroup: 'rg-generic', + kind: null, + distribution: 'kind', + infrastructure: 'generic', + connectivityStatus: 'Connected', + }, + { + name: '37068816-5842-439f-9488-287464ea1d03', + resourceGroup: 'rg-hci', + kind: null, + distribution: '', + infrastructure: 'azure_stack_hci', + connectivityStatus: 'Connected', + }, +]; + +describe('getConnectedClusters — only AKS-Arc (ProvisionedCluster) clusters', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + test('returns only clusters with kind "ProvisionedCluster", tagged aksarc', async () => { + mockRunCommandAsync.mockResolvedValue({ stdout: JSON.stringify(LIST_OUTPUT), stderr: '' }); + + const result = await getConnectedClusters('sub-a'); + + expect(result.map(c => c.name)).toEqual(['santhosh-new-bm-aks']); + expect(result[0].clusterType).toBe('aksarc'); + // Generic Arc clusters (kind null) are excluded entirely. + expect(result.some(c => c.name === 'onpremk8s05')).toBe(false); + }); + + test('returns an empty list when only generic Arc clusters are present', async () => { + mockRunCommandAsync.mockResolvedValue({ + stdout: JSON.stringify(LIST_OUTPUT.filter(c => c.kind !== 'ProvisionedCluster')), + stderr: '', + }); + + const result = await getConnectedClusters('sub-a'); + expect(result).toEqual([]); + }); + + test('is resilient: returns empty on a failed/empty connectedk8s call', async () => { + mockRunCommandAsync.mockResolvedValue({ stdout: '', stderr: 'ERROR: extension missing' }); + const result = await getConnectedClusters('sub-a'); + expect(result).toEqual([]); + }); +}); diff --git a/plugins/aks-desktop/src/utils/azure/az-clusters.ts b/plugins/aks-desktop/src/utils/azure/az-clusters.ts index c964ebf54..da453b509 100644 --- a/plugins/aks-desktop/src/utils/azure/az-clusters.ts +++ b/plugins/aks-desktop/src/utils/azure/az-clusters.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the Apache 2.0. import type { ClusterCapabilities } from '../../types/ClusterCapabilities'; -import { debugLog, isAzError, needsRelogin, runCommandAsync } from './az-cli-core'; +import { debugLog, isAzError, needsRelogin, runAzCommand, runCommandAsync } from './az-cli-core'; import { getClusterResourceGroupViaGraph, getClustersViaGraph } from './az-resource-graph'; import { getSubscriptions } from './az-subscriptions'; @@ -107,6 +107,82 @@ export async function getClusters(subscriptionId?: string, query?: string): Prom return clusters; } +/** + * Discovers Arc-connected (AKS Hybrid & Edge / AKS Arc) Kubernetes clusters in a + * subscription via `az connectedk8s list`. + * + * Each returned cluster carries a `clusterType: 'aksarc'` discriminator so + * callers can tell AKS Hybrid & Edge clusters apart from managed AKS clusters. + * + * This function is intentionally resilient: if the `connectedk8s` CLI + * extension is missing, or the call fails for any other reason, it returns an + * empty list rather than throwing. AKS Hybrid & Edge discovery is additive and must + * never prevent the standard AKS cluster list from loading. + * + * @param subscriptionId - Azure subscription GUID to query. + * @returns An array of AKS Hybrid & Edge cluster objects, possibly empty. + */ +export async function getConnectedClusters(subscriptionId: string): Promise { + const clusters: any[] = []; + + // AKS Hybrid & Edge discovery is additive and must never block the standard AKS + // list, so any failure — missing `connectedk8s` extension, no access, relogin + // needed, or non-array/invalid output — resolves to an empty list. runAzCommand + // gives us the same relogin/isAzError handling as the other Azure helpers; a + // throwing JSON.parse is caught by it and reported as `success: false`. + const result = await runAzCommand( + ['connectedk8s', 'list', '--subscription', subscriptionId, '-o', 'json'], + 'Listing connectedk8s clusters:', + 'list AKS Hybrid & Edge clusters', + stdout => { + if (!stdout) { + return []; + } + const parsed = JSON.parse(stdout); + return Array.isArray(parsed) ? parsed : []; + } + ); + + if (!result.success || !result.data) { + debugLog('Skipping AKS Hybrid & Edge discovery:', result.error ?? 'no clusters returned'); + return clusters; + } + + result.data.forEach((cluster: any) => { + // `az connectedk8s list` returns *every* Azure Arc-enabled Kubernetes + // cluster, but only AKS-Arc (AKS Hybrid & Edge / baremetal) clusters are + // reported with `kind: "ProvisionedCluster"`. Generic Arc-connected + // clusters — a kind/k3s/Azure-Local cluster merely attached via + // `az connectedk8s connect` — have `kind: null` and are NOT AKS Hybrid & + // Edge, so they must not be offered, tagged `aksarc`, badged, or given the + // proxy Start/Stop actions. + if (cluster.kind !== 'ProvisionedCluster') { + debugLog( + 'Skipping non-AKS-Arc connected cluster:', + cluster.name, + `(kind=${cluster.kind ?? 'null'}, distribution=${cluster.distribution ?? ''})` + ); + return; + } + clusters.push({ + name: cluster.name, + subscription: subscriptionId, + resourceGroup: cluster.resourceGroup, + location: cluster.location, + version: cluster.kubernetesVersion || cluster.agentVersion || '', + status: cluster.provisioningState || cluster.connectivityStatus || 'Unknown', + powerState: cluster.connectivityStatus || 'Unknown', + // Arc agent heartbeat status ('Connected' | 'Offline' | 'Expired'…). + // Used to disable clusters that can't be reached before the user tries. + connectivityStatus: cluster.connectivityStatus || 'Unknown', + nodeCount: 0, + clusterType: 'aksarc', + }); + }); + + return clusters; +} + export async function getAksClusterStatus(options: { subscriptionId: string; resourceGroup: string; diff --git a/plugins/aks-desktop/src/utils/shared/clusterSettings.ts b/plugins/aks-desktop/src/utils/shared/clusterSettings.ts index f6e0f85ec..08d6d9574 100644 --- a/plugins/aks-desktop/src/utils/shared/clusterSettings.ts +++ b/plugins/aks-desktop/src/utils/shared/clusterSettings.ts @@ -3,9 +3,60 @@ export interface ClusterSettings { allowedNamespaces?: string[]; + /** + * Discriminator persisted at registration time. Only `'aksarc'` is stored, for + * Arc-connected (AKS Hybrid & Edge) clusters — it identifies them in the list + * view and enables the proxy actions. Managed AKS clusters leave this unset, so + * absence implies a managed cluster. + */ + clusterType?: 'aks' | 'aksarc'; + /** Azure subscription ID owning the cluster (needed for AKS Hybrid & Edge proxy actions). */ + subscriptionId?: string; + /** Azure resource group containing the cluster (needed for AKS Hybrid & Edge proxy actions). */ + resourceGroup?: string; + /** + * Per-cluster badge appearance. Shared verbatim with Headlamp core, which + * reads `appearance.icon` / `appearance.accentColor` from this same + * localStorage key to render the cluster-name badge on the Home table. + */ + appearance?: { + accentColor?: string; + icon?: string; + }; [key: string]: unknown; } +/** + * Iconify icon and accent color used to mark AKS Hybrid & Edge (Arc-connected) clusters + * on the Home cluster-name badge. `#0078d4` is the Azure brand blue. + */ +export const AKS_HYBRID_EDGE_BADGE_ICON = 'mdi:server'; +export const AKS_HYBRID_EDGE_BADGE_ACCENT = '#0078d4'; + +/** + * Gives an AKS Hybrid & Edge cluster a distinct name-badge (server icon + Azure-blue + * accent) by writing Headlamp's `appearance` fields on the shared cluster + * settings. Read-modify-write so unrelated settings are preserved; a + * user-chosen icon is left untouched. + * + * @param clusterName - The kubeconfig context / Headlamp cluster name. + */ +export function markAksHybridEdgeAppearance(clusterName: string): void { + if (!clusterName) { + return; + } + const existing = getClusterSettings(clusterName); + const appearance = existing.appearance ?? {}; + setClusterSettings(clusterName, { + ...existing, + appearance: { + ...appearance, + icon: appearance.icon ?? AKS_HYBRID_EDGE_BADGE_ICON, + accentColor: appearance.accentColor ?? AKS_HYBRID_EDGE_BADGE_ACCENT, + }, + }); +} + /** * Reads and parses cluster settings from localStorage. * Returns a plain object with the parsed settings,