Merge branch 'quiple-patch-3' into main
commit
9e4f81b156
|
@ -2,10 +2,10 @@ import React from 'react'
|
|||
import {atoms as a, useBreakpoints, useTheme} from '#/alf'
|
||||
import {View} from 'react-native'
|
||||
import {useLingui} from '@lingui/react'
|
||||
import {Trans, msg} from '@lingui/macro'
|
||||
|
||||
import {CenteredView} from 'view/com/util/Views'
|
||||
import {Loader} from '#/components/Loader'
|
||||
import {msg, Trans} from '@lingui/macro'
|
||||
import {cleanError} from 'lib/strings/errors'
|
||||
import {Button} from '#/components/Button'
|
||||
import {Text} from '#/components/Typography'
|
||||
|
@ -59,6 +59,7 @@ function ListFooterMaybeError({
|
|||
onRetry?: () => Promise<unknown>
|
||||
}) {
|
||||
const t = useTheme()
|
||||
const {_} = useLingui()
|
||||
|
||||
if (!isError) return null
|
||||
|
||||
|
@ -84,7 +85,7 @@ function ListFooterMaybeError({
|
|||
</Text>
|
||||
<Button
|
||||
variant="gradient"
|
||||
label="Press to retry"
|
||||
label={_(msg`Press to retry`)}
|
||||
style={[
|
||||
a.align_center,
|
||||
a.justify_center,
|
||||
|
@ -94,7 +95,7 @@ function ListFooterMaybeError({
|
|||
a.py_sm,
|
||||
]}
|
||||
onPress={onRetry}>
|
||||
Retry
|
||||
<Trans>Retry</Trans>
|
||||
</Button>
|
||||
</View>
|
||||
</View>
|
||||
|
@ -149,6 +150,7 @@ export function ListMaybePlaceholder({
|
|||
const t = useTheme()
|
||||
const {_} = useLingui()
|
||||
const {gtMobile, gtTablet} = useBreakpoints()
|
||||
const {_} = useLingui()
|
||||
|
||||
if (!isLoading && isError) {
|
||||
return (
|
||||
|
|
|
@ -17,7 +17,7 @@ import {
|
|||
ItemIconProps,
|
||||
} from '#/components/Menu/types'
|
||||
import {Button, ButtonText} from '#/components/Button'
|
||||
import {msg} from '@lingui/macro'
|
||||
import {Trans, msg} from '@lingui/macro'
|
||||
import {useLingui} from '@lingui/react'
|
||||
import {isNative} from 'platform/detection'
|
||||
|
||||
|
@ -209,7 +209,9 @@ function Cancel() {
|
|||
variant="ghost"
|
||||
color="secondary"
|
||||
onPress={() => control.close()}>
|
||||
<ButtonText>Cancel</ButtonText>
|
||||
<ButtonText>
|
||||
<Trans>Cancel</Trans>
|
||||
</ButtonText>
|
||||
</Button>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -264,7 +264,9 @@ export function TagMenu({
|
|||
variant="ghost"
|
||||
color="secondary"
|
||||
onPress={() => control.close()}>
|
||||
<ButtonText>Cancel</ButtonText>
|
||||
<ButtonText>
|
||||
<Trans>Cancel</Trans>
|
||||
</ButtonText>
|
||||
</Button>
|
||||
</>
|
||||
)}
|
||||
|
|
|
@ -90,7 +90,9 @@ export function AdultContentEnabledPref({
|
|||
a.align_center,
|
||||
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 />
|
||||
</View>
|
||||
</Toggle.Item>
|
||||
|
@ -111,7 +113,9 @@ export function AdultContentEnabledPref({
|
|||
)}
|
||||
|
||||
<Prompt.Outer control={prompt}>
|
||||
<Prompt.Title>Adult Content</Prompt.Title>
|
||||
<Prompt.Title>
|
||||
<Trans>Adult Content</Trans>
|
||||
</Prompt.Title>
|
||||
<Prompt.Description>
|
||||
<Trans>
|
||||
Due to Apple policies, adult content can only be enabled on the web
|
||||
|
@ -119,7 +123,9 @@ export function AdultContentEnabledPref({
|
|||
</Trans>
|
||||
</Prompt.Description>
|
||||
<Prompt.Actions>
|
||||
<Prompt.Action onPress={() => prompt.close()}>OK</Prompt.Action>
|
||||
<Prompt.Action onPress={() => prompt.close()}>
|
||||
<Trans>OK</Trans>
|
||||
</Prompt.Action>
|
||||
</Prompt.Actions>
|
||||
</Prompt.Outer>
|
||||
</>
|
||||
|
|
|
@ -52,7 +52,9 @@ export function HomeLoggedOutCTA() {
|
|||
onPress={showCreateAccount}
|
||||
accessibilityRole="button"
|
||||
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,
|
||||
|
@ -68,7 +70,9 @@ export function HomeLoggedOutCTA() {
|
|||
onPress={showSignIn}
|
||||
accessibilityRole="button"
|
||||
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,
|
||||
|
|
|
@ -66,7 +66,9 @@ export const SplashScreen = ({
|
|||
onPress={onPressCreateAccount}
|
||||
accessibilityRole="button"
|
||||
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]}>
|
||||
<Trans>Create a new account</Trans>
|
||||
</Text>
|
||||
|
@ -77,7 +79,9 @@ export const SplashScreen = ({
|
|||
onPress={onPressSignin}
|
||||
accessibilityRole="button"
|
||||
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]}>
|
||||
<Trans>Sign In</Trans>
|
||||
</Text>
|
||||
|
|
|
@ -9,6 +9,8 @@ import {TextLink} from '../../util/Link'
|
|||
import {Text} from '../../util/text/Text'
|
||||
import {s, colors} from 'lib/styles'
|
||||
import {usePalette} from 'lib/hooks/usePalette'
|
||||
import {Trans, msg} from '@lingui/macro'
|
||||
import {useLingui} from '@lingui/react'
|
||||
|
||||
type ServiceDescription = ComAtprotoServerDescribeServer.OutputSchema
|
||||
|
||||
|
@ -20,6 +22,7 @@ export const Policies = ({
|
|||
needsGuardian: boolean
|
||||
}) => {
|
||||
const pal = usePalette('default')
|
||||
const {_} = useLingui()
|
||||
if (!serviceDescription) {
|
||||
return <View />
|
||||
}
|
||||
|
@ -40,7 +43,9 @@ export const Policies = ({
|
|||
/>
|
||||
</View>
|
||||
<Text style={[pal.textLight, s.pl5, s.flex1]}>
|
||||
<Trans>
|
||||
This service has not provided terms of service or a privacy policy.
|
||||
</Trans>
|
||||
</Text>
|
||||
</View>
|
||||
)
|
||||
|
@ -51,7 +56,7 @@ export const Policies = ({
|
|||
<TextLink
|
||||
key="tos"
|
||||
href={tos}
|
||||
text="Terms of Service"
|
||||
text={_(msg`Terms of Service`)}
|
||||
style={[pal.link, s.underline]}
|
||||
/>,
|
||||
)
|
||||
|
@ -61,7 +66,7 @@ export const Policies = ({
|
|||
<TextLink
|
||||
key="pp"
|
||||
href={pp}
|
||||
text="Privacy Policy"
|
||||
text={_(msg`Privacy Policy`)}
|
||||
style={[pal.link, s.underline]}
|
||||
/>,
|
||||
)
|
||||
|
@ -79,12 +84,14 @@ export const Policies = ({
|
|||
return (
|
||||
<View style={styles.policies}>
|
||||
<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>
|
||||
{needsGuardian && (
|
||||
<Text style={[pal.textLight, s.bold]}>
|
||||
<Trans>
|
||||
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>
|
||||
)}
|
||||
</View>
|
||||
|
|
|
@ -207,7 +207,7 @@ export const LoginForm = ({
|
|||
testID="loginPasswordInput"
|
||||
ref={passwordInputRef}
|
||||
style={[pal.text, styles.textInput]}
|
||||
placeholder="Password"
|
||||
placeholder={_(msg`Password`)}
|
||||
placeholderTextColor={pal.colors.textLight}
|
||||
autoCapitalize="none"
|
||||
autoCorrect={false}
|
||||
|
|
|
@ -11,7 +11,8 @@ import {Text} from 'view/com/util/text/Text'
|
|||
import Animated, {FadeInRight} from 'react-native-reanimated'
|
||||
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
|
||||
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 {useProfileFollowMutationQueue} from '#/state/queries/profile'
|
||||
import {logger} from '#/logger'
|
||||
|
@ -70,6 +71,7 @@ function ProfileCard({
|
|||
}) {
|
||||
const {track} = useAnalytics()
|
||||
const pal = usePalette('default')
|
||||
const {_} = useLingui()
|
||||
const [addingMoreSuggestions, setAddingMoreSuggestions] =
|
||||
React.useState(false)
|
||||
const [queueFollow, queueUnfollow] = useProfileFollowMutationQueue(
|
||||
|
@ -136,7 +138,7 @@ function ProfileCard({
|
|||
type={profile.viewer?.following ? 'default' : 'inverted'}
|
||||
labelStyle={styles.followButton}
|
||||
onPress={onToggleFollow}
|
||||
label={profile.viewer?.following ? 'Unfollow' : 'Follow'}
|
||||
label={profile.viewer?.following ? _(msg`Unfollow`) : _(msg`Follow`)}
|
||||
/>
|
||||
</View>
|
||||
{profile.description ? (
|
||||
|
|
|
@ -6,7 +6,8 @@ import {usePalette} from 'lib/hooks/usePalette'
|
|||
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
|
||||
import {Button} from 'view/com/util/forms/Button'
|
||||
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 = {
|
||||
next: () => void
|
||||
|
@ -15,6 +16,7 @@ type Props = {
|
|||
|
||||
export function WelcomeMobile({next, skip}: Props) {
|
||||
const pal = usePalette('default')
|
||||
const {_} = useLingui()
|
||||
|
||||
return (
|
||||
<View style={[styles.container]} testID="welcomeOnboarding">
|
||||
|
@ -91,7 +93,7 @@ export function WelcomeMobile({next, skip}: Props) {
|
|||
|
||||
<Button
|
||||
onPress={next}
|
||||
label="Continue"
|
||||
label={_(msg`Continue`)}
|
||||
testID="continueBtn"
|
||||
style={[styles.buttonContainer]}
|
||||
labelStyle={styles.buttonText}
|
||||
|
|
|
@ -115,7 +115,7 @@ export function ServerInputDialog({
|
|||
testID="customServerTextInput"
|
||||
value={customAddress}
|
||||
onChangeText={setCustomAddress}
|
||||
label={_(msg`my-server.com`)}
|
||||
label="my-server.com"
|
||||
accessibilityLabelledBy="address-input-label"
|
||||
autoCapitalize="none"
|
||||
keyboardType="url"
|
||||
|
|
|
@ -78,9 +78,9 @@ function LightboxFooter({imageIndex}: {imageIndex: number}) {
|
|||
|
||||
try {
|
||||
await saveImageToMediaLibrary({uri})
|
||||
Toast.show('Saved to your camera roll.')
|
||||
Toast.show(_(msg`Saved to your camera roll.`))
|
||||
} catch (e: any) {
|
||||
Toast.show(`Failed to save image: ${String(e)}`)
|
||||
Toast.show(_(msg`Failed to save image: ${String(e)}`))
|
||||
}
|
||||
},
|
||||
[permissionResponse, requestPermission, _],
|
||||
|
|
|
@ -150,7 +150,7 @@ export function Inner({
|
|||
accessibilityHint={_(msg`Exits handle change process`)}
|
||||
onAccessibilityEscape={onPressCancel}>
|
||||
<Text type="lg" style={pal.textLight}>
|
||||
Cancel
|
||||
<Trans>Cancel</Trans>
|
||||
</Text>
|
||||
</TouchableOpacity>
|
||||
</View>
|
||||
|
@ -254,7 +254,7 @@ function ProvidedHandleForm({
|
|||
<TextInput
|
||||
testID="setHandleInput"
|
||||
style={[pal.text, styles.textInput]}
|
||||
placeholder="e.g. alice"
|
||||
placeholder={_(msg`e.g. alice`)}
|
||||
placeholderTextColor={pal.colors.textLight}
|
||||
autoCapitalize="none"
|
||||
keyboardAppearance={theme.colorScheme}
|
||||
|
@ -277,8 +277,8 @@ function ProvidedHandleForm({
|
|||
<TouchableOpacity
|
||||
onPress={onToggleCustom}
|
||||
accessibilityRole="button"
|
||||
accessibilityHint="Hosting provider"
|
||||
accessibilityLabel={_(msg`Opens modal for using custom domain`)}>
|
||||
accessibilityLabel={_(msg`Hosting provider`)}
|
||||
accessibilityHint={_(msg`Opens modal for using custom domain`)}>
|
||||
<Text type="md-medium" style={[pal.link, s.pl10, s.pt5]}>
|
||||
<Trans>I have my own domain</Trans>
|
||||
</Text>
|
||||
|
@ -324,8 +324,8 @@ function CustomHandleForm({
|
|||
Clipboard.setString(
|
||||
isDNSForm ? `did=${currentAccount.did}` : currentAccount.did,
|
||||
)
|
||||
Toast.show('Copied to clipboard')
|
||||
}, [currentAccount, isDNSForm])
|
||||
Toast.show(_(msg`Copied to clipboard`))
|
||||
}, [currentAccount, isDNSForm, _])
|
||||
const onChangeHandle = React.useCallback(
|
||||
(v: string) => {
|
||||
setHandle(v)
|
||||
|
@ -378,7 +378,7 @@ function CustomHandleForm({
|
|||
<TextInput
|
||||
testID="setHandleInput"
|
||||
style={[pal.text, styles.textInput]}
|
||||
placeholder="e.g. alice.com"
|
||||
placeholder={_(msg`e.g. alice.com`)}
|
||||
placeholderTextColor={pal.colors.textLight}
|
||||
autoCapitalize="none"
|
||||
keyboardAppearance={theme.colorScheme}
|
||||
|
@ -387,7 +387,7 @@ function CustomHandleForm({
|
|||
editable={!isProcessing}
|
||||
accessibilityLabelledBy="customDomain"
|
||||
accessibilityLabel={_(msg`Custom domain`)}
|
||||
accessibilityHint="Input your preferred hosting provider"
|
||||
accessibilityHint={_(msg`Input your preferred hosting provider`)}
|
||||
/>
|
||||
</View>
|
||||
<View style={styles.spacer} />
|
||||
|
@ -395,18 +395,18 @@ function CustomHandleForm({
|
|||
<View style={[styles.selectableBtns]}>
|
||||
<SelectableBtn
|
||||
selected={isDNSForm}
|
||||
label="DNS Panel"
|
||||
label={_(msg`DNS Panel`)}
|
||||
left
|
||||
onSelect={() => setDNSForm(true)}
|
||||
accessibilityHint="Use the DNS panel"
|
||||
accessibilityHint={_(msg`Use the DNS panel`)}
|
||||
style={s.flex1}
|
||||
/>
|
||||
<SelectableBtn
|
||||
selected={!isDNSForm}
|
||||
label="No DNS Panel"
|
||||
label={_(msg`No DNS Panel`)}
|
||||
right
|
||||
onSelect={() => setDNSForm(false)}
|
||||
accessibilityHint="Use a file on your server"
|
||||
accessibilityHint={_(msg`Use a file on your server`)}
|
||||
style={s.flex1}
|
||||
/>
|
||||
</View>
|
||||
|
@ -418,7 +418,7 @@ function CustomHandleForm({
|
|||
</Text>
|
||||
<View style={[styles.dnsTable, pal.btn]}>
|
||||
<Text type="md-medium" style={[styles.dnsLabel, pal.text]}>
|
||||
Host:
|
||||
<Trans>Host:</Trans>
|
||||
</Text>
|
||||
<View style={[styles.dnsValue]}>
|
||||
<Text type="mono" style={[styles.monoText, pal.text]}>
|
||||
|
@ -426,7 +426,7 @@ function CustomHandleForm({
|
|||
</Text>
|
||||
</View>
|
||||
<Text type="md-medium" style={[styles.dnsLabel, pal.text]}>
|
||||
Type:
|
||||
<Trans>Type:</Trans>
|
||||
</Text>
|
||||
<View style={[styles.dnsValue]}>
|
||||
<Text type="mono" style={[styles.monoText, pal.text]}>
|
||||
|
@ -434,7 +434,7 @@ function CustomHandleForm({
|
|||
</Text>
|
||||
</View>
|
||||
<Text type="md-medium" style={[styles.dnsLabel, pal.text]}>
|
||||
Value:
|
||||
<Trans>Value:</Trans>
|
||||
</Text>
|
||||
<View style={[styles.dnsValue]}>
|
||||
<Text type="mono" style={[styles.monoText, pal.text]}>
|
||||
|
@ -443,7 +443,7 @@ function CustomHandleForm({
|
|||
</View>
|
||||
</View>
|
||||
<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 type="mono" style={[styles.monoText, pal.text, s.pt5, s.pl5]}>
|
||||
_atproto.{handle}
|
||||
|
@ -463,7 +463,7 @@ function CustomHandleForm({
|
|||
</View>
|
||||
<View style={styles.spacer} />
|
||||
<Text type="md" style={[pal.text, s.pb5, s.pl5]}>
|
||||
That contains the following:
|
||||
<Trans>That contains the following:</Trans>
|
||||
</Text>
|
||||
<View style={[styles.valueContainer, pal.btn]}>
|
||||
<View style={[styles.dnsValue]}>
|
||||
|
@ -478,7 +478,9 @@ function CustomHandleForm({
|
|||
<View style={styles.spacer} />
|
||||
<Button type="default" style={[s.p20, s.mb10]} onPress={onPressCopy}>
|
||||
<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>
|
||||
</Button>
|
||||
{canSave === true && (
|
||||
|
@ -504,8 +506,8 @@ function CustomHandleForm({
|
|||
) : (
|
||||
<Text type="xl-medium" style={[s.white, s.textCenter]}>
|
||||
{canSave
|
||||
? `Update to ${handle}`
|
||||
: `Verify ${isDNSForm ? 'DNS Record' : 'Text File'}`}
|
||||
? _(msg`Update to ${handle}`)
|
||||
: _(msg`Verify ${isDNSForm ? 'DNS Record' : 'Text File'}`)}
|
||||
</Text>
|
||||
)}
|
||||
</Button>
|
||||
|
@ -513,9 +515,9 @@ function CustomHandleForm({
|
|||
<TouchableOpacity
|
||||
onPress={onToggleCustom}
|
||||
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]}>
|
||||
Nevermind, create a handle for me
|
||||
<Trans>Nevermind, create a handle for me</Trans>
|
||||
</Text>
|
||||
</TouchableOpacity>
|
||||
</>
|
||||
|
|
|
@ -137,7 +137,9 @@ export function Component() {
|
|||
<View>
|
||||
<View style={styles.titleSection}>
|
||||
<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>
|
||||
</View>
|
||||
|
||||
|
@ -180,7 +182,7 @@ export function Component() {
|
|||
<TextInput
|
||||
testID="codeInput"
|
||||
style={[pal.text, styles.textInput]}
|
||||
placeholder="Reset code"
|
||||
placeholder={_(msg`Reset code`)}
|
||||
placeholderTextColor={pal.colors.textLight}
|
||||
value={resetCode}
|
||||
onChangeText={setResetCode}
|
||||
|
@ -207,7 +209,7 @@ export function Component() {
|
|||
<TextInput
|
||||
testID="codeInput"
|
||||
style={[pal.text, styles.textInput]}
|
||||
placeholder="New password"
|
||||
placeholder={_(msg`New password`)}
|
||||
placeholderTextColor={pal.colors.textLight}
|
||||
onChangeText={setNewPassword}
|
||||
secureTextEntry
|
||||
|
|
|
@ -173,7 +173,7 @@ export function Component({}: {}) {
|
|||
</Text>
|
||||
<TextInput
|
||||
style={[styles.textInput, pal.borderDark, pal.text, styles.mb20]}
|
||||
placeholder="Confirmation code"
|
||||
placeholder={_(msg`Confirmation code`)}
|
||||
placeholderTextColor={pal.textLight.color}
|
||||
keyboardAppearance={theme.colorScheme}
|
||||
value={confirmCode}
|
||||
|
@ -192,7 +192,7 @@ export function Component({}: {}) {
|
|||
</Text>
|
||||
<TextInput
|
||||
style={[styles.textInput, pal.borderDark, pal.text]}
|
||||
placeholder="Password"
|
||||
placeholder={_(msg`Password`)}
|
||||
placeholderTextColor={pal.textLight.color}
|
||||
keyboardAppearance={theme.colorScheme}
|
||||
secureTextEntry
|
||||
|
@ -228,7 +228,7 @@ export function Component({}: {}) {
|
|||
onPress={onCancel}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Cancel account deletion`)}
|
||||
accessibilityHint="Exits account deletion process"
|
||||
accessibilityHint={_(msg`Exits account deletion process`)}
|
||||
onAccessibilityEscape={onCancel}>
|
||||
<Text type="button-lg" style={pal.textLight}>
|
||||
<Trans context="action">Cancel</Trans>
|
||||
|
|
|
@ -77,7 +77,7 @@ export function Component({href}: {href: string}) {
|
|||
}}
|
||||
accessibilityLabel={_(msg`Cancel`)}
|
||||
accessibilityHint=""
|
||||
label="Cancel"
|
||||
label={_(msg`Cancel`)}
|
||||
labelContainerStyle={{justifyContent: 'center', padding: 8}}
|
||||
labelStyle={[s.f18]}
|
||||
/>
|
||||
|
|
|
@ -73,8 +73,8 @@ export function Component({text, href}: {text: string; href: string}) {
|
|||
type="primary"
|
||||
onPress={onPressVisit}
|
||||
accessibilityLabel={_(msg`Visit Site`)}
|
||||
accessibilityHint=""
|
||||
label="Visit Site"
|
||||
accessibilityHint={_(msg`Opens the linked website`)}
|
||||
label={_(msg`Visit Site`)}
|
||||
labelContainerStyle={{justifyContent: 'center', padding: 4}}
|
||||
labelStyle={[s.f18]}
|
||||
/>
|
||||
|
@ -85,8 +85,8 @@ export function Component({text, href}: {text: string; href: string}) {
|
|||
closeModal()
|
||||
}}
|
||||
accessibilityLabel={_(msg`Cancel`)}
|
||||
accessibilityHint=""
|
||||
label="Cancel"
|
||||
accessibilityHint={_(msg`Cancels opening the linked website`)}
|
||||
label={_(msg`Cancel`)}
|
||||
labelContainerStyle={{justifyContent: 'center', padding: 4}}
|
||||
labelStyle={[s.f18]}
|
||||
/>
|
||||
|
|
|
@ -149,7 +149,7 @@ export function Component({showReminder}: {showReminder?: boolean}) {
|
|||
onPress={onEmailIncorrect}
|
||||
style={styles.changeEmailLink}>
|
||||
<Text type="lg" style={pal.link}>
|
||||
Change
|
||||
<Trans>Change</Trans>
|
||||
</Text>
|
||||
</Pressable>
|
||||
</>
|
||||
|
|
|
@ -100,7 +100,7 @@ export function Component({
|
|||
onPress={doSetAs(AspectRatio.Wide)}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Wide`)}
|
||||
accessibilityHint="Sets image aspect ratio to wide">
|
||||
accessibilityHint={_(msg`Sets image aspect ratio to wide`)}>
|
||||
<RectWideIcon
|
||||
size={24}
|
||||
style={as === AspectRatio.Wide ? s.blue3 : pal.text}
|
||||
|
@ -110,7 +110,7 @@ export function Component({
|
|||
onPress={doSetAs(AspectRatio.Tall)}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Tall`)}
|
||||
accessibilityHint="Sets image aspect ratio to tall">
|
||||
accessibilityHint={_(msg`Sets image aspect ratio to tall`)}>
|
||||
<RectTallIcon
|
||||
size={24}
|
||||
style={as === AspectRatio.Tall ? s.blue3 : pal.text}
|
||||
|
@ -120,7 +120,7 @@ export function Component({
|
|||
onPress={doSetAs(AspectRatio.Square)}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Square`)}
|
||||
accessibilityHint="Sets image aspect ratio to square">
|
||||
accessibilityHint={_(msg`Sets image aspect ratio to square`)}>
|
||||
<SquareIcon
|
||||
size={24}
|
||||
style={as === AspectRatio.Square ? s.blue3 : pal.text}
|
||||
|
@ -132,9 +132,9 @@ export function Component({
|
|||
onPress={onPressCancel}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Cancel image crop`)}
|
||||
accessibilityHint="Exits image cropping process">
|
||||
accessibilityHint={_(msg`Exits image cropping process`)}>
|
||||
<Text type="xl" style={pal.link}>
|
||||
Cancel
|
||||
<Trans>Cancel</Trans>
|
||||
</Text>
|
||||
</TouchableOpacity>
|
||||
<View style={s.flex1} />
|
||||
|
@ -142,7 +142,7 @@ export function Component({
|
|||
onPress={onPressDone}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Save image crop`)}
|
||||
accessibilityHint="Saves image crop settings">
|
||||
accessibilityHint={_(msg`Saves image crop settings`)}>
|
||||
<LinearGradient
|
||||
colors={[gradients.blueLight.start, gradients.blueLight.end]}
|
||||
start={{x: 0, y: 0}}
|
||||
|
|
|
@ -538,7 +538,7 @@ let PostThreadItemLoaded = ({
|
|||
title={itemTitle}
|
||||
noFeedback>
|
||||
<Text type="sm-medium" style={pal.textLight}>
|
||||
More
|
||||
<Trans>More</Trans>
|
||||
</Text>
|
||||
<FontAwesomeIcon
|
||||
icon="angle-right"
|
||||
|
|
|
@ -21,7 +21,8 @@ import {useModerationOpts} from '#/state/queries/preferences'
|
|||
import {useSuggestedFollowsByActorQuery} from '#/state/queries/suggested-follows'
|
||||
import {useProfileShadow} from '#/state/cache/profile-shadow'
|
||||
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 INNER_PADDING = 14
|
||||
|
@ -170,6 +171,7 @@ function SuggestedFollow({
|
|||
}) {
|
||||
const {track} = useAnalytics()
|
||||
const pal = usePalette('default')
|
||||
const {_} = useLingui()
|
||||
const moderationOpts = useModerationOpts()
|
||||
const profile = useProfileShadow(profileUnshadowed)
|
||||
const [queueFollow, queueUnfollow] = useProfileFollowMutationQueue(
|
||||
|
@ -183,20 +185,20 @@ function SuggestedFollow({
|
|||
await queueFollow()
|
||||
} catch (e: any) {
|
||||
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 () => {
|
||||
try {
|
||||
await queueUnfollow()
|
||||
} catch (e: any) {
|
||||
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) {
|
||||
return null
|
||||
|
@ -241,7 +243,7 @@ function SuggestedFollow({
|
|||
</View>
|
||||
|
||||
<Button
|
||||
label={following ? 'Unfollow' : 'Follow'}
|
||||
label={following ? _(msg`Unfollow`) : _(msg`Follow`)}
|
||||
type="inverted"
|
||||
labelStyle={{textAlign: 'center'}}
|
||||
onPress={following ? onPressUnfollow : onPressFollow}
|
||||
|
|
|
@ -97,7 +97,7 @@ export function LanguageSettingsScreen(_props: Props) {
|
|||
<Text style={[pal.text, s.pb10]}>
|
||||
<Trans>
|
||||
Select your app language for the default text to display in the
|
||||
app
|
||||
app.
|
||||
</Trans>
|
||||
</Text>
|
||||
|
||||
|
@ -296,7 +296,7 @@ export function LanguageSettingsScreen(_props: Props) {
|
|||
type="button"
|
||||
style={[pal.text, {flexShrink: 1, overflow: 'hidden'}]}
|
||||
numberOfLines={1}>
|
||||
{myLanguages.length ? myLanguages : 'Select languages'}
|
||||
{myLanguages.length ? myLanguages : _(msg`Select languages`)}
|
||||
</Text>
|
||||
</Button>
|
||||
</View>
|
||||
|
|
|
@ -51,7 +51,13 @@ export const NotFoundScreen = () => {
|
|||
</Text>
|
||||
<Button
|
||||
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}
|
||||
/>
|
||||
</View>
|
||||
|
|
|
@ -108,8 +108,8 @@ export function ProfileFeedScreen(props: Props) {
|
|||
<View style={{flexDirection: 'row'}}>
|
||||
<Button
|
||||
type="default"
|
||||
accessibilityLabel={_(msg`Go Back`)}
|
||||
accessibilityHint="Return to previous page"
|
||||
accessibilityLabel={_(msg`Go back`)}
|
||||
accessibilityHint={_(msg`Returns to previous page`)}
|
||||
onPress={onPressBack}
|
||||
style={{flexShrink: 1}}>
|
||||
<Text type="button" style={pal.text}>
|
||||
|
|
|
@ -913,7 +913,7 @@ function ErrorScreen({error}: {error: string}) {
|
|||
<View style={{flexDirection: 'row'}}>
|
||||
<Button
|
||||
type="default"
|
||||
accessibilityLabel={_(msg`Go Back`)}
|
||||
accessibilityLabel={_(msg`Go back`)}
|
||||
accessibilityHint={_(msg`Return to previous page`)}
|
||||
onPress={onPressBack}
|
||||
style={{flexShrink: 1}}>
|
||||
|
|
|
@ -773,7 +773,7 @@ export function SearchScreen(
|
|||
{searchHistory.length > 0 && (
|
||||
<View style={styles.searchHistoryContent}>
|
||||
<Text style={[pal.text, styles.searchHistoryTitle]}>
|
||||
Recent Searches
|
||||
<Trans>Recent Searches</Trans>
|
||||
</Text>
|
||||
{searchHistory.map((historyItem, index) => (
|
||||
<View key={index} style={styles.historyItemContainer}>
|
||||
|
|
|
@ -78,8 +78,9 @@ export function ExportCarDialog({
|
|||
<InlineLink
|
||||
to="https://docs.bsky.app/blog/repo-export"
|
||||
style={[a.text_sm]}>
|
||||
this blogpost.
|
||||
this blogpost
|
||||
</InlineLink>
|
||||
.
|
||||
</Trans>
|
||||
</P>
|
||||
|
||||
|
|
|
@ -487,20 +487,20 @@ export function SettingsScreen({}: Props) {
|
|||
label={_(msg`System`)}
|
||||
left
|
||||
onSelect={() => setColorMode('system')}
|
||||
accessibilityHint={_(msg`Set color theme to system setting`)}
|
||||
accessibilityHint={_(msg`Sets color theme to system setting`)}
|
||||
/>
|
||||
<SelectableBtn
|
||||
selected={colorMode === 'light'}
|
||||
label={_(msg`Light`)}
|
||||
onSelect={() => setColorMode('light')}
|
||||
accessibilityHint={_(msg`Set color theme to light`)}
|
||||
accessibilityHint={_(msg`Sets color theme to light`)}
|
||||
/>
|
||||
<SelectableBtn
|
||||
selected={colorMode === 'dark'}
|
||||
label={_(msg`Dark`)}
|
||||
right
|
||||
onSelect={() => setColorMode('dark')}
|
||||
accessibilityHint={_(msg`Set color theme to dark`)}
|
||||
accessibilityHint={_(msg`Sets color theme to dark`)}
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
|
@ -519,14 +519,14 @@ export function SettingsScreen({}: Props) {
|
|||
label={_(msg`Dim`)}
|
||||
left
|
||||
onSelect={() => setDarkTheme('dim')}
|
||||
accessibilityHint={_(msg`Set dark theme to the dim theme`)}
|
||||
accessibilityHint={_(msg`Sets dark theme to the dim theme`)}
|
||||
/>
|
||||
<SelectableBtn
|
||||
selected={darkTheme === 'dark'}
|
||||
label={_(msg`Dark`)}
|
||||
right
|
||||
onSelect={() => setDarkTheme('dark')}
|
||||
accessibilityHint={_(msg`Set dark theme to the dark theme`)}
|
||||
accessibilityHint={_(msg`Sets dark theme to the dark theme`)}
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
|
@ -546,8 +546,8 @@ export function SettingsScreen({}: Props) {
|
|||
]}
|
||||
onPress={openFollowingFeedPreferences}
|
||||
accessibilityRole="button"
|
||||
accessibilityHint=""
|
||||
accessibilityLabel={_(msg`Opens the home feed preferences`)}>
|
||||
accessibilityLabel={_(msg`Following feed preferences`)}
|
||||
accessibilityHint={_(msg`Opens the Following feed preferences`)}>
|
||||
<View style={[styles.iconContainer, pal.btn]}>
|
||||
<FontAwesomeIcon
|
||||
icon="sliders"
|
||||
|
@ -567,8 +567,8 @@ export function SettingsScreen({}: Props) {
|
|||
]}
|
||||
onPress={openThreadsPreferences}
|
||||
accessibilityRole="button"
|
||||
accessibilityHint=""
|
||||
accessibilityLabel={_(msg`Opens the threads preferences`)}>
|
||||
accessibilityLabel={_(msg`Thread preferences`)}
|
||||
accessibilityHint={_(msg`Opens the threads preferences`)}>
|
||||
<View style={[styles.iconContainer, pal.btn]}>
|
||||
<FontAwesomeIcon
|
||||
icon={['far', 'comments']}
|
||||
|
@ -587,9 +587,10 @@ export function SettingsScreen({}: Props) {
|
|||
pal.view,
|
||||
isSwitchingAccounts && styles.dimmed,
|
||||
]}
|
||||
accessibilityHint="My Saved Feeds"
|
||||
accessibilityLabel={_(msg`Opens screen with all saved feeds`)}
|
||||
onPress={onPressSavedFeeds}>
|
||||
onPress={onPressSavedFeeds}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`My saved feeds`)}
|
||||
accessibilityHint={_(msg`Opens screen with all saved feeds`)}>
|
||||
<View style={[styles.iconContainer, pal.btn]}>
|
||||
<HashtagIcon style={pal.text} size={18} strokeWidth={3} />
|
||||
</View>
|
||||
|
@ -688,7 +689,7 @@ export function SettingsScreen({}: Props) {
|
|||
onPress={onPressAppPasswords}
|
||||
accessibilityRole="button"
|
||||
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]}>
|
||||
<FontAwesomeIcon
|
||||
icon="lock"
|
||||
|
@ -709,7 +710,9 @@ export function SettingsScreen({}: Props) {
|
|||
onPress={isSwitchingAccounts ? undefined : onPressChangeHandle}
|
||||
accessibilityRole="button"
|
||||
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]}>
|
||||
<FontAwesomeIcon
|
||||
icon="at"
|
||||
|
@ -745,7 +748,9 @@ export function SettingsScreen({}: Props) {
|
|||
onPress={() => openModal({name: 'change-password'})}
|
||||
accessibilityRole="button"
|
||||
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]}>
|
||||
<FontAwesomeIcon
|
||||
icon="lock"
|
||||
|
@ -767,7 +772,7 @@ export function SettingsScreen({}: Props) {
|
|||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Export my data`)}
|
||||
accessibilityHint={_(
|
||||
msg`Download Bluesky account data (repository)`,
|
||||
msg`Opens modal for downloading Bluesky account data (repository)`,
|
||||
)}>
|
||||
<View style={[styles.iconContainer, pal.btn]}>
|
||||
<FontAwesomeIcon
|
||||
|
@ -786,7 +791,7 @@ export function SettingsScreen({}: Props) {
|
|||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Delete account`)}
|
||||
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]}>
|
||||
<FontAwesomeIcon
|
||||
|
@ -804,8 +809,8 @@ export function SettingsScreen({}: Props) {
|
|||
style={[pal.view, styles.linkCardNoIcon]}
|
||||
onPress={onPressSystemLog}
|
||||
accessibilityRole="button"
|
||||
accessibilityHint="Open system log"
|
||||
accessibilityLabel={_(msg`Opens the system log page`)}>
|
||||
accessibilityLabel={_(msg`Open system log`)}
|
||||
accessibilityHint={_(msg`Opens the system log page`)}>
|
||||
<Text type="lg" style={pal.text}>
|
||||
<Trans>System log</Trans>
|
||||
</Text>
|
||||
|
@ -836,7 +841,7 @@ export function SettingsScreen({}: Props) {
|
|||
style={[pal.view, styles.linkCardNoIcon]}
|
||||
onPress={onPressResetPreferences}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Reset preferences`)}
|
||||
accessibilityLabel={_(msg`Reset preferences state`)}
|
||||
accessibilityHint={_(msg`Resets the preferences state`)}>
|
||||
<Text type="lg" style={pal.text}>
|
||||
<Trans>Reset preferences state</Trans>
|
||||
|
@ -846,7 +851,7 @@ export function SettingsScreen({}: Props) {
|
|||
style={[pal.view, styles.linkCardNoIcon]}
|
||||
onPress={onPressResetOnboarding}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Reset onboarding`)}
|
||||
accessibilityLabel={_(msg`Reset onboarding state`)}
|
||||
accessibilityHint={_(msg`Resets the onboarding state`)}>
|
||||
<Text type="lg" style={pal.text}>
|
||||
<Trans>Reset onboarding state</Trans>
|
||||
|
@ -857,7 +862,7 @@ export function SettingsScreen({}: Props) {
|
|||
onPress={clearAllLegacyStorage}
|
||||
accessibilityRole="button"
|
||||
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}>
|
||||
<Trans>
|
||||
Clear all legacy storage data (restart after this)
|
||||
|
@ -869,7 +874,7 @@ export function SettingsScreen({}: Props) {
|
|||
onPress={clearAllStorage}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Clear all storage data`)}
|
||||
accessibilityHint={_(msg`Clear all storage data`)}>
|
||||
accessibilityHint={_(msg`Clears all storage data`)}>
|
||||
<Text type="lg" style={pal.text}>
|
||||
<Trans>Clear all storage data (restart after this)</Trans>
|
||||
</Text>
|
||||
|
@ -958,7 +963,7 @@ function EmailConfirmationNotice() {
|
|||
]}
|
||||
accessibilityRole="button"
|
||||
accessibilityLabel={_(msg`Verify my email`)}
|
||||
accessibilityHint=""
|
||||
accessibilityHint={_(msg`Opens modal for email verification`)}
|
||||
onPress={() => openModal({name: 'verify-email'})}>
|
||||
<FontAwesomeIcon
|
||||
icon="envelope"
|
||||
|
|
|
@ -94,10 +94,12 @@ let DrawerProfileCard = ({
|
|||
{formatCountShortOnly(profile?.followersCount ?? 0)}
|
||||
</Text>{' '}
|
||||
{pluralize(profile?.followersCount || 0, 'follower')} ·{' '}
|
||||
<Trans>
|
||||
<Text type="xl-medium" style={pal.text}>
|
||||
{formatCountShortOnly(profile?.followsCount ?? 0)}
|
||||
</Text>{' '}
|
||||
following
|
||||
</Trans>
|
||||
</Text>
|
||||
</TouchableOpacity>
|
||||
)
|
||||
|
|
|
@ -58,7 +58,7 @@ let NavSignupCard = ({}: {}): React.ReactNode => {
|
|||
accessibilityHint={_(msg`Sign in`)}
|
||||
accessibilityLabel={_(msg`Sign in`)}>
|
||||
<Text type="md" style={[pal.text, s.bold]}>
|
||||
Sign in
|
||||
<Trans>Sign in</Trans>
|
||||
</Text>
|
||||
</Button>
|
||||
</View>
|
||||
|
|
Loading…
Reference in New Issue