824 lines
75 KiB
JSON
824 lines
75 KiB
JSON
{
|
|
"$schema": "../../../waybetter/packages/waybetter/i18n.schema.json",
|
|
"locale": "en",
|
|
"name": "English",
|
|
"englishName": "English",
|
|
"status": "source",
|
|
"messages": {
|
|
"site.common.skipToContent": "Skip to content",
|
|
"site.common.waybetterHome": "wayBetter home",
|
|
"site.common.primary": "Primary",
|
|
"site.common.howItWorks": "How it works",
|
|
"site.home.nav.makeItYours": "Make it yours",
|
|
"site.home.nav.build": "Build",
|
|
"site.home.nav.whatsNext": "What's next",
|
|
"site.common.store": "Store",
|
|
"site.home.nav.download": "Download",
|
|
"site.home.hero.everythingIsAnAppNow": "{span1} Everything is an app now.",
|
|
"site.home.hero.theAppsYouUse": "The apps you use,",
|
|
"site.home.hero.wayBetter": "way better.",
|
|
"site.home.hero.waybetterPutsTheAppsYou": "wayBetter puts the apps you already use in a light native window and extends them in place, the way BetterDiscord extends Discord. Tabs, split panes, every account side by side, themes, plugins and fixes for the app's own bugs. Anyone can make a theme or a plugin. Anyone can build the next app.",
|
|
"site.common.getWaybetterForX": "Get wayBetter for X",
|
|
"site.common.copyTheInstallCommandNpm": "Copy the install command: npm i waybetter",
|
|
"site.common.copy": "Copy",
|
|
"site.home.hero.downloadWaybetterForXFor": "{a1}Download wayBetter for X for Windows{a1End} · free · GPL-3.0-or-later · no telemetry on what you read or post",
|
|
"site.common.waybetterForXInSplit": "wayBetter for X in split view: two accounts' feeds scrolling side by side, then the theme switching to Classic Twitter and back",
|
|
"site.home.hero.theme": "Theme",
|
|
"site.home.hero.pluginOn": "Plugin · on",
|
|
"site.home.hero.highlights": "Highlights",
|
|
"site.home.hero.themesInWaybetterForX": "{b1} themes in wayBetter for X",
|
|
"site.home.hero.bundledPlugins": "{b1} bundled plugins",
|
|
"site.home.hero.fixesForXSOwn": "{b1} fixes for X's own bugs",
|
|
"site.home.hero.download": "{b1} download",
|
|
"site.home.hero.toOpen": "{b1} to open",
|
|
"site.home.hero.dependenciesIn": "{b1} dependencies in {code1}",
|
|
"site.home.hero.forever": "{b1} forever",
|
|
"site.home.problem.theProblem": "{b1} The problem",
|
|
"site.home.problem.everyAppShipsHalfOf": "Every app ships {em1}half{em1End} of what you need.",
|
|
"site.home.problem.theRestYouCant": "The rest you can't have: the app decides how many accounts you get, how it looks, and when its bugs get fixed. wayBetter keeps the app and adds the other half.",
|
|
"site.home.problem.oneAccountPerWindowLog": "One account per window. Log out, log in, repeat.",
|
|
"site.home.problem.everyAccountSideBySide": "Every account, {em1}side by side,{em1End} all signed in at once.",
|
|
"site.home.problem.aBugInTheApp": "A bug in the app? Wait for them to fix it.",
|
|
"site.home.problem.fixedOnYourMachineIn": "Fixed {em1}on your machine,{em1End} in place, today.",
|
|
"site.home.problem.theLookTheyPickedThe": "The look they picked. The features they shipped.",
|
|
"site.home.problem.themesAndPluginsAnyoneCan": "Themes and plugins {em1}anyone{em1End} can write.",
|
|
"site.home.problem.aWholeBrowserBundledInto": "A whole browser bundled into every desktop client.",
|
|
"site.home.problem.oneLightNativeWindowOn": "One {em1}light{em1End} native window, on the system WebView.",
|
|
"site.home.light.lightByDesign": "Light by design",
|
|
"site.home.light.everythingIsAnAppNow": "Everything is an app now. {em1}A light one.{em1End}",
|
|
"site.home.light.aNativeWindowOnThe": "A native window on the WebView your system already has, not another browser bundled into every app.",
|
|
"site.home.light.theWholeWindowsInstaller": "the whole Windows installer",
|
|
"site.home.light.fromLaunchToTheWindow": "from launch to the window on screen",
|
|
"site.home.light.forThemesFixesAndPlugins": "for themes, fixes and plugins to load in the page",
|
|
"site.home.light.longTasksAddedToThe": "long tasks added to the page",
|
|
"site.home.light.measuredOnWindows11With": "Measured on Windows 11 with wayBetter for X 1.0: installer size of the published download; median of 3 launches; runtime evaluation and long tasks (>50 ms) measured with and without wayBetter.",
|
|
"site.home.system.oneSystem": "{b1} One system",
|
|
"site.home.system.threeLayersAroundTheReal": "Three layers {em1}around the real app.{em1End}",
|
|
"site.home.system.everyWaybetterAppIsThe": "Every wayBetter app is the same system: a native Shell, a page Runtime, and one small Adapter that knows the app. The app itself keeps doing what it does. Nothing is proxied or re-hosted; it changes on your machine only.",
|
|
"site.home.system.n01Shell": "01 · Shell",
|
|
"site.home.system.aLightNativeWindow": "A light native window.",
|
|
"site.home.system.tauri2OnTheSystem": "Tauri 2, on the system WebView. The chrome you wish every app had:",
|
|
"site.home.system.tabsPinnedTabsAndSplit": "Tabs, pinned tabs and split panes: drag a tab or a link to an edge",
|
|
"site.home.system.everyAccountInItsOwn": "Every account in its own profile, signed in side by side",
|
|
"site.home.system.linkRoutingOpenInThe": "Link routing: open in the same tab, beside, in a new tab or your browser",
|
|
"site.home.system.addressBarAndCommandPalette": "Address bar and command palette {kbd1} {kbd2}",
|
|
"site.home.system.signedUpdatesThatInstallSilently": "Signed updates that install silently",
|
|
"site.home.system.n02Runtime": "02 · Runtime",
|
|
"site.home.system.themesAndPluginsInsideThe": "Themes and plugins, inside the page.",
|
|
"site.home.system.injectedIntoTheApps": "Injected into the app's own pages, shared by every wayBetter app:",
|
|
"site.home.system.themesOnOneColorFoundation": "Themes on one color foundation (an OKLab model of the app's palette)",
|
|
"site.home.system.betterdiscordStyleJavascriptPluginsW": "BetterDiscord-style JavaScript plugins with a small helper API",
|
|
"site.home.system.oneDomHubAndOne": "One DOM hub and one request hub, so features stay cheap",
|
|
"site.home.system.yourOwnCssAppliedAfter": "Your own CSS, applied after the theme",
|
|
"site.home.system.n03Adapter": "03 · Adapter",
|
|
"site.home.system.oneSmallPiecePerApp": "One small piece per app.",
|
|
"site.home.system.theOnlyPartThatKnows": "The only part that knows the app: its hosts, its layout, its account button and the data it already loads.",
|
|
"site.home.system.aNativeAndAPage": "A native {code1} and a page {code2}",
|
|
"site.home.system.aShortReviewedListOf": "A short, reviewed list of what the app's tabs may call",
|
|
"site.home.system.everythingElseComesFromThe": "Everything else comes from the system",
|
|
"site.common.home": "Home",
|
|
"site.home.system.thread": "Thread",
|
|
"site.home.system.adapter": "adapter",
|
|
"site.home.system.shell": "Shell",
|
|
"site.home.system.runtime": "Runtime",
|
|
"site.home.system.adapter2": "Adapter",
|
|
"site.home.system.heavyDesktopClientSameWindow": "Heavy desktop client? {em1}Same window.{em1End}",
|
|
"site.home.system.servicesThatShipAHeavy": "Services that ship a heavy Electron client get exactly the same thing: wayBetter runs their web app in its own light Tauri window, with the same tabs, split panes, real accounts side by side, themes, plugins and signed updates. There is no second kind of host.",
|
|
"site.home.x.theFirstApp": "{b1} The first app",
|
|
"site.home.x.theLiveXComIn": "The live x.com in tabs and split panes, every account side by side, fourteen themes, eight area plugins and fixes for the bugs X ships: likes and follows that race, drafts that vanish, a timeline that jumps. Available now for Windows, macOS and Linux.",
|
|
"site.home.x.builtInThemesAndYours": "built-in themes, and yours",
|
|
"site.home.x.bundledPluginsOffUntilYou": "bundled plugins, off until you turn them on",
|
|
"site.home.x.fixesForXSOwn": "fixes for X's own bugs",
|
|
"site.home.x.tweaksToHideShowAnd": "tweaks to hide, show and change X",
|
|
"site.home.x.everyAccountSideBySide": "Every account, side by side",
|
|
"site.home.x.tabsAndSplitPanesOn": "Tabs and split panes on the live x.com, each account signed in at once in its own profile.",
|
|
"site.home.x.xsBugsFixed": "X's bugs, fixed",
|
|
"site.home.x.likesAndFollowsThatLand": "Likes and follows that land, your place kept on Back, no timeline jumps, retried uploads.",
|
|
"site.home.x.aDraftVault": "A draft vault",
|
|
"site.home.x.everyDraftKeptLocallyWith": "Every draft kept locally with its revision history, and put back when X loses it.",
|
|
"site.home.x.fourteenThemesFourteenPlugins": "Fourteen themes, eight area plugins",
|
|
"site.home.x.fullRedesignsNotJustColors": "Full redesigns, not just colors. Reader+, Chat+, Media+ and five more area plugins, a switch for every feature.",
|
|
"site.home.x.ctrlKForEverything": "Ctrl+K for everything",
|
|
"site.home.x.aCommandPaletteForTabs": "A command palette for tabs, accounts, settings and X search with operator chips.",
|
|
"site.home.x.powerUserMode": "Deck",
|
|
"site.home.x.aTweetdeckStyleDeckColumns": "A TweetDeck-style deck: columns of X side by side, each in the account you pick, with filters and unread counts.",
|
|
"site.home.x.freeOpenSourceUpdatesSilently": "Free · open source · updates silently",
|
|
"site.common.downloadForWindows": "Download for Windows",
|
|
"site.home.x.seeEverything": "See everything",
|
|
"site.home.x.windowsNowMacosAndLinux": "Windows · macOS · Linux",
|
|
"site.home.make.makeItYours": "{b1} Make it yours",
|
|
"site.common.anyoneCanMakeThemesAnd": "Anyone can make {em1}themes{em1End} and {em2}plugins.{em2End}",
|
|
"site.home.make.aThemeIsOneJson": "A theme is one JSON file. A plugin is one JavaScript file. No review queue and no account to use one: write it, drop it in, share the file, or publish it in the {a1}Store{a1End}. If you can write CSS, you can restyle an app. If you can write a little JavaScript, you can add the feature it never shipped.",
|
|
"site.common.themes": "Themes",
|
|
"site.home.make.colorsFontsShapeLayoutBackground": "Colors, fonts, shape, layout, background, effects.",
|
|
"site.home.make.importAndExportJsonIn": "Import and export JSON in the Appearance panel. Contrast is checked for you: text is kept readable on every surface.",
|
|
"site.common.post": "Post",
|
|
"site.common.forYou": "For you",
|
|
"site.common.following": "Following",
|
|
"site.home.make.fourteenThemesShipWithIt": "Fourteen themes ship with it. The fifteenth is {a1}yours{a1End}.",
|
|
"site.home.make.oneJsonFileDropIt": "One JSON file. Drop it into Appearance → Import.",
|
|
"site.common.previewABuiltInTheme": "Preview a built-in theme",
|
|
"site.common.plugins": "Plugins",
|
|
"site.home.make.oneFileAnd": "One file. {code1} and {code2}.",
|
|
"site.home.make.betterdiscordStyleDroppedIntoThe": "BetterDiscord-style {code1}, dropped into the plugins folder and switched on in Settings. A helper API does the fiddly parts.",
|
|
"site.home.make.helperApi": "Helper API",
|
|
"site.home.make.fourteenShipWithWaybetterFor": "Fourteen ship with wayBetter for X",
|
|
"site.home.build.buildOnIt": "{b1} Build on it",
|
|
"site.home.build.theWholeSystemIsOne": "The whole system is {em1}one package.{em1End}",
|
|
"site.home.build.thePageRuntimeAndThe": "The page runtime and the shell models behind wayBetter for X are on npm as {code1}: plain ESM with types, every module its own subpath, zero dependencies. Take the pieces you need, or build a whole app.",
|
|
"site.home.build.terminal": "terminal",
|
|
"site.common.zeroDependencies": "zero dependencies",
|
|
"site.home.build.runtimeAndShell": "runtime/* and shell/*",
|
|
"site.home.build.adapterTsFromTheReadme": "adapter.ts · from the README, shortened",
|
|
"site.home.build.theAdaptersCompositionRoot": "the adapter's composition root",
|
|
"site.home.build.oneMutationobserverOneFrame": "one MutationObserver, one frame",
|
|
"site.home.build.oneFetchXhrHookFor": "one fetch/XHR hook for every feature",
|
|
"site.home.build.helpersForUserPlugins": "helpers for user plugins",
|
|
"site.home.build.theOklabColorModel": "the OKLab color model",
|
|
"site.home.build.oneNavigationInSplitView": "one navigation in split view",
|
|
"site.home.build.besideTabOrBrowser": "beside, tab or browser",
|
|
"site.home.build.whichAccountIsSignedIn": "which account is signed in",
|
|
"site.home.build.addressBarChips": "address bar chips",
|
|
"site.home.build.splitPanesLinksBeside": "split panes, links beside",
|
|
"site.home.build.dropALinkGetA": "drop a link, get a pane",
|
|
"site.home.build.commandPaletteRanking": "command palette ranking",
|
|
"site.home.build.accountProfiles": "account profiles",
|
|
"site.home.build.theUpdateChip": "the update chip",
|
|
"site.home.build.titlebarAndCaptionButtons": "titlebar and caption buttons",
|
|
"site.home.build.titlebarAndToolbarSizes": "titlebar and toolbar sizes",
|
|
"site.home.build.waybetterOnNpm": "waybetter on npm",
|
|
"site.common.sourceOn": "Source on {host}",
|
|
"site.home.next.whatsNext": "{b1} What's next",
|
|
"site.home.next.xWasFirstYouBuild": "X was first. {em1}You build the next one.{em1End}",
|
|
"site.home.next.anyAppWithAWeb": "Any app with a web version can get the same window, themes and plugins. These could be next. None of them is announced, and none has a date: they are waiting for someone to write the adapter. The README's own adapter example is Kick.",
|
|
"site.common.possible": "possible",
|
|
"site.home.next.youtubeLogo": "YouTube logo",
|
|
"site.home.next.tabsAndSplitPanesFor": "Tabs and split panes for videos, every channel account side by side, themes, plugins.",
|
|
"site.home.next.kickLogo": "Kick logo",
|
|
"site.home.next.streamsSideBySideIn": "Streams side by side in one light window, your chat plugins, your theme.",
|
|
"site.home.next.twitchLogo": "Twitch logo",
|
|
"site.home.next.multiStreamSplitPanesEvery": "Multi-stream split panes, every account signed in, plugins for chat.",
|
|
"site.home.next.discordLogo": "Discord logo",
|
|
"site.home.next.theWebAppInA": "The web app in a light Tauri window instead of the heavy client. Same shell, same plugins.",
|
|
"site.home.next.waybetterForTheAppYou": "{span1}wayBetter for{span1End}the app you use.",
|
|
"site.home.next.writeTheAdapterTheShell": "Write the adapter. The shell, runtime, themes and plugins come with it.",
|
|
"site.home.next.buildTheNextOne": "Build the next one.",
|
|
"site.home.next.startFromThePackageAnd": "Start from the package and the README's adapter example. Built something? Add it to the \"Projects using wayBetter\" list with a pull request.",
|
|
"site.home.next.startBuilding": "Start building",
|
|
"site.home.next.possibleNextAppsNotAnnounced": "Possible next apps, not announced products. YouTube, Kick, Twitch and Discord are trademarks of their respective owners; their logos are shown only to name the services. wayBetter is not affiliated with, endorsed by or sponsored by any of them.",
|
|
"site.home.foss.freeAndOpenSource": "{b1} Free and open source",
|
|
"site.home.foss.noCatchReadEveryLine": "No catch. {em1}Read every line.{em1End}",
|
|
"site.common.free": "Free",
|
|
"site.home.foss.noPaidTierNoAds": "No paid tier, no ads, no upsell. Not now, not \"after the beta\".",
|
|
"site.common.open": "Open",
|
|
"site.home.foss.gpl30OrLater": "GPL-3.0-or-later. The framework and the apps are public source on {host}.",
|
|
"site.common.private": "Private",
|
|
"site.home.foss.noAnalyticsNoTelemetryOn": "No analytics, no telemetry on what you read or post. Drafts, settings and plugins stay on your machine.",
|
|
"site.common.yours": "Yours",
|
|
"site.home.foss.forkItThemeItWrite": "Fork it, theme it, write plugins, build the next app. The license keeps it open for the next person too.",
|
|
"site.common.madeByCrtkafa": "Made by @CRTkafa",
|
|
"site.home.principles.principles": "{b1} Principles",
|
|
"site.home.principles.betterNotDifferent": "Better, {em1}not different.{em1End}",
|
|
"site.home.principles.theRealAppInPlace": "The real app, in place",
|
|
"site.home.principles.youSignInToThe": "You sign in to the app itself. Nothing is proxied or re-hosted; it is changed on your machine only.",
|
|
"site.home.principles.lightNotAnotherBrowser": "Light, not another browser",
|
|
"site.home.principles.aTauriWindowOnThe": "A Tauri window on the system WebView, one per app, with every account inside it.",
|
|
"site.home.principles.neverActsForYou": "Never acts for you",
|
|
"site.home.principles.fixesMakeYourOwnClicks": "Fixes make your own clicks land. wayBetter never posts, follows or deletes anything by itself.",
|
|
"site.home.principles.quietlyCurrent": "Quietly current",
|
|
"site.home.principles.updatesAreSignedAndInstall": "Updates are signed and install silently, so fixes land without another installer.",
|
|
"site.home.closer.startWithXBuildWhat": "Start with {em1}X.{em1End}{br1}Build {em2}what's next.{em2End}",
|
|
"site.home.closer.seeWaybetterForX": "See wayBetter for X",
|
|
"site.common.madeByCrtkafaGpl3": "Made by {a1}@CRTkafa{a1End} · GPL-3.0-or-later · Not affiliated with the apps it extends.",
|
|
"site.common.footer": "Footer",
|
|
"site.common.source": "Source",
|
|
"site.x.nav.features": "Features",
|
|
"site.x.nav.fixes": "Fixes",
|
|
"site.x.nav.makeYourOwn": "Make your own",
|
|
"site.common.faq": "FAQ",
|
|
"site.x.top.freeOpenSourceGpl3": "{span1} Free & open source · GPL-3.0",
|
|
"site.common.waybetterForXLogo": "wayBetter for X logo",
|
|
"site.x.top.xExtended": "X, {em1}extended.{em1End}",
|
|
"site.x.top.theLiveXComIn": "The live x.com in a light desktop window: tabs, split panes, every account side by side, fourteen themes, eight area plugins, a draft vault with history, and fixes for the bugs X ships. Anyone can make a theme or a plugin for it.",
|
|
"site.x.top.windowsNowMacosAndLinux": "Windows, macOS and Linux · updates install silently",
|
|
"site.x.top.waybetterForXInSplit": "wayBetter for X in split view: @CRTkafa and @otheraccount feeds scrolling side by side, then the theme switching to Classic Twitter and back",
|
|
"site.x.top.builtInThemes": "built-in themes",
|
|
"site.x.top.bundledPlugins": "bundled plugins",
|
|
"site.x.top.fixesForXSBugs": "fixes for X's bugs",
|
|
"site.x.top.tweaks": "tweaks",
|
|
"site.x.features.tourEverythingInIt": "{b1}Tour{b1End} Everything in it",
|
|
"site.x.features.builtForPeopleWhoLive": "Built for people who {em1}live in their timeline.{em1End}",
|
|
"site.x.features.everythingAHeavyXUser": "Everything a heavy X user wished the official app shipped with, on the real x.com. Twelve stops; each one is a real feature you can switch on today.",
|
|
"site.x.features.featureTour": "Feature tour",
|
|
"site.x.features.tabsSplit": "{span1}Tabs & split",
|
|
"site.x.features.accounts": "{span1}Accounts",
|
|
"site.x.features.links": "{span1}Links",
|
|
"site.x.features.palette": "{span1}Palette",
|
|
"site.x.features.themes": "{span1}Themes",
|
|
"site.x.features.plugins": "{span1}Plugins",
|
|
"site.x.features.fixes": "{span1}Fixes",
|
|
"site.x.features.drafts": "{span1}Drafts",
|
|
"site.x.features.tweaks": "{span1}Tweaks",
|
|
"site.x.features.alertsMedia": "{span1}Alerts & media",
|
|
"site.x.features.updates": "{span1}Updates",
|
|
"site.x.features.privacy": "{span1}Privacy",
|
|
"site.x.tabs.tabsAndSplitPanes": "Tabs and split panes.",
|
|
"site.x.tabs.openProfilesSearchesAndThreads": "Open profiles, searches and threads in their own tabs, and put any two side by side. Drag a tab, or any link, to the edge of a pane to split it.",
|
|
"site.x.tabs.splitRightSplitDown": "Split right {kbd1} {kbd2}, split down {kbd3} {kbd4}",
|
|
"site.x.tabs.newTabWithShortcutsRecently": "New tab {kbd1} {kbd2} with shortcuts, recently closed tabs and \"Open as\" an account",
|
|
"site.x.tabs.pinnedTabsAndYourTabs": "Pinned tabs, and your tabs and split layout restored on launch",
|
|
"site.x.tabs.dropALinkOnA": "Drop a link on a pane edge, a tab strip or the window: split, tab or new tab",
|
|
"site.x.tabs.oneNavigationInSplitView": "One navigation in split view: side-by-side panes of the same account keep X's left rail only once",
|
|
"site.common.search": "Search",
|
|
"site.x.tabs.splitRight": "Split right",
|
|
"site.x.accounts.everyAccountSideBySide": "Every account, side by side.",
|
|
"site.x.accounts.eachAccountLivesInIts": "Each account lives in its own profile with its own session, so all of them stay signed in at once. You log in to x.com itself, the normal way.",
|
|
"site.x.accounts.accountsAreReadFromX": "Accounts are read from X's own account button, never typed in",
|
|
"site.x.accounts.aColoredBadgeOnEvery": "A colored badge on every tab's icon says which account it is",
|
|
"site.x.accounts.renameAndColorAccountsSee": "Rename and color accounts; see how many tabs each one has open",
|
|
"site.x.accounts.newTabAsAnyAccount": "\"New tab as\" any account from the palette or the new-tab page",
|
|
"site.x.accounts.accounts": "Accounts",
|
|
"site.x.accounts.n3Tabs": "3 tabs",
|
|
"site.x.accounts.n2Tabs": "2 tabs",
|
|
"site.x.accounts.work": "Work",
|
|
"site.x.accounts.n1Tab": "1 tab",
|
|
"site.x.accounts.addAccount": "+ Add account",
|
|
"site.x.deck.new": "New",
|
|
"site.x.deck.powerUserModeTheDeck": "Deck. {em1}The columns are back.{em1End}",
|
|
"site.x.deck.columnsOfXSideBy": "Columns of X side by side, TweetDeck-style: Home, Notifications, Mentions, a search, a list or a profile, each in the account you pick. Every column is the real x.com; every like and reply is X's own.",
|
|
"site.x.deck.unreadCountsOnEveryColumn": "Unread counts on every column, filters with keywords or regex",
|
|
"site.x.deck.andBetweenColumnsAlt1": "[ and ] between columns, Alt+1–9 to jump, Ctrl+Alt+N to post from a dock",
|
|
"site.x.deck.pagesOfWholeColumnsOff": "Pages of whole columns; off-page columns rest in low memory",
|
|
"site.x.deck.deck": "Deck",
|
|
"site.x.deck.n12New": "12 new",
|
|
"site.x.deck.notifications": "Notifications",
|
|
"site.x.deck.n3New": "3 new",
|
|
"site.x.deck.mentions": "Mentions",
|
|
"site.x.deck.n1New": "1 new",
|
|
"site.x.deck.waybetterLatest": "wayBetter · Latest",
|
|
"site.x.deck.live": "live",
|
|
"site.x.deck.addColumn": "+ Add column",
|
|
"site.x.links.linksGoWhereYouWant": "Links go where you want.",
|
|
"site.x.links.decideOnceWhereLinksOpen": "Decide once where links open. \"Beside\" opens a split next to the pane you clicked in and reuses it for the next link, so reading a thread never loses your timeline.",
|
|
"site.x.links.postsProfilesHashtagsAndLists": "Posts, profiles, hashtags and lists: same tab, beside, new tab or system browser",
|
|
"site.x.links.otherSitesBesideNewTab": "Other sites: beside, new tab or your system browser",
|
|
"site.x.links.twitterComLinksLoadOn": "twitter.com links load on x.com; X's own \"new tab\" links stay in the app",
|
|
"site.x.links.linksToXPages": "Links to X pages",
|
|
"site.x.links.sameTab": "Same tab",
|
|
"site.common.beside": "Beside",
|
|
"site.common.newTab": "New tab",
|
|
"site.common.systemBrowser": "System browser",
|
|
"site.x.links.linksToOtherSites": "Links to other sites",
|
|
"site.x.links.restoreTabsOnLaunch": "Restore tabs on launch",
|
|
"site.x.palette.everythingIsOneKeystrokeAway": "Everything is one keystroke away.",
|
|
"site.x.palette.theCommandPaletteFindsAny": "The command palette {kbd1} {kbd2} finds any open tab, account, setting or X page. Every tab has an address bar that names where you are.",
|
|
"site.x.palette.searchXStraightFromThe": "Search X straight from the palette or the address bar",
|
|
"site.x.palette.xsSearchOperatorsAs": "X's search operators ({code1}, {code2}, {code3}, {code4}…) as chips, in the address bar and under X's own search box",
|
|
"site.x.palette.jumpToXSettingsPages": "Jump to X settings pages like muted words or blocked accounts; you finish the change on X",
|
|
"site.x.palette.searchXLatestForFrom": "Search X (Latest) for from:CRTkafa filter:media",
|
|
"site.x.palette.tabs": "Tabs",
|
|
"site.x.palette.homeX": "Home / X{small1}",
|
|
"site.x.palette.profiles": "Profiles",
|
|
"site.x.palette.newTabAsOtherAccount": "New tab as otheraccount",
|
|
"site.x.palette.appearance": "Appearance",
|
|
"site.x.themes.fourteenThemesEveryOneA": "Fourteen themes. {em1}Every one a full redesign.{em1End}",
|
|
"site.x.themes.aThemeIsMoreThan": "A theme is more than colors: fonts, corners, avatar shape, column width, density, cards, backgrounds, hover effects and even a CRT overlay. Contrast is enforced for every theme, built-in or imported, so text stays readable. Pick one, then change any part of it.",
|
|
"site.x.themes.sameTimelineFourteenWaysPick": "Same timeline, fourteen ways. Pick one, then {a1}make your own{a1End}.",
|
|
"site.x.themes.themesAreJsonImportExport": "Themes are JSON. Import, export, share.",
|
|
"site.x.themes.xsOwnLookDefault": "X's own look: Default, Dim or Lights out.",
|
|
"site.x.themes.n2012OnASkyBlue": "2012 on a sky-blue canvas, Helvetica, the old link blue.",
|
|
"site.x.themes.blueBlackAndGeistSoft": "Blue-black and Geist, soft corners, a quiet glow.",
|
|
"site.x.themes.phosphorGreenMonospaceScanlinesAnd": "Phosphor green, monospace, scanlines and CRT.",
|
|
"site.x.themes.newsprintCardsASerifReading": "Newsprint cards, a serif reading face, ink-red links.",
|
|
"site.x.themes.purpleLinksPinkButtonsGraphite": "Purple links, pink buttons, graphite and a dot grid.",
|
|
"site.x.themes.arcticSlateFloatingCardsAn": "Arctic slate, floating cards, an aurora glow.",
|
|
"site.x.themes.indigoAndLavenderAWide": "Indigo and lavender, a wide column, a street grid.",
|
|
"site.x.themes.creamAndCyanOnEngineering": "Cream and cyan on engineering paper.",
|
|
"site.x.themes.aGlossy2008SkyBubbles": "A glossy 2008 sky, bubbles, glass cards.",
|
|
"site.x.themes.tealDesktopSilverWindowsBevelled": "Teal desktop, silver windows, bevelled buttons.",
|
|
"site.x.themes.sunsetOverANeonGrid": "Sunset over a neon grid, wide-tracked type.",
|
|
"site.x.themes.forLowVisionYellowOn": "For low vision: yellow on black, larger type, no motion.",
|
|
"site.x.themes.trueBlackSoftVioletBig": "True black, soft violet, big round corners.",
|
|
"site.x.themes.whatAThemeCanChange": "What a theme can change",
|
|
"site.x.themes.pageBackgroundSurfacesBorderText": "page, background, surfaces, border, text, muted, accent, buttons",
|
|
"site.x.themes.uiAndPostTextStacks": "UI and post-text stacks, size, weights, tracking, leading",
|
|
"site.x.themes.cardAndButtonCornersCircle": "card and button corners; circle, rounded or square avatars",
|
|
"site.x.themes.columnAndSidebarWidthDensity": "column and sidebar width, density, cards, frame",
|
|
"site.x.themes.glowGradientsSixPatternsOr": "glow gradients, six patterns, or your own photo with dimming",
|
|
"site.x.themes.motionHoverTintLiftGlow": "motion, hover tint / lift / glow, shadows, CRT",
|
|
"site.x.themes.freeFormCssAppendedLast": "free-form CSS, appended last",
|
|
"site.x.themes.importFileDropOrPaste": "Import (file, drop or paste) and Export in the Appearance panel. Save any customized look as your own theme. Custom CSS for X applies after the theme, like BetterDiscord's.",
|
|
"site.x.plugins.fourteenPluginsInTheBox": "Eight area plugins in the box. {em1}Room for yours.{em1End}",
|
|
"site.x.plugins.everyBundledPluginShipsSwitched": "Compose+, Reader+, Profile+, Chat+, Media+, Search+, Notifications+ and Navigation+ are built in, with a switch for every feature: pick a mode on the first start or turn on what you want in Plugins. None of them sends a request or acts on your account. A few of their features:",
|
|
"site.x.plugins.read": "Read",
|
|
"site.x.plugins.aReadThreadButtonUnrolls": "A \"Read thread\" button unrolls the author's thread into a clean reading view, with copy as Markdown.",
|
|
"site.x.plugins.n5hBecomes5hSep27": "\"5h\" becomes \"5h · Sep 27, 2026, 14:03\", in your local time.",
|
|
"site.x.plugins.n3MinReadOnLong": "\"3 min read\" on long posts and X Articles.",
|
|
"site.x.plugins.hidesCountsTrendsAndWho": "Hides counts, trends and \"Who to follow\" while you read. {kbd1} {kbd2} {kbd3} turns it on and off.",
|
|
"site.x.plugins.clean": "Clean",
|
|
"site.x.plugins.hidePostsByRegularExpression": "Hide posts by regular expression on text, name or @handle, locally. {kbd1} {kbd2} {kbd3} edits the list.",
|
|
"site.x.plugins.tCoLinksPointStraight": "t.co links point straight at their destination, tracking parameters stripped.",
|
|
"site.x.plugins.privateNotesOnAccountsUnder": "Private notes on accounts, under the bio and in hover cards. Never sent anywhere.",
|
|
"site.x.plugins.postsFromPaidBlueCheck": "Posts from paid blue-check accounts fold into a one-line stub you can open. People you follow stay. {kbd1} {kbd2} {kbd3} for settings.",
|
|
"site.x.plugins.write": "Write",
|
|
"site.x.plugins.aCopyButtonOnEvery": "A copy button on every post: a Markdown quote with images, author, date and link.",
|
|
"site.x.plugins.aNudgeWhenImagesIn": "A nudge when images in the composer have no description. Never blocks sending.",
|
|
"site.x.plugins.asksBeforeYouReplyTo": "Asks before you reply to a months-old post, or to someone you don't follow if you want. Nothing is sent for you.",
|
|
"site.x.plugins.opensASearchablePickerWith": "{kbd1} {kbd2} {kbd3} opens a searchable picker with your recent emoji and skin tones. {kbd4} shortcodes work in text boxes where X has none.",
|
|
"site.x.plugins.move": "Move",
|
|
"site.x.plugins.onThePostFocusedWith": "On the post focused with j/k: {kbd1} copy link, {kbd2} open media, {kbd3} author, {kbd4} quoted post.",
|
|
"site.x.plugins.aProfilesMediaTab": "A profile's Media tab fills the window: no right column, tighter gaps.",
|
|
"site.x.fixes.xsBugsFixedOn": "X's bugs, {em1}fixed on your machine.{em1End}",
|
|
"site.x.fixes.waybetterForXRunsOn": "wayBetter for X runs on top of the real x.com and patches the frontend bugs that ship with it. Every fix is a switch in Settings, on by default. None of them clicks, posts or follows for you: they only make your own actions land.",
|
|
"site.x.fixes.likesThatMatchTheServer": "Likes that match the server",
|
|
"site.x.fixes.clickLikeAFewTimes": "Click like a few times fast and X's screen can end in the wrong state: here it showed not liked, 2 likes, while X's server had liked, 3. A quick like and unlike can also leave the count one too high until you refresh. wayBetter sends your likes, reposts, bookmarks and follows one at a time, so the heart, the count and the server all end where your last click did.",
|
|
"site.x.fixes.xOnItsOwn": "X on its own",
|
|
"site.x.fixes.eightFastClicksOnThe": "Eight fast clicks on the like button. On X alone the screen shows not liked, 2 likes, while X's server has liked, 3 likes. With wayBetter for X the screen matches the server after a refresh.",
|
|
"site.x.fixes.followButtonsThatSettleRight": "Follow buttons that settle right",
|
|
"site.x.fixes.followAndUnfollowGoOut": "Follow and unfollow go out one at a time, so the button ends on what you last clicked, not on a stale answer.",
|
|
"site.x.fixes.keepYourPlaceOnBack": "Keep your place on Back",
|
|
"site.x.fixes.goingBackOrSwitchingTimeline": "Going back, or switching timeline tabs, returns to the post you were reading instead of the top.",
|
|
"site.x.fixes.noTimelineJumps": "No timeline jumps",
|
|
"site.x.fixes.thePostYouAreReading": "The post you are reading stays still when X inserts new posts or media above it.",
|
|
"site.x.fixes.seeNewPostsWithoutThe": "\"See new posts\" without the jump",
|
|
"site.x.fixes.theNewPostsLandAbove": "The new posts land above the one you are reading instead of throwing you to the top. Works with {kbd1} too.",
|
|
"site.x.fixes.keepYourHomeTab": "Keep your Home tab",
|
|
"site.x.fixes.pickedFollowingOrAList": "Picked Following or a list? When X switches back to \"For you\" by itself, it switches back.",
|
|
"site.x.fixes.followingInTimeOrder": "Following in time order",
|
|
"site.x.fixes.theFollowingTabAlwaysShows": "The Following tab always shows the newest posts first, even when X switched it to \"Popular\".",
|
|
"site.x.fixes.retryFailedMediaUploads": "Retry failed media uploads",
|
|
"site.x.fixes.aFailedVideoOrImage": "A failed video or image chunk is sent again, up to 3 times. If it still fails, you're told, instead of the post failing silently.",
|
|
"site.x.fixes.restoreUnsentText": "Restore unsent text",
|
|
"site.x.fixes.lostAReplyToA": "Lost a reply to a reload, a closed composer or a navigation? The composer offers to put your saved draft back.",
|
|
"site.x.fixes.clearASeenNotificationBadge": "Clear a seen notification badge",
|
|
"site.x.fixes.aCountYouAlreadySaw": "A count you already saw on Notifications stays hidden until it changes. Cosmetic; nothing is marked read.",
|
|
"site.x.drafts.aDraftVaultThatNever": "A draft vault that never loses a word.",
|
|
"site.x.drafts.whatYouTypeIntoX": "What you type into X's composer is captured into a local vault with its full revision history. It says \"Saved\" only after the write is committed on your disk.",
|
|
"site.x.drafts.aDraftsButtonInX": "A Drafts button in X's composer puts a saved draft back; it never posts for you",
|
|
"site.x.drafts.everyRevisionKeptCompareAny": "Every revision kept: compare any two and restore one",
|
|
"site.x.drafts.searchArchiveAndExportAs": "Search, archive and export as JSON",
|
|
"site.x.drafts.editsNeverSilentlyOverwriteEach": "Edits never silently overwrite each other: a conflict keeps both",
|
|
"site.x.drafts.drafts": "Drafts",
|
|
"site.x.drafts.searchDrafts": "Search drafts",
|
|
"site.x.drafts.launchThreadPart2": "Launch thread, part 2",
|
|
"site.x.drafts.reply14Revisions": "Reply · 14 revisions",
|
|
"site.x.drafts.saved": "Saved",
|
|
"site.x.drafts.quoteTheLikeRace": "Quote: the like race",
|
|
"site.x.drafts.quote3Revisions": "Quote · 3 revisions",
|
|
"site.x.drafts.n2h": "2h",
|
|
"site.x.drafts.themeShowcase": "Theme showcase",
|
|
"site.x.drafts.post7Revisions": "Post · 7 revisions",
|
|
"site.x.drafts.yesterday": "Yesterday",
|
|
"site.x.drafts.fixesTheBugsInX": "- fixes the bugs in X",
|
|
"site.x.drafts.fixesTheBugsXShips": "+ fixes the bugs X ships: likes, drafts, jumps",
|
|
"site.x.tweaks.thirtySixTweaksYourX": "Thirty-six tweaks. {em1}Your X, your rules.{em1End}",
|
|
"site.x.tweaks.hideWhatYouNeverAsked": "Hide what you never asked for, bring back what you miss. Every switch applies live, in every tab.",
|
|
"site.x.tweaks.branding": "Branding {span1}",
|
|
"site.x.tweaks.classicTwitterBird": "Classic Twitter bird",
|
|
"site.x.tweaks.tweetAndRetweetWording": "\"Tweet\" and \"Retweet\" wording",
|
|
"site.x.tweaks.timeline": "Timeline {span1}",
|
|
"site.x.tweaks.hidePromotedPosts": "Hide promoted posts",
|
|
"site.x.tweaks.defaultToFollowing": "Default to Following",
|
|
"site.x.tweaks.hideTheForYouTab": "Hide the \"For you\" tab",
|
|
"site.x.tweaks.fullWidthTimeline": "Full-width timeline",
|
|
"site.x.tweaks.sidebar": "Sidebar {span1}",
|
|
"site.x.tweaks.hideTrends": "Hide Trends",
|
|
"site.x.tweaks.hideWhoToFollow": "Hide Who to follow",
|
|
"site.x.tweaks.hideLiveOnX": "Hide Live on X",
|
|
"site.x.tweaks.hideTodaysNews": "Hide Today's News",
|
|
"site.x.tweaks.hidePremiumUpsells": "Hide Premium upsells",
|
|
"site.x.tweaks.hideExploreTrends": "Hide Explore trends",
|
|
"site.x.tweaks.hideRelevantPeople": "Hide Relevant people",
|
|
"site.x.tweaks.hideWhoToFollowOn": "Hide Who to follow on profiles",
|
|
"site.x.tweaks.hideTheWholeSidebar": "Hide the whole sidebar",
|
|
"site.x.tweaks.navigation": "Navigation {span1}",
|
|
"site.x.tweaks.hidePremium": "Hide Premium",
|
|
"site.x.tweaks.hideChat": "Hide Chat",
|
|
"site.x.tweaks.hideCommunities": "Hide Communities",
|
|
"site.x.tweaks.hideGrok": "Hide Grok",
|
|
"site.x.tweaks.oneNavigationInSplitView": "One navigation in split view",
|
|
"site.x.tweaks.posts": "Posts {span1}",
|
|
"site.x.tweaks.hideGrokInPosts": "Hide Grok in posts",
|
|
"site.x.tweaks.hideViewCounts": "Hide view counts",
|
|
"site.x.tweaks.hideEngagementCounts": "Hide engagement counts",
|
|
"site.x.tweaks.hideBookmarkButton": "Hide bookmark button",
|
|
"site.x.tweaks.noBoldItalicInPosts": "No bold/italic in posts",
|
|
"site.x.tweaks.mediaDownloadButton": "Media download button",
|
|
"site.x.tweaks.draftsButtonInTheComposer": "Drafts button in the composer",
|
|
"site.x.tweaks.searchOperatorChips": "Search operator chips",
|
|
"site.x.tweaks.repliesSortedByRecent": "Replies sorted by Recent",
|
|
"site.x.tweaks.fullNumbers1234Not": "Full numbers (1,234 not 1.2K)",
|
|
"site.x.tweaks.hideVerifiedBadges": "Hide verified badges",
|
|
"site.x.tweaks.hideSubscribeButtons": "Hide Subscribe buttons",
|
|
"site.x.tweaks.video": "Video {span1}",
|
|
"site.x.tweaks.rememberVideoVolume": "Remember video volume",
|
|
"site.x.tweaks.disableAutoplay": "Disable autoplay",
|
|
"site.x.tweaks.stopVideosAtTheEnd": "Stop videos at the end",
|
|
"site.x.alerts.keywordAlertsAndAMedia": "Keyword alerts and a media panel.",
|
|
"site.x.alerts.getADesktopNotificationWhen": "Get a desktop notification when a keyword you care about shows up in posts X has already loaded for you. Nothing extra is fetched, and nothing leaves your machine.",
|
|
"site.x.alerts.keywordAlertsAsLocalNotifications": "Keyword alerts as local notifications, deduplicated and rate limited",
|
|
"site.x.alerts.mediaPanelTheNewestImages": "Media panel {kbd1} {kbd2} {kbd3}: the newest images from folders you pick, ready to attach",
|
|
"site.x.alerts.optionalClipboardHistoryForImages": "Optional clipboard history for images and text (off by default, stays on your device)",
|
|
"site.x.alerts.savePhotosVideosAndGifs": "Save photos, videos and GIFs from posts in original quality",
|
|
"site.x.alerts.keywordWaybetter": "Keyword: \"waybetter\"",
|
|
"site.x.alerts.otherAccountTryingTheNewWaybetter": "@otheraccount: trying the new waybetter themes tonight…",
|
|
"site.x.updates.updatesYouNeverHaveTo": "Updates you never have to think about.",
|
|
"site.x.updates.updatesAreSignedAndInstall": "Updates are signed and install silently, so a fix for something X broke lands without another installer. When a new version is ready, a chip in the titlebar offers a restart, and your tabs come back.",
|
|
"site.x.updates.signedUpdatesCheckedBeforeThey": "Signed updates, checked before they install",
|
|
"site.x.updates.aLightNativeWindowOn": "A light native window on the system WebView, not another browser bundle",
|
|
"site.x.updates.n79MbDownloadWindow": "7.9 MB download, window up in 0.23 s, wayBetter's own code loads in 17 ms",
|
|
"site.x.updates.windowsTodayMacosAndLinux": "Windows, macOS and Linux",
|
|
"site.x.updates.updateReadyRestart": "Update ready · restart",
|
|
"site.x.updates.signed": "signed",
|
|
"site.x.updates.silent": "silent",
|
|
"site.x.updates.inTheBackground": "in the background",
|
|
"site.x.privacy.theRealXComNothing": "The real x.com. Nothing in between.",
|
|
"site.x.privacy.youSignInToX": "You sign in to x.com itself in a standard web view. Your traffic is not proxied through anyone's server, and wayBetter never posts, follows, deletes or sends DMs on its own.",
|
|
"site.x.privacy.noAnalyticsNoTelemetryOn": "No analytics, no telemetry on what you read, post or click",
|
|
"site.x.privacy.draftsNotesSettingsAndPlugins": "Drafts, notes, settings and plugins stay on your machine",
|
|
"site.x.privacy.pluginsYouInstallRunInside": "Plugins you install run inside X with page access, like BetterDiscord plugins; install code you trust",
|
|
"site.x.privacy.you": "You",
|
|
"site.x.privacy.noProxyNoTrackerNo": "No proxy. No tracker. No middleman.",
|
|
"site.x.make.makeYourOwn": "{b1}Make{b1End} Your own",
|
|
"site.x.make.aThemeIsOneJson": "A theme is one JSON file: import it in Appearance. A plugin is one JavaScript file: drop it into the plugins folder and switch it on. No review queue and no account to use one. Share the file and anyone can use it, or publish it in the {a1}wayBetter Store{a1End}.",
|
|
"site.x.make.pluginHelperApi": "Plugin helper API",
|
|
"site.x.make.buildAWholeApp": "build a whole app",
|
|
"site.x.make.theFrameworkBehindThisApp": "the framework behind this app",
|
|
"site.x.make.xWasFirstBuildThe": "X was first. {em1}Build the next one.{em1End}",
|
|
"site.x.make.youtubeKickTwitchDiscordAny": "YouTube, Kick, Twitch, Discord: any app with a web version could get this same window. None is announced; each is waiting for an adapter.",
|
|
"site.x.make.seeWhatsNext": "See what's next",
|
|
"site.x.make.youtubeKickTwitchAndDiscord": "YouTube, Kick, Twitch and Discord are trademarks of their respective owners. wayBetter is not affiliated with any of them.",
|
|
"site.x.foss.fossFreeAndOpenSource": "{b1}FOSS{b1End} Free and open source",
|
|
"site.x.foss.noPaidTierNoAds": "No paid tier. No ads. {em1}Every line public.{em1End}",
|
|
"site.x.foss.completelyFreeNoPaidTier": "Completely free. No paid tier, no ads, no upsell.",
|
|
"site.x.foss.gpl30OrLater": "GPL-3.0-or-later. The app and the framework are public source on {host}.",
|
|
"site.x.foss.noAnalyticsNoTelemetryOn": "No analytics, no telemetry on what you read or post.",
|
|
"site.x.foss.forkItThemeItWrite": "Fork it, theme it, write plugins. The license keeps it open.",
|
|
"site.x.faq.faqFrequentlyAsked": "{b1}FAQ{b1End} Frequently asked",
|
|
"site.x.faq.questionsAnswered": "Questions, {em1}answered.{em1End}",
|
|
"site.common.isItSafe": "Is it safe?",
|
|
"site.x.faq.waybetterForXLoadsThe": "wayBetter for X loads the real x.com in a standard web view and only patches the frontend. It doesn't proxy your traffic through a third-party server or collect your data. Plugins you add yourself run with access to the page, so install only code you trust.",
|
|
"site.x.faq.isItFree": "Is it free?",
|
|
"site.x.faq.yesWaybetterForXIs": "Yes. wayBetter for X is completely free, with no paid tier, ads, or upsells.",
|
|
"site.x.faq.isItOpenSource": "Is it open source?",
|
|
"site.x.faq.yesLicensedUnderGpl3": "Yes, licensed under GPL-3.0. The full source is on {a1}{host}{a1End}, and the framework it is built on is {a2}waybetter on npm{a2End}.",
|
|
"site.x.faq.doesItUseTheReal": "Does it use the real x.com?",
|
|
"site.x.faq.yesYouSignInTo": "Yes. You sign in to x.com exactly as you would in a browser; wayBetter just gives that page a better shell and fixes its frontend bugs.",
|
|
"site.x.faq.willItEverPostLike": "Will it ever post, like or follow for me?",
|
|
"site.x.faq.noItNeverPostsFollows": "No. It never posts, follows, deletes or sends messages by itself. The fixes only make sure your own clicks land the way you meant them.",
|
|
"site.x.faq.canIMakeMyOwn": "Can I make my own theme or plugin?",
|
|
"site.x.faq.yesThemesAreJsonFiles": "Yes. Themes are JSON files you import in the Appearance panel; plugins are {code1} files you drop into the plugins folder. See {a1}Make your own{a1End}.",
|
|
"site.x.faq.whatAboutMacosAndLinux": "What about macOS and Linux?",
|
|
"site.x.faq.windowsIsAvailableNowMacos": "Windows, macOS and Linux, all three available now.",
|
|
"site.x.faq.doesItCollectMyData": "Does it collect my data?",
|
|
"site.x.faq.noThereIsNoAnalytics": "No. There is no analytics or telemetry collecting what you post, read, or click.",
|
|
"site.x.closer.xTheWayItShould": "X, {em1}the way it should work.{em1End}",
|
|
"site.x.closer.moreFromWaybetter": "More from wayBetter",
|
|
"site.common.licensedUnderGpl30": "Licensed under GPL-3.0. Not affiliated with, endorsed by, or sponsored by X Corp.",
|
|
"site.store.page.skipToTheStore": "Skip to the Store",
|
|
"site.common.publishYours": "Publish{span1} yours{span1End}",
|
|
"site.store.hero.waybetterStoreOneSignedCatalog": "{span1} wayBetter Store · one signed catalog",
|
|
"site.store.hero.makeEveryApp": "Make every app",
|
|
"site.store.hero.yours": "yours.",
|
|
"site.store.hero.themesAndPluginsForWaybetter": "Themes and plugins for wayBetter apps. Every file is in one signed catalog, every plugin says what it uses, and you read the code before anything installs. Free, open source, no account.",
|
|
"site.store.hero.apps": "Apps",
|
|
"site.store.hero.signed": "Signed",
|
|
"site.store.browse.browseTheStore": "Browse the Store",
|
|
"site.store.browse.everything": "Everything",
|
|
"site.store.browse.items": "{items} items",
|
|
"site.store.browse.nothingMatches": "Nothing matches.",
|
|
"site.store.browse.tryAnotherWordOrFewer": "Try another word or fewer filters. If it does not exist yet, it can: a theme is one JSON file and a plugin is one JavaScript file.",
|
|
"site.store.browse.clearSearchAndFilters": "Clear search and filters",
|
|
"site.common.publishYourOwn": "Publish your own",
|
|
"site.store.browse.catalogUpdatedItemsTodayAre": "Catalog updated {date}. Items today are for {apps}; every wayBetter app reads this same catalog and shows only its own.",
|
|
"site.store.installing.trustHowInstallingWorks": "{b1}Trust{b1End} How installing works",
|
|
"site.store.installing.oneClickThenYouDecide": "One click, then {em1}you decide.{em1End}",
|
|
"site.store.installing.nothingOnThisSiteCan": "Nothing on this site can install anything. A button here opens the app; the app checks the file and shows it to you; you confirm there, or you don’t.",
|
|
"site.store.installing.aLinkNotAnInstaller": "A link, not an installer",
|
|
"site.store.installing.installIsALinkIt": "“Install” is a {code1} link. It opens the app and proposes an item. Web pages, and tabs inside the app, cannot install anything.",
|
|
"site.store.installing.theAppChecksTheFile": "The app checks the file",
|
|
"site.store.installing.itDownloadsTheFileItself": "It downloads the file itself, verifies the catalog’s Ed25519 signature with the key compiled into the app, then the file’s size and SHA-256 against the catalog.",
|
|
"site.store.installing.youReadItThenConfirm": "You read it, then confirm",
|
|
"site.store.installing.theInstallScreenShowsThe": "The install screen shows the name, author, version, source, SHA-256, the permissions a plugin declares and the code or theme file. Nothing is written until you press Install.",
|
|
"site.store.installing.whatThisDoesNotPromise": "What this does not promise",
|
|
"site.store.installing.aPluginIsJavascriptRunning": "A plugin is JavaScript running inside the app’s page, with the page’s own access. Its permissions are a declaration and a guard rail, not a sandbox: they limit what the wayBetter API hands a plugin, and code that wants to get around a check can. A scan cannot see through minified code either. Install what you would trust as a browser extension.",
|
|
"site.store.installing.themesAreDataSanitizedField": "Themes are data, sanitized field by field; only a theme’s optional CSS runs in the page, with the same trust as your own custom CSS. Anything in the signed catalog is vouched for by the Store key, which is kept offline.",
|
|
"site.store.noApp.noAppYet": "No app yet?",
|
|
"site.store.noApp.oneClickInstallNeedsWaybetter": "One-click install needs wayBetter for X {version} or newer. Without it, download an item’s file from its page and drag it onto the wayBetter window: you get the same install screen.",
|
|
"site.store.page.madeSomethingPublishIt": "Made something? {em1}Publish it.{em1End}",
|
|
"site.store.page.oneFolderInOnePull": "One folder in one pull request adds a theme or a plugin to the Store, or send the file in an issue. The checks run on your machine; a maintainer signs the catalog after the merge. All it takes is a free {host} account.",
|
|
"site.store.page.howToPublish": "How to publish",
|
|
"site.store.page.copyTheCommandNpmCreate": "Copy the command: npm create waybetter",
|
|
"site.submit.nav.make": "Make",
|
|
"site.submit.nav.add": "Add",
|
|
"site.submit.nav.check": "Check",
|
|
"site.submit.nav.send": "Send",
|
|
"site.submit.nav.catalogFormat": "Catalog format",
|
|
"site.common.languages": "Languages",
|
|
"site.submit.hero.breadcrumb": "Breadcrumb",
|
|
"site.submit.hero.aPullRequestIsA": "{span1} A pull request is a submission",
|
|
"site.submit.hero.publishYour": "Publish your",
|
|
"site.submit.hero.own": "own.",
|
|
"site.submit.hero.aThemeIsOneJson": "A theme is one JSON file. A plugin is one JavaScript file. Make it, try it in the app, then add it to the Store: one folder in one pull request, or the file in an issue if you do not use git. Both need a free {host} account, and nothing else.",
|
|
"site.submit.hero.theFiveSteps": "The five steps",
|
|
"site.submit.hero.theRepositoryOn": "The repository on {host}",
|
|
"site.submit.make.makeIt": "Make it",
|
|
"site.submit.make.startFromAWorkingFile": "Start from a working file. The scaffolder writes one; the app’s own Make section (wayBetter → Make) has examples and the live theme values.",
|
|
"site.submit.make.aTheme": "A theme",
|
|
"site.submit.make.colorsFontsCornersDensityLayout": "Colors, fonts, corners, density, layout, background, effects. Three colors are enough; the rest is derived and text is kept readable.",
|
|
"site.common.copyTheCommand": "Copy the command",
|
|
"site.submit.make.orBuildItInThe": "Or build it in the app: Appearance → Theme Builder → Export. {a1}THEMES.md{a1End} lists everything a theme can set.",
|
|
"site.submit.make.aPlugin": "A plugin",
|
|
"site.submit.make.aClassWithAndAnd": "A class with {code1} and {code2}, and a header that says who made it and what it uses.",
|
|
"site.submit.make.addForATypescriptProject": "Add {code1} for a TypeScript project. {a1}PLUGINS.md{a1End} has the API, the permissions and live reload.",
|
|
"site.submit.make.theStoreReadsAPlugin": "The Store reads a plugin’s name, author, version, description and permissions from this header, and a theme’s name, author and description from its JSON. The install screen shows the same values, so the two can never disagree.",
|
|
"site.submit.try.tryIt": "Try it",
|
|
"site.submit.try.theStoreIsOptionalA": "The Store is optional. A file that works is already shareable.",
|
|
"site.submit.try.dropTheFileOnThe": "{b1}Drop the file on the wayBetter window.{b1End} You get the same install screen a Store item gets: name, author, version, SHA-256, permissions, the code.",
|
|
"site.submit.try.turnOnDeveloperModeSettings": "{b1}Turn on developer mode{b1End} (Settings → Developer) while you work: a saved plugin, theme file or {code1} reloads in every tab at once.",
|
|
"site.submit.try.shareItWithoutTheStore": "{b1}Share it without the Store.{b1End} Send the file, or a {code1} link to an https URL on waybetter.fyi, cdn1.crt.fyi or a raw file on {host}. It is never installed without the install screen.",
|
|
"site.submit.folder.addOneFolder": "Add one folder",
|
|
"site.submit.folder.everyStoreItemIsA": "Every Store item is a folder under {code1} in the repository. The folder name is the item’s id and its address here: {code2}.",
|
|
"site.submit.folder.storeXWaybetterForX": "store/x/ — wayBetter for X’s items",
|
|
"site.submit.folder.pluginsOrThemesOrTaken": "Plugins: {code1}, {code2}, {code3}, {code4} or {code5}. Themes: {code6} or {code7}, taken from the theme’s {code8} when you leave it out.",
|
|
"site.submit.folder.upTo12WordsPeople": "Up to 12 words people would search for.",
|
|
"site.submit.folder.themesOnlyAPlugins": "Themes only (a plugin’s is in its header). Raise it when you change the file.",
|
|
"site.submit.folder.description": "Description",
|
|
"site.submit.folder.oneOrTwoSentencesThat": "One or two sentences that say what it does, 50 characters or more. The first 160 become the search-engine description of its page.",
|
|
"site.submit.folder.thatIsTheWholeSubmission": "That is the whole submission. The page, the card, the search entry, the link preview, the structured data and the sitemap entry are generated from the signed catalog when the site builds. {a1}store/README.md{a1End} has the full rules.",
|
|
"site.submit.checks.runTheChecks": "Run the checks",
|
|
"site.submit.checks.thereIsNoHostedCi": "There is no hosted CI. The checks are commands you run before you send, and a maintainer runs again before merging.",
|
|
"site.submit.checks.inYourClone": "in your clone",
|
|
"site.submit.checks.idsAndNames": "Ids and names",
|
|
"site.submit.checks.folderIdUpTo40": "folder id ({code1}, up to 40), {code2}, no duplicates in an app",
|
|
"site.submit.checks.size": "Size",
|
|
"site.submit.checks.itemFilesUpTo2": "item files up to 2 MiB, previews up to 300 KB at 16:10",
|
|
"site.submit.checks.theHeader": "The header",
|
|
"site.submit.checks.aDescriptionAndALine": "{code1}, {code2}, a description, and a {code3} line that names {code4} or {code5}",
|
|
"site.submit.checks.honestPermissions": "Honest permissions",
|
|
"site.submit.checks.isRefusedWhenTheCode": "{code1} is refused when the code calls {code2}, {code3}, {code4}, {code5} or {code6}; gated API calls must be declared",
|
|
"site.submit.checks.noRemoteCode": "No remote code",
|
|
"site.submit.checks.noOrNoScriptsOr": "no {code1}, {code2} or {code3}; no scripts or outside files in a preview; no {code4} or outside URLs in a theme’s CSS",
|
|
"site.submit.checks.theCatalog": "The catalog",
|
|
"site.submit.checks.theItemsBuildIntoA": "the items build into a catalog the apps accept (the framework’s own rules), and the published catalog still matches its signature and hashes",
|
|
"site.submit.checks.searchAndSharing": "Search and sharing",
|
|
"site.submit.checks.pageTitleUpTo60": "page title up to 60 characters, description 50 to 160, both unique",
|
|
"site.submit.send.sendIt": "Send it",
|
|
"site.submit.send.twoWaysInBothNeed": "Two ways in. Both need a free {a1}{host} account{a1End}: anyone can sign up, and a maintainer approves each new account by hand.",
|
|
"site.submit.send.pullRequest": "Pull request",
|
|
"site.submit.send.forkTheRepositoryOn": "Fork the repository on {host}.",
|
|
"site.submit.send.addYourFolderOnA": "Add your folder on a branch and run the checks.",
|
|
"site.submit.send.openThePullRequestThe": "Open the pull request. The template asks what it does and what it uses.",
|
|
"site.submit.send.fork": "Fork",
|
|
"site.submit.send.pullRequests": "Pull requests",
|
|
"site.submit.send.noGitOpenAnIssue": "No git? Open an issue",
|
|
"site.submit.send.chooseTheThemeOrPlugin": "Choose the Theme or Plugin template.",
|
|
"site.submit.send.attachTheFileAndA": "Attach the file (and a preview, if you have one).",
|
|
"site.submit.send.aMaintainerAddsTheFolder": "A maintainer adds the folder for you.",
|
|
"site.submit.send.newIssue": "New issue",
|
|
"site.submit.send.thenAMaintainerSigns": "Then a maintainer signs",
|
|
"site.submit.send.theStoresSigningKey": "The Store’s signing key is offline by design, so merging is not publishing. After the merge a maintainer reads the code, runs {code1} and {code2} on the machine that holds the key, and pushes. The site rebuilds, your item gets its page, and every app sees it the next time it reads the signed catalog.",
|
|
"site.submit.send.anythingInTheSignedCatalog": "Anything in the signed catalog is vouched for by that key, which is why a person reads every plugin before it is signed.",
|
|
"site.submit.format.theCatalogFormat": "The catalog format",
|
|
"site.submit.format.oneFileForEveryWaybetter": "One file for every wayBetter app. You never edit it by hand: it is built from the folders.",
|
|
"site.submit.format.catalogJsonFormat2": "catalog.json (format 2)",
|
|
"site.submit.format.signedCatalogJsonSigIs": "{b1}Signed.{b1End} {a1}catalog.json.sig{a1End} is an Ed25519 signature over the exact bytes of {a2}catalog.json{a2End}. Apps verify it with the public key compiled into them, then check every download’s size and SHA-256.",
|
|
"site.submit.format.strictUnknownFieldsMoreThan": "{b1}Strict.{b1End} Unknown fields, more than 500 items or a file over 1 MiB refuse the whole catalog. {a1}store-catalog.schema.json{a1End} is the JSON Schema; {a2}STORE.md{a2End} in the framework has every rule.",
|
|
"site.submit.format.sharedEachItemNamesIts": "{b1}Shared.{b1End} Each item names its {code1}. An app verifies the whole file and keeps only its own items.",
|
|
"site.submit.languages.notStoreItemsAll51": "Not Store items: all 51 languages are built into the app and loaded on demand.",
|
|
"site.submit.languages.fixOrFinishATranslation": "{b1}Fix or finish a translation{b1End} in {code1}, by pull request or by an issue with the changed file attached.",
|
|
"site.submit.languages.checkItWithKeysPlaceholders": "{b1}Check it{b1End} with {code1}: keys, placeholders, plural forms, no markup. It must print {code2}.",
|
|
"site.submit.languages.itShipsWithTheNext": "{b1}It ships with the next app update{b1End}, not through the Store. {a1}TRANSLATING.md{a1End} has the message syntax and how to see your words in the app.",
|
|
"site.submit.page.seeWhatIsAlreadyThere": "See what is {em1}already there.{em1End}",
|
|
"site.submit.page.everyItemInTheStore": "Every item in the Store shows its code. The bundled plugins are the best examples of how to use the API well.",
|
|
"site.submit.page.browsePlugins": "Browse plugins",
|
|
"site.submit.page.browseThemes": "Browse themes",
|
|
"site.themes.hero.waybetterStoreThemesSignedCatalog": "{a1}wayBetter Store{a1End} · {themes} themes · signed catalog",
|
|
"site.themes.hero.themesForX": "Themes for {em1}X{em1End}.",
|
|
"site.themes.hero.everyThemeIsAJson": "Every theme is a JSON document: colors, fonts, corners, density, layout, background and effects. Contrast is enforced so text stays readable. Pick one here, or make your own in the app’s Theme Builder.",
|
|
"site.themes.hero.howInstallingWorksInstallIn": "{b1}How installing works.{b1End} “Install in wayBetter” opens the app with a {code1} link. The app downloads the file itself, checks it against the store’s signed catalog (Ed25519 signature, SHA-256 of every file) and shows you its name, author, version, source, hash and the theme file with a live preview before anything is installed. Nothing installs from this page on its own.",
|
|
"site.common.noAppYetGetWaybetter": "No app yet? {a1}Get wayBetter for X{a1End} (one-click install needs {version} or newer), or download the file from an item’s page and drop it on the app window. Looking for something else? {a2}Search the whole Store{a2End}.",
|
|
"site.themes.page.catalogUpdatedThemesAreData": "Catalog updated {date}. Themes are data: wayBetter sanitizes every field; only a theme’s optional CSS runs in X, like your own Custom CSS.",
|
|
"site.plugins.hero.waybetterStorePluginsSignedCatalog": "{a1}wayBetter Store{a1End} · 8 area plugins built in · {plugins} more in the signed catalog",
|
|
"site.plugins.hero.pluginsForX": "Plugins for {em1}X{em1End}.",
|
|
"site.plugins.hero.javascriptPluginsThatRunInside": "JavaScript plugins that run inside X, BetterDiscord-style. Each one declares what it uses from the wayBetter API (storage, dialogs, clipboard, your account…) and whether it contacts any server.",
|
|
"site.plugins.hero.howInstallingWorksInstallIn": "{b1}How installing works.{b1End} “Install in wayBetter” opens the app with a {code1} link. The app downloads the file itself, checks it against the store’s signed catalog (Ed25519 signature, SHA-256 of every file) and shows you its name, author, version, source, hash, the permissions it declares and the code before anything is installed. Nothing installs from this page on its own.",
|
|
"site.plugins.page.catalogUpdatedPluginsRunIn": "Catalog updated {date}. Plugins run in the X page with the page’s access; permissions limit the wayBetter API, not the page. Read the code, then install what you trust.",
|
|
"site.notFound.page.nothingAtThisAddress": "Nothing at this address",
|
|
"site.notFound.page.thisPageIsNotHere": "This page is {em1}not here.{em1End}",
|
|
"site.notFound.page.theLinkMayBeOld": "The link may be old, or the address has a typo. Everything that exists is one step away.",
|
|
"site.notFound.page.theStore": "The Store",
|
|
"site.meta.home.title": "wayBetter — the apps you use, way better",
|
|
"site.meta.home.description": "wayBetter is one free, open-source system for making the apps you already use better: a light native window, themes, plugins and fixes, with one small adapter per app. wayBetter for X is the first. npm i waybetter to build the next one.",
|
|
"site.meta.home.imageAlt": "wayBetter: the apps you use, way better.",
|
|
"site.meta.x.title": "wayBetter for X — X, the way it should work",
|
|
"site.meta.x.description": "wayBetter for X is a free, open-source (GPL-3.0) desktop app for X/Twitter: tabs, split panes, every account side by side, 14 themes, 8 area plugins, a draft vault and fixes for X's own bugs. Anyone can make themes and plugins.",
|
|
"site.meta.x.imageAlt": "wayBetter for X: X, extended.",
|
|
"site.meta.store.title": "wayBetter Store — themes and plugins, signed and open",
|
|
"site.meta.store.description": "{themes} themes and {plugins} plugins for wayBetter apps in one signed catalog. Search them, read the code and what it asks for, install in one click. Free and open source.",
|
|
"site.meta.store.imageAlt": "wayBetter Store: themes and plugins for wayBetter apps.",
|
|
"site.meta.submit.title": "Publish a theme or plugin — wayBetter Store",
|
|
"site.meta.submit.description": "Add your theme or plugin to the wayBetter Store with one pull request: one folder, local checks, then a maintainer signs. Or send the file in an issue.",
|
|
"site.meta.submit.ogTitle": "Publish your own",
|
|
"site.meta.submit.imageAlt": "wayBetter Store: publish your own theme or plugin.",
|
|
"site.meta.themes.title": "Themes — wayBetter for X",
|
|
"site.meta.themes.description": "{count} themes for wayBetter for X: full redesigns of X (colors, fonts, corners, density, backgrounds) with previews. Install in one click or download the .json.",
|
|
"site.meta.themes.imageAlt": "Themes for wayBetter for X in the wayBetter Store.",
|
|
"site.meta.plugins.title": "Plugins — wayBetter for X",
|
|
"site.meta.plugins.description": "Eight area plugins built into wayBetter for X, plus {count} more in the signed Store, each with its permissions and code to read.",
|
|
"site.meta.plugins.imageAlt": "Plugins for wayBetter for X in the wayBetter Store.",
|
|
"site.meta.notFound.title": "Page not found — wayBetter",
|
|
"site.meta.notFound.description": "This page does not exist. The wayBetter home, wayBetter for X and the wayBetter Store are one click away.",
|
|
"site.meta.crumb.store": "Store",
|
|
"site.meta.crumb.themes": "Themes",
|
|
"site.meta.crumb.plugins": "Plugins",
|
|
"site.meta.item.title": "{name} — {kind, select, theme {theme} other {plugin}} for {sites} · wayBetter Store",
|
|
"site.meta.item.titleShort": "{name} — {kind, select, theme {theme} other {plugin}} for {sites}",
|
|
"site.meta.item.descriptionTail": "A {kind, select, theme {theme} other {plugin}} for {apps}, free in the wayBetter Store.",
|
|
"site.meta.item.ogTitle": "{name} · {kind, select, theme {Theme} other {Plugin}} for {sites}",
|
|
"site.meta.item.imageAlt": "{name}, a {kind, select, theme {theme} other {plugin}} for {apps}.",
|
|
"site.meta.item.videoName": "{name}: {kind, select, theme {theme} other {plugin}} for {sites}",
|
|
"site.meta.item.genre": "{kind, select, theme {Theme} other {Plugin}} for {apps}",
|
|
"site.gen.kind.theme": "Theme",
|
|
"site.gen.kind.plugin": "Plugin",
|
|
"site.gen.store": "Store",
|
|
"site.gen.themes": "Themes",
|
|
"site.gen.plugins": "Plugins",
|
|
"site.gen.everything": "Everything",
|
|
"site.gen.search": "Search",
|
|
"site.gen.copy": "Copy",
|
|
"site.gen.install": "Install",
|
|
"site.gen.permissions": "Permissions",
|
|
"site.gen.breadcrumb": "Breadcrumb",
|
|
"site.gen.permission.storage.label": "Storage",
|
|
"site.gen.permission.ui.label": "Dialogs",
|
|
"site.gen.permission.clipboard.label": "Clipboard",
|
|
"site.gen.permission.account.label": "Your account",
|
|
"site.gen.permission.users.label": "Account details",
|
|
"site.gen.permission.commands.label": "Commands",
|
|
"site.gen.permission.network.label": "Internet",
|
|
"site.gen.permission.networkNone.label": "No network",
|
|
"site.gen.permission.storage.plain": "Keeps its own settings and data on your computer.",
|
|
"site.gen.permission.ui.plain": "Shows its own dialogs, notices and toasts.",
|
|
"site.gen.permission.clipboard.plain": "Can put text on your clipboard, for example when you press a copy button.",
|
|
"site.gen.permission.account.plain": "Can see which account is signed in: its handle, name and avatar.",
|
|
"site.gen.permission.users.plain": "Can read what the site’s own responses said about the accounts on your screen.",
|
|
"site.gen.permission.commands.plain": "Adds its own entries to the command palette (Ctrl+K).",
|
|
"site.gen.permission.network.plain": "Says it contacts a server. Read the code to see which one and why.",
|
|
"site.gen.permission.networkNone.plain": "Promises to contact no server. The app scans the code and refuses the file if it calls fetch, XMLHttpRequest, WebSocket, EventSource or sendBeacon.",
|
|
"site.gen.permission.legacy": "Legacy · full page access",
|
|
"site.gen.permission.none": "No special access",
|
|
"site.gen.category.reading": "Reading",
|
|
"site.gen.category.writing": "Writing",
|
|
"site.gen.category.filters": "Filters",
|
|
"site.gen.category.focus": "Focus",
|
|
"site.gen.category.tools": "Tools",
|
|
"site.gen.category.dark": "Dark",
|
|
"site.gen.category.light": "Light",
|
|
"site.gen.category.other": "Other",
|
|
"site.gen.card.by": "by {author}",
|
|
"site.gen.card.installLabel": "Install {name} in wayBetter",
|
|
"site.gen.card.details": "Details",
|
|
"site.gen.card.detailsLabel": "{name}: details, source and download",
|
|
"site.gen.gallery.categories": "Categories",
|
|
"site.gen.gallery.searchThemes": "Search themes",
|
|
"site.gen.gallery.searchPlugins": "Search plugins",
|
|
"site.gen.gallery.empty": "Nothing matches. Try another word, or {a1}search the whole Store{a1End}.",
|
|
"site.gen.bar.label": "Search the Store",
|
|
"site.gen.bar.search": "Search themes and plugins",
|
|
"site.gen.bar.placeholder": "Search {count} themes and plugins",
|
|
"site.gen.bar.kind": "Kind",
|
|
"site.gen.bar.all": "All",
|
|
"site.gen.bar.app": "App",
|
|
"site.gen.bar.everyApp": "Every app",
|
|
"site.gen.bar.category": "Category",
|
|
"site.gen.bar.any": "Any",
|
|
"site.gen.shelf.featured": "Featured",
|
|
"site.gen.shelf.featuredNote": "Picked by the maintainers.",
|
|
"site.gen.shelf.latest": "Latest",
|
|
"site.gen.shelf.latestNote": "New and recently updated.",
|
|
"site.gen.media.previewAlt": "{name}: preview of the {kind, select, theme {theme} other {plugin}}",
|
|
"site.gen.media.open": "Open the picture: {alt}",
|
|
"site.gen.media.inUse": "{name} in use",
|
|
"site.gen.media.video": "Video: {label}",
|
|
"site.gen.media.videoThumb": "Video",
|
|
"site.gen.media.download": "Download the video",
|
|
"site.gen.media.play": "Play the video: {label}",
|
|
"site.gen.media.pictures": "Pictures of {name}",
|
|
"site.gen.media.picturesAndVideo": "Pictures and video of {name}",
|
|
"site.gen.media.pictureOf": "Picture {index} of {count}: {alt}",
|
|
"site.gen.item.version": "Version",
|
|
"site.gen.item.author": "Author",
|
|
"site.gen.item.notStated": "not stated",
|
|
"site.gen.item.category": "Category",
|
|
"site.gen.item.for": "For",
|
|
"site.gen.item.file": "File",
|
|
"site.gen.item.size": "Size",
|
|
"site.gen.item.bytes": "({count} bytes)",
|
|
"site.gen.item.updated": "Updated",
|
|
"site.gen.item.asks": "What it asks for",
|
|
"site.gen.item.legacyPlain": "This plugin declares no permissions, so it gets the whole wayBetter API. Read the code before you install it.",
|
|
"site.gen.item.nonePlain": "It uses none of the gated wayBetter API: no storage, dialogs, clipboard, account or commands.",
|
|
"site.gen.item.declares": "Declares “{permission}”.",
|
|
"site.gen.item.permissionsFine": "Permissions are a declaration and a guard rail, not a sandbox. They limit what the wayBetter API hands this plugin; a plugin is still JavaScript in the page, with the page’s own access. The code below is what actually runs.",
|
|
"site.gen.item.palette": "Palette",
|
|
"site.gen.item.color.bg": "Background",
|
|
"site.gen.item.color.surface": "Surface",
|
|
"site.gen.item.color.text": "Text",
|
|
"site.gen.item.color.accent": "Accent",
|
|
"site.gen.item.paletteFine": "A theme is data: colors, fonts, corners, density, layout, background and effects. The app sanitizes every field and keeps text readable. Only a theme’s optional CSS runs in the page, with the same trust as your own Custom CSS; the install screen warns when a theme carries any.",
|
|
"site.gen.item.kicker": "{kind} · {category} · for {sites}",
|
|
"site.gen.item.install": "Install in wayBetter",
|
|
"site.gen.item.download": "Download {extension}",
|
|
"site.gen.item.share": "Share",
|
|
"site.gen.item.note": "Opens {app} on its install screen (version {version} or newer). Nothing installs until you confirm there. {a1}How installing works{a1End}",
|
|
"site.gen.item.noteAny": "Opens {app} on its install screen. Nothing installs until you confirm there. {a1}How installing works{a1End}",
|
|
"site.gen.item.tags": "Tags",
|
|
"site.gen.item.code": "The code",
|
|
"site.gen.item.themeFile": "The theme file",
|
|
"site.gen.item.read": "Read {file}",
|
|
"site.gen.item.exactBytes": "exactly the bytes the app installs",
|
|
"site.gen.item.raw": "Raw",
|
|
"site.gen.item.openRaw": "Open the {a1}raw file{a1End} to read it.",
|
|
"site.gen.item.how.title": "How installing works, and is it safe?",
|
|
"site.gen.item.how.link": "{b1}A link, not an installer.{b1End} “Install in wayBetter” is a {code1} link. It opens the app and proposes this {kind, select, theme {theme} other {plugin}}. A web page cannot install anything, and neither can a tab inside the app.",
|
|
"site.gen.item.how.check": "{b1}The app checks the file.{b1End} It downloads the file itself, verifies the Store catalog’s Ed25519 signature with the key compiled into the app, then this file’s size and SHA-256 against the catalog.",
|
|
"site.gen.item.how.confirmPlugin": "{b1}You read it, then confirm.{b1End} The install screen shows the name, author, version, source, SHA-256, the permissions it declares, what a scan of the code found and the code. Nothing is written until you press Install.",
|
|
"site.gen.item.how.confirmTheme": "{b1}You read it, then confirm.{b1End} The install screen shows the name, author, version, source, SHA-256, the theme file and a live preview. Nothing is written until you press Install.",
|
|
"site.gen.item.how.finePlugin": "What this does not promise: a plugin runs inside the page with the page’s own access, and a scan cannot see through minified or obfuscated code. Install what you would trust as a browser extension.",
|
|
"site.gen.item.how.fineTheme": "What this does not promise: a theme’s optional CSS is code-like and carries the same trust as your own Custom CSS. The install screen shows it.",
|
|
"site.gen.item.how.vouched": "Anything in the signed catalog is vouched for by the Store key, which is kept offline.",
|
|
"site.gen.item.manual.title": "No app yet, or an older one?",
|
|
"site.gen.item.manual.text": "One-click install needs {app} {version} or newer. {a1}Get {app}{a1End}, or do it by hand: {a2}download {file}{a2End} and drag it onto the wayBetter window. You get the same install screen.",
|
|
"site.gen.item.manual.textNoPage": "One-click install needs {app}. Or do it by hand: {a2}download {file}{a2End} and drag it onto the wayBetter window. You get the same install screen.",
|
|
"site.gen.item.details": "Details",
|
|
"site.gen.item.copyHash": "Copy the SHA-256 of {file}",
|
|
"site.gen.item.hashNote": "Signed catalog, {date}. Compare it with {code1} after downloading.",
|
|
"site.gen.item.moreThemes": "More themes",
|
|
"site.gen.item.morePlugins": "More plugins",
|
|
"site.gen.item.seeAll": "See all {count}",
|
|
"site.gen.repoNote": "The wayBetter for X repository, where the Store’s folders live, becomes public with the release. Until then its links on this page will not open for you; {a1}the framework’s repository{a1End} is already public, and everything in steps 1 and 2 works today.",
|
|
"site.js.copied": "Copied",
|
|
"site.js.selectIt": "Select it",
|
|
"site.js.linkCopied": "Link copied",
|
|
"site.js.copyAddress": "Copy the address bar",
|
|
"site.js.loading": "Loading…",
|
|
"site.js.install.title": "wayBetter did not open",
|
|
"site.js.install.dismiss": "Dismiss",
|
|
"site.js.install.why": "Nothing answered the link, so {app} is probably not installed on this device.",
|
|
"site.js.install.whyOlder": "Nothing answered the link, so {app} is probably not installed on this device, or it is older than {version}. One-click install needs {app} {version} or newer.",
|
|
"site.js.install.get": "Get {app}",
|
|
"site.js.install.download": "Download {file}",
|
|
"site.js.install.downloadFile": "Download the file",
|
|
"site.js.install.manual": "Or install {name} by hand: download the file, then drag it onto the wayBetter window. You get the same install screen.",
|
|
"site.js.install.thisItem": "this item",
|
|
"site.js.store.everything": "Everything",
|
|
"site.js.store.themes": "Themes",
|
|
"site.js.store.plugins": "Plugins",
|
|
"site.js.store.results": "Results",
|
|
"site.js.store.shown": "{shown} of {total}",
|
|
"site.js.store.count": "{count} items",
|
|
"site.js.store.emptyQuery": "Nothing matches “{query}”.",
|
|
"site.js.store.emptyFilters": "Nothing matches these filters.",
|
|
"site.js.item.shortened": "{start}… ({count} characters; the raw file has all of them)",
|
|
"site.js.media.pictures": "Pictures",
|
|
"site.js.media.close": "Close",
|
|
"site.js.media.previous": "Previous picture",
|
|
"site.js.media.next": "Next picture",
|
|
"site.lang.label": "Language",
|
|
"site.lang.choose": "Choose a language",
|
|
"site.meta.area.title": "{name}: built into wayBetter for X",
|
|
"site.meta.area.description": "{description} {count, plural, one {# feature} other {# features}}, built into wayBetter for X: free, open source, nothing to install.",
|
|
"site.meta.area.imageAlt": "{name}, an area plugin of wayBetter for X",
|
|
"site.gen.kind.area": "Area plugin",
|
|
"site.gen.item.license": "License",
|
|
"site.gen.item.credits": "Credits",
|
|
"site.gen.areas.title": "Built into {app}",
|
|
"site.gen.areas.note": "{count} area plugins come with the app, nothing to install. Turn them on in Plugins, or pick a mode.",
|
|
"site.gen.areas.more": "More area plugins",
|
|
"site.gen.area.builtIn": "Built in",
|
|
"site.gen.area.featureCount": "{count, plural, one {# feature} other {# features}}",
|
|
"site.gen.area.partOf": "Part of {app} {version}",
|
|
"site.gen.area.features": "Features",
|
|
"site.gen.area.kicker": "Area plugin · built into {app}",
|
|
"site.gen.area.note": "Built into {app} {version}: turn it on in Plugins, or pick a mode.",
|
|
"site.gen.area.get": "Get {app}",
|
|
"site.gen.area.whatItDoes": "What it does",
|
|
"site.gen.area.how.title": "How to turn it on",
|
|
"site.gen.area.how.plugins": "In the app, open {b1}wayBetter → Plugins{b1End} and switch {name} on. Every feature has its own switch.",
|
|
"site.gen.area.how.mode": "Or pick a {b1}mode{b1End} (Basic, Advanced, Power User) on the first start or in Settings. A mode is a starting point: every switch stays yours.",
|
|
"site.gen.area.how.nothing": "Nothing is downloaded: the code is part of the app, signed and updated with it.",
|
|
"site.gen.kind.strings": "String pack",
|
|
"site.gen.strings": "Languages",
|
|
"site.gen.category.language": "Language",
|
|
"site.gen.item.language": "Language",
|
|
"site.gen.item.coverage": "Coverage",
|
|
"site.gen.item.coverageValue": "{translated} of {translatable} of the site’s strings",
|
|
"site.gen.item.dataOnly": "Data only",
|
|
"site.gen.item.dataOnlyValue": "Text only: no code, no styles; nothing in it runs.",
|
|
"site.gen.item.packFile": "The pack file",
|
|
"site.gen.item.how.confirmStrings": "{b1}You read it, then confirm.{b1End} The install screen shows the name, the language, the coverage, a sample and the pack file. Nothing is written until you press Install; it stays off until you turn it on in Languages.",
|
|
"site.gen.item.how.fineStrings": "A string pack is data: text that replaces the site’s own words. It carries no code and cannot act on the page.",
|
|
"site.gen.item.moreStrings": "More string packs"
|
|
}
|
|
}
|