add translations for chart tooltips

This commit is contained in:
Henry Dollman
2024-10-30 17:53:44 -04:00
parent 14a4715eb8
commit 7f82aafff9
17 changed files with 113 additions and 28 deletions

View File

@@ -12,6 +12,7 @@ import {
// import Spinner from '../spinner' // import Spinner from '../spinner'
import { ChartData } from "@/types" import { ChartData } from "@/types"
import { memo, useMemo } from "react" import { memo, useMemo } from "react"
import { useTranslation } from "react-i18next"
/** [label, key, color, opacity] */ /** [label, key, color, opacity] */
type DataKeys = [string, string, number, number] type DataKeys = [string, string, number, number]
@@ -38,6 +39,7 @@ export default memo(function AreaChartDefault({
chartData: ChartData chartData: ChartData
}) { }) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth() const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
const { t } = useTranslation()
const { chartTime } = chartData const { chartTime } = chartData
@@ -45,26 +47,26 @@ export default memo(function AreaChartDefault({
const dataKeys: DataKeys[] = useMemo(() => { const dataKeys: DataKeys[] = useMemo(() => {
// [label, key, color, opacity] // [label, key, color, opacity]
if (chartName === "CPU Usage") { if (chartName === t("alerts.info.cpu_usage")) {
return [[chartName, "cpu", 1, 0.4]] return [[chartName, "cpu", 1, 0.4]]
} else if (chartName === "dio") { } else if (chartName === "dio") {
return [ return [
["Write", "dw", 3, 0.3], [t("monitor.write"), "dw", 3, 0.3],
["Read", "dr", 1, 0.3], [t("monitor.read"), "dr", 1, 0.3],
] ]
} else if (chartName === "bw") { } else if (chartName === "bw") {
return [ return [
["Sent", "ns", 5, 0.2], [t("monitor.sent"), "ns", 5, 0.2],
["Received", "nr", 2, 0.2], [t("monitor.received"), "nr", 2, 0.2],
] ]
} else if (chartName.startsWith("efs")) { } else if (chartName.startsWith("efs")) {
return [ return [
["Write", `${chartName}.w`, 3, 0.3], [t("monitor.write"), `${chartName}.w`, 3, 0.3],
["Read", `${chartName}.r`, 1, 0.3], [t("monitor.read"), `${chartName}.r`, 1, 0.3],
] ]
} }
return [] return []
}, []) }, [t])
// console.log('Rendered at', new Date()) // console.log('Rendered at', new Date())

View File

@@ -12,6 +12,7 @@ import {
} from "@/lib/utils" } from "@/lib/utils"
import { ChartData } from "@/types" import { ChartData } from "@/types"
import { memo } from "react" import { memo } from "react"
import { useTranslation } from "react-i18next"
export default memo(function DiskChart({ export default memo(function DiskChart({
dataKey, dataKey,
@@ -23,6 +24,7 @@ export default memo(function DiskChart({
chartData: ChartData chartData: ChartData
}) { }) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth() const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
const { t } = useTranslation()
if (chartData.systemStats.length === 0) { if (chartData.systemStats.length === 0) {
return null return null
@@ -66,7 +68,7 @@ export default memo(function DiskChart({
/> />
<Area <Area
dataKey={dataKey} dataKey={dataKey}
name="Disk Usage" name={t("alerts.info.disk_usage")}
type="monotoneX" type="monotoneX"
fill="hsl(var(--chart-4))" fill="hsl(var(--chart-4))"
fillOpacity={0.4} fillOpacity={0.4}

View File

@@ -4,8 +4,10 @@ import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/comp
import { useYAxisWidth, cn, toFixedFloat, decimalString, formatShortDate, chartMargin } from "@/lib/utils" import { useYAxisWidth, cn, toFixedFloat, decimalString, formatShortDate, chartMargin } from "@/lib/utils"
import { memo } from "react" import { memo } from "react"
import { ChartData } from "@/types" import { ChartData } from "@/types"
import { useTranslation } from "react-i18next"
export default memo(function MemChart({ chartData }: { chartData: ChartData }) { export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
const { t } = useTranslation()
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth() const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
const totalMem = toFixedFloat(chartData.systemStats.at(-1)?.stats.m ?? 0, 1) const totalMem = toFixedFloat(chartData.systemStats.at(-1)?.stats.m ?? 0, 1)
@@ -57,7 +59,7 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
} }
/> />
<Area <Area
name="Used" name={t("monitor.used")}
order={3} order={3}
dataKey="stats.mu" dataKey="stats.mu"
type="monotoneX" type="monotoneX"
@@ -81,7 +83,7 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
/> />
)} )}
<Area <Area
name="Cache / Buffers" name={t("monitor.cache_buffers")}
order={1} order={1}
dataKey="stats.mb" dataKey="stats.mb"
type="monotoneX" type="monotoneX"

View File

@@ -11,9 +11,11 @@ import {
} from "@/lib/utils" } from "@/lib/utils"
import { ChartData } from "@/types" import { ChartData } from "@/types"
import { memo } from "react" import { memo } from "react"
import { useTranslation } from "react-i18next"
export default memo(function SwapChart({ chartData }: { chartData: ChartData }) { export default memo(function SwapChart({ chartData }: { chartData: ChartData }) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth() const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
const { t } = useTranslation()
if (chartData.systemStats.length === 0) { if (chartData.systemStats.length === 0) {
return null return null
@@ -50,7 +52,7 @@ export default memo(function SwapChart({ chartData }: { chartData: ChartData })
/> />
<Area <Area
dataKey="stats.su" dataKey="stats.su"
name="Swap Usage" name={t("monitor.used")}
type="monotoneX" type="monotoneX"
fill="hsl(var(--chart-2))" fill="hsl(var(--chart-2))"
fillOpacity={0.4} fillOpacity={0.4}

View File

@@ -235,9 +235,9 @@ export default function SystemDetail({ name }: { name: string }) {
let uptime: number | string = system.info.u let uptime: number | string = system.info.u
if (system.info.u < 172800) { if (system.info.u < 172800) {
const hours = Math.trunc(uptime / 3600) const hours = Math.trunc(uptime / 3600)
uptime = `${hours} hour${hours == 1 ? "" : "s"}` uptime = t("hours", { count: hours })
} else { } else {
uptime = `${Math.trunc(system.info?.u / 86400)} days` uptime = t("days", { count: Math.trunc(system.info?.u / 86400) })
} }
return [ return [
{ value: system.host, Icon: GlobeIcon }, { value: system.host, Icon: GlobeIcon },
@@ -261,7 +261,7 @@ export default function SystemDetail({ name }: { name: string }) {
Icon: any Icon: any
hide?: boolean hide?: boolean
}[] }[]
}, [system.info]) }, [system.info, t])
/** Space for tooltip if more than 12 containers */ /** Space for tooltip if more than 12 containers */
useEffect(() => { useEffect(() => {
@@ -376,7 +376,12 @@ export default function SystemDetail({ name }: { name: string }) {
)}`} )}`}
cornerEl={isLongerChart ? <SelectAvgMax store={cpuMaxStore} /> : null} cornerEl={isLongerChart ? <SelectAvgMax store={cpuMaxStore} /> : null}
> >
<AreaChartDefault chartData={chartData} chartName="CPU Usage" maxToggled={cpuMaxStore[0]} unit="%" /> <AreaChartDefault
chartData={chartData}
chartName={t("alerts.info.cpu_usage")}
maxToggled={cpuMaxStore[0]}
unit="%"
/>
</ChartCard> </ChartCard>
{containerFilterBar && ( {containerFilterBar && (

View File

@@ -90,7 +90,7 @@
"to_ensure_alerts_are_delivered": "لضمان تسليم التنبيهات.", "to_ensure_alerts_are_delivered": "لضمان تسليم التنبيهات.",
"to_email_s": "إلى البريد الإلكتروني", "to_email_s": "إلى البريد الإلكتروني",
"enter_email_address": "أدخل عنوان البريد الإلكتروني...", "enter_email_address": "أدخل عنوان البريد الإلكتروني...",
"des": "احفظ العنوان باستخدام مفتاح الإدخال أو الفاصلة. اتركه فا<EFBFBD><EFBFBD>غاً لتعطيل إشعارات البريد الإلكتروني." "des": "احفظ العنوان باستخدام مفتاح الإدخال أو الفاصلة. اتركه فاغاً لتعطيل إشعارات البريد الإلكتروني."
}, },
"webhook_push": { "webhook_push": {
"title": "إشعارات Webhook / Push", "title": "إشعارات Webhook / Push",
@@ -176,7 +176,13 @@
"usage": "الاستخدام", "usage": "الاستخدام",
"disk_usage_of": "استخدام القرص لـ", "disk_usage_of": "استخدام القرص لـ",
"throughput_of": "معدل نقل", "throughput_of": "معدل نقل",
"waiting_for": "في انتظار سجلات كافية للعرض" "waiting_for": "في انتظار سجلات كافية للعرض",
"cache_buffers": "ذاكرة التخزين المؤقت / المخازن المؤقتة",
"read": "قراءة",
"write": "كتابة",
"sent": "مرسل",
"received": "مستلم",
"used": "مستخدم"
}, },
"auth": { "auth": {
"login": "الرجاء تسجيل الدخول إلى حسابك", "login": "الرجاء تسجيل الدخول إلى حسابك",

View File

@@ -178,7 +178,13 @@
"usage": "Nutzung", "usage": "Nutzung",
"disk_usage_of": "Festplattennutzung von", "disk_usage_of": "Festplattennutzung von",
"throughput_of": "Durchsatz von", "throughput_of": "Durchsatz von",
"waiting_for": "Warten auf genügend Datensätze zur Anzeige" "waiting_for": "Warten auf genügend Datensätze zur Anzeige",
"cache_buffers": "Cache/Puffer",
"read": "Lesen",
"write": "Schreiben",
"sent": "Gesendet",
"received": "Empfangen",
"used": "Verwendet"
}, },
"auth": { "auth": {
"login": "Bitte melden Sie sich bei Ihrem Konto an", "login": "Bitte melden Sie sich bei Ihrem Konto an",

View File

@@ -160,6 +160,7 @@
"docker_cpu_usage": "Docker CPU Usage", "docker_cpu_usage": "Docker CPU Usage",
"docker_cpu_des": "Average CPU utilization of containers", "docker_cpu_des": "Average CPU utilization of containers",
"total_memory_usage": "Total Memory Usage", "total_memory_usage": "Total Memory Usage",
"cache_buffers": "Cache / Buffers",
"memory_des": "Precise utilization at the recorded time", "memory_des": "Precise utilization at the recorded time",
"docker_memory_usage": "Docker Memory Usage", "docker_memory_usage": "Docker Memory Usage",
"docker_memory_des": "Memory usage of docker containers", "docker_memory_des": "Memory usage of docker containers",
@@ -167,8 +168,12 @@
"disk_des": "Usage of root partition", "disk_des": "Usage of root partition",
"disk_io": "Disk I/O", "disk_io": "Disk I/O",
"disk_io_des": "Throughput of root filesystem", "disk_io_des": "Throughput of root filesystem",
"read": "Read",
"write": "Write",
"bandwidth": "Bandwidth", "bandwidth": "Bandwidth",
"bandwidth_des": "Network traffic of public interfaces", "bandwidth_des": "Network traffic of public interfaces",
"sent": "Sent",
"received": "Received",
"docker_network_io": "Docker Network I/O", "docker_network_io": "Docker Network I/O",
"docker_network_io_des": "Network traffic of docker containers", "docker_network_io_des": "Network traffic of docker containers",
"swap_usage": "Swap Usage", "swap_usage": "Swap Usage",
@@ -176,6 +181,7 @@
"temperature": "Temperature", "temperature": "Temperature",
"temperature_des": "Temperatures of system sensors", "temperature_des": "Temperatures of system sensors",
"usage": "Usage", "usage": "Usage",
"used": "Used",
"disk_usage_of": "Disk usage of", "disk_usage_of": "Disk usage of",
"throughput_of": "Throughput of", "throughput_of": "Throughput of",
"waiting_for": "Waiting for enough records to display" "waiting_for": "Waiting for enough records to display"

View File

@@ -178,7 +178,13 @@
"usage": "Uso", "usage": "Uso",
"disk_usage_of": "Uso de disco de", "disk_usage_of": "Uso de disco de",
"throughput_of": "Rendimiento de", "throughput_of": "Rendimiento de",
"waiting_for": "Esperando suficientes registros para mostrar" "waiting_for": "Esperando suficientes registros para mostrar",
"cache_buffers": "Caché/Búferes",
"read": "Lectura",
"write": "Escritura",
"sent": "Enviado",
"received": "Recibido",
"used": "Usado"
}, },
"auth": { "auth": {
"login": "Por favor, inicie sesión en su cuenta", "login": "Por favor, inicie sesión en su cuenta",

View File

@@ -180,7 +180,13 @@
"usage": "Utilisation", "usage": "Utilisation",
"disk_usage_of": "Utilisation du disque de", "disk_usage_of": "Utilisation du disque de",
"throughput_of": "Débit de", "throughput_of": "Débit de",
"waiting_for": "En attente de suffisamment d'enregistrements pour afficher" "waiting_for": "En attente de suffisamment d'enregistrements pour afficher",
"cache_buffers": "Cache/Tampons",
"read": "Lecture",
"write": "Écriture",
"sent": "Envoyé",
"received": "Reçu",
"used": "Utilisé"
}, },
"auth": { "auth": {
"login": "Veuillez vous connecter à votre compte", "login": "Veuillez vous connecter à votre compte",

View File

@@ -179,7 +179,13 @@
"usage": "使用率", "usage": "使用率",
"disk_usage_of": "のディスク使用率", "disk_usage_of": "のディスク使用率",
"throughput_of": "のスループット", "throughput_of": "のスループット",
"waiting_for": "表示に必要な記録を待機中" "waiting_for": "表示に必要な記録を待機中",
"cache_buffers": "キャッシュ/バッファ",
"read": "読み込み",
"write": "書き込み",
"sent": "送信",
"received": "受信",
"used": "使用済み"
}, },
"auth": { "auth": {
"login": "アカウントにサインインしてください", "login": "アカウントにサインインしてください",

View File

@@ -179,7 +179,13 @@
"usage": "사용량", "usage": "사용량",
"disk_usage_of": "디스크 사용량", "disk_usage_of": "디스크 사용량",
"throughput_of": "처리량", "throughput_of": "처리량",
"waiting_for": "표시할 충분한 기록을 기다리는 중" "waiting_for": "표시할 충분한 기록을 기다리는 중",
"cache_buffers": "캐시/버퍼",
"read": "읽기",
"write": "쓰기",
"sent": "전송됨",
"received": "수신됨",
"used": "사용됨"
}, },
"auth": { "auth": {
"login": "계정에 로그인하세요", "login": "계정에 로그인하세요",

View File

@@ -178,7 +178,13 @@
"usage": "Uso", "usage": "Uso",
"disk_usage_of": "Uso de disco de", "disk_usage_of": "Uso de disco de",
"throughput_of": "Taxa de transferência de", "throughput_of": "Taxa de transferência de",
"waiting_for": "Aguardando registros suficientes para exibir" "waiting_for": "Aguardando registros suficientes para exibir",
"cache_buffers": "Cache/Buffers",
"read": "Leitura",
"write": "Escrita",
"sent": "Enviado",
"received": "Recebido",
"used": "Usado"
}, },
"auth": { "auth": {
"login": "Por favor, faça login em sua conta", "login": "Por favor, faça login em sua conta",

View File

@@ -180,7 +180,13 @@
"usage": "Использование", "usage": "Использование",
"disk_usage_of": "Использование диска", "disk_usage_of": "Использование диска",
"throughput_of": "Пропускная способность", "throughput_of": "Пропускная способность",
"waiting_for": "Ожидание достаточного количества записей для отображения" "waiting_for": "Ожидание достаточного количества записей для отображения",
"cache_buffers": "Кэш/Буферы",
"read": "Чтение",
"write": "Запись",
"sent": "Отправлено",
"received": "Получено",
"used": "Использовано"
}, },
"auth": { "auth": {
"login": "Пожалуйста, войдите в свою учетную запись", "login": "Пожалуйста, войдите в свою учетную запись",

View File

@@ -179,7 +179,13 @@
"usage": "Sử dụng", "usage": "Sử dụng",
"disk_usage_of": "Sử dụng ổ đĩa của", "disk_usage_of": "Sử dụng ổ đĩa của",
"throughput_of": "Thông lượng của", "throughput_of": "Thông lượng của",
"waiting_for": "Đang chờ đủ bản ghi để hiển thị" "waiting_for": "Đang chờ đủ bản ghi để hiển thị",
"cache_buffers": "Bộ nhớ đệm/Buffer",
"read": "Đọc",
"write": "Ghi",
"sent": "Đã gửi",
"received": "Đã nhận",
"used": "Đã sử dụng"
}, },
"auth": { "auth": {
"login": "Vui lòng đăng nhập vào tài khoản của bạn", "login": "Vui lòng đăng nhập vào tài khoản của bạn",

View File

@@ -179,7 +179,13 @@
"usage": "使用率", "usage": "使用率",
"disk_usage_of": "的磁盘使用率", "disk_usage_of": "的磁盘使用率",
"throughput_of": "的吞吐量", "throughput_of": "的吞吐量",
"waiting_for": "等待足够的记录以显示" "waiting_for": "等待足够的记录以显示",
"cache_buffers": "缓存/缓冲区",
"read": "读取",
"write": "写入",
"sent": "已发送",
"received": "已接收",
"used": "已使用"
}, },
"auth": { "auth": {
"login": "请登入你的账户", "login": "请登入你的账户",

View File

@@ -178,7 +178,13 @@
"usage": "使用率", "usage": "使用率",
"disk_usage_of": "的磁碟使用率", "disk_usage_of": "的磁碟使用率",
"throughput_of": "的吞吐量", "throughput_of": "的吞吐量",
"waiting_for": "等待足夠的記錄以顯示" "waiting_for": "等待足夠的記錄以顯示",
"cache_buffers": "快取/緩衝區",
"read": "讀取",
"write": "寫入",
"sent": "已發送",
"received": "已接收",
"used": "已使用"
}, },
"auth": { "auth": {
"login": "請登入你的賬戶", "login": "請登入你的賬戶",