i18n(es): wire StashPage hardcoded strings through t() (30+ literals)

This commit is contained in:
SkateSpots 2026-10-07 16:39:41 +07:00
parent f58b19e310
commit c7a6421be1
3 changed files with 127 additions and 50 deletions

View file

@ -6781,6 +6781,44 @@ walletUi: {
deleteDescPublic: ' and unlisted from your public showcase',
deleteUndone: '. This can’t be undone.',
deleteDescGeneric: 'This item will be removed from your stash. This can’t be undone.',
listOnMarketplace: 'List on Marketplace',
noPriceSet: 'No price set',
categoryLabel: 'Category',
photosLabel: 'Photos',
willingToSell: 'Willing to Sell',
willingToTrade: 'Willing to Trade',
whereIsThisItem: 'Where is this item?',
visibilityLabel: 'Visibility',
visibilityPrivateOnlyYou: 'Private - Only you',
visibilityFriendsMutual: 'Friends - Mutual follows',
visibilityPublicAnyone: 'Public - Anyone',
visibilityFriends: 'Friends',
brandLabel: 'Brand',
sizeLabel: 'Size',
descriptionLabel: 'Description',
conditionLabel: 'Condition',
itemName: 'Item Name',
saveChanges: 'Save Changes',
listItemDialogTitle: 'List "{{title}}"',
pickUpWhere: 'Where can buyers pick up this item?',
linkToSpot: 'Link to a Skate Spot',
linkToSpotDesc: 'Best for local sales • Shows on spot page & map',
recommended: 'Recommended',
noSpecificSpot: 'No Specific Spot',
noSpecificSpotDesc: 'Visible on Marketplace page only',
tipLinkedSpots: '💡 Tip: Listings linked to spots are easier to find for local skaters.',
anyoneCanSee: 'Anyone can see these on your profile.',
seeWhatOthersSee: 'See what others see',
inventory: 'Inventory',
publicWantsNote: 'Public wants are posted to the Marketplace as “wanted” ads, so sellers can find you.',
howItWorks: 'How it works',
tapToMarketplace: 'Tap to go to Marketplace →',
viewWishlist: 'View Wishlist',
tipEditItems: 'Edit items with the pen button',
tipListForSale: 'List for sale with the store button',
tipAddPhotos: 'Add photos for better trade offers',
tipKeySyncs: 'Nostr key syncs to all devices',
itemsReadyToSell: '{{count}} item(s) ready to sell',
},
},
cardUi: {

View file

@ -6781,6 +6781,44 @@ walletUi: {
deleteDescPublic: ' y se retirará de tu escaparate público',
deleteUndone: '. Esto no se puede deshacer.',
deleteDescGeneric: 'Este artículo se quitará de tu stash. Esto no se puede deshacer.',
listOnMarketplace: 'Publicar en el Marketplace',
noPriceSet: 'Sin precio',
categoryLabel: 'Categoría',
photosLabel: 'Fotos',
willingToSell: 'Dispuesto a vender',
willingToTrade: 'Dispuesto a intercambiar',
whereIsThisItem: '¿Dónde está este artículo?',
visibilityLabel: 'Visibilidad',
visibilityPrivateOnlyYou: 'Privado - Solo tú',
visibilityFriendsMutual: 'Amigos - Seguidores mutuos',
visibilityPublicAnyone: 'Público - Cualquiera',
visibilityFriends: 'Amigos',
brandLabel: 'Marca',
sizeLabel: 'Medida',
descriptionLabel: 'Descripción',
conditionLabel: 'Estado',
itemName: 'Nombre del artículo',
saveChanges: 'Guardar cambios',
listItemDialogTitle: 'Publicar "{{title}}"',
pickUpWhere: '¿Dónde pueden recogerlo los compradores?',
linkToSpot: 'Vincular a un Spot',
linkToSpotDesc: 'Mejor para ventas locales • Aparece en la página del spot y el mapa',
recommended: 'Recomendado',
noSpecificSpot: 'Sin spot concreto',
noSpecificSpotDesc: 'Visible solo en la página del Marketplace',
tipLinkedSpots: '💡 Consejo: los anuncios vinculados a spots son más fáciles de encontrar para los skaters locales.',
anyoneCanSee: 'Cualquiera puede verlos en tu perfil.',
seeWhatOthersSee: 'Ver lo que ven los demás',
inventory: 'Inventario',
publicWantsNote: 'Lo que buscas públicamente se publica en el Marketplace como anuncios de “busco”, para que los vendedores te encuentren.',
howItWorks: 'Cómo funciona',
tapToMarketplace: 'Toca para ir al Marketplace →',
viewWishlist: 'Ver wishlist',
tipEditItems: 'Edita artículos con el botón del lápiz',
tipListForSale: 'Pon a la venta con el botón de la tienda',
tipAddPhotos: 'Añade fotos para mejores ofertas de intercambio',
tipKeySyncs: 'Tu clave Nostr se sincroniza en todos los dispositivos',
itemsReadyToSell: '{{count}} artículo(s) listos para vender',
},
},
cardUi: {

View file

@ -213,7 +213,7 @@ function StashItemCard({ item, onEdit, onDelete, onListOnMarketplace, isWTB = fa
</div>
{isWTB && (
<div className="absolute top-3 left-2 z-10">
<Badge className="bg-cyan-500 text-black text-[10px] font-black uppercase"><Heart className="h-2.5 w-2.5 mr-0.5" />Wishlist</Badge>
<Badge className="bg-cyan-500 text-black text-[10px] font-black uppercase"><Heart className="h-2.5 w-2.5 mr-0.5" />{t('walletUi.stash.wishlist')}</Badge>
</div>
)}
<div className="absolute top-3 right-2 z-10">
@ -242,7 +242,7 @@ function StashItemCard({ item, onEdit, onDelete, onListOnMarketplace, isWTB = fa
<div className={cn('absolute inset-0 bg-black/85 transition-all duration-200 flex flex-col items-center justify-center gap-2 backdrop-blur-sm', selectable ? 'hidden' : 'opacity-100 md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100')}>
<div className="flex items-center gap-2">
<Button size="sm" variant="outline" className="h-8 border-white/30" onClick={(e) => { e.stopPropagation(); onEdit(); }}>
<Edit3 className="h-3.5 w-3.5 mr-1" />Edit
<Edit3 className="h-3.5 w-3.5 mr-1" />{t('common.edit')}
</Button>
<Button size="sm" variant="destructive" className="h-8" onClick={(e) => { e.stopPropagation(); onDelete(); }}>
<Trash2 className="h-3.5 w-3.5" />
@ -251,7 +251,7 @@ function StashItemCard({ item, onEdit, onDelete, onListOnMarketplace, isWTB = fa
{canListOnMarketplace && onListOnMarketplace && (
<Button size="sm" className="h-8 bg-[#ff6600] hover:bg-[#ff6600]/90 text-black font-bold"
onClick={(e) => { e.stopPropagation(); onListOnMarketplace(); }}>
<Store className="h-3 w-3 mr-1" />List on Marketplace
<Store className="h-3 w-3 mr-1" />{t('walletUi.stash.listOnMarketplace')}
</Button>
)}
</div>
@ -287,10 +287,10 @@ function StashItemCard({ item, onEdit, onDelete, onListOnMarketplace, isWTB = fa
{usdValue && <span className="text-[10px] text-muted-foreground">(~${usdValue.toFixed(0)})</span>}
</div>
) : (
<span className="text-xs text-gray-500">No price set</span>
<span className="text-xs text-gray-500">{t('walletUi.stash.noPriceSet')}</span>
)}
<div className="flex items-center gap-1">
{item.visibility === 'private' && <Tooltip><TooltipTrigger><Lock className="h-3.5 w-3.5 text-red-400/60" /></TooltipTrigger><TooltipContent>Private</TooltipContent></Tooltip>}
{item.visibility === 'private' && <Tooltip><TooltipTrigger><Lock className="h-3.5 w-3.5 text-red-400/60" /></TooltipTrigger><TooltipContent>{t('walletUi.stash.visibilityPrivate')}</TooltipContent></Tooltip>}
{item.visibility === 'friends' && <Tooltip><TooltipTrigger><Users className="h-3.5 w-3.5 text-blue-400/60" /></TooltipTrigger><TooltipContent>{t('walletUi.stash.friendsOnly')}</TooltipContent></Tooltip>}
{item.willingToTrade && <Badge variant="outline" className="text-[9px] h-5 px-1 border-cyan-500/40 text-cyan-400"><ArrowRightLeft className="h-2.5 w-2.5" /></Badge>}
{item.willingToSell && !isWTB && <Badge variant="outline" className="text-[9px] h-5 px-1 border-green-500/40 text-green-400"><Zap className="h-2.5 w-2.5" /></Badge>}
@ -351,7 +351,7 @@ function AddItemDialog({ onAdd, mode = 'stash', trigger }: { onAdd: (item: Omit<
const defaultTrigger = isWTB ? (
<Button variant="outline" className="gap-2 border-cyan-500/50 text-cyan-400 hover:bg-cyan-500/10"><Heart className="h-4 w-4" />{t('walletUi.stash.addToWishlist')}</Button>
) : (
<Button className="gap-2 bg-gradient-to-r from-[#ff0040] to-[#ff6600] hover:opacity-90 border-0 shadow-lg shadow-[#ff0040]/20"><Plus className="h-4 w-4" />Add to Stash</Button>
<Button className="gap-2 bg-gradient-to-r from-[#ff0040] to-[#ff6600] hover:opacity-90 border-0 shadow-lg shadow-[#ff0040]/20"><Plus className="h-4 w-4" />{t('walletUi.stash.addItemToStash')}</Button>
);
return (
@ -373,7 +373,7 @@ function AddItemDialog({ onAdd, mode = 'stash', trigger }: { onAdd: (item: Omit<
</div>
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<Label>Category *</Label>
<Label>{t('walletUi.stash.categoryLabel')} *</Label>
<Select value={formData.category} onValueChange={(v) => setFormData({ ...formData, category: v as StashItem['category'] })}>
<SelectTrigger className="bg-black/50 border-white/20"><SelectValue /></SelectTrigger>
<SelectContent>{Object.entries(STASH_CATEGORIES).map(([key, cat]) => <SelectItem key={key} value={key}>{cat.emoji} {cat.label}</SelectItem>)}</SelectContent>
@ -403,7 +403,7 @@ function AddItemDialog({ onAdd, mode = 'stash', trigger }: { onAdd: (item: Omit<
</div>
{!isWTB && (
<div className="space-y-2">
<Label>Photos</Label>
<Label>{t('walletUi.stash.photosLabel')}</Label>
<div className="space-y-3">
{formData.images && formData.images.length > 0 && (
<div className="grid grid-cols-3 gap-2">
@ -429,7 +429,7 @@ function AddItemDialog({ onAdd, mode = 'stash', trigger }: { onAdd: (item: Omit<
<div className="space-y-3">
{!isWTB && (
<div className="flex items-center justify-between p-3 rounded-lg bg-green-500/10 border border-green-500/30">
<div className="flex items-center gap-2"><Zap className="h-4 w-4 text-green-400" /><Label>Willing to Sell</Label></div>
<div className="flex items-center gap-2"><Zap className="h-4 w-4 text-green-400" /><Label>{t('walletUi.stash.willingToSell')}</Label></div>
<Switch checked={formData.willingToSell} onCheckedChange={(v) => setFormData({ ...formData, willingToSell: v })} />
</div>
)}
@ -440,7 +440,7 @@ function AddItemDialog({ onAdd, mode = 'stash', trigger }: { onAdd: (item: Omit<
</div>
{!isWTB && (
<div className="space-y-2">
<Label className="flex items-center gap-2"><MapPin className="h-4 w-4 text-[#ff6600]" />Where is this item?</Label>
<Label className="flex items-center gap-2"><MapPin className="h-4 w-4 text-[#ff6600]" />{t('walletUi.stash.whereIsThisItem')}</Label>
<div className="grid grid-cols-3 gap-2">
{([ { value: 'home', label: '🏠 Home' }, { value: 'car', label: '🚗 Car' }, { value: 'backpack', label: '🎒 Backpack' }, { value: 'wardrobe', label: '🚪 Wardrobe' }, { value: 'van', label: '🚐 Van' }, { value: 'skatepark', label: '🛹 Skatepark' }, { value: 'friends', label: "👫 Friend's" }, { value: 'parents', label: "👨‍👩‍👦 Parents'" }, { value: 'warehouse', label: '🏭 Warehouse' }, { value: 'storage_unit', label: '🔒 Storage Unit' }, { value: 'sponsor', label: '🤝 Sponsor' }, { value: 'other', label: '📦 Other' }, ] as const).map(({ value, label }) => (
<button key={value} type="button" onClick={() => setFormData({ ...formData, storageLocation: value })}
@ -452,13 +452,13 @@ function AddItemDialog({ onAdd, mode = 'stash', trigger }: { onAdd: (item: Omit<
</div>
)}
<div className="space-y-2">
<Label>Visibility</Label>
<Label>{t('walletUi.stash.visibilityLabel')}</Label>
<Select value={formData.visibility} onValueChange={(v) => setFormData({ ...formData, visibility: v as StashItem['visibility'] })}>
<SelectTrigger className="bg-black/50 border-white/20"><SelectValue /></SelectTrigger>
<SelectContent>
<SelectItem value="private"><div className="flex items-center gap-2"><Lock className="h-3.5 w-3.5 text-red-400" /><span>Private - Only you</span></div></SelectItem>
<SelectItem value="friends"><div className="flex items-center gap-2"><Users className="h-3.5 w-3.5 text-blue-400" /><span>Friends - Mutual follows</span></div></SelectItem>
<SelectItem value="public"><div className="flex items-center gap-2"><Globe className="h-3.5 w-3.5 text-green-400" /><span>Public - Anyone</span></div></SelectItem>
<SelectItem value="private"><div className="flex items-center gap-2"><Lock className="h-3.5 w-3.5 text-red-400" /><span>{t('walletUi.stash.visibilityPrivateOnlyYou')}</span></div></SelectItem>
<SelectItem value="friends"><div className="flex items-center gap-2"><Users className="h-3.5 w-3.5 text-blue-400" /><span>{t('walletUi.stash.visibilityFriendsMutual')}</span></div></SelectItem>
<SelectItem value="public"><div className="flex items-center gap-2"><Globe className="h-3.5 w-3.5 text-green-400" /><span>{t('walletUi.stash.visibilityPublicAnyone')}</span></div></SelectItem>
</SelectContent>
</Select>
<p className="text-xs text-muted-foreground">
@ -471,7 +471,7 @@ function AddItemDialog({ onAdd, mode = 'stash', trigger }: { onAdd: (item: Omit<
</div>
</div>
<DialogFooter>
<DialogClose asChild><Button variant="outline" className="border-white/20">Cancel</Button></DialogClose>
<DialogClose asChild><Button variant="outline" className="border-white/20">{t('common.cancel')}</Button></DialogClose>
<Button onClick={handleSubmit} disabled={!formData.title || isUploading} className={cn(isWTB ? "bg-cyan-500 hover:bg-cyan-600 text-black" : "bg-[#ff6600] hover:bg-[#ff6600]/90")}>
{isWTB ? <><Heart className="h-4 w-4 mr-2" />{t('walletUi.stash.addToWishlist')}</> : <><Plus className="h-4 w-4 mr-2" />{t('walletUi.stash.addItem')}</>}
</Button>
@ -519,19 +519,19 @@ function EditItemDialog({ item, open, onOpenChange, onSave }: { item: StashItem;
</DialogHeader>
<div className="space-y-4 py-4">
<div className="space-y-2">
<Label>Item Name *</Label>
<Label>{t('walletUi.stash.itemName')} *</Label>
<Input value={formData.title || ''} onChange={(e) => setFormData({ ...formData, title: e.target.value })} className="bg-black/50 border-white/20" />
</div>
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<Label>Category *</Label>
<Label>{t('walletUi.stash.categoryLabel')} *</Label>
<Select value={formData.category} onValueChange={(v) => setFormData({ ...formData, category: v as StashItem['category'] })}>
<SelectTrigger className="bg-black/50 border-white/20"><SelectValue /></SelectTrigger>
<SelectContent>{Object.entries(STASH_CATEGORIES).map(([key, cat]) => <SelectItem key={key} value={key}>{cat.emoji} {cat.label}</SelectItem>)}</SelectContent>
</Select>
</div>
<div className="space-y-2">
<Label>Condition</Label>
<Label>{t('walletUi.stash.conditionLabel')}</Label>
<Select value={formData.condition} onValueChange={(v) => setFormData({ ...formData, condition: v as StashItem['condition'] })}>
<SelectTrigger className="bg-black/50 border-white/20"><SelectValue /></SelectTrigger>
<SelectContent>{Object.entries(CONDITION_LABELS).map(([key, cond]) => <SelectItem key={key} value={key}>{cond.label}</SelectItem>)}</SelectContent>
@ -539,16 +539,16 @@ function EditItemDialog({ item, open, onOpenChange, onSave }: { item: StashItem;
</div>
</div>
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2"><Label>Brand</Label><Input value={formData.brand || ''} onChange={(e) => setFormData({ ...formData, brand: e.target.value })} className="bg-black/50 border-white/20" /></div>
<div className="space-y-2"><Label>Size</Label><Input value={formData.size || ''} onChange={(e) => setFormData({ ...formData, size: e.target.value })} className="bg-black/50 border-white/20" /></div>
<div className="space-y-2"><Label>{t('walletUi.stash.brandLabel')}</Label><Input value={formData.brand || ''} onChange={(e) => setFormData({ ...formData, brand: e.target.value })} className="bg-black/50 border-white/20" /></div>
<div className="space-y-2"><Label>{t('walletUi.stash.sizeLabel')}</Label><Input value={formData.size || ''} onChange={(e) => setFormData({ ...formData, size: e.target.value })} className="bg-black/50 border-white/20" /></div>
</div>
<div className="space-y-2">
<Label>Description</Label>
<Label>{t('walletUi.stash.descriptionLabel')}</Label>
<Textarea value={formData.description || ''} onChange={(e) => setFormData({ ...formData, description: e.target.value })} rows={3} className="bg-black/50 border-white/20" />
</div>
{!isWTB && (
<div className="space-y-2">
<Label>Photos</Label>
<Label>{t('walletUi.stash.photosLabel')}</Label>
<div className="space-y-3">
{formData.images && formData.images.length > 0 && (
<div className="grid grid-cols-3 gap-2">
@ -574,23 +574,23 @@ function EditItemDialog({ item, open, onOpenChange, onSave }: { item: StashItem;
<div className="space-y-3">
{!isWTB && (
<div className="flex items-center justify-between p-3 rounded-lg bg-green-500/10 border border-green-500/30">
<div className="flex items-center gap-2"><Zap className="h-4 w-4 text-green-400" /><Label>Willing to Sell</Label></div>
<div className="flex items-center gap-2"><Zap className="h-4 w-4 text-green-400" /><Label>{t('walletUi.stash.willingToSell')}</Label></div>
<Switch checked={formData.willingToSell} onCheckedChange={(v) => setFormData({ ...formData, willingToSell: v })} />
</div>
)}
<div className="flex items-center justify-between p-3 rounded-lg bg-cyan-500/10 border border-cyan-500/30">
<div className="flex items-center gap-2"><ArrowRightLeft className="h-4 w-4 text-cyan-400" /><Label>Willing to Trade</Label></div>
<div className="flex items-center gap-2"><ArrowRightLeft className="h-4 w-4 text-cyan-400" /><Label>{t('walletUi.stash.willingToTrade')}</Label></div>
<Switch checked={formData.willingToTrade} onCheckedChange={(v) => setFormData({ ...formData, willingToTrade: v })} />
</div>
</div>
<div className="space-y-2">
<Label>Visibility</Label>
<Label>{t('walletUi.stash.visibilityLabel')}</Label>
<Select value={formData.visibility} onValueChange={(v) => setFormData({ ...formData, visibility: v as StashItem['visibility'] })}>
<SelectTrigger className="bg-black/50 border-white/20"><SelectValue /></SelectTrigger>
<SelectContent>
<SelectItem value="private"><div className="flex items-center gap-2"><Lock className="h-3.5 w-3.5 text-red-400" /><span>Private</span></div></SelectItem>
<SelectItem value="friends"><div className="flex items-center gap-2"><Users className="h-3.5 w-3.5 text-blue-400" /><span>Friends</span></div></SelectItem>
<SelectItem value="public"><div className="flex items-center gap-2"><Globe className="h-3.5 w-3.5 text-green-400" /><span>Public</span></div></SelectItem>
<SelectItem value="private"><div className="flex items-center gap-2"><Lock className="h-3.5 w-3.5 text-red-400" /><span>{t('walletUi.stash.visibilityPrivate')}</span></div></SelectItem>
<SelectItem value="friends"><div className="flex items-center gap-2"><Users className="h-3.5 w-3.5 text-blue-400" /><span>{t('walletUi.stash.visibilityFriends')}</span></div></SelectItem>
<SelectItem value="public"><div className="flex items-center gap-2"><Globe className="h-3.5 w-3.5 text-green-400" /><span>{t('walletUi.stash.visibilityPublic')}</span></div></SelectItem>
</SelectContent>
</Select>
<p className="text-xs text-muted-foreground">
@ -603,9 +603,9 @@ function EditItemDialog({ item, open, onOpenChange, onSave }: { item: StashItem;
</div>
</div>
<DialogFooter>
<DialogClose asChild><Button variant="outline" className="border-white/20">Cancel</Button></DialogClose>
<DialogClose asChild><Button variant="outline" className="border-white/20">{t('common.cancel')}</Button></DialogClose>
<Button onClick={() => { if (!formData.title || !formData.category) return; onSave(formData); onOpenChange(false); }} disabled={!formData.title || isUploading} className="bg-[#ff6600] hover:bg-[#ff6600]/90">
<Edit3 className="h-4 w-4 mr-2" />Save Changes
<Edit3 className="h-4 w-4 mr-2" />{t('walletUi.stash.saveChanges')}
</Button>
</DialogFooter>
</DialogContent>
@ -617,27 +617,28 @@ function EditItemDialog({ item, open, onOpenChange, onSave }: { item: StashItem;
function ListAtSpotDialog({ item, open, onOpenChange, onSelectSpot }: {
item: StashItem; open: boolean; onOpenChange: (open: boolean) => void; onSelectSpot: (spotId: string | null) => void;
}) {
const { t } = useTranslation();
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="max-w-md bg-black/95 border-2 border-[#ff6600]/40">
<DialogHeader>
<DialogTitle className="flex items-center gap-2 text-white"><Store className="h-5 w-5 text-[#ff6600]" />List "{item.title}"</DialogTitle>
<DialogDescription className="text-muted-foreground">Where can buyers pick up this item?</DialogDescription>
<DialogTitle className="flex items-center gap-2 text-white"><Store className="h-5 w-5 text-[#ff6600]" />{t('walletUi.stash.listItemDialogTitle', { title: item.title })}</DialogTitle>
<DialogDescription className="text-muted-foreground">{t('walletUi.stash.pickUpWhere')}</DialogDescription>
</DialogHeader>
<div className="py-4 space-y-4">
<div className="space-y-3">
<Button variant="outline" className="w-full justify-start h-auto py-4 border-[#ff6600]/50 hover:bg-[#ff6600]/10 hover:border-[#ff6600]" onClick={() => onSelectSpot('pick')}>
<MapPin className="h-6 w-6 mr-3 text-[#ff6600]" />
<div className="text-left flex-1"><div className="font-bold text-white">Link to a Skate Spot</div><div className="text-xs text-muted-foreground">Best for local sales • Shows on spot page & map</div></div>
<Badge className="bg-[#ff6600]/20 text-[#ff6600] border-[#ff6600]/50">Recommended</Badge>
<div className="text-left flex-1"><div className="font-bold text-white">{t('walletUi.stash.linkToSpot')}</div><div className="text-xs text-muted-foreground">{t('walletUi.stash.linkToSpotDesc')}</div></div>
<Badge className="bg-[#ff6600]/20 text-[#ff6600] border-[#ff6600]/50">{t('walletUi.stash.recommended')}</Badge>
</Button>
<Button variant="outline" className="w-full justify-start h-auto py-4 border-gray-600 hover:bg-gray-800" onClick={() => onSelectSpot(null)}>
<Globe className="h-6 w-6 mr-3 text-gray-400" />
<div className="text-left"><div className="font-bold text-white">No Specific Spot</div><div className="text-xs text-muted-foreground">Visible on Marketplace page only</div></div>
<div className="text-left"><div className="font-bold text-white">{t('walletUi.stash.noSpecificSpot')}</div><div className="text-xs text-muted-foreground">{t('walletUi.stash.noSpecificSpotDesc')}</div></div>
</Button>
</div>
<div className="p-3 rounded-lg bg-blue-500/10 border border-blue-500/30 text-xs">
<p className="text-blue-300"><strong>💡 Tip:</strong> Listings linked to spots are easier to find for local skaters.</p>
<p className="text-blue-300">{t('walletUi.stash.tipLinkedSpots')}</p>
</div>
</div>
</DialogContent>
@ -1008,10 +1009,10 @@ export default function StashPage() {
))}
{publicItems.length > 4 && <span className="text-[10px] text-gray-500">+{publicItems.length - 4}</span>}
</div>
<p className="text-[11px] leading-snug text-gray-500">Anyone can see these on your profile.</p>
<p className="text-[11px] leading-snug text-gray-500">{t('walletUi.stash.anyoneCanSee')}</p>
<Link to={profileHref} className="block">
<Button size="sm" variant="outline" className="w-full gap-1.5 border-emerald-500/30 text-emerald-300 hover:bg-emerald-500/10">
<Globe className="h-3.5 w-3.5" /> See what others see
<Globe className="h-3.5 w-3.5" /> {t('walletUi.stash.seeWhatOthersSee')}
</Button>
</Link>
</div>
@ -1162,7 +1163,7 @@ export default function StashPage() {
</SelectContent>
</Select>
<Select value={filterSort} onValueChange={(v) => setFilterSort(v as typeof filterSort)}>
<SelectTrigger className="w-[110px] h-8 bg-white/4 border-white/8 text-sm flex-shrink-0" aria-label="Sort"><SelectValue /></SelectTrigger>
<SelectTrigger className="w-[110px] h-8 bg-white/4 border-white/8 text-sm flex-shrink-0" aria-label={t('common.sort')}><SelectValue /></SelectTrigger>
<SelectContent>
<SelectItem value="recent">{t('walletUi.stash.sortNewest')}</SelectItem>
<SelectItem value="value">{t('walletUi.stash.sortValue')}</SelectItem>
@ -1291,7 +1292,7 @@ export default function StashPage() {
{/* Card header */}
<div className="px-5 pt-5 pb-4 border-b border-white/8">
<div className="flex items-center justify-between mb-4">
<span className="text-[11px] font-black uppercase tracking-widest text-gray-500">Inventory</span>
<span className="text-[11px] font-black uppercase tracking-widest text-gray-500">{t('walletUi.stash.inventory')}</span>
<Trophy className="h-3.5 w-3.5 text-amber-400/60" />
</div>
{/* Big stat */}
@ -1407,13 +1408,13 @@ export default function StashPage() {
<div className="flex items-center justify-between">
<div className="flex items-center gap-2">
<Heart className="h-4 w-4 text-cyan-400" />
<span className="text-sm font-black text-cyan-300 uppercase tracking-wide">Wishlist</span>
<span className="text-sm font-black text-cyan-300 uppercase tracking-wide">{t('walletUi.stash.wishlist')}</span>
</div>
<span className="text-2xl font-black text-cyan-400">{wishlistItems.length}</span>
</div>
<p className="text-[11px] text-gray-500 leading-relaxed">Public wants are posted to the Marketplace as “wanted” ads, so sellers can find you.</p>
<p className="text-[11px] text-gray-500 leading-relaxed">{t('walletUi.stash.publicWantsNote')}</p>
<button onClick={() => setActiveTab('wishlist')} className="w-full text-xs font-black text-cyan-400 hover:text-cyan-300 transition-colors py-1.5 rounded-lg bg-cyan-500/8 hover:bg-cyan-500/15 border border-cyan-500/20 uppercase tracking-wider">
View Wishlist
{t('walletUi.stash.viewWishlist')}
</button>
</div>
)}
@ -1426,13 +1427,13 @@ export default function StashPage() {
{/* How it works */}
<div className="rounded-2xl border border-white/6 bg-white/2 p-4">
<p className="text-[10px] font-black uppercase tracking-widest text-gray-500 mb-3">How it works</p>
<p className="text-[10px] font-black uppercase tracking-widest text-gray-500 mb-3">{t('walletUi.stash.howItWorks')}</p>
<ul className="space-y-2">
{[
{ icon: '✏️', text: 'Edit items with the pen button' },
{ icon: '🏪', text: 'List for sale with the store button' },
{ icon: '📸', text: 'Add photos for better trade offers' },
{ icon: '🔑', text: 'Nostr key syncs to all devices' },
{ icon: '✏️', text: t('walletUi.stash.tipEditItems') },
{ icon: '🏪', text: t('walletUi.stash.tipListForSale') },
{ icon: '📸', text: t('walletUi.stash.tipAddPhotos') },
{ icon: '🔑', text: t('walletUi.stash.tipKeySyncs') },
].map(({ icon, text }) => (
<li key={text} className="flex items-start gap-2.5">
<span className="text-sm flex-shrink-0 mt-0.5">{icon}</span>
@ -1453,8 +1454,8 @@ export default function StashPage() {
<ShoppingCart className="h-5 w-5 text-white" />
</div>
<div className="flex-1 min-w-0">
<p className="text-sm font-black text-white leading-none">{hasForSale} item{hasForSale > 1 ? 's' : ''} ready to sell</p>
<p className="text-xs text-[#ff6600]/80 mt-0.5">Tap to go to Marketplace →</p>
<p className="text-sm font-black text-white leading-none">{t('walletUi.stash.itemsReadyToSell', { count: hasForSale })}</p>
<p className="text-xs text-[#ff6600]/80 mt-0.5">{t('walletUi.stash.tapToMarketplace')}</p>
</div>
</div>
</Link>