- {props.value?.display_name ?? NO_CAMERA} + {props.value?.display_name ?? t(NO_CAMERA)}
- {option.description} + {t(option.descriptionKey)}
{rawOptions.captureSystemAudio - ? "Record System Audio" - : "No System Audio"} + ? t("Record System Audio") + : t("No System Audio")}
- These features are still in development and may not work as - expected. + {t( + "These features are still in development and may not work as expected.", + )}
- Help us improve Cap by submitting feedback or reporting bugs. - We'll get right on it. + {t( + "Help us improve Cap by submitting feedback or reporting bugs. We'll get right on it.", + )}
- Have questions, want to share ideas, or just hang out? Join the - Cap Discord community. + {t( + "Have questions, want to share ideas, or just hang out? Join the Cap Discord community.", + )}
- Upload your logs to help us diagnose issues with Cap. No personal - information is included. + {t( + "Upload your logs to help us diagnose issues with Cap. No personal information is included.", + )}
- Operating System + {t("Operating System")}
{ver().displayName} @@ -177,7 +186,9 @@ export default function FeedbackTab() {
Capture Support
++ {t("Capture Support")} +
- Available Encoders + {t("Available Encoders")}
Appearance
+{t("Appearance")}
- ⚠️ Higher framerates may cause frame drops or increased CPU usage - on some systems. + ⚠️{" "} + {t( + "Higher framerates may cause frame drops or increased CPU usage on some systems.", + )}
)}Default Project Name
+{t("Default Project Name")}
- Choose the template to use as the default project and file name. + {t( + "Choose the template to use as the default project and file name.", + )}
How to customize?
+{t("How to customize?")}
- Use placeholders in your template that will be automatically - filled in. + {t( + "Use placeholders in your template that will be automatically filled in.", + )}
Recording Mode
+{t("Recording Mode")}
-
-
Target
+{t("Target")}
-
-
Date & Time
+{t("Date & Time")}
Custom Formats
+{t("Custom Formats")}
- You can also use a custom format for time. The placeholders are
- case-sensitive. For 24-hour time, use{" "}
- hh for 12-hour format.
+ {t(
+ "You can also use a custom format for time. The placeholders are case-sensitive. For 24-hour time, use {moment} or use lower cased hh for 12-hour format.",
+ { moment: "{moment:HH:mm}" },
+ )}
Excluded Windows
+{t("Excluded Windows")}
- Choose which windows Cap hides from your recordings. + {t("Choose which windows Cap hides from your recordings.")}
- Note: Only Cap - related windows can be excluded on Windows due to technical - limitations. + {t("Note:")}{" "} + {t( + "Only Cap related windows can be excluded on Windows due to technical limitations.", + )}
- No windows are currently excluded. + {t("No windows are currently excluded.")}
} > @@ -972,7 +1031,7 @@ function ExcludedWindowsCard(props: {- Configure system-wide keyboard shortcuts to control Cap + {t("Configure system-wide keyboard shortcuts to control Cap")}
{ACTION_TEXT[item()]}
++ {t(ACTION_TEXT[item()] ?? "")} +
- Set hotkeys... + {t("Set hotkeys...")}
} > @@ -183,7 +186,7 @@ function Inner(props: { initialStore: HotkeysStore | null }) { class="flex items-center text-[11px] uppercase transition-colors hover:bg-gray-6 hover:border-gray-7 cursor-pointer py-3 px-2.5 h-5 bg-gray-4 border border-gray-5 rounded-lg text-gray-11 hover:text-gray-12" > - None + {t("None")} } > diff --git a/apps/desktop/src/routes/(window-chrome)/settings/integrations/index.tsx b/apps/desktop/src/routes/(window-chrome)/settings/integrations/index.tsx index 491e2752bd..326b6e8a86 100644 --- a/apps/desktop/src/routes/(window-chrome)/settings/integrations/index.tsx +++ b/apps/desktop/src/routes/(window-chrome)/settings/integrations/index.tsx @@ -4,10 +4,12 @@ import { For, onMount } from "solid-js"; import IconLucideDatabase from "~icons/lucide/database"; import "@total-typescript/ts-reset/filter-boolean"; +import { useI18n } from "~/i18n"; import { authStore } from "~/store"; import { commands } from "~/utils/tauri"; export default function AppsTab() { + const { t } = useI18n(); const navigate = useNavigate(); const auth = authStore.createQuery(); @@ -19,9 +21,10 @@ export default function AppsTab() { const apps = [ { - name: "S3 Config", - description: + name: t("S3 Config"), + description: t( "Connect your own S3 bucket for complete control over your data storage. All new shareable link uploads will be automatically uploaded to your configured S3 bucket, ensuring you maintain complete ownership and control over your content. Perfect for organizations requiring data sovereignty and custom storage policies.", + ), icon: IconLucideDatabase, url: "/settings/integrations/s3-config", pro: true, @@ -43,10 +46,11 @@ export default function AppsTab() { return (- Configure integrations to extend Cap's functionality and connect with - third-party services. + {t( + "Configure integrations to extend Cap's functionality and connect with third-party services.", + )}
{app.description}
diff --git a/apps/desktop/src/routes/(window-chrome)/settings/integrations/s3-config.tsx b/apps/desktop/src/routes/(window-chrome)/settings/integrations/s3-config.tsx index 55cfa69afc..f3e6970b78 100644 --- a/apps/desktop/src/routes/(window-chrome)/settings/integrations/s3-config.tsx +++ b/apps/desktop/src/routes/(window-chrome)/settings/integrations/s3-config.tsx @@ -3,6 +3,7 @@ import { createEventBus } from "@solid-primitives/event-bus"; import { createWritableMemo } from "@solid-primitives/memo"; import { useMutation } from "@tanstack/solid-query"; import { createResource, Suspense } from "solid-js"; +import { useI18n } from "~/i18n"; import { Input } from "~/routes/editor/ui"; import { commands } from "~/utils/tauri"; import { apiClient, protectedHeaders } from "~/utils/web-api"; @@ -26,6 +27,7 @@ const DEFAULT_CONFIG = { }; export default function S3ConfigPage() { + const { t } = useI18n(); const [_s3Config, { refetch }] = createResource(async () => { const response = await apiClient.desktop.getS3Config({ headers: await protectedHeaders(), @@ -50,7 +52,9 @@ export default function S3ConfigPage() { }, onSuccess: async () => { await refetch(); - await commands.globalMessageDialog("S3 configuration saved successfully"); + await commands.globalMessageDialog( + t("S3 configuration saved successfully"), + ); }, })); @@ -67,7 +71,7 @@ export default function S3ConfigPage() { onSuccess: async () => { await refetch(); await commands.globalMessageDialog( - "S3 configuration deleted successfully", + t("S3 configuration deleted successfully"), ); }, })); @@ -88,7 +92,9 @@ export default function S3ConfigPage() { if (response.status !== 200) throw new Error( - `S3 connection test failed. Check your config and network connection.`, + t( + "S3 connection test failed. Check your config and network connection.", + ), ); return response; @@ -98,7 +104,9 @@ export default function S3ConfigPage() { if (error instanceof Error) { if (error.name === "AbortError") throw new Error( - "Connection test timed out after 5 seconds. Please check your endpoint URL and network connection.", + t( + "Connection test timed out after 5 seconds. Please check your endpoint URL and network connection.", + ), ); } @@ -107,7 +115,7 @@ export default function S3ConfigPage() { }, onSuccess: async () => { await commands.globalMessageDialog( - "S3 configuration test successful! Connection is working.", + t("S3 configuration test successful! Connection is working."), ); }, })); @@ -168,23 +176,24 @@ export default function S3ConfigPage() {- It should take under 10 minutes to set up and connect your - storage bucket to Cap. View the{" "} + {t( + "It should take under 10 minutes to set up and connect your storage bucket to Cap. View the", + )}{" "} - Storage Config Guide + {t("Storage Config Guide")} {" "} - to get started. + {t("to get started.")}
- Your account is upgraded to{" "} - Cap Pro and - already includes a commercial license. + {t("Your account is upgraded to")}{" "} + Cap Pro{" "} + {t("and already includes a commercial license.")}
{license().licenseKey}
@@ -62,7 +64,7 @@ export default function Page() {
{(expiry) => (
-
+
{new Date(expiry()).toLocaleDateString()}
@@ -80,7 +82,7 @@ export default function Page() {
queryClient.refetchQueries({ queryKey: ["bruh"] });
}}
>
- Deactivate License
+ {t("Deactivate License")}
- For commercial use + {t("For commercial use")}
- {isCommercialAnnual() ? "billed annually" : "one-time payment"} + {isCommercialAnnual() + ? t("billed annually") + : t("one-time payment")}
- Switch to {isCommercialAnnual() ? "lifetime" : "yearly"}:{" "} + {t("Switch to")}{" "} + {isCommercialAnnual() ? t("lifetime") : t("yearly")}:{" "} {isCommercialAnnual() ? "$58" : "$29"} @@ -265,8 +274,8 @@ function CommercialLicensePurchase() { size="lg" > {openCommercialCheckout.isPending - ? "Loading..." - : "Purchase License"} + ? t("Loading...") + : t("Purchase License")}
- Manage your recordings and perform actions. + {t("Manage your recordings and perform actions.")}
- No recordings found + {t("No recordings found")}
} > @@ -214,7 +220,7 @@ export default function Recordings() { onClick={() => setActiveTab(tab.id)} > {tab.icon && tab.icon} -{tab.label}
+{t(tab.labelKey)}
{firstLetterUpperCase()}
+{modeLabel()}
Recording in progress
+{t("Recording in progress")}
Recording failed
+{t("Recording failed")}
- Manage your screenshots and perform actions. + {t("Manage your screenshots and perform actions.")}
- No screenshots found + {t("No screenshots found")}
} > @@ -143,12 +145,12 @@ export default function Screenshots() { setSearch(""); } }} - placeholder="Search screenshots" + placeholder={t("Search screenshots")} autoCapitalize="off" autocorrect="off" autocomplete="off" spellcheck={false} - aria-label="Search screenshots" + aria-label={t("Search screenshots")} />{updateError()}
- Please download the latest version manually from cap.so/download. - Your data will not be lost. + {t( + "Please download the latest version manually from cap.so/download. Your data will not be lost.", + )}
- If this issue persists, please contact support. + {t("If this issue persists, please contact support.")}
-- Update has been installed. Restart Cap to finish updating. + {t( + "Update has been installed. Restart Cap to finish updating.", + )}
-