Mark more texts for localization

zio/stable
Minseo Lee 2024-02-14 11:06:37 +09:00
parent 836cff306e
commit 3f5bdd8be3
27 changed files with 127 additions and 93 deletions

View File

@ -85,7 +85,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>
@ -106,7 +108,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
@ -114,7 +118,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]}>
This service has not provided terms of service or a privacy policy. <Trans>
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]}>
If you are not yet an adult according to the laws of your country, <Trans>
your parent or legal guardian must read these Terms on your behalf. 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.
</Trans>
</Text> </Text>
)} )}
</View> </View>

View File

@ -30,7 +30,7 @@ export function Step3({
<TextInput <TextInput
testID="handleInput" testID="handleInput"
icon="at" icon="at"
placeholder="e.g. alice" placeholder={_(msg`e.g. alice`)}
value={uiState.handle} value={uiState.handle}
editable editable
autoFocus autoFocus

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 @@ export 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(profile) const [queueFollow, queueUnfollow] = useProfileFollowMutationQueue(profile)
@ -133,7 +135,7 @@ export 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

@ -180,7 +180,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 +207,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

@ -74,7 +74,7 @@ export function Component({text, href}: {text: string; href: string}) {
onPress={onPressVisit} onPress={onPressVisit}
accessibilityLabel={_(msg`Visit Site`)} accessibilityLabel={_(msg`Visit Site`)}
accessibilityHint="" accessibilityHint=""
label="Visit Site" label={_(msg`Visit Site`)}
labelContainerStyle={{justifyContent: 'center', padding: 4}} labelContainerStyle={{justifyContent: 'center', padding: 4}}
labelStyle={[s.f18]} labelStyle={[s.f18]}
/> />
@ -86,7 +86,7 @@ export function Component({text, href}: {text: string; href: string}) {
}} }}
accessibilityLabel={_(msg`Cancel`)} accessibilityLabel={_(msg`Cancel`)}
accessibilityHint="" accessibilityHint=""
label="Cancel" label={_(msg`Cancel`)}
labelContainerStyle={{justifyContent: 'center', padding: 4}} labelContainerStyle={{justifyContent: 'center', padding: 4}}
labelStyle={[s.f18]} labelStyle={[s.f18]}
/> />

View File

@ -115,7 +115,7 @@ export function Component({
closeModal() closeModal()
}}> }}>
<Text type="button-lg" style={[pal.textLight, s.textCenter, s.white]}> <Text type="button-lg" style={[pal.textLight, s.textCenter, s.white]}>
Okay <Trans>Okay</Trans>
</Text> </Text>
</Button> </Button>
</View> </View>

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

@ -39,7 +39,7 @@ export function InputIssueDetails({
onPress={goBack} onPress={goBack}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Add details`)} accessibilityLabel={_(msg`Add details`)}
accessibilityHint="Add more details to your report"> accessibilityHint={_(msg`Add more details to your report`)}>
<FontAwesomeIcon size={18} icon="angle-left" style={[pal.link]} /> <FontAwesomeIcon size={18} icon="angle-left" style={[pal.link]} />
<Text style={[pal.text, s.f18, pal.link]}> <Text style={[pal.text, s.f18, pal.link]}>
{' '} {' '}
@ -49,8 +49,8 @@ export function InputIssueDetails({
<View style={[pal.btn, styles.detailsInputContainer]}> <View style={[pal.btn, styles.detailsInputContainer]}>
<TextInput <TextInput
accessibilityLabel={_(msg`Text input field`)} accessibilityLabel={_(msg`Text input field`)}
accessibilityHint="Enter a reason for reporting this post." accessibilityHint={_(msg`Enter a reason for reporting this post.`)}
placeholder="Enter a reason or any other details here." placeholder={_(msg`Enter a reason or any other details here.`)}
placeholderTextColor={pal.textLight.color} placeholderTextColor={pal.textLight.color}
value={details} value={details}
onChangeText={setDetails} onChangeText={setDetails}

View File

@ -41,6 +41,7 @@ type ReportComponentProps =
export function Component(content: ReportComponentProps) { export function Component(content: ReportComponentProps) {
const {closeModal} = useModalControls() const {closeModal} = useModalControls()
const pal = usePalette('default') const pal = usePalette('default')
const {_} = useLingui()
const {isMobile} = useWebMediaQueries() const {isMobile} = useWebMediaQueries()
const [isProcessing, setIsProcessing] = useState(false) const [isProcessing, setIsProcessing] = useState(false)
const [showDetailsInput, setShowDetailsInput] = useState(false) const [showDetailsInput, setShowDetailsInput] = useState(false)
@ -77,7 +78,9 @@ export function Component(content: ReportComponentProps) {
}, },
reason: details, reason: details,
}) })
Toast.show("Thank you for your report! We'll look into it promptly.") Toast.show(
_(msg`Thank you for your report! We'll look into it promptly.`),
)
closeModal() closeModal()
return return
@ -189,7 +192,7 @@ const SelectIssue = ({
onPress={goToDetails} onPress={goToDetails}
accessibilityRole="button" accessibilityRole="button"
accessibilityLabel={_(msg`Add details`)} accessibilityLabel={_(msg`Add details`)}
accessibilityHint="Add more details to your report"> accessibilityHint={_(msg`Add more details to your report`)}>
<Text style={[s.f18, pal.link]}> <Text style={[s.f18, pal.link]}>
<Trans>Add details to report</Trans> <Trans>Add details to report</Trans>
</Text> </Text>

View File

@ -296,7 +296,7 @@ let PostThreadItemLoaded = ({
color={pal.colors.textLight} color={pal.colors.textLight}
/> />
<Text type="sm-medium" style={pal.textLight}> <Text type="sm-medium" style={pal.textLight}>
Muted <Trans>Muted</Trans>
</Text> </Text>
</View> </View>
)} )}
@ -578,7 +578,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
@ -168,6 +169,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(profile) const [queueFollow, queueUnfollow] = useProfileFollowMutationQueue(profile)
@ -178,20 +180,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
@ -236,7 +238,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>

View File

@ -69,8 +69,8 @@ export function ModerationScreen({}: Props) {
style={[styles.linkCard, pal.view]} style={[styles.linkCard, pal.view]}
onPress={onPressContentFiltering} onPress={onPressContentFiltering}
accessibilityRole="tab" accessibilityRole="tab"
accessibilityHint="Content filtering" accessibilityLabel={_(msg`Content filtering`)}
accessibilityLabel=""> accessibilityHint="">
<View style={[styles.iconContainer, pal.btn]}> <View style={[styles.iconContainer, pal.btn]}>
<FontAwesomeIcon <FontAwesomeIcon
icon="eye" icon="eye"

View File

@ -103,7 +103,7 @@ export function ProfileFeedScreen(props: Props) {
<Button <Button
type="default" type="default"
accessibilityLabel={_(msg`Go Back`)} accessibilityLabel={_(msg`Go Back`)}
accessibilityHint="Return to previous page" accessibilityHint={_(msg`Return 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

@ -531,8 +531,8 @@ export function SettingsScreen({}: Props) {
]} ]}
onPress={openHomeFeedPreferences} onPress={openHomeFeedPreferences}
accessibilityRole="button" accessibilityRole="button"
accessibilityHint="" accessibilityLabel={_(msg`Home feed preferences`)}
accessibilityLabel={_(msg`Opens the home feed preferences`)}> accessibilityHint={_(msg`Opens the home feed preferences`)}>
<View style={[styles.iconContainer, pal.btn]}> <View style={[styles.iconContainer, pal.btn]}>
<FontAwesomeIcon <FontAwesomeIcon
icon="sliders" icon="sliders"
@ -552,8 +552,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']}
@ -572,8 +572,8 @@ export function SettingsScreen({}: Props) {
pal.view, pal.view,
isSwitchingAccounts && styles.dimmed, isSwitchingAccounts && styles.dimmed,
]} ]}
accessibilityHint="My Saved Feeds" accessibilityLabel={_(msg`My saved feeds`)}
accessibilityLabel={_(msg`Opens screen with all saved feeds`)} accessibilityHint={_(msg`Opens screen with all saved feeds`)}
onPress={onPressSavedFeeds}> onPress={onPressSavedFeeds}>
<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} />
@ -730,7 +730,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 change your Bluesky password`,
)}>
<View style={[styles.iconContainer, pal.btn]}> <View style={[styles.iconContainer, pal.btn]}>
<FontAwesomeIcon <FontAwesomeIcon
icon="lock" icon="lock"
@ -752,7 +754,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 download Bluesky account data (repository)`,
)}> )}>
<View style={[styles.iconContainer, pal.btn]}> <View style={[styles.iconContainer, pal.btn]}>
<FontAwesomeIcon <FontAwesomeIcon
@ -789,8 +791,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>
@ -811,7 +813,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>
@ -821,7 +823,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>
@ -832,7 +834,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)
@ -844,7 +846,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>
@ -933,7 +935,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

@ -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>