From 52eff36bce35af5c70ce1983f68551bfe1d76e3c Mon Sep 17 00:00:00 2001 From: SkateSpots Date: Sat, 3 Oct 2026 10:03:48 +0700 Subject: [PATCH] i18n/a11y polish: translate StashPage, honest Pro-activation copy, contrast MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - StashPage: Friends only / Add to Wishlist / Add Item / Edit Item / Public stash / Uploading… / Add Photos / placeholders / item count / list-grid aria labels now go through t() (t added to the sub-components). - Manual Pro copy no longer claims the pass is already active: it says the pass activates once the provider confirms the payment. - Bumped low-contrast gray-600 guidance text to gray-400 (DM empty state, E2EE note, stash item count). --- src/i18n/batch3/sasquatchUi.ts | 8 ++++---- src/i18n/en.ts | 13 +++++++++++++ src/i18n/es.ts | 13 +++++++++++++ src/pages/ConversationPage.tsx | 4 ++-- src/pages/StashPage.tsx | 27 +++++++++++++++------------ 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/i18n/batch3/sasquatchUi.ts b/src/i18n/batch3/sasquatchUi.ts index 64ad7c7..51ef174 100644 --- a/src/i18n/batch3/sasquatchUi.ts +++ b/src/i18n/batch3/sasquatchUi.ts @@ -64,9 +64,9 @@ const sasquatchUi = { perk2: 'Action drafts: list gear, post a skate status, plan a trip — you confirm before anything publishes', perk3: 'Answers use your personal context, not just public data', perk4: '⚡ Directly support SkateSpots & keep it free and ad-free', - welcomeTitle: 'Welcome to Sasquatch Pro! 🦧⚡', + welcomeTitle: 'Thanks for supporting Sasquatch Pro! 🦧⚡', welcomeDesc: - 'Your pass is active — a receipt just landed in your DMs. Thanks for keeping the streets free.', + 'Payment sent — your pass activates once the provider confirms it (usually within a minute). Thanks for keeping the streets free.', invoiceCopied: 'Invoice copied', dialogDesc: 'Supercharge your AI skate guide. 100% funds a free, no-ads community app.', proSupporter: "You're a Pro supporter ⚡", @@ -195,9 +195,9 @@ const sasquatchUi = { perk2: 'Borradores de acciones: publica material, comparte tu estado de skate, planifica un viaje — tú confirmas antes de que se publique nada', perk3: 'Las respuestas usan tu contexto personal, no solo datos públicos', perk4: '⚡ Apoya directamente a SkateSpots y ayúdanos a mantenerla gratis y sin anuncios', - welcomeTitle: '¡Bienvenido a Sasquatch Pro! 🦧⚡', + welcomeTitle: '¡Gracias por apoyar Sasquatch Pro! 🦧⚡', welcomeDesc: - 'Tu pase está activo — acaba de llegar un recibo a tus MD. Gracias por mantener las calles libres.', + 'Pago enviado: tu pase se activa cuando el proveedor lo confirme (normalmente en un minuto). Gracias por mantener las calles libres.', invoiceCopied: 'Factura copiada', dialogDesc: 'Potencia tu guía de skate con IA. El 100 % financia una app comunitaria gratis y sin anuncios.', proSupporter: 'Eres un colaborador Pro ⚡', diff --git a/src/i18n/en.ts b/src/i18n/en.ts index 8f6d1af..fc6b5e6 100644 --- a/src/i18n/en.ts +++ b/src/i18n/en.ts @@ -6285,6 +6285,19 @@ walletUi: { sortValue: 'Value', sortCondition: 'Condition', sortAz: 'A–Z', + friendsOnly: 'Friends only', + addToWishlist: 'Add to Wishlist', + addItemToStash: 'Add Item to Stash', + addItem: 'Add Item', + editItem: 'Edit Item', + publicStash: 'Public stash', + listView: 'List view', + gridView: 'Grid view', + uploading: 'Uploading...', + addPhotos: 'Add Photos', + wishlistReqPlaceholder: 'Any specific requirements...', + itemDescPlaceholder: 'Describe the item, any damage...', + itemsCount: '{{count}} item(s)', wishlistEmpty: 'Wishlist Empty', wishlistEmptyDesc: "Add gear you're hunting for — we'll match you with friends' stashes.", stashEmpty: 'Your Stash is Empty', diff --git a/src/i18n/es.ts b/src/i18n/es.ts index f870be3..22ef0aa 100644 --- a/src/i18n/es.ts +++ b/src/i18n/es.ts @@ -6285,6 +6285,19 @@ walletUi: { sortValue: 'Valor', sortCondition: 'Estado', sortAz: 'A–Z', + friendsOnly: 'Solo amigos', + addToWishlist: 'Añadir a la lista de deseos', + addItemToStash: 'Añadir artículo al stash', + addItem: 'Añadir artículo', + editItem: 'Editar artículo', + publicStash: 'Stash público', + listView: 'Vista de lista', + gridView: 'Vista de cuadrícula', + uploading: 'Subiendo...', + addPhotos: 'Añadir fotos', + wishlistReqPlaceholder: '¿Algún requisito concreto?', + itemDescPlaceholder: 'Describe el artículo, daños...', + itemsCount: '{{count}} artículo(s)', wishlistEmpty: 'Lista de deseos vacía', wishlistEmptyDesc: 'Añade el material que buscas — te emparejaremos con los stashes de tus amigos.', stashEmpty: 'Tu stash está vacío', diff --git a/src/pages/ConversationPage.tsx b/src/pages/ConversationPage.tsx index a3dd39d..a71702c 100644 --- a/src/pages/ConversationPage.tsx +++ b/src/pages/ConversationPage.tsx @@ -434,7 +434,7 @@ export default function ConversationPage() { ) : (

{t('socialUi.dms.emptyTitle')}

-

+

{t('socialUi.conversation.startThread')}

@@ -466,7 +466,7 @@ export default function ConversationPage() { )} -

+

{t('socialUi.conversation.e2eeNote')}

{/* A 1:1 NIP-17 DM encrypts + signs to the recipient AND to yourself diff --git a/src/pages/StashPage.tsx b/src/pages/StashPage.tsx index a86ea99..627e1b3 100644 --- a/src/pages/StashPage.tsx +++ b/src/pages/StashPage.tsx @@ -185,6 +185,7 @@ function StashItemCard({ item, onEdit, onDelete, onListOnMarketplace, isWTB = fa item: StashItem; onEdit: () => void; onDelete: () => void; onListOnMarketplace?: () => void; isWTB?: boolean; selectable?: boolean; selected?: boolean; onToggleSelect?: () => void; }) { + const { t } = useTranslation(); const category = STASH_CATEGORIES[item.category]; const condition = CONDITION_LABELS[item.condition]; const rarity = (item.rarity || category.rarity) as keyof typeof RARITY_COLORS; @@ -279,7 +280,7 @@ function StashItemCard({ item, onEdit, onDelete, onListOnMarketplace, isWTB = fa )}
{item.visibility === 'private' && Private} - {item.visibility === 'friends' && Friends only} + {item.visibility === 'friends' && {t('walletUi.stash.friendsOnly')}} {item.willingToTrade && } {item.willingToSell && !isWTB && }
@@ -291,6 +292,7 @@ function StashItemCard({ item, onEdit, onDelete, onListOnMarketplace, isWTB = fa // ─── Add Item Dialog ────────────────────────────────────────────────────────── function AddItemDialog({ onAdd, mode = 'stash', trigger }: { onAdd: (item: Omit) => void; mode?: 'stash' | 'wtb'; trigger?: React.ReactNode }) { + const { t } = useTranslation(); const [open, setOpen] = useState(false); const isWTB = mode === 'wtb'; const fileInputRef = useRef(null); @@ -336,7 +338,7 @@ function AddItemDialog({ onAdd, mode = 'stash', trigger }: { onAdd: (item: Omit< }; const defaultTrigger = isWTB ? ( - + ) : ( ); @@ -347,7 +349,7 @@ function AddItemDialog({ onAdd, mode = 'stash', trigger }: { onAdd: (item: Omit< - {isWTB ? <>Add to Wishlist : <>Add Item to Stash} + {isWTB ? <>{t('walletUi.stash.addToWishlist')} : <>{t('walletUi.stash.addItemToStash')}} {isWTB ? "Add items you're looking for." : "Add gear to your encrypted private inventory."} @@ -386,7 +388,7 @@ function AddItemDialog({ onAdd, mode = 'stash', trigger }: { onAdd: (item: Omit<
-