From 0e023534a76c2ef0e00db696f3d9836fbf0f2d8c Mon Sep 17 00:00:00 2001 From: DecDuck Date: Sun, 8 Jun 2025 10:33:41 +1000 Subject: [PATCH] Redesign of language selector #100 (#101) * feat: add new language selector in footer, add pirate language * fix: translations in title bar not updating * chore: refactor into separate component * fix: update translate url * fix: update pirate translation to use "ship" instead of "plank" for platform a very very necessary change --- components/LanguageSelector.vue | 142 ++++++++ components/LibraryDirectory.vue | 2 +- components/UserFooter.vue | 4 + components/UserHeader.vue | 11 +- components/UserHeader/SelectLang.vue | 78 ----- i18n/locales/en_pirate.json | 481 ++++++++++++++++++++++++++- i18n/locales/en_us.json | 2 + pages/store/index.vue | 4 - 8 files changed, 633 insertions(+), 91 deletions(-) create mode 100644 components/LanguageSelector.vue delete mode 100644 components/UserHeader/SelectLang.vue diff --git a/components/LanguageSelector.vue b/components/LanguageSelector.vue new file mode 100644 index 0000000..106439b --- /dev/null +++ b/components/LanguageSelector.vue @@ -0,0 +1,142 @@ + + + diff --git a/components/LibraryDirectory.vue b/components/LibraryDirectory.vue index 1a677ef..40ddf8c 100644 --- a/components/LibraryDirectory.vue +++ b/components/LibraryDirectory.vue @@ -13,7 +13,7 @@ name="search" autocomplete="off" class="block w-full rounded-md bg-zinc-900 py-2 pl-9 pr-2 text-sm text-zinc-100 outline outline-1 -outline-offset-1 outline-zinc-700 placeholder:text-gray-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-blue-600" - placeholder="$t('library.search')" + :placeholder="$t('library.search')" /> {{ $t("drop.desc") }}

+ + +
import { IconsDiscordLogo, IconsGithubLogo } from "#components"; + const { t } = useI18n(); const navigation = { diff --git a/components/UserHeader.vue b/components/UserHeader.vue index 1e13cdd..9f60cb6 100644 --- a/components/UserHeader.vue +++ b/components/UserHeader.vue @@ -54,7 +54,6 @@ -
@@ -176,9 +175,7 @@
  • - - - +
  • @@ -209,7 +206,7 @@ const router = useRouter(); const { t } = useI18n(); const homepageURL = "/store"; -const navigation: Array = [ +const navigation: Ref> = computed(() => [ { prefix: "/store", route: "/store", @@ -230,9 +227,9 @@ const navigation: Array = [ route: "/news", label: t("userHeader.links.news"), }, -]; +]); -const currentPageIndex = useCurrentNavigationIndex(navigation); +const currentPageIndex = useCurrentNavigationIndex(navigation.value); const notifications = useNotifications(); const unreadNotifications = computed(() => diff --git a/components/UserHeader/SelectLang.vue b/components/UserHeader/SelectLang.vue deleted file mode 100644 index b379341..0000000 --- a/components/UserHeader/SelectLang.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - diff --git a/i18n/locales/en_pirate.json b/i18n/locales/en_pirate.json index 2018cf9..f0fe74c 100644 --- a/i18n/locales/en_pirate.json +++ b/i18n/locales/en_pirate.json @@ -1,3 +1,482 @@ { - "welcome": "Arr matey, Welcome!" + "account": { + "devices": { + "capabilities": "Aye, yer Capabilities", + "lastConnected": "Last Linked", + "noDevices": "No contraptions tied to yer coffers, eh?", + "platform": "Ship", + "revoke": "Scuttle 'em", + "subheader": "Manage the contraptions allowed access to yer Drop booty.", + "title": "Contraptions" + }, + "notifications": { + "all": "Gaze upon all {arrow}", + "desc": "View and manage yer messages from the crows' nest.", + "markAllAsRead": "Mark all as read, aye!", + "markAsRead": "Mark as read, matey!", + "none": "No messages, savvy?", + "notifications": "Crows' Nest", + "title": "Messages from the Crows' Nest", + "unread": "Unread Messages" + }, + "settings": "Account Settings, savvy?", + "title": "Yer Own Coffer" + }, + "actions": "Deeds", + "adminTitle": "Cap'n's Quarters | Drop", + "adminTitleTemplate": "{0} | Cap'n | Drop", + "title": "Drop", + "titleTemplate": "{0} | Drop", + "auth": { + "callback": { + "authClient": "Grant passage to this scallywag?", + "authorize": "Grant Passage", + "authorizedClient": "Drop has granted passage to the scallywag. Ye may now shut this porthole.", + "issues": "Troubles be brewin', matey?", + "learn": "Learn more {arrow}", + "paste": "Scribble this code into the scallywag to carry on:", + "permWarning": "Grantin' this request allows \"{name}\" on \"{platform}\" to:", + "requestedAccess": "\"{name}\" has requested passage to yer Drop coffer.", + "success": "Shiver me timbers, it worked!" + }, + "confirmPassword": "Confirm @:auth.password", + "displayName": "Yer Scallywag Name", + "email": "Salty Mail", + "password": "Secret Word", + "register": { + "confirmPasswordFormat": "Must be the same as above, savvy?", + "emailFormat": "Must be in the fashion of a true scallywag {'@'} example.com", + "passwordFormat": "Must be 14 or more marks, ye landlubber!", + "subheader": "Fill in yer details below to make yer mark.", + "title": "Forge yer Drop Mark", + "usernameFormat": "Must be 5 or more marks, and all lowercase, argh!" + }, + "signin": { + "externalProvider": "Sign in with another ship's captain {arrow}", + "forgot": "Forgot yer secret word, eh?", + "noAccount": "No mark in the logbook? Beg a cap'n to make ye one, argh!", + "or": "OR", + "pageTitle": "Sign in to Drop, ye dog!", + "rememberMe": "Remember me, savvy?", + "signin": "Sign in, ye scurvy dog!", + "title": "Sign in to yer mark" + }, + "signout": "Cast off!", + "username": "Scallywag Name" + }, + "cancel": "Belay that!", + "chars": { + "arrow": "β†’", + "arrowBack": "←", + "quoted": "\"\"", + "srComma": ", {0}" + }, + "close": "Shut yer trap!", + "common": { + "cannotUndo": "This deed cannot be undone, ye hear!", + "date": "Date", + "deleteConfirm": "Are ye sure ye want to scuttle \"{0}\", ye rogue?", + "friends": "Shipmates", + "groups": "Crews", + "noResults": "No plunder found!", + "servers": "Ships", + "tags": "Marks", + "today": "Today", + "divider": "{'|'}", + "srLoading": "Loading, loading, argh..." + }, + "create": "Forge!", + "delete": "Scuttle!", + "drop": { + "desc": "An open-source game distribution platform built for speed, flexibility and beauty, like a swift brigantine!", + "drop": "Drop" + }, + "edit": "Amend", + "editor": { + "bold": "Bold, like a cannonball!", + "boldPlaceholder": "bold text, matey", + "code": "Code, ye scallywag!", + "codePlaceholder": "code, argh!", + "heading": "Heading, to the horizon!", + "headingPlaceholder": "heading, savvy?", + "italic": "Italic, like a wobbly deck!", + "italicPlaceholder": "italic text, arrr!", + "link": "Link, a chain to adventure!", + "linkPlaceholder": "link text, ye dog!", + "listItem": "List Item, for yer plunder!", + "listItemPlaceholder": "list item, eh?" + }, + "errors": { + "backHome": "{arrow} Back to yer safe harbor", + "invalidBody": "Invalid request, ye barnacle-encrusted body: {0}", + "inviteRequired": "Invitation demanded to sign up, ye landlubber.", + "library": { + "add": { + "desc": "Drop couldn't add this game to yer treasure hoard: {0}", + "title": "Failed to add game to yer treasure hoard" + }, + "collection": { + "create": { + "desc": "Drop couldn't forge yer collection, argh: {0}", + "title": "Failed to forge collection" + } + }, + "source": { + "delete": { + "desc": "Drop couldn't scuttle this source: {0}", + "title": "Failed to scuttle treasure hoard source" + } + } + }, + "news": { + "article": { + "delete": { + "desc": "Drop couldn't scuttle this article: {0}", + "title": "Failed to scuttle article" + } + } + }, + "occurred": "An error occurred whilst answerin' yer plea. If ye believe this be a bug, report it, ye dog! Try signin' in and see if it clears the decks.", + "ohNo": "Blimey!", + "pageTitle": "{0} | Drop", + "revokeClient": "Failed to scuttle scallywag", + "revokeClientFull": "Failed to scuttle scallywag {0}", + "signIn": "Sign in {arrow}, ye scurvy dog!", + "support": "Support Discord, arrr!", + "unknown": "An unknown blunder occurred, savvy?", + "version": { + "delete": { + "desc": "Drop met a squall whilst scuttlin' the version: {error}", + "title": "There was a squall whilst scuttlin' the version" + }, + "order": { + "desc": "Drop met a squall whilst updatin' the version: {error}", + "title": "There was a squall whilst updatin' the version order" + } + }, + "upload": { + "title": "Failed to hoist the file", + "description": "Drop couldn't hoist the file: {0}" + }, + "game": { + "metadata": { + "title": "Failed to update yer charts", + "description": "Drop failed to update the game's charts: {0}" + }, + "description": { + "title": "Failed to update game description", + "description": "Drop failed to update the game description: {0}" + }, + "banner": { + "title": "Failed to hoist the banner image", + "description": "Drop failed to hoist the banner image: {0}" + }, + "cover": { + "title": "Failed to hoist the cover image", + "description": "Drop failed to hoist the cover image: {0}" + }, + "deleteImage": { + "title": "Failed to scuttle the image", + "description": "Drop failed to scuttle the image: {0}" + }, + "carousel": { + "title": "Failed to update image carousel", + "description": "Drop failed to update the image carousel: {0}" + } + } + }, + "footer": { + "about": "About, savvy?", + "aboutDrop": "About Drop, argh!", + "docs": { + "client": "Scallywag's Docs", + "server": "Cap'n's Docs" + }, + "documentation": "Charts and Scrolls", + "comparison": "Comparison, matey!", + "findGame": "Find a Game, ye dog!", + "footer": "Keel", + "games": "Games", + "social": { + "discord": "Discord, argh!", + "github": "GitHub, savvy?" + }, + "topSellers": "Top Plunderers" + }, + "header": { + "admin": { + "admin": "Cap'n", + "tasks": "Duties", + "users": "Crew" + }, + "back": "Aft!", + "openSidebar": "Open the side-hatch!" + }, + "highest": "highest", + "home": "Home Port", + "users": { + "admin": { + "description": "Manage the crew on yer Drop vessel, and set yer passage methods, savvy?", + "authLink": "Passage {arrow}", + "displayNameHeader": "Scallywag Name", + "usernameHeader": "Crew Name", + "emailHeader": "Salty Mail", + "adminHeader": "Cap'n, eh?", + "authoptionsHeader": "Passage Options", + "srEditLabel": "Amend", + "adminUserLabel": "Cap'n of the crew", + "normalUserLabel": "Common crewman", + "authentication": { + "title": "Passage", + "description": "Drop backs many 'passage ways'. As ye enable or disable 'em, they show on the sign-in screen for the crew to pick. Click the dot menu to rig the passage way.", + "enabledKey": "Enabled, argh?", + "enabled": "Enabled", + "disabled": "Disabled", + "srOpenOptions": "Open options", + "configure": "Rig", + "simple": "Simple (crew name/secret word)", + "oidc": "OpenID Connect, savvy?" + }, + "simple": { + "title": "Simple passage", + "description": "Simple passage uses a system of 'invitations' to create crew. Ye can forge an invitation, and optionally name a crew name or salty mail for the crew, then it'll make a magic scroll that can be used to make a mark.", + "invitationTitle": "Invitations", + "createInvitation": "Forge Invitation", + "noUsernameEnforced": "No crew name forced, argh.", + "noEmailEnforced": "No salty mail forced, matey.", + "adminInvitation": "Cap'n's Invitation", + "userInvitation": "Crewman's Invitation", + "expires": "Expires: {expiry}", + "neverExpires": "Never expires, savvy.", + "noInvitations": "No invitations, argh.", + "inviteTitle": "Invite crew to Drop", + "inviteDescription": "Drop will make a scroll ye can send to the scallywag ye want to invite. Ye can optionally name a crew name or salty mail for them to use.", + "inviteUsernameLabel": "Crew Name (optional)", + "inviteUsernameFormat": "Must be 5 or more marks", + "inviteUsernamePlaceholder": "myScallywagName", + "inviteEmailLabel": "Salty mail address (optional)", + "inviteEmailDescription": "Must be in the fashion of a scallywag {'@'} example.com", + "inviteEmailPlaceholder": "me{'@'}example.com", + "inviteAdminSwitchLabel": "Cap'n's invitation", + "inviteAdminSwitchDescription": "Make this crewman a cap'n, argh!", + "inviteExpiryLabel": "Expires", + "inviteButton": "Invite, ye dog!", + "invite3Days": "3 suns", + "inviteWeek": "1 week", + "inviteMonth": "1 moon", + "invite6Months": "6 moons", + "inviteYear": "1 year", + "inviteNever": "Never" + } + } + }, + "library": { + "addGames": "All Plunder", + "addToLib": "Add to Yer Treasure Hoard", + "admin": { + "detectedGame": "Drop has found new plunder to import, argh!", + "detectedVersion": "Drop has found new versions of this plunder to import, savvy!", + "gameLibrary": "Game Treasure Hoard", + "import": { + "import": "Import, ye dog!", + "link": "Import {arrow}", + "loading": "Loadin' plunder results, arrr...", + "search": "Search", + "searchPlaceholder": "Fallout 4, savvy?", + "selectDir": "Pick a directory, ye landlubber...", + "selectGame": "Pick plunder to import", + "selectGamePlaceholder": "Pick a game, ye dog...", + "selectGameSearch": "Pick game", + "selectPlatform": "Pick a ship, ye scallywag...", + "version": { + "advancedOptions": "Advanced options, savvy?", + "import": "Import version", + "installDir": "(install_dir)/", + "launchCmd": "Launch executable/command, argh!", + "launchDesc": "Executable to launch the game, matey!", + "launchPlaceholder": "game.exe, aye!", + "loadingVersion": "Loading version charts...", + "noAdv": "No advanced options for this rig, argh.", + "noVersions": "No versions to import, savvy!", + "platform": "Ship type", + "setupCmd": "Setup executable/command", + "setupDesc": "Ran once when the game is installed, ye hear!", + "setupMode": "Setup mode, savvy?", + "setupModeDesc": "When enabled, this version has no launch command, and merely runs the executable on the crew's computer. Useful for games that only give installers and not portable files, argh!", + "setupPlaceholder": "setup.exe, aye!", + "umuLauncherId": "UMU Launcher ID", + "umuOverride": "Override UMU Launcher Game ID", + "umuOverrideDesc": "By default, Drop uses a non-ID when launchin' with UMU Launcher. To get the right patches for some games, ye might have to set this field by hand, savvy.", + "updateMode": "Update mode, argh!", + "updateModeDesc": "When enabled, these files will be installed atop (overwritin') the previous version's. If many 'update modes' be chained together, they be applied in order, ye hear!", + "version": "Pick version to import" + }, + "withoutMetadata": "Import without charts" + }, + "metadataProvider": "Charts Provider", + "noGames": "No plunder imported, savvy!", + "openEditor": "Open in Editor {arrow}", + "openStore": "Open in Store, argh!", + "shortDesc": "Short Description", + "version": { + "noVersions": "Ye have no versions of this plunder available, ye dog!", + "noVersionsAdded": "no versions added, argh!", + "delta": "Upgrade mode" + }, + "game": { + "imageCarousel": "Image Carousel", + "imageCarouselDescription": "Customize what images and what order be shown on the store page, savvy.", + "addImageCarousel": "Add from image treasure hoard", + "imageCarouselEmpty": "No images added to the carousel yet, argh.", + "removeImageCarousel": "Remove image", + "addCarouselNoImages": "No images to add, ye dog.", + "imageLibrary": "Image treasure hoard", + "imageLibraryDescription": "Please note all images hoisted be accessible to all crew through browser dev-tools, savvy.", + "setBanner": "Set as banner", + "setCover": "Set as cover", + "deleteImage": "Scuttle image", + "currentBanner": "banner", + "currentCover": "cover", + "addDescriptionNoImages": "No images to add, argh.", + "editGameName": "Plunder Name", + "editGameDescription": "Plunder Description" + }, + "sources": { + "create": "Forge source", + "createDesc": "Drop will use this source to get to yer game treasure hoard, and make 'em available, argh.", + "desc": "Rig yer treasure hoard sources, where Drop will look for new plunder and versions to import, savvy.", + "fsDesc": "Imports games from a path on disk. Needs version-based folder structure, and backs archived games, ye hear!", + "fsPath": "Path", + "fsPathDesc": "An absolute path to yer game treasure hoard.", + "fsPathPlaceholder": "/mnt/games, aye!", + "link": "Sources {arrow}", + "nameDesc": "The name of yer source, for yer own reckonin', argh.", + "namePlaceholder": "My New Source, savvy?", + "sources": "Treasure Hoard Sources", + "typeDesc": "The type of yer source. Changes the demanded options, ye dog!", + "working": "Workin', eh?" + }, + "subheader": "As ye add folders to yer treasure hoard sources, Drop will find 'em and ask ye to import 'em. Each game needs to be imported before ye can import a version, savvy.", + "title": "Treasure Hoards", + "versionPriority": "Version priority" + }, + "back": "Aft to Treasure Hoard", + "collection": { + "addToNew": "Add to new collection", + "collections": "Collections", + "create": "Forge Collection", + "createDesc": "Collections can be used to sort yer plunder and find 'em easier, especially if ye have a grand treasure hoard, argh!", + "delete": "Scuttle Collection", + "namePlaceholder": "Collection name, matey!", + "noCollections": "No collections, savvy!", + "notFound": "Collection not found, argh!", + "subheader": "Add a new collection to sort yer plunder", + "title": "Collection" + }, + "gameCount": "{0} plunder | {0} plunder | {0} plunder", + "inLib": "In Treasure Hoard", + "launcherOpen": "Open in Launcher, argh!", + "noGames": "No plunder in treasure hoard, savvy!", + "notFound": "Plunder not found, matey!", + "search": "Search treasure hoard, ye dog...", + "subheader": "Sort yer plunder into collections for easy access, and get to all yer plunder, savvy!" + }, + "tasks": { + "admin": { + "scheduled": { + "cleanupInvitationsName": "Clean up invitations", + "cleanupInvitationsDescription": "Cleans up expired invitations from the logbook to save space, savvy.", + "cleanupObjectsName": "Clean up objects", + "cleanupObjectsDescription": "Finds and scuttles unreferenced and unused objects to save space, argh.", + "cleanupSessionsName": "Clean up sessions.", + "cleanupSessionsDescription": "Cleans up expired sessions to save space and keep ye safe, ye dog!", + "checkUpdateName": "Check for new charts.", + "checkUpdateDescription": "Check if Drop has new charts." + }, + "runningTasksTitle": "Duties underway", + "noTasksRunning": "No duties currently underway", + "completedTasksTitle": "Duties completed", + "dailyScheduledTitle": "Daily scheduled duties", + "viewTask": "View {arrow}", + "back": "{arrow} Aft to Duties" + } + }, + "lowest": "lowest", + "name": "Name, argh!", + "news": { + "article": { + "add": "Add, ye dog!", + "content": "Content (Markdown), savvy!", + "create": "Forge New Article", + "editor": "Editor", + "editorGuide": "Use the quick ways above or scribble Markdown directly. Backs **bold**, *italic*, [links](url), and more, argh!", + "new": "New article, savvy!", + "preview": "Preview, matey!", + "shortDesc": "Short description", + "submit": "Submit, ye scurvy dog!", + "tagPlaceholder": "Add a mark, ye dog...", + "titles": "Title, argh!", + "uploadCover": "Hoist cover image" + }, + "back": "Aft to News", + "checkLater": "Check back later for new charts, matey!", + "delete": "Scuttle Article", + "filter": { + "all": "All time, savvy!", + "month": "This moon", + "week": "This week", + "year": "This year, argh!" + }, + "none": "No articles, savvy!", + "notFound": "Article not found, matey!", + "search": "Search articles, ye dog!", + "searchPlaceholder": "Search articles, argh...", + "subheader": "Stay up to date with the latest charts and announcements, savvy!", + "title": "Latest News from the High Seas" + }, + "options": "Options, matey!", + "save": "Stow it!", + "add": "Add", + "insert": "Insert", + "security": "Safety", + "settings": "Settings", + "store": { + "commingSoon": "comin' soon, argh!", + "exploreMore": "Explore more {arrow}, ye dog!", + "images": "Plunder Images", + "lookAt": "Look at it, ye scurvy dog!", + "noGame": "no plunder", + "noImages": "No images, savvy!", + "openAdminDashboard": "Open in Cap'n's Quarters", + "platform": "Ship | Ship | Ships", + "rating": "Rating, argh!", + "readLess": "Click to read less, matey!", + "readMore": "Click to read more, ye dog!", + "recentlyAdded": "Recently Added Plunder", + "recentlyReleased": "Recently set sail", + "recentlyUpdated": "Recently Updated", + "released": "Released, argh!", + "reviews": "({0} Sea Tales)", + "title": "Store", + "view": "View in Store" + }, + "type": "Type", + "upload": "Hoist!", + "uploadFile": "Hoist file", + "userHeader": { + "closeSidebar": "Close side-hatch!", + "links": { + "community": "Shipmates", + "library": "Treasure Hoard", + "news": "News from the High Seas" + }, + "profile": { + "admin": "Cap'n's Quarters", + "settings": "Account settings, savvy!" + } + }, + "todo": "Todo, argh!", + "selectLanguage": "Pick yer tongue", + "helpUsTranslate": "Help us translate Drop {arrow}, argh!", + "welcome": "Ahoy, Welcome!" } diff --git a/i18n/locales/en_us.json b/i18n/locales/en_us.json index 0abe06c..dbdfd55 100644 --- a/i18n/locales/en_us.json +++ b/i18n/locales/en_us.json @@ -502,5 +502,7 @@ } }, "todo": "Todo", + "selectLanguage": "Select language", + "helpUsTranslate": "Help us translate Drop {arrow}", "welcome": "American, Welcome!" } diff --git a/pages/store/index.vue b/pages/store/index.vue index ca78389..16c2faa 100644 --- a/pages/store/index.vue +++ b/pages/store/index.vue @@ -1,9 +1,5 @@