From 32c18a6d0f373c8665df067415854a68fa98797e Mon Sep 17 00:00:00 2001 From: jtrzupek Date: Wed, 10 Jun 2026 10:11:10 +0200 Subject: [PATCH] fix(mobile): English long-press action labels + clean thumb error placeholder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bug-report c25e9b55: long-press scene actions were in Polish — translate menu, banner and confirm dialogs to English. Thumb 'error' state (e.g. expired sxyprn thumbnail 404) now shows the same 🎬 placeholder as 'empty' instead of a ⚠ broken glyph (bug 2026-06-10). Co-Authored-By: Claude Opus 4.8 --- mobile/src/SceneActionsContext.tsx | 30 +++++++++++++++--------------- mobile/src/components/Thumb.tsx | 4 +++- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/mobile/src/SceneActionsContext.tsx b/mobile/src/SceneActionsContext.tsx index e92f95f..3336d93 100644 --- a/mobile/src/SceneActionsContext.tsx +++ b/mobile/src/SceneActionsContext.tsx @@ -49,17 +49,17 @@ export function SceneActionsProvider({ children }: { children: React.ReactNode } const hide = React.useCallback( (scene: SceneOut) => { - Alert.alert('Ukryć scenę?', scene.title, [ - { text: 'Anuluj', style: 'cancel' }, + Alert.alert('Hide scene?', scene.title, [ + { text: 'Cancel', style: 'cancel' }, { - text: 'Ukryj', + text: 'Hide', style: 'destructive', onPress: async () => { try { await client.hideScene(scene.id); invalidate(); } catch (e: any) { - Alert.alert('Nie udało się ukryć', e?.message || 'unknown error'); + Alert.alert('Failed to hide', e?.message || 'unknown error'); } }, }, @@ -71,10 +71,10 @@ export function SceneActionsProvider({ children }: { children: React.ReactNode } const openActions = React.useCallback( (scene: SceneOut) => { if (pendingDuplicate) return; // w trakcie wyboru duplikatu — ignoruj - Alert.alert(scene.title, 'Akcje sceny', [ - { text: 'Ukryj scenę', style: 'destructive', onPress: () => hide(scene) }, - { text: 'Oznacz jako duplikat', onPress: () => setPending(scene) }, - { text: 'Anuluj', style: 'cancel' }, + Alert.alert(scene.title, 'Scene actions', [ + { text: 'Hide scene', style: 'destructive', onPress: () => hide(scene) }, + { text: 'Mark as duplicate', onPress: () => setPending(scene) }, + { text: 'Cancel', style: 'cancel' }, ]); }, [pendingDuplicate, hide], @@ -88,19 +88,19 @@ export function SceneActionsProvider({ children }: { children: React.ReactNode } return; } Alert.alert( - 'Scalić duplikat?', - `„${dup.title}"\n\nscalić w\n\n„${target.title}"`, + 'Merge duplicate?', + `"${dup.title}"\n\nmerge into\n\n"${target.title}"`, [ - { text: 'Anuluj', style: 'cancel', onPress: () => setPending(null) }, + { text: 'Cancel', style: 'cancel', onPress: () => setPending(null) }, { - text: 'Scal', + text: 'Merge', onPress: async () => { try { // keep = wybrany oryginał (target), drop = długo-naciśnięty duplikat (dup) await client.mergeDuplicateScene(target.id, dup.id); invalidate(); } catch (e: any) { - Alert.alert('Scalanie nie powiodło się', e?.message || 'unknown error'); + Alert.alert('Merge failed', e?.message || 'unknown error'); } finally { setPending(null); } @@ -132,10 +132,10 @@ export function SceneActionsProvider({ children }: { children: React.ReactNode } - Wybierz oryginał — dotknij scenę, w którą scalić „{pendingDuplicate.title}" + Pick the original — tap the scene to merge "{pendingDuplicate.title}" into - Anuluj + Cancel diff --git a/mobile/src/components/Thumb.tsx b/mobile/src/components/Thumb.tsx index 8422ac3..1b1f097 100644 --- a/mobile/src/components/Thumb.tsx +++ b/mobile/src/components/Thumb.tsx @@ -55,7 +55,9 @@ export function Thumb({ url, style, contentFit = 'cover', emptyGlyph = '🎬' }: {status === 'error' && ( - + {/* Błąd ładowania (np. wygasła sxyprn/trafficdeposit miniaturka, 404) → + czysty placeholder jak 'empty', nie alarmowe ⚠ (bug 2026-06-10). */} + {emptyGlyph} )}