feat(i18n): localize frontend components and add missing translations

- Replaced hardcoded UI strings with translation keys across frontend files
- Added and updated English(en) and Khmer(km) translation files for settings, notifications, and server components
- Improved localization and multi-language support throughout the frontend
This commit is contained in:
lyker189
2025-10-02 05:10:11 +07:00
parent a4364936e3
commit b6ef4ff7a5
62 changed files with 2721 additions and 639 deletions
+71
View File
@@ -0,0 +1,71 @@
import { DockerTranslations } from '../types/docker';
export const dockerTranslations: DockerTranslations = {
dockerContainers: "Docker Containers",
container: "Container",
status: "Status",
cpuUsage: "CPU Usage",
memory: "Memory",
disk: "Disk",
uptime: "Uptime",
lastChecked: "Last Checked",
actions: "Actions",
searchContainersPlaceholder: "Search containers...",
refresh: "Refresh",
openMenu: "Open menu",
viewMetrics: "View Metrics",
viewDetails: "View Details",
running: "Running",
stopped: "Stopped",
warning: "Warning",
unknown: "Unknown",
totalContainers: "Total Containers",
containersLabel: "Containers",
noContainersFound: "No containers found",
noContainersRunning: "No containers running",
tryAdjustSearch: "Try adjusting your search terms.",
startSomeContainers: "Start some containers to see them here.",
containerMetricsTitle: "Container Metrics: {name}",
dockerId: "Docker ID",
loadingMetrics: "Loading metrics...",
errorLoadingMetrics: "Error loading metrics",
noMetricsAvailable: "No metrics data available for this container",
minutes60: "60 minutes",
day1: "1 day",
days7: "7 days",
month1: "1 month",
months3: "3 months",
used: "Used:",
free: "Free:",
total: "Total:",
usage: "Usage:",
cpu: "CPU",
memoryTitle: "Memory",
diskTitle: "Disk",
network: "Network",
cpuUsagePct: "CPU Usage (%)",
cpuUsageVsAvailable: "CPU Usage vs Available",
cpuAvailablePct: "CPU Available (%)",
ramUsagePct: "RAM Usage (%)",
memoryUsageBytes: "Memory Usage (Bytes)",
usedMemory: "Used Memory",
totalMemory: "Total Memory",
diskUsagePct: "Disk Usage (%)",
diskUsageBytes: "Disk Usage (Bytes)",
usedDisk: "Used Disk",
totalDisk: "Total Disk",
networkTraffic: "Network Traffic",
networkSpeedKbs: "Network Speed (KB/s)",
rxBytes: "RX Bytes",
txBytes: "TX Bytes",
rxSpeedKbs: "RX Speed (KB/s)",
txSpeedKbs: "TX Speed (KB/s)",
};
+11 -1
View File
@@ -9,6 +9,11 @@ import { maintenanceTranslations } from './maintenance';
import { incidentTranslations } from './incident';
import { sslTranslations } from './ssl';
import { settingsTranslations } from './settings';
import { instanceTranslations } from './instance';
import { operationTranslations } from './operation';
import { regionTranslations } from './region';
import { dockerTranslations } from './docker';
import { publicTranslations } from './public';
const enTranslations: Translations = {
common: commonTranslations,
@@ -19,7 +24,12 @@ const enTranslations: Translations = {
maintenance: maintenanceTranslations,
incident: incidentTranslations,
ssl: sslTranslations,
settings: settingsTranslations
settings: settingsTranslations,
instance: instanceTranslations,
operation: operationTranslations,
region: regionTranslations,
docker: dockerTranslations,
public: publicTranslations
};
export default enTranslations;
+169
View File
@@ -0,0 +1,169 @@
import { InstanceTranslations } from '../types/instance';
export const instanceTranslations: InstanceTranslations = {
// InstanceMonitoring.tsx
instanceMonitoring: "Instance Monitoring",
describeMonitorInstance: "Monitor and manage your server instances in real-time",
addServerAgent: "Add Server Agent",
errorLoadingServers: "Error loading servers",
unableToFetchServerData: "Unable to fetch server data. Please check your connection and try again.",
retry: "Retry",
// ServerTable.tsx
servers: "Servers",
loadingServers: "Loading servers...",
searchServersPlaceholder: "Search servers...",
noServersFound: "No servers found",
name: "Name",
status: "Status",
OS: "OS",
IPAddress: "IP Address",
CPU: "CPU",
memory: "Memory",
disk: "Disk",
uptime: "Uptime",
lastChecked: "Last Checked",
actions: "Actions",
viewServerDetail: "View Server Detail",
containerMonitoring: "Container Monitoring",
resumeMonitoring: "Resume Monitoring",
pauseMonitoring: "Pause Monitoring",
editServer: "Edit Server",
deleteServer: "Delete Server",
deleteServerConfirmTitle: "Are you sure you want to delete this server?",
deleteServerConfirmDesc: "This action cannot be undone. This will permanently delete {name} and all of its monitoring data.",
cancel: "Cancel",
deleting: "Deleting...",
delete: "Delete",
serverDeleted: "Server deleted",
serverDeletedDesc: "{name} has been deleted successfully.",
error: "Error",
deleteServerError: "Failed to delete server. Please try again.",
serverPaused: "Server paused",
serverResumed: "Server resumed",
monitoringPaused: "Monitoring paused for {name}",
monitoringResumed: "Monitoring resumed for {name}",
pauseServerError: "Failed to pause server monitoring. Please try again.",
resumeServerError: "Failed to resume server monitoring. Please try again.",
// server cards
totalServers: "TOTAL SERVERS",
onlineServers: "ONLINE SERVERS",
offlineServers: "OFFLINE SERVERS",
warningServers: "WARNING SERVERS",
// AddServerAgentDialog.tsx
addServerMonitoringAgent: "Add Server Monitoring Agent",
configureAgentDesc: "Configure a new server monitoring agent to track system metrics and performance.",
configureAgent: "Configure Agent",
oneClickInstall: "One-Click Install",
dockerOneClick: "Docker One-Click",
manualInstallation: "Manual Installation",
validationError: "Validation Error",
fillRequiredFields: "Please fill in all required fields.",
serverAgentCreated: "Server Agent Created",
serverAgentCreatedDesc: "{name} monitoring agent has been configured successfully.",
failedToCreateAgent: "Failed to create server monitoring agent.",
// ServerAgentConfigForm.tsx
serverName: "Server Name",
serverNamePlaceholder: "e.g., web-server-01",
serverNameDesc: "What is the name or label used as the identifier",
serverAgentId: "Server Agent ID",
serverAgentIdDesc: "Auto-generated unique identifier",
operatingSystem: "Operating System",
checkInterval: "Check Interval",
selectInterval: "Select interval",
interval30s: "30 seconds",
interval1m: "1 minute",
interval2m: "2 minutes",
interval5m: "5 minutes",
checkIntervalDesc: "How often to check the server and metric status",
retryAttempts: "Retry Attempts",
selectRetryAttempts: "Select retry attempts",
attempt1: "1 attempt",
attempt2: "2 attempts",
attempt3: "3 attempts",
attempt5: "5 attempts",
retryAttemptsDesc: "Number of retry attempts before marking as down",
serverToken: "Server Token",
serverTokenDesc: "Auto-generated authentication token",
systemUrl: "System URL",
systemUrlDesc: "Current system API URL",
creatingAgent: "Creating Agent...",
createServerAgent: "Create Server Agent"
,
// EditServerDialog.tsx
editServerConfiguration: "Edit Server Configuration",
serverNameLabel: "Server Name *",
enterServerNamePlaceholder: "Enter server name",
checkIntervalLabel: "Check Interval",
interval10m: "10 minutes",
maxRetriesLabel: "Max Retries",
selectMaxRetries: "Select max retries",
retry1: "1 retry",
retry2: "2 retries",
retry3: "3 retries",
retry5: "5 retries",
retry10: "10 retries",
dockerMonitoring: "Docker Monitoring",
enabled: "Enabled",
disabled: "Disabled",
enableNotifications: "Enable Notifications",
notificationSettings: "Notification Settings",
notificationChannels: "Notification Channels",
loadingChannels: "Loading channels...",
noChannelsAvailable: "No notification channels available",
selectedChannels: "Selected Channels:",
serverSetThreshold: "Server Set Threshold",
loadingThresholds: "Loading thresholds...",
selectServerThreshold: "Select server threshold",
noThreshold: "No threshold (use default)",
thresholdDetails: "Threshold Details",
cpuThresholdPct: "CPU Threshold (%)",
ramThresholdPct: "RAM Threshold (%)",
diskThresholdPct: "Disk Threshold (%)",
networkThresholdPct: "Network Threshold (%)",
serverTemplate: "Server Template",
loadingTemplates: "Loading templates...",
selectServerTemplate: "Select server template",
noTemplate: "No template (use default)",
templateDetails: "Template Details",
ramMessage: "RAM Message",
cpuMessage: "CPU Message",
diskMessage: "Disk Message",
networkMessage: "Network Message",
upMessage: "Up Message",
downMessage: "Down Message",
noMessageDefined: "No {name} message defined",
serverUpdated: "Server updated",
serverUpdatedDesc: "{name} has been updated successfully.",
updating: "Updating...",
updateServer: "Update Server",
failedToLoadChannels: "Failed to load notification channels",
failedToLoadTemplates: "Failed to load templates",
failedToLoadThresholds: "Failed to load server thresholds",
warning: "Warning",
serverUpdatedButThresholdFailed: "Server updated but failed to update threshold values.",
failedToUpdateServer: "Failed to update server. Please try again.",
// ServerHistoryCharts.tsx
historicalPerformance: "Historical Performance",
loading: "Loading...",
errorLoadingChartData: "Error loading chart data",
noHistoricalData: "No historical data available for {{timeRange}}",
rawMetricsCount: "Raw metrics count: {{count}}",
serverIdTimeRange: "Server ID: {{serverId}} • Time Range: {{timeRange}}",
dataExistsOutsideRange: "Data exists but may be outside selected time range",
noMetricsDataFound: "No metrics data found",
dataPointsTimeRange: "{{count}} data points • {{timeRange}}",
// updating: "Updating...",
};
@@ -0,0 +1,87 @@
import { OperationTranslations } from '../types/operation';
export const operationTranslations: OperationTranslations = {
// OperationalPageContent.tsx
failedToLoadOperationalPages: "Failed to load operational pages",
loadingoperationalPages: "There was an error loading your operational pages. Please try again.",
tryagain: "Try Again",
operationalPages: "Operational Pages",
describeOperation: "Manage your public status pages and monitor service health",
refresh: "Refresh",
noOperationalPagesFound: "No operational pages found",
createYourFirstOperationalPage: "Create your first operational page to start monitoring your services and communicate status to your users.",
totalPages: "Total Pages",
publicPages: "Public Pages",
operational: "Operational",
deleteOperationalPage: "Delete Operational Page",
deleteOperationalPageConfirm: 'Are you sure you want to delete "{title}"? This action cannot be undone and will permanently remove the operational page and all its components.',
cancel: "Cancel",
delete: "Delete",
deleting: "Deleting...",
// EditOperationalPageDialog.tsx
editOperationalPage: "Edit Operational Page",
updateYourOperationalPage: "Update your operational status page settings and manage components.",
title: "Title",
myServiceStatusPlaceholder: "My Service Status",
slug: "Slug",
myServiceStatusSlugPlaceholder: "my-service-status",
description: "Description",
operationalPageDescriptionPlaceholder: "A brief description of your operational page",
theme: "Theme",
selectTheme: "Select theme",
themeDefault: "Default",
themeDark: "Dark",
themeLight: "Light",
status: "Status",
selectStatus: "Select status",
statusOperational: "Operational",
statusDegraded: "Degraded Performance",
statusMaintenance: "Under Maintenance",
statusMajorOutage: "Major Outage",
publicPage: "Public Page",
makePagePublic: "Make this page publicly accessible",
customDomainOptional: "Custom Domain (Optional)",
customDomainPlaceholder: "status.yourdomain.com",
customDomainDescription: "Custom domain for your status page",
cancelUpdate: "Cancel",
updating: "Updating...",
updatePage: "Update Page",
// ComponentsSelector.tsx
statusPageComponents: "Status Page Components",
addMonitoringComponentsDesc: "Add monitoring components like uptime services, SSL certificates, and incident tracking",
selectedComponents: "Selected Components",
service: "Service",
server: "Server",
addComponent: "Add Component",
componentName: "Component Name",
componentNamePlaceholder: "e.g., Main Website",
displayOrder: "Display Order",
descriptionOptional: "Description (Optional)",
descriptionPlaceholder: "Brief description of this component",
uptimeServiceOptional: "Uptime Service (Optional)",
selectUptimeService: "Select an uptime service",
serverIdOptional: "Server ID (Optional)",
serverIdPlaceholder: "server_456",
cancelComponent: "Cancel",
// OperationalPageCard.tsx
public: "Public",
yes: "Yes",
no: "No",
updated: "Updated",
view: "View",
edit: "Edit",
// CreateOperationalPageDialog.tsx
createOperationalPage: "Create Operational Page",
createOperationalPageDesc: "Create a new operational status page to monitor your services and components.",
createPage: "Create Page",
creating: "Creating...",
initialStatus: "Initial Status",
};
+23
View File
@@ -0,0 +1,23 @@
import { PublicTranslations } from '../types/public';
export const publicTranslations: PublicTranslations = {
systemStatus: "System Status",
allOperational: "All systems are operational",
degradedPerformance: "Some systems are experiencing degraded performance",
underMaintenance: "Systems are currently under maintenance",
majorOutage: "We are experiencing a major service outage",
statusUnknown: "Status unknown",
autoUpdatedByHealth: "Status automatically updated based on component health",
lastUpdatedAt: "Last updated: {time} UTC",
liveStatusMonitoring: "Live status monitoring",
loadingStatusPage: "Loading Status Page",
fetchingRealtimeStatus: "Fetching real-time system status...",
slugLabel: "Slug",
statusPageNotFound: "Status Page Not Found",
notFoundDescription: "The requested status page could not be found or is not publicly accessible.",
goBack: "Go Back",
retry: "Retry",
};
+94
View File
@@ -0,0 +1,94 @@
import { RegionTranslations } from '../types/region';
export const regionTranslations: RegionTranslations = {
//RegionalMonitoringContent.tsx
regionalmonitoring: "Regional Monitoring",
descriptRegionPage: "Monitor your infrastructure from multiple regions for better reliability.",
addRegionalAgent: "Add Regional Agent",
totalAgents: "Total Agents",
regionalMonitoringAgents: "Regional monitoring agents",
onlineAgents: "Online Agents",
currentlyConnected: "Currently connected",
offlineAgents: "Offline Agents",
disconnectedAgents: "Disconnected agents",
regionalAgents: "Regional Agents",
noRegionalAgents: "No Regional Agents",
getStartedAddAgent: "Get started by adding your first regional monitoring agent to extend your monitoring coverage.",
addFirstAgent: "Add First Agent",
agentRemoved: "Agent Removed",
agentRemovedDesc: "The regional monitoring agent has been removed.",
regionalAgentAdded: "Regional Agent Added",
regionalAgentAddedDesc: "The regional monitoring agent has been successfully configured.",
error: "Error",
failedToRemoveAgent: "Failed to remove the regional monitoring agent.",
//AddRegionalAgentDialog.tsx
addRegionalMonitoringAgent: "Add Regional Monitoring Agent",
deployRegionalMonitoringAgent: "Deploy a regional monitoring agent with automatic one-click installation.",
regionName: "Region Name",
regionNamePlaceholder: "e.g., us-east-1, europe-west-1, asia-pacific-1",
agentServerIpAddress: "Agent Server IP Address",
agentIpPlaceholder: "e.g., 192.168.1.100 or your-server.example.com",
cancel: "Cancel",
generateInstallation: "Generate Installation",
generating: "Generating...",
agentConfigurationReady: "Agent Configuration Ready!",
oneClickInstallScriptGenerated: "One-click installation script generated with automatic configuration.",
oneClickInstallTab: "One-Click Install",
agentDetailsTab: "Agent Details",
manualInstallTab: "Manual Install",
oneClickAutomaticInstallation: "One-Click Automatic Installation",
completeInstallationDescription: "Complete installation, configuration, and service startup in one command",
whatThisScriptDoes: "What this script does automatically:",
scriptActionDownload: "Downloads the latest .deb package",
scriptActionInstall: "Installs the regional monitoring agent",
scriptActionConfigure: "Creates configuration file with your settings",
scriptActionStart: "Starts and enables the service",
scriptActionHealthChecks: "Runs health checks",
runCommandOnServer: "Run this command on your target server:",
downloadCompleteScript: "Download Complete Script",
copyFullScript: "Copy Full Script",
localDevelopmentNotice: "<strong>Local Development Notice:</strong> If clipboard copying fails, this is normal in local development. You can use the 'Download Complete Script' button instead or manually copy the text.",
generatedAgentConfiguration: "Generated Agent Configuration",
autoConfiguredDuringInstallation: "These values will be automatically configured during installation",
agentId: "Agent ID",
regionNameDetail: "Region Name",
serverIp: "Server IP",
apiEndpoint: "API Endpoint",
authenticationToken: "Authentication Token",
configurationFileLocation: "<strong>Configuration file location:</strong> /etc/regional-check-agent/regional-check-agent.env",
manualInstallationSteps: "Manual Installation Steps",
stepByStepManualInstallation: "Step-by-step manual installation process",
step1DownloadPackage: "Step 1: Download Package",
downloadAmd64Notice: "✅ If youre using the amd64 architecture, please download this package.",
downloadArm64Notice: "✅ If youre using the arm64 architecture, please download this package.",
step2InstallPackage: "Step 2: Install Package",
step3ConfigureAgent: "Step 3: Configure Agent",
copySampleConfiguration: "Copy sample configuration from https://github.com/operacle/Distributed-Regional-Monitoring/blob/main/packaging/regional-check-agent.conf",
addConfigurationValues: "Add the configuration values shown in the Agent Details tab",
step4StartService: "Step 4: Start Service",
step5VerifyInstallation: "Step 5: Verify Installation",
addAnotherAgent: "Add Another Agent",
completeSetup: "Complete Setup",
copied: "Copied!",
copiedDescription: "{description} copied to clipboard.",
copyFailed: "Copy failed",
copyFailedDescription: "Failed to copy to clipboard.",
copyFailedLocalhost: "This is common in local development. Please manually copy the text.",
copyFailedChrome: "Try using HTTPS or enable clipboard permissions.",
downloaded: "Downloaded!",
downloadedDescription: "Installation script downloaded successfully.",
failedToCreateAgent: "Failed to create regional agent configuration.",
//RegionalAgentCard.tsx
defaultBadge: "Default",
copyAgentId: "Copy Agent ID",
removeAgent: "Remove Agent",
online: "Online",
offline: "Offline",
lastUpdated: "Last Updated:",
activeMonitoring: "Active monitoring",
connectionLost: "Connection lost",
};
@@ -136,4 +136,65 @@ export const servicesTranslations: ServicesTranslations = {
processing: "Processing",
back: "Back",
last20Checks: "Last 20 checks",
//OneClickInstallTab.tsx
oneClickInstallTitle: "One-Click Install (Recommended)",
oneClickInstallDesc: "Copy and paste this single command to install the monitoring agent instantly",
quickInstallCommand: "Quick Install Command",
copy: "Copy",
runCommandOnServer: "Simply run this command on your server:",
sshIntoServer: "SSH into your target server",
pasteAndRun: "Paste and run the command above",
agentInstalled: "The agent will be installed and started automatically",
done: "Done",
// DockerOneClickTab.tsx
dockerOneClickTitle: "Docker One-Click Install",
dockerOneClickDesc: "Automated Docker container installation with system monitoring capabilities",
dockerOneClickCommand: "Docker One-Click Command",
dockerScriptWill: "This script will automatically:",
dockerScriptStep1: "Download and setup the Docker monitoring agent",
dockerScriptStep2: "Configure all required environment variables",
dockerScriptStep3: "Start the container with proper system access",
dockerScriptStep4: "Setup monitoring data persistence",
directDockerTitle: "Direct Docker Run Command",
directDockerDesc: "If you prefer to run the Docker container directly without the script",
dockerRunCommand: "Docker Run Command",
dockerPrerequisites: "Prerequisites for direct Docker run:",
dockerPrereqStep1: "Docker must be installed and running",
dockerPrereqStep2: "The operacle/checkcle-server-agent image must be available",
dockerPrereqStep3: "Run as root or with sudo privileges",
// ManualInstallTab.tsx
manualInstallTitle: "Manual Installation Steps",
manualInstallDesc: "Step-by-step installation process",
serverName: "Server Name",
agentId: "Agent ID",
osType: "OS Type",
downloadScript: "Download the installation script",
makeExecutable: "Make the script executable",
runInstall: "Run the installation with your configuration",
prerequisites: "Prerequisites:",
prereqRoot: "Ensure you have root/sudo access on the target server",
prereqCurl: "Make sure curl is installed for downloading files",
prereqInternet: "Internet connection required for downloading script",
afterInstall: "After Installation:",
agentWillStart: "The agent will start automatically and appear in your dashboard within a few minutes.",
// ServerDetail.tsx
errorLoadingServer: "Error loading server",
unableToFetchServerData: "Unable to fetch server data. Please check your connection and try again.",
backToServers: "Back to Servers",
loadingServerDetails: "Loading server details...",
serverDetail: "Server Detail",
monitorServerMetrics: "Monitor server performance metrics and system health",
serverHostnameIpOs: "{hostname} • {ip_address} • {os_type}",
// ContainerMonitoring.tsx
errorLoadingContainers: "Error loading containers",
unableToFetchContainerData: "Unable to fetch container data. Please check your connection and try again.",
errorUnknown: "Unknown error",
containerMonitoring: "Container Monitoring",
monitorAndManageContainers: "Monitor and manage your Docker containers in real-time",
serverIdLabel: "Server ID",
};
+104
View File
@@ -60,4 +60,108 @@ export const settingsTranslations: SettingsTranslations = {
permissionNoticeAddUser: "As an admin user, you do not have access to view or modify system and mail settings. These settings can only be accessed and modified by Super Admins. Contact your Super Admin if you need to make changes to system configuration or mail settings.",
loadingSettings: "Loading settings...",
loadingSettingsError: "Error loading settings",
//NotificationSettings.ts
titleNotification: "Notification Settings",
descriptionChannelsServices: "Configure notification channels for your services",
addChannel: "Add Channel",
all: "All Channels",
telegram: "Telegram",
discord: "Discord",
slack: "Slack",
signal: "Signal",
googleChat: "Google Chat",
email: "Email",
webhook: "Webhook",
// NotificationChannelDialog.tsx
editChannel: "Edit Notification Channel",
addChannelDialog: "Add Notification Channel",
channelName: "Channel Name",
channelNameDesc: "A name to identify this notification channel",
channelType: "Channel Type",
selectType: "Select notification type",
enabled: "Enabled",
enabledDesc: "Enable or disable this notification channel",
cancel: "Cancel",
updateChannel: "Update Channel",
createChannel: "Create Channel",
payloadTemplates: "Payload Templates",
availablePlaceholders: "Available Placeholders:",
server: "Server",
service: "Service",
ssl: "SSL",
common: "Common",
webhookUrl: "Webhook URL",
webhookUrlDesc: "The URL where webhook notifications will be sent",
payloadTemplate: "Payload Template (Optional)",
payloadTemplateDesc: "JSON template for the webhook payload. Leave empty to use default template.",
telegramChatId: "Chat ID",
telegramChatIdDesc: "The Telegram chat ID to send notifications to",
botToken: "Bot Token",
botTokenDesc: "Your Telegram bot token from @BotFather",
discordWebhookUrl: "Webhook URL",
discordWebhookUrlDesc: "Discord webhook URL from your server settings",
slackWebhookUrl: "Webhook URL",
slackWebhookUrlDesc: "Slack incoming webhook URL",
signalNumber: "Signal Number",
signalNumberDesc: "Signal phone number to send notifications to",
signalApiEndpoint: "Signal API Endpoint",
signalApiEndpointDesc: "The Rest API endpoint for your Signal service",
googleChatWebhookUrl: "Google Chat Webhook URL",
googleChatWebhookUrlDesc: "Google Chat webhook URL from your Google Chat space",
emailAddress: "Email Address",
emailAddressDesc: "Email address to send notifications to",
emailSenderName: "Sender Name",
emailSenderNameDesc: "Display name for outgoing emails",
smtpServer: "SMTP Server",
// smtpPort: "SMTP Port",
// smtpPassword: "SMTP Password",
smtpPasswordDesc: "Password for authenticating with the SMTP server",
ntfyEndpoint: "NTFY Endpoint",
ntfyEndpointDesc: "The NTFY endpoint URL including your topic (e.g., https://ntfy.sh/checkcle)",
apiToken: "API Token",
apiTokenOptional: "API Token (Optional)",
apiTokenDesc: "Optional API token for authentication with NTFY server",
pushoverUserKey: "User Key",
pushoverUserKeyDesc: "Your Pushover user key (or group key)",
notifiarrChannelId: "Channel ID",
notifiarrChannelIdDesc: "The Discord channel ID where notifications will be sent",
gotifyServerUrl: "Server URL",
gotifyServerUrlDesc: "The URL of your Gotify server",
errorSaveChannel: "Failed to save notification channel",
channelNamePlaceholder: "My Notification Channel",
telegramChatIdPlaceholder: "Telegram Chat ID",
botTokenPlaceholder: "Telegram Bot Token",
discordWebhookUrlPlaceholder: "https://discord.com/api/webhooks/...",
slackWebhookUrlPlaceholder: "https://hooks.slack.com/services/...",
signalNumberPlaceholder: "+1234567890",
signalApiEndpointPlaceholder: "https://your-signal-api.com/v2/send",
googleChatWebhookUrlPlaceholder: "https://chat.googleapis.com/v1/spaces/...",
emailAddressPlaceholder: "notifications@example.com",
emailSenderNamePlaceholder: "Alert System",
smtpServerPlaceholder: "smtp.gmail.com",
smtpPortPlaceholder: "587",
smtpPasswordPlaceholder: "Enter your SMTP password",
ntfyEndpointPlaceholder: "https://ntfy.sh/your-topic",
apiTokenPlaceholder: "Enter API token",
pushoverUserKeyPlaceholder: "Your Pushover user key",
notifiarrChannelIdPlaceholder: "Discord Channel ID",
gotifyServerUrlPlaceholder: "https://your-gotify-server.com",
webhookUrlPlaceholder: "https://api.example.com/webhook",
// DataRetentionSettings.tsx
// permissionNotice: "Permission Notice:",
permissionNoticeDataRetention: "As an admin user, you do not have access to data retention settings. These settings can only be accessed and modified by Super Admins.",
loadingRetentionSettings: "Loading retention settings...",
dataRetention: "Data Retention Settings",
dataRetentionDescription: "Configure how long monitoring data is kept in the system",
uptimeRetentionLabel: "Uptime Monitoring Retention (days)",
uptimeRetentionHelp: "Service uptime and incident data older than this will be automatically deleted",
serverRetentionLabel: "Server Monitoring Retention (days)",
serverRetentionHelp: "Server metrics and process data older than this will be automatically deleted",
lastCleanup: "Last automatic cleanup",
// save: "Save Changes"
};