diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 6ff19746a..bc713cfa6 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -158,6 +158,12 @@ const Tab = createBottomTabNavigator() /** * These "common screens" are reused across stacks. + * + * Note: Navigation titles use i18n._() which evaluates at setup time, not render time. + * This means they cannot dynamically respond to terminology preference changes. + * All in-app content (buttons, dialogs, messages) uses the terminology system, + * but these navigation bar titles remain static. This is a low-impact limitation + * as navigation titles are rarely noticed by users. */ function commonScreens(Stack: typeof Flat, unreadCountLabel?: string) { const title = (page: MessageDescriptor) => diff --git a/src/components/PostControls/BookmarkButton.tsx b/src/components/PostControls/BookmarkButton.tsx index d95ec7006..73af4c8a3 100644 --- a/src/components/PostControls/BookmarkButton.tsx +++ b/src/components/PostControls/BookmarkButton.tsx @@ -6,6 +6,8 @@ import {useLingui} from '@lingui/react' import type React from 'react' import {useCleanError} from '#/lib/hooks/useCleanError' +import {getTerminology} from '#/lib/strings/terminology' +import {useTerminologyPreference} from '#/state/preferences' import {logger} from '#/logger' import {type Shadow} from '#/state/cache/post-shadow' import {useBookmarkMutation} from '#/state/queries/bookmarks/useBookmarkMutation' @@ -29,6 +31,7 @@ export const BookmarkButton = memo(function BookmarkButton({ }): React.ReactNode { const t = useTheme() const {_} = useLingui() + const terminologyPreference = useTerminologyPreference() const {mutateAsync: bookmark} = useBookmarkMutation() const cleanError = useCleanError() const requireAuth = useRequireAuth() @@ -56,7 +59,11 @@ export const BookmarkButton = memo(function BookmarkButton({ - Skeet saved + {_(getTerminology(terminologyPreference, { + skeet: msg`Skeet saved`, + post: msg`Post saved`, + spell: msg`Spell saved`, + }))} {!disableUndo && ( - Removed from saved skeets + {_(getTerminology(terminologyPreference, { + skeet: msg`Removed from saved skeets`, + post: msg`Removed from saved posts`, + spell: msg`Removed from saved spells`, + }))} {!disableUndo && ( diff --git a/src/components/PostControls/PostMenu/PostMenuItems.tsx b/src/components/PostControls/PostMenu/PostMenuItems.tsx index 9622eaf0e..bd9c64acf 100644 --- a/src/components/PostControls/PostMenu/PostMenuItems.tsx +++ b/src/components/PostControls/PostMenu/PostMenuItems.tsx @@ -47,6 +47,7 @@ import {useProfileShadow} from '#/state/cache/profile-shadow' import {useFeedFeedbackContext} from '#/state/feed-feedback' import {useLanguagePrefs} from '#/state/preferences' import {useHiddenPosts, useHiddenPostsApi} from '#/state/preferences' +import {useTerminology} from '#/lib/hooks/useTerminology' import {usePinnedPostMutation} from '#/state/queries/pinned-post' import { usePostDeleteMutation, @@ -188,6 +189,7 @@ let PostMenuItems = ({ postUri: post.uri, rootPostUri: rootUri, }) + const terminology = useTerminology() const href = useMemo(() => { const urip = new AtUri(postUri) @@ -197,7 +199,7 @@ let PostMenuItems = ({ const onDeletePost = () => { deletePostMutate({uri: postUri}).then( () => { - Toast.show(_(msg({message: 'Skeet deleted', context: 'toast'}))) + Toast.show(_(msg({message: `${_(terminology.post)} deleted`, context: 'toast'}))) const route = getCurrentRoute(navigation.getState()) if (route.name === 'PostThread') { @@ -217,7 +219,7 @@ let PostMenuItems = ({ }, e => { logger.error('Failed to delete post', {message: e}) - Toast.show(_(msg`Failed to delete skeet, please try again`), 'xmark') + Toast.show(_(msg`Failed to delete ${_(terminology.post)}, please try again`), 'xmark') }, ) } @@ -475,8 +477,8 @@ let PostMenuItems = ({ }) Toast.show( isDetach - ? _(msg`Quote skeet was successfully detached`) - : _(msg`Quote skeet was re-attached`), + ? _(msg`Quote ${_(terminology.post)} was successfully detached`) + : _(msg`Quote ${_(terminology.post)} was re-attached`), ) } catch (e: any) { Toast.show( @@ -667,9 +669,9 @@ let PostMenuItems = ({ <> - {_(msg`Copy skeet text`)} + {_(msg`Copy ${_(terminology.post)} text`)} ) : ( - {_(msg`Sign in to view skeet`)} + {_(msg`Sign in to view ${_(terminology.post)}`)} )} @@ -847,13 +849,13 @@ let PostMenuItems = ({ label={ isReply ? _(msg`Hide reply for me`) - : _(msg`Hide skeet for me`) + : _(msg`Hide ${_(terminology.post)} for me`) } onPress={() => hidePromptControl.open()}> {isReply ? _(msg`Hide reply for me`) - : _(msg`Hide skeet for me`)} + : _(msg`Hide ${_(terminology.post)} for me`)} @@ -955,9 +957,9 @@ let PostMenuItems = ({ reportDialogControl.open()}> - {_(msg`Report skeet`)} + {_(msg`Report ${_(terminology.post)}`)} @@ -986,9 +988,9 @@ let PostMenuItems = ({ deletePromptControl.open()}> - {_(msg`Delete skeet`)} + {_(msg`Delete ${_(terminology.post)}`)} @@ -1000,9 +1002,9 @@ let PostMenuItems = ({