@@ -168,9 +167,8 @@ and the server in [`server/`](./server), both readable in a sitting.
## Building from source
```bash
-pnpm install
-pnpm tauri dev # run the app with hot reload
-pnpm tauri build # installers for your OS
+cargo run -p accshift-egui # run the app
+pnpm install && node crates/accshift-egui/bundle/bundle.mjs --build # installers for your OS
```
Setup, coding standards and how to propose a new platform are in the
@@ -181,30 +179,23 @@ Setup, coding standards and how to propose a new platform are in the
Project structure
```text
-src/lib/ # Svelte frontend (GUI)
- app/ # app lifecycle, dialogs, navigation
- features/folders notifications settings
- platforms/ # per-platform UI adapters
- shared/components contextMenu platform ...
- storage/ # client storage layer
-
crates/
accshift-core/ # platform logic, config, storage, OS
src/
platforms/steam riot ... # hand-written platforms
platforms/descriptor/ # JSON-described platforms and their engine
os/windows linux macos # per-OS primitives (sysinfo/open/keyring)
- context.rs # AppContext trait (replaces tauri::AppHandle)
+ context.rs # AppContext trait (the app's folders)
lock.rs # fs4 exclusive lock
runtime.rs # tokio block_on helper
config storage logging themes
accshift-cli/ # CLI binary (list, switch, platforms)
-
-src-tauri/ # Tauri GUI thin wrapper
- src/lib.rs commands.rs app_runtime.rs tauri_context.rs
- src/launcher.rs # Windows exe: starts WebView2, loads the app DLL
-
-vendor/wry/ # wry with an early WebView2 start (Windows)
+ accshift-app/ # UI-free app logic: backend, stores, i18n, updater
+ accshift-theme/ # theme engine: tokens, CSS variables
+ accshift-egui/ # the GUI (accshift-gui), drawn with egui
+ src/screens ui app window # screens, widgets, app state, native window
+ tauri.conf.json bundle/ # installer config, packed by the Tauri bundler
+ parity/ # UI scenes and mock data for regression shots
```
diff --git a/crates/accshift-app/Cargo.toml b/crates/accshift-app/Cargo.toml
new file mode 100644
index 00000000..a6e4026d
--- /dev/null
+++ b/crates/accshift-app/Cargo.toml
@@ -0,0 +1,109 @@
+[package]
+name = "accshift-app"
+description = "UI-free logic of the accshift egui port: the backend trait, its mock and the job runner"
+version.workspace = true
+edition.workspace = true
+publish = false
+
+[dependencies]
+accshift-core = { path = "../accshift-core" }
+serde = { version = "1", features = ["derive"] }
+serde_json = "1"
+# The crate Tauri's path resolver calls (dirs 6 in tauri 2.11), so
+# `EguiAppContext` lands on the very same folders as the Tauri app. dirs 7
+# only moves Windows' `preference_dir`, unused here.
+dirs = "7"
+# The shared HTTP client the Tauri app keeps in its state. Same spec as the
+# root workspace so features unify with accshift-core's.
+reqwest = { version = "0.13", default-features = false, features = [
+ "rustls-no-provider",
+ "json",
+ "blocking",
+] }
+# `descriptor_select_file`.
+rfd = "0.17"
+# The async half of the Steam, CS2 bridge and Roblox commands (Tauri runs them
+# on its tokio runtime). Same minor as the root workspace.
+tokio = { version = "1.53", features = ["rt-multi-thread"] }
+# `legacy_web_storage`: the WebKit origin folder name (SHA-256). Same major
+# as accshift-core, so nothing new is built.
+sha2 = "0.11"
+# `time`: the local time zone with its DST rules, as WebView2 formats dates.
+# Default features: `tz-system` reads the Windows zone id and maps it to
+# IANA, `tzdb-bundle-platform` embeds the tzdb on Windows (no network, no
+# installed database) and reads /usr/share/zoneinfo elsewhere. Same version
+# as the root workspace lock.
+jiff = "0.2.35"
+# `lifecycle::updater`: the port of tauri-plugin-updater 2.11, on the crates
+# the plugin builds with: minisign-verify for the `.sig`, semver for
+# the version compare, base64 for the key and signature strings, time for the
+# RFC 3339 `pub_date`, url and percent-encoding for the endpoint templating,
+# infer and tempfile for the downloaded installer.
+minisign-verify = "0.3"
+semver = "1"
+base64 = "0.23"
+time = { version = "0.3", features = ["parsing", "formatting"] }
+url = { version = "2", features = ["serde"] }
+percent-encoding = "2"
+infer = "0.22"
+tempfile = "3"
+# `lifecycle::deep_link`: `dunce::simplified` of the canonical exe path, as
+# tauri-utils resolves it before the plugin writes `"" "%1"`.
+dunce = "1"
+
+[target.'cfg(windows)'.dependencies]
+# `get_desktop_wallpaper`: the Progman capture of
+# src-tauri/src/commands/backdrop.rs, on windows-sys rather than the windows
+# crate (accshift-core already builds windows-sys 0.61).
+windows-sys = { version = "0.61", features = [
+ "Win32_Foundation",
+ "Win32_Graphics_Gdi",
+ "Win32_Security",
+ "Win32_Storage_Xps",
+ "Win32_System_DataExchange",
+ "Win32_System_LibraryLoader",
+ "Win32_System_Threading",
+ "Win32_UI_Shell",
+ "Win32_UI_WindowsAndMessaging",
+] }
+image = { version = "0.25", default-features = false, features = ["jpeg"] }
+# `lifecycle::deep_link`: the HKCU scheme registration, on the crate
+# tauri-plugin-deep-link 2.4 writes it with.
+windows-registry = "0.100"
+# `legacy_web_storage`: reads the WebView2 localStorage LevelDB of v0.x
+# installs. Pure Rust, Snappy blocks and the `.log` replay included. No `fs`
+# feature: the files are copied into its in-memory env, never opened on disk.
+rusty-leveldb = { version = "4", default-features = false }
+
+[target.'cfg(not(windows))'.dependencies]
+# `legacy_web_storage`: the WebKit localStorage sqlite of WebKitGTK and
+# WKWebView. Same spec as the root workspace.
+rusqlite = { version = "0.40", features = ["bundled"] }
+# `lifecycle::updater`: the `.tar.gz` bundles of AppImage and macOS.
+flate2 = "1"
+tar = "0.4"
+
+[target.'cfg(target_os = "linux")'.dependencies]
+# `lifecycle::single_instance`: the D-Bus name tauri-plugin-single-instance
+# 2.4 owns on Linux. Major 5, the one accesskit_unix (egui) and
+# secret-service (keyring) link: zbus 6 drops the blocking API and would be a
+# second D-Bus stack in the binary.
+zbus = "5.9"
+# `lifecycle::deep_link`: the `.desktop` handler file the plugin merges.
+rust-ini = "0.21"
+
+[target.'cfg(target_os = "macos")'.dependencies]
+# `lifecycle::updater`: the admin prompt of the macOS install fallback.
+osakit = { version = "0.3", features = ["full"] }
+# `lifecycle::process`: the `CFBundleExecutable` a relaunch starts, as
+# Tauri's `restart_macos_app` reads it.
+plist = "1"
+
+[dev-dependencies]
+# Signs the updater fixtures with a key generated in the test, as the
+# `tauri signer` command does (tauri-cli signs with this crate).
+minisign = "0.10"
+# The WebKit fixtures are built and read on every OS, Windows included
+# (tests/legacy_web_storage.rs compiles src/legacy_web_storage/webkit_sqlite.rs
+# by path), without growing the Windows app.
+rusqlite = { version = "0.40", features = ["bundled"] }
diff --git a/crates/accshift-app/i18n/en.json b/crates/accshift-app/i18n/en.json
new file mode 100644
index 00000000..74ef5398
--- /dev/null
+++ b/crates/accshift-app/i18n/en.json
@@ -0,0 +1,753 @@
+{
+ "app.loadingSettings": "Loading settings...",
+ "app.loading": "Loading...",
+ "app.searchPlaceholder": "Search account...",
+ "app.noAccountsFound": "No {platform} accounts found",
+ "app.noAccountsHint": "Make sure {platform} is installed and you have logged in at least once.",
+ "app.switchingAccount": "Switching account...",
+ "app.platformRestarting": "{platform} is restarting",
+ "app.comingSoon": "{platform} - Coming soon",
+ "app.platformUnsupportedOs": "{platform} is not available on this OS yet",
+ "app.noCompatiblePlatforms": "No compatible platform is available on this OS",
+ "app.noCompatiblePlatformsHint": "Check back on Windows support updates or switch to a supported machine.",
+ "update.ctaAvailable": "Update available",
+ "update.ctaInstalling": "Installing...",
+ "update.restartToApplyVersion": "Restart to apply update {version}",
+ "update.restartToApply": "Restart to apply update",
+ "update.readyToastVersion": "Update {version} ready",
+ "update.readyToast": "Update ready",
+ "update.restartFailed": "Could not restart to apply update",
+ "pin.lockedTitle": "App Locked",
+ "pin.lockedPrompt": "Enter PIN to unlock",
+ "pin.placeholder": "4-digit PIN",
+ "pin.unlock": "Unlock",
+ "pin.invalid": "Invalid PIN",
+ "pin.tooManyAttempts": "Too many attempts. Try again in {seconds} s.",
+ "common.ok": "OK",
+ "common.cancel": "Cancel",
+ "common.confirm": "Confirm",
+ "common.close": "Close",
+ "common.back": "Back",
+ "common.active": "Active",
+ "common.choose": "Choose...",
+ "common.none": "None",
+ "common.custom": "Custom",
+ "common.configured": "Configured",
+ "common.missing": "Missing",
+ "common.enabled": "Enabled",
+ "common.disabled": "Disabled",
+ "common.on": "On",
+ "common.off": "Off",
+ "common.add": "Add",
+ "common.visible": "Visible",
+ "common.hidden": "Hidden",
+ "common.inline": "Inline",
+ "common.tooltip": "Tooltip",
+ "titlebar.refresh": "Refresh",
+ "titlebar.addAccount": "Add account",
+ "titlebar.settings": "Settings",
+ "titlebar.personas": "Personas",
+ "titlebar.minimize": "Minimize",
+ "titlebar.maximize": "Maximize",
+ "titlebar.restore": "Restore",
+ "titlebar.close": "Close",
+ "view.grid": "Grid view",
+ "view.list": "List view",
+ "settings.title": "Settings",
+ "settings.general": "General",
+ "settings.appearance": "Appearance",
+ "settings.language": "Language",
+ "settings.theme": "Theme",
+ "settings.uiZoom": "UI zoom",
+ "settings.backgroundOpacity": "Background opacity",
+ "settings.animations": "Animations",
+ "settings.animationsSystem": "Follow system",
+ "settings.animationsOn": "Always on",
+ "settings.animationsOff": "Off",
+ "settings.performance": "Performance",
+ "settings.suspendGraphicsWhenMinimized": "Suspend graphics when minimized",
+ "settings.minimizeOnAccountSwitch": "Minimize on account switch",
+ "settings.system": "System",
+ "settings.startWithSystem": "Launch at startup",
+ "settings.startWithSystemHint": "Start Accshift with Windows, minimized to the notification area.",
+ "settings.closeToTray": "Close to the notification area",
+ "settings.closeToTrayHint": "The close button hides Accshift in the notification area instead of quitting.",
+ "settings.autostartFailed": "Could not change the launch-at-startup setting.",
+ "tray.open": "Open Accshift",
+ "tray.quit": "Quit",
+ "settings.platforms": "Platforms",
+ "settings.platformSearchPlaceholder": "Search platforms...",
+ "settings.platformSearchNoResults": "No platform matches your search.",
+ "settings.accountDisplay": "Account display",
+ "settings.startupAndExtras": "Startup",
+ "settings.defaultOnStartup": "Default platform on startup",
+ "settings.platformDisabledSuffix": "(disabled)",
+ "settings.platformUnsupportedOs": "Unsupported OS",
+ "settings.platformNotImplemented": "Planned",
+ "settings.platformUserProvided": "Added from your descriptors folder",
+ "settings.customPlatforms": "Custom platforms",
+ "settings.customPlatformsHint": "Descriptor files in this folder are read when the app starts.",
+ "settings.customPlatformsNone": "No descriptor loaded from this folder.",
+ "settings.customPlatformsProblems": "Files that did not load",
+ "descriptor.addFromFile": "Add from a file",
+ "descriptor.reload": "Reload",
+ "descriptor.openFolder": "Open folder",
+ "descriptor.remove": "Remove",
+ "descriptor.removeConfirmTitle": "Remove {platform}?",
+ "descriptor.removeConfirmMessage": "Its descriptor file leaves your folder. Accounts already captured stay on disk.",
+ "descriptor.previewTitle": "Add a platform",
+ "descriptor.previewOs": "Described for {list}",
+ "descriptor.previewRoots": "Folders it may touch",
+ "descriptor.previewSteps": "What a switch would do",
+ "descriptor.previewWarnings": "Warnings",
+ "descriptor.previewNoPlan": "No dry run could be built: {problem}",
+ "descriptor.previewReplaces": "This replaces the descriptor already in your folder.",
+ "descriptor.previewNothingWritten": "Nothing is written until you add it.",
+ "descriptor.replace": "Replace",
+ "descriptor.installed": "{platform} added",
+ "descriptor.removed": "{platform} removed",
+ "descriptor.actionRead": "read",
+ "descriptor.actionCapture": "capture",
+ "descriptor.actionRestore": "restore",
+ "descriptor.actionDelete": "delete",
+ "descriptor.actionClose": "close",
+ "descriptor.actionLaunch": "launch",
+ "settings.dataRefresh": "Data Refresh",
+ "settings.avatarRefresh": "Avatar refresh",
+ "settings.banCheckDelay": "Ban check delay",
+ "settings.refreshNow": "Refresh now",
+ "settings.zeroEachLaunch": "0 = each launch",
+ "settings.privacy": "Privacy",
+ "settings.inactivityTimeout": "Inactivity timeout",
+ "settings.zeroDisabled": "0 = disabled",
+ "settings.streamerMode": "Streamer mode",
+ "settings.streamerModeHint": "Blur account details automatically when streaming software is running.",
+ "settings.personasHint": "Show the personas identity switcher",
+ "settings.replayOnboarding": "Replay onboarding",
+ "settings.replayOnboardingHint": "Show the welcome tour and the usage-statistics choice again.",
+ "streamer.title": "Streamer mode",
+ "streamer.disable": "Disable",
+ "streamer.disablePermanently": "Disable permanently",
+ "personas.title": "Personas",
+ "personas.create": "New persona",
+ "personas.activate": "Switch to this persona",
+ "personas.edit": "Edit",
+ "personas.delete": "Delete",
+ "personas.finish": "Done",
+ "personas.switching": "Switching...",
+ "personas.switched": "Switched to {name}",
+ "personas.switchPartial": "{name}: failed on {failed}",
+ "personas.switchFailed": "Could not switch to {name}",
+ "personas.namePlaceholder": "Persona name",
+ "personas.choosePlatforms": "Pick an account for each platform to include",
+ "personas.chooseAccount": "Pick the {platform} account",
+ "personas.removeFromPersona": "Remove from this persona",
+ "personas.customImage": "Choose an image...",
+ "personas.removeImage": "Remove image",
+ "personas.imageError": "Couldn't load that image.",
+ "personas.loadingAccounts": "Loading accounts...",
+ "personas.noAccountsOnPlatform": "No accounts on this platform yet",
+ "personas.emptyHint": "One click switches every included platform to its account.",
+ "settings.security": "Security",
+ "settings.pinLockOnAfk": "PIN lock on AFK",
+ "settings.pinCode": "PIN code",
+ "settings.pinPlaceholder": "4 digits",
+ "settings.pinCurrentCode": "Current PIN",
+ "settings.pinCurrentHint": "Enter the current PIN to change or turn off the lock.",
+ "settings.telemetry": "Usage statistics (anonymous)",
+ "settings.telemetryModeA": "Anonymous basic stats",
+ "settings.telemetryModeAHint": "Counts launches and which features get used. A random local ID prevents duplicate installation counts; no personal data is sent.",
+ "settings.telemetryModeB": "Enhanced stats with local UUID (opt-in)",
+ "settings.telemetryModeBHint": "Adds a random UUID stored only on this machine. Lets us measure retention and which features matter. Still no personal data sent.",
+ "settings.telemetryExport": "Export my data",
+ "settings.telemetryExported": "Data exported to clipboard",
+ "settings.telemetryExportFailed": "Export failed",
+ "settings.telemetryEnableFailed": "Could not enable enhanced stats",
+ "settings.telemetryDisableFailed": "Could not disable enhanced stats",
+ "settings.telemetryDeletePending": "Enhanced stats are off; server deletion will need another attempt",
+ "settings.telemetryDeletePendingHint": "Server deletion is pending. The old local ID is kept only so you can retry deletion or export the associated data.",
+ "settings.telemetryRetryDelete": "Retry data deletion",
+ "settings.telemetryDeleteCompleted": "Server data deleted",
+ "settings.telemetryDeleteRetryFailed": "Server deletion is still pending",
+ "settings.telemetryLearnMore": "What data is sent?",
+ "onboarding.welcome.title": "Welcome to Accshift",
+ "onboarding.welcome.version": "v{version}",
+ "onboarding.welcome.compatibleWith": "Your operating system is compatible with:",
+ "onboarding.welcome.detectedPlatforms": "We found these platforms on your machine:",
+ "onboarding.welcome.next": "Show me around",
+ "onboarding.welcome.skip": "Skip",
+ "onboarding.features.hint": "This part of the app isn't visible right now.",
+ "onboarding.features.addAccount.label": "Add an account",
+ "onboarding.features.addAccount.body": "The + button at the top right adds an account to the current platform. Log in once, Accshift keeps it.",
+ "onboarding.features.switch.label": "Switch account",
+ "onboarding.features.switch.body": "Click a card and you're on that account. That's the whole app, honestly.",
+ "onboarding.features.contextMenu.label": "Right-click for actions",
+ "onboarding.features.contextMenu.body": "Right-click a card to rename it, change its color, move it to a folder or delete it.",
+ "onboarding.features.platformSwitch.label": "Switch platform",
+ "onboarding.features.platformSwitch.body": "Same deal for Riot, Battle.net, Epic and the rest. The tabs up top switch platforms.",
+ "onboarding.features.next": "Next",
+ "onboarding.features.back": "Back",
+ "onboarding.features.step": "Step {step}",
+ "onboarding.features.mockRename": "Rename",
+ "onboarding.features.mockSetColor": "Set color",
+ "onboarding.features.mockMoveToFolder": "Move to folder",
+ "onboarding.features.mockDelete": "Delete",
+ "onboarding.features.mockAccount": "Account {number}",
+ "onboarding.telemetry.title": "SELL YOUR SOUL TO ACCSHIFT!",
+ "onboarding.telemetry.intro": "Accshift counts a few anonymous usage stats so I know what to fix first. Nothing personal leaves your machine, the app works the same either way, and you can change your mind anytime in Settings.",
+ "onboarding.telemetry.question": "Deal?",
+ "onboarding.telemetry.gifAlt": "Trade offer meme",
+ "onboarding.telemetry.basic": "NO! Enough is enough",
+ "onboarding.telemetry.basicDefault": "(default)",
+ "onboarding.telemetry.basicHint": "Anonymous counters and nothing else: no profile, no identifier that follows you around.",
+ "onboarding.telemetry.deal": "DEAL",
+ "onboarding.telemetry.dealHint": "Adds a separate UUID for enhanced stats, stored only on your machine. Still no idea who you are, but you help a lot. Thank you!",
+ "onboarding.telemetry.optOutNote": "Whatever you pick, you can change it later in Settings -> Privacy. :c",
+ "onboarding.telemetry.refuse": "No thanks, turn it all off",
+ "onboarding.telemetry.refuseHint": "Nothing is measured and nothing is sent, not even the anonymous counters.",
+ "onboarding.telemetry.back": "Back",
+ "onboarding.persistFailed": "Could not save that choice. Try again.",
+ "onboarding.persistLater": "Ask me next launch",
+ "settings.steam": "Steam",
+ "settings.riot": "Riot",
+ "settings.battleNet": "Battle.net",
+ "settings.ubisoft": "Ubisoft Connect",
+ "settings.runSteamAsAdmin": "Run Steam as admin",
+ "settings.showUsernames": "Show usernames",
+ "settings.showSteamLastLogin": "Show Steam last login",
+ "settings.showRiotLastLogin": "Show Riot last login",
+ "settings.showBattleNetLastLogin": "Show Battle.net last login",
+ "settings.showUbisoftLastLogin": "Show Ubisoft last login",
+ "settings.showNotesUnderCards": "Show notes under cards",
+ "settings.expandedFolders": "Expand all folders",
+ "list.rootSection": "Root",
+ "settings.steamLaunch": "Switch",
+ "settings.steamInstallation": "Installation",
+ "settings.steamApiAndData": "API & data",
+ "settings.launchOptions": "Launch options",
+ "settings.shutdownMode": "Shutdown mode",
+ "settings.shutdownModeGraceful": "Graceful",
+ "settings.shutdownModeForce": "Force kill",
+ "settings.autoDetected": "Auto-detected",
+ "settings.steamFolder": "Steam folder",
+ "settings.steamFolderRegistry": "Registry",
+ "settings.riotClientPath": "Riot client executable",
+ "settings.battleNetPath": "Battle.net executable",
+ "settings.ubisoftPath": "Ubisoft Connect folder",
+ "settings.steamWebApiKey": "Steam Web API key",
+ "settings.getKey": "Get key",
+ "settings.pasteApiKey": "Paste your Steam Web API key",
+ "settings.saved": "Settings saved",
+ "settings.openApiKeyFailed": "Could not open Steam API key page",
+ "settings.integrations": "Integrations",
+ "settings.deepLinks": "Allow accshift:// links",
+ "settings.deepLinksHint": "Let other apps switch accounts for you: bookmarks, Stream Deck, scripts.",
+ "settings.cliEnabled": "Allow the accshift CLI",
+ "settings.cliEnabledHint": "Let the command line tool list and switch accounts. When off, every accshift command refuses to run, diag included; the app itself is unaffected.",
+ "settings.help": "Open the accshift wiki",
+ "settings.helpShort": "Help",
+ "settings.openHelpFailed": "Could not open the wiki",
+ "settings.logs": "Logs",
+ "settings.openLogs": "Open the logs folder",
+ "settings.openLogsFailed": "Could not open the logs folder",
+ "context.loading": "Loading...",
+ "context.noGamesFound": "No games found",
+ "context.field.cut": "Cut",
+ "context.field.copy": "Copy",
+ "context.field.paste": "Paste",
+ "context.field.selectAll": "Select all",
+ "context.menu.newFolder": "New folder",
+ "context.menu.refresh": "Refresh",
+ "context.menu.rename": "Rename",
+ "context.menu.copy": "Copy...",
+ "context.menu.deleteFolder": "Delete folder",
+ "context.menu.folderColor": "Folder color",
+ "context.menu.moveToFolder": "Move to folder",
+ "context.menu.moveToRoot": "No folder",
+ "context.menu.editCardAndColor": "Edit card and color",
+ "context.menu.cardColor": "Card color",
+ "context.menu.addNote": "Add note",
+ "context.menu.editNote": "Edit note",
+ "platform.rename": "Rename",
+ "platform.renameTitle": "Rename account",
+ "platform.renamePlaceholder": "Account name",
+ "platform.newAccountPending": "Waiting...",
+ "platform.setupBusy": "Another accshift operation is running. Waiting for it to finish.",
+ "platform.renameNewAccount": "Name this account",
+ "platform.copyLabelAccountId": "Account ID",
+ "platform.forget": "Forget",
+ "platform.forgetConfirmTitle": "Forget \"{display}\"?",
+ "platform.forgetConfirmMessage": "This will remove this account and its saved session from Accshift.",
+ "platform.forgotAccount": "Forgot {display}",
+ "dialog.newFolderTitle": "New folder",
+ "dialog.renameFolderTitle": "Rename folder",
+ "dialog.folderNamePlaceholder": "Folder name",
+ "dialog.cardNoteTitle": "Card note",
+ "dialog.cardNotePlaceholder": "Write a short note",
+ "card.noteAttached": "Note attached",
+ "card.clickAgainToSwitch": "Click again to switch",
+ "card.extensionWarnings": "Warnings",
+ "card.extensionNote": "Note",
+ "card.cs2Section": "CS2",
+ "card.cs2Level": "Level {level}",
+ "card.cs2CaseEarned": "Weekly case earned",
+ "card.cs2CaseNotEarned": "Weekly case pending",
+ "list.selectAccountPreview": "Select an account to preview",
+ "preview.noteLabel": "Note",
+ "preview.currentlyActive": "Currently active",
+ "preview.switchAgain": "Switch Again",
+ "preview.switchAccount": "Switch Account",
+ "ban.community": "Community ban",
+ "ban.vac.single": "{count} VAC ban",
+ "ban.vac.multiple": "{count} VAC bans",
+ "ban.game.single": "{count} game ban",
+ "ban.game.multiple": "{count} game bans",
+ "time.unknown": "unknown",
+ "time.justNow": "just now",
+ "time.minuteAgo": "{count} minute ago",
+ "time.minutesAgo": "{count} minutes ago",
+ "time.hourAgo": "{count} hour ago",
+ "time.hoursAgo": "{count} hours ago",
+ "time.dayAgo": "{count} day ago",
+ "time.daysAgo": "{count} days ago",
+ "time.neverConnected": "never connected",
+ "time.compactWrapper": "({value})",
+ "toast.copied": "{label} copied",
+ "toast.legacyConfigMigrated": "Settings migrated to new format",
+ "toast.legacyConfigMigrationFailed": "Failed to migrate old settings, check logs",
+ "toast.failedLoadSettingsPanel": "Failed to load settings panel",
+ "toast.banChecking": "Checking bans...",
+ "toast.banCheckSummary.single": "Ban check: {count} account with bans",
+ "toast.banCheckSummary.multiple": "Ban check: {count} accounts with bans",
+ "toast.banCheckFailed": "Ban check failed: {error}",
+ "toast.avatarRefreshComplete": "Avatar refresh finished for {count} accounts",
+ "toast.banRefreshComplete": "Ban refresh finished for {count} accounts",
+ "toast.banRefreshNoApiKey": "Ban refresh skipped: add a Steam Web API key in settings",
+ "toast.refreshPartial": "Refresh finished for {ok} of {count} accounts",
+ "toast.noSteamAccountsFound": "No Steam accounts found. Sign in to Steam at least once, then refresh.",
+ "toast.accountsRefreshed.single": "{count} account refreshed",
+ "toast.accountsRefreshed.multiple": "{count} accounts refreshed",
+ "toast.steamFolderNotFound": "Steam folder was not found. Set it manually in Settings > Steam folder.",
+ "toast.steamElevated": "Steam is running as admin. Enable 'Run Steam as admin' in Settings > Steam.",
+ "toast.noRiotProfilesFound": "No Riot profiles yet. Click + to add one.",
+ "toast.noBattleNetAccountsFound": "No Battle.net accounts found. Sign in to Battle.net at least once, then refresh.",
+ "toast.noUbisoftAccountsFound": "No Ubisoft accounts found. Sign in to Ubisoft Connect at least once, then refresh.",
+ "toast.deepLinkInvalid": "Unrecognized accshift:// link",
+ "toast.deepLinkDisabled": "accshift:// links are disabled in Settings",
+ "toast.deepLinkUnknownPlatform": "Unknown platform in link: {platform}",
+ "toast.deepLinkPlatformDisabled": "{platform} is disabled in Settings",
+ "toast.deepLinkAccountNotFound": "No {platform} account matching \"{account}\"",
+ "toast.deepLinkSwitched": "Switched to {account}",
+ "dialog.deepLinkSwitchTitle": "Switch account?",
+ "dialog.deepLinkSwitchMessage": "An accshift:// link is asking to switch your {platform} account to \"{account}\". Continue?",
+ "dialog.deepLinkSwitchConfirm": "Switch",
+ "steam.launchOnline": "Switch online",
+ "steam.launchInvisible": "Switch invisible",
+ "steam.switchAndRunGame": "Switch + run {game}",
+ "steam.switchAndRunPick": "Switch + run a game…",
+ "steam.runGame": "Run {game}",
+ "steam.runPick": "Run a game…",
+ "steam.switchAndRunNoGames": "No games found",
+ "steam.clearDefaultGame": "Clear default game",
+ "steam.copySteamId64": "Copy SteamID64",
+ "steam.copyFriendCode": "Copy Friend Code",
+ "steam.copyProfileUrl": "Copy profile URL",
+ "steam.copyLabelUsername": "Username",
+ "steam.copyLabelSteamId64": "SteamID64",
+ "steam.copyLabelFriendCode": "Friend Code",
+ "steam.copyLabelProfileUrl": "Profile URL",
+ "steam.openUserdataFolder": "Open userdata folder",
+ "steam.clearIntegratedBrowserCache": "Reset browser session",
+ "steam.clearIntegratedBrowserCacheConfirmTitle": "Reset Steam browser session?",
+ "steam.clearIntegratedBrowserCacheConfirmMessage": "This closes Steam and clears the integrated browser cache used by Store and Community.",
+ "steam.clearedIntegratedBrowserCache": "Steam browser session reset",
+ "steam.copySettingsFrom": "Copy settings from",
+ "steam.copiedSettingsToCurrent": "Copied {game} settings to current account",
+ "steam.forget": "Forget",
+ "steam.forgetConfirmTitle": "Forget \"{display}\"?",
+ "steam.forgetConfirmMessage": "This will remove this account from your Steam account list on this PC.",
+ "steam.forgotAccount": "Forgot {username}",
+ "steam.setupPendingLabel": "Steam Account",
+ "steam.setupWaitingForClient": "Waiting for Steam...",
+ "steam.setupWaitingForLogin": "Sign in to the Steam account you want to add.",
+ "steam.setupDetected": "Detected account",
+ "steam.setupConnected": "Connected",
+ "steam.setupReady": "Steam account added",
+ "steam.setupReadyWithProfile": "Added {profile}",
+ "steam.setupFailed": "Steam setup failed",
+ "steam.setupFailedMessage": "Accshift could not finish adding this Steam account.",
+ "riot.captureSession": "Capture current session",
+ "riot.recaptureSession": "Re-capture session",
+ "riot.capturedSession": "Captured session for {profile}",
+ "riot.setupPendingLabel": "Riot Account",
+ "riot.setupWaitingForClient": "Waiting for Riot Client...",
+ "riot.setupWaitingForLogin": "Sign in to the Riot account you want to add.",
+ "riot.setupCapturing": "Saving Riot session...",
+ "riot.setupReady": "Riot account added",
+ "riot.setupReadyWithProfile": "Added {profile}",
+ "riot.setupFailed": "Riot setup failed",
+ "riot.setupFailedMessage": "Accshift could not finish adding this Riot account.",
+ "riot.setupStaySignedIn": "Keep 'Stay signed in' enabled.",
+ "riot.setupDetected": "Detected account",
+ "riot.setupConnected": "Connected",
+ "riot.forget": "Forget account",
+ "riot.forgetConfirmTitle": "Forget \"{display}\"?",
+ "riot.forgetConfirmMessage": "This removes the local Riot profile and its saved session from Accshift.",
+ "riot.forgotProfile": "Forgot {profile}",
+ "battlenet.copyUsername": "Copy username",
+ "battlenet.copyLabelUsername": "Username",
+ "battlenet.copyEmail": "Copy email",
+ "battlenet.copyLabelEmail": "Email",
+ "battlenet.forget": "Forget",
+ "battlenet.forgetConfirmTitle": "Forget \"{display}\"?",
+ "battlenet.forgetConfirmMessage": "This will remove this account from the Battle.net account list on this PC.",
+ "battlenet.forgotAccount": "Forgot {email}",
+ "battlenet.setupPendingLabel": "Battle.net Account",
+ "battlenet.setupWaitingForClient": "Waiting for Battle.net...",
+ "battlenet.setupWaitingForLogin": "Sign in to the Battle.net account you want to add.",
+ "battlenet.setupKeepMeLoggedIn": "Keep 'Keep me logged in' enabled when possible.",
+ "battlenet.setupDetected": "Detected account",
+ "battlenet.setupConnected": "Connected",
+ "battlenet.setupReady": "Battle.net account added",
+ "battlenet.setupReadyWithProfile": "Added {profile}",
+ "battlenet.setupFailed": "Battle.net setup failed",
+ "battlenet.setupFailedMessage": "Accshift could not finish adding this Battle.net account.",
+ "ubisoft.copyLabelUuid": "UUID",
+ "ubisoft.forget": "Forget",
+ "ubisoft.forgetConfirmTitle": "Forget \"{display}\"?",
+ "ubisoft.forgetConfirmMessage": "This will remove this account and its saved session from Accshift.",
+ "ubisoft.forgotAccount": "Forgot {display}",
+ "ubisoft.setupPendingLabel": "Ubisoft Account",
+ "ubisoft.setupWaitingForClient": "Waiting for Ubisoft Connect...",
+ "ubisoft.setupWaitingForLogin": "Sign in to the Ubisoft account you want to add.",
+ "ubisoft.setupKeepMeLoggedIn": "Keep 'Remember me' enabled.",
+ "ubisoft.setupDetected": "Detected account",
+ "ubisoft.setupConnected": "Connected",
+ "ubisoft.setupReady": "Ubisoft account added",
+ "ubisoft.setupReadyWithProfile": "Added {profile}",
+ "ubisoft.setupFailed": "Ubisoft setup failed",
+ "ubisoft.setupFailedMessage": "Accshift could not finish adding this Ubisoft account.",
+ "settings.roblox": "Roblox",
+ "toast.noRobloxAccountsFound": "No Roblox accounts found. Add an account using Quick Login or paste a cookie.",
+ "roblox.noAccountsHint": "Press + to add a Roblox account via Quick Login.",
+ "roblox.sessionExpired": "Session expired",
+ "roblox.sessionExpiredTooltip": "This account is logged out. Re-add it before switching.",
+ "roblox.sessionExpiredSwitchError": "Session expired. Re-add this account to switch. Notes and settings are kept.",
+ "roblox.cookiePasteTitle": "Add account by cookie",
+ "roblox.cookiePasteHint": "Paste a .ROBLOSECURITY cookie from your browser to add an account directly.",
+ "settings.showRobloxLastLogin": "Show last login",
+ "settings.robloxHealthCheck": "Session check",
+ "settings.robloxHealthCheckHint": "Flags accounts whose Roblox session expired; one network request per launch.",
+ "roblox.copyLabelUsername": "Username",
+ "roblox.copyLabelUserId": "User ID",
+ "roblox.forget": "Forget",
+ "roblox.forgetConfirmTitle": "Forget \"{display}\"?",
+ "roblox.forgetConfirmMessage": "This will remove this account and its stored cookie from this PC.",
+ "roblox.forgotAccount": "Forgot {display}",
+ "roblox.setupPendingLabel": "Roblox Account",
+ "roblox.setupWaitingForClient": "Connecting to Roblox...",
+ "roblox.setupWaitingForLogin": "Open the Roblox app on another device and enter the code below.",
+ "roblox.setupQuickLoginCode": "Quick Login code",
+ "roblox.setupQuickLoginHint": "roblox.com/quick-login",
+ "roblox.copyCode": "Copy code",
+ "roblox.setupDetected": "Detected account",
+ "roblox.setupConnected": "Connected",
+ "roblox.setupReady": "Roblox account added",
+ "roblox.setupReadyWithProfile": "Added {profile}",
+ "roblox.setupFailed": "Roblox setup failed",
+ "roblox.setupFailedMessage": "Accshift could not finish adding this Roblox account.",
+ "settings.epic": "Epic Games",
+ "settings.epicPath": "Epic Games Launcher executable",
+ "settings.showEpicLastLogin": "Show last login",
+ "toast.noEpicAccountsFound": "No Epic Games accounts found. Sign in to Epic Games Launcher at least once, then refresh.",
+ "epic.noAccountsHint": "Press + to add an Epic Games account.",
+ "epic.copyLabelAccountId": "Account ID",
+ "epic.forget": "Forget",
+ "epic.forgetConfirmTitle": "Forget \"{display}\"?",
+ "epic.forgetConfirmMessage": "This will remove this account and its saved session from Accshift.",
+ "epic.forgotAccount": "Forgot {display}",
+ "epic.setupPendingLabel": "Epic Games Account",
+ "epic.setupWaitingForClient": "Waiting for Epic Games Launcher...",
+ "epic.setupWaitingForLogin": "Sign in to the Epic Games account you want to add.",
+ "epic.setupKeepMeLoggedIn": "Keep 'Remember me' enabled.",
+ "epic.setupDetected": "Detected account",
+ "epic.setupConnected": "Connected",
+ "epic.setupReady": "Epic Games account added",
+ "epic.setupReadyWithProfile": "Added {profile}",
+ "epic.setupFailed": "Epic Games setup failed",
+ "epic.setupFailedMessage": "Accshift could not finish adding this Epic Games account.",
+ "settings.gog": "GOG Galaxy",
+ "settings.gogPath": "GOG Galaxy executable",
+ "settings.showGogLastLogin": "Show last login",
+ "toast.noGogAccountsFound": "No GOG Galaxy accounts found. Sign in to GOG Galaxy at least once, then refresh.",
+ "gog.noAccountsHint": "Press + to add a GOG Galaxy account.",
+ "gog.copyLabelAccountId": "Account ID",
+ "gog.forget": "Forget",
+ "gog.forgetConfirmTitle": "Forget \"{display}\"?",
+ "gog.forgetConfirmMessage": "This will remove this account and its saved session from Accshift.",
+ "gog.forgotAccount": "Forgot {display}",
+ "gog.setupPendingLabel": "GOG Galaxy Account",
+ "gog.setupWaitingForClient": "Waiting for GOG Galaxy...",
+ "gog.setupWaitingForLogin": "Sign in to the GOG Galaxy account you want to add.",
+ "gog.setupKeepMeLoggedIn": "Keep 'Stay signed in' enabled.",
+ "gog.setupDetected": "Detected account",
+ "gog.setupConnected": "Connected",
+ "gog.setupReady": "GOG Galaxy account added",
+ "gog.setupReadyWithProfile": "Added {profile}",
+ "gog.setupFailed": "GOG Galaxy setup failed",
+ "gog.setupFailedMessage": "Accshift could not finish adding this GOG Galaxy account.",
+ "settings.jagex": "Jagex Launcher",
+ "settings.jagexPath": "Jagex Launcher executable",
+ "settings.showJagexLastLogin": "Show last login",
+ "toast.noJagexAccountsFound": "No Jagex accounts saved yet. Press + to add one through the Jagex Launcher.",
+ "jagex.noAccountsHint": "Press + to add a Jagex account.",
+ "jagex.copyLabelAccountId": "Account ID",
+ "jagex.forget": "Forget",
+ "jagex.forgetConfirmTitle": "Forget \"{display}\"?",
+ "jagex.forgetConfirmMessage": "This will remove this account and its saved session from Accshift.",
+ "jagex.forgotAccount": "Forgot {display}",
+ "jagex.setupPendingLabel": "Jagex Account",
+ "jagex.setupWaitingForClient": "Waiting for the Jagex Launcher...",
+ "jagex.setupWaitingForLogin": "Sign in to the Jagex account you want to add.",
+ "jagex.setupKeepMeLoggedIn": "Keep 'Remember me' enabled.",
+ "jagex.setupDetected": "Detected account",
+ "jagex.setupConnected": "Connected",
+ "jagex.setupReady": "Jagex account added",
+ "jagex.setupReadyWithProfile": "Added {profile}",
+ "jagex.setupFailed": "Jagex setup failed",
+ "jagex.setupFailedMessage": "Accshift could not finish adding this Jagex account.",
+ "settings.discord": "Discord",
+ "settings.discordPath": "Discord executable",
+ "settings.showDiscordLastLogin": "Show last login",
+ "toast.noDiscordAccountsFound": "No Discord accounts found. Add a Discord account, then refresh.",
+ "discord.noAccountsHint": "Press + to add a Discord account.",
+ "discord.copyLabelAccountId": "Account ID",
+ "discord.forget": "Forget",
+ "discord.forgetConfirmTitle": "Forget \"{display}\"?",
+ "discord.forgetConfirmMessage": "This will remove this account and its saved session from Accshift.",
+ "discord.forgotAccount": "Forgot {display}",
+ "discord.setupPendingLabel": "Discord Account",
+ "discord.setupWaitingForClient": "Waiting for Discord...",
+ "discord.setupWaitingForLogin": "Sign in to the Discord account you want to add.",
+ "discord.setupKeepMeLoggedIn": "Stay signed in to keep this account.",
+ "discord.setupDetected": "Detected account",
+ "discord.setupConnected": "Connected",
+ "discord.setupReady": "Discord account added",
+ "discord.setupReadyWithProfile": "Added {profile}",
+ "discord.setupFailed": "Discord setup failed",
+ "discord.setupFailedMessage": "Accshift could not finish adding this Discord account.",
+ "color.none": "Default",
+ "color.blue": "Blue",
+ "color.cyan": "Cyan",
+ "color.green": "Green",
+ "color.lime": "Lime",
+ "color.yellow": "Yellow",
+ "color.orange": "Orange",
+ "color.red": "Red",
+ "color.pink": "Pink",
+ "color.violet": "Violet",
+ "color.gray": "Gray",
+ "language.english": "English",
+ "language.french": "Français",
+ "language.spanish": "Español",
+ "language.portuguese": "Português (Portugal)",
+ "language.portugueseBrazil": "Português (Brasil)",
+ "language.russian": "Русский",
+ "language.chinese": "简体中文",
+ "theme.dark": "Dark",
+ "theme.light": "Light",
+ "theme.midnight": "Midnight",
+ "theme.glassDark": "Glass Dark",
+ "theme.glassLight": "Glass Light",
+ "theme.liquidGlass": "Liquid Glass",
+ "theme.custom": "Custom",
+ "settings.themeImport": "Import",
+ "settings.themeExport": "Export",
+ "settings.themeDelete": "Delete theme",
+ "settings.themeImported": "Theme imported",
+ "settings.themeDeleted": "Theme deleted",
+ "settings.themeExportCopied": "Theme JSON copied to clipboard",
+ "settings.themeInvalidJson": "Invalid theme JSON",
+ "settings.themeCustomize": "Customize",
+ "settings.themeEdit": "Edit",
+ "settings.themeCopyName": "{name} copy",
+ "settings.themeSaved": "Theme saved",
+ "settings.themeMigrated": "Theme imported and updated to the current format",
+ "settings.themeInvalidId": "The theme identifier is missing or invalid",
+ "settings.themeInvalidName": "The theme has no name",
+ "settings.themeUnsupportedVersion": "This theme needs a newer version of accshift",
+ "themeGroup.surface": "Surfaces",
+ "themeGroup.text": "Text",
+ "themeGroup.semantic": "Status colors",
+ "themeGroup.shape": "Shape and density",
+ "themeGroup.typography": "Typography",
+ "themeGroup.motion": "Motion",
+ "themeKind.rgbTriplet": "RGB triplet",
+ "themeKind.hexColor": "hex color",
+ "themeKind.color": "color",
+ "themeKind.length": "length",
+ "themeKind.shadow": "shadow",
+ "themeKind.choice": "choice",
+ "themeKind.fontStack": "font",
+ "themeKind.signedLength": "spacing",
+ "themeKind.gradient": "gradient",
+ "themeKind.number": "number",
+ "themeDensity.compact": "Compact",
+ "themeDensity.cozy": "Cozy",
+ "themeDensity.comfortable": "Comfortable",
+ "themeAvatarShape.circle": "Circle",
+ "themeAvatarShape.rounded": "Rounded",
+ "themeAvatarShape.square": "Square",
+ "themeSmoothing.auto": "Smoothed",
+ "themeSmoothing.none": "Pixel",
+ "themeToken.bgRgb": "Window background",
+ "themeToken.bgCard": "Card background",
+ "themeToken.bgCardHover": "Card background, hovered",
+ "themeToken.bgMuted": "Muted background",
+ "themeToken.bgElevated": "Elevated background",
+ "themeToken.border": "Borders",
+ "themeToken.fg": "Main text",
+ "themeToken.fgMuted": "Secondary text",
+ "themeToken.fgSubtle": "Subtle text",
+ "themeToken.afkText": "Away label",
+ "themeToken.accent": "Accent",
+ "themeToken.accentFg": "Text on accent",
+ "themeToken.success": "Success",
+ "themeToken.warning": "Warning",
+ "themeToken.danger": "Danger",
+ "themeToken.radiusSm": "Small radius",
+ "themeToken.radiusMd": "Medium radius",
+ "themeToken.radiusLg": "Large radius",
+ "themeToken.elevationLow": "Low shadow",
+ "themeToken.elevationMedium": "Medium shadow",
+ "themeToken.elevationHigh": "High shadow",
+ "themeToken.density": "Density",
+ "themeToken.fontUi": "Interface font",
+ "themeToken.bgImage": "Window gradient",
+ "themeToken.cardBgImage": "Surface gradient",
+ "themeToken.borderWidth": "Border width",
+ "themeToken.borderStyle": "Border style",
+ "themeToken.avatarShape": "Avatar shape",
+ "themeToken.focusRing": "Focus ring",
+ "themeToken.overlayBlur": "Overlay blur",
+ "themeToken.fontDisplay": "Heading font",
+ "themeToken.lineHeight": "Line height",
+ "themeToken.letterSpacing": "Letter spacing",
+ "themeToken.labelCase": "Label case",
+ "themeToken.fontSmoothing": "Font smoothing",
+ "themeToken.motionScale": "Animation speed",
+ "themeEditor.title": "Theme editor",
+ "themeEditor.name": "Name",
+ "themeEditor.author": "Author",
+ "themeEditor.version": "Version",
+ "themeEditor.base": "Inherits from",
+ "themeEditor.colorScheme": "Color scheme",
+ "themeEditor.glass": "Translucent surfaces",
+ "themeEditor.inherited": "Inherited",
+ "themeEditor.builtInBase": "Built-in theme",
+ "themeEditor.reset": "Reset to the inherited value",
+ "themeEditor.issues": "Checks",
+ "themeEditor.noIssues": "Nothing to report",
+ "themeEditor.fixErrorsFirst": "Fix the refused values before saving",
+ "themeEditor.save": "Save",
+ "themeEditor.saveFailed": "Could not save the theme. Try again.",
+ "themeEditor.export": "Copy",
+ "themeEditor.issueInvalidValue": "{token}: not a valid {kind}, for example {example}",
+ "themeEditor.issueUnknownToken": "{token} is not a theme value, it is ignored",
+ "themeEditor.issueMissingToken": "{token} is not set, the built-in value is used",
+ "themeEditor.issueUnknownBase": "Base theme {base} does not exist, built-in values are used",
+ "themeEditor.issueContrast": "{token} on {against}: {ratio} to 1, below the {target} to 1 target",
+ "themeEditor.beta": "Beta",
+ "themeEditor.betaNote": "The theme format is still moving: a theme written today may need a pass after an update.",
+ "themeEditor.customCss": "Custom CSS",
+ "themeEditor.customCssHelp": "Applied on top of the theme, for what the values above cannot reach. No @import and no url(): a theme never fetches anything.",
+ "themeEditor.issueUnsafeCss": "{construct} is not allowed in a theme, the CSS is not applied",
+ "themeEditor.issueCssTooLong": "CSS too long: {length} characters, the limit is {limit}",
+ "bulkEdit.title": "Bulk edit",
+ "bulkEdit.selectAccounts": "Select accounts",
+ "bulkEdit.selectAll": "Select all",
+ "bulkEdit.deselectAll": "Deselect all",
+ "bulkEdit.next": "Next",
+ "bulkEdit.apply": "Apply",
+ "bulkEdit.settings": "Settings",
+ "bulkEdit.newsPopup": "Game news popup",
+ "bulkEdit.doNotDisturb": "Do not disturb",
+ "bulkEdit.launchOptions": "Launch options per game",
+ "bulkEdit.unchanged": "Unchanged",
+ "bulkEdit.addLaunchOption": "Add",
+ "bulkEdit.selectGame": "Select a game...",
+ "bulkEdit.launchOptionsPlaceholder": "-fullscreen",
+ "bulkEdit.activeAccountWarning": "The currently active account is selected. Changes will apply on next Steam restart.",
+ "bulkEdit.toastSuccess": "Bulk edit: {count} succeeded",
+ "bulkEdit.toastPartial": "Bulk edit: {succeeded} succeeded, {failed} failed",
+ "bulkEdit.toastFailed": "Bulk edit failed",
+ "bulkEdit.noAccountsSelected": "No accounts selected",
+ "bulkEdit.selected": "{count} selected",
+ "bulkEdit.loadingGames": "Loading games...",
+ "bulkEdit.copyUrls": "Copy URLs",
+ "bulkEdit.urlsCopied": "{count} profile URL(s) copied",
+ "bulkEdit.cardColor": "Card color",
+ "bulkEdit.colorApplied": "Color applied to {count} card(s)",
+ "bulkEdit.colorCleared": "Color cleared on {count} card(s)",
+ "common.retry": "Retry",
+ "app.searchNoResults": "No results for \"{query}\"",
+ "app.folderEmpty": "This folder is empty",
+ "app.loadErrorGeneric": "Failed to load accounts. See the console for details.",
+ "toast.dismiss": "Dismiss",
+ "toast.switchFailed": "Account switch failed. See the console for details.",
+ "toast.addAccountFailed": "Couldn't add the account. Check the app logs for details.",
+ "toast.addAccountClientMissing": "{platform} doesn't seem to be installed. Install it, or set its location in Settings.",
+ "toast.banCheckFailedGeneric": "Ban check failed. See the console for details.",
+ "toast.renameAccountFailed": "Rename failed: {error}",
+ "toast.copyFailed": "Couldn't copy to the clipboard",
+ "toast.refreshFailed": "Refresh failed. See the console for details.",
+ "dialog.deleteFolderTitle": "Delete \"{name}\"?",
+ "dialog.deleteFolderMessage": "Subfolders are deleted too. Accounts inside are moved back up, not removed.",
+ "personas.deleteConfirm": "Click again to delete",
+ "personas.discardConfirm": "Click again to discard",
+ "personas.switchConfirmTitle": "Switch persona",
+ "personas.switchConfirmMessage": "Switch {count} platform(s) to \"{name}\"? Each client will close and relaunch.",
+ "personas.switchConfirmAction": "Switch",
+ "personas.deleteTitle": "Delete persona",
+ "personas.deleteMessage": "Delete \"{name}\"? The accounts themselves are not touched.",
+ "context.submenuError": "Couldn't load this menu",
+ "settings.apiKeySaveFailed": "Couldn't save the Steam API key",
+ "settings.apiKeyInvalidHint": "The key wasn't saved. Check it and try again.",
+ "settings.apiKeyCleared": "Steam API key cleared",
+ "settings.apiKeyClearFailed": "Couldn't clear the Steam API key",
+ "settings.clearApiKey": "Clear key",
+ "settings.cs2Bridge": "CS2 stats bridge",
+ "settings.cs2BridgeLink": "Bridge link",
+ "settings.cs2BridgeLinkPlaceholder": "https://your-server/api/bridge/accshift/",
+ "settings.cs2BridgeTest": "Test",
+ "settings.cs2BridgeStatusOk": "Connected · {count} accounts · {ms} ms",
+ "settings.cs2BridgeStatusFail": "Connection failed",
+ "settings.cs2BridgeStatusTesting": "Testing...",
+ "settings.cs2BridgeStatusUnknown": "Not tested",
+ "settings.cs2BridgeToken": "API token",
+ "settings.cs2BridgeTokenOptional": "optional, for custom servers",
+ "settings.cs2BridgeTokenPlaceholder": "Bearer token if your server needs one",
+ "settings.cs2BridgeSaveFailed": "Couldn't save the CS2 bridge settings",
+ "settings.cs2BridgeClearToken": "Clear token",
+ "settings.pathSaveFailed": "Couldn't save the {platform} path",
+ "settings.pathInvalidHint": "This path couldn't be saved. Check it and try again.",
+ "settings.pathSteamNeverSignedIn": "Steam found, sign in once so it creates its login history",
+ "settings.pathNotSteamFolder": "This folder does not look like a Steam installation",
+ "settings.pathNotADirectory": "The path must be an existing folder",
+ "settings.pinSaved": "PIN saved",
+ "settings.pinTakesEffectNextLaunch": "Takes effect the next time the app starts",
+ "settings.pinRequiredAfterInactivity": "Required after inactivity and when the app starts",
+ "settings.pinScreenLockOnly": "The PIN locks this window and account switches. It protects nothing on disk.",
+ "settings.unitSeconds": "seconds",
+ "settings.unitDays": "days",
+ "settings.telemetryLoadFailed": "Couldn't load telemetry settings",
+ "palette.placeholder": "Type a command or account name...",
+ "palette.noResults": "No matching commands",
+ "palette.sectionAccounts": "Accounts",
+ "palette.sectionActions": "Actions",
+ "palette.sectionNavigation": "Navigation",
+ "palette.openTab": "Go to {platform}",
+ "palette.openFolder": "Open folder \"{name}\"",
+ "palette.backToParent": "Back to parent folder",
+ "palette.zoomReset": "Reset zoom"
+}
diff --git a/crates/accshift-app/i18n/es.json b/crates/accshift-app/i18n/es.json
new file mode 100644
index 00000000..0cd5821a
--- /dev/null
+++ b/crates/accshift-app/i18n/es.json
@@ -0,0 +1,753 @@
+{
+ "app.loadingSettings": "Cargando la configuración...",
+ "app.loading": "Cargando...",
+ "app.searchPlaceholder": "Buscar cuenta...",
+ "app.noAccountsFound": "No se encontraron cuentas de {platform}",
+ "app.noAccountsHint": "Asegúrate de que {platform} esté instalado y de haber iniciado sesión al menos una vez.",
+ "app.switchingAccount": "Cambiando de cuenta...",
+ "app.platformRestarting": "{platform} se está reiniciando",
+ "app.comingSoon": "{platform} - Muy pronto",
+ "app.platformUnsupportedOs": "{platform} aún no está disponible en este sistema",
+ "app.noCompatiblePlatforms": "No hay ninguna plataforma compatible en este sistema",
+ "app.noCompatiblePlatformsHint": "Consulta las novedades de compatibilidad con Windows o usa una máquina compatible.",
+ "update.ctaAvailable": "Actualización disponible",
+ "update.ctaInstalling": "Instalando...",
+ "update.restartToApplyVersion": "Reiniciar para aplicar la actualización {version}",
+ "update.restartToApply": "Reiniciar para aplicar la actualización",
+ "update.readyToastVersion": "Actualización {version} lista",
+ "update.readyToast": "Actualización lista",
+ "update.restartFailed": "No se pudo reiniciar para aplicar la actualización",
+ "pin.lockedTitle": "Aplicación bloqueada",
+ "pin.lockedPrompt": "Escribe el PIN para desbloquear",
+ "pin.placeholder": "PIN de 4 dígitos",
+ "pin.unlock": "Desbloquear",
+ "pin.invalid": "PIN inválido",
+ "pin.tooManyAttempts": "Demasiados intentos. Vuelve a intentarlo en {seconds} s.",
+ "common.ok": "OK",
+ "common.cancel": "Cancelar",
+ "common.confirm": "Confirmar",
+ "common.close": "Cerrar",
+ "common.back": "Atrás",
+ "common.active": "Activa",
+ "common.choose": "Elegir...",
+ "common.none": "Ninguno",
+ "common.custom": "Personalizado",
+ "common.configured": "Configurado",
+ "common.missing": "Falta",
+ "common.enabled": "Habilitado",
+ "common.disabled": "Deshabilitado",
+ "common.on": "Activado",
+ "common.off": "Desactivado",
+ "common.add": "Añadir",
+ "common.visible": "Visible",
+ "common.hidden": "Oculto",
+ "common.inline": "En línea",
+ "common.tooltip": "Emergente",
+ "titlebar.refresh": "Actualizar",
+ "titlebar.addAccount": "Añadir cuenta",
+ "titlebar.settings": "Configuración",
+ "titlebar.personas": "Identidades",
+ "titlebar.minimize": "Minimizar",
+ "titlebar.maximize": "Maximizar",
+ "titlebar.restore": "Restaurar",
+ "titlebar.close": "Cerrar",
+ "view.grid": "Vista de cuadrícula",
+ "view.list": "Vista de lista",
+ "settings.title": "Configuración",
+ "settings.general": "General",
+ "settings.appearance": "Apariencia",
+ "settings.language": "Idioma",
+ "settings.theme": "Tema",
+ "settings.uiZoom": "Zoom de la interfaz",
+ "settings.backgroundOpacity": "Opacidad del fondo",
+ "settings.animations": "Animaciones",
+ "settings.animationsSystem": "Seguir al sistema",
+ "settings.animationsOn": "Siempre activas",
+ "settings.animationsOff": "Desactivadas",
+ "settings.performance": "Rendimiento",
+ "settings.suspendGraphicsWhenMinimized": "Suspender gráficos al minimizar",
+ "settings.minimizeOnAccountSwitch": "Minimizar al cambiar de cuenta",
+ "settings.system": "Sistema",
+ "settings.startWithSystem": "Iniciar al arrancar",
+ "settings.startWithSystemHint": "Inicia Accshift con Windows, minimizado en el área de notificación.",
+ "settings.closeToTray": "Cerrar al área de notificación",
+ "settings.closeToTrayHint": "El botón de cerrar oculta Accshift en el área de notificación en lugar de salir.",
+ "settings.autostartFailed": "No se pudo cambiar el inicio automático.",
+ "tray.open": "Abrir Accshift",
+ "tray.quit": "Salir",
+ "settings.platforms": "Plataformas",
+ "settings.platformSearchPlaceholder": "Buscar plataformas...",
+ "settings.platformSearchNoResults": "Ninguna plataforma coincide con tu búsqueda.",
+ "settings.accountDisplay": "Visualización de cuentas",
+ "settings.startupAndExtras": "Inicio",
+ "settings.defaultOnStartup": "Plataforma predeterminada al iniciar",
+ "settings.platformDisabledSuffix": "(desactivada)",
+ "settings.platformUnsupportedOs": "Sistema no compatible",
+ "settings.platformNotImplemented": "Planeado",
+ "settings.platformUserProvided": "Añadida desde tu carpeta de descriptores",
+ "settings.customPlatforms": "Plataformas personalizadas",
+ "settings.customPlatformsHint": "Los archivos de descriptor de esta carpeta se leen al iniciar la aplicación.",
+ "settings.customPlatformsNone": "Ningún descriptor cargado desde esta carpeta.",
+ "settings.customPlatformsProblems": "Archivos que no se cargaron",
+ "descriptor.addFromFile": "Añadir desde un archivo",
+ "descriptor.reload": "Recargar",
+ "descriptor.openFolder": "Abrir carpeta",
+ "descriptor.remove": "Eliminar",
+ "descriptor.removeConfirmTitle": "¿Eliminar {platform}?",
+ "descriptor.removeConfirmMessage": "Su archivo de descriptor sale de tu carpeta. Las cuentas ya capturadas siguen en el disco.",
+ "descriptor.previewTitle": "Añadir una plataforma",
+ "descriptor.previewOs": "Descrita para {list}",
+ "descriptor.previewRoots": "Carpetas que puede tocar",
+ "descriptor.previewSteps": "Lo que haría un cambio de cuenta",
+ "descriptor.previewWarnings": "Avisos",
+ "descriptor.previewNoPlan": "No se pudo crear una simulación: {problem}",
+ "descriptor.previewReplaces": "Esto reemplaza el descriptor que ya está en tu carpeta.",
+ "descriptor.previewNothingWritten": "No se escribe nada hasta que lo añadas.",
+ "descriptor.replace": "Reemplazar",
+ "descriptor.installed": "{platform} añadida",
+ "descriptor.removed": "{platform} eliminada",
+ "descriptor.actionRead": "leer",
+ "descriptor.actionCapture": "capturar",
+ "descriptor.actionRestore": "restaurar",
+ "descriptor.actionDelete": "eliminar",
+ "descriptor.actionClose": "cerrar",
+ "descriptor.actionLaunch": "iniciar",
+ "settings.dataRefresh": "Actualización de datos",
+ "settings.avatarRefresh": "Actualizar avatares",
+ "settings.banCheckDelay": "Intervalo de revisión de baneos",
+ "settings.refreshNow": "Actualizar ahora",
+ "settings.zeroEachLaunch": "0 = en cada inicio",
+ "settings.privacy": "Privacidad",
+ "settings.inactivityTimeout": "Tiempo de inactividad",
+ "settings.zeroDisabled": "0 = desactivado",
+ "settings.streamerMode": "Modo streamer",
+ "settings.streamerModeHint": "Difumina los datos de la cuenta automáticamente cuando hay software de streaming en ejecución.",
+ "settings.personasHint": "Mostrar el selector de identidades",
+ "settings.replayOnboarding": "Repetir la introducción",
+ "settings.replayOnboardingHint": "Vuelve a mostrar el tour de bienvenida y la elección sobre estadísticas de uso.",
+ "streamer.title": "Modo streamer",
+ "streamer.disable": "Desactivar",
+ "streamer.disablePermanently": "Desactivar permanentemente",
+ "personas.title": "Identidades",
+ "personas.create": "Nueva identidad",
+ "personas.activate": "Cambiar a esta identidad",
+ "personas.edit": "Editar",
+ "personas.delete": "Eliminar",
+ "personas.finish": "Listo",
+ "personas.switching": "Cambiando...",
+ "personas.switched": "Cambiado a {name}",
+ "personas.switchPartial": "{name}: falló en {failed}",
+ "personas.switchFailed": "No se pudo cambiar a {name}",
+ "personas.namePlaceholder": "Nombre de la identidad",
+ "personas.choosePlatforms": "Elige una cuenta para cada plataforma a incluir",
+ "personas.chooseAccount": "Elige la cuenta de {platform}",
+ "personas.removeFromPersona": "Quitar de esta identidad",
+ "personas.customImage": "Elegir una imagen...",
+ "personas.removeImage": "Quitar imagen",
+ "personas.imageError": "No se pudo cargar esa imagen.",
+ "personas.loadingAccounts": "Cargando cuentas...",
+ "personas.noAccountsOnPlatform": "Aún no hay cuentas en esta plataforma",
+ "personas.emptyHint": "Un clic cambia cada plataforma incluida a su cuenta.",
+ "settings.security": "Seguridad",
+ "settings.pinLockOnAfk": "Bloqueo con PIN al ausentarte",
+ "settings.pinCode": "Código PIN",
+ "settings.pinPlaceholder": "4 dígitos",
+ "settings.pinCurrentCode": "PIN actual",
+ "settings.pinCurrentHint": "Introduce el PIN actual para cambiar o desactivar el bloqueo.",
+ "settings.telemetry": "Estadísticas de uso (anónimas)",
+ "settings.telemetryModeA": "Estadísticas básicas anónimas",
+ "settings.telemetryModeAHint": "Cuenta los inicios y qué funciones se usan. Un ID local aleatorio evita contar instalaciones duplicadas; no se envía ningún dato personal.",
+ "settings.telemetryModeB": "Estadísticas ampliadas con UUID local (opcional)",
+ "settings.telemetryModeBHint": "Añade un UUID aleatorio guardado solo en esta máquina. Nos permite medir la retención y qué funciones importan. Tampoco se envía ningún dato personal.",
+ "settings.telemetryExport": "Exportar mis datos",
+ "settings.telemetryExported": "Datos exportados al portapapeles",
+ "settings.telemetryExportFailed": "Error al exportar",
+ "settings.telemetryEnableFailed": "No se pudieron activar las estadísticas ampliadas",
+ "settings.telemetryDisableFailed": "No se pudieron desactivar las estadísticas ampliadas",
+ "settings.telemetryDeletePending": "Las estadísticas ampliadas están desactivadas; el borrado en el servidor necesitará otro intento",
+ "settings.telemetryDeletePendingHint": "El borrado en el servidor está pendiente. El ID local antiguo se conserva solo para que puedas reintentar el borrado o exportar los datos asociados.",
+ "settings.telemetryRetryDelete": "Reintentar el borrado de datos",
+ "settings.telemetryDeleteCompleted": "Datos del servidor eliminados",
+ "settings.telemetryDeleteRetryFailed": "El borrado en el servidor sigue pendiente",
+ "settings.telemetryLearnMore": "¿Qué datos se envían?",
+ "onboarding.welcome.title": "Te damos la bienvenida a Accshift",
+ "onboarding.welcome.version": "v{version}",
+ "onboarding.welcome.compatibleWith": "Tu sistema operativo es compatible con:",
+ "onboarding.welcome.detectedPlatforms": "Estas son las plataformas detectadas en tu equipo:",
+ "onboarding.welcome.next": "Dame un tour",
+ "onboarding.welcome.skip": "Omitir",
+ "onboarding.features.hint": "Esta parte de la app no está visible ahora mismo.",
+ "onboarding.features.addAccount.label": "Añadir una cuenta",
+ "onboarding.features.addAccount.body": "El botón + de arriba a la derecha añade una cuenta a la plataforma actual. Inicia sesión una vez y Accshift la guarda.",
+ "onboarding.features.switch.label": "Cambiar de cuenta",
+ "onboarding.features.switch.body": "Haz clic en una tarjeta y ya estás en esa cuenta. Sinceramente, eso es toda la app.",
+ "onboarding.features.contextMenu.label": "Clic derecho para más acciones",
+ "onboarding.features.contextMenu.body": "Haz clic derecho en una tarjeta para renombrarla, cambiar su color, moverla a una carpeta o eliminarla.",
+ "onboarding.features.platformSwitch.label": "Cambiar de plataforma",
+ "onboarding.features.platformSwitch.body": "Lo mismo con Riot, Battle.net, Epic y las demás. Las pestañas de arriba cambian de plataforma.",
+ "onboarding.features.next": "Siguiente",
+ "onboarding.features.back": "Atrás",
+ "onboarding.features.step": "Paso {step}",
+ "onboarding.features.mockRename": "Renombrar",
+ "onboarding.features.mockSetColor": "Elegir color",
+ "onboarding.features.mockMoveToFolder": "Mover a carpeta",
+ "onboarding.features.mockDelete": "Eliminar",
+ "onboarding.features.mockAccount": "Cuenta {number}",
+ "onboarding.telemetry.title": "¡VENDE TU ALMA A ACCSHIFT!",
+ "onboarding.telemetry.intro": "Accshift cuenta unas pocas estadísticas de uso anónimas para saber qué arreglar primero. Nada personal sale de tu máquina, la app funciona igual de todos modos y puedes cambiar de idea cuando quieras en Configuración.",
+ "onboarding.telemetry.question": "¿Trato hecho?",
+ "onboarding.telemetry.gifAlt": "Meme de oferta de intercambio",
+ "onboarding.telemetry.basic": "¡NO! Ya está bien",
+ "onboarding.telemetry.basicDefault": "(predeterminado)",
+ "onboarding.telemetry.basicHint": "Solo contadores anónimos y nada más: sin perfil, sin identificador que te siga.",
+ "onboarding.telemetry.deal": "TRATO",
+ "onboarding.telemetry.dealHint": "Añade un UUID aparte para las estadísticas ampliadas, guardado solo en tu máquina. Seguimos sin saber quién eres, pero ayudas muchísimo. ¡Gracias!",
+ "onboarding.telemetry.optOutNote": "Elijas lo que elijas, puedes cambiarlo luego en Configuración -> Privacidad. :c",
+ "onboarding.telemetry.refuse": "No gracias, apágalo todo",
+ "onboarding.telemetry.refuseHint": "No se mide ni se envía nada, ni siquiera los contadores anónimos.",
+ "onboarding.telemetry.back": "Atrás",
+ "onboarding.persistFailed": "No se pudo guardar esa elección. Inténtalo de nuevo.",
+ "onboarding.persistLater": "Preguntarme en el próximo inicio",
+ "settings.steam": "Steam",
+ "settings.riot": "Riot",
+ "settings.battleNet": "Battle.net",
+ "settings.ubisoft": "Ubisoft Connect",
+ "settings.runSteamAsAdmin": "Ejecutar Steam como administrador",
+ "settings.showUsernames": "Mostrar nombres de usuario",
+ "settings.showSteamLastLogin": "Mostrar última conexión de Steam",
+ "settings.showRiotLastLogin": "Mostrar última conexión de Riot",
+ "settings.showBattleNetLastLogin": "Mostrar última conexión de Battle.net",
+ "settings.showUbisoftLastLogin": "Mostrar última conexión de Ubisoft",
+ "settings.showNotesUnderCards": "Mostrar notas bajo las tarjetas",
+ "settings.expandedFolders": "Expandir todas las carpetas",
+ "list.rootSection": "Raíz",
+ "settings.steamLaunch": "Cambio",
+ "settings.steamInstallation": "Instalación",
+ "settings.steamApiAndData": "API y datos",
+ "settings.launchOptions": "Opciones de inicio",
+ "settings.shutdownMode": "Modo de cierre",
+ "settings.shutdownModeGraceful": "Ordenado",
+ "settings.shutdownModeForce": "Forzar cierre",
+ "settings.autoDetected": "Detectado automáticamente",
+ "settings.steamFolder": "Carpeta de Steam",
+ "settings.steamFolderRegistry": "Registro",
+ "settings.riotClientPath": "Ejecutable del cliente de Riot",
+ "settings.battleNetPath": "Ejecutable de Battle.net",
+ "settings.ubisoftPath": "Carpeta de Ubisoft Connect",
+ "settings.steamWebApiKey": "Clave de la API web de Steam",
+ "settings.getKey": "Obtener clave",
+ "settings.pasteApiKey": "Pega tu clave de la API web de Steam",
+ "settings.saved": "Configuración guardada",
+ "settings.openApiKeyFailed": "No se pudo abrir la página de la clave API de Steam",
+ "settings.integrations": "Integraciones",
+ "settings.deepLinks": "Permitir enlaces accshift://",
+ "settings.deepLinksHint": "Deja que otras apps cambien de cuenta por ti: marcadores, Stream Deck, scripts.",
+ "settings.cliEnabled": "Permitir la CLI de accshift",
+ "settings.cliEnabledHint": "Deja que la herramienta de línea de comandos liste y cambie de cuenta. Desactivado, todos los comandos accshift se niegan a ejecutarse, diag incluido; la aplicación en sí no se ve afectada.",
+ "settings.help": "Abrir la wiki de accshift",
+ "settings.helpShort": "Ayuda",
+ "settings.openHelpFailed": "No se pudo abrir la wiki",
+ "settings.logs": "Registros",
+ "settings.openLogs": "Abrir la carpeta de registros",
+ "settings.openLogsFailed": "No se pudo abrir la carpeta de registros",
+ "context.loading": "Cargando...",
+ "context.noGamesFound": "No se encontraron juegos",
+ "context.field.cut": "Cortar",
+ "context.field.copy": "Copiar",
+ "context.field.paste": "Pegar",
+ "context.field.selectAll": "Seleccionar todo",
+ "context.menu.newFolder": "Nueva carpeta",
+ "context.menu.refresh": "Actualizar",
+ "context.menu.rename": "Renombrar",
+ "context.menu.copy": "Copiar...",
+ "context.menu.deleteFolder": "Eliminar carpeta",
+ "context.menu.folderColor": "Color de la carpeta",
+ "context.menu.moveToFolder": "Mover a una carpeta",
+ "context.menu.moveToRoot": "Sin carpeta",
+ "context.menu.editCardAndColor": "Editar tarjeta y color",
+ "context.menu.cardColor": "Color de la tarjeta",
+ "context.menu.addNote": "Añadir nota",
+ "context.menu.editNote": "Editar nota",
+ "platform.rename": "Renombrar",
+ "platform.renameTitle": "Renombrar cuenta",
+ "platform.renamePlaceholder": "Nombre de la cuenta",
+ "platform.newAccountPending": "Esperando...",
+ "platform.setupBusy": "Hay otra operación de accshift en curso. Esperando a que termine.",
+ "platform.renameNewAccount": "Ponle nombre a esta cuenta",
+ "platform.copyLabelAccountId": "ID de cuenta",
+ "platform.forget": "Olvidar",
+ "platform.forgetConfirmTitle": "¿Olvidar \"{display}\"?",
+ "platform.forgetConfirmMessage": "Esto quitará esta cuenta y su sesión guardada de Accshift.",
+ "platform.forgotAccount": "{display} olvidada",
+ "dialog.newFolderTitle": "Nueva carpeta",
+ "dialog.renameFolderTitle": "Renombrar carpeta",
+ "dialog.folderNamePlaceholder": "Nombre de la carpeta",
+ "dialog.cardNoteTitle": "Nota de la tarjeta",
+ "dialog.cardNotePlaceholder": "Escribe una nota breve",
+ "card.noteAttached": "Nota adjunta",
+ "card.clickAgainToSwitch": "Haz clic otra vez para cambiar",
+ "card.extensionWarnings": "Advertencias",
+ "card.extensionNote": "Nota",
+ "card.cs2Section": "CS2",
+ "card.cs2Level": "Nivel {level}",
+ "card.cs2CaseEarned": "Caja semanal obtenida",
+ "card.cs2CaseNotEarned": "Caja semanal pendiente",
+ "list.selectAccountPreview": "Selecciona una cuenta para verla",
+ "preview.noteLabel": "Nota",
+ "preview.currentlyActive": "Activa actualmente",
+ "preview.switchAgain": "Cambiar de nuevo",
+ "preview.switchAccount": "Cambiar de cuenta",
+ "ban.community": "Baneo de comunidad",
+ "ban.vac.single": "{count} baneo VAC",
+ "ban.vac.multiple": "{count} baneos VAC",
+ "ban.game.single": "{count} baneo de juego",
+ "ban.game.multiple": "{count} baneos de juego",
+ "time.unknown": "desconocido",
+ "time.justNow": "ahora mismo",
+ "time.minuteAgo": "hace {count} minuto",
+ "time.minutesAgo": "hace {count} minutos",
+ "time.hourAgo": "hace {count} hora",
+ "time.hoursAgo": "hace {count} horas",
+ "time.dayAgo": "hace {count} día",
+ "time.daysAgo": "hace {count} días",
+ "time.neverConnected": "nunca conectado",
+ "time.compactWrapper": "({value})",
+ "toast.copied": "{label} copiado",
+ "toast.legacyConfigMigrated": "Configuración migrada al nuevo formato",
+ "toast.legacyConfigMigrationFailed": "No se pudo migrar la configuración antigua, revisa los registros",
+ "toast.failedLoadSettingsPanel": "No se pudo cargar el panel de configuración",
+ "toast.banChecking": "Comprobando baneos...",
+ "toast.banCheckSummary.single": "Revisión de baneos: {count} cuenta con baneos",
+ "toast.banCheckSummary.multiple": "Revisión de baneos: {count} cuentas con baneos",
+ "toast.banCheckFailed": "Falló la revisión de baneos: {error}",
+ "toast.avatarRefreshComplete": "Actualización de avatares terminada para {count} cuentas",
+ "toast.banRefreshComplete": "Actualización de baneos terminada para {count} cuentas",
+ "toast.banRefreshNoApiKey": "Actualización de baneos omitida: añade una clave de Steam Web API en los ajustes",
+ "toast.refreshPartial": "Actualización terminada para {ok} de {count} cuentas",
+ "toast.noSteamAccountsFound": "No se encontraron cuentas de Steam. Inicia sesión en Steam al menos una vez y actualiza.",
+ "toast.accountsRefreshed.single": "{count} cuenta actualizada",
+ "toast.accountsRefreshed.multiple": "{count} cuentas actualizadas",
+ "toast.steamFolderNotFound": "No se encontró la carpeta de Steam. Configúrala manualmente en Configuración > Carpeta de Steam.",
+ "toast.steamElevated": "Steam se está ejecutando como administrador. Activa 'Ejecutar Steam como administrador' en Configuración > Steam.",
+ "toast.noRiotProfilesFound": "Aún no hay perfiles de Riot. Haz clic en + para añadir uno.",
+ "toast.noBattleNetAccountsFound": "No se encontraron cuentas de Battle.net. Inicia sesión en Battle.net al menos una vez y actualiza.",
+ "toast.noUbisoftAccountsFound": "No se encontraron cuentas de Ubisoft. Inicia sesión en Ubisoft Connect al menos una vez y actualiza.",
+ "toast.deepLinkInvalid": "Enlace accshift:// no reconocido",
+ "toast.deepLinkDisabled": "Los enlaces accshift:// están desactivados en Configuración",
+ "toast.deepLinkUnknownPlatform": "Plataforma desconocida en el enlace: {platform}",
+ "toast.deepLinkPlatformDisabled": "{platform} está desactivado en Configuración",
+ "toast.deepLinkAccountNotFound": "Ninguna cuenta de {platform} coincide con \"{account}\"",
+ "toast.deepLinkSwitched": "Cambiado a {account}",
+ "dialog.deepLinkSwitchTitle": "¿Cambiar de cuenta?",
+ "dialog.deepLinkSwitchMessage": "Un enlace accshift:// pide cambiar tu cuenta de {platform} a \"{account}\". ¿Continuar?",
+ "dialog.deepLinkSwitchConfirm": "Cambiar",
+ "steam.launchOnline": "Cambiar en línea",
+ "steam.launchInvisible": "Cambiar invisible",
+ "steam.switchAndRunGame": "Cambiar + iniciar {game}",
+ "steam.switchAndRunPick": "Cambiar + iniciar un juego...",
+ "steam.runGame": "Iniciar {game}",
+ "steam.runPick": "Iniciar un juego...",
+ "steam.switchAndRunNoGames": "No se encontraron juegos",
+ "steam.clearDefaultGame": "Quitar el juego predeterminado",
+ "steam.copySteamId64": "Copiar SteamID64",
+ "steam.copyFriendCode": "Copiar código de amigo",
+ "steam.copyProfileUrl": "Copiar URL del perfil",
+ "steam.copyLabelUsername": "Nombre de usuario",
+ "steam.copyLabelSteamId64": "SteamID64",
+ "steam.copyLabelFriendCode": "Código de amigo",
+ "steam.copyLabelProfileUrl": "URL del perfil",
+ "steam.openUserdataFolder": "Abrir la carpeta userdata",
+ "steam.clearIntegratedBrowserCache": "Reiniciar la sesión del navegador",
+ "steam.clearIntegratedBrowserCacheConfirmTitle": "¿Reiniciar la sesión del navegador de Steam?",
+ "steam.clearIntegratedBrowserCacheConfirmMessage": "Esto cierra Steam y borra la caché del navegador integrado que usan la Tienda y la Comunidad.",
+ "steam.clearedIntegratedBrowserCache": "Sesión del navegador de Steam reiniciada",
+ "steam.copySettingsFrom": "Copiar la configuración de",
+ "steam.copiedSettingsToCurrent": "Configuración de {game} copiada a la cuenta actual",
+ "steam.forget": "Olvidar",
+ "steam.forgetConfirmTitle": "¿Olvidar \"{display}\"?",
+ "steam.forgetConfirmMessage": "Esto quitará esta cuenta de tu lista de cuentas de Steam en este PC.",
+ "steam.forgotAccount": "{username} olvidada",
+ "steam.setupPendingLabel": "Cuenta de Steam",
+ "steam.setupWaitingForClient": "Esperando a Steam...",
+ "steam.setupWaitingForLogin": "Inicia sesión en la cuenta de Steam que quieres añadir.",
+ "steam.setupDetected": "Cuenta detectada",
+ "steam.setupConnected": "Conectado",
+ "steam.setupReady": "Cuenta de Steam añadida",
+ "steam.setupReadyWithProfile": "{profile} añadido",
+ "steam.setupFailed": "Falló la configuración de Steam",
+ "steam.setupFailedMessage": "Accshift no pudo terminar de añadir esta cuenta de Steam.",
+ "riot.captureSession": "Capturar la sesión actual",
+ "riot.recaptureSession": "Volver a capturar la sesión",
+ "riot.capturedSession": "Sesión capturada para {profile}",
+ "riot.setupPendingLabel": "Cuenta de Riot",
+ "riot.setupWaitingForClient": "Esperando al Riot Client...",
+ "riot.setupWaitingForLogin": "Inicia sesión en la cuenta de Riot que quieres añadir.",
+ "riot.setupCapturing": "Guardando la sesión de Riot...",
+ "riot.setupReady": "Cuenta de Riot añadida",
+ "riot.setupReadyWithProfile": "{profile} añadido",
+ "riot.setupFailed": "Falló la configuración de Riot",
+ "riot.setupFailedMessage": "Accshift no pudo terminar de añadir esta cuenta de Riot.",
+ "riot.setupStaySignedIn": "Mantén activada la opción 'Stay signed in'.",
+ "riot.setupDetected": "Cuenta detectada",
+ "riot.setupConnected": "Conectado",
+ "riot.forget": "Olvidar cuenta",
+ "riot.forgetConfirmTitle": "¿Olvidar \"{display}\"?",
+ "riot.forgetConfirmMessage": "Esto elimina el perfil local de Riot y su sesión guardada de Accshift.",
+ "riot.forgotProfile": "{profile} olvidado",
+ "battlenet.copyUsername": "Copiar nombre de usuario",
+ "battlenet.copyLabelUsername": "Nombre de usuario",
+ "battlenet.copyEmail": "Copiar correo",
+ "battlenet.copyLabelEmail": "Correo",
+ "battlenet.forget": "Olvidar",
+ "battlenet.forgetConfirmTitle": "¿Olvidar \"{display}\"?",
+ "battlenet.forgetConfirmMessage": "Esto quitará esta cuenta de la lista de cuentas de Battle.net en este PC.",
+ "battlenet.forgotAccount": "{email} olvidada",
+ "battlenet.setupPendingLabel": "Cuenta de Battle.net",
+ "battlenet.setupWaitingForClient": "Esperando a Battle.net...",
+ "battlenet.setupWaitingForLogin": "Inicia sesión en la cuenta de Battle.net que quieres añadir.",
+ "battlenet.setupKeepMeLoggedIn": "Mantén activada la opción 'Keep me logged in' cuando sea posible.",
+ "battlenet.setupDetected": "Cuenta detectada",
+ "battlenet.setupConnected": "Conectado",
+ "battlenet.setupReady": "Cuenta de Battle.net añadida",
+ "battlenet.setupReadyWithProfile": "{profile} añadido",
+ "battlenet.setupFailed": "Falló la configuración de Battle.net",
+ "battlenet.setupFailedMessage": "Accshift no pudo terminar de añadir esta cuenta de Battle.net.",
+ "ubisoft.copyLabelUuid": "UUID",
+ "ubisoft.forget": "Olvidar",
+ "ubisoft.forgetConfirmTitle": "¿Olvidar \"{display}\"?",
+ "ubisoft.forgetConfirmMessage": "Esto quitará esta cuenta y su sesión guardada de Accshift.",
+ "ubisoft.forgotAccount": "{display} olvidada",
+ "ubisoft.setupPendingLabel": "Cuenta de Ubisoft",
+ "ubisoft.setupWaitingForClient": "Esperando a Ubisoft Connect...",
+ "ubisoft.setupWaitingForLogin": "Inicia sesión en la cuenta de Ubisoft que quieres añadir.",
+ "ubisoft.setupKeepMeLoggedIn": "Mantén activada la opción 'Remember me'.",
+ "ubisoft.setupDetected": "Cuenta detectada",
+ "ubisoft.setupConnected": "Conectado",
+ "ubisoft.setupReady": "Cuenta de Ubisoft añadida",
+ "ubisoft.setupReadyWithProfile": "{profile} añadido",
+ "ubisoft.setupFailed": "Falló la configuración de Ubisoft",
+ "ubisoft.setupFailedMessage": "Accshift no pudo terminar de añadir esta cuenta de Ubisoft.",
+ "settings.roblox": "Roblox",
+ "toast.noRobloxAccountsFound": "No se encontraron cuentas de Roblox. Añade una cuenta con Quick Login o pega una cookie.",
+ "roblox.noAccountsHint": "Pulsa + para añadir una cuenta de Roblox con Quick Login.",
+ "roblox.sessionExpired": "Sesión caducada",
+ "roblox.sessionExpiredTooltip": "Esta cuenta cerró sesión. Vuelve a añadirla antes de cambiar.",
+ "roblox.sessionExpiredSwitchError": "Sesión caducada. Vuelve a añadir esta cuenta para cambiar. Las notas y la configuración se conservan.",
+ "roblox.cookiePasteTitle": "Añadir cuenta con cookie",
+ "roblox.cookiePasteHint": "Pega una cookie .ROBLOSECURITY de tu navegador para añadir una cuenta directamente.",
+ "settings.showRobloxLastLogin": "Mostrar última conexión",
+ "settings.robloxHealthCheck": "Comprobación de sesión",
+ "settings.robloxHealthCheckHint": "Marca las cuentas cuya sesión de Roblox haya caducado; una petición de red por inicio.",
+ "roblox.copyLabelUsername": "Nombre de usuario",
+ "roblox.copyLabelUserId": "ID de usuario",
+ "roblox.forget": "Olvidar",
+ "roblox.forgetConfirmTitle": "¿Olvidar \"{display}\"?",
+ "roblox.forgetConfirmMessage": "Esto quitará esta cuenta y su cookie guardada de este PC.",
+ "roblox.forgotAccount": "{display} olvidada",
+ "roblox.setupPendingLabel": "Cuenta de Roblox",
+ "roblox.setupWaitingForClient": "Conectando con Roblox...",
+ "roblox.setupWaitingForLogin": "Abre la app de Roblox en otro dispositivo e introduce el código de abajo.",
+ "roblox.setupQuickLoginCode": "Código de Quick Login",
+ "roblox.setupQuickLoginHint": "roblox.com/quick-login",
+ "roblox.copyCode": "Copiar código",
+ "roblox.setupDetected": "Cuenta detectada",
+ "roblox.setupConnected": "Conectado",
+ "roblox.setupReady": "Cuenta de Roblox añadida",
+ "roblox.setupReadyWithProfile": "{profile} añadido",
+ "roblox.setupFailed": "Falló la configuración de Roblox",
+ "roblox.setupFailedMessage": "Accshift no pudo terminar de añadir esta cuenta de Roblox.",
+ "settings.epic": "Epic Games",
+ "settings.epicPath": "Ejecutable de Epic Games Launcher",
+ "settings.showEpicLastLogin": "Mostrar última conexión",
+ "toast.noEpicAccountsFound": "No se encontraron cuentas de Epic Games. Inicia sesión en Epic Games Launcher al menos una vez y actualiza.",
+ "epic.noAccountsHint": "Pulsa + para añadir una cuenta de Epic Games.",
+ "epic.copyLabelAccountId": "ID de cuenta",
+ "epic.forget": "Olvidar",
+ "epic.forgetConfirmTitle": "¿Olvidar \"{display}\"?",
+ "epic.forgetConfirmMessage": "Esto quitará esta cuenta y su sesión guardada de Accshift.",
+ "epic.forgotAccount": "{display} olvidada",
+ "epic.setupPendingLabel": "Cuenta de Epic Games",
+ "epic.setupWaitingForClient": "Esperando a Epic Games Launcher...",
+ "epic.setupWaitingForLogin": "Inicia sesión en la cuenta de Epic Games que quieres añadir.",
+ "epic.setupKeepMeLoggedIn": "Mantén activada la opción 'Remember me'.",
+ "epic.setupDetected": "Cuenta detectada",
+ "epic.setupConnected": "Conectado",
+ "epic.setupReady": "Cuenta de Epic Games añadida",
+ "epic.setupReadyWithProfile": "{profile} añadido",
+ "epic.setupFailed": "Falló la configuración de Epic Games",
+ "epic.setupFailedMessage": "Accshift no pudo terminar de añadir esta cuenta de Epic Games.",
+ "settings.gog": "GOG Galaxy",
+ "settings.gogPath": "Ejecutable de GOG Galaxy",
+ "settings.showGogLastLogin": "Mostrar última conexión",
+ "toast.noGogAccountsFound": "No se encontraron cuentas de GOG Galaxy. Inicia sesión en GOG Galaxy al menos una vez y actualiza.",
+ "gog.noAccountsHint": "Pulsa + para añadir una cuenta de GOG Galaxy.",
+ "gog.copyLabelAccountId": "ID de cuenta",
+ "gog.forget": "Olvidar",
+ "gog.forgetConfirmTitle": "¿Olvidar \"{display}\"?",
+ "gog.forgetConfirmMessage": "Esto quitará esta cuenta y su sesión guardada de Accshift.",
+ "gog.forgotAccount": "{display} olvidada",
+ "gog.setupPendingLabel": "Cuenta de GOG Galaxy",
+ "gog.setupWaitingForClient": "Esperando a GOG Galaxy...",
+ "gog.setupWaitingForLogin": "Inicia sesión en la cuenta de GOG Galaxy que quieres añadir.",
+ "gog.setupKeepMeLoggedIn": "Mantén activada la opción 'Stay signed in'.",
+ "gog.setupDetected": "Cuenta detectada",
+ "gog.setupConnected": "Conectado",
+ "gog.setupReady": "Cuenta de GOG Galaxy añadida",
+ "gog.setupReadyWithProfile": "{profile} añadido",
+ "gog.setupFailed": "Falló la configuración de GOG Galaxy",
+ "gog.setupFailedMessage": "Accshift no pudo terminar de añadir esta cuenta de GOG Galaxy.",
+ "settings.jagex": "Jagex Launcher",
+ "settings.jagexPath": "Ejecutable de Jagex Launcher",
+ "settings.showJagexLastLogin": "Mostrar última conexión",
+ "toast.noJagexAccountsFound": "Aún no hay cuentas de Jagex guardadas. Pulsa + para añadir una con el Jagex Launcher.",
+ "jagex.noAccountsHint": "Pulsa + para añadir una cuenta de Jagex.",
+ "jagex.copyLabelAccountId": "ID de cuenta",
+ "jagex.forget": "Olvidar",
+ "jagex.forgetConfirmTitle": "¿Olvidar \"{display}\"?",
+ "jagex.forgetConfirmMessage": "Esto quitará esta cuenta y su sesión guardada de Accshift.",
+ "jagex.forgotAccount": "{display} olvidada",
+ "jagex.setupPendingLabel": "Cuenta de Jagex",
+ "jagex.setupWaitingForClient": "Esperando al Jagex Launcher...",
+ "jagex.setupWaitingForLogin": "Inicia sesión en la cuenta de Jagex que quieres añadir.",
+ "jagex.setupKeepMeLoggedIn": "Mantén activada la opción 'Remember me'.",
+ "jagex.setupDetected": "Cuenta detectada",
+ "jagex.setupConnected": "Conectado",
+ "jagex.setupReady": "Cuenta de Jagex añadida",
+ "jagex.setupReadyWithProfile": "{profile} añadido",
+ "jagex.setupFailed": "Falló la configuración de Jagex",
+ "jagex.setupFailedMessage": "Accshift no pudo terminar de añadir esta cuenta de Jagex.",
+ "settings.discord": "Discord",
+ "settings.discordPath": "Ejecutable de Discord",
+ "settings.showDiscordLastLogin": "Mostrar última conexión",
+ "toast.noDiscordAccountsFound": "No se encontraron cuentas de Discord. Añade una cuenta de Discord y actualiza.",
+ "discord.noAccountsHint": "Pulsa + para añadir una cuenta de Discord.",
+ "discord.copyLabelAccountId": "ID de cuenta",
+ "discord.forget": "Olvidar",
+ "discord.forgetConfirmTitle": "¿Olvidar \"{display}\"?",
+ "discord.forgetConfirmMessage": "Esto quitará esta cuenta y su sesión guardada de Accshift.",
+ "discord.forgotAccount": "{display} olvidada",
+ "discord.setupPendingLabel": "Cuenta de Discord",
+ "discord.setupWaitingForClient": "Esperando a Discord...",
+ "discord.setupWaitingForLogin": "Inicia sesión en la cuenta de Discord que quieres añadir.",
+ "discord.setupKeepMeLoggedIn": "Mantén la sesión iniciada para conservar esta cuenta.",
+ "discord.setupDetected": "Cuenta detectada",
+ "discord.setupConnected": "Conectado",
+ "discord.setupReady": "Cuenta de Discord añadida",
+ "discord.setupReadyWithProfile": "{profile} añadido",
+ "discord.setupFailed": "Falló la configuración de Discord",
+ "discord.setupFailedMessage": "Accshift no pudo terminar de añadir esta cuenta de Discord.",
+ "color.none": "Predeterminado",
+ "color.blue": "Azul",
+ "color.cyan": "Cian",
+ "color.green": "Verde",
+ "color.lime": "Lima",
+ "color.yellow": "Amarillo",
+ "color.orange": "Naranja",
+ "color.red": "Rojo",
+ "color.pink": "Rosa",
+ "color.violet": "Violeta",
+ "color.gray": "Gris",
+ "language.english": "English",
+ "language.french": "Français",
+ "language.spanish": "Español",
+ "language.portuguese": "Português (Portugal)",
+ "language.portugueseBrazil": "Português (Brasil)",
+ "language.russian": "Русский",
+ "language.chinese": "简体中文",
+ "theme.dark": "Oscuro",
+ "theme.light": "Claro",
+ "theme.midnight": "Medianoche",
+ "theme.glassDark": "Cristal oscuro",
+ "theme.glassLight": "Cristal claro",
+ "theme.liquidGlass": "Cristal líquido",
+ "theme.custom": "Personalizado",
+ "settings.themeImport": "Importar",
+ "settings.themeExport": "Exportar",
+ "settings.themeDelete": "Eliminar tema",
+ "settings.themeImported": "Tema importado",
+ "settings.themeDeleted": "Tema eliminado",
+ "settings.themeExportCopied": "JSON del tema copiado al portapapeles",
+ "settings.themeCustomize": "Personalizar",
+ "settings.themeEdit": "Editar",
+ "settings.themeCopyName": "{name} copia",
+ "settings.themeSaved": "Tema guardado",
+ "settings.themeMigrated": "Tema importado y actualizado al formato actual",
+ "settings.themeInvalidId": "El identificador del tema falta o no es válido",
+ "settings.themeInvalidName": "El tema no tiene nombre",
+ "settings.themeUnsupportedVersion": "Este tema necesita una versión más reciente de accshift",
+ "themeGroup.surface": "Superficies",
+ "themeGroup.text": "Texto",
+ "themeGroup.semantic": "Colores de estado",
+ "themeGroup.shape": "Forma y densidad",
+ "themeGroup.typography": "Tipografía",
+ "themeGroup.motion": "Movimiento",
+ "themeKind.rgbTriplet": "triplete RGB",
+ "themeKind.hexColor": "color hexadecimal",
+ "themeKind.color": "color",
+ "themeKind.length": "longitud",
+ "themeKind.shadow": "sombra",
+ "themeKind.choice": "opción",
+ "themeKind.fontStack": "fuente",
+ "themeKind.signedLength": "espaciado",
+ "themeKind.gradient": "degradado",
+ "themeKind.number": "número",
+ "themeDensity.compact": "Compacta",
+ "themeDensity.cozy": "Normal",
+ "themeDensity.comfortable": "Amplia",
+ "themeAvatarShape.circle": "Redondo",
+ "themeAvatarShape.rounded": "Redondeado",
+ "themeAvatarShape.square": "Cuadrado",
+ "themeSmoothing.auto": "Suavizado",
+ "themeSmoothing.none": "Píxel",
+ "themeToken.bgRgb": "Fondo de la ventana",
+ "themeToken.bgCard": "Fondo de las tarjetas",
+ "themeToken.bgCardHover": "Fondo de las tarjetas al pasar el cursor",
+ "themeToken.bgMuted": "Fondo atenuado",
+ "themeToken.bgElevated": "Fondo elevado",
+ "themeToken.border": "Bordes",
+ "themeToken.fg": "Texto principal",
+ "themeToken.fgMuted": "Texto secundario",
+ "themeToken.fgSubtle": "Texto sutil",
+ "themeToken.afkText": "Etiqueta de ausente",
+ "themeToken.accent": "Acento",
+ "themeToken.accentFg": "Texto sobre el acento",
+ "themeToken.success": "Éxito",
+ "themeToken.warning": "Advertencia",
+ "themeToken.danger": "Peligro",
+ "themeToken.radiusSm": "Radio pequeño",
+ "themeToken.radiusMd": "Radio medio",
+ "themeToken.radiusLg": "Radio grande",
+ "themeToken.elevationLow": "Sombra suave",
+ "themeToken.elevationMedium": "Sombra media",
+ "themeToken.elevationHigh": "Sombra fuerte",
+ "themeToken.density": "Densidad",
+ "themeToken.fontUi": "Fuente de la interfaz",
+ "themeToken.bgImage": "Degradado de la ventana",
+ "themeToken.cardBgImage": "Degradado de las superficies",
+ "themeToken.borderWidth": "Grosor de los bordes",
+ "themeToken.borderStyle": "Estilo de los bordes",
+ "themeToken.avatarShape": "Forma de los avatares",
+ "themeToken.focusRing": "Contorno de foco",
+ "themeToken.overlayBlur": "Desenfoque del fondo",
+ "themeToken.fontDisplay": "Fuente de los títulos",
+ "themeToken.lineHeight": "Altura de línea",
+ "themeToken.letterSpacing": "Espaciado entre letras",
+ "themeToken.labelCase": "Mayúsculas de las etiquetas",
+ "themeToken.fontSmoothing": "Suavizado del texto",
+ "themeToken.motionScale": "Velocidad de las animaciones",
+ "themeEditor.title": "Editor de temas",
+ "themeEditor.name": "Nombre",
+ "themeEditor.author": "Autor",
+ "themeEditor.version": "Versión",
+ "themeEditor.base": "Hereda de",
+ "themeEditor.colorScheme": "Modo de color",
+ "themeEditor.glass": "Superficies translúcidas",
+ "themeEditor.inherited": "Heredado",
+ "themeEditor.builtInBase": "Tema integrado",
+ "themeEditor.reset": "Volver al valor heredado",
+ "themeEditor.issues": "Comprobaciones",
+ "themeEditor.noIssues": "Nada que señalar",
+ "themeEditor.fixErrorsFirst": "Corrige los valores rechazados antes de guardar",
+ "themeEditor.save": "Guardar",
+ "themeEditor.saveFailed": "No se pudo guardar el tema. Inténtalo de nuevo.",
+ "themeEditor.export": "Copiar",
+ "themeEditor.issueInvalidValue": "{token}: {kind} no válido, por ejemplo {example}",
+ "themeEditor.issueUnknownToken": "{token} no es un valor de tema, se ignora",
+ "themeEditor.issueMissingToken": "{token} no está definido, se usa el valor integrado",
+ "themeEditor.issueUnknownBase": "El tema base {base} no existe, se usan los valores integrados",
+ "themeEditor.issueContrast": "{token} sobre {against}: {ratio} a 1, por debajo del objetivo de {target} a 1",
+ "themeEditor.beta": "Beta",
+ "themeEditor.betaNote": "El formato de tema aún cambia: un tema escrito hoy puede necesitar un ajuste tras una actualización.",
+ "themeEditor.customCss": "CSS personalizado",
+ "themeEditor.customCssHelp": "Se aplica sobre el tema, para lo que los valores de arriba no alcanzan. Sin @import ni url(): un tema nunca descarga nada.",
+ "themeEditor.issueUnsafeCss": "{construct} no está permitido en un tema, el CSS no se aplica",
+ "themeEditor.issueCssTooLong": "CSS demasiado largo: {length} caracteres, el límite es {limit}",
+ "settings.themeInvalidJson": "JSON de tema inválido",
+ "bulkEdit.title": "Edición masiva",
+ "bulkEdit.selectAccounts": "Seleccionar cuentas",
+ "bulkEdit.selectAll": "Seleccionar todo",
+ "bulkEdit.deselectAll": "Deseleccionar todo",
+ "bulkEdit.next": "Siguiente",
+ "bulkEdit.apply": "Aplicar",
+ "bulkEdit.settings": "Configuración",
+ "bulkEdit.newsPopup": "Ventana de noticias del juego",
+ "bulkEdit.doNotDisturb": "No molestar",
+ "bulkEdit.launchOptions": "Opciones de inicio por juego",
+ "bulkEdit.unchanged": "Sin cambios",
+ "bulkEdit.addLaunchOption": "Añadir",
+ "bulkEdit.selectGame": "Selecciona un juego...",
+ "bulkEdit.launchOptionsPlaceholder": "-fullscreen",
+ "bulkEdit.activeAccountWarning": "La cuenta activa está seleccionada. Los cambios se aplicarán al reiniciar Steam.",
+ "bulkEdit.toastSuccess": "Edición masiva: {count} con éxito",
+ "bulkEdit.toastPartial": "Edición masiva: {succeeded} con éxito, {failed} con error",
+ "bulkEdit.toastFailed": "Falló la edición masiva",
+ "bulkEdit.noAccountsSelected": "Ninguna cuenta seleccionada",
+ "bulkEdit.selected": "{count} seleccionadas",
+ "bulkEdit.loadingGames": "Cargando juegos...",
+ "bulkEdit.copyUrls": "Copiar URL",
+ "bulkEdit.urlsCopied": "{count} URL de perfil copiada(s)",
+ "bulkEdit.cardColor": "Color de tarjeta",
+ "bulkEdit.colorApplied": "Color aplicado a {count} tarjeta(s)",
+ "bulkEdit.colorCleared": "Color eliminado de {count} tarjeta(s)",
+ "common.retry": "Reintentar",
+ "app.searchNoResults": "Sin resultados para \"{query}\"",
+ "app.folderEmpty": "Esta carpeta está vacía",
+ "app.loadErrorGeneric": "No se pudieron cargar las cuentas. Consulta la consola para más detalles.",
+ "toast.dismiss": "Descartar",
+ "toast.switchFailed": "Falló el cambio de cuenta. Consulta la consola para más detalles.",
+ "toast.addAccountFailed": "No se pudo añadir la cuenta. Revisa los registros de la app para más detalles.",
+ "toast.addAccountClientMissing": "{platform} no parece estar instalado. Instálalo o indica su ubicación en Configuración.",
+ "toast.banCheckFailedGeneric": "Falló la revisión de baneos. Consulta la consola para más detalles.",
+ "toast.renameAccountFailed": "Falló el cambio de nombre: {error}",
+ "toast.copyFailed": "No se pudo copiar al portapapeles",
+ "toast.refreshFailed": "Falló la actualización. Consulta la consola para más detalles.",
+ "dialog.deleteFolderTitle": "¿Eliminar \"{name}\"?",
+ "dialog.deleteFolderMessage": "Las subcarpetas también se eliminan. Las cuentas que hay dentro suben un nivel, no se borran.",
+ "personas.deleteConfirm": "Haz clic de nuevo para eliminar",
+ "personas.discardConfirm": "Haz clic de nuevo para descartar",
+ "personas.switchConfirmTitle": "Cambiar de identidad",
+ "personas.switchConfirmMessage": "¿Cambiar {count} plataforma(s) a \"{name}\"? Cada cliente se cerrará y se reiniciará.",
+ "personas.switchConfirmAction": "Cambiar",
+ "personas.deleteTitle": "Eliminar identidad",
+ "personas.deleteMessage": "¿Eliminar \"{name}\"? Las cuentas en sí no se tocan.",
+ "context.submenuError": "No se pudo cargar este menú",
+ "settings.apiKeySaveFailed": "No se pudo guardar la clave API de Steam",
+ "settings.apiKeyInvalidHint": "La clave no se guardó. Revísala e inténtalo de nuevo.",
+ "settings.apiKeyCleared": "Clave API de Steam borrada",
+ "settings.apiKeyClearFailed": "No se pudo borrar la clave API de Steam",
+ "settings.clearApiKey": "Borrar clave",
+ "settings.cs2Bridge": "Puente de estadísticas de CS2",
+ "settings.cs2BridgeLink": "Enlace del puente",
+ "settings.cs2BridgeLinkPlaceholder": "https://tu-servidor/api/bridge/accshift/",
+ "settings.cs2BridgeTest": "Probar",
+ "settings.cs2BridgeStatusOk": "Conectado · {count} cuentas · {ms} ms",
+ "settings.cs2BridgeStatusFail": "Falló la conexión",
+ "settings.cs2BridgeStatusTesting": "Probando...",
+ "settings.cs2BridgeStatusUnknown": "Sin probar",
+ "settings.cs2BridgeToken": "Token de API",
+ "settings.cs2BridgeTokenOptional": "opcional, para servidores propios",
+ "settings.cs2BridgeTokenPlaceholder": "Token Bearer si tu servidor lo necesita",
+ "settings.cs2BridgeSaveFailed": "No se pudo guardar la configuración del puente CS2",
+ "settings.cs2BridgeClearToken": "Borrar token",
+ "settings.pathSaveFailed": "No se pudo guardar la ruta de {platform}",
+ "settings.pathInvalidHint": "No se pudo guardar esta ruta. Revísala e inténtalo de nuevo.",
+ "settings.pathSteamNeverSignedIn": "Steam encontrado, inicia sesión una vez para que cree su historial de inicio de sesión",
+ "settings.pathNotSteamFolder": "Esta carpeta no parece una instalación de Steam",
+ "settings.pathNotADirectory": "La ruta debe ser una carpeta existente",
+ "settings.pinSaved": "PIN guardado",
+ "settings.pinTakesEffectNextLaunch": "Se aplica la próxima vez que se abra la app",
+ "settings.pinRequiredAfterInactivity": "Obligatorio tras la inactividad y al abrir la app",
+ "settings.pinScreenLockOnly": "El PIN bloquea esta ventana y los cambios de cuenta. No protege nada en el disco.",
+ "settings.unitSeconds": "segundos",
+ "settings.unitDays": "días",
+ "settings.telemetryLoadFailed": "No se pudo cargar la configuración de telemetría",
+ "palette.placeholder": "Escribe un comando o el nombre de una cuenta...",
+ "palette.noResults": "Ningún comando coincide",
+ "palette.sectionAccounts": "Cuentas",
+ "palette.sectionActions": "Acciones",
+ "palette.sectionNavigation": "Navegación",
+ "palette.openTab": "Ir a {platform}",
+ "palette.openFolder": "Abrir la carpeta \"{name}\"",
+ "palette.backToParent": "Volver a la carpeta superior",
+ "palette.zoomReset": "Restablecer el zoom"
+}
diff --git a/crates/accshift-app/i18n/fr.json b/crates/accshift-app/i18n/fr.json
new file mode 100644
index 00000000..ef59ede2
--- /dev/null
+++ b/crates/accshift-app/i18n/fr.json
@@ -0,0 +1,753 @@
+{
+ "app.loadingSettings": "Chargement des paramètres...",
+ "app.loading": "Chargement...",
+ "app.searchPlaceholder": "Rechercher un compte...",
+ "app.noAccountsFound": "Aucun compte {platform} trouvé",
+ "app.noAccountsHint": "Vérifie que {platform} est installé et que tu t'es connecté au moins une fois.",
+ "app.switchingAccount": "Changement de compte...",
+ "app.platformRestarting": "{platform} redémarre",
+ "app.comingSoon": "{platform} - Bientôt disponible",
+ "app.platformUnsupportedOs": "{platform} n'est pas encore disponible sur cet OS",
+ "app.noCompatiblePlatforms": "Aucune plateforme compatible n'est disponible sur cet OS",
+ "app.noCompatiblePlatformsHint": "Vérifie les mises à jour de support Windows ou utilise une machine compatible.",
+ "update.ctaAvailable": "Mise à jour dispo",
+ "update.ctaInstalling": "Installation...",
+ "update.restartToApplyVersion": "Redémarrer pour appliquer la mise à jour {version}",
+ "update.restartToApply": "Redémarrer pour appliquer la mise à jour",
+ "update.readyToastVersion": "Mise à jour {version} prête",
+ "update.readyToast": "Mise à jour prête",
+ "update.restartFailed": "Impossible de redémarrer pour appliquer la mise à jour",
+ "pin.lockedTitle": "Application verrouillée",
+ "pin.lockedPrompt": "Entre le PIN pour déverrouiller",
+ "pin.placeholder": "PIN 4 chiffres",
+ "pin.unlock": "Déverrouiller",
+ "pin.invalid": "PIN invalide",
+ "pin.tooManyAttempts": "Trop de tentatives. Réessayez dans {seconds} s.",
+ "common.ok": "OK",
+ "common.cancel": "Annuler",
+ "common.confirm": "Confirmer",
+ "common.close": "Fermer",
+ "common.back": "Retour",
+ "common.active": "Actif",
+ "common.choose": "Choisir...",
+ "common.none": "Aucun",
+ "common.custom": "Personnalisé",
+ "common.configured": "Configuré",
+ "common.missing": "Manquant",
+ "common.enabled": "Activé",
+ "common.disabled": "Désactivé",
+ "common.on": "Oui",
+ "common.off": "Non",
+ "common.add": "Ajouter",
+ "common.visible": "Visible",
+ "common.hidden": "Masqué",
+ "common.inline": "Sous la carte",
+ "common.tooltip": "Infobulle",
+ "titlebar.refresh": "Rafraîchir",
+ "titlebar.addAccount": "Ajouter un compte",
+ "titlebar.settings": "Paramètres",
+ "titlebar.personas": "Personas",
+ "titlebar.minimize": "Réduire",
+ "titlebar.maximize": "Agrandir",
+ "titlebar.restore": "Restaurer",
+ "titlebar.close": "Fermer",
+ "view.grid": "Vue grille",
+ "view.list": "Vue liste",
+ "settings.title": "Paramètres",
+ "settings.general": "Général",
+ "settings.appearance": "Apparence",
+ "settings.language": "Langue",
+ "settings.theme": "Thème",
+ "settings.uiZoom": "Zoom UI",
+ "settings.backgroundOpacity": "Opacité du fond",
+ "settings.animations": "Animations",
+ "settings.animationsSystem": "Suivre le système",
+ "settings.animationsOn": "Toujours actives",
+ "settings.animationsOff": "Désactivées",
+ "settings.performance": "Performance",
+ "settings.suspendGraphicsWhenMinimized": "Couper le rendu quand minimisé",
+ "settings.minimizeOnAccountSwitch": "Minimiser lors d'un changement de compte",
+ "settings.system": "Système",
+ "settings.startWithSystem": "Lancer au démarrage",
+ "settings.startWithSystemHint": "Démarre Accshift avec Windows, réduit dans la zone de notification.",
+ "settings.closeToTray": "Fermer vers la zone de notification",
+ "settings.closeToTrayHint": "Le bouton de fermeture masque Accshift dans la zone de notification au lieu de quitter.",
+ "settings.autostartFailed": "Impossible de modifier le lancement au démarrage.",
+ "tray.open": "Ouvrir Accshift",
+ "tray.quit": "Quitter",
+ "settings.platforms": "Plateformes",
+ "settings.platformSearchPlaceholder": "Rechercher une plateforme...",
+ "settings.platformSearchNoResults": "Aucune plateforme ne correspond à la recherche.",
+ "settings.accountDisplay": "Affichage des comptes",
+ "settings.startupAndExtras": "Démarrage",
+ "settings.defaultOnStartup": "Plateforme par défaut au démarrage",
+ "settings.platformDisabledSuffix": "(désactivé)",
+ "settings.platformUnsupportedOs": "OS non supporté",
+ "settings.platformNotImplemented": "Prévu",
+ "settings.platformUserProvided": "Ajoutée depuis votre dossier de descripteurs",
+ "settings.customPlatforms": "Plateformes personnalisées",
+ "settings.customPlatformsHint": "Les fichiers de descripteur de ce dossier sont lus au démarrage de l'application.",
+ "settings.customPlatformsNone": "Aucun descripteur chargé depuis ce dossier.",
+ "settings.customPlatformsProblems": "Fichiers non chargés",
+ "descriptor.addFromFile": "Ajouter depuis un fichier",
+ "descriptor.reload": "Recharger",
+ "descriptor.openFolder": "Ouvrir le dossier",
+ "descriptor.remove": "Supprimer",
+ "descriptor.removeConfirmTitle": "Supprimer {platform} ?",
+ "descriptor.removeConfirmMessage": "Son fichier de descripteur quitte votre dossier. Les comptes déjà capturés restent sur le disque.",
+ "descriptor.previewTitle": "Ajouter une plateforme",
+ "descriptor.previewOs": "Décrite pour {list}",
+ "descriptor.previewRoots": "Dossiers auxquels elle peut toucher",
+ "descriptor.previewSteps": "Ce que ferait un changement de compte",
+ "descriptor.previewWarnings": "Avertissements",
+ "descriptor.previewNoPlan": "Impossible de construire un essai à blanc : {problem}",
+ "descriptor.previewReplaces": "Ceci remplace le descripteur déjà présent dans votre dossier.",
+ "descriptor.previewNothingWritten": "Rien n'est écrit tant que vous n'avez pas ajouté.",
+ "descriptor.replace": "Remplacer",
+ "descriptor.installed": "{platform} ajoutée",
+ "descriptor.removed": "{platform} supprimée",
+ "descriptor.actionRead": "lire",
+ "descriptor.actionCapture": "capturer",
+ "descriptor.actionRestore": "restaurer",
+ "descriptor.actionDelete": "supprimer",
+ "descriptor.actionClose": "fermer",
+ "descriptor.actionLaunch": "lancer",
+ "settings.dataRefresh": "Rafraîchissement des données",
+ "settings.avatarRefresh": "Rafraîchissement avatar",
+ "settings.banCheckDelay": "Délai vérification ban",
+ "settings.refreshNow": "Rafraîchir maintenant",
+ "settings.zeroEachLaunch": "0 = à chaque lancement",
+ "settings.privacy": "Confidentialité",
+ "settings.inactivityTimeout": "Délai d'inactivité",
+ "settings.zeroDisabled": "0 = désactivé",
+ "settings.streamerMode": "Mode streamer",
+ "settings.streamerModeHint": "Floute automatiquement les infos des comptes quand un logiciel de streaming tourne.",
+ "settings.personasHint": "Afficher le sélecteur d'identités personas",
+ "settings.replayOnboarding": "Refaire l'onboarding",
+ "settings.replayOnboardingHint": "Réaffiche la visite guidée et le choix des statistiques d'usage.",
+ "streamer.title": "Mode streamer",
+ "streamer.disable": "Désactiver",
+ "streamer.disablePermanently": "Désactiver définitivement",
+ "personas.title": "Personas",
+ "personas.create": "Nouveau persona",
+ "personas.activate": "Basculer vers ce persona",
+ "personas.edit": "Modifier",
+ "personas.delete": "Supprimer",
+ "personas.finish": "Terminer",
+ "personas.switching": "Bascule en cours...",
+ "personas.switched": "Basculé vers {name}",
+ "personas.switchPartial": "{name} : échec sur {failed}",
+ "personas.switchFailed": "Impossible de basculer vers {name}",
+ "personas.namePlaceholder": "Nom du persona",
+ "personas.choosePlatforms": "Choisis un compte pour chaque plateforme à inclure",
+ "personas.chooseAccount": "Choisis le compte {platform}",
+ "personas.removeFromPersona": "Retirer de ce persona",
+ "personas.customImage": "Choisir une image...",
+ "personas.removeImage": "Retirer l'image",
+ "personas.imageError": "Impossible de charger cette image.",
+ "personas.loadingAccounts": "Chargement des comptes...",
+ "personas.noAccountsOnPlatform": "Aucun compte sur cette plateforme pour l'instant",
+ "personas.emptyHint": "Un clic bascule chaque plateforme incluse vers son compte.",
+ "settings.security": "Sécurité",
+ "settings.pinLockOnAfk": "Verrou PIN en AFK",
+ "settings.pinCode": "Code PIN",
+ "settings.pinPlaceholder": "4 chiffres",
+ "settings.pinCurrentCode": "PIN actuel",
+ "settings.pinCurrentHint": "Saisissez le PIN actuel pour le modifier ou désactiver le verrou.",
+ "settings.telemetry": "Statistiques d'utilisation (anonymes)",
+ "settings.telemetryModeA": "Stats anonymes de base",
+ "settings.telemetryModeAHint": "Compte les lancements et les fonctionnalités utilisées. Un identifiant local aléatoire évite les doublons d'installation ; aucune donnée personnelle n'est envoyée.",
+ "settings.telemetryModeB": "Stats avancées avec UUID local (opt-in)",
+ "settings.telemetryModeBHint": "Ajoute un UUID aléatoire stocké uniquement sur ta machine. Permet de mesurer la rétention et quelles fonctionnalités comptent. Toujours aucune donnée personnelle envoyée.",
+ "settings.telemetryExport": "Exporter mes données",
+ "settings.telemetryExported": "Données copiées dans le presse-papiers",
+ "settings.telemetryExportFailed": "Échec de l'export",
+ "settings.telemetryEnableFailed": "Impossible d'activer les stats avancées",
+ "settings.telemetryDisableFailed": "Impossible de désactiver les stats avancées",
+ "settings.telemetryDeletePending": "Les stats avancées sont désactivées ; il faudra réessayer l'effacement serveur",
+ "settings.telemetryDeletePendingHint": "L'effacement serveur est en attente. L'ancien identifiant local est conservé uniquement pour réessayer l'effacement ou exporter les données associées.",
+ "settings.telemetryRetryDelete": "Réessayer l'effacement",
+ "settings.telemetryDeleteCompleted": "Données serveur effacées",
+ "settings.telemetryDeleteRetryFailed": "L'effacement serveur est toujours en attente",
+ "settings.telemetryLearnMore": "Quelles données sont envoyées ?",
+ "onboarding.welcome.title": "Bienvenue dans Accshift",
+ "onboarding.welcome.version": "v{version}",
+ "onboarding.welcome.compatibleWith": "Ton système d'exploitation est compatible avec :",
+ "onboarding.welcome.detectedPlatforms": "Voici les plateformes détectées sur ta machine :",
+ "onboarding.welcome.next": "Fais-moi visiter",
+ "onboarding.welcome.skip": "Passer",
+ "onboarding.features.hint": "Cette partie de l'app n'est pas visible pour l'instant.",
+ "onboarding.features.addAccount.label": "Ajouter un compte",
+ "onboarding.features.addAccount.body": "Le bouton + en haut à droite ajoute un compte sur la plateforme active. Tu te connectes une fois, Accshift le garde.",
+ "onboarding.features.switch.label": "Changer de compte",
+ "onboarding.features.switch.body": "Clique sur une carte et t'es sur ce compte. C'est toute l'app, honnêtement.",
+ "onboarding.features.contextMenu.label": "Clic droit pour les actions",
+ "onboarding.features.contextMenu.body": "Clic droit sur une carte pour la renommer, changer sa couleur, la ranger dans un dossier ou la supprimer.",
+ "onboarding.features.platformSwitch.label": "Changer de plateforme",
+ "onboarding.features.platformSwitch.body": "Pareil pour Riot, Battle.net, Epic et les autres. Les onglets en haut changent de plateforme.",
+ "onboarding.features.next": "Suivant",
+ "onboarding.features.back": "Retour",
+ "onboarding.features.step": "Étape {step}",
+ "onboarding.features.mockRename": "Renommer",
+ "onboarding.features.mockSetColor": "Définir la couleur",
+ "onboarding.features.mockMoveToFolder": "Déplacer vers un dossier",
+ "onboarding.features.mockDelete": "Supprimer",
+ "onboarding.features.mockAccount": "Compte {number}",
+ "onboarding.telemetry.title": "VENDS TON ÂME À ACCSHIFT !",
+ "onboarding.telemetry.intro": "Accshift compte quelques stats d'utilisation anonymes pour que je sache quoi corriger en premier. Rien de personnel ne quitte ta machine, l'app marche pareil dans tous les cas, et tu peux changer d'avis quand tu veux dans les paramètres.",
+ "onboarding.telemetry.question": "Marché conclu ?",
+ "onboarding.telemetry.gifAlt": "Mème Trade Offer",
+ "onboarding.telemetry.basic": "NON ! ça suffit",
+ "onboarding.telemetry.basicDefault": "(par défaut)",
+ "onboarding.telemetry.basicHint": "Des compteurs anonymes et rien d'autre : aucun profil, aucun identifiant qui te suit.",
+ "onboarding.telemetry.deal": "MARCHÉ CONCLU",
+ "onboarding.telemetry.dealHint": "Ajoute un UUID distinct pour les stats avancées, stocké uniquement sur ta machine. Je ne sais toujours pas qui tu es, mais tu aides beaucoup. Merci !",
+ "onboarding.telemetry.optOutNote": "Quel que soit ton choix, tu pourras le changer plus tard dans Paramètres -> Confidentialité. :c",
+ "onboarding.telemetry.refuse": "Non merci, tout couper",
+ "onboarding.telemetry.refuseHint": "Rien n'est mesuré, rien n'est envoyé, pas même les compteurs anonymes.",
+ "onboarding.telemetry.back": "Retour",
+ "onboarding.persistFailed": "Impossible d'enregistrer ce choix. Réessaie.",
+ "onboarding.persistLater": "Me redemander au prochain lancement",
+ "settings.steam": "Steam",
+ "settings.riot": "Riot",
+ "settings.battleNet": "Battle.net",
+ "settings.ubisoft": "Ubisoft Connect",
+ "settings.runSteamAsAdmin": "Lancer Steam en admin",
+ "settings.showUsernames": "Afficher les usernames",
+ "settings.showSteamLastLogin": "Afficher la dernière connexion Steam",
+ "settings.showRiotLastLogin": "Afficher la dernière connexion Riot",
+ "settings.showBattleNetLastLogin": "Afficher la dernière connexion Battle.net",
+ "settings.showUbisoftLastLogin": "Afficher la dernière connexion Ubisoft",
+ "settings.showNotesUnderCards": "Afficher les notes sous les cartes",
+ "settings.expandedFolders": "Tout dérouler les dossiers",
+ "list.rootSection": "Racine",
+ "settings.steamLaunch": "Bascule",
+ "settings.steamInstallation": "Installation",
+ "settings.steamApiAndData": "API & données",
+ "settings.launchOptions": "Options de lancement",
+ "settings.shutdownMode": "Mode d'arrêt",
+ "settings.shutdownModeGraceful": "Gracieux",
+ "settings.shutdownModeForce": "Force kill",
+ "settings.autoDetected": "Détection auto",
+ "settings.steamFolder": "Dossier Steam",
+ "settings.steamFolderRegistry": "Registre",
+ "settings.riotClientPath": "Exécutable du client Riot",
+ "settings.battleNetPath": "Exécutable Battle.net",
+ "settings.ubisoftPath": "Dossier Ubisoft Connect",
+ "settings.steamWebApiKey": "Clé API Steam Web",
+ "settings.getKey": "Obtenir la clé",
+ "settings.pasteApiKey": "Colle ta clé API Steam Web",
+ "settings.saved": "Paramètres enregistrés",
+ "settings.openApiKeyFailed": "Impossible d'ouvrir la page de clé API Steam",
+ "settings.integrations": "Intégrations",
+ "settings.deepLinks": "Autoriser les liens accshift://",
+ "settings.deepLinksHint": "Laisse d'autres applications changer de compte pour toi : favoris, Stream Deck, scripts.",
+ "settings.cliEnabled": "Autoriser le CLI accshift",
+ "settings.cliEnabledHint": "Laisse l'outil en ligne de commande lister et changer de compte. Désactivé, toute commande accshift refuse de s'exécuter, diag compris ; l'application elle-même n'est pas concernée.",
+ "settings.help": "Ouvrir le wiki accshift",
+ "settings.helpShort": "Aide",
+ "settings.openHelpFailed": "Impossible d'ouvrir le wiki",
+ "settings.logs": "Logs",
+ "settings.openLogs": "Ouvrir le dossier des logs",
+ "settings.openLogsFailed": "Impossible d'ouvrir le dossier des logs",
+ "context.loading": "Chargement...",
+ "context.noGamesFound": "Aucun jeu trouvé",
+ "context.field.cut": "Couper",
+ "context.field.copy": "Copier",
+ "context.field.paste": "Coller",
+ "context.field.selectAll": "Tout sélectionner",
+ "context.menu.newFolder": "Nouveau dossier",
+ "context.menu.refresh": "Rafraîchir",
+ "context.menu.rename": "Renommer",
+ "context.menu.copy": "Copier...",
+ "context.menu.deleteFolder": "Supprimer le dossier",
+ "context.menu.folderColor": "Couleur du dossier",
+ "context.menu.moveToFolder": "Déplacer vers un dossier",
+ "context.menu.moveToRoot": "Aucun dossier",
+ "context.menu.editCardAndColor": "Modifier carte et couleur",
+ "context.menu.cardColor": "Couleur de carte",
+ "context.menu.addNote": "Ajouter une note",
+ "context.menu.editNote": "Modifier la note",
+ "platform.rename": "Renommer",
+ "platform.renameTitle": "Renommer le compte",
+ "platform.renamePlaceholder": "Nom du compte",
+ "platform.newAccountPending": "En attente...",
+ "platform.setupBusy": "Une autre opération accshift est en cours. En attente de sa fin.",
+ "platform.renameNewAccount": "Nommer ce compte",
+ "platform.copyLabelAccountId": "ID de compte",
+ "platform.forget": "Oublier",
+ "platform.forgetConfirmTitle": "Oublier \"{display}\" ?",
+ "platform.forgetConfirmMessage": "Ce compte et sa session sauvegardée seront retirés d'Accshift.",
+ "platform.forgotAccount": "{display} oublié",
+ "dialog.newFolderTitle": "Nouveau dossier",
+ "dialog.renameFolderTitle": "Renommer le dossier",
+ "dialog.folderNamePlaceholder": "Nom du dossier",
+ "dialog.cardNoteTitle": "Note de carte",
+ "dialog.cardNotePlaceholder": "Écris une note courte",
+ "card.noteAttached": "Note attachée",
+ "card.clickAgainToSwitch": "Cliquez encore pour changer",
+ "card.extensionWarnings": "Alertes",
+ "card.extensionNote": "Note",
+ "card.cs2Section": "CS2",
+ "card.cs2Level": "Niveau {level}",
+ "card.cs2CaseEarned": "Caisse hebdo obtenue",
+ "card.cs2CaseNotEarned": "Caisse hebdo à faire",
+ "list.selectAccountPreview": "Sélectionne un compte pour l'aperçu",
+ "preview.noteLabel": "Note",
+ "preview.currentlyActive": "Compte actuellement actif",
+ "preview.switchAgain": "Rebasculer",
+ "preview.switchAccount": "Changer de compte",
+ "ban.community": "Ban communautaire",
+ "ban.vac.single": "{count} ban VAC",
+ "ban.vac.multiple": "{count} bans VAC",
+ "ban.game.single": "{count} ban jeu",
+ "ban.game.multiple": "{count} bans jeu",
+ "time.unknown": "inconnu",
+ "time.justNow": "à l'instant",
+ "time.minuteAgo": "il y a {count} minute",
+ "time.minutesAgo": "il y a {count} minutes",
+ "time.hourAgo": "il y a {count} heure",
+ "time.hoursAgo": "il y a {count} heures",
+ "time.dayAgo": "il y a {count} jour",
+ "time.daysAgo": "il y a {count} jours",
+ "time.neverConnected": "jamais connecté",
+ "time.compactWrapper": "({value})",
+ "toast.copied": "{label} copié",
+ "toast.legacyConfigMigrated": "Paramètres migrés vers le nouveau format",
+ "toast.legacyConfigMigrationFailed": "La migration des anciens paramètres a échoué",
+ "toast.failedLoadSettingsPanel": "Impossible de charger le panneau paramètres",
+ "toast.banChecking": "Vérification des bans...",
+ "toast.banCheckSummary.single": "Vérification: {count} compte avec ban",
+ "toast.banCheckSummary.multiple": "Vérification: {count} comptes avec ban",
+ "toast.banCheckFailed": "Échec de la vérification des bans: {error}",
+ "toast.avatarRefreshComplete": "Rafraîchissement avatar terminé pour {count} comptes",
+ "toast.banRefreshComplete": "Rafraîchissement des bans terminé pour {count} comptes",
+ "toast.banRefreshNoApiKey": "Rafraîchissement des bans ignoré : ajoute une clé Steam Web API dans les paramètres",
+ "toast.refreshPartial": "Rafraîchissement terminé pour {ok} comptes sur {count}",
+ "toast.noSteamAccountsFound": "Aucun compte Steam trouvé. Connecte-toi à Steam au moins une fois puis rafraîchis.",
+ "toast.accountsRefreshed.single": "{count} compte rafraîchi",
+ "toast.accountsRefreshed.multiple": "{count} comptes rafraîchis",
+ "toast.steamFolderNotFound": "Dossier Steam introuvable. Configure-le manuellement dans Paramètres > Dossier Steam.",
+ "toast.steamElevated": "Steam tourne en admin. Active 'Lancer Steam en admin' dans Paramètres > Steam.",
+ "toast.noRiotProfilesFound": "Aucun profil Riot pour l'instant. Clique sur + pour en ajouter un.",
+ "toast.noBattleNetAccountsFound": "Aucun compte Battle.net trouvé. Connecte-toi à Battle.net au moins une fois puis rafraîchis.",
+ "toast.noUbisoftAccountsFound": "Aucun compte Ubisoft trouvé. Connecte-toi à Ubisoft Connect au moins une fois puis rafraîchis.",
+ "toast.deepLinkInvalid": "Lien accshift:// non reconnu",
+ "toast.deepLinkDisabled": "Les liens accshift:// sont désactivés dans les paramètres",
+ "toast.deepLinkUnknownPlatform": "Plateforme inconnue dans le lien : {platform}",
+ "toast.deepLinkPlatformDisabled": "{platform} est désactivé dans les paramètres",
+ "toast.deepLinkAccountNotFound": "Aucun compte {platform} correspondant à \"{account}\"",
+ "toast.deepLinkSwitched": "Basculé sur {account}",
+ "dialog.deepLinkSwitchTitle": "Changer de compte ?",
+ "dialog.deepLinkSwitchMessage": "Un lien accshift:// demande à basculer votre compte {platform} sur « {account} ». Continuer ?",
+ "dialog.deepLinkSwitchConfirm": "Basculer",
+ "steam.launchOnline": "Basculer en ligne",
+ "steam.launchInvisible": "Basculer en invisible",
+ "steam.switchAndRunGame": "Basculer + lancer {game}",
+ "steam.switchAndRunPick": "Basculer + lancer un jeu…",
+ "steam.runGame": "Lancer {game}",
+ "steam.runPick": "Lancer un jeu…",
+ "steam.switchAndRunNoGames": "Aucun jeu trouvé",
+ "steam.clearDefaultGame": "Oublier le jeu par défaut",
+ "steam.copySteamId64": "Copier SteamID64",
+ "steam.copyFriendCode": "Copier le code ami",
+ "steam.copyProfileUrl": "Copier l'URL du profil",
+ "steam.copyLabelUsername": "Login",
+ "steam.copyLabelSteamId64": "SteamID64",
+ "steam.copyLabelFriendCode": "Code ami",
+ "steam.copyLabelProfileUrl": "URL du profil",
+ "steam.openUserdataFolder": "Ouvrir le dossier userdata",
+ "steam.clearIntegratedBrowserCache": "Réinitialiser la session navigateur",
+ "steam.clearIntegratedBrowserCacheConfirmTitle": "Réinitialiser la session navigateur Steam ?",
+ "steam.clearIntegratedBrowserCacheConfirmMessage": "Cela ferme Steam et vide le cache du navigateur intégré utilisé par le magasin et la communauté.",
+ "steam.clearedIntegratedBrowserCache": "Session navigateur Steam réinitialisée",
+ "steam.copySettingsFrom": "Copier les paramètres depuis",
+ "steam.copiedSettingsToCurrent": "Paramètres de {game} copiés vers le compte courant",
+ "steam.forget": "Oublier",
+ "steam.forgetConfirmTitle": "Oublier \"{display}\" ?",
+ "steam.forgetConfirmMessage": "Ce compte sera retiré de ta liste de comptes Steam sur ce PC.",
+ "steam.forgotAccount": "{username} oublié",
+ "steam.setupPendingLabel": "Compte Steam",
+ "steam.setupWaitingForClient": "En attente de Steam...",
+ "steam.setupWaitingForLogin": "Connecte-toi au compte Steam que tu veux ajouter.",
+ "steam.setupDetected": "Compte détecté",
+ "steam.setupConnected": "Connecté",
+ "steam.setupReady": "Compte Steam ajouté",
+ "steam.setupReadyWithProfile": "{profile} ajouté",
+ "steam.setupFailed": "Échec de la configuration Steam",
+ "steam.setupFailedMessage": "Accshift n'a pas pu finaliser l'ajout de ce compte Steam.",
+ "riot.captureSession": "Capturer la session actuelle",
+ "riot.recaptureSession": "Recapturer la session",
+ "riot.capturedSession": "Session capturée pour {profile}",
+ "riot.setupPendingLabel": "Compte Riot",
+ "riot.setupWaitingForClient": "En attente du client Riot...",
+ "riot.setupWaitingForLogin": "Connecte-toi au compte Riot que tu veux ajouter.",
+ "riot.setupCapturing": "Sauvegarde de la session Riot...",
+ "riot.setupReady": "Compte Riot ajouté",
+ "riot.setupReadyWithProfile": "{profile} ajouté",
+ "riot.setupFailed": "Échec de la configuration Riot",
+ "riot.setupFailedMessage": "Accshift n'a pas pu finaliser l'ajout de ce compte Riot.",
+ "riot.setupStaySignedIn": "Garde 'Rester connecté' activé.",
+ "riot.setupDetected": "Compte détecté",
+ "riot.setupConnected": "Connecté",
+ "riot.forget": "Oublier le compte",
+ "riot.forgetConfirmTitle": "Oublier \"{display}\" ?",
+ "riot.forgetConfirmMessage": "Cela retire le profil Riot local et sa session sauvegardée d'Accshift.",
+ "riot.forgotProfile": "{profile} oublié",
+ "battlenet.copyUsername": "Copier le pseudo",
+ "battlenet.copyLabelUsername": "Pseudo",
+ "battlenet.copyEmail": "Copier l'email",
+ "battlenet.copyLabelEmail": "Email",
+ "battlenet.forget": "Oublier",
+ "battlenet.forgetConfirmTitle": "Oublier \"{display}\" ?",
+ "battlenet.forgetConfirmMessage": "Ce compte sera retiré de la liste de comptes Battle.net sur ce PC.",
+ "battlenet.forgotAccount": "{email} oublié",
+ "battlenet.setupPendingLabel": "Compte Battle.net",
+ "battlenet.setupWaitingForClient": "En attente de Battle.net...",
+ "battlenet.setupWaitingForLogin": "Connecte-toi au compte Battle.net que tu veux ajouter.",
+ "battlenet.setupKeepMeLoggedIn": "Garde 'Rester connecté' activé si possible.",
+ "battlenet.setupDetected": "Compte détecté",
+ "battlenet.setupConnected": "Connecté",
+ "battlenet.setupReady": "Compte Battle.net ajouté",
+ "battlenet.setupReadyWithProfile": "{profile} ajouté",
+ "battlenet.setupFailed": "Échec de la configuration Battle.net",
+ "battlenet.setupFailedMessage": "Accshift n'a pas pu finaliser l'ajout de ce compte Battle.net.",
+ "ubisoft.copyLabelUuid": "UUID",
+ "ubisoft.forget": "Oublier",
+ "ubisoft.forgetConfirmTitle": "Oublier \"{display}\" ?",
+ "ubisoft.forgetConfirmMessage": "Ce compte et sa session sauvegardée seront retirés d'Accshift.",
+ "ubisoft.forgotAccount": "{display} oublié",
+ "ubisoft.setupPendingLabel": "Compte Ubisoft",
+ "ubisoft.setupWaitingForClient": "En attente d'Ubisoft Connect...",
+ "ubisoft.setupWaitingForLogin": "Connecte-toi au compte Ubisoft que tu veux ajouter.",
+ "ubisoft.setupKeepMeLoggedIn": "Garde 'Se souvenir de moi' activé.",
+ "ubisoft.setupDetected": "Compte détecté",
+ "ubisoft.setupConnected": "Connecté",
+ "ubisoft.setupReady": "Compte Ubisoft ajouté",
+ "ubisoft.setupReadyWithProfile": "{profile} ajouté",
+ "ubisoft.setupFailed": "Échec de la configuration Ubisoft",
+ "ubisoft.setupFailedMessage": "Accshift n'a pas pu finaliser l'ajout de ce compte Ubisoft.",
+ "settings.roblox": "Roblox",
+ "toast.noRobloxAccountsFound": "Aucun compte Roblox trouvé. Ajoute un compte via Quick Login ou colle un cookie.",
+ "roblox.noAccountsHint": "Appuie sur + pour ajouter un compte Roblox via Quick Login.",
+ "roblox.sessionExpired": "Session expirée",
+ "roblox.sessionExpiredTooltip": "Ce compte est déconnecté. Reconnecte-le avant de switcher.",
+ "roblox.sessionExpiredSwitchError": "Session expirée. Re-lie ce compte pour switcher. Notes et réglages conservés.",
+ "roblox.cookiePasteTitle": "Ajouter un compte par cookie",
+ "roblox.cookiePasteHint": "Colle un cookie .ROBLOSECURITY depuis ton navigateur pour ajouter un compte directement.",
+ "settings.showRobloxLastLogin": "Afficher la dernière connexion",
+ "settings.robloxHealthCheck": "Vérification de session",
+ "settings.robloxHealthCheckHint": "Signale les comptes dont la session Roblox a expiré ; une requête réseau par lancement.",
+ "roblox.copyLabelUsername": "Pseudo",
+ "roblox.copyLabelUserId": "ID utilisateur",
+ "roblox.forget": "Oublier",
+ "roblox.forgetConfirmTitle": "Oublier \"{display}\" ?",
+ "roblox.forgetConfirmMessage": "Ce compte et son cookie stocké seront supprimés de ce PC.",
+ "roblox.forgotAccount": "{display} oublié",
+ "roblox.setupPendingLabel": "Compte Roblox",
+ "roblox.setupWaitingForClient": "Connexion à Roblox...",
+ "roblox.setupWaitingForLogin": "Ouvre l'app Roblox sur un autre appareil et entre le code ci-dessous.",
+ "roblox.setupQuickLoginCode": "Code Quick Login",
+ "roblox.setupQuickLoginHint": "roblox.com/quick-login",
+ "roblox.copyCode": "Copier le code",
+ "roblox.setupDetected": "Compte détecté",
+ "roblox.setupConnected": "Connecté",
+ "roblox.setupReady": "Compte Roblox ajouté",
+ "roblox.setupReadyWithProfile": "{profile} ajouté",
+ "roblox.setupFailed": "Échec de la configuration Roblox",
+ "roblox.setupFailedMessage": "Accshift n'a pas pu finaliser l'ajout de ce compte Roblox.",
+ "settings.epic": "Epic Games",
+ "settings.epicPath": "Exécutable Epic Games Launcher",
+ "settings.showEpicLastLogin": "Afficher la dernière connexion",
+ "toast.noEpicAccountsFound": "Aucun compte Epic Games trouvé. Connecte-toi à Epic Games Launcher au moins une fois puis rafraîchis.",
+ "epic.noAccountsHint": "Appuie sur + pour ajouter un compte Epic Games.",
+ "epic.copyLabelAccountId": "ID de compte",
+ "epic.forget": "Oublier",
+ "epic.forgetConfirmTitle": "Oublier \"{display}\" ?",
+ "epic.forgetConfirmMessage": "Ce compte et sa session sauvegardée seront retirés d'Accshift.",
+ "epic.forgotAccount": "{display} oublié",
+ "epic.setupPendingLabel": "Compte Epic Games",
+ "epic.setupWaitingForClient": "En attente d'Epic Games Launcher...",
+ "epic.setupWaitingForLogin": "Connecte-toi au compte Epic Games que tu veux ajouter.",
+ "epic.setupKeepMeLoggedIn": "Garde 'Se souvenir de moi' activé.",
+ "epic.setupDetected": "Compte détecté",
+ "epic.setupConnected": "Connecté",
+ "epic.setupReady": "Compte Epic Games ajouté",
+ "epic.setupReadyWithProfile": "{profile} ajouté",
+ "epic.setupFailed": "Échec de la configuration Epic Games",
+ "epic.setupFailedMessage": "Accshift n'a pas pu finaliser l'ajout de ce compte Epic Games.",
+ "settings.gog": "GOG Galaxy",
+ "settings.gogPath": "Exécutable GOG Galaxy",
+ "settings.showGogLastLogin": "Afficher la dernière connexion",
+ "toast.noGogAccountsFound": "Aucun compte GOG Galaxy trouvé. Connecte-toi à GOG Galaxy au moins une fois puis rafraîchis.",
+ "gog.noAccountsHint": "Appuie sur + pour ajouter un compte GOG Galaxy.",
+ "gog.copyLabelAccountId": "ID de compte",
+ "gog.forget": "Oublier",
+ "gog.forgetConfirmTitle": "Oublier \"{display}\" ?",
+ "gog.forgetConfirmMessage": "Ce compte et sa session sauvegardée seront retirés d'Accshift.",
+ "gog.forgotAccount": "{display} oublié",
+ "gog.setupPendingLabel": "Compte GOG Galaxy",
+ "gog.setupWaitingForClient": "En attente de GOG Galaxy...",
+ "gog.setupWaitingForLogin": "Connecte-toi au compte GOG Galaxy que tu veux ajouter.",
+ "gog.setupKeepMeLoggedIn": "Garde 'Rester connecté' activé.",
+ "gog.setupDetected": "Compte détecté",
+ "gog.setupConnected": "Connecté",
+ "gog.setupReady": "Compte GOG Galaxy ajouté",
+ "gog.setupReadyWithProfile": "{profile} ajouté",
+ "gog.setupFailed": "Échec de la configuration GOG Galaxy",
+ "gog.setupFailedMessage": "Accshift n'a pas pu finaliser l'ajout de ce compte GOG Galaxy.",
+ "settings.jagex": "Jagex Launcher",
+ "settings.jagexPath": "Exécutable Jagex Launcher",
+ "settings.showJagexLastLogin": "Afficher la dernière connexion",
+ "toast.noJagexAccountsFound": "Aucun compte Jagex enregistré. Appuie sur + pour en ajouter un via le Jagex Launcher.",
+ "jagex.noAccountsHint": "Appuie sur + pour ajouter un compte Jagex.",
+ "jagex.copyLabelAccountId": "ID de compte",
+ "jagex.forget": "Oublier",
+ "jagex.forgetConfirmTitle": "Oublier \"{display}\" ?",
+ "jagex.forgetConfirmMessage": "Ce compte et sa session sauvegardée seront retirés d'Accshift.",
+ "jagex.forgotAccount": "{display} oublié",
+ "jagex.setupPendingLabel": "Compte Jagex",
+ "jagex.setupWaitingForClient": "En attente du Jagex Launcher...",
+ "jagex.setupWaitingForLogin": "Connecte-toi au compte Jagex que tu veux ajouter.",
+ "jagex.setupKeepMeLoggedIn": "Garde 'Se souvenir de moi' activé.",
+ "jagex.setupDetected": "Compte détecté",
+ "jagex.setupConnected": "Connecté",
+ "jagex.setupReady": "Compte Jagex ajouté",
+ "jagex.setupReadyWithProfile": "{profile} ajouté",
+ "jagex.setupFailed": "Échec de la configuration Jagex",
+ "jagex.setupFailedMessage": "Accshift n'a pas pu finaliser l'ajout de ce compte Jagex.",
+ "settings.discord": "Discord",
+ "settings.discordPath": "Exécutable Discord",
+ "settings.showDiscordLastLogin": "Afficher la dernière connexion",
+ "toast.noDiscordAccountsFound": "Aucun compte Discord trouvé. Ajoute un compte Discord puis rafraîchis.",
+ "discord.noAccountsHint": "Appuie sur + pour ajouter un compte Discord.",
+ "discord.copyLabelAccountId": "ID de compte",
+ "discord.forget": "Oublier",
+ "discord.forgetConfirmTitle": "Oublier \"{display}\" ?",
+ "discord.forgetConfirmMessage": "Ce compte et sa session sauvegardée seront retirés d'Accshift.",
+ "discord.forgotAccount": "{display} oublié",
+ "discord.setupPendingLabel": "Compte Discord",
+ "discord.setupWaitingForClient": "En attente de Discord...",
+ "discord.setupWaitingForLogin": "Connecte-toi au compte Discord que tu veux ajouter.",
+ "discord.setupKeepMeLoggedIn": "Reste connecté pour conserver ce compte.",
+ "discord.setupDetected": "Compte détecté",
+ "discord.setupConnected": "Connecté",
+ "discord.setupReady": "Compte Discord ajouté",
+ "discord.setupReadyWithProfile": "{profile} ajouté",
+ "discord.setupFailed": "Échec de la configuration Discord",
+ "discord.setupFailedMessage": "Accshift n'a pas pu finaliser l'ajout de ce compte Discord.",
+ "color.none": "Défaut",
+ "color.blue": "Bleu",
+ "color.cyan": "Cyan",
+ "color.green": "Vert",
+ "color.lime": "Citron vert",
+ "color.yellow": "Jaune",
+ "color.orange": "Orange",
+ "color.red": "Rouge",
+ "color.pink": "Rose",
+ "color.violet": "Violet",
+ "color.gray": "Gris",
+ "language.english": "English",
+ "language.french": "Français",
+ "language.spanish": "Español",
+ "language.portuguese": "Português (Portugal)",
+ "language.portugueseBrazil": "Português (Brasil)",
+ "language.russian": "Русский",
+ "language.chinese": "简体中文",
+ "theme.dark": "Sombre",
+ "theme.light": "Clair",
+ "theme.midnight": "Minuit",
+ "theme.glassDark": "Verre sombre",
+ "theme.glassLight": "Verre clair",
+ "theme.liquidGlass": "Verre liquide",
+ "theme.custom": "Personnalisé",
+ "settings.themeImport": "Importer",
+ "settings.themeExport": "Exporter",
+ "settings.themeDelete": "Supprimer le thème",
+ "settings.themeImported": "Thème importé",
+ "settings.themeDeleted": "Thème supprimé",
+ "settings.themeExportCopied": "JSON du thème copié dans le presse-papiers",
+ "settings.themeInvalidJson": "JSON de thème invalide",
+ "settings.themeCustomize": "Personnaliser",
+ "settings.themeEdit": "Modifier",
+ "settings.themeCopyName": "{name} copie",
+ "settings.themeSaved": "Thème enregistré",
+ "settings.themeMigrated": "Thème importé et mis au format actuel",
+ "settings.themeInvalidId": "L'identifiant du thème est absent ou invalide",
+ "settings.themeInvalidName": "Le thème n'a pas de nom",
+ "settings.themeUnsupportedVersion": "Ce thème nécessite une version plus récente d'accshift",
+ "themeGroup.surface": "Surfaces",
+ "themeGroup.text": "Texte",
+ "themeGroup.semantic": "Couleurs d'état",
+ "themeGroup.shape": "Forme et densité",
+ "themeGroup.typography": "Typographie",
+ "themeGroup.motion": "Mouvement",
+ "themeKind.rgbTriplet": "triplet RVB",
+ "themeKind.hexColor": "couleur hexadécimale",
+ "themeKind.color": "couleur",
+ "themeKind.length": "longueur",
+ "themeKind.shadow": "ombre",
+ "themeKind.choice": "choix",
+ "themeKind.fontStack": "police",
+ "themeKind.signedLength": "espacement",
+ "themeKind.gradient": "dégradé",
+ "themeKind.number": "nombre",
+ "themeDensity.compact": "Compact",
+ "themeDensity.cozy": "Normal",
+ "themeDensity.comfortable": "Confortable",
+ "themeAvatarShape.circle": "Rond",
+ "themeAvatarShape.rounded": "Arrondi",
+ "themeAvatarShape.square": "Carré",
+ "themeSmoothing.auto": "Lissé",
+ "themeSmoothing.none": "Pixel",
+ "themeToken.bgRgb": "Fond de la fenêtre",
+ "themeToken.bgCard": "Fond des cartes",
+ "themeToken.bgCardHover": "Fond des cartes au survol",
+ "themeToken.bgMuted": "Fond atténué",
+ "themeToken.bgElevated": "Fond en relief",
+ "themeToken.border": "Bordures",
+ "themeToken.fg": "Texte principal",
+ "themeToken.fgMuted": "Texte secondaire",
+ "themeToken.fgSubtle": "Texte discret",
+ "themeToken.afkText": "Mention absent",
+ "themeToken.accent": "Accent",
+ "themeToken.accentFg": "Texte sur l'accent",
+ "themeToken.success": "Succès",
+ "themeToken.warning": "Avertissement",
+ "themeToken.danger": "Danger",
+ "themeToken.radiusSm": "Petit arrondi",
+ "themeToken.radiusMd": "Arrondi moyen",
+ "themeToken.radiusLg": "Grand arrondi",
+ "themeToken.elevationLow": "Ombre légère",
+ "themeToken.elevationMedium": "Ombre moyenne",
+ "themeToken.elevationHigh": "Ombre forte",
+ "themeToken.density": "Densité",
+ "themeToken.fontUi": "Police de l'interface",
+ "themeToken.bgImage": "Dégradé de la fenêtre",
+ "themeToken.cardBgImage": "Dégradé des surfaces",
+ "themeToken.borderWidth": "Épaisseur des bordures",
+ "themeToken.borderStyle": "Style des bordures",
+ "themeToken.avatarShape": "Forme des avatars",
+ "themeToken.focusRing": "Contour de focus",
+ "themeToken.overlayBlur": "Flou d'arrière-plan",
+ "themeToken.fontDisplay": "Police des titres",
+ "themeToken.lineHeight": "Hauteur de ligne",
+ "themeToken.letterSpacing": "Interlettrage",
+ "themeToken.labelCase": "Casse des libellés",
+ "themeToken.fontSmoothing": "Lissage du texte",
+ "themeToken.motionScale": "Vitesse des animations",
+ "themeEditor.title": "Éditeur de thème",
+ "themeEditor.name": "Nom",
+ "themeEditor.author": "Auteur",
+ "themeEditor.version": "Version",
+ "themeEditor.base": "Hérite de",
+ "themeEditor.colorScheme": "Mode de couleurs",
+ "themeEditor.glass": "Surfaces translucides",
+ "themeEditor.inherited": "Hérité",
+ "themeEditor.builtInBase": "Thème intégré",
+ "themeEditor.reset": "Revenir à la valeur héritée",
+ "themeEditor.issues": "Vérifications",
+ "themeEditor.noIssues": "Rien à signaler",
+ "themeEditor.fixErrorsFirst": "Corrigez les valeurs refusées avant d'enregistrer",
+ "themeEditor.save": "Enregistrer",
+ "themeEditor.saveFailed": "Impossible d'enregistrer le thème. Réessaie.",
+ "themeEditor.export": "Copier",
+ "themeEditor.issueInvalidValue": "{token} : {kind} invalide, par exemple {example}",
+ "themeEditor.issueUnknownToken": "{token} n'est pas une valeur de thème, elle est ignorée",
+ "themeEditor.issueMissingToken": "{token} n'est pas défini, la valeur intégrée est utilisée",
+ "themeEditor.issueUnknownBase": "Le thème de base {base} n'existe pas, les valeurs intégrées sont utilisées",
+ "themeEditor.issueContrast": "{token} sur {against} : {ratio} pour 1, sous la cible de {target} pour 1",
+ "themeEditor.beta": "Bêta",
+ "themeEditor.betaNote": "Le format de thème bouge encore : un thème écrit aujourd'hui peut demander une retouche après une mise à jour.",
+ "themeEditor.customCss": "CSS personnalisé",
+ "themeEditor.customCssHelp": "Appliqué par-dessus le thème, pour ce que les valeurs ci-dessus n'atteignent pas. Ni @import ni url() : un thème ne va rien chercher à l'extérieur.",
+ "themeEditor.issueUnsafeCss": "{construct} est interdit dans un thème, le CSS n'est pas appliqué",
+ "themeEditor.issueCssTooLong": "CSS trop long : {length} caractères, la limite est {limit}",
+ "bulkEdit.title": "Édition en masse",
+ "bulkEdit.selectAccounts": "Sélectionner les comptes",
+ "bulkEdit.selectAll": "Tout sélectionner",
+ "bulkEdit.deselectAll": "Tout désélectionner",
+ "bulkEdit.next": "Suivant",
+ "bulkEdit.apply": "Appliquer",
+ "bulkEdit.settings": "Paramètres",
+ "bulkEdit.newsPopup": "Popup d'actualités jeux",
+ "bulkEdit.doNotDisturb": "Ne pas déranger",
+ "bulkEdit.launchOptions": "Options de lancement par jeu",
+ "bulkEdit.unchanged": "Inchangé",
+ "bulkEdit.addLaunchOption": "Ajouter",
+ "bulkEdit.selectGame": "Sélectionner un jeu...",
+ "bulkEdit.launchOptionsPlaceholder": "-fullscreen",
+ "bulkEdit.activeAccountWarning": "Le compte actuellement actif est sélectionné. Les modifications seront prises en compte au prochain redémarrage de Steam.",
+ "bulkEdit.toastSuccess": "Édition en masse : {count} réussi(s)",
+ "bulkEdit.toastPartial": "Édition en masse : {succeeded} réussi(s), {failed} échoué(s)",
+ "bulkEdit.toastFailed": "Échec de l'édition en masse",
+ "bulkEdit.noAccountsSelected": "Aucun compte sélectionné",
+ "bulkEdit.selected": "{count} sélectionné(s)",
+ "bulkEdit.loadingGames": "Chargement des jeux...",
+ "bulkEdit.copyUrls": "Copier les URLs",
+ "bulkEdit.urlsCopied": "{count} URL(s) de profil copiée(s)",
+ "bulkEdit.cardColor": "Couleur de carte",
+ "bulkEdit.colorApplied": "Couleur appliquée à {count} carte(s)",
+ "bulkEdit.colorCleared": "Couleur retirée de {count} carte(s)",
+ "common.retry": "Réessayer",
+ "app.searchNoResults": "Aucun résultat pour « {query} »",
+ "app.folderEmpty": "Ce dossier est vide",
+ "app.loadErrorGeneric": "Impossible de charger les comptes. Regarde la console pour les détails.",
+ "toast.dismiss": "Fermer",
+ "toast.switchFailed": "Le changement de compte a échoué. Regarde la console pour les détails.",
+ "toast.addAccountFailed": "Impossible d'ajouter le compte. Consulte les logs de l'application pour les détails.",
+ "toast.addAccountClientMissing": "{platform} ne semble pas installé. Installe-le, ou renseigne son emplacement dans les Paramètres.",
+ "toast.banCheckFailedGeneric": "La vérification des bans a échoué. Regarde la console pour les détails.",
+ "toast.renameAccountFailed": "Renommage échoué : {error}",
+ "toast.copyFailed": "Impossible de copier dans le presse-papiers",
+ "toast.refreshFailed": "Le rafraîchissement a échoué. Regarde la console pour les détails.",
+ "dialog.deleteFolderTitle": "Supprimer « {name} » ?",
+ "dialog.deleteFolderMessage": "Les sous-dossiers sont supprimés aussi. Les comptes qu'ils contiennent remontent d'un niveau, ils ne sont pas supprimés.",
+ "personas.deleteConfirm": "Clique encore pour supprimer",
+ "personas.discardConfirm": "Clique encore pour abandonner",
+ "personas.switchConfirmTitle": "Basculer de persona",
+ "personas.switchConfirmMessage": "Basculer {count} plateforme(s) vers « {name} » ? Chaque client va fermer et se relancer.",
+ "personas.switchConfirmAction": "Basculer",
+ "personas.deleteTitle": "Supprimer le persona",
+ "personas.deleteMessage": "Supprimer « {name} » ? Les comptes eux-mêmes ne sont pas touchés.",
+ "context.submenuError": "Impossible de charger ce menu",
+ "settings.apiKeySaveFailed": "Impossible d'enregistrer la clé API Steam",
+ "settings.apiKeyInvalidHint": "La clé n'a pas été enregistrée. Vérifie-la et réessaie.",
+ "settings.apiKeyCleared": "Clé API Steam effacée",
+ "settings.apiKeyClearFailed": "Impossible d'effacer la clé API Steam",
+ "settings.clearApiKey": "Effacer la clé",
+ "settings.cs2Bridge": "Pont stats CS2",
+ "settings.cs2BridgeLink": "Lien du pont",
+ "settings.cs2BridgeLinkPlaceholder": "https://ton-serveur/api/bridge/accshift/",
+ "settings.cs2BridgeTest": "Tester",
+ "settings.cs2BridgeStatusOk": "Connecté · {count} comptes · {ms} ms",
+ "settings.cs2BridgeStatusFail": "Connexion échouée",
+ "settings.cs2BridgeStatusTesting": "Test en cours...",
+ "settings.cs2BridgeStatusUnknown": "Pas testé",
+ "settings.cs2BridgeToken": "Token API",
+ "settings.cs2BridgeTokenOptional": "optionnel, pour serveurs custom",
+ "settings.cs2BridgeTokenPlaceholder": "Token Bearer si ton serveur en demande un",
+ "settings.cs2BridgeSaveFailed": "Impossible d'enregistrer les réglages du pont CS2",
+ "settings.cs2BridgeClearToken": "Effacer le token",
+ "settings.pathSaveFailed": "Impossible d'enregistrer le chemin {platform}",
+ "settings.pathInvalidHint": "Ce chemin n'a pas pu être enregistré. Vérifie-le et réessaie.",
+ "settings.pathSteamNeverSignedIn": "Steam trouvé, connecte-toi une fois pour qu'il crée son historique de connexion",
+ "settings.pathNotSteamFolder": "Ce dossier ne ressemble pas à une installation Steam",
+ "settings.pathNotADirectory": "Le chemin doit être un dossier existant",
+ "settings.pinSaved": "Code PIN enregistré",
+ "settings.pinTakesEffectNextLaunch": "Prend effet au prochain lancement de l'app",
+ "settings.pinRequiredAfterInactivity": "Demandé après inactivité et au lancement de l'app",
+ "settings.pinScreenLockOnly": "Le PIN verrouille cette fenêtre et les changements de compte. Il ne protège rien sur le disque.",
+ "settings.unitSeconds": "secondes",
+ "settings.unitDays": "jours",
+ "settings.telemetryLoadFailed": "Impossible de charger les paramètres de télémétrie",
+ "palette.placeholder": "Tape une commande ou un nom de compte...",
+ "palette.noResults": "Aucune commande ne correspond",
+ "palette.sectionAccounts": "Comptes",
+ "palette.sectionActions": "Actions",
+ "palette.sectionNavigation": "Navigation",
+ "palette.openTab": "Aller à {platform}",
+ "palette.openFolder": "Ouvrir le dossier « {name} »",
+ "palette.backToParent": "Revenir au dossier parent",
+ "palette.zoomReset": "Réinitialiser le zoom"
+}
diff --git a/crates/accshift-app/i18n/pt-br.json b/crates/accshift-app/i18n/pt-br.json
new file mode 100644
index 00000000..0e7581f9
--- /dev/null
+++ b/crates/accshift-app/i18n/pt-br.json
@@ -0,0 +1,753 @@
+{
+ "app.loadingSettings": "Carregando configurações...",
+ "app.loading": "Carregando...",
+ "app.searchPlaceholder": "Buscar conta...",
+ "app.noAccountsFound": "Nenhuma conta {platform} encontrada",
+ "app.noAccountsHint": "Verifique se o {platform} está instalado e se você já fez login pelo menos uma vez.",
+ "app.switchingAccount": "Trocando de conta...",
+ "app.platformRestarting": "{platform} está reiniciando",
+ "app.comingSoon": "{platform} - Em breve",
+ "app.platformUnsupportedOs": "{platform} ainda não está disponível neste sistema",
+ "app.noCompatiblePlatforms": "Nenhuma plataforma compatível está disponível neste sistema",
+ "app.noCompatiblePlatformsHint": "Acompanhe as novidades de suporte no Windows ou use uma máquina compatível.",
+ "update.ctaAvailable": "Atualização disponível",
+ "update.ctaInstalling": "Instalando...",
+ "update.restartToApplyVersion": "Reiniciar para aplicar a atualização {version}",
+ "update.restartToApply": "Reiniciar para aplicar a atualização",
+ "update.readyToastVersion": "Atualização {version} pronta",
+ "update.readyToast": "Atualização pronta",
+ "update.restartFailed": "Não foi possível reiniciar para aplicar a atualização",
+ "pin.lockedTitle": "Aplicativo bloqueado",
+ "pin.lockedPrompt": "Digite o PIN para desbloquear",
+ "pin.placeholder": "PIN de 4 dígitos",
+ "pin.unlock": "Desbloquear",
+ "pin.invalid": "PIN inválido",
+ "pin.tooManyAttempts": "Muitas tentativas. Tente novamente em {seconds} s.",
+ "common.ok": "OK",
+ "common.cancel": "Cancelar",
+ "common.confirm": "Confirmar",
+ "common.close": "Fechar",
+ "common.back": "Voltar",
+ "common.active": "Ativa",
+ "common.choose": "Escolher...",
+ "common.none": "Nenhum",
+ "common.custom": "Personalizado",
+ "common.configured": "Configurado",
+ "common.missing": "Ausente",
+ "common.enabled": "Ativado",
+ "common.disabled": "Desativado",
+ "common.on": "Ligado",
+ "common.off": "Desligado",
+ "common.add": "Adicionar",
+ "common.visible": "Visível",
+ "common.hidden": "Oculto",
+ "common.inline": "Na linha",
+ "common.tooltip": "Dica",
+ "titlebar.refresh": "Atualizar",
+ "titlebar.addAccount": "Adicionar conta",
+ "titlebar.settings": "Configurações",
+ "titlebar.personas": "Personas",
+ "titlebar.minimize": "Minimizar",
+ "titlebar.maximize": "Maximizar",
+ "titlebar.restore": "Restaurar",
+ "titlebar.close": "Fechar",
+ "view.grid": "Visualização em grade",
+ "view.list": "Visualização em lista",
+ "settings.title": "Configurações",
+ "settings.general": "Geral",
+ "settings.appearance": "Aparência",
+ "settings.language": "Idioma",
+ "settings.theme": "Tema",
+ "settings.uiZoom": "Zoom da interface",
+ "settings.backgroundOpacity": "Opacidade do fundo",
+ "settings.animations": "Animações",
+ "settings.animationsSystem": "Seguir o sistema",
+ "settings.animationsOn": "Sempre ativas",
+ "settings.animationsOff": "Desativadas",
+ "settings.performance": "Desempenho",
+ "settings.suspendGraphicsWhenMinimized": "Suspender gráficos ao minimizar",
+ "settings.minimizeOnAccountSwitch": "Minimizar ao trocar de conta",
+ "settings.system": "Sistema",
+ "settings.startWithSystem": "Iniciar na inicialização",
+ "settings.startWithSystemHint": "Inicia o Accshift com o Windows, minimizado na área de notificação.",
+ "settings.closeToTray": "Fechar para a área de notificação",
+ "settings.closeToTrayHint": "O botão de fechar oculta o Accshift na área de notificação em vez de sair.",
+ "settings.autostartFailed": "Não foi possível alterar a inicialização automática.",
+ "tray.open": "Abrir o Accshift",
+ "tray.quit": "Sair",
+ "settings.platforms": "Plataformas",
+ "settings.platformSearchPlaceholder": "Buscar plataformas...",
+ "settings.platformSearchNoResults": "Nenhuma plataforma corresponde à sua busca.",
+ "settings.accountDisplay": "Exibição das contas",
+ "settings.startupAndExtras": "Inicialização",
+ "settings.defaultOnStartup": "Plataforma padrão ao iniciar",
+ "settings.platformDisabledSuffix": "(desativada)",
+ "settings.platformUnsupportedOs": "Sistema não suportado",
+ "settings.platformNotImplemented": "Planejada",
+ "settings.platformUserProvided": "Adicionada a partir da sua pasta de descritores",
+ "settings.customPlatforms": "Plataformas personalizadas",
+ "settings.customPlatformsHint": "Os arquivos de descritor desta pasta são lidos ao iniciar o aplicativo.",
+ "settings.customPlatformsNone": "Nenhum descritor carregado desta pasta.",
+ "settings.customPlatformsProblems": "Arquivos que não carregaram",
+ "descriptor.addFromFile": "Adicionar de um arquivo",
+ "descriptor.reload": "Recarregar",
+ "descriptor.openFolder": "Abrir pasta",
+ "descriptor.remove": "Remover",
+ "descriptor.removeConfirmTitle": "Remover {platform}?",
+ "descriptor.removeConfirmMessage": "O arquivo de descritor sai da sua pasta. As contas já capturadas continuam no disco.",
+ "descriptor.previewTitle": "Adicionar uma plataforma",
+ "descriptor.previewOs": "Descrita para {list}",
+ "descriptor.previewRoots": "Pastas em que pode mexer",
+ "descriptor.previewSteps": "O que uma troca de conta faria",
+ "descriptor.previewWarnings": "Avisos",
+ "descriptor.previewNoPlan": "Não foi possível montar uma simulação: {problem}",
+ "descriptor.previewReplaces": "Isso substitui o descritor que já está na sua pasta.",
+ "descriptor.previewNothingWritten": "Nada é gravado até você adicionar.",
+ "descriptor.replace": "Substituir",
+ "descriptor.installed": "{platform} adicionada",
+ "descriptor.removed": "{platform} removida",
+ "descriptor.actionRead": "ler",
+ "descriptor.actionCapture": "capturar",
+ "descriptor.actionRestore": "restaurar",
+ "descriptor.actionDelete": "remover",
+ "descriptor.actionClose": "fechar",
+ "descriptor.actionLaunch": "iniciar",
+ "settings.dataRefresh": "Atualização de dados",
+ "settings.avatarRefresh": "Atualizar avatares",
+ "settings.banCheckDelay": "Intervalo da checagem de banimentos",
+ "settings.refreshNow": "Atualizar agora",
+ "settings.zeroEachLaunch": "0 = a cada inicialização",
+ "settings.privacy": "Privacidade",
+ "settings.inactivityTimeout": "Tempo de inatividade",
+ "settings.zeroDisabled": "0 = desativado",
+ "settings.streamerMode": "Modo streamer",
+ "settings.streamerModeHint": "Desfoca os detalhes das contas automaticamente quando um software de transmissão está em execução.",
+ "settings.personasHint": "Mostrar o seletor de identidades personas",
+ "settings.replayOnboarding": "Rever a introdução",
+ "settings.replayOnboardingHint": "Mostra de novo o tour de boas-vindas e a escolha de estatísticas de uso.",
+ "streamer.title": "Modo streamer",
+ "streamer.disable": "Desativar",
+ "streamer.disablePermanently": "Desativar permanentemente",
+ "personas.title": "Personas",
+ "personas.create": "Nova persona",
+ "personas.activate": "Trocar para esta persona",
+ "personas.edit": "Editar",
+ "personas.delete": "Excluir",
+ "personas.finish": "Concluir",
+ "personas.switching": "Trocando...",
+ "personas.switched": "Trocado para {name}",
+ "personas.switchPartial": "{name}: falhou em {failed}",
+ "personas.switchFailed": "Não foi possível trocar para {name}",
+ "personas.namePlaceholder": "Nome da persona",
+ "personas.choosePlatforms": "Escolha uma conta para cada plataforma incluída",
+ "personas.chooseAccount": "Escolha a conta {platform}",
+ "personas.removeFromPersona": "Remover desta persona",
+ "personas.customImage": "Escolher uma imagem...",
+ "personas.removeImage": "Remover imagem",
+ "personas.imageError": "Não foi possível carregar essa imagem.",
+ "personas.loadingAccounts": "Carregando contas...",
+ "personas.noAccountsOnPlatform": "Ainda não há contas nesta plataforma",
+ "personas.emptyHint": "Um clique troca cada plataforma incluída para a conta dela.",
+ "settings.security": "Segurança",
+ "settings.pinLockOnAfk": "Bloqueio por PIN ao ficar ausente",
+ "settings.pinCode": "Código PIN",
+ "settings.pinPlaceholder": "4 dígitos",
+ "settings.pinCurrentCode": "PIN atual",
+ "settings.pinCurrentHint": "Digite o PIN atual para alterar ou desativar o bloqueio.",
+ "settings.telemetry": "Estatísticas de uso (anônimas)",
+ "settings.telemetryModeA": "Estatísticas básicas anônimas",
+ "settings.telemetryModeAHint": "Conta as inicializações e quais recursos são usados. Um ID local aleatório evita contar a mesma instalação duas vezes; nenhum dado pessoal é enviado.",
+ "settings.telemetryModeB": "Estatísticas avançadas com UUID local (opcional)",
+ "settings.telemetryModeBHint": "Adiciona um UUID aleatório guardado apenas nesta máquina. Permite medir a retenção e quais recursos importam. Continua sem enviar nenhum dado pessoal.",
+ "settings.telemetryExport": "Exportar meus dados",
+ "settings.telemetryExported": "Dados exportados para a área de transferência",
+ "settings.telemetryExportFailed": "Falha na exportação",
+ "settings.telemetryEnableFailed": "Não foi possível ativar as estatísticas avançadas",
+ "settings.telemetryDisableFailed": "Não foi possível desativar as estatísticas avançadas",
+ "settings.telemetryDeletePending": "As estatísticas avançadas estão desativadas; a exclusão no servidor vai precisar de outra tentativa",
+ "settings.telemetryDeletePendingHint": "A exclusão no servidor está pendente. O ID local antigo é mantido só para você tentar de novo ou exportar os dados associados.",
+ "settings.telemetryRetryDelete": "Tentar excluir os dados de novo",
+ "settings.telemetryDeleteCompleted": "Dados do servidor excluídos",
+ "settings.telemetryDeleteRetryFailed": "A exclusão no servidor continua pendente",
+ "settings.telemetryLearnMore": "Quais dados são enviados?",
+ "onboarding.welcome.title": "Bem-vindo ao Accshift",
+ "onboarding.welcome.version": "v{version}",
+ "onboarding.welcome.compatibleWith": "Seu sistema operacional é compatível com:",
+ "onboarding.welcome.detectedPlatforms": "Estas são as plataformas detectadas no seu computador:",
+ "onboarding.welcome.next": "Quero conhecer",
+ "onboarding.welcome.skip": "Pular",
+ "onboarding.features.hint": "Esta parte do app não está visível agora.",
+ "onboarding.features.addAccount.label": "Adicionar uma conta",
+ "onboarding.features.addAccount.body": "O botão + no canto superior direito adiciona uma conta à plataforma atual. Faça login uma vez e o Accshift guarda a conta.",
+ "onboarding.features.switch.label": "Trocar de conta",
+ "onboarding.features.switch.body": "Clique em um card e você já está nessa conta. Sinceramente, o app inteiro é isso.",
+ "onboarding.features.contextMenu.label": "Botão direito para mais ações",
+ "onboarding.features.contextMenu.body": "Clique com o botão direito em um card para renomear, mudar a cor, mover para uma pasta ou excluir.",
+ "onboarding.features.platformSwitch.label": "Trocar de plataforma",
+ "onboarding.features.platformSwitch.body": "Funciona igual para Riot, Battle.net, Epic e o resto. As abas de cima trocam de plataforma.",
+ "onboarding.features.next": "Avançar",
+ "onboarding.features.back": "Voltar",
+ "onboarding.features.step": "Etapa {step}",
+ "onboarding.features.mockRename": "Renomear",
+ "onboarding.features.mockSetColor": "Definir cor",
+ "onboarding.features.mockMoveToFolder": "Mover para pasta",
+ "onboarding.features.mockDelete": "Excluir",
+ "onboarding.features.mockAccount": "Conta {number}",
+ "onboarding.telemetry.title": "VENDA SUA ALMA PARA O ACCSHIFT!",
+ "onboarding.telemetry.intro": "O Accshift conta algumas estatísticas de uso anônimas para eu saber o que consertar primeiro. Nada pessoal sai da sua máquina, o app funciona igual de qualquer jeito, e você pode mudar de ideia quando quiser nas configurações.",
+ "onboarding.telemetry.question": "Fechado?",
+ "onboarding.telemetry.gifAlt": "Meme da proposta de troca",
+ "onboarding.telemetry.basic": "NÃO! Já chega",
+ "onboarding.telemetry.basicDefault": "(padrão)",
+ "onboarding.telemetry.basicHint": "Só contadores anônimos e nada mais: sem perfil, sem identificador que te siga.",
+ "onboarding.telemetry.deal": "FECHADO",
+ "onboarding.telemetry.dealHint": "Adiciona um UUID separado para as estatísticas avançadas, guardado só na sua máquina. Continuo sem ideia de quem você é, mas você ajuda muito. Obrigado!",
+ "onboarding.telemetry.optOutNote": "Escolha o que escolher, dá para mudar depois em Configurações -> Privacidade. :c",
+ "onboarding.telemetry.refuse": "Não, obrigado, desligue tudo",
+ "onboarding.telemetry.refuseHint": "Nada é medido nem enviado, nem os contadores anônimos.",
+ "onboarding.telemetry.back": "Voltar",
+ "onboarding.persistFailed": "Não foi possível salvar essa escolha. Tente de novo.",
+ "onboarding.persistLater": "Perguntar na próxima abertura",
+ "settings.steam": "Steam",
+ "settings.riot": "Riot",
+ "settings.battleNet": "Battle.net",
+ "settings.ubisoft": "Ubisoft Connect",
+ "settings.runSteamAsAdmin": "Executar o Steam como admin",
+ "settings.showUsernames": "Mostrar nomes de usuário",
+ "settings.showSteamLastLogin": "Mostrar último login do Steam",
+ "settings.showRiotLastLogin": "Mostrar último login da Riot",
+ "settings.showBattleNetLastLogin": "Mostrar último login da Battle.net",
+ "settings.showUbisoftLastLogin": "Mostrar último login da Ubisoft",
+ "settings.showNotesUnderCards": "Mostrar notas sob os cards",
+ "settings.expandedFolders": "Expandir todas as pastas",
+ "list.rootSection": "Raiz",
+ "settings.steamLaunch": "Troca",
+ "settings.steamInstallation": "Instalação",
+ "settings.steamApiAndData": "API e dados",
+ "settings.launchOptions": "Opções de inicialização",
+ "settings.shutdownMode": "Modo de encerramento",
+ "settings.shutdownModeGraceful": "Suave",
+ "settings.shutdownModeForce": "Forçar encerramento",
+ "settings.autoDetected": "Detectado automaticamente",
+ "settings.steamFolder": "Pasta do Steam",
+ "settings.steamFolderRegistry": "Registro",
+ "settings.riotClientPath": "Executável do Riot Client",
+ "settings.battleNetPath": "Executável da Battle.net",
+ "settings.ubisoftPath": "Pasta do Ubisoft Connect",
+ "settings.steamWebApiKey": "Chave da Steam Web API",
+ "settings.getKey": "Obter chave",
+ "settings.pasteApiKey": "Cole sua chave da Steam Web API",
+ "settings.saved": "Configurações salvas",
+ "settings.openApiKeyFailed": "Não foi possível abrir a página da chave da API Steam",
+ "settings.integrations": "Integrações",
+ "settings.deepLinks": "Permitir links accshift://",
+ "settings.deepLinksHint": "Deixe outros apps trocarem de conta por você: favoritos, Stream Deck, scripts.",
+ "settings.cliEnabled": "Permitir a CLI do accshift",
+ "settings.cliEnabledHint": "Deixa a ferramenta de linha de comando listar e trocar de contas. Desativado, todo comando accshift se recusa a rodar, diag incluído; o aplicativo em si não é afetado.",
+ "settings.help": "Abrir a wiki do accshift",
+ "settings.helpShort": "Ajuda",
+ "settings.openHelpFailed": "Não foi possível abrir a wiki",
+ "settings.logs": "Logs",
+ "settings.openLogs": "Abrir a pasta de logs",
+ "settings.openLogsFailed": "Não foi possível abrir a pasta de logs",
+ "context.loading": "Carregando...",
+ "context.noGamesFound": "Nenhum jogo encontrado",
+ "context.field.cut": "Recortar",
+ "context.field.copy": "Copiar",
+ "context.field.paste": "Colar",
+ "context.field.selectAll": "Selecionar tudo",
+ "context.menu.newFolder": "Nova pasta",
+ "context.menu.refresh": "Atualizar",
+ "context.menu.rename": "Renomear",
+ "context.menu.copy": "Copiar...",
+ "context.menu.deleteFolder": "Excluir pasta",
+ "context.menu.folderColor": "Cor da pasta",
+ "context.menu.moveToFolder": "Mover para uma pasta",
+ "context.menu.moveToRoot": "Sem pasta",
+ "context.menu.editCardAndColor": "Editar card e cor",
+ "context.menu.cardColor": "Cor do card",
+ "context.menu.addNote": "Adicionar nota",
+ "context.menu.editNote": "Editar nota",
+ "platform.rename": "Renomear",
+ "platform.renameTitle": "Renomear conta",
+ "platform.renamePlaceholder": "Nome da conta",
+ "platform.newAccountPending": "Aguardando...",
+ "platform.setupBusy": "Outra operação do accshift está em andamento. Aguardando que ela termine.",
+ "platform.renameNewAccount": "Dê um nome a esta conta",
+ "platform.copyLabelAccountId": "ID da conta",
+ "platform.forget": "Esquecer",
+ "platform.forgetConfirmTitle": "Esquecer \"{display}\"?",
+ "platform.forgetConfirmMessage": "Isso vai remover esta conta e a sessão salva do Accshift.",
+ "platform.forgotAccount": "{display} esquecida",
+ "dialog.newFolderTitle": "Nova pasta",
+ "dialog.renameFolderTitle": "Renomear pasta",
+ "dialog.folderNamePlaceholder": "Nome da pasta",
+ "dialog.cardNoteTitle": "Nota do card",
+ "dialog.cardNotePlaceholder": "Escreva uma nota curta",
+ "card.noteAttached": "Nota anexada",
+ "card.clickAgainToSwitch": "Clique de novo para trocar",
+ "card.extensionWarnings": "Avisos",
+ "card.extensionNote": "Nota",
+ "card.cs2Section": "CS2",
+ "card.cs2Level": "Nível {level}",
+ "card.cs2CaseEarned": "Caixa semanal obtida",
+ "card.cs2CaseNotEarned": "Caixa semanal pendente",
+ "list.selectAccountPreview": "Selecione uma conta para pré-visualizar",
+ "preview.noteLabel": "Nota",
+ "preview.currentlyActive": "Ativa no momento",
+ "preview.switchAgain": "Trocar de novo",
+ "preview.switchAccount": "Trocar de conta",
+ "ban.community": "Banimento da comunidade",
+ "ban.vac.single": "{count} banimento VAC",
+ "ban.vac.multiple": "{count} banimentos VAC",
+ "ban.game.single": "{count} banimento de jogo",
+ "ban.game.multiple": "{count} banimentos de jogo",
+ "time.unknown": "desconhecido",
+ "time.justNow": "agora mesmo",
+ "time.minuteAgo": "há {count} minuto",
+ "time.minutesAgo": "há {count} minutos",
+ "time.hourAgo": "há {count} hora",
+ "time.hoursAgo": "há {count} horas",
+ "time.dayAgo": "há {count} dia",
+ "time.daysAgo": "há {count} dias",
+ "time.neverConnected": "nunca conectado",
+ "time.compactWrapper": "({value})",
+ "toast.copied": "{label} copiado",
+ "toast.legacyConfigMigrated": "Configurações migradas para o novo formato",
+ "toast.legacyConfigMigrationFailed": "Falha ao migrar as configurações antigas, veja os logs",
+ "toast.failedLoadSettingsPanel": "Falha ao carregar o painel de configurações",
+ "toast.banChecking": "Checando banimentos...",
+ "toast.banCheckSummary.single": "Checagem de banimentos: {count} conta com banimentos",
+ "toast.banCheckSummary.multiple": "Checagem de banimentos: {count} contas com banimentos",
+ "toast.banCheckFailed": "Falha na checagem de banimentos: {error}",
+ "toast.avatarRefreshComplete": "Atualização de avatares concluída para {count} contas",
+ "toast.banRefreshComplete": "Atualização de banimentos concluída para {count} contas",
+ "toast.banRefreshNoApiKey": "Atualização de banimentos ignorada: adicione uma chave da Steam Web API nas configurações",
+ "toast.refreshPartial": "Atualização concluída para {ok} de {count} contas",
+ "toast.noSteamAccountsFound": "Nenhuma conta Steam encontrada. Entre no Steam pelo menos uma vez e atualize.",
+ "toast.accountsRefreshed.single": "{count} conta atualizada",
+ "toast.accountsRefreshed.multiple": "{count} contas atualizadas",
+ "toast.steamFolderNotFound": "A pasta do Steam não foi encontrada. Defina manualmente em Configurações > Pasta do Steam.",
+ "toast.steamElevated": "O Steam está rodando como admin. Ative 'Executar o Steam como admin' em Configurações > Steam.",
+ "toast.noRiotProfilesFound": "Nenhum perfil Riot ainda. Clique em + para adicionar um.",
+ "toast.noBattleNetAccountsFound": "Nenhuma conta Battle.net encontrada. Entre na Battle.net pelo menos uma vez e atualize.",
+ "toast.noUbisoftAccountsFound": "Nenhuma conta Ubisoft encontrada. Entre no Ubisoft Connect pelo menos uma vez e atualize.",
+ "toast.deepLinkInvalid": "Link accshift:// não reconhecido",
+ "toast.deepLinkDisabled": "Os links accshift:// estão desativados nas configurações",
+ "toast.deepLinkUnknownPlatform": "Plataforma desconhecida no link: {platform}",
+ "toast.deepLinkPlatformDisabled": "{platform} está desativada nas configurações",
+ "toast.deepLinkAccountNotFound": "Nenhuma conta {platform} corresponde a \"{account}\"",
+ "toast.deepLinkSwitched": "Trocado para {account}",
+ "dialog.deepLinkSwitchTitle": "Trocar de conta?",
+ "dialog.deepLinkSwitchMessage": "Um link accshift:// está pedindo para trocar sua conta {platform} para \"{account}\". Continuar?",
+ "dialog.deepLinkSwitchConfirm": "Trocar",
+ "steam.launchOnline": "Trocar online",
+ "steam.launchInvisible": "Trocar invisível",
+ "steam.switchAndRunGame": "Trocar + jogar {game}",
+ "steam.switchAndRunPick": "Trocar + jogar um jogo…",
+ "steam.runGame": "Jogar {game}",
+ "steam.runPick": "Jogar um jogo…",
+ "steam.switchAndRunNoGames": "Nenhum jogo encontrado",
+ "steam.clearDefaultGame": "Limpar jogo padrão",
+ "steam.copySteamId64": "Copiar SteamID64",
+ "steam.copyFriendCode": "Copiar código de amigo",
+ "steam.copyProfileUrl": "Copiar URL do perfil",
+ "steam.copyLabelUsername": "Nome de usuário",
+ "steam.copyLabelSteamId64": "SteamID64",
+ "steam.copyLabelFriendCode": "Código de amigo",
+ "steam.copyLabelProfileUrl": "URL do perfil",
+ "steam.openUserdataFolder": "Abrir a pasta userdata",
+ "steam.clearIntegratedBrowserCache": "Redefinir sessão do navegador",
+ "steam.clearIntegratedBrowserCacheConfirmTitle": "Redefinir a sessão do navegador do Steam?",
+ "steam.clearIntegratedBrowserCacheConfirmMessage": "Isso fecha o Steam e limpa o cache do navegador integrado usado pela Loja e pela Comunidade.",
+ "steam.clearedIntegratedBrowserCache": "Sessão do navegador do Steam redefinida",
+ "steam.copySettingsFrom": "Copiar configurações de",
+ "steam.copiedSettingsToCurrent": "Configurações de {game} copiadas para a conta atual",
+ "steam.forget": "Esquecer",
+ "steam.forgetConfirmTitle": "Esquecer \"{display}\"?",
+ "steam.forgetConfirmMessage": "Isso vai remover esta conta da lista de contas Steam deste PC.",
+ "steam.forgotAccount": "{username} esquecida",
+ "steam.setupPendingLabel": "Conta Steam",
+ "steam.setupWaitingForClient": "Aguardando o Steam...",
+ "steam.setupWaitingForLogin": "Entre na conta Steam que você quer adicionar.",
+ "steam.setupDetected": "Conta detectada",
+ "steam.setupConnected": "Conectado",
+ "steam.setupReady": "Conta Steam adicionada",
+ "steam.setupReadyWithProfile": "{profile} adicionada",
+ "steam.setupFailed": "Falha na configuração do Steam",
+ "steam.setupFailedMessage": "O Accshift não conseguiu terminar de adicionar esta conta Steam.",
+ "riot.captureSession": "Capturar a sessão atual",
+ "riot.recaptureSession": "Recapturar sessão",
+ "riot.capturedSession": "Sessão capturada para {profile}",
+ "riot.setupPendingLabel": "Conta Riot",
+ "riot.setupWaitingForClient": "Aguardando o Riot Client...",
+ "riot.setupWaitingForLogin": "Entre na conta Riot que você quer adicionar.",
+ "riot.setupCapturing": "Salvando a sessão Riot...",
+ "riot.setupReady": "Conta Riot adicionada",
+ "riot.setupReadyWithProfile": "{profile} adicionada",
+ "riot.setupFailed": "Falha na configuração da Riot",
+ "riot.setupFailedMessage": "O Accshift não conseguiu terminar de adicionar esta conta Riot.",
+ "riot.setupStaySignedIn": "Mantenha 'Continuar conectado' ativado.",
+ "riot.setupDetected": "Conta detectada",
+ "riot.setupConnected": "Conectado",
+ "riot.forget": "Esquecer conta",
+ "riot.forgetConfirmTitle": "Esquecer \"{display}\"?",
+ "riot.forgetConfirmMessage": "Isso remove o perfil Riot local e a sessão salva do Accshift.",
+ "riot.forgotProfile": "{profile} esquecido",
+ "battlenet.copyUsername": "Copiar nome de usuário",
+ "battlenet.copyLabelUsername": "Nome de usuário",
+ "battlenet.copyEmail": "Copiar e-mail",
+ "battlenet.copyLabelEmail": "E-mail",
+ "battlenet.forget": "Esquecer",
+ "battlenet.forgetConfirmTitle": "Esquecer \"{display}\"?",
+ "battlenet.forgetConfirmMessage": "Isso vai remover esta conta da lista de contas Battle.net deste PC.",
+ "battlenet.forgotAccount": "{email} esquecida",
+ "battlenet.setupPendingLabel": "Conta Battle.net",
+ "battlenet.setupWaitingForClient": "Aguardando a Battle.net...",
+ "battlenet.setupWaitingForLogin": "Entre na conta Battle.net que você quer adicionar.",
+ "battlenet.setupKeepMeLoggedIn": "Mantenha 'Continuar conectado' ativado quando possível.",
+ "battlenet.setupDetected": "Conta detectada",
+ "battlenet.setupConnected": "Conectado",
+ "battlenet.setupReady": "Conta Battle.net adicionada",
+ "battlenet.setupReadyWithProfile": "{profile} adicionada",
+ "battlenet.setupFailed": "Falha na configuração da Battle.net",
+ "battlenet.setupFailedMessage": "O Accshift não conseguiu terminar de adicionar esta conta Battle.net.",
+ "ubisoft.copyLabelUuid": "UUID",
+ "ubisoft.forget": "Esquecer",
+ "ubisoft.forgetConfirmTitle": "Esquecer \"{display}\"?",
+ "ubisoft.forgetConfirmMessage": "Isso vai remover esta conta e a sessão salva do Accshift.",
+ "ubisoft.forgotAccount": "{display} esquecida",
+ "ubisoft.setupPendingLabel": "Conta Ubisoft",
+ "ubisoft.setupWaitingForClient": "Aguardando o Ubisoft Connect...",
+ "ubisoft.setupWaitingForLogin": "Entre na conta Ubisoft que você quer adicionar.",
+ "ubisoft.setupKeepMeLoggedIn": "Mantenha 'Lembrar de mim' ativado.",
+ "ubisoft.setupDetected": "Conta detectada",
+ "ubisoft.setupConnected": "Conectado",
+ "ubisoft.setupReady": "Conta Ubisoft adicionada",
+ "ubisoft.setupReadyWithProfile": "{profile} adicionada",
+ "ubisoft.setupFailed": "Falha na configuração da Ubisoft",
+ "ubisoft.setupFailedMessage": "O Accshift não conseguiu terminar de adicionar esta conta Ubisoft.",
+ "settings.roblox": "Roblox",
+ "toast.noRobloxAccountsFound": "Nenhuma conta Roblox encontrada. Adicione uma conta pelo Quick Login ou cole um cookie.",
+ "roblox.noAccountsHint": "Pressione + para adicionar uma conta Roblox pelo Quick Login.",
+ "roblox.sessionExpired": "Sessão expirada",
+ "roblox.sessionExpiredTooltip": "Esta conta está desconectada. Adicione de novo antes de trocar.",
+ "roblox.sessionExpiredSwitchError": "Sessão expirada. Adicione esta conta de novo para trocar. As notas e configurações são mantidas.",
+ "roblox.cookiePasteTitle": "Adicionar conta por cookie",
+ "roblox.cookiePasteHint": "Cole um cookie .ROBLOSECURITY do seu navegador para adicionar uma conta direto.",
+ "settings.showRobloxLastLogin": "Mostrar último login",
+ "settings.robloxHealthCheck": "Checagem de sessão",
+ "settings.robloxHealthCheckHint": "Sinaliza as contas cuja sessão Roblox expirou; uma requisição de rede por inicialização.",
+ "roblox.copyLabelUsername": "Nome de usuário",
+ "roblox.copyLabelUserId": "ID do usuário",
+ "roblox.forget": "Esquecer",
+ "roblox.forgetConfirmTitle": "Esquecer \"{display}\"?",
+ "roblox.forgetConfirmMessage": "Isso vai remover esta conta e o cookie guardado deste PC.",
+ "roblox.forgotAccount": "{display} esquecida",
+ "roblox.setupPendingLabel": "Conta Roblox",
+ "roblox.setupWaitingForClient": "Conectando ao Roblox...",
+ "roblox.setupWaitingForLogin": "Abra o app do Roblox em outro dispositivo e digite o código abaixo.",
+ "roblox.setupQuickLoginCode": "Código do Quick Login",
+ "roblox.setupQuickLoginHint": "roblox.com/quick-login",
+ "roblox.copyCode": "Copiar código",
+ "roblox.setupDetected": "Conta detectada",
+ "roblox.setupConnected": "Conectado",
+ "roblox.setupReady": "Conta Roblox adicionada",
+ "roblox.setupReadyWithProfile": "{profile} adicionada",
+ "roblox.setupFailed": "Falha na configuração do Roblox",
+ "roblox.setupFailedMessage": "O Accshift não conseguiu terminar de adicionar esta conta Roblox.",
+ "settings.epic": "Epic Games",
+ "settings.epicPath": "Executável do Epic Games Launcher",
+ "settings.showEpicLastLogin": "Mostrar último login",
+ "toast.noEpicAccountsFound": "Nenhuma conta Epic Games encontrada. Entre no Epic Games Launcher pelo menos uma vez e atualize.",
+ "epic.noAccountsHint": "Pressione + para adicionar uma conta Epic Games.",
+ "epic.copyLabelAccountId": "ID da conta",
+ "epic.forget": "Esquecer",
+ "epic.forgetConfirmTitle": "Esquecer \"{display}\"?",
+ "epic.forgetConfirmMessage": "Isso vai remover esta conta e a sessão salva do Accshift.",
+ "epic.forgotAccount": "{display} esquecida",
+ "epic.setupPendingLabel": "Conta Epic Games",
+ "epic.setupWaitingForClient": "Aguardando o Epic Games Launcher...",
+ "epic.setupWaitingForLogin": "Entre na conta Epic Games que você quer adicionar.",
+ "epic.setupKeepMeLoggedIn": "Mantenha 'Lembrar de mim' ativado.",
+ "epic.setupDetected": "Conta detectada",
+ "epic.setupConnected": "Conectado",
+ "epic.setupReady": "Conta Epic Games adicionada",
+ "epic.setupReadyWithProfile": "{profile} adicionada",
+ "epic.setupFailed": "Falha na configuração da Epic Games",
+ "epic.setupFailedMessage": "O Accshift não conseguiu terminar de adicionar esta conta Epic Games.",
+ "settings.gog": "GOG Galaxy",
+ "settings.gogPath": "Executável do GOG Galaxy",
+ "settings.showGogLastLogin": "Mostrar último login",
+ "toast.noGogAccountsFound": "Nenhuma conta GOG Galaxy encontrada. Entre no GOG Galaxy pelo menos uma vez e atualize.",
+ "gog.noAccountsHint": "Pressione + para adicionar uma conta GOG Galaxy.",
+ "gog.copyLabelAccountId": "ID da conta",
+ "gog.forget": "Esquecer",
+ "gog.forgetConfirmTitle": "Esquecer \"{display}\"?",
+ "gog.forgetConfirmMessage": "Isso vai remover esta conta e a sessão salva do Accshift.",
+ "gog.forgotAccount": "{display} esquecida",
+ "gog.setupPendingLabel": "Conta GOG Galaxy",
+ "gog.setupWaitingForClient": "Aguardando o GOG Galaxy...",
+ "gog.setupWaitingForLogin": "Entre na conta GOG Galaxy que você quer adicionar.",
+ "gog.setupKeepMeLoggedIn": "Mantenha 'Continuar conectado' ativado.",
+ "gog.setupDetected": "Conta detectada",
+ "gog.setupConnected": "Conectado",
+ "gog.setupReady": "Conta GOG Galaxy adicionada",
+ "gog.setupReadyWithProfile": "{profile} adicionada",
+ "gog.setupFailed": "Falha na configuração do GOG Galaxy",
+ "gog.setupFailedMessage": "O Accshift não conseguiu terminar de adicionar esta conta GOG Galaxy.",
+ "settings.jagex": "Jagex Launcher",
+ "settings.jagexPath": "Executável do Jagex Launcher",
+ "settings.showJagexLastLogin": "Mostrar último login",
+ "toast.noJagexAccountsFound": "Nenhuma conta Jagex salva ainda. Pressione + para adicionar uma pelo Jagex Launcher.",
+ "jagex.noAccountsHint": "Pressione + para adicionar uma conta Jagex.",
+ "jagex.copyLabelAccountId": "ID da conta",
+ "jagex.forget": "Esquecer",
+ "jagex.forgetConfirmTitle": "Esquecer \"{display}\"?",
+ "jagex.forgetConfirmMessage": "Isso vai remover esta conta e a sessão salva do Accshift.",
+ "jagex.forgotAccount": "{display} esquecida",
+ "jagex.setupPendingLabel": "Conta Jagex",
+ "jagex.setupWaitingForClient": "Aguardando o Jagex Launcher...",
+ "jagex.setupWaitingForLogin": "Entre na conta Jagex que você quer adicionar.",
+ "jagex.setupKeepMeLoggedIn": "Mantenha 'Lembrar de mim' ativado.",
+ "jagex.setupDetected": "Conta detectada",
+ "jagex.setupConnected": "Conectado",
+ "jagex.setupReady": "Conta Jagex adicionada",
+ "jagex.setupReadyWithProfile": "{profile} adicionada",
+ "jagex.setupFailed": "Falha na configuração da Jagex",
+ "jagex.setupFailedMessage": "O Accshift não conseguiu terminar de adicionar esta conta Jagex.",
+ "settings.discord": "Discord",
+ "settings.discordPath": "Executável do Discord",
+ "settings.showDiscordLastLogin": "Mostrar último login",
+ "toast.noDiscordAccountsFound": "Nenhuma conta Discord encontrada. Adicione uma conta Discord e atualize.",
+ "discord.noAccountsHint": "Pressione + para adicionar uma conta Discord.",
+ "discord.copyLabelAccountId": "ID da conta",
+ "discord.forget": "Esquecer",
+ "discord.forgetConfirmTitle": "Esquecer \"{display}\"?",
+ "discord.forgetConfirmMessage": "Isso vai remover esta conta e a sessão salva do Accshift.",
+ "discord.forgotAccount": "{display} esquecida",
+ "discord.setupPendingLabel": "Conta Discord",
+ "discord.setupWaitingForClient": "Aguardando o Discord...",
+ "discord.setupWaitingForLogin": "Entre na conta Discord que você quer adicionar.",
+ "discord.setupKeepMeLoggedIn": "Continue conectado para manter esta conta.",
+ "discord.setupDetected": "Conta detectada",
+ "discord.setupConnected": "Conectado",
+ "discord.setupReady": "Conta Discord adicionada",
+ "discord.setupReadyWithProfile": "{profile} adicionada",
+ "discord.setupFailed": "Falha na configuração do Discord",
+ "discord.setupFailedMessage": "O Accshift não conseguiu terminar de adicionar esta conta Discord.",
+ "color.none": "Padrão",
+ "color.blue": "Azul",
+ "color.cyan": "Ciano",
+ "color.green": "Verde",
+ "color.lime": "Lima",
+ "color.yellow": "Amarelo",
+ "color.orange": "Laranja",
+ "color.red": "Vermelho",
+ "color.pink": "Rosa",
+ "color.violet": "Violeta",
+ "color.gray": "Cinza",
+ "language.english": "English",
+ "language.french": "Français",
+ "language.spanish": "Español",
+ "language.portuguese": "Português (Portugal)",
+ "language.portugueseBrazil": "Português (Brasil)",
+ "language.russian": "Русский",
+ "language.chinese": "简体中文",
+ "theme.dark": "Escuro",
+ "theme.light": "Claro",
+ "theme.midnight": "Meia-noite",
+ "theme.glassDark": "Vidro escuro",
+ "theme.glassLight": "Vidro claro",
+ "theme.liquidGlass": "Vidro líquido",
+ "theme.custom": "Personalizado",
+ "settings.themeImport": "Importar",
+ "settings.themeExport": "Exportar",
+ "settings.themeDelete": "Excluir tema",
+ "settings.themeImported": "Tema importado",
+ "settings.themeDeleted": "Tema excluído",
+ "settings.themeExportCopied": "JSON do tema copiado para a área de transferência",
+ "settings.themeInvalidJson": "JSON de tema inválido",
+ "settings.themeCustomize": "Personalizar",
+ "settings.themeEdit": "Editar",
+ "settings.themeCopyName": "{name} cópia",
+ "settings.themeSaved": "Tema salvo",
+ "settings.themeMigrated": "Tema importado e atualizado para o formato atual",
+ "settings.themeInvalidId": "O identificador do tema está faltando ou é inválido",
+ "settings.themeInvalidName": "O tema não tem nome",
+ "settings.themeUnsupportedVersion": "Este tema precisa de uma versão mais recente do accshift",
+ "themeGroup.surface": "Superfícies",
+ "themeGroup.text": "Texto",
+ "themeGroup.semantic": "Cores de status",
+ "themeGroup.shape": "Forma e densidade",
+ "themeGroup.typography": "Tipografia",
+ "themeGroup.motion": "Movimento",
+ "themeKind.rgbTriplet": "trio RGB",
+ "themeKind.hexColor": "cor hexadecimal",
+ "themeKind.color": "cor",
+ "themeKind.length": "comprimento",
+ "themeKind.shadow": "sombra",
+ "themeKind.choice": "opção",
+ "themeKind.fontStack": "fonte",
+ "themeKind.signedLength": "espaçamento",
+ "themeKind.gradient": "gradiente",
+ "themeKind.number": "número",
+ "themeDensity.compact": "Compacta",
+ "themeDensity.cozy": "Normal",
+ "themeDensity.comfortable": "Ampla",
+ "themeAvatarShape.circle": "Redondo",
+ "themeAvatarShape.rounded": "Arredondado",
+ "themeAvatarShape.square": "Quadrado",
+ "themeSmoothing.auto": "Suavizado",
+ "themeSmoothing.none": "Pixel",
+ "themeToken.bgRgb": "Fundo da janela",
+ "themeToken.bgCard": "Fundo dos cartões",
+ "themeToken.bgCardHover": "Fundo dos cartões ao passar o cursor",
+ "themeToken.bgMuted": "Fundo atenuado",
+ "themeToken.bgElevated": "Fundo elevado",
+ "themeToken.border": "Bordas",
+ "themeToken.fg": "Texto principal",
+ "themeToken.fgMuted": "Texto secundário",
+ "themeToken.fgSubtle": "Texto discreto",
+ "themeToken.afkText": "Etiqueta de ausente",
+ "themeToken.accent": "Destaque",
+ "themeToken.accentFg": "Texto sobre o destaque",
+ "themeToken.success": "Sucesso",
+ "themeToken.warning": "Aviso",
+ "themeToken.danger": "Perigo",
+ "themeToken.radiusSm": "Raio pequeno",
+ "themeToken.radiusMd": "Raio médio",
+ "themeToken.radiusLg": "Raio grande",
+ "themeToken.elevationLow": "Sombra leve",
+ "themeToken.elevationMedium": "Sombra média",
+ "themeToken.elevationHigh": "Sombra forte",
+ "themeToken.density": "Densidade",
+ "themeToken.fontUi": "Fonte da interface",
+ "themeToken.bgImage": "Gradiente da janela",
+ "themeToken.cardBgImage": "Gradiente das superfícies",
+ "themeToken.borderWidth": "Espessura das bordas",
+ "themeToken.borderStyle": "Estilo das bordas",
+ "themeToken.avatarShape": "Forma dos avatares",
+ "themeToken.focusRing": "Contorno de foco",
+ "themeToken.overlayBlur": "Desfoque do fundo",
+ "themeToken.fontDisplay": "Fonte dos títulos",
+ "themeToken.lineHeight": "Altura da linha",
+ "themeToken.letterSpacing": "Espaçamento entre letras",
+ "themeToken.labelCase": "Maiúsculas dos rótulos",
+ "themeToken.fontSmoothing": "Suavização do texto",
+ "themeToken.motionScale": "Velocidade das animações",
+ "themeEditor.title": "Editor de temas",
+ "themeEditor.name": "Nome",
+ "themeEditor.author": "Autor",
+ "themeEditor.version": "Versão",
+ "themeEditor.base": "Herda de",
+ "themeEditor.colorScheme": "Modo de cor",
+ "themeEditor.glass": "Superfícies translúcidas",
+ "themeEditor.inherited": "Herdado",
+ "themeEditor.builtInBase": "Tema integrado",
+ "themeEditor.reset": "Voltar ao valor herdado",
+ "themeEditor.issues": "Verificações",
+ "themeEditor.noIssues": "Nada a relatar",
+ "themeEditor.fixErrorsFirst": "Corrija os valores recusados antes de salvar",
+ "themeEditor.save": "Salvar",
+ "themeEditor.saveFailed": "Não foi possível salvar o tema. Tente de novo.",
+ "themeEditor.export": "Copiar",
+ "themeEditor.issueInvalidValue": "{token}: {kind} inválido, por exemplo {example}",
+ "themeEditor.issueUnknownToken": "{token} não é um valor de tema, ele é ignorado",
+ "themeEditor.issueMissingToken": "{token} não está definido, o valor integrado é usado",
+ "themeEditor.issueUnknownBase": "O tema base {base} não existe, os valores integrados são usados",
+ "themeEditor.issueContrast": "{token} sobre {against}: {ratio} para 1, abaixo da meta de {target} para 1",
+ "themeEditor.beta": "Beta",
+ "themeEditor.betaNote": "O formato de tema ainda muda: um tema escrito hoje pode precisar de um ajuste depois de uma atualização.",
+ "themeEditor.customCss": "CSS personalizado",
+ "themeEditor.customCssHelp": "Aplicado sobre o tema, para o que os valores acima não alcançam. Sem @import nem url(): um tema nunca baixa nada.",
+ "themeEditor.issueUnsafeCss": "{construct} não é permitido em um tema, o CSS não é aplicado",
+ "themeEditor.issueCssTooLong": "CSS muito longo: {length} caracteres, o limite é {limit}",
+ "bulkEdit.title": "Edição em massa",
+ "bulkEdit.selectAccounts": "Selecionar contas",
+ "bulkEdit.selectAll": "Selecionar tudo",
+ "bulkEdit.deselectAll": "Desmarcar tudo",
+ "bulkEdit.next": "Avançar",
+ "bulkEdit.apply": "Aplicar",
+ "bulkEdit.settings": "Configurações",
+ "bulkEdit.newsPopup": "Pop-up de notícias do jogo",
+ "bulkEdit.doNotDisturb": "Não perturbe",
+ "bulkEdit.launchOptions": "Opções de inicialização por jogo",
+ "bulkEdit.unchanged": "Sem alteração",
+ "bulkEdit.addLaunchOption": "Adicionar",
+ "bulkEdit.selectGame": "Selecione um jogo...",
+ "bulkEdit.launchOptionsPlaceholder": "-fullscreen",
+ "bulkEdit.activeAccountWarning": "A conta ativa no momento está selecionada. As mudanças serão aplicadas no próximo reinício do Steam.",
+ "bulkEdit.toastSuccess": "Edição em massa: {count} com sucesso",
+ "bulkEdit.toastPartial": "Edição em massa: {succeeded} com sucesso, {failed} com falha",
+ "bulkEdit.toastFailed": "Falha na edição em massa",
+ "bulkEdit.noAccountsSelected": "Nenhuma conta selecionada",
+ "bulkEdit.selected": "{count} selecionadas",
+ "bulkEdit.loadingGames": "Carregando jogos...",
+ "bulkEdit.copyUrls": "Copiar URLs",
+ "bulkEdit.urlsCopied": "{count} URL(s) de perfil copiada(s)",
+ "bulkEdit.cardColor": "Cor do card",
+ "bulkEdit.colorApplied": "Cor aplicada a {count} card(s)",
+ "bulkEdit.colorCleared": "Cor removida de {count} card(s)",
+ "common.retry": "Tentar de novo",
+ "app.searchNoResults": "Nenhum resultado para \"{query}\"",
+ "app.folderEmpty": "Esta pasta está vazia",
+ "app.loadErrorGeneric": "Falha ao carregar as contas. Veja o console para mais detalhes.",
+ "toast.dismiss": "Dispensar",
+ "toast.switchFailed": "Falha ao trocar de conta. Veja o console para mais detalhes.",
+ "toast.addAccountFailed": "Não foi possível adicionar a conta. Veja os logs do app para mais detalhes.",
+ "toast.addAccountClientMissing": "O {platform} não parece estar instalado. Instale-o ou defina o local dele nas configurações.",
+ "toast.banCheckFailedGeneric": "Falha na checagem de banimentos. Veja o console para mais detalhes.",
+ "toast.renameAccountFailed": "Falha ao renomear: {error}",
+ "toast.copyFailed": "Não foi possível copiar para a área de transferência",
+ "toast.refreshFailed": "Falha ao atualizar. Veja o console para mais detalhes.",
+ "dialog.deleteFolderTitle": "Excluir \"{name}\"?",
+ "dialog.deleteFolderMessage": "As subpastas também são excluídas. As contas de dentro sobem um nível, não são removidas.",
+ "personas.deleteConfirm": "Clique de novo para excluir",
+ "personas.discardConfirm": "Clique de novo para descartar",
+ "personas.switchConfirmTitle": "Trocar de persona",
+ "personas.switchConfirmMessage": "Trocar {count} plataforma(s) para \"{name}\"? Cada cliente vai fechar e reabrir.",
+ "personas.switchConfirmAction": "Trocar",
+ "personas.deleteTitle": "Excluir persona",
+ "personas.deleteMessage": "Excluir \"{name}\"? As contas em si não são afetadas.",
+ "context.submenuError": "Não foi possível carregar este menu",
+ "settings.apiKeySaveFailed": "Não foi possível salvar a chave da API Steam",
+ "settings.apiKeyInvalidHint": "A chave não foi salva. Verifique e tente de novo.",
+ "settings.apiKeyCleared": "Chave da API Steam removida",
+ "settings.apiKeyClearFailed": "Não foi possível remover a chave da API Steam",
+ "settings.clearApiKey": "Limpar chave",
+ "settings.cs2Bridge": "Bridge de estatísticas do CS2",
+ "settings.cs2BridgeLink": "Link da bridge",
+ "settings.cs2BridgeLinkPlaceholder": "https://seu-servidor/api/bridge/accshift/",
+ "settings.cs2BridgeTest": "Testar",
+ "settings.cs2BridgeStatusOk": "Conectado · {count} contas · {ms} ms",
+ "settings.cs2BridgeStatusFail": "Falha na conexão",
+ "settings.cs2BridgeStatusTesting": "Testando...",
+ "settings.cs2BridgeStatusUnknown": "Não testado",
+ "settings.cs2BridgeToken": "Token da API",
+ "settings.cs2BridgeTokenOptional": "opcional, para servidores personalizados",
+ "settings.cs2BridgeTokenPlaceholder": "Token Bearer, se o seu servidor precisar",
+ "settings.cs2BridgeSaveFailed": "Não foi possível salvar as configurações da bridge do CS2",
+ "settings.cs2BridgeClearToken": "Limpar token",
+ "settings.pathSaveFailed": "Não foi possível salvar o caminho do {platform}",
+ "settings.pathInvalidHint": "Não foi possível salvar este caminho. Verifique e tente de novo.",
+ "settings.pathSteamNeverSignedIn": "Steam encontrado, entre uma vez para que ele crie o histórico de login",
+ "settings.pathNotSteamFolder": "Esta pasta não parece uma instalação do Steam",
+ "settings.pathNotADirectory": "O caminho precisa ser uma pasta existente",
+ "settings.pinSaved": "PIN salvo",
+ "settings.pinTakesEffectNextLaunch": "Tem efeito na próxima vez que o app iniciar",
+ "settings.pinRequiredAfterInactivity": "Exigido após inatividade e quando o app inicia",
+ "settings.pinScreenLockOnly": "O PIN bloqueia esta janela e as trocas de conta. Ele não protege nada no disco.",
+ "settings.unitSeconds": "segundos",
+ "settings.unitDays": "dias",
+ "settings.telemetryLoadFailed": "Não foi possível carregar as configurações de telemetria",
+ "palette.placeholder": "Digite um comando ou nome de conta...",
+ "palette.noResults": "Nenhum comando correspondente",
+ "palette.sectionAccounts": "Contas",
+ "palette.sectionActions": "Ações",
+ "palette.sectionNavigation": "Navegação",
+ "palette.openTab": "Ir para {platform}",
+ "palette.openFolder": "Abrir a pasta \"{name}\"",
+ "palette.backToParent": "Voltar para a pasta anterior",
+ "palette.zoomReset": "Redefinir zoom"
+}
diff --git a/crates/accshift-app/i18n/pt.json b/crates/accshift-app/i18n/pt.json
new file mode 100644
index 00000000..a0eaf92c
--- /dev/null
+++ b/crates/accshift-app/i18n/pt.json
@@ -0,0 +1,753 @@
+{
+ "app.loadingSettings": "A carregar definições...",
+ "app.loading": "A carregar...",
+ "app.searchPlaceholder": "Procurar conta...",
+ "app.noAccountsFound": "Nenhuma conta {platform} encontrada",
+ "app.noAccountsHint": "Confirma que {platform} está instalado e que já iniciaste sessão pelo menos uma vez.",
+ "app.switchingAccount": "A mudar de conta...",
+ "app.platformRestarting": "{platform} está a reiniciar",
+ "app.comingSoon": "{platform} - Brevemente",
+ "app.platformUnsupportedOs": "{platform} ainda não está disponível neste SO",
+ "app.noCompatiblePlatforms": "Nenhuma plataforma compatível está disponível neste SO",
+ "app.noCompatiblePlatformsHint": "Vê as atualizações de suporte para Windows ou usa uma máquina compatível.",
+ "update.ctaAvailable": "Atualização disponível",
+ "update.ctaInstalling": "A instalar...",
+ "update.restartToApplyVersion": "Reiniciar para aplicar a atualização {version}",
+ "update.restartToApply": "Reiniciar para aplicar a atualização",
+ "update.readyToastVersion": "Atualização {version} pronta",
+ "update.readyToast": "Atualização pronta",
+ "update.restartFailed": "Não foi possível reiniciar para aplicar a atualização",
+ "pin.lockedTitle": "Aplicação bloqueada",
+ "pin.lockedPrompt": "Introduz o PIN para desbloquear",
+ "pin.placeholder": "PIN de 4 dígitos",
+ "pin.unlock": "Desbloquear",
+ "pin.invalid": "PIN inválido",
+ "pin.tooManyAttempts": "Demasiadas tentativas. Tente novamente dentro de {seconds} s.",
+ "common.ok": "OK",
+ "common.cancel": "Cancelar",
+ "common.confirm": "Confirmar",
+ "common.close": "Fechar",
+ "common.back": "Voltar",
+ "common.active": "Ativa",
+ "common.choose": "Escolher...",
+ "common.none": "Nenhuma",
+ "common.custom": "Personalizado",
+ "common.configured": "Configurado",
+ "common.missing": "Em falta",
+ "common.enabled": "Ativado",
+ "common.disabled": "Desativado",
+ "common.on": "Ligado",
+ "common.off": "Desligado",
+ "common.add": "Adicionar",
+ "common.visible": "Visível",
+ "common.hidden": "Oculto",
+ "common.inline": "No cartão",
+ "common.tooltip": "Dica",
+ "titlebar.refresh": "Atualizar",
+ "titlebar.addAccount": "Adicionar conta",
+ "titlebar.settings": "Definições",
+ "titlebar.personas": "Personas",
+ "titlebar.minimize": "Minimizar",
+ "titlebar.maximize": "Maximizar",
+ "titlebar.restore": "Restaurar",
+ "titlebar.close": "Fechar",
+ "view.grid": "Vista de grelha",
+ "view.list": "Vista de lista",
+ "settings.title": "Definições",
+ "settings.general": "Geral",
+ "settings.appearance": "Aspeto",
+ "settings.language": "Idioma",
+ "settings.theme": "Tema",
+ "settings.uiZoom": "Zoom da interface",
+ "settings.backgroundOpacity": "Opacidade do fundo",
+ "settings.animations": "Animações",
+ "settings.animationsSystem": "Seguir o sistema",
+ "settings.animationsOn": "Sempre ativas",
+ "settings.animationsOff": "Desligadas",
+ "settings.performance": "Desempenho",
+ "settings.suspendGraphicsWhenMinimized": "Suspender gráficos quando minimizado",
+ "settings.minimizeOnAccountSwitch": "Minimizar ao mudar de conta",
+ "settings.system": "Sistema",
+ "settings.startWithSystem": "Iniciar no arranque",
+ "settings.startWithSystemHint": "Inicia o Accshift com o Windows, minimizado na área de notificação.",
+ "settings.closeToTray": "Fechar para a área de notificação",
+ "settings.closeToTrayHint": "O botão de fechar oculta o Accshift na área de notificação em vez de sair.",
+ "settings.autostartFailed": "Não foi possível alterar o arranque automático.",
+ "tray.open": "Abrir o Accshift",
+ "tray.quit": "Sair",
+ "settings.platforms": "Plataformas",
+ "settings.platformSearchPlaceholder": "Procurar plataformas...",
+ "settings.platformSearchNoResults": "Nenhuma plataforma corresponde à pesquisa.",
+ "settings.accountDisplay": "Apresentação das contas",
+ "settings.startupAndExtras": "Arranque",
+ "settings.defaultOnStartup": "Plataforma predefinida no arranque",
+ "settings.platformDisabledSuffix": "(desativada)",
+ "settings.platformUnsupportedOs": "SO não suportado",
+ "settings.platformNotImplemented": "Planeado",
+ "settings.platformUserProvided": "Adicionada a partir da sua pasta de descritores",
+ "settings.customPlatforms": "Plataformas personalizadas",
+ "settings.customPlatformsHint": "Os ficheiros de descritor desta pasta são lidos ao iniciar a aplicação.",
+ "settings.customPlatformsNone": "Nenhum descritor carregado a partir desta pasta.",
+ "settings.customPlatformsProblems": "Ficheiros que não carregaram",
+ "descriptor.addFromFile": "Adicionar a partir de um ficheiro",
+ "descriptor.reload": "Recarregar",
+ "descriptor.openFolder": "Abrir pasta",
+ "descriptor.remove": "Remover",
+ "descriptor.removeConfirmTitle": "Remover {platform}?",
+ "descriptor.removeConfirmMessage": "O ficheiro de descritor sai da sua pasta. As contas já capturadas ficam no disco.",
+ "descriptor.previewTitle": "Adicionar uma plataforma",
+ "descriptor.previewOs": "Descrita para {list}",
+ "descriptor.previewRoots": "Pastas em que pode tocar",
+ "descriptor.previewSteps": "O que uma troca de conta faria",
+ "descriptor.previewWarnings": "Avisos",
+ "descriptor.previewNoPlan": "Não foi possível criar uma simulação: {problem}",
+ "descriptor.previewReplaces": "Isto substitui o descritor que já está na sua pasta.",
+ "descriptor.previewNothingWritten": "Nada é escrito até que o adicione.",
+ "descriptor.replace": "Substituir",
+ "descriptor.installed": "{platform} adicionada",
+ "descriptor.removed": "{platform} removida",
+ "descriptor.actionRead": "ler",
+ "descriptor.actionCapture": "capturar",
+ "descriptor.actionRestore": "restaurar",
+ "descriptor.actionDelete": "remover",
+ "descriptor.actionClose": "fechar",
+ "descriptor.actionLaunch": "iniciar",
+ "settings.dataRefresh": "Atualização de dados",
+ "settings.avatarRefresh": "Atualização de avatares",
+ "settings.banCheckDelay": "Intervalo da verificação de bans",
+ "settings.refreshNow": "Atualizar agora",
+ "settings.zeroEachLaunch": "0 = a cada arranque",
+ "settings.privacy": "Privacidade",
+ "settings.inactivityTimeout": "Tempo de inatividade",
+ "settings.zeroDisabled": "0 = desativado",
+ "settings.streamerMode": "Modo streamer",
+ "settings.streamerModeHint": "Desfoca automaticamente os dados das contas quando há software de streaming a correr.",
+ "settings.personasHint": "Mostrar o seletor de identidades personas",
+ "settings.replayOnboarding": "Repetir a introdução",
+ "settings.replayOnboardingHint": "Mostra outra vez a visita guiada e a escolha das estatísticas de utilização.",
+ "streamer.title": "Modo streamer",
+ "streamer.disable": "Desativar",
+ "streamer.disablePermanently": "Desativar permanentemente",
+ "personas.title": "Personas",
+ "personas.create": "Nova persona",
+ "personas.activate": "Mudar para esta persona",
+ "personas.edit": "Editar",
+ "personas.delete": "Eliminar",
+ "personas.finish": "Concluir",
+ "personas.switching": "A mudar...",
+ "personas.switched": "Mudou para {name}",
+ "personas.switchPartial": "{name}: falhou em {failed}",
+ "personas.switchFailed": "Não foi possível mudar para {name}",
+ "personas.namePlaceholder": "Nome da persona",
+ "personas.choosePlatforms": "Escolhe uma conta para cada plataforma a incluir",
+ "personas.chooseAccount": "Escolhe a conta {platform}",
+ "personas.removeFromPersona": "Remover desta persona",
+ "personas.customImage": "Escolher uma imagem...",
+ "personas.removeImage": "Remover imagem",
+ "personas.imageError": "Não foi possível carregar essa imagem.",
+ "personas.loadingAccounts": "A carregar contas...",
+ "personas.noAccountsOnPlatform": "Ainda não há contas nesta plataforma",
+ "personas.emptyHint": "Um clique muda todas as plataformas incluídas para a respetiva conta.",
+ "settings.security": "Segurança",
+ "settings.pinLockOnAfk": "Bloqueio por PIN em inatividade",
+ "settings.pinCode": "Código PIN",
+ "settings.pinPlaceholder": "4 dígitos",
+ "settings.pinCurrentCode": "PIN atual",
+ "settings.pinCurrentHint": "Introduza o PIN atual para alterar ou desativar o bloqueio.",
+ "settings.telemetry": "Estatísticas de utilização (anónimas)",
+ "settings.telemetryModeA": "Estatísticas anónimas básicas",
+ "settings.telemetryModeAHint": "Conta os arranques e as funcionalidades utilizadas. Um ID local aleatório evita contagens duplicadas de instalações; não são enviados dados pessoais.",
+ "settings.telemetryModeB": "Estatísticas avançadas com UUID local (opcional)",
+ "settings.telemetryModeBHint": "Adiciona um UUID aleatório guardado apenas nesta máquina. Permite medir a retenção e saber que funcionalidades importam. Continuam a não ser enviados dados pessoais.",
+ "settings.telemetryExport": "Exportar os meus dados",
+ "settings.telemetryExported": "Dados copiados para a área de transferência",
+ "settings.telemetryExportFailed": "A exportação falhou",
+ "settings.telemetryEnableFailed": "Não foi possível ativar as estatísticas avançadas",
+ "settings.telemetryDisableFailed": "Não foi possível desativar as estatísticas avançadas",
+ "settings.telemetryDeletePending": "As estatísticas avançadas estão desligadas; a eliminação no servidor precisa de outra tentativa",
+ "settings.telemetryDeletePendingHint": "A eliminação no servidor está pendente. O ID local antigo é mantido apenas para poderes repetir a eliminação ou exportar os dados associados.",
+ "settings.telemetryRetryDelete": "Repetir a eliminação dos dados",
+ "settings.telemetryDeleteCompleted": "Dados do servidor eliminados",
+ "settings.telemetryDeleteRetryFailed": "A eliminação no servidor continua pendente",
+ "settings.telemetryLearnMore": "Que dados são enviados?",
+ "onboarding.welcome.title": "Bem-vindo ao Accshift",
+ "onboarding.welcome.version": "v{version}",
+ "onboarding.welcome.compatibleWith": "O teu sistema operativo é compatível com:",
+ "onboarding.welcome.detectedPlatforms": "Estas são as plataformas detetadas no teu computador:",
+ "onboarding.welcome.next": "Mostra-me a aplicação",
+ "onboarding.welcome.skip": "Ignorar",
+ "onboarding.features.hint": "Esta parte da aplicação não está visível neste momento.",
+ "onboarding.features.addAccount.label": "Adicionar uma conta",
+ "onboarding.features.addAccount.body": "O botão + no canto superior direito adiciona uma conta à plataforma atual. Inicias sessão uma vez, o Accshift guarda-a.",
+ "onboarding.features.switch.label": "Mudar de conta",
+ "onboarding.features.switch.body": "Clica num cartão e ficas nessa conta. É basicamente toda a aplicação, sinceramente.",
+ "onboarding.features.contextMenu.label": "Clique direito para as ações",
+ "onboarding.features.contextMenu.body": "Clica com o botão direito num cartão para o renomear, mudar a cor, movê-lo para uma pasta ou eliminá-lo.",
+ "onboarding.features.platformSwitch.label": "Mudar de plataforma",
+ "onboarding.features.platformSwitch.body": "O mesmo para Riot, Battle.net, Epic e as restantes. Os separadores no topo mudam de plataforma.",
+ "onboarding.features.next": "Seguinte",
+ "onboarding.features.back": "Voltar",
+ "onboarding.features.step": "Passo {step}",
+ "onboarding.features.mockRename": "Renomear",
+ "onboarding.features.mockSetColor": "Definir cor",
+ "onboarding.features.mockMoveToFolder": "Mover para pasta",
+ "onboarding.features.mockDelete": "Eliminar",
+ "onboarding.features.mockAccount": "Conta {number}",
+ "onboarding.telemetry.title": "VENDE A TUA ALMA AO ACCSHIFT!",
+ "onboarding.telemetry.intro": "O Accshift conta algumas estatísticas de utilização anónimas para eu saber o que corrigir primeiro. Nada de pessoal sai da tua máquina, a aplicação funciona na mesma, e podes mudar de ideias quando quiseres nas definições.",
+ "onboarding.telemetry.question": "Negócio fechado?",
+ "onboarding.telemetry.gifAlt": "Meme Trade Offer",
+ "onboarding.telemetry.basic": "NÃO! Já chega",
+ "onboarding.telemetry.basicDefault": "(predefinido)",
+ "onboarding.telemetry.basicHint": "Apenas contadores anónimos e nada mais: sem perfil, sem identificador que te siga.",
+ "onboarding.telemetry.deal": "NEGÓCIO FECHADO",
+ "onboarding.telemetry.dealHint": "Adiciona um UUID separado para as estatísticas avançadas, guardado apenas na tua máquina. Continuo sem saber quem és, mas ajudas imenso. Obrigado!",
+ "onboarding.telemetry.optOutNote": "Escolhas o que escolheres, podes mudar depois em Definições -> Privacidade. :c",
+ "onboarding.telemetry.refuse": "Não obrigado, desliga tudo",
+ "onboarding.telemetry.refuseHint": "Nada é medido nem enviado, nem sequer os contadores anónimos.",
+ "onboarding.telemetry.back": "Voltar",
+ "onboarding.persistFailed": "Não foi possível guardar essa escolha. Tenta de novo.",
+ "onboarding.persistLater": "Perguntar no próximo arranque",
+ "settings.steam": "Steam",
+ "settings.riot": "Riot",
+ "settings.battleNet": "Battle.net",
+ "settings.ubisoft": "Ubisoft Connect",
+ "settings.runSteamAsAdmin": "Executar o Steam como administrador",
+ "settings.showUsernames": "Mostrar nomes de utilizador",
+ "settings.showSteamLastLogin": "Mostrar última sessão Steam",
+ "settings.showRiotLastLogin": "Mostrar última sessão Riot",
+ "settings.showBattleNetLastLogin": "Mostrar última sessão Battle.net",
+ "settings.showUbisoftLastLogin": "Mostrar última sessão Ubisoft",
+ "settings.showNotesUnderCards": "Mostrar notas sob os cartões",
+ "settings.expandedFolders": "Expandir todas as pastas",
+ "list.rootSection": "Raiz",
+ "settings.steamLaunch": "Mudança",
+ "settings.steamInstallation": "Instalação",
+ "settings.steamApiAndData": "API e dados",
+ "settings.launchOptions": "Opções de arranque",
+ "settings.shutdownMode": "Modo de encerramento",
+ "settings.shutdownModeGraceful": "Suave",
+ "settings.shutdownModeForce": "Forçar fecho",
+ "settings.autoDetected": "Detetado automaticamente",
+ "settings.steamFolder": "Pasta do Steam",
+ "settings.steamFolderRegistry": "Registo",
+ "settings.riotClientPath": "Executável do Riot Client",
+ "settings.battleNetPath": "Executável do Battle.net",
+ "settings.ubisoftPath": "Pasta do Ubisoft Connect",
+ "settings.steamWebApiKey": "Chave da Steam Web API",
+ "settings.getKey": "Obter chave",
+ "settings.pasteApiKey": "Cola a tua chave da Steam Web API",
+ "settings.saved": "Definições guardadas",
+ "settings.openApiKeyFailed": "Não foi possível abrir a página da chave da API Steam",
+ "settings.integrations": "Integrações",
+ "settings.deepLinks": "Permitir ligações accshift://",
+ "settings.deepLinksHint": "Deixa outras aplicações mudarem de conta por ti: favoritos, Stream Deck, scripts.",
+ "settings.cliEnabled": "Permitir a CLI do accshift",
+ "settings.cliEnabledHint": "Deixa a ferramenta de linha de comandos listar e mudar de conta. Desativado, todos os comandos accshift recusam-se a correr, diag incluído; a aplicação em si não é afetada.",
+ "settings.help": "Abrir a wiki do accshift",
+ "settings.helpShort": "Ajuda",
+ "settings.openHelpFailed": "Não foi possível abrir a wiki",
+ "settings.logs": "Registos",
+ "settings.openLogs": "Abrir a pasta dos registos",
+ "settings.openLogsFailed": "Não foi possível abrir a pasta dos registos",
+ "context.loading": "A carregar...",
+ "context.noGamesFound": "Nenhum jogo encontrado",
+ "context.field.cut": "Cortar",
+ "context.field.copy": "Copiar",
+ "context.field.paste": "Colar",
+ "context.field.selectAll": "Selecionar tudo",
+ "context.menu.newFolder": "Nova pasta",
+ "context.menu.refresh": "Atualizar",
+ "context.menu.rename": "Renomear",
+ "context.menu.copy": "Copiar...",
+ "context.menu.deleteFolder": "Eliminar pasta",
+ "context.menu.folderColor": "Cor da pasta",
+ "context.menu.moveToFolder": "Mover para uma pasta",
+ "context.menu.moveToRoot": "Sem pasta",
+ "context.menu.editCardAndColor": "Editar cartão e cor",
+ "context.menu.cardColor": "Cor do cartão",
+ "context.menu.addNote": "Adicionar nota",
+ "context.menu.editNote": "Editar nota",
+ "platform.rename": "Renomear",
+ "platform.renameTitle": "Renomear conta",
+ "platform.renamePlaceholder": "Nome da conta",
+ "platform.newAccountPending": "A aguardar...",
+ "platform.setupBusy": "Está a decorrer outra operação do accshift. A aguardar que termine.",
+ "platform.renameNewAccount": "Dá um nome a esta conta",
+ "platform.copyLabelAccountId": "ID da conta",
+ "platform.forget": "Esquecer",
+ "platform.forgetConfirmTitle": "Esquecer «{display}»?",
+ "platform.forgetConfirmMessage": "Isto remove esta conta e a sua sessão guardada do Accshift.",
+ "platform.forgotAccount": "{display} esquecida",
+ "dialog.newFolderTitle": "Nova pasta",
+ "dialog.renameFolderTitle": "Renomear pasta",
+ "dialog.folderNamePlaceholder": "Nome da pasta",
+ "dialog.cardNoteTitle": "Nota do cartão",
+ "dialog.cardNotePlaceholder": "Escreve uma nota curta",
+ "card.noteAttached": "Nota anexada",
+ "card.clickAgainToSwitch": "Clique novamente para trocar",
+ "card.extensionWarnings": "Avisos",
+ "card.extensionNote": "Nota",
+ "card.cs2Section": "CS2",
+ "card.cs2Level": "Nível {level}",
+ "card.cs2CaseEarned": "Caixa semanal obtida",
+ "card.cs2CaseNotEarned": "Caixa semanal pendente",
+ "list.selectAccountPreview": "Seleciona uma conta para pré-visualizar",
+ "preview.noteLabel": "Nota",
+ "preview.currentlyActive": "Ativa neste momento",
+ "preview.switchAgain": "Mudar outra vez",
+ "preview.switchAccount": "Mudar de conta",
+ "ban.community": "Ban da comunidade",
+ "ban.vac.single": "{count} ban VAC",
+ "ban.vac.multiple": "{count} bans VAC",
+ "ban.game.single": "{count} ban de jogo",
+ "ban.game.multiple": "{count} bans de jogo",
+ "time.unknown": "desconhecido",
+ "time.justNow": "agora mesmo",
+ "time.minuteAgo": "há {count} minuto",
+ "time.minutesAgo": "há {count} minutos",
+ "time.hourAgo": "há {count} hora",
+ "time.hoursAgo": "há {count} horas",
+ "time.dayAgo": "há {count} dia",
+ "time.daysAgo": "há {count} dias",
+ "time.neverConnected": "nunca iniciou sessão",
+ "time.compactWrapper": "({value})",
+ "toast.copied": "{label} copiado",
+ "toast.legacyConfigMigrated": "Definições migradas para o novo formato",
+ "toast.legacyConfigMigrationFailed": "Falha ao migrar as definições antigas, consulta os registos",
+ "toast.failedLoadSettingsPanel": "Falha ao carregar o painel de definições",
+ "toast.banChecking": "A verificar bans...",
+ "toast.banCheckSummary.single": "Verificação de bans: {count} conta com bans",
+ "toast.banCheckSummary.multiple": "Verificação de bans: {count} contas com bans",
+ "toast.banCheckFailed": "A verificação de bans falhou: {error}",
+ "toast.avatarRefreshComplete": "Atualização de avatares concluída para {count} contas",
+ "toast.banRefreshComplete": "Atualização de bans concluída para {count} contas",
+ "toast.banRefreshNoApiKey": "Atualização de bans ignorada: adiciona uma chave da Steam Web API nas definições",
+ "toast.refreshPartial": "Atualização concluída para {ok} de {count} contas",
+ "toast.noSteamAccountsFound": "Nenhuma conta Steam encontrada. Inicia sessão no Steam pelo menos uma vez e atualiza.",
+ "toast.accountsRefreshed.single": "{count} conta atualizada",
+ "toast.accountsRefreshed.multiple": "{count} contas atualizadas",
+ "toast.steamFolderNotFound": "A pasta do Steam não foi encontrada. Define-a manualmente em Definições > Pasta do Steam.",
+ "toast.steamElevated": "O Steam está a correr como administrador. Ativa 'Executar o Steam como administrador' em Definições > Steam.",
+ "toast.noRiotProfilesFound": "Ainda não há perfis Riot. Clica em + para adicionar um.",
+ "toast.noBattleNetAccountsFound": "Nenhuma conta Battle.net encontrada. Inicia sessão no Battle.net pelo menos uma vez e atualiza.",
+ "toast.noUbisoftAccountsFound": "Nenhuma conta Ubisoft encontrada. Inicia sessão no Ubisoft Connect pelo menos uma vez e atualiza.",
+ "toast.deepLinkInvalid": "Ligação accshift:// não reconhecida",
+ "toast.deepLinkDisabled": "As ligações accshift:// estão desativadas nas definições",
+ "toast.deepLinkUnknownPlatform": "Plataforma desconhecida na ligação: {platform}",
+ "toast.deepLinkPlatformDisabled": "{platform} está desativada nas definições",
+ "toast.deepLinkAccountNotFound": "Nenhuma conta {platform} corresponde a «{account}»",
+ "toast.deepLinkSwitched": "Mudou para {account}",
+ "dialog.deepLinkSwitchTitle": "Mudar de conta?",
+ "dialog.deepLinkSwitchMessage": "Uma ligação accshift:// está a pedir para mudar a tua conta {platform} para «{account}». Continuar?",
+ "dialog.deepLinkSwitchConfirm": "Mudar",
+ "steam.launchOnline": "Mudar como online",
+ "steam.launchInvisible": "Mudar como invisível",
+ "steam.switchAndRunGame": "Mudar + iniciar {game}",
+ "steam.switchAndRunPick": "Mudar + iniciar um jogo...",
+ "steam.runGame": "Iniciar {game}",
+ "steam.runPick": "Iniciar um jogo...",
+ "steam.switchAndRunNoGames": "Nenhum jogo encontrado",
+ "steam.clearDefaultGame": "Limpar jogo predefinido",
+ "steam.copySteamId64": "Copiar SteamID64",
+ "steam.copyFriendCode": "Copiar código de amigo",
+ "steam.copyProfileUrl": "Copiar URL do perfil",
+ "steam.copyLabelUsername": "Nome de utilizador",
+ "steam.copyLabelSteamId64": "SteamID64",
+ "steam.copyLabelFriendCode": "Código de amigo",
+ "steam.copyLabelProfileUrl": "URL do perfil",
+ "steam.openUserdataFolder": "Abrir a pasta userdata",
+ "steam.clearIntegratedBrowserCache": "Repor a sessão do navegador",
+ "steam.clearIntegratedBrowserCacheConfirmTitle": "Repor a sessão do navegador do Steam?",
+ "steam.clearIntegratedBrowserCacheConfirmMessage": "Isto fecha o Steam e limpa a cache do navegador integrado usado pela Loja e pela Comunidade.",
+ "steam.clearedIntegratedBrowserCache": "Sessão do navegador do Steam reposta",
+ "steam.copySettingsFrom": "Copiar definições de",
+ "steam.copiedSettingsToCurrent": "Definições de {game} copiadas para a conta atual",
+ "steam.forget": "Esquecer",
+ "steam.forgetConfirmTitle": "Esquecer «{display}»?",
+ "steam.forgetConfirmMessage": "Isto remove esta conta da tua lista de contas Steam neste PC.",
+ "steam.forgotAccount": "{username} esquecida",
+ "steam.setupPendingLabel": "Conta Steam",
+ "steam.setupWaitingForClient": "À espera do Steam...",
+ "steam.setupWaitingForLogin": "Inicia sessão na conta Steam que queres adicionar.",
+ "steam.setupDetected": "Conta detetada",
+ "steam.setupConnected": "Ligado",
+ "steam.setupReady": "Conta Steam adicionada",
+ "steam.setupReadyWithProfile": "{profile} adicionada",
+ "steam.setupFailed": "A configuração do Steam falhou",
+ "steam.setupFailedMessage": "O Accshift não conseguiu concluir a adição desta conta Steam.",
+ "riot.captureSession": "Capturar a sessão atual",
+ "riot.recaptureSession": "Voltar a capturar a sessão",
+ "riot.capturedSession": "Sessão capturada para {profile}",
+ "riot.setupPendingLabel": "Conta Riot",
+ "riot.setupWaitingForClient": "À espera do Riot Client...",
+ "riot.setupWaitingForLogin": "Inicia sessão na conta Riot que queres adicionar.",
+ "riot.setupCapturing": "A guardar a sessão Riot...",
+ "riot.setupReady": "Conta Riot adicionada",
+ "riot.setupReadyWithProfile": "{profile} adicionada",
+ "riot.setupFailed": "A configuração do Riot falhou",
+ "riot.setupFailedMessage": "O Accshift não conseguiu concluir a adição desta conta Riot.",
+ "riot.setupStaySignedIn": "Mantém 'Manter sessão iniciada' ativado.",
+ "riot.setupDetected": "Conta detetada",
+ "riot.setupConnected": "Ligado",
+ "riot.forget": "Esquecer conta",
+ "riot.forgetConfirmTitle": "Esquecer «{display}»?",
+ "riot.forgetConfirmMessage": "Isto remove o perfil Riot local e a sua sessão guardada do Accshift.",
+ "riot.forgotProfile": "{profile} esquecido",
+ "battlenet.copyUsername": "Copiar nome de utilizador",
+ "battlenet.copyLabelUsername": "Nome de utilizador",
+ "battlenet.copyEmail": "Copiar email",
+ "battlenet.copyLabelEmail": "Email",
+ "battlenet.forget": "Esquecer",
+ "battlenet.forgetConfirmTitle": "Esquecer «{display}»?",
+ "battlenet.forgetConfirmMessage": "Isto remove esta conta da lista de contas Battle.net neste PC.",
+ "battlenet.forgotAccount": "{email} esquecida",
+ "battlenet.setupPendingLabel": "Conta Battle.net",
+ "battlenet.setupWaitingForClient": "À espera do Battle.net...",
+ "battlenet.setupWaitingForLogin": "Inicia sessão na conta Battle.net que queres adicionar.",
+ "battlenet.setupKeepMeLoggedIn": "Mantém 'Manter sessão iniciada' ativado, se possível.",
+ "battlenet.setupDetected": "Conta detetada",
+ "battlenet.setupConnected": "Ligado",
+ "battlenet.setupReady": "Conta Battle.net adicionada",
+ "battlenet.setupReadyWithProfile": "{profile} adicionada",
+ "battlenet.setupFailed": "A configuração do Battle.net falhou",
+ "battlenet.setupFailedMessage": "O Accshift não conseguiu concluir a adição desta conta Battle.net.",
+ "ubisoft.copyLabelUuid": "UUID",
+ "ubisoft.forget": "Esquecer",
+ "ubisoft.forgetConfirmTitle": "Esquecer «{display}»?",
+ "ubisoft.forgetConfirmMessage": "Isto remove esta conta e a sua sessão guardada do Accshift.",
+ "ubisoft.forgotAccount": "{display} esquecida",
+ "ubisoft.setupPendingLabel": "Conta Ubisoft",
+ "ubisoft.setupWaitingForClient": "À espera do Ubisoft Connect...",
+ "ubisoft.setupWaitingForLogin": "Inicia sessão na conta Ubisoft que queres adicionar.",
+ "ubisoft.setupKeepMeLoggedIn": "Mantém 'Lembrar-me' ativado.",
+ "ubisoft.setupDetected": "Conta detetada",
+ "ubisoft.setupConnected": "Ligado",
+ "ubisoft.setupReady": "Conta Ubisoft adicionada",
+ "ubisoft.setupReadyWithProfile": "{profile} adicionada",
+ "ubisoft.setupFailed": "A configuração do Ubisoft falhou",
+ "ubisoft.setupFailedMessage": "O Accshift não conseguiu concluir a adição desta conta Ubisoft.",
+ "settings.roblox": "Roblox",
+ "toast.noRobloxAccountsFound": "Nenhuma conta Roblox encontrada. Adiciona uma conta com o Quick Login ou cola um cookie.",
+ "roblox.noAccountsHint": "Carrega em + para adicionar uma conta Roblox via Quick Login.",
+ "roblox.sessionExpired": "Sessão expirada",
+ "roblox.sessionExpiredTooltip": "Esta conta tem a sessão terminada. Volta a adicioná-la antes de mudar.",
+ "roblox.sessionExpiredSwitchError": "Sessão expirada. Volta a adicionar esta conta para mudar. As notas e definições são mantidas.",
+ "roblox.cookiePasteTitle": "Adicionar conta por cookie",
+ "roblox.cookiePasteHint": "Cola um cookie .ROBLOSECURITY do teu navegador para adicionar uma conta diretamente.",
+ "settings.showRobloxLastLogin": "Mostrar última sessão",
+ "settings.robloxHealthCheck": "Verificação de sessão",
+ "settings.robloxHealthCheckHint": "Assinala as contas cuja sessão Roblox expirou; um pedido de rede por arranque.",
+ "roblox.copyLabelUsername": "Nome de utilizador",
+ "roblox.copyLabelUserId": "ID de utilizador",
+ "roblox.forget": "Esquecer",
+ "roblox.forgetConfirmTitle": "Esquecer «{display}»?",
+ "roblox.forgetConfirmMessage": "Isto remove esta conta e o cookie guardado deste PC.",
+ "roblox.forgotAccount": "{display} esquecida",
+ "roblox.setupPendingLabel": "Conta Roblox",
+ "roblox.setupWaitingForClient": "A ligar ao Roblox...",
+ "roblox.setupWaitingForLogin": "Abre a aplicação Roblox noutro dispositivo e introduz o código abaixo.",
+ "roblox.setupQuickLoginCode": "Código Quick Login",
+ "roblox.setupQuickLoginHint": "roblox.com/quick-login",
+ "roblox.copyCode": "Copiar código",
+ "roblox.setupDetected": "Conta detetada",
+ "roblox.setupConnected": "Ligado",
+ "roblox.setupReady": "Conta Roblox adicionada",
+ "roblox.setupReadyWithProfile": "{profile} adicionada",
+ "roblox.setupFailed": "A configuração do Roblox falhou",
+ "roblox.setupFailedMessage": "O Accshift não conseguiu concluir a adição desta conta Roblox.",
+ "settings.epic": "Epic Games",
+ "settings.epicPath": "Executável do Epic Games Launcher",
+ "settings.showEpicLastLogin": "Mostrar última sessão",
+ "toast.noEpicAccountsFound": "Nenhuma conta Epic Games encontrada. Inicia sessão no Epic Games Launcher pelo menos uma vez e atualiza.",
+ "epic.noAccountsHint": "Carrega em + para adicionar uma conta Epic Games.",
+ "epic.copyLabelAccountId": "ID da conta",
+ "epic.forget": "Esquecer",
+ "epic.forgetConfirmTitle": "Esquecer «{display}»?",
+ "epic.forgetConfirmMessage": "Isto remove esta conta e a sua sessão guardada do Accshift.",
+ "epic.forgotAccount": "{display} esquecida",
+ "epic.setupPendingLabel": "Conta Epic Games",
+ "epic.setupWaitingForClient": "À espera do Epic Games Launcher...",
+ "epic.setupWaitingForLogin": "Inicia sessão na conta Epic Games que queres adicionar.",
+ "epic.setupKeepMeLoggedIn": "Mantém 'Lembrar-me' ativado.",
+ "epic.setupDetected": "Conta detetada",
+ "epic.setupConnected": "Ligado",
+ "epic.setupReady": "Conta Epic Games adicionada",
+ "epic.setupReadyWithProfile": "{profile} adicionada",
+ "epic.setupFailed": "A configuração do Epic Games falhou",
+ "epic.setupFailedMessage": "O Accshift não conseguiu concluir a adição desta conta Epic Games.",
+ "settings.gog": "GOG Galaxy",
+ "settings.gogPath": "Executável do GOG Galaxy",
+ "settings.showGogLastLogin": "Mostrar última sessão",
+ "toast.noGogAccountsFound": "Nenhuma conta GOG Galaxy encontrada. Inicia sessão no GOG Galaxy pelo menos uma vez e atualiza.",
+ "gog.noAccountsHint": "Carrega em + para adicionar uma conta GOG Galaxy.",
+ "gog.copyLabelAccountId": "ID da conta",
+ "gog.forget": "Esquecer",
+ "gog.forgetConfirmTitle": "Esquecer «{display}»?",
+ "gog.forgetConfirmMessage": "Isto remove esta conta e a sua sessão guardada do Accshift.",
+ "gog.forgotAccount": "{display} esquecida",
+ "gog.setupPendingLabel": "Conta GOG Galaxy",
+ "gog.setupWaitingForClient": "À espera do GOG Galaxy...",
+ "gog.setupWaitingForLogin": "Inicia sessão na conta GOG Galaxy que queres adicionar.",
+ "gog.setupKeepMeLoggedIn": "Mantém 'Manter sessão iniciada' ativado.",
+ "gog.setupDetected": "Conta detetada",
+ "gog.setupConnected": "Ligado",
+ "gog.setupReady": "Conta GOG Galaxy adicionada",
+ "gog.setupReadyWithProfile": "{profile} adicionada",
+ "gog.setupFailed": "A configuração do GOG Galaxy falhou",
+ "gog.setupFailedMessage": "O Accshift não conseguiu concluir a adição desta conta GOG Galaxy.",
+ "settings.jagex": "Jagex Launcher",
+ "settings.jagexPath": "Executável do Jagex Launcher",
+ "settings.showJagexLastLogin": "Mostrar última sessão",
+ "toast.noJagexAccountsFound": "Ainda não há contas Jagex guardadas. Carrega em + para adicionar uma através do Jagex Launcher.",
+ "jagex.noAccountsHint": "Carrega em + para adicionar uma conta Jagex.",
+ "jagex.copyLabelAccountId": "ID da conta",
+ "jagex.forget": "Esquecer",
+ "jagex.forgetConfirmTitle": "Esquecer «{display}»?",
+ "jagex.forgetConfirmMessage": "Isto remove esta conta e a sua sessão guardada do Accshift.",
+ "jagex.forgotAccount": "{display} esquecida",
+ "jagex.setupPendingLabel": "Conta Jagex",
+ "jagex.setupWaitingForClient": "À espera do Jagex Launcher...",
+ "jagex.setupWaitingForLogin": "Inicia sessão na conta Jagex que queres adicionar.",
+ "jagex.setupKeepMeLoggedIn": "Mantém 'Lembrar-me' ativado.",
+ "jagex.setupDetected": "Conta detetada",
+ "jagex.setupConnected": "Ligado",
+ "jagex.setupReady": "Conta Jagex adicionada",
+ "jagex.setupReadyWithProfile": "{profile} adicionada",
+ "jagex.setupFailed": "A configuração do Jagex falhou",
+ "jagex.setupFailedMessage": "O Accshift não conseguiu concluir a adição desta conta Jagex.",
+ "settings.discord": "Discord",
+ "settings.discordPath": "Executável do Discord",
+ "settings.showDiscordLastLogin": "Mostrar última sessão",
+ "toast.noDiscordAccountsFound": "Nenhuma conta Discord encontrada. Adiciona uma conta Discord e atualiza.",
+ "discord.noAccountsHint": "Carrega em + para adicionar uma conta Discord.",
+ "discord.copyLabelAccountId": "ID da conta",
+ "discord.forget": "Esquecer",
+ "discord.forgetConfirmTitle": "Esquecer «{display}»?",
+ "discord.forgetConfirmMessage": "Isto remove esta conta e a sua sessão guardada do Accshift.",
+ "discord.forgotAccount": "{display} esquecida",
+ "discord.setupPendingLabel": "Conta Discord",
+ "discord.setupWaitingForClient": "À espera do Discord...",
+ "discord.setupWaitingForLogin": "Inicia sessão na conta Discord que queres adicionar.",
+ "discord.setupKeepMeLoggedIn": "Mantém a sessão iniciada para conservar esta conta.",
+ "discord.setupDetected": "Conta detetada",
+ "discord.setupConnected": "Ligado",
+ "discord.setupReady": "Conta Discord adicionada",
+ "discord.setupReadyWithProfile": "{profile} adicionada",
+ "discord.setupFailed": "A configuração do Discord falhou",
+ "discord.setupFailedMessage": "O Accshift não conseguiu concluir a adição desta conta Discord.",
+ "color.none": "Predefinida",
+ "color.blue": "Azul",
+ "color.cyan": "Ciano",
+ "color.green": "Verde",
+ "color.lime": "Verde-lima",
+ "color.yellow": "Amarelo",
+ "color.orange": "Laranja",
+ "color.red": "Vermelho",
+ "color.pink": "Rosa",
+ "color.violet": "Violeta",
+ "color.gray": "Cinzento",
+ "language.english": "English",
+ "language.french": "Français",
+ "language.spanish": "Español",
+ "language.portuguese": "Português (Portugal)",
+ "language.portugueseBrazil": "Português (Brasil)",
+ "language.russian": "Русский",
+ "language.chinese": "简体中文",
+ "theme.dark": "Escuro",
+ "theme.light": "Claro",
+ "theme.midnight": "Meia-noite",
+ "theme.glassDark": "Vidro escuro",
+ "theme.glassLight": "Vidro claro",
+ "theme.liquidGlass": "Vidro líquido",
+ "theme.custom": "Personalizado",
+ "settings.themeImport": "Importar",
+ "settings.themeExport": "Exportar",
+ "settings.themeDelete": "Eliminar tema",
+ "settings.themeImported": "Tema importado",
+ "settings.themeDeleted": "Tema eliminado",
+ "settings.themeExportCopied": "JSON do tema copiado para a área de transferência",
+ "settings.themeInvalidJson": "JSON de tema inválido",
+ "settings.themeCustomize": "Personalizar",
+ "settings.themeEdit": "Editar",
+ "settings.themeCopyName": "{name} cópia",
+ "settings.themeSaved": "Tema guardado",
+ "settings.themeMigrated": "Tema importado e atualizado para o formato atual",
+ "settings.themeInvalidId": "O identificador do tema está em falta ou é inválido",
+ "settings.themeInvalidName": "O tema não tem nome",
+ "settings.themeUnsupportedVersion": "Este tema precisa de uma versão mais recente do accshift",
+ "themeGroup.surface": "Superfícies",
+ "themeGroup.text": "Texto",
+ "themeGroup.semantic": "Cores de estado",
+ "themeGroup.shape": "Forma e densidade",
+ "themeGroup.typography": "Tipografia",
+ "themeGroup.motion": "Movimento",
+ "themeKind.rgbTriplet": "trio RGB",
+ "themeKind.hexColor": "cor hexadecimal",
+ "themeKind.color": "cor",
+ "themeKind.length": "comprimento",
+ "themeKind.shadow": "sombra",
+ "themeKind.choice": "opção",
+ "themeKind.fontStack": "tipo de letra",
+ "themeKind.signedLength": "espaçamento",
+ "themeKind.gradient": "gradiente",
+ "themeKind.number": "número",
+ "themeDensity.compact": "Compacta",
+ "themeDensity.cozy": "Normal",
+ "themeDensity.comfortable": "Ampla",
+ "themeAvatarShape.circle": "Redondo",
+ "themeAvatarShape.rounded": "Arredondado",
+ "themeAvatarShape.square": "Quadrado",
+ "themeSmoothing.auto": "Suavizado",
+ "themeSmoothing.none": "Pixel",
+ "themeToken.bgRgb": "Fundo da janela",
+ "themeToken.bgCard": "Fundo dos cartões",
+ "themeToken.bgCardHover": "Fundo dos cartões ao passar o cursor",
+ "themeToken.bgMuted": "Fundo atenuado",
+ "themeToken.bgElevated": "Fundo elevado",
+ "themeToken.border": "Contornos",
+ "themeToken.fg": "Texto principal",
+ "themeToken.fgMuted": "Texto secundário",
+ "themeToken.fgSubtle": "Texto discreto",
+ "themeToken.afkText": "Etiqueta de ausente",
+ "themeToken.accent": "Destaque",
+ "themeToken.accentFg": "Texto sobre o destaque",
+ "themeToken.success": "Sucesso",
+ "themeToken.warning": "Aviso",
+ "themeToken.danger": "Perigo",
+ "themeToken.radiusSm": "Raio pequeno",
+ "themeToken.radiusMd": "Raio médio",
+ "themeToken.radiusLg": "Raio grande",
+ "themeToken.elevationLow": "Sombra ligeira",
+ "themeToken.elevationMedium": "Sombra média",
+ "themeToken.elevationHigh": "Sombra forte",
+ "themeToken.density": "Densidade",
+ "themeToken.fontUi": "Tipo de letra da interface",
+ "themeToken.bgImage": "Gradiente da janela",
+ "themeToken.cardBgImage": "Gradiente das superfícies",
+ "themeToken.borderWidth": "Espessura dos contornos",
+ "themeToken.borderStyle": "Estilo dos contornos",
+ "themeToken.avatarShape": "Forma dos avatares",
+ "themeToken.focusRing": "Contorno de foco",
+ "themeToken.overlayBlur": "Desfoque do fundo",
+ "themeToken.fontDisplay": "Tipo de letra dos títulos",
+ "themeToken.lineHeight": "Altura da linha",
+ "themeToken.letterSpacing": "Espaçamento entre letras",
+ "themeToken.labelCase": "Maiúsculas das etiquetas",
+ "themeToken.fontSmoothing": "Suavização do texto",
+ "themeToken.motionScale": "Velocidade das animações",
+ "themeEditor.title": "Editor de temas",
+ "themeEditor.name": "Nome",
+ "themeEditor.author": "Autor",
+ "themeEditor.version": "Versão",
+ "themeEditor.base": "Herda de",
+ "themeEditor.colorScheme": "Modo de cor",
+ "themeEditor.glass": "Superfícies translúcidas",
+ "themeEditor.inherited": "Herdado",
+ "themeEditor.builtInBase": "Tema incorporado",
+ "themeEditor.reset": "Voltar ao valor herdado",
+ "themeEditor.issues": "Verificações",
+ "themeEditor.noIssues": "Nada a assinalar",
+ "themeEditor.fixErrorsFirst": "Corrija os valores recusados antes de guardar",
+ "themeEditor.save": "Guardar",
+ "themeEditor.saveFailed": "Não foi possível guardar o tema. Tenta de novo.",
+ "themeEditor.export": "Copiar",
+ "themeEditor.issueInvalidValue": "{token}: {kind} inválido, por exemplo {example}",
+ "themeEditor.issueUnknownToken": "{token} não é um valor de tema, é ignorado",
+ "themeEditor.issueMissingToken": "{token} não está definido, é usado o valor incorporado",
+ "themeEditor.issueUnknownBase": "O tema base {base} não existe, são usados os valores incorporados",
+ "themeEditor.issueContrast": "{token} sobre {against}: {ratio} para 1, abaixo do objetivo de {target} para 1",
+ "themeEditor.beta": "Beta",
+ "themeEditor.betaNote": "O formato de tema ainda muda: um tema escrito hoje pode precisar de um ajuste depois de uma atualização.",
+ "themeEditor.customCss": "CSS personalizado",
+ "themeEditor.customCssHelp": "Aplicado por cima do tema, para o que os valores acima não alcançam. Sem @import nem url(): um tema nunca vai buscar nada.",
+ "themeEditor.issueUnsafeCss": "{construct} não é permitido num tema, o CSS não é aplicado",
+ "themeEditor.issueCssTooLong": "CSS demasiado longo: {length} caracteres, o limite é {limit}",
+ "bulkEdit.title": "Edição em massa",
+ "bulkEdit.selectAccounts": "Selecionar contas",
+ "bulkEdit.selectAll": "Selecionar tudo",
+ "bulkEdit.deselectAll": "Desmarcar tudo",
+ "bulkEdit.next": "Seguinte",
+ "bulkEdit.apply": "Aplicar",
+ "bulkEdit.settings": "Definições",
+ "bulkEdit.newsPopup": "Pop-up de notícias dos jogos",
+ "bulkEdit.doNotDisturb": "Não incomodar",
+ "bulkEdit.launchOptions": "Opções de arranque por jogo",
+ "bulkEdit.unchanged": "Inalterado",
+ "bulkEdit.addLaunchOption": "Adicionar",
+ "bulkEdit.selectGame": "Seleciona um jogo...",
+ "bulkEdit.launchOptionsPlaceholder": "-fullscreen",
+ "bulkEdit.activeAccountWarning": "A conta atualmente ativa está selecionada. As alterações serão aplicadas no próximo reinício do Steam.",
+ "bulkEdit.toastSuccess": "Edição em massa: {count} com sucesso",
+ "bulkEdit.toastPartial": "Edição em massa: {succeeded} com sucesso, {failed} falhadas",
+ "bulkEdit.toastFailed": "A edição em massa falhou",
+ "bulkEdit.noAccountsSelected": "Nenhuma conta selecionada",
+ "bulkEdit.selected": "{count} selecionada(s)",
+ "bulkEdit.loadingGames": "A carregar jogos...",
+ "bulkEdit.copyUrls": "Copiar URLs",
+ "bulkEdit.urlsCopied": "{count} URL(s) de perfil copiada(s)",
+ "bulkEdit.cardColor": "Cor do cartão",
+ "bulkEdit.colorApplied": "Cor aplicada a {count} cartão(ões)",
+ "bulkEdit.colorCleared": "Cor removida de {count} cartão(ões)",
+ "common.retry": "Repetir",
+ "app.searchNoResults": "Nenhum resultado para «{query}»",
+ "app.folderEmpty": "Esta pasta está vazia",
+ "app.loadErrorGeneric": "Falha ao carregar as contas. Consulta a consola para mais detalhes.",
+ "toast.dismiss": "Fechar",
+ "toast.switchFailed": "A mudança de conta falhou. Consulta a consola para mais detalhes.",
+ "toast.addAccountFailed": "Não foi possível adicionar a conta. Consulta os registos da aplicação para mais detalhes.",
+ "toast.addAccountClientMissing": "{platform} não parece estar instalado. Instala-o, ou define a sua localização nas Definições.",
+ "toast.banCheckFailedGeneric": "A verificação de bans falhou. Consulta a consola para mais detalhes.",
+ "toast.renameAccountFailed": "Falha ao renomear: {error}",
+ "toast.copyFailed": "Não foi possível copiar para a área de transferência",
+ "toast.refreshFailed": "A atualização falhou. Consulta a consola para mais detalhes.",
+ "dialog.deleteFolderTitle": "Eliminar «{name}»?",
+ "dialog.deleteFolderMessage": "As subpastas também são eliminadas. As contas lá dentro sobem um nível, não são removidas.",
+ "personas.deleteConfirm": "Clica outra vez para eliminar",
+ "personas.discardConfirm": "Clica outra vez para descartar",
+ "personas.switchConfirmTitle": "Mudar de persona",
+ "personas.switchConfirmMessage": "Mudar {count} plataforma(s) para «{name}»? Cada cliente vai fechar e reabrir.",
+ "personas.switchConfirmAction": "Mudar",
+ "personas.deleteTitle": "Eliminar persona",
+ "personas.deleteMessage": "Eliminar «{name}»? As contas em si não são afetadas.",
+ "context.submenuError": "Não foi possível carregar este menu",
+ "settings.apiKeySaveFailed": "Não foi possível guardar a chave da API Steam",
+ "settings.apiKeyInvalidHint": "A chave não foi guardada. Verifica-a e tenta de novo.",
+ "settings.apiKeyCleared": "Chave da API Steam limpa",
+ "settings.apiKeyClearFailed": "Não foi possível limpar a chave da API Steam",
+ "settings.clearApiKey": "Limpar chave",
+ "settings.cs2Bridge": "Ponte de estatísticas CS2",
+ "settings.cs2BridgeLink": "Ligação da ponte",
+ "settings.cs2BridgeLinkPlaceholder": "https://o-teu-servidor/api/bridge/accshift/",
+ "settings.cs2BridgeTest": "Testar",
+ "settings.cs2BridgeStatusOk": "Ligado · {count} contas · {ms} ms",
+ "settings.cs2BridgeStatusFail": "A ligação falhou",
+ "settings.cs2BridgeStatusTesting": "A testar...",
+ "settings.cs2BridgeStatusUnknown": "Não testado",
+ "settings.cs2BridgeToken": "Token da API",
+ "settings.cs2BridgeTokenOptional": "opcional, para servidores próprios",
+ "settings.cs2BridgeTokenPlaceholder": "Token Bearer se o teu servidor precisar de um",
+ "settings.cs2BridgeSaveFailed": "Não foi possível guardar as definições da ponte CS2",
+ "settings.cs2BridgeClearToken": "Limpar token",
+ "settings.pathSaveFailed": "Não foi possível guardar o caminho de {platform}",
+ "settings.pathInvalidHint": "Não foi possível guardar este caminho. Verifica-o e tenta de novo.",
+ "settings.pathSteamNeverSignedIn": "Steam encontrado, inicia sessão uma vez para que crie o histórico de sessões",
+ "settings.pathNotSteamFolder": "Esta pasta não parece uma instalação do Steam",
+ "settings.pathNotADirectory": "O caminho tem de ser uma pasta existente",
+ "settings.pinSaved": "PIN guardado",
+ "settings.pinTakesEffectNextLaunch": "Aplica-se no próximo arranque da aplicação",
+ "settings.pinRequiredAfterInactivity": "Pedido após inatividade e no arranque da aplicação",
+ "settings.pinScreenLockOnly": "O PIN bloqueia esta janela e as trocas de conta. Não protege nada no disco.",
+ "settings.unitSeconds": "segundos",
+ "settings.unitDays": "dias",
+ "settings.telemetryLoadFailed": "Não foi possível carregar as definições de telemetria",
+ "palette.placeholder": "Escreve um comando ou o nome de uma conta...",
+ "palette.noResults": "Nenhum comando corresponde",
+ "palette.sectionAccounts": "Contas",
+ "palette.sectionActions": "Ações",
+ "palette.sectionNavigation": "Navegação",
+ "palette.openTab": "Ir para {platform}",
+ "palette.openFolder": "Abrir a pasta «{name}»",
+ "palette.backToParent": "Voltar à pasta acima",
+ "palette.zoomReset": "Repor o zoom"
+}
diff --git a/crates/accshift-app/i18n/ru.json b/crates/accshift-app/i18n/ru.json
new file mode 100644
index 00000000..e165573d
--- /dev/null
+++ b/crates/accshift-app/i18n/ru.json
@@ -0,0 +1,753 @@
+{
+ "app.loadingSettings": "Загрузка настроек...",
+ "app.loading": "Загрузка...",
+ "app.searchPlaceholder": "Поиск аккаунта...",
+ "app.noAccountsFound": "Аккаунты {platform} не найдены",
+ "app.noAccountsHint": "Убедитесь, что {platform} установлен и вы вошли хотя бы один раз.",
+ "app.switchingAccount": "Смена аккаунта...",
+ "app.platformRestarting": "{platform} перезапускается",
+ "app.comingSoon": "{platform} - скоро",
+ "app.platformUnsupportedOs": "{platform} пока недоступен в этой ОС",
+ "app.noCompatiblePlatforms": "В этой ОС нет ни одной совместимой платформы",
+ "app.noCompatiblePlatformsHint": "Следите за обновлениями поддержки Windows или используйте совместимую машину.",
+ "update.ctaAvailable": "Есть обновление",
+ "update.ctaInstalling": "Установка...",
+ "update.restartToApplyVersion": "Перезапустить и применить обновление {version}",
+ "update.restartToApply": "Перезапустить и применить обновление",
+ "update.readyToastVersion": "Обновление {version} готово",
+ "update.readyToast": "Обновление готово",
+ "update.restartFailed": "Не удалось перезапустить для установки обновления",
+ "pin.lockedTitle": "Приложение заблокировано",
+ "pin.lockedPrompt": "Введите PIN для разблокировки",
+ "pin.placeholder": "PIN из 4 цифр",
+ "pin.unlock": "Разблокировать",
+ "pin.invalid": "Неверный PIN",
+ "pin.tooManyAttempts": "Слишком много попыток. Повторите через {seconds} с.",
+ "common.ok": "OK",
+ "common.cancel": "Отмена",
+ "common.confirm": "Подтвердить",
+ "common.close": "Закрыть",
+ "common.back": "Назад",
+ "common.active": "Активен",
+ "common.choose": "Выбрать...",
+ "common.none": "Нет",
+ "common.custom": "Свой",
+ "common.configured": "Настроено",
+ "common.missing": "Не задано",
+ "common.enabled": "Включено",
+ "common.disabled": "Отключено",
+ "common.on": "Вкл",
+ "common.off": "Выкл",
+ "common.add": "Добавить",
+ "common.visible": "Показано",
+ "common.hidden": "Скрыто",
+ "common.inline": "В строке",
+ "common.tooltip": "Подсказка",
+ "titlebar.refresh": "Обновить",
+ "titlebar.addAccount": "Добавить аккаунт",
+ "titlebar.settings": "Настройки",
+ "titlebar.personas": "Персоны",
+ "titlebar.minimize": "Свернуть",
+ "titlebar.maximize": "Развернуть",
+ "titlebar.restore": "Восстановить",
+ "titlebar.close": "Закрыть",
+ "view.grid": "Вид сеткой",
+ "view.list": "Вид списком",
+ "settings.title": "Настройки",
+ "settings.general": "Общие",
+ "settings.appearance": "Оформление",
+ "settings.language": "Язык",
+ "settings.theme": "Тема",
+ "settings.uiZoom": "Масштаб интерфейса",
+ "settings.backgroundOpacity": "Прозрачность фона",
+ "settings.animations": "Анимации",
+ "settings.animationsSystem": "Как в системе",
+ "settings.animationsOn": "Всегда включены",
+ "settings.animationsOff": "Выключены",
+ "settings.performance": "Производительность",
+ "settings.suspendGraphicsWhenMinimized": "Отключать графику при сворачивании",
+ "settings.minimizeOnAccountSwitch": "Сворачивать при смене аккаунта",
+ "settings.system": "Система",
+ "settings.startWithSystem": "Запуск при старте",
+ "settings.startWithSystemHint": "Запускать Accshift вместе с Windows, свёрнутым в область уведомлений.",
+ "settings.closeToTray": "Сворачивать в область уведомлений",
+ "settings.closeToTrayHint": "Кнопка закрытия сворачивает Accshift в область уведомлений вместо выхода.",
+ "settings.autostartFailed": "Не удалось изменить автозапуск.",
+ "tray.open": "Открыть Accshift",
+ "tray.quit": "Выход",
+ "settings.platforms": "Платформы",
+ "settings.platformSearchPlaceholder": "Поиск платформ...",
+ "settings.platformSearchNoResults": "По запросу ничего не найдено.",
+ "settings.accountDisplay": "Отображение аккаунтов",
+ "settings.startupAndExtras": "Запуск",
+ "settings.defaultOnStartup": "Платформа при запуске",
+ "settings.platformDisabledSuffix": "(отключена)",
+ "settings.platformUnsupportedOs": "ОС не поддерживается",
+ "settings.platformNotImplemented": "В планах",
+ "settings.platformUserProvided": "Добавлена из вашей папки дескрипторов",
+ "settings.customPlatforms": "Пользовательские платформы",
+ "settings.customPlatformsHint": "Файлы дескрипторов в этой папке читаются при запуске приложения.",
+ "settings.customPlatformsNone": "Из этой папки не загружен ни один дескриптор.",
+ "settings.customPlatformsProblems": "Файлы, которые не загрузились",
+ "descriptor.addFromFile": "Добавить из файла",
+ "descriptor.reload": "Перезагрузить",
+ "descriptor.openFolder": "Открыть папку",
+ "descriptor.remove": "Удалить",
+ "descriptor.removeConfirmTitle": "Удалить {platform}?",
+ "descriptor.removeConfirmMessage": "Файл дескриптора покинет вашу папку. Уже сохранённые аккаунты останутся на диске.",
+ "descriptor.previewTitle": "Добавить платформу",
+ "descriptor.previewOs": "Описана для {list}",
+ "descriptor.previewRoots": "Папки, которых она может касаться",
+ "descriptor.previewSteps": "Что сделало бы переключение аккаунта",
+ "descriptor.previewWarnings": "Предупреждения",
+ "descriptor.previewNoPlan": "Не удалось построить пробный запуск: {problem}",
+ "descriptor.previewReplaces": "Это заменит дескриптор, который уже лежит в вашей папке.",
+ "descriptor.previewNothingWritten": "Ничего не записывается, пока вы не добавите.",
+ "descriptor.replace": "Заменить",
+ "descriptor.installed": "{platform} добавлена",
+ "descriptor.removed": "{platform} удалена",
+ "descriptor.actionRead": "чтение",
+ "descriptor.actionCapture": "снимок",
+ "descriptor.actionRestore": "восстановление",
+ "descriptor.actionDelete": "удаление",
+ "descriptor.actionClose": "закрытие",
+ "descriptor.actionLaunch": "запуск",
+ "settings.dataRefresh": "Обновление данных",
+ "settings.avatarRefresh": "Обновление аватаров",
+ "settings.banCheckDelay": "Задержка проверки банов",
+ "settings.refreshNow": "Обновить сейчас",
+ "settings.zeroEachLaunch": "0 = при каждом запуске",
+ "settings.privacy": "Приватность",
+ "settings.inactivityTimeout": "Тайм-аут бездействия",
+ "settings.zeroDisabled": "0 = отключено",
+ "settings.streamerMode": "Режим стримера",
+ "settings.streamerModeHint": "Автоматически размывать данные аккаунтов, когда запущен софт для стриминга.",
+ "settings.personasHint": "Показывать переключатель персон",
+ "settings.replayOnboarding": "Пройти знакомство заново",
+ "settings.replayOnboardingHint": "Снова показать приветственный тур и выбор по статистике использования.",
+ "streamer.title": "Режим стримера",
+ "streamer.disable": "Отключить",
+ "streamer.disablePermanently": "Отключить навсегда",
+ "personas.title": "Персоны",
+ "personas.create": "Новая персона",
+ "personas.activate": "Переключиться на эту персону",
+ "personas.edit": "Изменить",
+ "personas.delete": "Удалить",
+ "personas.finish": "Готово",
+ "personas.switching": "Переключение...",
+ "personas.switched": "Переключено на {name}",
+ "personas.switchPartial": "{name}: сбой на {failed}",
+ "personas.switchFailed": "Не удалось переключиться на {name}",
+ "personas.namePlaceholder": "Название персоны",
+ "personas.choosePlatforms": "Выберите аккаунт для каждой нужной платформы",
+ "personas.chooseAccount": "Выберите аккаунт {platform}",
+ "personas.removeFromPersona": "Убрать из этой персоны",
+ "personas.customImage": "Выбрать изображение...",
+ "personas.removeImage": "Удалить изображение",
+ "personas.imageError": "Не удалось загрузить это изображение.",
+ "personas.loadingAccounts": "Загрузка аккаунтов...",
+ "personas.noAccountsOnPlatform": "На этой платформе пока нет аккаунтов",
+ "personas.emptyHint": "Один клик переключает каждую платформу на её аккаунт.",
+ "settings.security": "Безопасность",
+ "settings.pinLockOnAfk": "Блокировка PIN при бездействии",
+ "settings.pinCode": "PIN-код",
+ "settings.pinPlaceholder": "4 цифры",
+ "settings.pinCurrentCode": "Текущий PIN",
+ "settings.pinCurrentHint": "Введите текущий PIN, чтобы изменить или отключить блокировку.",
+ "settings.telemetry": "Статистика использования (анонимно)",
+ "settings.telemetryModeA": "Базовая анонимная статистика",
+ "settings.telemetryModeAHint": "Считает запуски и то, какие функции используются. Случайный локальный ID не даёт посчитать одну установку дважды; личные данные не отправляются.",
+ "settings.telemetryModeB": "Расширенная статистика с локальным UUID (по желанию)",
+ "settings.telemetryModeBHint": "Добавляет случайный UUID, который хранится только на этой машине. Позволяет оценить удержание и важность функций. Личные данные по-прежнему не отправляются.",
+ "settings.telemetryExport": "Экспортировать мои данные",
+ "settings.telemetryExported": "Данные скопированы в буфер обмена",
+ "settings.telemetryExportFailed": "Не удалось экспортировать",
+ "settings.telemetryEnableFailed": "Не удалось включить расширенную статистику",
+ "settings.telemetryDisableFailed": "Не удалось отключить расширенную статистику",
+ "settings.telemetryDeletePending": "Расширенная статистика отключена; удаление на сервере потребует ещё одной попытки",
+ "settings.telemetryDeletePendingHint": "Удаление на сервере не завершено. Старый локальный ID сохранён только для повторной попытки или экспорта связанных данных.",
+ "settings.telemetryRetryDelete": "Повторить удаление данных",
+ "settings.telemetryDeleteCompleted": "Данные на сервере удалены",
+ "settings.telemetryDeleteRetryFailed": "Удаление на сервере всё ещё не завершено",
+ "settings.telemetryLearnMore": "Какие данные отправляются?",
+ "onboarding.welcome.title": "Добро пожаловать в Accshift",
+ "onboarding.welcome.version": "v{version}",
+ "onboarding.welcome.compatibleWith": "Ваша операционная система совместима с:",
+ "onboarding.welcome.detectedPlatforms": "На вашем компьютере обнаружены эти платформы:",
+ "onboarding.welcome.next": "Показать обзор",
+ "onboarding.welcome.skip": "Пропустить",
+ "onboarding.features.hint": "Эта часть приложения сейчас не видна.",
+ "onboarding.features.addAccount.label": "Добавить аккаунт",
+ "onboarding.features.addAccount.body": "Кнопка + справа сверху добавляет аккаунт на текущую платформу. Войдите один раз, Accshift его запомнит.",
+ "onboarding.features.switch.label": "Смена аккаунта",
+ "onboarding.features.switch.body": "Нажмите на карточку, и вы уже в этом аккаунте. Честно говоря, это всё приложение целиком.",
+ "onboarding.features.contextMenu.label": "Правый клик для действий",
+ "onboarding.features.contextMenu.body": "Правый клик по карточке позволяет переименовать её, сменить цвет, переместить в папку или удалить.",
+ "onboarding.features.platformSwitch.label": "Смена платформы",
+ "onboarding.features.platformSwitch.body": "То же самое для Riot, Battle.net, Epic Games и остальных. Вкладки сверху переключают платформы.",
+ "onboarding.features.next": "Далее",
+ "onboarding.features.back": "Назад",
+ "onboarding.features.step": "Шаг {step}",
+ "onboarding.features.mockRename": "Переименовать",
+ "onboarding.features.mockSetColor": "Задать цвет",
+ "onboarding.features.mockMoveToFolder": "Переместить в папку",
+ "onboarding.features.mockDelete": "Удалить",
+ "onboarding.features.mockAccount": "Аккаунт {number}",
+ "onboarding.telemetry.title": "ПРОДАЙТЕ ДУШУ ACCSHIFT!",
+ "onboarding.telemetry.intro": "Accshift считает немного анонимной статистики, чтобы я знал, что чинить первым. Ничего личного вашу машину не покидает, приложение работает одинаково в любом случае, и вы всегда можете передумать в настройках.",
+ "onboarding.telemetry.question": "По рукам?",
+ "onboarding.telemetry.gifAlt": "Мем с предложением обмена",
+ "onboarding.telemetry.basic": "НЕТ! Хватит уже",
+ "onboarding.telemetry.basicDefault": "(по умолчанию)",
+ "onboarding.telemetry.basicHint": "Только анонимные счётчики и ничего больше: ни профиля, ни идентификатора, который следует за вами.",
+ "onboarding.telemetry.deal": "ПО РУКАМ",
+ "onboarding.telemetry.dealHint": "Добавляет отдельный UUID для расширенной статистики, он хранится только на вашей машине. Кто вы, по-прежнему неизвестно, но помощь огромная. Спасибо!",
+ "onboarding.telemetry.optOutNote": "Что бы вы ни выбрали, это можно изменить позже в разделе Настройки -> Приватность. :c",
+ "onboarding.telemetry.refuse": "Нет, спасибо, отключить всё",
+ "onboarding.telemetry.refuseHint": "Ничего не измеряется и не отправляется, даже анонимные счётчики.",
+ "onboarding.telemetry.back": "Назад",
+ "onboarding.persistFailed": "Не удалось сохранить этот выбор. Попробуй ещё раз.",
+ "onboarding.persistLater": "Спросить при следующем запуске",
+ "settings.steam": "Steam",
+ "settings.riot": "Riot",
+ "settings.battleNet": "Battle.net",
+ "settings.ubisoft": "Ubisoft Connect",
+ "settings.runSteamAsAdmin": "Запускать Steam от админа",
+ "settings.showUsernames": "Показывать логины",
+ "settings.showSteamLastLogin": "Показывать последний вход в Steam",
+ "settings.showRiotLastLogin": "Показывать последний вход в Riot",
+ "settings.showBattleNetLastLogin": "Показывать последний вход в Battle.net",
+ "settings.showUbisoftLastLogin": "Показывать последний вход в Ubisoft",
+ "settings.showNotesUnderCards": "Показывать заметки под карточками",
+ "settings.expandedFolders": "Разворачивать все папки",
+ "list.rootSection": "Корень",
+ "settings.steamLaunch": "Смена",
+ "settings.steamInstallation": "Установка",
+ "settings.steamApiAndData": "API и данные",
+ "settings.launchOptions": "Параметры запуска",
+ "settings.shutdownMode": "Режим завершения",
+ "settings.shutdownModeGraceful": "Штатный",
+ "settings.shutdownModeForce": "Принудительный",
+ "settings.autoDetected": "Определено автоматически",
+ "settings.steamFolder": "Папка Steam",
+ "settings.steamFolderRegistry": "Реестр",
+ "settings.riotClientPath": "Исполняемый файл Riot Client",
+ "settings.battleNetPath": "Исполняемый файл Battle.net",
+ "settings.ubisoftPath": "Папка Ubisoft Connect",
+ "settings.steamWebApiKey": "Ключ Steam Web API",
+ "settings.getKey": "Получить ключ",
+ "settings.pasteApiKey": "Вставьте ваш ключ Steam Web API",
+ "settings.saved": "Настройки сохранены",
+ "settings.openApiKeyFailed": "Не удалось открыть страницу ключа Steam API",
+ "settings.integrations": "Интеграции",
+ "settings.deepLinks": "Разрешить ссылки accshift://",
+ "settings.deepLinksHint": "Позволяет другим приложениям менять аккаунт за вас: закладки, Stream Deck, скрипты.",
+ "settings.cliEnabled": "Разрешить CLI accshift",
+ "settings.cliEnabledHint": "Позволяет утилите командной строки показывать список и менять аккаунты. Если выключено, любая команда accshift отказывается выполняться, включая diag; само приложение не затронуто.",
+ "settings.help": "Открыть вики accshift",
+ "settings.helpShort": "Справка",
+ "settings.openHelpFailed": "Не удалось открыть вики",
+ "settings.logs": "Логи",
+ "settings.openLogs": "Открыть папку логов",
+ "settings.openLogsFailed": "Не удалось открыть папку логов",
+ "context.loading": "Загрузка...",
+ "context.noGamesFound": "Игры не найдены",
+ "context.field.cut": "Вырезать",
+ "context.field.copy": "Копировать",
+ "context.field.paste": "Вставить",
+ "context.field.selectAll": "Выделить всё",
+ "context.menu.newFolder": "Новая папка",
+ "context.menu.refresh": "Обновить",
+ "context.menu.rename": "Переименовать",
+ "context.menu.copy": "Копировать...",
+ "context.menu.deleteFolder": "Удалить папку",
+ "context.menu.folderColor": "Цвет папки",
+ "context.menu.moveToFolder": "Переместить в папку",
+ "context.menu.moveToRoot": "Без папки",
+ "context.menu.editCardAndColor": "Изменить карточку и цвет",
+ "context.menu.cardColor": "Цвет карточки",
+ "context.menu.addNote": "Добавить заметку",
+ "context.menu.editNote": "Изменить заметку",
+ "platform.rename": "Переименовать",
+ "platform.renameTitle": "Переименовать аккаунт",
+ "platform.renamePlaceholder": "Имя аккаунта",
+ "platform.newAccountPending": "Ожидание...",
+ "platform.setupBusy": "Выполняется другая операция accshift. Ожидание её завершения.",
+ "platform.renameNewAccount": "Назовите этот аккаунт",
+ "platform.copyLabelAccountId": "ID аккаунта",
+ "platform.forget": "Забыть",
+ "platform.forgetConfirmTitle": "Забыть «{display}»?",
+ "platform.forgetConfirmMessage": "Аккаунт и его сохранённая сессия будут удалены из Accshift.",
+ "platform.forgotAccount": "Забыт {display}",
+ "dialog.newFolderTitle": "Новая папка",
+ "dialog.renameFolderTitle": "Переименовать папку",
+ "dialog.folderNamePlaceholder": "Имя папки",
+ "dialog.cardNoteTitle": "Заметка карточки",
+ "dialog.cardNotePlaceholder": "Напишите короткую заметку",
+ "card.noteAttached": "Есть заметка",
+ "card.clickAgainToSwitch": "Нажмите ещё раз для смены",
+ "card.extensionWarnings": "Предупреждения",
+ "card.extensionNote": "Заметка",
+ "card.cs2Section": "CS2",
+ "card.cs2Level": "Уровень {level}",
+ "card.cs2CaseEarned": "Недельный кейс получен",
+ "card.cs2CaseNotEarned": "Недельный кейс ожидается",
+ "list.selectAccountPreview": "Выберите аккаунт для просмотра",
+ "preview.noteLabel": "Заметка",
+ "preview.currentlyActive": "Сейчас активен",
+ "preview.switchAgain": "Сменить снова",
+ "preview.switchAccount": "Сменить аккаунт",
+ "ban.community": "Бан сообщества",
+ "ban.vac.single": "{count} бан VAC",
+ "ban.vac.multiple": "{count} банов VAC",
+ "ban.game.single": "{count} игровой бан",
+ "ban.game.multiple": "{count} игровых банов",
+ "time.unknown": "неизвестно",
+ "time.justNow": "только что",
+ "time.minuteAgo": "{count} мин. назад",
+ "time.minutesAgo": "{count} мин. назад",
+ "time.hourAgo": "{count} ч. назад",
+ "time.hoursAgo": "{count} ч. назад",
+ "time.dayAgo": "{count} дн. назад",
+ "time.daysAgo": "{count} дн. назад",
+ "time.neverConnected": "входов не было",
+ "time.compactWrapper": "({value})",
+ "toast.copied": "{label} скопировано",
+ "toast.legacyConfigMigrated": "Настройки перенесены в новый формат",
+ "toast.legacyConfigMigrationFailed": "Не удалось перенести старые настройки, смотрите логи",
+ "toast.failedLoadSettingsPanel": "Не удалось загрузить панель настроек",
+ "toast.banChecking": "Проверка банов...",
+ "toast.banCheckSummary.single": "Проверка банов: {count} аккаунт с банами",
+ "toast.banCheckSummary.multiple": "Проверка банов: {count} аккаунтов с банами",
+ "toast.banCheckFailed": "Проверка банов не удалась: {error}",
+ "toast.avatarRefreshComplete": "Аватары обновлены для {count} аккаунтов",
+ "toast.banRefreshComplete": "Баны обновлены для {count} аккаунтов",
+ "toast.banRefreshNoApiKey": "Обновление банов пропущено: добавьте ключ Steam Web API в настройках",
+ "toast.refreshPartial": "Обновление завершено для {ok} из {count} аккаунтов",
+ "toast.noSteamAccountsFound": "Аккаунты Steam не найдены. Войдите в Steam хотя бы один раз, затем обновите.",
+ "toast.accountsRefreshed.single": "Обновлён {count} аккаунт",
+ "toast.accountsRefreshed.multiple": "Обновлено аккаунтов: {count}",
+ "toast.steamFolderNotFound": "Папка Steam не найдена. Укажите её вручную в «Настройки > Папка Steam».",
+ "toast.steamElevated": "Steam запущен от админа. Включите «Запускать Steam от админа» в «Настройки > Steam».",
+ "toast.noRiotProfilesFound": "Профилей Riot пока нет. Нажмите +, чтобы добавить.",
+ "toast.noBattleNetAccountsFound": "Аккаунты Battle.net не найдены. Войдите в Battle.net хотя бы один раз, затем обновите.",
+ "toast.noUbisoftAccountsFound": "Аккаунты Ubisoft не найдены. Войдите в Ubisoft Connect хотя бы один раз, затем обновите.",
+ "toast.deepLinkInvalid": "Нераспознанная ссылка accshift://",
+ "toast.deepLinkDisabled": "Ссылки accshift:// отключены в настройках",
+ "toast.deepLinkUnknownPlatform": "Неизвестная платформа в ссылке: {platform}",
+ "toast.deepLinkPlatformDisabled": "{platform} отключён в настройках",
+ "toast.deepLinkAccountNotFound": "Нет аккаунта {platform}, подходящего под «{account}»",
+ "toast.deepLinkSwitched": "Переключено на {account}",
+ "dialog.deepLinkSwitchTitle": "Сменить аккаунт?",
+ "dialog.deepLinkSwitchMessage": "Ссылка accshift:// просит сменить ваш аккаунт {platform} на «{account}». Продолжить?",
+ "dialog.deepLinkSwitchConfirm": "Сменить",
+ "steam.launchOnline": "Сменить в сети",
+ "steam.launchInvisible": "Сменить в невидимке",
+ "steam.switchAndRunGame": "Сменить + запустить {game}",
+ "steam.switchAndRunPick": "Сменить + запустить игру…",
+ "steam.runGame": "Запустить {game}",
+ "steam.runPick": "Запустить игру…",
+ "steam.switchAndRunNoGames": "Игры не найдены",
+ "steam.clearDefaultGame": "Сбросить игру по умолчанию",
+ "steam.copySteamId64": "Копировать SteamID64",
+ "steam.copyFriendCode": "Копировать Friend Code",
+ "steam.copyProfileUrl": "Копировать ссылку на профиль",
+ "steam.copyLabelUsername": "Логин",
+ "steam.copyLabelSteamId64": "SteamID64",
+ "steam.copyLabelFriendCode": "Friend Code",
+ "steam.copyLabelProfileUrl": "Ссылка на профиль",
+ "steam.openUserdataFolder": "Открыть папку userdata",
+ "steam.clearIntegratedBrowserCache": "Сбросить сессию браузера",
+ "steam.clearIntegratedBrowserCacheConfirmTitle": "Сбросить сессию браузера Steam?",
+ "steam.clearIntegratedBrowserCacheConfirmMessage": "Steam будет закрыт, а кэш встроенного браузера для Магазина и Сообщества очищен.",
+ "steam.clearedIntegratedBrowserCache": "Сессия браузера Steam сброшена",
+ "steam.copySettingsFrom": "Копировать настройки из",
+ "steam.copiedSettingsToCurrent": "Настройки {game} скопированы в текущий аккаунт",
+ "steam.forget": "Забыть",
+ "steam.forgetConfirmTitle": "Забыть «{display}»?",
+ "steam.forgetConfirmMessage": "Аккаунт будет удалён из списка аккаунтов Steam на этом ПК.",
+ "steam.forgotAccount": "Забыт {username}",
+ "steam.setupPendingLabel": "Аккаунт Steam",
+ "steam.setupWaitingForClient": "Ожидание Steam...",
+ "steam.setupWaitingForLogin": "Войдите в аккаунт Steam, который хотите добавить.",
+ "steam.setupDetected": "Аккаунт определён",
+ "steam.setupConnected": "Подключено",
+ "steam.setupReady": "Аккаунт Steam добавлен",
+ "steam.setupReadyWithProfile": "Добавлен {profile}",
+ "steam.setupFailed": "Не удалось настроить Steam",
+ "steam.setupFailedMessage": "Accshift не смог завершить добавление этого аккаунта Steam.",
+ "riot.captureSession": "Захватить текущую сессию",
+ "riot.recaptureSession": "Захватить сессию заново",
+ "riot.capturedSession": "Сессия для {profile} захвачена",
+ "riot.setupPendingLabel": "Аккаунт Riot",
+ "riot.setupWaitingForClient": "Ожидание Riot Client...",
+ "riot.setupWaitingForLogin": "Войдите в аккаунт Riot, который хотите добавить.",
+ "riot.setupCapturing": "Сохранение сессии Riot...",
+ "riot.setupReady": "Аккаунт Riot добавлен",
+ "riot.setupReadyWithProfile": "Добавлен {profile}",
+ "riot.setupFailed": "Не удалось настроить Riot",
+ "riot.setupFailedMessage": "Accshift не смог завершить добавление этого аккаунта Riot.",
+ "riot.setupStaySignedIn": "Оставьте включённой опцию «Stay signed in».",
+ "riot.setupDetected": "Аккаунт определён",
+ "riot.setupConnected": "Подключено",
+ "riot.forget": "Забыть аккаунт",
+ "riot.forgetConfirmTitle": "Забыть «{display}»?",
+ "riot.forgetConfirmMessage": "Локальный профиль Riot и его сохранённая сессия будут удалены из Accshift.",
+ "riot.forgotProfile": "Забыт {profile}",
+ "battlenet.copyUsername": "Копировать логин",
+ "battlenet.copyLabelUsername": "Логин",
+ "battlenet.copyEmail": "Копировать e-mail",
+ "battlenet.copyLabelEmail": "E-mail",
+ "battlenet.forget": "Забыть",
+ "battlenet.forgetConfirmTitle": "Забыть «{display}»?",
+ "battlenet.forgetConfirmMessage": "Аккаунт будет удалён из списка аккаунтов Battle.net на этом ПК.",
+ "battlenet.forgotAccount": "Забыт {email}",
+ "battlenet.setupPendingLabel": "Аккаунт Battle.net",
+ "battlenet.setupWaitingForClient": "Ожидание Battle.net...",
+ "battlenet.setupWaitingForLogin": "Войдите в аккаунт Battle.net, который хотите добавить.",
+ "battlenet.setupKeepMeLoggedIn": "По возможности оставьте включённой опцию «Keep me logged in».",
+ "battlenet.setupDetected": "Аккаунт определён",
+ "battlenet.setupConnected": "Подключено",
+ "battlenet.setupReady": "Аккаунт Battle.net добавлен",
+ "battlenet.setupReadyWithProfile": "Добавлен {profile}",
+ "battlenet.setupFailed": "Не удалось настроить Battle.net",
+ "battlenet.setupFailedMessage": "Accshift не смог завершить добавление этого аккаунта Battle.net.",
+ "ubisoft.copyLabelUuid": "UUID",
+ "ubisoft.forget": "Забыть",
+ "ubisoft.forgetConfirmTitle": "Забыть «{display}»?",
+ "ubisoft.forgetConfirmMessage": "Аккаунт и его сохранённая сессия будут удалены из Accshift.",
+ "ubisoft.forgotAccount": "Забыт {display}",
+ "ubisoft.setupPendingLabel": "Аккаунт Ubisoft",
+ "ubisoft.setupWaitingForClient": "Ожидание Ubisoft Connect...",
+ "ubisoft.setupWaitingForLogin": "Войдите в аккаунт Ubisoft, который хотите добавить.",
+ "ubisoft.setupKeepMeLoggedIn": "Оставьте включённой опцию «Remember me».",
+ "ubisoft.setupDetected": "Аккаунт определён",
+ "ubisoft.setupConnected": "Подключено",
+ "ubisoft.setupReady": "Аккаунт Ubisoft добавлен",
+ "ubisoft.setupReadyWithProfile": "Добавлен {profile}",
+ "ubisoft.setupFailed": "Не удалось настроить Ubisoft",
+ "ubisoft.setupFailedMessage": "Accshift не смог завершить добавление этого аккаунта Ubisoft.",
+ "settings.roblox": "Roblox",
+ "toast.noRobloxAccountsFound": "Аккаунты Roblox не найдены. Добавьте аккаунт через Quick Login или вставьте cookie.",
+ "roblox.noAccountsHint": "Нажмите +, чтобы добавить аккаунт Roblox через Quick Login.",
+ "roblox.sessionExpired": "Сессия истекла",
+ "roblox.sessionExpiredTooltip": "Из этого аккаунта выполнен выход. Добавьте его заново перед сменой.",
+ "roblox.sessionExpiredSwitchError": "Сессия истекла. Добавьте этот аккаунт заново, чтобы переключиться. Заметки и настройки сохранятся.",
+ "roblox.cookiePasteTitle": "Добавить аккаунт по cookie",
+ "roblox.cookiePasteHint": "Вставьте cookie .ROBLOSECURITY из браузера, чтобы добавить аккаунт напрямую.",
+ "settings.showRobloxLastLogin": "Показывать последний вход",
+ "settings.robloxHealthCheck": "Проверка сессии",
+ "settings.robloxHealthCheckHint": "Помечает аккаунты с истёкшей сессией Roblox; один сетевой запрос за запуск.",
+ "roblox.copyLabelUsername": "Логин",
+ "roblox.copyLabelUserId": "ID пользователя",
+ "roblox.forget": "Забыть",
+ "roblox.forgetConfirmTitle": "Забыть «{display}»?",
+ "roblox.forgetConfirmMessage": "Аккаунт и сохранённый cookie будут удалены с этого ПК.",
+ "roblox.forgotAccount": "Забыт {display}",
+ "roblox.setupPendingLabel": "Аккаунт Roblox",
+ "roblox.setupWaitingForClient": "Подключение к Roblox...",
+ "roblox.setupWaitingForLogin": "Откройте приложение Roblox на другом устройстве и введите код ниже.",
+ "roblox.setupQuickLoginCode": "Код Quick Login",
+ "roblox.setupQuickLoginHint": "roblox.com/quick-login",
+ "roblox.copyCode": "Копировать код",
+ "roblox.setupDetected": "Аккаунт определён",
+ "roblox.setupConnected": "Подключено",
+ "roblox.setupReady": "Аккаунт Roblox добавлен",
+ "roblox.setupReadyWithProfile": "Добавлен {profile}",
+ "roblox.setupFailed": "Не удалось настроить Roblox",
+ "roblox.setupFailedMessage": "Accshift не смог завершить добавление этого аккаунта Roblox.",
+ "settings.epic": "Epic Games",
+ "settings.epicPath": "Исполняемый файл Epic Games Launcher",
+ "settings.showEpicLastLogin": "Показывать последний вход",
+ "toast.noEpicAccountsFound": "Аккаунты Epic Games не найдены. Войдите в Epic Games Launcher хотя бы один раз, затем обновите.",
+ "epic.noAccountsHint": "Нажмите +, чтобы добавить аккаунт Epic Games.",
+ "epic.copyLabelAccountId": "ID аккаунта",
+ "epic.forget": "Забыть",
+ "epic.forgetConfirmTitle": "Забыть «{display}»?",
+ "epic.forgetConfirmMessage": "Аккаунт и его сохранённая сессия будут удалены из Accshift.",
+ "epic.forgotAccount": "Забыт {display}",
+ "epic.setupPendingLabel": "Аккаунт Epic Games",
+ "epic.setupWaitingForClient": "Ожидание Epic Games Launcher...",
+ "epic.setupWaitingForLogin": "Войдите в аккаунт Epic Games, который хотите добавить.",
+ "epic.setupKeepMeLoggedIn": "Оставьте включённой опцию «Remember me».",
+ "epic.setupDetected": "Аккаунт определён",
+ "epic.setupConnected": "Подключено",
+ "epic.setupReady": "Аккаунт Epic Games добавлен",
+ "epic.setupReadyWithProfile": "Добавлен {profile}",
+ "epic.setupFailed": "Не удалось настроить Epic Games",
+ "epic.setupFailedMessage": "Accshift не смог завершить добавление этого аккаунта Epic Games.",
+ "settings.gog": "GOG Galaxy",
+ "settings.gogPath": "Исполняемый файл GOG Galaxy",
+ "settings.showGogLastLogin": "Показывать последний вход",
+ "toast.noGogAccountsFound": "Аккаунты GOG Galaxy не найдены. Войдите в GOG Galaxy хотя бы один раз, затем обновите.",
+ "gog.noAccountsHint": "Нажмите +, чтобы добавить аккаунт GOG Galaxy.",
+ "gog.copyLabelAccountId": "ID аккаунта",
+ "gog.forget": "Забыть",
+ "gog.forgetConfirmTitle": "Забыть «{display}»?",
+ "gog.forgetConfirmMessage": "Аккаунт и его сохранённая сессия будут удалены из Accshift.",
+ "gog.forgotAccount": "Забыт {display}",
+ "gog.setupPendingLabel": "Аккаунт GOG Galaxy",
+ "gog.setupWaitingForClient": "Ожидание GOG Galaxy...",
+ "gog.setupWaitingForLogin": "Войдите в аккаунт GOG Galaxy, который хотите добавить.",
+ "gog.setupKeepMeLoggedIn": "Оставьте включённой опцию «Stay signed in».",
+ "gog.setupDetected": "Аккаунт определён",
+ "gog.setupConnected": "Подключено",
+ "gog.setupReady": "Аккаунт GOG Galaxy добавлен",
+ "gog.setupReadyWithProfile": "Добавлен {profile}",
+ "gog.setupFailed": "Не удалось настроить GOG Galaxy",
+ "gog.setupFailedMessage": "Accshift не смог завершить добавление этого аккаунта GOG Galaxy.",
+ "settings.jagex": "Jagex Launcher",
+ "settings.jagexPath": "Исполняемый файл Jagex Launcher",
+ "settings.showJagexLastLogin": "Показывать последний вход",
+ "toast.noJagexAccountsFound": "Аккаунты Jagex ещё не сохранены. Нажмите +, чтобы добавить через Jagex Launcher.",
+ "jagex.noAccountsHint": "Нажмите +, чтобы добавить аккаунт Jagex.",
+ "jagex.copyLabelAccountId": "ID аккаунта",
+ "jagex.forget": "Забыть",
+ "jagex.forgetConfirmTitle": "Забыть «{display}»?",
+ "jagex.forgetConfirmMessage": "Аккаунт и его сохранённая сессия будут удалены из Accshift.",
+ "jagex.forgotAccount": "Забыт {display}",
+ "jagex.setupPendingLabel": "Аккаунт Jagex",
+ "jagex.setupWaitingForClient": "Ожидание Jagex Launcher...",
+ "jagex.setupWaitingForLogin": "Войдите в аккаунт Jagex, который хотите добавить.",
+ "jagex.setupKeepMeLoggedIn": "Оставьте включённой опцию «Remember me».",
+ "jagex.setupDetected": "Аккаунт определён",
+ "jagex.setupConnected": "Подключено",
+ "jagex.setupReady": "Аккаунт Jagex добавлен",
+ "jagex.setupReadyWithProfile": "Добавлен {profile}",
+ "jagex.setupFailed": "Не удалось настроить Jagex",
+ "jagex.setupFailedMessage": "Accshift не смог завершить добавление этого аккаунта Jagex.",
+ "settings.discord": "Discord",
+ "settings.discordPath": "Исполняемый файл Discord",
+ "settings.showDiscordLastLogin": "Показывать последний вход",
+ "toast.noDiscordAccountsFound": "Аккаунты Discord не найдены. Добавьте аккаунт Discord, затем обновите.",
+ "discord.noAccountsHint": "Нажмите +, чтобы добавить аккаунт Discord.",
+ "discord.copyLabelAccountId": "ID аккаунта",
+ "discord.forget": "Забыть",
+ "discord.forgetConfirmTitle": "Забыть «{display}»?",
+ "discord.forgetConfirmMessage": "Аккаунт и его сохранённая сессия будут удалены из Accshift.",
+ "discord.forgotAccount": "Забыт {display}",
+ "discord.setupPendingLabel": "Аккаунт Discord",
+ "discord.setupWaitingForClient": "Ожидание Discord...",
+ "discord.setupWaitingForLogin": "Войдите в аккаунт Discord, который хотите добавить.",
+ "discord.setupKeepMeLoggedIn": "Не выходите из аккаунта, чтобы он сохранился.",
+ "discord.setupDetected": "Аккаунт определён",
+ "discord.setupConnected": "Подключено",
+ "discord.setupReady": "Аккаунт Discord добавлен",
+ "discord.setupReadyWithProfile": "Добавлен {profile}",
+ "discord.setupFailed": "Не удалось настроить Discord",
+ "discord.setupFailedMessage": "Accshift не смог завершить добавление этого аккаунта Discord.",
+ "color.none": "По умолчанию",
+ "color.blue": "Синий",
+ "color.cyan": "Голубой",
+ "color.green": "Зелёный",
+ "color.lime": "Лаймовый",
+ "color.yellow": "Жёлтый",
+ "color.orange": "Оранжевый",
+ "color.red": "Красный",
+ "color.pink": "Розовый",
+ "color.violet": "Фиолетовый",
+ "color.gray": "Серый",
+ "language.english": "English",
+ "language.french": "Français",
+ "language.spanish": "Español",
+ "language.portuguese": "Português (Portugal)",
+ "language.portugueseBrazil": "Português (Brasil)",
+ "language.russian": "Русский",
+ "language.chinese": "简体中文",
+ "theme.dark": "Тёмная",
+ "theme.light": "Светлая",
+ "theme.midnight": "Полночь",
+ "theme.glassDark": "Стекло тёмное",
+ "theme.glassLight": "Стекло светлое",
+ "theme.liquidGlass": "Жидкое стекло",
+ "theme.custom": "Своя",
+ "settings.themeImport": "Импорт",
+ "settings.themeExport": "Экспорт",
+ "settings.themeDelete": "Удалить тему",
+ "settings.themeImported": "Тема импортирована",
+ "settings.themeDeleted": "Тема удалена",
+ "settings.themeExportCopied": "JSON темы скопирован в буфер обмена",
+ "settings.themeInvalidJson": "Некорректный JSON темы",
+ "settings.themeCustomize": "Настроить",
+ "settings.themeEdit": "Изменить",
+ "settings.themeCopyName": "{name} копия",
+ "settings.themeSaved": "Тема сохранена",
+ "settings.themeMigrated": "Тема импортирована и переведена в текущий формат",
+ "settings.themeInvalidId": "Идентификатор темы отсутствует или некорректен",
+ "settings.themeInvalidName": "У темы нет названия",
+ "settings.themeUnsupportedVersion": "Этой теме нужна более новая версия accshift",
+ "themeGroup.surface": "Поверхности",
+ "themeGroup.text": "Текст",
+ "themeGroup.semantic": "Цвета состояний",
+ "themeGroup.shape": "Форма и плотность",
+ "themeGroup.typography": "Типографика",
+ "themeGroup.motion": "Движение",
+ "themeKind.rgbTriplet": "триплет RGB",
+ "themeKind.hexColor": "шестнадцатеричный цвет",
+ "themeKind.color": "цвет",
+ "themeKind.length": "длина",
+ "themeKind.shadow": "тень",
+ "themeKind.choice": "вариант",
+ "themeKind.fontStack": "шрифт",
+ "themeKind.signedLength": "интервал",
+ "themeKind.gradient": "градиент",
+ "themeKind.number": "число",
+ "themeDensity.compact": "Плотная",
+ "themeDensity.cozy": "Обычная",
+ "themeDensity.comfortable": "Свободная",
+ "themeAvatarShape.circle": "Круг",
+ "themeAvatarShape.rounded": "Скруглённый",
+ "themeAvatarShape.square": "Квадрат",
+ "themeSmoothing.auto": "Сглаженный",
+ "themeSmoothing.none": "Пиксельный",
+ "themeToken.bgRgb": "Фон окна",
+ "themeToken.bgCard": "Фон карточек",
+ "themeToken.bgCardHover": "Фон карточек при наведении",
+ "themeToken.bgMuted": "Приглушённый фон",
+ "themeToken.bgElevated": "Приподнятый фон",
+ "themeToken.border": "Границы",
+ "themeToken.fg": "Основной текст",
+ "themeToken.fgMuted": "Второстепенный текст",
+ "themeToken.fgSubtle": "Малозаметный текст",
+ "themeToken.afkText": "Отметка отсутствия",
+ "themeToken.accent": "Акцент",
+ "themeToken.accentFg": "Текст на акценте",
+ "themeToken.success": "Успех",
+ "themeToken.warning": "Предупреждение",
+ "themeToken.danger": "Опасность",
+ "themeToken.radiusSm": "Малое скругление",
+ "themeToken.radiusMd": "Среднее скругление",
+ "themeToken.radiusLg": "Большое скругление",
+ "themeToken.elevationLow": "Лёгкая тень",
+ "themeToken.elevationMedium": "Средняя тень",
+ "themeToken.elevationHigh": "Сильная тень",
+ "themeToken.density": "Плотность",
+ "themeToken.fontUi": "Шрифт интерфейса",
+ "themeToken.bgImage": "Градиент окна",
+ "themeToken.cardBgImage": "Градиент поверхностей",
+ "themeToken.borderWidth": "Толщина границ",
+ "themeToken.borderStyle": "Стиль границ",
+ "themeToken.avatarShape": "Форма аватаров",
+ "themeToken.focusRing": "Рамка фокуса",
+ "themeToken.overlayBlur": "Размытие фона",
+ "themeToken.fontDisplay": "Шрифт заголовков",
+ "themeToken.lineHeight": "Высота строки",
+ "themeToken.letterSpacing": "Межбуквенный интервал",
+ "themeToken.labelCase": "Регистр подписей",
+ "themeToken.fontSmoothing": "Сглаживание текста",
+ "themeToken.motionScale": "Скорость анимаций",
+ "themeEditor.title": "Редактор тем",
+ "themeEditor.name": "Название",
+ "themeEditor.author": "Автор",
+ "themeEditor.version": "Версия",
+ "themeEditor.base": "Наследует от",
+ "themeEditor.colorScheme": "Цветовая схема",
+ "themeEditor.glass": "Полупрозрачные поверхности",
+ "themeEditor.inherited": "Унаследовано",
+ "themeEditor.builtInBase": "Встроенная тема",
+ "themeEditor.reset": "Вернуть унаследованное значение",
+ "themeEditor.issues": "Проверки",
+ "themeEditor.noIssues": "Замечаний нет",
+ "themeEditor.fixErrorsFirst": "Исправьте отклонённые значения перед сохранением",
+ "themeEditor.save": "Сохранить",
+ "themeEditor.saveFailed": "Не удалось сохранить тему. Попробуй ещё раз.",
+ "themeEditor.export": "Копировать",
+ "themeEditor.issueInvalidValue": "{token}: недопустимое значение ({kind}), например {example}",
+ "themeEditor.issueUnknownToken": "{token} не является значением темы и игнорируется",
+ "themeEditor.issueMissingToken": "{token} не задан, используется встроенное значение",
+ "themeEditor.issueUnknownBase": "Базовая тема {base} не найдена, используются встроенные значения",
+ "themeEditor.issueContrast": "{token} на {against}: {ratio} к 1, ниже цели {target} к 1",
+ "themeEditor.beta": "Бета",
+ "themeEditor.betaNote": "Формат темы ещё меняется: тему, написанную сегодня, возможно, придётся поправить после обновления.",
+ "themeEditor.customCss": "Свой CSS",
+ "themeEditor.customCssHelp": "Применяется поверх темы, для того, до чего значения выше не достают. Без @import и url(): тема ничего не загружает извне.",
+ "themeEditor.issueUnsafeCss": "{construct} в теме запрещён, CSS не применяется",
+ "themeEditor.issueCssTooLong": "CSS слишком длинный: {length} символов, предел {limit}",
+ "bulkEdit.title": "Массовое изменение",
+ "bulkEdit.selectAccounts": "Выберите аккаунты",
+ "bulkEdit.selectAll": "Выбрать все",
+ "bulkEdit.deselectAll": "Снять выбор",
+ "bulkEdit.next": "Далее",
+ "bulkEdit.apply": "Применить",
+ "bulkEdit.settings": "Настройки",
+ "bulkEdit.newsPopup": "Всплывающие новости игры",
+ "bulkEdit.doNotDisturb": "Не беспокоить",
+ "bulkEdit.launchOptions": "Параметры запуска по играм",
+ "bulkEdit.unchanged": "Без изменений",
+ "bulkEdit.addLaunchOption": "Добавить",
+ "bulkEdit.selectGame": "Выберите игру...",
+ "bulkEdit.launchOptionsPlaceholder": "-fullscreen",
+ "bulkEdit.activeAccountWarning": "Выбран активный сейчас аккаунт. Изменения применятся при следующем запуске Steam.",
+ "bulkEdit.toastSuccess": "Массовое изменение: успешно {count}",
+ "bulkEdit.toastPartial": "Массовое изменение: успешно {succeeded}, с ошибкой {failed}",
+ "bulkEdit.toastFailed": "Массовое изменение не удалось",
+ "bulkEdit.noAccountsSelected": "Аккаунты не выбраны",
+ "bulkEdit.selected": "Выбрано: {count}",
+ "bulkEdit.loadingGames": "Загрузка игр...",
+ "bulkEdit.copyUrls": "Копировать ссылки",
+ "bulkEdit.urlsCopied": "Скопировано ссылок на профиль: {count}",
+ "bulkEdit.cardColor": "Цвет карточки",
+ "bulkEdit.colorApplied": "Цвет применён к карточкам: {count}",
+ "bulkEdit.colorCleared": "Цвет снят с карточек: {count}",
+ "common.retry": "Повторить",
+ "app.searchNoResults": "Нет результатов по запросу «{query}»",
+ "app.folderEmpty": "Эта папка пуста",
+ "app.loadErrorGeneric": "Не удалось загрузить аккаунты. Подробности в консоли.",
+ "toast.dismiss": "Закрыть",
+ "toast.switchFailed": "Не удалось сменить аккаунт. Подробности в консоли.",
+ "toast.addAccountFailed": "Не удалось добавить аккаунт. Подробности в логах приложения.",
+ "toast.addAccountClientMissing": "Похоже, {platform} не установлен. Установите его или укажите путь в настройках.",
+ "toast.banCheckFailedGeneric": "Проверка банов не удалась. Подробности в консоли.",
+ "toast.renameAccountFailed": "Не удалось переименовать: {error}",
+ "toast.copyFailed": "Не удалось скопировать в буфер обмена",
+ "toast.refreshFailed": "Не удалось обновить. Подробности в консоли.",
+ "dialog.deleteFolderTitle": "Удалить «{name}»?",
+ "dialog.deleteFolderMessage": "Вложенные папки тоже удаляются. Аккаунты внутри поднимаются на уровень выше, а не удаляются.",
+ "personas.deleteConfirm": "Нажмите ещё раз для удаления",
+ "personas.discardConfirm": "Нажмите ещё раз, чтобы отменить",
+ "personas.switchConfirmTitle": "Смена персоны",
+ "personas.switchConfirmMessage": "Переключить платформы ({count}) на «{name}»? Каждый клиент закроется и запустится заново.",
+ "personas.switchConfirmAction": "Переключить",
+ "personas.deleteTitle": "Удалить персону",
+ "personas.deleteMessage": "Удалить «{name}»? Сами аккаунты не затрагиваются.",
+ "context.submenuError": "Не удалось загрузить это меню",
+ "settings.apiKeySaveFailed": "Не удалось сохранить ключ Steam API",
+ "settings.apiKeyInvalidHint": "Ключ не сохранён. Проверьте его и попробуйте снова.",
+ "settings.apiKeyCleared": "Ключ Steam API удалён",
+ "settings.apiKeyClearFailed": "Не удалось удалить ключ Steam API",
+ "settings.clearApiKey": "Удалить ключ",
+ "settings.cs2Bridge": "Мост статистики CS2",
+ "settings.cs2BridgeLink": "Ссылка на мост",
+ "settings.cs2BridgeLinkPlaceholder": "https://your-server/api/bridge/accshift/",
+ "settings.cs2BridgeTest": "Проверить",
+ "settings.cs2BridgeStatusOk": "Подключено · {count} аккаунтов · {ms} мс",
+ "settings.cs2BridgeStatusFail": "Не удалось подключиться",
+ "settings.cs2BridgeStatusTesting": "Проверка...",
+ "settings.cs2BridgeStatusUnknown": "Не проверялось",
+ "settings.cs2BridgeToken": "Токен API",
+ "settings.cs2BridgeTokenOptional": "необязательно, для своих серверов",
+ "settings.cs2BridgeTokenPlaceholder": "Bearer-токен, если он нужен серверу",
+ "settings.cs2BridgeSaveFailed": "Не удалось сохранить настройки моста CS2",
+ "settings.cs2BridgeClearToken": "Удалить токен",
+ "settings.pathSaveFailed": "Не удалось сохранить путь {platform}",
+ "settings.pathInvalidHint": "Этот путь не удалось сохранить. Проверьте его и попробуйте снова.",
+ "settings.pathSteamNeverSignedIn": "Steam найден, войдите один раз, чтобы он создал историю входов",
+ "settings.pathNotSteamFolder": "Эта папка не похожа на установку Steam",
+ "settings.pathNotADirectory": "Путь должен указывать на существующую папку",
+ "settings.pinSaved": "PIN сохранён",
+ "settings.pinTakesEffectNextLaunch": "Вступит в силу при следующем запуске приложения",
+ "settings.pinRequiredAfterInactivity": "Требуется после бездействия и при запуске приложения",
+ "settings.pinScreenLockOnly": "PIN блокирует это окно и переключение аккаунтов. Он ничего не защищает на диске.",
+ "settings.unitSeconds": "секунд",
+ "settings.unitDays": "дней",
+ "settings.telemetryLoadFailed": "Не удалось загрузить настройки телеметрии",
+ "palette.placeholder": "Введите команду или имя аккаунта...",
+ "palette.noResults": "Подходящих команд нет",
+ "palette.sectionAccounts": "Аккаунты",
+ "palette.sectionActions": "Действия",
+ "palette.sectionNavigation": "Навигация",
+ "palette.openTab": "Перейти к {platform}",
+ "palette.openFolder": "Открыть папку «{name}»",
+ "palette.backToParent": "Вернуться в родительскую папку",
+ "palette.zoomReset": "Сбросить масштаб"
+}
diff --git a/crates/accshift-app/i18n/zh.json b/crates/accshift-app/i18n/zh.json
new file mode 100644
index 00000000..4d3d96fc
--- /dev/null
+++ b/crates/accshift-app/i18n/zh.json
@@ -0,0 +1,753 @@
+{
+ "app.loadingSettings": "正在加载设置...",
+ "app.loading": "加载中...",
+ "app.searchPlaceholder": "搜索账号...",
+ "app.noAccountsFound": "未找到 {platform} 账号",
+ "app.noAccountsHint": "请确认已安装 {platform} 并且至少登录过一次。",
+ "app.switchingAccount": "正在切换账号...",
+ "app.platformRestarting": "{platform} 正在重启",
+ "app.comingSoon": "{platform} - 即将推出",
+ "app.platformUnsupportedOs": "{platform} 尚未支持当前系统",
+ "app.noCompatiblePlatforms": "当前系统没有可用的兼容平台",
+ "app.noCompatiblePlatformsHint": "请关注 Windows 支持更新,或改用受支持的设备。",
+ "update.ctaAvailable": "有可用更新",
+ "update.ctaInstalling": "正在安装...",
+ "update.restartToApplyVersion": "重启以应用更新 {version}",
+ "update.restartToApply": "重启以应用更新",
+ "update.readyToastVersion": "更新 {version} 已就绪",
+ "update.readyToast": "更新已就绪",
+ "update.restartFailed": "无法重启以应用更新",
+ "pin.lockedTitle": "应用已锁定",
+ "pin.lockedPrompt": "输入 PIN 解锁",
+ "pin.placeholder": "4 位 PIN",
+ "pin.unlock": "解锁",
+ "pin.invalid": "PIN 错误",
+ "pin.tooManyAttempts": "尝试次数过多,请在 {seconds} 秒后重试。",
+ "common.ok": "确定",
+ "common.cancel": "取消",
+ "common.confirm": "确认",
+ "common.close": "关闭",
+ "common.back": "返回",
+ "common.active": "使用中",
+ "common.choose": "选择...",
+ "common.none": "无",
+ "common.custom": "自定义",
+ "common.configured": "已配置",
+ "common.missing": "缺失",
+ "common.enabled": "已启用",
+ "common.disabled": "已禁用",
+ "common.on": "开",
+ "common.off": "关",
+ "common.add": "添加",
+ "common.visible": "显示",
+ "common.hidden": "隐藏",
+ "common.inline": "内嵌",
+ "common.tooltip": "悬浮提示",
+ "titlebar.refresh": "刷新",
+ "titlebar.addAccount": "添加账号",
+ "titlebar.settings": "设置",
+ "titlebar.personas": "身份",
+ "titlebar.minimize": "最小化",
+ "titlebar.maximize": "最大化",
+ "titlebar.restore": "还原",
+ "titlebar.close": "关闭",
+ "view.grid": "网格视图",
+ "view.list": "列表视图",
+ "settings.title": "设置",
+ "settings.general": "通用",
+ "settings.appearance": "外观",
+ "settings.language": "语言",
+ "settings.theme": "主题",
+ "settings.uiZoom": "界面缩放",
+ "settings.backgroundOpacity": "背景不透明度",
+ "settings.animations": "动画",
+ "settings.animationsSystem": "跟随系统",
+ "settings.animationsOn": "始终开启",
+ "settings.animationsOff": "关闭",
+ "settings.performance": "性能",
+ "settings.suspendGraphicsWhenMinimized": "最小化时暂停渲染",
+ "settings.minimizeOnAccountSwitch": "切换账号时最小化",
+ "settings.system": "系统",
+ "settings.startWithSystem": "开机启动",
+ "settings.startWithSystemHint": "随 Windows 启动 Accshift,并最小化到通知区域。",
+ "settings.closeToTray": "关闭到通知区域",
+ "settings.closeToTrayHint": "关闭按钮会将 Accshift 隐藏到通知区域,而不是退出。",
+ "settings.autostartFailed": "无法更改开机启动设置。",
+ "tray.open": "打开 Accshift",
+ "tray.quit": "退出",
+ "settings.platforms": "平台",
+ "settings.platformSearchPlaceholder": "搜索平台...",
+ "settings.platformSearchNoResults": "没有匹配的平台。",
+ "settings.accountDisplay": "账号显示",
+ "settings.startupAndExtras": "启动",
+ "settings.defaultOnStartup": "启动时的默认平台",
+ "settings.platformDisabledSuffix": "(已禁用)",
+ "settings.platformUnsupportedOs": "系统不支持",
+ "settings.platformNotImplemented": "计划中",
+ "settings.platformUserProvided": "来自你的描述符文件夹",
+ "settings.customPlatforms": "自定义平台",
+ "settings.customPlatformsHint": "此文件夹中的描述符文件会在应用启动时读取。",
+ "settings.customPlatformsNone": "此文件夹中没有加载任何描述符。",
+ "settings.customPlatformsProblems": "未能加载的文件",
+ "descriptor.addFromFile": "从文件添加",
+ "descriptor.reload": "重新加载",
+ "descriptor.openFolder": "打开文件夹",
+ "descriptor.remove": "移除",
+ "descriptor.removeConfirmTitle": "移除 {platform}?",
+ "descriptor.removeConfirmMessage": "它的描述符文件会离开你的文件夹。已保存的账号仍留在磁盘上。",
+ "descriptor.previewTitle": "添加平台",
+ "descriptor.previewOs": "适用于 {list}",
+ "descriptor.previewRoots": "它可以访问的文件夹",
+ "descriptor.previewSteps": "切换账号会做什么",
+ "descriptor.previewWarnings": "警告",
+ "descriptor.previewNoPlan": "无法生成试运行:{problem}",
+ "descriptor.previewReplaces": "这会替换你文件夹中已有的描述符。",
+ "descriptor.previewNothingWritten": "在你添加之前不会写入任何内容。",
+ "descriptor.replace": "替换",
+ "descriptor.installed": "已添加 {platform}",
+ "descriptor.removed": "已移除 {platform}",
+ "descriptor.actionRead": "读取",
+ "descriptor.actionCapture": "保存",
+ "descriptor.actionRestore": "恢复",
+ "descriptor.actionDelete": "删除",
+ "descriptor.actionClose": "关闭",
+ "descriptor.actionLaunch": "启动",
+ "settings.dataRefresh": "数据刷新",
+ "settings.avatarRefresh": "头像刷新",
+ "settings.banCheckDelay": "封禁检查间隔",
+ "settings.refreshNow": "立即刷新",
+ "settings.zeroEachLaunch": "0 = 每次启动",
+ "settings.privacy": "隐私",
+ "settings.inactivityTimeout": "无操作超时",
+ "settings.zeroDisabled": "0 = 禁用",
+ "settings.streamerMode": "直播模式",
+ "settings.streamerModeHint": "检测到直播软件运行时自动模糊账号信息。",
+ "settings.personasHint": "显示身份切换器",
+ "settings.replayOnboarding": "重看引导",
+ "settings.replayOnboardingHint": "再次显示欢迎导览和使用统计选项。",
+ "streamer.title": "直播模式",
+ "streamer.disable": "关闭",
+ "streamer.disablePermanently": "永久关闭",
+ "personas.title": "身份",
+ "personas.create": "新建身份",
+ "personas.activate": "切换到该身份",
+ "personas.edit": "编辑",
+ "personas.delete": "删除",
+ "personas.finish": "完成",
+ "personas.switching": "切换中...",
+ "personas.switched": "已切换到 {name}",
+ "personas.switchPartial": "{name}:{failed} 切换失败",
+ "personas.switchFailed": "无法切换到 {name}",
+ "personas.namePlaceholder": "身份名称",
+ "personas.choosePlatforms": "为每个要包含的平台选择一个账号",
+ "personas.chooseAccount": "选择 {platform} 账号",
+ "personas.removeFromPersona": "从该身份中移除",
+ "personas.customImage": "选择图片...",
+ "personas.removeImage": "移除图片",
+ "personas.imageError": "无法加载该图片。",
+ "personas.loadingAccounts": "正在加载账号...",
+ "personas.noAccountsOnPlatform": "该平台还没有账号",
+ "personas.emptyHint": "点击一次即可把所有已包含的平台切换到对应账号。",
+ "settings.security": "安全",
+ "settings.pinLockOnAfk": "挂机时 PIN 锁定",
+ "settings.pinCode": "PIN 码",
+ "settings.pinPlaceholder": "4 位数字",
+ "settings.pinCurrentCode": "当前 PIN",
+ "settings.pinCurrentHint": "输入当前 PIN 以更改或关闭锁定。",
+ "settings.telemetry": "使用统计(匿名)",
+ "settings.telemetryModeA": "匿名基础统计",
+ "settings.telemetryModeAHint": "统计启动次数和功能使用情况。随机本地 ID 用于避免重复计入安装量,不会发送任何个人数据。",
+ "settings.telemetryModeB": "增强统计,附带本地 UUID(可选)",
+ "settings.telemetryModeBHint": "额外生成一个仅保存在本机的随机 UUID,用于衡量留存率和功能价值。同样不会发送个人数据。",
+ "settings.telemetryExport": "导出我的数据",
+ "settings.telemetryExported": "数据已复制到剪贴板",
+ "settings.telemetryExportFailed": "导出失败",
+ "settings.telemetryEnableFailed": "无法启用增强统计",
+ "settings.telemetryDisableFailed": "无法关闭增强统计",
+ "settings.telemetryDeletePending": "增强统计已关闭,服务器数据删除需要再试一次",
+ "settings.telemetryDeletePendingHint": "服务器删除仍在等待中。保留旧的本地 ID 只是为了让你重试删除或导出相关数据。",
+ "settings.telemetryRetryDelete": "重试删除数据",
+ "settings.telemetryDeleteCompleted": "服务器数据已删除",
+ "settings.telemetryDeleteRetryFailed": "服务器删除仍在等待中",
+ "settings.telemetryLearnMore": "会发送哪些数据?",
+ "onboarding.welcome.title": "欢迎使用 Accshift",
+ "onboarding.welcome.version": "v{version}",
+ "onboarding.welcome.compatibleWith": "你的操作系统兼容以下平台:",
+ "onboarding.welcome.detectedPlatforms": "在你的电脑上检测到以下平台:",
+ "onboarding.welcome.next": "带我看看",
+ "onboarding.welcome.skip": "跳过",
+ "onboarding.features.hint": "应用的这一部分目前不可见。",
+ "onboarding.features.addAccount.label": "添加账号",
+ "onboarding.features.addAccount.body": "右上角的 + 按钮可以为当前平台添加账号。登录一次,Accshift 就帮你记住。",
+ "onboarding.features.switch.label": "切换账号",
+ "onboarding.features.switch.body": "点一下卡片就切到那个账号。说实话,整个应用就这么简单。",
+ "onboarding.features.contextMenu.label": "右键查看操作",
+ "onboarding.features.contextMenu.body": "右键点击卡片可以重命名、改颜色、移动到文件夹或删除。",
+ "onboarding.features.platformSwitch.label": "切换平台",
+ "onboarding.features.platformSwitch.body": "Riot、Battle.net、Epic 等平台也一样。顶部的标签页用来切换平台。",
+ "onboarding.features.next": "下一步",
+ "onboarding.features.back": "返回",
+ "onboarding.features.step": "第 {step} 步",
+ "onboarding.features.mockRename": "重命名",
+ "onboarding.features.mockSetColor": "设置颜色",
+ "onboarding.features.mockMoveToFolder": "移动到文件夹",
+ "onboarding.features.mockDelete": "删除",
+ "onboarding.features.mockAccount": "账号 {number}",
+ "onboarding.telemetry.title": "把灵魂卖给 ACCSHIFT!",
+ "onboarding.telemetry.intro": "Accshift 会统计少量匿名使用数据,这样我才知道该先修哪里。没有任何个人信息离开你的电脑,开不开都不影响使用,你随时可以在设置里改主意。",
+ "onboarding.telemetry.question": "成交吗?",
+ "onboarding.telemetry.gifAlt": "交易提议表情包",
+ "onboarding.telemetry.basic": "不!够了",
+ "onboarding.telemetry.basicDefault": "(默认)",
+ "onboarding.telemetry.basicHint": "只有匿名计数,仅此而已:没有画像,没有跟着你的标识符。",
+ "onboarding.telemetry.deal": "成交",
+ "onboarding.telemetry.dealHint": "额外增加一个仅保存在本机的 UUID 用于增强统计。依然不知道你是谁,但你帮了大忙。谢谢!",
+ "onboarding.telemetry.optOutNote": "无论你选哪个,之后都可以在设置 -> 隐私里改。:c",
+ "onboarding.telemetry.refuse": "不用了,全部关闭",
+ "onboarding.telemetry.refuseHint": "什么都不统计、不发送,连匿名计数也没有。",
+ "onboarding.telemetry.back": "返回",
+ "onboarding.persistFailed": "未能保存这个选择。请再试一次。",
+ "onboarding.persistLater": "下次启动时再问",
+ "settings.steam": "Steam",
+ "settings.riot": "Riot",
+ "settings.battleNet": "Battle.net",
+ "settings.ubisoft": "Ubisoft Connect",
+ "settings.runSteamAsAdmin": "以管理员身份运行 Steam",
+ "settings.showUsernames": "显示用户名",
+ "settings.showSteamLastLogin": "显示 Steam 上次登录",
+ "settings.showRiotLastLogin": "显示 Riot 上次登录",
+ "settings.showBattleNetLastLogin": "显示 Battle.net 上次登录",
+ "settings.showUbisoftLastLogin": "显示 Ubisoft 上次登录",
+ "settings.showNotesUnderCards": "在卡片下方显示备注",
+ "settings.expandedFolders": "展开所有文件夹",
+ "list.rootSection": "根目录",
+ "settings.steamLaunch": "切换",
+ "settings.steamInstallation": "安装",
+ "settings.steamApiAndData": "API 与数据",
+ "settings.launchOptions": "启动选项",
+ "settings.shutdownMode": "关闭方式",
+ "settings.shutdownModeGraceful": "正常退出",
+ "settings.shutdownModeForce": "强制结束",
+ "settings.autoDetected": "自动检测",
+ "settings.steamFolder": "Steam 文件夹",
+ "settings.steamFolderRegistry": "注册表",
+ "settings.riotClientPath": "Riot 客户端可执行文件",
+ "settings.battleNetPath": "Battle.net 可执行文件",
+ "settings.ubisoftPath": "Ubisoft Connect 文件夹",
+ "settings.steamWebApiKey": "Steam Web API 密钥",
+ "settings.getKey": "获取密钥",
+ "settings.pasteApiKey": "粘贴你的 Steam Web API 密钥",
+ "settings.saved": "设置已保存",
+ "settings.openApiKeyFailed": "无法打开 Steam API 密钥页面",
+ "settings.integrations": "集成",
+ "settings.deepLinks": "允许 accshift:// 链接",
+ "settings.deepLinksHint": "让其他应用替你切换账号:书签、Stream Deck、脚本。",
+ "settings.cliEnabled": "允许 accshift 命令行工具",
+ "settings.cliEnabledHint": "让命令行工具列出并切换账号。关闭后,所有 accshift 命令都会拒绝运行,包括 diag;应用本身不受影响。",
+ "settings.help": "打开 accshift 维基",
+ "settings.helpShort": "帮助",
+ "settings.openHelpFailed": "无法打开维基",
+ "settings.logs": "日志",
+ "settings.openLogs": "打开日志文件夹",
+ "settings.openLogsFailed": "无法打开日志文件夹",
+ "context.loading": "加载中...",
+ "context.noGamesFound": "未找到游戏",
+ "context.field.cut": "剪切",
+ "context.field.copy": "复制",
+ "context.field.paste": "粘贴",
+ "context.field.selectAll": "全选",
+ "context.menu.newFolder": "新建文件夹",
+ "context.menu.refresh": "刷新",
+ "context.menu.rename": "重命名",
+ "context.menu.copy": "复制...",
+ "context.menu.deleteFolder": "删除文件夹",
+ "context.menu.folderColor": "文件夹颜色",
+ "context.menu.moveToFolder": "移动到文件夹",
+ "context.menu.moveToRoot": "不放入文件夹",
+ "context.menu.editCardAndColor": "编辑卡片和颜色",
+ "context.menu.cardColor": "卡片颜色",
+ "context.menu.addNote": "添加备注",
+ "context.menu.editNote": "编辑备注",
+ "platform.rename": "重命名",
+ "platform.renameTitle": "重命名账号",
+ "platform.renamePlaceholder": "账号名称",
+ "platform.newAccountPending": "等待中...",
+ "platform.setupBusy": "另一个 accshift 操作正在运行。正在等待其完成。",
+ "platform.renameNewAccount": "为该账号命名",
+ "platform.copyLabelAccountId": "账号 ID",
+ "platform.forget": "移除",
+ "platform.forgetConfirmTitle": "移除「{display}」?",
+ "platform.forgetConfirmMessage": "这会从 Accshift 中删除该账号及其保存的会话。",
+ "platform.forgotAccount": "已移除 {display}",
+ "dialog.newFolderTitle": "新建文件夹",
+ "dialog.renameFolderTitle": "重命名文件夹",
+ "dialog.folderNamePlaceholder": "文件夹名称",
+ "dialog.cardNoteTitle": "卡片备注",
+ "dialog.cardNotePlaceholder": "写一条简短备注",
+ "card.noteAttached": "已附备注",
+ "card.clickAgainToSwitch": "再次点击以切换",
+ "card.extensionWarnings": "警告",
+ "card.extensionNote": "备注",
+ "card.cs2Section": "CS2",
+ "card.cs2Level": "等级 {level}",
+ "card.cs2CaseEarned": "本周箱子已获得",
+ "card.cs2CaseNotEarned": "本周箱子待获得",
+ "list.selectAccountPreview": "选择一个账号以预览",
+ "preview.noteLabel": "备注",
+ "preview.currentlyActive": "当前使用中",
+ "preview.switchAgain": "重新切换",
+ "preview.switchAccount": "切换账号",
+ "ban.community": "社区封禁",
+ "ban.vac.single": "{count} 次 VAC 封禁",
+ "ban.vac.multiple": "{count} 次 VAC 封禁",
+ "ban.game.single": "{count} 次游戏封禁",
+ "ban.game.multiple": "{count} 次游戏封禁",
+ "time.unknown": "未知",
+ "time.justNow": "刚刚",
+ "time.minuteAgo": "{count} 分钟前",
+ "time.minutesAgo": "{count} 分钟前",
+ "time.hourAgo": "{count} 小时前",
+ "time.hoursAgo": "{count} 小时前",
+ "time.dayAgo": "{count} 天前",
+ "time.daysAgo": "{count} 天前",
+ "time.neverConnected": "从未登录",
+ "time.compactWrapper": "({value})",
+ "toast.copied": "已复制{label}",
+ "toast.legacyConfigMigrated": "设置已迁移到新格式",
+ "toast.legacyConfigMigrationFailed": "旧设置迁移失败,请查看日志",
+ "toast.failedLoadSettingsPanel": "设置面板加载失败",
+ "toast.banChecking": "正在检查封禁...",
+ "toast.banCheckSummary.single": "封禁检查:{count} 个账号有封禁记录",
+ "toast.banCheckSummary.multiple": "封禁检查:{count} 个账号有封禁记录",
+ "toast.banCheckFailed": "封禁检查失败:{error}",
+ "toast.avatarRefreshComplete": "已完成 {count} 个账号的头像刷新",
+ "toast.banRefreshComplete": "已完成 {count} 个账号的封禁刷新",
+ "toast.banRefreshNoApiKey": "已跳过封禁刷新:请在设置中添加 Steam Web API 密钥",
+ "toast.refreshPartial": "已完成 {ok}/{count} 个账号的刷新",
+ "toast.noSteamAccountsFound": "未找到 Steam 账号。请先登录一次 Steam,然后刷新。",
+ "toast.accountsRefreshed.single": "已刷新 {count} 个账号",
+ "toast.accountsRefreshed.multiple": "已刷新 {count} 个账号",
+ "toast.steamFolderNotFound": "未找到 Steam 文件夹。请在设置 > Steam 文件夹中手动指定。",
+ "toast.steamElevated": "Steam 正在以管理员身份运行。请在设置 > Steam 中启用「以管理员身份运行 Steam」。",
+ "toast.noRiotProfilesFound": "还没有 Riot 档案。点击 + 添加一个。",
+ "toast.noBattleNetAccountsFound": "未找到 Battle.net 账号。请先登录一次 Battle.net,然后刷新。",
+ "toast.noUbisoftAccountsFound": "未找到 Ubisoft 账号。请先登录一次 Ubisoft Connect,然后刷新。",
+ "toast.deepLinkInvalid": "无法识别的 accshift:// 链接",
+ "toast.deepLinkDisabled": "accshift:// 链接已在设置中禁用",
+ "toast.deepLinkUnknownPlatform": "链接中的平台未知:{platform}",
+ "toast.deepLinkPlatformDisabled": "{platform} 已在设置中禁用",
+ "toast.deepLinkAccountNotFound": "没有与「{account}」匹配的 {platform} 账号",
+ "toast.deepLinkSwitched": "已切换到 {account}",
+ "dialog.deepLinkSwitchTitle": "切换账号?",
+ "dialog.deepLinkSwitchMessage": "有个 accshift:// 链接请求把你的 {platform} 账号切换为「{account}」。要继续吗?",
+ "dialog.deepLinkSwitchConfirm": "切换",
+ "steam.launchOnline": "在线切换",
+ "steam.launchInvisible": "隐身切换",
+ "steam.switchAndRunGame": "切换并运行 {game}",
+ "steam.switchAndRunPick": "切换并运行游戏...",
+ "steam.runGame": "运行 {game}",
+ "steam.runPick": "运行游戏...",
+ "steam.switchAndRunNoGames": "未找到游戏",
+ "steam.clearDefaultGame": "清除默认游戏",
+ "steam.copySteamId64": "复制 SteamID64",
+ "steam.copyFriendCode": "复制好友代码",
+ "steam.copyProfileUrl": "复制个人资料链接",
+ "steam.copyLabelUsername": "用户名",
+ "steam.copyLabelSteamId64": "SteamID64",
+ "steam.copyLabelFriendCode": "好友代码",
+ "steam.copyLabelProfileUrl": "个人资料链接",
+ "steam.openUserdataFolder": "打开 userdata 文件夹",
+ "steam.clearIntegratedBrowserCache": "重置浏览器会话",
+ "steam.clearIntegratedBrowserCacheConfirmTitle": "重置 Steam 浏览器会话?",
+ "steam.clearIntegratedBrowserCacheConfirmMessage": "这会关闭 Steam 并清除商店和社区使用的内置浏览器缓存。",
+ "steam.clearedIntegratedBrowserCache": "Steam 浏览器会话已重置",
+ "steam.copySettingsFrom": "从以下账号复制设置",
+ "steam.copiedSettingsToCurrent": "已把 {game} 的设置复制到当前账号",
+ "steam.forget": "移除",
+ "steam.forgetConfirmTitle": "移除「{display}」?",
+ "steam.forgetConfirmMessage": "这会把该账号从本机的 Steam 账号列表中移除。",
+ "steam.forgotAccount": "已移除 {username}",
+ "steam.setupPendingLabel": "Steam 账号",
+ "steam.setupWaitingForClient": "等待 Steam...",
+ "steam.setupWaitingForLogin": "请登录你要添加的 Steam 账号。",
+ "steam.setupDetected": "已检测到账号",
+ "steam.setupConnected": "已连接",
+ "steam.setupReady": "Steam 账号已添加",
+ "steam.setupReadyWithProfile": "已添加 {profile}",
+ "steam.setupFailed": "Steam 设置失败",
+ "steam.setupFailedMessage": "Accshift 无法完成该 Steam 账号的添加。",
+ "riot.captureSession": "捕获当前会话",
+ "riot.recaptureSession": "重新捕获会话",
+ "riot.capturedSession": "已捕获 {profile} 的会话",
+ "riot.setupPendingLabel": "Riot 账号",
+ "riot.setupWaitingForClient": "等待 Riot 客户端...",
+ "riot.setupWaitingForLogin": "请登录你要添加的 Riot 账号。",
+ "riot.setupCapturing": "正在保存 Riot 会话...",
+ "riot.setupReady": "Riot 账号已添加",
+ "riot.setupReadyWithProfile": "已添加 {profile}",
+ "riot.setupFailed": "Riot 设置失败",
+ "riot.setupFailedMessage": "Accshift 无法完成该 Riot 账号的添加。",
+ "riot.setupStaySignedIn": "请保持「保持登录」为开启状态。",
+ "riot.setupDetected": "已检测到账号",
+ "riot.setupConnected": "已连接",
+ "riot.forget": "移除账号",
+ "riot.forgetConfirmTitle": "移除「{display}」?",
+ "riot.forgetConfirmMessage": "这会从 Accshift 中删除本地 Riot 档案及其保存的会话。",
+ "riot.forgotProfile": "已移除 {profile}",
+ "battlenet.copyUsername": "复制用户名",
+ "battlenet.copyLabelUsername": "用户名",
+ "battlenet.copyEmail": "复制邮箱",
+ "battlenet.copyLabelEmail": "邮箱",
+ "battlenet.forget": "移除",
+ "battlenet.forgetConfirmTitle": "移除「{display}」?",
+ "battlenet.forgetConfirmMessage": "这会把该账号从本机的 Battle.net 账号列表中移除。",
+ "battlenet.forgotAccount": "已移除 {email}",
+ "battlenet.setupPendingLabel": "Battle.net 账号",
+ "battlenet.setupWaitingForClient": "等待 Battle.net...",
+ "battlenet.setupWaitingForLogin": "请登录你要添加的 Battle.net 账号。",
+ "battlenet.setupKeepMeLoggedIn": "尽量保持「保持登录状态」为开启。",
+ "battlenet.setupDetected": "已检测到账号",
+ "battlenet.setupConnected": "已连接",
+ "battlenet.setupReady": "Battle.net 账号已添加",
+ "battlenet.setupReadyWithProfile": "已添加 {profile}",
+ "battlenet.setupFailed": "Battle.net 设置失败",
+ "battlenet.setupFailedMessage": "Accshift 无法完成该 Battle.net 账号的添加。",
+ "ubisoft.copyLabelUuid": "UUID",
+ "ubisoft.forget": "移除",
+ "ubisoft.forgetConfirmTitle": "移除「{display}」?",
+ "ubisoft.forgetConfirmMessage": "这会从 Accshift 中删除该账号及其保存的会话。",
+ "ubisoft.forgotAccount": "已移除 {display}",
+ "ubisoft.setupPendingLabel": "Ubisoft 账号",
+ "ubisoft.setupWaitingForClient": "等待 Ubisoft Connect...",
+ "ubisoft.setupWaitingForLogin": "请登录你要添加的 Ubisoft 账号。",
+ "ubisoft.setupKeepMeLoggedIn": "请保持「记住我」为开启状态。",
+ "ubisoft.setupDetected": "已检测到账号",
+ "ubisoft.setupConnected": "已连接",
+ "ubisoft.setupReady": "Ubisoft 账号已添加",
+ "ubisoft.setupReadyWithProfile": "已添加 {profile}",
+ "ubisoft.setupFailed": "Ubisoft 设置失败",
+ "ubisoft.setupFailedMessage": "Accshift 无法完成该 Ubisoft 账号的添加。",
+ "settings.roblox": "Roblox",
+ "toast.noRobloxAccountsFound": "未找到 Roblox 账号。请使用快速登录添加账号,或粘贴一个 cookie。",
+ "roblox.noAccountsHint": "点击 + 通过快速登录添加 Roblox 账号。",
+ "roblox.sessionExpired": "会话已过期",
+ "roblox.sessionExpiredTooltip": "该账号已登出。切换前请重新添加。",
+ "roblox.sessionExpiredSwitchError": "会话已过期。请重新添加该账号后再切换。备注和设置会保留。",
+ "roblox.cookiePasteTitle": "通过 cookie 添加账号",
+ "roblox.cookiePasteHint": "从浏览器粘贴 .ROBLOSECURITY cookie 即可直接添加账号。",
+ "settings.showRobloxLastLogin": "显示上次登录",
+ "settings.robloxHealthCheck": "会话检查",
+ "settings.robloxHealthCheckHint": "标记 Roblox 会话已过期的账号,每次启动发送一次网络请求。",
+ "roblox.copyLabelUsername": "用户名",
+ "roblox.copyLabelUserId": "用户 ID",
+ "roblox.forget": "移除",
+ "roblox.forgetConfirmTitle": "移除「{display}」?",
+ "roblox.forgetConfirmMessage": "这会从本机删除该账号及其保存的 cookie。",
+ "roblox.forgotAccount": "已移除 {display}",
+ "roblox.setupPendingLabel": "Roblox 账号",
+ "roblox.setupWaitingForClient": "正在连接 Roblox...",
+ "roblox.setupWaitingForLogin": "在另一台设备上打开 Roblox 应用并输入下面的代码。",
+ "roblox.setupQuickLoginCode": "快速登录代码",
+ "roblox.setupQuickLoginHint": "roblox.com/quick-login",
+ "roblox.copyCode": "复制代码",
+ "roblox.setupDetected": "已检测到账号",
+ "roblox.setupConnected": "已连接",
+ "roblox.setupReady": "Roblox 账号已添加",
+ "roblox.setupReadyWithProfile": "已添加 {profile}",
+ "roblox.setupFailed": "Roblox 设置失败",
+ "roblox.setupFailedMessage": "Accshift 无法完成该 Roblox 账号的添加。",
+ "settings.epic": "Epic Games",
+ "settings.epicPath": "Epic Games Launcher 可执行文件",
+ "settings.showEpicLastLogin": "显示上次登录",
+ "toast.noEpicAccountsFound": "未找到 Epic Games 账号。请先登录一次 Epic Games Launcher,然后刷新。",
+ "epic.noAccountsHint": "点击 + 添加 Epic Games 账号。",
+ "epic.copyLabelAccountId": "账号 ID",
+ "epic.forget": "移除",
+ "epic.forgetConfirmTitle": "移除「{display}」?",
+ "epic.forgetConfirmMessage": "这会从 Accshift 中删除该账号及其保存的会话。",
+ "epic.forgotAccount": "已移除 {display}",
+ "epic.setupPendingLabel": "Epic Games 账号",
+ "epic.setupWaitingForClient": "等待 Epic Games Launcher...",
+ "epic.setupWaitingForLogin": "请登录你要添加的 Epic Games 账号。",
+ "epic.setupKeepMeLoggedIn": "请保持「记住我」为开启状态。",
+ "epic.setupDetected": "已检测到账号",
+ "epic.setupConnected": "已连接",
+ "epic.setupReady": "Epic Games 账号已添加",
+ "epic.setupReadyWithProfile": "已添加 {profile}",
+ "epic.setupFailed": "Epic Games 设置失败",
+ "epic.setupFailedMessage": "Accshift 无法完成该 Epic Games 账号的添加。",
+ "settings.gog": "GOG Galaxy",
+ "settings.gogPath": "GOG Galaxy 可执行文件",
+ "settings.showGogLastLogin": "显示上次登录",
+ "toast.noGogAccountsFound": "未找到 GOG Galaxy 账号。请先登录一次 GOG Galaxy,然后刷新。",
+ "gog.noAccountsHint": "点击 + 添加 GOG Galaxy 账号。",
+ "gog.copyLabelAccountId": "账号 ID",
+ "gog.forget": "移除",
+ "gog.forgetConfirmTitle": "移除「{display}」?",
+ "gog.forgetConfirmMessage": "这会从 Accshift 中删除该账号及其保存的会话。",
+ "gog.forgotAccount": "已移除 {display}",
+ "gog.setupPendingLabel": "GOG Galaxy 账号",
+ "gog.setupWaitingForClient": "等待 GOG Galaxy...",
+ "gog.setupWaitingForLogin": "请登录你要添加的 GOG Galaxy 账号。",
+ "gog.setupKeepMeLoggedIn": "请保持「保持登录」为开启状态。",
+ "gog.setupDetected": "已检测到账号",
+ "gog.setupConnected": "已连接",
+ "gog.setupReady": "GOG Galaxy 账号已添加",
+ "gog.setupReadyWithProfile": "已添加 {profile}",
+ "gog.setupFailed": "GOG Galaxy 设置失败",
+ "gog.setupFailedMessage": "Accshift 无法完成该 GOG Galaxy 账号的添加。",
+ "settings.jagex": "Jagex Launcher",
+ "settings.jagexPath": "Jagex Launcher 可执行文件",
+ "settings.showJagexLastLogin": "显示上次登录",
+ "toast.noJagexAccountsFound": "还没有保存的 Jagex 账号。点击 + 通过 Jagex Launcher 添加一个。",
+ "jagex.noAccountsHint": "点击 + 添加 Jagex 账号。",
+ "jagex.copyLabelAccountId": "账号 ID",
+ "jagex.forget": "移除",
+ "jagex.forgetConfirmTitle": "移除「{display}」?",
+ "jagex.forgetConfirmMessage": "这会从 Accshift 中删除该账号及其保存的会话。",
+ "jagex.forgotAccount": "已移除 {display}",
+ "jagex.setupPendingLabel": "Jagex 账号",
+ "jagex.setupWaitingForClient": "等待 Jagex Launcher...",
+ "jagex.setupWaitingForLogin": "请登录你要添加的 Jagex 账号。",
+ "jagex.setupKeepMeLoggedIn": "请保持「记住我」为开启状态。",
+ "jagex.setupDetected": "已检测到账号",
+ "jagex.setupConnected": "已连接",
+ "jagex.setupReady": "Jagex 账号已添加",
+ "jagex.setupReadyWithProfile": "已添加 {profile}",
+ "jagex.setupFailed": "Jagex 设置失败",
+ "jagex.setupFailedMessage": "Accshift 无法完成该 Jagex 账号的添加。",
+ "settings.discord": "Discord",
+ "settings.discordPath": "Discord 可执行文件",
+ "settings.showDiscordLastLogin": "显示上次登录",
+ "toast.noDiscordAccountsFound": "未找到 Discord 账号。请添加一个 Discord 账号,然后刷新。",
+ "discord.noAccountsHint": "点击 + 添加 Discord 账号。",
+ "discord.copyLabelAccountId": "账号 ID",
+ "discord.forget": "移除",
+ "discord.forgetConfirmTitle": "移除「{display}」?",
+ "discord.forgetConfirmMessage": "这会从 Accshift 中删除该账号及其保存的会话。",
+ "discord.forgotAccount": "已移除 {display}",
+ "discord.setupPendingLabel": "Discord 账号",
+ "discord.setupWaitingForClient": "等待 Discord...",
+ "discord.setupWaitingForLogin": "请登录你要添加的 Discord 账号。",
+ "discord.setupKeepMeLoggedIn": "保持登录状态才能保留该账号。",
+ "discord.setupDetected": "已检测到账号",
+ "discord.setupConnected": "已连接",
+ "discord.setupReady": "Discord 账号已添加",
+ "discord.setupReadyWithProfile": "已添加 {profile}",
+ "discord.setupFailed": "Discord 设置失败",
+ "discord.setupFailedMessage": "Accshift 无法完成该 Discord 账号的添加。",
+ "color.none": "默认",
+ "color.blue": "蓝色",
+ "color.cyan": "青色",
+ "color.green": "绿色",
+ "color.lime": "青柠色",
+ "color.yellow": "黄色",
+ "color.orange": "橙色",
+ "color.red": "红色",
+ "color.pink": "粉色",
+ "color.violet": "紫色",
+ "color.gray": "灰色",
+ "language.english": "English",
+ "language.french": "Français",
+ "language.spanish": "Español",
+ "language.portuguese": "Português (Portugal)",
+ "language.portugueseBrazil": "Português (Brasil)",
+ "language.russian": "Русский",
+ "language.chinese": "简体中文",
+ "theme.dark": "深色",
+ "theme.light": "浅色",
+ "theme.midnight": "午夜",
+ "theme.glassDark": "深色玻璃",
+ "theme.glassLight": "浅色玻璃",
+ "theme.liquidGlass": "液态玻璃",
+ "theme.custom": "自定义",
+ "settings.themeImport": "导入",
+ "settings.themeExport": "导出",
+ "settings.themeDelete": "删除主题",
+ "settings.themeImported": "主题已导入",
+ "settings.themeDeleted": "主题已删除",
+ "settings.themeExportCopied": "主题 JSON 已复制到剪贴板",
+ "settings.themeInvalidJson": "主题 JSON 无效",
+ "settings.themeCustomize": "自定义",
+ "settings.themeEdit": "编辑",
+ "settings.themeCopyName": "{name} 副本",
+ "settings.themeSaved": "主题已保存",
+ "settings.themeMigrated": "主题已导入并升级到当前格式",
+ "settings.themeInvalidId": "主题标识符缺失或无效",
+ "settings.themeInvalidName": "主题没有名称",
+ "settings.themeUnsupportedVersion": "该主题需要更新版本的 accshift",
+ "themeGroup.surface": "表面",
+ "themeGroup.text": "文字",
+ "themeGroup.semantic": "状态颜色",
+ "themeGroup.shape": "形状与密度",
+ "themeGroup.typography": "字体排印",
+ "themeGroup.motion": "动效",
+ "themeKind.rgbTriplet": "RGB 三元组",
+ "themeKind.hexColor": "十六进制颜色",
+ "themeKind.color": "颜色",
+ "themeKind.length": "长度",
+ "themeKind.shadow": "阴影",
+ "themeKind.choice": "选项",
+ "themeKind.fontStack": "字体",
+ "themeKind.signedLength": "字距",
+ "themeKind.gradient": "渐变",
+ "themeKind.number": "数值",
+ "themeDensity.compact": "紧凑",
+ "themeDensity.cozy": "适中",
+ "themeDensity.comfortable": "宽松",
+ "themeAvatarShape.circle": "圆形",
+ "themeAvatarShape.rounded": "圆角",
+ "themeAvatarShape.square": "方形",
+ "themeSmoothing.auto": "平滑",
+ "themeSmoothing.none": "像素",
+ "themeToken.bgRgb": "窗口背景",
+ "themeToken.bgCard": "卡片背景",
+ "themeToken.bgCardHover": "卡片悬停背景",
+ "themeToken.bgMuted": "弱化背景",
+ "themeToken.bgElevated": "浮起背景",
+ "themeToken.border": "边框",
+ "themeToken.fg": "主要文字",
+ "themeToken.fgMuted": "次要文字",
+ "themeToken.fgSubtle": "浅色文字",
+ "themeToken.afkText": "离开标记",
+ "themeToken.accent": "强调色",
+ "themeToken.accentFg": "强调色上的文字",
+ "themeToken.success": "成功",
+ "themeToken.warning": "警告",
+ "themeToken.danger": "危险",
+ "themeToken.radiusSm": "小圆角",
+ "themeToken.radiusMd": "中圆角",
+ "themeToken.radiusLg": "大圆角",
+ "themeToken.elevationLow": "浅阴影",
+ "themeToken.elevationMedium": "中阴影",
+ "themeToken.elevationHigh": "深阴影",
+ "themeToken.density": "密度",
+ "themeToken.fontUi": "界面字体",
+ "themeToken.bgImage": "窗口渐变",
+ "themeToken.cardBgImage": "表面渐变",
+ "themeToken.borderWidth": "边框粗细",
+ "themeToken.borderStyle": "边框样式",
+ "themeToken.avatarShape": "头像形状",
+ "themeToken.focusRing": "焦点边框",
+ "themeToken.overlayBlur": "背景模糊",
+ "themeToken.fontDisplay": "标题字体",
+ "themeToken.lineHeight": "行高",
+ "themeToken.letterSpacing": "字间距",
+ "themeToken.labelCase": "标签大小写",
+ "themeToken.fontSmoothing": "文字平滑",
+ "themeToken.motionScale": "动画速度",
+ "themeEditor.title": "主题编辑器",
+ "themeEditor.name": "名称",
+ "themeEditor.author": "作者",
+ "themeEditor.version": "版本",
+ "themeEditor.base": "继承自",
+ "themeEditor.colorScheme": "配色模式",
+ "themeEditor.glass": "半透明表面",
+ "themeEditor.inherited": "继承",
+ "themeEditor.builtInBase": "内置主题",
+ "themeEditor.reset": "恢复为继承的值",
+ "themeEditor.issues": "检查",
+ "themeEditor.noIssues": "没有发现问题",
+ "themeEditor.fixErrorsFirst": "请先修正被拒绝的值再保存",
+ "themeEditor.save": "保存",
+ "themeEditor.saveFailed": "未能保存主题。请再试一次。",
+ "themeEditor.export": "复制",
+ "themeEditor.issueInvalidValue": "{token}:不是有效的{kind},例如 {example}",
+ "themeEditor.issueUnknownToken": "{token} 不是主题值,将被忽略",
+ "themeEditor.issueMissingToken": "{token} 未设置,使用内置值",
+ "themeEditor.issueUnknownBase": "基础主题 {base} 不存在,使用内置值",
+ "themeEditor.issueContrast": "{token} 在 {against} 上的对比度为 {ratio}:1,低于 {target}:1 的目标",
+ "themeEditor.beta": "测试版",
+ "themeEditor.betaNote": "主题格式仍在变动:今天写的主题在更新后可能需要调整。",
+ "themeEditor.customCss": "自定义 CSS",
+ "themeEditor.customCssHelp": "叠加在主题之上,用于上面的取值无法覆盖的部分。不允许 @import 和 url():主题不会向外请求任何内容。",
+ "themeEditor.issueUnsafeCss": "主题中不允许 {construct},该 CSS 不会生效",
+ "themeEditor.issueCssTooLong": "CSS 过长:{length} 个字符,上限为 {limit}",
+ "bulkEdit.title": "批量编辑",
+ "bulkEdit.selectAccounts": "选择账号",
+ "bulkEdit.selectAll": "全选",
+ "bulkEdit.deselectAll": "取消全选",
+ "bulkEdit.next": "下一步",
+ "bulkEdit.apply": "应用",
+ "bulkEdit.settings": "设置",
+ "bulkEdit.newsPopup": "游戏新闻弹窗",
+ "bulkEdit.doNotDisturb": "请勿打扰",
+ "bulkEdit.launchOptions": "各游戏启动选项",
+ "bulkEdit.unchanged": "保持不变",
+ "bulkEdit.addLaunchOption": "添加",
+ "bulkEdit.selectGame": "选择游戏...",
+ "bulkEdit.launchOptionsPlaceholder": "-fullscreen",
+ "bulkEdit.activeAccountWarning": "当前使用中的账号也被选中。更改将在下次 Steam 重启后生效。",
+ "bulkEdit.toastSuccess": "批量编辑:{count} 个成功",
+ "bulkEdit.toastPartial": "批量编辑:{succeeded} 个成功,{failed} 个失败",
+ "bulkEdit.toastFailed": "批量编辑失败",
+ "bulkEdit.noAccountsSelected": "未选择账号",
+ "bulkEdit.selected": "已选 {count} 个",
+ "bulkEdit.loadingGames": "正在加载游戏...",
+ "bulkEdit.copyUrls": "复制链接",
+ "bulkEdit.urlsCopied": "已复制 {count} 个个人资料链接",
+ "bulkEdit.cardColor": "卡片颜色",
+ "bulkEdit.colorApplied": "已为 {count} 张卡片应用颜色",
+ "bulkEdit.colorCleared": "已清除 {count} 张卡片的颜色",
+ "common.retry": "重试",
+ "app.searchNoResults": "没有「{query}」的搜索结果",
+ "app.folderEmpty": "该文件夹是空的",
+ "app.loadErrorGeneric": "账号加载失败。详情见控制台。",
+ "toast.dismiss": "关闭",
+ "toast.switchFailed": "账号切换失败。详情见控制台。",
+ "toast.addAccountFailed": "无法添加该账号。详情见应用日志。",
+ "toast.addAccountClientMissing": "{platform} 似乎没有安装。请先安装,或在设置中指定其位置。",
+ "toast.banCheckFailedGeneric": "封禁检查失败。详情见控制台。",
+ "toast.renameAccountFailed": "重命名失败:{error}",
+ "toast.copyFailed": "无法复制到剪贴板",
+ "toast.refreshFailed": "刷新失败。详情见控制台。",
+ "dialog.deleteFolderTitle": "删除「{name}」?",
+ "dialog.deleteFolderMessage": "子文件夹会一并删除。里面的账号会移回上一级,不会被删除。",
+ "personas.deleteConfirm": "再点一次即可删除",
+ "personas.discardConfirm": "再点一次即可放弃",
+ "personas.switchConfirmTitle": "切换身份",
+ "personas.switchConfirmMessage": "把 {count} 个平台切换到「{name}」?每个客户端都会关闭并重新启动。",
+ "personas.switchConfirmAction": "切换",
+ "personas.deleteTitle": "删除身份",
+ "personas.deleteMessage": "删除「{name}」?账号本身不会受影响。",
+ "context.submenuError": "无法加载该菜单",
+ "settings.apiKeySaveFailed": "无法保存 Steam API 密钥",
+ "settings.apiKeyInvalidHint": "密钥未保存。请检查后重试。",
+ "settings.apiKeyCleared": "Steam API 密钥已清除",
+ "settings.apiKeyClearFailed": "无法清除 Steam API 密钥",
+ "settings.clearApiKey": "清除密钥",
+ "settings.cs2Bridge": "CS2 数据桥接",
+ "settings.cs2BridgeLink": "桥接链接",
+ "settings.cs2BridgeLinkPlaceholder": "https://your-server/api/bridge/accshift/",
+ "settings.cs2BridgeTest": "测试",
+ "settings.cs2BridgeStatusOk": "已连接 · {count} 个账号 · {ms} 毫秒",
+ "settings.cs2BridgeStatusFail": "连接失败",
+ "settings.cs2BridgeStatusTesting": "测试中...",
+ "settings.cs2BridgeStatusUnknown": "未测试",
+ "settings.cs2BridgeToken": "API 令牌",
+ "settings.cs2BridgeTokenOptional": "可选,用于自建服务器",
+ "settings.cs2BridgeTokenPlaceholder": "如果服务器需要,请填写 Bearer 令牌",
+ "settings.cs2BridgeSaveFailed": "无法保存 CS2 桥接设置",
+ "settings.cs2BridgeClearToken": "清除令牌",
+ "settings.pathSaveFailed": "无法保存 {platform} 路径",
+ "settings.pathInvalidHint": "该路径无法保存。请检查后重试。",
+ "settings.pathSteamNeverSignedIn": "已找到 Steam,请先登录一次,让它生成登录记录",
+ "settings.pathNotSteamFolder": "该文件夹看起来不是 Steam 安装目录",
+ "settings.pathNotADirectory": "该路径必须是已存在的文件夹",
+ "settings.pinSaved": "PIN 已保存",
+ "settings.pinTakesEffectNextLaunch": "下次启动应用时生效",
+ "settings.pinRequiredAfterInactivity": "无操作后以及应用启动时需要输入",
+ "settings.pinScreenLockOnly": "PIN 会锁定此窗口和账户切换,不会保护磁盘上的任何数据。",
+ "settings.unitSeconds": "秒",
+ "settings.unitDays": "天",
+ "settings.telemetryLoadFailed": "无法加载遥测设置",
+ "palette.placeholder": "输入命令或账号名称...",
+ "palette.noResults": "没有匹配的命令",
+ "palette.sectionAccounts": "账号",
+ "palette.sectionActions": "操作",
+ "palette.sectionNavigation": "导航",
+ "palette.openTab": "前往 {platform}",
+ "palette.openFolder": "打开文件夹「{name}」",
+ "palette.backToParent": "返回上级文件夹",
+ "palette.zoomReset": "重置缩放"
+}
diff --git a/crates/accshift-app/src/accounts/avatars.rs b/crates/accshift-app/src/accounts/avatars.rs
new file mode 100644
index 00000000..a60b3e34
--- /dev/null
+++ b/crates/accshift-app/src/accounts/avatars.rs
@@ -0,0 +1,676 @@
+//! Per account avatar state, ported from `src/lib/shared/useAvatarLoader.svelte.ts`,
+//! and the avatar images behind it.
+//!
+//! [`AvatarStates`] keeps the TS coalescing: updates queue in a pending map
+//! that [`AvatarStates::flush`] commits once per frame (the
+//! `requestAnimationFrame` flush), and readers inside this module see the
+//! pending value first, like `readState`.
+//!
+//! [`AvatarImages`] is the part the browser did for free: turning an avatar
+//! URL into something to draw. It yields an [`AvatarImage`] (a file path or
+//! downloaded bytes, plus a stable key); decoding and texture upload belong
+//! to the egui side. HTTP runs on the job pool through [`AvatarHttp`]; the
+//! mock's avatars are local files and need no fetch.
+
+use super::profile_cache::UrlPolicy;
+use crate::platforms::{CachedPlatformProfile, PlatformAccount, PlatformProfileInfo};
+use std::collections::{BTreeMap, HashMap};
+use std::path::PathBuf;
+use std::sync::Arc;
+use std::time::Duration;
+
+/// `BATCH_SIZE`: per account profile fetches run this many at a time.
+pub const BATCH_SIZE: usize = 15;
+
+/// `AvatarState`.
+#[derive(Debug, Clone, PartialEq, Eq, Default)]
+pub struct AvatarState {
+ pub url: Option,
+ pub loading: bool,
+ pub refreshing: bool,
+}
+
+/// `Partial` for [`AvatarStates::update_state`].
+#[derive(Debug, Clone, PartialEq, Eq, Default)]
+pub struct AvatarPatch {
+ pub url: Option