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
This commit is contained in:
DecDuck
2025-06-08 10:33:41 +10:00
committed by GitHub
parent a199393e29
commit 0e023534a7
8 changed files with 633 additions and 91 deletions

View File

@ -0,0 +1,142 @@
<template>
<div>
<Listbox v-model="wiredLocale" as="div">
<ListboxLabel class="block text-sm/6 font-medium text-zinc-400">{{
$t("selectLanguage")
}}</ListboxLabel>
<div class="relative mt-2">
<ListboxButton
class="grid w-full cursor-default grid-cols-1 rounded-md bg-zinc-900 py-1.5 pr-2 pl-3 text-left text-zinc-300 outline-1 -outline-offset-1 outline-zinc-700 focus:outline-2 focus:-outline-offset-2 focus:outline-blue-600 sm:text-sm/6"
>
<span class="col-start-1 row-start-1 flex items-center gap-3 pr-6">
<span alt="" class="-mt-0.5 shrink-0 rounded-full">{{
localeToEmoji(wiredLocale)
}}</span>
<span class="block truncate">{{
currentLocaleInformation?.name ?? wiredLocale
}}</span>
</span>
<ChevronUpDownIcon
class="col-start-1 row-start-1 size-5 self-center justify-self-end text-gray-500 sm:size-4"
aria-hidden="true"
/>
</ListboxButton>
<transition
leave-active-class="transition ease-in duration-100"
leave-from-class="opacity-100"
leave-to-class="opacity-0"
>
<ListboxOptions
class="absolute z-10 mt-1 max-h-56 w-full overflow-auto rounded-md bg-zinc-900 py-1 text-base shadow-lg ring-1 ring-black/5 focus:outline-hidden sm:text-sm"
>
<ListboxOption
v-for="listLocale in locales"
:key="listLocale.code"
v-slot="{ active, selected }"
as="template"
:value="listLocale.code"
>
<li
:class="[
active
? 'bg-blue-600 text-white outline-hidden'
: 'text-zinc-300',
'relative cursor-default py-2 pr-9 pl-3 select-none',
]"
>
<div class="flex items-center">
<span class="-mt-0.5 shrink-0 rounded-full">
{{ localeToEmoji(listLocale.code) }}
</span>
<span
:class="[
selected ? 'font-semibold' : 'font-normal',
'ml-3 block truncate',
]"
>{{ listLocale.name }}</span
>
</div>
<span
v-if="selected"
:class="[
active ? 'text-white' : 'text-blue-600',
'absolute inset-y-0 right-0 flex items-center pr-4',
]"
>
<CheckIcon class="size-5" aria-hidden="true" />
</span>
</li>
</ListboxOption>
</ListboxOptions>
</transition>
</div>
</Listbox>
<NuxtLink
class="mt-1 transition text-blue-500 hover:text-blue-600 text-sm"
to="https://translate.droposs.org/projects/drop/"
target="_blank"
>
<i18n-t
keypath="helpUsTranslate"
tag="span"
scope="global"
class="inline-flex items-center gap-x-1 hover:underline"
>
<template #arrow>
<ArrowTopRightOnSquareIcon class="size-4" />
</template>
</i18n-t>
</NuxtLink>
<DevOnly
><h1 class="mt-3 text-sm text-gray-500">{{ $t("welcome") }}</h1>
</DevOnly>
</div>
</template>
<script setup lang="ts">
import {
Listbox,
ListboxButton,
ListboxLabel,
ListboxOption,
ListboxOptions,
} from "@headlessui/vue";
import { ChevronUpDownIcon } from "@heroicons/vue/16/solid";
import { ArrowTopRightOnSquareIcon } from "@heroicons/vue/24/outline";
const { locales, locale, setLocale } = useI18n();
function localeToEmoji(local: string): string {
switch (local) {
case "en":
case "en-gb":
case "en-ca":
case "en-au":
case "en-us": {
return "🇺🇸";
}
case "en-pirate": {
return "🏴‍☠️";
}
default: {
return "❓";
}
}
}
const wiredLocale = computed({
get() {
return locale.value;
},
set(v) {
setLocale(v);
},
});
const currentLocaleInformation = computed(() =>
locales.value.find((e) => e.code == wiredLocale.value),
);
</script>

View File

@ -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')"
/>
<MagnifyingGlassIcon
class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-zinc-400"

View File

@ -8,6 +8,9 @@
<p class="text-sm leading-6 text-zinc-300">
{{ $t("drop.desc") }}
</p>
<LanguageSelector />
<div class="flex space-x-6">
<NuxtLink
v-for="item in navigation.social"
@ -90,6 +93,7 @@
<script setup lang="ts">
import { IconsDiscordLogo, IconsGithubLogo } from "#components";
const { t } = useI18n();
const navigation = {

View File

@ -54,7 +54,6 @@
</transition>
</Menu>
</li>
<UserHeaderSelectLang />
<UserHeaderUserWidget />
</ol>
</div>
@ -176,9 +175,7 @@
</UserHeaderWidget>
</li>
<li class="w-full">
<UserHeaderWidget class="w-full">
<UserHeaderSelectLang />
</UserHeaderWidget>
<UserHeaderWidget class="w-full" />
</li>
</div>
</nav>
@ -209,7 +206,7 @@ const router = useRouter();
const { t } = useI18n();
const homepageURL = "/store";
const navigation: Array<NavigationItem> = [
const navigation: Ref<Array<NavigationItem>> = computed(() => [
{
prefix: "/store",
route: "/store",
@ -230,9 +227,9 @@ const navigation: Array<NavigationItem> = [
route: "/news",
label: t("userHeader.links.news"),
},
];
]);
const currentPageIndex = useCurrentNavigationIndex(navigation);
const currentPageIndex = useCurrentNavigationIndex(navigation.value);
const notifications = useNotifications();
const unreadNotifications = computed(() =>

View File

@ -1,78 +0,0 @@
<script setup lang="ts">
import { Menu, MenuButton, MenuItems, MenuItem } from "@headlessui/vue";
import { ChevronDownIcon } from "@heroicons/vue/16/solid";
const { locales, locale: currLocale, setLocale } = useI18n();
function localToEmoji(local: string): string {
switch (local) {
case "en":
case "en-gb":
case "en-ca":
case "en-au":
case "en-us": {
return "🇺🇸";
}
case "en-pirate": {
return "🏴‍☠️";
}
default: {
return "❓";
}
}
}
</script>
<template>
<Menu as="div" class="relative inline-block">
<MenuButton>
<UserHeaderWidget>
<div
class="inline-flex items-center text-zinc-300 hover:text-white h-5"
>
<EmojiText :emoji="localToEmoji(currLocale)" />
<!-- <span class="ml-2 text-sm font-bold">{{ locale }}</span> -->
<ChevronDownIcon class="ml-3 h-4" />
</div>
</UserHeaderWidget>
</MenuButton>
<transition
enter-active-class="transition ease-out duration-100"
enter-from-class="transform opacity-0 scale-95"
enter-to-class="transform opacity-100 scale-100"
leave-active-class="transition ease-in duration-75"
leave-from-class="transform opacity-100 scale-100"
leave-to-class="transform opacity-0 scale-95"
>
<MenuItems
class="absolute right-0 top-10 z-50 w-56 origin-top-right focus:outline-none shadow-md"
>
<PanelWidget class="flex-col gap-y-2">
<div class="flex flex-col">
<MenuItem
v-for="locale in locales"
:key="locale.code"
hydrate-on-visible
as="div"
>
<button @click="setLocale(locale.code)">
<EmojiText :emoji="localToEmoji(locale.code)" />
{{ locale.name }}
</button>
</MenuItem>
</div>
</PanelWidget>
</MenuItems>
</transition>
</Menu>
</template>
<style scoped>
img.emoji {
height: 1em;
width: 1em;
margin: 0 0.05em 0 0.1em;
vertical-align: -0.1em;
}
</style>

View File

@ -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!"
}

View File

@ -502,5 +502,7 @@
}
},
"todo": "Todo",
"selectLanguage": "Select language",
"helpUsTranslate": "Help us translate Drop {arrow}",
"welcome": "American, Welcome!"
}

View File

@ -1,9 +1,5 @@
<template>
<div class="w-full flex flex-col overflow-x-hidden">
<DevOnly
><h1 class="text-gray-100">{{ $t("welcome") }}</h1>
</DevOnly>
<!-- Hero section -->
<VueCarousel
v-if="recent.length > 0"