diff options
author | surfdude29 <149612116+surfdude29@users.noreply.github.com> | 2025-04-02 23:44:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-02 15:44:03 -0700 |
commit | 4a7fa07e870c1afd506c2853a72929b0be27c13b (patch) | |
tree | e7356aa84e16ce04a11150664005b4d058784a1f /src/view/com/composer/Composer.tsx | |
parent | 0897a692dad5bead4440453fc0ba5ac1b36b1f5c (diff) | |
download | voidsky-4a7fa07e870c1afd506c2853a72929b0be27c13b.tar.zst |
Add plural formatting, translate and tweak some accessibility strings in composer (#7997)
* add plural formatting and translate accessibility strings * tweak accessibility label and add comments for translators * fix * tweak comments * make label conditionally plural * rm stray bracket * try to fix prettier * nope * lint * more lint * prettier --------- Co-authored-by: Hailey <me@haileyok.com>
Diffstat (limited to 'src/view/com/composer/Composer.tsx')
-rw-r--r-- | src/view/com/composer/Composer.tsx | 93 |
1 files changed, 69 insertions, 24 deletions
diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index e80b80449..4384783dc 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -12,17 +12,17 @@ import { BackHandler, Keyboard, KeyboardAvoidingView, - LayoutChangeEvent, + type LayoutChangeEvent, ScrollView, - StyleProp, + type StyleProp, StyleSheet, View, - ViewStyle, + type ViewStyle, } from 'react-native' // @ts-expect-error no type definition import ProgressCircle from 'react-native-progress/Circle' import Animated, { - AnimatedRef, + type AnimatedRef, Easing, FadeIn, FadeOut, @@ -41,15 +41,15 @@ import Animated, { ZoomOut, } from 'react-native-reanimated' import {useSafeAreaInsets} from 'react-native-safe-area-context' -import {ImagePickerAsset} from 'expo-image-picker' +import {type ImagePickerAsset} from 'expo-image-picker' import { AppBskyFeedDefs, - AppBskyFeedGetPostThread, - BskyAgent, - RichText, + type AppBskyFeedGetPostThread, + type BskyAgent, + type RichText, } from '@atproto/api' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' -import {msg, Trans} from '@lingui/macro' +import {msg, plural, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useQueryClient} from '@tanstack/react-query' @@ -59,7 +59,7 @@ import {until} from '#/lib/async/until' import { MAX_GRAPHEME_LENGTH, SUPPORTED_MIME_TYPES, - SupportedMimeTypes, + type SupportedMimeTypes, } from '#/lib/constants' import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' import {useEmail} from '#/lib/hooks/useEmail' @@ -75,7 +75,7 @@ import {logger} from '#/logger' import {isAndroid, isIOS, isNative, isWeb} from '#/platform/detection' import {useDialogStateControlContext} from '#/state/dialogs' import {emitPostCreated} from '#/state/events' -import {ComposerImage, pasteImage} from '#/state/gallery' +import {type ComposerImage, pasteImage} from '#/state/gallery' import {useModalControls} from '#/state/modals' import {useRequireAltTextEnabled} from '#/state/preferences' import { @@ -85,10 +85,10 @@ import { } from '#/state/preferences/languages' import {usePreferencesQuery} from '#/state/queries/preferences' import {useProfileQuery} from '#/state/queries/profile' -import {Gif} from '#/state/queries/tenor' +import {type Gif} from '#/state/queries/tenor' import {useAgent, useSession} from '#/state/session' import {useComposerControls} from '#/state/shell/composer' -import {ComposerOpts} from '#/state/shell/composer' +import {type ComposerOpts} from '#/state/shell/composer' import {CharProgress} from '#/view/com/composer/char-progress/CharProgress' import {ComposerReplyTo} from '#/view/com/composer/ComposerReplyTo' import { @@ -105,7 +105,10 @@ import {SelectLangBtn} from '#/view/com/composer/select-language/SelectLangBtn' import {SuggestedLanguage} from '#/view/com/composer/select-language/SuggestedLanguage' // TODO: Prevent naming components that coincide with RN primitives // due to linting false positives -import {TextInput, TextInputRef} from '#/view/com/composer/text-input/TextInput' +import { + TextInput, + type TextInputRef, +} from '#/view/com/composer/text-input/TextInput' import {ThreadgateBtn} from '#/view/com/composer/threadgate/ThreadgateBtn' import {SelectVideoBtn} from '#/view/com/composer/videos/SelectVideoBtn' import {SubtitleDialogBtn} from '#/view/com/composer/videos/SubtitleDialog' @@ -126,16 +129,21 @@ import * as Prompt from '#/components/Prompt' import {Text as NewText} from '#/components/Typography' import {BottomSheetPortalProvider} from '../../../../modules/bottom-sheet' import { - ComposerAction, + type ComposerAction, composerReducer, createComposerState, - EmbedDraft, + type EmbedDraft, MAX_IMAGES, - PostAction, - PostDraft, - ThreadDraft, + type PostAction, + type PostDraft, + type ThreadDraft, } from './state/composer' -import {NO_VIDEO, NoVideoState, processVideo, VideoState} from './state/video' +import { + NO_VIDEO, + type NoVideoState, + processVideo, + type VideoState, +} from './state/video' import {getVideoMetadata} from './videos/pickVideo' import {clearThumbnailCache} from './videos/VideoTranscodeBackdrop' @@ -835,7 +843,9 @@ let ComposerPost = React.memo(function ComposerPost({ accessible={true} accessibilityLabel={_(msg`Write post`)} accessibilityHint={_( - msg`Compose posts up to ${MAX_GRAPHEME_LENGTH} characters in length`, + msg`Compose posts up to ${plural(MAX_GRAPHEME_LENGTH || 0, { + other: '# characters', + })} in length`, )} /> </View> @@ -917,20 +927,23 @@ function ComposerTopBar({ children?: React.ReactNode }) { const pal = usePalette('default') + const {_} = useLingui() return ( <Animated.View style={topBarAnimatedStyle} layout={native(LinearTransition)}> <View style={styles.topbarInner}> <Button - label="Cancel" + label={_(msg`Cancel`)} variant="ghost" color="primary" shape="default" size="small" style={[a.rounded_full, a.py_sm, {paddingLeft: 7, paddingRight: 7}]} onPress={onCancel} - accessibilityHint="Closes post composer and discards post draft"> + accessibilityHint={_( + msg`Closes post composer and discards post draft`, + )}> <ButtonText style={[a.text_md]}> <Trans>Cancel</Trans> </ButtonText> @@ -946,7 +959,39 @@ function ComposerTopBar({ ) : ( <Button testID="composerPublishBtn" - label={isReply ? 'Publish reply' : 'Publish post'} + label={ + isReply + ? isThread + ? _( + msg({ + message: 'Publish replies', + comment: + 'Accessibility label for button to publish multiple replies in a thread', + }), + ) + : _( + msg({ + message: 'Publish reply', + comment: + 'Accessibility label for button to publish a single reply', + }), + ) + : isThread + ? _( + msg({ + message: 'Publish posts', + comment: + 'Accessibility label for button to publish multiple posts in a thread', + }), + ) + : _( + msg({ + message: 'Publish post', + comment: + 'Accessibility label for button to publish a single post', + }), + ) + } variant="solid" color="primary" shape="default" |