feat: document locale url (#18409)

* feat: document locale url

* fix: remove debug code

* fix readme_cn line

* feat: add menu document locale url
This commit is contained in:
GuoQing Liu
2025-05-28 06:10:45 -06:00
committed by GitHub
parent cbdac9ece5
commit 9b7d4d0a8f
18 changed files with 128 additions and 36 deletions
+4 -1
View File
@@ -64,12 +64,15 @@ import { FrigateConfig } from "@/types/frigateConfig";
import { useTranslation } from "react-i18next";
import { supportedLanguageKeys } from "@/lib/const";
import { useDocDomain } from "@/hooks/use-doc-domain";
type GeneralSettingsProps = {
className?: string;
};
export default function GeneralSettings({ className }: GeneralSettingsProps) {
const { t } = useTranslation(["common", "views/settings"]);
const { getLocaleDocUrl } = useDocDomain();
const { data: profile } = useSWR("profile");
const { data: config } = useSWR<FrigateConfig>("config");
const logoutUrl = config?.proxy?.logout_url || "/api/logout";
@@ -479,7 +482,7 @@ export default function GeneralSettings({ className }: GeneralSettingsProps) {
{t("menu.help")}
</DropdownMenuLabel>
<DropdownMenuSeparator />
<a href="https://docs.frigate.video" target="_blank">
<a href={getLocaleDocUrl("/")} target="_blank">
<MenuItem
className={
isDesktop ? "cursor-pointer" : "flex items-center p-2 text-sm"
+12 -7
View File
@@ -18,6 +18,7 @@ import { LogChip } from "../indicators/Chip";
import { useMemo } from "react";
import { Link } from "react-router-dom";
import { useTranslation } from "react-i18next";
import { useDocDomain } from "@/hooks/use-doc-domain";
type LogInfoDialogProps = {
logLine?: LogLine;
@@ -105,23 +106,25 @@ export default function LogInfoDialog({
}
function useHelpfulLinks(content: string | undefined) {
const { getLocaleDocUrl } = useDocDomain();
return useMemo(() => {
if (!content) {
return [];
}
const links = [];
if (/Could not clear [\d.]* currently [\d.]*/.exec(content)) {
links.push({
link: "https://docs.frigate.video/configuration/record#will-frigate-delete-old-recordings-if-my-storage-runs-out",
link: getLocaleDocUrl(
"configuration/record#will-frigate-delete-old-recordings-if-my-storage-runs-out",
),
text: "Frigate Automatic Storage Cleanup",
});
}
if (/Did not detect hwaccel/.exec(content)) {
links.push({
link: "https://docs.frigate.video/configuration/hardware_acceleration",
link: getLocaleDocUrl("configuration/hardware_acceleration"),
text: "Setup Hardware Acceleration",
});
}
@@ -139,25 +142,27 @@ function useHelpfulLinks(content: string | undefined) {
content.includes("No VA display found for device /dev/dri/renderD128")
) {
links.push({
link: "https://docs.frigate.video/configuration/hardware_acceleration",
link: getLocaleDocUrl("configuration/hardware_acceleration"),
text: "Verify Hardware Acceleration Setup",
});
}
if (content.includes("No EdgeTPU was detected")) {
links.push({
link: "https://docs.frigate.video/troubleshooting/edgetpu",
link: getLocaleDocUrl("troubleshooting/edgetpu"),
text: "Troubleshoot Coral",
});
}
if (content.includes("The current SHM size of")) {
links.push({
link: "https://docs.frigate.video/frigate/installation/#calculating-required-shm-size",
link: getLocaleDocUrl(
"frigate/installation/#calculating-required-shm-size",
),
text: "Calculate Correct SHM Size",
});
}
return links;
}, [content]);
}, [content, getLocaleDocUrl]);
}
@@ -27,6 +27,7 @@ import ActivityIndicator from "@/components/indicators/activity-indicator";
import { Input } from "@/components/ui/input";
import { Separator } from "@/components/ui/separator";
import { Trans, useTranslation } from "react-i18next";
import { useDocDomain } from "@/hooks/use-doc-domain";
type AnnotationSettingsPaneProps = {
event: Event;
@@ -43,6 +44,7 @@ export function AnnotationSettingsPane({
setAnnotationOffset,
}: AnnotationSettingsPaneProps) {
const { t } = useTranslation(["views/explore"]);
const { getLocaleDocUrl } = useDocDomain();
const { data: config, mutate: updateConfig } =
useSWR<FrigateConfig>("config");
@@ -180,7 +182,7 @@ export function AnnotationSettingsPane({
</Trans>
<div className="mt-2 flex items-center text-primary">
<Link
to="https://docs.frigate.video/configuration/reference"
to={getLocaleDocUrl("configuration/reference")}
target="_blank"
rel="noopener noreferrer"
className="inline"
@@ -24,6 +24,7 @@ import { Trans, useTranslation } from "react-i18next";
import { LuExternalLink } from "react-icons/lu";
import { Link } from "react-router-dom";
import { toast } from "sonner";
import { useDocDomain } from "@/hooks/use-doc-domain";
const STEPS = ["steps.faceName", "steps.uploadFace", "steps.nextSteps"];
@@ -38,7 +39,7 @@ export default function CreateFaceWizardDialog({
onFinish,
}: CreateFaceWizardDialogProps) {
const { t } = useTranslation("views/faceLibrary");
const { getLocaleDocUrl } = useDocDomain();
// wizard
const [step, setStep] = useState(0);
@@ -155,7 +156,7 @@ export default function CreateFaceWizardDialog({
</p>
<div className="my-2 flex items-center text-sm text-primary">
<Link
to="https://docs.frigate.video/configuration/face_recognition"
to={getLocaleDocUrl("configuration/face_recognition")}
target="_blank"
rel="noopener noreferrer"
className="inline"
@@ -32,6 +32,7 @@ import { LuCheck, LuExternalLink, LuInfo, LuX } from "react-icons/lu";
import { Link } from "react-router-dom";
import { LiveStreamMetadata } from "@/types/live";
import { Trans, useTranslation } from "react-i18next";
import { useDocDomain } from "@/hooks/use-doc-domain";
type CameraStreamingDialogProps = {
camera: string;
@@ -51,6 +52,8 @@ export function CameraStreamingDialog({
onSave,
}: CameraStreamingDialogProps) {
const { t } = useTranslation(["components/camera", "components/dialog"]);
const { getLocaleDocUrl } = useDocDomain();
const { data: config } = useSWR<FrigateConfig>("config");
const [isLoading, setIsLoading] = useState(false);
@@ -220,7 +223,7 @@ export function CameraStreamingDialog({
})}
<div className="mt-2 flex items-center text-primary">
<Link
to="https://docs.frigate.video/configuration/live"
to={getLocaleDocUrl("configuration/live")}
target="_blank"
rel="noopener noreferrer"
className="inline"
@@ -281,7 +284,7 @@ export function CameraStreamingDialog({
{t("group.camera.setting.audio.tips.title")}
<div className="mt-2 flex items-center text-primary">
<Link
to="https://docs.frigate.video/configuration/live"
to={getLocaleDocUrl("configuration/live")}
target="_blank"
rel="noopener noreferrer"
className="inline"
@@ -23,6 +23,7 @@ import ActivityIndicator from "../indicators/activity-indicator";
import { Link } from "react-router-dom";
import { LuExternalLink } from "react-icons/lu";
import { Trans, useTranslation } from "react-i18next";
import { useDocDomain } from "@/hooks/use-doc-domain";
type MotionMaskEditPaneProps = {
polygons?: Polygon[];
@@ -52,6 +53,7 @@ export default function MotionMaskEditPane({
setSnapPoints,
}: MotionMaskEditPaneProps) {
const { t } = useTranslation(["views/settings"]);
const { getLocaleDocUrl } = useDocDomain();
const { data: config, mutate: updateConfig } =
useSWR<FrigateConfig>("config");
@@ -249,7 +251,7 @@ export default function MotionMaskEditPane({
<div className="flex items-center text-primary">
<Link
to="https://docs.frigate.video/configuration/masks/"
to={getLocaleDocUrl("configuration/masks/")}
target="_blank"
rel="noopener noreferrer"
className="inline"
+5 -1
View File
@@ -32,6 +32,7 @@ import { getAttributeLabels } from "@/utils/iconUtil";
import { Trans, useTranslation } from "react-i18next";
import { Link } from "react-router-dom";
import { LuExternalLink } from "react-icons/lu";
import { useDocDomain } from "@/hooks/use-doc-domain";
type ZoneEditPaneProps = {
polygons?: Polygon[];
@@ -63,6 +64,7 @@ export default function ZoneEditPane({
setSnapPoints,
}: ZoneEditPaneProps) {
const { t } = useTranslation(["views/settings"]);
const { getLocaleDocUrl } = useDocDomain();
const { data: config, mutate: updateConfig } =
useSWR<FrigateConfig>("config");
@@ -673,7 +675,9 @@ export default function ZoneEditPane({
{t("masksAndZones.zones.speedEstimation.desc")}
<div className="mt-2 flex items-center text-primary">
<Link
to="https://docs.frigate.video/configuration/zones#speed-estimation"
to={getLocaleDocUrl(
"configuration/zones#speed-estimation",
)}
target="_blank"
rel="noopener noreferrer"
className="inline"