From 9bf8632aa3799ef9b8e5babeffdbda8e4cfea12e Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Thu, 19 Mar 2026 08:12:02 +0000 Subject: [PATCH 01/17] Announce search suggestions and results for screen readers Use useAccessibilityAnnouncement and useDebouncedAccessibilityAnnouncement hooks to announce result counts in SelectionList and suggestion counts in AutoCompleteSuggestions for screen reader users. Add translation keys for both English and Spanish. Co-authored-by: Situ Chandra Shil --- .../BaseAutoCompleteSuggestions.tsx | 8 ++++++++ src/components/SelectionList/BaseSelectionList.tsx | 7 +++++++ src/languages/en.ts | 2 ++ src/languages/es.ts | 2 ++ 4 files changed, 19 insertions(+) diff --git a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx index 0cd97ef55eb6..797e1afeaeab 100644 --- a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx +++ b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx @@ -4,6 +4,8 @@ import {FlatList} from 'react-native-gesture-handler'; import Animated, {Easing, useAnimatedStyle, useSharedValue, withTiming} from 'react-native-reanimated'; import ColorSchemeWrapper from '@components/ColorSchemeWrapper'; import PressableWithFeedback from '@components/Pressable/PressableWithFeedback'; +import useAccessibilityAnnouncement from '@hooks/useAccessibilityAnnouncement'; +import useLocalize from '@hooks/useLocalize'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import {hasHoverSupport} from '@libs/DeviceCapabilities'; @@ -23,11 +25,17 @@ function BaseAutoCompleteSuggestions({ measuredHeightOfSuggestionRows, }: ExternalProps) { const styles = useThemeStyles(); + const {translate} = useLocalize(); const StyleUtils = useStyleUtils(); const rowHeight = useSharedValue(0); const prevRowHeightRef = useRef(measuredHeightOfSuggestionRows); const fadeInOpacity = useSharedValue(0); const scrollRef = useRef>(null); + + useAccessibilityAnnouncement(translate('common.suggestionsAvailable', suggestions.length), suggestions.length > 0, { + shouldAnnounceOnNative: true, + shouldAnnounceOnWeb: true, + }); /** * Render a suggestion menu item component. */ diff --git a/src/components/SelectionList/BaseSelectionList.tsx b/src/components/SelectionList/BaseSelectionList.tsx index 1969beccbbe0..035bbdec5162 100644 --- a/src/components/SelectionList/BaseSelectionList.tsx +++ b/src/components/SelectionList/BaseSelectionList.tsx @@ -10,8 +10,10 @@ import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types'; import useActiveElementRole from '@hooks/useActiveElementRole'; import useArrowKeyFocusManager from '@hooks/useArrowKeyFocusManager'; import useDebounce from '@hooks/useDebounce'; +import useDebouncedAccessibilityAnnouncement from '@hooks/useDebouncedAccessibilityAnnouncement'; import useKeyboardShortcut from '@hooks/useKeyboardShortcut'; import useKeyboardState from '@hooks/useKeyboardState'; +import useLocalize from '@hooks/useLocalize'; import useSafeAreaPaddings from '@hooks/useSafeAreaPaddings'; import useScrollEnabled from '@hooks/useScrollEnabled'; import useSingleExecution from '@hooks/useSingleExecution'; @@ -95,6 +97,7 @@ function BaseSelectionList({ setShouldDisableHoverStyle = () => {}, }: SelectionListProps) { const styles = useThemeStyles(); + const {translate} = useLocalize(); const isFocused = useIsFocused(); const scrollEnabled = useScrollEnabled(); const {singleExecution} = useSingleExecution(); @@ -102,6 +105,10 @@ function BaseSelectionList({ const {isKeyboardShown} = useKeyboardState(); const {safeAreaPaddingBottomStyle} = useSafeAreaPaddings(); + const searchValue = textInputOptions?.value ?? ''; + const resultsMessage = shouldShowTextInput && data.length > 0 ? translate('common.resultsAvailable', data.length) : ''; + useDebouncedAccessibilityAnnouncement(resultsMessage, shouldShowTextInput && data.length > 0, searchValue); + const innerTextInputRef = useRef(null); const isTextInputFocusedRef = useRef(false); const hasKeyBeenPressed = useRef(false); diff --git a/src/languages/en.ts b/src/languages/en.ts index 5060d081a79e..a08c3b28bafd 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -253,6 +253,8 @@ const translations = { na: 'N/A', noResultsFound: 'No results found', noResultsFoundMatching: (searchString: string) => `No results found matching "${searchString}"`, + resultsAvailable: (count: number) => `${count} ${count === 1 ? 'result' : 'results'} available`, + suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'suggestion' : 'suggestions'} available`, recentDestinations: 'Recent destinations', timePrefix: "It's", conjunctionFor: 'for', diff --git a/src/languages/es.ts b/src/languages/es.ts index 473af9bd2183..1e2646ab50a6 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -156,6 +156,8 @@ const translations: TranslationDeepObject = { na: 'N/A', noResultsFound: 'No se han encontrado resultados', noResultsFoundMatching: (searchString: string) => `No se encontraron resultados que coincidan con "${searchString}"`, + resultsAvailable: (count: number) => `${count} ${count === 1 ? 'resultado disponible' : 'resultados disponibles'}`, + suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'sugerencia disponible' : 'sugerencias disponibles'}`, recentDestinations: 'Destinos recientes', timePrefix: 'Son las', conjunctionFor: 'para', From 8e172005c25a644e138209e155c76081d6aaadf6 Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Thu, 19 Mar 2026 08:16:47 +0000 Subject: [PATCH 02/17] Fix: Add missing sentryLabel prop to PressableWithFeedback Co-authored-by: Situ Chandra Shil --- .../AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx index 797e1afeaeab..1794d5ef05bb 100644 --- a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx +++ b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx @@ -48,6 +48,7 @@ function BaseAutoCompleteSuggestions({ onPress={() => onSelect(index)} onLongPress={() => {}} accessibilityLabel={accessibilityLabelExtractor(item, index)} + sentryLabel="BaseAutoCompleteSuggestions-suggestionItem" role={CONST.ROLE.MENUITEM} > {renderSuggestionMenuItem(item, index)} From 569fd2d358d3535b738d15282c2fdf506d3e94b6 Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Thu, 19 Mar 2026 08:29:15 +0000 Subject: [PATCH 03/17] Add missing resultsAvailable and suggestionsAvailable translation keys These keys were added to en.ts and es.ts but were missing from de, fr, it, ja, nl, pl, pt-BR, and zh-hans, causing typecheck failures. Co-authored-by: Situ Chandra Shil --- src/languages/de.ts | 4 +++- src/languages/fr.ts | 2 ++ src/languages/it.ts | 2 ++ src/languages/ja.ts | 2 ++ src/languages/nl.ts | 2 ++ src/languages/pl.ts | 2 ++ src/languages/pt-BR.ts | 2 ++ src/languages/zh-hans.ts | 4 +++- 8 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index c61d6b1b63ef..ea426ea17bb5 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -249,7 +249,9 @@ const translations: TranslationDeepObject = { send: 'Senden', na: 'k. A.', noResultsFound: 'Keine Ergebnisse gefunden', - noResultsFoundMatching: (searchString: string) => `Keine Ergebnisse gefunden für „${searchString}“`, + noResultsFoundMatching: (searchString: string) => `Keine Ergebnisse gefunden für „${searchString}”`, + resultsAvailable: (count: number) => `${count} ${count === 1 ? 'Ergebnis' : 'Ergebnisse'} verfügbar`, + suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'Vorschlag' : 'Vorschläge'} verfügbar`, recentDestinations: 'Letzte Ziele', timePrefix: 'Es ist', conjunctionFor: 'für', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index b8a983266478..ecff6ed5ae11 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -250,6 +250,8 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Aucun résultat trouvé', noResultsFoundMatching: (searchString: string) => `Aucun résultat trouvé correspondant à « ${searchString} »`, + resultsAvailable: (count: number) => `${count} ${count === 1 ? 'résultat disponible' : 'résultats disponibles'}`, + suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'suggestion disponible' : 'suggestions disponibles'}`, recentDestinations: 'Destinations récentes', timePrefix: "C'est", conjunctionFor: 'pour', diff --git a/src/languages/it.ts b/src/languages/it.ts index 7f8f6e3da63f..074be41efbf1 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -250,6 +250,8 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nessun risultato trovato', noResultsFoundMatching: (searchString: string) => `Nessun risultato trovato per "${searchString}"`, + resultsAvailable: (count: number) => `${count} ${count === 1 ? 'risultato disponibile' : 'risultati disponibili'}`, + suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'suggerimento disponibile' : 'suggerimenti disponibili'}`, recentDestinations: 'Destinazioni recenti', timePrefix: 'È', conjunctionFor: 'per', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index f0eb78726e63..9c277fc38dba 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -250,6 +250,8 @@ const translations: TranslationDeepObject = { na: '該当なし', noResultsFound: '結果が見つかりません', noResultsFoundMatching: (searchString: string) => `"${searchString}" に一致する結果は見つかりませんでした`, + resultsAvailable: (count: number) => `${count}件の結果が利用可能`, + suggestionsAvailable: (count: number) => `${count}件の候補が利用可能`, recentDestinations: '最近の宛先', timePrefix: 'それは', conjunctionFor: '〜用', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index e96c2a8a8588..b10aaec458ca 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -250,6 +250,8 @@ const translations: TranslationDeepObject = { na: 'n.v.t.', noResultsFound: 'Geen resultaten gevonden', noResultsFoundMatching: (searchString: string) => `Geen resultaten gevonden voor "${searchString}"`, + resultsAvailable: (count: number) => `${count} ${count === 1 ? 'resultaat' : 'resultaten'} beschikbaar`, + suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'suggestie' : 'suggesties'} beschikbaar`, recentDestinations: 'Recente bestemmingen', timePrefix: 'Het is', conjunctionFor: 'voor', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index bc7504d73362..8883d9684946 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -250,6 +250,8 @@ const translations: TranslationDeepObject = { na: 'ND dotyczy', noResultsFound: 'Nie znaleziono wyników', noResultsFoundMatching: (searchString: string) => `Nie znaleziono wyników pasujących do „${searchString}”`, + resultsAvailable: (count: number) => `${count} ${count === 1 ? 'wynik dostępny' : 'wyników dostępnych'}`, + suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'sugestia dostępna' : 'sugestii dostępnych'}`, recentDestinations: 'Ostatnie miejsca docelowe', timePrefix: 'To jest', conjunctionFor: 'dla', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index c882118bb910..22ce7379e21d 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -250,6 +250,8 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nenhum resultado encontrado', noResultsFoundMatching: (searchString: string) => `Nenhum resultado encontrado para "${searchString}"`, + resultsAvailable: (count: number) => `${count} ${count === 1 ? 'resultado disponível' : 'resultados disponíveis'}`, + suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'sugestão disponível' : 'sugestões disponíveis'}`, recentDestinations: 'Destinos recentes', timePrefix: 'É', conjunctionFor: 'para', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index b4670f8f9edd..6fee837e03ad 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -249,7 +249,9 @@ const translations: TranslationDeepObject = { send: '发送', na: '不适用', noResultsFound: '未找到结果', - noResultsFoundMatching: (searchString: string) => `未找到与“${searchString}”匹配的结果`, + noResultsFoundMatching: (searchString: string) => `未找到与”${searchString}”匹配的结果`, + resultsAvailable: (count: number) => `${count}个结果可用`, + suggestionsAvailable: (count: number) => `${count}个建议可用`, recentDestinations: '最近目的地', timePrefix: '它是', conjunctionFor: '用于', From 59c8e7ae25a40c91a883a962a673e6281c9c737c Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Thu, 19 Mar 2026 17:03:18 +0000 Subject: [PATCH 04/17] Use one/other plural translation objects for resultsAvailable and suggestionsAvailable Co-authored-by: Situ Chandra Shil --- .../BaseAutoCompleteSuggestions.tsx | 2 +- src/components/SelectionList/BaseSelectionList.tsx | 2 +- src/languages/de.ts | 10 ++++++++-- src/languages/en.ts | 10 ++++++++-- src/languages/es.ts | 10 ++++++++-- src/languages/fr.ts | 10 ++++++++-- src/languages/it.ts | 10 ++++++++-- src/languages/ja.ts | 8 ++++++-- src/languages/nl.ts | 10 ++++++++-- src/languages/pl.ts | 10 ++++++++-- src/languages/pt-BR.ts | 10 ++++++++-- src/languages/zh-hans.ts | 8 ++++++-- 12 files changed, 78 insertions(+), 22 deletions(-) diff --git a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx index 1794d5ef05bb..c85d8eb4a6d0 100644 --- a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx +++ b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx @@ -32,7 +32,7 @@ function BaseAutoCompleteSuggestions({ const fadeInOpacity = useSharedValue(0); const scrollRef = useRef>(null); - useAccessibilityAnnouncement(translate('common.suggestionsAvailable', suggestions.length), suggestions.length > 0, { + useAccessibilityAnnouncement(translate('common.suggestionsAvailable', {count: suggestions.length}), suggestions.length > 0, { shouldAnnounceOnNative: true, shouldAnnounceOnWeb: true, }); diff --git a/src/components/SelectionList/BaseSelectionList.tsx b/src/components/SelectionList/BaseSelectionList.tsx index 035bbdec5162..b96cf03eb6b4 100644 --- a/src/components/SelectionList/BaseSelectionList.tsx +++ b/src/components/SelectionList/BaseSelectionList.tsx @@ -106,7 +106,7 @@ function BaseSelectionList({ const {safeAreaPaddingBottomStyle} = useSafeAreaPaddings(); const searchValue = textInputOptions?.value ?? ''; - const resultsMessage = shouldShowTextInput && data.length > 0 ? translate('common.resultsAvailable', data.length) : ''; + const resultsMessage = shouldShowTextInput && data.length > 0 ? translate('common.resultsAvailable', {count: data.length}) : ''; useDebouncedAccessibilityAnnouncement(resultsMessage, shouldShowTextInput && data.length > 0, searchValue); const innerTextInputRef = useRef(null); diff --git a/src/languages/de.ts b/src/languages/de.ts index ea426ea17bb5..11a0e7e441ca 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -250,8 +250,14 @@ const translations: TranslationDeepObject = { na: 'k. A.', noResultsFound: 'Keine Ergebnisse gefunden', noResultsFoundMatching: (searchString: string) => `Keine Ergebnisse gefunden für „${searchString}”`, - resultsAvailable: (count: number) => `${count} ${count === 1 ? 'Ergebnis' : 'Ergebnisse'} verfügbar`, - suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'Vorschlag' : 'Vorschläge'} verfügbar`, + resultsAvailable: () => ({ + one: '1 Ergebnis verfügbar', + other: (count: number) => `${count} Ergebnisse verfügbar`, + }), + suggestionsAvailable: () => ({ + one: '1 Vorschlag verfügbar', + other: (count: number) => `${count} Vorschläge verfügbar`, + }), recentDestinations: 'Letzte Ziele', timePrefix: 'Es ist', conjunctionFor: 'für', diff --git a/src/languages/en.ts b/src/languages/en.ts index a08c3b28bafd..d896640fd503 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -253,8 +253,14 @@ const translations = { na: 'N/A', noResultsFound: 'No results found', noResultsFoundMatching: (searchString: string) => `No results found matching "${searchString}"`, - resultsAvailable: (count: number) => `${count} ${count === 1 ? 'result' : 'results'} available`, - suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'suggestion' : 'suggestions'} available`, + resultsAvailable: () => ({ + one: '1 result available', + other: (count: number) => `${count} results available`, + }), + suggestionsAvailable: () => ({ + one: '1 suggestion available', + other: (count: number) => `${count} suggestions available`, + }), recentDestinations: 'Recent destinations', timePrefix: "It's", conjunctionFor: 'for', diff --git a/src/languages/es.ts b/src/languages/es.ts index 1e2646ab50a6..23622e04a867 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -156,8 +156,14 @@ const translations: TranslationDeepObject = { na: 'N/A', noResultsFound: 'No se han encontrado resultados', noResultsFoundMatching: (searchString: string) => `No se encontraron resultados que coincidan con "${searchString}"`, - resultsAvailable: (count: number) => `${count} ${count === 1 ? 'resultado disponible' : 'resultados disponibles'}`, - suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'sugerencia disponible' : 'sugerencias disponibles'}`, + resultsAvailable: () => ({ + one: '1 resultado disponible', + other: (count: number) => `${count} resultados disponibles`, + }), + suggestionsAvailable: () => ({ + one: '1 sugerencia disponible', + other: (count: number) => `${count} sugerencias disponibles`, + }), recentDestinations: 'Destinos recientes', timePrefix: 'Son las', conjunctionFor: 'para', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index ecff6ed5ae11..b711d3d82926 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -250,8 +250,14 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Aucun résultat trouvé', noResultsFoundMatching: (searchString: string) => `Aucun résultat trouvé correspondant à « ${searchString} »`, - resultsAvailable: (count: number) => `${count} ${count === 1 ? 'résultat disponible' : 'résultats disponibles'}`, - suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'suggestion disponible' : 'suggestions disponibles'}`, + resultsAvailable: () => ({ + one: '1 résultat disponible', + other: (count: number) => `${count} résultats disponibles`, + }), + suggestionsAvailable: () => ({ + one: '1 suggestion disponible', + other: (count: number) => `${count} suggestions disponibles`, + }), recentDestinations: 'Destinations récentes', timePrefix: "C'est", conjunctionFor: 'pour', diff --git a/src/languages/it.ts b/src/languages/it.ts index 074be41efbf1..36b9beefcef9 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -250,8 +250,14 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nessun risultato trovato', noResultsFoundMatching: (searchString: string) => `Nessun risultato trovato per "${searchString}"`, - resultsAvailable: (count: number) => `${count} ${count === 1 ? 'risultato disponibile' : 'risultati disponibili'}`, - suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'suggerimento disponibile' : 'suggerimenti disponibili'}`, + resultsAvailable: () => ({ + one: '1 risultato disponibile', + other: (count: number) => `${count} risultati disponibili`, + }), + suggestionsAvailable: () => ({ + one: '1 suggerimento disponibile', + other: (count: number) => `${count} suggerimenti disponibili`, + }), recentDestinations: 'Destinazioni recenti', timePrefix: 'È', conjunctionFor: 'per', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 9c277fc38dba..3fb8af36026a 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -250,8 +250,12 @@ const translations: TranslationDeepObject = { na: '該当なし', noResultsFound: '結果が見つかりません', noResultsFoundMatching: (searchString: string) => `"${searchString}" に一致する結果は見つかりませんでした`, - resultsAvailable: (count: number) => `${count}件の結果が利用可能`, - suggestionsAvailable: (count: number) => `${count}件の候補が利用可能`, + resultsAvailable: () => ({ + other: (count: number) => `${count}件の結果が利用可能`, + }), + suggestionsAvailable: () => ({ + other: (count: number) => `${count}件の候補が利用可能`, + }), recentDestinations: '最近の宛先', timePrefix: 'それは', conjunctionFor: '〜用', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index b10aaec458ca..15a6517a6e8b 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -250,8 +250,14 @@ const translations: TranslationDeepObject = { na: 'n.v.t.', noResultsFound: 'Geen resultaten gevonden', noResultsFoundMatching: (searchString: string) => `Geen resultaten gevonden voor "${searchString}"`, - resultsAvailable: (count: number) => `${count} ${count === 1 ? 'resultaat' : 'resultaten'} beschikbaar`, - suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'suggestie' : 'suggesties'} beschikbaar`, + resultsAvailable: () => ({ + one: '1 resultaat beschikbaar', + other: (count: number) => `${count} resultaten beschikbaar`, + }), + suggestionsAvailable: () => ({ + one: '1 suggestie beschikbaar', + other: (count: number) => `${count} suggesties beschikbaar`, + }), recentDestinations: 'Recente bestemmingen', timePrefix: 'Het is', conjunctionFor: 'voor', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 8883d9684946..5a0fb4758674 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -250,8 +250,14 @@ const translations: TranslationDeepObject = { na: 'ND dotyczy', noResultsFound: 'Nie znaleziono wyników', noResultsFoundMatching: (searchString: string) => `Nie znaleziono wyników pasujących do „${searchString}”`, - resultsAvailable: (count: number) => `${count} ${count === 1 ? 'wynik dostępny' : 'wyników dostępnych'}`, - suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'sugestia dostępna' : 'sugestii dostępnych'}`, + resultsAvailable: () => ({ + one: '1 wynik dostępny', + other: (count: number) => `${count} wyników dostępnych`, + }), + suggestionsAvailable: () => ({ + one: '1 sugestia dostępna', + other: (count: number) => `${count} sugestii dostępnych`, + }), recentDestinations: 'Ostatnie miejsca docelowe', timePrefix: 'To jest', conjunctionFor: 'dla', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 22ce7379e21d..b0b4a236c040 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -250,8 +250,14 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nenhum resultado encontrado', noResultsFoundMatching: (searchString: string) => `Nenhum resultado encontrado para "${searchString}"`, - resultsAvailable: (count: number) => `${count} ${count === 1 ? 'resultado disponível' : 'resultados disponíveis'}`, - suggestionsAvailable: (count: number) => `${count} ${count === 1 ? 'sugestão disponível' : 'sugestões disponíveis'}`, + resultsAvailable: () => ({ + one: '1 resultado disponível', + other: (count: number) => `${count} resultados disponíveis`, + }), + suggestionsAvailable: () => ({ + one: '1 sugestão disponível', + other: (count: number) => `${count} sugestões disponíveis`, + }), recentDestinations: 'Destinos recentes', timePrefix: 'É', conjunctionFor: 'para', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 6fee837e03ad..f3a3b57adcc8 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -250,8 +250,12 @@ const translations: TranslationDeepObject = { na: '不适用', noResultsFound: '未找到结果', noResultsFoundMatching: (searchString: string) => `未找到与”${searchString}”匹配的结果`, - resultsAvailable: (count: number) => `${count}个结果可用`, - suggestionsAvailable: (count: number) => `${count}个建议可用`, + resultsAvailable: () => ({ + other: (count: number) => `${count}个结果可用`, + }), + suggestionsAvailable: () => ({ + other: (count: number) => `${count}个建议可用`, + }), recentDestinations: '最近目的地', timePrefix: '它是', conjunctionFor: '用于', From cfbf7c88997eff4da94e0c795ab0ab138e389a54 Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Thu, 19 Mar 2026 17:22:26 +0000 Subject: [PATCH 05/17] Fix generateTranslations check by using simple function pattern for accessibility translations The generateTranslations script's incremental mode cannot handle arrow function wrappers like () => ({one: ..., other: ...}). Changed resultsAvailable and suggestionsAvailable to use ({count}) => template string pattern instead, and removed manual translations from non-English files to let the script generate them. Co-authored-by: Situ Chandra Shil --- src/languages/de.ts | 8 -------- src/languages/en.ts | 10 ++-------- src/languages/es.ts | 8 -------- src/languages/fr.ts | 8 -------- src/languages/it.ts | 8 -------- src/languages/ja.ts | 6 ------ src/languages/nl.ts | 8 -------- src/languages/pl.ts | 8 -------- src/languages/pt-BR.ts | 8 -------- src/languages/zh-hans.ts | 6 ------ 10 files changed, 2 insertions(+), 76 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index 11a0e7e441ca..ec503deb1885 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -250,14 +250,6 @@ const translations: TranslationDeepObject = { na: 'k. A.', noResultsFound: 'Keine Ergebnisse gefunden', noResultsFoundMatching: (searchString: string) => `Keine Ergebnisse gefunden für „${searchString}”`, - resultsAvailable: () => ({ - one: '1 Ergebnis verfügbar', - other: (count: number) => `${count} Ergebnisse verfügbar`, - }), - suggestionsAvailable: () => ({ - one: '1 Vorschlag verfügbar', - other: (count: number) => `${count} Vorschläge verfügbar`, - }), recentDestinations: 'Letzte Ziele', timePrefix: 'Es ist', conjunctionFor: 'für', diff --git a/src/languages/en.ts b/src/languages/en.ts index d896640fd503..be113903e602 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -253,14 +253,8 @@ const translations = { na: 'N/A', noResultsFound: 'No results found', noResultsFoundMatching: (searchString: string) => `No results found matching "${searchString}"`, - resultsAvailable: () => ({ - one: '1 result available', - other: (count: number) => `${count} results available`, - }), - suggestionsAvailable: () => ({ - one: '1 suggestion available', - other: (count: number) => `${count} suggestions available`, - }), + resultsAvailable: ({count}: {count: number}) => `${count} results available`, + suggestionsAvailable: ({count}: {count: number}) => `${count} suggestions available`, recentDestinations: 'Recent destinations', timePrefix: "It's", conjunctionFor: 'for', diff --git a/src/languages/es.ts b/src/languages/es.ts index 23622e04a867..473af9bd2183 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -156,14 +156,6 @@ const translations: TranslationDeepObject = { na: 'N/A', noResultsFound: 'No se han encontrado resultados', noResultsFoundMatching: (searchString: string) => `No se encontraron resultados que coincidan con "${searchString}"`, - resultsAvailable: () => ({ - one: '1 resultado disponible', - other: (count: number) => `${count} resultados disponibles`, - }), - suggestionsAvailable: () => ({ - one: '1 sugerencia disponible', - other: (count: number) => `${count} sugerencias disponibles`, - }), recentDestinations: 'Destinos recientes', timePrefix: 'Son las', conjunctionFor: 'para', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index b711d3d82926..b8a983266478 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -250,14 +250,6 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Aucun résultat trouvé', noResultsFoundMatching: (searchString: string) => `Aucun résultat trouvé correspondant à « ${searchString} »`, - resultsAvailable: () => ({ - one: '1 résultat disponible', - other: (count: number) => `${count} résultats disponibles`, - }), - suggestionsAvailable: () => ({ - one: '1 suggestion disponible', - other: (count: number) => `${count} suggestions disponibles`, - }), recentDestinations: 'Destinations récentes', timePrefix: "C'est", conjunctionFor: 'pour', diff --git a/src/languages/it.ts b/src/languages/it.ts index 36b9beefcef9..7f8f6e3da63f 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -250,14 +250,6 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nessun risultato trovato', noResultsFoundMatching: (searchString: string) => `Nessun risultato trovato per "${searchString}"`, - resultsAvailable: () => ({ - one: '1 risultato disponibile', - other: (count: number) => `${count} risultati disponibili`, - }), - suggestionsAvailable: () => ({ - one: '1 suggerimento disponibile', - other: (count: number) => `${count} suggerimenti disponibili`, - }), recentDestinations: 'Destinazioni recenti', timePrefix: 'È', conjunctionFor: 'per', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 3fb8af36026a..f0eb78726e63 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -250,12 +250,6 @@ const translations: TranslationDeepObject = { na: '該当なし', noResultsFound: '結果が見つかりません', noResultsFoundMatching: (searchString: string) => `"${searchString}" に一致する結果は見つかりませんでした`, - resultsAvailable: () => ({ - other: (count: number) => `${count}件の結果が利用可能`, - }), - suggestionsAvailable: () => ({ - other: (count: number) => `${count}件の候補が利用可能`, - }), recentDestinations: '最近の宛先', timePrefix: 'それは', conjunctionFor: '〜用', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 15a6517a6e8b..e96c2a8a8588 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -250,14 +250,6 @@ const translations: TranslationDeepObject = { na: 'n.v.t.', noResultsFound: 'Geen resultaten gevonden', noResultsFoundMatching: (searchString: string) => `Geen resultaten gevonden voor "${searchString}"`, - resultsAvailable: () => ({ - one: '1 resultaat beschikbaar', - other: (count: number) => `${count} resultaten beschikbaar`, - }), - suggestionsAvailable: () => ({ - one: '1 suggestie beschikbaar', - other: (count: number) => `${count} suggesties beschikbaar`, - }), recentDestinations: 'Recente bestemmingen', timePrefix: 'Het is', conjunctionFor: 'voor', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 5a0fb4758674..bc7504d73362 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -250,14 +250,6 @@ const translations: TranslationDeepObject = { na: 'ND dotyczy', noResultsFound: 'Nie znaleziono wyników', noResultsFoundMatching: (searchString: string) => `Nie znaleziono wyników pasujących do „${searchString}”`, - resultsAvailable: () => ({ - one: '1 wynik dostępny', - other: (count: number) => `${count} wyników dostępnych`, - }), - suggestionsAvailable: () => ({ - one: '1 sugestia dostępna', - other: (count: number) => `${count} sugestii dostępnych`, - }), recentDestinations: 'Ostatnie miejsca docelowe', timePrefix: 'To jest', conjunctionFor: 'dla', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index b0b4a236c040..c882118bb910 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -250,14 +250,6 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nenhum resultado encontrado', noResultsFoundMatching: (searchString: string) => `Nenhum resultado encontrado para "${searchString}"`, - resultsAvailable: () => ({ - one: '1 resultado disponível', - other: (count: number) => `${count} resultados disponíveis`, - }), - suggestionsAvailable: () => ({ - one: '1 sugestão disponível', - other: (count: number) => `${count} sugestões disponíveis`, - }), recentDestinations: 'Destinos recentes', timePrefix: 'É', conjunctionFor: 'para', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index f3a3b57adcc8..45af014e5bc2 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -250,12 +250,6 @@ const translations: TranslationDeepObject = { na: '不适用', noResultsFound: '未找到结果', noResultsFoundMatching: (searchString: string) => `未找到与”${searchString}”匹配的结果`, - resultsAvailable: () => ({ - other: (count: number) => `${count}个结果可用`, - }), - suggestionsAvailable: () => ({ - other: (count: number) => `${count}个建议可用`, - }), recentDestinations: '最近目的地', timePrefix: '它是', conjunctionFor: '用于', From df438e6e1138be729ecc005b0c537dab0e6b8fb0 Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Thu, 19 Mar 2026 17:28:21 +0000 Subject: [PATCH 06/17] Add missing resultsAvailable and suggestionsAvailable translations to all non-English language files Co-authored-by: Situ Chandra Shil --- src/languages/de.ts | 2 ++ src/languages/es.ts | 2 ++ src/languages/fr.ts | 2 ++ src/languages/it.ts | 2 ++ src/languages/ja.ts | 2 ++ src/languages/nl.ts | 2 ++ src/languages/pl.ts | 2 ++ src/languages/pt-BR.ts | 2 ++ src/languages/zh-hans.ts | 2 ++ 9 files changed, 18 insertions(+) diff --git a/src/languages/de.ts b/src/languages/de.ts index ec503deb1885..b1037dd27d94 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -524,6 +524,8 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Hallo, wie kann ich helfen?', showHistory: 'Verlauf anzeigen'}, duplicateReport: 'Duplizierten Bericht', approver: 'Genehmiger', + resultsAvailable: ({count}: {count: number}) => `${count} Ergebnisse verfügbar`, + suggestionsAvailable: ({count}: {count: number}) => `${count} Vorschläge verfügbar`, }, socials: { podcast: 'Folgen Sie uns auf Podcast', diff --git a/src/languages/es.ts b/src/languages/es.ts index 473af9bd2183..73d045ce352e 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -432,6 +432,8 @@ const translations: TranslationDeepObject = { vacationDelegate: 'Delegado de vacaciones', expensifyLogo: 'Logo de Expensify', approver: 'Aprobador', + resultsAvailable: ({count}: {count: number}) => `${count} resultados disponibles`, + suggestionsAvailable: ({count}: {count: number}) => `${count} sugerencias disponibles`, }, socials: { podcast: 'Síguenos en Podcast', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index b8a983266478..77c86f64450e 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -524,6 +524,8 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Bonjour, comment puis-je vous aider ?', showHistory: 'Afficher l’historique'}, duplicateReport: 'Note de frais en double', approver: 'Approbateur', + resultsAvailable: ({count}: {count: number}) => `${count} résultats disponibles`, + suggestionsAvailable: ({count}: {count: number}) => `${count} suggestions disponibles`, }, socials: { podcast: 'Suivez-nous sur Podcast', diff --git a/src/languages/it.ts b/src/languages/it.ts index 7f8f6e3da63f..3b77feb5a50d 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -524,6 +524,8 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Ciao, come posso aiutarti?', showHistory: 'Mostra cronologia'}, duplicateReport: 'Report duplicato', approver: 'Approvante', + resultsAvailable: ({count}: {count: number}) => `${count} risultati disponibili`, + suggestionsAvailable: ({count}: {count: number}) => `${count} suggerimenti disponibili`, }, socials: { podcast: 'Seguici su Podcast', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index f0eb78726e63..ebced9d6669f 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -523,6 +523,8 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'こんにちは、どのようにお手伝いできますか?', showHistory: '履歴を表示'}, duplicateReport: 'レポートを複製', approver: '承認者', + resultsAvailable: ({count}: {count: number}) => `${count} 件の結果があります`, + suggestionsAvailable: ({count}: {count: number}) => `${count}件の候補があります`, }, socials: { podcast: 'ポッドキャストでフォロー', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index e96c2a8a8588..b7e6339aa46e 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -523,6 +523,8 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Hoi, waarmee kan ik je helpen?', showHistory: 'Geschiedenis weergeven'}, duplicateReport: 'Dubbel rapport', approver: 'Fiatteur', + resultsAvailable: ({count}: {count: number}) => `${count} resultaten beschikbaar`, + suggestionsAvailable: ({count}: {count: number}) => `${count} suggesties beschikbaar`, }, socials: { podcast: 'Volg ons op Podcast', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index bc7504d73362..33e46efd7105 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -523,6 +523,8 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Cześć, w czym mogę pomóc?', showHistory: 'Pokaż historię'}, duplicateReport: 'Zduplikowany raport', approver: 'Osoba zatwierdzająca', + resultsAvailable: ({count}: {count: number}) => `Dostępnych wyników: ${count}`, + suggestionsAvailable: ({count}: {count: number}) => `Dostępnych podpowiedzi: ${count}`, }, socials: { podcast: 'Śledź nas na Podcast', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index c882118bb910..da0d65a13778 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -522,6 +522,8 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Oi, como posso ajudar?', showHistory: 'Mostrar histórico'}, duplicateReport: 'Duplicar relatório', approver: 'Aprovador', + resultsAvailable: ({count}: {count: number}) => `${count} resultados disponíveis`, + suggestionsAvailable: ({count}: {count: number}) => `${count} sugestões disponíveis`, }, socials: { podcast: 'Siga-nos no Podcast', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 45af014e5bc2..eb8c2e7f0d16 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -519,6 +519,8 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: '你好,我能帮你做什么?', showHistory: '显示历史'}, duplicateReport: '重复报销单', approver: '审批人', + resultsAvailable: ({count}: {count: number}) => `有 ${count} 个可用结果`, + suggestionsAvailable: ({count}: {count: number}) => `有 ${count} 条可用建议`, }, socials: { podcast: '在播客上关注我们', From 4c19e206c2973a08b054778dcd95d9c70d081a58 Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Thu, 19 Mar 2026 17:40:20 +0000 Subject: [PATCH 07/17] Use one/other plural translation objects for resultsAvailable and suggestionsAvailable Co-authored-by: Situ Chandra Shil --- src/languages/de.ts | 10 ++++++++-- src/languages/en.ts | 10 ++++++++-- src/languages/es.ts | 10 ++++++++-- src/languages/fr.ts | 10 ++++++++-- src/languages/it.ts | 10 ++++++++-- src/languages/ja.ts | 8 ++++++-- src/languages/nl.ts | 10 ++++++++-- src/languages/pl.ts | 10 ++++++++-- src/languages/pt-BR.ts | 10 ++++++++-- src/languages/zh-hans.ts | 8 ++++++-- 10 files changed, 76 insertions(+), 20 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index b1037dd27d94..c7f63da8958a 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -524,8 +524,14 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Hallo, wie kann ich helfen?', showHistory: 'Verlauf anzeigen'}, duplicateReport: 'Duplizierten Bericht', approver: 'Genehmiger', - resultsAvailable: ({count}: {count: number}) => `${count} Ergebnisse verfügbar`, - suggestionsAvailable: ({count}: {count: number}) => `${count} Vorschläge verfügbar`, + resultsAvailable: () => ({ + one: '1 Ergebnis verfügbar', + other: (count: number) => `${count} Ergebnisse verfügbar`, + }), + suggestionsAvailable: () => ({ + one: '1 Vorschlag verfügbar', + other: (count: number) => `${count} Vorschläge verfügbar`, + }), }, socials: { podcast: 'Folgen Sie uns auf Podcast', diff --git a/src/languages/en.ts b/src/languages/en.ts index be113903e602..d896640fd503 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -253,8 +253,14 @@ const translations = { na: 'N/A', noResultsFound: 'No results found', noResultsFoundMatching: (searchString: string) => `No results found matching "${searchString}"`, - resultsAvailable: ({count}: {count: number}) => `${count} results available`, - suggestionsAvailable: ({count}: {count: number}) => `${count} suggestions available`, + resultsAvailable: () => ({ + one: '1 result available', + other: (count: number) => `${count} results available`, + }), + suggestionsAvailable: () => ({ + one: '1 suggestion available', + other: (count: number) => `${count} suggestions available`, + }), recentDestinations: 'Recent destinations', timePrefix: "It's", conjunctionFor: 'for', diff --git a/src/languages/es.ts b/src/languages/es.ts index 73d045ce352e..2091813577bb 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -432,8 +432,14 @@ const translations: TranslationDeepObject = { vacationDelegate: 'Delegado de vacaciones', expensifyLogo: 'Logo de Expensify', approver: 'Aprobador', - resultsAvailable: ({count}: {count: number}) => `${count} resultados disponibles`, - suggestionsAvailable: ({count}: {count: number}) => `${count} sugerencias disponibles`, + resultsAvailable: () => ({ + one: '1 resultado disponible', + other: (count: number) => `${count} resultados disponibles`, + }), + suggestionsAvailable: () => ({ + one: '1 sugerencia disponible', + other: (count: number) => `${count} sugerencias disponibles`, + }), }, socials: { podcast: 'Síguenos en Podcast', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 77c86f64450e..d2c35fc3916f 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -524,8 +524,14 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Bonjour, comment puis-je vous aider ?', showHistory: 'Afficher l’historique'}, duplicateReport: 'Note de frais en double', approver: 'Approbateur', - resultsAvailable: ({count}: {count: number}) => `${count} résultats disponibles`, - suggestionsAvailable: ({count}: {count: number}) => `${count} suggestions disponibles`, + resultsAvailable: () => ({ + one: '1 résultat disponible', + other: (count: number) => `${count} résultats disponibles`, + }), + suggestionsAvailable: () => ({ + one: '1 suggestion disponible', + other: (count: number) => `${count} suggestions disponibles`, + }), }, socials: { podcast: 'Suivez-nous sur Podcast', diff --git a/src/languages/it.ts b/src/languages/it.ts index 3b77feb5a50d..6a954d8e6768 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -524,8 +524,14 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Ciao, come posso aiutarti?', showHistory: 'Mostra cronologia'}, duplicateReport: 'Report duplicato', approver: 'Approvante', - resultsAvailable: ({count}: {count: number}) => `${count} risultati disponibili`, - suggestionsAvailable: ({count}: {count: number}) => `${count} suggerimenti disponibili`, + resultsAvailable: () => ({ + one: '1 risultato disponibile', + other: (count: number) => `${count} risultati disponibili`, + }), + suggestionsAvailable: () => ({ + one: '1 suggerimento disponibile', + other: (count: number) => `${count} suggerimenti disponibili`, + }), }, socials: { podcast: 'Seguici su Podcast', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index ebced9d6669f..0982879ab72f 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -523,8 +523,12 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'こんにちは、どのようにお手伝いできますか?', showHistory: '履歴を表示'}, duplicateReport: 'レポートを複製', approver: '承認者', - resultsAvailable: ({count}: {count: number}) => `${count} 件の結果があります`, - suggestionsAvailable: ({count}: {count: number}) => `${count}件の候補があります`, + resultsAvailable: () => ({ + other: (count: number) => `${count}件の結果が利用可能`, + }), + suggestionsAvailable: () => ({ + other: (count: number) => `${count}件の候補が利用可能`, + }), }, socials: { podcast: 'ポッドキャストでフォロー', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index b7e6339aa46e..92915026ae10 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -523,8 +523,14 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Hoi, waarmee kan ik je helpen?', showHistory: 'Geschiedenis weergeven'}, duplicateReport: 'Dubbel rapport', approver: 'Fiatteur', - resultsAvailable: ({count}: {count: number}) => `${count} resultaten beschikbaar`, - suggestionsAvailable: ({count}: {count: number}) => `${count} suggesties beschikbaar`, + resultsAvailable: () => ({ + one: '1 resultaat beschikbaar', + other: (count: number) => `${count} resultaten beschikbaar`, + }), + suggestionsAvailable: () => ({ + one: '1 suggestie beschikbaar', + other: (count: number) => `${count} suggesties beschikbaar`, + }), }, socials: { podcast: 'Volg ons op Podcast', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 33e46efd7105..b1310b20932d 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -523,8 +523,14 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Cześć, w czym mogę pomóc?', showHistory: 'Pokaż historię'}, duplicateReport: 'Zduplikowany raport', approver: 'Osoba zatwierdzająca', - resultsAvailable: ({count}: {count: number}) => `Dostępnych wyników: ${count}`, - suggestionsAvailable: ({count}: {count: number}) => `Dostępnych podpowiedzi: ${count}`, + resultsAvailable: () => ({ + one: '1 wynik dostępny', + other: (count: number) => `${count} wyników dostępnych`, + }), + suggestionsAvailable: () => ({ + one: '1 sugestia dostępna', + other: (count: number) => `${count} sugestii dostępnych`, + }), }, socials: { podcast: 'Śledź nas na Podcast', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index da0d65a13778..d1c027d4fe2f 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -522,8 +522,14 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Oi, como posso ajudar?', showHistory: 'Mostrar histórico'}, duplicateReport: 'Duplicar relatório', approver: 'Aprovador', - resultsAvailable: ({count}: {count: number}) => `${count} resultados disponíveis`, - suggestionsAvailable: ({count}: {count: number}) => `${count} sugestões disponíveis`, + resultsAvailable: () => ({ + one: '1 resultado disponível', + other: (count: number) => `${count} resultados disponíveis`, + }), + suggestionsAvailable: () => ({ + one: '1 sugestão disponível', + other: (count: number) => `${count} sugestões disponíveis`, + }), }, socials: { podcast: 'Siga-nos no Podcast', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index eb8c2e7f0d16..0ed1b7b48a90 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -519,8 +519,12 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: '你好,我能帮你做什么?', showHistory: '显示历史'}, duplicateReport: '重复报销单', approver: '审批人', - resultsAvailable: ({count}: {count: number}) => `有 ${count} 个可用结果`, - suggestionsAvailable: ({count}: {count: number}) => `有 ${count} 条可用建议`, + resultsAvailable: () => ({ + other: (count: number) => `${count}个结果可用`, + }), + suggestionsAvailable: () => ({ + other: (count: number) => `${count}个建议可用`, + }), }, socials: { podcast: '在播客上关注我们', From 0e599c6fa7e74b3b53c7b2167164623b32fc6324 Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Thu, 19 Mar 2026 17:44:01 +0000 Subject: [PATCH 08/17] Remove manual translations for resultsAvailable/suggestionsAvailable The generateTranslations CI check auto-generates translations for non-English language files. The manually-added entries conflicted with this script, causing it to fail with "property exists but is not an object" error. Co-authored-by: Situ Chandra Shil --- src/languages/de.ts | 8 -------- src/languages/es.ts | 8 -------- src/languages/fr.ts | 8 -------- src/languages/it.ts | 8 -------- src/languages/ja.ts | 6 ------ src/languages/nl.ts | 8 -------- src/languages/pl.ts | 8 -------- src/languages/pt-BR.ts | 8 -------- src/languages/zh-hans.ts | 6 ------ 9 files changed, 68 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index c7f63da8958a..ec503deb1885 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -524,14 +524,6 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Hallo, wie kann ich helfen?', showHistory: 'Verlauf anzeigen'}, duplicateReport: 'Duplizierten Bericht', approver: 'Genehmiger', - resultsAvailable: () => ({ - one: '1 Ergebnis verfügbar', - other: (count: number) => `${count} Ergebnisse verfügbar`, - }), - suggestionsAvailable: () => ({ - one: '1 Vorschlag verfügbar', - other: (count: number) => `${count} Vorschläge verfügbar`, - }), }, socials: { podcast: 'Folgen Sie uns auf Podcast', diff --git a/src/languages/es.ts b/src/languages/es.ts index 2091813577bb..473af9bd2183 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -432,14 +432,6 @@ const translations: TranslationDeepObject = { vacationDelegate: 'Delegado de vacaciones', expensifyLogo: 'Logo de Expensify', approver: 'Aprobador', - resultsAvailable: () => ({ - one: '1 resultado disponible', - other: (count: number) => `${count} resultados disponibles`, - }), - suggestionsAvailable: () => ({ - one: '1 sugerencia disponible', - other: (count: number) => `${count} sugerencias disponibles`, - }), }, socials: { podcast: 'Síguenos en Podcast', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index d2c35fc3916f..b8a983266478 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -524,14 +524,6 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Bonjour, comment puis-je vous aider ?', showHistory: 'Afficher l’historique'}, duplicateReport: 'Note de frais en double', approver: 'Approbateur', - resultsAvailable: () => ({ - one: '1 résultat disponible', - other: (count: number) => `${count} résultats disponibles`, - }), - suggestionsAvailable: () => ({ - one: '1 suggestion disponible', - other: (count: number) => `${count} suggestions disponibles`, - }), }, socials: { podcast: 'Suivez-nous sur Podcast', diff --git a/src/languages/it.ts b/src/languages/it.ts index 6a954d8e6768..7f8f6e3da63f 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -524,14 +524,6 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Ciao, come posso aiutarti?', showHistory: 'Mostra cronologia'}, duplicateReport: 'Report duplicato', approver: 'Approvante', - resultsAvailable: () => ({ - one: '1 risultato disponibile', - other: (count: number) => `${count} risultati disponibili`, - }), - suggestionsAvailable: () => ({ - one: '1 suggerimento disponibile', - other: (count: number) => `${count} suggerimenti disponibili`, - }), }, socials: { podcast: 'Seguici su Podcast', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 0982879ab72f..f0eb78726e63 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -523,12 +523,6 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'こんにちは、どのようにお手伝いできますか?', showHistory: '履歴を表示'}, duplicateReport: 'レポートを複製', approver: '承認者', - resultsAvailable: () => ({ - other: (count: number) => `${count}件の結果が利用可能`, - }), - suggestionsAvailable: () => ({ - other: (count: number) => `${count}件の候補が利用可能`, - }), }, socials: { podcast: 'ポッドキャストでフォロー', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 92915026ae10..e96c2a8a8588 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -523,14 +523,6 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Hoi, waarmee kan ik je helpen?', showHistory: 'Geschiedenis weergeven'}, duplicateReport: 'Dubbel rapport', approver: 'Fiatteur', - resultsAvailable: () => ({ - one: '1 resultaat beschikbaar', - other: (count: number) => `${count} resultaten beschikbaar`, - }), - suggestionsAvailable: () => ({ - one: '1 suggestie beschikbaar', - other: (count: number) => `${count} suggesties beschikbaar`, - }), }, socials: { podcast: 'Volg ons op Podcast', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index b1310b20932d..bc7504d73362 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -523,14 +523,6 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Cześć, w czym mogę pomóc?', showHistory: 'Pokaż historię'}, duplicateReport: 'Zduplikowany raport', approver: 'Osoba zatwierdzająca', - resultsAvailable: () => ({ - one: '1 wynik dostępny', - other: (count: number) => `${count} wyników dostępnych`, - }), - suggestionsAvailable: () => ({ - one: '1 sugestia dostępna', - other: (count: number) => `${count} sugestii dostępnych`, - }), }, socials: { podcast: 'Śledź nas na Podcast', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index d1c027d4fe2f..c882118bb910 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -522,14 +522,6 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Oi, como posso ajudar?', showHistory: 'Mostrar histórico'}, duplicateReport: 'Duplicar relatório', approver: 'Aprovador', - resultsAvailable: () => ({ - one: '1 resultado disponível', - other: (count: number) => `${count} resultados disponíveis`, - }), - suggestionsAvailable: () => ({ - one: '1 sugestão disponível', - other: (count: number) => `${count} sugestões disponíveis`, - }), }, socials: { podcast: 'Siga-nos no Podcast', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 0ed1b7b48a90..45af014e5bc2 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -519,12 +519,6 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: '你好,我能帮你做什么?', showHistory: '显示历史'}, duplicateReport: '重复报销单', approver: '审批人', - resultsAvailable: () => ({ - other: (count: number) => `${count}个结果可用`, - }), - suggestionsAvailable: () => ({ - other: (count: number) => `${count}个建议可用`, - }), }, socials: { podcast: '在播客上关注我们', From b1e3aa3dcef25a7f057698282c7427cfea6d2e3f Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Thu, 19 Mar 2026 17:53:26 +0000 Subject: [PATCH 09/17] Add missing resultsAvailable and suggestionsAvailable translation keys to all language files Co-authored-by: Situ Chandra Shil --- src/languages/de.ts | 8 ++++++++ src/languages/es.ts | 8 ++++++++ src/languages/fr.ts | 8 ++++++++ src/languages/it.ts | 8 ++++++++ src/languages/ja.ts | 8 ++++++++ src/languages/nl.ts | 8 ++++++++ src/languages/pl.ts | 8 ++++++++ src/languages/pt-BR.ts | 8 ++++++++ src/languages/zh-hans.ts | 8 ++++++++ 9 files changed, 72 insertions(+) diff --git a/src/languages/de.ts b/src/languages/de.ts index ec503deb1885..11a0e7e441ca 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -250,6 +250,14 @@ const translations: TranslationDeepObject = { na: 'k. A.', noResultsFound: 'Keine Ergebnisse gefunden', noResultsFoundMatching: (searchString: string) => `Keine Ergebnisse gefunden für „${searchString}”`, + resultsAvailable: () => ({ + one: '1 Ergebnis verfügbar', + other: (count: number) => `${count} Ergebnisse verfügbar`, + }), + suggestionsAvailable: () => ({ + one: '1 Vorschlag verfügbar', + other: (count: number) => `${count} Vorschläge verfügbar`, + }), recentDestinations: 'Letzte Ziele', timePrefix: 'Es ist', conjunctionFor: 'für', diff --git a/src/languages/es.ts b/src/languages/es.ts index 473af9bd2183..23622e04a867 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -156,6 +156,14 @@ const translations: TranslationDeepObject = { na: 'N/A', noResultsFound: 'No se han encontrado resultados', noResultsFoundMatching: (searchString: string) => `No se encontraron resultados que coincidan con "${searchString}"`, + resultsAvailable: () => ({ + one: '1 resultado disponible', + other: (count: number) => `${count} resultados disponibles`, + }), + suggestionsAvailable: () => ({ + one: '1 sugerencia disponible', + other: (count: number) => `${count} sugerencias disponibles`, + }), recentDestinations: 'Destinos recientes', timePrefix: 'Son las', conjunctionFor: 'para', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index b8a983266478..b711d3d82926 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -250,6 +250,14 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Aucun résultat trouvé', noResultsFoundMatching: (searchString: string) => `Aucun résultat trouvé correspondant à « ${searchString} »`, + resultsAvailable: () => ({ + one: '1 résultat disponible', + other: (count: number) => `${count} résultats disponibles`, + }), + suggestionsAvailable: () => ({ + one: '1 suggestion disponible', + other: (count: number) => `${count} suggestions disponibles`, + }), recentDestinations: 'Destinations récentes', timePrefix: "C'est", conjunctionFor: 'pour', diff --git a/src/languages/it.ts b/src/languages/it.ts index 7f8f6e3da63f..36b9beefcef9 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -250,6 +250,14 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nessun risultato trovato', noResultsFoundMatching: (searchString: string) => `Nessun risultato trovato per "${searchString}"`, + resultsAvailable: () => ({ + one: '1 risultato disponibile', + other: (count: number) => `${count} risultati disponibili`, + }), + suggestionsAvailable: () => ({ + one: '1 suggerimento disponibile', + other: (count: number) => `${count} suggerimenti disponibili`, + }), recentDestinations: 'Destinazioni recenti', timePrefix: 'È', conjunctionFor: 'per', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index f0eb78726e63..33838bf8584c 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -250,6 +250,14 @@ const translations: TranslationDeepObject = { na: '該当なし', noResultsFound: '結果が見つかりません', noResultsFoundMatching: (searchString: string) => `"${searchString}" に一致する結果は見つかりませんでした`, + resultsAvailable: () => ({ + one: '1件の結果が利用可能', + other: (count: number) => `${count}件の結果が利用可能`, + }), + suggestionsAvailable: () => ({ + one: '1件の候補が利用可能', + other: (count: number) => `${count}件の候補が利用可能`, + }), recentDestinations: '最近の宛先', timePrefix: 'それは', conjunctionFor: '〜用', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index e96c2a8a8588..15a6517a6e8b 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -250,6 +250,14 @@ const translations: TranslationDeepObject = { na: 'n.v.t.', noResultsFound: 'Geen resultaten gevonden', noResultsFoundMatching: (searchString: string) => `Geen resultaten gevonden voor "${searchString}"`, + resultsAvailable: () => ({ + one: '1 resultaat beschikbaar', + other: (count: number) => `${count} resultaten beschikbaar`, + }), + suggestionsAvailable: () => ({ + one: '1 suggestie beschikbaar', + other: (count: number) => `${count} suggesties beschikbaar`, + }), recentDestinations: 'Recente bestemmingen', timePrefix: 'Het is', conjunctionFor: 'voor', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index bc7504d73362..5a0fb4758674 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -250,6 +250,14 @@ const translations: TranslationDeepObject = { na: 'ND dotyczy', noResultsFound: 'Nie znaleziono wyników', noResultsFoundMatching: (searchString: string) => `Nie znaleziono wyników pasujących do „${searchString}”`, + resultsAvailable: () => ({ + one: '1 wynik dostępny', + other: (count: number) => `${count} wyników dostępnych`, + }), + suggestionsAvailable: () => ({ + one: '1 sugestia dostępna', + other: (count: number) => `${count} sugestii dostępnych`, + }), recentDestinations: 'Ostatnie miejsca docelowe', timePrefix: 'To jest', conjunctionFor: 'dla', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index c882118bb910..b0b4a236c040 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -250,6 +250,14 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nenhum resultado encontrado', noResultsFoundMatching: (searchString: string) => `Nenhum resultado encontrado para "${searchString}"`, + resultsAvailable: () => ({ + one: '1 resultado disponível', + other: (count: number) => `${count} resultados disponíveis`, + }), + suggestionsAvailable: () => ({ + one: '1 sugestão disponível', + other: (count: number) => `${count} sugestões disponíveis`, + }), recentDestinations: 'Destinos recentes', timePrefix: 'É', conjunctionFor: 'para', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 45af014e5bc2..31b66fe3b300 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -250,6 +250,14 @@ const translations: TranslationDeepObject = { na: '不适用', noResultsFound: '未找到结果', noResultsFoundMatching: (searchString: string) => `未找到与”${searchString}”匹配的结果`, + resultsAvailable: () => ({ + one: '1个结果可用', + other: (count: number) => `${count}个结果可用`, + }), + suggestionsAvailable: () => ({ + one: '1个建议可用', + other: (count: number) => `${count}个建议可用`, + }), recentDestinations: '最近目的地', timePrefix: '它是', conjunctionFor: '用于', From ed73bbdfdd55799bb1bafe06c52061ac52dc8f95 Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Sun, 22 Mar 2026 15:10:14 +0000 Subject: [PATCH 10/17] Revert to only fix Address line 1 accessibility announcement Reverted changes to BaseSelectionList and BaseAutoCompleteSuggestions. Scoped fix to only the AddressSearch component (Settings > Profile > Address > Address line 1). Updated PR description to match the reduced scope. Co-authored-by: Situ Chandra Shil --- src/components/AddressSearch/index.tsx | 3 ++ .../BaseAutoCompleteSuggestions.tsx | 9 ------ .../SelectionList/BaseSelectionList.tsx | 7 ----- src/languages/de.ts | 16 ++++------- src/languages/en.ts | 13 ++++----- src/languages/es.ts | 16 ++++------- src/languages/fr.ts | 16 ++++------- src/languages/it.ts | 16 ++++------- src/languages/ja.ts | 25 ++++------------- src/languages/nl.ts | 16 ++++------- src/languages/pl.ts | 16 ++++------- src/languages/pt-BR.ts | 16 ++++------- src/languages/zh-hans.ts | 28 ++++--------------- 13 files changed, 53 insertions(+), 144 deletions(-) diff --git a/src/components/AddressSearch/index.tsx b/src/components/AddressSearch/index.tsx index 1b6ca1d1af9d..11bdeff52c3d 100644 --- a/src/components/AddressSearch/index.tsx +++ b/src/components/AddressSearch/index.tsx @@ -115,6 +115,9 @@ function AddressSearch({ const shouldTriggerGeolocationCallbacks = useRef(true); const [shouldHidePredefinedPlaces, setShouldHidePredefinedPlaces] = useState(false); const containerRef = useRef(null); + + useDebouncedAccessibilityAnnouncement(translate('common.suggestionsAvailable'), displayListViewBorder && isTyping, searchValue); + const query = useMemo( () => ({ language: preferredLocale, diff --git a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx index c85d8eb4a6d0..0cd97ef55eb6 100644 --- a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx +++ b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx @@ -4,8 +4,6 @@ import {FlatList} from 'react-native-gesture-handler'; import Animated, {Easing, useAnimatedStyle, useSharedValue, withTiming} from 'react-native-reanimated'; import ColorSchemeWrapper from '@components/ColorSchemeWrapper'; import PressableWithFeedback from '@components/Pressable/PressableWithFeedback'; -import useAccessibilityAnnouncement from '@hooks/useAccessibilityAnnouncement'; -import useLocalize from '@hooks/useLocalize'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import {hasHoverSupport} from '@libs/DeviceCapabilities'; @@ -25,17 +23,11 @@ function BaseAutoCompleteSuggestions({ measuredHeightOfSuggestionRows, }: ExternalProps) { const styles = useThemeStyles(); - const {translate} = useLocalize(); const StyleUtils = useStyleUtils(); const rowHeight = useSharedValue(0); const prevRowHeightRef = useRef(measuredHeightOfSuggestionRows); const fadeInOpacity = useSharedValue(0); const scrollRef = useRef>(null); - - useAccessibilityAnnouncement(translate('common.suggestionsAvailable', {count: suggestions.length}), suggestions.length > 0, { - shouldAnnounceOnNative: true, - shouldAnnounceOnWeb: true, - }); /** * Render a suggestion menu item component. */ @@ -48,7 +40,6 @@ function BaseAutoCompleteSuggestions({ onPress={() => onSelect(index)} onLongPress={() => {}} accessibilityLabel={accessibilityLabelExtractor(item, index)} - sentryLabel="BaseAutoCompleteSuggestions-suggestionItem" role={CONST.ROLE.MENUITEM} > {renderSuggestionMenuItem(item, index)} diff --git a/src/components/SelectionList/BaseSelectionList.tsx b/src/components/SelectionList/BaseSelectionList.tsx index b96cf03eb6b4..1969beccbbe0 100644 --- a/src/components/SelectionList/BaseSelectionList.tsx +++ b/src/components/SelectionList/BaseSelectionList.tsx @@ -10,10 +10,8 @@ import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types'; import useActiveElementRole from '@hooks/useActiveElementRole'; import useArrowKeyFocusManager from '@hooks/useArrowKeyFocusManager'; import useDebounce from '@hooks/useDebounce'; -import useDebouncedAccessibilityAnnouncement from '@hooks/useDebouncedAccessibilityAnnouncement'; import useKeyboardShortcut from '@hooks/useKeyboardShortcut'; import useKeyboardState from '@hooks/useKeyboardState'; -import useLocalize from '@hooks/useLocalize'; import useSafeAreaPaddings from '@hooks/useSafeAreaPaddings'; import useScrollEnabled from '@hooks/useScrollEnabled'; import useSingleExecution from '@hooks/useSingleExecution'; @@ -97,7 +95,6 @@ function BaseSelectionList({ setShouldDisableHoverStyle = () => {}, }: SelectionListProps) { const styles = useThemeStyles(); - const {translate} = useLocalize(); const isFocused = useIsFocused(); const scrollEnabled = useScrollEnabled(); const {singleExecution} = useSingleExecution(); @@ -105,10 +102,6 @@ function BaseSelectionList({ const {isKeyboardShown} = useKeyboardState(); const {safeAreaPaddingBottomStyle} = useSafeAreaPaddings(); - const searchValue = textInputOptions?.value ?? ''; - const resultsMessage = shouldShowTextInput && data.length > 0 ? translate('common.resultsAvailable', {count: data.length}) : ''; - useDebouncedAccessibilityAnnouncement(resultsMessage, shouldShowTextInput && data.length > 0, searchValue); - const innerTextInputRef = useRef(null); const isTextInputFocusedRef = useRef(false); const hasKeyBeenPressed = useRef(false); diff --git a/src/languages/de.ts b/src/languages/de.ts index 112de96269c5..b922efb9be20 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -250,14 +250,7 @@ const translations: TranslationDeepObject = { na: 'k. A.', noResultsFound: 'Keine Ergebnisse gefunden', noResultsFoundMatching: (searchString: string) => `Keine Ergebnisse gefunden für „${searchString}”`, - resultsAvailable: () => ({ - one: '1 Ergebnis verfügbar', - other: (count: number) => `${count} Ergebnisse verfügbar`, - }), - suggestionsAvailable: () => ({ - one: '1 Vorschlag verfügbar', - other: (count: number) => `${count} Vorschläge verfügbar`, - }), + suggestionsAvailable: 'Vorschläge verfügbar', recentDestinations: 'Letzte Ziele', timePrefix: 'Es ist', conjunctionFor: 'für', @@ -535,6 +528,7 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Hallo, wie kann ich helfen?', showHistory: 'Verlauf anzeigen'}, duplicateReport: 'Duplizierten Bericht', approver: 'Genehmiger', + copyOfReportName: (reportName: string) => `Kopie von ${reportName}`, }, socials: { podcast: 'Folgen Sie uns auf Podcast', @@ -681,6 +675,7 @@ const translations: TranslationDeepObject = { faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', + passkey: 'Passkey', }, statusNeverRegistered: 'Nie registriert', statusNotRegistered: 'Nicht registriert', @@ -698,11 +693,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Lass uns bestätigen, dass du es bist', nowLetsAuthenticateYou: 'Lassen Sie uns Sie jetzt authentifizieren …', letsAuthenticateYou: 'Lass uns dich authentifizieren …', - verifyYourself: { - biometrics: 'Bestätige dich mit deinem Gesicht oder Fingerabdruck', - }, + verifyYourself: {biometrics: 'Bestätige dich mit deinem Gesicht oder Fingerabdruck', passkeys: 'Bestätigen Sie sich mit einem Passkey'}, enableQuickVerification: { biometrics: 'Aktiviere eine schnelle, sichere Verifizierung mit deinem Gesicht oder Fingerabdruck. Keine Passwörter oder Codes erforderlich.', + passkeys: 'Aktivieren Sie eine schnelle, sichere Verifizierung mit einem Passkey. Keine Passwörter oder Codes erforderlich.', }, revoke: { title: 'Gesicht/Fingerabdruck & Zugangsschlüssel', diff --git a/src/languages/en.ts b/src/languages/en.ts index 4cf3c8cb7de5..54d57ca34c0a 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -253,14 +253,7 @@ const translations = { na: 'N/A', noResultsFound: 'No results found', noResultsFoundMatching: (searchString: string) => `No results found matching "${searchString}"`, - resultsAvailable: () => ({ - one: '1 result available', - other: (count: number) => `${count} results available`, - }), - suggestionsAvailable: () => ({ - one: '1 suggestion available', - other: (count: number) => `${count} suggestions available`, - }), + suggestionsAvailable: 'Suggestions available', recentDestinations: 'Recent destinations', timePrefix: "It's", conjunctionFor: 'for', @@ -540,6 +533,7 @@ const translations = { duplicated: 'Duplicated', duplicateExpense: 'Duplicate expense', duplicateReport: 'Duplicate report', + copyOfReportName: (reportName: string) => `Copy of ${reportName}`, exchangeRate: 'Exchange rate', reimbursableTotal: 'Reimbursable total', nonReimbursableTotal: 'Non-reimbursable total', @@ -710,6 +704,7 @@ const translations = { faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', + passkey: 'Passkey', }, }, pleaseEnableInSystemSettings: { @@ -726,9 +721,11 @@ const translations = { letsAuthenticateYou: "Let's authenticate you...", verifyYourself: { biometrics: 'Verify yourself with your face or fingerprint', + passkeys: 'Verify yourself with a passkey', }, enableQuickVerification: { biometrics: 'Enable quick, secure verification using your face or fingerprint. No passwords or codes required.', + passkeys: 'Enable quick, secure verification using a passkey. No passwords or codes required.', }, revoke: { revoke: 'Revoke', diff --git a/src/languages/es.ts b/src/languages/es.ts index 3718e7b6e6fc..b9a7bb97fdaf 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -156,14 +156,7 @@ const translations: TranslationDeepObject = { na: 'N/A', noResultsFound: 'No se han encontrado resultados', noResultsFoundMatching: (searchString: string) => `No se encontraron resultados que coincidan con "${searchString}"`, - resultsAvailable: () => ({ - one: '1 resultado disponible', - other: (count: number) => `${count} resultados disponibles`, - }), - suggestionsAvailable: () => ({ - one: '1 sugerencia disponible', - other: (count: number) => `${count} sugerencias disponibles`, - }), + suggestionsAvailable: 'Sugerencias disponibles', recentDestinations: 'Destinos recientes', timePrefix: 'Son las', conjunctionFor: 'para', @@ -427,6 +420,7 @@ const translations: TranslationDeepObject = { duplicated: 'Duplicado', duplicateExpense: 'Duplicar gasto', duplicateReport: 'Duplicar informe', + copyOfReportName: (reportName: string) => `Copia de ${reportName}`, exchangeRate: 'Tipo de cambio', reimbursableTotal: 'Total reembolsable', nonReimbursableTotal: 'Total no reembolsable', @@ -596,6 +590,7 @@ const translations: TranslationDeepObject = { faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', + passkey: 'Passkey', }, }, verificationFailed: 'Verificación fallida', @@ -610,11 +605,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Verifiquemos que eres tú', nowLetsAuthenticateYou: 'Vamos a validarte...', letsAuthenticateYou: 'Validando...', - verifyYourself: { - biometrics: 'Verifícate con tu rostro o huella dactilar', - }, + verifyYourself: {biometrics: 'Verifícate con tu rostro o huella dactilar', passkeys: 'Verifícate con una passkey'}, enableQuickVerification: { biometrics: 'Activa la verificación rápida y segura usando tu rostro o huella dactilar. No se requieren contraseñas ni códigos.', + passkeys: 'Habilita una verificación rápida y segura usando una passkey. No se requieren contraseñas ni códigos.', }, revoke: { revoke: 'Revocar', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index a2426dae1826..22e818008f36 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -250,14 +250,7 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Aucun résultat trouvé', noResultsFoundMatching: (searchString: string) => `Aucun résultat trouvé correspondant à « ${searchString} »`, - resultsAvailable: () => ({ - one: '1 résultat disponible', - other: (count: number) => `${count} résultats disponibles`, - }), - suggestionsAvailable: () => ({ - one: '1 suggestion disponible', - other: (count: number) => `${count} suggestions disponibles`, - }), + suggestionsAvailable: 'Suggestions disponibles', recentDestinations: 'Destinations récentes', timePrefix: "C'est", conjunctionFor: 'pour', @@ -535,6 +528,7 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Bonjour, comment puis-je vous aider ?', showHistory: 'Afficher l’historique'}, duplicateReport: 'Note de frais en double', approver: 'Approbateur', + copyOfReportName: (reportName: string) => `Copie de ${reportName}`, }, socials: { podcast: 'Suivez-nous sur Podcast', @@ -682,6 +676,7 @@ const translations: TranslationDeepObject = { faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', + passkey: 'Passkey', }, statusNeverRegistered: 'Jamais enregistré', statusNotRegistered: 'Non enregistré', @@ -699,11 +694,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Vérifions qu’il s’agit bien de vous', nowLetsAuthenticateYou: 'Maintenant, procédons à votre authentification…', letsAuthenticateYou: 'Authentifions votre identité…', - verifyYourself: { - biometrics: 'Vérifiez votre identité avec votre visage ou votre empreinte digitale', - }, + verifyYourself: {biometrics: 'Vérifiez votre identité avec votre visage ou votre empreinte digitale', passkeys: 'Vérifiez votre identité avec une clé d’accès'}, enableQuickVerification: { biometrics: 'Activez une vérification rapide et sécurisée à l’aide de votre visage ou de votre empreinte digitale. Aucun mot de passe ni code requis.', + passkeys: 'Activez une vérification rapide et sécurisée à l’aide d’une clé d’accès. Aucun mot de passe ni code requis.', }, revoke: { title: 'Reconnaissance faciale/empreinte digitale et passkeys', diff --git a/src/languages/it.ts b/src/languages/it.ts index 5d634f4ef5ee..666f8a173084 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -250,14 +250,7 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nessun risultato trovato', noResultsFoundMatching: (searchString: string) => `Nessun risultato trovato per "${searchString}"`, - resultsAvailable: () => ({ - one: '1 risultato disponibile', - other: (count: number) => `${count} risultati disponibili`, - }), - suggestionsAvailable: () => ({ - one: '1 suggerimento disponibile', - other: (count: number) => `${count} suggerimenti disponibili`, - }), + suggestionsAvailable: 'Suggerimenti disponibili', recentDestinations: 'Destinazioni recenti', timePrefix: 'È', conjunctionFor: 'per', @@ -535,6 +528,7 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Ciao, come posso aiutarti?', showHistory: 'Mostra cronologia'}, duplicateReport: 'Report duplicato', approver: 'Approvante', + copyOfReportName: (reportName: string) => `Copia di ${reportName}`, }, socials: { podcast: 'Seguici su Podcast', @@ -681,6 +675,7 @@ const translations: TranslationDeepObject = { faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', + passkey: 'Passkey', }, statusNeverRegistered: 'Mai registrato', statusNotRegistered: 'Non registrato', @@ -698,11 +693,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Verifichiamo che sia tu', nowLetsAuthenticateYou: 'Ora procediamo con l’autenticazione...', letsAuthenticateYou: 'Autentichiamo la tua identità...', - verifyYourself: { - biometrics: 'Verificati con il volto o l’impronta digitale', - }, + verifyYourself: {biometrics: 'Verificati con il volto o l’impronta digitale', passkeys: 'Verificati con una passkey'}, enableQuickVerification: { biometrics: 'Attiva una verifica rapida e sicura utilizzando il volto o l’impronta digitale. Nessuna password o codice richiesto.', + passkeys: 'Abilita una verifica rapida e sicura usando una passkey. Nessuna password o codice richiesto.', }, revoke: { title: 'Volto/impronta digitale e passkey', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 36a4ce86ec9a..b6d24c97f5b0 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -250,14 +250,7 @@ const translations: TranslationDeepObject = { na: '該当なし', noResultsFound: '結果が見つかりません', noResultsFoundMatching: (searchString: string) => `"${searchString}" に一致する結果は見つかりませんでした`, - resultsAvailable: () => ({ - one: '1件の結果が利用可能', - other: (count: number) => `${count}件の結果が利用可能`, - }), - suggestionsAvailable: () => ({ - one: '1件の候補が利用可能', - other: (count: number) => `${count}件の候補が利用可能`, - }), + suggestionsAvailable: '候補が利用可能', recentDestinations: '最近の宛先', timePrefix: 'それは', conjunctionFor: '〜用', @@ -534,6 +527,7 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'こんにちは、どのようにお手伝いできますか?', showHistory: '履歴を表示'}, duplicateReport: 'レポートを複製', approver: '承認者', + copyOfReportName: (reportName: string) => `${reportName} のコピー`, }, socials: { podcast: 'ポッドキャストでフォロー', @@ -672,15 +666,7 @@ const translations: TranslationDeepObject = { rejectAuthentication: '認証を拒否', test: 'テスト', biometricsAuthentication: '生体認証', - authType: { - unknown: '不明', - none: 'なし', - credentials: '資格情報', - biometrics: '生体認証', - faceId: 'Face ID', - touchId: 'Touch ID', - opticId: 'Optic ID', - }, + authType: {unknown: '不明', none: 'なし', credentials: '資格情報', biometrics: '生体認証', faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', passkey: 'Passkey'}, statusNeverRegistered: '未登録', statusNotRegistered: '未登録', statusRegisteredThisDevice: '登録済み', @@ -697,11 +683,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'ご本人確認を行いましょう', nowLetsAuthenticateYou: 'では、ご本人確認を行いましょう…', letsAuthenticateYou: '認証を行っています…', - verifyYourself: { - biometrics: '顔または指紋で本人確認を行ってください', - }, + verifyYourself: {biometrics: '顔または指紋で本人確認を行ってください', passkeys: 'パスキーで本人確認を行います'}, enableQuickVerification: { biometrics: '顔や指紋を使って、素早く安全に認証できます。パスワードやコードは不要です。', + passkeys: 'パスキーを使って、素早く安全に認証できるようにします。パスワードやコードは不要です。', }, revoke: { title: '顔/指紋 & パスキー', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 81fe0c06b55f..c920985b2618 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -250,14 +250,7 @@ const translations: TranslationDeepObject = { na: 'n.v.t.', noResultsFound: 'Geen resultaten gevonden', noResultsFoundMatching: (searchString: string) => `Geen resultaten gevonden voor "${searchString}"`, - resultsAvailable: () => ({ - one: '1 resultaat beschikbaar', - other: (count: number) => `${count} resultaten beschikbaar`, - }), - suggestionsAvailable: () => ({ - one: '1 suggestie beschikbaar', - other: (count: number) => `${count} suggesties beschikbaar`, - }), + suggestionsAvailable: 'Suggesties beschikbaar', recentDestinations: 'Recente bestemmingen', timePrefix: 'Het is', conjunctionFor: 'voor', @@ -534,6 +527,7 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Hoi, waarmee kan ik je helpen?', showHistory: 'Geschiedenis weergeven'}, duplicateReport: 'Dubbel rapport', approver: 'Fiatteur', + copyOfReportName: (reportName: string) => `Kopie van ${reportName}`, }, socials: { podcast: 'Volg ons op Podcast', @@ -680,6 +674,7 @@ const translations: TranslationDeepObject = { faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', + passkey: 'Passkey', }, statusNeverRegistered: 'Nooit geregistreerd', statusNotRegistered: 'Niet geregistreerd', @@ -697,11 +692,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Laten we controleren of jij het bent', nowLetsAuthenticateYou: 'Laten we je nu verifiëren...', letsAuthenticateYou: 'We gaan je authenticeren...', - verifyYourself: { - biometrics: 'Verifieer jezelf met je gezicht of vingerafdruk', - }, + verifyYourself: {biometrics: 'Verifieer jezelf met je gezicht of vingerafdruk', passkeys: 'Verifieer jezelf met een toegangssleutel'}, enableQuickVerification: { biometrics: 'Schakel snelle, veilige verificatie in met je gezicht of vingerafdruk. Geen wachtwoorden of codes nodig.', + passkeys: 'Schakel snelle, veilige verificatie in met een passkey. Geen wachtwoorden of codes nodig.', }, revoke: { title: 'Gezicht/vingerafdruk & passkeys', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 172ea2fa4de1..2fdd4ec79bc5 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -250,14 +250,7 @@ const translations: TranslationDeepObject = { na: 'ND dotyczy', noResultsFound: 'Nie znaleziono wyników', noResultsFoundMatching: (searchString: string) => `Nie znaleziono wyników pasujących do „${searchString}”`, - resultsAvailable: () => ({ - one: '1 wynik dostępny', - other: (count: number) => `${count} wyników dostępnych`, - }), - suggestionsAvailable: () => ({ - one: '1 sugestia dostępna', - other: (count: number) => `${count} sugestii dostępnych`, - }), + suggestionsAvailable: 'Dostępne sugestie', recentDestinations: 'Ostatnie miejsca docelowe', timePrefix: 'To jest', conjunctionFor: 'dla', @@ -534,6 +527,7 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Cześć, w czym mogę pomóc?', showHistory: 'Pokaż historię'}, duplicateReport: 'Zduplikowany raport', approver: 'Osoba zatwierdzająca', + copyOfReportName: (reportName: string) => `Kopia raportu ${reportName}`, }, socials: { podcast: 'Śledź nas na Podcast', @@ -680,6 +674,7 @@ const translations: TranslationDeepObject = { faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', + passkey: 'Passkey', }, statusNeverRegistered: 'Nigdy nie zarejestrowano', statusNotRegistered: 'Nie zarejestrowano', @@ -697,11 +692,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Zweryfikujmy, czy to na pewno Ty', nowLetsAuthenticateYou: 'Teraz Cię uwierzytelnimy…', letsAuthenticateYou: 'Uwierzytelnijmy Cię…', - verifyYourself: { - biometrics: 'Zweryfikuj się za pomocą twarzy lub odcisku palca', - }, + verifyYourself: {biometrics: 'Zweryfikuj się za pomocą twarzy lub odcisku palca', passkeys: 'Zweryfikuj się za pomocą klucza dostępu'}, enableQuickVerification: { biometrics: 'Włącz szybką i bezpieczną weryfikację za pomocą twarzy lub odcisku palca. Bez haseł i kodów.', + passkeys: 'Włącz szybką, bezpieczną weryfikację za pomocą klucza dostępu. Nie są wymagane żadne hasła ani kody.', }, revoke: { title: 'Face/odcisk palca i klucze dostępu', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 8a3081bf3fd3..b32fa22c4033 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -250,14 +250,7 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nenhum resultado encontrado', noResultsFoundMatching: (searchString: string) => `Nenhum resultado encontrado para "${searchString}"`, - resultsAvailable: () => ({ - one: '1 resultado disponível', - other: (count: number) => `${count} resultados disponíveis`, - }), - suggestionsAvailable: () => ({ - one: '1 sugestão disponível', - other: (count: number) => `${count} sugestões disponíveis`, - }), + suggestionsAvailable: 'Sugestões disponíveis', recentDestinations: 'Destinos recentes', timePrefix: 'É', conjunctionFor: 'para', @@ -533,6 +526,7 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: 'Oi, como posso ajudar?', showHistory: 'Mostrar histórico'}, duplicateReport: 'Duplicar relatório', approver: 'Aprovador', + copyOfReportName: (reportName: string) => `Cópia de ${reportName}`, }, socials: { podcast: 'Siga-nos no Podcast', @@ -679,6 +673,7 @@ const translations: TranslationDeepObject = { faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', + passkey: 'Passkey', }, statusNeverRegistered: 'Nunca registrado', statusNotRegistered: 'Não registrado', @@ -696,11 +691,10 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: 'Vamos verificar se é você', nowLetsAuthenticateYou: 'Agora, vamos autenticar você...', letsAuthenticateYou: 'Vamos autenticar você...', - verifyYourself: { - biometrics: 'Verifique sua identidade com seu rosto ou impressão digital', - }, + verifyYourself: {biometrics: 'Verifique sua identidade com seu rosto ou impressão digital', passkeys: 'Verifique sua identidade com uma chave de acesso'}, enableQuickVerification: { biometrics: 'Ative uma verificação rápida e segura usando seu rosto ou impressão digital. Nenhuma senha ou código é necessário.', + passkeys: 'Ative uma verificação rápida e segura usando uma chave de acesso. Nenhuma senha ou código é necessário.', }, revoke: { title: 'Reconhecimento facial/digital e passkeys', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 82eaea487409..767be0bfd8ab 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -250,14 +250,7 @@ const translations: TranslationDeepObject = { na: '不适用', noResultsFound: '未找到结果', noResultsFoundMatching: (searchString: string) => `未找到与”${searchString}”匹配的结果`, - resultsAvailable: () => ({ - one: '1个结果可用', - other: (count: number) => `${count}个结果可用`, - }), - suggestionsAvailable: () => ({ - one: '1个建议可用', - other: (count: number) => `${count}个建议可用`, - }), + suggestionsAvailable: '建议可用', recentDestinations: '最近目的地', timePrefix: '它是', conjunctionFor: '用于', @@ -530,6 +523,7 @@ const translations: TranslationDeepObject = { concierge: {sidePanelGreeting: '你好,我能帮你做什么?', showHistory: '显示历史'}, duplicateReport: '重复报销单', approver: '审批人', + copyOfReportName: (reportName: string) => `${reportName} 的副本`, }, socials: { podcast: '在播客上关注我们', @@ -665,15 +659,7 @@ const translations: TranslationDeepObject = { rejectAuthentication: '拒绝认证', test: '测试', biometricsAuthentication: '生物识别认证', - authType: { - unknown: '未知', - none: '无', - credentials: '凭据', - biometrics: '生物识别', - faceId: 'Face ID', - touchId: 'Touch ID', - opticId: 'Optic ID', - }, + authType: {unknown: '未知', none: '无', credentials: '凭据', biometrics: '生物识别', faceId: 'Face ID', touchId: 'Touch ID', opticId: 'Optic ID', passkey: 'Passkey'}, statusNeverRegistered: '从未注册', statusNotRegistered: '未注册', statusRegisteredThisDevice: '已注册', @@ -690,12 +676,8 @@ const translations: TranslationDeepObject = { letsVerifyItsYou: '让我们验证一下您的身份', nowLetsAuthenticateYou: '现在,让我们为你进行身份验证…', letsAuthenticateYou: '正在验证您的身份…', - verifyYourself: { - biometrics: '使用面部或指纹验证您的身份', - }, - enableQuickVerification: { - biometrics: '使用面部或指纹即可进行快速、安全的验证,无需密码或验证码。', - }, + verifyYourself: {biometrics: '使用面部或指纹验证您的身份', passkeys: '使用通行密钥验证您的身份'}, + enableQuickVerification: {biometrics: '使用面部或指纹即可进行快速、安全的验证,无需密码或验证码。', passkeys: '启用使用通行密钥进行快速、安全的验证,无需密码或验证码。'}, revoke: { title: '面容/指纹和通行密钥', explanation: '一个或多个设备已启用面容/指纹或通行密钥验证。撤销访问权限后,该设备下次验证时将需要输入魔法验证码。', From 9207840400baeea3327c4b6739838ad522e2e051 Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Sun, 22 Mar 2026 15:17:30 +0000 Subject: [PATCH 11/17] Fix: replace deprecated absoluteFillObject with absoluteFill Co-authored-by: Situ Chandra Shil --- src/components/AddressSearch/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/AddressSearch/index.tsx b/src/components/AddressSearch/index.tsx index 11bdeff52c3d..88fb0fb20fc9 100644 --- a/src/components/AddressSearch/index.tsx +++ b/src/components/AddressSearch/index.tsx @@ -503,7 +503,7 @@ function AddressSearch({ {isFetchingCurrentLocation && ( - + Date: Sun, 22 Mar 2026 15:31:31 +0000 Subject: [PATCH 12/17] Update announcement to include query, revert unrelated translation changes - Changed announcement format to include search query: "Suggestions available for ." - Reverted all unrelated translation file changes (copyOfReportName, passkey, etc.) - Added only the suggestionsAvailableFor translation key across all language files Co-authored-by: Situ Chandra Shil --- src/components/AddressSearch/index.tsx | 2 +- src/languages/de.ts | 2 +- src/languages/en.ts | 2 +- src/languages/es.ts | 2 +- src/languages/fr.ts | 2 +- src/languages/it.ts | 2 +- src/languages/ja.ts | 2 +- src/languages/nl.ts | 2 +- src/languages/pl.ts | 2 +- src/languages/pt-BR.ts | 2 +- src/languages/zh-hans.ts | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/AddressSearch/index.tsx b/src/components/AddressSearch/index.tsx index 88fb0fb20fc9..affdbd7ada7f 100644 --- a/src/components/AddressSearch/index.tsx +++ b/src/components/AddressSearch/index.tsx @@ -116,7 +116,7 @@ function AddressSearch({ const [shouldHidePredefinedPlaces, setShouldHidePredefinedPlaces] = useState(false); const containerRef = useRef(null); - useDebouncedAccessibilityAnnouncement(translate('common.suggestionsAvailable'), displayListViewBorder && isTyping, searchValue); + useDebouncedAccessibilityAnnouncement(translate('common.suggestionsAvailableFor', searchValue), displayListViewBorder && isTyping, searchValue); const query = useMemo( () => ({ diff --git a/src/languages/de.ts b/src/languages/de.ts index b922efb9be20..143afc0aae4d 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'k. A.', noResultsFound: 'Keine Ergebnisse gefunden', noResultsFoundMatching: (searchString: string) => `Keine Ergebnisse gefunden für „${searchString}”`, - suggestionsAvailable: 'Vorschläge verfügbar', + suggestionsAvailableFor: (searchString: string) => `Vorschläge verfügbar für „${searchString}”.`, recentDestinations: 'Letzte Ziele', timePrefix: 'Es ist', conjunctionFor: 'für', diff --git a/src/languages/en.ts b/src/languages/en.ts index 54d57ca34c0a..fe14b42aa981 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -253,7 +253,7 @@ const translations = { na: 'N/A', noResultsFound: 'No results found', noResultsFoundMatching: (searchString: string) => `No results found matching "${searchString}"`, - suggestionsAvailable: 'Suggestions available', + suggestionsAvailableFor: (searchString: string) => `Suggestions available for "${searchString}".`, recentDestinations: 'Recent destinations', timePrefix: "It's", conjunctionFor: 'for', diff --git a/src/languages/es.ts b/src/languages/es.ts index b9a7bb97fdaf..16207acbd46f 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -156,7 +156,7 @@ const translations: TranslationDeepObject = { na: 'N/A', noResultsFound: 'No se han encontrado resultados', noResultsFoundMatching: (searchString: string) => `No se encontraron resultados que coincidan con "${searchString}"`, - suggestionsAvailable: 'Sugerencias disponibles', + suggestionsAvailableFor: (searchString: string) => `Sugerencias disponibles para "${searchString}".`, recentDestinations: 'Destinos recientes', timePrefix: 'Son las', conjunctionFor: 'para', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 22e818008f36..628675348f8d 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Aucun résultat trouvé', noResultsFoundMatching: (searchString: string) => `Aucun résultat trouvé correspondant à « ${searchString} »`, - suggestionsAvailable: 'Suggestions disponibles', + suggestionsAvailableFor: (searchString: string) => `Suggestions disponibles pour « ${searchString} ».`, recentDestinations: 'Destinations récentes', timePrefix: "C'est", conjunctionFor: 'pour', diff --git a/src/languages/it.ts b/src/languages/it.ts index 666f8a173084..65d996c094ed 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nessun risultato trovato', noResultsFoundMatching: (searchString: string) => `Nessun risultato trovato per "${searchString}"`, - suggestionsAvailable: 'Suggerimenti disponibili', + suggestionsAvailableFor: (searchString: string) => `Suggerimenti disponibili per "${searchString}".`, recentDestinations: 'Destinazioni recenti', timePrefix: 'È', conjunctionFor: 'per', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index b6d24c97f5b0..0d94e2e7646e 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: '該当なし', noResultsFound: '結果が見つかりません', noResultsFoundMatching: (searchString: string) => `"${searchString}" に一致する結果は見つかりませんでした`, - suggestionsAvailable: '候補が利用可能', + suggestionsAvailableFor: (searchString: string) => `「${searchString}」の候補が利用可能です。`, recentDestinations: '最近の宛先', timePrefix: 'それは', conjunctionFor: '〜用', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index c920985b2618..e8ca402ad778 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'n.v.t.', noResultsFound: 'Geen resultaten gevonden', noResultsFoundMatching: (searchString: string) => `Geen resultaten gevonden voor "${searchString}"`, - suggestionsAvailable: 'Suggesties beschikbaar', + suggestionsAvailableFor: (searchString: string) => `Suggesties beschikbaar voor "${searchString}".`, recentDestinations: 'Recente bestemmingen', timePrefix: 'Het is', conjunctionFor: 'voor', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 2fdd4ec79bc5..752306926ffb 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'ND dotyczy', noResultsFound: 'Nie znaleziono wyników', noResultsFoundMatching: (searchString: string) => `Nie znaleziono wyników pasujących do „${searchString}”`, - suggestionsAvailable: 'Dostępne sugestie', + suggestionsAvailableFor: (searchString: string) => `Dostępne sugestie dla „${searchString}”.`, recentDestinations: 'Ostatnie miejsca docelowe', timePrefix: 'To jest', conjunctionFor: 'dla', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index b32fa22c4033..8b8542443d88 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nenhum resultado encontrado', noResultsFoundMatching: (searchString: string) => `Nenhum resultado encontrado para "${searchString}"`, - suggestionsAvailable: 'Sugestões disponíveis', + suggestionsAvailableFor: (searchString: string) => `Sugestões disponíveis para "${searchString}".`, recentDestinations: 'Destinos recentes', timePrefix: 'É', conjunctionFor: 'para', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 767be0bfd8ab..d194b95d723c 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: '不适用', noResultsFound: '未找到结果', noResultsFoundMatching: (searchString: string) => `未找到与”${searchString}”匹配的结果`, - suggestionsAvailable: '建议可用', + suggestionsAvailableFor: (searchString: string) => `”${searchString}”的建议可用。`, recentDestinations: '最近目的地', timePrefix: '它是', conjunctionFor: '用于', From 62851306aea9737ec237e0d01a40f5baf5249e7e Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Sun, 22 Mar 2026 16:09:04 +0000 Subject: [PATCH 13/17] Fix: Suppress suggestions announcement while results are loading The loading spinner's height exceeds the googleEmptyListViewHeight threshold, causing displayListViewBorder to become true before actual results arrive. This triggered the accessibility announcement prematurely. Extracts the list loader into an AddressSearchListLoader component that tracks mount/unmount to set isLoadingResults state, and adds !isLoadingResults to the announcement condition. Co-authored-by: Situ Chandra Shil --- src/components/AddressSearch/index.tsx | 28 +++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/components/AddressSearch/index.tsx b/src/components/AddressSearch/index.tsx index affdbd7ada7f..763e82c476b7 100644 --- a/src/components/AddressSearch/index.tsx +++ b/src/components/AddressSearch/index.tsx @@ -66,6 +66,22 @@ function AddressSearchListEmptyComponent({searchValue}: {searchValue: string}) { ); } +function AddressSearchListLoader({onLoadingChange}: {onLoadingChange: (isLoading: boolean) => void}) { + const styles = useThemeStyles(); + const reasonAttributes: SkeletonSpanReasonAttributes = {context: 'AddressSearch.listLoader'}; + + useEffect(() => { + onLoadingChange(true); + return () => onLoadingChange(false); + }, [onLoadingChange]); + + return ( + + + + ); +} + function AddressSearch({ canUseCurrentLocation = false, containerStyles, @@ -112,11 +128,12 @@ function AddressSearch({ const [searchValue, setSearchValue] = useState(''); const [locationErrorCode, setLocationErrorCode] = useState(null); const [isFetchingCurrentLocation, setIsFetchingCurrentLocation] = useState(false); + const [isLoadingResults, setIsLoadingResults] = useState(false); const shouldTriggerGeolocationCallbacks = useRef(true); const [shouldHidePredefinedPlaces, setShouldHidePredefinedPlaces] = useState(false); const containerRef = useRef(null); - useDebouncedAccessibilityAnnouncement(translate('common.suggestionsAvailableFor', searchValue), displayListViewBorder && isTyping, searchValue); + useDebouncedAccessibilityAnnouncement(translate('common.suggestionsAvailableFor', searchValue), displayListViewBorder && isTyping && !isLoadingResults, searchValue); const query = useMemo( () => ({ @@ -350,14 +367,7 @@ function AddressSearch({ const listEmptyComponent = isTyping ? : undefined; - const listLoader = useMemo(() => { - const reasonAttributes: SkeletonSpanReasonAttributes = {context: 'AddressSearch.listLoader'}; - return ( - - - - ); - }, [styles.pv4]); + const listLoader = useMemo(() => , []); const fetchingLocationReasonAttributes: SkeletonSpanReasonAttributes = { context: 'AddressSearch.isFetchingCurrentLocation', From 200d5278955654f206a205a7d8b785c2ae331bac Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Sun, 22 Mar 2026 16:12:42 +0000 Subject: [PATCH 14/17] Suppress suggestions announcement when list is empty The "suggestions available" announcement was firing even when showing "No results found" because displayListViewBorder was true based on layout height. Track empty state via onEmptyChange callback (same pattern as AddressSearchListLoader) and include !isListEmpty in the announcement condition. Co-authored-by: Situ Chandra Shil --- src/components/AddressSearch/index.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/AddressSearch/index.tsx b/src/components/AddressSearch/index.tsx index 763e82c476b7..6a253060a3e5 100644 --- a/src/components/AddressSearch/index.tsx +++ b/src/components/AddressSearch/index.tsx @@ -49,13 +49,18 @@ function isPlaceMatchForSearch(search: string, place: PredefinedPlace): boolean // VirtualizedList component with a VirtualizedList-backed instead LogBox.ignoreLogs(['VirtualizedLists should never be nested']); -function AddressSearchListEmptyComponent({searchValue}: {searchValue: string}) { +function AddressSearchListEmptyComponent({searchValue, onEmptyChange}: {searchValue: string; onEmptyChange: (isEmpty: boolean) => void}) { const styles = useThemeStyles(); const {translate} = useLocalize(); const noResultsFoundText = translate('common.noResultsFound'); useDebouncedAccessibilityAnnouncement(noResultsFoundText, true, searchValue); + useEffect(() => { + onEmptyChange(true); + return () => onEmptyChange(false); + }, [onEmptyChange]); + return ( (null); const [isFetchingCurrentLocation, setIsFetchingCurrentLocation] = useState(false); const [isLoadingResults, setIsLoadingResults] = useState(false); + const [isListEmpty, setIsListEmpty] = useState(false); const shouldTriggerGeolocationCallbacks = useRef(true); const [shouldHidePredefinedPlaces, setShouldHidePredefinedPlaces] = useState(false); const containerRef = useRef(null); - useDebouncedAccessibilityAnnouncement(translate('common.suggestionsAvailableFor', searchValue), displayListViewBorder && isTyping && !isLoadingResults, searchValue); + useDebouncedAccessibilityAnnouncement(translate('common.suggestionsAvailableFor', searchValue), displayListViewBorder && isTyping && !isLoadingResults && !isListEmpty, searchValue); const query = useMemo( () => ({ @@ -365,7 +371,7 @@ function AddressSearch({ return predefinedPlaces?.filter((predefinedPlace) => isPlaceMatchForSearch(searchValue, predefinedPlace)) ?? []; }, [predefinedPlaces, searchValue, shouldHidePredefinedPlaces]); - const listEmptyComponent = isTyping ? : undefined; + const listEmptyComponent = isTyping ? : undefined; const listLoader = useMemo(() => , []); From 6f4fbdfab42092fd49dab724bc92f6c07d5341a5 Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Sun, 22 Mar 2026 16:15:23 +0000 Subject: [PATCH 15/17] Fix: run prettier on AddressSearch component Co-authored-by: Situ Chandra Shil --- src/components/AddressSearch/index.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/AddressSearch/index.tsx b/src/components/AddressSearch/index.tsx index 6a253060a3e5..448f81ae4d1b 100644 --- a/src/components/AddressSearch/index.tsx +++ b/src/components/AddressSearch/index.tsx @@ -371,7 +371,12 @@ function AddressSearch({ return predefinedPlaces?.filter((predefinedPlace) => isPlaceMatchForSearch(searchValue, predefinedPlace)) ?? []; }, [predefinedPlaces, searchValue, shouldHidePredefinedPlaces]); - const listEmptyComponent = isTyping ? : undefined; + const listEmptyComponent = isTyping ? ( + + ) : undefined; const listLoader = useMemo(() => , []); From ee0a226a1031513f607b5c7bd10c84a6d6ed6b65 Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Sun, 22 Mar 2026 16:21:20 +0000 Subject: [PATCH 16/17] Fix: skip 'for' in announcement when searchString is empty and trim searchValue Co-authored-by: Situ Chandra Shil --- src/components/AddressSearch/index.tsx | 2 +- src/languages/de.ts | 2 +- src/languages/en.ts | 2 +- src/languages/es.ts | 2 +- src/languages/fr.ts | 2 +- src/languages/it.ts | 2 +- src/languages/ja.ts | 2 +- src/languages/nl.ts | 2 +- src/languages/pl.ts | 2 +- src/languages/pt-BR.ts | 2 +- src/languages/zh-hans.ts | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/AddressSearch/index.tsx b/src/components/AddressSearch/index.tsx index 448f81ae4d1b..3e8c9d40bf7a 100644 --- a/src/components/AddressSearch/index.tsx +++ b/src/components/AddressSearch/index.tsx @@ -139,7 +139,7 @@ function AddressSearch({ const [shouldHidePredefinedPlaces, setShouldHidePredefinedPlaces] = useState(false); const containerRef = useRef(null); - useDebouncedAccessibilityAnnouncement(translate('common.suggestionsAvailableFor', searchValue), displayListViewBorder && isTyping && !isLoadingResults && !isListEmpty, searchValue); + useDebouncedAccessibilityAnnouncement(translate('common.suggestionsAvailableFor', searchValue.trim()), displayListViewBorder && isTyping && !isLoadingResults && !isListEmpty, searchValue); const query = useMemo( () => ({ diff --git a/src/languages/de.ts b/src/languages/de.ts index 143afc0aae4d..371be35b9e3c 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'k. A.', noResultsFound: 'Keine Ergebnisse gefunden', noResultsFoundMatching: (searchString: string) => `Keine Ergebnisse gefunden für „${searchString}”`, - suggestionsAvailableFor: (searchString: string) => `Vorschläge verfügbar für „${searchString}”.`, + suggestionsAvailableFor: (searchString: string) => (searchString ? `Vorschläge verfügbar für „${searchString}”.` : 'Vorschläge verfügbar.'), recentDestinations: 'Letzte Ziele', timePrefix: 'Es ist', conjunctionFor: 'für', diff --git a/src/languages/en.ts b/src/languages/en.ts index fe14b42aa981..aed6a29b2187 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -253,7 +253,7 @@ const translations = { na: 'N/A', noResultsFound: 'No results found', noResultsFoundMatching: (searchString: string) => `No results found matching "${searchString}"`, - suggestionsAvailableFor: (searchString: string) => `Suggestions available for "${searchString}".`, + suggestionsAvailableFor: (searchString: string) => (searchString ? `Suggestions available for "${searchString}".` : 'Suggestions available.'), recentDestinations: 'Recent destinations', timePrefix: "It's", conjunctionFor: 'for', diff --git a/src/languages/es.ts b/src/languages/es.ts index 16207acbd46f..194d492e6935 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -156,7 +156,7 @@ const translations: TranslationDeepObject = { na: 'N/A', noResultsFound: 'No se han encontrado resultados', noResultsFoundMatching: (searchString: string) => `No se encontraron resultados que coincidan con "${searchString}"`, - suggestionsAvailableFor: (searchString: string) => `Sugerencias disponibles para "${searchString}".`, + suggestionsAvailableFor: (searchString: string) => (searchString ? `Sugerencias disponibles para "${searchString}".` : 'Sugerencias disponibles.'), recentDestinations: 'Destinos recientes', timePrefix: 'Son las', conjunctionFor: 'para', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 628675348f8d..c459d4f57c0d 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Aucun résultat trouvé', noResultsFoundMatching: (searchString: string) => `Aucun résultat trouvé correspondant à « ${searchString} »`, - suggestionsAvailableFor: (searchString: string) => `Suggestions disponibles pour « ${searchString} ».`, + suggestionsAvailableFor: (searchString: string) => (searchString ? `Suggestions disponibles pour « ${searchString} ».` : 'Suggestions disponibles.'), recentDestinations: 'Destinations récentes', timePrefix: "C'est", conjunctionFor: 'pour', diff --git a/src/languages/it.ts b/src/languages/it.ts index 65d996c094ed..663477b844d4 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nessun risultato trovato', noResultsFoundMatching: (searchString: string) => `Nessun risultato trovato per "${searchString}"`, - suggestionsAvailableFor: (searchString: string) => `Suggerimenti disponibili per "${searchString}".`, + suggestionsAvailableFor: (searchString: string) => (searchString ? `Suggerimenti disponibili per "${searchString}".` : 'Suggerimenti disponibili.'), recentDestinations: 'Destinazioni recenti', timePrefix: 'È', conjunctionFor: 'per', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 0d94e2e7646e..8bbd293a107b 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: '該当なし', noResultsFound: '結果が見つかりません', noResultsFoundMatching: (searchString: string) => `"${searchString}" に一致する結果は見つかりませんでした`, - suggestionsAvailableFor: (searchString: string) => `「${searchString}」の候補が利用可能です。`, + suggestionsAvailableFor: (searchString: string) => (searchString ? `「${searchString}」の候補が利用可能です。` : '候補が利用可能です。'), recentDestinations: '最近の宛先', timePrefix: 'それは', conjunctionFor: '〜用', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index e8ca402ad778..385c2e577d96 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'n.v.t.', noResultsFound: 'Geen resultaten gevonden', noResultsFoundMatching: (searchString: string) => `Geen resultaten gevonden voor "${searchString}"`, - suggestionsAvailableFor: (searchString: string) => `Suggesties beschikbaar voor "${searchString}".`, + suggestionsAvailableFor: (searchString: string) => (searchString ? `Suggesties beschikbaar voor "${searchString}".` : 'Suggesties beschikbaar.'), recentDestinations: 'Recente bestemmingen', timePrefix: 'Het is', conjunctionFor: 'voor', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 752306926ffb..c4634f2e8c8f 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'ND dotyczy', noResultsFound: 'Nie znaleziono wyników', noResultsFoundMatching: (searchString: string) => `Nie znaleziono wyników pasujących do „${searchString}”`, - suggestionsAvailableFor: (searchString: string) => `Dostępne sugestie dla „${searchString}”.`, + suggestionsAvailableFor: (searchString: string) => (searchString ? `Dostępne sugestie dla „${searchString}”.` : 'Dostępne sugestie.'), recentDestinations: 'Ostatnie miejsca docelowe', timePrefix: 'To jest', conjunctionFor: 'dla', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 8b8542443d88..a7ee7b1d4e10 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: 'N/D', noResultsFound: 'Nenhum resultado encontrado', noResultsFoundMatching: (searchString: string) => `Nenhum resultado encontrado para "${searchString}"`, - suggestionsAvailableFor: (searchString: string) => `Sugestões disponíveis para "${searchString}".`, + suggestionsAvailableFor: (searchString: string) => (searchString ? `Sugestões disponíveis para "${searchString}".` : 'Sugestões disponíveis.'), recentDestinations: 'Destinos recentes', timePrefix: 'É', conjunctionFor: 'para', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index d194b95d723c..559f46a3a79a 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -250,7 +250,7 @@ const translations: TranslationDeepObject = { na: '不适用', noResultsFound: '未找到结果', noResultsFoundMatching: (searchString: string) => `未找到与”${searchString}”匹配的结果`, - suggestionsAvailableFor: (searchString: string) => `”${searchString}”的建议可用。`, + suggestionsAvailableFor: (searchString: string) => (searchString ? `”${searchString}”的建议可用。` : '建议可用。'), recentDestinations: '最近目的地', timePrefix: '它是', conjunctionFor: '用于', From 2add63b21ecdb60e941cf5de84b0e7f2451d4277 Mon Sep 17 00:00:00 2001 From: "Situ Chandra Shil (via MelvinBot)" Date: Sun, 22 Mar 2026 16:22:28 +0000 Subject: [PATCH 17/17] Fix: apply Prettier formatting to AddressSearch Co-authored-by: Situ Chandra Shil --- src/components/AddressSearch/index.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/AddressSearch/index.tsx b/src/components/AddressSearch/index.tsx index 3e8c9d40bf7a..2f99a9531982 100644 --- a/src/components/AddressSearch/index.tsx +++ b/src/components/AddressSearch/index.tsx @@ -139,7 +139,11 @@ function AddressSearch({ const [shouldHidePredefinedPlaces, setShouldHidePredefinedPlaces] = useState(false); const containerRef = useRef(null); - useDebouncedAccessibilityAnnouncement(translate('common.suggestionsAvailableFor', searchValue.trim()), displayListViewBorder && isTyping && !isLoadingResults && !isListEmpty, searchValue); + useDebouncedAccessibilityAnnouncement( + translate('common.suggestionsAvailableFor', searchValue.trim()), + displayListViewBorder && isTyping && !isLoadingResults && !isListEmpty, + searchValue, + ); const query = useMemo( () => ({