mirror of
https://github.com/zhom/donutbrowser.git
synced 2026-07-11 23:26:35 +02:00
refactor: fully deprecate camoufox
This commit is contained in:
+23
-96
@@ -7,8 +7,6 @@ import { useOnborda } from "onborda";
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { AccountPage } from "@/components/account-page";
|
||||
import { CamoufoxConfigDialog } from "@/components/camoufox-config-dialog";
|
||||
import { CamoufoxDeprecationDialog } from "@/components/camoufox-deprecation-dialog";
|
||||
import { CloneProfileDialog } from "@/components/clone-profile-dialog";
|
||||
import { CloseConfirmDialog } from "@/components/close-confirm-dialog";
|
||||
import { CommandPalette } from "@/components/command-palette";
|
||||
@@ -43,6 +41,7 @@ import { SyncAllDialog } from "@/components/sync-all-dialog";
|
||||
import { SyncConfigDialog } from "@/components/sync-config-dialog";
|
||||
import { SyncFollowerDialog } from "@/components/sync-follower-dialog";
|
||||
import { ThankYouDialog } from "@/components/thank-you-dialog";
|
||||
import { WayfernConfigDialog } from "@/components/wayfern-config-dialog";
|
||||
import { WayfernTermsDialog } from "@/components/wayfern-terms-dialog";
|
||||
import { WelcomeDialog } from "@/components/welcome-dialog";
|
||||
import { WindowResizeWarningDialog } from "@/components/window-resize-warning-dialog";
|
||||
@@ -78,14 +77,9 @@ import {
|
||||
showSyncProgressToast,
|
||||
showToast,
|
||||
} from "@/lib/toast-utils";
|
||||
import type {
|
||||
BrowserProfile,
|
||||
CamoufoxConfig,
|
||||
SyncSettings,
|
||||
WayfernConfig,
|
||||
} from "@/types";
|
||||
import type { BrowserProfile, SyncSettings, WayfernConfig } from "@/types";
|
||||
|
||||
type BrowserTypeString = "camoufox" | "wayfern";
|
||||
type BrowserTypeString = "wayfern";
|
||||
|
||||
interface PendingUrl {
|
||||
id: string;
|
||||
@@ -268,8 +262,7 @@ export default function Home() {
|
||||
const [importProfileDialogOpen, setImportProfileDialogOpen] = useState(false);
|
||||
const [proxyManagementDialogOpen, setProxyManagementDialogOpen] =
|
||||
useState(false);
|
||||
const [camoufoxConfigDialogOpen, setCamoufoxConfigDialogOpen] =
|
||||
useState(false);
|
||||
const [wayfernConfigDialogOpen, setWayfernConfigDialogOpen] = useState(false);
|
||||
const [groupManagementDialogOpen, setGroupManagementDialogOpen] =
|
||||
useState(false);
|
||||
const [extensionManagementDialogOpen, setExtensionManagementDialogOpen] =
|
||||
@@ -306,7 +299,7 @@ export default function Home() {
|
||||
const [selectedProfiles, setSelectedProfiles] = useState<string[]>([]);
|
||||
const [searchQuery, setSearchQuery] = useState<string>("");
|
||||
const [pendingUrls, setPendingUrls] = useState<PendingUrl[]>([]);
|
||||
const [currentProfileForCamoufoxConfig, setCurrentProfileForCamoufoxConfig] =
|
||||
const [currentProfileForWayfernConfig, setCurrentProfileForWayfernConfig] =
|
||||
useState<BrowserProfile | null>(null);
|
||||
const [cloneProfile, setCloneProfile] = useState<BrowserProfile | null>(null);
|
||||
const [passwordDialogProfile, setPasswordDialogProfile] =
|
||||
@@ -315,8 +308,6 @@ export default function Home() {
|
||||
useState<PasswordDialogMode>("set");
|
||||
const pendingLaunchAfterUnlockRef = useRef<BrowserProfile | null>(null);
|
||||
const [windowResizeWarningOpen, setWindowResizeWarningOpen] = useState(false);
|
||||
const [windowResizeWarningBrowserType, setWindowResizeWarningBrowserType] =
|
||||
useState<string | undefined>(undefined);
|
||||
const windowResizeWarningResolver = useRef<
|
||||
((proceed: boolean) => void) | null
|
||||
>(null);
|
||||
@@ -534,7 +525,7 @@ export default function Home() {
|
||||
console.log("Found missing binaries:", missingBinaries);
|
||||
}
|
||||
if (missingGeoIP) {
|
||||
console.log("Found missing GeoIP database for Camoufox");
|
||||
console.log("Found missing GeoIP database");
|
||||
}
|
||||
|
||||
// Group missing binaries by browser type to avoid concurrent downloads
|
||||
@@ -556,9 +547,9 @@ export default function Home() {
|
||||
|
||||
if (missingGeoIP) {
|
||||
if (missingList) {
|
||||
missingList += ", GeoIP database for Camoufox";
|
||||
missingList += ", GeoIP database";
|
||||
} else {
|
||||
missingList = "GeoIP database for Camoufox";
|
||||
missingList = "GeoIP database";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -776,33 +767,11 @@ export default function Home() {
|
||||
}
|
||||
}, [handleUrlOpen, t]);
|
||||
|
||||
const handleConfigureCamoufox = useCallback((profile: BrowserProfile) => {
|
||||
setCurrentProfileForCamoufoxConfig(profile);
|
||||
setCamoufoxConfigDialogOpen(true);
|
||||
const handleConfigureWayfern = useCallback((profile: BrowserProfile) => {
|
||||
setCurrentProfileForWayfernConfig(profile);
|
||||
setWayfernConfigDialogOpen(true);
|
||||
}, []);
|
||||
|
||||
const handleSaveCamoufoxConfig = useCallback(
|
||||
async (profile: BrowserProfile, config: CamoufoxConfig) => {
|
||||
try {
|
||||
await invoke("update_camoufox_config", {
|
||||
profileId: profile.id,
|
||||
config,
|
||||
});
|
||||
// No need to manually reload - useProfileEvents will handle the update
|
||||
setCamoufoxConfigDialogOpen(false);
|
||||
} catch (err: unknown) {
|
||||
console.error("Failed to update camoufox config:", err);
|
||||
showErrorToast(
|
||||
t("errors.updateCamoufoxConfigFailed", {
|
||||
error: JSON.stringify(err),
|
||||
}),
|
||||
);
|
||||
throw err;
|
||||
}
|
||||
},
|
||||
[t],
|
||||
);
|
||||
|
||||
const handleSaveWayfernConfig = useCallback(
|
||||
async (profile: BrowserProfile, config: WayfernConfig) => {
|
||||
try {
|
||||
@@ -811,7 +780,7 @@ export default function Home() {
|
||||
config,
|
||||
});
|
||||
// No need to manually reload - useProfileEvents will handle the update
|
||||
setCamoufoxConfigDialogOpen(false);
|
||||
setWayfernConfigDialogOpen(false);
|
||||
} catch (err: unknown) {
|
||||
console.error("Failed to update wayfern config:", err);
|
||||
showErrorToast(
|
||||
@@ -831,7 +800,6 @@ export default function Home() {
|
||||
releaseType: string;
|
||||
proxyId?: string;
|
||||
vpnId?: string;
|
||||
camoufoxConfig?: CamoufoxConfig;
|
||||
wayfernConfig?: WayfernConfig;
|
||||
groupId?: string;
|
||||
extensionGroupId?: string;
|
||||
@@ -850,7 +818,6 @@ export default function Home() {
|
||||
releaseType: profileData.releaseType,
|
||||
proxyId: profileData.proxyId,
|
||||
vpnId: profileData.vpnId,
|
||||
camoufoxConfig: profileData.camoufoxConfig,
|
||||
wayfernConfig: profileData.wayfernConfig,
|
||||
groupId:
|
||||
profileData.groupId ??
|
||||
@@ -926,7 +893,7 @@ export default function Home() {
|
||||
}
|
||||
|
||||
// Show one-time warning about window resizing for fingerprinted browsers
|
||||
if (profile.browser === "camoufox" || profile.browser === "wayfern") {
|
||||
if (profile.browser === "wayfern") {
|
||||
try {
|
||||
const dismissed = await invoke<boolean>(
|
||||
"get_window_resize_warning_dismissed",
|
||||
@@ -934,7 +901,6 @@ export default function Home() {
|
||||
if (!dismissed) {
|
||||
const proceed = await new Promise<boolean>((resolve) => {
|
||||
windowResizeWarningResolver.current = resolve;
|
||||
setWindowResizeWarningBrowserType(profile.browser);
|
||||
setWindowResizeWarningOpen(true);
|
||||
});
|
||||
if (!proceed) {
|
||||
@@ -1138,9 +1104,7 @@ export default function Home() {
|
||||
const handleBulkCopyCookies = useCallback(() => {
|
||||
if (selectedProfiles.length === 0) return;
|
||||
const eligibleProfiles = profiles.filter(
|
||||
(p) =>
|
||||
selectedProfiles.includes(p.id) &&
|
||||
(p.browser === "wayfern" || p.browser === "camoufox"),
|
||||
(p) => selectedProfiles.includes(p.id) && p.browser === "wayfern",
|
||||
);
|
||||
if (eligibleProfiles.length === 0) {
|
||||
showErrorToast(t("errors.cookieCopyUnsupportedBrowser"));
|
||||
@@ -1400,7 +1364,7 @@ export default function Home() {
|
||||
void checkMissingBinaries();
|
||||
}
|
||||
|
||||
// Proactively download Wayfern and Camoufox if not already available
|
||||
// Proactively download Wayfern if not already available
|
||||
if (!profilesLoading) {
|
||||
void invoke("ensure_active_browsers_downloaded").catch((err: unknown) => {
|
||||
console.error("Failed to auto-download browsers:", err);
|
||||
@@ -1523,40 +1487,6 @@ export default function Home() {
|
||||
};
|
||||
}, [t]);
|
||||
|
||||
// Show warning for non-wayfern/camoufox profiles (support ending March 15, 2026)
|
||||
useEffect(() => {
|
||||
if (profiles.length === 0) return;
|
||||
|
||||
const unsupportedProfiles = profiles.filter(
|
||||
(p) => p.browser !== "wayfern" && p.browser !== "camoufox",
|
||||
);
|
||||
|
||||
if (unsupportedProfiles.length > 0) {
|
||||
const unsupportedNames = unsupportedProfiles
|
||||
.map((p) => p.name)
|
||||
.join(", ");
|
||||
|
||||
showToast({
|
||||
id: "browser-support-ending-warning",
|
||||
type: "error",
|
||||
title: t("browserSupport.endingSoonTitle"),
|
||||
description: t("browserSupport.endingSoonDescription", {
|
||||
profiles: unsupportedNames,
|
||||
}),
|
||||
duration: 15000,
|
||||
action: {
|
||||
label: t("common.buttons.learnMore"),
|
||||
onClick: () => {
|
||||
const event = new CustomEvent("url-open-request", {
|
||||
detail: "https://github.com/zhom/donutbrowser/discussions",
|
||||
});
|
||||
window.dispatchEvent(event);
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
}, [profiles, t]);
|
||||
|
||||
// Re-check Wayfern terms when a browser download completes
|
||||
useEffect(() => {
|
||||
let unlisten: (() => void) | null = null;
|
||||
@@ -1639,7 +1569,6 @@ export default function Home() {
|
||||
return (
|
||||
<div className="flex h-dvh flex-col bg-background font-(family-name:--font-geist-sans)">
|
||||
<CloseConfirmDialog />
|
||||
<CamoufoxDeprecationDialog profiles={profiles} />
|
||||
<HomeHeader
|
||||
onCreateProfileDialogOpen={setCreateProfileDialogOpen}
|
||||
searchQuery={searchQuery}
|
||||
@@ -1668,7 +1597,7 @@ export default function Home() {
|
||||
onRemovePassword={handleRemovePassword}
|
||||
onDeleteProfile={handleDeleteProfile}
|
||||
onRenameProfile={handleRenameProfile}
|
||||
onConfigureCamoufox={handleConfigureCamoufox}
|
||||
onConfigureWayfern={handleConfigureWayfern}
|
||||
onCopyCookiesToProfile={handleCopyCookiesToProfile}
|
||||
onOpenCookieManagement={handleOpenCookieManagement}
|
||||
runningProfiles={runningProfiles}
|
||||
@@ -1913,17 +1842,16 @@ export default function Home() {
|
||||
}}
|
||||
/>
|
||||
|
||||
<CamoufoxConfigDialog
|
||||
isOpen={camoufoxConfigDialogOpen}
|
||||
<WayfernConfigDialog
|
||||
isOpen={wayfernConfigDialogOpen}
|
||||
onClose={() => {
|
||||
setCamoufoxConfigDialogOpen(false);
|
||||
setWayfernConfigDialogOpen(false);
|
||||
}}
|
||||
profile={currentProfileForCamoufoxConfig}
|
||||
onSave={handleSaveCamoufoxConfig}
|
||||
onSaveWayfern={handleSaveWayfernConfig}
|
||||
profile={currentProfileForWayfernConfig}
|
||||
onSave={handleSaveWayfernConfig}
|
||||
isRunning={
|
||||
currentProfileForCamoufoxConfig
|
||||
? runningProfiles.has(currentProfileForCamoufoxConfig.id)
|
||||
currentProfileForWayfernConfig
|
||||
? runningProfiles.has(currentProfileForWayfernConfig.id)
|
||||
: false
|
||||
}
|
||||
crossOsUnlocked={crossOsUnlocked}
|
||||
@@ -2116,7 +2044,6 @@ export default function Home() {
|
||||
|
||||
<WindowResizeWarningDialog
|
||||
isOpen={windowResizeWarningOpen}
|
||||
browserType={windowResizeWarningBrowserType}
|
||||
onResult={(proceed) => {
|
||||
setWindowResizeWarningOpen(false);
|
||||
windowResizeWarningResolver.current?.(proceed);
|
||||
|
||||
@@ -1,213 +0,0 @@
|
||||
"use client";
|
||||
|
||||
import { useEffect, useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { SharedCamoufoxConfigForm } from "@/components/shared-camoufox-config-form";
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
DialogFooter,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
} from "@/components/ui/dialog";
|
||||
import { ScrollArea } from "@/components/ui/scroll-area";
|
||||
import { WayfernConfigForm } from "@/components/wayfern-config-form";
|
||||
import type {
|
||||
BrowserProfile,
|
||||
CamoufoxConfig,
|
||||
CamoufoxOS,
|
||||
WayfernConfig,
|
||||
} from "@/types";
|
||||
|
||||
const getCurrentOS = (): CamoufoxOS => {
|
||||
if (typeof navigator === "undefined") return "linux";
|
||||
const platform = navigator.platform.toLowerCase();
|
||||
if (platform.includes("win")) return "windows";
|
||||
if (platform.includes("mac")) return "macos";
|
||||
return "linux";
|
||||
};
|
||||
|
||||
import { LoadingButton } from "./loading-button";
|
||||
import { RippleButton } from "./ui/ripple";
|
||||
|
||||
interface CamoufoxConfigDialogProps {
|
||||
isOpen: boolean;
|
||||
onClose: () => void;
|
||||
profile: BrowserProfile | null;
|
||||
onSave: (profile: BrowserProfile, config: CamoufoxConfig) => Promise<void>;
|
||||
onSaveWayfern?: (
|
||||
profile: BrowserProfile,
|
||||
config: CamoufoxConfig,
|
||||
) => Promise<void>;
|
||||
isRunning?: boolean;
|
||||
crossOsUnlocked?: boolean;
|
||||
}
|
||||
|
||||
export function CamoufoxConfigDialog({
|
||||
isOpen,
|
||||
onClose,
|
||||
profile,
|
||||
onSave,
|
||||
onSaveWayfern,
|
||||
isRunning = false,
|
||||
crossOsUnlocked = false,
|
||||
}: CamoufoxConfigDialogProps) {
|
||||
const { t } = useTranslation();
|
||||
// Use union type to support both Camoufox and Wayfern configs
|
||||
const [config, setConfig] = useState<CamoufoxConfig | WayfernConfig>(() => ({
|
||||
geoip: true,
|
||||
os: getCurrentOS(),
|
||||
}));
|
||||
const [isSaving, setIsSaving] = useState(false);
|
||||
|
||||
const isAntiDetectBrowser =
|
||||
profile?.browser === "camoufox" || profile?.browser === "wayfern";
|
||||
|
||||
// Initialize config when profile changes
|
||||
useEffect(() => {
|
||||
if (profile && isAntiDetectBrowser) {
|
||||
const profileConfig =
|
||||
profile.browser === "wayfern"
|
||||
? profile.wayfern_config
|
||||
: profile.camoufox_config;
|
||||
setConfig(
|
||||
profileConfig || {
|
||||
geoip: true,
|
||||
os: getCurrentOS(),
|
||||
},
|
||||
);
|
||||
}
|
||||
}, [profile, isAntiDetectBrowser]);
|
||||
|
||||
const updateConfig = (
|
||||
key: keyof CamoufoxConfig | keyof WayfernConfig,
|
||||
value: unknown,
|
||||
) => {
|
||||
setConfig((prev) => ({ ...prev, [key]: value }));
|
||||
};
|
||||
|
||||
const handleSave = async () => {
|
||||
if (!profile) return;
|
||||
|
||||
// Validate fingerprint JSON if it exists
|
||||
if (config.fingerprint) {
|
||||
try {
|
||||
JSON.parse(config.fingerprint);
|
||||
} catch (_error) {
|
||||
const { toast } = await import("sonner");
|
||||
toast.error(t("camoufoxDialog.invalidFingerprint"), {
|
||||
description: t("camoufoxDialog.invalidFingerprintDescription"),
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
setIsSaving(true);
|
||||
try {
|
||||
if (profile.browser === "wayfern" && onSaveWayfern) {
|
||||
await onSaveWayfern(profile, config as CamoufoxConfig);
|
||||
} else {
|
||||
await onSave(profile, config as CamoufoxConfig);
|
||||
}
|
||||
onClose();
|
||||
} catch (error) {
|
||||
console.error("Failed to save config:", error);
|
||||
const { toast } = await import("sonner");
|
||||
toast.error(t("camoufoxDialog.saveFailed"), {
|
||||
description:
|
||||
error instanceof Error
|
||||
? error.message
|
||||
: t("camoufoxDialog.unknownError"),
|
||||
});
|
||||
} finally {
|
||||
setIsSaving(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
// Reset config to original when closing without saving
|
||||
if (profile && isAntiDetectBrowser) {
|
||||
const profileConfig =
|
||||
profile.browser === "wayfern"
|
||||
? profile.wayfern_config
|
||||
: profile.camoufox_config;
|
||||
setConfig(
|
||||
profileConfig || {
|
||||
geoip: true,
|
||||
os: getCurrentOS(),
|
||||
},
|
||||
);
|
||||
}
|
||||
onClose();
|
||||
};
|
||||
|
||||
if (!profile || !isAntiDetectBrowser) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const browserName = profile.browser === "wayfern" ? "Wayfern" : "Camoufox";
|
||||
|
||||
return (
|
||||
<Dialog open={isOpen} onOpenChange={handleClose}>
|
||||
<DialogContent className="flex h-[min(85vh,52rem)] max-w-3xl flex-col">
|
||||
<DialogHeader className="shrink-0">
|
||||
<DialogTitle>
|
||||
{isRunning
|
||||
? t("camoufoxDialog.titleView", {
|
||||
name: profile.name,
|
||||
browser: browserName,
|
||||
})
|
||||
: t("camoufoxDialog.titleConfigure", {
|
||||
name: profile.name,
|
||||
browser: browserName,
|
||||
})}
|
||||
</DialogTitle>
|
||||
</DialogHeader>
|
||||
|
||||
<ScrollArea className="min-h-0 flex-1">
|
||||
<div className="py-4">
|
||||
{profile.browser === "wayfern" ? (
|
||||
<WayfernConfigForm
|
||||
config={config as WayfernConfig}
|
||||
onConfigChange={updateConfig}
|
||||
forceAdvanced={true}
|
||||
readOnly={isRunning}
|
||||
crossOsUnlocked={crossOsUnlocked}
|
||||
limitedMode={!crossOsUnlocked}
|
||||
profileVersion={profile.version}
|
||||
profileBrowser="wayfern"
|
||||
/>
|
||||
) : (
|
||||
<SharedCamoufoxConfigForm
|
||||
config={config as CamoufoxConfig}
|
||||
onConfigChange={updateConfig}
|
||||
forceAdvanced={true}
|
||||
readOnly={isRunning}
|
||||
browserType="camoufox"
|
||||
crossOsUnlocked={crossOsUnlocked}
|
||||
limitedMode={!crossOsUnlocked}
|
||||
profileVersion={profile.version}
|
||||
profileBrowser="camoufox"
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</ScrollArea>
|
||||
|
||||
<DialogFooter className="shrink-0 border-t pt-4">
|
||||
<RippleButton variant="outline" onClick={handleClose}>
|
||||
{isRunning ? t("common.buttons.close") : t("common.buttons.cancel")}
|
||||
</RippleButton>
|
||||
{!isRunning && (
|
||||
<LoadingButton
|
||||
isLoading={isSaving}
|
||||
onClick={handleSave}
|
||||
disabled={isSaving}
|
||||
>
|
||||
{t("common.buttons.save")}
|
||||
</LoadingButton>
|
||||
)}
|
||||
</DialogFooter>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
);
|
||||
}
|
||||
@@ -1,78 +0,0 @@
|
||||
"use client";
|
||||
|
||||
import { openUrl } from "@tauri-apps/plugin-opener";
|
||||
import { useEffect, useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { LuTriangleAlert } from "react-icons/lu";
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
DialogDescription,
|
||||
DialogFooter,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
} from "@/components/ui/dialog";
|
||||
import type { BrowserProfile } from "@/types";
|
||||
import { RippleButton } from "./ui/ripple";
|
||||
|
||||
interface CamoufoxDeprecationDialogProps {
|
||||
profiles: BrowserProfile[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Warns users who still have Camoufox profiles that Camoufox support is ending.
|
||||
* Shown once per app session (this component mounts for the app lifetime), only
|
||||
* when at least one Camoufox profile exists. Not a toast — a blocking dialog so
|
||||
* the deprecation can't be missed.
|
||||
*/
|
||||
export function CamoufoxDeprecationDialog({
|
||||
profiles,
|
||||
}: CamoufoxDeprecationDialogProps) {
|
||||
const { t } = useTranslation();
|
||||
const [isOpen, setIsOpen] = useState(false);
|
||||
const [shown, setShown] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (shown) return;
|
||||
const hasCamoufox = profiles.some((p) => p.browser === "camoufox");
|
||||
if (hasCamoufox) {
|
||||
setIsOpen(true);
|
||||
setShown(true);
|
||||
}
|
||||
}, [profiles, shown]);
|
||||
|
||||
return (
|
||||
<Dialog open={isOpen} onOpenChange={setIsOpen}>
|
||||
<DialogContent className="sm:max-w-md">
|
||||
<DialogHeader>
|
||||
<DialogTitle className="flex items-center gap-2">
|
||||
<LuTriangleAlert className="size-5 text-warning" />
|
||||
{t("camoufoxDeprecation.title")}
|
||||
</DialogTitle>
|
||||
<DialogDescription>
|
||||
{t("camoufoxDeprecation.description")}
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
<DialogFooter>
|
||||
<RippleButton
|
||||
variant="outline"
|
||||
onClick={() => {
|
||||
void openUrl(
|
||||
"https://github.com/zhom/donutbrowser/discussions/426",
|
||||
);
|
||||
}}
|
||||
>
|
||||
{t("common.buttons.learnMore")}
|
||||
</RippleButton>
|
||||
<RippleButton
|
||||
onClick={() => {
|
||||
setIsOpen(false);
|
||||
}}
|
||||
>
|
||||
{t("camoufoxDeprecation.acknowledge")}
|
||||
</RippleButton>
|
||||
</DialogFooter>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
);
|
||||
}
|
||||
@@ -84,9 +84,7 @@ export function CookieCopyDialog({
|
||||
// dead-end state (source picked = target list empty = copy button disabled).
|
||||
const eligibleSourceProfiles = useMemo(() => {
|
||||
return profiles.filter(
|
||||
(p) =>
|
||||
!selectedProfiles.includes(p.id) &&
|
||||
(p.browser === "wayfern" || p.browser === "camoufox"),
|
||||
(p) => !selectedProfiles.includes(p.id) && p.browser === "wayfern",
|
||||
);
|
||||
}, [profiles, selectedProfiles]);
|
||||
|
||||
@@ -95,7 +93,7 @@ export function CookieCopyDialog({
|
||||
(p) =>
|
||||
selectedProfiles.includes(p.id) &&
|
||||
p.id !== sourceProfileId &&
|
||||
(p.browser === "wayfern" || p.browser === "camoufox"),
|
||||
p.browser === "wayfern",
|
||||
);
|
||||
}, [profiles, selectedProfiles, sourceProfileId]);
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ const getCurrentOS = (): WayfernOS => {
|
||||
|
||||
import { RippleButton } from "./ui/ripple";
|
||||
|
||||
type BrowserTypeString = "camoufox" | "wayfern";
|
||||
type BrowserTypeString = "wayfern";
|
||||
|
||||
interface CreateProfileDialogProps {
|
||||
isOpen: boolean;
|
||||
@@ -113,8 +113,8 @@ export function CreateProfileDialog({
|
||||
const proxyListboxIdAntiDetect = useId();
|
||||
const proxyListboxIdRegular = useId();
|
||||
const [profileName, setProfileName] = useState("");
|
||||
// Camoufox is deprecated: only Wayfern profiles can be created, so the dialog
|
||||
// opens straight into the Wayfern config step (no browser-selection screen).
|
||||
// Only Wayfern profiles can be created, so the dialog opens straight into
|
||||
// the Wayfern config step (no browser-selection screen).
|
||||
const [currentStep, setCurrentStep] = useState<
|
||||
"browser-selection" | "browser-config"
|
||||
>("browser-config");
|
||||
@@ -139,8 +139,7 @@ export function CreateProfileDialog({
|
||||
setCurrentStep("browser-config");
|
||||
};
|
||||
|
||||
// Reset the form fields without leaving the Wayfern config step — Camoufox is
|
||||
// deprecated, so there is no browser-selection screen to go back to.
|
||||
// Reset the form fields without leaving the Wayfern config step.
|
||||
const resetForm = () => {
|
||||
setSelectedBrowser("wayfern");
|
||||
setProfileName("");
|
||||
@@ -286,8 +285,7 @@ export function CreateProfileDialog({
|
||||
useEffect(() => {
|
||||
if (isOpen) {
|
||||
void loadSupportedBrowsers();
|
||||
// Load downloaded Wayfern versions up front so the availability gate is
|
||||
// accurate. Camoufox is deprecated and no longer creatable.
|
||||
// Load downloaded Wayfern versions up front so the availability gate is accurate.
|
||||
void loadDownloadedVersions("wayfern");
|
||||
// Load release types when a browser is selected
|
||||
if (selectedBrowser) {
|
||||
@@ -395,7 +393,7 @@ export function CreateProfileDialog({
|
||||
: undefined;
|
||||
try {
|
||||
if (activeTab === "anti-detect") {
|
||||
// Camoufox is deprecated — only Wayfern anti-detect profiles are created.
|
||||
// Only Wayfern anti-detect profiles are created.
|
||||
const bestWayfernVersion = getCreatableVersion("wayfern");
|
||||
if (!bestWayfernVersion) {
|
||||
console.error("No Wayfern version available");
|
||||
@@ -430,7 +428,7 @@ export function CreateProfileDialog({
|
||||
return;
|
||||
}
|
||||
|
||||
// Use the best available version (stable preferred, nightly as fallback)
|
||||
// Use the latest available Wayfern version
|
||||
const bestVersion = getCreatableVersion(selectedBrowser);
|
||||
if (!bestVersion) {
|
||||
console.error("No version available");
|
||||
@@ -465,8 +463,7 @@ export function CreateProfileDialog({
|
||||
// Cancel any ongoing loading
|
||||
loadingBrowserRef.current = null;
|
||||
|
||||
// Reset all states. Stay on the Wayfern config step — Camoufox is
|
||||
// deprecated, so the browser-selection screen is gone.
|
||||
// Reset all states. Stay on the Wayfern config step.
|
||||
setProfileName("");
|
||||
setCurrentStep("browser-config");
|
||||
setActiveTab("anti-detect");
|
||||
@@ -535,10 +532,7 @@ export function CreateProfileDialog({
|
||||
{currentStep === "browser-selection"
|
||||
? t("createProfile.title")
|
||||
: t("createProfile.configureTitle", {
|
||||
browser:
|
||||
selectedBrowser === "wayfern"
|
||||
? t("createProfile.chromiumLabel")
|
||||
: t("createProfile.firefoxLabel"),
|
||||
browser: t("createProfile.chromiumLabel"),
|
||||
})}
|
||||
</DialogTitle>
|
||||
</DialogHeader>
|
||||
@@ -591,9 +585,6 @@ export function CreateProfileDialog({
|
||||
</div>
|
||||
</Button>
|
||||
|
||||
{/* Camoufox is deprecated — no longer offered for new
|
||||
profiles. Only Wayfern can be created. */}
|
||||
|
||||
{!getCreatableVersion("wayfern") && (
|
||||
<p className="pt-2 text-center text-sm text-muted-foreground">
|
||||
{t("createProfile.browsersDownloading")}
|
||||
@@ -616,7 +607,6 @@ export function CreateProfileDialog({
|
||||
|
||||
<div className="space-y-3">
|
||||
{regularBrowsers.map((browser) => {
|
||||
if (browser.value === "camoufox") return null; // Skip camoufox as it's handled in anti-detect tab
|
||||
const IconComponent = getBrowserIcon(browser.value);
|
||||
return (
|
||||
<Button
|
||||
@@ -904,8 +894,7 @@ export function CreateProfileDialog({
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
// Regular Browser Configuration (should not happen in
|
||||
// the anti-detect tab; Camoufox creation is removed).
|
||||
// Regular Browser Configuration (should not happen in the anti-detect tab).
|
||||
<div className="space-y-4">
|
||||
{selectedBrowser && (
|
||||
<div className="space-y-3">
|
||||
|
||||
@@ -13,7 +13,7 @@ import { invoke } from "@tauri-apps/api/core";
|
||||
import { listen } from "@tauri-apps/api/event";
|
||||
import { useCallback, useEffect, useMemo, useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { FaChrome, FaFirefox } from "react-icons/fa";
|
||||
import { FaChrome } from "react-icons/fa";
|
||||
import { GoPlus } from "react-icons/go";
|
||||
import {
|
||||
LuChevronDown,
|
||||
@@ -652,34 +652,19 @@ export function ExtensionManagementDialog({
|
||||
const renderCompatIcons = useCallback(
|
||||
(compat: string[]) => {
|
||||
const hasChromium = compat.includes("chromium");
|
||||
const hasFirefox = compat.includes("firefox");
|
||||
if (!hasChromium && !hasFirefox) return null;
|
||||
if (!hasChromium) return null;
|
||||
return (
|
||||
<div className="flex shrink-0 items-center gap-1">
|
||||
{hasChromium && (
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<span className="inline-flex">
|
||||
<FaChrome className="size-3.5 text-muted-foreground" />
|
||||
</span>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent>
|
||||
{t("extensions.compatibility.chromium")}
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
)}
|
||||
{hasFirefox && (
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<span className="inline-flex">
|
||||
<FaFirefox className="size-3.5 text-muted-foreground" />
|
||||
</span>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent>
|
||||
{t("extensions.compatibility.firefox")}
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
)}
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<span className="inline-flex">
|
||||
<FaChrome className="size-3.5 text-muted-foreground" />
|
||||
</span>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent>
|
||||
{t("extensions.compatibility.chromium")}
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
|
||||
@@ -39,9 +39,7 @@ import { cn } from "@/lib/utils";
|
||||
import type { DetectedProfile, WayfernConfig } from "@/types";
|
||||
import { RippleButton } from "./ui/ripple";
|
||||
|
||||
const getMappedBrowser = (browser: string): "camoufox" | "wayfern" => {
|
||||
if (["firefox", "firefox-developer", "zen"].includes(browser))
|
||||
return "camoufox";
|
||||
const getMappedBrowser = (_browser: string): "wayfern" => {
|
||||
return "wayfern";
|
||||
};
|
||||
|
||||
@@ -90,8 +88,7 @@ export function ImportProfileDialog({
|
||||
useBrowserSupport();
|
||||
const { storedProxies } = useProxyEvents();
|
||||
|
||||
// Firefox-based browsers map to the deprecated Camoufox and can no longer be
|
||||
// imported (the backend rejects them); only offer Chromium-family sources.
|
||||
// Only Chromium-family browsers can be imported as Wayfern profiles.
|
||||
const importableBrowsers = supportedBrowsers.filter(
|
||||
(browser) => getMappedBrowser(browser) === "wayfern",
|
||||
);
|
||||
@@ -189,8 +186,6 @@ export function ImportProfileDialog({
|
||||
browserType,
|
||||
newProfileName,
|
||||
proxyId: selectedProxyId ?? null,
|
||||
// Camoufox import is deprecated/blocked; only Wayfern configs are sent.
|
||||
camoufoxConfig: null,
|
||||
wayfernConfig: mappedBrowser === "wayfern" ? wayfernConfig : null,
|
||||
});
|
||||
|
||||
@@ -587,8 +582,6 @@ export function ImportProfileDialog({
|
||||
</Select>
|
||||
</div>
|
||||
|
||||
{/* Only Wayfern profiles are importable now (Camoufox/Firefox
|
||||
import is deprecated and blocked). */}
|
||||
<WayfernConfigForm
|
||||
config={wayfernConfig}
|
||||
onConfigChange={(key, value) => {
|
||||
|
||||
@@ -209,7 +209,7 @@ interface TableMeta {
|
||||
|
||||
// Overflow actions
|
||||
onAssignProfilesToGroup?: (profileIds: string[]) => void;
|
||||
onConfigureCamoufox?: (profile: BrowserProfile) => void;
|
||||
onConfigureWayfern?: (profile: BrowserProfile) => void;
|
||||
onCloneProfile?: (profile: BrowserProfile) => void;
|
||||
onCopyCookiesToProfile?: (profile: BrowserProfile) => void;
|
||||
onOpenCookieManagement?: (profile: BrowserProfile) => void;
|
||||
@@ -1127,7 +1127,7 @@ interface ProfilesDataTableProps {
|
||||
onCloneProfile: (profile: BrowserProfile) => void | Promise<void>;
|
||||
onDeleteProfile: (profile: BrowserProfile) => void | Promise<void>;
|
||||
onRenameProfile: (profileId: string, newName: string) => Promise<void>;
|
||||
onConfigureCamoufox: (profile: BrowserProfile) => void;
|
||||
onConfigureWayfern: (profile: BrowserProfile) => void;
|
||||
onCopyCookiesToProfile?: (profile: BrowserProfile) => void;
|
||||
onOpenCookieManagement?: (profile: BrowserProfile) => void;
|
||||
runningProfiles: Set<string>;
|
||||
@@ -1177,7 +1177,7 @@ export function ProfilesDataTable({
|
||||
onCloneProfile,
|
||||
onDeleteProfile,
|
||||
onRenameProfile,
|
||||
onConfigureCamoufox,
|
||||
onConfigureWayfern,
|
||||
onCopyCookiesToProfile,
|
||||
onOpenCookieManagement,
|
||||
runningProfiles,
|
||||
@@ -1952,7 +1952,7 @@ export function ProfilesDataTable({
|
||||
void onCloneProfile(profile);
|
||||
}
|
||||
: undefined,
|
||||
onConfigureCamoufox,
|
||||
onConfigureWayfern,
|
||||
onCopyCookiesToProfile,
|
||||
onOpenCookieManagement,
|
||||
|
||||
@@ -2030,7 +2030,7 @@ export function ProfilesDataTable({
|
||||
onLaunchProfile,
|
||||
onAssignProfilesToGroup,
|
||||
onCloneProfile,
|
||||
onConfigureCamoufox,
|
||||
onConfigureWayfern,
|
||||
onCopyCookiesToProfile,
|
||||
onOpenCookieManagement,
|
||||
syncStatuses,
|
||||
@@ -2086,10 +2086,7 @@ export function ProfilesDataTable({
|
||||
|
||||
// Cross-OS profiles: show OS icon when checkboxes aren't visible, show checkbox when they are
|
||||
if (isCrossOs && !meta.showCheckboxes && !isSelected) {
|
||||
const resolvedOs =
|
||||
profile.host_os ||
|
||||
profile.camoufox_config?.os ||
|
||||
profile.wayfern_config?.os;
|
||||
const resolvedOs = profile.host_os || profile.wayfern_config?.os;
|
||||
const osName = resolvedOs
|
||||
? getOSDisplayName(resolvedOs)
|
||||
: "another OS";
|
||||
@@ -2128,10 +2125,7 @@ export function ProfilesDataTable({
|
||||
|
||||
// Cross-OS profiles with checkboxes visible: show checkbox (selectable for bulk delete)
|
||||
if (isCrossOs && (meta.showCheckboxes || isSelected)) {
|
||||
const resolvedOs =
|
||||
profile.host_os ||
|
||||
profile.camoufox_config?.os ||
|
||||
profile.wayfern_config?.os;
|
||||
const resolvedOs = profile.host_os || profile.wayfern_config?.os;
|
||||
const osName = resolvedOs
|
||||
? getOSDisplayName(resolvedOs)
|
||||
: "another OS";
|
||||
@@ -3183,7 +3177,6 @@ export function ProfilesDataTable({
|
||||
? t("crossOs.viewOnly", {
|
||||
os: getOSDisplayName(
|
||||
row.original.host_os ||
|
||||
row.original.camoufox_config?.os ||
|
||||
row.original.wayfern_config?.os ||
|
||||
"",
|
||||
),
|
||||
@@ -3273,7 +3266,7 @@ export function ProfilesDataTable({
|
||||
}}
|
||||
onOpenProfileSyncDialog={onOpenProfileSyncDialog}
|
||||
onAssignProfilesToGroup={onAssignProfilesToGroup}
|
||||
onConfigureCamoufox={onConfigureCamoufox}
|
||||
onConfigureWayfern={onConfigureWayfern}
|
||||
onCopyCookiesToProfile={onCopyCookiesToProfile}
|
||||
onOpenCookieManagement={onOpenCookieManagement}
|
||||
onAssignExtensionGroup={onAssignExtensionGroup}
|
||||
|
||||
@@ -33,7 +33,7 @@ import {
|
||||
LuUsers,
|
||||
LuX,
|
||||
} from "react-icons/lu";
|
||||
import { SharedCamoufoxConfigForm } from "@/components/shared-camoufox-config-form";
|
||||
import { SharedFingerprintConfigForm } from "@/components/shared-fingerprint-config-form";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import {
|
||||
ColorPicker,
|
||||
@@ -71,7 +71,6 @@ import {
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from "@/components/ui/select";
|
||||
import { WayfernConfigForm } from "@/components/wayfern-config-form";
|
||||
import { translateBackendError } from "@/lib/backend-errors";
|
||||
import { getProfileIcon } from "@/lib/browser-utils";
|
||||
import { formatRelativeTime } from "@/lib/flag-utils";
|
||||
@@ -79,7 +78,6 @@ import { showErrorToast, showSuccessToast } from "@/lib/toast-utils";
|
||||
import { cn } from "@/lib/utils";
|
||||
import type {
|
||||
BrowserProfile,
|
||||
CamoufoxConfig,
|
||||
ProfileGroup,
|
||||
StoredProxy,
|
||||
VpnConfig,
|
||||
@@ -95,7 +93,7 @@ interface ProfileInfoDialogProps {
|
||||
onOpenTrafficDialog?: (profileId: string) => void;
|
||||
onOpenProfileSyncDialog?: (profile: BrowserProfile) => void;
|
||||
onAssignProfilesToGroup?: (profileIds: string[]) => void;
|
||||
onConfigureCamoufox?: (profile: BrowserProfile) => void;
|
||||
onConfigureWayfern?: (profile: BrowserProfile) => void;
|
||||
onCopyCookiesToProfile?: (profile: BrowserProfile) => void;
|
||||
onOpenCookieManagement?: (profile: BrowserProfile) => void;
|
||||
onAssignExtensionGroup?: (profileIds: string[]) => void;
|
||||
@@ -271,7 +269,7 @@ export function ProfileInfoDialog({
|
||||
onOpenTrafficDialog,
|
||||
onOpenProfileSyncDialog,
|
||||
onAssignProfilesToGroup,
|
||||
onConfigureCamoufox,
|
||||
onConfigureWayfern,
|
||||
onCopyCookiesToProfile,
|
||||
onOpenCookieManagement,
|
||||
onAssignExtensionGroup,
|
||||
@@ -340,8 +338,7 @@ export function ProfileInfoDialog({
|
||||
if (!profile) return null;
|
||||
|
||||
const ProfileIcon = getProfileIcon(profile);
|
||||
const isCamoufoxOrWayfern =
|
||||
profile.browser === "camoufox" || profile.browser === "wayfern";
|
||||
const isWayfern = profile.browser === "wayfern";
|
||||
const isDeleteDisabled = isRunning;
|
||||
|
||||
const proxyName = profile.proxy_id
|
||||
@@ -435,13 +432,13 @@ export function ProfileInfoDialog({
|
||||
icon: <LuFingerprint className="size-4" />,
|
||||
label: t("profiles.actions.changeFingerprint"),
|
||||
onClick: () => {
|
||||
handleAction(() => onConfigureCamoufox?.(profile));
|
||||
handleAction(() => onConfigureWayfern?.(profile));
|
||||
},
|
||||
// Viewing and editing fingerprints both require an active paid plan.
|
||||
disabled: isDisabled || !crossOsUnlocked,
|
||||
proBadge: !crossOsUnlocked,
|
||||
runningBadge: isRunning,
|
||||
hidden: !isCamoufoxOrWayfern || !onConfigureCamoufox,
|
||||
hidden: !isWayfern || !onConfigureWayfern,
|
||||
},
|
||||
{
|
||||
icon: <LuUsers className="size-4" />,
|
||||
@@ -463,9 +460,7 @@ export function ProfileInfoDialog({
|
||||
disabled: isDisabled,
|
||||
runningBadge: isRunning,
|
||||
hidden:
|
||||
!isCamoufoxOrWayfern ||
|
||||
profile.ephemeral === true ||
|
||||
!onCopyCookiesToProfile,
|
||||
!isWayfern || profile.ephemeral === true || !onCopyCookiesToProfile,
|
||||
},
|
||||
{
|
||||
id: "cookiesManage",
|
||||
@@ -477,9 +472,7 @@ export function ProfileInfoDialog({
|
||||
disabled: isDisabled,
|
||||
runningBadge: isRunning,
|
||||
hidden:
|
||||
!isCamoufoxOrWayfern ||
|
||||
profile.ephemeral === true ||
|
||||
!onOpenCookieManagement,
|
||||
!isWayfern || profile.ephemeral === true || !onOpenCookieManagement,
|
||||
},
|
||||
{
|
||||
icon: <LuSettings className="size-4" />,
|
||||
@@ -1772,9 +1765,8 @@ function CookiesSectionInline({
|
||||
// Inline password set / change / remove form. Replaces three separate
|
||||
// nested modal dialogs with one in-page form that branches on the current
|
||||
// `password_protected` state of the profile.
|
||||
// Inline fingerprint editor. Reuses SharedCamoufoxConfigForm (Camoufox/Firefox
|
||||
// engine) and WayfernConfigForm (Chromium engine) so the same field set as
|
||||
// the standalone dialog is available without opening a nested modal.
|
||||
// Inline fingerprint editor. Reuses SharedFingerprintConfigForm so the same
|
||||
// field set as the standalone dialog is available without opening a nested modal.
|
||||
function FingerprintSectionInline({
|
||||
profile,
|
||||
isDisabled,
|
||||
@@ -1788,9 +1780,6 @@ function FingerprintSectionInline({
|
||||
onSaved: () => void;
|
||||
t: (key: string, options?: Record<string, unknown>) => string;
|
||||
}) {
|
||||
const [camoufoxConfig, setCamoufoxConfig] = React.useState<CamoufoxConfig>(
|
||||
() => profile.camoufox_config ?? {},
|
||||
);
|
||||
const [wayfernConfig, setWayfernConfig] = React.useState<WayfernConfig>(
|
||||
() => profile.wayfern_config ?? {},
|
||||
);
|
||||
@@ -1798,19 +1787,15 @@ function FingerprintSectionInline({
|
||||
const [error, setError] = React.useState<string | null>(null);
|
||||
const [success, setSuccess] = React.useState<string | null>(null);
|
||||
|
||||
// When the underlying profile changes (e.g. a different profile is opened
|
||||
// in the dialog) reset the local form state to match.
|
||||
React.useEffect(() => {
|
||||
setCamoufoxConfig(profile.camoufox_config ?? {});
|
||||
setWayfernConfig(profile.wayfern_config ?? {});
|
||||
setError(null);
|
||||
setSuccess(null);
|
||||
}, [profile.camoufox_config, profile.wayfern_config]);
|
||||
}, [profile.wayfern_config]);
|
||||
|
||||
const isCamoufox = profile.browser === "camoufox";
|
||||
const isWayfern = profile.browser === "wayfern";
|
||||
|
||||
if (!isCamoufox && !isWayfern) {
|
||||
if (!isWayfern) {
|
||||
return (
|
||||
<div className="flex flex-col gap-3">
|
||||
<div className="flex items-center gap-2 text-sm font-semibold">
|
||||
@@ -1824,9 +1809,6 @@ function FingerprintSectionInline({
|
||||
);
|
||||
}
|
||||
|
||||
// Viewing and editing fingerprints both require an active paid plan
|
||||
// (`crossOsUnlocked` is that paid flag here). Render a locked state instead of
|
||||
// the editor so free users can neither see nor change the fingerprint.
|
||||
if (!crossOsUnlocked) {
|
||||
return (
|
||||
<div className="flex flex-col items-center gap-3 rounded-lg border p-6 text-center">
|
||||
@@ -1841,10 +1823,6 @@ function FingerprintSectionInline({
|
||||
);
|
||||
}
|
||||
|
||||
const onCamoufoxChange = (key: keyof CamoufoxConfig, value: unknown) => {
|
||||
setCamoufoxConfig((prev) => ({ ...prev, [key]: value }));
|
||||
setSuccess(null);
|
||||
};
|
||||
const onWayfernChange = (key: keyof WayfernConfig, value: unknown) => {
|
||||
setWayfernConfig((prev) => ({ ...prev, [key]: value }));
|
||||
setSuccess(null);
|
||||
@@ -1855,19 +1833,11 @@ function FingerprintSectionInline({
|
||||
setError(null);
|
||||
setSuccess(null);
|
||||
try {
|
||||
if (isCamoufox) {
|
||||
await invoke("update_camoufox_config", {
|
||||
profileId: profile.id,
|
||||
config: camoufoxConfig,
|
||||
});
|
||||
} else {
|
||||
await invoke("update_wayfern_config", {
|
||||
profileId: profile.id,
|
||||
config: wayfernConfig,
|
||||
});
|
||||
}
|
||||
await invoke("update_wayfern_config", {
|
||||
profileId: profile.id,
|
||||
config: wayfernConfig,
|
||||
});
|
||||
setSuccess(t("common.buttons.saved"));
|
||||
// Close the dialog once the fingerprint is saved.
|
||||
onSaved();
|
||||
} catch (e) {
|
||||
setError(translateBackendError(t as never, e));
|
||||
@@ -1876,12 +1846,8 @@ function FingerprintSectionInline({
|
||||
}
|
||||
};
|
||||
|
||||
const initial = isCamoufox
|
||||
? JSON.stringify(profile.camoufox_config ?? {})
|
||||
: JSON.stringify(profile.wayfern_config ?? {});
|
||||
const current = isCamoufox
|
||||
? JSON.stringify(camoufoxConfig)
|
||||
: JSON.stringify(wayfernConfig);
|
||||
const initial = JSON.stringify(profile.wayfern_config ?? {});
|
||||
const current = JSON.stringify(wayfernConfig);
|
||||
const dirty = current !== initial;
|
||||
|
||||
return (
|
||||
@@ -1894,30 +1860,16 @@ function FingerprintSectionInline({
|
||||
{t("profileInfo.sectionDesc.fingerprint")}
|
||||
</p>
|
||||
|
||||
{isCamoufox && (
|
||||
<SharedCamoufoxConfigForm
|
||||
config={camoufoxConfig}
|
||||
onConfigChange={onCamoufoxChange}
|
||||
forceAdvanced={true}
|
||||
readOnly={isDisabled}
|
||||
browserType="camoufox"
|
||||
crossOsUnlocked={crossOsUnlocked}
|
||||
limitedMode={false}
|
||||
profileVersion={profile.version}
|
||||
profileBrowser={profile.browser}
|
||||
/>
|
||||
)}
|
||||
{isWayfern && (
|
||||
<WayfernConfigForm
|
||||
config={wayfernConfig}
|
||||
onConfigChange={onWayfernChange}
|
||||
forceAdvanced={true}
|
||||
readOnly={isDisabled}
|
||||
crossOsUnlocked={crossOsUnlocked}
|
||||
profileVersion={profile.version}
|
||||
profileBrowser={profile.browser}
|
||||
/>
|
||||
)}
|
||||
<SharedFingerprintConfigForm
|
||||
config={wayfernConfig}
|
||||
onConfigChange={onWayfernChange}
|
||||
forceAdvanced={true}
|
||||
readOnly={isDisabled}
|
||||
crossOsUnlocked={crossOsUnlocked}
|
||||
limitedMode={false}
|
||||
profileVersion={profile.version}
|
||||
profileBrowser={profile.browser}
|
||||
/>
|
||||
|
||||
{error && <p className="text-xs text-destructive">{error}</p>}
|
||||
{success && !error && <p className="text-xs text-success">{success}</p>}
|
||||
@@ -1939,7 +1891,6 @@ function FingerprintSectionInline({
|
||||
variant="ghost"
|
||||
className="h-7 text-xs"
|
||||
onClick={() => {
|
||||
setCamoufoxConfig(profile.camoufox_config ?? {});
|
||||
setWayfernConfig(profile.wayfern_config ?? {});
|
||||
setError(null);
|
||||
setSuccess(null);
|
||||
|
||||
@@ -1,200 +0,0 @@
|
||||
"use client";
|
||||
|
||||
import { useId, useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { LuCheck, LuChevronsUpDown, LuDownload } from "react-icons/lu";
|
||||
import { LoadingButton } from "@/components/loading-button";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import {
|
||||
Command,
|
||||
CommandEmpty,
|
||||
CommandGroup,
|
||||
CommandItem,
|
||||
CommandList,
|
||||
} from "@/components/ui/command";
|
||||
import {
|
||||
Popover,
|
||||
PopoverContent,
|
||||
PopoverTrigger,
|
||||
} from "@/components/ui/popover";
|
||||
import { cn } from "@/lib/utils";
|
||||
import type { BrowserReleaseTypes } from "@/types";
|
||||
import { RippleButton } from "./ui/ripple";
|
||||
|
||||
interface ReleaseTypeSelectorProps {
|
||||
selectedReleaseType: "stable" | "nightly" | null;
|
||||
onReleaseTypeSelect: (releaseType: "stable" | "nightly" | null) => void;
|
||||
availableReleaseTypes: BrowserReleaseTypes;
|
||||
isDownloading: boolean;
|
||||
onDownload: () => void;
|
||||
placeholder?: string;
|
||||
showDownloadButton?: boolean;
|
||||
downloadedVersions?: string[];
|
||||
}
|
||||
|
||||
export function ReleaseTypeSelector({
|
||||
selectedReleaseType,
|
||||
onReleaseTypeSelect,
|
||||
availableReleaseTypes,
|
||||
isDownloading,
|
||||
onDownload,
|
||||
placeholder,
|
||||
showDownloadButton = true,
|
||||
downloadedVersions = [],
|
||||
}: ReleaseTypeSelectorProps) {
|
||||
const { t } = useTranslation();
|
||||
const [popoverOpen, setPopoverOpen] = useState(false);
|
||||
const listboxId = useId();
|
||||
const effectivePlaceholder =
|
||||
placeholder ?? t("releaseTypeSelector.placeholder");
|
||||
|
||||
const releaseOptions = [
|
||||
...(availableReleaseTypes.stable
|
||||
? [{ type: "stable" as const, version: availableReleaseTypes.stable }]
|
||||
: []),
|
||||
...(availableReleaseTypes.nightly
|
||||
? [{ type: "nightly" as const, version: availableReleaseTypes.nightly }]
|
||||
: []),
|
||||
];
|
||||
|
||||
// Only show dropdown if there are multiple release types available
|
||||
const showDropdown = releaseOptions.length > 1;
|
||||
|
||||
// If only one release type is available, auto-select it
|
||||
if (!showDropdown && releaseOptions.length === 1 && !selectedReleaseType) {
|
||||
setTimeout(() => {
|
||||
onReleaseTypeSelect(releaseOptions[0].type);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
const selectedDisplayText = selectedReleaseType
|
||||
? selectedReleaseType === "stable"
|
||||
? t("releaseTypeSelector.stable")
|
||||
: t("releaseTypeSelector.nightly")
|
||||
: effectivePlaceholder;
|
||||
|
||||
const selectedVersion =
|
||||
selectedReleaseType === "stable"
|
||||
? availableReleaseTypes.stable
|
||||
: selectedReleaseType === "nightly"
|
||||
? availableReleaseTypes.nightly
|
||||
: null;
|
||||
|
||||
const isVersionDownloaded =
|
||||
selectedVersion && downloadedVersions.includes(selectedVersion);
|
||||
|
||||
return (
|
||||
<div className="space-y-4">
|
||||
{showDropdown ? (
|
||||
<Popover open={popoverOpen} onOpenChange={setPopoverOpen} modal={true}>
|
||||
<PopoverTrigger asChild>
|
||||
<RippleButton
|
||||
variant="outline"
|
||||
role="combobox"
|
||||
aria-expanded={popoverOpen}
|
||||
aria-controls={listboxId}
|
||||
className="w-full justify-between"
|
||||
>
|
||||
{selectedDisplayText}
|
||||
<LuChevronsUpDown className="ml-2 size-4 shrink-0 opacity-50" />
|
||||
</RippleButton>
|
||||
</PopoverTrigger>
|
||||
<PopoverContent id={listboxId} className="p-0">
|
||||
<Command>
|
||||
<CommandEmpty>
|
||||
{t("releaseTypeSelector.noReleaseTypes")}
|
||||
</CommandEmpty>
|
||||
<CommandList>
|
||||
<CommandGroup>
|
||||
{releaseOptions.map((option) => {
|
||||
const isDownloaded = downloadedVersions.includes(
|
||||
option.version,
|
||||
);
|
||||
return (
|
||||
<CommandItem
|
||||
key={option.type}
|
||||
value={option.type}
|
||||
onSelect={(currentValue) => {
|
||||
const selectedType = currentValue as
|
||||
| "stable"
|
||||
| "nightly";
|
||||
onReleaseTypeSelect(
|
||||
selectedType === selectedReleaseType
|
||||
? null
|
||||
: selectedType,
|
||||
);
|
||||
setPopoverOpen(false);
|
||||
}}
|
||||
>
|
||||
<LuCheck
|
||||
className={cn(
|
||||
"mr-2 size-4",
|
||||
selectedReleaseType === option.type
|
||||
? "opacity-100"
|
||||
: "opacity-0",
|
||||
)}
|
||||
/>
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="capitalize">{option.type}</span>
|
||||
{option.type === "nightly" && (
|
||||
<Badge variant="secondary" className="text-xs">
|
||||
{t("releaseTypeSelector.nightly")}
|
||||
</Badge>
|
||||
)}
|
||||
<Badge variant="outline" className="text-xs">
|
||||
{option.version}
|
||||
</Badge>
|
||||
{isDownloaded && (
|
||||
<Badge variant="default" className="text-xs">
|
||||
{t("releaseTypeSelector.downloaded")}
|
||||
</Badge>
|
||||
)}
|
||||
</div>
|
||||
</CommandItem>
|
||||
);
|
||||
})}
|
||||
</CommandGroup>
|
||||
</CommandList>
|
||||
</Command>
|
||||
</PopoverContent>
|
||||
</Popover>
|
||||
) : (
|
||||
// Show a simple display when only one release type is available
|
||||
releaseOptions.length === 1 && (
|
||||
<div className="flex items-center justify-center gap-2 rounded-md border bg-muted/50 p-3">
|
||||
<span className="text-sm font-medium capitalize">
|
||||
{releaseOptions[0].type}
|
||||
</span>
|
||||
<Badge variant="outline" className="text-xs">
|
||||
{releaseOptions[0].version}
|
||||
</Badge>
|
||||
{downloadedVersions.includes(releaseOptions[0].version) && (
|
||||
<Badge variant="default" className="text-xs">
|
||||
{t("releaseTypeSelector.downloaded")}
|
||||
</Badge>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
)}
|
||||
|
||||
{showDownloadButton &&
|
||||
selectedReleaseType &&
|
||||
selectedVersion &&
|
||||
!isVersionDownloaded && (
|
||||
<LoadingButton
|
||||
isLoading={isDownloading}
|
||||
onClick={() => {
|
||||
onDownload();
|
||||
}}
|
||||
variant="outline"
|
||||
className="w-full"
|
||||
>
|
||||
<LuDownload className="mr-2 size-4" />
|
||||
{isDownloading
|
||||
? t("releaseTypeSelector.downloading")
|
||||
: t("releaseTypeSelector.downloadBrowser")}
|
||||
</LoadingButton>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
export { WayfernConfigForm as SharedFingerprintConfigForm } from "@/components/wayfern-config-form";
|
||||
@@ -0,0 +1,163 @@
|
||||
"use client";
|
||||
|
||||
import { useEffect, useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { SharedFingerprintConfigForm } from "@/components/shared-fingerprint-config-form";
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
DialogFooter,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
} from "@/components/ui/dialog";
|
||||
import { ScrollArea } from "@/components/ui/scroll-area";
|
||||
import type { BrowserProfile, WayfernConfig, WayfernOS } from "@/types";
|
||||
import { LoadingButton } from "./loading-button";
|
||||
import { RippleButton } from "./ui/ripple";
|
||||
|
||||
const getCurrentOS = (): WayfernOS => {
|
||||
if (typeof navigator === "undefined") return "linux";
|
||||
const platform = navigator.platform.toLowerCase();
|
||||
if (platform.includes("win")) return "windows";
|
||||
if (platform.includes("mac")) return "macos";
|
||||
return "linux";
|
||||
};
|
||||
|
||||
interface WayfernConfigDialogProps {
|
||||
isOpen: boolean;
|
||||
onClose: () => void;
|
||||
profile: BrowserProfile | null;
|
||||
onSave: (profile: BrowserProfile, config: WayfernConfig) => Promise<void>;
|
||||
isRunning?: boolean;
|
||||
crossOsUnlocked?: boolean;
|
||||
}
|
||||
|
||||
export function WayfernConfigDialog({
|
||||
isOpen,
|
||||
onClose,
|
||||
profile,
|
||||
onSave,
|
||||
isRunning = false,
|
||||
crossOsUnlocked = false,
|
||||
}: WayfernConfigDialogProps) {
|
||||
const { t } = useTranslation();
|
||||
const [config, setConfig] = useState<WayfernConfig>(() => ({
|
||||
geoip: true,
|
||||
os: getCurrentOS(),
|
||||
}));
|
||||
const [isSaving, setIsSaving] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (profile?.browser === "wayfern") {
|
||||
setConfig(
|
||||
profile.wayfern_config || {
|
||||
geoip: true,
|
||||
os: getCurrentOS(),
|
||||
},
|
||||
);
|
||||
}
|
||||
}, [profile]);
|
||||
|
||||
const updateConfig = (key: keyof WayfernConfig, value: unknown) => {
|
||||
setConfig((prev) => ({ ...prev, [key]: value }));
|
||||
};
|
||||
|
||||
const handleSave = async () => {
|
||||
if (!profile) return;
|
||||
|
||||
if (config.fingerprint) {
|
||||
try {
|
||||
JSON.parse(config.fingerprint);
|
||||
} catch (_error) {
|
||||
const { toast } = await import("sonner");
|
||||
toast.error(t("wayfernConfigDialog.invalidFingerprint"), {
|
||||
description: t("wayfernConfigDialog.invalidFingerprintDescription"),
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
setIsSaving(true);
|
||||
try {
|
||||
await onSave(profile, config);
|
||||
onClose();
|
||||
} catch (error) {
|
||||
console.error("Failed to save config:", error);
|
||||
const { toast } = await import("sonner");
|
||||
toast.error(t("wayfernConfigDialog.saveFailed"), {
|
||||
description:
|
||||
error instanceof Error
|
||||
? error.message
|
||||
: t("wayfernConfigDialog.unknownError"),
|
||||
});
|
||||
} finally {
|
||||
setIsSaving(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
if (profile?.browser === "wayfern") {
|
||||
setConfig(
|
||||
profile.wayfern_config || {
|
||||
geoip: true,
|
||||
os: getCurrentOS(),
|
||||
},
|
||||
);
|
||||
}
|
||||
onClose();
|
||||
};
|
||||
|
||||
if (profile?.browser !== "wayfern") {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Dialog open={isOpen} onOpenChange={handleClose}>
|
||||
<DialogContent className="flex h-[min(85vh,52rem)] max-w-3xl flex-col">
|
||||
<DialogHeader className="shrink-0">
|
||||
<DialogTitle>
|
||||
{isRunning
|
||||
? t("wayfernConfigDialog.titleView", {
|
||||
name: profile.name,
|
||||
browser: "Wayfern",
|
||||
})
|
||||
: t("wayfernConfigDialog.titleConfigure", {
|
||||
name: profile.name,
|
||||
browser: "Wayfern",
|
||||
})}
|
||||
</DialogTitle>
|
||||
</DialogHeader>
|
||||
|
||||
<ScrollArea className="min-h-0 flex-1">
|
||||
<div className="py-4">
|
||||
<SharedFingerprintConfigForm
|
||||
config={config}
|
||||
onConfigChange={updateConfig}
|
||||
forceAdvanced={true}
|
||||
readOnly={isRunning}
|
||||
crossOsUnlocked={crossOsUnlocked}
|
||||
limitedMode={!crossOsUnlocked}
|
||||
profileVersion={profile.version}
|
||||
profileBrowser="wayfern"
|
||||
/>
|
||||
</div>
|
||||
</ScrollArea>
|
||||
|
||||
<DialogFooter className="shrink-0 border-t pt-4">
|
||||
<RippleButton variant="outline" onClick={handleClose}>
|
||||
{isRunning ? t("common.buttons.close") : t("common.buttons.cancel")}
|
||||
</RippleButton>
|
||||
{!isRunning && (
|
||||
<LoadingButton
|
||||
isLoading={isSaving}
|
||||
onClick={handleSave}
|
||||
disabled={isSaving}
|
||||
>
|
||||
{t("common.buttons.save")}
|
||||
</LoadingButton>
|
||||
)}
|
||||
</DialogFooter>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
);
|
||||
}
|
||||
@@ -17,13 +17,11 @@ import { Label } from "@/components/ui/label";
|
||||
interface WindowResizeWarningDialogProps {
|
||||
isOpen: boolean;
|
||||
onResult: (proceed: boolean) => void;
|
||||
browserType?: string;
|
||||
}
|
||||
|
||||
export function WindowResizeWarningDialog({
|
||||
isOpen,
|
||||
onResult,
|
||||
browserType,
|
||||
}: WindowResizeWarningDialogProps) {
|
||||
const { t } = useTranslation();
|
||||
const [dontShowAgain, setDontShowAgain] = useState(false);
|
||||
@@ -49,15 +47,8 @@ export function WindowResizeWarningDialog({
|
||||
onResult(false);
|
||||
};
|
||||
|
||||
const isCamoufox = browserType === "camoufox";
|
||||
|
||||
const title = isCamoufox
|
||||
? t("warnings.windowResizeCamoufoxTitle")
|
||||
: t("warnings.windowResizeTitle");
|
||||
|
||||
const description = isCamoufox
|
||||
? t("warnings.windowResizeCamoufoxDescription")
|
||||
: t("warnings.windowResizeDescription");
|
||||
const title = t("warnings.windowResizeTitle");
|
||||
const description = t("warnings.windowResizeDescription");
|
||||
|
||||
return (
|
||||
<Dialog open={isOpen}>
|
||||
|
||||
@@ -26,7 +26,6 @@ interface GithubRelease {
|
||||
|
||||
interface BrowserVersionInfo {
|
||||
version: string;
|
||||
is_prerelease: boolean;
|
||||
date: string;
|
||||
}
|
||||
|
||||
@@ -100,7 +99,7 @@ export function useBrowserDownload() {
|
||||
tag_name: versionInfo.version,
|
||||
assets: [],
|
||||
published_at: versionInfo.date,
|
||||
is_nightly: versionInfo.is_prerelease,
|
||||
is_nightly: false,
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -146,7 +145,7 @@ export function useBrowserDownload() {
|
||||
tag_name: versionInfo.version,
|
||||
assets: [],
|
||||
published_at: versionInfo.date,
|
||||
is_nightly: versionInfo.is_prerelease,
|
||||
is_nightly: false,
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -402,15 +401,8 @@ export function useBrowserDownload() {
|
||||
next.delete(progress.browser);
|
||||
return next;
|
||||
});
|
||||
// On completion, refresh the downloaded versions for this browser and also refresh camoufox,
|
||||
// since the Create dialog implicitly uses camoufox on the anti-detect tab
|
||||
try {
|
||||
await Promise.all([
|
||||
loadDownloadedVersions(progress.browser),
|
||||
progress.browser !== "camoufox"
|
||||
? loadDownloadedVersions("camoufox")
|
||||
: Promise.resolve([]),
|
||||
]);
|
||||
await loadDownloadedVersions(progress.browser);
|
||||
} catch {
|
||||
/* empty */
|
||||
}
|
||||
|
||||
@@ -157,10 +157,7 @@ export function useBrowserState(
|
||||
if (!isClient) return "Loading...";
|
||||
|
||||
if (isCrossOsProfile(profile)) {
|
||||
const profileOs =
|
||||
profile.host_os ||
|
||||
profile.camoufox_config?.os ||
|
||||
profile.wayfern_config?.os;
|
||||
const profileOs = profile.host_os || profile.wayfern_config?.os;
|
||||
if (profileOs) {
|
||||
const osName = getOSDisplayName(profileOs);
|
||||
return `This profile was created on ${osName} and cannot be launched on a different operating system.`;
|
||||
|
||||
@@ -10,7 +10,6 @@ interface UpdateNotification {
|
||||
current_version: string;
|
||||
new_version: string;
|
||||
affected_profiles: string[];
|
||||
is_stable_update: boolean;
|
||||
timestamp: number;
|
||||
is_rolling_release: boolean;
|
||||
}
|
||||
|
||||
+15
-76
@@ -340,7 +340,6 @@
|
||||
"title": "Anti-Detect Browser",
|
||||
"description": "Choose a browser with anti-detection capabilities",
|
||||
"chromium": "Wayfern",
|
||||
"firefox": "Camoufox",
|
||||
"badge": "Anti-Detect Browser"
|
||||
},
|
||||
"regular": {
|
||||
@@ -376,9 +375,6 @@
|
||||
},
|
||||
"chromiumLabel": "Chromium",
|
||||
"chromiumSubtitle": "Powered by Wayfern",
|
||||
"firefoxLabel": "Firefox",
|
||||
"firefoxSubtitle": "Powered by Camoufox",
|
||||
"camoufoxWarning": "Firefox (Camoufox) is maintained by a third-party organization. For production use, please use Chromium.",
|
||||
"platformUnavailable": "{{browser}} is not available on your platform yet.",
|
||||
"passwordProtect": {
|
||||
"label": "Password protect this profile",
|
||||
@@ -749,42 +745,6 @@
|
||||
"error": "Failed to import profile"
|
||||
},
|
||||
"config": {
|
||||
"camoufox": {
|
||||
"title": "Camoufox Configuration",
|
||||
"fingerprint": {
|
||||
"title": "Fingerprint",
|
||||
"randomize": "Randomize on Launch",
|
||||
"randomizeDescription": "Generate a new fingerprint each time the browser is launched.",
|
||||
"osCpuPlaceholder": "e.g., Intel Mac OS X 10.15",
|
||||
"webglRendererPlaceholder": "e.g., llvmpipe, or similar"
|
||||
},
|
||||
"os": {
|
||||
"title": "Operating System",
|
||||
"description": "The operating system to emulate for fingerprint generation.",
|
||||
"windows": "Windows",
|
||||
"macos": "macOS",
|
||||
"linux": "Linux"
|
||||
},
|
||||
"screen": {
|
||||
"title": "Screen Size",
|
||||
"minWidth": "Min Width",
|
||||
"maxWidth": "Max Width",
|
||||
"minHeight": "Min Height",
|
||||
"maxHeight": "Max Height"
|
||||
},
|
||||
"geoip": {
|
||||
"title": "GeoIP",
|
||||
"auto": "Automatic (based on proxy)",
|
||||
"manual": "Manual",
|
||||
"disabled": "Disabled"
|
||||
},
|
||||
"blocking": {
|
||||
"title": "Blocking",
|
||||
"images": "Block Images",
|
||||
"webrtc": "Block WebRTC",
|
||||
"webgl": "Block WebGL"
|
||||
}
|
||||
},
|
||||
"wayfern": {
|
||||
"title": "Wayfern Configuration",
|
||||
"fingerprint": {
|
||||
@@ -839,7 +799,7 @@
|
||||
"sourcePlaceholder": "Select a profile to copy cookies from",
|
||||
"running": "(running)",
|
||||
"targetProfiles": "Target Profiles ({{count}})",
|
||||
"noOtherTargets": "No other Wayfern/Camoufox profiles selected",
|
||||
"noOtherTargets": "No other Wayfern profiles selected",
|
||||
"selectSourceFirst": "Select a source profile first",
|
||||
"selectionStatus": "({{selected}} of {{total}} selected)",
|
||||
"searchPlaceholder": "Search domains or cookies...",
|
||||
@@ -968,7 +928,6 @@
|
||||
"serverError": "Server error. Please try again later.",
|
||||
"unknownError": "An unknown error occurred. Please try again.",
|
||||
"noProfilesForUrl": "No profiles available. Please create a profile first before opening URLs.",
|
||||
"updateCamoufoxConfigFailed": "Failed to update camoufox config: {{error}}",
|
||||
"updateWayfernConfigFailed": "Failed to update wayfern config: {{error}}",
|
||||
"createProfileFailed": "Failed to create profile: {{error}}",
|
||||
"launchBrowserFailed": "Failed to launch browser: {{error}}",
|
||||
@@ -977,7 +936,7 @@
|
||||
"renameProfileFailed": "Failed to rename profile: {{error}}",
|
||||
"killBrowserFailed": "Failed to kill browser: {{error}}",
|
||||
"deleteSelectedProfilesFailed": "Failed to delete selected profiles: {{error}}",
|
||||
"cookieCopyUnsupportedBrowser": "Cookie copy only works with Wayfern and Camoufox profiles",
|
||||
"cookieCopyUnsupportedBrowser": "Cookie copy only works with Wayfern profiles",
|
||||
"updateSyncSettingsFailed": "Failed to update sync settings",
|
||||
"cloneProfileFailed": "Failed to clone profile: {{error}}",
|
||||
"loadSupportedBrowsersFailed": "Failed to load supported browsers",
|
||||
@@ -994,7 +953,6 @@
|
||||
"setProfilePasswordFailed": "Failed to set profile password: {{error}}"
|
||||
},
|
||||
"browser": {
|
||||
"camoufox": "Camoufox",
|
||||
"wayfern": "Wayfern"
|
||||
},
|
||||
"fingerprint": {
|
||||
@@ -1105,8 +1063,6 @@
|
||||
"warnings": {
|
||||
"windowResizeTitle": "Custom Window Dimensions",
|
||||
"windowResizeDescription": "Changing browser window dimensions may increase the chance of website detection that browser information is spoofed.",
|
||||
"windowResizeCamoufoxTitle": "Viewport Locked by Camoufox",
|
||||
"windowResizeCamoufoxDescription": "Camoufox locks the viewport to the spoofed screen dimensions for anti-fingerprinting. Resizing the window may cause cropped or grey areas. This is expected behavior.",
|
||||
"dontShowAgain": "Don't show this again",
|
||||
"continue": "Continue",
|
||||
"cancel": "Cancel"
|
||||
@@ -1237,7 +1193,7 @@
|
||||
"cannotWhileRunning": "Stop the profile before changing its password."
|
||||
},
|
||||
"fingerprint": {
|
||||
"notSupported": "Fingerprint editing is only available for Camoufox and Wayfern profiles.",
|
||||
"notSupported": "Fingerprint editing is only available for Wayfern profiles.",
|
||||
"lockedTitle": "Viewing & editing the fingerprint is a Pro feature",
|
||||
"lockedDescription": "Fingerprint protection is included on every plan. Viewing and editing a profile's fingerprint values is what requires an active paid plan."
|
||||
},
|
||||
@@ -1267,9 +1223,7 @@
|
||||
"extensionGroup": "Extension Group",
|
||||
"compatibility": {
|
||||
"label": "Compatibility",
|
||||
"chromium": "Chromium",
|
||||
"firefox": "Firefox",
|
||||
"both": "Chromium & Firefox"
|
||||
"chromium": "Chromium"
|
||||
},
|
||||
"selectedFile": "Selected file",
|
||||
"namePlaceholder": "Extension name",
|
||||
@@ -1656,14 +1610,6 @@
|
||||
"tooltipSent": "↑ Sent: ",
|
||||
"tooltipReceived": "↓ Received: "
|
||||
},
|
||||
"camoufoxDialog": {
|
||||
"titleView": "View Fingerprint Settings - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Configure Fingerprint Settings - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Invalid fingerprint configuration",
|
||||
"invalidFingerprintDescription": "The fingerprint configuration contains invalid JSON. Please check your advanced settings.",
|
||||
"saveFailed": "Failed to save configuration",
|
||||
"unknownError": "Unknown error occurred"
|
||||
},
|
||||
"proxyCheck": {
|
||||
"unknownLocation": "Unknown",
|
||||
"locationToast": "Your proxy location is:",
|
||||
@@ -1703,15 +1649,6 @@
|
||||
"vpnsHeading": "VPNs",
|
||||
"createByCountryHeading": "Create by country"
|
||||
},
|
||||
"releaseTypeSelector": {
|
||||
"noReleaseTypes": "No release types available.",
|
||||
"placeholder": "Select release type...",
|
||||
"stable": "Stable",
|
||||
"nightly": "Nightly",
|
||||
"downloaded": "Downloaded",
|
||||
"downloadBrowser": "Download Browser",
|
||||
"downloading": "Downloading..."
|
||||
},
|
||||
"dataTableActionBar": {
|
||||
"selected": "{{count}} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
@@ -1861,7 +1798,7 @@
|
||||
"proxyNotWorking": "The selected proxy isn't working, so the profile wasn't created.",
|
||||
"proxyPaymentRequired": "The selected proxy requires payment (402) — its subscription may have expired — so the profile wasn't created.",
|
||||
"vpnNotWorking": "The selected VPN isn't working, so the profile wasn't created.",
|
||||
"camoufoxImportDeprecated": "Importing Firefox-based (Camoufox) profiles is no longer supported. Camoufox is being deprecated — please use Wayfern instead."
|
||||
"camoufoxImportDeprecated": "Importing Firefox-based profiles is no longer supported. Please use Wayfern instead."
|
||||
},
|
||||
"rail": {
|
||||
"profiles": "Profiles",
|
||||
@@ -1988,10 +1925,6 @@
|
||||
"show": "Show Donut Browser",
|
||||
"quit": "Quit"
|
||||
},
|
||||
"browserSupport": {
|
||||
"endingSoonTitle": "Browser support ending soon",
|
||||
"endingSoonDescription": "Support for the following profiles will be removed on March 15, 2026: {{profiles}}. Please migrate to Wayfern profiles."
|
||||
},
|
||||
"onboarding": {
|
||||
"steps": {
|
||||
"createProfile": {
|
||||
@@ -2073,9 +2006,15 @@
|
||||
"title": "Browser automation paused",
|
||||
"description": "Your account was temporarily restricted from Pro browser features, usually from signing in on multiple devices at once. Sign out of other devices, then relaunch the profile to restore it."
|
||||
},
|
||||
"camoufoxDeprecation": {
|
||||
"title": "Camoufox support is ending",
|
||||
"description": "Support for Camoufox profiles is ending on July 8, 2026. You have one or more Camoufox profiles. Please migrate them to Wayfern before then — after that date, Camoufox profiles may stop working.",
|
||||
"acknowledge": "Got it"
|
||||
"wayfernConfigDialog": {
|
||||
"titleView": "View Fingerprint Settings - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Configure Fingerprint Settings - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Invalid fingerprint configuration",
|
||||
"invalidFingerprintDescription": "The fingerprint configuration contains invalid JSON. Please check your advanced settings.",
|
||||
"saveFailed": "Failed to save configuration",
|
||||
"unknownError": "Unknown error occurred"
|
||||
},
|
||||
"cookieCopy": {
|
||||
"noOtherTargets": "No other Wayfern profiles selected"
|
||||
}
|
||||
}
|
||||
|
||||
+15
-76
@@ -340,7 +340,6 @@
|
||||
"title": "Navegador Anti-Detección",
|
||||
"description": "Elige un navegador con capacidades anti-detección",
|
||||
"chromium": "Wayfern",
|
||||
"firefox": "Camoufox",
|
||||
"badge": "Navegador Anti-Detección"
|
||||
},
|
||||
"regular": {
|
||||
@@ -376,9 +375,6 @@
|
||||
},
|
||||
"chromiumLabel": "Chromium",
|
||||
"chromiumSubtitle": "Impulsado por Wayfern",
|
||||
"firefoxLabel": "Firefox",
|
||||
"firefoxSubtitle": "Impulsado por Camoufox",
|
||||
"camoufoxWarning": "Firefox (Camoufox) está mantenido por una organización de terceros. Para uso en producción, utilice Chromium.",
|
||||
"platformUnavailable": "{{browser}} aún no está disponible en tu plataforma.",
|
||||
"passwordProtect": {
|
||||
"label": "Proteger este perfil con contraseña",
|
||||
@@ -749,42 +745,6 @@
|
||||
"error": "Error al importar perfil"
|
||||
},
|
||||
"config": {
|
||||
"camoufox": {
|
||||
"title": "Configuración de Camoufox",
|
||||
"fingerprint": {
|
||||
"title": "Huella Digital",
|
||||
"randomize": "Aleatorizar al Iniciar",
|
||||
"randomizeDescription": "Genera una nueva huella digital cada vez que se inicia el navegador.",
|
||||
"osCpuPlaceholder": "p. ej., Intel Mac OS X 10.15",
|
||||
"webglRendererPlaceholder": "p. ej., llvmpipe, o similar"
|
||||
},
|
||||
"os": {
|
||||
"title": "Sistema Operativo",
|
||||
"description": "El sistema operativo a emular para la generación de huellas digitales.",
|
||||
"windows": "Windows",
|
||||
"macos": "macOS",
|
||||
"linux": "Linux"
|
||||
},
|
||||
"screen": {
|
||||
"title": "Tamaño de Pantalla",
|
||||
"minWidth": "Ancho Mín",
|
||||
"maxWidth": "Ancho Máx",
|
||||
"minHeight": "Alto Mín",
|
||||
"maxHeight": "Alto Máx"
|
||||
},
|
||||
"geoip": {
|
||||
"title": "GeoIP",
|
||||
"auto": "Automático (basado en proxy)",
|
||||
"manual": "Manual",
|
||||
"disabled": "Deshabilitado"
|
||||
},
|
||||
"blocking": {
|
||||
"title": "Bloqueo",
|
||||
"images": "Bloquear Imágenes",
|
||||
"webrtc": "Bloquear WebRTC",
|
||||
"webgl": "Bloquear WebGL"
|
||||
}
|
||||
},
|
||||
"wayfern": {
|
||||
"title": "Configuración de Wayfern",
|
||||
"fingerprint": {
|
||||
@@ -839,7 +799,7 @@
|
||||
"sourcePlaceholder": "Selecciona un perfil del que copiar cookies",
|
||||
"running": "(en ejecución)",
|
||||
"targetProfiles": "Perfiles de destino ({{count}})",
|
||||
"noOtherTargets": "No hay otros perfiles Wayfern/Camoufox seleccionados",
|
||||
"noOtherTargets": "No hay otros perfiles Wayfern seleccionados",
|
||||
"selectSourceFirst": "Selecciona primero un perfil de origen",
|
||||
"selectionStatus": "({{selected}} de {{total}} seleccionadas)",
|
||||
"searchPlaceholder": "Buscar dominios o cookies...",
|
||||
@@ -968,7 +928,6 @@
|
||||
"serverError": "Error del servidor. Por favor intenta de nuevo más tarde.",
|
||||
"unknownError": "Ocurrió un error desconocido. Por favor intenta de nuevo.",
|
||||
"noProfilesForUrl": "No hay perfiles disponibles. Crea un perfil antes de abrir URLs.",
|
||||
"updateCamoufoxConfigFailed": "Error al actualizar la configuración de camoufox: {{error}}",
|
||||
"updateWayfernConfigFailed": "Error al actualizar la configuración de wayfern: {{error}}",
|
||||
"createProfileFailed": "Error al crear el perfil: {{error}}",
|
||||
"launchBrowserFailed": "Error al iniciar el navegador: {{error}}",
|
||||
@@ -977,7 +936,7 @@
|
||||
"renameProfileFailed": "Error al renombrar el perfil: {{error}}",
|
||||
"killBrowserFailed": "Error al detener el navegador: {{error}}",
|
||||
"deleteSelectedProfilesFailed": "Error al eliminar los perfiles seleccionados: {{error}}",
|
||||
"cookieCopyUnsupportedBrowser": "La copia de cookies sólo funciona con perfiles Wayfern y Camoufox",
|
||||
"cookieCopyUnsupportedBrowser": "La copia de cookies solo funciona con perfiles Wayfern",
|
||||
"updateSyncSettingsFailed": "Error al actualizar los ajustes de sincronización",
|
||||
"cloneProfileFailed": "Error al clonar el perfil: {{error}}",
|
||||
"loadSupportedBrowsersFailed": "Error al cargar los navegadores compatibles",
|
||||
@@ -994,7 +953,6 @@
|
||||
"setProfilePasswordFailed": "Error al establecer la contraseña del perfil: {{error}}"
|
||||
},
|
||||
"browser": {
|
||||
"camoufox": "Camoufox",
|
||||
"wayfern": "Wayfern"
|
||||
},
|
||||
"fingerprint": {
|
||||
@@ -1105,8 +1063,6 @@
|
||||
"warnings": {
|
||||
"windowResizeTitle": "Dimensiones de ventana personalizadas",
|
||||
"windowResizeDescription": "Cambiar las dimensiones de la ventana del navegador puede aumentar la posibilidad de que los sitios web detecten que la información del navegador está falsificada.",
|
||||
"windowResizeCamoufoxTitle": "Viewport bloqueado por Camoufox",
|
||||
"windowResizeCamoufoxDescription": "Camoufox bloquea el viewport a las dimensiones de pantalla falsificadas para anti-fingerprinting. Redimensionar la ventana puede causar áreas recortadas o grises. Este es el comportamiento esperado.",
|
||||
"dontShowAgain": "No mostrar esto de nuevo",
|
||||
"continue": "Continuar",
|
||||
"cancel": "Cancelar"
|
||||
@@ -1237,7 +1193,7 @@
|
||||
"cannotWhileRunning": "Detén el perfil antes de cambiar su contraseña."
|
||||
},
|
||||
"fingerprint": {
|
||||
"notSupported": "La edición de huellas digitales solo está disponible para perfiles Camoufox y Wayfern.",
|
||||
"notSupported": "La edición de huellas digitales solo está disponible para perfiles Wayfern.",
|
||||
"lockedTitle": "Ver y editar la huella digital es una función Pro",
|
||||
"lockedDescription": "La protección de huella digital está incluida en todos los planes. Ver y editar los valores de la huella digital de un perfil es lo que requiere un plan de pago activo."
|
||||
},
|
||||
@@ -1267,9 +1223,7 @@
|
||||
"extensionGroup": "Grupo de Extensiones",
|
||||
"compatibility": {
|
||||
"label": "Compatibilidad",
|
||||
"chromium": "Chromium",
|
||||
"firefox": "Firefox",
|
||||
"both": "Chromium y Firefox"
|
||||
"chromium": "Chromium"
|
||||
},
|
||||
"selectedFile": "Archivo seleccionado",
|
||||
"namePlaceholder": "Nombre de la extensión",
|
||||
@@ -1656,14 +1610,6 @@
|
||||
"tooltipSent": "↑ Enviado: ",
|
||||
"tooltipReceived": "↓ Recibido: "
|
||||
},
|
||||
"camoufoxDialog": {
|
||||
"titleView": "Ver configuración de huella - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Configurar huella - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Configuración de huella inválida",
|
||||
"invalidFingerprintDescription": "La configuración de huella contiene JSON inválido. Revisa la configuración avanzada.",
|
||||
"saveFailed": "Error al guardar la configuración",
|
||||
"unknownError": "Ocurrió un error desconocido"
|
||||
},
|
||||
"proxyCheck": {
|
||||
"unknownLocation": "Desconocido",
|
||||
"locationToast": "La ubicación de tu proxy es:",
|
||||
@@ -1703,15 +1649,6 @@
|
||||
"vpnsHeading": "VPN",
|
||||
"createByCountryHeading": "Crear por país"
|
||||
},
|
||||
"releaseTypeSelector": {
|
||||
"noReleaseTypes": "No hay tipos de versión disponibles.",
|
||||
"placeholder": "Selecciona el tipo de versión...",
|
||||
"stable": "Estable",
|
||||
"nightly": "Nightly",
|
||||
"downloaded": "Descargado",
|
||||
"downloadBrowser": "Descargar navegador",
|
||||
"downloading": "Descargando..."
|
||||
},
|
||||
"dataTableActionBar": {
|
||||
"selected": "{{count}} seleccionados",
|
||||
"clearSelection": "Limpiar selección"
|
||||
@@ -1861,7 +1798,7 @@
|
||||
"proxyNotWorking": "El proxy seleccionado no funciona, por lo que no se creó el perfil.",
|
||||
"proxyPaymentRequired": "El proxy seleccionado requiere pago (402) —su suscripción puede haber vencido— por lo que no se creó el perfil.",
|
||||
"vpnNotWorking": "La VPN seleccionada no funciona, por lo que no se creó el perfil.",
|
||||
"camoufoxImportDeprecated": "La importación de perfiles basados en Firefox (Camoufox) ya no es compatible. Camoufox está en desuso; usa Wayfern en su lugar."
|
||||
"camoufoxImportDeprecated": "La importación de perfiles basados en Firefox ya no está soportada. Utilice Wayfern en su lugar."
|
||||
},
|
||||
"rail": {
|
||||
"profiles": "Perfiles",
|
||||
@@ -1988,10 +1925,6 @@
|
||||
"show": "Mostrar Donut Browser",
|
||||
"quit": "Salir"
|
||||
},
|
||||
"browserSupport": {
|
||||
"endingSoonTitle": "El soporte del navegador finalizará pronto",
|
||||
"endingSoonDescription": "El soporte para los siguientes perfiles se eliminará el 15 de marzo de 2026: {{profiles}}. Migra a perfiles de Wayfern."
|
||||
},
|
||||
"onboarding": {
|
||||
"steps": {
|
||||
"createProfile": {
|
||||
@@ -2073,9 +2006,15 @@
|
||||
"title": "Automatización del navegador en pausa",
|
||||
"description": "Tu cuenta fue restringida temporalmente de las funciones Pro del navegador, normalmente por iniciar sesión en varios dispositivos a la vez. Cierra sesión en los demás dispositivos y vuelve a iniciar el perfil para restaurarla."
|
||||
},
|
||||
"camoufoxDeprecation": {
|
||||
"title": "El soporte para Camoufox está terminando",
|
||||
"description": "El soporte para los perfiles de Camoufox terminará el 8 de julio de 2026. Tienes uno o más perfiles de Camoufox. Migra a Wayfern antes de esa fecha; después, los perfiles de Camoufox podrían dejar de funcionar.",
|
||||
"acknowledge": "Entendido"
|
||||
"wayfernConfigDialog": {
|
||||
"titleView": "Ver configuración de huella - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Configurar huella - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Configuración de huella inválida",
|
||||
"invalidFingerprintDescription": "La configuración de huella contiene JSON inválido. Revisa la configuración avanzada.",
|
||||
"saveFailed": "Error al guardar la configuración",
|
||||
"unknownError": "Ocurrió un error desconocido"
|
||||
},
|
||||
"cookieCopy": {
|
||||
"noOtherTargets": "No hay otros perfiles Wayfern seleccionados"
|
||||
}
|
||||
}
|
||||
|
||||
+15
-76
@@ -340,7 +340,6 @@
|
||||
"title": "Navigateur anti-détection",
|
||||
"description": "Choisissez un navigateur avec des capacités anti-détection",
|
||||
"chromium": "Wayfern",
|
||||
"firefox": "Camoufox",
|
||||
"badge": "Navigateur anti-détection"
|
||||
},
|
||||
"regular": {
|
||||
@@ -376,9 +375,6 @@
|
||||
},
|
||||
"chromiumLabel": "Chromium",
|
||||
"chromiumSubtitle": "Propulsé par Wayfern",
|
||||
"firefoxLabel": "Firefox",
|
||||
"firefoxSubtitle": "Propulsé par Camoufox",
|
||||
"camoufoxWarning": "Firefox (Camoufox) est maintenu par une organisation tierce. Pour une utilisation en production, veuillez utiliser Chromium.",
|
||||
"platformUnavailable": "{{browser}} n'est pas encore disponible sur votre plateforme.",
|
||||
"passwordProtect": {
|
||||
"label": "Protéger ce profil par mot de passe",
|
||||
@@ -749,42 +745,6 @@
|
||||
"error": "Échec de l'importation du profil"
|
||||
},
|
||||
"config": {
|
||||
"camoufox": {
|
||||
"title": "Configuration Camoufox",
|
||||
"fingerprint": {
|
||||
"title": "Empreinte digitale",
|
||||
"randomize": "Randomiser au lancement",
|
||||
"randomizeDescription": "Génère une nouvelle empreinte digitale à chaque lancement du navigateur.",
|
||||
"osCpuPlaceholder": "p. ex., Intel Mac OS X 10.15",
|
||||
"webglRendererPlaceholder": "p. ex., llvmpipe, ou similaire"
|
||||
},
|
||||
"os": {
|
||||
"title": "Système d'exploitation",
|
||||
"description": "Le système d'exploitation à émuler pour la génération d'empreinte digitale.",
|
||||
"windows": "Windows",
|
||||
"macos": "macOS",
|
||||
"linux": "Linux"
|
||||
},
|
||||
"screen": {
|
||||
"title": "Taille d'écran",
|
||||
"minWidth": "Largeur min",
|
||||
"maxWidth": "Largeur max",
|
||||
"minHeight": "Hauteur min",
|
||||
"maxHeight": "Hauteur max"
|
||||
},
|
||||
"geoip": {
|
||||
"title": "GeoIP",
|
||||
"auto": "Automatique (basé sur le proxy)",
|
||||
"manual": "Manuel",
|
||||
"disabled": "Désactivé"
|
||||
},
|
||||
"blocking": {
|
||||
"title": "Blocage",
|
||||
"images": "Bloquer les images",
|
||||
"webrtc": "Bloquer WebRTC",
|
||||
"webgl": "Bloquer WebGL"
|
||||
}
|
||||
},
|
||||
"wayfern": {
|
||||
"title": "Configuration Wayfern",
|
||||
"fingerprint": {
|
||||
@@ -839,7 +799,7 @@
|
||||
"sourcePlaceholder": "Sélectionnez un profil pour copier les cookies",
|
||||
"running": "(en cours)",
|
||||
"targetProfiles": "Profils cibles ({{count}})",
|
||||
"noOtherTargets": "Aucun autre profil Wayfern/Camoufox sélectionné",
|
||||
"noOtherTargets": "Aucun autre profil Wayfern sélectionné",
|
||||
"selectSourceFirst": "Sélectionnez d'abord un profil source",
|
||||
"selectionStatus": "({{selected}} sur {{total}} sélectionnés)",
|
||||
"searchPlaceholder": "Rechercher des domaines ou cookies...",
|
||||
@@ -968,7 +928,6 @@
|
||||
"serverError": "Erreur serveur. Veuillez réessayer plus tard.",
|
||||
"unknownError": "Une erreur inconnue s'est produite. Veuillez réessayer.",
|
||||
"noProfilesForUrl": "Aucun profil disponible. Veuillez créer un profil avant d’ouvrir des URL.",
|
||||
"updateCamoufoxConfigFailed": "Échec de la mise à jour de la configuration camoufox : {{error}}",
|
||||
"updateWayfernConfigFailed": "Échec de la mise à jour de la configuration wayfern : {{error}}",
|
||||
"createProfileFailed": "Échec de la création du profil : {{error}}",
|
||||
"launchBrowserFailed": "Échec du lancement du navigateur : {{error}}",
|
||||
@@ -977,7 +936,7 @@
|
||||
"renameProfileFailed": "Échec du renommage du profil : {{error}}",
|
||||
"killBrowserFailed": "Échec de l’arrêt du navigateur : {{error}}",
|
||||
"deleteSelectedProfilesFailed": "Échec de la suppression des profils sélectionnés : {{error}}",
|
||||
"cookieCopyUnsupportedBrowser": "La copie de cookies ne fonctionne qu’avec les profils Wayfern et Camoufox",
|
||||
"cookieCopyUnsupportedBrowser": "La copie de cookies ne fonctionne qu'avec les profils Wayfern",
|
||||
"updateSyncSettingsFailed": "Échec de la mise à jour des paramètres de synchronisation",
|
||||
"cloneProfileFailed": "Échec du clonage du profil : {{error}}",
|
||||
"loadSupportedBrowsersFailed": "Échec du chargement des navigateurs pris en charge",
|
||||
@@ -994,7 +953,6 @@
|
||||
"setProfilePasswordFailed": "Échec de la définition du mot de passe du profil : {{error}}"
|
||||
},
|
||||
"browser": {
|
||||
"camoufox": "Camoufox",
|
||||
"wayfern": "Wayfern"
|
||||
},
|
||||
"fingerprint": {
|
||||
@@ -1105,8 +1063,6 @@
|
||||
"warnings": {
|
||||
"windowResizeTitle": "Dimensions de fenêtre personnalisées",
|
||||
"windowResizeDescription": "Modifier les dimensions de la fenêtre du navigateur peut augmenter les chances de détection par les sites web que les informations du navigateur sont falsifiées.",
|
||||
"windowResizeCamoufoxTitle": "Viewport verrouillé par Camoufox",
|
||||
"windowResizeCamoufoxDescription": "Camoufox verrouille le viewport aux dimensions d'écran falsifiées pour l'anti-fingerprinting. Redimensionner la fenêtre peut causer des zones recadrées ou grises. C'est le comportement attendu.",
|
||||
"dontShowAgain": "Ne plus afficher",
|
||||
"continue": "Continuer",
|
||||
"cancel": "Annuler"
|
||||
@@ -1237,7 +1193,7 @@
|
||||
"cannotWhileRunning": "Arrêtez le profil avant de modifier son mot de passe."
|
||||
},
|
||||
"fingerprint": {
|
||||
"notSupported": "L’édition des empreintes n’est disponible que pour les profils Camoufox et Wayfern.",
|
||||
"notSupported": "L'édition des empreintes n'est disponible que pour les profils Wayfern.",
|
||||
"lockedTitle": "Afficher et modifier l'empreinte est une fonctionnalité Pro",
|
||||
"lockedDescription": "La protection contre le fingerprinting est incluse dans tous les forfaits. C'est l'affichage et la modification des valeurs de l'empreinte d'un profil qui nécessitent un forfait payant actif."
|
||||
},
|
||||
@@ -1267,9 +1223,7 @@
|
||||
"extensionGroup": "Groupe d'Extensions",
|
||||
"compatibility": {
|
||||
"label": "Compatibilité",
|
||||
"chromium": "Chromium",
|
||||
"firefox": "Firefox",
|
||||
"both": "Chromium et Firefox"
|
||||
"chromium": "Chromium"
|
||||
},
|
||||
"selectedFile": "Fichier sélectionné",
|
||||
"namePlaceholder": "Nom de l'extension",
|
||||
@@ -1656,14 +1610,6 @@
|
||||
"tooltipSent": "↑ Envoyé : ",
|
||||
"tooltipReceived": "↓ Reçu : "
|
||||
},
|
||||
"camoufoxDialog": {
|
||||
"titleView": "Voir les paramètres d'empreinte - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Configurer les paramètres d'empreinte - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Configuration d'empreinte invalide",
|
||||
"invalidFingerprintDescription": "La configuration d'empreinte contient du JSON invalide. Vérifiez vos paramètres avancés.",
|
||||
"saveFailed": "Échec de la sauvegarde de la configuration",
|
||||
"unknownError": "Une erreur inconnue s'est produite"
|
||||
},
|
||||
"proxyCheck": {
|
||||
"unknownLocation": "Inconnu",
|
||||
"locationToast": "L'emplacement de votre proxy est :",
|
||||
@@ -1703,15 +1649,6 @@
|
||||
"vpnsHeading": "VPN",
|
||||
"createByCountryHeading": "Créer par pays"
|
||||
},
|
||||
"releaseTypeSelector": {
|
||||
"noReleaseTypes": "Aucun type de version disponible.",
|
||||
"placeholder": "Sélectionnez le type de version...",
|
||||
"stable": "Stable",
|
||||
"nightly": "Nightly",
|
||||
"downloaded": "Téléchargé",
|
||||
"downloadBrowser": "Télécharger le navigateur",
|
||||
"downloading": "Téléchargement..."
|
||||
},
|
||||
"dataTableActionBar": {
|
||||
"selected": "{{count}} sélectionné(s)",
|
||||
"clearSelection": "Effacer la sélection"
|
||||
@@ -1861,7 +1798,7 @@
|
||||
"proxyNotWorking": "Le proxy sélectionné ne fonctionne pas, le profil n'a donc pas été créé.",
|
||||
"proxyPaymentRequired": "Le proxy sélectionné requiert un paiement (402) — son abonnement a peut-être expiré — le profil n'a donc pas été créé.",
|
||||
"vpnNotWorking": "Le VPN sélectionné ne fonctionne pas, le profil n'a donc pas été créé.",
|
||||
"camoufoxImportDeprecated": "L'importation de profils basés sur Firefox (Camoufox) n'est plus prise en charge. Camoufox est en cours d'abandon — utilisez Wayfern à la place."
|
||||
"camoufoxImportDeprecated": "L'importation de profils basés sur Firefox n'est plus prise en charge. Utilisez Wayfern à la place."
|
||||
},
|
||||
"rail": {
|
||||
"profiles": "Profils",
|
||||
@@ -1988,10 +1925,6 @@
|
||||
"show": "Afficher Donut Browser",
|
||||
"quit": "Quitter"
|
||||
},
|
||||
"browserSupport": {
|
||||
"endingSoonTitle": "La prise en charge du navigateur prend bientôt fin",
|
||||
"endingSoonDescription": "La prise en charge des profils suivants sera supprimée le 15 mars 2026 : {{profiles}}. Veuillez migrer vers des profils Wayfern."
|
||||
},
|
||||
"onboarding": {
|
||||
"steps": {
|
||||
"createProfile": {
|
||||
@@ -2073,9 +2006,15 @@
|
||||
"title": "Automatisation du navigateur en pause",
|
||||
"description": "Votre compte a été temporairement privé des fonctionnalités Pro du navigateur, généralement à cause d'une connexion sur plusieurs appareils à la fois. Déconnectez-vous des autres appareils, puis relancez le profil pour la rétablir."
|
||||
},
|
||||
"camoufoxDeprecation": {
|
||||
"title": "La prise en charge de Camoufox prend fin",
|
||||
"description": "La prise en charge des profils Camoufox prendra fin le 8 juillet 2026. Vous avez un ou plusieurs profils Camoufox. Migrez-les vers Wayfern avant cette date — après quoi, les profils Camoufox pourraient cesser de fonctionner.",
|
||||
"acknowledge": "Compris"
|
||||
"wayfernConfigDialog": {
|
||||
"titleView": "Voir les paramètres d'empreinte - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Configurer les paramètres d'empreinte - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Configuration d'empreinte invalide",
|
||||
"invalidFingerprintDescription": "La configuration d'empreinte contient du JSON invalide. Vérifiez vos paramètres avancés.",
|
||||
"saveFailed": "Échec de la sauvegarde de la configuration",
|
||||
"unknownError": "Une erreur inconnue s'est produite"
|
||||
},
|
||||
"cookieCopy": {
|
||||
"noOtherTargets": "Aucun autre profil Wayfern sélectionné"
|
||||
}
|
||||
}
|
||||
|
||||
+15
-76
@@ -340,7 +340,6 @@
|
||||
"title": "アンチ検出ブラウザ",
|
||||
"description": "アンチ検出機能を持つブラウザを選択",
|
||||
"chromium": "Wayfern",
|
||||
"firefox": "Camoufox",
|
||||
"badge": "アンチ検出ブラウザ"
|
||||
},
|
||||
"regular": {
|
||||
@@ -376,9 +375,6 @@
|
||||
},
|
||||
"chromiumLabel": "Chromium",
|
||||
"chromiumSubtitle": "Wayfern搭載",
|
||||
"firefoxLabel": "Firefox",
|
||||
"firefoxSubtitle": "Camoufox搭載",
|
||||
"camoufoxWarning": "Firefox(Camoufox)はサードパーティの組織によって管理されています。本番環境での使用にはChromiumをご利用ください。",
|
||||
"platformUnavailable": "{{browser}} はまだお使いのプラットフォームで利用できません。",
|
||||
"passwordProtect": {
|
||||
"label": "このプロファイルをパスワードで保護",
|
||||
@@ -749,42 +745,6 @@
|
||||
"error": "プロファイルのインポートに失敗しました"
|
||||
},
|
||||
"config": {
|
||||
"camoufox": {
|
||||
"title": "Camoufox設定",
|
||||
"fingerprint": {
|
||||
"title": "フィンガープリント",
|
||||
"randomize": "起動時にランダム化",
|
||||
"randomizeDescription": "ブラウザ起動時に新しいフィンガープリントを生成します。",
|
||||
"osCpuPlaceholder": "例: Intel Mac OS X 10.15",
|
||||
"webglRendererPlaceholder": "例: llvmpipe など"
|
||||
},
|
||||
"os": {
|
||||
"title": "オペレーティングシステム",
|
||||
"description": "フィンガープリント生成用にエミュレートするOS。",
|
||||
"windows": "Windows",
|
||||
"macos": "macOS",
|
||||
"linux": "Linux"
|
||||
},
|
||||
"screen": {
|
||||
"title": "画面サイズ",
|
||||
"minWidth": "最小幅",
|
||||
"maxWidth": "最大幅",
|
||||
"minHeight": "最小高さ",
|
||||
"maxHeight": "最大高さ"
|
||||
},
|
||||
"geoip": {
|
||||
"title": "GeoIP",
|
||||
"auto": "自動(プロキシに基づく)",
|
||||
"manual": "手動",
|
||||
"disabled": "無効"
|
||||
},
|
||||
"blocking": {
|
||||
"title": "ブロック",
|
||||
"images": "画像をブロック",
|
||||
"webrtc": "WebRTCをブロック",
|
||||
"webgl": "WebGLをブロック"
|
||||
}
|
||||
},
|
||||
"wayfern": {
|
||||
"title": "Wayfern設定",
|
||||
"fingerprint": {
|
||||
@@ -839,7 +799,7 @@
|
||||
"sourcePlaceholder": "Cookie をコピーするプロファイルを選択",
|
||||
"running": "(実行中)",
|
||||
"targetProfiles": "対象プロファイル ({{count}})",
|
||||
"noOtherTargets": "他に Wayfern/Camoufox プロファイルが選択されていません",
|
||||
"noOtherTargets": "他に Wayfern プロファイルが選択されていません",
|
||||
"selectSourceFirst": "最初にソースプロファイルを選択してください",
|
||||
"selectionStatus": "({{selected}} / {{total}} 選択中)",
|
||||
"searchPlaceholder": "ドメインまたは Cookie を検索...",
|
||||
@@ -968,7 +928,6 @@
|
||||
"serverError": "サーバーエラー。後でもう一度お試しください。",
|
||||
"unknownError": "不明なエラーが発生しました。もう一度お試しください。",
|
||||
"noProfilesForUrl": "利用可能なプロファイルがありません。URLを開く前にプロファイルを作成してください。",
|
||||
"updateCamoufoxConfigFailed": "camoufox設定の更新に失敗しました: {{error}}",
|
||||
"updateWayfernConfigFailed": "wayfern設定の更新に失敗しました: {{error}}",
|
||||
"createProfileFailed": "プロファイルの作成に失敗しました: {{error}}",
|
||||
"launchBrowserFailed": "ブラウザの起動に失敗しました: {{error}}",
|
||||
@@ -977,7 +936,7 @@
|
||||
"renameProfileFailed": "プロファイルの名前変更に失敗しました: {{error}}",
|
||||
"killBrowserFailed": "ブラウザの停止に失敗しました: {{error}}",
|
||||
"deleteSelectedProfilesFailed": "選択したプロファイルの削除に失敗しました: {{error}}",
|
||||
"cookieCopyUnsupportedBrowser": "Cookieのコピーは Wayfern および Camoufox プロファイルでのみ機能します",
|
||||
"cookieCopyUnsupportedBrowser": "Cookieのコピーは Wayfern プロファイルでのみ機能します",
|
||||
"updateSyncSettingsFailed": "同期設定の更新に失敗しました",
|
||||
"cloneProfileFailed": "プロファイルの複製に失敗しました: {{error}}",
|
||||
"loadSupportedBrowsersFailed": "サポートされているブラウザの読み込みに失敗しました",
|
||||
@@ -994,7 +953,6 @@
|
||||
"setProfilePasswordFailed": "プロファイルのパスワード設定に失敗しました: {{error}}"
|
||||
},
|
||||
"browser": {
|
||||
"camoufox": "Camoufox",
|
||||
"wayfern": "Wayfern"
|
||||
},
|
||||
"fingerprint": {
|
||||
@@ -1105,8 +1063,6 @@
|
||||
"warnings": {
|
||||
"windowResizeTitle": "カスタムウィンドウサイズ",
|
||||
"windowResizeDescription": "ブラウザウィンドウのサイズを変更すると、ブラウザ情報が偽装されていることをウェブサイトに検出される可能性が高くなります。",
|
||||
"windowResizeCamoufoxTitle": "Camoufoxによりビューポートがロックされています",
|
||||
"windowResizeCamoufoxDescription": "Camoufoxはアンチフィンガープリントのためにビューポートを偽装された画面サイズにロックします。ウィンドウのサイズを変更すると、切り取られた領域やグレーの領域が表示される場合があります。これは想定された動作です。",
|
||||
"dontShowAgain": "今後表示しない",
|
||||
"continue": "続行",
|
||||
"cancel": "キャンセル"
|
||||
@@ -1237,7 +1193,7 @@
|
||||
"cannotWhileRunning": "パスワードを変更する前にプロファイルを停止してください。"
|
||||
},
|
||||
"fingerprint": {
|
||||
"notSupported": "フィンガープリント編集は Camoufox / Wayfern プロファイルでのみ利用できます。",
|
||||
"notSupported": "フィンガープリント編集は Wayfern プロファイルでのみ利用できます。",
|
||||
"lockedTitle": "フィンガープリントの表示と編集は Pro 機能です",
|
||||
"lockedDescription": "フィンガープリント保護はすべてのプランに含まれています。プロファイルのフィンガープリントの値を表示・編集するには、有効な有料プランが必要です。"
|
||||
},
|
||||
@@ -1267,9 +1223,7 @@
|
||||
"extensionGroup": "拡張機能グループ",
|
||||
"compatibility": {
|
||||
"label": "互換性",
|
||||
"chromium": "Chromium",
|
||||
"firefox": "Firefox",
|
||||
"both": "Chromium & Firefox"
|
||||
"chromium": "Chromium"
|
||||
},
|
||||
"selectedFile": "選択されたファイル",
|
||||
"namePlaceholder": "拡張機能名",
|
||||
@@ -1656,14 +1610,6 @@
|
||||
"tooltipSent": "↑ 送信: ",
|
||||
"tooltipReceived": "↓ 受信: "
|
||||
},
|
||||
"camoufoxDialog": {
|
||||
"titleView": "フィンガープリント設定を表示 - {{name}} ({{browser}})",
|
||||
"titleConfigure": "フィンガープリント設定 - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "無効なフィンガープリント設定",
|
||||
"invalidFingerprintDescription": "フィンガープリント設定に無効な JSON が含まれています。詳細設定を確認してください。",
|
||||
"saveFailed": "設定の保存に失敗しました",
|
||||
"unknownError": "不明なエラーが発生しました"
|
||||
},
|
||||
"proxyCheck": {
|
||||
"unknownLocation": "不明",
|
||||
"locationToast": "プロキシの場所:",
|
||||
@@ -1703,15 +1649,6 @@
|
||||
"vpnsHeading": "VPN",
|
||||
"createByCountryHeading": "国別に作成"
|
||||
},
|
||||
"releaseTypeSelector": {
|
||||
"noReleaseTypes": "利用可能なリリースタイプがありません。",
|
||||
"placeholder": "リリースタイプを選択...",
|
||||
"stable": "Stable",
|
||||
"nightly": "Nightly",
|
||||
"downloaded": "ダウンロード済み",
|
||||
"downloadBrowser": "ブラウザをダウンロード",
|
||||
"downloading": "ダウンロード中..."
|
||||
},
|
||||
"dataTableActionBar": {
|
||||
"selected": "{{count}} 件選択",
|
||||
"clearSelection": "選択を解除"
|
||||
@@ -1861,7 +1798,7 @@
|
||||
"proxyNotWorking": "選択したプロキシが機能していないため、プロファイルは作成されませんでした。",
|
||||
"proxyPaymentRequired": "選択したプロキシは支払いが必要です(402)。サブスクリプションが期限切れの可能性があります。そのため、プロファイルは作成されませんでした。",
|
||||
"vpnNotWorking": "選択したVPNが機能していないため、プロファイルは作成されませんでした。",
|
||||
"camoufoxImportDeprecated": "Firefox ベース(Camoufox)のプロファイルのインポートはサポートされなくなりました。Camoufox は廃止予定です。代わりに Wayfern をご利用ください。"
|
||||
"camoufoxImportDeprecated": "Firefox ベースのプロファイルのインポートはサポートされなくなりました。Wayfern をご利用ください。"
|
||||
},
|
||||
"rail": {
|
||||
"profiles": "プロファイル",
|
||||
@@ -1988,10 +1925,6 @@
|
||||
"show": "Donut Browser を表示",
|
||||
"quit": "終了"
|
||||
},
|
||||
"browserSupport": {
|
||||
"endingSoonTitle": "ブラウザのサポートが間もなく終了します",
|
||||
"endingSoonDescription": "以下のプロファイルのサポートは 2026 年 3 月 15 日に削除されます: {{profiles}}。Wayfern プロファイルに移行してください。"
|
||||
},
|
||||
"onboarding": {
|
||||
"steps": {
|
||||
"createProfile": {
|
||||
@@ -2073,9 +2006,15 @@
|
||||
"title": "ブラウザの自動化が一時停止しました",
|
||||
"description": "通常は複数のデバイスで同時にサインインしたことが原因で、アカウントのProブラウザ機能が一時的に制限されました。他のデバイスからサインアウトし、プロファイルを再起動すると復元されます。"
|
||||
},
|
||||
"camoufoxDeprecation": {
|
||||
"title": "Camoufox のサポートが終了します",
|
||||
"description": "Camoufox プロファイルのサポートは 2026 年 7 月 8 日に終了します。Camoufox プロファイルが 1 つ以上あります。それまでに Wayfern へ移行してください。その後、Camoufox プロファイルは動作しなくなる可能性があります。",
|
||||
"acknowledge": "了解しました"
|
||||
"wayfernConfigDialog": {
|
||||
"titleView": "フィンガープリント設定を表示 - {{name}} ({{browser}})",
|
||||
"titleConfigure": "フィンガープリント設定 - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "無効なフィンガープリント設定",
|
||||
"invalidFingerprintDescription": "フィンガープリント設定に無効な JSON が含まれています。詳細設定を確認してください。",
|
||||
"saveFailed": "設定の保存に失敗しました",
|
||||
"unknownError": "不明なエラーが発生しました"
|
||||
},
|
||||
"cookieCopy": {
|
||||
"noOtherTargets": "他に Wayfern プロファイルが選択されていません"
|
||||
}
|
||||
}
|
||||
|
||||
+15
-76
@@ -340,7 +340,6 @@
|
||||
"title": "안티-디텍트 브라우저",
|
||||
"description": "안티-디텍트 기능을 갖춘 브라우저를 선택하세요",
|
||||
"chromium": "Wayfern",
|
||||
"firefox": "Camoufox",
|
||||
"badge": "안티-디텍트 브라우저"
|
||||
},
|
||||
"regular": {
|
||||
@@ -376,9 +375,6 @@
|
||||
},
|
||||
"chromiumLabel": "크로미움",
|
||||
"chromiumSubtitle": "Wayfern 기반",
|
||||
"firefoxLabel": "파이어폭스",
|
||||
"firefoxSubtitle": "Camoufox 기반",
|
||||
"camoufoxWarning": "파이어폭스(Camoufox)는 제3자 조직에서 유지 관리합니다. 프로덕션 용도로는 크로미움을 사용하세요.",
|
||||
"platformUnavailable": "{{browser}}는 아직 이 플랫폼에서 사용할 수 없습니다.",
|
||||
"passwordProtect": {
|
||||
"label": "이 프로필을 비밀번호로 보호",
|
||||
@@ -749,42 +745,6 @@
|
||||
"error": "프로필 가져오기 실패"
|
||||
},
|
||||
"config": {
|
||||
"camoufox": {
|
||||
"title": "Camoufox 구성",
|
||||
"fingerprint": {
|
||||
"title": "핑거프린트",
|
||||
"randomize": "실행 시 무작위화",
|
||||
"randomizeDescription": "브라우저가 실행될 때마다 새 핑거프린트를 생성합니다.",
|
||||
"osCpuPlaceholder": "예: Intel Mac OS X 10.15",
|
||||
"webglRendererPlaceholder": "예: llvmpipe 또는 유사"
|
||||
},
|
||||
"os": {
|
||||
"title": "운영 체제",
|
||||
"description": "핑거프린트 생성을 위해 에뮬레이트할 운영 체제입니다.",
|
||||
"windows": "Windows",
|
||||
"macos": "macOS",
|
||||
"linux": "Linux"
|
||||
},
|
||||
"screen": {
|
||||
"title": "화면 크기",
|
||||
"minWidth": "최소 너비",
|
||||
"maxWidth": "최대 너비",
|
||||
"minHeight": "최소 높이",
|
||||
"maxHeight": "최대 높이"
|
||||
},
|
||||
"geoip": {
|
||||
"title": "GeoIP",
|
||||
"auto": "자동 (프록시 기반)",
|
||||
"manual": "수동",
|
||||
"disabled": "사용 안 함"
|
||||
},
|
||||
"blocking": {
|
||||
"title": "차단",
|
||||
"images": "이미지 차단",
|
||||
"webrtc": "WebRTC 차단",
|
||||
"webgl": "WebGL 차단"
|
||||
}
|
||||
},
|
||||
"wayfern": {
|
||||
"title": "Wayfern 구성",
|
||||
"fingerprint": {
|
||||
@@ -839,7 +799,7 @@
|
||||
"sourcePlaceholder": "쿠키를 복사할 원본 프로필 선택",
|
||||
"running": "(실행 중)",
|
||||
"targetProfiles": "대상 프로필 ({{count}})",
|
||||
"noOtherTargets": "선택된 다른 Wayfern/Camoufox 프로필이 없습니다",
|
||||
"noOtherTargets": "선택된 다른 Wayfern 프로필이 없습니다",
|
||||
"selectSourceFirst": "먼저 원본 프로필을 선택하세요",
|
||||
"selectionStatus": "({{total}}개 중 {{selected}}개 선택됨)",
|
||||
"searchPlaceholder": "도메인 또는 쿠키 검색...",
|
||||
@@ -968,7 +928,6 @@
|
||||
"serverError": "서버 오류. 나중에 다시 시도하세요.",
|
||||
"unknownError": "알 수 없는 오류가 발생했습니다. 다시 시도하세요.",
|
||||
"noProfilesForUrl": "사용할 수 있는 프로필이 없습니다. URL을 열기 전에 먼저 프로필을 생성하세요.",
|
||||
"updateCamoufoxConfigFailed": "Camoufox 구성 업데이트 실패: {{error}}",
|
||||
"updateWayfernConfigFailed": "Wayfern 구성 업데이트 실패: {{error}}",
|
||||
"createProfileFailed": "프로필 생성 실패: {{error}}",
|
||||
"launchBrowserFailed": "브라우저 실행 실패: {{error}}",
|
||||
@@ -977,7 +936,7 @@
|
||||
"renameProfileFailed": "프로필 이름 변경 실패: {{error}}",
|
||||
"killBrowserFailed": "브라우저 종료 실패: {{error}}",
|
||||
"deleteSelectedProfilesFailed": "선택한 프로필 삭제 실패: {{error}}",
|
||||
"cookieCopyUnsupportedBrowser": "쿠키 복사는 Wayfern 및 Camoufox 프로필에서만 작동합니다",
|
||||
"cookieCopyUnsupportedBrowser": "쿠키 복사는 Wayfern 프로필에서만 작동합니다",
|
||||
"updateSyncSettingsFailed": "동기화 설정 업데이트 실패",
|
||||
"cloneProfileFailed": "프로필 복제 실패: {{error}}",
|
||||
"loadSupportedBrowsersFailed": "지원되는 브라우저 불러오기 실패",
|
||||
@@ -994,7 +953,6 @@
|
||||
"setProfilePasswordFailed": "프로필 비밀번호 설정 실패: {{error}}"
|
||||
},
|
||||
"browser": {
|
||||
"camoufox": "Camoufox",
|
||||
"wayfern": "Wayfern"
|
||||
},
|
||||
"fingerprint": {
|
||||
@@ -1105,8 +1063,6 @@
|
||||
"warnings": {
|
||||
"windowResizeTitle": "사용자 지정 창 크기",
|
||||
"windowResizeDescription": "브라우저 창 크기를 변경하면 브라우저 정보가 스푸핑된 것으로 웹사이트에서 감지될 가능성이 높아질 수 있습니다.",
|
||||
"windowResizeCamoufoxTitle": "Camoufox에서 잠긴 뷰포트",
|
||||
"windowResizeCamoufoxDescription": "Camoufox는 안티-핑거프린팅을 위해 뷰포트를 스푸핑된 화면 크기로 잠급니다. 창 크기를 조정하면 잘리거나 회색 영역이 발생할 수 있습니다. 이는 예상된 동작입니다.",
|
||||
"dontShowAgain": "다시 표시하지 않음",
|
||||
"continue": "계속",
|
||||
"cancel": "취소"
|
||||
@@ -1237,7 +1193,7 @@
|
||||
"cannotWhileRunning": "비밀번호를 변경하기 전에 프로필을 중지하세요."
|
||||
},
|
||||
"fingerprint": {
|
||||
"notSupported": "핑거프린트 편집은 Camoufox 및 Wayfern 프로필에서만 사용할 수 있습니다.",
|
||||
"notSupported": "핑거프린트 편집은 Wayfern 프로필에서만 사용할 수 있습니다.",
|
||||
"lockedTitle": "핑거프린트 보기 및 편집은 Pro 기능입니다",
|
||||
"lockedDescription": "핑거프린트 보호는 모든 요금제에 포함되어 있습니다. 프로필의 핑거프린트 값을 보고 편집하려면 활성 유료 요금제가 필요합니다."
|
||||
},
|
||||
@@ -1267,9 +1223,7 @@
|
||||
"extensionGroup": "확장 프로그램 그룹",
|
||||
"compatibility": {
|
||||
"label": "호환성",
|
||||
"chromium": "크로미움",
|
||||
"firefox": "파이어폭스",
|
||||
"both": "크로미움 및 파이어폭스"
|
||||
"chromium": "크로미움"
|
||||
},
|
||||
"selectedFile": "선택된 파일",
|
||||
"namePlaceholder": "확장 프로그램 이름",
|
||||
@@ -1656,14 +1610,6 @@
|
||||
"tooltipSent": "↑ 보냄: ",
|
||||
"tooltipReceived": "↓ 받음: "
|
||||
},
|
||||
"camoufoxDialog": {
|
||||
"titleView": "핑거프린트 설정 보기 - {{name}} ({{browser}})",
|
||||
"titleConfigure": "핑거프린트 설정 구성 - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "잘못된 핑거프린트 구성",
|
||||
"invalidFingerprintDescription": "핑거프린트 구성에 잘못된 JSON이 포함되어 있습니다. 고급 설정을 확인하세요.",
|
||||
"saveFailed": "구성 저장 실패",
|
||||
"unknownError": "알 수 없는 오류가 발생했습니다"
|
||||
},
|
||||
"proxyCheck": {
|
||||
"unknownLocation": "알 수 없음",
|
||||
"locationToast": "프록시 위치:",
|
||||
@@ -1703,15 +1649,6 @@
|
||||
"vpnsHeading": "VPN",
|
||||
"createByCountryHeading": "국가별 생성"
|
||||
},
|
||||
"releaseTypeSelector": {
|
||||
"noReleaseTypes": "사용 가능한 릴리스 유형이 없습니다.",
|
||||
"placeholder": "릴리스 유형 선택...",
|
||||
"stable": "안정",
|
||||
"nightly": "나이틀리",
|
||||
"downloaded": "다운로드됨",
|
||||
"downloadBrowser": "브라우저 다운로드",
|
||||
"downloading": "다운로드 중..."
|
||||
},
|
||||
"dataTableActionBar": {
|
||||
"selected": "{{count}}개 선택됨",
|
||||
"clearSelection": "선택 지우기"
|
||||
@@ -1861,7 +1798,7 @@
|
||||
"proxyNotWorking": "선택한 프록시가 작동하지 않아 프로필이 생성되지 않았습니다.",
|
||||
"proxyPaymentRequired": "선택한 프록시는 결제가 필요합니다(402). 구독이 만료되었을 수 있어 프로필이 생성되지 않았습니다.",
|
||||
"vpnNotWorking": "선택한 VPN이 작동하지 않아 프로필이 생성되지 않았습니다.",
|
||||
"camoufoxImportDeprecated": "Firefox 기반(Camoufox) 프로필 가져오기는 더 이상 지원되지 않습니다. Camoufox는 지원 종료 예정입니다. 대신 Wayfern을 사용하세요."
|
||||
"camoufoxImportDeprecated": "Firefox 기반 프로필 가져오기는 더 이상 지원되지 않습니다. Wayfern을 사용하세요."
|
||||
},
|
||||
"rail": {
|
||||
"profiles": "프로필",
|
||||
@@ -1988,10 +1925,6 @@
|
||||
"show": "Donut Browser 표시",
|
||||
"quit": "종료"
|
||||
},
|
||||
"browserSupport": {
|
||||
"endingSoonTitle": "브라우저 지원이 곧 종료됩니다",
|
||||
"endingSoonDescription": "다음 프로필에 대한 지원이 2026년 3월 15일에 제거됩니다: {{profiles}}. Wayfern 프로필로 이전하세요."
|
||||
},
|
||||
"onboarding": {
|
||||
"steps": {
|
||||
"createProfile": {
|
||||
@@ -2073,9 +2006,15 @@
|
||||
"title": "브라우저 자동화가 일시 중지됨",
|
||||
"description": "보통 여러 기기에서 동시에 로그인하여 계정의 Pro 브라우저 기능이 일시적으로 제한되었습니다. 다른 기기에서 로그아웃한 후 프로필을 다시 실행하면 복원됩니다."
|
||||
},
|
||||
"camoufoxDeprecation": {
|
||||
"title": "Camoufox 지원이 종료됩니다",
|
||||
"description": "Camoufox 프로필 지원이 2026년 7월 8일에 종료됩니다. Camoufox 프로필이 하나 이상 있습니다. 그 전에 Wayfern으로 이전하세요. 이후에는 Camoufox 프로필이 작동하지 않을 수 있습니다.",
|
||||
"acknowledge": "확인"
|
||||
"wayfernConfigDialog": {
|
||||
"titleView": "핑거프린트 설정 보기 - {{name}} ({{browser}})",
|
||||
"titleConfigure": "핑거프린트 설정 구성 - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "잘못된 핑거프린트 구성",
|
||||
"invalidFingerprintDescription": "핑거프린트 구성에 잘못된 JSON이 포함되어 있습니다. 고급 설정을 확인하세요.",
|
||||
"saveFailed": "구성 저장 실패",
|
||||
"unknownError": "알 수 없는 오류가 발생했습니다"
|
||||
},
|
||||
"cookieCopy": {
|
||||
"noOtherTargets": "선택된 다른 Wayfern 프로필이 없습니다"
|
||||
}
|
||||
}
|
||||
|
||||
+15
-76
@@ -340,7 +340,6 @@
|
||||
"title": "Navegador Anti-Detecção",
|
||||
"description": "Escolha um navegador com capacidades anti-detecção",
|
||||
"chromium": "Wayfern",
|
||||
"firefox": "Camoufox",
|
||||
"badge": "Navegador Anti-Detecção"
|
||||
},
|
||||
"regular": {
|
||||
@@ -376,9 +375,6 @@
|
||||
},
|
||||
"chromiumLabel": "Chromium",
|
||||
"chromiumSubtitle": "Desenvolvido com Wayfern",
|
||||
"firefoxLabel": "Firefox",
|
||||
"firefoxSubtitle": "Desenvolvido com Camoufox",
|
||||
"camoufoxWarning": "O Firefox (Camoufox) é mantido por uma organização terceira. Para uso em produção, utilize o Chromium.",
|
||||
"platformUnavailable": "{{browser}} ainda não está disponível para sua plataforma.",
|
||||
"passwordProtect": {
|
||||
"label": "Proteger este perfil com senha",
|
||||
@@ -749,42 +745,6 @@
|
||||
"error": "Falha ao importar perfil"
|
||||
},
|
||||
"config": {
|
||||
"camoufox": {
|
||||
"title": "Configuração do Camoufox",
|
||||
"fingerprint": {
|
||||
"title": "Impressão Digital",
|
||||
"randomize": "Aleatorizar ao Iniciar",
|
||||
"randomizeDescription": "Gera uma nova impressão digital cada vez que o navegador é iniciado.",
|
||||
"osCpuPlaceholder": "ex., Intel Mac OS X 10.15",
|
||||
"webglRendererPlaceholder": "ex., llvmpipe ou similar"
|
||||
},
|
||||
"os": {
|
||||
"title": "Sistema Operacional",
|
||||
"description": "O sistema operacional a emular para geração de impressão digital.",
|
||||
"windows": "Windows",
|
||||
"macos": "macOS",
|
||||
"linux": "Linux"
|
||||
},
|
||||
"screen": {
|
||||
"title": "Tamanho da Tela",
|
||||
"minWidth": "Largura Mín",
|
||||
"maxWidth": "Largura Máx",
|
||||
"minHeight": "Altura Mín",
|
||||
"maxHeight": "Altura Máx"
|
||||
},
|
||||
"geoip": {
|
||||
"title": "GeoIP",
|
||||
"auto": "Automático (baseado no proxy)",
|
||||
"manual": "Manual",
|
||||
"disabled": "Desativado"
|
||||
},
|
||||
"blocking": {
|
||||
"title": "Bloqueio",
|
||||
"images": "Bloquear Imagens",
|
||||
"webrtc": "Bloquear WebRTC",
|
||||
"webgl": "Bloquear WebGL"
|
||||
}
|
||||
},
|
||||
"wayfern": {
|
||||
"title": "Configuração do Wayfern",
|
||||
"fingerprint": {
|
||||
@@ -839,7 +799,7 @@
|
||||
"sourcePlaceholder": "Selecione um perfil para copiar os cookies",
|
||||
"running": "(em execução)",
|
||||
"targetProfiles": "Perfis de destino ({{count}})",
|
||||
"noOtherTargets": "Nenhum outro perfil Wayfern/Camoufox selecionado",
|
||||
"noOtherTargets": "Nenhum outro perfil Wayfern selecionado",
|
||||
"selectSourceFirst": "Selecione primeiro um perfil de origem",
|
||||
"selectionStatus": "({{selected}} de {{total}} selecionados)",
|
||||
"searchPlaceholder": "Buscar domínios ou cookies...",
|
||||
@@ -968,7 +928,6 @@
|
||||
"serverError": "Erro do servidor. Por favor, tente novamente mais tarde.",
|
||||
"unknownError": "Ocorreu um erro desconhecido. Por favor, tente novamente.",
|
||||
"noProfilesForUrl": "Sem perfis disponíveis. Crie um perfil primeiro antes de abrir URLs.",
|
||||
"updateCamoufoxConfigFailed": "Falha ao atualizar a configuração do camoufox: {{error}}",
|
||||
"updateWayfernConfigFailed": "Falha ao atualizar a configuração do wayfern: {{error}}",
|
||||
"createProfileFailed": "Falha ao criar o perfil: {{error}}",
|
||||
"launchBrowserFailed": "Falha ao iniciar o navegador: {{error}}",
|
||||
@@ -977,7 +936,7 @@
|
||||
"renameProfileFailed": "Falha ao renomear o perfil: {{error}}",
|
||||
"killBrowserFailed": "Falha ao encerrar o navegador: {{error}}",
|
||||
"deleteSelectedProfilesFailed": "Falha ao excluir os perfis selecionados: {{error}}",
|
||||
"cookieCopyUnsupportedBrowser": "A cópia de cookies só funciona com perfis Wayfern e Camoufox",
|
||||
"cookieCopyUnsupportedBrowser": "A cópia de cookies só funciona com perfis Wayfern",
|
||||
"updateSyncSettingsFailed": "Falha ao atualizar as configurações de sincronização",
|
||||
"cloneProfileFailed": "Falha ao clonar o perfil: {{error}}",
|
||||
"loadSupportedBrowsersFailed": "Falha ao carregar os navegadores suportados",
|
||||
@@ -994,7 +953,6 @@
|
||||
"setProfilePasswordFailed": "Falha ao definir a senha do perfil: {{error}}"
|
||||
},
|
||||
"browser": {
|
||||
"camoufox": "Camoufox",
|
||||
"wayfern": "Wayfern"
|
||||
},
|
||||
"fingerprint": {
|
||||
@@ -1105,8 +1063,6 @@
|
||||
"warnings": {
|
||||
"windowResizeTitle": "Dimensões de janela personalizadas",
|
||||
"windowResizeDescription": "Alterar as dimensões da janela do navegador pode aumentar a chance de detecção pelos sites de que as informações do navegador estão falsificadas.",
|
||||
"windowResizeCamoufoxTitle": "Viewport bloqueado pelo Camoufox",
|
||||
"windowResizeCamoufoxDescription": "O Camoufox bloqueia o viewport nas dimensões de tela falsificadas para anti-fingerprinting. Redimensionar a janela pode causar áreas cortadas ou cinzas. Este é o comportamento esperado.",
|
||||
"dontShowAgain": "Não mostrar novamente",
|
||||
"continue": "Continuar",
|
||||
"cancel": "Cancelar"
|
||||
@@ -1237,7 +1193,7 @@
|
||||
"cannotWhileRunning": "Pare o perfil antes de alterar a senha."
|
||||
},
|
||||
"fingerprint": {
|
||||
"notSupported": "A edição de impressão digital só está disponível para perfis Camoufox e Wayfern.",
|
||||
"notSupported": "A edição de impressão digital só está disponível para perfis Wayfern.",
|
||||
"lockedTitle": "Visualizar e editar a impressão digital é um recurso Pro",
|
||||
"lockedDescription": "A proteção contra fingerprint está incluída em todos os planos. Visualizar e editar os valores da impressão digital de um perfil é o que requer um plano pago ativo."
|
||||
},
|
||||
@@ -1267,9 +1223,7 @@
|
||||
"extensionGroup": "Grupo de Extensões",
|
||||
"compatibility": {
|
||||
"label": "Compatibilidade",
|
||||
"chromium": "Chromium",
|
||||
"firefox": "Firefox",
|
||||
"both": "Chromium e Firefox"
|
||||
"chromium": "Chromium"
|
||||
},
|
||||
"selectedFile": "Arquivo selecionado",
|
||||
"namePlaceholder": "Nome da extensão",
|
||||
@@ -1656,14 +1610,6 @@
|
||||
"tooltipSent": "↑ Enviado: ",
|
||||
"tooltipReceived": "↓ Recebido: "
|
||||
},
|
||||
"camoufoxDialog": {
|
||||
"titleView": "Ver configurações de impressão digital - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Configurar impressão digital - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Configuração de impressão digital inválida",
|
||||
"invalidFingerprintDescription": "A configuração de impressão digital contém JSON inválido. Verifique suas configurações avançadas.",
|
||||
"saveFailed": "Falha ao salvar configuração",
|
||||
"unknownError": "Ocorreu um erro desconhecido"
|
||||
},
|
||||
"proxyCheck": {
|
||||
"unknownLocation": "Desconhecido",
|
||||
"locationToast": "A localização do seu proxy é:",
|
||||
@@ -1703,15 +1649,6 @@
|
||||
"vpnsHeading": "VPNs",
|
||||
"createByCountryHeading": "Criar por país"
|
||||
},
|
||||
"releaseTypeSelector": {
|
||||
"noReleaseTypes": "Nenhum tipo de versão disponível.",
|
||||
"placeholder": "Selecione o tipo de versão...",
|
||||
"stable": "Estável",
|
||||
"nightly": "Nightly",
|
||||
"downloaded": "Baixado",
|
||||
"downloadBrowser": "Baixar navegador",
|
||||
"downloading": "Baixando..."
|
||||
},
|
||||
"dataTableActionBar": {
|
||||
"selected": "{{count}} selecionado(s)",
|
||||
"clearSelection": "Limpar seleção"
|
||||
@@ -1861,7 +1798,7 @@
|
||||
"proxyNotWorking": "O proxy selecionado não está funcionando, então o perfil não foi criado.",
|
||||
"proxyPaymentRequired": "O proxy selecionado exige pagamento (402) — sua assinatura pode ter expirado — então o perfil não foi criado.",
|
||||
"vpnNotWorking": "A VPN selecionada não está funcionando, então o perfil não foi criado.",
|
||||
"camoufoxImportDeprecated": "A importação de perfis baseados em Firefox (Camoufox) não é mais suportada. O Camoufox está sendo descontinuado — use o Wayfern."
|
||||
"camoufoxImportDeprecated": "A importação de perfis baseados em Firefox não é mais suportada. Use o Wayfern."
|
||||
},
|
||||
"rail": {
|
||||
"profiles": "Perfis",
|
||||
@@ -1988,10 +1925,6 @@
|
||||
"show": "Mostrar Donut Browser",
|
||||
"quit": "Sair"
|
||||
},
|
||||
"browserSupport": {
|
||||
"endingSoonTitle": "O suporte ao navegador terminará em breve",
|
||||
"endingSoonDescription": "O suporte aos seguintes perfis será removido em 15 de março de 2026: {{profiles}}. Migre para perfis Wayfern."
|
||||
},
|
||||
"onboarding": {
|
||||
"steps": {
|
||||
"createProfile": {
|
||||
@@ -2073,9 +2006,15 @@
|
||||
"title": "Automação do navegador pausada",
|
||||
"description": "Sua conta foi temporariamente restringida dos recursos Pro do navegador, geralmente por entrar em vários dispositivos ao mesmo tempo. Saia dos outros dispositivos e reinicie o perfil para restaurá-la."
|
||||
},
|
||||
"camoufoxDeprecation": {
|
||||
"title": "O suporte ao Camoufox está terminando",
|
||||
"description": "O suporte aos perfis do Camoufox terminará em 8 de julho de 2026. Você tem um ou mais perfis do Camoufox. Migre-os para o Wayfern antes dessa data — depois disso, os perfis do Camoufox podem parar de funcionar.",
|
||||
"acknowledge": "Entendi"
|
||||
"wayfernConfigDialog": {
|
||||
"titleView": "Ver configurações de impressão digital - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Configurar impressão digital - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Configuração de impressão digital inválida",
|
||||
"invalidFingerprintDescription": "A configuração de impressão digital contém JSON inválido. Verifique suas configurações avançadas.",
|
||||
"saveFailed": "Falha ao salvar configuração",
|
||||
"unknownError": "Ocorreu um erro desconhecido"
|
||||
},
|
||||
"cookieCopy": {
|
||||
"noOtherTargets": "Nenhum outro perfil Wayfern selecionado"
|
||||
}
|
||||
}
|
||||
|
||||
+15
-76
@@ -340,7 +340,6 @@
|
||||
"title": "Антидетект браузер",
|
||||
"description": "Выберите браузер с возможностями защиты от обнаружения",
|
||||
"chromium": "Wayfern",
|
||||
"firefox": "Camoufox",
|
||||
"badge": "Антидетект браузер"
|
||||
},
|
||||
"regular": {
|
||||
@@ -376,9 +375,6 @@
|
||||
},
|
||||
"chromiumLabel": "Chromium",
|
||||
"chromiumSubtitle": "На базе Wayfern",
|
||||
"firefoxLabel": "Firefox",
|
||||
"firefoxSubtitle": "На базе Camoufox",
|
||||
"camoufoxWarning": "Firefox (Camoufox) поддерживается сторонней организацией. Для промышленного использования используйте Chromium.",
|
||||
"platformUnavailable": "{{browser}} пока недоступен на вашей платформе.",
|
||||
"passwordProtect": {
|
||||
"label": "Защитить этот профиль паролем",
|
||||
@@ -749,42 +745,6 @@
|
||||
"error": "Ошибка импорта профиля"
|
||||
},
|
||||
"config": {
|
||||
"camoufox": {
|
||||
"title": "Настройки Camoufox",
|
||||
"fingerprint": {
|
||||
"title": "Отпечаток",
|
||||
"randomize": "Случайный при запуске",
|
||||
"randomizeDescription": "Генерировать новый отпечаток при каждом запуске браузера.",
|
||||
"osCpuPlaceholder": "напр., Intel Mac OS X 10.15",
|
||||
"webglRendererPlaceholder": "напр., llvmpipe или похожее"
|
||||
},
|
||||
"os": {
|
||||
"title": "Операционная система",
|
||||
"description": "Операционная система для эмуляции при генерации отпечатка.",
|
||||
"windows": "Windows",
|
||||
"macos": "macOS",
|
||||
"linux": "Linux"
|
||||
},
|
||||
"screen": {
|
||||
"title": "Размер экрана",
|
||||
"minWidth": "Мин. ширина",
|
||||
"maxWidth": "Макс. ширина",
|
||||
"minHeight": "Мин. высота",
|
||||
"maxHeight": "Макс. высота"
|
||||
},
|
||||
"geoip": {
|
||||
"title": "GeoIP",
|
||||
"auto": "Автоматически (на основе прокси)",
|
||||
"manual": "Вручную",
|
||||
"disabled": "Выключено"
|
||||
},
|
||||
"blocking": {
|
||||
"title": "Блокировка",
|
||||
"images": "Блокировать изображения",
|
||||
"webrtc": "Блокировать WebRTC",
|
||||
"webgl": "Блокировать WebGL"
|
||||
}
|
||||
},
|
||||
"wayfern": {
|
||||
"title": "Настройки Wayfern",
|
||||
"fingerprint": {
|
||||
@@ -839,7 +799,7 @@
|
||||
"sourcePlaceholder": "Выберите профиль для копирования cookies",
|
||||
"running": "(запущен)",
|
||||
"targetProfiles": "Целевые профили ({{count}})",
|
||||
"noOtherTargets": "Других выбранных Wayfern/Camoufox профилей нет",
|
||||
"noOtherTargets": "Других выбранных Wayfern профилей нет",
|
||||
"selectSourceFirst": "Сначала выберите исходный профиль",
|
||||
"selectionStatus": "(выбрано {{selected}} из {{total}})",
|
||||
"searchPlaceholder": "Поиск доменов или cookies...",
|
||||
@@ -968,7 +928,6 @@
|
||||
"serverError": "Ошибка сервера. Попробуйте позже.",
|
||||
"unknownError": "Произошла неизвестная ошибка. Попробуйте снова.",
|
||||
"noProfilesForUrl": "Нет доступных профилей. Сначала создайте профиль, прежде чем открывать URL.",
|
||||
"updateCamoufoxConfigFailed": "Не удалось обновить настройки camoufox: {{error}}",
|
||||
"updateWayfernConfigFailed": "Не удалось обновить настройки wayfern: {{error}}",
|
||||
"createProfileFailed": "Не удалось создать профиль: {{error}}",
|
||||
"launchBrowserFailed": "Не удалось запустить браузер: {{error}}",
|
||||
@@ -977,7 +936,7 @@
|
||||
"renameProfileFailed": "Не удалось переименовать профиль: {{error}}",
|
||||
"killBrowserFailed": "Не удалось остановить браузер: {{error}}",
|
||||
"deleteSelectedProfilesFailed": "Не удалось удалить выбранные профили: {{error}}",
|
||||
"cookieCopyUnsupportedBrowser": "Копирование cookies работает только с профилями Wayfern и Camoufox",
|
||||
"cookieCopyUnsupportedBrowser": "Копирование cookies работает только с профилями Wayfern",
|
||||
"updateSyncSettingsFailed": "Не удалось обновить параметры синхронизации",
|
||||
"cloneProfileFailed": "Не удалось клонировать профиль: {{error}}",
|
||||
"loadSupportedBrowsersFailed": "Не удалось загрузить поддерживаемые браузеры",
|
||||
@@ -994,7 +953,6 @@
|
||||
"setProfilePasswordFailed": "Не удалось установить пароль профиля: {{error}}"
|
||||
},
|
||||
"browser": {
|
||||
"camoufox": "Camoufox",
|
||||
"wayfern": "Wayfern"
|
||||
},
|
||||
"fingerprint": {
|
||||
@@ -1105,8 +1063,6 @@
|
||||
"warnings": {
|
||||
"windowResizeTitle": "Пользовательские размеры окна",
|
||||
"windowResizeDescription": "Изменение размеров окна браузера может повысить вероятность обнаружения сайтами того, что информация браузера подменена.",
|
||||
"windowResizeCamoufoxTitle": "Viewport заблокирован Camoufox",
|
||||
"windowResizeCamoufoxDescription": "Camoufox блокирует viewport на подменённых размерах экрана для защиты от фингерпринтинга. Изменение размера окна может вызвать обрезанные или серые области. Это ожидаемое поведение.",
|
||||
"dontShowAgain": "Больше не показывать",
|
||||
"continue": "Продолжить",
|
||||
"cancel": "Отмена"
|
||||
@@ -1237,7 +1193,7 @@
|
||||
"cannotWhileRunning": "Остановите профиль перед сменой пароля."
|
||||
},
|
||||
"fingerprint": {
|
||||
"notSupported": "Редактирование отпечатков доступно только для профилей Camoufox и Wayfern.",
|
||||
"notSupported": "Редактирование отпечатков доступно только для профилей Wayfern.",
|
||||
"lockedTitle": "Просмотр и редактирование отпечатка — функция Pro",
|
||||
"lockedDescription": "Защита от отпечатков включена во все планы. Активный платный план требуется именно для просмотра и редактирования значений отпечатка профиля."
|
||||
},
|
||||
@@ -1267,9 +1223,7 @@
|
||||
"extensionGroup": "Группа расширений",
|
||||
"compatibility": {
|
||||
"label": "Совместимость",
|
||||
"chromium": "Chromium",
|
||||
"firefox": "Firefox",
|
||||
"both": "Chromium и Firefox"
|
||||
"chromium": "Chromium"
|
||||
},
|
||||
"selectedFile": "Выбранный файл",
|
||||
"namePlaceholder": "Название расширения",
|
||||
@@ -1656,14 +1610,6 @@
|
||||
"tooltipSent": "↑ Отправлено: ",
|
||||
"tooltipReceived": "↓ Получено: "
|
||||
},
|
||||
"camoufoxDialog": {
|
||||
"titleView": "Просмотр настроек отпечатка - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Настроить отпечаток - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Неверная конфигурация отпечатка",
|
||||
"invalidFingerprintDescription": "Конфигурация отпечатка содержит недопустимый JSON. Проверьте расширенные настройки.",
|
||||
"saveFailed": "Не удалось сохранить конфигурацию",
|
||||
"unknownError": "Произошла неизвестная ошибка"
|
||||
},
|
||||
"proxyCheck": {
|
||||
"unknownLocation": "Неизвестно",
|
||||
"locationToast": "Местоположение вашего прокси:",
|
||||
@@ -1703,15 +1649,6 @@
|
||||
"vpnsHeading": "VPN",
|
||||
"createByCountryHeading": "Создать по стране"
|
||||
},
|
||||
"releaseTypeSelector": {
|
||||
"noReleaseTypes": "Нет доступных типов выпусков.",
|
||||
"placeholder": "Выберите тип выпуска...",
|
||||
"stable": "Стабильный",
|
||||
"nightly": "Nightly",
|
||||
"downloaded": "Загружено",
|
||||
"downloadBrowser": "Загрузить браузер",
|
||||
"downloading": "Загрузка..."
|
||||
},
|
||||
"dataTableActionBar": {
|
||||
"selected": "Выбрано: {{count}}",
|
||||
"clearSelection": "Очистить выбор"
|
||||
@@ -1861,7 +1798,7 @@
|
||||
"proxyNotWorking": "Выбранный прокси не работает, поэтому профиль не создан.",
|
||||
"proxyPaymentRequired": "Выбранный прокси требует оплаты (402) — возможно, его подписка истекла — поэтому профиль не создан.",
|
||||
"vpnNotWorking": "Выбранный VPN не работает, поэтому профиль не создан.",
|
||||
"camoufoxImportDeprecated": "Импорт профилей на основе Firefox (Camoufox) больше не поддерживается. Camoufox выводится из эксплуатации — используйте Wayfern."
|
||||
"camoufoxImportDeprecated": "Импорт профилей на основе Firefox больше не поддерживается. Используйте Wayfern."
|
||||
},
|
||||
"rail": {
|
||||
"profiles": "Профили",
|
||||
@@ -1988,10 +1925,6 @@
|
||||
"show": "Показать Donut Browser",
|
||||
"quit": "Выход"
|
||||
},
|
||||
"browserSupport": {
|
||||
"endingSoonTitle": "Поддержка браузера скоро завершится",
|
||||
"endingSoonDescription": "Поддержка следующих профилей будет прекращена 15 марта 2026 года: {{profiles}}. Перейдите на профили Wayfern."
|
||||
},
|
||||
"onboarding": {
|
||||
"steps": {
|
||||
"createProfile": {
|
||||
@@ -2073,9 +2006,15 @@
|
||||
"title": "Автоматизация браузера приостановлена",
|
||||
"description": "Доступ вашей учётной записи к Pro-функциям браузера временно ограничен — обычно из-за входа сразу на нескольких устройствах. Выйдите из аккаунта на других устройствах и перезапустите профиль, чтобы восстановить доступ."
|
||||
},
|
||||
"camoufoxDeprecation": {
|
||||
"title": "Поддержка Camoufox прекращается",
|
||||
"description": "Поддержка профилей Camoufox прекращается 8 июля 2026 года. У вас есть один или несколько профилей Camoufox. Перенесите их на Wayfern до этой даты — после неё профили Camoufox могут перестать работать.",
|
||||
"acknowledge": "Понятно"
|
||||
"wayfernConfigDialog": {
|
||||
"titleView": "Просмотр настроек отпечатка - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Настроить отпечаток - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Неверная конфигурация отпечатка",
|
||||
"invalidFingerprintDescription": "Конфигурация отпечатка содержит недопустимый JSON. Проверьте расширенные настройки.",
|
||||
"saveFailed": "Не удалось сохранить конфигурацию",
|
||||
"unknownError": "Произошла неизвестная ошибка"
|
||||
},
|
||||
"cookieCopy": {
|
||||
"noOtherTargets": "Других выбранных Wayfern профилей нет"
|
||||
}
|
||||
}
|
||||
|
||||
+15
-76
@@ -340,7 +340,6 @@
|
||||
"title": "Trình duyệt chống phát hiện",
|
||||
"description": "Chọn trình duyệt có khả năng chống phát hiện",
|
||||
"chromium": "Wayfern",
|
||||
"firefox": "Camoufox",
|
||||
"badge": "Trình duyệt chống phát hiện"
|
||||
},
|
||||
"regular": {
|
||||
@@ -376,9 +375,6 @@
|
||||
},
|
||||
"chromiumLabel": "Chromium",
|
||||
"chromiumSubtitle": "Dựa trên Wayfern",
|
||||
"firefoxLabel": "Firefox",
|
||||
"firefoxSubtitle": "Dựa trên Camoufox",
|
||||
"camoufoxWarning": "Firefox (Camoufox) được duy trì bởi bên thứ ba. Đối với sử dụng trong môi trường sản xuất, vui lòng dùng Chromium.",
|
||||
"platformUnavailable": "{{browser}} chưa khả dụng trên nền tảng của bạn.",
|
||||
"passwordProtect": {
|
||||
"label": "Bảo vệ hồ sơ bằng mật khẩu",
|
||||
@@ -749,42 +745,6 @@
|
||||
"error": "Nhập profile thất bại"
|
||||
},
|
||||
"config": {
|
||||
"camoufox": {
|
||||
"title": "Cấu hình Camoufox",
|
||||
"fingerprint": {
|
||||
"title": "Vân tay",
|
||||
"randomize": "Tạo ngẫu nhiên khi khởi chạy",
|
||||
"randomizeDescription": "Tạo vân tay mới mỗi khi khởi chạy trình duyệt.",
|
||||
"osCpuPlaceholder": "ví dụ: Intel Mac OS X 10.15",
|
||||
"webglRendererPlaceholder": "ví dụ: llvmpipe, hoặc tương tự"
|
||||
},
|
||||
"os": {
|
||||
"title": "Hệ điều hành",
|
||||
"description": "Hệ điều hành mô phỏng để tạo vân tay.",
|
||||
"windows": "Windows",
|
||||
"macos": "macOS",
|
||||
"linux": "Linux"
|
||||
},
|
||||
"screen": {
|
||||
"title": "Kích thước màn hình",
|
||||
"minWidth": "Chiều rộng tối thiểu",
|
||||
"maxWidth": "Chiều rộng tối đa",
|
||||
"minHeight": "Chiều cao tối thiểu",
|
||||
"maxHeight": "Chiều cao tối đa"
|
||||
},
|
||||
"geoip": {
|
||||
"title": "GeoIP",
|
||||
"auto": "Tự động (dựa trên proxy)",
|
||||
"manual": "Thủ công",
|
||||
"disabled": "Tắt"
|
||||
},
|
||||
"blocking": {
|
||||
"title": "Chặn",
|
||||
"images": "Chặn hình ảnh",
|
||||
"webrtc": "Chặn WebRTC",
|
||||
"webgl": "Chặn WebGL"
|
||||
}
|
||||
},
|
||||
"wayfern": {
|
||||
"title": "Cấu hình Wayfern",
|
||||
"fingerprint": {
|
||||
@@ -839,7 +799,7 @@
|
||||
"sourcePlaceholder": "Chọn profile để sao chép cookie từ",
|
||||
"running": "(đang chạy)",
|
||||
"targetProfiles": "Profile đích ({{count}})",
|
||||
"noOtherTargets": "Chưa chọn profile Wayfern/Camoufox nào khác",
|
||||
"noOtherTargets": "Chưa chọn profile Wayfern nào khác",
|
||||
"selectSourceFirst": "Hãy chọn profile nguồn trước",
|
||||
"selectionStatus": "(đã chọn {{selected}}/{{total}})",
|
||||
"searchPlaceholder": "Tìm kiếm tên miền hoặc cookie...",
|
||||
@@ -968,7 +928,6 @@
|
||||
"serverError": "Lỗi máy chủ. Vui lòng thử lại sau.",
|
||||
"unknownError": "Đã xảy ra lỗi không xác định. Vui lòng thử lại.",
|
||||
"noProfilesForUrl": "Không có profile nào. Vui lòng tạo profile trước khi mở URL.",
|
||||
"updateCamoufoxConfigFailed": "Cập nhật cấu hình camoufox thất bại: {{error}}",
|
||||
"updateWayfernConfigFailed": "Cập nhật cấu hình wayfern thất bại: {{error}}",
|
||||
"createProfileFailed": "Tạo profile thất bại: {{error}}",
|
||||
"launchBrowserFailed": "Khởi chạy trình duyệt thất bại: {{error}}",
|
||||
@@ -977,7 +936,7 @@
|
||||
"renameProfileFailed": "Đổi tên profile thất bại: {{error}}",
|
||||
"killBrowserFailed": "Dừng trình duyệt thất bại: {{error}}",
|
||||
"deleteSelectedProfilesFailed": "Xóa các profile đã chọn thất bại: {{error}}",
|
||||
"cookieCopyUnsupportedBrowser": "Sao chép cookie chỉ hoạt động với profile Wayfern và Camoufox",
|
||||
"cookieCopyUnsupportedBrowser": "Sao chép cookie chỉ hoạt động với profile Wayfern",
|
||||
"updateSyncSettingsFailed": "Cập nhật cài đặt đồng bộ thất bại",
|
||||
"cloneProfileFailed": "Nhân bản profile thất bại: {{error}}",
|
||||
"loadSupportedBrowsersFailed": "Tải danh sách trình duyệt hỗ trợ thất bại",
|
||||
@@ -994,7 +953,6 @@
|
||||
"setProfilePasswordFailed": "Đặt mật khẩu profile thất bại: {{error}}"
|
||||
},
|
||||
"browser": {
|
||||
"camoufox": "Camoufox",
|
||||
"wayfern": "Wayfern"
|
||||
},
|
||||
"fingerprint": {
|
||||
@@ -1105,8 +1063,6 @@
|
||||
"warnings": {
|
||||
"windowResizeTitle": "Kích thước cửa sổ tùy chỉnh",
|
||||
"windowResizeDescription": "Thay đổi kích thước cửa sổ trình duyệt có thể tăng khả năng bị trang web phát hiện thông tin trình duyệt bị giả mạo.",
|
||||
"windowResizeCamoufoxTitle": "Cửa sổ xem bị khóa bởi Camoufox",
|
||||
"windowResizeCamoufoxDescription": "Camoufox khóa cửa sổ xem theo kích thước màn hình giả mạo để chống vân tay. Thay đổi kích thước cửa sổ có thể gây ra vùng bị cắt xén hoặc xám. Đây là hành vi bình thường.",
|
||||
"dontShowAgain": "Không hiển thị lại",
|
||||
"continue": "Tiếp tục",
|
||||
"cancel": "Hủy"
|
||||
@@ -1237,7 +1193,7 @@
|
||||
"cannotWhileRunning": "Dừng profile trước khi thay đổi mật khẩu."
|
||||
},
|
||||
"fingerprint": {
|
||||
"notSupported": "Chỉnh sửa vân tay chỉ khả dụng cho profile Camoufox và Wayfern.",
|
||||
"notSupported": "Chỉnh sửa vân tay chỉ khả dụng cho profile Wayfern.",
|
||||
"lockedTitle": "Xem và chỉnh sửa vân tay là tính năng Pro",
|
||||
"lockedDescription": "Bảo vệ vân tay được bao gồm trong mọi gói. Việc xem và chỉnh sửa các giá trị vân tay của profile mới là phần yêu cầu gói trả phí đang hoạt động."
|
||||
},
|
||||
@@ -1267,9 +1223,7 @@
|
||||
"extensionGroup": "Nhóm tiện ích",
|
||||
"compatibility": {
|
||||
"label": "Tương thích",
|
||||
"chromium": "Chromium",
|
||||
"firefox": "Firefox",
|
||||
"both": "Chromium và Firefox"
|
||||
"chromium": "Chromium"
|
||||
},
|
||||
"selectedFile": "Tệp đã chọn",
|
||||
"namePlaceholder": "Tên tiện ích",
|
||||
@@ -1656,14 +1610,6 @@
|
||||
"tooltipSent": "↑ Đã gửi: ",
|
||||
"tooltipReceived": "↓ Đã nhận: "
|
||||
},
|
||||
"camoufoxDialog": {
|
||||
"titleView": "Xem cài đặt vân tay - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Cấu hình cài đặt vân tay - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Cấu hình vân tay không hợp lệ",
|
||||
"invalidFingerprintDescription": "Cấu hình vân tay chứa JSON không hợp lệ. Vui lòng kiểm tra cài đặt nâng cao.",
|
||||
"saveFailed": "Lưu cấu hình thất bại",
|
||||
"unknownError": "Đã xảy ra lỗi không xác định"
|
||||
},
|
||||
"proxyCheck": {
|
||||
"unknownLocation": "Không xác định",
|
||||
"locationToast": "Vị trí proxy của bạn là:",
|
||||
@@ -1703,15 +1649,6 @@
|
||||
"vpnsHeading": "VPN",
|
||||
"createByCountryHeading": "Tạo theo quốc gia"
|
||||
},
|
||||
"releaseTypeSelector": {
|
||||
"noReleaseTypes": "Không có loại phát hành nào.",
|
||||
"placeholder": "Chọn loại phát hành...",
|
||||
"stable": "Ổn định",
|
||||
"nightly": "Nightly",
|
||||
"downloaded": "Đã tải xuống",
|
||||
"downloadBrowser": "Tải trình duyệt",
|
||||
"downloading": "Đang tải xuống..."
|
||||
},
|
||||
"dataTableActionBar": {
|
||||
"selected": "Đã chọn {{count}}",
|
||||
"clearSelection": "Xóa lựa chọn"
|
||||
@@ -1861,7 +1798,7 @@
|
||||
"proxyNotWorking": "Proxy đã chọn không hoạt động, nên profile chưa được tạo.",
|
||||
"proxyPaymentRequired": "Proxy đã chọn yêu cầu thanh toán (402) — gói đăng ký của nó có thể đã hết hạn — nên profile chưa được tạo.",
|
||||
"vpnNotWorking": "VPN đã chọn không hoạt động, nên profile chưa được tạo.",
|
||||
"camoufoxImportDeprecated": "Không còn hỗ trợ nhập profile dựa trên Firefox (Camoufox). Camoufox đang bị ngừng hỗ trợ — vui lòng dùng Wayfern."
|
||||
"camoufoxImportDeprecated": "Không còn hỗ trợ nhập profile dựa trên Firefox. Vui lòng dùng Wayfern."
|
||||
},
|
||||
"rail": {
|
||||
"profiles": "Profile",
|
||||
@@ -1988,10 +1925,6 @@
|
||||
"show": "Hiển thị Donut Browser",
|
||||
"quit": "Thoát"
|
||||
},
|
||||
"browserSupport": {
|
||||
"endingSoonTitle": "Hỗ trợ trình duyệt sắp kết thúc",
|
||||
"endingSoonDescription": "Hỗ trợ cho các profile sau sẽ bị gỡ bỏ vào ngày 15 tháng 3 năm 2026: {{profiles}}. Vui lòng chuyển sang profile Wayfern."
|
||||
},
|
||||
"onboarding": {
|
||||
"steps": {
|
||||
"createProfile": {
|
||||
@@ -2073,9 +2006,15 @@
|
||||
"title": "Tự động hóa trình duyệt đã tạm dừng",
|
||||
"description": "Tài khoản của bạn tạm thời bị hạn chế các tính năng Pro của trình duyệt, thường do đăng nhập trên nhiều thiết bị cùng lúc. Hãy đăng xuất khỏi các thiết bị khác rồi khởi chạy lại profile để khôi phục."
|
||||
},
|
||||
"camoufoxDeprecation": {
|
||||
"title": "Hỗ trợ Camoufox sắp kết thúc",
|
||||
"description": "Hỗ trợ cho các profile Camoufox sẽ kết thúc vào ngày 8 tháng 7 năm 2026. Bạn có một hoặc nhiều profile Camoufox. Hãy chuyển chúng sang Wayfern trước thời điểm đó — sau ngày này, các profile Camoufox có thể ngừng hoạt động.",
|
||||
"acknowledge": "Đã hiểu"
|
||||
"wayfernConfigDialog": {
|
||||
"titleView": "Xem cài đặt vân tay - {{name}} ({{browser}})",
|
||||
"titleConfigure": "Cấu hình cài đặt vân tay - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "Cấu hình vân tay không hợp lệ",
|
||||
"invalidFingerprintDescription": "Cấu hình vân tay chứa JSON không hợp lệ. Vui lòng kiểm tra cài đặt nâng cao.",
|
||||
"saveFailed": "Lưu cấu hình thất bại",
|
||||
"unknownError": "Đã xảy ra lỗi không xác định"
|
||||
},
|
||||
"cookieCopy": {
|
||||
"noOtherTargets": "Chưa chọn profile Wayfern nào khác"
|
||||
}
|
||||
}
|
||||
|
||||
+15
-76
@@ -340,7 +340,6 @@
|
||||
"title": "防检测浏览器",
|
||||
"description": "选择具有防检测功能的浏览器",
|
||||
"chromium": "Wayfern",
|
||||
"firefox": "Camoufox",
|
||||
"badge": "防检测浏览器"
|
||||
},
|
||||
"regular": {
|
||||
@@ -376,9 +375,6 @@
|
||||
},
|
||||
"chromiumLabel": "Chromium",
|
||||
"chromiumSubtitle": "由 Wayfern 驱动",
|
||||
"firefoxLabel": "Firefox",
|
||||
"firefoxSubtitle": "由 Camoufox 驱动",
|
||||
"camoufoxWarning": "Firefox(Camoufox)由第三方组织维护。在生产环境中,请使用 Chromium。",
|
||||
"platformUnavailable": "{{browser}} 在您的平台上尚不可用。",
|
||||
"passwordProtect": {
|
||||
"label": "为此配置文件设置密码保护",
|
||||
@@ -749,42 +745,6 @@
|
||||
"error": "导入配置文件失败"
|
||||
},
|
||||
"config": {
|
||||
"camoufox": {
|
||||
"title": "Camoufox 配置",
|
||||
"fingerprint": {
|
||||
"title": "指纹",
|
||||
"randomize": "启动时随机化",
|
||||
"randomizeDescription": "每次启动浏览器时生成新的指纹。",
|
||||
"osCpuPlaceholder": "例如: Intel Mac OS X 10.15",
|
||||
"webglRendererPlaceholder": "例如: llvmpipe 或类似"
|
||||
},
|
||||
"os": {
|
||||
"title": "操作系统",
|
||||
"description": "用于生成指纹的模拟操作系统。",
|
||||
"windows": "Windows",
|
||||
"macos": "macOS",
|
||||
"linux": "Linux"
|
||||
},
|
||||
"screen": {
|
||||
"title": "屏幕尺寸",
|
||||
"minWidth": "最小宽度",
|
||||
"maxWidth": "最大宽度",
|
||||
"minHeight": "最小高度",
|
||||
"maxHeight": "最大高度"
|
||||
},
|
||||
"geoip": {
|
||||
"title": "GeoIP",
|
||||
"auto": "自动(基于代理)",
|
||||
"manual": "手动",
|
||||
"disabled": "禁用"
|
||||
},
|
||||
"blocking": {
|
||||
"title": "阻止",
|
||||
"images": "阻止图片",
|
||||
"webrtc": "阻止 WebRTC",
|
||||
"webgl": "阻止 WebGL"
|
||||
}
|
||||
},
|
||||
"wayfern": {
|
||||
"title": "Wayfern 配置",
|
||||
"fingerprint": {
|
||||
@@ -839,7 +799,7 @@
|
||||
"sourcePlaceholder": "选择要复制 Cookie 的配置文件",
|
||||
"running": "(运行中)",
|
||||
"targetProfiles": "目标配置文件 ({{count}})",
|
||||
"noOtherTargets": "未选择其他 Wayfern/Camoufox 配置文件",
|
||||
"noOtherTargets": "未选择其他 Wayfern 配置文件",
|
||||
"selectSourceFirst": "请先选择源配置文件",
|
||||
"selectionStatus": "(已选择 {{selected}} / {{total}})",
|
||||
"searchPlaceholder": "搜索域名或 Cookie...",
|
||||
@@ -968,7 +928,6 @@
|
||||
"serverError": "服务器错误。请稍后重试。",
|
||||
"unknownError": "发生未知错误。请重试。",
|
||||
"noProfilesForUrl": "没有可用的配置文件。请先创建配置文件再打开 URL。",
|
||||
"updateCamoufoxConfigFailed": "更新 camoufox 配置失败: {{error}}",
|
||||
"updateWayfernConfigFailed": "更新 wayfern 配置失败: {{error}}",
|
||||
"createProfileFailed": "创建配置文件失败: {{error}}",
|
||||
"launchBrowserFailed": "启动浏览器失败: {{error}}",
|
||||
@@ -977,7 +936,7 @@
|
||||
"renameProfileFailed": "重命名配置文件失败: {{error}}",
|
||||
"killBrowserFailed": "终止浏览器失败: {{error}}",
|
||||
"deleteSelectedProfilesFailed": "删除所选配置文件失败: {{error}}",
|
||||
"cookieCopyUnsupportedBrowser": "Cookie 复制仅适用于 Wayfern 和 Camoufox 配置文件",
|
||||
"cookieCopyUnsupportedBrowser": "Cookie 复制仅适用于 Wayfern 配置文件",
|
||||
"updateSyncSettingsFailed": "更新同步设置失败",
|
||||
"cloneProfileFailed": "克隆配置文件失败: {{error}}",
|
||||
"loadSupportedBrowsersFailed": "加载受支持的浏览器失败",
|
||||
@@ -994,7 +953,6 @@
|
||||
"setProfilePasswordFailed": "设置配置文件密码失败: {{error}}"
|
||||
},
|
||||
"browser": {
|
||||
"camoufox": "Camoufox",
|
||||
"wayfern": "Wayfern"
|
||||
},
|
||||
"fingerprint": {
|
||||
@@ -1105,8 +1063,6 @@
|
||||
"warnings": {
|
||||
"windowResizeTitle": "自定义窗口尺寸",
|
||||
"windowResizeDescription": "更改浏览器窗口尺寸可能会增加网站检测到浏览器信息被伪装的概率。",
|
||||
"windowResizeCamoufoxTitle": "视口已被 Camoufox 锁定",
|
||||
"windowResizeCamoufoxDescription": "Camoufox 将视口锁定为伪装的屏幕尺寸以防止指纹识别。调整窗口大小可能会导致内容被裁剪或出现灰色区域。这是预期行为。",
|
||||
"dontShowAgain": "不再显示",
|
||||
"continue": "继续",
|
||||
"cancel": "取消"
|
||||
@@ -1237,7 +1193,7 @@
|
||||
"cannotWhileRunning": "更改密码前请先停止此配置文件。"
|
||||
},
|
||||
"fingerprint": {
|
||||
"notSupported": "指纹编辑仅适用于 Camoufox 和 Wayfern 配置文件。",
|
||||
"notSupported": "指纹编辑仅适用于 Wayfern 配置文件。",
|
||||
"lockedTitle": "查看和编辑指纹是 Pro 功能",
|
||||
"lockedDescription": "所有方案都包含指纹保护。查看和编辑配置文件的指纹数值才需要有效的付费方案。"
|
||||
},
|
||||
@@ -1267,9 +1223,7 @@
|
||||
"extensionGroup": "扩展程序组",
|
||||
"compatibility": {
|
||||
"label": "兼容性",
|
||||
"chromium": "Chromium",
|
||||
"firefox": "Firefox",
|
||||
"both": "Chromium 和 Firefox"
|
||||
"chromium": "Chromium"
|
||||
},
|
||||
"selectedFile": "已选文件",
|
||||
"namePlaceholder": "扩展程序名称",
|
||||
@@ -1656,14 +1610,6 @@
|
||||
"tooltipSent": "↑ 已发送: ",
|
||||
"tooltipReceived": "↓ 已接收: "
|
||||
},
|
||||
"camoufoxDialog": {
|
||||
"titleView": "查看指纹设置 - {{name}} ({{browser}})",
|
||||
"titleConfigure": "配置指纹设置 - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "无效的指纹配置",
|
||||
"invalidFingerprintDescription": "指纹配置包含无效的 JSON。请检查高级设置。",
|
||||
"saveFailed": "保存配置失败",
|
||||
"unknownError": "发生未知错误"
|
||||
},
|
||||
"proxyCheck": {
|
||||
"unknownLocation": "未知",
|
||||
"locationToast": "你的代理位置:",
|
||||
@@ -1703,15 +1649,6 @@
|
||||
"vpnsHeading": "VPN",
|
||||
"createByCountryHeading": "按国家创建"
|
||||
},
|
||||
"releaseTypeSelector": {
|
||||
"noReleaseTypes": "没有可用的发布类型。",
|
||||
"placeholder": "选择发布类型...",
|
||||
"stable": "Stable",
|
||||
"nightly": "Nightly",
|
||||
"downloaded": "已下载",
|
||||
"downloadBrowser": "下载浏览器",
|
||||
"downloading": "正在下载..."
|
||||
},
|
||||
"dataTableActionBar": {
|
||||
"selected": "已选择 {{count}}",
|
||||
"clearSelection": "清除选择"
|
||||
@@ -1861,7 +1798,7 @@
|
||||
"proxyNotWorking": "所选代理无法使用,因此未创建配置文件。",
|
||||
"proxyPaymentRequired": "所选代理需要付费(402),其订阅可能已过期,因此未创建配置文件。",
|
||||
"vpnNotWorking": "所选 VPN 无法使用,因此未创建配置文件。",
|
||||
"camoufoxImportDeprecated": "不再支持导入基于 Firefox 的 (Camoufox) 配置文件。Camoufox 即将停用——请改用 Wayfern。"
|
||||
"camoufoxImportDeprecated": "不再支持导入基于 Firefox 的配置文件。请改用 Wayfern。"
|
||||
},
|
||||
"rail": {
|
||||
"profiles": "配置文件",
|
||||
@@ -1988,10 +1925,6 @@
|
||||
"show": "显示 Donut Browser",
|
||||
"quit": "退出"
|
||||
},
|
||||
"browserSupport": {
|
||||
"endingSoonTitle": "浏览器支持即将结束",
|
||||
"endingSoonDescription": "以下配置文件的支持将于 2026 年 3 月 15 日移除:{{profiles}}。请迁移到 Wayfern 配置文件。"
|
||||
},
|
||||
"onboarding": {
|
||||
"steps": {
|
||||
"createProfile": {
|
||||
@@ -2073,9 +2006,15 @@
|
||||
"title": "浏览器自动化已暂停",
|
||||
"description": "您的账户暂时被限制使用 Pro 浏览器功能,通常是因为同时在多台设备上登录。请退出其他设备的登录,然后重新启动配置文件即可恢复。"
|
||||
},
|
||||
"camoufoxDeprecation": {
|
||||
"title": "Camoufox 支持即将结束",
|
||||
"description": "Camoufox 配置文件的支持将于 2026 年 7 月 8 日结束。您有一个或多个 Camoufox 配置文件。请在此之前迁移到 Wayfern——之后 Camoufox 配置文件可能会停止工作。",
|
||||
"acknowledge": "知道了"
|
||||
"wayfernConfigDialog": {
|
||||
"titleView": "查看指纹设置 - {{name}} ({{browser}})",
|
||||
"titleConfigure": "配置指纹设置 - {{name}} ({{browser}})",
|
||||
"invalidFingerprint": "无效的指纹配置",
|
||||
"invalidFingerprintDescription": "指纹配置包含无效的 JSON。请检查高级设置。",
|
||||
"saveFailed": "保存配置失败",
|
||||
"unknownError": "发生未知错误"
|
||||
},
|
||||
"cookieCopy": {
|
||||
"noOtherTargets": "未选择其他 Wayfern 配置文件"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,12 +3,7 @@
|
||||
* Centralized helpers for browser name mapping, icons, etc.
|
||||
*/
|
||||
|
||||
import {
|
||||
FaChrome,
|
||||
FaExclamationTriangle,
|
||||
FaFire,
|
||||
FaFirefox,
|
||||
} from "react-icons/fa";
|
||||
import { FaChrome, FaExclamationTriangle, FaFire } from "react-icons/fa";
|
||||
import { LuLock } from "react-icons/lu";
|
||||
|
||||
/**
|
||||
@@ -16,7 +11,6 @@ import { LuLock } from "react-icons/lu";
|
||||
*/
|
||||
export function getBrowserDisplayName(browserType: string): string {
|
||||
const browserNames: Record<string, string> = {
|
||||
camoufox: "Camoufox",
|
||||
wayfern: "Wayfern",
|
||||
};
|
||||
|
||||
@@ -30,12 +24,9 @@ export function getBrowserDisplayName(browserType: string): string {
|
||||
*/
|
||||
export function getBrowserIcon(browserType: string) {
|
||||
switch (browserType) {
|
||||
case "camoufox":
|
||||
return FaFirefox; // Firefox-based anti-detect browser
|
||||
case "wayfern":
|
||||
return FaChrome; // Chromium-based anti-detect browser
|
||||
return FaChrome;
|
||||
default:
|
||||
// All other browsers get a warning icon
|
||||
return FaExclamationTriangle;
|
||||
}
|
||||
}
|
||||
@@ -66,13 +57,9 @@ export const getCurrentOS = () => {
|
||||
|
||||
export function isCrossOsProfile(profile: {
|
||||
host_os?: string;
|
||||
camoufox_config?: { os?: string };
|
||||
wayfern_config?: { os?: string };
|
||||
}): boolean {
|
||||
const profileOs =
|
||||
profile.host_os ||
|
||||
profile.camoufox_config?.os ||
|
||||
profile.wayfern_config?.os;
|
||||
const profileOs = profile.host_os || profile.wayfern_config?.os;
|
||||
if (!profileOs) return false;
|
||||
return profileOs !== getCurrentOS();
|
||||
}
|
||||
|
||||
+1
-189
@@ -21,8 +21,7 @@ export interface BrowserProfile {
|
||||
launch_hook?: string;
|
||||
process_id?: number;
|
||||
last_launch?: number;
|
||||
release_type: string; // "stable" or "nightly"
|
||||
camoufox_config?: CamoufoxConfig; // Camoufox configuration
|
||||
release_type: string;
|
||||
wayfern_config?: WayfernConfig; // Wayfern configuration
|
||||
group_id?: string; // Reference to profile group
|
||||
tags?: string[];
|
||||
@@ -200,7 +199,6 @@ export interface DetectedProfile {
|
||||
|
||||
export interface BrowserReleaseTypes {
|
||||
stable?: string;
|
||||
nightly?: string;
|
||||
}
|
||||
|
||||
export interface AppUpdateInfo {
|
||||
@@ -223,192 +221,6 @@ export interface AppUpdateProgress {
|
||||
message: string;
|
||||
}
|
||||
|
||||
export type CamoufoxOS = "windows" | "macos" | "linux";
|
||||
|
||||
export interface CamoufoxConfig {
|
||||
proxy?: string;
|
||||
screen_max_width?: number;
|
||||
screen_max_height?: number;
|
||||
screen_min_width?: number;
|
||||
screen_min_height?: number;
|
||||
geoip?: string | boolean;
|
||||
block_images?: boolean;
|
||||
block_webrtc?: boolean;
|
||||
block_webgl?: boolean;
|
||||
executable_path?: string;
|
||||
fingerprint?: string; // JSON string of the complete fingerprint config
|
||||
randomize_fingerprint_on_launch?: boolean; // Generate new fingerprint on every launch
|
||||
os?: CamoufoxOS; // Operating system for fingerprint generation
|
||||
}
|
||||
|
||||
// Extended interface for the advanced fingerprint configuration
|
||||
export interface CamoufoxFingerprintConfig {
|
||||
// Browser behavior
|
||||
allowAddonNewTab?: boolean;
|
||||
|
||||
// Navigator properties
|
||||
"navigator.userAgent"?: string;
|
||||
"navigator.appVersion"?: string;
|
||||
"navigator.platform"?: string;
|
||||
"navigator.oscpu"?: string;
|
||||
"navigator.appCodeName"?: string;
|
||||
"navigator.appName"?: string;
|
||||
"navigator.product"?: string;
|
||||
"navigator.productSub"?: string;
|
||||
"navigator.buildID"?: string;
|
||||
"navigator.language"?: string;
|
||||
"navigator.languages"?: string[];
|
||||
"navigator.doNotTrack"?: string;
|
||||
"navigator.hardwareConcurrency"?: number;
|
||||
"navigator.maxTouchPoints"?: number;
|
||||
"navigator.cookieEnabled"?: boolean;
|
||||
"navigator.globalPrivacyControl"?: boolean;
|
||||
"navigator.onLine"?: boolean;
|
||||
|
||||
// Screen properties
|
||||
"screen.height"?: number;
|
||||
"screen.width"?: number;
|
||||
"screen.availHeight"?: number;
|
||||
"screen.availWidth"?: number;
|
||||
"screen.availTop"?: number;
|
||||
"screen.availLeft"?: number;
|
||||
"screen.colorDepth"?: number;
|
||||
"screen.pixelDepth"?: number;
|
||||
"screen.pageXOffset"?: number;
|
||||
"screen.pageYOffset"?: number;
|
||||
|
||||
// Window properties
|
||||
"window.outerHeight"?: number;
|
||||
"window.outerWidth"?: number;
|
||||
"window.innerHeight"?: number;
|
||||
"window.innerWidth"?: number;
|
||||
"window.screenX"?: number;
|
||||
"window.screenY"?: number;
|
||||
"window.scrollMinX"?: number;
|
||||
"window.scrollMinY"?: number;
|
||||
"window.scrollMaxX"?: number;
|
||||
"window.scrollMaxY"?: number;
|
||||
"window.devicePixelRatio"?: number;
|
||||
"window.history.length"?: number;
|
||||
|
||||
// Document properties
|
||||
"document.body.clientWidth"?: number;
|
||||
"document.body.clientHeight"?: number;
|
||||
"document.body.clientTop"?: number;
|
||||
"document.body.clientLeft"?: number;
|
||||
|
||||
// Locale and geolocation
|
||||
"locale:language"?: string;
|
||||
"locale:region"?: string;
|
||||
"locale:script"?: string;
|
||||
"locale:all"?: string;
|
||||
"geolocation:latitude"?: number;
|
||||
"geolocation:longitude"?: number;
|
||||
"geolocation:accuracy"?: number;
|
||||
timezone?: string;
|
||||
|
||||
// Headers
|
||||
"headers.Accept-Language"?: string;
|
||||
"headers.User-Agent"?: string;
|
||||
"headers.Accept-Encoding"?: string;
|
||||
|
||||
// WebRTC
|
||||
"webrtc:ipv4"?: string;
|
||||
"webrtc:ipv6"?: string;
|
||||
"webrtc:localipv4"?: string;
|
||||
"webrtc:localipv6"?: string;
|
||||
|
||||
// Battery
|
||||
"battery:charging"?: boolean;
|
||||
"battery:chargingTime"?: number;
|
||||
"battery:dischargingTime"?: number;
|
||||
"battery:level"?: number;
|
||||
|
||||
// Fonts
|
||||
fonts?: string[];
|
||||
"fonts:spacing_seed"?: number;
|
||||
|
||||
// Audio
|
||||
"AudioContext:sampleRate"?: number;
|
||||
"AudioContext:outputLatency"?: number;
|
||||
"AudioContext:maxChannelCount"?: number;
|
||||
|
||||
// Media devices
|
||||
"mediaDevices:micros"?: number;
|
||||
"mediaDevices:webcams"?: number;
|
||||
"mediaDevices:speakers"?: number;
|
||||
"mediaDevices:enabled"?: boolean;
|
||||
|
||||
// WebGL
|
||||
"webGl:renderer"?: string;
|
||||
"webGl:vendor"?: string;
|
||||
"webGl:supportedExtensions"?: string[];
|
||||
"webGl2:supportedExtensions"?: string[];
|
||||
"webGl:contextAttributes"?: {
|
||||
alpha?: boolean;
|
||||
antialias?: boolean;
|
||||
depth?: boolean;
|
||||
failIfMajorPerformanceCaveat?: boolean;
|
||||
powerPreference?: string;
|
||||
premultipliedAlpha?: boolean;
|
||||
preserveDrawingBuffer?: boolean;
|
||||
stencil?: boolean;
|
||||
};
|
||||
"webGl2:contextAttributes"?: {
|
||||
alpha?: boolean;
|
||||
antialias?: boolean;
|
||||
depth?: boolean;
|
||||
failIfMajorPerformanceCaveat?: boolean;
|
||||
powerPreference?: string;
|
||||
premultipliedAlpha?: boolean;
|
||||
preserveDrawingBuffer?: boolean;
|
||||
stencil?: boolean;
|
||||
};
|
||||
"webGl:parameters"?: Record<string, unknown>;
|
||||
"webGl2:parameters"?: Record<string, unknown>;
|
||||
"webGl:shaderPrecisionFormats"?: Record<string, unknown>;
|
||||
"webGl2:shaderPrecisionFormats"?: Record<string, unknown>;
|
||||
|
||||
// Canvas
|
||||
"canvas:aaOffset"?: number;
|
||||
"canvas:aaCapOffset"?: boolean;
|
||||
|
||||
// Voices
|
||||
voices?: {
|
||||
isLocalService?: boolean;
|
||||
isDefault?: boolean;
|
||||
voiceURI?: string;
|
||||
name?: string;
|
||||
lang?: string;
|
||||
}[];
|
||||
"voices:blockIfNotDefined"?: boolean;
|
||||
"voices:fakeCompletion"?: boolean;
|
||||
"voices:fakeCompletion:charsPerSecond"?: number;
|
||||
|
||||
// Other properties
|
||||
humanize?: boolean;
|
||||
"humanize:maxTime"?: number;
|
||||
"humanize:minTime"?: number;
|
||||
showcursor?: boolean;
|
||||
allowMainWorld?: boolean;
|
||||
forceScopeAccess?: boolean;
|
||||
enableRemoteSubframes?: boolean;
|
||||
disableTheming?: boolean;
|
||||
memorysaver?: boolean;
|
||||
addons?: string[];
|
||||
certificatePaths?: string[];
|
||||
certificates?: string[];
|
||||
debug?: boolean;
|
||||
pdfViewerEnabled?: boolean;
|
||||
}
|
||||
|
||||
export interface CamoufoxLaunchResult {
|
||||
id: string;
|
||||
processId?: number;
|
||||
profilePath?: string;
|
||||
url?: string;
|
||||
}
|
||||
|
||||
export type WayfernOS = "windows" | "macos" | "linux" | "android" | "ios";
|
||||
|
||||
export interface WayfernConfig {
|
||||
|
||||
Reference in New Issue
Block a user