Merge branch 'patch-3' of https://github.com/quiple/social-app into quiple-patch-3

zio/stable
Paul Frazee 2024-03-19 12:29:22 -07:00
commit 14982b9393
30 changed files with 162 additions and 111 deletions

View File

@ -2,10 +2,10 @@ import React from 'react'
import {atoms as a, useBreakpoints, useTheme} from '#/alf' import {atoms as a, useBreakpoints, useTheme} from '#/alf'
import {View} from 'react-native' import {View} from 'react-native'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {Trans, msg} from '@lingui/macro'
import {CenteredView} from 'view/com/util/Views' import {CenteredView} from 'view/com/util/Views'
import {Loader} from '#/components/Loader' import {Loader} from '#/components/Loader'
import {msg, Trans} from '@lingui/macro'
import {cleanError} from 'lib/strings/errors' import {cleanError} from 'lib/strings/errors'
import {Button} from '#/components/Button' import {Button} from '#/components/Button'
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
@ -59,6 +59,7 @@ function ListFooterMaybeError({
onRetry?: () => Promise<unknown> onRetry?: () => Promise<unknown>
}) { }) {
const t = useTheme() const t = useTheme()
const {_} = useLingui()
if (!isError) return null if (!isError) return null
@ -84,7 +85,7 @@ function ListFooterMaybeError({
</Text> </Text>
<Button <Button
variant="gradient" variant="gradient"
label="Press to retry" label={_(msg`Press to retry`)}
style={[ style={[
a.align_center, a.align_center,
a.justify_center, a.justify_center,
@ -94,7 +95,7 @@ function ListFooterMaybeError({
a.py_sm, a.py_sm,
]} ]}
onPress={onRetry}> onPress={onRetry}>
Retry <Trans>Retry</Trans>
</Button> </Button>
</View> </View>
</View> </View>
@ -149,6 +150,7 @@ export function ListMaybePlaceholder({
const t = useTheme() const t = useTheme()
const {_} = useLingui() const {_} = useLingui()
const {gtMobile, gtTablet} = useBreakpoints() const {gtMobile, gtTablet} = useBreakpoints()
const {_} = useLingui()
if (!isLoading && isError) { if (!isLoading && isError) {
return ( return (

View File

@ -17,7 +17,7 @@ import {
ItemIconProps, ItemIconProps,
} from '#/components/Menu/types' } from '#/components/Menu/types'
import {Button, ButtonText} from '#/components/Button' import {Button, ButtonText} from '#/components/Button'
import {msg} from '@lingui/macro' import {Trans, msg} from '@lingui/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {isNative} from 'platform/detection' import {isNative} from 'platform/detection'
@ -209,7 +209,9 @@ function Cancel() {
variant="ghost" variant="ghost"
color="secondary" color="secondary"
onPress={() => control.close()}> onPress={() => control.close()}>
<ButtonText>Cancel</ButtonText> <ButtonText>
<Trans>Cancel</Trans>
</ButtonText>
</Button> </Button>
) )
} }

View File

@ -264,7 +264,9 @@ export function TagMenu({
variant="ghost" variant="ghost"
color="secondary" color="secondary"
onPress={() => control.close()}> onPress={() => control.close()}>
<ButtonText>Cancel</ButtonText> <ButtonText>
<Trans>Cancel</Trans>
</ButtonText>
</Button> </Button>
</> </>
)} )}

View File

@ -90,7 +90,9 @@ export function AdultContentEnabledPref({
a.align_center, a.align_center,
a.py_md, a.py_md,
]}> ]}>
<Text style={[a.font_bold]}>Enable Adult Content</Text> <Text style={[a.font_bold]}>
<Trans>Enable Adult Content</Trans>
</Text>
<Toggle.Switch /> <Toggle.Switch />
</View> </View>
</Toggle.Item> </Toggle.Item>
@ -111,7 +113,9 @@ export function AdultContentEnabledPref({
)} )}
<Prompt.Outer control={prompt}> <Prompt.Outer control={prompt}>
<Prompt.Title>Adult Content</Prompt.Title> <Prompt.Title>
<Trans>Adult Content</Trans>
</Prompt.Title>
<Prompt.Description> <Prompt.Description>
<Trans> <Trans>
Due to Apple policies, adult content can only be enabled on the web Due to Apple policies, adult content can only be enabled on the web
@ -119,7 +123,9 @@ export function AdultContentEnabledPref({
</Trans> </Trans>
</Prompt.Description> </Prompt.Description>
<Prompt.Actions> <Prompt.Actions>
<Prompt.Action onPress={() => prompt.close()}>OK</Prompt.Action> <Prompt.Action onPress={() => prompt.close()}>
<Trans>OK</Trans>
</Prompt.Action>
</Prompt.Actions> </Prompt.Actions>
</Prompt.Outer> </Prompt.Outer>
</> </>

View File

@ -52,7 +52,9 @@ export function HomeLoggedOutCTA() {
onPress={showCreateAccount} onPress={showCreateAccount}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Create new account`)} accessibilityLabel={_(msg`Create new account`)}
accessibilityHint="Opens flow to create a new Bluesky account"> accessibilityHint={_(
msg`Opens flow to create a new Bluesky account`,
)}>
<Text <Text
style={[ style={[
s.white, s.white,
@ -68,7 +70,9 @@ export function HomeLoggedOutCTA() {
onPress={showSignIn} onPress={showSignIn}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Sign in`)} accessibilityLabel={_(msg`Sign in`)}
accessibilityHint="Opens flow to sign into your existing Bluesky account"> accessibilityHint={_(
msg`Opens flow to sign into your existing Bluesky account`,
)}>
<Text <Text
style={[ style={[
pal.text, pal.text,

View File

@ -66,7 +66,9 @@ export const SplashScreen = ({
onPress={onPressCreateAccount} onPress={onPressCreateAccount}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Create new account`)} accessibilityLabel={_(msg`Create new account`)}
accessibilityHint="Opens flow to create a new Bluesky account"> accessibilityHint={_(
msg`Opens flow to create a new Bluesky account`,
)}>
<Text style={[s.white, styles.btnLabel]}> <Text style={[s.white, styles.btnLabel]}>
<Trans>Create a new account</Trans> <Trans>Create a new account</Trans>
</Text> </Text>
@ -77,7 +79,9 @@ export const SplashScreen = ({
onPress={onPressSignin} onPress={onPressSignin}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Sign in`)} accessibilityLabel={_(msg`Sign in`)}
accessibilityHint="Opens flow to sign into your existing Bluesky account"> accessibilityHint={_(
msg`Opens flow to sign into your existing Bluesky account`,
)}>
<Text style={[pal.text, styles.btnLabel]}> <Text style={[pal.text, styles.btnLabel]}>
<Trans>Sign In</Trans> <Trans>Sign In</Trans>
</Text> </Text>

View File

@ -9,6 +9,8 @@ import {TextLink} from '../../util/Link'
import {Text} from '../../util/text/Text' import {Text} from '../../util/text/Text'
import {s, colors} from 'lib/styles' import {s, colors} from 'lib/styles'
import {usePalette} from 'lib/hooks/usePalette' import {usePalette} from 'lib/hooks/usePalette'
import {Trans, msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'
type ServiceDescription = ComAtprotoServerDescribeServer.OutputSchema type ServiceDescription = ComAtprotoServerDescribeServer.OutputSchema
@ -20,6 +22,7 @@ export const Policies = ({
needsGuardian: boolean needsGuardian: boolean
}) => { }) => {
const pal = usePalette('default') const pal = usePalette('default')
const {_} = useLingui()
if (!serviceDescription) { if (!serviceDescription) {
return <View /> return <View />
} }
@ -40,7 +43,9 @@ export const Policies = ({
/> />
</View> </View>
<Text style={[pal.textLight, s.pl5, s.flex1]}> <Text style={[pal.textLight, s.pl5, s.flex1]}>
<Trans>
This service has not provided terms of service or a privacy policy. This service has not provided terms of service or a privacy policy.
</Trans>
</Text> </Text>
</View> </View>
) )
@ -51,7 +56,7 @@ export const Policies = ({
<TextLink <TextLink
key="tos" key="tos"
href={tos} href={tos}
text="Terms of Service" text={_(msg`Terms of Service`)}
style={[pal.link, s.underline]} style={[pal.link, s.underline]}
/>, />,
) )
@ -61,7 +66,7 @@ export const Policies = ({
<TextLink <TextLink
key="pp" key="pp"
href={pp} href={pp}
text="Privacy Policy" text={_(msg`Privacy Policy`)}
style={[pal.link, s.underline]} style={[pal.link, s.underline]}
/>, />,
) )
@ -79,12 +84,14 @@ export const Policies = ({
return ( return (
<View style={styles.policies}> <View style={styles.policies}>
<Text style={pal.textLight}> <Text style={pal.textLight}>
By creating an account you agree to the {els}. <Trans>By creating an account you agree to the {els}.</Trans>
</Text> </Text>
{needsGuardian && ( {needsGuardian && (
<Text style={[pal.textLight, s.bold]}> <Text style={[pal.textLight, s.bold]}>
<Trans>
If you are not yet an adult according to the laws of your country, If you are not yet an adult according to the laws of your country,
your parent or legal guardian must read these Terms on your behalf. your parent or legal guardian must read these Terms on your behalf.
</Trans>
</Text> </Text>
)} )}
</View> </View>

View File

@ -207,7 +207,7 @@ export const LoginForm = ({
testID="loginPasswordInput" testID="loginPasswordInput"
ref={passwordInputRef} ref={passwordInputRef}
style={[pal.text, styles.textInput]} style={[pal.text, styles.textInput]}
placeholder="Password" placeholder={_(msg`Password`)}
placeholderTextColor={pal.colors.textLight} placeholderTextColor={pal.colors.textLight}
autoCapitalize="none" autoCapitalize="none"
autoCorrect={false} autoCorrect={false}

View File

@ -11,7 +11,8 @@ import {Text} from 'view/com/util/text/Text'
import Animated, {FadeInRight} from 'react-native-reanimated' import Animated, {FadeInRight} from 'react-native-reanimated'
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
import {useAnalytics} from 'lib/analytics/analytics' import {useAnalytics} from 'lib/analytics/analytics'
import {Trans} from '@lingui/macro' import {useLingui} from '@lingui/react'
import {Trans, msg} from '@lingui/macro'
import {Shadow, useProfileShadow} from '#/state/cache/profile-shadow' import {Shadow, useProfileShadow} from '#/state/cache/profile-shadow'
import {useProfileFollowMutationQueue} from '#/state/queries/profile' import {useProfileFollowMutationQueue} from '#/state/queries/profile'
import {logger} from '#/logger' import {logger} from '#/logger'
@ -70,6 +71,7 @@ function ProfileCard({
}) { }) {
const {track} = useAnalytics() const {track} = useAnalytics()
const pal = usePalette('default') const pal = usePalette('default')
const {_} = useLingui()
const [addingMoreSuggestions, setAddingMoreSuggestions] = const [addingMoreSuggestions, setAddingMoreSuggestions] =
React.useState(false) React.useState(false)
const [queueFollow, queueUnfollow] = useProfileFollowMutationQueue( const [queueFollow, queueUnfollow] = useProfileFollowMutationQueue(
@ -136,7 +138,7 @@ function ProfileCard({
type={profile.viewer?.following ? 'default' : 'inverted'} type={profile.viewer?.following ? 'default' : 'inverted'}
labelStyle={styles.followButton} labelStyle={styles.followButton}
onPress={onToggleFollow} onPress={onToggleFollow}
label={profile.viewer?.following ? 'Unfollow' : 'Follow'} label={profile.viewer?.following ? _(msg`Unfollow`) : _(msg`Follow`)}
/> />
</View> </View>
{profile.description ? ( {profile.description ? (

View File

@ -6,7 +6,8 @@ import {usePalette} from 'lib/hooks/usePalette'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {Button} from 'view/com/util/forms/Button' import {Button} from 'view/com/util/forms/Button'
import {ViewHeader} from 'view/com/util/ViewHeader' import {ViewHeader} from 'view/com/util/ViewHeader'
import {Trans} from '@lingui/macro' import {useLingui} from '@lingui/react'
import {Trans, msg} from '@lingui/macro'
type Props = { type Props = {
next: () => void next: () => void
@ -15,6 +16,7 @@ type Props = {
export function WelcomeMobile({next, skip}: Props) { export function WelcomeMobile({next, skip}: Props) {
const pal = usePalette('default') const pal = usePalette('default')
const {_} = useLingui()
return ( return (
<View style={[styles.container]} testID="welcomeOnboarding"> <View style={[styles.container]} testID="welcomeOnboarding">
@ -91,7 +93,7 @@ export function WelcomeMobile({next, skip}: Props) {
<Button <Button
onPress={next} onPress={next}
label="Continue" label={_(msg`Continue`)}
testID="continueBtn" testID="continueBtn"
style={[styles.buttonContainer]} style={[styles.buttonContainer]}
labelStyle={styles.buttonText} labelStyle={styles.buttonText}

View File

@ -115,7 +115,7 @@ export function ServerInputDialog({
testID="customServerTextInput" testID="customServerTextInput"
value={customAddress} value={customAddress}
onChangeText={setCustomAddress} onChangeText={setCustomAddress}
label={_(msg`my-server.com`)} label="my-server.com"
accessibilityLabelledBy="address-input-label" accessibilityLabelledBy="address-input-label"
autoCapitalize="none" autoCapitalize="none"
keyboardType="url" keyboardType="url"

View File

@ -78,9 +78,9 @@ function LightboxFooter({imageIndex}: {imageIndex: number}) {
try { try {
await saveImageToMediaLibrary({uri}) await saveImageToMediaLibrary({uri})
Toast.show('Saved to your camera roll.') Toast.show(_(msg`Saved to your camera roll.`))
} catch (e: any) { } catch (e: any) {
Toast.show(`Failed to save image: ${String(e)}`) Toast.show(_(msg`Failed to save image: ${String(e)}`))
} }
}, },
[permissionResponse, requestPermission, _], [permissionResponse, requestPermission, _],

View File

@ -150,7 +150,7 @@ export function Inner({
accessibilityHint={_(msg`Exits handle change process`)} accessibilityHint={_(msg`Exits handle change process`)}
onAccessibilityEscape={onPressCancel}> onAccessibilityEscape={onPressCancel}>
<Text type="lg" style={pal.textLight}> <Text type="lg" style={pal.textLight}>
Cancel <Trans>Cancel</Trans>
</Text> </Text>
</TouchableOpacity> </TouchableOpacity>
</View> </View>
@ -254,7 +254,7 @@ function ProvidedHandleForm({
<TextInput <TextInput
testID="setHandleInput" testID="setHandleInput"
style={[pal.text, styles.textInput]} style={[pal.text, styles.textInput]}
placeholder="e.g. alice" placeholder={_(msg`e.g. alice`)}
placeholderTextColor={pal.colors.textLight} placeholderTextColor={pal.colors.textLight}
autoCapitalize="none" autoCapitalize="none"
keyboardAppearance={theme.colorScheme} keyboardAppearance={theme.colorScheme}
@ -277,8 +277,8 @@ function ProvidedHandleForm({
<TouchableOpacity <TouchableOpacity
onPress={onToggleCustom} onPress={onToggleCustom}
accessibilityRole="button" accessibilityRole="button"
accessibilityHint="Hosting provider" accessibilityLabel={_(msg`Hosting provider`)}
accessibilityLabel={_(msg`Opens modal for using custom domain`)}> accessibilityHint={_(msg`Opens modal for using custom domain`)}>
<Text type="md-medium" style={[pal.link, s.pl10, s.pt5]}> <Text type="md-medium" style={[pal.link, s.pl10, s.pt5]}>
<Trans>I have my own domain</Trans> <Trans>I have my own domain</Trans>
</Text> </Text>
@ -324,8 +324,8 @@ function CustomHandleForm({
Clipboard.setString( Clipboard.setString(
isDNSForm ? `did=${currentAccount.did}` : currentAccount.did, isDNSForm ? `did=${currentAccount.did}` : currentAccount.did,
) )
Toast.show('Copied to clipboard') Toast.show(_(msg`Copied to clipboard`))
}, [currentAccount, isDNSForm]) }, [currentAccount, isDNSForm, _])
const onChangeHandle = React.useCallback( const onChangeHandle = React.useCallback(
(v: string) => { (v: string) => {
setHandle(v) setHandle(v)
@ -378,7 +378,7 @@ function CustomHandleForm({
<TextInput <TextInput
testID="setHandleInput" testID="setHandleInput"
style={[pal.text, styles.textInput]} style={[pal.text, styles.textInput]}
placeholder="e.g. alice.com" placeholder={_(msg`e.g. alice.com`)}
placeholderTextColor={pal.colors.textLight} placeholderTextColor={pal.colors.textLight}
autoCapitalize="none" autoCapitalize="none"
keyboardAppearance={theme.colorScheme} keyboardAppearance={theme.colorScheme}
@ -387,7 +387,7 @@ function CustomHandleForm({
editable={!isProcessing} editable={!isProcessing}
accessibilityLabelledBy="customDomain" accessibilityLabelledBy="customDomain"
accessibilityLabel={_(msg`Custom domain`)} accessibilityLabel={_(msg`Custom domain`)}
accessibilityHint="Input your preferred hosting provider" accessibilityHint={_(msg`Input your preferred hosting provider`)}
/> />
</View> </View>
<View style={styles.spacer} /> <View style={styles.spacer} />
@ -395,18 +395,18 @@ function CustomHandleForm({
<View style={[styles.selectableBtns]}> <View style={[styles.selectableBtns]}>
<SelectableBtn <SelectableBtn
selected={isDNSForm} selected={isDNSForm}
label="DNS Panel" label={_(msg`DNS Panel`)}
left left
onSelect={() => setDNSForm(true)} onSelect={() => setDNSForm(true)}
accessibilityHint="Use the DNS panel" accessibilityHint={_(msg`Use the DNS panel`)}
style={s.flex1} style={s.flex1}
/> />
<SelectableBtn <SelectableBtn
selected={!isDNSForm} selected={!isDNSForm}
label="No DNS Panel" label={_(msg`No DNS Panel`)}
right right
onSelect={() => setDNSForm(false)} onSelect={() => setDNSForm(false)}
accessibilityHint="Use a file on your server" accessibilityHint={_(msg`Use a file on your server`)}
style={s.flex1} style={s.flex1}
/> />
</View> </View>
@ -418,7 +418,7 @@ function CustomHandleForm({
</Text> </Text>
<View style={[styles.dnsTable, pal.btn]}> <View style={[styles.dnsTable, pal.btn]}>
<Text type="md-medium" style={[styles.dnsLabel, pal.text]}> <Text type="md-medium" style={[styles.dnsLabel, pal.text]}>
Host: <Trans>Host:</Trans>
</Text> </Text>
<View style={[styles.dnsValue]}> <View style={[styles.dnsValue]}>
<Text type="mono" style={[styles.monoText, pal.text]}> <Text type="mono" style={[styles.monoText, pal.text]}>
@ -426,7 +426,7 @@ function CustomHandleForm({
</Text> </Text>
</View> </View>
<Text type="md-medium" style={[styles.dnsLabel, pal.text]}> <Text type="md-medium" style={[styles.dnsLabel, pal.text]}>
Type: <Trans>Type:</Trans>
</Text> </Text>
<View style={[styles.dnsValue]}> <View style={[styles.dnsValue]}>
<Text type="mono" style={[styles.monoText, pal.text]}> <Text type="mono" style={[styles.monoText, pal.text]}>
@ -434,7 +434,7 @@ function CustomHandleForm({
</Text> </Text>
</View> </View>
<Text type="md-medium" style={[styles.dnsLabel, pal.text]}> <Text type="md-medium" style={[styles.dnsLabel, pal.text]}>
Value: <Trans>Value:</Trans>
</Text> </Text>
<View style={[styles.dnsValue]}> <View style={[styles.dnsValue]}>
<Text type="mono" style={[styles.monoText, pal.text]}> <Text type="mono" style={[styles.monoText, pal.text]}>
@ -443,7 +443,7 @@ function CustomHandleForm({
</View> </View>
</View> </View>
<Text type="md" style={[pal.text, s.pt20, s.pl5]}> <Text type="md" style={[pal.text, s.pt20, s.pl5]}>
This should create a domain record at:{' '} <Trans>This should create a domain record at:</Trans>
</Text> </Text>
<Text type="mono" style={[styles.monoText, pal.text, s.pt5, s.pl5]}> <Text type="mono" style={[styles.monoText, pal.text, s.pt5, s.pl5]}>
_atproto.{handle} _atproto.{handle}
@ -463,7 +463,7 @@ function CustomHandleForm({
</View> </View>
<View style={styles.spacer} /> <View style={styles.spacer} />
<Text type="md" style={[pal.text, s.pb5, s.pl5]}> <Text type="md" style={[pal.text, s.pb5, s.pl5]}>
That contains the following: <Trans>That contains the following:</Trans>
</Text> </Text>
<View style={[styles.valueContainer, pal.btn]}> <View style={[styles.valueContainer, pal.btn]}>
<View style={[styles.dnsValue]}> <View style={[styles.dnsValue]}>
@ -478,7 +478,9 @@ function CustomHandleForm({
<View style={styles.spacer} /> <View style={styles.spacer} />
<Button type="default" style={[s.p20, s.mb10]} onPress={onPressCopy}> <Button type="default" style={[s.p20, s.mb10]} onPress={onPressCopy}>
<Text type="xl" style={[pal.link, s.textCenter]}> <Text type="xl" style={[pal.link, s.textCenter]}>
Copy {isDNSForm ? 'Domain Value' : 'File Contents'} <Trans>
Copy {isDNSForm ? _(msg`Domain Value`) : _(msg`File Contents`)}
</Trans>
</Text> </Text>
</Button> </Button>
{canSave === true && ( {canSave === true && (
@ -504,8 +506,8 @@ function CustomHandleForm({
) : ( ) : (
<Text type="xl-medium" style={[s.white, s.textCenter]}> <Text type="xl-medium" style={[s.white, s.textCenter]}>
{canSave {canSave
? `Update to ${handle}` ? _(msg`Update to ${handle}`)
: `Verify ${isDNSForm ? 'DNS Record' : 'Text File'}`} : _(msg`Verify ${isDNSForm ? 'DNS Record' : 'Text File'}`)}
</Text> </Text>
)} )}
</Button> </Button>
@ -513,9 +515,9 @@ function CustomHandleForm({
<TouchableOpacity <TouchableOpacity
onPress={onToggleCustom} onPress={onToggleCustom}
accessibilityLabel={_(msg`Use default provider`)} accessibilityLabel={_(msg`Use default provider`)}
accessibilityHint="Use bsky.social as hosting provider"> accessibilityHint={_(msg`Use bsky.social as hosting provider`)}>
<Text type="md-medium" style={[pal.link, s.pl10, s.pt5]}> <Text type="md-medium" style={[pal.link, s.pl10, s.pt5]}>
Nevermind, create a handle for me <Trans>Nevermind, create a handle for me</Trans>
</Text> </Text>
</TouchableOpacity> </TouchableOpacity>
</> </>

View File

@ -137,7 +137,9 @@ export function Component() {
<View> <View>
<View style={styles.titleSection}> <View style={styles.titleSection}>
<Text type="title-lg" style={[pal.text, styles.title]}> <Text type="title-lg" style={[pal.text, styles.title]}>
{stage !== Stages.Done ? 'Change Password' : 'Password Changed'} {stage !== Stages.Done
? _(msg`Change Password`)
: _(msg`Password Changed`)}
</Text> </Text>
</View> </View>
@ -180,7 +182,7 @@ export function Component() {
<TextInput <TextInput
testID="codeInput" testID="codeInput"
style={[pal.text, styles.textInput]} style={[pal.text, styles.textInput]}
placeholder="Reset code" placeholder={_(msg`Reset code`)}
placeholderTextColor={pal.colors.textLight} placeholderTextColor={pal.colors.textLight}
value={resetCode} value={resetCode}
onChangeText={setResetCode} onChangeText={setResetCode}
@ -207,7 +209,7 @@ export function Component() {
<TextInput <TextInput
testID="codeInput" testID="codeInput"
style={[pal.text, styles.textInput]} style={[pal.text, styles.textInput]}
placeholder="New password" placeholder={_(msg`New password`)}
placeholderTextColor={pal.colors.textLight} placeholderTextColor={pal.colors.textLight}
onChangeText={setNewPassword} onChangeText={setNewPassword}
secureTextEntry secureTextEntry

View File

@ -173,7 +173,7 @@ export function Component({}: {}) {
</Text> </Text>
<TextInput <TextInput
style={[styles.textInput, pal.borderDark, pal.text, styles.mb20]} style={[styles.textInput, pal.borderDark, pal.text, styles.mb20]}
placeholder="Confirmation code" placeholder={_(msg`Confirmation code`)}
placeholderTextColor={pal.textLight.color} placeholderTextColor={pal.textLight.color}
keyboardAppearance={theme.colorScheme} keyboardAppearance={theme.colorScheme}
value={confirmCode} value={confirmCode}
@ -192,7 +192,7 @@ export function Component({}: {}) {
</Text> </Text>
<TextInput <TextInput
style={[styles.textInput, pal.borderDark, pal.text]} style={[styles.textInput, pal.borderDark, pal.text]}
placeholder="Password" placeholder={_(msg`Password`)}
placeholderTextColor={pal.textLight.color} placeholderTextColor={pal.textLight.color}
keyboardAppearance={theme.colorScheme} keyboardAppearance={theme.colorScheme}
secureTextEntry secureTextEntry
@ -228,7 +228,7 @@ export function Component({}: {}) {
onPress={onCancel} onPress={onCancel}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Cancel account deletion`)} accessibilityLabel={_(msg`Cancel account deletion`)}
accessibilityHint="Exits account deletion process" accessibilityHint={_(msg`Exits account deletion process`)}
onAccessibilityEscape={onCancel}> onAccessibilityEscape={onCancel}>
<Text type="button-lg" style={pal.textLight}> <Text type="button-lg" style={pal.textLight}>
<Trans context="action">Cancel</Trans> <Trans context="action">Cancel</Trans>

View File

@ -77,7 +77,7 @@ export function Component({href}: {href: string}) {
}} }}
accessibilityLabel={_(msg`Cancel`)} accessibilityLabel={_(msg`Cancel`)}
accessibilityHint="" accessibilityHint=""
label="Cancel" label={_(msg`Cancel`)}
labelContainerStyle={{justifyContent: 'center', padding: 8}} labelContainerStyle={{justifyContent: 'center', padding: 8}}
labelStyle={[s.f18]} labelStyle={[s.f18]}
/> />

View File

@ -73,8 +73,8 @@ export function Component({text, href}: {text: string; href: string}) {
type="primary" type="primary"
onPress={onPressVisit} onPress={onPressVisit}
accessibilityLabel={_(msg`Visit Site`)} accessibilityLabel={_(msg`Visit Site`)}
accessibilityHint="" accessibilityHint={_(msg`Opens the linked website`)}
label="Visit Site" label={_(msg`Visit Site`)}
labelContainerStyle={{justifyContent: 'center', padding: 4}} labelContainerStyle={{justifyContent: 'center', padding: 4}}
labelStyle={[s.f18]} labelStyle={[s.f18]}
/> />
@ -85,8 +85,8 @@ export function Component({text, href}: {text: string; href: string}) {
closeModal() closeModal()
}} }}
accessibilityLabel={_(msg`Cancel`)} accessibilityLabel={_(msg`Cancel`)}
accessibilityHint="" accessibilityHint={_(msg`Cancels opening the linked website`)}
label="Cancel" label={_(msg`Cancel`)}
labelContainerStyle={{justifyContent: 'center', padding: 4}} labelContainerStyle={{justifyContent: 'center', padding: 4}}
labelStyle={[s.f18]} labelStyle={[s.f18]}
/> />

View File

@ -149,7 +149,7 @@ export function Component({showReminder}: {showReminder?: boolean}) {
onPress={onEmailIncorrect} onPress={onEmailIncorrect}
style={styles.changeEmailLink}> style={styles.changeEmailLink}>
<Text type="lg" style={pal.link}> <Text type="lg" style={pal.link}>
Change <Trans>Change</Trans>
</Text> </Text>
</Pressable> </Pressable>
</> </>

View File

@ -100,7 +100,7 @@ export function Component({
onPress={doSetAs(AspectRatio.Wide)} onPress={doSetAs(AspectRatio.Wide)}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Wide`)} accessibilityLabel={_(msg`Wide`)}
accessibilityHint="Sets image aspect ratio to wide"> accessibilityHint={_(msg`Sets image aspect ratio to wide`)}>
<RectWideIcon <RectWideIcon
size={24} size={24}
style={as === AspectRatio.Wide ? s.blue3 : pal.text} style={as === AspectRatio.Wide ? s.blue3 : pal.text}
@ -110,7 +110,7 @@ export function Component({
onPress={doSetAs(AspectRatio.Tall)} onPress={doSetAs(AspectRatio.Tall)}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Tall`)} accessibilityLabel={_(msg`Tall`)}
accessibilityHint="Sets image aspect ratio to tall"> accessibilityHint={_(msg`Sets image aspect ratio to tall`)}>
<RectTallIcon <RectTallIcon
size={24} size={24}
style={as === AspectRatio.Tall ? s.blue3 : pal.text} style={as === AspectRatio.Tall ? s.blue3 : pal.text}
@ -120,7 +120,7 @@ export function Component({
onPress={doSetAs(AspectRatio.Square)} onPress={doSetAs(AspectRatio.Square)}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Square`)} accessibilityLabel={_(msg`Square`)}
accessibilityHint="Sets image aspect ratio to square"> accessibilityHint={_(msg`Sets image aspect ratio to square`)}>
<SquareIcon <SquareIcon
size={24} size={24}
style={as === AspectRatio.Square ? s.blue3 : pal.text} style={as === AspectRatio.Square ? s.blue3 : pal.text}
@ -132,9 +132,9 @@ export function Component({
onPress={onPressCancel} onPress={onPressCancel}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Cancel image crop`)} accessibilityLabel={_(msg`Cancel image crop`)}
accessibilityHint="Exits image cropping process"> accessibilityHint={_(msg`Exits image cropping process`)}>
<Text type="xl" style={pal.link}> <Text type="xl" style={pal.link}>
Cancel <Trans>Cancel</Trans>
</Text> </Text>
</TouchableOpacity> </TouchableOpacity>
<View style={s.flex1} /> <View style={s.flex1} />
@ -142,7 +142,7 @@ export function Component({
onPress={onPressDone} onPress={onPressDone}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Save image crop`)} accessibilityLabel={_(msg`Save image crop`)}
accessibilityHint="Saves image crop settings"> accessibilityHint={_(msg`Saves image crop settings`)}>
<LinearGradient <LinearGradient
colors={[gradients.blueLight.start, gradients.blueLight.end]} colors={[gradients.blueLight.start, gradients.blueLight.end]}
start={{x: 0, y: 0}} start={{x: 0, y: 0}}

View File

@ -538,7 +538,7 @@ let PostThreadItemLoaded = ({
title={itemTitle} title={itemTitle}
noFeedback> noFeedback>
<Text type="sm-medium" style={pal.textLight}> <Text type="sm-medium" style={pal.textLight}>
More <Trans>More</Trans>
</Text> </Text>
<FontAwesomeIcon <FontAwesomeIcon
icon="angle-right" icon="angle-right"

View File

@ -21,7 +21,8 @@ import {useModerationOpts} from '#/state/queries/preferences'
import {useSuggestedFollowsByActorQuery} from '#/state/queries/suggested-follows' import {useSuggestedFollowsByActorQuery} from '#/state/queries/suggested-follows'
import {useProfileShadow} from '#/state/cache/profile-shadow' import {useProfileShadow} from '#/state/cache/profile-shadow'
import {useProfileFollowMutationQueue} from '#/state/queries/profile' import {useProfileFollowMutationQueue} from '#/state/queries/profile'
import {Trans} from '@lingui/macro' import {useLingui} from '@lingui/react'
import {Trans, msg} from '@lingui/macro'
const OUTER_PADDING = 10 const OUTER_PADDING = 10
const INNER_PADDING = 14 const INNER_PADDING = 14
@ -170,6 +171,7 @@ function SuggestedFollow({
}) { }) {
const {track} = useAnalytics() const {track} = useAnalytics()
const pal = usePalette('default') const pal = usePalette('default')
const {_} = useLingui()
const moderationOpts = useModerationOpts() const moderationOpts = useModerationOpts()
const profile = useProfileShadow(profileUnshadowed) const profile = useProfileShadow(profileUnshadowed)
const [queueFollow, queueUnfollow] = useProfileFollowMutationQueue( const [queueFollow, queueUnfollow] = useProfileFollowMutationQueue(
@ -183,20 +185,20 @@ function SuggestedFollow({
await queueFollow() await queueFollow()
} catch (e: any) { } catch (e: any) {
if (e?.name !== 'AbortError') { if (e?.name !== 'AbortError') {
Toast.show('An issue occurred, please try again.') Toast.show(_(msg`An issue occurred, please try again.`))
} }
} }
}, [queueFollow, track]) }, [queueFollow, track, _])
const onPressUnfollow = React.useCallback(async () => { const onPressUnfollow = React.useCallback(async () => {
try { try {
await queueUnfollow() await queueUnfollow()
} catch (e: any) { } catch (e: any) {
if (e?.name !== 'AbortError') { if (e?.name !== 'AbortError') {
Toast.show('An issue occurred, please try again.') Toast.show(_(msg`An issue occurred, please try again.`))
} }
} }
}, [queueUnfollow]) }, [queueUnfollow, _])
if (!moderationOpts) { if (!moderationOpts) {
return null return null
@ -241,7 +243,7 @@ function SuggestedFollow({
</View> </View>
<Button <Button
label={following ? 'Unfollow' : 'Follow'} label={following ? _(msg`Unfollow`) : _(msg`Follow`)}
type="inverted" type="inverted"
labelStyle={{textAlign: 'center'}} labelStyle={{textAlign: 'center'}}
onPress={following ? onPressUnfollow : onPressFollow} onPress={following ? onPressUnfollow : onPressFollow}

View File

@ -97,7 +97,7 @@ export function LanguageSettingsScreen(_props: Props) {
<Text style={[pal.text, s.pb10]}> <Text style={[pal.text, s.pb10]}>
<Trans> <Trans>
Select your app language for the default text to display in the Select your app language for the default text to display in the
app app.
</Trans> </Trans>
</Text> </Text>
@ -296,7 +296,7 @@ export function LanguageSettingsScreen(_props: Props) {
type="button" type="button"
style={[pal.text, {flexShrink: 1, overflow: 'hidden'}]} style={[pal.text, {flexShrink: 1, overflow: 'hidden'}]}
numberOfLines={1}> numberOfLines={1}>
{myLanguages.length ? myLanguages : 'Select languages'} {myLanguages.length ? myLanguages : _(msg`Select languages`)}
</Text> </Text>
</Button> </Button>
</View> </View>

View File

@ -51,7 +51,13 @@ export const NotFoundScreen = () => {
</Text> </Text>
<Button <Button
type="primary" type="primary"
label={canGoBack ? 'Go back' : 'Go home'} label={canGoBack ? _(msg`Go Back`) : _(msg`Go Home`)}
accessibilityLabel={canGoBack ? _(msg`Go back`) : _(msg`Go home`)}
accessibilityHint={
canGoBack
? _(msg`Returns to previous page`)
: _(msg`Returns to home page`)
}
onPress={onPressHome} onPress={onPressHome}
/> />
</View> </View>

View File

@ -108,8 +108,8 @@ export function ProfileFeedScreen(props: Props) {
<View style={{flexDirection: 'row'}}> <View style={{flexDirection: 'row'}}>
<Button <Button
type="default" type="default"
accessibilityLabel={_(msg`Go Back`)} accessibilityLabel={_(msg`Go back`)}
accessibilityHint="Return to previous page" accessibilityHint={_(msg`Returns to previous page`)}
onPress={onPressBack} onPress={onPressBack}
style={{flexShrink: 1}}> style={{flexShrink: 1}}>
<Text type="button" style={pal.text}> <Text type="button" style={pal.text}>

View File

@ -913,7 +913,7 @@ function ErrorScreen({error}: {error: string}) {
<View style={{flexDirection: 'row'}}> <View style={{flexDirection: 'row'}}>
<Button <Button
type="default" type="default"
accessibilityLabel={_(msg`Go Back`)} accessibilityLabel={_(msg`Go back`)}
accessibilityHint={_(msg`Return to previous page`)} accessibilityHint={_(msg`Return to previous page`)}
onPress={onPressBack} onPress={onPressBack}
style={{flexShrink: 1}}> style={{flexShrink: 1}}>

View File

@ -773,7 +773,7 @@ export function SearchScreen(
{searchHistory.length > 0 && ( {searchHistory.length > 0 && (
<View style={styles.searchHistoryContent}> <View style={styles.searchHistoryContent}>
<Text style={[pal.text, styles.searchHistoryTitle]}> <Text style={[pal.text, styles.searchHistoryTitle]}>
Recent Searches <Trans>Recent Searches</Trans>
</Text> </Text>
{searchHistory.map((historyItem, index) => ( {searchHistory.map((historyItem, index) => (
<View key={index} style={styles.historyItemContainer}> <View key={index} style={styles.historyItemContainer}>

View File

@ -78,8 +78,9 @@ export function ExportCarDialog({
<InlineLink <InlineLink
to="https://docs.bsky.app/blog/repo-export" to="https://docs.bsky.app/blog/repo-export"
style={[a.text_sm]}> style={[a.text_sm]}>
this blogpost. this blogpost
</InlineLink> </InlineLink>
.
</Trans> </Trans>
</P> </P>

View File

@ -487,20 +487,20 @@ export function SettingsScreen({}: Props) {
label={_(msg`System`)} label={_(msg`System`)}
left left
onSelect={() => setColorMode('system')} onSelect={() => setColorMode('system')}
accessibilityHint={_(msg`Set color theme to system setting`)} accessibilityHint={_(msg`Sets color theme to system setting`)}
/> />
<SelectableBtn <SelectableBtn
selected={colorMode === 'light'} selected={colorMode === 'light'}
label={_(msg`Light`)} label={_(msg`Light`)}
onSelect={() => setColorMode('light')} onSelect={() => setColorMode('light')}
accessibilityHint={_(msg`Set color theme to light`)} accessibilityHint={_(msg`Sets color theme to light`)}
/> />
<SelectableBtn <SelectableBtn
selected={colorMode === 'dark'} selected={colorMode === 'dark'}
label={_(msg`Dark`)} label={_(msg`Dark`)}
right right
onSelect={() => setColorMode('dark')} onSelect={() => setColorMode('dark')}
accessibilityHint={_(msg`Set color theme to dark`)} accessibilityHint={_(msg`Sets color theme to dark`)}
/> />
</View> </View>
</View> </View>
@ -519,14 +519,14 @@ export function SettingsScreen({}: Props) {
label={_(msg`Dim`)} label={_(msg`Dim`)}
left left
onSelect={() => setDarkTheme('dim')} onSelect={() => setDarkTheme('dim')}
accessibilityHint={_(msg`Set dark theme to the dim theme`)} accessibilityHint={_(msg`Sets dark theme to the dim theme`)}
/> />
<SelectableBtn <SelectableBtn
selected={darkTheme === 'dark'} selected={darkTheme === 'dark'}
label={_(msg`Dark`)} label={_(msg`Dark`)}
right right
onSelect={() => setDarkTheme('dark')} onSelect={() => setDarkTheme('dark')}
accessibilityHint={_(msg`Set dark theme to the dark theme`)} accessibilityHint={_(msg`Sets dark theme to the dark theme`)}
/> />
</View> </View>
</View> </View>
@ -546,8 +546,8 @@ export function SettingsScreen({}: Props) {
]} ]}
onPress={openFollowingFeedPreferences} onPress={openFollowingFeedPreferences}
accessibilityRole="button" accessibilityRole="button"
accessibilityHint="" accessibilityLabel={_(msg`Following feed preferences`)}
accessibilityLabel={_(msg`Opens the home feed preferences`)}> accessibilityHint={_(msg`Opens the Following feed preferences`)}>
<View style={[styles.iconContainer, pal.btn]}> <View style={[styles.iconContainer, pal.btn]}>
<FontAwesomeIcon <FontAwesomeIcon
icon="sliders" icon="sliders"
@ -567,8 +567,8 @@ export function SettingsScreen({}: Props) {
]} ]}
onPress={openThreadsPreferences} onPress={openThreadsPreferences}
accessibilityRole="button" accessibilityRole="button"
accessibilityHint="" accessibilityLabel={_(msg`Thread preferences`)}
accessibilityLabel={_(msg`Opens the threads preferences`)}> accessibilityHint={_(msg`Opens the threads preferences`)}>
<View style={[styles.iconContainer, pal.btn]}> <View style={[styles.iconContainer, pal.btn]}>
<FontAwesomeIcon <FontAwesomeIcon
icon={['far', 'comments']} icon={['far', 'comments']}
@ -587,9 +587,10 @@ export function SettingsScreen({}: Props) {
pal.view, pal.view,
isSwitchingAccounts && styles.dimmed, isSwitchingAccounts && styles.dimmed,
]} ]}
accessibilityHint="My Saved Feeds" onPress={onPressSavedFeeds}
accessibilityLabel={_(msg`Opens screen with all saved feeds`)} accessibilityRole="button"
onPress={onPressSavedFeeds}> accessibilityLabel={_(msg`My saved feeds`)}
accessibilityHint={_(msg`Opens screen with all saved feeds`)}>
<View style={[styles.iconContainer, pal.btn]}> <View style={[styles.iconContainer, pal.btn]}>
<HashtagIcon style={pal.text} size={18} strokeWidth={3} /> <HashtagIcon style={pal.text} size={18} strokeWidth={3} />
</View> </View>
@ -688,7 +689,7 @@ export function SettingsScreen({}: Props) {
onPress={onPressAppPasswords} onPress={onPressAppPasswords}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`App password settings`)} accessibilityLabel={_(msg`App password settings`)}
accessibilityHint={_(msg`Opens the app password settings page`)}> accessibilityHint={_(msg`Opens the app password settings`)}>
<View style={[styles.iconContainer, pal.btn]}> <View style={[styles.iconContainer, pal.btn]}>
<FontAwesomeIcon <FontAwesomeIcon
icon="lock" icon="lock"
@ -709,7 +710,9 @@ export function SettingsScreen({}: Props) {
onPress={isSwitchingAccounts ? undefined : onPressChangeHandle} onPress={isSwitchingAccounts ? undefined : onPressChangeHandle}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Change handle`)} accessibilityLabel={_(msg`Change handle`)}
accessibilityHint={_(msg`Choose a new Bluesky username or create`)}> accessibilityHint={_(
msg`Opens modal for choosing or creating a new Bluesky username`,
)}>
<View style={[styles.iconContainer, pal.btn]}> <View style={[styles.iconContainer, pal.btn]}>
<FontAwesomeIcon <FontAwesomeIcon
icon="at" icon="at"
@ -745,7 +748,9 @@ export function SettingsScreen({}: Props) {
onPress={() => openModal({name: 'change-password'})} onPress={() => openModal({name: 'change-password'})}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Change password`)} accessibilityLabel={_(msg`Change password`)}
accessibilityHint={_(msg`Change your Bluesky password`)}> accessibilityHint={_(
msg`Opens modal for changing your Bluesky password`,
)}>
<View style={[styles.iconContainer, pal.btn]}> <View style={[styles.iconContainer, pal.btn]}>
<FontAwesomeIcon <FontAwesomeIcon
icon="lock" icon="lock"
@ -767,7 +772,7 @@ export function SettingsScreen({}: Props) {
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Export my data`)} accessibilityLabel={_(msg`Export my data`)}
accessibilityHint={_( accessibilityHint={_(
msg`Download Bluesky account data (repository)`, msg`Opens modal for downloading Bluesky account data (repository)`,
)}> )}>
<View style={[styles.iconContainer, pal.btn]}> <View style={[styles.iconContainer, pal.btn]}>
<FontAwesomeIcon <FontAwesomeIcon
@ -786,7 +791,7 @@ export function SettingsScreen({}: Props) {
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Delete account`)} accessibilityLabel={_(msg`Delete account`)}
accessibilityHint={_( accessibilityHint={_(
msg`Opens modal for account deletion confirmation. Requires email code.`, msg`Opens modal for account deletion confirmation. Requires email code`,
)}> )}>
<View style={[styles.iconContainer, dangerBg]}> <View style={[styles.iconContainer, dangerBg]}>
<FontAwesomeIcon <FontAwesomeIcon
@ -804,8 +809,8 @@ export function SettingsScreen({}: Props) {
style={[pal.view, styles.linkCardNoIcon]} style={[pal.view, styles.linkCardNoIcon]}
onPress={onPressSystemLog} onPress={onPressSystemLog}
accessibilityRole="button" accessibilityRole="button"
accessibilityHint="Open system log" accessibilityLabel={_(msg`Open system log`)}
accessibilityLabel={_(msg`Opens the system log page`)}> accessibilityHint={_(msg`Opens the system log page`)}>
<Text type="lg" style={pal.text}> <Text type="lg" style={pal.text}>
<Trans>System log</Trans> <Trans>System log</Trans>
</Text> </Text>
@ -836,7 +841,7 @@ export function SettingsScreen({}: Props) {
style={[pal.view, styles.linkCardNoIcon]} style={[pal.view, styles.linkCardNoIcon]}
onPress={onPressResetPreferences} onPress={onPressResetPreferences}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Reset preferences`)} accessibilityLabel={_(msg`Reset preferences state`)}
accessibilityHint={_(msg`Resets the preferences state`)}> accessibilityHint={_(msg`Resets the preferences state`)}>
<Text type="lg" style={pal.text}> <Text type="lg" style={pal.text}>
<Trans>Reset preferences state</Trans> <Trans>Reset preferences state</Trans>
@ -846,7 +851,7 @@ export function SettingsScreen({}: Props) {
style={[pal.view, styles.linkCardNoIcon]} style={[pal.view, styles.linkCardNoIcon]}
onPress={onPressResetOnboarding} onPress={onPressResetOnboarding}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Reset onboarding`)} accessibilityLabel={_(msg`Reset onboarding state`)}
accessibilityHint={_(msg`Resets the onboarding state`)}> accessibilityHint={_(msg`Resets the onboarding state`)}>
<Text type="lg" style={pal.text}> <Text type="lg" style={pal.text}>
<Trans>Reset onboarding state</Trans> <Trans>Reset onboarding state</Trans>
@ -857,7 +862,7 @@ export function SettingsScreen({}: Props) {
onPress={clearAllLegacyStorage} onPress={clearAllLegacyStorage}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Clear all legacy storage data`)} accessibilityLabel={_(msg`Clear all legacy storage data`)}
accessibilityHint={_(msg`Clear all legacy storage data`)}> accessibilityHint={_(msg`Clears all legacy storage data`)}>
<Text type="lg" style={pal.text}> <Text type="lg" style={pal.text}>
<Trans> <Trans>
Clear all legacy storage data (restart after this) Clear all legacy storage data (restart after this)
@ -869,7 +874,7 @@ export function SettingsScreen({}: Props) {
onPress={clearAllStorage} onPress={clearAllStorage}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Clear all storage data`)} accessibilityLabel={_(msg`Clear all storage data`)}
accessibilityHint={_(msg`Clear all storage data`)}> accessibilityHint={_(msg`Clears all storage data`)}>
<Text type="lg" style={pal.text}> <Text type="lg" style={pal.text}>
<Trans>Clear all storage data (restart after this)</Trans> <Trans>Clear all storage data (restart after this)</Trans>
</Text> </Text>
@ -958,7 +963,7 @@ function EmailConfirmationNotice() {
]} ]}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Verify my email`)} accessibilityLabel={_(msg`Verify my email`)}
accessibilityHint="" accessibilityHint={_(msg`Opens modal for email verification`)}
onPress={() => openModal({name: 'verify-email'})}> onPress={() => openModal({name: 'verify-email'})}>
<FontAwesomeIcon <FontAwesomeIcon
icon="envelope" icon="envelope"

View File

@ -94,10 +94,12 @@ let DrawerProfileCard = ({
{formatCountShortOnly(profile?.followersCount ?? 0)} {formatCountShortOnly(profile?.followersCount ?? 0)}
</Text>{' '} </Text>{' '}
{pluralize(profile?.followersCount || 0, 'follower')} &middot;{' '} {pluralize(profile?.followersCount || 0, 'follower')} &middot;{' '}
<Trans>
<Text type="xl-medium" style={pal.text}> <Text type="xl-medium" style={pal.text}>
{formatCountShortOnly(profile?.followsCount ?? 0)} {formatCountShortOnly(profile?.followsCount ?? 0)}
</Text>{' '} </Text>{' '}
following following
</Trans>
</Text> </Text>
</TouchableOpacity> </TouchableOpacity>
) )

View File

@ -58,7 +58,7 @@ let NavSignupCard = ({}: {}): React.ReactNode => {
accessibilityHint={_(msg`Sign in`)} accessibilityHint={_(msg`Sign in`)}
accessibilityLabel={_(msg`Sign in`)}> accessibilityLabel={_(msg`Sign in`)}>
<Text type="md" style={[pal.text, s.bold]}> <Text type="md" style={[pal.text, s.bold]}>
Sign in <Trans>Sign in</Trans>
</Text> </Text>
</Button> </Button>
</View> </View>