From 00076ad1ff6ab3e27edd392e8d098c9e2974ac99 Mon Sep 17 00:00:00 2001 From: Hailey Date: Mon, 8 Apr 2024 08:24:59 -0700 Subject: [PATCH 001/185] Bump `async-storage` to comply with App Store guidelines (#3436) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f61d36a6b0..55c5668544 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "@mattermost/react-native-paste-input": "^0.6.4", "@miblanchard/react-native-slider": "^2.3.1", "@radix-ui/react-dropdown-menu": "^2.0.6", - "@react-native-async-storage/async-storage": "1.21.0", + "@react-native-async-storage/async-storage": "1.23.1", "@react-native-masked-view/masked-view": "0.3.0", "@react-native-menu/menu": "^0.8.0", "@react-native-picker/picker": "2.6.1", diff --git a/yarn.lock b/yarn.lock index 323ac3c106..4b6decea91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4836,10 +4836,10 @@ dependencies: "@babel/runtime" "^7.13.10" -"@react-native-async-storage/async-storage@1.21.0": - version "1.21.0" - resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.21.0.tgz#d7e370028e228ab84637016ceeb495878b7a44c8" - integrity sha512-JL0w36KuFHFCvnbOXRekqVAUplmOyT/OuCQkogo6X98MtpSaJOKEAeZnYO8JB0U/RIEixZaGI5px73YbRm/oag== +"@react-native-async-storage/async-storage@1.23.1": + version "1.23.1" + resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.23.1.tgz#cad3cd4fab7dacfe9838dce6ecb352f79150c883" + integrity sha512-Qd2kQ3yi6Y3+AcUlrHxSLlnBvpdCEMVGFlVBneVOjaFaPU61g1huc38g339ysXspwY1QZA2aNhrk/KlHGO+ewA== dependencies: merge-options "^3.0.4" From a1ac84687f0a18e82b69155720881778c858316d Mon Sep 17 00:00:00 2001 From: Hailey Date: Mon, 8 Apr 2024 08:54:50 -0700 Subject: [PATCH 002/185] Keep each deployment job in a separate concurrency group (#3446) --- .github/workflows/bundle-deploy-eas-update.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/bundle-deploy-eas-update.yml b/.github/workflows/bundle-deploy-eas-update.yml index 65a633c8ad..2e07335eef 100644 --- a/.github/workflows/bundle-deploy-eas-update.yml +++ b/.github/workflows/bundle-deploy-eas-update.yml @@ -18,14 +18,13 @@ on: description: Runtime version (in x.x.x format) that this update is for required: true -concurrency: - group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }} - cancel-in-progress: true - jobs: bundleDeploy: name: Bundle and Deploy EAS Update runs-on: ubuntu-latest + concurrency: + group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}-deploy + cancel-in-progress: true outputs: fingerprint-is-different: ${{ steps.fingerprint-debug.outputs.fingerprint-is-different }} @@ -166,6 +165,9 @@ jobs: buildIfNecessaryIOS: name: Build and Submit iOS runs-on: macos-14 + concurrency: + group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}-build-ios + cancel-in-progress: false needs: [bundleDeploy] # Gotta check if its NOT '[]' because any md5 hash in the outputs is detected as a possible secret and won't be # available here @@ -231,6 +233,9 @@ jobs: buildIfNecessaryAndroid: name: Build and Submit Android runs-on: ubuntu-latest + concurrency: + group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}-build-android + cancel-in-progress: false needs: [ bundleDeploy ] # Gotta check if its NOT '[]' because any md5 hash in the outputs is detected as a possible secret and won't be # available here From 731d94b973d6b71a10dd68c903ed65acef764cac Mon Sep 17 00:00:00 2001 From: Hailey Date: Mon, 8 Apr 2024 09:09:40 -0700 Subject: [PATCH 003/185] Implement back button fix for all places in the app (#3434) --- src/components/Dialog/context.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Dialog/context.ts b/src/components/Dialog/context.ts index 859f8edd77..df8bbb0810 100644 --- a/src/components/Dialog/context.ts +++ b/src/components/Dialog/context.ts @@ -39,7 +39,8 @@ export function useDialogControl(): DialogOuterProps['control'] { control.current.open() }, close: cb => { - control.current.close(cb) + control.current.close() + cb?.() }, }), [id, control], From ed5647d434dc32c891280e275ce1095b8cd55a2b Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Apr 2024 17:20:41 +0100 Subject: [PATCH 004/185] [Experiment] Disable min shell on foregrounding (#3430) --- src/view/screens/Home.tsx | 46 +++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index 99ac8c44af..e6ba0395cf 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -1,23 +1,25 @@ import React from 'react' -import {View, ActivityIndicator, StyleSheet} from 'react-native' +import {ActivityIndicator, AppState, StyleSheet, View} from 'react-native' import {useFocusEffect} from '@react-navigation/native' -import {NativeStackScreenProps, HomeTabNavigatorParams} from 'lib/routes/types' + +import {useSetTitle} from '#/lib/hooks/useSetTitle' +import {useGate} from '#/lib/statsig/statsig' +import {emitSoftReset} from '#/state/events' +import {FeedSourceInfo, usePinnedFeedsInfos} from '#/state/queries/feed' import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed' +import {usePreferencesQuery} from '#/state/queries/preferences' +import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types' +import {useSession} from '#/state/session' +import {useSetDrawerSwipeDisabled, useSetMinimalShellMode} from '#/state/shell' +import {useSelectedFeed, useSetSelectedFeed} from '#/state/shell/selected-feed' +import {HomeTabNavigatorParams, NativeStackScreenProps} from 'lib/routes/types' +import {FeedPage} from 'view/com/feeds/FeedPage' +import {Pager, PagerRef, RenderTabBarFnProps} from 'view/com/pager/Pager' +import {CustomFeedEmptyState} from 'view/com/posts/CustomFeedEmptyState' import {FollowingEmptyState} from 'view/com/posts/FollowingEmptyState' import {FollowingEndOfFeed} from 'view/com/posts/FollowingEndOfFeed' -import {CustomFeedEmptyState} from 'view/com/posts/CustomFeedEmptyState' -import {HomeHeader} from '../com/home/HomeHeader' -import {Pager, RenderTabBarFnProps, PagerRef} from 'view/com/pager/Pager' -import {FeedPage} from 'view/com/feeds/FeedPage' import {HomeLoggedOutCTA} from '../com/auth/HomeLoggedOutCTA' -import {useSetMinimalShellMode, useSetDrawerSwipeDisabled} from '#/state/shell' -import {usePreferencesQuery} from '#/state/queries/preferences' -import {usePinnedFeedsInfos, FeedSourceInfo} from '#/state/queries/feed' -import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types' -import {emitSoftReset} from '#/state/events' -import {useSession} from '#/state/session' -import {useSelectedFeed, useSetSelectedFeed} from '#/state/shell/selected-feed' -import {useSetTitle} from '#/lib/hooks/useSetTitle' +import {HomeHeader} from '../com/home/HomeHeader' type Props = NativeStackScreenProps export function HomeScreen(props: Props) { @@ -94,6 +96,22 @@ function HomeScreenReady({ }, [setDrawerSwipeDisabled, selectedIndex, setMinimalShellMode]), ) + const disableMinShellOnForegrounding = useGate( + 'disable_min_shell_on_foregrounding', + ) + React.useEffect(() => { + if (disableMinShellOnForegrounding) { + const listener = AppState.addEventListener('change', nextAppState => { + if (nextAppState === 'active') { + setMinimalShellMode(false) + } + }) + return () => { + listener.remove() + } + } + }, [setMinimalShellMode, disableMinShellOnForegrounding]) + const onPageSelected = React.useCallback( (index: number) => { setMinimalShellMode(false) From 1150007d37138a289c7302ba2a11350be009435d Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Apr 2024 17:20:58 +0100 Subject: [PATCH 005/185] Auto-expand follow suggestions on web (#3432) --- src/lib/statsig/statsig.tsx | 4 ++++ src/screens/Profile/Header/ProfileHeaderStandard.tsx | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/lib/statsig/statsig.tsx b/src/lib/statsig/statsig.tsx index 68c63de616..d0ef2408e9 100644 --- a/src/lib/statsig/statsig.tsx +++ b/src/lib/statsig/statsig.tsx @@ -78,6 +78,10 @@ function toStatsigUser(did: string | undefined) { return { userID, platform: Platform.OS, + custom: { + // Need to specify here too for gating. + platform: Platform.OS, + }, } } diff --git a/src/screens/Profile/Header/ProfileHeaderStandard.tsx b/src/screens/Profile/Header/ProfileHeaderStandard.tsx index 420b54f491..d6c6ff7bd1 100644 --- a/src/screens/Profile/Header/ProfileHeaderStandard.tsx +++ b/src/screens/Profile/Header/ProfileHeaderStandard.tsx @@ -10,7 +10,9 @@ import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' +import {useGate} from '#/lib/statsig/statsig' import {logger} from '#/logger' +import {isWeb} from '#/platform/detection' import {Shadow} from '#/state/cache/types' import {useModalControls} from '#/state/modals' import { @@ -78,6 +80,9 @@ let ProfileHeaderStandard = ({ }) }, [track, openModal, profile]) + const autoExpandSuggestionsOnProfileFollow = useGate( + 'autoexpand_suggestions_on_profile_follow', + ) const onPressFollow = () => { requireAuth(async () => { try { @@ -91,6 +96,9 @@ let ProfileHeaderStandard = ({ )}`, ), ) + if (isWeb && autoExpandSuggestionsOnProfileFollow) { + setShowSuggestedFollows(true) + } } catch (e: any) { if (e?.name !== 'AbortError') { logger.error('Failed to follow', {message: String(e)}) From 8188f61e7dae70742f05d7a9535983dec8ddee8c Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Apr 2024 17:21:44 +0100 Subject: [PATCH 006/185] [Experiment] Turn off interval polling for Discover (#3431) * Include feed URL in feed events * [Experiment] Turn off polling interval for Discover --- src/lib/statsig/events.ts | 2 ++ src/view/com/feeds/FeedPage.tsx | 58 ++++++++++++++++++++------------- src/view/com/posts/Feed.tsx | 50 +++++++++++++++------------- 3 files changed, 65 insertions(+), 45 deletions(-) diff --git a/src/lib/statsig/events.ts b/src/lib/statsig/events.ts index 2de15b64ee..98d633194d 100644 --- a/src/lib/statsig/events.ts +++ b/src/lib/statsig/events.ts @@ -45,10 +45,12 @@ export type LogEvents = { 'onboarding:moderation:nextPressed': {} 'onboarding:finished:nextPressed': {} 'feed:endReached': { + feedUrl: string feedType: string itemCount: number } 'feed:refresh': { + feedUrl: string feedType: string reason: 'pull-to-refresh' | 'soft-reset' | 'load-latest' } diff --git a/src/view/com/feeds/FeedPage.tsx b/src/view/com/feeds/FeedPage.tsx index 2d0736b096..25c7e1006d 100644 --- a/src/view/com/feeds/FeedPage.tsx +++ b/src/view/com/feeds/FeedPage.tsx @@ -1,28 +1,29 @@ import React from 'react' -import {useNavigation} from '@react-navigation/native' -import {useAnalytics} from 'lib/analytics/analytics' -import {useQueryClient} from '@tanstack/react-query' -import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed' -import {MainScrollProvider} from '../util/MainScrollProvider' -import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' -import {useSetMinimalShellMode} from '#/state/shell' -import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed' -import {ComposeIcon2} from 'lib/icons' -import {s} from 'lib/styles' -import {View, useWindowDimensions} from 'react-native' -import {ListMethods} from '../util/List' -import {Feed} from '../posts/Feed' -import {FAB} from '../util/fab/FAB' -import {LoadLatestBtn} from '../util/load-latest/LoadLatestBtn' +import {useWindowDimensions, View} from 'react-native' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {useSession} from '#/state/session' -import {useComposerControls} from '#/state/shell/composer' -import {listenSoftReset} from '#/state/events' -import {truncateAndInvalidate} from '#/state/queries/util' -import {TabState, getTabState, getRootNavigation} from '#/lib/routes/helpers' +import {useNavigation} from '@react-navigation/native' +import {useQueryClient} from '@tanstack/react-query' + +import {getRootNavigation, getTabState, TabState} from '#/lib/routes/helpers' +import {logEvent, useGate} from '#/lib/statsig/statsig' import {isNative} from '#/platform/detection' -import {logEvent} from '#/lib/statsig/statsig' +import {listenSoftReset} from '#/state/events' +import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed' +import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed' +import {truncateAndInvalidate} from '#/state/queries/util' +import {useSession} from '#/state/session' +import {useSetMinimalShellMode} from '#/state/shell' +import {useComposerControls} from '#/state/shell/composer' +import {useAnalytics} from 'lib/analytics/analytics' +import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' +import {ComposeIcon2} from 'lib/icons' +import {s} from 'lib/styles' +import {Feed} from '../posts/Feed' +import {FAB} from '../util/fab/FAB' +import {ListMethods} from '../util/List' +import {LoadLatestBtn} from '../util/load-latest/LoadLatestBtn' +import {MainScrollProvider} from '../util/MainScrollProvider' const POLL_FREQ = 60e3 // 60sec @@ -71,6 +72,7 @@ export function FeedPage({ setHasNew(false) logEvent('feed:refresh', { feedType: feed.split('|')[0], + feedUrl: feed, reason: 'soft-reset', }) } @@ -96,10 +98,22 @@ export function FeedPage({ setHasNew(false) logEvent('feed:refresh', { feedType: feed.split('|')[0], + feedUrl: feed, reason: 'load-latest', }) }, [scrollToTop, feed, queryClient, setHasNew]) + let feedPollInterval + if ( + useGate('disable_poll_on_discover') && + feed === // Discover + 'feedgen|at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/whats-hot' + ) { + feedPollInterval = undefined + } else { + feedPollInterval = POLL_FREQ + } + return ( @@ -108,7 +122,7 @@ export function FeedPage({ enabled={isPageFocused} feed={feed} feedParams={feedParams} - pollInterval={POLL_FREQ} + pollInterval={feedPollInterval} disablePoll={hasNew} scrollElRef={scrollElRef} onScrolledDownChange={setIsScrolledDown} diff --git a/src/view/com/posts/Feed.tsx b/src/view/com/posts/Feed.tsx index 8afcce94f2..fb67d35c5c 100644 --- a/src/view/com/posts/Feed.tsx +++ b/src/view/com/posts/Feed.tsx @@ -8,32 +8,33 @@ import { View, ViewStyle, } from 'react-native' -import {useQueryClient} from '@tanstack/react-query' -import {List, ListRef} from '../util/List' -import {PostFeedLoadingPlaceholder} from '../util/LoadingPlaceholder' -import {FeedErrorMessage} from './FeedErrorMessage' -import {FeedSlice} from './FeedSlice' -import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' -import {useAnalytics} from 'lib/analytics/analytics' -import {useTheme} from 'lib/ThemeContext' -import {logger} from '#/logger' -import { - RQKEY, - FeedDescriptor, - FeedParams, - usePostFeedQuery, - pollLatest, -} from '#/state/queries/post-feed' -import {isWeb} from '#/platform/detection' -import {listenPostCreated} from '#/state/events' -import {useSession} from '#/state/session' -import {STALE} from '#/state/queries' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {DiscoverFallbackHeader} from './DiscoverFallbackHeader' +import {useQueryClient} from '@tanstack/react-query' + import {FALLBACK_MARKER_POST} from '#/lib/api/feed/home' -import {useInitialNumToRender} from 'lib/hooks/useInitialNumToRender' import {logEvent} from '#/lib/statsig/statsig' +import {logger} from '#/logger' +import {isWeb} from '#/platform/detection' +import {listenPostCreated} from '#/state/events' +import {STALE} from '#/state/queries' +import { + FeedDescriptor, + FeedParams, + pollLatest, + RQKEY, + usePostFeedQuery, +} from '#/state/queries/post-feed' +import {useSession} from '#/state/session' +import {useAnalytics} from 'lib/analytics/analytics' +import {useInitialNumToRender} from 'lib/hooks/useInitialNumToRender' +import {useTheme} from 'lib/ThemeContext' +import {List, ListRef} from '../util/List' +import {PostFeedLoadingPlaceholder} from '../util/LoadingPlaceholder' +import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' +import {DiscoverFallbackHeader} from './DiscoverFallbackHeader' +import {FeedErrorMessage} from './FeedErrorMessage' +import {FeedSlice} from './FeedSlice' const LOADING_ITEM = {_reactKey: '__loading__'} const EMPTY_FEED_ITEM = {_reactKey: '__empty__'} @@ -217,6 +218,7 @@ let Feed = ({ track('Feed:onRefresh') logEvent('feed:refresh', { feedType: feedType, + feedUrl: feed, reason: 'pull-to-refresh', }) setIsPTRing(true) @@ -227,13 +229,14 @@ let Feed = ({ logger.error('Failed to refresh posts feed', {message: err}) } setIsPTRing(false) - }, [refetch, track, setIsPTRing, onHasNew, feedType]) + }, [refetch, track, setIsPTRing, onHasNew, feed, feedType]) const onEndReached = React.useCallback(async () => { if (isFetching || !hasNextPage || isError) return logEvent('feed:endReached', { feedType: feedType, + feedUrl: feed, itemCount: feedItems.length, }) track('Feed:onEndReached') @@ -248,6 +251,7 @@ let Feed = ({ isError, fetchNextPage, track, + feed, feedType, feedItems.length, ]) From 887fedabeaa3470615199642870494df2784b280 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Apr 2024 18:38:51 +0100 Subject: [PATCH 007/185] [Statsig] Track like/follow metadata (#3435) * Track becoming mutuals * Track poster/liker status * Track post and followee clout * Track follower and liker clout * Extract utility --- src/lib/statsig/events.ts | 7 ++++++ src/lib/statsig/statsig.tsx | 8 +++++++ src/state/queries/post.ts | 42 +++++++++++++++++++++++++++++------- src/state/queries/profile.ts | 29 ++++++++++++++++++++++--- 4 files changed, 75 insertions(+), 11 deletions(-) diff --git a/src/lib/statsig/events.ts b/src/lib/statsig/events.ts index 98d633194d..73e9876ac8 100644 --- a/src/lib/statsig/events.ts +++ b/src/lib/statsig/events.ts @@ -67,6 +67,10 @@ export type LogEvents = { logContext: 'Composer' } 'post:like': { + doesLikerFollowPoster: boolean | undefined + doesPosterFollowLiker: boolean | undefined + likerClout: number | undefined + postClout: number | undefined logContext: 'FeedItem' | 'PostThreadItem' | 'Post' } 'post:repost': { @@ -79,6 +83,9 @@ export type LogEvents = { logContext: 'FeedItem' | 'PostThreadItem' | 'Post' } 'profile:follow': { + didBecomeMutual: boolean | undefined + followeeClout: number | undefined + followerClout: number | undefined logContext: | 'RecommendedFollowsItem' | 'PostThreadItem' diff --git a/src/lib/statsig/statsig.tsx b/src/lib/statsig/statsig.tsx index d0ef2408e9..c164616217 100644 --- a/src/lib/statsig/statsig.tsx +++ b/src/lib/statsig/statsig.tsx @@ -43,6 +43,14 @@ export function attachRouteToLogEvents( getCurrentRouteName = getRouteName } +export function toClout(n: number | null | undefined): number | undefined { + if (n == null) { + return undefined + } else { + return Math.max(0, Math.round(Math.log(n))) + } +} + export function logEvent( eventName: E & string, rawMetadata: LogEvents[E] & FlatJSONRecord, diff --git a/src/state/queries/post.ts b/src/state/queries/post.ts index 746dedad27..77497f6bab 100644 --- a/src/state/queries/post.ts +++ b/src/state/queries/post.ts @@ -1,13 +1,14 @@ import {useCallback} from 'react' -import {AppBskyFeedDefs, AtUri} from '@atproto/api' +import {AppBskyActorDefs, AppBskyFeedDefs, AtUri} from '@atproto/api' import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' import {track} from '#/lib/analytics/analytics' import {useToggleMutationQueue} from '#/lib/hooks/useToggleMutationQueue' -import {logEvent, LogEvents} from '#/lib/statsig/statsig' +import {logEvent, LogEvents, toClout} from '#/lib/statsig/statsig' import {updatePostShadow} from '#/state/cache/post-shadow' import {Shadow} from '#/state/cache/types' -import {getAgent} from '#/state/session' +import {getAgent, useSession} from '#/state/session' +import {findProfileQueryData} from './profile' const RQKEY_ROOT = 'post' export const RQKEY = (postUri: string) => [RQKEY_ROOT, postUri] @@ -68,7 +69,7 @@ export function usePostLikeMutationQueue( const postUri = post.uri const postCid = post.cid const initialLikeUri = post.viewer?.like - const likeMutation = usePostLikeMutation(logContext) + const likeMutation = usePostLikeMutation(logContext, post) const unlikeMutation = usePostUnlikeMutation(logContext) const queueToggle = useToggleMutationQueue({ @@ -117,15 +118,40 @@ export function usePostLikeMutationQueue( return [queueLike, queueUnlike] } -function usePostLikeMutation(logContext: LogEvents['post:like']['logContext']) { +function usePostLikeMutation( + logContext: LogEvents['post:like']['logContext'], + post: Shadow, +) { + const {currentAccount} = useSession() + const queryClient = useQueryClient() + const postAuthor = post.author return useMutation< {uri: string}, // responds with the uri of the like Error, {uri: string; cid: string} // the post's uri and cid >({ - mutationFn: post => { - logEvent('post:like', {logContext}) - return getAgent().like(post.uri, post.cid) + mutationFn: ({uri, cid}) => { + let ownProfile: AppBskyActorDefs.ProfileViewDetailed | undefined + if (currentAccount) { + ownProfile = findProfileQueryData(queryClient, currentAccount.did) + } + logEvent('post:like', { + logContext, + doesPosterFollowLiker: postAuthor.viewer + ? Boolean(postAuthor.viewer.followedBy) + : undefined, + doesLikerFollowPoster: postAuthor.viewer + ? Boolean(postAuthor.viewer.following) + : undefined, + likerClout: toClout(ownProfile?.followersCount), + postClout: + post.likeCount != null && + post.repostCount != null && + post.replyCount != null + ? toClout(post.likeCount + post.repostCount + post.replyCount) + : undefined, + }) + return getAgent().like(uri, cid) }, onSuccess() { track('Post:Like') diff --git a/src/state/queries/profile.ts b/src/state/queries/profile.ts index 2094e0c3a2..a962fecff7 100644 --- a/src/state/queries/profile.ts +++ b/src/state/queries/profile.ts @@ -20,7 +20,7 @@ import {track} from '#/lib/analytics/analytics' import {uploadBlob} from '#/lib/api' import {until} from '#/lib/async/until' import {useToggleMutationQueue} from '#/lib/hooks/useToggleMutationQueue' -import {logEvent, LogEvents} from '#/lib/statsig/statsig' +import {logEvent, LogEvents, toClout} from '#/lib/statsig/statsig' import {Shadow} from '#/state/cache/types' import {STALE} from '#/state/queries' import {resetProfilePostsQueries} from '#/state/queries/post-feed' @@ -202,7 +202,7 @@ export function useProfileFollowMutationQueue( const queryClient = useQueryClient() const did = profile.did const initialFollowingUri = profile.viewer?.following - const followMutation = useProfileFollowMutation(logContext) + const followMutation = useProfileFollowMutation(logContext, profile) const unfollowMutation = useProfileUnfollowMutation(logContext) const queueToggle = useToggleMutationQueue({ @@ -252,10 +252,24 @@ export function useProfileFollowMutationQueue( function useProfileFollowMutation( logContext: LogEvents['profile:follow']['logContext'], + profile: Shadow, ) { + const {currentAccount} = useSession() + const queryClient = useQueryClient() return useMutation<{uri: string; cid: string}, Error, {did: string}>({ mutationFn: async ({did}) => { - logEvent('profile:follow', {logContext}) + let ownProfile: AppBskyActorDefs.ProfileViewDetailed | undefined + if (currentAccount) { + ownProfile = findProfileQueryData(queryClient, currentAccount.did) + } + logEvent('profile:follow', { + logContext, + didBecomeMutual: profile.viewer + ? Boolean(profile.viewer.followedBy) + : undefined, + followeeClout: toClout(profile.followersCount), + followerClout: toClout(ownProfile?.followersCount), + }) return await getAgent().follow(did) }, onSuccess(data, variables) { @@ -530,3 +544,12 @@ export function* findAllProfilesInQueryData( } } } + +export function findProfileQueryData( + queryClient: QueryClient, + did: string, +): AppBskyActorDefs.ProfileViewDetailed | undefined { + return queryClient.getQueryData( + RQKEY(did), + ) +} From f03390e4b2eb8d89ebaca96e6381ff2e7605a57f Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Apr 2024 18:38:59 +0100 Subject: [PATCH 008/185] [Experiment] Show "Follow Back" label (#3439) --- .../com/post-thread/PostThreadFollowBtn.tsx | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/view/com/post-thread/PostThreadFollowBtn.tsx b/src/view/com/post-thread/PostThreadFollowBtn.tsx index 45c3771f50..8b297121eb 100644 --- a/src/view/com/post-thread/PostThreadFollowBtn.tsx +++ b/src/view/com/post-thread/PostThreadFollowBtn.tsx @@ -1,24 +1,25 @@ import React from 'react' import {StyleSheet, TouchableOpacity, View} from 'react-native' -import {useNavigation} from '@react-navigation/native' import {AppBskyActorDefs} from '@atproto/api' +import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' +import {useNavigation} from '@react-navigation/native' +import {useGate} from '#/lib/statsig/statsig' import {logger} from '#/logger' -import {Text} from 'view/com/util/text/Text' -import * as Toast from 'view/com/util/Toast' -import {s} from 'lib/styles' +import {track} from 'lib/analytics/analytics' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' +import {s} from 'lib/styles' import {Shadow, useProfileShadow} from 'state/cache/profile-shadow' -import {track} from 'lib/analytics/analytics' import { useProfileFollowMutationQueue, useProfileQuery, } from 'state/queries/profile' import {useRequireAuth} from 'state/session' +import {Text} from 'view/com/util/text/Text' +import * as Toast from 'view/com/util/Toast' export function PostThreadFollowBtn({did}: {did: string}) { const {data: profile, isLoading} = useProfileQuery({did}) @@ -47,8 +48,10 @@ function PostThreadFollowBtnLoaded({ 'PostThreadItem', ) const requireAuth = useRequireAuth() + const showFollowBackLabel = useGate('show_follow_back_label') const isFollowing = !!profile.viewer?.following + const isFollowedBy = !!profile.viewer?.followedBy const [wasFollowing, setWasFollowing] = React.useState(isFollowing) // This prevents the button from disappearing as soon as we follow. @@ -136,7 +139,15 @@ function PostThreadFollowBtnLoaded({ type="button" style={[!isFollowing ? palInverted.text : pal.text, s.bold]} numberOfLines={1}> - {!isFollowing ? Follow : Following} + {!isFollowing ? ( + showFollowBackLabel && isFollowedBy ? ( + Follow Back + ) : ( + Follow + ) + ) : ( + Following + )} From 6d3f9397f40cf5983a592a33cea9b6d4a086b448 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Apr 2024 18:39:32 +0100 Subject: [PATCH 009/185] [Experiment] Ignore the persisted tab (#3442) --- src/state/shell/selected-feed.tsx | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/state/shell/selected-feed.tsx b/src/state/shell/selected-feed.tsx index a05d8661b4..5c0ac0b02a 100644 --- a/src/state/shell/selected-feed.tsx +++ b/src/state/shell/selected-feed.tsx @@ -1,6 +1,8 @@ import React from 'react' -import * as persisted from '#/state/persisted' + +import {useGate} from '#/lib/statsig/statsig' import {isWeb} from '#/platform/detection' +import * as persisted from '#/state/persisted' type StateContext = string type SetContext = (v: string) => void @@ -8,7 +10,7 @@ type SetContext = (v: string) => void const stateContext = React.createContext('home') const setContext = React.createContext((_: string) => {}) -function getInitialFeed() { +function getInitialFeed(startSessionWithFollowing: boolean) { if (isWeb) { if (window.location.pathname === '/') { const params = new URLSearchParams(window.location.search) @@ -24,16 +26,21 @@ function getInitialFeed() { return feedFromSession } } - const feedFromPersisted = persisted.get('lastSelectedHomeFeed') - if (feedFromPersisted) { - // Fall back to the last chosen one across all tabs. - return feedFromPersisted + if (!startSessionWithFollowing) { + const feedFromPersisted = persisted.get('lastSelectedHomeFeed') + if (feedFromPersisted) { + // Fall back to the last chosen one across all tabs. + return feedFromPersisted + } } return 'home' } export function Provider({children}: React.PropsWithChildren<{}>) { - const [state, setState] = React.useState(getInitialFeed) + const startSessionWithFollowing = useGate('start_session_with_following') + const [state, setState] = React.useState(() => + getInitialFeed(startSessionWithFollowing), + ) const saveState = React.useCallback((feed: string) => { setState(feed) From 2bc20b1752d455bc1ca48e5f8eb4bd670d22ec34 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 8 Apr 2024 14:32:00 -0500 Subject: [PATCH 010/185] Onboarding tweaks (#3447) * Remove feed * Follow bsky.app --- src/lib/constants.ts | 4 +++- src/screens/Onboarding/StepAlgoFeeds/index.tsx | 15 --------------- src/screens/Onboarding/StepFinished.tsx | 5 ++++- 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/lib/constants.ts b/src/lib/constants.ts index f5a72669a9..401c39362b 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -80,8 +80,10 @@ export const HITSLOP_30 = createHitslop(30) export const BACK_HITSLOP = HITSLOP_30 export const MAX_POST_LINES = 25 +export const BSKY_APP_ACCOUNT_DID = 'did:plc:z72i7hdynmk6r22z27h6tvur' + export const BSKY_FEED_OWNER_DIDS = [ - 'did:plc:z72i7hdynmk6r22z27h6tvur', + BSKY_APP_ACCOUNT_DID, 'did:plc:vpkhqolt662uhesyj6nxm7ys', 'did:plc:q6gjnaw2blty4crticxkmujt', ] diff --git a/src/screens/Onboarding/StepAlgoFeeds/index.tsx b/src/screens/Onboarding/StepAlgoFeeds/index.tsx index 4ba61696f8..19bb401046 100644 --- a/src/screens/Onboarding/StepAlgoFeeds/index.tsx +++ b/src/screens/Onboarding/StepAlgoFeeds/index.tsx @@ -34,11 +34,6 @@ export const PRIMARY_FEEDS: FeedConfig[] = [ uri: 'at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/whats-hot', gradient: tokens.gradients.midnight, }, - { - default: IS_PROD, // these feeds are only available in prod - uri: 'at://did:plc:wqowuobffl66jv3kpsvo7ak4/app.bsky.feed.generator/the-algorithm', - gradient: tokens.gradients.midnight, - }, ] const SECONDARY_FEEDS: FeedConfig[] = [ @@ -130,16 +125,6 @@ export function StepAlgoFeeds() { We recommend our "Discover" feed: - - We also think you'll like "For You" by Skygaze: - - { await getAgent().setInterestsPref({tags: selectedInterests}) From a49a5a351d2b58631d067c0524c5ebb097a3d5fe Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 9 Apr 2024 00:58:18 +0100 Subject: [PATCH 011/185] Use ALF for the embed consent modal (#3336) --- src/components/dialogs/EmbedConsent.tsx | 119 ++++++++++++++ src/state/modals/index.tsx | 8 - src/view/com/modals/EmbedConsent.tsx | 154 ------------------ src/view/com/modals/Modal.tsx | 4 - src/view/com/modals/Modal.web.tsx | 41 +++-- .../com/util/post-embeds/ExternalGifEmbed.tsx | 123 +++++++------- .../util/post-embeds/ExternalPlayerEmbed.tsx | 86 +++++----- 7 files changed, 252 insertions(+), 283 deletions(-) create mode 100644 src/components/dialogs/EmbedConsent.tsx delete mode 100644 src/view/com/modals/EmbedConsent.tsx diff --git a/src/components/dialogs/EmbedConsent.tsx b/src/components/dialogs/EmbedConsent.tsx new file mode 100644 index 0000000000..c3fefd9f09 --- /dev/null +++ b/src/components/dialogs/EmbedConsent.tsx @@ -0,0 +1,119 @@ +import React, {useCallback} from 'react' +import {View} from 'react-native' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import { + type EmbedPlayerSource, + embedPlayerSources, + externalEmbedLabels, +} from '#/lib/strings/embed-player' +import {useSetExternalEmbedPref} from '#/state/preferences' +import {atoms as a, useBreakpoints, useTheme} from '#/alf' +import * as Dialog from '#/components/Dialog' +import {Button, ButtonText} from '../Button' +import {Text} from '../Typography' + +export function EmbedConsentDialog({ + control, + source, + onAccept, +}: { + control: Dialog.DialogControlProps + source: EmbedPlayerSource + onAccept: () => void +}) { + const {_} = useLingui() + const t = useTheme() + const setExternalEmbedPref = useSetExternalEmbedPref() + const {gtMobile} = useBreakpoints() + + const onShowAllPress = useCallback(() => { + for (const key of embedPlayerSources) { + setExternalEmbedPref(key, 'show') + } + onAccept() + control.close() + }, [control, onAccept, setExternalEmbedPref]) + + const onShowPress = useCallback(() => { + setExternalEmbedPref(source, 'show') + onAccept() + control.close() + }, [control, onAccept, setExternalEmbedPref, source]) + + const onHidePress = useCallback(() => { + setExternalEmbedPref(source, 'hide') + control.close() + }, [control, setExternalEmbedPref, source]) + + return ( + + + + + + + External Media + + + + + + This content is hosted by {externalEmbedLabels[source]}. Do you + want to enable external media? + + + + + + External media may allow websites to collect information about + you and your device. No information is sent or requested until + you press the "play" button. + + + + + + + + + + + + ) +} diff --git a/src/state/modals/index.tsx b/src/state/modals/index.tsx index e0bcc2f0fd..cc0f9c8b83 100644 --- a/src/state/modals/index.tsx +++ b/src/state/modals/index.tsx @@ -3,7 +3,6 @@ import {Image as RNImage} from 'react-native-image-crop-picker' import {AppBskyActorDefs, AppBskyGraphDefs} from '@atproto/api' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' -import {EmbedPlayerSource} from '#/lib/strings/embed-player' import {GalleryModel} from '#/state/models/media/gallery' import {ImageModel} from '#/state/models/media/image' import {ThreadgateSetting} from '../queries/threadgate' @@ -125,12 +124,6 @@ export interface LinkWarningModal { share?: boolean } -export interface EmbedConsentModal { - name: 'embed-consent' - source: EmbedPlayerSource - onAccept: () => void -} - export interface InAppBrowserConsentModal { name: 'in-app-browser-consent' href: string @@ -169,7 +162,6 @@ export type Modal = // Generic | LinkWarningModal - | EmbedConsentModal | InAppBrowserConsentModal const ModalContext = React.createContext<{ diff --git a/src/view/com/modals/EmbedConsent.tsx b/src/view/com/modals/EmbedConsent.tsx deleted file mode 100644 index 9419447288..0000000000 --- a/src/view/com/modals/EmbedConsent.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import React from 'react' -import {StyleSheet, TouchableOpacity, View} from 'react-native' -import {LinearGradient} from 'expo-linear-gradient' -import {msg, Trans} from '@lingui/macro' -import {useLingui} from '@lingui/react' - -import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' -import { - EmbedPlayerSource, - embedPlayerSources, - externalEmbedLabels, -} from '#/lib/strings/embed-player' -import {useModalControls} from '#/state/modals' -import {useSetExternalEmbedPref} from '#/state/preferences/external-embeds-prefs' -import {usePalette} from 'lib/hooks/usePalette' -import {colors, gradients, s} from 'lib/styles' -import {Text} from '../util/text/Text' -import {ScrollView} from './util' - -export const snapPoints = [450] - -export function Component({ - onAccept, - source, -}: { - onAccept: () => void - source: EmbedPlayerSource -}) { - const pal = usePalette('default') - const {closeModal} = useModalControls() - const {_} = useLingui() - const setExternalEmbedPref = useSetExternalEmbedPref() - const {isMobile} = useWebMediaQueries() - - const onShowAllPress = React.useCallback(() => { - for (const key of embedPlayerSources) { - setExternalEmbedPref(key, 'show') - } - onAccept() - closeModal() - }, [closeModal, onAccept, setExternalEmbedPref]) - - const onShowPress = React.useCallback(() => { - setExternalEmbedPref(source, 'show') - onAccept() - closeModal() - }, [closeModal, onAccept, setExternalEmbedPref, source]) - - const onHidePress = React.useCallback(() => { - setExternalEmbedPref(source, 'hide') - closeModal() - }, [closeModal, setExternalEmbedPref, source]) - - return ( - - - External Media - - - - - This content is hosted by {externalEmbedLabels[source]}. Do you want - to enable external media? - - - - - - External media may allow websites to collect information about you and - your device. No information is sent or requested until you press the - "play" button. - - - - - - - Enable External Media - - - - - - - - Enable {externalEmbedLabels[source]} only - - - - - - - - No thanks - - - - - ) -} - -const styles = StyleSheet.create({ - title: { - textAlign: 'center', - fontWeight: 'bold', - fontSize: 24, - marginBottom: 12, - }, - btn: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - width: '100%', - borderRadius: 32, - padding: 14, - backgroundColor: colors.gray1, - }, -}) diff --git a/src/view/com/modals/Modal.tsx b/src/view/com/modals/Modal.tsx index 85ffccf12b..6524813015 100644 --- a/src/view/com/modals/Modal.tsx +++ b/src/view/com/modals/Modal.tsx @@ -15,7 +15,6 @@ import * as ChangePasswordModal from './ChangePassword' import * as CreateOrEditListModal from './CreateOrEditList' import * as DeleteAccountModal from './DeleteAccount' import * as EditProfileModal from './EditProfile' -import * as EmbedConsentModal from './EmbedConsent' import * as InAppBrowserConsentModal from './InAppBrowserConsent' import * as InviteCodesModal from './InviteCodes' import * as ContentLanguagesSettingsModal from './lang-settings/ContentLanguagesSettings' @@ -116,9 +115,6 @@ export function ModalsContainer() { } else if (activeModal?.name === 'link-warning') { snapPoints = LinkWarningModal.snapPoints element = - } else if (activeModal?.name === 'embed-consent') { - snapPoints = EmbedConsentModal.snapPoints - element = } else if (activeModal?.name === 'in-app-browser-consent') { snapPoints = InAppBrowserConsentModal.snapPoints element = diff --git a/src/view/com/modals/Modal.web.tsx b/src/view/com/modals/Modal.web.tsx index 7e5d548ace..f95c748111 100644 --- a/src/view/com/modals/Modal.web.tsx +++ b/src/view/com/modals/Modal.web.tsx @@ -1,33 +1,32 @@ import React from 'react' -import {TouchableWithoutFeedback, StyleSheet, View} from 'react-native' +import {StyleSheet, TouchableWithoutFeedback, View} from 'react-native' import Animated, {FadeIn, FadeOut} from 'react-native-reanimated' + +import {useWebBodyScrollLock} from '#/lib/hooks/useWebBodyScrollLock' +import type {Modal as ModalIface} from '#/state/modals' +import {useModalControls, useModals} from '#/state/modals' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' -import {useWebBodyScrollLock} from '#/lib/hooks/useWebBodyScrollLock' - -import {useModals, useModalControls} from '#/state/modals' -import type {Modal as ModalIface} from '#/state/modals' -import * as EditProfileModal from './EditProfile' +import * as AddAppPassword from './AddAppPasswords' +import * as AltTextImageModal from './AltImage' +import * as ChangeEmailModal from './ChangeEmail' +import * as ChangeHandleModal from './ChangeHandle' +import * as ChangePasswordModal from './ChangePassword' import * as CreateOrEditListModal from './CreateOrEditList' -import * as UserAddRemoveLists from './UserAddRemoveLists' -import * as ListAddUserModal from './ListAddRemoveUsers' +import * as CropImageModal from './crop-image/CropImage.web' import * as DeleteAccountModal from './DeleteAccount' +import * as EditImageModal from './EditImage' +import * as EditProfileModal from './EditProfile' +import * as InviteCodesModal from './InviteCodes' +import * as ContentLanguagesSettingsModal from './lang-settings/ContentLanguagesSettings' +import * as PostLanguagesSettingsModal from './lang-settings/PostLanguagesSettings' +import * as LinkWarningModal from './LinkWarning' +import * as ListAddUserModal from './ListAddRemoveUsers' import * as RepostModal from './Repost' import * as SelfLabelModal from './SelfLabel' import * as ThreadgateModal from './Threadgate' -import * as CropImageModal from './crop-image/CropImage.web' -import * as AltTextImageModal from './AltImage' -import * as EditImageModal from './EditImage' -import * as ChangeHandleModal from './ChangeHandle' -import * as InviteCodesModal from './InviteCodes' -import * as AddAppPassword from './AddAppPasswords' -import * as ContentLanguagesSettingsModal from './lang-settings/ContentLanguagesSettings' -import * as PostLanguagesSettingsModal from './lang-settings/PostLanguagesSettings' +import * as UserAddRemoveLists from './UserAddRemoveLists' import * as VerifyEmailModal from './VerifyEmail' -import * as ChangeEmailModal from './ChangeEmail' -import * as ChangePasswordModal from './ChangePassword' -import * as LinkWarningModal from './LinkWarning' -import * as EmbedConsentModal from './EmbedConsent' export function ModalsContainer() { const {isModalActive, activeModals} = useModals() @@ -112,8 +111,6 @@ function Modal({modal}: {modal: ModalIface}) { element = } else if (modal.name === 'link-warning') { element = - } else if (modal.name === 'embed-consent') { - element = } else { return null } diff --git a/src/view/com/util/post-embeds/ExternalGifEmbed.tsx b/src/view/com/util/post-embeds/ExternalGifEmbed.tsx index f06c8b794d..b2720752ca 100644 --- a/src/view/com/util/post-embeds/ExternalGifEmbed.tsx +++ b/src/view/com/util/post-embeds/ExternalGifEmbed.tsx @@ -1,6 +1,4 @@ -import {EmbedPlayerParams, getGifDims} from 'lib/strings/embed-player' import React from 'react' -import {Image, ImageLoadEventData} from 'expo-image' import { ActivityIndicator, GestureResponderEvent, @@ -9,13 +7,17 @@ import { StyleSheet, View, } from 'react-native' -import {isIOS, isNative, isWeb} from '#/platform/detection' -import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' -import {useExternalEmbedsPrefs} from 'state/preferences' -import {useModalControls} from 'state/modals' -import {useLingui} from '@lingui/react' -import {msg} from '@lingui/macro' +import {Image, ImageLoadEventData} from 'expo-image' import {AppBskyEmbedExternal} from '@atproto/api' +import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' +import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {EmbedPlayerParams, getGifDims} from '#/lib/strings/embed-player' +import {isIOS, isNative, isWeb} from '#/platform/detection' +import {useExternalEmbedsPrefs} from '#/state/preferences' +import {useDialogControl} from '#/components/Dialog' +import {EmbedConsentDialog} from '#/components/dialogs/EmbedConsent' export function ExternalGifEmbed({ link, @@ -25,8 +27,9 @@ export function ExternalGifEmbed({ params: EmbedPlayerParams }) { const externalEmbedsPrefs = useExternalEmbedsPrefs() - const {openModal} = useModalControls() + const {_} = useLingui() + const consentDialogControl = useDialogControl() const thumbHasLoaded = React.useRef(false) const viewWidth = React.useRef(0) @@ -57,11 +60,7 @@ export function ExternalGifEmbed({ // Show consent if this is the first load if (externalEmbedsPrefs?.[params.source] === undefined) { - openModal({ - name: 'embed-consent', - source: params.source, - onAccept: load, - }) + consentDialogControl.open() return } // If the player isn't active, we want to activate it and prefetch the gif @@ -84,7 +83,13 @@ export function ExternalGifEmbed({ } }) }, - [externalEmbedsPrefs, isPlayerActive, load, openModal, params.source], + [ + consentDialogControl, + externalEmbedsPrefs, + isPlayerActive, + load, + params.source, + ], ) const onLoad = React.useCallback((e: ImageLoadEventData) => { @@ -98,47 +103,55 @@ export function ExternalGifEmbed({ }, []) return ( - - {(!isPrefetched || !isAnimating) && ( // If we have not loaded or are not animating, show the overlay - - - {!isAnimating || !isPlayerActive ? ( // Play button when not animating or not active - - ) : ( - // Activity indicator while gif loads - - )} - - - )} - + - + + + {(!isPrefetched || !isAnimating) && ( // If we have not loaded or are not animating, show the overlay + + + {!isAnimating || !isPlayerActive ? ( // Play button when not animating or not active + + ) : ( + // Activity indicator while gif loads + + )} + + + )} + + + ) } diff --git a/src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx b/src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx index cf2db5b333..9fdede877d 100644 --- a/src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx +++ b/src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx @@ -13,20 +13,23 @@ import Animated, { useAnimatedRef, useFrameCallback, } from 'react-native-reanimated' -import {Image} from 'expo-image' -import {WebView} from 'react-native-webview' import {useSafeAreaInsets} from 'react-native-safe-area-context' +import {WebView} from 'react-native-webview' +import {Image} from 'expo-image' +import {AppBskyEmbedExternal} from '@atproto/api' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useNavigation} from '@react-navigation/native' -import {AppBskyEmbedExternal} from '@atproto/api' -import {EmbedPlayerParams, getPlayerAspect} from 'lib/strings/embed-player' + +import {NavigationProp} from '#/lib/routes/types' +import {EmbedPlayerParams, getPlayerAspect} from '#/lib/strings/embed-player' +import {isNative} from '#/platform/detection' +import {useExternalEmbedsPrefs} from '#/state/preferences' +import {atoms as a} from '#/alf' +import {useDialogControl} from '#/components/Dialog' +import {EmbedConsentDialog} from '#/components/dialogs/EmbedConsent' import {EventStopper} from '../EventStopper' -import {isNative} from 'platform/detection' -import {NavigationProp} from 'lib/routes/types' -import {useExternalEmbedsPrefs} from 'state/preferences' -import {useModalControls} from 'state/modals' interface ShouldStartLoadRequest { url: string @@ -48,7 +51,7 @@ function PlaceholderOverlay({ if (isPlayerActive && !isLoading) return null return ( - + + { - setPlayerActive(true) - }, - }) + consentDialogControl.open() return } setPlayerActive(true) }, - [externalEmbedsPrefs, openModal, params.source], + [externalEmbedsPrefs, consentDialogControl, params.source], ) + const onAcceptConsent = React.useCallback(() => { + setPlayerActive(true) + }, []) + return ( - - {link.thumb && (!isPlayerActive || isLoading) && ( - - )} - + - - + + + {link.thumb && (!isPlayerActive || isLoading) && ( + + )} + + + + ) } @@ -226,13 +239,6 @@ const styles = StyleSheet.create({ borderTopLeftRadius: 6, borderTopRightRadius: 6, }, - layer: { - position: 'absolute', - top: 0, - left: 0, - right: 0, - bottom: 0, - }, overlayContainer: { flex: 1, justifyContent: 'center', From c96bc92042e2d5cb2a28736fd7a9dd2593a7b040 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 9 Apr 2024 17:08:02 -0500 Subject: [PATCH 012/185] Small logic cleanups (#3449) * Small logic cleanups * Small logic cleanups (#3451) * remove a few things * oops * stop swallowing the error * queue callbacks * oops * log error if caught * no need to be nullable * move isClosing=true up * reset `isClosing` and `closeCallbacks` on close completion and open * run queued callbacks on `open` if there are any pending * rm unnecessary ref and check * ensure order of calls is always correct * call `snapToIndex()` on open * add tester to storybook --------- Co-authored-by: Hailey --- src/components/Dialog/context.ts | 3 +- src/components/Dialog/index.tsx | 54 ++++++---- src/components/Dialog/index.web.tsx | 55 +++++----- src/components/Prompt.tsx | 14 +++ src/view/com/composer/Composer.tsx | 4 +- src/view/screens/Storybook/Dialogs.tsx | 137 ++++++++++++++++++++++++- 6 files changed, 213 insertions(+), 54 deletions(-) diff --git a/src/components/Dialog/context.ts b/src/components/Dialog/context.ts index df8bbb0810..859f8edd77 100644 --- a/src/components/Dialog/context.ts +++ b/src/components/Dialog/context.ts @@ -39,8 +39,7 @@ export function useDialogControl(): DialogOuterProps['control'] { control.current.open() }, close: cb => { - control.current.close() - cb?.() + control.current.close(cb) }, }), [id, control], diff --git a/src/components/Dialog/index.tsx b/src/components/Dialog/index.tsx index 07e101f85c..55798db7f5 100644 --- a/src/components/Dialog/index.tsx +++ b/src/components/Dialog/index.tsx @@ -83,7 +83,7 @@ export function Outer({ const sheetOptions = nativeOptions?.sheet || {} const hasSnapPoints = !!sheetOptions.snapPoints const insets = useSafeAreaInsets() - const closeCallback = React.useRef<() => void>() + const closeCallbacks = React.useRef<(() => void)[]>([]) const {setDialogIsOpen} = useDialogStateControlContext() /* @@ -96,22 +96,51 @@ export function Outer({ */ const isOpen = openIndex > -1 + const callQueuedCallbacks = React.useCallback(() => { + for (const cb of closeCallbacks.current) { + try { + cb() + } catch (e: any) { + logger.error('Error running close callback', e) + } + } + + closeCallbacks.current = [] + }, []) + const open = React.useCallback( ({index} = {}) => { + // Run any leftover callbacks that might have been queued up before calling `.open()` + callQueuedCallbacks() + setDialogIsOpen(control.id, true) // can be set to any index of `snapPoints`, but `0` is the first i.e. "open" setOpenIndex(index || 0) + sheet.current?.snapToIndex(index || 0) }, - [setOpenIndex, setDialogIsOpen, control.id], + [setDialogIsOpen, control.id, callQueuedCallbacks], ) + // This is the function that we call when we want to dismiss the dialog. const close = React.useCallback(cb => { - if (cb && typeof cb === 'function') { - closeCallback.current = cb + if (typeof cb === 'function') { + closeCallbacks.current.push(cb) } sheet.current?.close() }, []) + // This is the actual thing we are doing once we "confirm" the dialog. We want the dialog's close animation to + // happen before we run this. It is passed to the `BottomSheet` component. + const onCloseAnimationComplete = React.useCallback(() => { + // This removes the dialog from our list of stored dialogs. Not super necessary on iOS, but on Android this + // tells us that we need to toggle the accessibility overlay setting + setDialogIsOpen(control.id, false) + setOpenIndex(-1) + + callQueuedCallbacks() + onClose?.() + }, [callQueuedCallbacks, control.id, onClose, setDialogIsOpen]) + useImperativeHandle( control.ref, () => ({ @@ -121,21 +150,6 @@ export function Outer({ [open, close], ) - const onCloseInner = React.useCallback(() => { - try { - closeCallback.current?.() - } catch (e: any) { - logger.error(`Dialog closeCallback failed`, { - message: e.message, - }) - } finally { - closeCallback.current = undefined - } - setDialogIsOpen(control.id, false) - onClose?.() - setOpenIndex(-1) - }, [control.id, onClose, setDialogIsOpen]) - const context = React.useMemo(() => ({close}), [close]) return ( @@ -163,7 +177,7 @@ export function Outer({ backdropComponent={Backdrop} handleIndicatorStyle={{backgroundColor: t.palette.primary_500}} handleStyle={{display: 'none'}} - onClose={onCloseInner}> + onClose={onCloseAnimationComplete}> { - setIsOpen(true) setDialogIsOpen(control.id, true) + setIsOpen(true) }, [setIsOpen, setDialogIsOpen, control.id]) - const onCloseInner = React.useCallback(async () => { - setIsVisible(false) - await new Promise(resolve => setTimeout(resolve, 150)) - setIsOpen(false) - setIsVisible(true) - setDialogIsOpen(control.id, false) - onClose?.() - }, [control.id, onClose, setDialogIsOpen]) - const close = React.useCallback( cb => { + setDialogIsOpen(control.id, false) + setIsOpen(false) + try { if (cb && typeof cb === 'function') { - cb() + // This timeout ensures that the callback runs at the same time as it would on native. I.e. + // console.log('Step 1') -> close(() => console.log('Step 3')) -> console.log('Step 2') + // This should always output 'Step 1', 'Step 2', 'Step 3', but without the timeout it would output + // 'Step 1', 'Step 3', 'Step 2'. + setTimeout(cb) } } catch (e: any) { logger.error(`Dialog closeCallback failed`, { message: e.message, }) - } finally { - onCloseInner() } + + onClose?.() }, - [onCloseInner], + [control.id, onClose, setDialogIsOpen], ) + const handleBackgroundPress = React.useCallback(async () => { + close() + }, [close]) + useImperativeHandle( control.ref, () => ({ @@ -103,7 +104,7 @@ export function Outer({ + onPress={handleBackgroundPress}> - {isVisible && ( - - )} + - {isVisible ? children : null} + {children} diff --git a/src/components/Prompt.tsx b/src/components/Prompt.tsx index c92fe26523..0a171674de 100644 --- a/src/components/Prompt.tsx +++ b/src/components/Prompt.tsx @@ -123,6 +123,13 @@ export function Action({ cta, testID, }: { + /** + * Callback to run when the action is pressed. The method is called _after_ + * the dialog closes. + * + * Note: The dialog will close automatically when the action is pressed, you + * should NOT close the dialog as a side effect of this method. + */ onPress: () => void color?: ButtonColor /** @@ -165,6 +172,13 @@ export function Basic({ description: string cancelButtonCta?: string confirmButtonCta?: string + /** + * Callback to run when the Confirm button is pressed. The method is called + * _after_ the dialog closes. + * + * Note: The dialog will close automatically when the action is pressed, you + * should NOT close the dialog as a side effect of this method. + */ onConfirm: () => void confirmButtonColor?: ButtonColor }>) { diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index a3ee97a2ed..24f61a2ee1 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -507,9 +507,7 @@ export const ComposePost = observer(function ComposePost({ control={discardPromptControl} title={_(msg`Discard draft?`)} description={_(msg`Are you sure you'd like to discard this draft?`)} - onConfirm={() => { - discardPromptControl.close(onClose) - }} + onConfirm={onClose} confirmButtonCta={_(msg`Discard`)} confirmButtonColor="negative" /> diff --git a/src/view/screens/Storybook/Dialogs.tsx b/src/view/screens/Storybook/Dialogs.tsx index 4722784cae..f68f9f4ddf 100644 --- a/src/view/screens/Storybook/Dialogs.tsx +++ b/src/view/screens/Storybook/Dialogs.tsx @@ -6,12 +6,13 @@ import {atoms as a} from '#/alf' import {Button, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import * as Prompt from '#/components/Prompt' -import {H3, P} from '#/components/Typography' +import {H3, P, Text} from '#/components/Typography' export function Dialogs() { const scrollable = Dialog.useDialogControl() const basic = Dialog.useDialogControl() const prompt = Prompt.usePromptControl() + const testDialog = Dialog.useDialogControl() const {closeAllDialogs} = useDialogStateControlContext() return ( @@ -60,6 +61,15 @@ export function Dialogs() { Open prompt + + This is a prompt @@ -122,6 +132,131 @@ export function Dialogs() { + + + + + + + + Watch the console logs to test each of these dialog edge cases. + Functionality should be consistent across both native and web. If + not then *sad face* something is wrong. + + + + + + + + + + + + + + + + ) } From c300d4cab638405e783eb9e96a6d6a836d4ecd6e Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 9 Apr 2024 23:09:42 +0100 Subject: [PATCH 013/185] [Statsig] Instrument feed display (#3455) * [Statsig] Instrument feed display * Back out leftover change --- src/lib/statsig/events.ts | 6 ++++++ src/view/com/pager/Pager.tsx | 28 +++++++++++++++++++++------- src/view/com/pager/Pager.web.tsx | 22 ++++++++++++++++------ src/view/screens/Home.tsx | 30 ++++++++++++++++++++++++++++-- 4 files changed, 71 insertions(+), 15 deletions(-) diff --git a/src/lib/statsig/events.ts b/src/lib/statsig/events.ts index 73e9876ac8..3d650b8b73 100644 --- a/src/lib/statsig/events.ts +++ b/src/lib/statsig/events.ts @@ -44,6 +44,12 @@ export type LogEvents = { } 'onboarding:moderation:nextPressed': {} 'onboarding:finished:nextPressed': {} + 'home:feedDisplayed': { + feedUrl: string + feedType: string + index: number + reason: 'focus' | 'tabbar-click' | 'pager-swipe' | 'desktop-sidebar-click' + } 'feed:endReached': { feedUrl: string feedType: string diff --git a/src/view/com/pager/Pager.tsx b/src/view/com/pager/Pager.tsx index 06ec2e4503..26070fb880 100644 --- a/src/view/com/pager/Pager.tsx +++ b/src/view/com/pager/Pager.tsx @@ -1,17 +1,22 @@ import React, {forwardRef} from 'react' import {Animated, View} from 'react-native' import PagerView, { - PagerViewOnPageSelectedEvent, PagerViewOnPageScrollEvent, + PagerViewOnPageSelectedEvent, PageScrollStateChangedNativeEvent, } from 'react-native-pager-view' + +import {LogEvents} from '#/lib/statsig/events' import {s} from 'lib/styles' export type PageSelectedEvent = PagerViewOnPageSelectedEvent const AnimatedPagerView = Animated.createAnimatedComponent(PagerView) export interface PagerRef { - setPage: (index: number) => void + setPage: ( + index: number, + reason: LogEvents['home:feedDisplayed']['reason'], + ) => void } export interface RenderTabBarFnProps { @@ -25,7 +30,10 @@ interface Props { initialPage?: number renderTabBar: RenderTabBarFn onPageSelected?: (index: number) => void - onPageSelecting?: (index: number) => void + onPageSelecting?: ( + index: number, + reason: LogEvents['home:feedDisplayed']['reason'], + ) => void onPageScrollStateChanged?: ( scrollState: 'idle' | 'dragging' | 'settling', ) => void @@ -51,7 +59,13 @@ export const Pager = forwardRef>( const pagerView = React.useRef(null) React.useImperativeHandle(ref, () => ({ - setPage: (index: number) => pagerView.current?.setPage(index), + setPage: ( + index: number, + reason: LogEvents['home:feedDisplayed']['reason'], + ) => { + pagerView.current?.setPage(index) + onPageSelecting?.(index, reason) + }, })) const onPageSelectedInner = React.useCallback( @@ -79,14 +93,14 @@ export const Pager = forwardRef>( // -prf if (scrollState.current === 'settling') { if (lastDirection.current === -1 && offset < lastOffset.current) { - onPageSelecting?.(position) + onPageSelecting?.(position, 'pager-swipe') setSelectedPage(position) lastDirection.current = 0 } else if ( lastDirection.current === 1 && offset > lastOffset.current ) { - onPageSelecting?.(position + 1) + onPageSelecting?.(position + 1, 'pager-swipe') setSelectedPage(position + 1) lastDirection.current = 0 } @@ -113,7 +127,7 @@ export const Pager = forwardRef>( const onTabBarSelect = React.useCallback( (index: number) => { pagerView.current?.setPage(index) - onPageSelecting?.(index) + onPageSelecting?.(index, 'tabbar-click') }, [pagerView, onPageSelecting], ) diff --git a/src/view/com/pager/Pager.web.tsx b/src/view/com/pager/Pager.web.tsx index 42982ef7f8..abba12b2cc 100644 --- a/src/view/com/pager/Pager.web.tsx +++ b/src/view/com/pager/Pager.web.tsx @@ -1,6 +1,8 @@ import React from 'react' -import {flushSync} from 'react-dom' import {View} from 'react-native' +import {flushSync} from 'react-dom' + +import {LogEvents} from '#/lib/statsig/events' import {s} from 'lib/styles' export interface RenderTabBarFnProps { @@ -14,7 +16,10 @@ interface Props { initialPage?: number renderTabBar: RenderTabBarFn onPageSelected?: (index: number) => void - onPageSelecting?: (index: number) => void + onPageSelecting?: ( + index: number, + reason: LogEvents['home:feedDisplayed']['reason'], + ) => void } export const Pager = React.forwardRef(function PagerImpl( { @@ -31,11 +36,16 @@ export const Pager = React.forwardRef(function PagerImpl( const anchorRef = React.useRef(null) React.useImperativeHandle(ref, () => ({ - setPage: (index: number) => onTabBarSelect(index), + setPage: ( + index: number, + reason: LogEvents['home:feedDisplayed']['reason'], + ) => { + onTabBarSelect(index, reason) + }, })) const onTabBarSelect = React.useCallback( - (index: number) => { + (index: number, reason: LogEvents['home:feedDisplayed']['reason']) => { const scrollY = window.scrollY // We want to determine if the tabbar is already "sticking" at the top (in which // case we should preserve and restore scroll), or if it is somewhere below in the @@ -54,7 +64,7 @@ export const Pager = React.forwardRef(function PagerImpl( flushSync(() => { setSelectedPage(index) onPageSelected?.(index) - onPageSelecting?.(index) + onPageSelecting?.(index, reason) }) if (isSticking) { const restoredScrollY = scrollYs.current[index] @@ -73,7 +83,7 @@ export const Pager = React.forwardRef(function PagerImpl( {renderTabBar({ selectedPage, tabBarAnchor: , - onSelect: onTabBarSelect, + onSelect: e => onTabBarSelect(e, 'tabbar-click'), })} {React.Children.map(children, (child, i) => ( diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index e6ba0395cf..39bdac669c 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -2,8 +2,9 @@ import React from 'react' import {ActivityIndicator, AppState, StyleSheet, View} from 'react-native' import {useFocusEffect} from '@react-navigation/native' +import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' import {useSetTitle} from '#/lib/hooks/useSetTitle' -import {useGate} from '#/lib/statsig/statsig' +import {logEvent, LogEvents, useGate} from '#/lib/statsig/statsig' import {emitSoftReset} from '#/state/events' import {FeedSourceInfo, usePinnedFeedsInfos} from '#/state/queries/feed' import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed' @@ -79,7 +80,7 @@ function HomeScreenReady({ // This is supposed to only happen on the web when you use the right nav. if (selectedIndex !== lastPagerReportedIndexRef.current) { lastPagerReportedIndexRef.current = selectedIndex - pagerRef.current?.setPage(selectedIndex) + pagerRef.current?.setPage(selectedIndex, 'desktop-sidebar-click') } }, [selectedIndex]) @@ -96,6 +97,17 @@ function HomeScreenReady({ }, [setDrawerSwipeDisabled, selectedIndex, setMinimalShellMode]), ) + useFocusEffect( + useNonReactiveCallback(() => { + logEvent('home:feedDisplayed', { + index: selectedIndex, + feedType: selectedFeed.split('|')[0], + feedUrl: selectedFeed, + reason: 'focus', + }) + }), + ) + const disableMinShellOnForegrounding = useGate( 'disable_min_shell_on_foregrounding', ) @@ -123,6 +135,19 @@ function HomeScreenReady({ [setDrawerSwipeDisabled, setSelectedFeed, setMinimalShellMode, allFeeds], ) + const onPageSelecting = React.useCallback( + (index: number, reason: LogEvents['home:feedDisplayed']['reason']) => { + const feed = allFeeds[index] + logEvent('home:feedDisplayed', { + index, + feedType: feed.split('|')[0], + feedUrl: feed, + reason, + }) + }, + [allFeeds], + ) + const onPressSelected = React.useCallback(() => { emitSoftReset() }, []) @@ -175,6 +200,7 @@ function HomeScreenReady({ ref={pagerRef} testID="homeScreen" initialPage={selectedIndex} + onPageSelecting={onPageSelecting} onPageSelected={onPageSelected} onPageScrollStateChanged={onPageScrollStateChanged} renderTabBar={renderTabBar}> From d89b6eb7fd731dae320c0ca07e970c81e4de3cad Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 9 Apr 2024 23:09:53 +0100 Subject: [PATCH 014/185] [Statsig] Send prev route name (#3456) --- src/Navigation.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Navigation.tsx b/src/Navigation.tsx index ab40ff4220..070c57960d 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -539,8 +539,10 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) { const theme = useColorSchemeStyle(DefaultTheme, DarkTheme) const {currentAccount} = useSession() const {openModal} = useModalControls() + const prevLoggedRouteName = React.useRef(undefined) function onReady() { + prevLoggedRouteName.current = getCurrentRouteName() initAnalytics(currentAccount) if (currentAccount && shouldRequestEmailConfirmation(currentAccount)) { @@ -555,7 +557,10 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) { linking={LINKING} theme={theme} onStateChange={() => { - logEvent('router:navigate', {}) + logEvent('router:navigate', { + from: prevLoggedRouteName.current, + }) + prevLoggedRouteName.current = getCurrentRouteName() }} onReady={() => { attachRouteToLogEvents(getCurrentRouteName) From edab3d2db6d53c2904f97c8008c19d318fd62507 Mon Sep 17 00:00:00 2001 From: Gabriella <152436322+Titianbeetle@users.noreply.github.com> Date: Wed, 10 Apr 2024 00:12:28 +0200 Subject: [PATCH 015/185] Italian Localization (#3388) * Italian Localization New strings translated for v.1.75 * Update messages.po Changed two expressions following the revision of @marcomaroni * Update messages.po Additional changes to text applied following the suggestion of external translators. * Update messages.po Deleted extra stop and corrected a gramatical error * Update messages.po Added a correction on string 414 which had a grammatical error. * Update messages.po String with Labeler updated. * Update messages.po Additional changes made to wordings in traduced strings --- src/locale/locales/it/messages.po | 2046 +++++++++++++---------------- 1 file changed, 888 insertions(+), 1158 deletions(-) diff --git a/src/locale/locales/it/messages.po b/src/locale/locales/it/messages.po index 7298e765f1..731e116c0e 100644 --- a/src/locale/locales/it/messages.po +++ b/src/locale/locales/it/messages.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: Italian localization\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-01-05 11:44+0530\n" -"PO-Revision-Date: 2024-02-18\n" +"PO-Revision-Date: 2024-04-03 17:58+0200\n" "Last-Translator: Gabriella Nonino \n" "Language-Team: Gabriella Nonino sandswimmer@gmail.com\n" "Language: it\n" @@ -18,31 +18,10 @@ msgstr "" msgid "(no email)" msgstr "(no email)" -#~ msgid "{0, plural, one {# invite code available} other {# invite codes available}}" -#~ msgstr "{0, plural, one {# codice d'invito disponibile} other {# codici d'inviti disponibili}}" - -#~ msgid "{0}" -#~ msgstr "{0}" - -#~ msgid "{0} {purposeLabel} List" -#~ msgstr "Lista {purposeLabel} {0}" - #: src/screens/Profile/Header/Metrics.tsx:45 msgid "{following} following" msgstr "{following} seguendo" -#~ msgid "{invitesAvailable, plural, one {Invite codes: # available} other {Invite codes: # available}}" -#~ msgstr "{invitesAvailable, plural, one {Codici d'invito: # available} other {Codici d'invito: # available}}" - -#~ msgid "{invitesAvailable} invite code available" -#~ msgstr "{invitesAvailable} codice d'invito disponibile" - -#~ msgid "{invitesAvailable} invite codes available" -#~ msgstr "{invitesAvailable} codici d'invito disponibili" - -#~ msgid "{message}" -#~ msgstr "{message}" - #: src/view/shell/Drawer.tsx:443 msgid "{numUnreadNotifications} unread" msgstr "{numUnreadNotifications} non letto" @@ -53,11 +32,11 @@ msgstr "<0/> membri" #: src/view/shell/Drawer.tsx:97 msgid "<0>{0} following" -msgstr "" +msgstr "<0>{0} following" #: src/screens/Profile/Header/Metrics.tsx:46 msgid "<0>{following} <1>following" -msgstr "<0>{following} <1>seguiti" +msgstr "<0>{following} <1>following" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:30 msgid "<0>Choose your<1>Recommended<2>Feeds" @@ -69,22 +48,13 @@ msgstr "<0>Segui alcuni<1>utenti<2>consigliati" #: src/view/com/auth/onboarding/WelcomeDesktop.tsx:21 msgid "<0>Welcome to<1>Bluesky" -msgstr "<0>Ti diamo il benvenuto a<1>Bluesky" +msgstr "<0>Ti diamo il benvenuto su<1>Bluesky" #: src/screens/Profile/Header/Handle.tsx:42 msgid "⚠Invalid Handle" msgstr "⚠Nome utente non valido" -#: src/view/com/util/moderation/LabelInfo.tsx:45 -#~ msgid "A content warning has been applied to this {0}." -#~ msgstr "A questo post è stato applicato un avviso di contenuto {0}." - -#: src/lib/hooks/useOTAUpdate.ts:16 -#~ msgid "A new version of the app is available. Please update to continue using the app." -#~ msgstr "È disponibile una nuova versione dell'app. Aggiorna per continuare a utilizzarla." - -#: src/view/com/util/ViewHeader.tsx:89 -#: src/view/screens/Search/Search.tsx:648 +#: src/view/com/util/ViewHeader.tsx:89 src/view/screens/Search/Search.tsx:648 msgid "Access navigation links and settings" msgstr "Accedi alle impostazioni di navigazione" @@ -99,7 +69,7 @@ msgstr "Accessibilità" #: src/components/moderation/LabelsOnMe.tsx:42 msgid "account" -msgstr "" +msgstr "account" #: src/view/com/auth/login/LoginForm.tsx:169 #: src/view/screens/Settings/index.tsx:327 @@ -113,7 +83,7 @@ msgstr "Account bloccato" #: src/view/com/profile/ProfileMenu.tsx:153 msgid "Account followed" -msgstr "" +msgstr "Account seguito" #: src/view/com/profile/ProfileMenu.tsx:113 msgid "Account muted" @@ -143,7 +113,7 @@ msgstr "Account sbloccato" #: src/view/com/profile/ProfileMenu.tsx:166 msgid "Account unfollowed" -msgstr "" +msgstr "Account non seguito" #: src/view/com/profile/ProfileMenu.tsx:102 msgid "Account unmuted" @@ -176,36 +146,26 @@ msgstr "Aggiungi account" msgid "Add alt text" msgstr "Aggiungi testo alternativo" -#: src/view/screens/AppPasswords.tsx:104 -#: src/view/screens/AppPasswords.tsx:145 +#: src/view/screens/AppPasswords.tsx:104 src/view/screens/AppPasswords.tsx:145 #: src/view/screens/AppPasswords.tsx:158 msgid "Add App Password" msgstr "Aggiungi la Password per l'App" -#: src/view/com/modals/report/InputIssueDetails.tsx:41 -#: src/view/com/modals/report/Modal.tsx:191 -#~ msgid "Add details" -#~ msgstr "Aggiungi i dettagli" - -#: src/view/com/modals/report/Modal.tsx:194 -#~ msgid "Add details to report" -#~ msgstr "Aggiungi dettagli da segnalare" - #: src/view/com/composer/Composer.tsx:466 msgid "Add link card" -msgstr "Aggiungi la scheda collegata al link" +msgstr "Aggiungi anteprima del link" #: src/view/com/composer/Composer.tsx:471 msgid "Add link card:" -msgstr "Aggiungi la scheda relazionata al link:" +msgstr "Aggiungi anteprima del link:" #: src/components/dialogs/MutedWords.tsx:158 msgid "Add mute word for configured settings" -msgstr "" +msgstr "Aggiungi parola silenziata alle impostazioni configurate" #: src/components/dialogs/MutedWords.tsx:87 msgid "Add muted words and tags" -msgstr "" +msgstr "Aggiungi parole silenziate e tags" #: src/view/com/modals/ChangeHandle.tsx:417 msgid "Add the following DNS record to your domain:" @@ -242,16 +202,11 @@ msgstr "Modifica il numero Mi Piace che una risposta deve avere per essere mostr msgid "Adult Content" msgstr "Contenuto per adulti" -#: src/view/com/modals/ContentFilteringSettings.tsx:141 -#~ msgid "Adult content can only be enabled via the Web at <0/>." -#~ msgstr "I contenuti per adulti possono essere abilitati solo dal sito Web a <0/>." - #: src/components/moderation/ModerationLabelPref.tsx:114 msgid "Adult content is disabled." -msgstr "" +msgstr "Il contenuto per adulti è disattivato." -#: src/screens/Moderation/index.tsx:377 -#: src/view/screens/Settings/index.tsx:684 +#: src/screens/Moderation/index.tsx:377 src/view/screens/Settings/index.tsx:684 msgid "Advanced" msgstr "Avanzato" @@ -266,7 +221,7 @@ msgstr "Hai già un codice?" #: src/view/com/auth/login/ChooseAccountForm.tsx:103 msgid "Already signed in as @{0}" -msgstr "Già effettuato l'accesso come @{0}" +msgstr "Hai già effettuato l'accesso come @{0}" #: src/view/com/composer/photos/Gallery.tsx:130 msgid "ALT" @@ -290,7 +245,7 @@ msgstr "Una email è stata inviata al tuo indirizzo precedente, {0}. Include un #: src/lib/moderation/useReportOptions.ts:26 msgid "An issue not included in these options" -msgstr "" +msgstr "Un problema non incluso in queste opzioni" #: src/view/com/profile/FollowButton.tsx:35 #: src/view/com/profile/FollowButton.tsx:45 @@ -310,7 +265,7 @@ msgstr "Animali" #: src/lib/moderation/useReportOptions.ts:31 msgid "Anti-Social Behavior" -msgstr "" +msgstr "Comportamento antisociale" #: src/view/screens/LanguageSettings.tsx:95 msgid "App Language" @@ -332,11 +287,7 @@ msgstr "I nomi delle password delle app devono contenere almeno 4 caratteri." msgid "App password settings" msgstr "Impostazioni della password dell'app" -#~ msgid "App passwords" -#~ msgstr "Passwords dell'app" - -#: src/Navigation.tsx:251 -#: src/view/screens/AppPasswords.tsx:189 +#: src/Navigation.tsx:251 src/view/screens/AppPasswords.tsx:189 #: src/view/screens/Settings/index.tsx:704 msgid "App Passwords" msgstr "Passwords dell'App" @@ -344,35 +295,15 @@ msgstr "Passwords dell'App" #: src/components/moderation/LabelsOnMeDialog.tsx:134 #: src/components/moderation/LabelsOnMeDialog.tsx:137 msgid "Appeal" -msgstr "" +msgstr "Ricorso" #: src/components/moderation/LabelsOnMeDialog.tsx:202 msgid "Appeal \"{0}\" label" -msgstr "" - -#: src/view/com/util/forms/PostDropdownBtn.tsx:337 -#: src/view/com/util/forms/PostDropdownBtn.tsx:346 -#~ msgid "Appeal content warning" -#~ msgstr "Ricorso contro l'avviso sui contenuti" - -#: src/view/com/modals/AppealLabel.tsx:65 -#~ msgid "Appeal Content Warning" -#~ msgstr "Ricorso contro l'Avviso sui Contenuti" - -#~ msgid "Appeal Decision" -#~ msgstr "Decisión de apelación" +msgstr "Etichetta \"{0}\" del ricorso" #: src/components/moderation/LabelsOnMeDialog.tsx:193 msgid "Appeal submitted." -msgstr "" - -#: src/view/com/util/moderation/LabelInfo.tsx:52 -#~ msgid "Appeal this decision" -#~ msgstr "Appella contro questa decisione" - -#: src/view/com/util/moderation/LabelInfo.tsx:56 -#~ msgid "Appeal this decision." -#~ msgstr "Appella contro questa decisione." +msgstr "Ricorso presentato." #: src/view/screens/Settings/index.tsx:485 msgid "Appearance" @@ -384,7 +315,7 @@ msgstr "Conferma di voler eliminare la password dell'app \"{name}\"?" #: src/view/com/feeds/FeedSourceCard.tsx:280 msgid "Are you sure you want to remove {0} from your feeds?" -msgstr "" +msgstr "Vuoi rimuovere {0} dai tuoi feed?" #: src/view/com/composer/Composer.tsx:508 msgid "Are you sure you'd like to discard this draft?" @@ -394,10 +325,6 @@ msgstr "Conferma di voler eliminare questa bozza?" msgid "Are you sure?" msgstr "Confermi?" -#: src/view/com/util/forms/PostDropdownBtn.tsx:322 -#~ msgid "Are you sure? This cannot be undone." -#~ msgstr "Vuoi proseguire? Questa operazione non può essere annullata." - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:60 msgid "Are you writing in <0>{0}?" msgstr "Stai scrivendo in <0>{0}?" @@ -422,14 +349,9 @@ msgstr "Nudità artistica o non erotica." msgid "Back" msgstr "Indietro" -#: src/view/com/post-thread/PostThread.tsx:480 -#~ msgctxt "action" -#~ msgid "Back" -#~ msgstr "Indietro" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:136 msgid "Based on your interest in {interestsText}" -msgstr "Basato su i tuoi interessi {interestsText}" +msgstr "Basato sui tuoi interessi {interestsText}" #: src/view/screens/Settings/index.tsx:542 msgid "Basics" @@ -447,23 +369,22 @@ msgstr "Compleanno:" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:278 #: src/view/com/profile/ProfileMenu.tsx:361 msgid "Block" -msgstr "" +msgstr "Blocca" #: src/view/com/profile/ProfileMenu.tsx:300 #: src/view/com/profile/ProfileMenu.tsx:307 msgid "Block Account" -msgstr "Blocca l'account" +msgstr "Blocca Account" #: src/view/com/profile/ProfileMenu.tsx:344 msgid "Block Account?" -msgstr "" +msgstr "Blocca Account?" #: src/view/screens/ProfileList.tsx:530 msgid "Block accounts" msgstr "Blocca gli accounts" -#: src/view/screens/ProfileList.tsx:478 -#: src/view/screens/ProfileList.tsx:634 +#: src/view/screens/ProfileList.tsx:478 src/view/screens/ProfileList.tsx:634 msgid "Block list" msgstr "Lista di blocchi" @@ -471,10 +392,6 @@ msgstr "Lista di blocchi" msgid "Block these accounts?" msgstr "Vuoi bloccare questi accounts?" -#: src/view/screens/ProfileList.tsx:320 -#~ msgid "Block this List" -#~ msgstr "Blocca questa Lista" - #: src/view/com/lists/ListCard.tsx:110 #: src/view/com/util/post-embeds/QuoteEmbed.tsx:55 msgid "Blocked" @@ -484,18 +401,17 @@ msgstr "Bloccato" msgid "Blocked accounts" msgstr "Accounts bloccati" -#: src/Navigation.tsx:134 -#: src/view/screens/ModerationBlockedAccounts.tsx:107 +#: src/Navigation.tsx:134 src/view/screens/ModerationBlockedAccounts.tsx:107 msgid "Blocked Accounts" msgstr "Accounts bloccati" #: src/view/com/profile/ProfileMenu.tsx:356 msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." -msgstr "Gli account bloccati non possono rispondere nelle tue discussioni, menzionarti o interagire in nessun altro modo con te." +msgstr "Gli account bloccati non possono rispondere alle tue discussioni, menzionarti o interagire in nessun altro modo con te." #: src/view/screens/ModerationBlockedAccounts.tsx:115 msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you. You will not see their content and they will be prevented from seeing yours." -msgstr "Gli account bloccati non possono rispondere nelle tue discussioni, menzionarti in nessun altro modo con te. Non vedrai il loro contenuto e non vedranno il tuo.." +msgstr "Gli account bloccati non possono rispondere alle tue discussioni, menzionarti, o interagire in nessun altro modo con te. Non vedrai il loro contenuto e non vedranno il tuo." #: src/view/com/post-thread/PostThread.tsx:313 msgid "Blocked post." @@ -503,15 +419,15 @@ msgstr "Post bloccato." #: src/screens/Profile/Sections/Labels.tsx:153 msgid "Blocking does not prevent this labeler from placing labels on your account." -msgstr "" +msgstr "Il blocco non impedisce al labeler di inserire etichette nel tuo account." #: src/view/screens/ProfileList.tsx:631 msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." -msgstr "Il blocco è pubblico. Gli accounts bloccati non possono rispondere nelle tue discussioni, menzionarti o interagire con te in nessun altro modo." +msgstr "l blocco è pubblico. Gli account bloccati non possono rispondere alle tue discussioni, menzionarti, o interagire con te in nessun altro modo." #: src/view/com/profile/ProfileMenu.tsx:353 msgid "Blocking will not prevent labels from being applied on your account, but it will stop this account from replying in your threads or interacting with you." -msgstr "" +msgstr "Il blocco non impedirà l'applicazione delle etichette al tuo account, ma impedirà a questo account di rispondere alle tue discussioni o di interagire con te." #: src/view/com/auth/HomeLoggedOutCTA.tsx:97 #: src/view/com/auth/SplashScreen.web.tsx:133 @@ -526,7 +442,7 @@ msgstr "Bluesky" #: src/view/com/auth/server-input/index.tsx:150 msgid "Bluesky is an open network where you can choose your hosting provider. Custom hosting is now available in beta for developers." -msgstr "Bluesky è una network aperto in cui puoi scegliere il tuo provider di hosting. L'hosting personalizzato adesso è disponibile in versione beta per i developers." +msgstr "Bluesky è un network aperto in cui puoi scegliere il tuo provider di hosting. L'hosting personalizzato è adesso disponibile in versione beta per gli sviluppatori." #: src/view/com/auth/onboarding/WelcomeDesktop.tsx:80 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:82 @@ -543,24 +459,17 @@ msgstr "Bluesky è aperto." msgid "Bluesky is public." msgstr "Bluesky è pubblico." -#: src/view/com/modals/Waitlist.tsx:70 -#~ msgid "Bluesky uses invites to build a healthier community. If you don't know anybody with an invite, you can sign up for the waitlist and we'll send one soon." -#~ msgstr "Bluesky utilizza gli inviti per costruire una comunità più sana. Se non conosci nessuno con un invito, puoi iscriverti alla lista d'attesa e te ne invieremo uno al più presto." - #: src/screens/Moderation/index.tsx:535 msgid "Bluesky will not show your profile and posts to logged-out users. Other apps may not honor this request. This does not make your account private." -msgstr "Bluesky non mostrerà il tuo profilo e i tuoi post agli utenti disconnessi. Altre app potrebbero non rispettare questa richiesta. Questo non rende il tuo account privato." - -#~ msgid "Bluesky.Social" -#~ msgstr "Bluesky.Social" +msgstr "Bluesky non mostrerà il tuo profilo e i tuoi post agli utenti non loggati. Altre applicazioni potrebbero non rispettare questa istruzione. Ciò non rende il tuo account privato." #: src/lib/moderation/useLabelBehaviorDescription.ts:53 msgid "Blur images" -msgstr "" +msgstr "Sfoca le immagini" #: src/lib/moderation/useLabelBehaviorDescription.ts:51 msgid "Blur images and filter from feeds" -msgstr "" +msgstr "Sfoca le immagini e filtra dai feed" #: src/screens/Onboarding/index.tsx:33 msgid "Books" @@ -575,28 +484,25 @@ msgstr "Versione {0} {1}" msgid "Business" msgstr "Attività commerciale" -#~ msgid "Button disabled. Input custom domain to proceed." -#~ msgstr "Pulsante disabilitato. Inserisci il dominio personalizzato per procedere." - #: src/view/com/profile/ProfileSubpageHeader.tsx:157 msgid "by —" -msgstr "da—" +msgstr "da —" #: src/view/com/auth/onboarding/RecommendedFeedsItem.tsx:100 msgid "by {0}" -msgstr "da {0}" +msgstr "di {0}" #: src/components/LabelingServiceCard/index.tsx:57 msgid "By {0}" -msgstr "" +msgstr "Di {0}" #: src/view/com/profile/ProfileSubpageHeader.tsx:161 msgid "by <0/>" -msgstr "da <0/>" +msgstr "di <0/>" #: src/view/com/auth/create/Policies.tsx:87 msgid "By creating an account you agree to the {els}." -msgstr "" +msgstr "Creando un account accetti i {els}." #: src/view/com/profile/ProfileSubpageHeader.tsx:159 msgid "by you" @@ -610,10 +516,8 @@ msgstr "Fotocamera" msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long." msgstr "Può contenere solo lettere, numeri, spazi, trattini e trattini bassi. Deve contenere almeno 4 caratteri, ma non più di 32 caratteri." -#: src/components/Menu/index.tsx:213 -#: src/components/Prompt.tsx:116 -#: src/components/Prompt.tsx:118 -#: src/components/TagMenu/index.tsx:268 +#: src/components/Menu/index.tsx:213 src/components/Prompt.tsx:116 +#: src/components/Prompt.tsx:118 src/components/TagMenu/index.tsx:268 #: src/view/com/composer/Composer.tsx:316 #: src/view/com/composer/Composer.tsx:321 #: src/view/com/modals/ChangeEmail.tsx:218 @@ -628,12 +532,10 @@ msgstr "Può contenere solo lettere, numeri, spazi, trattini e trattini bassi. D #: src/view/com/modals/InAppBrowserConsent.tsx:78 #: src/view/com/modals/InAppBrowserConsent.tsx:80 #: src/view/com/modals/LinkWarning.tsx:87 -#: src/view/com/modals/LinkWarning.tsx:89 -#: src/view/com/modals/Repost.tsx:87 +#: src/view/com/modals/LinkWarning.tsx:89 src/view/com/modals/Repost.tsx:87 #: src/view/com/modals/VerifyEmail.tsx:247 #: src/view/com/modals/VerifyEmail.tsx:253 -#: src/view/screens/Search/Search.tsx:717 -#: src/view/shell/desktop/Search.tsx:239 +#: src/view/screens/Search/Search.tsx:717 src/view/shell/desktop/Search.tsx:239 msgid "Cancel" msgstr "Cancella" @@ -649,9 +551,6 @@ msgstr "Cancella" msgid "Cancel account deletion" msgstr "Annulla la cancellazione dell'account" -#~ msgid "Cancel add image alt text" -#~ msgstr "Cancel·la afegir text a la imatge" - #: src/view/com/modals/ChangeHandle.tsx:149 msgid "Cancel change handle" msgstr "Annulla il cambio del tuo nome utente" @@ -673,13 +572,9 @@ msgstr "Annnulla la citazione del post" msgid "Cancel search" msgstr "Annulla la ricerca" -#: src/view/com/modals/Waitlist.tsx:136 -#~ msgid "Cancel waitlist signup" -#~ msgstr "Annulla l'iscrizione alla lista d'attesa" - #: src/view/com/modals/LinkWarning.tsx:88 msgid "Cancels opening the linked website" -msgstr "" +msgstr "Annulla l'apertura del sito collegato" #: src/view/com/modals/VerifyEmail.tsx:152 msgid "Change" @@ -716,22 +611,17 @@ msgstr "Cambia la Password" msgid "Change post language to {0}" msgstr "Cambia la lingua del post a {0}" -#: src/view/screens/Settings/index.tsx:733 -#~ msgid "Change your Bluesky password" -#~ msgstr "Cambia la tua password di Bluesky" - #: src/view/com/modals/ChangeEmail.tsx:109 msgid "Change Your Email" msgstr "Cambia la tua email" -#: src/screens/Deactivated.tsx:72 -#: src/screens/Deactivated.tsx:76 +#: src/screens/Deactivated.tsx:72 src/screens/Deactivated.tsx:76 msgid "Check my status" msgstr "Verifica il mio stato" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:121 msgid "Check out some recommended feeds. Tap + to add them to your list of pinned feeds." -msgstr "Dai un'occhiata ad alcuni feed consigliati. Clicca + per aggiungerli al tuo elenco dei feeds." +msgstr "Dai un'occhiata ad alcuni feed consigliati. Clicca + per aggiungerli al tuo elenco dei feed." #: src/view/com/auth/onboarding/RecommendedFollows.tsx:185 msgid "Check out some recommended users. Follow them to see similar users." @@ -745,10 +635,6 @@ msgstr "Controlla la tua posta in arrivo, dovrebbe contenere un'e-mail con il co msgid "Choose \"Everybody\" or \"Nobody\"" msgstr "Scegli \"Tutti\" o \"Nessuno\"" -#: src/view/screens/Settings/index.tsx:697 -#~ msgid "Choose a new Bluesky username or create" -#~ msgstr "Scegli un nuovo nome utente Bluesky o creane uno" - #: src/view/com/auth/server-input/index.tsx:79 msgid "Choose Service" msgstr "Scegli il servizio" @@ -760,7 +646,7 @@ msgstr "Scegli gli algoritmi che compilano i tuoi feed personalizzati." #: src/view/com/auth/onboarding/WelcomeDesktop.tsx:83 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:85 msgid "Choose the algorithms that power your experience with custom feeds." -msgstr "Scegli gli algoritmi che alimentano la tua esperienza con feed personalizzati." +msgstr "Scegli gli algoritmi che migliorano la tua esperienza con i feed personalizzati." #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:103 msgid "Choose your main feeds" @@ -793,11 +679,11 @@ msgstr "Annulla la ricerca" #: src/view/screens/Settings/index.tsx:869 msgid "Clears all legacy storage data" -msgstr "" +msgstr "Cancella tutti i dati di archiviazione legacy" #: src/view/screens/Settings/index.tsx:881 msgid "Clears all storage data" -msgstr "" +msgstr "Cancella tutti i dati di archiviazione" #: src/view/screens/Support.tsx:40 msgid "click here" @@ -805,11 +691,11 @@ msgstr "clicca qui" #: src/components/TagMenu/index.web.tsx:138 msgid "Click here to open tag menu for {tag}" -msgstr "" +msgstr "Clicca qui per aprire il menu per {tag}" #: src/components/RichText.tsx:191 msgid "Click here to open tag menu for #{tag}" -msgstr "" +msgstr "Clicca qui per aprire il menu per #{tag}" #: src/screens/Onboarding/index.tsx:35 msgid "Climate" @@ -823,7 +709,7 @@ msgstr "Chiudi" #: src/components/Dialog/index.web.tsx:84 #: src/components/Dialog/index.web.tsx:198 msgid "Close active dialog" -msgstr "Chiudi il dialogo attivo" +msgstr "Chiudi la finestra attiva" #: src/view/com/auth/login/PasswordUpdatedForm.tsx:38 msgid "Close alert" @@ -845,10 +731,9 @@ msgstr "Chiudi il visualizzatore di immagini" msgid "Close navigation footer" msgstr "Chiudi la navigazione del footer" -#: src/components/Menu/index.tsx:207 -#: src/components/TagMenu/index.tsx:262 +#: src/components/Menu/index.tsx:207 src/components/TagMenu/index.tsx:262 msgid "Close this dialog" -msgstr "" +msgstr "Chiudi la finestra" #: src/view/shell/index.web.tsx:56 msgid "Closes bottom navigation bar" @@ -878,8 +763,7 @@ msgstr "Commedia" msgid "Comics" msgstr "Fumetti" -#: src/Navigation.tsx:241 -#: src/view/screens/CommunityGuidelines.tsx:32 +#: src/Navigation.tsx:241 src/view/screens/CommunityGuidelines.tsx:32 msgid "Community Guidelines" msgstr "Linee guida della community" @@ -889,7 +773,7 @@ msgstr "Completa l'incorporazione e inizia a utilizzare il tuo account" #: src/view/com/auth/create/Step3.tsx:73 msgid "Complete the challenge" -msgstr "" +msgstr "Completa la challenge" #: src/view/com/composer/Composer.tsx:437 msgid "Compose posts up to {MAX_GRAPHEME_LENGTH} characters in length" @@ -907,10 +791,9 @@ msgstr "Configura l'impostazione del filtro dei contenuti per la categoria:{0}" #: src/components/moderation/ModerationLabelPref.tsx:116 msgid "Configured in <0>moderation settings." -msgstr "" +msgstr "Configurato nelle <0>impostazioni di moderazione." -#: src/components/Prompt.tsx:152 -#: src/components/Prompt.tsx:155 +#: src/components/Prompt.tsx:152 src/components/Prompt.tsx:155 #: src/view/com/modals/SelfLabel.tsx:154 #: src/view/com/modals/VerifyEmail.tsx:231 #: src/view/com/modals/VerifyEmail.tsx:233 @@ -919,11 +802,6 @@ msgstr "" msgid "Confirm" msgstr "Conferma" -#: src/view/com/modals/Confirm.tsx:NaN -#~ msgctxt "action" -#~ msgid "Confirm" -#~ msgstr "Conferma" - #: src/view/com/modals/ChangeEmail.tsx:193 #: src/view/com/modals/ChangeEmail.tsx:195 msgid "Confirm Change" @@ -937,17 +815,13 @@ msgstr "Conferma le impostazioni della lingua del contenuto" msgid "Confirm delete account" msgstr "Conferma l'eliminazione dell'account" -#: src/view/com/modals/ContentFilteringSettings.tsx:156 -#~ msgid "Confirm your age to enable adult content." -#~ msgstr "Conferma la tua età per abilitare i contenuti per adulti." - #: src/screens/Moderation/index.tsx:303 msgid "Confirm your age:" -msgstr "" +msgstr "Conferma la tua età:" #: src/screens/Moderation/index.tsx:294 msgid "Confirm your birthdate" -msgstr "" +msgstr "Conferma la tua data di nascita" #: src/view/com/modals/ChangeEmail.tsx:157 #: src/view/com/modals/DeleteAccount.tsx:176 @@ -956,10 +830,6 @@ msgstr "" msgid "Confirmation code" msgstr "Codice di conferma" -#: src/view/com/modals/Waitlist.tsx:120 -#~ msgid "Confirms signing up {email} to the waitlist" -#~ msgstr "Conferma l'iscrizione di {email} alla lista d'attesa" - #: src/view/com/auth/create/CreateAccount.tsx:193 #: src/view/com/auth/login/LoginForm.tsx:281 msgid "Connecting..." @@ -971,23 +841,15 @@ msgstr "Contatta il supporto" #: src/components/moderation/LabelsOnMe.tsx:42 msgid "content" -msgstr "" +msgstr "contenuto" #: src/lib/moderation/useGlobalLabelStrings.ts:18 msgid "Content Blocked" -msgstr "" - -#: src/view/screens/Moderation.tsx:83 -#~ msgid "Content filtering" -#~ msgstr "Filtro dei contenuti" - -#: src/view/com/modals/ContentFilteringSettings.tsx:44 -#~ msgid "Content Filtering" -#~ msgstr "Filtro dei Contenuti" +msgstr "Contenuto Bloccato" #: src/screens/Moderation/index.tsx:287 msgid "Content filters" -msgstr "" +msgstr "Filtri dei contenuti" #: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:74 #: src/view/screens/LanguageSettings.tsx:278 @@ -1012,7 +874,7 @@ msgstr "Avviso sui contenuti" #: src/components/Menu/index.web.tsx:84 msgid "Context menu backdrop, click to close the menu." -msgstr "" +msgstr "Sfondo del menu contestuale, clicca per chiudere il menu." #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:170 #: src/screens/Onboarding/StepFollowingFeed.tsx:153 @@ -1070,7 +932,7 @@ msgstr "Copia" #: src/view/com/modals/ChangeHandle.tsx:481 msgid "Copy {0}" -msgstr "" +msgstr "Copia {0}" #: src/view/screens/ProfileList.tsx:388 msgid "Copy link to list" @@ -1081,17 +943,12 @@ msgstr "Copia il link alla lista" msgid "Copy link to post" msgstr "Copia il link al post" -#: src/view/com/profile/ProfileHeader.tsx:295 -#~ msgid "Copy link to profile" -#~ msgstr "Copia il link al profilo" - #: src/view/com/util/forms/PostDropdownBtn.tsx:220 #: src/view/com/util/forms/PostDropdownBtn.tsx:222 msgid "Copy post text" msgstr "Copia il testo del post" -#: src/Navigation.tsx:246 -#: src/view/screens/CopyrightPolicy.tsx:29 +#: src/Navigation.tsx:246 src/view/screens/CopyrightPolicy.tsx:29 msgid "Copyright Policy" msgstr "Politica sul diritto d'autore" @@ -1103,10 +960,6 @@ msgstr "Feed non caricato" msgid "Could not load list" msgstr "No si è potuto caricare la lista" -#: src/view/com/auth/create/Step2.tsx:91 -#~ msgid "Country" -#~ msgstr "Paese" - #: src/view/com/auth/HomeLoggedOutCTA.tsx:64 #: src/view/com/auth/SplashScreen.tsx:73 #: src/view/com/auth/SplashScreen.web.tsx:81 @@ -1132,20 +985,12 @@ msgstr "Crea un nuovo account" #: src/components/ReportDialog/SelectReportOptionView.tsx:94 msgid "Create report for {0}" -msgstr "" +msgstr "Crea un report per {0}" #: src/view/screens/AppPasswords.tsx:246 msgid "Created {0}" msgstr "Creato {0}" -#: src/view/screens/ProfileFeed.tsx:616 -#~ msgid "Created by <0/>" -#~ msgstr "Creato da <0/>" - -#: src/view/screens/ProfileFeed.tsx:614 -#~ msgid "Created by you" -#~ msgstr "Creato da te" - #: src/view/com/composer/Composer.tsx:468 msgid "Creates a card with a thumbnail. The card links to {url}" msgstr "Crea una scheda con una miniatura. La scheda si collega a {url}" @@ -1166,15 +1011,12 @@ msgstr "Dominio personalizzato" #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:106 #: src/view/screens/Feeds.tsx:692 msgid "Custom feeds built by the community bring you new experiences and help you find the content you love." -msgstr "I feed personalizzati creati dalla comunità ti offrono nuove esperienze e ti aiutano a trovare i contenuti che ami." +msgstr "I feed personalizzati creati dalla comunità ti offrono nuove esperienze e ti aiutano a trovare contenuti interessanti." #: src/view/screens/PreferencesExternalEmbeds.tsx:55 msgid "Customize media from external sites." msgstr "Personalizza i media da i siti esterni." -#~ msgid "Danger Zone" -#~ msgstr "Zona di Pericolo" - #: src/view/screens/Settings/index.tsx:504 #: src/view/screens/Settings/index.tsx:530 msgid "Dark" @@ -1190,25 +1032,24 @@ msgstr "Tema scuro" #: src/view/screens/Settings/index.tsx:841 msgid "Debug Moderation" -msgstr "" +msgstr "Eliminare errori nella Moderazione" #: src/view/screens/Debug.tsx:83 msgid "Debug panel" msgstr "Pannello per il debug" #: src/view/com/util/forms/PostDropdownBtn.tsx:319 -#: src/view/screens/AppPasswords.tsx:268 -#: src/view/screens/ProfileList.tsx:613 +#: src/view/screens/AppPasswords.tsx:268 src/view/screens/ProfileList.tsx:613 msgid "Delete" -msgstr "" +msgstr "Elimina" #: src/view/screens/Settings/index.tsx:796 msgid "Delete account" -msgstr "Eliminare l'account" +msgstr "Elimina l'account" #: src/view/com/modals/DeleteAccount.tsx:87 msgid "Delete Account" -msgstr "Eliminare l'Account" +msgstr "Elimina l'Account" #: src/view/screens/AppPasswords.tsx:239 msgid "Delete app password" @@ -1216,7 +1057,7 @@ msgstr "Elimina la password dell'app" #: src/view/screens/AppPasswords.tsx:263 msgid "Delete app password?" -msgstr "" +msgstr "Eliminare la password dell'app?" #: src/view/screens/ProfileList.tsx:415 msgid "Delete List" @@ -1226,9 +1067,6 @@ msgstr "Elimina la lista" msgid "Delete my account" msgstr "Cancellare account" -#~ msgid "Delete my account…" -#~ msgstr "Cancella il mio account…" - #: src/view/screens/Settings/index.tsx:808 msgid "Delete My Account…" msgstr "Cancellare Account…" @@ -1240,7 +1078,7 @@ msgstr "Elimina il post" #: src/view/screens/ProfileList.tsx:608 msgid "Delete this list?" -msgstr "" +msgstr "Elimina questa lista?" #: src/view/com/util/forms/PostDropdownBtn.tsx:314 msgid "Delete this post?" @@ -1261,12 +1099,6 @@ msgstr "Post eliminato." msgid "Description" msgstr "Descrizione" -#~ msgid "Dev Server" -#~ msgstr "Server di sviluppo" - -#~ msgid "Developer Tools" -#~ msgstr "Strumenti per sviluppatori" - #: src/view/com/composer/Composer.tsx:217 msgid "Did you want to say anything?" msgstr "Volevi dire qualcosa?" @@ -1280,22 +1112,17 @@ msgstr "Fioco" #: src/lib/moderation/useLabelBehaviorDescription.ts:68 #: src/screens/Moderation/index.tsx:343 msgid "Disabled" -msgstr "" +msgstr "Disabilitato" #: src/view/com/composer/Composer.tsx:510 msgid "Discard" msgstr "Scartare" -#: src/view/com/composer/Composer.tsx:145 -#~ msgid "Discard draft" -#~ msgstr "Scarta la bozza" - #: src/view/com/composer/Composer.tsx:507 msgid "Discard draft?" -msgstr "" +msgstr "Scartare la bozza?" -#: src/screens/Moderation/index.tsx:520 -#: src/screens/Moderation/index.tsx:524 +#: src/screens/Moderation/index.tsx:520 src/screens/Moderation/index.tsx:524 msgid "Discourage apps from showing my account to logged-out users" msgstr "Scoraggia le app dal mostrare il mio account agli utenti disconnessi" @@ -1304,9 +1131,6 @@ msgstr "Scoraggia le app dal mostrare il mio account agli utenti disconnessi" msgid "Discover new custom feeds" msgstr "Scopri nuovi feeds personalizzati" -#~ msgid "Discover new feeds" -#~ msgstr "Scopri nuovi feeds" - #: src/view/screens/Feeds.tsx:689 msgid "Discover New Feeds" msgstr "Scopri nuovi feeds" @@ -1321,24 +1145,20 @@ msgstr "Nome Visualizzato" #: src/view/com/modals/ChangeHandle.tsx:398 msgid "DNS Panel" -msgstr "" +msgstr "Pannello DNS" #: src/lib/moderation/useGlobalLabelStrings.ts:39 msgid "Does not include nudity." -msgstr "" +msgstr "Non include nudità." #: src/view/com/modals/ChangeHandle.tsx:482 msgid "Domain Value" -msgstr "" +msgstr "Valore del dominio" #: src/view/com/modals/ChangeHandle.tsx:489 msgid "Domain verified!" msgstr "Dominio verificato!" -#: src/view/com/auth/create/Step1.tsx:170 -#~ msgid "Don't have an invite code?" -#~ msgstr "Non hai un codice di invito?" - #: src/components/dialogs/BirthDateSettings.tsx:119 #: src/components/dialogs/BirthDateSettings.tsx:125 #: src/view/com/auth/server-input/index.tsx:165 @@ -1358,8 +1178,7 @@ msgstr "Fatto" #: src/view/com/auth/onboarding/RecommendedFollows.tsx:86 #: src/view/com/modals/EditImage.tsx:333 #: src/view/com/modals/ListAddRemoveUsers.tsx:144 -#: src/view/com/modals/SelfLabel.tsx:157 -#: src/view/com/modals/Threadgate.tsx:129 +#: src/view/com/modals/SelfLabel.tsx:157 src/view/com/modals/Threadgate.tsx:129 #: src/view/com/modals/Threadgate.tsx:132 #: src/view/com/modals/UserAddRemoveLists.tsx:95 #: src/view/com/modals/UserAddRemoveLists.tsx:98 @@ -1376,10 +1195,6 @@ msgstr "Fatto{extraText}" msgid "Double tap to sign in" msgstr "Usa il doppio tocco per accedere" -#: src/view/screens/Settings/index.tsx:755 -#~ msgid "Download Bluesky account data (repository)" -#~ msgstr "Scarica i dati dell'account Bluesky (archivio)" - #: src/view/screens/Settings/ExportCarDialog.tsx:59 #: src/view/screens/Settings/ExportCarDialog.tsx:63 msgid "Download CAR file" @@ -1395,15 +1210,15 @@ msgstr "A causa delle politiche di Apple, i contenuti per adulti possono essere #: src/view/com/modals/ChangeHandle.tsx:257 msgid "e.g. alice" -msgstr "" +msgstr "e.g. alice" #: src/view/com/modals/EditProfile.tsx:185 msgid "e.g. Alice Roberts" -msgstr "e.g. Anna Rossi" +msgstr "e.g. Alice Roberts" #: src/view/com/modals/ChangeHandle.tsx:381 msgid "e.g. alice.com" -msgstr "" +msgstr "e.g. alice.com" #: src/view/com/modals/EditProfile.tsx:203 msgid "e.g. Artist, dog-lover, and avid reader." @@ -1411,7 +1226,7 @@ msgstr "e.g. Artista, amo i gatti, mi piace leggere." #: src/lib/moderation/useGlobalLabelStrings.ts:43 msgid "E.g. artistic nudes." -msgstr "" +msgstr "E.g. nudi artistici." #: src/view/com/modals/CreateOrEditList.tsx:283 msgid "e.g. Great Posters" @@ -1438,10 +1253,9 @@ msgctxt "action" msgid "Edit" msgstr "Modifica" -#: src/view/com/util/UserAvatar.tsx:299 -#: src/view/com/util/UserBanner.tsx:85 +#: src/view/com/util/UserAvatar.tsx:299 src/view/com/util/UserBanner.tsx:85 msgid "Edit avatar" -msgstr "" +msgstr "Modifica l'avatar" #: src/view/com/composer/photos/Gallery.tsx:144 #: src/view/com/modals/EditImage.tsx:207 @@ -1456,8 +1270,7 @@ msgstr "Modifica i dettagli della lista" msgid "Edit Moderation List" msgstr "Modifica l'elenco di moderazione" -#: src/Navigation.tsx:256 -#: src/view/screens/Feeds.tsx:434 +#: src/Navigation.tsx:256 src/view/screens/Feeds.tsx:434 #: src/view/screens/SavedFeeds.tsx:84 msgid "Edit My Feeds" msgstr "Modifica i miei feeds" @@ -1476,8 +1289,7 @@ msgstr "Modifica il profilo" msgid "Edit Profile" msgstr "Modifica il Profilo" -#: src/view/com/home/HomeHeaderLayout.web.tsx:62 -#: src/view/screens/Feeds.tsx:355 +#: src/view/com/home/HomeHeaderLayout.web.tsx:62 src/view/screens/Feeds.tsx:355 msgid "Edit Saved Feeds" msgstr "Modifica i feeds memorizzati" @@ -1531,7 +1343,7 @@ msgstr "Attiva {0} solo" #: src/screens/Moderation/index.tsx:331 msgid "Enable adult content" -msgstr "" +msgstr "Attiva il contenuto per adulti" #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:94 msgid "Enable Adult Content" @@ -1556,7 +1368,7 @@ msgstr "Abilita questa impostazione per vedere solo le risposte delle persone ch #: src/screens/Moderation/index.tsx:341 msgid "Enabled" -msgstr "" +msgstr "Abilitato" #: src/screens/Profile/Sections/Feed.tsx:84 msgid "End of feed" @@ -1569,15 +1381,12 @@ msgstr "Inserisci un nome per questa password dell'app" #: src/components/dialogs/MutedWords.tsx:100 #: src/components/dialogs/MutedWords.tsx:101 msgid "Enter a word or tag" -msgstr "" +msgstr "Inserisci una parola o tag" #: src/view/com/modals/VerifyEmail.tsx:105 msgid "Enter Confirmation Code" msgstr "Inserire il codice di conferma" -#~ msgid "Enter the address of your provider:" -#~ msgstr "Inserisci l'indirizzo del tuo provider:" - #: src/view/com/modals/ChangePassword.tsx:153 msgid "Enter the code you received to change your password." msgstr "Inserisci il codice che hai ricevuto per modificare la tua password." @@ -1595,10 +1404,6 @@ msgstr "Inserisci l'e-mail che hai utilizzato per creare il tuo account. Ti invi msgid "Enter your birth date" msgstr "Inserisci la tua data di nascita" -#: src/view/com/modals/Waitlist.tsx:78 -#~ msgid "Enter your email" -#~ msgstr "Inserisci la tua email" - #: src/view/com/auth/create/Step1.tsx:172 msgid "Enter your email address" msgstr "Inserisci il tuo indirizzo email" @@ -1611,17 +1416,13 @@ msgstr "Inserisci la tua nuova email qui sopra" msgid "Enter your new email address below." msgstr "Inserisci il tuo nuovo indirizzo email qui sotto." -#: src/view/com/auth/create/Step2.tsx:188 -#~ msgid "Enter your phone number" -#~ msgstr "Inserisci il tuo numero di telefono" - #: src/view/com/auth/login/Login.tsx:99 msgid "Enter your username and password" msgstr "Inserisci il tuo nome di utente e la tua password" #: src/view/com/auth/create/Step3.tsx:67 msgid "Error receiving captcha response." -msgstr "" +msgstr "Errore nella risposta del captcha." #: src/view/screens/Search/Search.tsx:110 msgid "Error:" @@ -1633,11 +1434,11 @@ msgstr "Tutti" #: src/lib/moderation/useReportOptions.ts:66 msgid "Excessive mentions or replies" -msgstr "" +msgstr "Menzioni o risposte eccessive" #: src/view/com/modals/DeleteAccount.tsx:231 msgid "Exits account deletion process" -msgstr "" +msgstr "Uscita dall'eliminazione dell'account" #: src/view/com/modals/ChangeHandle.tsx:150 msgid "Exits handle change process" @@ -1645,7 +1446,7 @@ msgstr "Uscita dal processo di modifica" #: src/view/com/modals/crop-image/CropImage.web.tsx:135 msgid "Exits image cropping process" -msgstr "" +msgstr "Uscita dal processo di ritaglio dell'immagine" #: src/view/com/lightbox/Lightbox.web.tsx:130 msgid "Exits image view" @@ -1656,10 +1457,6 @@ msgstr "Uscita dalla visualizzazione dell'immagine" msgid "Exits inputting search query" msgstr "Uscita dall'inserzione della domanda di ricerca" -#: src/view/com/modals/Waitlist.tsx:138 -#~ msgid "Exits signing up for waitlist with {email}" -#~ msgstr "Uscita dall'iscrizione alla lista d'attesa con {email}" - #: src/view/com/lightbox/Lightbox.web.tsx:183 msgid "Expand alt text" msgstr "Ampliare il testo alternativo" @@ -1671,11 +1468,11 @@ msgstr "Espandi o comprimi l'intero post a cui stai rispondendo" #: src/lib/moderation/useGlobalLabelStrings.ts:47 msgid "Explicit or potentially disturbing media." -msgstr "" +msgstr "Media espliciti o potenzialmente inquietanti." #: src/lib/moderation/useGlobalLabelStrings.ts:35 msgid "Explicit sexual images." -msgstr "" +msgstr "Immagini sessuali esplicite." #: src/view/screens/Settings/index.tsx:777 msgid "Export my data" @@ -1695,8 +1492,7 @@ msgstr "Media esterni" msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." msgstr "I multimediali esterni possono consentire ai siti web di raccogliere informazioni su di te e sul tuo dispositivo. Nessuna informazione viene inviata o richiesta finché non si preme il pulsante \"Riproduci\"." -#: src/Navigation.tsx:275 -#: src/view/screens/PreferencesExternalEmbeds.tsx:52 +#: src/Navigation.tsx:275 src/view/screens/PreferencesExternalEmbeds.tsx:52 #: src/view/screens/Settings/index.tsx:677 msgid "External Media Preferences" msgstr "Preferenze multimediali esterni" @@ -1725,7 +1521,7 @@ msgstr "Non possiamo caricare i feed consigliati" #: src/view/com/lightbox/Lightbox.tsx:83 msgid "Failed to save image: {0}" -msgstr "" +msgstr "Non è possibile salvare l'immagine: {0}" #: src/Navigation.tsx:196 msgid "Feed" @@ -1739,22 +1535,14 @@ msgstr "Feed fatto da {0}" msgid "Feed offline" msgstr "Feed offline" -#: src/view/com/feeds/FeedPage.tsx:143 -#~ msgid "Feed Preferences" -#~ msgstr "Preferenze del feed" - -#: src/view/shell/desktop/RightNav.tsx:61 -#: src/view/shell/Drawer.tsx:314 +#: src/view/shell/desktop/RightNav.tsx:61 src/view/shell/Drawer.tsx:314 msgid "Feedback" msgstr "Commenti" -#: src/Navigation.tsx:464 -#: src/view/screens/Feeds.tsx:419 -#: src/view/screens/Feeds.tsx:524 -#: src/view/screens/Profile.tsx:192 +#: src/Navigation.tsx:464 src/view/screens/Feeds.tsx:419 +#: src/view/screens/Feeds.tsx:524 src/view/screens/Profile.tsx:192 #: src/view/shell/bottom-bar/BottomBar.tsx:183 -#: src/view/shell/desktop/LeftNav.tsx:346 -#: src/view/shell/Drawer.tsx:479 +#: src/view/shell/desktop/LeftNav.tsx:346 src/view/shell/Drawer.tsx:479 #: src/view/shell/Drawer.tsx:480 msgid "Feeds" msgstr "Feeds" @@ -1773,11 +1561,11 @@ msgstr "I feeds possono anche avere tematiche!" #: src/view/com/modals/ChangeHandle.tsx:482 msgid "File Contents" -msgstr "" +msgstr "Archivia i contenuti" #: src/lib/moderation/useLabelBehaviorDescription.ts:66 msgid "Filter from feeds" -msgstr "" +msgstr "Filtra dai feed" #: src/screens/Onboarding/StepFinished.tsx:151 msgid "Finalizing" @@ -1803,11 +1591,7 @@ msgstr "Trovare account simili…" #: src/view/screens/PreferencesFollowingFeed.tsx:111 msgid "Fine-tune the content you see on your Following feed." -msgstr "" - -#: src/view/screens/PreferencesHomeFeed.tsx:111 -#~ msgid "Fine-tune the content you see on your home screen." -#~ msgstr "Ottimizza il contenuto che vedi nella pagina d'inizio." +msgstr "Ottimizza il contenuto che vedi nel tuo Following feed." #: src/view/screens/PreferencesThreads.tsx:60 msgid "Fine-tune the discussion threads." @@ -1825,8 +1609,7 @@ msgstr "Flessibile" msgid "Flip horizontal" msgstr "Gira in orizzontale" -#: src/view/com/modals/EditImage.tsx:120 -#: src/view/com/modals/EditImage.tsx:287 +#: src/view/com/modals/EditImage.tsx:120 src/view/com/modals/EditImage.tsx:287 msgid "Flip vertically" msgstr "Gira in verticale" @@ -1852,7 +1635,7 @@ msgstr "Segui {0}" #: src/view/com/profile/ProfileMenu.tsx:242 #: src/view/com/profile/ProfileMenu.tsx:253 msgid "Follow Account" -msgstr "" +msgstr "Segui l'Account" #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:179 msgid "Follow All" @@ -1887,9 +1670,6 @@ msgstr "ti segue" msgid "Followers" msgstr "Followers" -#~ msgid "following" -#~ msgstr "following" - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:227 #: src/view/com/post-thread/PostThreadFollowBtn.tsx:139 #: src/view/com/profile/ProfileFollows.tsx:108 @@ -1903,15 +1683,14 @@ msgstr "Seguiti {0}" #: src/view/screens/Settings/index.tsx:553 msgid "Following feed preferences" -msgstr "" +msgstr "Preferenze del Following feed" -#: src/Navigation.tsx:262 -#: src/view/com/home/HomeHeaderLayout.web.tsx:50 +#: src/Navigation.tsx:262 src/view/com/home/HomeHeaderLayout.web.tsx:50 #: src/view/com/home/HomeHeaderLayoutMobile.tsx:84 #: src/view/screens/PreferencesFollowingFeed.tsx:104 #: src/view/screens/Settings/index.tsx:562 msgid "Following Feed Preferences" -msgstr "" +msgstr "Preferenze del Following Feed" #: src/screens/Profile/Header/Handle.tsx:24 msgid "Follows you" @@ -1941,19 +1720,17 @@ msgstr "Dimenticato" msgid "Forgot password" msgstr "Ho dimenticato il password" -#: src/view/com/auth/login/Login.tsx:127 -#: src/view/com/auth/login/Login.tsx:143 +#: src/view/com/auth/login/Login.tsx:127 src/view/com/auth/login/Login.tsx:143 msgid "Forgot Password" msgstr "Ho dimenticato il Password" #: src/lib/moderation/useReportOptions.ts:52 msgid "Frequently Posts Unwanted Content" -msgstr "" +msgstr "Pubblica spesso contenuti indesiderati" -#: src/screens/Hashtag.tsx:108 -#: src/screens/Hashtag.tsx:148 +#: src/screens/Hashtag.tsx:108 src/screens/Hashtag.tsx:148 msgid "From @{sanitizedAuthor}" -msgstr "" +msgstr "Di @{sanitizedAuthor}" #: src/view/com/posts/FeedItem.tsx:179 msgctxt "from-feed" @@ -1971,44 +1748,37 @@ msgstr "Inizia" #: src/lib/moderation/useReportOptions.ts:37 msgid "Glaring violations of law or terms of service" -msgstr "" +msgstr "Evidenti violazioni della legge o dei termini di servizio" #: src/components/moderation/ScreenHider.tsx:144 #: src/components/moderation/ScreenHider.tsx:153 -#: src/view/com/auth/LoggedOut.tsx:81 -#: src/view/com/auth/LoggedOut.tsx:82 -#: src/view/screens/NotFound.tsx:55 -#: src/view/screens/ProfileFeed.tsx:111 -#: src/view/screens/ProfileList.tsx:916 -#: src/view/shell/desktop/LeftNav.tsx:108 +#: src/view/com/auth/LoggedOut.tsx:81 src/view/com/auth/LoggedOut.tsx:82 +#: src/view/screens/NotFound.tsx:55 src/view/screens/ProfileFeed.tsx:111 +#: src/view/screens/ProfileList.tsx:916 src/view/shell/desktop/LeftNav.tsx:108 msgid "Go back" msgstr "Torna indietro" -#: src/screens/Profile/ErrorState.tsx:62 -#: src/screens/Profile/ErrorState.tsx:66 -#: src/view/screens/NotFound.tsx:54 -#: src/view/screens/ProfileFeed.tsx:116 +#: src/screens/Profile/ErrorState.tsx:62 src/screens/Profile/ErrorState.tsx:66 +#: src/view/screens/NotFound.tsx:54 src/view/screens/ProfileFeed.tsx:116 #: src/view/screens/ProfileList.tsx:921 msgid "Go Back" msgstr "Torna Indietro" #: src/components/ReportDialog/SelectReportOptionView.tsx:74 #: src/components/ReportDialog/SubmitView.tsx:104 -#: src/screens/Onboarding/Layout.tsx:104 -#: src/screens/Onboarding/Layout.tsx:193 +#: src/screens/Onboarding/Layout.tsx:104 src/screens/Onboarding/Layout.tsx:193 msgid "Go back to previous step" msgstr "Torna al passaggio precedente" #: src/view/screens/NotFound.tsx:55 msgid "Go home" -msgstr "" +msgstr "Torna Home" #: src/view/screens/NotFound.tsx:54 msgid "Go Home" -msgstr "" +msgstr "Torna Home" -#: src/view/screens/Search/Search.tsx:748 -#: src/view/shell/desktop/Search.tsx:263 +#: src/view/screens/Search/Search.tsx:748 src/view/shell/desktop/Search.tsx:263 msgid "Go to @{queryMaybeHandle}" msgstr "Vai a @{queryMaybeHandle}" @@ -2022,7 +1792,7 @@ msgstr "Seguente" #: src/lib/moderation/useGlobalLabelStrings.ts:46 msgid "Graphic Media" -msgstr "" +msgstr "Media grafici" #: src/view/com/modals/ChangeHandle.tsx:265 msgid "Handle" @@ -2030,26 +1800,21 @@ msgstr "Nome Utente" #: src/lib/moderation/useReportOptions.ts:32 msgid "Harassment, trolling, or intolerance" -msgstr "" +msgstr "Molestie, trolling o intolleranza" #: src/Navigation.tsx:282 msgid "Hashtag" -msgstr "" - -#: src/components/RichText.tsx:188 -#~ msgid "Hashtag: {tag}" -#~ msgstr "" +msgstr "Hashtag" #: src/components/RichText.tsx:190 msgid "Hashtag: #{tag}" -msgstr "" +msgstr "Hashtag: #{tag}" #: src/view/com/auth/create/CreateAccount.tsx:208 msgid "Having trouble?" msgstr "Ci sono problemi?" -#: src/view/shell/desktop/RightNav.tsx:90 -#: src/view/shell/Drawer.tsx:324 +#: src/view/shell/desktop/RightNav.tsx:90 src/view/shell/Drawer.tsx:324 msgid "Help" msgstr "Aiuto" @@ -2105,10 +1870,6 @@ msgstr "Vuoi nascondere questo post?" msgid "Hide user list" msgstr "Nascondi elenco utenti" -#: src/view/com/profile/ProfileHeader.tsx:487 -#~ msgid "Hides posts from {0} in your feed" -#~ msgstr "Nasconde i post di {0} nel tuo feed" - #: src/view/com/posts/FeedErrorMessage.tsx:111 msgid "Hmm, some kind of issue occurred when contacting the feed server. Please let the feed owner know about this issue." msgstr "Si è verificato un problema durante il contatto con il server del feed. Informa il proprietario del feed del problema." @@ -2131,29 +1892,21 @@ msgstr "Stiamo riscontrando problemi nel trovare questo feed. Potrebbe essere st #: src/screens/Moderation/index.tsx:61 msgid "Hmmmm, it seems we're having trouble loading this data. See below for more details. If this issue persists, please contact us." -msgstr "" +msgstr "Stiamo riscontrando problemi nel trovare questi dati. Guarda PI[U giù per trovare più dettagli. Se il problema continua mettiti in contatto." #: src/screens/Profile/ErrorState.tsx:31 msgid "Hmmmm, we couldn't load that moderation service." -msgstr "" +msgstr "Non siamo riusciti a caricare il servizio di moderazione." -#: src/Navigation.tsx:454 -#: src/view/shell/bottom-bar/BottomBar.tsx:139 -#: src/view/shell/desktop/LeftNav.tsx:310 -#: src/view/shell/Drawer.tsx:401 +#: src/Navigation.tsx:454 src/view/shell/bottom-bar/BottomBar.tsx:139 +#: src/view/shell/desktop/LeftNav.tsx:310 src/view/shell/Drawer.tsx:401 #: src/view/shell/Drawer.tsx:402 msgid "Home" msgstr "Home" -#: src/Navigation.tsx:NaN -#: src/view/screens/PreferencesHomeFeed.tsx:104 -#: src/view/screens/Settings/index.tsx:543 -#~ msgid "Home Feed Preferences" -#~ msgstr "Preferenze per i feed per la pagina d'inizio" - #: src/view/com/modals/ChangeHandle.tsx:421 msgid "Host:" -msgstr "" +msgstr "Hosting:" #: src/view/com/auth/create/Step1.tsx:75 #: src/view/com/auth/login/ForgotPasswordForm.tsx:120 @@ -2161,9 +1914,6 @@ msgstr "" msgid "Hosting provider" msgstr "Servizio di hosting" -#~ msgid "Hosting provider address" -#~ msgstr "Indirizzo del fornitore di hosting" - #: src/view/com/modals/InAppBrowserConsent.tsx:44 msgid "How should we open this link?" msgstr "Come dovremmo aprire questo link?" @@ -2190,15 +1940,15 @@ msgstr "Se niente è selezionato, adatto a tutte le età." #: src/view/com/auth/create/Policies.tsx:91 msgid "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." -msgstr "" +msgstr "Se non sei ancora maggiorenne secondo le leggi del tuo Paese, il tuo genitore o tutore legale deve leggere i Termini a tuo nome." #: src/view/screens/ProfileList.tsx:610 msgid "If you delete this list, you won't be able to recover it." -msgstr "" +msgstr "Se elimini questa lista, non potrai recuperarla." #: src/view/com/util/forms/PostDropdownBtn.tsx:316 msgid "If you remove this post, you won't be able to recover it." -msgstr "" +msgstr "Se rimuovi questo post, non potrai recuperarlo." #: src/view/com/modals/ChangePassword.tsx:148 msgid "If you want to change your password, we will send you a code to verify that this is your account." @@ -2206,7 +1956,7 @@ msgstr "Se vuoi modificare la password, ti invieremo un codice per verificare se #: src/lib/moderation/useReportOptions.ts:36 msgid "Illegal and Urgent" -msgstr "" +msgstr "Illegale e Urgente" #: src/view/com/util/images/Gallery.tsx:38 msgid "Image" @@ -2216,13 +1966,9 @@ msgstr "Immagine" msgid "Image alt text" msgstr "Testo alternativo dell'immagine" -#: src/view/com/util/UserAvatar.tsx:NaN -#~ msgid "Image options" -#~ msgstr "Opzioni per l'immagine" - #: src/lib/moderation/useReportOptions.ts:47 msgid "Impersonation or false claims about identity or affiliation" -msgstr "" +msgstr "Furto d'identità o false affermazioni sull'identità o sull'affiliazione" #: src/view/com/auth/login/SetNewPasswordForm.tsx:138 msgid "Input code sent to your email for password reset" @@ -2252,10 +1998,6 @@ msgstr "Inserisci la nuova password" msgid "Input password for account deletion" msgstr "Inserisci la password per la cancellazione dell'account" -#: src/view/com/auth/create/Step2.tsx:196 -#~ msgid "Input phone number for SMS verification" -#~ msgstr "Inserisci il numero di telefono per la verifica via SMS" - #: src/view/com/auth/login/LoginForm.tsx:233 msgid "Input the password tied to {identifier}" msgstr "Inserisci la password relazionata a {identifier}" @@ -2264,21 +2006,13 @@ msgstr "Inserisci la password relazionata a {identifier}" msgid "Input the username or email address you used at signup" msgstr "Inserisci il nome utente o l'indirizzo email che hai utilizzato al momento della registrazione" -#: src/view/com/auth/create/Step2.tsx:271 -#~ msgid "Input the verification code we have texted to you" -#~ msgstr "Inserisci il codice di verifica che ti abbiamo inviato tramite SMS" - -#: src/view/com/modals/Waitlist.tsx:90 -#~ msgid "Input your email to get on the Bluesky waitlist" -#~ msgstr "Inserisci la tua email per entrare nella lista d'attesa di Bluesky" - #: src/view/com/auth/login/LoginForm.tsx:232 msgid "Input your password" msgstr "Inserisci la tua password" #: src/view/com/modals/ChangeHandle.tsx:390 msgid "Input your preferred hosting provider" -msgstr "" +msgstr "Inserisci il tuo provider di hosting preferito" #: src/view/com/auth/create/Step2.tsx:80 msgid "Input your user handle" @@ -2292,9 +2026,6 @@ msgstr "Protocollo del post non valido o non supportato" msgid "Invalid username or password" msgstr "Nome dell'utente o password errato" -#~ msgid "Invite" -#~ msgstr "Invita" - #: src/view/com/modals/InviteCodes.tsx:93 msgid "Invite a Friend" msgstr "Invita un amico" @@ -2312,9 +2043,6 @@ msgstr "Codice invito non accettato. Controlla di averlo inserito correttamente msgid "Invite codes: {0} available" msgstr "Codici di invito: {0} disponibili" -#~ msgid "Invite codes: {invitesAvailable} available" -#~ msgstr "Codici di invito: {invitesAvailable} disponibili" - #: src/view/com/modals/InviteCodes.tsx:169 msgid "Invite codes: 1 available" msgstr "Codici di invito: 1 disponibile" @@ -2328,54 +2056,41 @@ msgstr "Mostra i post delle persone che segui." msgid "Jobs" msgstr "Lavori" -#: src/view/com/modals/Waitlist.tsx:67 -#~ msgid "Join the waitlist" -#~ msgstr "Iscriviti alla lista d'attesa" - -#: src/view/com/auth/create/Step1.tsx:174 -#: src/view/com/auth/create/Step1.tsx:178 -#~ msgid "Join the waitlist." -#~ msgstr "Iscriviti alla lista d'attesa." - -#: src/view/com/modals/Waitlist.tsx:128 -#~ msgid "Join Waitlist" -#~ msgstr "Iscriviti alla Lista d'Attesa" - #: src/screens/Onboarding/index.tsx:24 msgid "Journalism" msgstr "Giornalismo" #: src/components/moderation/LabelsOnMe.tsx:59 msgid "label has been placed on this {labelTarget}" -msgstr "" +msgstr "l'etichetta è stata inserita su questo {labelTarget}" #: src/components/moderation/ContentHider.tsx:144 msgid "Labeled by {0}." -msgstr "" +msgstr "Etichettato da {0}." #: src/components/moderation/ContentHider.tsx:142 msgid "Labeled by the author." -msgstr "" +msgstr "Etichettato dall'autore." #: src/view/screens/Profile.tsx:186 msgid "Labels" -msgstr "" +msgstr "Etichette" #: src/screens/Profile/Sections/Labels.tsx:143 msgid "Labels are annotations on users and content. They can be used to hide, warn, and categorize the network." -msgstr "" +msgstr "Le etichette sono annotazioni su utenti e contenuti. Possono essere utilizzate per nascondere, avvisare e classificare il network." #: src/components/moderation/LabelsOnMe.tsx:61 msgid "labels have been placed on this {labelTarget}" -msgstr "" +msgstr "le etichette sono state inserite su questo {labelTarget}" #: src/components/moderation/LabelsOnMeDialog.tsx:63 msgid "Labels on your account" -msgstr "" +msgstr "Etichette sul tuo account" #: src/components/moderation/LabelsOnMeDialog.tsx:65 msgid "Labels on your content" -msgstr "" +msgstr "Etichette sul tuo contenuto" #: src/view/com/composer/select-language/SelectLangBtn.tsx:104 msgid "Language selection" @@ -2385,8 +2100,7 @@ msgstr "Seleziona la lingua" msgid "Language settings" msgstr "Impostazione delle lingue" -#: src/Navigation.tsx:144 -#: src/view/screens/LanguageSettings.tsx:89 +#: src/Navigation.tsx:144 src/view/screens/LanguageSettings.tsx:89 msgid "Language Settings" msgstr "Impostazione delle Lingue" @@ -2398,10 +2112,6 @@ msgstr "Lingue" msgid "Last step!" msgstr "Ultimo passo!" -#: src/view/com/util/moderation/ContentHider.tsx:103 -#~ msgid "Learn more" -#~ msgstr "Ulteriori informazioni" - #: src/components/moderation/ScreenHider.tsx:129 msgid "Learn More" msgstr "Ulteriori Informazioni" @@ -2409,7 +2119,7 @@ msgstr "Ulteriori Informazioni" #: src/components/moderation/ContentHider.tsx:65 #: src/components/moderation/ContentHider.tsx:128 msgid "Learn more about the moderation applied to this content." -msgstr "" +msgstr "Scopri di più sulla moderazione applicata a questo contenuto." #: src/components/moderation/PostHider.tsx:85 #: src/components/moderation/ScreenHider.tsx:126 @@ -2422,7 +2132,7 @@ msgstr "Scopri cosa è pubblico su Bluesky." #: src/components/moderation/ContentHider.tsx:152 msgid "Learn more." -msgstr "" +msgstr "Saperne di più." #: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:82 msgid "Leave them all unchecked to see any language." @@ -2440,8 +2150,7 @@ msgstr "mancano." msgid "Legacy storage cleared, you need to restart the app now." msgstr "L'archivio legacy è stato cancellato, riattiva la app." -#: src/view/com/auth/login/Login.tsx:128 -#: src/view/com/auth/login/Login.tsx:144 +#: src/view/com/auth/login/Login.tsx:128 src/view/com/auth/login/Login.tsx:144 msgid "Let's get your password reset!" msgstr "Reimpostazione della password!" @@ -2449,10 +2158,6 @@ msgstr "Reimpostazione della password!" msgid "Let's go!" msgstr "Andiamo!" -#: src/view/com/util/UserAvatar.tsx:NaN -#~ msgid "Library" -#~ msgstr "Biblioteca" - #: src/view/screens/Settings/index.tsx:498 msgid "Light" msgstr "Chiaro" @@ -2466,8 +2171,7 @@ msgstr "Mi piace" msgid "Like this feed" msgstr "Metti mi piace a questo feed" -#: src/components/LikesDialog.tsx:87 -#: src/Navigation.tsx:201 +#: src/components/LikesDialog.tsx:87 src/Navigation.tsx:201 #: src/Navigation.tsx:206 msgid "Liked by" msgstr "Piace a" @@ -2484,7 +2188,7 @@ msgstr "Piace a {0} {1}" #: src/components/LabelingServiceCard/index.tsx:72 msgid "Liked by {count} {0}" -msgstr "" +msgstr "È piaciuto a {count} {0}" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:277 #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:291 @@ -2496,9 +2200,6 @@ msgstr "Piace a {likeCount} {0}" msgid "liked your custom feed" msgstr "piace il tuo feed personalizzato" -#~ msgid "liked your custom feed{0}" -#~ msgstr "piace il feed personalizzato{0}" - #: src/view/com/notifications/FeedItem.tsx:159 msgid "liked your post" msgstr "piace il tuo post" @@ -2547,28 +2248,18 @@ msgstr "Lista sbloccata" msgid "List unmuted" msgstr "Lista non mutata" -#: src/Navigation.tsx:114 -#: src/view/screens/Profile.tsx:187 -#: src/view/screens/Profile.tsx:193 -#: src/view/shell/desktop/LeftNav.tsx:383 -#: src/view/shell/Drawer.tsx:495 -#: src/view/shell/Drawer.tsx:496 +#: src/Navigation.tsx:114 src/view/screens/Profile.tsx:187 +#: src/view/screens/Profile.tsx:193 src/view/shell/desktop/LeftNav.tsx:383 +#: src/view/shell/Drawer.tsx:495 src/view/shell/Drawer.tsx:496 msgid "Lists" msgstr "Liste" -#: src/view/com/post-thread/PostThread.tsx:333 -#: src/view/com/post-thread/PostThread.tsx:341 -#~ msgid "Load more posts" -#~ msgstr "Carica più post" - #: src/view/screens/Notifications.tsx:159 msgid "Load new notifications" msgstr "Carica più notifiche" -#: src/screens/Profile/Sections/Feed.tsx:70 -#: src/view/com/feeds/FeedPage.tsx:124 -#: src/view/screens/ProfileFeed.tsx:495 -#: src/view/screens/ProfileList.tsx:695 +#: src/screens/Profile/Sections/Feed.tsx:70 src/view/com/feeds/FeedPage.tsx:124 +#: src/view/screens/ProfileFeed.tsx:495 src/view/screens/ProfileList.tsx:695 msgid "Load new posts" msgstr "Carica nuovi posts" @@ -2576,17 +2267,12 @@ msgstr "Carica nuovi posts" msgid "Loading..." msgstr "Caricamento..." -#~ msgid "Local dev server" -#~ msgstr "Server di sviluppo locale" - #: src/Navigation.tsx:221 msgid "Log" msgstr "Log" -#: src/screens/Deactivated.tsx:149 -#: src/screens/Deactivated.tsx:152 -#: src/screens/Deactivated.tsx:178 -#: src/screens/Deactivated.tsx:181 +#: src/screens/Deactivated.tsx:149 src/screens/Deactivated.tsx:152 +#: src/screens/Deactivated.tsx:178 src/screens/Deactivated.tsx:181 msgid "Log out" msgstr "Disconnetta l'account" @@ -2598,24 +2284,21 @@ msgstr "Visibilità degli utenti disconnessi" msgid "Login to account that is not listed" msgstr "Accedi all'account che non è nella lista" -#~ msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!" -#~ msgstr "Sembra che questo feed sia disponibile solo per gli utenti con un account Bluesky. Per favore registrati o accedi per visualizzare questo feed!" - #: src/view/com/modals/LinkWarning.tsx:65 msgid "Make sure this is where you intend to go!" msgstr "Assicurati che questo sia dove intendi andare!" #: src/components/dialogs/MutedWords.tsx:83 msgid "Manage your muted words and tags" -msgstr "" +msgstr "Gestisci le parole mute e i tags" #: src/view/com/auth/create/Step2.tsx:118 msgid "May not be longer than 253 characters" -msgstr "" +msgstr "Non può contenere più di 253 caratteri" #: src/view/com/auth/create/Step2.tsx:109 msgid "May only contain letters and numbers" -msgstr "" +msgstr "Può contenere solo lettere e numeri" #: src/view/screens/Profile.tsx:190 msgid "Media" @@ -2629,34 +2312,28 @@ msgstr "utenti menzionati" msgid "Mentioned users" msgstr "Utenti menzionati" -#: src/view/com/util/ViewHeader.tsx:87 -#: src/view/screens/Search/Search.tsx:647 +#: src/view/com/util/ViewHeader.tsx:87 src/view/screens/Search/Search.tsx:647 msgid "Menu" msgstr "Menù" -#~ msgid "Message from server" -#~ msgstr "Messaggio dal server" - #: src/view/com/posts/FeedErrorMessage.tsx:192 msgid "Message from server: {0}" msgstr "Messaggio dal server: {0}" #: src/lib/moderation/useReportOptions.ts:45 msgid "Misleading Account" -msgstr "" +msgstr "Account Ingannevole" -#: src/Navigation.tsx:119 -#: src/screens/Moderation/index.tsx:106 +#: src/Navigation.tsx:119 src/screens/Moderation/index.tsx:106 #: src/view/screens/Settings/index.tsx:645 -#: src/view/shell/desktop/LeftNav.tsx:401 -#: src/view/shell/Drawer.tsx:514 +#: src/view/shell/desktop/LeftNav.tsx:401 src/view/shell/Drawer.tsx:514 #: src/view/shell/Drawer.tsx:515 msgid "Moderation" msgstr "Moderazione" #: src/components/moderation/ModerationDetailsDialog.tsx:113 msgid "Moderation details" -msgstr "" +msgstr "Dettagli sulla moderazione" #: src/view/com/lists/ListCard.tsx:93 #: src/view/com/modals/UserAddRemoveLists.tsx:206 @@ -2685,8 +2362,7 @@ msgstr "Lista di moderazione aggiornata" msgid "Moderation lists" msgstr "Liste di moderazione" -#: src/Navigation.tsx:124 -#: src/view/screens/ModerationModlists.tsx:58 +#: src/Navigation.tsx:124 src/view/screens/ModerationModlists.tsx:58 msgid "Moderation Lists" msgstr "Liste di Moderazione" @@ -2696,11 +2372,11 @@ msgstr "Impostazioni di moderazione" #: src/Navigation.tsx:216 msgid "Moderation states" -msgstr "" +msgstr "Stati di moderazione" #: src/screens/Moderation/index.tsx:217 msgid "Moderation tools" -msgstr "" +msgstr "Strumenti di moderazione" #: src/components/moderation/ModerationDetailsDialog.tsx:49 #: src/lib/moderation/useModerationCauseDescription.ts:40 @@ -2709,7 +2385,7 @@ msgstr "Il moderatore ha scelto di mettere un avviso generale sul contenuto." #: src/view/com/post-thread/PostThreadItem.tsx:541 msgid "More" -msgstr "" +msgstr "Di più" #: src/view/shell/desktop/Feeds.tsx:65 msgid "More feeds" @@ -2719,53 +2395,44 @@ msgstr "Altri feed" msgid "More options" msgstr "Altre opzioni" -#: src/view/com/util/forms/PostDropdownBtn.tsx:315 -#~ msgid "More post options" -#~ msgstr "Altre impostazioni per il post" - #: src/view/screens/PreferencesThreads.tsx:82 msgid "Most-liked replies first" msgstr "Dai priorità alle risposte con più likes" #: src/view/com/auth/create/Step2.tsx:122 msgid "Must be at least 3 characters" -msgstr "" +msgstr "Deve contenere almeno 3 caratteri" #: src/components/TagMenu/index.tsx:249 msgid "Mute" -msgstr "" +msgstr "Silenzia" #: src/components/TagMenu/index.web.tsx:105 msgid "Mute {truncatedTag}" -msgstr "" +msgstr "Silenzia {truncatedTag}" #: src/view/com/profile/ProfileMenu.tsx:279 #: src/view/com/profile/ProfileMenu.tsx:286 msgid "Mute Account" -msgstr "Silenziare Account" +msgstr "Silenzia l'account" #: src/view/screens/ProfileList.tsx:518 msgid "Mute accounts" -msgstr "Silenziare accounts" +msgstr "Silenzia gli accounts" #: src/components/TagMenu/index.tsx:209 msgid "Mute all {displayTag} posts" -msgstr "" - -#: src/components/TagMenu/index.tsx:211 -#~ msgid "Mute all {tag} posts" -#~ msgstr "" +msgstr "Silenzia tutti i post {displayTag}" #: src/components/dialogs/MutedWords.tsx:149 msgid "Mute in tags only" -msgstr "" +msgstr "Silenzia solo i tags" #: src/components/dialogs/MutedWords.tsx:134 msgid "Mute in text & tags" -msgstr "" +msgstr "Silenzia nel testo & tags" -#: src/view/screens/ProfileList.tsx:461 -#: src/view/screens/ProfileList.tsx:624 +#: src/view/screens/ProfileList.tsx:461 src/view/screens/ProfileList.tsx:624 msgid "Mute list" msgstr "Silenziare la lista" @@ -2773,17 +2440,13 @@ msgstr "Silenziare la lista" msgid "Mute these accounts?" msgstr "Vuoi silenziare queste liste?" -#: src/view/screens/ProfileList.tsx:279 -#~ msgid "Mute this List" -#~ msgstr "Silenzia questa Lista" - #: src/components/dialogs/MutedWords.tsx:127 msgid "Mute this word in post text and tags" -msgstr "" +msgstr "Silenzia questa parola nel testo e nei tag del post" #: src/components/dialogs/MutedWords.tsx:142 msgid "Mute this word in tags only" -msgstr "" +msgstr "Siilenzia questa parola solo nei tags" #: src/view/com/util/forms/PostDropdownBtn.tsx:251 #: src/view/com/util/forms/PostDropdownBtn.tsx:257 @@ -2793,7 +2456,7 @@ msgstr "Silenzia questa discussione" #: src/view/com/util/forms/PostDropdownBtn.tsx:267 #: src/view/com/util/forms/PostDropdownBtn.tsx:269 msgid "Mute words & tags" -msgstr "" +msgstr "Silenzia parole & tags" #: src/view/com/lists/ListCard.tsx:102 msgid "Muted" @@ -2803,8 +2466,7 @@ msgstr "Silenziato" msgid "Muted accounts" msgstr "Account silenziato" -#: src/Navigation.tsx:129 -#: src/view/screens/ModerationMutedAccounts.tsx:107 +#: src/Navigation.tsx:129 src/view/screens/ModerationMutedAccounts.tsx:107 msgid "Muted Accounts" msgstr "Accounts Silenziati" @@ -2814,11 +2476,11 @@ msgstr "I post degli account silenziati verranno rimossi dal tuo feed e dalle tu #: src/lib/moderation/useModerationCauseDescription.ts:85 msgid "Muted by \"{0}\"" -msgstr "" +msgstr "Silenziato da \"{0}\"" #: src/screens/Moderation/index.tsx:233 msgid "Muted words & tags" -msgstr "" +msgstr "Parole e tags silenziati" #: src/view/screens/ProfileList.tsx:621 msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them." @@ -2839,16 +2501,12 @@ msgstr "Il mio Profilo" #: src/view/screens/Settings/index.tsx:596 msgid "My saved feeds" -msgstr "" +msgstr "I miei feed salvati" #: src/view/screens/Settings/index.tsx:602 msgid "My Saved Feeds" msgstr "I miei Feeds Salvati" -#: src/view/com/auth/server-input/index.tsx:118 -#~ msgid "my-server.com" -#~ msgstr "my-server.com" - #: src/view/com/modals/AddAppPasswords.tsx:179 #: src/view/com/modals/CreateOrEditList.tsx:290 msgid "Name" @@ -2862,7 +2520,7 @@ msgstr "Il nome è obbligatorio" #: src/lib/moderation/useReportOptions.ts:78 #: src/lib/moderation/useReportOptions.ts:86 msgid "Name or Description Violates Community Standards" -msgstr "" +msgstr "Il Nome o la Descrizione Viola gli Standard della Comunità" #: src/screens/Onboarding/index.tsx:25 msgid "Nature" @@ -2882,7 +2540,7 @@ msgstr "Vai al tuo profilo" #: src/components/ReportDialog/SelectReportOptionView.tsx:124 msgid "Need to report a copyright violation?" -msgstr "" +msgstr "Hai bisogno di segnalare una violazione del copyright?" #: src/view/com/modals/EmbedConsent.tsx:107 #: src/view/com/modals/EmbedConsent.tsx:123 @@ -2898,13 +2556,9 @@ msgstr "Non perdere mai l'accesso ai tuoi follower e ai tuoi dati." msgid "Never lose access to your followers or data." msgstr "Non perdere mai l'accesso ai tuoi follower o ai tuoi dati." -#: src/components/dialogs/MutedWords.tsx:293 -#~ msgid "Nevermind" -#~ msgstr "" - #: src/view/com/modals/ChangeHandle.tsx:520 msgid "Nevermind, create a handle for me" -msgstr "" +msgstr "Non importa, crea una handle per me" #: src/view/screens/Lists.tsx:76 msgctxt "action" @@ -2933,12 +2587,9 @@ msgctxt "action" msgid "New post" msgstr "Nuovo Post" -#: src/view/screens/Feeds.tsx:555 -#: src/view/screens/Notifications.tsx:168 -#: src/view/screens/Profile.tsx:450 -#: src/view/screens/ProfileFeed.tsx:433 -#: src/view/screens/ProfileList.tsx:199 -#: src/view/screens/ProfileList.tsx:227 +#: src/view/screens/Feeds.tsx:555 src/view/screens/Notifications.tsx:168 +#: src/view/screens/Profile.tsx:450 src/view/screens/ProfileFeed.tsx:433 +#: src/view/screens/ProfileList.tsx:199 src/view/screens/ProfileList.tsx:227 #: src/view/shell/desktop/LeftNav.tsx:252 msgid "New post" msgstr "Nuovo post" @@ -2948,9 +2599,6 @@ msgctxt "action" msgid "New Post" msgstr "Nuovo post" -#~ msgid "New Post" -#~ msgstr "Nuovo Post" - #: src/view/com/modals/CreateOrEditList.tsx:247 msgid "New User List" msgstr "Nuova lista" @@ -2993,14 +2641,13 @@ msgstr "Immagine seguente" msgid "No" msgstr "No" -#: src/view/screens/ProfileFeed.tsx:561 -#: src/view/screens/ProfileList.tsx:769 +#: src/view/screens/ProfileFeed.tsx:561 src/view/screens/ProfileList.tsx:769 msgid "No description" msgstr "Senza descrizione" #: src/view/com/modals/ChangeHandle.tsx:406 msgid "No DNS Panel" -msgstr "" +msgstr "Nessun pannello DNS" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:111 msgid "No longer following {0}" @@ -3017,7 +2664,7 @@ msgstr "Nessun risultato" #: src/components/Lists.tsx:189 msgid "No results found" -msgstr "" +msgstr "Non si è trovato nessun risultato" #: src/view/screens/Feeds.tsx:495 msgid "No results found for \"{query}\"" @@ -3037,21 +2684,19 @@ msgstr "No grazie" msgid "Nobody" msgstr "Nessuno" -#: src/components/LikedByList.tsx:102 -#: src/components/LikesDialog.tsx:99 +#: src/components/LikedByList.tsx:102 src/components/LikesDialog.tsx:99 msgid "Nobody has liked this yet. Maybe you should be the first!" -msgstr "" +msgstr "Nessuno ha fatto ancora un like. Fai il primo tu!" #: src/lib/moderation/useGlobalLabelStrings.ts:42 msgid "Non-sexual Nudity" -msgstr "" +msgstr "Nudità non sessuale" #: src/view/com/modals/SelfLabel.tsx:135 msgid "Not Applicable." msgstr "Non applicabile." -#: src/Navigation.tsx:109 -#: src/view/screens/Profile.tsx:97 +#: src/Navigation.tsx:109 src/view/screens/Profile.tsx:97 msgid "Not Found" msgstr "Non trovato" @@ -3063,18 +2708,16 @@ msgstr "Non adesso" #: src/view/com/profile/ProfileMenu.tsx:368 #: src/view/com/util/forms/PostDropdownBtn.tsx:342 msgid "Note about sharing" -msgstr "" +msgstr "Nota sulla condivisione" #: src/screens/Moderation/index.tsx:542 msgid "Note: Bluesky is an open and public network. This setting only limits the visibility of your content on the Bluesky app and website, and other apps may not respect this setting. Your content may still be shown to logged-out users by other apps and websites." msgstr "Nota: Bluesky è una rete aperta e pubblica. Questa impostazione limita solo la visibilità dei tuoi contenuti sull'app e sul sito Web di Bluesky e altre app potrebbero non rispettare questa impostazione. I tuoi contenuti potrebbero comunque essere mostrati agli utenti disconnessi da altre app e siti web." -#: src/Navigation.tsx:469 -#: src/view/screens/Notifications.tsx:124 +#: src/Navigation.tsx:469 src/view/screens/Notifications.tsx:124 #: src/view/screens/Notifications.tsx:148 #: src/view/shell/bottom-bar/BottomBar.tsx:207 -#: src/view/shell/desktop/LeftNav.tsx:365 -#: src/view/shell/Drawer.tsx:438 +#: src/view/shell/desktop/LeftNav.tsx:365 src/view/shell/Drawer.tsx:438 #: src/view/shell/Drawer.tsx:439 msgid "Notifications" msgstr "Notifiche" @@ -3085,11 +2728,11 @@ msgstr "Nudità" #: src/lib/moderation/useReportOptions.ts:71 msgid "Nudity or pornography not labeled as such" -msgstr "" +msgstr "Nudità o pornografia non etichettata come tale" #: src/lib/moderation/useLabelBehaviorDescription.ts:11 msgid "Off" -msgstr "" +msgstr "Spento" #: src/view/com/util/ErrorBoundary.tsx:49 msgid "Oh no!" @@ -3097,11 +2740,11 @@ msgstr "Oh no!" #: src/screens/Onboarding/StepInterests/index.tsx:128 msgid "Oh no! Something went wrong." -msgstr "Oh no! Qualcosa è andato storto." +msgstr "Oh no! Qualcosa è andato male." #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:127 msgid "OK" -msgstr "" +msgstr "OK" #: src/view/com/auth/login/PasswordUpdatedForm.tsx:41 msgid "Okay" @@ -3125,10 +2768,9 @@ msgstr "Solo {0} può rispondere." #: src/components/Lists.tsx:83 msgid "Oops, something went wrong!" -msgstr "" +msgstr "Ops! Qualcosa è andato male!" -#: src/components/Lists.tsx:157 -#: src/view/screens/AppPasswords.tsx:67 +#: src/components/Lists.tsx:157 src/view/screens/AppPasswords.tsx:67 #: src/view/screens/Profile.tsx:97 msgid "Oops!" msgstr "Ops!" @@ -3137,10 +2779,6 @@ msgstr "Ops!" msgid "Open" msgstr "Apri" -#: src/view/screens/Moderation.tsx:75 -#~ msgid "Open content filtering settings" -#~ msgstr "" - #: src/view/com/composer/Composer.tsx:490 #: src/view/com/composer/Composer.tsx:491 msgid "Open emoji picker" @@ -3148,7 +2786,7 @@ msgstr "Apri il selettore emoji" #: src/view/screens/ProfileFeed.tsx:299 msgid "Open feed options menu" -msgstr "" +msgstr "Apri il menu delle opzioni del feed" #: src/view/screens/Settings/index.tsx:734 msgid "Open links with in-app browser" @@ -3156,11 +2794,7 @@ msgstr "Apri i links con il navigatore della app" #: src/screens/Moderation/index.tsx:229 msgid "Open muted words and tags settings" -msgstr "" - -#: src/view/screens/Moderation.tsx:92 -#~ msgid "Open muted words settings" -#~ msgstr "" +msgstr "Apri le impostazioni delle parole e dei tag silenziati" #: src/view/com/home/HomeHeaderLayoutMobile.tsx:50 msgid "Open navigation" @@ -3168,7 +2802,7 @@ msgstr "Apri la navigazione" #: src/view/com/util/forms/PostDropdownBtn.tsx:183 msgid "Open post options menu" -msgstr "" +msgstr "Apri il menu delle opzioni del post" #: src/view/screens/Settings/index.tsx:828 #: src/view/screens/Settings/index.tsx:838 @@ -3177,7 +2811,7 @@ msgstr "Apri la pagina della cronologia" #: src/view/screens/Settings/index.tsx:816 msgid "Open system log" -msgstr "" +msgstr "Apri il registro di sistema" #: src/view/com/util/forms/DropdownButton.tsx:154 msgid "Opens {numItems} options" @@ -3207,10 +2841,6 @@ msgstr "Apre le impostazioni configurabili delle lingue" msgid "Opens device photo gallery" msgstr "Apre la galleria fotografica del dispositivo" -#: src/view/com/profile/ProfileHeader.tsx:420 -#~ msgid "Opens editor for profile display name, avatar, background image, and description" -#~ msgstr "Apre l'editor per il nome configurato del profilo, l'avatar, l'immagine di sfondo e la descrizione" - #: src/view/screens/Settings/index.tsx:669 msgid "Opens external embeds settings" msgstr "Apre le impostazioni esterne per gli incorporamenti" @@ -3218,23 +2848,12 @@ msgstr "Apre le impostazioni esterne per gli incorporamenti" #: src/view/com/auth/HomeLoggedOutCTA.tsx:56 #: src/view/com/auth/SplashScreen.tsx:70 msgid "Opens flow to create a new Bluesky account" -msgstr "" +msgstr "Apre il procedimento per creare un nuovo account Bluesky" #: src/view/com/auth/HomeLoggedOutCTA.tsx:74 #: src/view/com/auth/SplashScreen.tsx:83 msgid "Opens flow to sign into your existing Bluesky account" -msgstr "" - -#: src/view/com/profile/ProfileHeader.tsx:575 -#~ msgid "Opens followers list" -#~ msgstr "Apre la lista dei followers" - -#: src/view/com/profile/ProfileHeader.tsx:594 -#~ msgid "Opens following list" -#~ msgstr "Apre la lista di chi segui" - -#~ msgid "Opens invite code list" -#~ msgstr "Apre la lista dei codici di invito" +msgstr "Apre il procedimento per accedere al tuo account esistente di Bluesky" #: src/view/com/modals/InviteCodes.tsx:172 msgid "Opens list of invite codes" @@ -3242,27 +2861,23 @@ msgstr "Apre la lista dei codici di invito" #: src/view/screens/Settings/index.tsx:798 msgid "Opens modal for account deletion confirmation. Requires email code" -msgstr "" - -#: src/view/screens/Settings/index.tsx:774 -#~ msgid "Opens modal for account deletion confirmation. Requires email code." -#~ msgstr "Apre il modal per la conferma dell'eliminazione dell'account. Richiede un codice email." +msgstr "Apre la modale per la conferma dell'eliminazione dell'account. Richiede un codice e-mail" #: src/view/screens/Settings/index.tsx:756 msgid "Opens modal for changing your Bluesky password" -msgstr "" +msgstr "Apre la modale per modificare il tuo password di Bluesky" #: src/view/screens/Settings/index.tsx:718 msgid "Opens modal for choosing a new Bluesky handle" -msgstr "" +msgstr "Apre la modale per la scelta di un nuovo handle di Bluesky" #: src/view/screens/Settings/index.tsx:779 msgid "Opens modal for downloading your Bluesky account data (repository)" -msgstr "" +msgstr "Apre la modale per scaricare i dati del tuo account Bluesky (repository)" #: src/view/screens/Settings/index.tsx:970 msgid "Opens modal for email verification" -msgstr "" +msgstr "Apre la modale per la verifica dell'e-mail" #: src/view/com/modals/ChangeHandle.tsx:281 msgid "Opens modal for using custom domain" @@ -3276,8 +2891,7 @@ msgstr "Apre le impostazioni di moderazione" msgid "Opens password reset form" msgstr "Apre il modulo di reimpostazione della password" -#: src/view/com/home/HomeHeaderLayout.web.tsx:63 -#: src/view/screens/Feeds.tsx:356 +#: src/view/com/home/HomeHeaderLayout.web.tsx:63 src/view/screens/Feeds.tsx:356 msgid "Opens screen to edit Saved Feeds" msgstr "Apre la schermata per modificare i feed salvati" @@ -3287,23 +2901,15 @@ msgstr "Apre la schermata con tutti i feed salvati" #: src/view/screens/Settings/index.tsx:696 msgid "Opens the app password settings" -msgstr "" - -#: src/view/screens/Settings/index.tsx:676 -#~ msgid "Opens the app password settings page" -#~ msgstr "Apre la pagina delle impostazioni della password dell'app" +msgstr "Apre le impostazioni della password dell'app" #: src/view/screens/Settings/index.tsx:554 msgid "Opens the Following feed preferences" -msgstr "" - -#: src/view/screens/Settings/index.tsx:535 -#~ msgid "Opens the home feed preferences" -#~ msgstr "Apre le preferenze del home feed" +msgstr "Apre le preferenze del feed Following" #: src/view/com/modals/LinkWarning.tsx:76 msgid "Opens the linked website" -msgstr "" +msgstr "Apre il sito Web collegato" #: src/view/screens/Settings/index.tsx:829 #: src/view/screens/Settings/index.tsx:839 @@ -3324,7 +2930,7 @@ msgstr "Opzione {0} di {numItems}" #: src/components/ReportDialog/SubmitView.tsx:162 msgid "Optionally provide additional information below:" -msgstr "" +msgstr "Facoltativamente, fornisci ulteriori informazioni di seguito:" #: src/view/com/modals/Threadgate.tsx:89 msgid "Or combine these options:" @@ -3332,21 +2938,17 @@ msgstr "Oppure combina queste opzioni:" #: src/lib/moderation/useReportOptions.ts:25 msgid "Other" -msgstr "" +msgstr "Altri" #: src/view/com/auth/login/ChooseAccountForm.tsx:147 msgid "Other account" msgstr "Altro account" -#~ msgid "Other service" -#~ msgstr "Altro servizio" - #: src/view/com/composer/select-language/SelectLangBtn.tsx:91 msgid "Other..." msgstr "Altro..." -#: src/components/Lists.tsx:190 -#: src/view/screens/NotFound.tsx:45 +#: src/components/Lists.tsx:190 src/view/screens/NotFound.tsx:45 msgid "Page not found" msgstr "Pagina non trovata" @@ -3366,7 +2968,7 @@ msgstr "Password" #: src/view/com/modals/ChangePassword.tsx:142 msgid "Password Changed" -msgstr "" +msgstr "Password Cambiato" #: src/view/com/auth/login/Login.tsx:157 msgid "Password updated" @@ -3396,22 +2998,17 @@ msgstr "L'autorizzazione per accedere la cartella delle immagini è stata negata msgid "Pets" msgstr "Animali di compagnia" -#: src/view/com/auth/create/Step2.tsx:183 -#~ msgid "Phone number" -#~ msgstr "Numero di telefono" - #: src/view/com/modals/SelfLabel.tsx:121 msgid "Pictures meant for adults." msgstr "Immagini per adulti." -#: src/view/screens/ProfileFeed.tsx:291 -#: src/view/screens/ProfileList.tsx:563 +#: src/view/screens/ProfileFeed.tsx:291 src/view/screens/ProfileList.tsx:563 msgid "Pin to home" -msgstr "Fissa sulla home page" +msgstr "Fissa su Home" #: src/view/screens/ProfileFeed.tsx:294 msgid "Pin to Home" -msgstr "" +msgstr "Fissa su Home" #: src/view/screens/SavedFeeds.tsx:88 msgid "Pinned Feeds" @@ -3440,7 +3037,7 @@ msgstr "Scegli la tua password." #: src/view/com/auth/create/state.ts:131 msgid "Please complete the verification captcha." -msgstr "" +msgstr "Si prega di completare il captcha di verifica." #: src/view/com/modals/ChangeEmail.tsx:67 msgid "Please confirm your email before changing it. This is a temporary requirement while email-updating tools are added, and it will soon be removed." @@ -3450,25 +3047,13 @@ msgstr "Conferma la tua email prima di cambiarla. Si tratta di un requisito temp msgid "Please enter a name for your app password. All spaces is not allowed." msgstr "Inserisci un nome per la password dell'app. Tutti gli spazi non sono consentiti." -#: src/view/com/auth/create/Step2.tsx:206 -#~ msgid "Please enter a phone number that can receive SMS text messages." -#~ msgstr "Inserisci un numero di telefono in grado di ricevere messaggi di testo SMS." - #: src/view/com/modals/AddAppPasswords.tsx:145 msgid "Please enter a unique name for this App Password or use our randomly generated one." msgstr "Inserisci un nome unico per la password dell'app o utilizzane uno generato automaticamente." #: src/components/dialogs/MutedWords.tsx:68 msgid "Please enter a valid word, tag, or phrase to mute" -msgstr "" - -#: src/view/com/auth/create/state.ts:170 -#~ msgid "Please enter the code you received by SMS." -#~ msgstr "Inserisci il codice che hai ricevuto via SMS." - -#: src/view/com/auth/create/Step2.tsx:282 -#~ msgid "Please enter the verification code sent to {phoneNumberFormatted}." -#~ msgstr "Inserisci il codice di verifica inviato a {phoneNumberFormatted}." +msgstr "Inserisci una parola, un tag o una frase valida da silenziare" #: src/view/com/auth/create/state.ts:103 msgid "Please enter your email." @@ -3480,15 +3065,7 @@ msgstr "Inserisci anche la tua password:" #: src/components/moderation/LabelsOnMeDialog.tsx:222 msgid "Please explain why you think this label was incorrectly applied by {0}" -msgstr "" - -#: src/view/com/modals/AppealLabel.tsx:72 -#: src/view/com/modals/AppealLabel.tsx:75 -#~ msgid "Please tell us why you think this content warning was incorrectly applied!" -#~ msgstr "Spiegaci perché ritieni che questo avviso sui contenuti sia stato applicato in modo errato!" - -#~ msgid "Please tell us why you think this decision was incorrect." -#~ msgstr "Per favore spiegaci perché ritieni che questa decisione sia stata sbagliata." +msgstr "Spiega perché ritieni che questa etichetta sia stata applicata in modo errato da {0}" #: src/view/com/modals/VerifyEmail.tsx:101 msgid "Please Verify Your Email" @@ -3508,7 +3085,7 @@ msgstr "Porno" #: src/lib/moderation/useGlobalLabelStrings.ts:34 msgid "Pornography" -msgstr "" +msgstr "Pornografia" #: src/view/com/composer/Composer.tsx:366 #: src/view/com/composer/Composer.tsx:374 @@ -3521,16 +3098,11 @@ msgctxt "description" msgid "Post" msgstr "Post" -#~ msgid "Post" -#~ msgstr "Post" - #: src/view/com/post-thread/PostThreadItem.tsx:175 msgid "Post by {0}" msgstr "Pubblicato da {0}" -#: src/Navigation.tsx:176 -#: src/Navigation.tsx:183 -#: src/Navigation.tsx:190 +#: src/Navigation.tsx:176 src/Navigation.tsx:183 src/Navigation.tsx:190 msgid "Post by @{0}" msgstr "Pubblicato da @{0}" @@ -3545,12 +3117,12 @@ msgstr "Post nascosto" #: src/components/moderation/ModerationDetailsDialog.tsx:98 #: src/lib/moderation/useModerationCauseDescription.ts:99 msgid "Post Hidden by Muted Word" -msgstr "" +msgstr "Post nascosto dalla Parola Silenziata" #: src/components/moderation/ModerationDetailsDialog.tsx:101 #: src/lib/moderation/useModerationCauseDescription.ts:108 msgid "Post Hidden by You" -msgstr "" +msgstr "Post nascosto da te" #: src/view/com/composer/select-language/SelectLangBtn.tsx:87 msgid "Post language" @@ -3567,7 +3139,7 @@ msgstr "Post non trovato" #: src/components/TagMenu/index.tsx:253 msgid "posts" -msgstr "" +msgstr "post" #: src/view/screens/Profile.tsx:188 msgid "Posts" @@ -3575,7 +3147,7 @@ msgstr "Post" #: src/components/dialogs/MutedWords.tsx:90 msgid "Posts can be muted based on their text, their tags, or both." -msgstr "" +msgstr "I post possono essere silenziati ​​in base al testo, ai tag o entrambi." #: src/view/com/posts/FeedErrorMessage.tsx:64 msgid "Posts hidden" @@ -3587,7 +3159,7 @@ msgstr "Link potenzialmente fuorviante" #: src/components/Lists.tsx:88 msgid "Press to retry" -msgstr "" +msgstr "Premere per riprovare" #: src/view/com/lightbox/Lightbox.web.tsx:150 msgid "Previous image" @@ -3606,11 +3178,9 @@ msgstr "Dai priorità a quelli che segui" msgid "Privacy" msgstr "Privacy" -#: src/Navigation.tsx:231 -#: src/view/com/auth/create/Policies.tsx:69 +#: src/Navigation.tsx:231 src/view/com/auth/create/Policies.tsx:69 #: src/view/screens/PrivacyPolicy.tsx:29 -#: src/view/screens/Settings/index.tsx:925 -#: src/view/shell/Drawer.tsx:265 +#: src/view/screens/Settings/index.tsx:925 src/view/shell/Drawer.tsx:265 msgid "Privacy Policy" msgstr "Informativa sulla privacy" @@ -3618,16 +3188,13 @@ msgstr "Informativa sulla privacy" msgid "Processing..." msgstr "Elaborazione in corso…" -#: src/view/screens/DebugMod.tsx:888 -#: src/view/screens/Profile.tsx:340 +#: src/view/screens/DebugMod.tsx:888 src/view/screens/Profile.tsx:340 msgid "profile" -msgstr "" +msgstr "profilo" #: src/view/shell/bottom-bar/BottomBar.tsx:251 -#: src/view/shell/desktop/LeftNav.tsx:419 -#: src/view/shell/Drawer.tsx:70 -#: src/view/shell/Drawer.tsx:549 -#: src/view/shell/Drawer.tsx:550 +#: src/view/shell/desktop/LeftNav.tsx:419 src/view/shell/Drawer.tsx:70 +#: src/view/shell/Drawer.tsx:549 src/view/shell/Drawer.tsx:550 msgid "Profile" msgstr "Profilo" @@ -3673,9 +3240,6 @@ msgctxt "action" msgid "Quote Post" msgstr "Cita il post" -#~ msgid "Quote Post" -#~ msgstr "Cita il post" - #: src/view/screens/PreferencesThreads.tsx:86 msgid "Random (aka \"Poster's Roulette\")" msgstr "Selezione a caso (nota anche come \"Poster's Roulette\")" @@ -3686,7 +3250,7 @@ msgstr "Rapporti" #: src/view/screens/Search/Search.tsx:776 msgid "Recent Searches" -msgstr "" +msgstr "Ricerche recenti" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:116 msgid "Recommended Feeds" @@ -3705,21 +3269,17 @@ msgstr "Utenti consigliati" msgid "Remove" msgstr "Rimuovi" -#: src/view/com/feeds/FeedSourceCard.tsx:108 -#~ msgid "Remove {0} from my feeds?" -#~ msgstr "Rimuovere {0} dai miei feeds?" - #: src/view/com/util/AccountDropdownBtn.tsx:22 msgid "Remove account" msgstr "Rimuovi l'account" #: src/view/com/util/UserAvatar.tsx:358 msgid "Remove Avatar" -msgstr "" +msgstr "Rimuovere Avatar" #: src/view/com/util/UserBanner.tsx:148 msgid "Remove Banner" -msgstr "" +msgstr "Rimuovi il Banner" #: src/view/com/posts/FeedErrorMessage.tsx:160 msgid "Remove feed" @@ -3727,18 +3287,17 @@ msgstr "Rimuovi il feed" #: src/view/com/posts/FeedErrorMessage.tsx:201 msgid "Remove feed?" -msgstr "" +msgstr "Rimuovere il feed?" #: src/view/com/feeds/FeedSourceCard.tsx:173 #: src/view/com/feeds/FeedSourceCard.tsx:233 -#: src/view/screens/ProfileFeed.tsx:334 -#: src/view/screens/ProfileFeed.tsx:340 +#: src/view/screens/ProfileFeed.tsx:334 src/view/screens/ProfileFeed.tsx:340 msgid "Remove from my feeds" msgstr "Rimuovi dai miei feed" #: src/view/com/feeds/FeedSourceCard.tsx:278 msgid "Remove from my feeds?" -msgstr "" +msgstr "Rimuovere dai miei feed?" #: src/view/com/composer/photos/Gallery.tsx:167 msgid "Remove image" @@ -3750,23 +3309,15 @@ msgstr "Rimuovi l'anteprima dell'immagine" #: src/components/dialogs/MutedWords.tsx:330 msgid "Remove mute word from your list" -msgstr "" +msgstr "Rimuovi la parola silenziata dalla tua lista" #: src/view/com/modals/Repost.tsx:47 msgid "Remove repost" msgstr "Rimuovi la ripubblicazione" -#: src/view/com/feeds/FeedSourceCard.tsx:175 -#~ msgid "Remove this feed from my feeds?" -#~ msgstr "Rimuovere questo feed dai miei feeds?" - #: src/view/com/posts/FeedErrorMessage.tsx:202 msgid "Remove this feed from your saved feeds" -msgstr "" - -#: src/view/com/posts/FeedErrorMessage.tsx:132 -#~ msgid "Remove this feed from your saved feeds?" -#~ msgstr "Elimina questo feed dai feeds salvati?" +msgstr "Rimuovi questo feed dai feed salvati" #: src/view/com/modals/ListAddRemoveUsers.tsx:199 #: src/view/com/modals/UserAddRemoveLists.tsx:152 @@ -3779,7 +3330,7 @@ msgstr "Rimuovere dai miei feeds" #: src/view/screens/ProfileFeed.tsx:208 msgid "Removed from your feeds" -msgstr "" +msgstr "Rimosso dai tuoi feed" #: src/view/com/composer/ExternalEmbed.tsx:71 msgid "Removes default thumbnail from {0}" @@ -3802,23 +3353,17 @@ msgstr "Risposta" msgid "Reply Filters" msgstr "Filtri di risposta" -#: src/view/com/post/Post.tsx:166 -#: src/view/com/posts/FeedItem.tsx:280 +#: src/view/com/post/Post.tsx:166 src/view/com/posts/FeedItem.tsx:280 msgctxt "description" msgid "Reply to <0/>" msgstr "In risposta a <0/>" -#: src/view/com/modals/report/Modal.tsx:166 -#~ msgid "Report {collectionName}" -#~ msgstr "Segnala {collectionName}" - #: src/view/com/profile/ProfileMenu.tsx:319 #: src/view/com/profile/ProfileMenu.tsx:322 msgid "Report Account" -msgstr "Segnala il conto" +msgstr "Segnala l'account" -#: src/view/screens/ProfileFeed.tsx:351 -#: src/view/screens/ProfileFeed.tsx:353 +#: src/view/screens/ProfileFeed.tsx:351 src/view/screens/ProfileFeed.tsx:353 msgid "Report feed" msgstr "Segnala il feed" @@ -3833,26 +3378,25 @@ msgstr "Segnala il post" #: src/components/ReportDialog/SelectReportOptionView.tsx:43 msgid "Report this content" -msgstr "" +msgstr "Segnala questo contenuto" #: src/components/ReportDialog/SelectReportOptionView.tsx:56 msgid "Report this feed" -msgstr "" +msgstr "Segnala questo feed" #: src/components/ReportDialog/SelectReportOptionView.tsx:53 msgid "Report this list" -msgstr "" +msgstr "Segnala questa lista" #: src/components/ReportDialog/SelectReportOptionView.tsx:50 msgid "Report this post" -msgstr "" +msgstr "Segnala questo post" #: src/components/ReportDialog/SelectReportOptionView.tsx:47 msgid "Report this user" -msgstr "" +msgstr "Segnala questo utente" -#: src/view/com/modals/Repost.tsx:43 -#: src/view/com/modals/Repost.tsx:48 +#: src/view/com/modals/Repost.tsx:43 src/view/com/modals/Repost.tsx:48 #: src/view/com/modals/Repost.tsx:53 #: src/view/com/util/post-ctrls/RepostButton.tsx:61 msgctxt "action" @@ -3868,9 +3412,6 @@ msgstr "Ripubblicare" msgid "Repost or quote post" msgstr "Ripubblicare o citare il post" -#~ msgid "Reposted by" -#~ msgstr "Repost di" - #: src/view/screens/PostRepostedBy.tsx:27 msgid "Reposted By" msgstr "Repost di" @@ -3879,9 +3420,6 @@ msgstr "Repost di" msgid "Reposted by {0}" msgstr "Repost di {0}" -#~ msgid "Reposted by {0})" -#~ msgstr "Repost di {0})" - #: src/view/com/posts/FeedItem.tsx:214 msgid "Reposted by <0/>" msgstr "Repost di <0/>" @@ -3899,10 +3437,6 @@ msgstr "Repost di questo post" msgid "Request Change" msgstr "Richiedi un cambio" -#: src/view/com/auth/create/Step2.tsx:219 -#~ msgid "Request code" -#~ msgstr "Richiedi un codice" - #: src/view/com/modals/ChangePassword.tsx:241 #: src/view/com/modals/ChangePassword.tsx:243 msgid "Request Code" @@ -3926,10 +3460,6 @@ msgstr "Reimpostare il codice" msgid "Reset Code" msgstr "Reimposta il Codice" -#: src/view/screens/Settings/index.tsx:824 -#~ msgid "Reset onboarding" -#~ msgstr "Reimposta l'incorporazione" - #: src/view/screens/Settings/index.tsx:858 #: src/view/screens/Settings/index.tsx:861 msgid "Reset onboarding state" @@ -3939,10 +3469,6 @@ msgstr "Reimposta lo stato dell' incorporazione" msgid "Reset password" msgstr "Reimposta la password" -#: src/view/screens/Settings/index.tsx:814 -#~ msgid "Reset preferences" -#~ msgstr "Reimposta le preferenze" - #: src/view/screens/Settings/index.tsx:848 #: src/view/screens/Settings/index.tsx:851 msgid "Reset preferences state" @@ -3977,26 +3503,17 @@ msgstr "Ritenta l'ultima azione che ha generato un errore" msgid "Retry" msgstr "Riprova" -#: src/view/com/auth/create/Step2.tsx:247 -#~ msgid "Retry." -#~ msgstr "Riprova." - #: src/view/screens/ProfileList.tsx:917 msgid "Return to previous page" msgstr "Ritorna alla pagina precedente" #: src/view/screens/NotFound.tsx:59 msgid "Returns to home page" -msgstr "" +msgstr "Ritorna su Home" -#: src/view/screens/NotFound.tsx:58 -#: src/view/screens/ProfileFeed.tsx:112 +#: src/view/screens/NotFound.tsx:58 src/view/screens/ProfileFeed.tsx:112 msgid "Returns to previous page" -msgstr "" - -#: src/view/shell/desktop/RightNav.tsx:55 -#~ msgid "SANDBOX. Posts and accounts are not permanent." -#~ msgstr "SANDBOX. I post e gli account non sono permanenti." +msgstr "Ritorna alla pagina precedente" #: src/components/dialogs/BirthDateSettings.tsx:125 #: src/view/com/modals/ChangeHandle.tsx:173 @@ -4017,7 +3534,7 @@ msgstr "Salva il testo alternativo" #: src/components/dialogs/BirthDateSettings.tsx:119 msgid "Save birthday" -msgstr "" +msgstr "Salva il compleanno" #: src/view/com/modals/EditProfile.tsx:232 msgid "Save Changes" @@ -4031,10 +3548,9 @@ msgstr "Salva la modifica del tuo identificatore" msgid "Save image crop" msgstr "Salva il ritaglio dell'immagine" -#: src/view/screens/ProfileFeed.tsx:335 -#: src/view/screens/ProfileFeed.tsx:341 +#: src/view/screens/ProfileFeed.tsx:335 src/view/screens/ProfileFeed.tsx:341 msgid "Save to my feeds" -msgstr "" +msgstr "Salva nei miei feed" #: src/view/screens/SavedFeeds.tsx:122 msgid "Saved Feeds" @@ -4042,11 +3558,11 @@ msgstr "Canali salvati" #: src/view/com/lightbox/Lightbox.tsx:81 msgid "Saved to your camera roll." -msgstr "" +msgstr "Salvato nel rullino fotografico." #: src/view/screens/ProfileFeed.tsx:212 msgid "Saved to your feeds" -msgstr "" +msgstr "Salvato nei tuoi feed" #: src/view/com/modals/EditProfile.tsx:225 msgid "Saves any changes to your profile" @@ -4058,7 +3574,7 @@ msgstr "Salva la modifica del cambio dell'utente in {handle}" #: src/view/com/modals/crop-image/CropImage.web.tsx:145 msgid "Saves image crop settings" -msgstr "" +msgstr "Salva le impostazioni di ritaglio dell'immagine" #: src/screens/Onboarding/index.tsx:36 msgid "Science" @@ -4068,8 +3584,7 @@ msgstr "Scienza" msgid "Scroll to top" msgstr "Scorri verso l'alto" -#: src/Navigation.tsx:459 -#: src/view/com/auth/LoggedOut.tsx:122 +#: src/Navigation.tsx:459 src/view/com/auth/LoggedOut.tsx:122 #: src/view/com/modals/ListAddRemoveUsers.tsx:75 #: src/view/com/util/forms/SearchInput.tsx:67 #: src/view/com/util/forms/SearchInput.tsx:79 @@ -4077,37 +3592,25 @@ msgstr "Scorri verso l'alto" #: src/view/screens/Search/Search.tsx:669 #: src/view/screens/Search/Search.tsx:687 #: src/view/shell/bottom-bar/BottomBar.tsx:161 -#: src/view/shell/desktop/LeftNav.tsx:328 -#: src/view/shell/desktop/Search.tsx:215 -#: src/view/shell/desktop/Search.tsx:224 -#: src/view/shell/Drawer.tsx:365 +#: src/view/shell/desktop/LeftNav.tsx:328 src/view/shell/desktop/Search.tsx:215 +#: src/view/shell/desktop/Search.tsx:224 src/view/shell/Drawer.tsx:365 #: src/view/shell/Drawer.tsx:366 msgid "Search" msgstr "Cerca" -#: src/view/screens/Search/Search.tsx:736 -#: src/view/shell/desktop/Search.tsx:256 +#: src/view/screens/Search/Search.tsx:736 src/view/shell/desktop/Search.tsx:256 msgid "Search for \"{query}\"" msgstr "Cerca \"{query}\"" #: src/components/TagMenu/index.tsx:145 msgid "Search for all posts by @{authorHandle} with tag {displayTag}" -msgstr "" - -#: src/components/TagMenu/index.tsx:145 -#~ msgid "Search for all posts by @{authorHandle} with tag {tag}" -#~ msgstr "" +msgstr "Cerca tutti i post di @{authorHandle} con tag {displayTag}" #: src/components/TagMenu/index.tsx:94 msgid "Search for all posts with tag {displayTag}" -msgstr "" +msgstr "Cerca tutti i post con il tag {displayTag}" -#: src/components/TagMenu/index.tsx:90 -#~ msgid "Search for all posts with tag {tag}" -#~ msgstr "" - -#: src/view/com/auth/LoggedOut.tsx:104 -#: src/view/com/auth/LoggedOut.tsx:105 +#: src/view/com/auth/LoggedOut.tsx:104 src/view/com/auth/LoggedOut.tsx:105 #: src/view/com/modals/ListAddRemoveUsers.tsx:70 msgid "Search for users" msgstr "Cerca utenti" @@ -4118,27 +3621,19 @@ msgstr "Passaggio di sicurezza obbligatorio" #: src/components/TagMenu/index.web.tsx:66 msgid "See {truncatedTag} posts" -msgstr "" +msgstr "Vedi {truncatedTag} post" #: src/components/TagMenu/index.web.tsx:83 msgid "See {truncatedTag} posts by user" -msgstr "" +msgstr "Visualizza i post {truncatedTag} per utente" #: src/components/TagMenu/index.tsx:128 msgid "See <0>{displayTag} posts" -msgstr "" +msgstr "Vedi <0>{displayTag} posts" #: src/components/TagMenu/index.tsx:187 msgid "See <0>{displayTag} posts by this user" -msgstr "" - -#: src/components/TagMenu/index.tsx:128 -#~ msgid "See <0>{tag} posts" -#~ msgstr "" - -#: src/components/TagMenu/index.tsx:189 -#~ msgid "See <0>{tag} posts by this user" -#~ msgstr "" +msgstr "Vedi <0>{displayTag} posts di questo utente" #: src/view/screens/SavedFeeds.tsx:163 msgid "See this guide" @@ -4152,20 +3647,17 @@ msgstr "Scopri cosa c'è dopo" msgid "Select {item}" msgstr "Seleziona {item}" -#~ msgid "Select Bluesky Social" -#~ msgstr "Seleziona Bluesky Social" - #: src/view/com/auth/login/Login.tsx:117 msgid "Select from an existing account" msgstr "Seleziona da un account esistente" #: src/view/screens/LanguageSettings.tsx:299 msgid "Select languages" -msgstr "" +msgstr "Seleziona lingue" #: src/components/ReportDialog/SelectLabelerView.tsx:32 msgid "Select moderator" -msgstr "" +msgstr "Seleziona moderatore" #: src/view/com/util/Selector.tsx:107 msgid "Select option {i} of {numItems}" @@ -4182,7 +3674,7 @@ msgstr "Seleziona alcuni account da seguire qui giù" #: src/components/ReportDialog/SubmitView.tsx:135 msgid "Select the moderation service(s) to report to" -msgstr "" +msgstr "Seleziona il/i servizio/i di moderazione per fare la segnalazione" #: src/view/com/auth/server-input/index.tsx:82 msgid "Select the service that hosts your data." @@ -4200,22 +3692,14 @@ msgstr "Seleziona ciò che vuoi vedere (o non vedere) e noi gestiremo il resto." msgid "Select which languages you want your subscribed feeds to include. If none are selected, all languages will be shown." msgstr "Seleziona le lingue che desideri includere nei feed a cui sei iscritto. Se non ne viene selezionata nessuna, verranno visualizzate tutte le lingue." -#: src/view/screens/LanguageSettings.tsx:98 -#~ msgid "Select your app language for the default text to display in the app" -#~ msgstr "Seleziona la lingua dell'app per il testo predefinito da visualizzare nell'app" - #: src/view/screens/LanguageSettings.tsx:98 msgid "Select your app language for the default text to display in the app." -msgstr "" +msgstr "Seleziona la lingua dell'app per il testo predefinito da visualizzare nell'app." #: src/screens/Onboarding/StepInterests/index.tsx:196 msgid "Select your interests from the options below" msgstr "Seleziona i tuoi interessi dalle seguenti opzioni" -#: src/view/com/auth/create/Step2.tsx:155 -#~ msgid "Select your phone's country" -#~ msgstr "Seleziona il Paese del tuo cellulare" - #: src/view/screens/LanguageSettings.tsx:190 msgid "Select your preferred language for translations in your feed." msgstr "Seleziona la tua lingua preferita per le traduzioni nel tuo feed." @@ -4242,26 +3726,18 @@ msgctxt "action" msgid "Send Email" msgstr "Invia email" -#~ msgid "Send Email" -#~ msgstr "Envia Email" - -#: src/view/shell/Drawer.tsx:298 -#: src/view/shell/Drawer.tsx:319 +#: src/view/shell/Drawer.tsx:298 src/view/shell/Drawer.tsx:319 msgid "Send feedback" msgstr "Invia feedback" #: src/components/ReportDialog/SubmitView.tsx:214 #: src/components/ReportDialog/SubmitView.tsx:218 msgid "Send report" -msgstr "" - -#: src/view/com/modals/report/SendReportButton.tsx:45 -#~ msgid "Send Report" -#~ msgstr "Invia segnalazione" +msgstr "Invia la segnalazione" #: src/components/ReportDialog/SelectLabelerView.tsx:46 msgid "Send report to {0}" -msgstr "" +msgstr "Invia la segnalazione a {0}" #: src/view/com/modals/DeleteAccount.tsx:133 msgid "Sends email with confirmation code for account deletion" @@ -4271,39 +3747,9 @@ msgstr "Invia un'email con il codice di conferma per la cancellazione dell'accou msgid "Server address" msgstr "Indirizzo del server" -#: src/view/com/modals/ContentFilteringSettings.tsx:311 -#~ msgid "Set {value} for {labelGroup} content moderation policy" -#~ msgstr "Imposta {value} per la politica di moderazione dei contenuti di {labelGroup}" - -#: src/view/com/modals/ContentFilteringSettings.tsx:160 -#: src/view/com/modals/ContentFilteringSettings.tsx:179 -#~ msgctxt "action" -#~ msgid "Set Age" -#~ msgstr "Imposta l'età" - #: src/screens/Moderation/index.tsx:306 msgid "Set birthdate" -msgstr "" - -#: src/view/screens/Settings/index.tsx:488 -#~ msgid "Set color theme to dark" -#~ msgstr "Imposta il colore del tema scuro" - -#: src/view/screens/Settings/index.tsx:481 -#~ msgid "Set color theme to light" -#~ msgstr "Imposta il colore del tema su chiaro" - -#: src/view/screens/Settings/index.tsx:475 -#~ msgid "Set color theme to system setting" -#~ msgstr "Imposta il colore del tema basato sulle impostazioni del tuo sistema" - -#: src/view/screens/Settings/index.tsx:514 -#~ msgid "Set dark theme to the dark theme" -#~ msgstr "Imposta il tema scuro sul tema scuro" - -#: src/view/screens/Settings/index.tsx:507 -#~ msgid "Set dark theme to the dim theme" -#~ msgstr "Imposta il tema scuro sul tema scuro" +msgstr "Imposta la data di nascita" #: src/view/com/auth/login/SetNewPasswordForm.tsx:104 msgid "Set new password" @@ -4329,13 +3775,9 @@ msgstr "Seleziona \"No\" per nascondere tutte le ripubblicazioni dal tuo feed." msgid "Set this setting to \"Yes\" to show replies in a threaded view. This is an experimental feature." msgstr "Seleziona \"Sì\" per mostrare le risposte in una visualizzazione concatenata. Questa è una funzionalità sperimentale." -#: src/view/screens/PreferencesHomeFeed.tsx:261 -#~ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your following feed. This is an experimental feature." -#~ msgstr "Seleziona \"Sì\" per mostrare esempi dei feed salvati nel feed successivo. Questa è una funzionalità sperimentale." - #: src/view/screens/PreferencesFollowingFeed.tsx:261 msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your Following feed. This is an experimental feature." -msgstr "" +msgstr "Imposta questa impostazione su \"Sì\" per mostrare esempi dei tuoi feed salvati nel feed Seguiti. Questa è una funzionalità sperimentale." #: src/screens/Onboarding/Layout.tsx:50 msgid "Set up your account" @@ -4347,23 +3789,23 @@ msgstr "Imposta il tuo nome utente di Bluesky" #: src/view/screens/Settings/index.tsx:507 msgid "Sets color theme to dark" -msgstr "" +msgstr "Imposta il tema colore su scuro" #: src/view/screens/Settings/index.tsx:500 msgid "Sets color theme to light" -msgstr "" +msgstr "Imposta il tema colore su chiaro" #: src/view/screens/Settings/index.tsx:494 msgid "Sets color theme to system setting" -msgstr "" +msgstr "Imposta il tema colore basato impostazioni di sistema" #: src/view/screens/Settings/index.tsx:533 msgid "Sets dark theme to the dark theme" -msgstr "" +msgstr "Imposta il tema scuro sul tema scuro" #: src/view/screens/Settings/index.tsx:526 msgid "Sets dark theme to the dim theme" -msgstr "" +msgstr "Imposta il tema scuro sul tema semi fosco" #: src/view/com/auth/login/ForgotPasswordForm.tsx:157 msgid "Sets email for password reset" @@ -4375,25 +3817,23 @@ msgstr "Imposta il provider del hosting per la reimpostazione della password" #: src/view/com/modals/crop-image/CropImage.web.tsx:123 msgid "Sets image aspect ratio to square" -msgstr "" +msgstr "Imposta le proporzioni quadrate sull'immagine" #: src/view/com/modals/crop-image/CropImage.web.tsx:113 msgid "Sets image aspect ratio to tall" -msgstr "" +msgstr "Imposta l'altura sulle proporzioni dell'immagine" #: src/view/com/modals/crop-image/CropImage.web.tsx:103 msgid "Sets image aspect ratio to wide" -msgstr "" +msgstr "Imposta l'amplio sulle proporzioni dell'immagine" #: src/view/com/auth/create/Step1.tsx:97 #: src/view/com/auth/login/LoginForm.tsx:154 msgid "Sets server for the Bluesky client" msgstr "Imposta il server per il client Bluesky" -#: src/Navigation.tsx:139 -#: src/view/screens/Settings/index.tsx:313 -#: src/view/shell/desktop/LeftNav.tsx:437 -#: src/view/shell/Drawer.tsx:570 +#: src/Navigation.tsx:139 src/view/screens/Settings/index.tsx:313 +#: src/view/shell/desktop/LeftNav.tsx:437 src/view/shell/Drawer.tsx:570 #: src/view/shell/Drawer.tsx:571 msgid "Settings" msgstr "Impostazioni" @@ -4404,7 +3844,7 @@ msgstr "Attività sessuale o nudità erotica." #: src/lib/moderation/useGlobalLabelStrings.ts:38 msgid "Sexually Suggestive" -msgstr "" +msgstr "Sessualmente suggestivo" #: src/view/com/lightbox/Lightbox.tsx:141 msgctxt "action" @@ -4423,10 +3863,9 @@ msgstr "Condividi" #: src/view/com/profile/ProfileMenu.tsx:373 #: src/view/com/util/forms/PostDropdownBtn.tsx:347 msgid "Share anyway" -msgstr "" +msgstr "Condividi comunque" -#: src/view/screens/ProfileFeed.tsx:361 -#: src/view/screens/ProfileFeed.tsx:363 +#: src/view/screens/ProfileFeed.tsx:361 src/view/screens/ProfileFeed.tsx:363 msgid "Share feed" msgstr "Condividi il feed" @@ -4450,11 +3889,11 @@ msgstr "Mostra comunque" #: src/lib/moderation/useLabelBehaviorDescription.ts:27 #: src/lib/moderation/useLabelBehaviorDescription.ts:63 msgid "Show badge" -msgstr "" +msgstr "Mostra badge" #: src/lib/moderation/useLabelBehaviorDescription.ts:61 msgid "Show badge and filter from feeds" -msgstr "" +msgstr "Mostra badge e filtra dai feed" #: src/view/com/modals/EmbedConsent.tsx:87 msgid "Show embeds from {0}" @@ -4465,8 +3904,7 @@ msgid "Show follows similar to {0}" msgstr "Mostra follows simile a {0}" #: src/view/com/post-thread/PostThreadItem.tsx:507 -#: src/view/com/post/Post.tsx:201 -#: src/view/com/posts/FeedItem.tsx:355 +#: src/view/com/post/Post.tsx:201 src/view/com/posts/FeedItem.tsx:355 msgid "Show More" msgstr "Mostra di più" @@ -4529,31 +3967,25 @@ msgstr "Mostra utenti" #: src/lib/moderation/useLabelBehaviorDescription.ts:58 msgid "Show warning" -msgstr "" +msgstr "Mostra avviso" #: src/lib/moderation/useLabelBehaviorDescription.ts:56 msgid "Show warning and filter from feeds" -msgstr "" - -#: src/view/com/profile/ProfileHeader.tsx:462 -#~ msgid "Shows a list of users similar to this user." -#~ msgstr "Mostra un elenco di utenti simili a questo utente." +msgstr "Mostra avviso e filtra dai feed" #: src/view/com/post-thread/PostThreadFollowBtn.tsx:127 msgid "Shows posts from {0} in your feed" msgstr "Mostra i post di {0} nel tuo feed" #: src/view/com/auth/HomeLoggedOutCTA.tsx:72 -#: src/view/com/auth/login/Login.tsx:98 -#: src/view/com/auth/SplashScreen.tsx:81 +#: src/view/com/auth/login/Login.tsx:98 src/view/com/auth/SplashScreen.tsx:81 #: src/view/shell/bottom-bar/BottomBar.tsx:289 #: src/view/shell/bottom-bar/BottomBar.tsx:290 #: src/view/shell/bottom-bar/BottomBar.tsx:292 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:178 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:179 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:181 -#: src/view/shell/NavSignupCard.tsx:58 -#: src/view/shell/NavSignupCard.tsx:59 +#: src/view/shell/NavSignupCard.tsx:58 src/view/shell/NavSignupCard.tsx:59 #: src/view/shell/NavSignupCard.tsx:61 msgid "Sign in" msgstr "Accedi" @@ -4590,8 +4022,7 @@ msgstr "Disconnetta" #: src/view/shell/bottom-bar/BottomBarWeb.tsx:168 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:169 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:171 -#: src/view/shell/NavSignupCard.tsx:49 -#: src/view/shell/NavSignupCard.tsx:50 +#: src/view/shell/NavSignupCard.tsx:49 src/view/shell/NavSignupCard.tsx:50 #: src/view/shell/NavSignupCard.tsx:52 msgid "Sign up" msgstr "Iscrizione" @@ -4607,11 +4038,11 @@ msgstr "È richiesta l'autenticazione" #: src/view/screens/Settings/index.tsx:374 msgid "Signed in as" -msgstr "Registrato come" +msgstr "Registrato/a come" #: src/view/com/auth/login/ChooseAccountForm.tsx:112 msgid "Signed in as @{0}" -msgstr "Registrato come @{0}" +msgstr "Registrato/a come @{0}" #: src/view/com/modals/SwitchAccount.tsx:70 msgid "Signs {0} out of Bluesky" @@ -4627,30 +4058,15 @@ msgstr "Salta questo passo" msgid "Skip this flow" msgstr "Salta questa corrente" -#: src/view/com/auth/create/Step2.tsx:82 -#~ msgid "SMS verification" -#~ msgstr "Verifica tramite SMS" - #: src/screens/Onboarding/index.tsx:40 msgid "Software Dev" msgstr "Sviluppo Software" -#~ msgid "Something went wrong and we're not sure what." -#~ msgstr "Qualcosa è andato storto ma non siamo sicuri di cosa." - #: src/components/ReportDialog/index.tsx:52 #: src/screens/Moderation/index.tsx:116 #: src/screens/Profile/Sections/Labels.tsx:77 msgid "Something went wrong, please try again." -msgstr "" - -#: src/components/Lists.tsx:203 -#~ msgid "Something went wrong!" -#~ msgstr "" - -#: src/view/com/modals/Waitlist.tsx:51 -#~ msgid "Something went wrong. Check your email and try again." -#~ msgstr "Qualcosa è andato storto. Controlla la tua email e riprova." +msgstr "Qualcosa è andato male, prova di nuovo." #: src/App.native.tsx:71 msgid "Sorry! Your session expired. Please log in again." @@ -4666,15 +4082,15 @@ msgstr "Ordina le risposte allo stesso post per:" #: src/components/moderation/LabelsOnMeDialog.tsx:147 msgid "Source:" -msgstr "" +msgstr "Origine:" #: src/lib/moderation/useReportOptions.ts:65 msgid "Spam" -msgstr "" +msgstr "Spam" #: src/lib/moderation/useReportOptions.ts:53 msgid "Spam; excessive mentions or replies" -msgstr "" +msgstr "Spam; menzioni o risposte eccessive" #: src/screens/Onboarding/index.tsx:30 msgid "Sports" @@ -4684,9 +4100,6 @@ msgstr "Sports" msgid "Square" msgstr "Quadrato" -#~ msgid "Staging" -#~ msgstr "Allestimento" - #: src/view/screens/Settings/index.tsx:905 msgid "Status page" msgstr "Pagina di stato" @@ -4699,8 +4112,7 @@ msgstr "Passo {0} di {numSteps}" msgid "Storage cleared, you need to restart the app now." msgstr "Spazio di archiviazione eliminato. Riavvia l'app." -#: src/Navigation.tsx:211 -#: src/view/screens/Settings/index.tsx:831 +#: src/Navigation.tsx:211 src/view/screens/Settings/index.tsx:831 msgid "Storybook" msgstr "Cronologia" @@ -4715,11 +4127,11 @@ msgstr "Iscriviti" #: src/screens/Profile/Sections/Labels.tsx:181 msgid "Subscribe to @{0} to use these labels:" -msgstr "" +msgstr "Iscriviti a @{0} per utilizzare queste etichette:" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:222 msgid "Subscribe to Labeler" -msgstr "" +msgstr "Iscriviti a Labeler" #: src/screens/Onboarding/StepAlgoFeeds/FeedCard.tsx:173 #: src/screens/Onboarding/StepAlgoFeeds/FeedCard.tsx:308 @@ -4728,7 +4140,7 @@ msgstr "Iscriviti a {0} feed" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:185 msgid "Subscribe to this labeler" -msgstr "" +msgstr "Iscriviti a questo labeler" #: src/view/screens/ProfileList.tsx:586 msgid "Subscribe to this list" @@ -4746,15 +4158,11 @@ msgstr "Suggerito per te" msgid "Suggestive" msgstr "Suggestivo" -#: src/Navigation.tsx:226 -#: src/view/screens/Support.tsx:30 +#: src/Navigation.tsx:226 src/view/screens/Support.tsx:30 #: src/view/screens/Support.tsx:33 msgid "Support" msgstr "Supporto" -#~ msgid "Swipe up to see more" -#~ msgstr "Scorri verso l'alto per vedere di più" - #: src/view/com/modals/SwitchAccount.tsx:123 msgid "Switch Account" msgstr "Cambia account" @@ -4779,15 +4187,11 @@ msgstr "Registro di sistema" #: src/components/dialogs/MutedWords.tsx:324 msgid "tag" -msgstr "" +msgstr "tag" #: src/components/TagMenu/index.tsx:78 msgid "Tag menu: {displayTag}" -msgstr "" - -#: src/components/TagMenu/index.tsx:74 -#~ msgid "Tag menu: {tag}" -#~ msgstr "" +msgstr "Tag menu: {displayTag}" #: src/view/com/modals/crop-image/CropImage.web.tsx:112 msgid "Tall" @@ -4805,11 +4209,9 @@ msgstr "Tecnologia" msgid "Terms" msgstr "Termini" -#: src/Navigation.tsx:236 -#: src/view/com/auth/create/Policies.tsx:59 +#: src/Navigation.tsx:236 src/view/com/auth/create/Policies.tsx:59 #: src/view/screens/Settings/index.tsx:919 -#: src/view/screens/TermsOfService.tsx:29 -#: src/view/shell/Drawer.tsx:259 +#: src/view/screens/TermsOfService.tsx:29 src/view/shell/Drawer.tsx:259 msgid "Terms of Service" msgstr "Termini di servizio" @@ -4817,11 +4219,11 @@ msgstr "Termini di servizio" #: src/lib/moderation/useReportOptions.ts:79 #: src/lib/moderation/useReportOptions.ts:87 msgid "Terms used violate community standards" -msgstr "" +msgstr "I termini utilizzati violano gli standard della comunità" #: src/components/dialogs/MutedWords.tsx:324 msgid "text" -msgstr "" +msgstr "testo" #: src/components/moderation/LabelsOnMeDialog.tsx:220 msgid "Text input field" @@ -4829,15 +4231,15 @@ msgstr "Campo di testo" #: src/components/ReportDialog/SubmitView.tsx:78 msgid "Thank you. Your report has been sent." -msgstr "" +msgstr "Grazie. La tua segnalazione è stata inviata." #: src/view/com/modals/ChangeHandle.tsx:466 msgid "That contains the following:" -msgstr "" +msgstr "Che contiene il seguente:" #: src/view/com/auth/create/CreateAccount.tsx:94 msgid "That handle is already taken." -msgstr "" +msgstr "Questo handle è già stato preso." #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:274 #: src/view/com/profile/ProfileMenu.tsx:349 @@ -4846,7 +4248,7 @@ msgstr "L'account sarà in grado di interagire con te dopo lo sblocco." #: src/components/moderation/ModerationDetailsDialog.tsx:128 msgid "the author" -msgstr "" +msgstr "l'autore" #: src/view/screens/CommunityGuidelines.tsx:36 msgid "The Community Guidelines have been moved to <0/>" @@ -4858,11 +4260,11 @@ msgstr "La politica sul copyright è stata spostata a <0/>" #: src/components/moderation/LabelsOnMeDialog.tsx:49 msgid "The following labels were applied to your account." -msgstr "" +msgstr "Al tuo account sono state applicate le seguenti etichette." #: src/components/moderation/LabelsOnMeDialog.tsx:50 msgid "The following labels were applied to your content." -msgstr "" +msgstr "Ai tuoi contenuti sono state applicate le seguenti etichette." #: src/screens/Onboarding/Layout.tsx:60 msgid "The following steps will help customize your Bluesky experience." @@ -4881,9 +4283,6 @@ msgstr "La politica sulla privacy è stata spostata a <0/><0/>" msgid "The support form has been moved. If you need help, please <0/> or visit {HELP_DESK_URL} to get in touch with us." msgstr "Il modulo di supporto è stato spostato. Se hai bisogno di aiuto, <0/> o visita {HELP_DESK_URL} per metterti in contatto con noi." -#~ msgid "The support form has been moved. If you need help, please<0/> or visit {HELP_DESK_URL} to get in touch with us." -#~ msgstr "Il modulo di supporto è stato spostato. Se hai bisogno di aiuto, <0/> o visita {HELP_DESK_URL} per metterti in contatto con noi." - #: src/view/screens/TermsOfService.tsx:33 msgid "The Terms of Service have been moved to" msgstr "I Termini di Servizio sono stati spostati a" @@ -4905,10 +4304,8 @@ msgstr "Si è verificato un problema durante la rimozione di questo feed. Per fa msgid "There was an an issue updating your feeds, please check your internet connection and try again." msgstr "Si è verificato un problema durante la rimozione di questo feed. Per favore controlla la tua connessione Internet e prova di nuovo." -#: src/view/screens/ProfileFeed.tsx:244 -#: src/view/screens/ProfileList.tsx:275 -#: src/view/screens/SavedFeeds.tsx:209 -#: src/view/screens/SavedFeeds.tsx:231 +#: src/view/screens/ProfileFeed.tsx:244 src/view/screens/ProfileList.tsx:275 +#: src/view/screens/SavedFeeds.tsx:209 src/view/screens/SavedFeeds.tsx:231 #: src/view/screens/SavedFeeds.tsx:252 msgid "There was an issue contacting the server" msgstr "Si è verificato un problema durante il contatto con il server" @@ -4939,7 +4336,7 @@ msgstr "Si è verificato un problema durante il recupero delle tue liste. Tocca #: src/components/ReportDialog/SubmitView.tsx:83 msgid "There was an issue sending your report. Please check your internet connection." -msgstr "" +msgstr "Si è verificato un problema durante l'invio della segnalazione. Per favore controlla la tua connessione Internet." #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:65 msgid "There was an issue syncing your preferences with the server" @@ -4963,10 +4360,8 @@ msgstr "Si è verificato un problema durante il recupero delle password dell'app msgid "There was an issue! {0}" msgstr "Si è verificato un problema! {0}" -#: src/view/screens/ProfileList.tsx:288 -#: src/view/screens/ProfileList.tsx:302 -#: src/view/screens/ProfileList.tsx:316 -#: src/view/screens/ProfileList.tsx:330 +#: src/view/screens/ProfileList.tsx:288 src/view/screens/ProfileList.tsx:302 +#: src/view/screens/ProfileList.tsx:316 src/view/screens/ProfileList.tsx:330 msgid "There was an issue. Please check your internet connection and try again." msgstr "Si è verificato un problema. Per favore controlla la tua connessione Internet e prova di nuovo." @@ -4978,17 +4373,10 @@ msgstr "Si è verificato un problema imprevisto nell'applicazione. Per favore fa msgid "There's been a rush of new users to Bluesky! We'll activate your account as soon as we can." msgstr "C'è stata un'ondata di nuovi utenti su Bluesky! Attiveremo il tuo account il prima possibile." -#: src/view/com/auth/create/Step2.tsx:55 -#~ msgid "There's something wrong with this number. Please choose your country and enter your full phone number!" -#~ msgstr "C'è qualcosa di sbagliato in questo numero. Scegli il tuo Paese e inserisci il tuo numero di telefono completo!" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:138 msgid "These are popular accounts you might like:" msgstr "Questi sono gli account popolari che potrebbero piacerti:" -#~ msgid "This {0} has been labeled." -#~ msgstr "Questo {0} è stato etichettato." - #: src/components/moderation/ScreenHider.tsx:117 msgid "This {screenDescription} has been flagged:" msgstr "Questa {screenDescription} è stata segnalata:" @@ -4999,15 +4387,15 @@ msgstr "Questo account ha richiesto agli utenti di accedere Bluesky per visualiz #: src/components/moderation/LabelsOnMeDialog.tsx:205 msgid "This appeal will be sent to <0>{0}." -msgstr "" +msgstr "Questo ricorso verrà inviato a <0>{0}." #: src/lib/moderation/useGlobalLabelStrings.ts:19 msgid "This content has been hidden by the moderators." -msgstr "" +msgstr "Questo contenuto è stato nascosto dai moderatori." #: src/lib/moderation/useGlobalLabelStrings.ts:24 msgid "This content has received a general warning from moderators." -msgstr "" +msgstr "Questo contenuto ha ricevuto un avviso generale dai moderatori." #: src/view/com/modals/EmbedConsent.tsx:68 msgid "This content is hosted by {0}. Do you want to enable external media?" @@ -5022,21 +4410,16 @@ msgstr "Questo contenuto non è disponibile perché uno degli utenti coinvolti h msgid "This content is not viewable without a Bluesky account." msgstr "Questo contenuto non è visualizzabile senza un account Bluesky." -#: src/view/screens/Settings/ExportCarDialog.tsx:75 -#~ msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." -#~ msgstr "Questa funzionalità è in versione beta. Puoi leggere ulteriori informazioni sulle esportazioni dell' archivio in <0>questo post del blog." - #: src/view/screens/Settings/ExportCarDialog.tsx:75 msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." -msgstr "" +msgstr "Questa funzionalità è in versione beta. Puoi leggere ulteriori informazioni sulle esportazioni del repository in <0>questo post del blog." #: src/view/com/posts/FeedErrorMessage.tsx:114 msgid "This feed is currently receiving high traffic and is temporarily unavailable. Please try again later." msgstr "Questo canale al momento sta ricevendo molte visite ed è temporaneamente non disponibile. Riprova più tardi." #: src/screens/Profile/Sections/Feed.tsx:50 -#: src/view/screens/ProfileFeed.tsx:476 -#: src/view/screens/ProfileList.tsx:675 +#: src/view/screens/ProfileFeed.tsx:476 src/view/screens/ProfileList.tsx:675 msgid "This feed is empty!" msgstr "Questo feed è vuoto!" @@ -5052,16 +4435,13 @@ msgstr "Queste informazioni non vengono condivise con altri utenti." msgid "This is important in case you ever need to change your email or reset your password." msgstr "Questo è importante nel caso in cui avessi bisogno di modificare la tua email o reimpostare la password." -#~ msgid "This is the service that keeps you online." -#~ msgstr "Questo è il servizio che ti mantiene online." - #: src/components/moderation/ModerationDetailsDialog.tsx:125 msgid "This label was applied by {0}." -msgstr "" +msgstr "Questa etichetta è stata applicata da {0}." #: src/screens/Profile/Sections/Labels.tsx:168 msgid "This labeler hasn't declared what labels it publishes, and may not be active." -msgstr "" +msgstr "Questo etichettatore non ha dichiarato quali etichette pubblica e potrebbe non essere attivo." #: src/view/com/modals/LinkWarning.tsx:58 msgid "This link is taking you to the following website:" @@ -5073,7 +4453,7 @@ msgstr "La lista è vuota!" #: src/screens/Profile/ErrorState.tsx:40 msgid "This moderation service is unavailable. See below for more details. If this issue persists, contact us." -msgstr "" +msgstr "Questo servizio di moderazione non è disponibile. Vedi giù per ulteriori dettagli. Se il problema persiste, contattaci." #: src/view/com/modals/AddAppPasswords.tsx:106 msgid "This name is already in use" @@ -5085,27 +4465,27 @@ msgstr "Questo post è stato cancellato." #: src/view/com/util/forms/PostDropdownBtn.tsx:344 msgid "This post is only visible to logged-in users. It won't be visible to people who aren't logged in." -msgstr "" +msgstr "Questo post è visibile solo agli utenti registrati. Non sarà visibile alle persone che non hanno effettuato l'accesso." #: src/view/com/util/forms/PostDropdownBtn.tsx:326 msgid "This post will be hidden from feeds." -msgstr "" +msgstr "Questo post verrà nascosto dai feed." #: src/view/com/profile/ProfileMenu.tsx:370 msgid "This profile is only visible to logged-in users. It won't be visible to people who aren't logged in." -msgstr "" +msgstr "Questo profilo è visibile solo agli utenti registrati. Non sarà visibile alle persone che non hanno effettuato l'accesso." #: src/view/com/auth/create/Policies.tsx:46 msgid "This service has not provided terms of service or a privacy policy." -msgstr "" +msgstr "Questo servizio non ha fornito termini di servizio o un'informativa sulla privacy." #: src/view/com/modals/ChangeHandle.tsx:446 msgid "This should create a domain record at:" -msgstr "" +msgstr "Questo dovrebbe creare un record di dominio in:" #: src/view/com/profile/ProfileFollowers.tsx:95 msgid "This user doesn't have any followers." -msgstr "" +msgstr "Questo utente non ha follower." #: src/components/moderation/ModerationDetailsDialog.tsx:73 #: src/lib/moderation/useModerationCauseDescription.ts:68 @@ -5114,30 +4494,19 @@ msgstr "Questo utente ti ha bloccato. Non è possibile visualizzare il suo conte #: src/lib/moderation/useGlobalLabelStrings.ts:30 msgid "This user has requested that their content only be shown to signed-in users." -msgstr "" - -#: src/view/com/modals/ModerationDetails.tsx:42 -#~ msgid "This user is included in the <0/> list which you have blocked." -#~ msgstr "Questo utente è incluso nell'elenco <0/> che hai bloccato." - -#: src/view/com/modals/ModerationDetails.tsx:74 -#~ msgid "This user is included in the <0/> list which you have muted." -#~ msgstr "Questo utente è incluso nell'elenco <0/> che hai disattivato." +msgstr "Questo utente ha richiesto che i suoi contenuti vengano mostrati solo agli utenti che hanno effettuato l'accesso." #: src/components/moderation/ModerationDetailsDialog.tsx:56 msgid "This user is included in the <0>{0} list which you have blocked." -msgstr "" +msgstr "Questo utente è incluso nell'elenco <0>{0} che hai bloccato." #: src/components/moderation/ModerationDetailsDialog.tsx:85 msgid "This user is included in the <0>{0} list which you have muted." -msgstr "" - -#~ msgid "This user is included the <0/> list which you have muted." -#~ msgstr "Questo utente è incluso nella lista <0/> che hai silenziato." +msgstr "Questo utente è incluso nell'elenco <0>{0} che hai silenziato." #: src/view/com/profile/ProfileFollows.tsx:94 msgid "This user isn't following anyone." -msgstr "" +msgstr "Questo utente non sta seguendo nessuno." #: src/view/com/modals/SelfLabel.tsx:137 msgid "This warning is only available for posts with media attached." @@ -5145,20 +4514,16 @@ msgstr "Questo avviso è disponibile solo per i post con contenuti multimediali #: src/components/dialogs/MutedWords.tsx:284 msgid "This will delete {0} from your muted words. You can always add it back later." -msgstr "" - -#: src/view/com/util/forms/PostDropdownBtn.tsx:282 -#~ msgid "This will hide this post from your feeds." -#~ msgstr "Questo nasconderà il post dai tuoi feeds." +msgstr "Questo eliminerà {0} dalle parole disattivate. Puoi sempre aggiungerla nuovamente in seguito." #: src/view/screens/Settings/index.tsx:574 msgid "Thread preferences" -msgstr "" +msgstr "Preferenze delle discussioni" #: src/view/screens/PreferencesThreads.tsx:53 #: src/view/screens/Settings/index.tsx:584 msgid "Thread Preferences" -msgstr "Preferenze delle discussioni" +msgstr "Preferenze delle Discussioni" #: src/view/screens/PreferencesThreads.tsx:119 msgid "Threaded Mode" @@ -5170,11 +4535,11 @@ msgstr "Preferenze per le discussioni" #: src/components/ReportDialog/SelectLabelerView.tsx:35 msgid "To whom would you like to send this report?" -msgstr "" +msgstr "A chi desideri inviare questo report?" #: src/components/dialogs/MutedWords.tsx:113 msgid "Toggle between muted word options." -msgstr "" +msgstr "Alterna tra le opzioni delle parole silenziate." #: src/view/com/util/forms/DropdownButton.tsx:246 msgid "Toggle dropdown" @@ -5182,7 +4547,7 @@ msgstr "Attiva/disattiva il menu a discesa" #: src/screens/Moderation/index.tsx:334 msgid "Toggle to enable or disable adult content" -msgstr "" +msgstr "Seleziona per abilitare o disabilitare i contenuti per adulti" #: src/view/com/modals/EditImage.tsx:271 msgid "Transformations" @@ -5200,12 +4565,9 @@ msgctxt "action" msgid "Try again" msgstr "Riprova" -#~ msgid "Try again" -#~ msgstr "Provalo di nuovo" - #: src/view/com/modals/ChangeHandle.tsx:429 msgid "Type:" -msgstr "" +msgstr "Tipo:" #: src/view/screens/ProfileList.tsx:478 msgid "Un-block list" @@ -5238,15 +4600,14 @@ msgstr "Sblocca" #: src/view/com/profile/ProfileMenu.tsx:299 #: src/view/com/profile/ProfileMenu.tsx:305 msgid "Unblock Account" -msgstr "Sblocca il conto" +msgstr "Sblocca Account" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:272 #: src/view/com/profile/ProfileMenu.tsx:343 msgid "Unblock Account?" -msgstr "" +msgstr "Sblocca Account?" -#: src/view/com/modals/Repost.tsx:42 -#: src/view/com/modals/Repost.tsx:55 +#: src/view/com/modals/Repost.tsx:42 src/view/com/modals/Repost.tsx:55 #: src/view/com/util/post-ctrls/RepostButton.tsx:60 #: src/view/com/util/post-ctrls/RepostButton.web.tsx:48 msgid "Undo repost" @@ -5255,7 +4616,7 @@ msgstr "Annulla la ripubblicazione" #: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:141 #: src/view/com/profile/ProfileHeaderSuggestedFollows.tsx:246 msgid "Unfollow" -msgstr "" +msgstr "Smetti di seguire" #: src/view/com/profile/FollowButton.tsx:60 msgctxt "action" @@ -5269,7 +4630,7 @@ msgstr "Smetti di seguire {0}" #: src/view/com/profile/ProfileMenu.tsx:241 #: src/view/com/profile/ProfileMenu.tsx:251 msgid "Unfollow Account" -msgstr "" +msgstr "Smetti di seguire questo account" #: src/view/com/auth/create/state.ts:262 msgid "Unfortunately, you do not meet the requirements to create an account." @@ -5281,16 +4642,15 @@ msgstr "Togli Mi piace" #: src/view/screens/ProfileFeed.tsx:572 msgid "Unlike this feed" -msgstr "" +msgstr "Togli il like a questo feed" -#: src/components/TagMenu/index.tsx:249 -#: src/view/screens/ProfileList.tsx:579 +#: src/components/TagMenu/index.tsx:249 src/view/screens/ProfileList.tsx:579 msgid "Unmute" msgstr "Riattiva" #: src/components/TagMenu/index.web.tsx:104 msgid "Unmute {truncatedTag}" -msgstr "" +msgstr "Riattiva {truncatedTag}" #: src/view/com/profile/ProfileMenu.tsx:278 #: src/view/com/profile/ProfileMenu.tsx:284 @@ -5299,57 +4659,44 @@ msgstr "Riattiva questo account" #: src/components/TagMenu/index.tsx:208 msgid "Unmute all {displayTag} posts" -msgstr "" - -#: src/components/TagMenu/index.tsx:210 -#~ msgid "Unmute all {tag} posts" -#~ msgstr "" +msgstr "Riattiva tutti i post di {displayTag}" #: src/view/com/util/forms/PostDropdownBtn.tsx:251 #: src/view/com/util/forms/PostDropdownBtn.tsx:256 msgid "Unmute thread" msgstr "Riattiva questa discussione" -#: src/view/screens/ProfileFeed.tsx:294 -#: src/view/screens/ProfileList.tsx:563 +#: src/view/screens/ProfileFeed.tsx:294 src/view/screens/ProfileList.tsx:563 msgid "Unpin" msgstr "Stacca dal profilo" #: src/view/screens/ProfileFeed.tsx:291 msgid "Unpin from home" -msgstr "" +msgstr "Stacca dalla Home" #: src/view/screens/ProfileList.tsx:444 msgid "Unpin moderation list" msgstr "Stacca la lista di moderazione" -#: src/view/screens/ProfileFeed.tsx:346 -#~ msgid "Unsave" -#~ msgstr "Rimuovi" - #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:220 msgid "Unsubscribe" -msgstr "" +msgstr "Annulla l'iscrizione" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:184 msgid "Unsubscribe from this labeler" -msgstr "" +msgstr "Annulla l'iscrizione a questo/a labeler" #: src/lib/moderation/useReportOptions.ts:70 msgid "Unwanted Sexual Content" -msgstr "" +msgstr "Contenuti Sessuali Indesiderati" #: src/view/com/modals/UserAddRemoveLists.tsx:70 msgid "Update {displayName} in Lists" msgstr "Aggiorna {displayName} negli elenchi" -#: src/lib/hooks/useOTAUpdate.ts:15 -#~ msgid "Update Available" -#~ msgstr "Aggiornamento disponibile" - #: src/view/com/modals/ChangeHandle.tsx:509 msgid "Update to {handle}" -msgstr "" +msgstr "Aggiorna a {handle}" #: src/view/com/auth/login/SetNewPasswordForm.tsx:204 msgid "Updating..." @@ -5359,28 +4706,23 @@ msgstr "In aggiornamento..." msgid "Upload a text file to:" msgstr "Carica una file di testo a:" -#: src/view/com/util/UserAvatar.tsx:326 -#: src/view/com/util/UserAvatar.tsx:329 -#: src/view/com/util/UserBanner.tsx:116 -#: src/view/com/util/UserBanner.tsx:119 +#: src/view/com/util/UserAvatar.tsx:326 src/view/com/util/UserAvatar.tsx:329 +#: src/view/com/util/UserBanner.tsx:116 src/view/com/util/UserBanner.tsx:119 msgid "Upload from Camera" -msgstr "" +msgstr "Carica dalla fotocamera" -#: src/view/com/util/UserAvatar.tsx:343 -#: src/view/com/util/UserBanner.tsx:133 +#: src/view/com/util/UserAvatar.tsx:343 src/view/com/util/UserBanner.tsx:133 msgid "Upload from Files" -msgstr "" +msgstr "Carica dai Files" -#: src/view/com/util/UserAvatar.tsx:337 -#: src/view/com/util/UserAvatar.tsx:341 -#: src/view/com/util/UserBanner.tsx:127 -#: src/view/com/util/UserBanner.tsx:131 +#: src/view/com/util/UserAvatar.tsx:337 src/view/com/util/UserAvatar.tsx:341 +#: src/view/com/util/UserBanner.tsx:127 src/view/com/util/UserBanner.tsx:131 msgid "Upload from Library" -msgstr "" +msgstr "Carica dalla Libreria" #: src/view/com/modals/ChangeHandle.tsx:409 msgid "Use a file on your server" -msgstr "" +msgstr "Utilizza un file sul tuo server" #: src/view/screens/AppPasswords.tsx:197 msgid "Use app passwords to login to other Bluesky clients without giving full access to your account or password." @@ -5388,7 +4730,7 @@ msgstr "Utilizza le password dell'app per accedere ad altri client Bluesky senza #: src/view/com/modals/ChangeHandle.tsx:518 msgid "Use bsky.social as hosting provider" -msgstr "" +msgstr "Utilizza bsky.social come provider di hosting" #: src/view/com/modals/ChangeHandle.tsx:517 msgid "Use default provider" @@ -5406,15 +4748,12 @@ msgstr "Utilizza il mio browser predefinito" #: src/view/com/modals/ChangeHandle.tsx:401 msgid "Use the DNS panel" -msgstr "" +msgstr "Utilizza il pannello DNS" #: src/view/com/modals/AddAppPasswords.tsx:155 msgid "Use this to sign into the other app along with your handle." msgstr "Utilizza questo per accedere all'altra app insieme al tuo nome utente." -#~ msgid "Use your domain as your Bluesky client service provider" -#~ msgstr "Utilizza il tuo dominio come provider di servizi clienti Bluesky" - #: src/view/com/modals/InviteCodes.tsx:200 msgid "Used by:" msgstr "Usato da:" @@ -5426,7 +4765,7 @@ msgstr "Utente bloccato" #: src/lib/moderation/useModerationCauseDescription.ts:48 msgid "User Blocked by \"{0}\"" -msgstr "" +msgstr "Utente bloccato da \"{0}\"" #: src/components/moderation/ModerationDetailsDialog.tsx:54 msgid "User Blocked by List" @@ -5434,7 +4773,7 @@ msgstr "Utente bloccato dalla lista" #: src/lib/moderation/useModerationCauseDescription.ts:66 msgid "User Blocking You" -msgstr "" +msgstr "Questo Utente ti Blocca" #: src/components/moderation/ModerationDetailsDialog.tsx:71 msgid "User Blocks You" @@ -5490,19 +4829,15 @@ msgstr "Utenti in «{0}»" #: src/components/LikesDialog.tsx:85 msgid "Users that have liked this content or profile" -msgstr "" +msgstr "Utenti a cui è piaciuto questo contenuto o profilo" #: src/view/com/modals/ChangeHandle.tsx:437 msgid "Value:" -msgstr "" - -#: src/view/com/auth/create/Step2.tsx:243 -#~ msgid "Verification code" -#~ msgstr "Codice di verifica" +msgstr "Valore:" #: src/view/com/modals/ChangeHandle.tsx:510 msgid "Verify {0}" -msgstr "" +msgstr "Verifica {0}" #: src/view/screens/Settings/index.tsx:944 msgid "Verify email" @@ -5539,11 +4874,11 @@ msgstr "Vedi le informazioni del debug" #: src/components/ReportDialog/SelectReportOptionView.tsx:133 msgid "View details" -msgstr "" +msgstr "Vedere dettagli" #: src/components/ReportDialog/SelectReportOptionView.tsx:128 msgid "View details for reporting a copyright violation" -msgstr "" +msgstr "Visualizza i dettagli per segnalare una violazione del copyright" #: src/view/com/posts/FeedSlice.tsx:99 msgid "View full thread" @@ -5551,7 +4886,7 @@ msgstr "Vedi la discussione completa" #: src/components/moderation/LabelsOnMe.tsx:51 msgid "View information about these labels" -msgstr "" +msgstr "Visualizza le informazioni su queste etichette" #: src/view/com/posts/FeedErrorMessage.tsx:166 msgid "View profile" @@ -5563,11 +4898,11 @@ msgstr "Vedi l'avatar" #: src/components/LabelingServiceCard/index.tsx:140 msgid "View the labeling service provided by @{0}" -msgstr "" +msgstr "Visualizza il servizio di etichettatura fornito da @{0}" #: src/view/screens/ProfileFeed.tsx:584 msgid "View users who like this feed" -msgstr "" +msgstr "Visualizza gli utenti a cui piace questo feed" #: src/view/com/modals/LinkWarning.tsx:75 #: src/view/com/modals/LinkWarning.tsx:77 @@ -5583,11 +4918,11 @@ msgstr "Avvisa" #: src/lib/moderation/useLabelBehaviorDescription.ts:48 msgid "Warn content" -msgstr "" +msgstr "Avvisa il contenuto" #: src/lib/moderation/useLabelBehaviorDescription.ts:46 msgid "Warn content and filter from feeds" -msgstr "" +msgstr "Avvisa i contenuti e filtra dai feed" #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:134 msgid "We also think you'll like \"For You\" by Skygaze:" @@ -5595,7 +4930,7 @@ msgstr "Pensiamo che ti piacerà anche \"Per Te\" di Skygaze:" #: src/screens/Hashtag.tsx:132 msgid "We couldn't find any results for that hashtag." -msgstr "" +msgstr "Non siamo riusciti a trovare alcun risultato per quell'hashtag." #: src/screens/Deactivated.tsx:133 msgid "We estimate {estimatedTime} until your account is ready." @@ -5611,7 +4946,7 @@ msgstr "Abbiamo esaurito i posts dei tuoi follower. Ecco le ultime novità da <0 #: src/components/dialogs/MutedWords.tsx:204 msgid "We recommend avoiding common words that appear in many posts, since it can result in no posts being shown." -msgstr "" +msgstr "Ti consigliamo di evitare usare parole comuni che compaiono in molti post, perchè ciò potrebbe comportare la mancata visualizzazione dei post." #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:124 msgid "We recommend our \"Discover\" feed:" @@ -5619,11 +4954,11 @@ msgstr "Consigliamo il nostro feed \"Scopri\":" #: src/components/dialogs/BirthDateSettings.tsx:52 msgid "We were unable to load your birth date preferences. Please try again." -msgstr "" +msgstr "Non siamo riusciti a caricare le tue preferenze relative alla data di nascita. Per favore riprova." #: src/screens/Moderation/index.tsx:387 msgid "We were unable to load your configured labelers at this time." -msgstr "" +msgstr "Al momento non è stato possibile caricare le etichettatori configurati." #: src/screens/Onboarding/StepInterests/index.tsx:133 msgid "We weren't able to connect. Please try again to continue setting up your account. If it continues to fail, you can skip this flow." @@ -5633,10 +4968,6 @@ msgstr "Non siamo riusciti a connetterci. Riprova per continuare a configurare i msgid "We will let you know when your account is ready." msgstr "Ti faremo sapere quando il tuo account sarà pronto." -#: src/view/com/modals/AppealLabel.tsx:48 -#~ msgid "We'll look into your appeal promptly." -#~ msgstr "Esamineremo il tuo ricorso al più presto." - #: src/screens/Onboarding/StepInterests/index.tsx:138 msgid "We'll use this to help customize your experience." msgstr "Lo useremo per personalizzare la tua esperienza." @@ -5651,20 +4982,19 @@ msgstr "Siamo spiacenti, ma non siamo riusciti a risolvere questa lista. Se il p #: src/components/dialogs/MutedWords.tsx:230 msgid "We're sorry, but we weren't able to load your muted words at this time. Please try again." -msgstr "" +msgstr "Siamo spiacenti, ma al momento non siamo riusciti a caricare le parole silenziate. Per favore riprova si nuovo." #: src/view/screens/Search/Search.tsx:255 msgid "We're sorry, but your search could not be completed. Please try again in a few minutes." msgstr "Siamo spiacenti, ma non è stato possibile completare la ricerca. Riprova tra qualche minuto." -#: src/components/Lists.tsx:194 -#: src/view/screens/NotFound.tsx:48 +#: src/components/Lists.tsx:194 src/view/screens/NotFound.tsx:48 msgid "We're sorry! We can't find the page you were looking for." msgstr "Ci dispiace! Non riusciamo a trovare la pagina che stavi cercando." #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:319 msgid "We're sorry! You can only subscribe to ten labelers, and you've reached your limit of ten." -msgstr "" +msgstr "Ci dispiace! Puoi abbonarti solo a dieci etichettatori e hai raggiunto il limite di dieci." #: src/view/com/auth/onboarding/WelcomeMobile.tsx:48 msgid "Welcome to <0>Bluesky" @@ -5674,15 +5004,7 @@ msgstr "Ti diamo il benvenuto a <0>Bluesky" msgid "What are your interests?" msgstr "Quali sono i tuoi interessi?" -#: src/view/com/modals/report/Modal.tsx:169 -#~ msgid "What is the issue with this {collectionName}?" -#~ msgstr "Qual è il problema con questo {collectionName}?" - -#~ msgid "What's next?" -#~ msgstr "Qual è il prossimo?" - -#: src/view/com/auth/SplashScreen.tsx:59 -#: src/view/com/composer/Composer.tsx:295 +#: src/view/com/auth/SplashScreen.tsx:59 src/view/com/composer/Composer.tsx:295 msgid "What's up?" msgstr "Come va?" @@ -5701,23 +5023,23 @@ msgstr "Chi può rispondere" #: src/components/ReportDialog/SelectReportOptionView.tsx:44 msgid "Why should this content be reviewed?" -msgstr "" +msgstr "Perché questo contenuto dovrebbe essere revisionato?" #: src/components/ReportDialog/SelectReportOptionView.tsx:57 msgid "Why should this feed be reviewed?" -msgstr "" +msgstr "Perché questo feed dovrebbe essere revisionato?" #: src/components/ReportDialog/SelectReportOptionView.tsx:54 msgid "Why should this list be reviewed?" -msgstr "" +msgstr "Perché questa lista dovrebbe essere revisionata?" #: src/components/ReportDialog/SelectReportOptionView.tsx:51 msgid "Why should this post be reviewed?" -msgstr "" +msgstr "Perché questo post dovrebbe essere revisionato?" #: src/components/ReportDialog/SelectReportOptionView.tsx:48 msgid "Why should this user be reviewed?" -msgstr "" +msgstr "Perché questo utente dovrebbe essere revisionato?" #: src/view/com/modals/crop-image/CropImage.web.tsx:102 msgid "Wide" @@ -5727,8 +5049,7 @@ msgstr "Largo" msgid "Write post" msgstr "Scrivi un post" -#: src/view/com/composer/Composer.tsx:294 -#: src/view/com/composer/Prompt.tsx:37 +#: src/view/com/composer/Composer.tsx:294 src/view/com/composer/Prompt.tsx:37 msgid "Write your reply" msgstr "Scrivi la tua risposta" @@ -5736,10 +5057,6 @@ msgstr "Scrivi la tua risposta" msgid "Writers" msgstr "Scrittori" -#: src/view/com/auth/create/Step2.tsx:263 -#~ msgid "XXXXXX" -#~ msgstr "XXXXXX" - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:77 #: src/view/screens/PreferencesFollowingFeed.tsx:129 #: src/view/screens/PreferencesFollowingFeed.tsx:201 @@ -5756,16 +5073,13 @@ msgstr "Sei nella fila." #: src/view/com/profile/ProfileFollows.tsx:93 msgid "You are not following anyone." -msgstr "" +msgstr "Non stai seguendo nessuno." #: src/view/com/posts/FollowingEmptyState.tsx:67 #: src/view/com/posts/FollowingEndOfFeed.tsx:68 msgid "You can also discover new Custom Feeds to follow." msgstr "Puoi anche scoprire nuovi feed personalizzati da seguire." -#~ msgid "You can change hosting providers at any time." -#~ msgstr "Puoi cambiare provider di hosting in qualsiasi momento." - #: src/screens/Onboarding/StepFollowingFeed.tsx:142 msgid "You can change these settings later." msgstr "Potrai modificare queste impostazioni in seguito." @@ -5777,7 +5091,7 @@ msgstr "Adesso puoi accedere con la tua nuova password." #: src/view/com/profile/ProfileFollowers.tsx:94 msgid "You do not have any followers." -msgstr "" +msgstr "Non hai follower." #: src/view/com/modals/InviteCodes.tsx:66 msgid "You don't have any invite codes yet! We'll send you some when you've been on Bluesky for a little longer." @@ -5814,41 +5128,32 @@ msgstr "Hai inserito un codice non valido. Dovrebbe apparire come XXXX-XXXXXX." #: src/lib/moderation/useModerationCauseDescription.ts:109 msgid "You have hidden this post" -msgstr "" +msgstr "Hai nascosto questo post" #: src/components/moderation/ModerationDetailsDialog.tsx:102 msgid "You have hidden this post." -msgstr "" +msgstr "Hai silenziato questo post." #: src/components/moderation/ModerationDetailsDialog.tsx:95 #: src/lib/moderation/useModerationCauseDescription.ts:92 msgid "You have muted this account." -msgstr "" +msgstr "Hai silenziato questo account." #: src/lib/moderation/useModerationCauseDescription.ts:86 msgid "You have muted this user" -msgstr "" - -#: src/view/com/modals/ModerationDetails.tsx:87 -#~ msgid "You have muted this user." -#~ msgstr "Hai disattivato questo utente." +msgstr "Hai silenziato questo utente" #: src/view/com/feeds/ProfileFeedgens.tsx:136 msgid "You have no feeds." msgstr "Non hai feeds." -#: src/view/com/lists/MyLists.tsx:89 -#: src/view/com/lists/ProfileLists.tsx:140 +#: src/view/com/lists/MyLists.tsx:89 src/view/com/lists/ProfileLists.tsx:140 msgid "You have no lists." msgstr "Non hai liste." #: src/view/screens/ModerationBlockedAccounts.tsx:132 msgid "You have not blocked any accounts yet. To block an account, go to their profile and select \"Block account\" from the menu on their account." -msgstr "" - -#: src/view/screens/ModerationBlockedAccounts.tsx:132 -#~ msgid "You have not blocked any accounts yet. To block an account, go to their profile and selected \"Block account\" from the menu on their account." -#~ msgstr "Non hai ancora bloccato nessun conto. Per bloccare un conto, vai al profilo e seleziona \"Blocca conto\" dal menu del suo conto." +msgstr "Non hai ancora bloccato nessun account. Per bloccare un account, vai sul profilo e seleziona \"Blocca account\" dal menu dell'account." #: src/view/screens/AppPasswords.tsx:89 msgid "You have not created any app passwords yet. You can create one by pressing the button below." @@ -5856,23 +5161,15 @@ msgstr "Non hai ancora creato alcuna password per l'app. Puoi crearne uno premen #: src/view/screens/ModerationMutedAccounts.tsx:131 msgid "You have not muted any accounts yet. To mute an account, go to their profile and select \"Mute account\" from the menu on their account." -msgstr "" - -#: src/view/screens/ModerationMutedAccounts.tsx:131 -#~ msgid "You have not muted any accounts yet. To mute an account, go to their profile and selected \"Mute account\" from the menu on their account." -#~ msgstr "Non hai ancora disattivato alcun account. Per disattivare un account, vai al suo profilo e seleziona \"Disattiva account\" dal menu del account." +msgstr "Non hai ancora silenziato nessun account. Per silenziare un account, vai al suo profilo e seleziona \"Silenzia account\" dal menu dell' account." #: src/components/dialogs/MutedWords.tsx:250 msgid "You haven't muted any words or tags yet" -msgstr "" +msgstr "Non hai ancora silenziato nessuna parola o tag" #: src/components/moderation/LabelsOnMeDialog.tsx:69 msgid "You may appeal these labels if you feel they were placed in error." -msgstr "" - -#: src/view/com/modals/ContentFilteringSettings.tsx:175 -#~ msgid "You must be 18 or older to enable adult content." -#~ msgstr "Devi avere almeno 18 anni per abilitare i contenuti per adulti." +msgstr "Puoi presentare ricorso contro queste etichette se ritieni che siano state inserite per errore." #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:110 msgid "You must be 18 years or older to enable adult content" @@ -5880,7 +5177,7 @@ msgstr "Devi avere almeno 18 anni per abilitare i contenuti per adulti" #: src/components/ReportDialog/SubmitView.tsx:205 msgid "You must select at least one labeler for a report" -msgstr "" +msgstr "È necessario selezionare almeno un'etichettatore per un report" #: src/view/com/util/forms/PostDropdownBtn.tsx:144 msgid "You will no longer receive notifications for this thread" @@ -5898,8 +5195,7 @@ msgstr "Riceverai un'email con un \"codice di reset\". Inserisci il codice qui, msgid "You're in control" msgstr "Sei in controllo" -#: src/screens/Deactivated.tsx:87 -#: src/screens/Deactivated.tsx:88 +#: src/screens/Deactivated.tsx:87 src/screens/Deactivated.tsx:88 #: src/screens/Deactivated.tsx:103 msgid "You're in line" msgstr "Sei in fila" @@ -5911,7 +5207,7 @@ msgstr "Sei pronto per iniziare!" #: src/components/moderation/ModerationDetailsDialog.tsx:99 #: src/lib/moderation/useModerationCauseDescription.ts:101 msgid "You've chosen to hide a word or tag within this post." -msgstr "" +msgstr "Hai scelto di nascondere una parola o un tag in questo post." #: src/view/com/posts/FollowingEndOfFeed.tsx:48 msgid "You've reached the end of your feed! Find some more accounts to follow." @@ -5947,10 +5243,6 @@ msgstr "Il tuo feed predefinito è \"Following\"" msgid "Your email appears to be invalid." msgstr "Your email appears to be invalid." -#: src/view/com/modals/Waitlist.tsx:109 -#~ msgid "Your email has been saved! We'll be in touch soon." -#~ msgstr "La tua email è stata salvata! Ci metteremo in contatto al più presto." - #: src/view/com/modals/ChangeEmail.tsx:125 msgid "Your email has been updated but not verified. As a next step, please verify your new email." msgstr "La tua email è stata aggiornata ma non verificata. Come passo successivo, verifica la tua nuova email." @@ -5971,15 +5263,9 @@ msgstr "Il tuo nome di utente completo sarà" msgid "Your full handle will be <0>@{0}" msgstr "Il tuo nome di utente completo sarà <0>@{0}" -#~ msgid "Your hosting provider" -#~ msgstr "Il tuo fornitore di hosting" - -#~ msgid "Your invite codes are hidden when logged in using an App Password" -#~ msgstr "I tuoi codici di invito vengono celati quando accedi utilizzando una password per l'app" - #: src/components/dialogs/MutedWords.tsx:221 msgid "Your muted words" -msgstr "" +msgstr "Le tue parole silenziate" #: src/view/com/modals/ChangePassword.tsx:157 msgid "Your password has been changed successfully!" @@ -6007,3 +5293,447 @@ msgstr "La tua risposta è stata pubblicata" #: src/view/com/auth/create/Step2.tsx:65 msgid "Your user handle" msgstr "Il tuo handle utente" + +#~ msgid "{0, plural, one {# invite code available} other {# invite codes available}}" +#~ msgstr "{0, plural, one {# codice d'invito disponibile} other {# codici d'inviti disponibili}}" + +#~ msgid "{0}" +#~ msgstr "{0}" + +#~ msgid "{0} {purposeLabel} List" +#~ msgstr "Lista {purposeLabel} {0}" + +#~ msgid "{invitesAvailable, plural, one {Invite codes: # available} other {Invite codes: # available}}" +#~ msgstr "{invitesAvailable, plural, one {Codici d'invito: # available} other {Codici d'invito: # available}}" + +#~ msgid "{invitesAvailable} invite code available" +#~ msgstr "{invitesAvailable} codice d'invito disponibile" + +#~ msgid "{invitesAvailable} invite codes available" +#~ msgstr "{invitesAvailable} codici d'invito disponibili" + +#~ msgid "{message}" +#~ msgstr "{message}" + +#~ msgid "A content warning has been applied to this {0}." +#~ msgstr "A questo post è stato applicato un avviso di contenuto {0}." + +#~ msgid "A new version of the app is available. Please update to continue using the app." +#~ msgstr "È disponibile una nuova versione dell'app. Aggiorna per continuare a utilizzarla." + +#~ msgid "Add details" +#~ msgstr "Aggiungi i dettagli" + +#~ msgid "Add details to report" +#~ msgstr "Aggiungi dettagli da segnalare" + +#~ msgid "Adult content can only be enabled via the Web at <0/>." +#~ msgstr "I contenuti per adulti possono essere abilitati solo dal sito Web a <0/>." + +#~ msgid "App passwords" +#~ msgstr "Passwords dell'app" + +#~ msgid "Appeal content warning" +#~ msgstr "Ricorso contro l'avviso sui contenuti" + +#~ msgid "Appeal Content Warning" +#~ msgstr "Ricorso contro l'Avviso sui Contenuti" + +#~ msgid "Appeal Decision" +#~ msgstr "Decisión de apelación" + +#~ msgid "Appeal this decision" +#~ msgstr "Appella contro questa decisione" + +#~ msgid "Appeal this decision." +#~ msgstr "Appella contro questa decisione." + +#~ msgid "Are you sure? This cannot be undone." +#~ msgstr "Vuoi proseguire? Questa operazione non può essere annullata." + +#~ msgctxt "action" +#~ msgid "Back" +#~ msgstr "Indietro" + +#~ msgid "Block this List" +#~ msgstr "Blocca questa Lista" + +#~ msgid "Bluesky uses invites to build a healthier community. If you don't know anybody with an invite, you can sign up for the waitlist and we'll send one soon." +#~ msgstr "Bluesky utilizza gli inviti per costruire una comunità più sana. Se non conosci nessuno con un invito, puoi iscriverti alla lista d'attesa e te ne invieremo uno al più presto." + +#~ msgid "Bluesky.Social" +#~ msgstr "Bluesky.Social" + +#~ msgid "Button disabled. Input custom domain to proceed." +#~ msgstr "Pulsante disabilitato. Inserisci il dominio personalizzato per procedere." + +#~ msgid "Cancel add image alt text" +#~ msgstr "Cancel·la afegir text a la imatge" + +#~ msgid "Cancel waitlist signup" +#~ msgstr "Annulla l'iscrizione alla lista d'attesa" + +#~ msgid "Change your Bluesky password" +#~ msgstr "Cambia la tua password di Bluesky" + +#~ msgid "Choose a new Bluesky username or create" +#~ msgstr "Scegli un nuovo nome utente Bluesky o creane uno" + +#~ msgctxt "action" +#~ msgid "Confirm" +#~ msgstr "Conferma" + +#~ msgid "Confirm your age to enable adult content." +#~ msgstr "Conferma la tua età per abilitare i contenuti per adulti." + +#~ msgid "Confirms signing up {email} to the waitlist" +#~ msgstr "Conferma l'iscrizione di {email} alla lista d'attesa" + +#~ msgid "Content filtering" +#~ msgstr "Filtro dei contenuti" + +#~ msgid "Content Filtering" +#~ msgstr "Filtro dei Contenuti" + +#~ msgid "Copy link to profile" +#~ msgstr "Copia il link al profilo" + +#~ msgid "Country" +#~ msgstr "Paese" + +#~ msgid "Created by <0/>" +#~ msgstr "Creato da <0/>" + +#~ msgid "Created by you" +#~ msgstr "Creato da te" + +#~ msgid "Danger Zone" +#~ msgstr "Zona di Pericolo" + +#~ msgid "Delete my account…" +#~ msgstr "Cancella il mio account…" + +#~ msgid "Dev Server" +#~ msgstr "Server di sviluppo" + +#~ msgid "Developer Tools" +#~ msgstr "Strumenti per sviluppatori" + +#~ msgid "Discard draft" +#~ msgstr "Scarta la bozza" + +#~ msgid "Discover new feeds" +#~ msgstr "Scopri nuovi feeds" + +#~ msgid "Don't have an invite code?" +#~ msgstr "Non hai un codice di invito?" + +#~ msgid "Download Bluesky account data (repository)" +#~ msgstr "Scarica i dati dell'account Bluesky (archivio)" + +#~ msgid "Enter the address of your provider:" +#~ msgstr "Inserisci l'indirizzo del tuo provider:" + +#~ msgid "Enter your email" +#~ msgstr "Inserisci la tua email" + +#~ msgid "Enter your phone number" +#~ msgstr "Inserisci il tuo numero di telefono" + +#~ msgid "Exits signing up for waitlist with {email}" +#~ msgstr "Uscita dall'iscrizione alla lista d'attesa con {email}" + +#~ msgid "Feed Preferences" +#~ msgstr "Preferenze del feed" + +#~ msgid "Fine-tune the content you see on your home screen." +#~ msgstr "Ottimizza il contenuto che vedi nella pagina d'inizio." + +#~ msgid "following" +#~ msgstr "following" + +#~ msgid "Hides posts from {0} in your feed" +#~ msgstr "Nasconde i post di {0} nel tuo feed" + +#~ msgid "Home Feed Preferences" +#~ msgstr "Preferenze per i feed per la pagina d'inizio" + +#~ msgid "Hosting provider address" +#~ msgstr "Indirizzo del fornitore di hosting" + +#~ msgid "Image options" +#~ msgstr "Opzioni per l'immagine" + +#~ msgid "Input phone number for SMS verification" +#~ msgstr "Inserisci il numero di telefono per la verifica via SMS" + +#~ msgid "Input the verification code we have texted to you" +#~ msgstr "Inserisci il codice di verifica che ti abbiamo inviato tramite SMS" + +#~ msgid "Input your email to get on the Bluesky waitlist" +#~ msgstr "Inserisci la tua email per entrare nella lista d'attesa di Bluesky" + +#~ msgid "Invite" +#~ msgstr "Invita" + +#~ msgid "Invite codes: {invitesAvailable} available" +#~ msgstr "Codici di invito: {invitesAvailable} disponibili" + +#~ msgid "Join the waitlist" +#~ msgstr "Iscriviti alla lista d'attesa" + +#~ msgid "Join the waitlist." +#~ msgstr "Iscriviti alla lista d'attesa." + +#~ msgid "Join Waitlist" +#~ msgstr "Iscriviti alla Lista d'Attesa" + +#~ msgid "Learn more" +#~ msgstr "Ulteriori informazioni" + +#~ msgid "Library" +#~ msgstr "Biblioteca" + +#~ msgid "liked your custom feed{0}" +#~ msgstr "piace il feed personalizzato{0}" + +#~ msgid "Load more posts" +#~ msgstr "Carica più post" + +#~ msgid "Local dev server" +#~ msgstr "Server di sviluppo locale" + +#~ msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!" +#~ msgstr "Sembra che questo feed sia disponibile solo per gli utenti con un account Bluesky. Per favore registrati o accedi per visualizzare questo feed!" + +#~ msgid "Message from server" +#~ msgstr "Messaggio dal server" + +#~ msgid "More post options" +#~ msgstr "Altre impostazioni per il post" + +#~ msgid "Mute this List" +#~ msgstr "Silenzia questa Lista" + +#~ msgid "my-server.com" +#~ msgstr "my-server.com" + +#~ msgid "New Post" +#~ msgstr "Nuovo Post" + +#~ msgid "Opens editor for profile display name, avatar, background image, and description" +#~ msgstr "Apre l'editor per il nome configurato del profilo, l'avatar, l'immagine di sfondo e la descrizione" + +#~ msgid "Opens followers list" +#~ msgstr "Apre la lista dei followers" + +#~ msgid "Opens following list" +#~ msgstr "Apre la lista di chi segui" + +#~ msgid "Opens invite code list" +#~ msgstr "Apre la lista dei codici di invito" + +#~ msgid "Opens modal for account deletion confirmation. Requires email code." +#~ msgstr "Apre il modal per la conferma dell'eliminazione dell'account. Richiede un codice email." + +#~ msgid "Opens the app password settings page" +#~ msgstr "Apre la pagina delle impostazioni della password dell'app" + +#~ msgid "Opens the home feed preferences" +#~ msgstr "Apre le preferenze del home feed" + +#~ msgid "Other service" +#~ msgstr "Altro servizio" + +#~ msgid "Phone number" +#~ msgstr "Numero di telefono" + +#~ msgid "Please enter a phone number that can receive SMS text messages." +#~ msgstr "Inserisci un numero di telefono in grado di ricevere messaggi di testo SMS." + +#~ msgid "Please enter the code you received by SMS." +#~ msgstr "Inserisci il codice che hai ricevuto via SMS." + +#~ msgid "Please enter the verification code sent to {phoneNumberFormatted}." +#~ msgstr "Inserisci il codice di verifica inviato a {phoneNumberFormatted}." + +#~ msgid "Please tell us why you think this content warning was incorrectly applied!" +#~ msgstr "Spiegaci perché ritieni che questo avviso sui contenuti sia stato applicato in modo errato!" + +#~ msgid "Please tell us why you think this decision was incorrect." +#~ msgstr "Per favore spiegaci perché ritieni che questa decisione sia stata sbagliata." + +#~ msgid "Post" +#~ msgstr "Post" + +#~ msgid "Quote Post" +#~ msgstr "Cita il post" + +#~ msgid "Remove {0} from my feeds?" +#~ msgstr "Rimuovere {0} dai miei feeds?" + +#~ msgid "Remove this feed from my feeds?" +#~ msgstr "Rimuovere questo feed dai miei feeds?" + +#~ msgid "Remove this feed from your saved feeds?" +#~ msgstr "Elimina questo feed dai feeds salvati?" + +#~ msgid "Report {collectionName}" +#~ msgstr "Segnala {collectionName}" + +#~ msgid "Reposted by" +#~ msgstr "Repost di" + +#~ msgid "Reposted by {0})" +#~ msgstr "Repost di {0})" + +#~ msgid "Request code" +#~ msgstr "Richiedi un codice" + +#~ msgid "Reset onboarding" +#~ msgstr "Reimposta l'incorporazione" + +#~ msgid "Reset preferences" +#~ msgstr "Reimposta le preferenze" + +#~ msgid "Retry." +#~ msgstr "Riprova." + +#~ msgid "SANDBOX. Posts and accounts are not permanent." +#~ msgstr "SANDBOX. I post e gli account non sono permanenti." + +#~ msgid "Select Bluesky Social" +#~ msgstr "Seleziona Bluesky Social" + +#~ msgid "Select your app language for the default text to display in the app" +#~ msgstr "Seleziona la lingua dell'app per il testo predefinito da visualizzare nell'app" + +#~ msgid "Select your phone's country" +#~ msgstr "Seleziona il Paese del tuo cellulare" + +#~ msgid "Send Email" +#~ msgstr "Envia Email" + +#~ msgid "Send Report" +#~ msgstr "Invia segnalazione" + +#~ msgid "Set {value} for {labelGroup} content moderation policy" +#~ msgstr "Imposta {value} per la politica di moderazione dei contenuti di {labelGroup}" + +#~ msgctxt "action" +#~ msgid "Set Age" +#~ msgstr "Imposta l'età" + +#~ msgid "Set color theme to dark" +#~ msgstr "Imposta il colore del tema scuro" + +#~ msgid "Set color theme to light" +#~ msgstr "Imposta il colore del tema su chiaro" + +#~ msgid "Set color theme to system setting" +#~ msgstr "Imposta il colore del tema basato sulle impostazioni del tuo sistema" + +#~ msgid "Set dark theme to the dark theme" +#~ msgstr "Imposta il tema scuro sul tema scuro" + +#~ msgid "Set dark theme to the dim theme" +#~ msgstr "Imposta il tema scuro sul tema scuro" + +#~ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your following feed. This is an experimental feature." +#~ msgstr "Seleziona \"Sì\" per mostrare esempi dei feed salvati nel feed successivo. Questa è una funzionalità sperimentale." + +#~ msgid "Shows a list of users similar to this user." +#~ msgstr "Mostra un elenco di utenti simili a questo utente." + +#~ msgid "SMS verification" +#~ msgstr "Verifica tramite SMS" + +#~ msgid "Something went wrong and we're not sure what." +#~ msgstr "Qualcosa è andato storto ma non siamo sicuri di cosa." + +#~ msgid "Something went wrong. Check your email and try again." +#~ msgstr "Qualcosa è andato storto. Controlla la tua email e riprova." + +#~ msgid "Staging" +#~ msgstr "Allestimento" + +#~ msgid "Swipe up to see more" +#~ msgstr "Scorri verso l'alto per vedere di più" + +#~ msgid "The support form has been moved. If you need help, please<0/> or visit {HELP_DESK_URL} to get in touch with us." +#~ msgstr "Il modulo di supporto è stato spostato. Se hai bisogno di aiuto, <0/> o visita {HELP_DESK_URL} per metterti in contatto con noi." + +#~ msgid "There's something wrong with this number. Please choose your country and enter your full phone number!" +#~ msgstr "C'è qualcosa di sbagliato in questo numero. Scegli il tuo Paese e inserisci il tuo numero di telefono completo!" + +#~ msgid "This {0} has been labeled." +#~ msgstr "Questo {0} è stato etichettato." + +#~ msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." +#~ msgstr "Questa funzionalità è in versione beta. Puoi leggere ulteriori informazioni sulle esportazioni dell' archivio in <0>questo post del blog." + +#~ msgid "This is the service that keeps you online." +#~ msgstr "Questo è il servizio che ti mantiene online." + +#~ msgid "This user is included in the <0/> list which you have blocked." +#~ msgstr "Questo utente è incluso nell'elenco <0/> che hai bloccato." + +#~ msgid "This user is included in the <0/> list which you have muted." +#~ msgstr "Questo utente è incluso nell'elenco <0/> che hai disattivato." + +#~ msgid "This user is included the <0/> list which you have muted." +#~ msgstr "Questo utente è incluso nella lista <0/> che hai silenziato." + +#~ msgid "This will hide this post from your feeds." +#~ msgstr "Questo nasconderà il post dai tuoi feeds." + +#~ msgid "Try again" +#~ msgstr "Provalo di nuovo" + +#~ msgid "Unsave" +#~ msgstr "Rimuovi" + +#~ msgid "Update Available" +#~ msgstr "Aggiornamento disponibile" + +#~ msgid "Use your domain as your Bluesky client service provider" +#~ msgstr "Utilizza il tuo dominio come provider di servizi clienti Bluesky" + +#~ msgid "Verification code" +#~ msgstr "Codice di verifica" + +#~ msgid "We'll look into your appeal promptly." +#~ msgstr "Esamineremo il tuo ricorso al più presto." + +#~ msgid "What is the issue with this {collectionName}?" +#~ msgstr "Qual è il problema con questo {collectionName}?" + +#~ msgid "What's next?" +#~ msgstr "Qual è il prossimo?" + +#~ msgid "XXXXXX" +#~ msgstr "XXXXXX" + +#~ msgid "You can change hosting providers at any time." +#~ msgstr "Puoi cambiare provider di hosting in qualsiasi momento." + +#~ msgid "You have muted this user." +#~ msgstr "Hai disattivato questo utente." + +#~ msgid "You have not blocked any accounts yet. To block an account, go to their profile and selected \"Block account\" from the menu on their account." +#~ msgstr "Non hai ancora bloccato nessun conto. Per bloccare un conto, vai al profilo e seleziona \"Blocca conto\" dal menu del suo conto." + +#~ msgid "You have not muted any accounts yet. To mute an account, go to their profile and selected \"Mute account\" from the menu on their account." +#~ msgstr "Non hai ancora disattivato alcun account. Per disattivare un account, vai al suo profilo e seleziona \"Disattiva account\" dal menu del account." + +#~ msgid "You must be 18 or older to enable adult content." +#~ msgstr "Devi avere almeno 18 anni per abilitare i contenuti per adulti." + +#~ msgid "Your email has been saved! We'll be in touch soon." +#~ msgstr "La tua email è stata salvata! Ci metteremo in contatto al più presto." + +#~ msgid "Your hosting provider" +#~ msgstr "Il tuo fornitore di hosting" + +#~ msgid "Your invite codes are hidden when logged in using an App Password" +#~ msgstr "I tuoi codici di invito vengono celati quando accedi utilizzando una password per l'app" From fbcd4ddabc8459929944d8379386a2afc3d6b740 Mon Sep 17 00:00:00 2001 From: Frudrax Cheng Date: Wed, 10 Apr 2024 06:13:00 +0800 Subject: [PATCH 016/185] Update zh-CN translation (#3433) * Update messages.po * Update messages.po by reviewer suggestions Co-authored-by: Leonid * Update messages.po by reviewer suggestions Co-authored-by: Leonid * Update messages.po by reviewer suggestions Co-authored-by: Leonid * Update messages.po by reviewer suggestions Co-authored-by: Leonid * Update messages.po by reviewer suggestions * Remove superseded strings * Update messages.po * Update messages.po * Update messages.po * Update messages.po * Update messages.po * Update messages.po --------- Co-authored-by: Leonid --- src/locale/locales/zh-CN/messages.po | 1093 +++++++------------------- 1 file changed, 269 insertions(+), 824 deletions(-) diff --git a/src/locale/locales/zh-CN/messages.po b/src/locale/locales/zh-CN/messages.po index 7f33c50743..a597edc168 100644 --- a/src/locale/locales/zh-CN/messages.po +++ b/src/locale/locales/zh-CN/messages.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"POT-Creation-Date: 2024-02-17 21:00+0800\n" +"POT-Creation-Date: 2024-04-06 12:55+0800\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: \n" -"Last-Translator: Mikan Harada \n" +"Last-Translator: Frudrax Cheng \n" "Language-Team: Frudrax Cheng, Simon Chan, U2FsdGVkX1, Mikan Harada\n" "Plural-Forms: \n" @@ -17,28 +17,10 @@ msgstr "" msgid "(no email)" msgstr "(没有邮件)" -#: src/view/shell/desktop/RightNav.tsx:168 -#~ msgid "{0, plural, one {# invite code available} other {# invite codes available}}" -#~ msgstr "{0, plural, one {# 条邀请码可用} other {# 条邀请码可用}}" - #: src/screens/Profile/Header/Metrics.tsx:45 msgid "{following} following" msgstr "{following} 个正在关注" -#: src/view/shell/desktop/RightNav.tsx:151 -#~ msgid "{invitesAvailable, plural, one {Invite codes: # available} other {Invite codes: # available}}" -#~ msgstr "{invitesAvailable, plural, one {邀请码: # 可用} other {邀请码: # 可用}}" - -#: src/view/screens/Settings.tsx:435 -#: src/view/shell/Drawer.tsx:664 -#~ msgid "{invitesAvailable} invite code available" -#~ msgstr "{invitesAvailable} 条邀请码可用" - -#: src/view/screens/Settings.tsx:437 -#: src/view/shell/Drawer.tsx:666 -#~ msgid "{invitesAvailable} invite codes available" -#~ msgstr "{invitesAvailable} 条邀请码可用" - #: src/view/shell/Drawer.tsx:443 msgid "{numUnreadNotifications} unread" msgstr "{numUnreadNotifications} 个未读" @@ -49,7 +31,7 @@ msgstr "<0/> 个成员" #: src/view/shell/Drawer.tsx:97 msgid "<0>{0} following" -msgstr "" +msgstr "<0>{0} 个正在关注" #: src/screens/Profile/Header/Metrics.tsx:46 msgid "<0>{following} <1>following" @@ -71,14 +53,6 @@ msgstr "<0>欢迎来到<1>Bluesky" msgid "⚠Invalid Handle" msgstr "⚠无效的用户识别符" -#: src/view/com/util/moderation/LabelInfo.tsx:45 -#~ msgid "A content warning has been applied to this {0}." -#~ msgstr "内容警告已套用到这个{0}." - -#: src/lib/hooks/useOTAUpdate.ts:16 -#~ msgid "A new version of the app is available. Please update to continue using the app." -#~ msgstr "应用新版本已发布,请更新以继续使用。" - #: src/view/com/util/ViewHeader.tsx:89 #: src/view/screens/Search/Search.tsx:648 msgid "Access navigation links and settings" @@ -95,7 +69,7 @@ msgstr "无障碍" #: src/components/moderation/LabelsOnMe.tsx:42 msgid "account" -msgstr "" +msgstr "账户" #: src/view/com/auth/login/LoginForm.tsx:169 #: src/view/screens/Settings/index.tsx:327 @@ -109,7 +83,7 @@ msgstr "已屏蔽账户" #: src/view/com/profile/ProfileMenu.tsx:153 msgid "Account followed" -msgstr "" +msgstr "已关注账户" #: src/view/com/profile/ProfileMenu.tsx:113 msgid "Account muted" @@ -139,7 +113,7 @@ msgstr "已取消屏蔽账户" #: src/view/com/profile/ProfileMenu.tsx:166 msgid "Account unfollowed" -msgstr "" +msgstr "已取消关注账户" #: src/view/com/profile/ProfileMenu.tsx:102 msgid "Account unmuted" @@ -178,15 +152,6 @@ msgstr "新增替代文字" msgid "Add App Password" msgstr "新增应用专用密码" -#: src/view/com/modals/report/InputIssueDetails.tsx:41 -#: src/view/com/modals/report/Modal.tsx:191 -#~ msgid "Add details" -#~ msgstr "新增细节" - -#: src/view/com/modals/report/Modal.tsx:194 -#~ msgid "Add details to report" -#~ msgstr "补充反馈详细内容" - #: src/view/com/composer/Composer.tsx:466 msgid "Add link card" msgstr "添加链接卡片" @@ -238,13 +203,9 @@ msgstr "调整回复中需要具有的喜欢数才会在你的信息流中显示 msgid "Adult Content" msgstr "成人内容" -#: src/view/com/modals/ContentFilteringSettings.tsx:141 -#~ msgid "Adult content can only be enabled via the Web at <0/>." -#~ msgstr "要显示成人内容,你必须访问网页端<0/>来启用。" - #: src/components/moderation/ModerationLabelPref.tsx:114 msgid "Adult content is disabled." -msgstr "" +msgstr "成人内容显示已被禁用" #: src/screens/Moderation/index.tsx:377 #: src/view/screens/Settings/index.tsx:684 @@ -286,7 +247,7 @@ msgstr "一封电子邮件已发送至先前填写的邮箱 {0}。请查阅邮 #: src/lib/moderation/useReportOptions.ts:26 msgid "An issue not included in these options" -msgstr "" +msgstr "不在这些选项中的问题" #: src/view/com/profile/FollowButton.tsx:35 #: src/view/com/profile/FollowButton.tsx:45 @@ -306,7 +267,7 @@ msgstr "动物" #: src/lib/moderation/useReportOptions.ts:31 msgid "Anti-Social Behavior" -msgstr "" +msgstr "反社会行为" #: src/view/screens/LanguageSettings.tsx:95 msgid "App Language" @@ -328,10 +289,6 @@ msgstr "应用专用密码必须至少为 4 个字符。" msgid "App password settings" msgstr "应用专用密码设置" -#: src/view/screens/Settings.tsx:650 -#~ msgid "App passwords" -#~ msgstr "应用专用密码" - #: src/Navigation.tsx:251 #: src/view/screens/AppPasswords.tsx:189 #: src/view/screens/Settings/index.tsx:704 @@ -341,32 +298,15 @@ msgstr "应用专用密码" #: src/components/moderation/LabelsOnMeDialog.tsx:134 #: src/components/moderation/LabelsOnMeDialog.tsx:137 msgid "Appeal" -msgstr "" +msgstr "申诉" #: src/components/moderation/LabelsOnMeDialog.tsx:202 msgid "Appeal \"{0}\" label" -msgstr "" - -#: src/view/com/util/forms/PostDropdownBtn.tsx:337 -#: src/view/com/util/forms/PostDropdownBtn.tsx:346 -#~ msgid "Appeal content warning" -#~ msgstr "申诉内容警告" - -#: src/view/com/modals/AppealLabel.tsx:65 -#~ msgid "Appeal Content Warning" -#~ msgstr "申诉内容警告" +msgstr "申诉 \"{0}\" 标记" #: src/components/moderation/LabelsOnMeDialog.tsx:193 msgid "Appeal submitted." -msgstr "" - -#: src/view/com/util/moderation/LabelInfo.tsx:52 -#~ msgid "Appeal this decision" -#~ msgstr "对此决定提出申诉" - -#: src/view/com/util/moderation/LabelInfo.tsx:56 -#~ msgid "Appeal this decision." -#~ msgstr "对此决定提出申诉。" +msgstr "申诉已提交" #: src/view/screens/Settings/index.tsx:485 msgid "Appearance" @@ -374,11 +314,11 @@ msgstr "外观" #: src/view/screens/AppPasswords.tsx:265 msgid "Are you sure you want to delete the app password \"{name}\"?" -msgstr "你确定要删除这条应用专用密码 \"{name}\"?" +msgstr "你确定要删除这条应用专用密码 \"{name}\" 吗?" #: src/view/com/feeds/FeedSourceCard.tsx:280 msgid "Are you sure you want to remove {0} from your feeds?" -msgstr "" +msgstr "你确定要从你的信息流中删除 {0} 吗?" #: src/view/com/composer/Composer.tsx:508 msgid "Are you sure you'd like to discard this draft?" @@ -388,10 +328,6 @@ msgstr "你确定要丢弃此草稿吗?" msgid "Are you sure?" msgstr "你确定吗?" -#: src/view/com/util/forms/PostDropdownBtn.tsx:322 -#~ msgid "Are you sure? This cannot be undone." -#~ msgstr "你确定吗?此操作无法撤销。" - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:60 msgid "Are you writing in <0>{0}?" msgstr "你是用 <0>{0} 编写的吗?" @@ -416,11 +352,6 @@ msgstr "艺术作品或非色情的裸体。" msgid "Back" msgstr "返回" -#: src/view/com/post-thread/PostThread.tsx:480 -#~ msgctxt "action" -#~ msgid "Back" -#~ msgstr "返回" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:136 msgid "Based on your interest in {interestsText}" msgstr "基于你对 {interestsText} 感兴趣" @@ -441,7 +372,7 @@ msgstr "生日:" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:278 #: src/view/com/profile/ProfileMenu.tsx:361 msgid "Block" -msgstr "" +msgstr "屏蔽" #: src/view/com/profile/ProfileMenu.tsx:300 #: src/view/com/profile/ProfileMenu.tsx:307 @@ -450,7 +381,7 @@ msgstr "屏蔽账户" #: src/view/com/profile/ProfileMenu.tsx:344 msgid "Block Account?" -msgstr "" +msgstr "屏蔽账户?" #: src/view/screens/ProfileList.tsx:530 msgid "Block accounts" @@ -465,10 +396,6 @@ msgstr "屏蔽列表" msgid "Block these accounts?" msgstr "屏蔽这些账户?" -#: src/view/screens/ProfileList.tsx:320 -#~ msgid "Block this List" -#~ msgstr "屏蔽这个列表" - #: src/view/com/lists/ListCard.tsx:110 #: src/view/com/util/post-embeds/QuoteEmbed.tsx:55 msgid "Blocked" @@ -497,7 +424,7 @@ msgstr "已屏蔽帖子。" #: src/screens/Profile/Sections/Labels.tsx:153 msgid "Blocking does not prevent this labeler from placing labels on your account." -msgstr "" +msgstr "屏蔽不能阻止这个人在你的账户上放置标记" #: src/view/screens/ProfileList.tsx:631 msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." @@ -505,7 +432,7 @@ msgstr "屏蔽是公开的。被屏蔽的账户无法在你的帖子中回复、 #: src/view/com/profile/ProfileMenu.tsx:353 msgid "Blocking will not prevent labels from being applied on your account, but it will stop this account from replying in your threads or interacting with you." -msgstr "" +msgstr "屏蔽不会阻止标记被放置到你的账户上,但会阻止此账户在你发布的帖子中回复或与你互动。" #: src/view/com/auth/HomeLoggedOutCTA.tsx:97 #: src/view/com/auth/SplashScreen.web.tsx:133 @@ -537,25 +464,17 @@ msgstr "Bluesky 保持开放。" msgid "Bluesky is public." msgstr "Bluesky 为公众而生。" -#: src/view/com/modals/Waitlist.tsx:70 -#~ msgid "Bluesky uses invites to build a healthier community. If you don't know anybody with an invite, you can sign up for the waitlist and we'll send one soon." -#~ msgstr "Bluesky 使用邀请制来打造更健康的社群环境。 如果你不认识拥有邀请码的人,你可以先填写并提交候补列表,我们会尽快审核并发送邀请码。" - #: src/screens/Moderation/index.tsx:535 msgid "Bluesky will not show your profile and posts to logged-out users. Other apps may not honor this request. This does not make your account private." msgstr "Bluesky 不会向未登录的用户显示你的个人资料和帖子。但其他应用可能不会遵照此请求,这无法确保你的账户隐私。" -#: src/view/com/modals/ServerInput.tsx:78 -#~ msgid "Bluesky.Social" -#~ msgstr "Bluesky.Social" - #: src/lib/moderation/useLabelBehaviorDescription.ts:53 msgid "Blur images" -msgstr "" +msgstr "模糊化图片" #: src/lib/moderation/useLabelBehaviorDescription.ts:51 msgid "Blur images and filter from feeds" -msgstr "" +msgstr "模糊化图片并从信息流中过滤" #: src/screens/Onboarding/index.tsx:33 msgid "Books" @@ -570,10 +489,6 @@ msgstr "构建版本号 {0} {1}" msgid "Business" msgstr "商务" -#: src/view/com/modals/ServerInput.tsx:115 -#~ msgid "Button disabled. Input custom domain to proceed." -#~ msgstr "按钮已禁用。输入自定义域名以继续。" - #: src/view/com/profile/ProfileSubpageHeader.tsx:157 msgid "by —" msgstr "来自 —" @@ -584,7 +499,7 @@ msgstr "来自 {0}" #: src/components/LabelingServiceCard/index.tsx:57 msgid "By {0}" -msgstr "" +msgstr "来自 {0}" #: src/view/com/profile/ProfileSubpageHeader.tsx:161 msgid "by <0/>" @@ -592,7 +507,7 @@ msgstr "来自 <0/>" #: src/view/com/auth/create/Policies.tsx:87 msgid "By creating an account you agree to the {els}." -msgstr "" +msgstr "创建账户即默认表明你同意我们的 {els}。" #: src/view/com/profile/ProfileSubpageHeader.tsx:159 msgid "by you" @@ -666,17 +581,13 @@ msgstr "取消引用帖子" msgid "Cancel search" msgstr "取消搜索" -#: src/view/com/modals/Waitlist.tsx:136 -#~ msgid "Cancel waitlist signup" -#~ msgstr "取消候补列表申请" - #: src/view/com/modals/LinkWarning.tsx:88 msgid "Cancels opening the linked website" -msgstr "" +msgstr "取消打开链接的网站" #: src/view/com/modals/VerifyEmail.tsx:152 msgid "Change" -msgstr "" +msgstr "更改" #: src/view/screens/Settings/index.tsx:353 msgctxt "action" @@ -709,10 +620,6 @@ msgstr "更改密码" msgid "Change post language to {0}" msgstr "更改帖子的发布语言至 {0}" -#: src/view/screens/Settings/index.tsx:733 -#~ msgid "Change your Bluesky password" -#~ msgstr "更改你的 Bluesky 密码" - #: src/view/com/modals/ChangeEmail.tsx:109 msgid "Change Your Email" msgstr "更改你的邮箱地址" @@ -738,10 +645,6 @@ msgstr "查看发送至你电子邮箱的确认邮件,并在下方输入收到 msgid "Choose \"Everybody\" or \"Nobody\"" msgstr "选择 \"所有人\" 或是 \"没有人\"" -#: src/view/screens/Settings/index.tsx:697 -#~ msgid "Choose a new Bluesky username or create" -#~ msgstr "选择一个新的 Bluesky 用户名或重新创建" - #: src/view/com/auth/server-input/index.tsx:79 msgid "Choose Service" msgstr "选择服务" @@ -786,11 +689,11 @@ msgstr "清除搜索历史记录" #: src/view/screens/Settings/index.tsx:869 msgid "Clears all legacy storage data" -msgstr "" +msgstr "清除所有旧版存储数据" #: src/view/screens/Settings/index.tsx:881 msgid "Clears all storage data" -msgstr "" +msgstr "清除所有数据" #: src/view/screens/Support.tsx:40 msgid "click here" @@ -798,11 +701,11 @@ msgstr "点击这里" #: src/components/TagMenu/index.web.tsx:138 msgid "Click here to open tag menu for {tag}" -msgstr "" +msgstr "点击这里打开 {tag} 的标签菜单" #: src/components/RichText.tsx:191 msgid "Click here to open tag menu for #{tag}" -msgstr "" +msgstr "点击这里打开 #{tag} 的标签菜单" #: src/screens/Onboarding/index.tsx:35 msgid "Climate" @@ -896,11 +799,11 @@ msgstr "撰写回复" #: src/components/moderation/ModerationLabelPref.tsx:149 #: src/screens/Onboarding/StepModeration/ModerationOption.tsx:81 msgid "Configure content filtering setting for category: {0}" -msgstr "配置类别的内容过滤设置:{0}" +msgstr "为类别 {0} 配置内容过滤设置" #: src/components/moderation/ModerationLabelPref.tsx:116 msgid "Configured in <0>moderation settings." -msgstr "" +msgstr "在 <0>限制设置 中配置。" #: src/components/Prompt.tsx:152 #: src/components/Prompt.tsx:155 @@ -912,12 +815,6 @@ msgstr "" msgid "Confirm" msgstr "确认" -#: src/view/com/modals/Confirm.tsx:75 -#: src/view/com/modals/Confirm.tsx:78 -#~ msgctxt "action" -#~ msgid "Confirm" -#~ msgstr "确认" - #: src/view/com/modals/ChangeEmail.tsx:193 #: src/view/com/modals/ChangeEmail.tsx:195 msgid "Confirm Change" @@ -931,17 +828,13 @@ msgstr "确认内容语言设置" msgid "Confirm delete account" msgstr "确认删除账户" -#: src/view/com/modals/ContentFilteringSettings.tsx:156 -#~ msgid "Confirm your age to enable adult content." -#~ msgstr "确认你的年龄以启用成人内容。" - #: src/screens/Moderation/index.tsx:303 msgid "Confirm your age:" -msgstr "" +msgstr "确认你的年龄:" #: src/screens/Moderation/index.tsx:294 msgid "Confirm your birthdate" -msgstr "" +msgstr "确认你的出生年月:" #: src/view/com/modals/ChangeEmail.tsx:157 #: src/view/com/modals/DeleteAccount.tsx:176 @@ -950,10 +843,6 @@ msgstr "" msgid "Confirmation code" msgstr "验证码" -#: src/view/com/modals/Waitlist.tsx:120 -#~ msgid "Confirms signing up {email} to the waitlist" -#~ msgstr "确认将 {email} 注册到候补列表" - #: src/view/com/auth/create/CreateAccount.tsx:193 #: src/view/com/auth/login/LoginForm.tsx:281 msgid "Connecting..." @@ -965,23 +854,15 @@ msgstr "联系支持" #: src/components/moderation/LabelsOnMe.tsx:42 msgid "content" -msgstr "" +msgstr "内容" #: src/lib/moderation/useGlobalLabelStrings.ts:18 msgid "Content Blocked" -msgstr "" - -#: src/view/screens/Moderation.tsx:83 -#~ msgid "Content filtering" -#~ msgstr "内容过滤" - -#: src/view/com/modals/ContentFilteringSettings.tsx:44 -#~ msgid "Content Filtering" -#~ msgstr "内容过滤" +msgstr "内容已屏蔽" #: src/screens/Moderation/index.tsx:287 msgid "Content filters" -msgstr "" +msgstr "内容过滤器" #: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:74 #: src/view/screens/LanguageSettings.tsx:278 @@ -1006,7 +887,7 @@ msgstr "内容警告" #: src/components/Menu/index.web.tsx:84 msgid "Context menu backdrop, click to close the menu." -msgstr "" +msgstr "上下文菜单背景,点击关闭菜单。" #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:170 #: src/screens/Onboarding/StepFollowingFeed.tsx:153 @@ -1064,7 +945,7 @@ msgstr "复制" #: src/view/com/modals/ChangeHandle.tsx:481 msgid "Copy {0}" -msgstr "" +msgstr "复制 {0}" #: src/view/screens/ProfileList.tsx:388 msgid "Copy link to list" @@ -1075,10 +956,6 @@ msgstr "复制列表链接" msgid "Copy link to post" msgstr "复制帖子链接" -#: src/view/com/profile/ProfileHeader.tsx:295 -#~ msgid "Copy link to profile" -#~ msgstr "复制个人资料链接" - #: src/view/com/util/forms/PostDropdownBtn.tsx:220 #: src/view/com/util/forms/PostDropdownBtn.tsx:222 msgid "Copy post text" @@ -1097,10 +974,6 @@ msgstr "无法加载信息流" msgid "Could not load list" msgstr "无法加载列表" -#: src/view/com/auth/create/Step2.tsx:91 -#~ msgid "Country" -#~ msgstr "国家" - #: src/view/com/auth/HomeLoggedOutCTA.tsx:64 #: src/view/com/auth/SplashScreen.tsx:73 #: src/view/com/auth/SplashScreen.web.tsx:81 @@ -1126,20 +999,12 @@ msgstr "创建新的账户" #: src/components/ReportDialog/SelectReportOptionView.tsx:94 msgid "Create report for {0}" -msgstr "" +msgstr "创建 {0} 的举报" #: src/view/screens/AppPasswords.tsx:246 msgid "Created {0}" msgstr "{0} 已创建" -#: src/view/screens/ProfileFeed.tsx:616 -#~ msgid "Created by <0/>" -#~ msgstr "由 <0/> 创建" - -#: src/view/screens/ProfileFeed.tsx:614 -#~ msgid "Created by you" -#~ msgstr "由你创建" - #: src/view/com/composer/Composer.tsx:468 msgid "Creates a card with a thumbnail. The card links to {url}" msgstr "创建带有缩略图的卡片。该卡片链接到 {url}" @@ -1166,14 +1031,10 @@ msgstr "由社群构建的自定义信息流能为你带来新的体验,并帮 msgid "Customize media from external sites." msgstr "自定义外部站点的媒体。" -#: src/view/screens/Settings.tsx:687 -#~ msgid "Danger Zone" -#~ msgstr "实验室" - #: src/view/screens/Settings/index.tsx:504 #: src/view/screens/Settings/index.tsx:530 msgid "Dark" -msgstr "深黑" +msgstr "暗色" #: src/view/screens/Debug.tsx:63 msgid "Dark mode" @@ -1185,7 +1046,7 @@ msgstr "深色模式" #: src/view/screens/Settings/index.tsx:841 msgid "Debug Moderation" -msgstr "" +msgstr "调试限制" #: src/view/screens/Debug.tsx:83 msgid "Debug panel" @@ -1195,15 +1056,15 @@ msgstr "调试面板" #: src/view/screens/AppPasswords.tsx:268 #: src/view/screens/ProfileList.tsx:613 msgid "Delete" -msgstr "" +msgstr "删除" #: src/view/screens/Settings/index.tsx:796 msgid "Delete account" -msgstr "删除账号" +msgstr "删除账户" #: src/view/com/modals/DeleteAccount.tsx:87 msgid "Delete Account" -msgstr "删除账号" +msgstr "删除账户" #: src/view/screens/AppPasswords.tsx:239 msgid "Delete app password" @@ -1211,7 +1072,7 @@ msgstr "删除应用专用密码" #: src/view/screens/AppPasswords.tsx:263 msgid "Delete app password?" -msgstr "" +msgstr "删除应用专用密码?" #: src/view/screens/ProfileList.tsx:415 msgid "Delete List" @@ -1221,10 +1082,6 @@ msgstr "删除列表" msgid "Delete my account" msgstr "删除我的账户" -#: src/view/screens/Settings.tsx:706 -#~ msgid "Delete my account…" -#~ msgstr "删除我的账户…" - #: src/view/screens/Settings/index.tsx:808 msgid "Delete My Account…" msgstr "删除我的账户…" @@ -1236,7 +1093,7 @@ msgstr "删除帖子" #: src/view/screens/ProfileList.tsx:608 msgid "Delete this list?" -msgstr "" +msgstr "删除这个列表?" #: src/view/com/util/forms/PostDropdownBtn.tsx:314 msgid "Delete this post?" @@ -1257,10 +1114,6 @@ msgstr "已删除帖子。" msgid "Description" msgstr "描述" -#: src/view/screens/Settings.tsx:760 -#~ msgid "Developer Tools" -#~ msgstr "开发者工具" - #: src/view/com/composer/Composer.tsx:217 msgid "Did you want to say anything?" msgstr "有什么想说的吗?" @@ -1274,19 +1127,15 @@ msgstr "暗淡" #: src/lib/moderation/useLabelBehaviorDescription.ts:68 #: src/screens/Moderation/index.tsx:343 msgid "Disabled" -msgstr "" +msgstr "关闭" #: src/view/com/composer/Composer.tsx:510 msgid "Discard" msgstr "丢弃" -#: src/view/com/composer/Composer.tsx:145 -#~ msgid "Discard draft" -#~ msgstr "丢弃草稿" - #: src/view/com/composer/Composer.tsx:507 msgid "Discard draft?" -msgstr "" +msgstr "丢弃草稿?" #: src/screens/Moderation/index.tsx:520 #: src/screens/Moderation/index.tsx:524 @@ -1298,10 +1147,6 @@ msgstr "阻止应用向未登录用户显示我的账户" msgid "Discover new custom feeds" msgstr "探索新的自定义信息流" -#: src/view/screens/Feeds.tsx:473 -#~ msgid "Discover new feeds" -#~ msgstr "探索新的信息流" - #: src/view/screens/Feeds.tsx:689 msgid "Discover New Feeds" msgstr "探索新的信息流" @@ -1316,24 +1161,20 @@ msgstr "显示名称" #: src/view/com/modals/ChangeHandle.tsx:398 msgid "DNS Panel" -msgstr "" +msgstr "DNS 面板" #: src/lib/moderation/useGlobalLabelStrings.ts:39 msgid "Does not include nudity." -msgstr "" +msgstr "不包含裸露内容" #: src/view/com/modals/ChangeHandle.tsx:482 msgid "Domain Value" -msgstr "" +msgstr "域名记录" #: src/view/com/modals/ChangeHandle.tsx:489 msgid "Domain verified!" msgstr "域名已认证!" -#: src/view/com/auth/create/Step1.tsx:170 -#~ msgid "Don't have an invite code?" -#~ msgstr "没有邀请码?" - #: src/components/dialogs/BirthDateSettings.tsx:119 #: src/components/dialogs/BirthDateSettings.tsx:125 #: src/view/com/auth/server-input/index.tsx:165 @@ -1371,10 +1212,6 @@ msgstr "完成{extraText}" msgid "Double tap to sign in" msgstr "双击以登录" -#: src/view/screens/Settings/index.tsx:755 -#~ msgid "Download Bluesky account data (repository)" -#~ msgstr "下载你的 Bluesky 账户数据(数据库)" - #: src/view/screens/Settings/ExportCarDialog.tsx:59 #: src/view/screens/Settings/ExportCarDialog.tsx:63 msgid "Download CAR file" @@ -1390,15 +1227,15 @@ msgstr "受 Apple 政策限制,显示成人内容只能在完成注册后在 #: src/view/com/modals/ChangeHandle.tsx:257 msgid "e.g. alice" -msgstr "" +msgstr "例如:alice" #: src/view/com/modals/EditProfile.tsx:185 msgid "e.g. Alice Roberts" -msgstr "例如:张蓝天" +msgstr "例如:爱丽丝·罗伯特" #: src/view/com/modals/ChangeHandle.tsx:381 msgid "e.g. alice.com" -msgstr "" +msgstr "例如:alice.com" #: src/view/com/modals/EditProfile.tsx:203 msgid "e.g. Artist, dog-lover, and avid reader." @@ -1406,7 +1243,7 @@ msgstr "例如:艺术家、爱狗人士和狂热读者。" #: src/lib/moderation/useGlobalLabelStrings.ts:43 msgid "E.g. artistic nudes." -msgstr "" +msgstr "例如:裸露艺术" #: src/view/com/modals/CreateOrEditList.tsx:283 msgid "e.g. Great Posters" @@ -1436,7 +1273,7 @@ msgstr "编辑" #: src/view/com/util/UserAvatar.tsx:299 #: src/view/com/util/UserBanner.tsx:85 msgid "Edit avatar" -msgstr "" +msgstr "编辑头像" #: src/view/com/composer/photos/Gallery.tsx:144 #: src/view/com/modals/EditImage.tsx:207 @@ -1526,7 +1363,7 @@ msgstr "仅启用 {0}" #: src/screens/Moderation/index.tsx:331 msgid "Enable adult content" -msgstr "" +msgstr "启用成人内容" #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:94 msgid "Enable Adult Content" @@ -1551,7 +1388,7 @@ msgstr "启用此设置以仅查看你关注的人之间的回复。" #: src/screens/Moderation/index.tsx:341 msgid "Enabled" -msgstr "" +msgstr "已启用" #: src/screens/Profile/Sections/Feed.tsx:84 msgid "End of feed" @@ -1587,10 +1424,6 @@ msgstr "输入你用于创建账户的电子邮箱。我们将向你发送用于 msgid "Enter your birth date" msgstr "输入你的出生日期" -#: src/view/com/modals/Waitlist.tsx:78 -#~ msgid "Enter your email" -#~ msgstr "输入你的电子邮箱" - #: src/view/com/auth/create/Step1.tsx:172 msgid "Enter your email address" msgstr "输入你的电子邮箱" @@ -1603,10 +1436,6 @@ msgstr "请在上方输入你新的电子邮箱" msgid "Enter your new email address below." msgstr "请在下方输入你新的电子邮箱。" -#: src/view/com/auth/create/Step2.tsx:188 -#~ msgid "Enter your phone number" -#~ msgstr "输入你的手机号码" - #: src/view/com/auth/login/Login.tsx:99 msgid "Enter your username and password" msgstr "输入你的用户名和密码" @@ -1625,11 +1454,11 @@ msgstr "所有人" #: src/lib/moderation/useReportOptions.ts:66 msgid "Excessive mentions or replies" -msgstr "" +msgstr "过多的提及或回复" #: src/view/com/modals/DeleteAccount.tsx:231 msgid "Exits account deletion process" -msgstr "" +msgstr "退出账户删除流程" #: src/view/com/modals/ChangeHandle.tsx:150 msgid "Exits handle change process" @@ -1637,7 +1466,7 @@ msgstr "退出修改用户识别符流程" #: src/view/com/modals/crop-image/CropImage.web.tsx:135 msgid "Exits image cropping process" -msgstr "" +msgstr "退出图片裁剪流程" #: src/view/com/lightbox/Lightbox.web.tsx:130 msgid "Exits image view" @@ -1648,10 +1477,6 @@ msgstr "退出图片查看器" msgid "Exits inputting search query" msgstr "退出搜索查询输入" -#: src/view/com/modals/Waitlist.tsx:138 -#~ msgid "Exits signing up for waitlist with {email}" -#~ msgstr "将 {email} 从候补列表中移除" - #: src/view/com/lightbox/Lightbox.web.tsx:183 msgid "Expand alt text" msgstr "展开替代文本" @@ -1663,20 +1488,20 @@ msgstr "展开或折叠你要回复的完整帖子" #: src/lib/moderation/useGlobalLabelStrings.ts:47 msgid "Explicit or potentially disturbing media." -msgstr "" +msgstr "明确或潜在引起不适的媒体内容。" #: src/lib/moderation/useGlobalLabelStrings.ts:35 msgid "Explicit sexual images." -msgstr "" +msgstr "明确的性暗示图片。" #: src/view/screens/Settings/index.tsx:777 msgid "Export my data" -msgstr "导出账号数据" +msgstr "导出账户数据" #: src/view/screens/Settings/ExportCarDialog.tsx:44 #: src/view/screens/Settings/index.tsx:788 msgid "Export My Data" -msgstr "导出账号数据" +msgstr "导出账户数据" #: src/view/com/modals/EmbedConsent.tsx:64 msgid "External Media" @@ -1717,7 +1542,7 @@ msgstr "无法加载推荐信息流" #: src/view/com/lightbox/Lightbox.tsx:83 msgid "Failed to save image: {0}" -msgstr "" +msgstr "无法保存此图片:{0}" #: src/Navigation.tsx:196 msgid "Feed" @@ -1731,10 +1556,6 @@ msgstr "由 {0} 创建的信息流" msgid "Feed offline" msgstr "信息流已离线" -#: src/view/com/feeds/FeedPage.tsx:143 -#~ msgid "Feed Preferences" -#~ msgstr "信息流首选项" - #: src/view/shell/desktop/RightNav.tsx:61 #: src/view/shell/Drawer.tsx:314 msgid "Feedback" @@ -1751,10 +1572,6 @@ msgstr "反馈" msgid "Feeds" msgstr "信息流" -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:106 -#~ msgid "Feeds are created by users and organizations. They offer you varied experiences and suggest content you may like using algorithms." -#~ msgstr "信息流由用户和组织创建,结合算法为你推荐可能喜欢的内容,可为你带来不一样的体验。" - #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:57 msgid "Feeds are created by users to curate content. Choose some feeds that you find interesting." msgstr "信息流由用户创建并管理。选择一些你感兴趣的信息流。" @@ -1769,11 +1586,11 @@ msgstr "信息流也可以围绕某些话题!" #: src/view/com/modals/ChangeHandle.tsx:482 msgid "File Contents" -msgstr "" +msgstr "文件内容" #: src/lib/moderation/useLabelBehaviorDescription.ts:66 msgid "Filter from feeds" -msgstr "" +msgstr "从信息流中过滤" #: src/screens/Onboarding/StepFinished.tsx:151 msgid "Finalizing" @@ -1801,10 +1618,6 @@ msgstr "正在寻找类似的账户..." msgid "Fine-tune the content you see on your Following feed." msgstr "调整你在关注信息流上所看到的内容。" -#: src/view/screens/PreferencesHomeFeed.tsx:111 -#~ msgid "Fine-tune the content you see on your home screen." -#~ msgstr "调整你在主页上所看到的内容。" - #: src/view/screens/PreferencesThreads.tsx:60 msgid "Fine-tune the discussion threads." msgstr "调整讨论主题。" @@ -1848,7 +1661,7 @@ msgstr "关注 {0}" #: src/view/com/profile/ProfileMenu.tsx:242 #: src/view/com/profile/ProfileMenu.tsx:253 msgid "Follow Account" -msgstr "" +msgstr "关注账户" #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:179 msgid "Follow All" @@ -1896,7 +1709,7 @@ msgstr "正在关注 {0}" #: src/view/screens/Settings/index.tsx:553 msgid "Following feed preferences" -msgstr "" +msgstr "关注信息流首选项" #: src/Navigation.tsx:262 #: src/view/com/home/HomeHeaderLayout.web.tsx:50 @@ -1941,7 +1754,7 @@ msgstr "忘记密码" #: src/lib/moderation/useReportOptions.ts:52 msgid "Frequently Posts Unwanted Content" -msgstr "" +msgstr "频繁发布不受欢迎的内容" #: src/screens/Hashtag.tsx:108 #: src/screens/Hashtag.tsx:148 @@ -1964,7 +1777,7 @@ msgstr "开始" #: src/lib/moderation/useReportOptions.ts:37 msgid "Glaring violations of law or terms of service" -msgstr "" +msgstr "明显违反法律或服务条款" #: src/components/moderation/ScreenHider.tsx:144 #: src/components/moderation/ScreenHider.tsx:153 @@ -1994,11 +1807,11 @@ msgstr "返回上一步" #: src/view/screens/NotFound.tsx:55 msgid "Go home" -msgstr "" +msgstr "返回主页" #: src/view/screens/NotFound.tsx:54 msgid "Go Home" -msgstr "" +msgstr "返回主页" #: src/view/screens/Search/Search.tsx:748 #: src/view/shell/desktop/Search.tsx:263 @@ -2015,7 +1828,7 @@ msgstr "前往下一步" #: src/lib/moderation/useGlobalLabelStrings.ts:46 msgid "Graphic Media" -msgstr "" +msgstr "图形媒体" #: src/view/com/modals/ChangeHandle.tsx:265 msgid "Handle" @@ -2023,16 +1836,12 @@ msgstr "用户识别符" #: src/lib/moderation/useReportOptions.ts:32 msgid "Harassment, trolling, or intolerance" -msgstr "" +msgstr "骚扰、恶作剧或其他无法容忍的行为" #: src/Navigation.tsx:282 msgid "Hashtag" msgstr "话题标签" -#: src/components/RichText.tsx:188 -#~ msgid "Hashtag: {tag}" -#~ msgstr "话题标签:{tag}" - #: src/components/RichText.tsx:190 msgid "Hashtag: #{tag}" msgstr "话题标签:#{tag}" @@ -2098,10 +1907,6 @@ msgstr "隐藏这条帖子?" msgid "Hide user list" msgstr "隐藏用户列表" -#: src/view/com/profile/ProfileHeader.tsx:487 -#~ msgid "Hides posts from {0} in your feed" -#~ msgstr "在你的信息流中隐藏来自 {0} 的帖子" - #: src/view/com/posts/FeedErrorMessage.tsx:111 msgid "Hmm, some kind of issue occurred when contacting the feed server. Please let the feed owner know about this issue." msgstr "连接信息流服务器出现问题,请联系信息流的维护者反馈此问题。" @@ -2120,15 +1925,15 @@ msgstr "信息流服务器返回错误的响应,请联系信息流的维护者 #: src/view/com/posts/FeedErrorMessage.tsx:96 msgid "Hmm, we're having trouble finding this feed. It may have been deleted." -msgstr "我们无法找到该信息流,似乎已被删除。" +msgstr "无法找到该信息流,似乎已被删除。" #: src/screens/Moderation/index.tsx:61 msgid "Hmmmm, it seems we're having trouble loading this data. See below for more details. If this issue persists, please contact us." -msgstr "" +msgstr "看起来在加载数据时遇到了问题,请查看下方获取更多详情。如果问题仍然存在,请联系我们。" #: src/screens/Profile/ErrorState.tsx:31 msgid "Hmmmm, we couldn't load that moderation service." -msgstr "" +msgstr "无法加载该限制提供服务。" #: src/Navigation.tsx:454 #: src/view/shell/bottom-bar/BottomBar.tsx:139 @@ -2138,16 +1943,9 @@ msgstr "" msgid "Home" msgstr "主页" -#: src/Navigation.tsx:247 -#: src/view/com/pager/FeedsTabBarMobile.tsx:123 -#: src/view/screens/PreferencesHomeFeed.tsx:104 -#: src/view/screens/Settings/index.tsx:543 -#~ msgid "Home Feed Preferences" -#~ msgstr "主页信息流首选项" - #: src/view/com/modals/ChangeHandle.tsx:421 msgid "Host:" -msgstr "" +msgstr "主机:" #: src/view/com/auth/create/Step1.tsx:75 #: src/view/com/auth/login/ForgotPasswordForm.tsx:120 @@ -2181,15 +1979,15 @@ msgstr "若不勾选,则默认为全年龄向。" #: src/view/com/auth/create/Policies.tsx:91 msgid "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." -msgstr "" +msgstr "如果你根据你所在国家的法律定义还不是成年人,则你的父母或法定监护人必须代表你阅读这些条款。" #: src/view/screens/ProfileList.tsx:610 msgid "If you delete this list, you won't be able to recover it." -msgstr "" +msgstr "如果你删除此列表,将无法恢复" #: src/view/com/util/forms/PostDropdownBtn.tsx:316 msgid "If you remove this post, you won't be able to recover it." -msgstr "" +msgstr "如果你移除此列表,将无法恢复" #: src/view/com/modals/ChangePassword.tsx:148 msgid "If you want to change your password, we will send you a code to verify that this is your account." @@ -2197,7 +1995,7 @@ msgstr "如果你想要更改密码,我们将向你发送一个验证码以验 #: src/lib/moderation/useReportOptions.ts:36 msgid "Illegal and Urgent" -msgstr "" +msgstr "违法" #: src/view/com/util/images/Gallery.tsx:38 msgid "Image" @@ -2207,14 +2005,9 @@ msgstr "图片" msgid "Image alt text" msgstr "图片替代文本" -#: src/view/com/util/UserAvatar.tsx:311 -#: src/view/com/util/UserBanner.tsx:118 -#~ msgid "Image options" -#~ msgstr "图片选项" - #: src/lib/moderation/useReportOptions.ts:47 msgid "Impersonation or false claims about identity or affiliation" -msgstr "" +msgstr "冒充或虚假身份及从属关系" #: src/view/com/auth/login/SetNewPasswordForm.tsx:138 msgid "Input code sent to your email for password reset" @@ -2244,10 +2037,6 @@ msgstr "输入新的密码" msgid "Input password for account deletion" msgstr "输入密码以删除账户" -#: src/view/com/auth/create/Step2.tsx:196 -#~ msgid "Input phone number for SMS verification" -#~ msgstr "输入手机号码进行短信验证" - #: src/view/com/auth/login/LoginForm.tsx:233 msgid "Input the password tied to {identifier}" msgstr "输入与 {identifier} 关联的密码" @@ -2256,21 +2045,13 @@ msgstr "输入与 {identifier} 关联的密码" msgid "Input the username or email address you used at signup" msgstr "输入注册时使用的用户名或电子邮箱" -#: src/view/com/auth/create/Step2.tsx:271 -#~ msgid "Input the verification code we have texted to you" -#~ msgstr "输入我们发送到你手机的短信验证码" - -#: src/view/com/modals/Waitlist.tsx:90 -#~ msgid "Input your email to get on the Bluesky waitlist" -#~ msgstr "输入你的电子邮箱以加入 Bluesky 候补列表" - #: src/view/com/auth/login/LoginForm.tsx:232 msgid "Input your password" msgstr "输入你的密码" #: src/view/com/modals/ChangeHandle.tsx:390 msgid "Input your preferred hosting provider" -msgstr "" +msgstr "输入你首选的托管服务提供商" #: src/view/com/auth/create/Step2.tsx:80 msgid "Input your user handle" @@ -2284,10 +2065,6 @@ msgstr "帖子记录无效或不受支持" msgid "Invalid username or password" msgstr "用户名或密码无效" -#: src/view/screens/Settings.tsx:411 -#~ msgid "Invite" -#~ msgstr "邀请" - #: src/view/com/modals/InviteCodes.tsx:93 msgid "Invite a Friend" msgstr "邀请朋友" @@ -2305,10 +2082,6 @@ msgstr "邀请码无效,请检查你输入的邀请码并重试。" msgid "Invite codes: {0} available" msgstr "邀请码:{0} 个可用" -#: src/view/shell/Drawer.tsx:645 -#~ msgid "Invite codes: {invitesAvailable} available" -#~ msgstr "邀请码:{invitesAvailable} 可用" - #: src/view/com/modals/InviteCodes.tsx:169 msgid "Invite codes: 1 available" msgstr "邀请码:1 个可用" @@ -2322,54 +2095,41 @@ msgstr "他会显示你所关注的人发布的帖子。" msgid "Jobs" msgstr "工作" -#: src/view/com/modals/Waitlist.tsx:67 -#~ msgid "Join the waitlist" -#~ msgstr "加入候补列表" - -#: src/view/com/auth/create/Step1.tsx:174 -#: src/view/com/auth/create/Step1.tsx:178 -#~ msgid "Join the waitlist." -#~ msgstr "加入候补列表。" - -#: src/view/com/modals/Waitlist.tsx:128 -#~ msgid "Join Waitlist" -#~ msgstr "加入候补列表" - #: src/screens/Onboarding/index.tsx:24 msgid "Journalism" msgstr "新闻学" #: src/components/moderation/LabelsOnMe.tsx:59 msgid "label has been placed on this {labelTarget}" -msgstr "" +msgstr "标记已放置在 {labelTarget} 上" #: src/components/moderation/ContentHider.tsx:144 msgid "Labeled by {0}." -msgstr "" +msgstr "由 {0} 标记。" #: src/components/moderation/ContentHider.tsx:142 msgid "Labeled by the author." -msgstr "" +msgstr "由作者标记。" #: src/view/screens/Profile.tsx:186 msgid "Labels" -msgstr "" +msgstr "标记" #: src/screens/Profile/Sections/Labels.tsx:143 msgid "Labels are annotations on users and content. They can be used to hide, warn, and categorize the network." -msgstr "" +msgstr "标记是对特定内容及用户的提示。可以针对特定内容默认隐藏内容、显示警告或直接显示。" #: src/components/moderation/LabelsOnMe.tsx:61 msgid "labels have been placed on this {labelTarget}" -msgstr "" +msgstr "标记已放置在 {labelTarget} 上" #: src/components/moderation/LabelsOnMeDialog.tsx:63 msgid "Labels on your account" -msgstr "" +msgstr "你账户上的标记" #: src/components/moderation/LabelsOnMeDialog.tsx:65 msgid "Labels on your content" -msgstr "" +msgstr "你内容上的标记" #: src/view/com/composer/select-language/SelectLangBtn.tsx:104 msgid "Language selection" @@ -2392,10 +2152,6 @@ msgstr "语言" msgid "Last step!" msgstr "最后一步!" -#: src/view/com/util/moderation/ContentHider.tsx:103 -#~ msgid "Learn more" -#~ msgstr "了解详情" - #: src/components/moderation/ScreenHider.tsx:129 msgid "Learn More" msgstr "了解详情" @@ -2403,12 +2159,12 @@ msgstr "了解详情" #: src/components/moderation/ContentHider.tsx:65 #: src/components/moderation/ContentHider.tsx:128 msgid "Learn more about the moderation applied to this content." -msgstr "" +msgstr "了解有关应用于此内容的限制的更多详情。" #: src/components/moderation/PostHider.tsx:85 #: src/components/moderation/ScreenHider.tsx:126 msgid "Learn more about this warning" -msgstr "了解关于这个警告的更多详情" +msgstr "了解有关这个警告的更多详情" #: src/screens/Moderation/index.tsx:551 msgid "Learn more about what is public on Bluesky." @@ -2416,7 +2172,7 @@ msgstr "了解有关 Bluesky 公开内容的更多详情。" #: src/components/moderation/ContentHider.tsx:152 msgid "Learn more." -msgstr "" +msgstr "了解详情。" #: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:82 msgid "Leave them all unchecked to see any language." @@ -2443,11 +2199,6 @@ msgstr "让我们来重置你的密码!" msgid "Let's go!" msgstr "让我们开始!" -#: src/view/com/util/UserAvatar.tsx:248 -#: src/view/com/util/UserBanner.tsx:62 -#~ msgid "Library" -#~ msgstr "图书馆" - #: src/view/screens/Settings/index.tsx:498 msgid "Light" msgstr "亮色" @@ -2479,7 +2230,7 @@ msgstr "{0} 个 {1} 喜欢" #: src/components/LabelingServiceCard/index.tsx:72 msgid "Liked by {count} {0}" -msgstr "" +msgstr "被 {count} {0} 喜欢" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:277 #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:291 @@ -2548,11 +2299,6 @@ msgstr "解除对列表的隐藏" msgid "Lists" msgstr "列表" -#: src/view/com/post-thread/PostThread.tsx:333 -#: src/view/com/post-thread/PostThread.tsx:341 -#~ msgid "Load more posts" -#~ msgstr "加载更多帖子" - #: src/view/screens/Notifications.tsx:159 msgid "Load new notifications" msgstr "加载新的通知" @@ -2568,10 +2314,6 @@ msgstr "加载新的帖子" msgid "Loading..." msgstr "加载中..." -#: src/view/com/modals/ServerInput.tsx:50 -#~ msgid "Local dev server" -#~ msgstr "本地开发服务器" - #: src/Navigation.tsx:221 msgid "Log" msgstr "日志" @@ -2630,7 +2372,7 @@ msgstr "来自服务器的信息:{0}" #: src/lib/moderation/useReportOptions.ts:45 msgid "Misleading Account" -msgstr "" +msgstr "误导性账户" #: src/Navigation.tsx:119 #: src/screens/Moderation/index.tsx:106 @@ -2643,7 +2385,7 @@ msgstr "限制" #: src/components/moderation/ModerationDetailsDialog.tsx:113 msgid "Moderation details" -msgstr "" +msgstr "限制详情" #: src/view/com/lists/ListCard.tsx:93 #: src/view/com/modals/UserAddRemoveLists.tsx:206 @@ -2683,20 +2425,20 @@ msgstr "限制设置" #: src/Navigation.tsx:216 msgid "Moderation states" -msgstr "" +msgstr "限制状态" #: src/screens/Moderation/index.tsx:217 msgid "Moderation tools" -msgstr "" +msgstr "限制工具" #: src/components/moderation/ModerationDetailsDialog.tsx:49 #: src/lib/moderation/useModerationCauseDescription.ts:40 msgid "Moderator has chosen to set a general warning on the content." -msgstr "限制选择对内容设置一般警告。" +msgstr "由限制者对内容设置的一般警告。" #: src/view/com/post-thread/PostThreadItem.tsx:541 msgid "More" -msgstr "" +msgstr "更多" #: src/view/shell/desktop/Feeds.tsx:65 msgid "More feeds" @@ -2706,10 +2448,6 @@ msgstr "更多信息流" msgid "More options" msgstr "更多选项" -#: src/view/com/util/forms/PostDropdownBtn.tsx:315 -#~ msgid "More post options" -#~ msgstr "更多帖子选项" - #: src/view/screens/PreferencesThreads.tsx:82 msgid "Most-liked replies first" msgstr "优先显示最多喜欢" @@ -2739,10 +2477,6 @@ msgstr "隐藏账户" msgid "Mute all {displayTag} posts" msgstr "隐藏所有 {displayTag} 的帖子" -#: src/components/TagMenu/index.tsx:211 -#~ msgid "Mute all {tag} posts" -#~ msgstr "隐藏所有 {tag} 的帖子" - #: src/components/dialogs/MutedWords.tsx:149 msgid "Mute in tags only" msgstr "仅隐藏话题标签" @@ -2760,10 +2494,6 @@ msgstr "隐藏列表" msgid "Mute these accounts?" msgstr "隐藏这些账户?" -#: src/view/screens/ProfileList.tsx:279 -#~ msgid "Mute this List" -#~ msgstr "隐藏这个列表" - #: src/components/dialogs/MutedWords.tsx:127 msgid "Mute this word in post text and tags" msgstr "在帖子文本和话题标签中隐藏该词" @@ -2801,7 +2531,7 @@ msgstr "已隐藏的账户将不会在你的通知或时间线中显示,被隐 #: src/lib/moderation/useModerationCauseDescription.ts:85 msgid "Muted by \"{0}\"" -msgstr "" +msgstr "被 \"{0}\" 隐藏" #: src/screens/Moderation/index.tsx:233 msgid "Muted words & tags" @@ -2826,16 +2556,12 @@ msgstr "我的个人资料" #: src/view/screens/Settings/index.tsx:596 msgid "My saved feeds" -msgstr "" +msgstr "我保存的信息流" #: src/view/screens/Settings/index.tsx:602 msgid "My Saved Feeds" msgstr "我保存的信息流" -#: src/view/com/auth/server-input/index.tsx:118 -#~ msgid "my-server.com" -#~ msgstr "my-server.com" - #: src/view/com/modals/AddAppPasswords.tsx:179 #: src/view/com/modals/CreateOrEditList.tsx:290 msgid "Name" @@ -2849,7 +2575,7 @@ msgstr "名称是必填项" #: src/lib/moderation/useReportOptions.ts:78 #: src/lib/moderation/useReportOptions.ts:86 msgid "Name or Description Violates Community Standards" -msgstr "" +msgstr "名称或描述违反了社群准则" #: src/screens/Onboarding/index.tsx:25 msgid "Nature" @@ -2869,7 +2595,7 @@ msgstr "转到个人资料" #: src/components/ReportDialog/SelectReportOptionView.tsx:124 msgid "Need to report a copyright violation?" -msgstr "" +msgstr "需要举报侵犯版权行为吗?" #: src/view/com/modals/EmbedConsent.tsx:107 #: src/view/com/modals/EmbedConsent.tsx:123 @@ -2885,13 +2611,9 @@ msgstr "永远不会失去对你的关注者和数据的访问。" msgid "Never lose access to your followers or data." msgstr "永远不会失去对你的关注者或数据的访问。" -#: src/components/dialogs/MutedWords.tsx:293 -#~ msgid "Nevermind" -#~ msgstr "放弃" - #: src/view/com/modals/ChangeHandle.tsx:520 msgid "Nevermind, create a handle for me" -msgstr "" +msgstr "没关系,为我创建一个用户识别符" #: src/view/screens/Lists.tsx:76 msgctxt "action" @@ -2984,7 +2706,7 @@ msgstr "没有描述" #: src/view/com/modals/ChangeHandle.tsx:406 msgid "No DNS Panel" -msgstr "" +msgstr "没有 DNS 面板" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:111 msgid "No longer following {0}" @@ -3024,11 +2746,11 @@ msgstr "没有人" #: src/components/LikedByList.tsx:102 #: src/components/LikesDialog.tsx:99 msgid "Nobody has liked this yet. Maybe you should be the first!" -msgstr "" +msgstr "目前还没有人喜欢,也许你应该成为第一个!" #: src/lib/moderation/useGlobalLabelStrings.ts:42 msgid "Non-sexual Nudity" -msgstr "" +msgstr "非性暗示裸露" #: src/view/com/modals/SelfLabel.tsx:135 msgid "Not Applicable." @@ -3047,7 +2769,7 @@ msgstr "暂时不需要" #: src/view/com/profile/ProfileMenu.tsx:368 #: src/view/com/util/forms/PostDropdownBtn.tsx:342 msgid "Note about sharing" -msgstr "" +msgstr "分享注意事项" #: src/screens/Moderation/index.tsx:542 msgid "Note: Bluesky is an open and public network. This setting only limits the visibility of your content on the Bluesky app and website, and other apps may not respect this setting. Your content may still be shown to logged-out users by other apps and websites." @@ -3069,11 +2791,11 @@ msgstr "裸露" #: src/lib/moderation/useReportOptions.ts:71 msgid "Nudity or pornography not labeled as such" -msgstr "" +msgstr "未标记的裸露或色情内容" #: src/lib/moderation/useLabelBehaviorDescription.ts:11 msgid "Off" -msgstr "" +msgstr "显示" #: src/view/com/util/ErrorBoundary.tsx:49 msgid "Oh no!" @@ -3085,7 +2807,7 @@ msgstr "糟糕!发生了一些错误。" #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:127 msgid "OK" -msgstr "" +msgstr "好的" #: src/view/com/auth/login/PasswordUpdatedForm.tsx:41 msgid "Okay" @@ -3121,18 +2843,14 @@ msgstr "Oops!" msgid "Open" msgstr "开启" -#: src/view/screens/Moderation.tsx:75 -#~ msgid "Open content filtering settings" -#~ msgstr "打开内容过滤设置" - #: src/view/com/composer/Composer.tsx:490 #: src/view/com/composer/Composer.tsx:491 msgid "Open emoji picker" -msgstr "打开表情符号选择器" +msgstr "开启表情符号选择器" #: src/view/screens/ProfileFeed.tsx:299 msgid "Open feed options menu" -msgstr "" +msgstr "开启信息流选项菜单" #: src/view/screens/Settings/index.tsx:734 msgid "Open links with in-app browser" @@ -3140,19 +2858,15 @@ msgstr "在内置浏览器中打开链接" #: src/screens/Moderation/index.tsx:229 msgid "Open muted words and tags settings" -msgstr "" - -#: src/view/screens/Moderation.tsx:92 -#~ msgid "Open muted words settings" -#~ msgstr "打开隐藏词设置" +msgstr "开启隐藏词和标签设置" #: src/view/com/home/HomeHeaderLayoutMobile.tsx:50 msgid "Open navigation" -msgstr "开启导航" +msgstr "打开导航" #: src/view/com/util/forms/PostDropdownBtn.tsx:183 msgid "Open post options menu" -msgstr "打开帖子选项菜单" +msgstr "开启帖子选项菜单" #: src/view/screens/Settings/index.tsx:828 #: src/view/screens/Settings/index.tsx:838 @@ -3161,7 +2875,7 @@ msgstr "开启 Storybook 界面" #: src/view/screens/Settings/index.tsx:816 msgid "Open system log" -msgstr "" +msgstr "开启系统日志" #: src/view/com/util/forms/DropdownButton.tsx:154 msgid "Opens {numItems} options" @@ -3191,10 +2905,6 @@ msgstr "开启可配置的语言设置" msgid "Opens device photo gallery" msgstr "开启设备相册" -#: src/view/com/profile/ProfileHeader.tsx:420 -#~ msgid "Opens editor for profile display name, avatar, background image, and description" -#~ msgstr "开启个人资料(如名称、头像、背景图片、描述等)编辑器" - #: src/view/screens/Settings/index.tsx:669 msgid "Opens external embeds settings" msgstr "开启外部嵌入设置" @@ -3202,24 +2912,12 @@ msgstr "开启外部嵌入设置" #: src/view/com/auth/HomeLoggedOutCTA.tsx:56 #: src/view/com/auth/SplashScreen.tsx:70 msgid "Opens flow to create a new Bluesky account" -msgstr "" +msgstr "开启流程以创建一个新的 Bluesky 账户" #: src/view/com/auth/HomeLoggedOutCTA.tsx:74 #: src/view/com/auth/SplashScreen.tsx:83 msgid "Opens flow to sign into your existing Bluesky account" -msgstr "" - -#: src/view/com/profile/ProfileHeader.tsx:575 -#~ msgid "Opens followers list" -#~ msgstr "开启关注者列表" - -#: src/view/com/profile/ProfileHeader.tsx:594 -#~ msgid "Opens following list" -#~ msgstr "开启正在关注列表" - -#: src/view/screens/Settings.tsx:412 -#~ msgid "Opens invite code list" -#~ msgstr "开启邀请码列表" +msgstr "开启流程以登录到你现有的 Bluesky 账户" #: src/view/com/modals/InviteCodes.tsx:172 msgid "Opens list of invite codes" @@ -3227,27 +2925,23 @@ msgstr "开启邀请码列表" #: src/view/screens/Settings/index.tsx:798 msgid "Opens modal for account deletion confirmation. Requires email code" -msgstr "" - -#: src/view/screens/Settings/index.tsx:774 -#~ msgid "Opens modal for account deletion confirmation. Requires email code." -#~ msgstr "开启用户删除确认界面,需要电子邮箱接收验证码。" +msgstr "开启用户删除确认界面,需要电子邮箱接收验证码。" #: src/view/screens/Settings/index.tsx:756 msgid "Opens modal for changing your Bluesky password" -msgstr "" +msgstr "开启密码修改界面" #: src/view/screens/Settings/index.tsx:718 msgid "Opens modal for choosing a new Bluesky handle" -msgstr "" +msgstr "开启创建新的用户识别符界面" #: src/view/screens/Settings/index.tsx:779 msgid "Opens modal for downloading your Bluesky account data (repository)" -msgstr "" +msgstr "开启你的 Bluesky 用户资料(存储库)下载页面" #: src/view/screens/Settings/index.tsx:970 msgid "Opens modal for email verification" -msgstr "" +msgstr "开启电子邮箱确认界面" #: src/view/com/modals/ChangeHandle.tsx:281 msgid "Opens modal for using custom domain" @@ -3272,23 +2966,15 @@ msgstr "开启包含所有已保存信息流的界面" #: src/view/screens/Settings/index.tsx:696 msgid "Opens the app password settings" -msgstr "" - -#: src/view/screens/Settings/index.tsx:676 -#~ msgid "Opens the app password settings page" -#~ msgstr "开启应用专用密码设置页" +msgstr "开启应用专用密码设置界面" #: src/view/screens/Settings/index.tsx:554 msgid "Opens the Following feed preferences" -msgstr "" - -#: src/view/screens/Settings/index.tsx:535 -#~ msgid "Opens the home feed preferences" -#~ msgstr "开启主页信息流首选项" +msgstr "开启关注信息流首选项" #: src/view/com/modals/LinkWarning.tsx:76 msgid "Opens the linked website" -msgstr "" +msgstr "开启链接的网页" #: src/view/screens/Settings/index.tsx:829 #: src/view/screens/Settings/index.tsx:839 @@ -3309,7 +2995,7 @@ msgstr "第 {0} 个选项,共 {numItems} 个" #: src/components/ReportDialog/SubmitView.tsx:162 msgid "Optionally provide additional information below:" -msgstr "" +msgstr "可选在下方提供额外信息:" #: src/view/com/modals/Threadgate.tsx:89 msgid "Or combine these options:" @@ -3317,16 +3003,12 @@ msgstr "或者选择组合这些选项:" #: src/lib/moderation/useReportOptions.ts:25 msgid "Other" -msgstr "" +msgstr "其他" #: src/view/com/auth/login/ChooseAccountForm.tsx:147 msgid "Other account" msgstr "其他账户" -#: src/view/com/modals/ServerInput.tsx:88 -#~ msgid "Other service" -#~ msgstr "其他服务" - #: src/view/com/composer/select-language/SelectLangBtn.tsx:91 msgid "Other..." msgstr "其他..." @@ -3352,7 +3034,7 @@ msgstr "密码" #: src/view/com/modals/ChangePassword.tsx:142 msgid "Password Changed" -msgstr "" +msgstr "密码已修改" #: src/view/com/auth/login/Login.tsx:157 msgid "Password updated" @@ -3382,10 +3064,6 @@ msgstr "相机的访问权限已被拒绝,请在系统设置中启用。" msgid "Pets" msgstr "宠物" -#: src/view/com/auth/create/Step2.tsx:183 -#~ msgid "Phone number" -#~ msgstr "手机号码" - #: src/view/com/modals/SelfLabel.tsx:121 msgid "Pictures meant for adults." msgstr "适合成年人的图像。" @@ -3397,7 +3075,7 @@ msgstr "固定到主页" #: src/view/screens/ProfileFeed.tsx:294 msgid "Pin to Home" -msgstr "" +msgstr "固定到主页" #: src/view/screens/SavedFeeds.tsx:88 msgid "Pinned Feeds" @@ -3436,10 +3114,6 @@ msgstr "更改前请先确认你的电子邮箱。这是新增电子邮箱更新 msgid "Please enter a name for your app password. All spaces is not allowed." msgstr "请输入应用专用密码的名称,不允许使用空格。" -#: src/view/com/auth/create/Step2.tsx:206 -#~ msgid "Please enter a phone number that can receive SMS text messages." -#~ msgstr "请输入可以接收短信的手机号码。" - #: src/view/com/modals/AddAppPasswords.tsx:145 msgid "Please enter a unique name for this App Password or use our randomly generated one." msgstr "请输入此应用专用密码的唯一名称,或使用我们提供的随机生成名称。" @@ -3448,14 +3122,6 @@ msgstr "请输入此应用专用密码的唯一名称,或使用我们提供的 msgid "Please enter a valid word, tag, or phrase to mute" msgstr "请输入一个有效的词、话题标签或短语" -#: src/view/com/auth/create/state.ts:170 -#~ msgid "Please enter the code you received by SMS." -#~ msgstr "请输入你收到的短信验证码。" - -#: src/view/com/auth/create/Step2.tsx:282 -#~ msgid "Please enter the verification code sent to {phoneNumberFormatted}." -#~ msgstr "请输入发送到 {phoneNumberFormatted} 的验证码。" - #: src/view/com/auth/create/state.ts:103 msgid "Please enter your email." msgstr "请输入你的电子邮箱。" @@ -3466,12 +3132,7 @@ msgstr "请输入你的密码:" #: src/components/moderation/LabelsOnMeDialog.tsx:222 msgid "Please explain why you think this label was incorrectly applied by {0}" -msgstr "" - -#: src/view/com/modals/AppealLabel.tsx:72 -#: src/view/com/modals/AppealLabel.tsx:75 -#~ msgid "Please tell us why you think this content warning was incorrectly applied!" -#~ msgstr "请告诉我们你认为此内容警告被错误设置的原因!" +msgstr "请解释为什么你认为此标记是由 {0} 错误应用的" #: src/view/com/modals/VerifyEmail.tsx:101 msgid "Please Verify Your Email" @@ -3491,7 +3152,7 @@ msgstr "色情内容" #: src/lib/moderation/useGlobalLabelStrings.ts:34 msgid "Pornography" -msgstr "" +msgstr "色情" #: src/view/com/composer/Composer.tsx:366 #: src/view/com/composer/Composer.tsx:374 @@ -3525,12 +3186,12 @@ msgstr "已隐藏帖子" #: src/components/moderation/ModerationDetailsDialog.tsx:98 #: src/lib/moderation/useModerationCauseDescription.ts:99 msgid "Post Hidden by Muted Word" -msgstr "" +msgstr "帖子被隐藏词所隐藏" #: src/components/moderation/ModerationDetailsDialog.tsx:101 #: src/lib/moderation/useModerationCauseDescription.ts:108 msgid "Post Hidden by You" -msgstr "" +msgstr "帖子由你隐藏" #: src/view/com/composer/select-language/SelectLangBtn.tsx:87 msgid "Post language" @@ -3567,7 +3228,7 @@ msgstr "潜在误导性链接" #: src/components/Lists.tsx:88 msgid "Press to retry" -msgstr "" +msgstr "点按重试" #: src/view/com/lightbox/Lightbox.web.tsx:150 msgid "Previous image" @@ -3601,7 +3262,7 @@ msgstr "处理中..." #: src/view/screens/DebugMod.tsx:888 #: src/view/screens/Profile.tsx:340 msgid "profile" -msgstr "" +msgstr "个人资料" #: src/view/shell/bottom-bar/BottomBar.tsx:251 #: src/view/shell/desktop/LeftNav.tsx:419 @@ -3663,7 +3324,7 @@ msgstr "比率" #: src/view/screens/Search/Search.tsx:776 msgid "Recent Searches" -msgstr "" +msgstr "最近的搜索" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:116 msgid "Recommended Feeds" @@ -3682,21 +3343,17 @@ msgstr "推荐的用户" msgid "Remove" msgstr "移除" -#: src/view/com/feeds/FeedSourceCard.tsx:108 -#~ msgid "Remove {0} from my feeds?" -#~ msgstr "将 {0} 从自定义信息流中移除?" - #: src/view/com/util/AccountDropdownBtn.tsx:22 msgid "Remove account" -msgstr "删除账号" +msgstr "删除账户" #: src/view/com/util/UserAvatar.tsx:358 msgid "Remove Avatar" -msgstr "" +msgstr "删除头像" #: src/view/com/util/UserBanner.tsx:148 msgid "Remove Banner" -msgstr "" +msgstr "删除横幅图片" #: src/view/com/posts/FeedErrorMessage.tsx:160 msgid "Remove feed" @@ -3704,7 +3361,7 @@ msgstr "删除信息流" #: src/view/com/posts/FeedErrorMessage.tsx:201 msgid "Remove feed?" -msgstr "" +msgstr "删除信息流?" #: src/view/com/feeds/FeedSourceCard.tsx:173 #: src/view/com/feeds/FeedSourceCard.tsx:233 @@ -3715,7 +3372,7 @@ msgstr "从自定义信息流中删除" #: src/view/com/feeds/FeedSourceCard.tsx:278 msgid "Remove from my feeds?" -msgstr "" +msgstr "从自定义信息流中删除?" #: src/view/com/composer/photos/Gallery.tsx:167 msgid "Remove image" @@ -3733,17 +3390,9 @@ msgstr "从你的隐藏词列表中删除" msgid "Remove repost" msgstr "删除转发" -#: src/view/com/feeds/FeedSourceCard.tsx:175 -#~ msgid "Remove this feed from my feeds?" -#~ msgstr "将这个信息流从自定义信息流列表中删除?" - #: src/view/com/posts/FeedErrorMessage.tsx:202 msgid "Remove this feed from your saved feeds" -msgstr "" - -#: src/view/com/posts/FeedErrorMessage.tsx:132 -#~ msgid "Remove this feed from your saved feeds?" -#~ msgstr "将这个信息流从保存的信息流列表中删除?" +msgstr "将这个信息流从保存的信息流列表中删除?" #: src/view/com/modals/ListAddRemoveUsers.tsx:199 #: src/view/com/modals/UserAddRemoveLists.tsx:152 @@ -3756,7 +3405,7 @@ msgstr "从自定义信息流中删除" #: src/view/screens/ProfileFeed.tsx:208 msgid "Removed from your feeds" -msgstr "" +msgstr "从你的自定义信息流中删除" #: src/view/com/composer/ExternalEmbed.tsx:71 msgid "Removes default thumbnail from {0}" @@ -3785,10 +3434,6 @@ msgctxt "description" msgid "Reply to <0/>" msgstr "回复 <0/>" -#: src/view/com/modals/report/Modal.tsx:166 -#~ msgid "Report {collectionName}" -#~ msgstr "举报 {collectionName}" - #: src/view/com/profile/ProfileMenu.tsx:319 #: src/view/com/profile/ProfileMenu.tsx:322 msgid "Report Account" @@ -3810,23 +3455,23 @@ msgstr "举报帖子" #: src/components/ReportDialog/SelectReportOptionView.tsx:43 msgid "Report this content" -msgstr "" +msgstr "举报此内容" #: src/components/ReportDialog/SelectReportOptionView.tsx:56 msgid "Report this feed" -msgstr "" +msgstr "举报此信息流" #: src/components/ReportDialog/SelectReportOptionView.tsx:53 msgid "Report this list" -msgstr "" +msgstr "举报此列表" #: src/components/ReportDialog/SelectReportOptionView.tsx:50 msgid "Report this post" -msgstr "" +msgstr "举报此帖子" #: src/components/ReportDialog/SelectReportOptionView.tsx:47 msgid "Report this user" -msgstr "" +msgstr "举报此用户" #: src/view/com/modals/Repost.tsx:43 #: src/view/com/modals/Repost.tsx:48 @@ -3870,10 +3515,6 @@ msgstr "转发这条帖子" msgid "Request Change" msgstr "请求变更" -#: src/view/com/auth/create/Step2.tsx:219 -#~ msgid "Request code" -#~ msgstr "请求码" - #: src/view/com/modals/ChangePassword.tsx:241 #: src/view/com/modals/ChangePassword.tsx:243 msgid "Request Code" @@ -3897,10 +3538,6 @@ msgstr "确认码" msgid "Reset Code" msgstr "确认码" -#: src/view/screens/Settings/index.tsx:824 -#~ msgid "Reset onboarding" -#~ msgstr "重置引导流程" - #: src/view/screens/Settings/index.tsx:858 #: src/view/screens/Settings/index.tsx:861 msgid "Reset onboarding state" @@ -3910,10 +3547,6 @@ msgstr "重置引导流程状态" msgid "Reset password" msgstr "重置密码" -#: src/view/screens/Settings/index.tsx:814 -#~ msgid "Reset preferences" -#~ msgstr "重置首选项" - #: src/view/screens/Settings/index.tsx:848 #: src/view/screens/Settings/index.tsx:851 msgid "Reset preferences state" @@ -3948,26 +3581,18 @@ msgstr "重试上次出错的操作" msgid "Retry" msgstr "重试" -#: src/view/com/auth/create/Step2.tsx:247 -#~ msgid "Retry." -#~ msgstr "重试。" - #: src/view/screens/ProfileList.tsx:917 msgid "Return to previous page" msgstr "回到上一页" #: src/view/screens/NotFound.tsx:59 msgid "Returns to home page" -msgstr "" +msgstr "回到主页" #: src/view/screens/NotFound.tsx:58 #: src/view/screens/ProfileFeed.tsx:112 msgid "Returns to previous page" -msgstr "" - -#: src/view/shell/desktop/RightNav.tsx:55 -#~ msgid "SANDBOX. Posts and accounts are not permanent." -#~ msgstr "沙盒模式。帖子和账户不会永久保存。" +msgstr "回到上一页" #: src/components/dialogs/BirthDateSettings.tsx:125 #: src/view/com/modals/ChangeHandle.tsx:173 @@ -3988,7 +3613,7 @@ msgstr "保存替代文字" #: src/components/dialogs/BirthDateSettings.tsx:119 msgid "Save birthday" -msgstr "" +msgstr "保存生日" #: src/view/com/modals/EditProfile.tsx:232 msgid "Save Changes" @@ -4005,7 +3630,7 @@ msgstr "保存图片裁切" #: src/view/screens/ProfileFeed.tsx:335 #: src/view/screens/ProfileFeed.tsx:341 msgid "Save to my feeds" -msgstr "" +msgstr "保存到自定义信息流" #: src/view/screens/SavedFeeds.tsx:122 msgid "Saved Feeds" @@ -4013,11 +3638,11 @@ msgstr "已保存信息流" #: src/view/com/lightbox/Lightbox.tsx:81 msgid "Saved to your camera roll." -msgstr "" +msgstr "已保存到相机胶卷" #: src/view/screens/ProfileFeed.tsx:212 msgid "Saved to your feeds" -msgstr "" +msgstr "已保存到你的自定义信息流" #: src/view/com/modals/EditProfile.tsx:225 msgid "Saves any changes to your profile" @@ -4029,7 +3654,7 @@ msgstr "保存用户识别符更改至 {handle}" #: src/view/com/modals/crop-image/CropImage.web.tsx:145 msgid "Saves image crop settings" -msgstr "" +msgstr "保存图片裁剪设置" #: src/screens/Onboarding/index.tsx:36 msgid "Science" @@ -4065,18 +3690,10 @@ msgstr "搜索 \"{query}\"" msgid "Search for all posts by @{authorHandle} with tag {displayTag}" msgstr "搜索 @{authorHandle} 带有 {displayTag} 的所有帖子" -#: src/components/TagMenu/index.tsx:145 -#~ msgid "Search for all posts by @{authorHandle} with tag {tag}" -#~ msgstr "搜索 @{authorHandle} 带有 {tag} 的所有帖子" - #: src/components/TagMenu/index.tsx:94 msgid "Search for all posts with tag {displayTag}" msgstr "搜索所有带有 {displayTag} 的帖子" -#: src/components/TagMenu/index.tsx:90 -#~ msgid "Search for all posts with tag {tag}" -#~ msgstr "搜索所有带有 {tag} 的帖子" - #: src/view/com/auth/LoggedOut.tsx:104 #: src/view/com/auth/LoggedOut.tsx:105 #: src/view/com/modals/ListAddRemoveUsers.tsx:70 @@ -4103,14 +3720,6 @@ msgstr "查看 <0>{displayTag} 的帖子" msgid "See <0>{displayTag} posts by this user" msgstr "查看该用户 <0>{displayTag} 的帖子" -#: src/components/TagMenu/index.tsx:128 -#~ msgid "See <0>{tag} posts" -#~ msgstr "查看 <0>{tag} 的帖子" - -#: src/components/TagMenu/index.tsx:189 -#~ msgid "See <0>{tag} posts by this user" -#~ msgstr "查看该用户 <0>{tag} 的帖子" - #: src/view/screens/SavedFeeds.tsx:163 msgid "See this guide" msgstr "查看指南" @@ -4123,21 +3732,17 @@ msgstr "查看下一步" msgid "Select {item}" msgstr "选择 {item}" -#: src/view/com/modals/ServerInput.tsx:75 -#~ msgid "Select Bluesky Social" -#~ msgstr "选择 Bluesky Social" - #: src/view/com/auth/login/Login.tsx:117 msgid "Select from an existing account" msgstr "从现有账户中选择" #: src/view/screens/LanguageSettings.tsx:299 msgid "Select languages" -msgstr "" +msgstr "选择语言" #: src/components/ReportDialog/SelectLabelerView.tsx:32 msgid "Select moderator" -msgstr "" +msgstr "选择限制者" #: src/view/com/util/Selector.tsx:107 msgid "Select option {i} of {numItems}" @@ -4154,7 +3759,7 @@ msgstr "选择以下一些账户进行关注" #: src/components/ReportDialog/SubmitView.tsx:135 msgid "Select the moderation service(s) to report to" -msgstr "" +msgstr "你要将该条举报提交给哪位限制服务提供者?" #: src/view/com/auth/server-input/index.tsx:82 msgid "Select the service that hosts your data." @@ -4172,22 +3777,14 @@ msgstr "选择你想看到(或不想看到)的内容,剩下的由我们来 msgid "Select which languages you want your subscribed feeds to include. If none are selected, all languages will be shown." msgstr "选择你希望订阅信息流中所包含的语言。如果未选择任何语言,将默认显示所有语言。" -#: src/view/screens/LanguageSettings.tsx:98 -#~ msgid "Select your app language for the default text to display in the app" -#~ msgstr "选择应用中显示默认文本的语言" - #: src/view/screens/LanguageSettings.tsx:98 msgid "Select your app language for the default text to display in the app." -msgstr "" +msgstr "选择你的应用语言,以显示应用中的默认文本。" #: src/screens/Onboarding/StepInterests/index.tsx:196 msgid "Select your interests from the options below" msgstr "下面选择你感兴趣的选项" -#: src/view/com/auth/create/Step2.tsx:155 -#~ msgid "Select your phone's country" -#~ msgstr "选择你的电话区号" - #: src/view/screens/LanguageSettings.tsx:190 msgid "Select your preferred language for translations in your feed." msgstr "选择你在订阅信息流中希望进行翻译的目标首选语言。" @@ -4222,15 +3819,11 @@ msgstr "提交反馈" #: src/components/ReportDialog/SubmitView.tsx:214 #: src/components/ReportDialog/SubmitView.tsx:218 msgid "Send report" -msgstr "" - -#: src/view/com/modals/report/SendReportButton.tsx:45 -#~ msgid "Send Report" -#~ msgstr "提交举报" +msgstr "提交举报" #: src/components/ReportDialog/SelectLabelerView.tsx:46 msgid "Send report to {0}" -msgstr "" +msgstr "给 {0} 提交举报" #: src/view/com/modals/DeleteAccount.tsx:133 msgid "Sends email with confirmation code for account deletion" @@ -4240,39 +3833,9 @@ msgstr "发送包含账户删除验证码的电子邮件" msgid "Server address" msgstr "服务器地址" -#: src/view/com/modals/ContentFilteringSettings.tsx:311 -#~ msgid "Set {value} for {labelGroup} content moderation policy" -#~ msgstr "为 {labelGroup} 内容审核政策设置 {value}" - -#: src/view/com/modals/ContentFilteringSettings.tsx:160 -#: src/view/com/modals/ContentFilteringSettings.tsx:179 -#~ msgctxt "action" -#~ msgid "Set Age" -#~ msgstr "设置年龄" - #: src/screens/Moderation/index.tsx:306 msgid "Set birthdate" -msgstr "" - -#: src/view/screens/Settings/index.tsx:488 -#~ msgid "Set color theme to dark" -#~ msgstr "设置主题为深色模式" - -#: src/view/screens/Settings/index.tsx:481 -#~ msgid "Set color theme to light" -#~ msgstr "设置主题为亮色模式" - -#: src/view/screens/Settings/index.tsx:475 -#~ msgid "Set color theme to system setting" -#~ msgstr "设置主题跟随系统设置" - -#: src/view/screens/Settings/index.tsx:514 -#~ msgid "Set dark theme to the dark theme" -#~ msgstr "设置深色模式至深黑" - -#: src/view/screens/Settings/index.tsx:507 -#~ msgid "Set dark theme to the dim theme" -#~ msgstr "设置深色模式至暗淡" +msgstr "设置生日" #: src/view/com/auth/login/SetNewPasswordForm.tsx:104 msgid "Set new password" @@ -4298,10 +3861,6 @@ msgstr "停用此设置项以隐藏来自订阅信息流的所有转发。" msgid "Set this setting to \"Yes\" to show replies in a threaded view. This is an experimental feature." msgstr "启用此设置项以在分层视图中显示回复。这是一个实验性功能。" -#: src/view/screens/PreferencesHomeFeed.tsx:261 -#~ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your following feed. This is an experimental feature." -#~ msgstr "启用此设置项以在关注信息流中显示已保存信息流的样例。这是一个实验性功能。" - #: src/view/screens/PreferencesFollowingFeed.tsx:261 msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your Following feed. This is an experimental feature." msgstr "启用此设置项以在关注信息流中显示已保存信息流的样例。这是一个实验性功能。" @@ -4316,23 +3875,23 @@ msgstr "设置 Bluesky 用户名" #: src/view/screens/Settings/index.tsx:507 msgid "Sets color theme to dark" -msgstr "" +msgstr "设置主题为深色模式" #: src/view/screens/Settings/index.tsx:500 msgid "Sets color theme to light" -msgstr "" +msgstr "设置主题为亮色模式" #: src/view/screens/Settings/index.tsx:494 msgid "Sets color theme to system setting" -msgstr "" +msgstr "设置主题跟随系统设置" #: src/view/screens/Settings/index.tsx:533 msgid "Sets dark theme to the dark theme" -msgstr "" +msgstr "设置深色模式至深黑" #: src/view/screens/Settings/index.tsx:526 msgid "Sets dark theme to the dim theme" -msgstr "" +msgstr "设置深色模式至暗淡" #: src/view/com/auth/login/ForgotPasswordForm.tsx:157 msgid "Sets email for password reset" @@ -4344,15 +3903,15 @@ msgstr "设置用于密码重置的托管提供商信息" #: src/view/com/modals/crop-image/CropImage.web.tsx:123 msgid "Sets image aspect ratio to square" -msgstr "" +msgstr "将图片纵横比设置为正方形" #: src/view/com/modals/crop-image/CropImage.web.tsx:113 msgid "Sets image aspect ratio to tall" -msgstr "" +msgstr "将图片纵横比设置为高" #: src/view/com/modals/crop-image/CropImage.web.tsx:103 msgid "Sets image aspect ratio to wide" -msgstr "" +msgstr "将图片纵横比设置为宽" #: src/view/com/auth/create/Step1.tsx:97 #: src/view/com/auth/login/LoginForm.tsx:154 @@ -4373,7 +3932,7 @@ msgstr "性行为或性暗示裸露。" #: src/lib/moderation/useGlobalLabelStrings.ts:38 msgid "Sexually Suggestive" -msgstr "" +msgstr "性暗示" #: src/view/com/lightbox/Lightbox.tsx:141 msgctxt "action" @@ -4392,7 +3951,7 @@ msgstr "分享" #: src/view/com/profile/ProfileMenu.tsx:373 #: src/view/com/util/forms/PostDropdownBtn.tsx:347 msgid "Share anyway" -msgstr "" +msgstr "仍然分享" #: src/view/screens/ProfileFeed.tsx:361 #: src/view/screens/ProfileFeed.tsx:363 @@ -4419,11 +3978,11 @@ msgstr "仍然显示" #: src/lib/moderation/useLabelBehaviorDescription.ts:27 #: src/lib/moderation/useLabelBehaviorDescription.ts:63 msgid "Show badge" -msgstr "" +msgstr "显示徽章" #: src/lib/moderation/useLabelBehaviorDescription.ts:61 msgid "Show badge and filter from feeds" -msgstr "" +msgstr "显示徽章并从信息流中过滤" #: src/view/com/modals/EmbedConsent.tsx:87 msgid "Show embeds from {0}" @@ -4498,15 +4057,11 @@ msgstr "显示用户" #: src/lib/moderation/useLabelBehaviorDescription.ts:58 msgid "Show warning" -msgstr "" +msgstr "显示警告" #: src/lib/moderation/useLabelBehaviorDescription.ts:56 msgid "Show warning and filter from feeds" -msgstr "" - -#: src/view/com/profile/ProfileHeader.tsx:462 -#~ msgid "Shows a list of users similar to this user." -#~ msgstr "显示与该用户相似的用户列表。" +msgstr "显示警告并从信息流中过滤" #: src/view/com/post-thread/PostThreadFollowBtn.tsx:127 msgid "Shows posts from {0} in your feed" @@ -4596,31 +4151,15 @@ msgstr "跳过" msgid "Skip this flow" msgstr "跳过此流程" -#: src/view/com/auth/create/Step2.tsx:82 -#~ msgid "SMS verification" -#~ msgstr "短信验证" - #: src/screens/Onboarding/index.tsx:40 msgid "Software Dev" msgstr "程序开发" -#: src/view/com/modals/ProfilePreview.tsx:62 -#~ msgid "Something went wrong and we're not sure what." -#~ msgstr "出了点问题,原因不明。" - #: src/components/ReportDialog/index.tsx:52 #: src/screens/Moderation/index.tsx:116 #: src/screens/Profile/Sections/Labels.tsx:77 msgid "Something went wrong, please try again." -msgstr "" - -#: src/components/Lists.tsx:203 -#~ msgid "Something went wrong!" -#~ msgstr "出了点问题!" - -#: src/view/com/modals/Waitlist.tsx:51 -#~ msgid "Something went wrong. Check your email and try again." -#~ msgstr "出了点问题,请检查你的电子邮箱并重试。" +msgstr "出了点问题,请重试。" #: src/App.native.tsx:71 msgid "Sorry! Your session expired. Please log in again." @@ -4636,15 +4175,15 @@ msgstr "对同一帖子的回复进行排序:" #: src/components/moderation/LabelsOnMeDialog.tsx:147 msgid "Source:" -msgstr "" +msgstr "来源:" #: src/lib/moderation/useReportOptions.ts:65 msgid "Spam" -msgstr "" +msgstr "垃圾内容" #: src/lib/moderation/useReportOptions.ts:53 msgid "Spam; excessive mentions or replies" -msgstr "" +msgstr "垃圾内容;过多的提及或回复" #: src/screens/Onboarding/index.tsx:30 msgid "Sports" @@ -4654,10 +4193,6 @@ msgstr "运动" msgid "Square" msgstr "方块" -#: src/view/com/modals/ServerInput.tsx:62 -#~ msgid "Staging" -#~ msgstr "暂存" - #: src/view/screens/Settings/index.tsx:905 msgid "Status page" msgstr "状态页" @@ -4686,11 +4221,11 @@ msgstr "订阅" #: src/screens/Profile/Sections/Labels.tsx:181 msgid "Subscribe to @{0} to use these labels:" -msgstr "" +msgstr "订阅 @{0} 以使用这些标记:" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:222 msgid "Subscribe to Labeler" -msgstr "" +msgstr "订阅标记者" #: src/screens/Onboarding/StepAlgoFeeds/FeedCard.tsx:173 #: src/screens/Onboarding/StepAlgoFeeds/FeedCard.tsx:308 @@ -4699,7 +4234,7 @@ msgstr "订阅 {0} 信息流" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:185 msgid "Subscribe to this labeler" -msgstr "" +msgstr "订阅这个标记者" #: src/view/screens/ProfileList.tsx:586 msgid "Subscribe to this list" @@ -4723,10 +4258,6 @@ msgstr "建议" msgid "Support" msgstr "支持" -#: src/view/com/modals/ProfilePreview.tsx:110 -#~ msgid "Swipe up to see more" -#~ msgstr "向上滑动查看更多" - #: src/view/com/modals/SwitchAccount.tsx:123 msgid "Switch Account" msgstr "切换账户" @@ -4757,10 +4288,6 @@ msgstr "话题标签" msgid "Tag menu: {displayTag}" msgstr "话题标签菜单:{displayTag}" -#: src/components/TagMenu/index.tsx:74 -#~ msgid "Tag menu: {tag}" -#~ msgstr "话题标签菜单:{tag}" - #: src/view/com/modals/crop-image/CropImage.web.tsx:112 msgid "Tall" msgstr "高" @@ -4789,7 +4316,7 @@ msgstr "服务条款" #: src/lib/moderation/useReportOptions.ts:79 #: src/lib/moderation/useReportOptions.ts:87 msgid "Terms used violate community standards" -msgstr "" +msgstr "用词违反了社群准则" #: src/components/dialogs/MutedWords.tsx:324 msgid "text" @@ -4801,11 +4328,11 @@ msgstr "文本输入框" #: src/components/ReportDialog/SubmitView.tsx:78 msgid "Thank you. Your report has been sent." -msgstr "" +msgstr "谢谢,你的举报已提交。" #: src/view/com/modals/ChangeHandle.tsx:466 msgid "That contains the following:" -msgstr "" +msgstr "其中包含以下内容:" #: src/view/com/auth/create/CreateAccount.tsx:94 msgid "That handle is already taken." @@ -4818,7 +4345,7 @@ msgstr "解除屏蔽后,该账户将能够与你互动。" #: src/components/moderation/ModerationDetailsDialog.tsx:128 msgid "the author" -msgstr "" +msgstr "作者" #: src/view/screens/CommunityGuidelines.tsx:36 msgid "The Community Guidelines have been moved to <0/>" @@ -4830,11 +4357,11 @@ msgstr "版权许可已迁移至 <0/>" #: src/components/moderation/LabelsOnMeDialog.tsx:49 msgid "The following labels were applied to your account." -msgstr "" +msgstr "以下标记已应用到你的账户。" #: src/components/moderation/LabelsOnMeDialog.tsx:50 msgid "The following labels were applied to your content." -msgstr "" +msgstr "以下标记已应用到你的内容。" #: src/screens/Onboarding/Layout.tsx:60 msgid "The following steps will help customize your Bluesky experience." @@ -4908,7 +4435,7 @@ msgstr "刷新列表时出现问题,点击重试。" #: src/components/ReportDialog/SubmitView.tsx:83 msgid "There was an issue sending your report. Please check your internet connection." -msgstr "" +msgstr "提交举报时出现问题,请检查你的网络连接。" #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:65 msgid "There was an issue syncing your preferences with the server" @@ -4947,13 +4474,9 @@ msgstr "应用发生意外错误,请联系我们进行错误反馈!" msgid "There's been a rush of new users to Bluesky! We'll activate your account as soon as we can." msgstr "Bluesky 迎来了大量新用户!我们将尽快激活你的账户。" -#: src/view/com/auth/create/Step2.tsx:55 -#~ msgid "There's something wrong with this number. Please choose your country and enter your full phone number!" -#~ msgstr "电话号码有误,请选择电话区号并输入完整的电话号码!" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:138 msgid "These are popular accounts you might like:" -msgstr "这里是一些受欢迎的账号,你可能会喜欢:" +msgstr "这里是一些受欢迎的账户,你可能会喜欢:" #: src/components/moderation/ScreenHider.tsx:117 msgid "This {screenDescription} has been flagged:" @@ -4961,19 +4484,19 @@ msgstr "{screenDescription} 已被标记:" #: src/components/moderation/ScreenHider.tsx:112 msgid "This account has requested that users sign in to view their profile." -msgstr "此账号要求用户登录后才能查看其个人资料。" +msgstr "此账户要求用户登录后才能查看其个人资料。" #: src/components/moderation/LabelsOnMeDialog.tsx:205 msgid "This appeal will be sent to <0>{0}." -msgstr "" +msgstr "此申诉将发送至 <0>{0}。" #: src/lib/moderation/useGlobalLabelStrings.ts:19 msgid "This content has been hidden by the moderators." -msgstr "" +msgstr "此内容已被限制者隐藏。" #: src/lib/moderation/useGlobalLabelStrings.ts:24 msgid "This content has received a general warning from moderators." -msgstr "" +msgstr "此内容已受到限制者设置的一般警告。" #: src/view/com/modals/EmbedConsent.tsx:68 msgid "This content is hosted by {0}. Do you want to enable external media?" @@ -4988,13 +4511,9 @@ msgstr "由于其中一个用户屏蔽了另一个用户,此内容不可用。 msgid "This content is not viewable without a Bluesky account." msgstr "没有 Bluesky 账户,无法查看此内容。" -#: src/view/screens/Settings/ExportCarDialog.tsx:75 -#~ msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." -#~ msgstr "该功能正在测试。你可以在<0>这篇博客文章中获得关于导出数据的更多信息。" - #: src/view/screens/Settings/ExportCarDialog.tsx:75 msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." -msgstr "" +msgstr "该功能正在测试,你可以在<0>这篇博客文章中获得关于导出数据的更多信息。" #: src/view/com/posts/FeedErrorMessage.tsx:114 msgid "This feed is currently receiving high traffic and is temporarily unavailable. Please try again later." @@ -5020,11 +4539,11 @@ msgstr "这很重要,以防你将来需要更改电子邮箱或重置密码。 #: src/components/moderation/ModerationDetailsDialog.tsx:125 msgid "This label was applied by {0}." -msgstr "" +msgstr "此标记由 {0} 应用。" #: src/screens/Profile/Sections/Labels.tsx:168 msgid "This labeler hasn't declared what labels it publishes, and may not be active." -msgstr "" +msgstr "此标记者尚未声明他发布的标记,并且可能处于非活跃状态。" #: src/view/com/modals/LinkWarning.tsx:58 msgid "This link is taking you to the following website:" @@ -5036,7 +4555,7 @@ msgstr "此列表为空!" #: src/screens/Profile/ErrorState.tsx:40 msgid "This moderation service is unavailable. See below for more details. If this issue persists, contact us." -msgstr "" +msgstr "此限制提供服务不可用,请查看下方获取更多详情。如果问题持续存在,请联系我们。" #: src/view/com/modals/AddAppPasswords.tsx:106 msgid "This name is already in use" @@ -5048,27 +4567,27 @@ msgstr "此帖子已被删除。" #: src/view/com/util/forms/PostDropdownBtn.tsx:344 msgid "This post is only visible to logged-in users. It won't be visible to people who aren't logged in." -msgstr "" +msgstr "此帖子只对已登录用户可见,未登录的用户将无法看到。" #: src/view/com/util/forms/PostDropdownBtn.tsx:326 msgid "This post will be hidden from feeds." -msgstr "" +msgstr "此帖子将从信息流中隐藏。" #: src/view/com/profile/ProfileMenu.tsx:370 msgid "This profile is only visible to logged-in users. It won't be visible to people who aren't logged in." -msgstr "" +msgstr "此个人资料只对已登录用户可见,未登录的用户将无法看到。" #: src/view/com/auth/create/Policies.tsx:46 msgid "This service has not provided terms of service or a privacy policy." -msgstr "" +msgstr "此服务没有提供服务条款或隐私政策。" #: src/view/com/modals/ChangeHandle.tsx:446 msgid "This should create a domain record at:" -msgstr "" +msgstr "应该在以下位置创建一个域名记录:" #: src/view/com/profile/ProfileFollowers.tsx:95 msgid "This user doesn't have any followers." -msgstr "" +msgstr "此用户目前没有任何关注者。" #: src/components/moderation/ModerationDetailsDialog.tsx:73 #: src/lib/moderation/useModerationCauseDescription.ts:68 @@ -5077,31 +4596,19 @@ msgstr "此用户已将你屏蔽,你将无法看到他所发布的内容。" #: src/lib/moderation/useGlobalLabelStrings.ts:30 msgid "This user has requested that their content only be shown to signed-in users." -msgstr "" - -#: src/view/com/modals/ModerationDetails.tsx:42 -#~ msgid "This user is included in the <0/> list which you have blocked." -#~ msgstr "此用户包含在你已屏蔽的 <0/> 列表中。" - -#: src/view/com/modals/ModerationDetails.tsx:74 -#~ msgid "This user is included in the <0/> list which you have muted." -#~ msgstr "此用户包含在你已隐藏的 <0/> 列表中。" +msgstr "此用户要求其发布内容仅对已登录用户可见。" #: src/components/moderation/ModerationDetailsDialog.tsx:56 msgid "This user is included in the <0>{0} list which you have blocked." -msgstr "" +msgstr "此用户包含在你已屏蔽的 <0>{0} 列表中。" #: src/components/moderation/ModerationDetailsDialog.tsx:85 msgid "This user is included in the <0>{0} list which you have muted." -msgstr "" - -#: src/view/com/modals/ModerationDetails.tsx:74 -#~ msgid "This user is included the <0/> list which you have muted." -#~ msgstr "此用户包含在你已隐藏的 <0/> 列表中。" +msgstr "此用户包含在你已隐藏的 <0>{0} 列表中。" #: src/view/com/profile/ProfileFollows.tsx:94 msgid "This user isn't following anyone." -msgstr "" +msgstr "此账户目前没有关注任何人。" #: src/view/com/modals/SelfLabel.tsx:137 msgid "This warning is only available for posts with media attached." @@ -5111,13 +4618,9 @@ msgstr "此警告仅适用于附带媒体的帖子。" msgid "This will delete {0} from your muted words. You can always add it back later." msgstr "这将从你的隐藏词中删除 {0}。你随时可以重新添加。" -#: src/view/com/util/forms/PostDropdownBtn.tsx:282 -#~ msgid "This will hide this post from your feeds." -#~ msgstr "这将在你的信息流中隐藏此帖子。" - #: src/view/screens/Settings/index.tsx:574 msgid "Thread preferences" -msgstr "" +msgstr "讨论串首选项" #: src/view/screens/PreferencesThreads.tsx:53 #: src/view/screens/Settings/index.tsx:584 @@ -5134,7 +4637,7 @@ msgstr "讨论串首选项" #: src/components/ReportDialog/SelectLabelerView.tsx:35 msgid "To whom would you like to send this report?" -msgstr "" +msgstr "你想将举报提交给谁?" #: src/components/dialogs/MutedWords.tsx:113 msgid "Toggle between muted word options." @@ -5146,7 +4649,7 @@ msgstr "切换下拉式菜单" #: src/screens/Moderation/index.tsx:334 msgid "Toggle to enable or disable adult content" -msgstr "" +msgstr "切换以启用或禁用成人内容" #: src/view/com/modals/EditImage.tsx:271 msgid "Transformations" @@ -5166,7 +4669,7 @@ msgstr "重试" #: src/view/com/modals/ChangeHandle.tsx:429 msgid "Type:" -msgstr "" +msgstr "类型:" #: src/view/screens/ProfileList.tsx:478 msgid "Un-block list" @@ -5199,12 +4702,12 @@ msgstr "取消屏蔽" #: src/view/com/profile/ProfileMenu.tsx:299 #: src/view/com/profile/ProfileMenu.tsx:305 msgid "Unblock Account" -msgstr "取消屏蔽" +msgstr "取消屏蔽账户" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:272 #: src/view/com/profile/ProfileMenu.tsx:343 msgid "Unblock Account?" -msgstr "" +msgstr "取消屏蔽账户?" #: src/view/com/modals/Repost.tsx:42 #: src/view/com/modals/Repost.tsx:55 @@ -5216,7 +4719,7 @@ msgstr "取消转发" #: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:141 #: src/view/com/profile/ProfileHeaderSuggestedFollows.tsx:246 msgid "Unfollow" -msgstr "" +msgstr "取消关注" #: src/view/com/profile/FollowButton.tsx:60 msgctxt "action" @@ -5230,7 +4733,7 @@ msgstr "取消关注 {0}" #: src/view/com/profile/ProfileMenu.tsx:241 #: src/view/com/profile/ProfileMenu.tsx:251 msgid "Unfollow Account" -msgstr "" +msgstr "取消关注账户" #: src/view/com/auth/create/state.ts:262 msgid "Unfortunately, you do not meet the requirements to create an account." @@ -5242,7 +4745,7 @@ msgstr "取消喜欢" #: src/view/screens/ProfileFeed.tsx:572 msgid "Unlike this feed" -msgstr "" +msgstr "取消喜欢这个信息流" #: src/components/TagMenu/index.tsx:249 #: src/view/screens/ProfileList.tsx:579 @@ -5262,10 +4765,6 @@ msgstr "取消隐藏账户" msgid "Unmute all {displayTag} posts" msgstr "取消隐藏所有 {displayTag} 帖子" -#: src/components/TagMenu/index.tsx:210 -#~ msgid "Unmute all {tag} posts" -#~ msgstr "" - #: src/view/com/util/forms/PostDropdownBtn.tsx:251 #: src/view/com/util/forms/PostDropdownBtn.tsx:256 msgid "Unmute thread" @@ -5278,39 +4777,31 @@ msgstr "取消固定" #: src/view/screens/ProfileFeed.tsx:291 msgid "Unpin from home" -msgstr "" +msgstr "从主页取消固定" #: src/view/screens/ProfileList.tsx:444 msgid "Unpin moderation list" msgstr "取消固定限制列表" -#: src/view/screens/ProfileFeed.tsx:346 -#~ msgid "Unsave" -#~ msgstr "取消保存" - #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:220 msgid "Unsubscribe" -msgstr "" +msgstr "取消订阅" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:184 msgid "Unsubscribe from this labeler" -msgstr "" +msgstr "取消订阅此标记者" #: src/lib/moderation/useReportOptions.ts:70 msgid "Unwanted Sexual Content" -msgstr "" +msgstr "不受欢迎的性内容" #: src/view/com/modals/UserAddRemoveLists.tsx:70 msgid "Update {displayName} in Lists" msgstr "更新列表中的 {displayName}" -#: src/lib/hooks/useOTAUpdate.ts:15 -#~ msgid "Update Available" -#~ msgstr "更新可用" - #: src/view/com/modals/ChangeHandle.tsx:509 msgid "Update to {handle}" -msgstr "" +msgstr "更新至 {handle}" #: src/view/com/auth/login/SetNewPasswordForm.tsx:204 msgid "Updating..." @@ -5325,23 +4816,23 @@ msgstr "将文本文件上传至:" #: src/view/com/util/UserBanner.tsx:116 #: src/view/com/util/UserBanner.tsx:119 msgid "Upload from Camera" -msgstr "" +msgstr "从相机上传" #: src/view/com/util/UserAvatar.tsx:343 #: src/view/com/util/UserBanner.tsx:133 msgid "Upload from Files" -msgstr "" +msgstr "从文件上传" #: src/view/com/util/UserAvatar.tsx:337 #: src/view/com/util/UserAvatar.tsx:341 #: src/view/com/util/UserBanner.tsx:127 #: src/view/com/util/UserBanner.tsx:131 msgid "Upload from Library" -msgstr "" +msgstr "从媒体库上传" #: src/view/com/modals/ChangeHandle.tsx:409 msgid "Use a file on your server" -msgstr "" +msgstr "使用你服务器上的文件" #: src/view/screens/AppPasswords.tsx:197 msgid "Use app passwords to login to other Bluesky clients without giving full access to your account or password." @@ -5349,7 +4840,7 @@ msgstr "使用应用专用密码登录到其他 Bluesky 客户端,而无需对 #: src/view/com/modals/ChangeHandle.tsx:518 msgid "Use bsky.social as hosting provider" -msgstr "" +msgstr "使用 bsky.social 作为域名提供商" #: src/view/com/modals/ChangeHandle.tsx:517 msgid "Use default provider" @@ -5367,16 +4858,12 @@ msgstr "使用系统默认浏览器" #: src/view/com/modals/ChangeHandle.tsx:401 msgid "Use the DNS panel" -msgstr "" +msgstr "使用 DNS 面板" #: src/view/com/modals/AddAppPasswords.tsx:155 msgid "Use this to sign into the other app along with your handle." msgstr "使用这个和你的用户识别符一起登录其他应用。" -#: src/view/com/modals/ServerInput.tsx:105 -#~ msgid "Use your domain as your Bluesky client service provider" -#~ msgstr "使用你的域名作为 Bluesky 客户端的服务提供方" - #: src/view/com/modals/InviteCodes.tsx:200 msgid "Used by:" msgstr "使用者:" @@ -5388,7 +4875,7 @@ msgstr "用户被屏蔽" #: src/lib/moderation/useModerationCauseDescription.ts:48 msgid "User Blocked by \"{0}\"" -msgstr "" +msgstr "用户被 \"{0}\" 屏蔽" #: src/components/moderation/ModerationDetailsDialog.tsx:54 msgid "User Blocked by List" @@ -5396,7 +4883,7 @@ msgstr "用户被列表屏蔽" #: src/lib/moderation/useModerationCauseDescription.ts:66 msgid "User Blocking You" -msgstr "" +msgstr "用户屏蔽了你" #: src/components/moderation/ModerationDetailsDialog.tsx:71 msgid "User Blocks You" @@ -5452,19 +4939,15 @@ msgstr "\"{0}\"中的用户" #: src/components/LikesDialog.tsx:85 msgid "Users that have liked this content or profile" -msgstr "" +msgstr "已喜欢此内容或个人资料的账户" #: src/view/com/modals/ChangeHandle.tsx:437 msgid "Value:" -msgstr "" - -#: src/view/com/auth/create/Step2.tsx:243 -#~ msgid "Verification code" -#~ msgstr "验证码" +msgstr "值:" #: src/view/com/modals/ChangeHandle.tsx:510 msgid "Verify {0}" -msgstr "" +msgstr "验证 {0}" #: src/view/screens/Settings/index.tsx:944 msgid "Verify email" @@ -5501,11 +4984,11 @@ msgstr "查看调试入口" #: src/components/ReportDialog/SelectReportOptionView.tsx:133 msgid "View details" -msgstr "" +msgstr "查看详情" #: src/components/ReportDialog/SelectReportOptionView.tsx:128 msgid "View details for reporting a copyright violation" -msgstr "" +msgstr "查看举报版权侵权的详情" #: src/view/com/posts/FeedSlice.tsx:99 msgid "View full thread" @@ -5513,7 +4996,7 @@ msgstr "查看整个讨论串" #: src/components/moderation/LabelsOnMe.tsx:51 msgid "View information about these labels" -msgstr "" +msgstr "查看此标记的详情" #: src/view/com/posts/FeedErrorMessage.tsx:166 msgid "View profile" @@ -5525,11 +5008,11 @@ msgstr "查看头像" #: src/components/LabelingServiceCard/index.tsx:140 msgid "View the labeling service provided by @{0}" -msgstr "" +msgstr "查看 @{0} 提供的标记服务。" #: src/view/screens/ProfileFeed.tsx:584 msgid "View users who like this feed" -msgstr "" +msgstr "查看此信息流被谁喜欢" #: src/view/com/modals/LinkWarning.tsx:75 #: src/view/com/modals/LinkWarning.tsx:77 @@ -5545,11 +5028,11 @@ msgstr "警告" #: src/lib/moderation/useLabelBehaviorDescription.ts:48 msgid "Warn content" -msgstr "" +msgstr "警告内容" #: src/lib/moderation/useLabelBehaviorDescription.ts:46 msgid "Warn content and filter from feeds" -msgstr "" +msgstr "警告内容并从信息流中过滤" #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:134 msgid "We also think you'll like \"For You\" by Skygaze:" @@ -5573,7 +5056,7 @@ msgstr "我们已经看完了你关注的帖子。这是来自 <0/> 的最新消 #: src/components/dialogs/MutedWords.tsx:204 msgid "We recommend avoiding common words that appear in many posts, since it can result in no posts being shown." -msgstr "不建议您使用会出现在许多帖子中的常见词汇,这可能导致你的时间线上没有帖子可显示。" +msgstr "不建议你使用会出现在许多帖子中的常见词汇,这可能导致你的时间线上没有帖子可显示。" #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:124 msgid "We recommend our \"Discover\" feed:" @@ -5581,11 +5064,11 @@ msgstr "我们推荐我们的 \"Discover\" 信息流:" #: src/components/dialogs/BirthDateSettings.tsx:52 msgid "We were unable to load your birth date preferences. Please try again." -msgstr "" +msgstr "我们无法加载你的生日首选项,请重试。" #: src/screens/Moderation/index.tsx:387 msgid "We were unable to load your configured labelers at this time." -msgstr "" +msgstr "我们暂时无法记载你已配置的标记者。" #: src/screens/Onboarding/StepInterests/index.tsx:133 msgid "We weren't able to connect. Please try again to continue setting up your account. If it continues to fail, you can skip this flow." @@ -5595,10 +5078,6 @@ msgstr "我们无法连接到互联网,请重试以继续设置你的账户。 msgid "We will let you know when your account is ready." msgstr "我们会在你的账户准备好时通知你。" -#: src/view/com/modals/AppealLabel.tsx:48 -#~ msgid "We'll look into your appeal promptly." -#~ msgstr "我们将迅速审查你的申诉。" - #: src/screens/Onboarding/StepInterests/index.tsx:138 msgid "We'll use this to help customize your experience." msgstr "我们将使用这些信息来帮助定制你的体验。" @@ -5626,7 +5105,7 @@ msgstr "很抱歉!我们找不到你正在寻找的页面。" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:319 msgid "We're sorry! You can only subscribe to ten labelers, and you've reached your limit of ten." -msgstr "" +msgstr "很抱歉!你目前只能订阅 10 个标记者,你已达到 10 个的限制。" #: src/view/com/auth/onboarding/WelcomeMobile.tsx:48 msgid "Welcome to <0>Bluesky" @@ -5636,10 +5115,6 @@ msgstr "欢迎来到 <0>Bluesky" msgid "What are your interests?" msgstr "你感兴趣的是什么?" -#: src/view/com/modals/report/Modal.tsx:169 -#~ msgid "What is the issue with this {collectionName}?" -#~ msgstr "这个 {collectionName} 有什么问题?" - #: src/view/com/auth/SplashScreen.tsx:59 #: src/view/com/composer/Composer.tsx:295 msgid "What's up?" @@ -5660,23 +5135,23 @@ msgstr "谁可以回复" #: src/components/ReportDialog/SelectReportOptionView.tsx:44 msgid "Why should this content be reviewed?" -msgstr "" +msgstr "为什么应该审核此内容?" #: src/components/ReportDialog/SelectReportOptionView.tsx:57 msgid "Why should this feed be reviewed?" -msgstr "" +msgstr "为什么应该审核此信息流?" #: src/components/ReportDialog/SelectReportOptionView.tsx:54 msgid "Why should this list be reviewed?" -msgstr "" +msgstr "为什么应该审核此列表?" #: src/components/ReportDialog/SelectReportOptionView.tsx:51 msgid "Why should this post be reviewed?" -msgstr "" +msgstr "为什么应该审核此帖子?" #: src/components/ReportDialog/SelectReportOptionView.tsx:48 msgid "Why should this user be reviewed?" -msgstr "" +msgstr "为什么应该审核此用户?" #: src/view/com/modals/crop-image/CropImage.web.tsx:102 msgid "Wide" @@ -5695,10 +5170,6 @@ msgstr "撰写你的回复" msgid "Writers" msgstr "作家" -#: src/view/com/auth/create/Step2.tsx:263 -#~ msgid "XXXXXX" -#~ msgstr "XXXXXX" - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:77 #: src/view/screens/PreferencesFollowingFeed.tsx:129 #: src/view/screens/PreferencesFollowingFeed.tsx:201 @@ -5715,7 +5186,7 @@ msgstr "轮到你了。" #: src/view/com/profile/ProfileFollows.tsx:93 msgid "You are not following anyone." -msgstr "" +msgstr "你没有关注任何账户。" #: src/view/com/posts/FollowingEmptyState.tsx:67 #: src/view/com/posts/FollowingEndOfFeed.tsx:68 @@ -5733,7 +5204,7 @@ msgstr "你现在可以使用新密码登录。" #: src/view/com/profile/ProfileFollowers.tsx:94 msgid "You do not have any followers." -msgstr "" +msgstr "你目前还没有任何关注者。" #: src/view/com/modals/InviteCodes.tsx:66 msgid "You don't have any invite codes yet! We'll send you some when you've been on Bluesky for a little longer." @@ -5770,24 +5241,20 @@ msgstr "你输入的确认码无效。它应该长得像这样 XXXXX-XXXXX。" #: src/lib/moderation/useModerationCauseDescription.ts:109 msgid "You have hidden this post" -msgstr "" +msgstr "你已隐藏此帖子" #: src/components/moderation/ModerationDetailsDialog.tsx:102 msgid "You have hidden this post." -msgstr "" +msgstr "你已隐藏此帖子。" #: src/components/moderation/ModerationDetailsDialog.tsx:95 #: src/lib/moderation/useModerationCauseDescription.ts:92 msgid "You have muted this account." -msgstr "" +msgstr "你已隐藏此账户。" #: src/lib/moderation/useModerationCauseDescription.ts:86 msgid "You have muted this user" -msgstr "" - -#: src/view/com/modals/ModerationDetails.tsx:87 -#~ msgid "You have muted this user." -#~ msgstr "你已隐藏这个用户。" +msgstr "你已隐藏此用户" #: src/view/com/feeds/ProfileFeedgens.tsx:136 msgid "You have no feeds." @@ -5800,11 +5267,7 @@ msgstr "你没有列表。" #: src/view/screens/ModerationBlockedAccounts.tsx:132 msgid "You have not blocked any accounts yet. To block an account, go to their profile and select \"Block account\" from the menu on their account." -msgstr "" - -#: src/view/screens/ModerationBlockedAccounts.tsx:132 -#~ msgid "You have not blocked any accounts yet. To block an account, go to their profile and selected \"Block account\" from the menu on their account." -#~ msgstr "你还没有屏蔽任何账号。要屏蔽账号,请转到其个人资料并在其账号上的菜单中选择 \"屏蔽账号\"。" +msgstr "你还没有屏蔽任何账户。要屏蔽账户,请转到其个人资料并在其账户上的菜单中选择 \"屏蔽账户\"。" #: src/view/screens/AppPasswords.tsx:89 msgid "You have not created any app passwords yet. You can create one by pressing the button below." @@ -5812,11 +5275,7 @@ msgstr "你尚未创建任何应用专用密码,可以通过点击下面的按 #: src/view/screens/ModerationMutedAccounts.tsx:131 msgid "You have not muted any accounts yet. To mute an account, go to their profile and select \"Mute account\" from the menu on their account." -msgstr "" - -#: src/view/screens/ModerationMutedAccounts.tsx:131 -#~ msgid "You have not muted any accounts yet. To mute an account, go to their profile and selected \"Mute account\" from the menu on their account." -#~ msgstr "你还没有隐藏任何账号。要隐藏账号,请转到其个人资料并在其账号上的菜单中选择 \"隐藏账号\"。" +msgstr "你还没有隐藏任何账户。要隐藏账户,请转到其个人资料并在其账户上的菜单中选择 \"隐藏账户\"。" #: src/components/dialogs/MutedWords.tsx:250 msgid "You haven't muted any words or tags yet" @@ -5824,11 +5283,7 @@ msgstr "你还没有隐藏任何词或话题标签" #: src/components/moderation/LabelsOnMeDialog.tsx:69 msgid "You may appeal these labels if you feel they were placed in error." -msgstr "" - -#: src/view/com/modals/ContentFilteringSettings.tsx:175 -#~ msgid "You must be 18 or older to enable adult content." -#~ msgstr "你必须年满18岁及以上才能启用成人内容。" +msgstr "如果你认为这些标记是错误的,你可以申诉这些标记。" #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:110 msgid "You must be 18 years or older to enable adult content" @@ -5836,7 +5291,7 @@ msgstr "你必须年满18岁及以上才能启用成人内容" #: src/components/ReportDialog/SubmitView.tsx:205 msgid "You must select at least one labeler for a report" -msgstr "" +msgstr "你必须选择至少一个标记者进行举报" #: src/view/com/util/forms/PostDropdownBtn.tsx:144 msgid "You will no longer receive notifications for this thread" @@ -5867,11 +5322,11 @@ msgstr "你已设置完成!" #: src/components/moderation/ModerationDetailsDialog.tsx:99 #: src/lib/moderation/useModerationCauseDescription.ts:101 msgid "You've chosen to hide a word or tag within this post." -msgstr "" +msgstr "你选择隐藏了此帖子中的一个词或标签。" #: src/view/com/posts/FollowingEndOfFeed.tsx:48 msgid "You've reached the end of your feed! Find some more accounts to follow." -msgstr "你已经浏览完你的订阅信息流啦!寻找一些更多的账号关注吧。" +msgstr "你已经浏览完你的订阅信息流啦!寻找一些更多的账户关注吧。" #: src/view/com/auth/create/Step1.tsx:67 msgid "Your account" @@ -5883,7 +5338,7 @@ msgstr "你的账户已删除" #: src/view/screens/Settings/ExportCarDialog.tsx:47 msgid "Your account repository, containing all public data records, can be downloaded as a \"CAR\" file. This file does not include media embeds, such as images, or your private data, which must be fetched separately." -msgstr "您的帐户数据库包含所有公共数据记录,它们将被导出为“CAR”文件。此文件不包括帖子中的媒体,例如图像或您的隐私数据,这些数据需要另外获取。" +msgstr "你的帐户数据库包含所有公共数据记录,它们将被导出为“CAR”文件。此文件不包括帖子中的媒体,例如图像或你的隐私数据,这些数据需要另外获取。" #: src/view/com/auth/create/Step1.tsx:215 msgid "Your birth date" @@ -5903,10 +5358,6 @@ msgstr "你的默认信息流为\"关注\"" msgid "Your email appears to be invalid." msgstr "你的电子邮箱似乎无效。" -#: src/view/com/modals/Waitlist.tsx:109 -#~ msgid "Your email has been saved! We'll be in touch soon." -#~ msgstr "你的电子邮箱已保存!我们将很快联系你。" - #: src/view/com/modals/ChangeEmail.tsx:125 msgid "Your email has been updated but not verified. As a next step, please verify your new email." msgstr "你的电子邮箱已更新但尚未验证。作为下一步,请验证你的新电子邮件。" @@ -5927,12 +5378,6 @@ msgstr "你的完整用户识别符将修改为" msgid "Your full handle will be <0>@{0}" msgstr "你的完整用户识别符将修改为 <0>@{0}" -#: src/view/screens/Settings.tsx:430 -#: src/view/shell/desktop/RightNav.tsx:137 -#: src/view/shell/Drawer.tsx:660 -#~ msgid "Your invite codes are hidden when logged in using an App Password" -#~ msgstr "在使用应用专用密码登录时,你的邀请码将被隐藏" - #: src/components/dialogs/MutedWords.tsx:221 msgid "Your muted words" msgstr "你的隐藏词" From ee87f2cadd07519516bd8cc344d7559d4a6222aa Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Tue, 9 Apr 2024 16:27:39 -0700 Subject: [PATCH 017/185] 1.76 release preparations (#3459) * Run intl:extract * Update dev-env to 0.3.4 * Test fixes --- __e2e__/mock-server.ts | 4 +- __e2e__/tests/home-screen.test.ts | 28 +- ...odes.test.ts => invite-codes.test.skip.ts} | 5 +- ...invites-and-text-verification.test.skip.ts | 52 - __e2e__/tests/profile-screen.test.ts | 49 +- __e2e__/tests/text-verification.test.skip.ts | 83 - __e2e__/tests/thread-screen.test.ts | 51 +- jest/test-pds.ts | 155 +- package.json | 2 +- .../ReportDialog/SelectReportOptionView.tsx | 1 + src/components/ReportDialog/SubmitView.tsx | 27 +- src/components/forms/HostingProvider.tsx | 1 + src/locale/locales/ca/messages.po | 1619 +++---- src/locale/locales/de/messages.po | 1617 +++---- src/locale/locales/en/messages.po | 1617 +++---- src/locale/locales/es/messages.po | 1617 +++---- src/locale/locales/fi/messages.po | 1619 +++---- src/locale/locales/fr/messages.po | 1617 +++---- src/locale/locales/ga/messages.po | 3730 +++++++++++----- src/locale/locales/hi/messages.po | 1617 +++---- src/locale/locales/id/messages.po | 1634 +++---- src/locale/locales/it/messages.po | 2715 ++++++------ src/locale/locales/ja/messages.po | 1619 +++---- src/locale/locales/ko/messages.po | 818 ++-- src/locale/locales/pt-BR/messages.po | 1619 +++---- src/locale/locales/tr/messages.po | 3919 ++++++++++++----- src/locale/locales/uk/messages.po | 1617 +++---- src/locale/locales/zh-CN/messages.po | 1619 +++---- src/locale/locales/zh-TW/messages.po | 1617 +++---- src/screens/Login/LoginForm.tsx | 1 + yarn.lock | 429 +- 31 files changed, 18821 insertions(+), 14297 deletions(-) rename __e2e__/tests/{invite-codes.test.ts => invite-codes.test.skip.ts} (94%) delete mode 100644 __e2e__/tests/invites-and-text-verification.test.skip.ts delete mode 100644 __e2e__/tests/text-verification.test.skip.ts diff --git a/__e2e__/mock-server.ts b/__e2e__/mock-server.ts index 1bf240ccbd..b5f13a87fd 100644 --- a/__e2e__/mock-server.ts +++ b/__e2e__/mock-server.ts @@ -1,5 +1,6 @@ import {createServer as createHTTPServer} from 'node:http' import {parse} from 'node:url' + import {createServer, TestPDS} from '../jest/test-pds' async function main() { @@ -14,8 +15,7 @@ async function main() { await server?.close() console.log('Starting new server') const inviteRequired = url?.query && 'invite' in url.query - const phoneRequired = url?.query && 'phone' in url.query - server = await createServer({inviteRequired, phoneRequired}) + server = await createServer({inviteRequired}) console.log('Listening at', server.pdsUrl) if (url?.query) { if ('users' in url.query) { diff --git a/__e2e__/tests/home-screen.test.ts b/__e2e__/tests/home-screen.test.ts index a83a34edc6..b594c46978 100644 --- a/__e2e__/tests/home-screen.test.ts +++ b/__e2e__/tests/home-screen.test.ts @@ -1,8 +1,9 @@ /* eslint-env detox/detox */ -import {describe, beforeAll, it} from '@jest/globals' +import {beforeAll, describe, it} from '@jest/globals' import {expect} from 'detox' -import {openApp, loginAsAlice, createServer} from '../util' + +import {createServer, loginAsAlice, openApp} from '../util' describe('Home screen', () => { beforeAll(async () => { @@ -68,19 +69,16 @@ describe('Home screen', () => { ).not.toExist() }) - it('Can report posts', async () => { - const carlaPosts = by.id('feedItem-by-carla.test') - await element(by.id('postDropdownBtn').withAncestor(carlaPosts)) - .atIndex(0) - .tap() - await element(by.text('Report post')).tap() - await expect(element(by.id('reportModal'))).toBeVisible() - await element( - by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'), - ).tap() - await element(by.id('sendReportBtn')).tap() - await expect(element(by.id('reportModal'))).not.toBeVisible() - }) + // TODO skipping because the test env PDS isnt setup correctly to handle the report -prf + // it('Can report posts', async () => { + // const carlaPosts = by.id('feedItem-by-carla.test') + // await element(by.id('postDropdownBtn').withAncestor(carlaPosts)) + // .atIndex(0) + // .tap() + // await element(by.text('Report post')).tap() + // await element(by.id('com.atproto.moderation.defs#reasonSpam')).tap() + // await element(by.id('sendReportBtn')).tap() + // }) it('Can swipe between feeds', async () => { await element(by.id('homeScreen')).swipe('left', 'fast', 0.75) diff --git a/__e2e__/tests/invite-codes.test.ts b/__e2e__/tests/invite-codes.test.skip.ts similarity index 94% rename from __e2e__/tests/invite-codes.test.ts rename to __e2e__/tests/invite-codes.test.skip.ts index 7eb8d9a3e1..9f00f05255 100644 --- a/__e2e__/tests/invite-codes.test.ts +++ b/__e2e__/tests/invite-codes.test.skip.ts @@ -1,8 +1,9 @@ /* eslint-env detox/detox */ -import {describe, beforeAll, it} from '@jest/globals' +import {beforeAll, describe, it} from '@jest/globals' import {expect} from 'detox' -import {openApp, loginAsAlice, createServer} from '../util' + +import {createServer, loginAsAlice, openApp} from '../util' describe('invite-codes', () => { let service: string diff --git a/__e2e__/tests/invites-and-text-verification.test.skip.ts b/__e2e__/tests/invites-and-text-verification.test.skip.ts deleted file mode 100644 index 863b31107b..0000000000 --- a/__e2e__/tests/invites-and-text-verification.test.skip.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint-env detox/detox */ - -import {describe, beforeAll, it} from '@jest/globals' -import {expect} from 'detox' -import {openApp, loginAsAlice, createServer} from '../util' - -describe('invite-codes', () => { - let service: string - let inviteCode = '' - beforeAll(async () => { - service = await createServer('?users&invite&phone') - await openApp({permissions: {notifications: 'YES'}}) - }) - - it('I can fetch invite codes', async () => { - await loginAsAlice() - await element(by.id('e2eOpenInviteCodesModal')).tap() - await expect(element(by.id('inviteCodesModal'))).toBeVisible() - const attrs = await element(by.id('inviteCode-0-code')).getAttributes() - inviteCode = attrs.text - await element(by.id('closeBtn')).tap() - await element(by.id('e2eSignOut')).tap() - }) - - it('I can create a new account with the invite code', async () => { - await element(by.id('e2eOpenLoggedOutView')).tap() - await element(by.id('createAccountButton')).tap() - await device.takeScreenshot('1- opened create account screen') - await element(by.id('selectServiceButton')).tap() - await device.takeScreenshot('2- selected other server') - await element(by.id('customSelectBtn')).tap() - await element(by.id('customServerTextInput')).typeText(service) - await element(by.id('customServerTextInput')).tapReturnKey() - await element(by.id('doneBtn')).tap() - await device.takeScreenshot('3- input test server URL') - await element(by.id('inviteCodeInput')).typeText(inviteCode) - await element(by.id('emailInput')).typeText('example@test.com') - await element(by.id('passwordInput')).typeText('hunter2') - await device.takeScreenshot('4- entered account details') - await element(by.id('nextBtn')).tap() - await element(by.id('phoneInput')).typeText('2345551234') - await element(by.id('requestCodeBtn')).tap() - await device.takeScreenshot('5- requested code') - await element(by.id('codeInput')).typeText('000000') - await device.takeScreenshot('6- entered code') - await element(by.id('nextBtn')).tap() - await element(by.id('handleInput')).typeText('e2e-test') - await device.takeScreenshot('7- entered handle') - await element(by.id('nextBtn')).tap() - await expect(element(by.id('onboardingInterests'))).toBeVisible() - }) -}) diff --git a/__e2e__/tests/profile-screen.test.ts b/__e2e__/tests/profile-screen.test.ts index 13d0fa8efb..7c3207ec83 100644 --- a/__e2e__/tests/profile-screen.test.ts +++ b/__e2e__/tests/profile-screen.test.ts @@ -1,8 +1,9 @@ /* eslint-env detox/detox */ -import {describe, beforeAll, it} from '@jest/globals' +import {beforeAll, describe, it} from '@jest/globals' import {expect} from 'detox' -import {openApp, loginAsAlice, createServer, sleep} from '../util' + +import {createServer, loginAsAlice, openApp, sleep} from '../util' describe('Profile screen', () => { beforeAll(async () => { @@ -124,16 +125,17 @@ describe('Profile screen', () => { await expect(element(by.id('profileHeaderAlert'))).not.toExist() }) - it('Can report another user', async () => { - await element(by.id('profileHeaderDropdownBtn')).tap() - await element(by.text('Report Account')).tap() - await expect(element(by.id('reportModal'))).toBeVisible() - await element( - by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'), - ).tap() - await element(by.id('sendReportBtn')).tap() - await expect(element(by.id('reportModal'))).not.toBeVisible() - }) + // TODO skipping because the test env PDS isnt setup correctly to handle the report -prf + // it('Can report another user', async () => { + // await element(by.id('profileHeaderDropdownBtn')).tap() + // await element(by.text('Report Account')).tap() + // await expect(element(by.id('reportModal'))).toBeVisible() + // await element( + // by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'), + // ).tap() + // await element(by.id('sendReportBtn')).tap() + // await expect(element(by.id('reportModal'))).not.toBeVisible() + // }) it('Can like posts', async () => { await element(by.id('postsFeed-flatlist')).swipe( @@ -179,15 +181,16 @@ describe('Profile screen', () => { ).not.toExist() }) - it('Can report posts', async () => { - const posts = by.id('feedItem-by-bob.test') - await element(by.id('postDropdownBtn').withAncestor(posts)).atIndex(0).tap() - await element(by.text('Report post')).tap() - await expect(element(by.id('reportModal'))).toBeVisible() - await element( - by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'), - ).tap() - await element(by.id('sendReportBtn')).tap() - await expect(element(by.id('reportModal'))).not.toBeVisible() - }) + // TODO skipping because the test env PDS isnt setup correctly to handle the report -prf + // it('Can report posts', async () => { + // const posts = by.id('feedItem-by-bob.test') + // await element(by.id('postDropdownBtn').withAncestor(posts)).atIndex(0).tap() + // await element(by.text('Report post')).tap() + // await expect(element(by.id('reportModal'))).toBeVisible() + // await element( + // by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'), + // ).tap() + // await element(by.id('sendReportBtn')).tap() + // await expect(element(by.id('reportModal'))).not.toBeVisible() + // }) }) diff --git a/__e2e__/tests/text-verification.test.skip.ts b/__e2e__/tests/text-verification.test.skip.ts deleted file mode 100644 index bd19e66b27..0000000000 --- a/__e2e__/tests/text-verification.test.skip.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* eslint-env detox/detox */ - -import {describe, beforeAll, it} from '@jest/globals' -import {expect} from 'detox' -import {openApp, createServer} from '../util' - -describe('Create account', () => { - let service: string - beforeAll(async () => { - service = await createServer('?phone') - await openApp({permissions: {notifications: 'YES'}}) - }) - - it('I can create a new account with text verification', async () => { - console.log('SERVICE IS', service) - await element(by.id('e2eOpenLoggedOutView')).tap() - - await element(by.id('createAccountButton')).tap() - await device.takeScreenshot('1- opened create account screen') - await element(by.id('selectServiceButton')).tap() - await device.takeScreenshot('2- selected other server') - await element(by.id('customSelectBtn')).tap() - await element(by.id('customServerTextInput')).typeText(service) - await element(by.id('customServerTextInput')).tapReturnKey() - await element(by.id('doneBtn')).tap() - await device.takeScreenshot('3- input test server URL') - await element(by.id('emailInput')).typeText('text-verification@test.com') - await element(by.id('passwordInput')).typeText('hunter2') - await device.takeScreenshot('4- entered account details') - await element(by.id('nextBtn')).tap() - - await element(by.id('handleInput')).typeText('text-verification-test') - await device.takeScreenshot('5- entered handle') - await element(by.id('nextBtn')).tap() - - await element(by.id('phoneInput')).typeText('8042221111') - await element(by.id('requestCodeBtn')).tap() - await device.takeScreenshot('6- requested code') - - await element(by.id('codeInput')).typeText('000000') - await device.takeScreenshot('7- entered code') - await element(by.id('nextBtn')).tap() - - await element(by.id('nextBtn')).tap() - - await expect(element(by.id('onboardingInterests'))).toBeVisible() - }) - - it('failed text verification correctly goes back to the code input screen', async () => { - await element(by.id('e2eSignOut')).tap() - await element(by.id('e2eOpenLoggedOutView')).tap() - - await element(by.id('createAccountButton')).tap() - await device.takeScreenshot('1- opened create account screen') - await element(by.id('selectServiceButton')).tap() - await device.takeScreenshot('2- selected other server') - await element(by.id('customSelectBtn')).tap() - await element(by.id('customServerTextInput')).typeText(service) - await element(by.id('customServerTextInput')).tapReturnKey() - await element(by.id('doneBtn')).tap() - await device.takeScreenshot('3- input test server URL') - await element(by.id('emailInput')).typeText('text-verification2@test.com') - await element(by.id('passwordInput')).typeText('hunter2') - await device.takeScreenshot('4- entered account details') - await element(by.id('nextBtn')).tap() - - await element(by.id('phoneInput')).typeText('8042221111') - await element(by.id('requestCodeBtn')).tap() - await device.takeScreenshot('5- requested code') - - await element(by.id('codeInput')).typeText('111111') - await device.takeScreenshot('6- entered code') - await element(by.id('nextBtn')).tap() - - await element(by.id('handleInput')).typeText('text-verification-test2') - await device.takeScreenshot('7- entered handle') - - await element(by.id('nextBtn')).tap() - - await expect(element(by.id('codeInput'))).toBeVisible() - await device.takeScreenshot('8- got error') - }) -}) diff --git a/__e2e__/tests/thread-screen.test.ts b/__e2e__/tests/thread-screen.test.ts index 646c828fd3..b99da11a67 100644 --- a/__e2e__/tests/thread-screen.test.ts +++ b/__e2e__/tests/thread-screen.test.ts @@ -1,8 +1,9 @@ /* eslint-env detox/detox */ -import {describe, beforeAll, it} from '@jest/globals' +import {beforeAll, describe, it} from '@jest/globals' import {expect} from 'detox' -import {openApp, loginAsAlice, createServer} from '../util' + +import {createServer, loginAsAlice, openApp} from '../util' describe('Thread screen', () => { beforeAll(async () => { @@ -102,27 +103,29 @@ describe('Thread screen', () => { ).not.toExist() }) - it('Can report the root post', async () => { - const post = by.id('postThreadItem-by-bob.test') - await element(by.id('postDropdownBtn').withAncestor(post)).atIndex(0).tap() - await element(by.text('Report post')).tap() - await expect(element(by.id('reportModal'))).toBeVisible() - await element( - by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'), - ).tap() - await element(by.id('sendReportBtn')).tap() - await expect(element(by.id('reportModal'))).not.toBeVisible() - }) + // TODO skipping because the test env PDS isnt setup correctly to handle the report -prf + // it('Can report the root post', async () => { + // const post = by.id('postThreadItem-by-bob.test') + // await element(by.id('postDropdownBtn').withAncestor(post)).atIndex(0).tap() + // await element(by.text('Report post')).tap() + // await expect(element(by.id('reportModal'))).toBeVisible() + // await element( + // by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'), + // ).tap() + // await element(by.id('sendReportBtn')).tap() + // await expect(element(by.id('reportModal'))).not.toBeVisible() + // }) - it('Can report a reply post', async () => { - const post = by.id('postThreadItem-by-carla.test') - await element(by.id('postDropdownBtn').withAncestor(post)).atIndex(0).tap() - await element(by.text('Report post')).tap() - await expect(element(by.id('reportModal'))).toBeVisible() - await element( - by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'), - ).tap() - await element(by.id('sendReportBtn')).tap() - await expect(element(by.id('reportModal'))).not.toBeVisible() - }) + // TODO skipping because the test env PDS isnt setup correctly to handle the report -prf + // it('Can report a reply post', async () => { + // const post = by.id('postThreadItem-by-carla.test') + // await element(by.id('postDropdownBtn').withAncestor(post)).atIndex(0).tap() + // await element(by.text('Report post')).tap() + // await expect(element(by.id('reportModal'))).toBeVisible() + // await element( + // by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'), + // ).tap() + // await element(by.id('sendReportBtn')).tap() + // await expect(element(by.id('reportModal'))).not.toBeVisible() + // }) }) diff --git a/jest/test-pds.ts b/jest/test-pds.ts index b70a9abf08..1c52d944c6 100644 --- a/jest/test-pds.ts +++ b/jest/test-pds.ts @@ -1,8 +1,8 @@ +import {AtUri, BskyAgent} from '@atproto/api' +import {TestBsky, TestNetwork} from '@atproto/dev-env' +import fs from 'fs' import net from 'net' import path from 'path' -import fs from 'fs' -import {TestNetwork, TestPds} from '@atproto/dev-env' -import {AtUri, BskyAgent} from '@atproto/api' export interface TestUser { email: string @@ -55,12 +55,8 @@ class StringIdGenerator { const ids = new StringIdGenerator() export async function createServer( - { - inviteRequired, - phoneRequired, - }: {inviteRequired: boolean; phoneRequired: boolean} = { + {inviteRequired}: {inviteRequired: boolean} = { inviteRequired: false, - phoneRequired: false, }, ): Promise { const port = 3000 @@ -69,23 +65,11 @@ export async function createServer( const pdsUrl = `http://localhost:${port}` const id = ids.next() - const phoneParams = phoneRequired - ? { - phoneVerificationRequired: true, - phoneVerificationProvider: 'twilio', - twilioAccountSid: 'ACXXXXXXX', - twilioAuthToken: 'AUTH', - twilioServiceSid: 'VAXXXXXXXX', - } - : {} - const testNet = await TestNetwork.create({ pds: { port, hostname: 'localhost', - dbPostgresSchema: `pds_${id}`, inviteRequired, - ...phoneParams, }, bsky: { dbPostgresSchema: `bsky_${id}`, @@ -94,36 +78,33 @@ export async function createServer( }, plc: {port: port2}, }) - mockTwilio(testNet.pds) // add the test mod authority - if (!phoneRequired) { - const agent = new BskyAgent({service: pdsUrl}) - const res = await agent.api.com.atproto.server.createAccount({ - email: 'mod-authority@test.com', - handle: 'mod-authority.test', - password: 'hunter2', - }) - agent.api.setHeader('Authorization', `Bearer ${res.data.accessJwt}`) - await agent.api.app.bsky.actor.profile.create( - {repo: res.data.did}, - { - displayName: 'Dev-env Moderation', - description: `The pretend version of mod.bsky.app`, - }, - ) + const agent = new BskyAgent({service: pdsUrl}) + const res = await agent.api.com.atproto.server.createAccount({ + email: 'mod-authority@test.com', + handle: 'mod-authority.test', + password: 'hunter2', + }) + agent.api.setHeader('Authorization', `Bearer ${res.data.accessJwt}`) + await agent.api.app.bsky.actor.profile.create( + {repo: res.data.did}, + { + displayName: 'Dev-env Moderation', + description: `The pretend version of mod.bsky.app`, + }, + ) - await agent.api.app.bsky.labeler.service.create( - {repo: res.data.did, rkey: 'self'}, - { - policies: { - labelValues: ['!hide', '!warn'], - labelValueDefinitions: [], - }, - createdAt: new Date().toISOString(), + await agent.api.app.bsky.labeler.service.create( + {repo: res.data.did, rkey: 'self'}, + { + policies: { + labelValues: ['!hide', '!warn'], + labelValueDefinitions: [], }, - ) - } + createdAt: new Date().toISOString(), + }, + ) const pic = fs.readFileSync( path.join(__dirname, '..', 'assets', 'default-avatar.png'), @@ -181,7 +162,7 @@ class Mocker { const inviteRes = await agent.api.com.atproto.server.createInviteCode( {useCount: 1}, { - headers: this.pds.adminAuthHeaders('admin'), + headers: this.pds.adminAuthHeaders(), encoding: 'application/json', }, ) @@ -192,8 +173,6 @@ class Mocker { email, handle: name + '.test', password: 'hunter2', - verificationPhone: '1234567890', - verificationCode: '000000', }) await agent.upsertProfile(async () => { const blob = await agent.uploadBlob(this.pic, { @@ -358,7 +337,7 @@ class Mocker { await agent.api.com.atproto.server.createInviteCode( {useCount: 1, forAccount}, { - headers: this.pds.adminAuthHeaders('admin'), + headers: this.pds.adminAuthHeaders(), encoding: 'application/json', }, ) @@ -373,18 +352,11 @@ class Mocker { if (!ctx) { throw new Error('Invalid appview') } - const labelSrvc = ctx.services.label(ctx.db.getPrimary()) - await labelSrvc.createLabels([ - { - // @ts-ignore - src: ctx.cfg.labelerDid, - uri: did, - cid: '', - val: label, - neg: false, - cts: new Date().toISOString(), - }, - ]) + await createLabel(this.bsky, { + uri: did, + cid: '', + val: label, + }) } async labelProfile(label: string, user: string) { @@ -403,18 +375,11 @@ class Mocker { if (!ctx) { throw new Error('Invalid appview') } - const labelSrvc = ctx.services.label(ctx.db.getPrimary()) - await labelSrvc.createLabels([ - { - // @ts-ignore - src: ctx.cfg.labelerDid, - uri: profile.uri, - cid: profile.cid, - val: label, - neg: false, - cts: new Date().toISOString(), - }, - ]) + await createLabel(this.bsky, { + uri: profile.uri, + cid: profile.cid, + val: label, + }) } async labelPost(label: string, {uri, cid}: {uri: string; cid: string}) { @@ -422,18 +387,11 @@ class Mocker { if (!ctx) { throw new Error('Invalid appview') } - const labelSrvc = ctx.services.label(ctx.db.getPrimary()) - await labelSrvc.createLabels([ - { - // @ts-ignore - src: ctx.cfg.labelerDid, - uri, - cid, - val: label, - neg: false, - cts: new Date().toISOString(), - }, - ]) + await createLabel(this.bsky, { + uri, + cid, + val: label, + }) } async createMuteList(user: string, name: string): Promise { @@ -484,14 +442,19 @@ async function getPort(start = 3000) { throw new Error('Unable to find an available port') } -export const mockTwilio = (pds: TestPds) => { - if (!pds.ctx.phoneVerifier) return - - pds.ctx.phoneVerifier.sendCode = async (_number: string) => { - // do nothing - } - - pds.ctx.phoneVerifier.verifyCode = async (_number: string, code: string) => { - return code === '000000' - } +const createLabel = async ( + bsky: TestBsky, + opts: {uri: string; cid: string; val: string}, +) => { + await bsky.db.db + .insertInto('label') + .values({ + uri: opts.uri, + cid: opts.cid, + val: opts.val, + cts: new Date().toISOString(), + neg: false, + src: 'did:example:labeler', + }) + .execute() } diff --git a/package.json b/package.json index 55c5668544..9fc625613c 100644 --- a/package.json +++ b/package.json @@ -187,7 +187,7 @@ "zod": "^3.20.2" }, "devDependencies": { - "@atproto/dev-env": "^0.2.28", + "@atproto/dev-env": "^0.3.4", "@babel/core": "^7.23.2", "@babel/preset-env": "^7.20.0", "@babel/runtime": "^7.20.0", diff --git a/src/components/ReportDialog/SelectReportOptionView.tsx b/src/components/ReportDialog/SelectReportOptionView.tsx index c676983485..8219b20951 100644 --- a/src/components/ReportDialog/SelectReportOptionView.tsx +++ b/src/components/ReportDialog/SelectReportOptionView.tsx @@ -90,6 +90,7 @@ export function SelectReportOptionView({ return ( + + + + + {isNative && } + + + + + ) +} diff --git a/src/screens/Profile/Header/ProfileHeaderLabeler.tsx b/src/screens/Profile/Header/ProfileHeaderLabeler.tsx index d0fd5e20bd..b9145822c9 100644 --- a/src/screens/Profile/Header/ProfileHeaderLabeler.tsx +++ b/src/screens/Profile/Header/ProfileHeaderLabeler.tsx @@ -18,7 +18,7 @@ import {useModalControls} from '#/state/modals' import {useLabelerSubscriptionMutation} from '#/state/queries/labeler' import {useLikeMutation, useUnlikeMutation} from '#/state/queries/like' import {usePreferencesQuery} from '#/state/queries/preferences' -import {useSession} from '#/state/session' +import {useRequireAuth, useSession} from '#/state/session' import {useAnalytics} from 'lib/analytics/analytics' import {useHaptics} from 'lib/haptics' import {useProfileShadow} from 'state/cache/profile-shadow' @@ -64,6 +64,7 @@ let ProfileHeaderLabeler = ({ const {currentAccount, hasSession} = useSession() const {openModal} = useModalControls() const {track} = useAnalytics() + const requireAuth = useRequireAuth() const playHaptic = useHaptics() const cantSubscribePrompt = Prompt.usePromptControl() const isSelf = currentAccount?.did === profile.did @@ -125,27 +126,32 @@ let ProfileHeaderLabeler = ({ }) }, [track, openModal, profile]) - const onPressSubscribe = React.useCallback(async () => { - if (!canSubscribe) { - cantSubscribePrompt.open() - return - } - try { - await toggleSubscription({ - did: profile.did, - subscribe: !isSubscribed, - }) - } catch (e: any) { - // setSubscriptionError(e.message) - logger.error(`Failed to subscribe to labeler`, {message: e.message}) - } - }, [ - toggleSubscription, - isSubscribed, - profile, - canSubscribe, - cantSubscribePrompt, - ]) + const onPressSubscribe = React.useCallback( + () => + requireAuth(async () => { + if (!canSubscribe) { + cantSubscribePrompt.open() + return + } + try { + await toggleSubscription({ + did: profile.did, + subscribe: !isSubscribed, + }) + } catch (e: any) { + // setSubscriptionError(e.message) + logger.error(`Failed to subscribe to labeler`, {message: e.message}) + } + }), + [ + requireAuth, + toggleSubscription, + isSubscribed, + profile, + canSubscribe, + cantSubscribePrompt, + ], + ) const isMe = React.useMemo( () => currentAccount?.did === profile.did, @@ -184,7 +190,6 @@ let ProfileHeaderLabeler = ({ ? _(msg`Unsubscribe from this labeler`) : _(msg`Subscribe to this labeler`) } - disabled={!hasSession} onPress={onPressSubscribe}> {state => ( void}) { - - + + + Having trouble?{' '} - + Contact support diff --git a/src/state/queries/feed.ts b/src/state/queries/feed.ts index c56912491a..0d3de89697 100644 --- a/src/state/queries/feed.ts +++ b/src/state/queries/feed.ts @@ -17,7 +17,7 @@ import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeHandle} from '#/lib/strings/handles' import {STALE} from '#/state/queries' import {usePreferencesQuery} from '#/state/queries/preferences' -import {getAgent} from '#/state/session' +import {getAgent, useSession} from '#/state/session' import {router} from '#/routes' export type FeedSourceFeedInfo = { @@ -216,17 +216,38 @@ const FOLLOWING_FEED_STUB: FeedSourceInfo = { likeCount: 0, likeUri: '', } +const DISCOVER_FEED_STUB: FeedSourceInfo = { + type: 'feed', + displayName: 'Discover', + uri: '', + route: { + href: '/', + name: 'Home', + params: {}, + }, + cid: '', + avatar: '', + description: new RichText({text: ''}), + creatorDid: '', + creatorHandle: '', + likeCount: 0, + likeUri: '', +} const pinnedFeedInfosQueryKeyRoot = 'pinnedFeedsInfos' export function usePinnedFeedsInfos() { + const {hasSession} = useSession() const {data: preferences, isLoading: isLoadingPrefs} = usePreferencesQuery() const pinnedUris = preferences?.feeds?.pinned ?? [] return useQuery({ staleTime: STALE.INFINITY, enabled: !isLoadingPrefs, - queryKey: [pinnedFeedInfosQueryKeyRoot, pinnedUris.join(',')], + queryKey: [ + pinnedFeedInfosQueryKeyRoot, + (hasSession ? 'authed:' : 'unauthed:') + pinnedUris.join(','), + ], queryFn: async () => { let resolved = new Map() @@ -264,7 +285,7 @@ export function usePinnedFeedsInfos() { ) // The returned result will have the original order. - const result = [FOLLOWING_FEED_STUB] + const result = [hasSession ? FOLLOWING_FEED_STUB : DISCOVER_FEED_STUB] await Promise.allSettled([feedsPromise, ...listsPromises]) for (let pinnedUri of pinnedUris) { if (resolved.has(pinnedUri)) { diff --git a/src/state/session/index.tsx b/src/state/session/index.tsx index 5c7cc15916..b88181ebda 100644 --- a/src/state/session/index.tsx +++ b/src/state/session/index.tsx @@ -15,8 +15,8 @@ import {logger} from '#/logger' import {isWeb} from '#/platform/detection' import * as persisted from '#/state/persisted' import {PUBLIC_BSKY_AGENT} from '#/state/queries' -import {useLoggedOutViewControls} from '#/state/shell/logged-out' import {useCloseAllActiveElements} from '#/state/util' +import {useGlobalDialogsControlContext} from '#/components/dialogs/Context' import {IS_DEV} from '#/env' import {emitSessionDropped} from '../events' import {readLabelers} from './agent-config' @@ -702,8 +702,8 @@ export function useSessionApi() { export function useRequireAuth() { const {hasSession} = useSession() - const {setShowLoggedOut} = useLoggedOutViewControls() const closeAll = useCloseAllActiveElements() + const {signinDialogControl} = useGlobalDialogsControlContext() return React.useCallback( (fn: () => void) => { @@ -711,10 +711,10 @@ export function useRequireAuth() { fn() } else { closeAll() - setShowLoggedOut(true) + signinDialogControl.open() } }, - [hasSession, setShowLoggedOut, closeAll], + [hasSession, signinDialogControl, closeAll], ) } diff --git a/src/view/com/auth/HomeLoggedOutCTA.tsx b/src/view/com/auth/HomeLoggedOutCTA.tsx deleted file mode 100644 index 4c8c35da73..0000000000 --- a/src/view/com/auth/HomeLoggedOutCTA.tsx +++ /dev/null @@ -1,170 +0,0 @@ -import React from 'react' -import {StyleSheet, TouchableOpacity, View} from 'react-native' -import {msg, Trans} from '@lingui/macro' -import {useLingui} from '@lingui/react' - -import {usePalette} from '#/lib/hooks/usePalette' -import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' -import {colors, s} from '#/lib/styles' -import {useLoggedOutViewControls} from '#/state/shell/logged-out' -import {TextLink} from '../util/Link' -import {Text} from '../util/text/Text' -import {ScrollView} from '../util/Views' - -export function HomeLoggedOutCTA() { - const pal = usePalette('default') - const {_} = useLingui() - const {isMobile} = useWebMediaQueries() - const {requestSwitchToAccount} = useLoggedOutViewControls() - - const showCreateAccount = React.useCallback(() => { - requestSwitchToAccount({requestedAccount: 'new'}) - }, [requestSwitchToAccount]) - - const showSignIn = React.useCallback(() => { - requestSwitchToAccount({requestedAccount: 'none'}) - }, [requestSwitchToAccount]) - - return ( - - - - Bluesky - - - See what's next - - - - - - Create a new account - - - - - Sign in - - - - - - - - - - - ) -} - -const styles = StyleSheet.create({ - container: { - height: '100%', - }, - hero: { - justifyContent: 'center', - paddingTop: 100, - paddingBottom: 30, - }, - heroMobile: { - paddingBottom: 50, - }, - title: { - textAlign: 'center', - fontSize: 68, - fontWeight: 'bold', - }, - subtitle: { - textAlign: 'center', - fontSize: 48, - fontWeight: 'bold', - }, - subtitleMobile: { - fontSize: 42, - }, - btnsDesktop: { - flexDirection: 'row', - justifyContent: 'center', - gap: 20, - marginHorizontal: 20, - }, - btn: { - borderRadius: 32, - width: 230, - paddingVertical: 12, - marginBottom: 20, - }, - btnMobile: { - flex: 1, - width: 'auto', - marginHorizontal: 20, - paddingVertical: 16, - }, - btnLabel: { - textAlign: 'center', - fontSize: 18, - }, - btnLabelMobile: { - textAlign: 'center', - fontSize: 21, - }, - - footer: { - flexDirection: 'row', - gap: 20, - justifyContent: 'center', - }, - footerLink: {}, -}) diff --git a/src/view/com/auth/SplashScreen.tsx b/src/view/com/auth/SplashScreen.tsx index 763b01dfa1..8eac1ab82f 100644 --- a/src/view/com/auth/SplashScreen.tsx +++ b/src/view/com/auth/SplashScreen.tsx @@ -1,19 +1,15 @@ import React from 'react' import {View} from 'react-native' -import RNPickerSelect, {PickerSelectProps} from 'react-native-picker-select' import {useSafeAreaInsets} from 'react-native-safe-area-context' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {sanitizeAppLanguageSetting} from '#/locale/helpers' -import {APP_LANGUAGES} from '#/locale/languages' -import {useLanguagePrefs, useLanguagePrefsApi} from '#/state/preferences' import {Logo} from '#/view/icons/Logo' import {Logotype} from '#/view/icons/Logotype' import {ErrorBoundary} from 'view/com/util/ErrorBoundary' import {atoms as a, useTheme} from '#/alf' +import {AppLanguageDropdown} from '#/components/AppLanguageDropdown' import {Button, ButtonText} from '#/components/Button' -import {ChevronBottom_Stroke2_Corner0_Rounded as ChevronDown} from '#/components/icons/Chevron' import {Text} from '#/components/Typography' import {CenteredView} from '../util/Views' @@ -27,22 +23,8 @@ export const SplashScreen = ({ const t = useTheme() const {_} = useLingui() - const langPrefs = useLanguagePrefs() - const setLangPrefs = useLanguagePrefsApi() const insets = useSafeAreaInsets() - const sanitizedLang = sanitizeAppLanguageSetting(langPrefs.appLanguage) - - const onChangeAppLanguage = React.useCallback( - (value: Parameters[0]) => { - if (!value) return - if (sanitizedLang !== value) { - setLangPrefs.setAppLanguage(sanitizeAppLanguageSetting(value)) - } - }, - [sanitizedLang, setLangPrefs], - ) - return ( @@ -99,43 +81,7 @@ export const SplashScreen = ({ a.justify_center, a.align_center, ]}> - - Boolean(l.code2)).map(l => ({ - label: l.name, - value: l.code2, - key: l.code2, - }))} - useNativeAndroidPickerStyle={false} - style={{ - inputAndroid: { - color: t.atoms.text_contrast_medium.color, - fontSize: 16, - paddingRight: 12 + 4, - }, - inputIOS: { - color: t.atoms.text.color, - fontSize: 16, - paddingRight: 12 + 4, - }, - }} - /> - - - - - + diff --git a/src/view/com/auth/SplashScreen.web.tsx b/src/view/com/auth/SplashScreen.web.tsx index 7a2ee16cf3..f905e1e8d5 100644 --- a/src/view/com/auth/SplashScreen.web.tsx +++ b/src/view/com/auth/SplashScreen.web.tsx @@ -4,16 +4,13 @@ import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {sanitizeAppLanguageSetting} from '#/locale/helpers' -import {APP_LANGUAGES} from '#/locale/languages' -import {useLanguagePrefs, useLanguagePrefsApi} from '#/state/preferences' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {Logo} from '#/view/icons/Logo' import {Logotype} from '#/view/icons/Logotype' import {ErrorBoundary} from 'view/com/util/ErrorBoundary' import {atoms as a, useTheme} from '#/alf' +import {AppLanguageDropdown} from '#/components/AppLanguageDropdown' import {Button, ButtonText} from '#/components/Button' -import {ChevronBottom_Stroke2_Corner0_Rounded as ChevronDown} from '#/components/icons/Chevron' import {InlineLinkText} from '#/components/Link' import {Text} from '#/components/Typography' import {CenteredView} from '../util/Views' @@ -131,23 +128,6 @@ export const SplashScreen = ({ function Footer() { const t = useTheme() - const langPrefs = useLanguagePrefs() - const setLangPrefs = useLanguagePrefsApi() - - const sanitizedLang = sanitizeAppLanguageSetting(langPrefs.appLanguage) - - const onChangeAppLanguage = React.useCallback( - (ev: React.ChangeEvent) => { - const value = ev.target.value - - if (!value) return - if (sanitizedLang !== value) { - setLangPrefs.setAppLanguage(sanitizeAppLanguageSetting(value)) - } - }, - [sanitizedLang, setLangPrefs], - ) - return ( - - - {APP_LANGUAGES.find(l => l.code2 === sanitizedLang)?.name} - - - - - + ) } diff --git a/src/view/com/home/HomeHeaderLayout.web.tsx b/src/view/com/home/HomeHeaderLayout.web.tsx index 9818b56f6f..644d4cab6c 100644 --- a/src/view/com/home/HomeHeaderLayout.web.tsx +++ b/src/view/com/home/HomeHeaderLayout.web.tsx @@ -1,20 +1,22 @@ import React from 'react' import {StyleSheet, View} from 'react-native' import Animated from 'react-native-reanimated' -import {usePalette} from 'lib/hooks/usePalette' -import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' -import {HomeHeaderLayoutMobile} from './HomeHeaderLayoutMobile' -import {Logo} from '#/view/icons/Logo' -import {Link} from '../util/Link' import { FontAwesomeIcon, FontAwesomeIconStyle, } from '@fortawesome/react-native-fontawesome' -import {useLingui} from '@lingui/react' import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' + import {CogIcon} from '#/lib/icons' -import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode' +import {useSession} from '#/state/session' import {useShellLayout} from '#/state/shell/shell-layout' +import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode' +import {usePalette} from 'lib/hooks/usePalette' +import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' +import {Logo} from '#/view/icons/Logo' +import {Link} from '../util/Link' +import {HomeHeaderLayoutMobile} from './HomeHeaderLayoutMobile' export function HomeHeaderLayout(props: { children: React.ReactNode @@ -38,32 +40,35 @@ function HomeHeaderLayoutDesktopAndTablet({ const pal = usePalette('default') const {headerMinimalShellTransform} = useMinimalShellMode() const {headerHeight} = useShellLayout() + const {hasSession} = useSession() const {_} = useLingui() return ( <> - - - - - - - - - + {hasSession && ( + + + + + + + + + + )} {tabBarAnchor} { diff --git a/src/view/com/home/HomeHeaderLayoutMobile.tsx b/src/view/com/home/HomeHeaderLayoutMobile.tsx index d7b7231c60..78fa9af865 100644 --- a/src/view/com/home/HomeHeaderLayoutMobile.tsx +++ b/src/view/com/home/HomeHeaderLayoutMobile.tsx @@ -1,23 +1,24 @@ import React from 'react' import {StyleSheet, TouchableOpacity, View} from 'react-native' -import {usePalette} from 'lib/hooks/usePalette' -import {Link} from '../util/Link' +import Animated from 'react-native-reanimated' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {FontAwesomeIconStyle} from '@fortawesome/react-native-fontawesome' -import {HITSLOP_10} from 'lib/constants' -import Animated from 'react-native-reanimated' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode' + +import {useSession} from '#/state/session' import {useSetDrawerOpen} from '#/state/shell/drawer-open' import {useShellLayout} from '#/state/shell/shell-layout' +import {HITSLOP_10} from 'lib/constants' +import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode' +import {usePalette} from 'lib/hooks/usePalette' import {isWeb} from 'platform/detection' import {Logo} from '#/view/icons/Logo' - -import {IS_DEV} from '#/env' import {atoms} from '#/alf' -import {Link as Link2} from '#/components/Link' import {ColorPalette_Stroke2_Corner0_Rounded as ColorPalette} from '#/components/icons/ColorPalette' +import {Link as Link2} from '#/components/Link' +import {IS_DEV} from '#/env' +import {Link} from '../util/Link' export function HomeHeaderLayoutMobile({ children, @@ -30,6 +31,7 @@ export function HomeHeaderLayoutMobile({ const setDrawerOpen = useSetDrawerOpen() const {headerHeight} = useShellLayout() const {headerMinimalShellTransform} = useMinimalShellMode() + const {hasSession} = useSession() const onPressAvi = React.useCallback(() => { setDrawerOpen(true) @@ -76,18 +78,20 @@ export function HomeHeaderLayoutMobile({ )} - - - + {hasSession && ( + + + + )} {children} diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx index 2e3bf08db5..e64ab08df2 100644 --- a/src/view/screens/Feeds.tsx +++ b/src/view/screens/Feeds.tsx @@ -1,52 +1,53 @@ import React from 'react' import { ActivityIndicator, - StyleSheet, - View, type FlatList, Pressable, + StyleSheet, + View, } from 'react-native' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {FontAwesomeIconStyle} from '@fortawesome/react-native-fontawesome' -import {ViewHeader} from 'view/com/util/ViewHeader' -import {FAB} from 'view/com/util/fab/FAB' -import {Link} from 'view/com/util/Link' -import {NativeStackScreenProps, FeedsTabNavigatorParams} from 'lib/routes/types' -import {usePalette} from 'lib/hooks/usePalette' -import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' -import {ComposeIcon2, CogIcon, MagnifyingGlassIcon2} from 'lib/icons' -import {s} from 'lib/styles' -import {atoms as a, useTheme} from '#/alf' -import {SearchInput, SearchInputRef} from 'view/com/util/forms/SearchInput' -import {UserAvatar} from 'view/com/util/UserAvatar' -import { - LoadingPlaceholder, - FeedFeedLoadingPlaceholder, -} from 'view/com/util/LoadingPlaceholder' -import {ErrorMessage} from 'view/com/util/error/ErrorMessage' -import debounce from 'lodash.debounce' -import {Text} from 'view/com/util/text/Text' -import {List} from 'view/com/util/List' -import {useFocusEffect} from '@react-navigation/native' -import {FeedSourceCard} from 'view/com/feeds/FeedSourceCard' -import {Trans, msg} from '@lingui/macro' +import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {useSetMinimalShellMode} from '#/state/shell' -import {usePreferencesQuery} from '#/state/queries/preferences' +import {useFocusEffect} from '@react-navigation/native' +import debounce from 'lodash.debounce' + +import {isNative, isWeb} from '#/platform/detection' import { + getAvatarTypeFromUri, useFeedSourceInfoQuery, useGetPopularFeedsQuery, useSearchPopularFeedsMutation, - getAvatarTypeFromUri, } from '#/state/queries/feed' -import {cleanError} from 'lib/strings/errors' -import {useComposerControls} from '#/state/shell/composer' +import {usePreferencesQuery} from '#/state/queries/preferences' import {useSession} from '#/state/session' -import {isNative, isWeb} from '#/platform/detection' +import {useSetMinimalShellMode} from '#/state/shell' +import {useComposerControls} from '#/state/shell/composer' import {HITSLOP_10} from 'lib/constants' +import {usePalette} from 'lib/hooks/usePalette' +import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' +import {CogIcon, ComposeIcon2, MagnifyingGlassIcon2} from 'lib/icons' +import {FeedsTabNavigatorParams, NativeStackScreenProps} from 'lib/routes/types' +import {cleanError} from 'lib/strings/errors' +import {s} from 'lib/styles' +import {FeedSourceCard} from 'view/com/feeds/FeedSourceCard' +import {ErrorMessage} from 'view/com/util/error/ErrorMessage' +import {FAB} from 'view/com/util/fab/FAB' +import {SearchInput, SearchInputRef} from 'view/com/util/forms/SearchInput' +import {Link} from 'view/com/util/Link' +import {List} from 'view/com/util/List' +import { + FeedFeedLoadingPlaceholder, + LoadingPlaceholder, +} from 'view/com/util/LoadingPlaceholder' +import {Text} from 'view/com/util/text/Text' +import {UserAvatar} from 'view/com/util/UserAvatar' +import {ViewHeader} from 'view/com/util/ViewHeader' +import {atoms as a, useTheme} from '#/alf' import {IconCircle} from '#/components/IconCircle' -import {ListSparkle_Stroke2_Corner0_Rounded} from '#/components/icons/ListSparkle' import {ListMagnifyingGlass_Stroke2_Corner0_Rounded} from '#/components/icons/ListMagnifyingGlass' +import {ListSparkle_Stroke2_Corner0_Rounded} from '#/components/icons/ListSparkle' type Props = NativeStackScreenProps @@ -100,6 +101,22 @@ type FlatlistSlice = key: string } +// HACK +// the protocol doesn't yet tell us which feeds are personalized +// this list is used to filter out feed recommendations from logged out users +// for the ones we know need it +// -prf +const KNOWN_AUTHED_ONLY_FEEDS = [ + 'at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/with-friends', // popular with friends, by bsky.app + 'at://did:plc:tenurhgjptubkk5zf5qhi3og/app.bsky.feed.generator/mutuals', // mutuals, by skyfeed + 'at://did:plc:tenurhgjptubkk5zf5qhi3og/app.bsky.feed.generator/only-posts', // only posts, by skyfeed + 'at://did:plc:wzsilnxf24ehtmmc3gssy5bu/app.bsky.feed.generator/mentions', // mentions, by flicknow + 'at://did:plc:q6gjnaw2blty4crticxkmujt/app.bsky.feed.generator/bangers', // my bangers, by jaz + 'at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/mutuals', // mutuals, by bluesky + 'at://did:plc:q6gjnaw2blty4crticxkmujt/app.bsky.feed.generator/my-followers', // followers, by jaz + 'at://did:plc:vpkhqolt662uhesyj6nxm7ys/app.bsky.feed.generator/followpics', // the gram, by why +] + export function FeedsScreen(_props: Props) { const pal = usePalette('default') const {openComposer} = useComposerControls() @@ -299,7 +316,15 @@ export function FeedsScreen(_props: Props) { for (const page of popularFeeds.pages || []) { slices = slices.concat( page.feeds - .filter(feed => !preferences?.feeds?.saved.includes(feed.uri)) + .filter(feed => { + if ( + !hasSession && + KNOWN_AUTHED_ONLY_FEEDS.includes(feed.uri) + ) { + return false + } + return !preferences?.feeds?.saved.includes(feed.uri) + }) .map(feed => ({ key: `popularFeed:${feed.uri}`, type: 'popularFeed', diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index 39bdac669c..7a2a88265b 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -2,6 +2,7 @@ import React from 'react' import {ActivityIndicator, AppState, StyleSheet, View} from 'react-native' import {useFocusEffect} from '@react-navigation/native' +import {PROD_DEFAULT_FEED} from '#/lib/constants' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' import {useSetTitle} from '#/lib/hooks/useSetTitle' import {logEvent, LogEvents, useGate} from '#/lib/statsig/statsig' @@ -19,7 +20,6 @@ import {Pager, PagerRef, RenderTabBarFnProps} from 'view/com/pager/Pager' import {CustomFeedEmptyState} from 'view/com/posts/CustomFeedEmptyState' import {FollowingEmptyState} from 'view/com/posts/FollowingEmptyState' import {FollowingEndOfFeed} from 'view/com/posts/FollowingEndOfFeed' -import {HomeLoggedOutCTA} from '../com/auth/HomeLoggedOutCTA' import {HomeHeader} from '../com/home/HomeHeader' type Props = NativeStackScreenProps @@ -231,7 +231,12 @@ function HomeScreenReady({ onPageSelected={onPageSelected} onPageScrollStateChanged={onPageScrollStateChanged} renderTabBar={renderTabBar}> - + ) } diff --git a/src/view/screens/Profile.tsx b/src/view/screens/Profile.tsx index c391f80508..f71e1330ef 100644 --- a/src/view/screens/Profile.tsx +++ b/src/view/screens/Profile.tsx @@ -184,8 +184,7 @@ function ProfileScreenLoaded({ const showRepliesTab = hasSession const showMediaTab = !hasLabeler const showLikesTab = isMe - const showFeedsTab = - hasSession && (isMe || (profile.associated?.feedgens || 0) > 0) + const showFeedsTab = isMe || (profile.associated?.feedgens || 0) > 0 const showListsTab = hasSession && (isMe || (profile.associated?.lists || 0) > 0) diff --git a/src/view/screens/Settings/index.tsx b/src/view/screens/Settings/index.tsx index 8a7fa5e714..b97faafad1 100644 --- a/src/view/screens/Settings/index.tsx +++ b/src/view/screens/Settings/index.tsx @@ -71,6 +71,7 @@ import {UserAvatar} from 'view/com/util/UserAvatar' import {ScrollView} from 'view/com/util/Views' import {useDialogControl} from '#/components/Dialog' import {BirthDateSettingsDialog} from '#/components/dialogs/BirthDateSettings' +import {navigate, resetToTab} from '#/Navigation' import {ExportCarDialog} from './ExportCarDialog' function SettingsAccountCard({account}: {account: SessionAccount}) { @@ -104,7 +105,14 @@ function SettingsAccountCard({account}: {account: SessionAccount}) { { - logout('Settings') + if (isNative) { + logout('Settings') + resetToTab('HomeTab') + } else { + navigate('Home').then(() => { + logout('Settings') + }) + } }} accessibilityRole="button" accessibilityLabel={_(msg`Sign out`)} diff --git a/src/view/shell/Drawer.tsx b/src/view/shell/Drawer.tsx index 1bf5647f66..a7342179d4 100644 --- a/src/view/shell/Drawer.tsx +++ b/src/view/shell/Drawer.tsx @@ -9,49 +9,49 @@ import { View, ViewStyle, } from 'react-native' -import {useNavigation, StackActions} from '@react-navigation/native' import { FontAwesomeIcon, FontAwesomeIconStyle, } from '@fortawesome/react-native-fontawesome' -import {s, colors} from 'lib/styles' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' +import {StackActions, useNavigation} from '@react-navigation/native' + +import {emitSoftReset} from '#/state/events' +import {useUnreadNotifications} from '#/state/queries/notifications/unread' +import {useProfileQuery} from '#/state/queries/profile' +import {SessionAccount, useSession} from '#/state/session' +import {useSetDrawerOpen} from '#/state/shell' +import {useAnalytics} from 'lib/analytics/analytics' import {FEEDBACK_FORM_URL, HELP_DESK_URL} from 'lib/constants' +import {useNavigationTabState} from 'lib/hooks/useNavigationTabState' +import {usePalette} from 'lib/hooks/usePalette' import { - HomeIcon, - HomeIconSolid, BellIcon, BellIconSolid, - UserIcon, CogIcon, + HandIcon, + HashtagIcon, + HomeIcon, + HomeIconSolid, + ListIcon, MagnifyingGlassIcon2, MagnifyingGlassIcon2Solid, + UserIcon, UserIconSolid, - HashtagIcon, - ListIcon, - HandIcon, } from 'lib/icons' -import {UserAvatar} from 'view/com/util/UserAvatar' -import {Text} from 'view/com/util/text/Text' -import {useTheme} from 'lib/ThemeContext' -import {usePalette} from 'lib/hooks/usePalette' -import {useAnalytics} from 'lib/analytics/analytics' -import {pluralize} from 'lib/strings/helpers' import {getTabState, TabState} from 'lib/routes/helpers' import {NavigationProp} from 'lib/routes/types' -import {useNavigationTabState} from 'lib/hooks/useNavigationTabState' +import {pluralize} from 'lib/strings/helpers' +import {colors, s} from 'lib/styles' +import {useTheme} from 'lib/ThemeContext' import {isWeb} from 'platform/detection' -import {formatCountShortOnly} from 'view/com/util/numeric/format' -import {Trans, msg} from '@lingui/macro' -import {useLingui} from '@lingui/react' -import {useSetDrawerOpen} from '#/state/shell' -import {useSession, SessionAccount} from '#/state/session' -import {useProfileQuery} from '#/state/queries/profile' -import {useUnreadNotifications} from '#/state/queries/notifications/unread' -import {emitSoftReset} from '#/state/events' import {NavSignupCard} from '#/view/shell/NavSignupCard' -import {TextLink} from '../com/util/Link' - +import {formatCountShortOnly} from 'view/com/util/numeric/format' +import {Text} from 'view/com/util/text/Text' +import {UserAvatar} from 'view/com/util/UserAvatar' import {useTheme as useAlfTheme} from '#/alf' +import {TextLink} from '../com/util/Link' let DrawerProfileCard = ({ account, @@ -246,7 +246,11 @@ let DrawerContent = ({}: {}): React.ReactNode => { ) : ( - + <> + + + + )} diff --git a/src/view/shell/NavSignupCard.tsx b/src/view/shell/NavSignupCard.tsx index 83d1414984..aa807f0cc6 100644 --- a/src/view/shell/NavSignupCard.tsx +++ b/src/view/shell/NavSignupCard.tsx @@ -3,13 +3,16 @@ import {View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {s} from 'lib/styles' -import {usePalette} from 'lib/hooks/usePalette' -import {Text} from '#/view/com/util/text/Text' -import {Button} from '#/view/com/util/forms/Button' import {useLoggedOutViewControls} from '#/state/shell/logged-out' import {useCloseAllActiveElements} from '#/state/util' +import {usePalette} from 'lib/hooks/usePalette' +import {s} from 'lib/styles' +import {Button} from '#/view/com/util/forms/Button' +import {Text} from '#/view/com/util/text/Text' import {Logo} from '#/view/icons/Logo' +import {atoms as a} from '#/alf' +import {AppLanguageDropdown} from '#/components/AppLanguageDropdown' +import {Link} from '#/components/Link' let NavSignupCard = ({}: {}): React.ReactNode => { const {_} = useLingui() @@ -35,7 +38,9 @@ let NavSignupCard = ({}: {}): React.ReactNode => { paddingTop: 6, marginBottom: 24, }}> - + + + @@ -62,6 +67,10 @@ let NavSignupCard = ({}: {}): React.ReactNode => { + + + + ) } diff --git a/src/view/shell/index.tsx b/src/view/shell/index.tsx index f29183095a..c554112ed5 100644 --- a/src/view/shell/index.tsx +++ b/src/view/shell/index.tsx @@ -1,37 +1,39 @@ import React from 'react' -import {StatusBar} from 'expo-status-bar' import { + BackHandler, DimensionValue, StyleSheet, useWindowDimensions, View, - BackHandler, } from 'react-native' -import {useSafeAreaInsets} from 'react-native-safe-area-context' import {Drawer} from 'react-native-drawer-layout' +import Animated from 'react-native-reanimated' +import {useSafeAreaInsets} from 'react-native-safe-area-context' +import {StatusBar} from 'expo-status-bar' import {useNavigationState} from '@react-navigation/native' -import {ModalsContainer} from 'view/com/modals/Modal' -import {Lightbox} from 'view/com/lightbox/Lightbox' -import {ErrorBoundary} from 'view/com/util/ErrorBoundary' -import {DrawerContent} from './Drawer' -import {Composer} from './Composer' -import {useTheme} from 'lib/ThemeContext' -import {usePalette} from 'lib/hooks/usePalette' -import {RoutesContainer, TabsNavigator} from '../../Navigation' -import {isStateAtTabRoot} from 'lib/routes/helpers' + +import {useSession} from '#/state/session' import { useIsDrawerOpen, - useSetDrawerOpen, useIsDrawerSwipeDisabled, + useSetDrawerOpen, } from '#/state/shell' -import {isAndroid} from 'platform/detection' -import {useSession} from '#/state/session' import {useCloseAnyActiveElement} from '#/state/util' +import {usePalette} from 'lib/hooks/usePalette' import * as notifications from 'lib/notifications/notifications' -import {Outlet as PortalOutlet} from '#/components/Portal' -import {MutedWordsDialog} from '#/components/dialogs/MutedWords' +import {isStateAtTabRoot} from 'lib/routes/helpers' +import {useTheme} from 'lib/ThemeContext' +import {isAndroid} from 'platform/detection' import {useDialogStateContext} from 'state/dialogs' -import Animated from 'react-native-reanimated' +import {Lightbox} from 'view/com/lightbox/Lightbox' +import {ModalsContainer} from 'view/com/modals/Modal' +import {ErrorBoundary} from 'view/com/util/ErrorBoundary' +import {MutedWordsDialog} from '#/components/dialogs/MutedWords' +import {SigninDialog} from '#/components/dialogs/Signin' +import {Outlet as PortalOutlet} from '#/components/Portal' +import {RoutesContainer, TabsNavigator} from '../../Navigation' +import {Composer} from './Composer' +import {DrawerContent} from './Drawer' function ShellInner() { const isDrawerOpen = useIsDrawerOpen() @@ -101,6 +103,7 @@ function ShellInner() { + diff --git a/src/view/shell/index.web.tsx b/src/view/shell/index.web.tsx index 02993ac462..51fb4a0a11 100644 --- a/src/view/shell/index.web.tsx +++ b/src/view/shell/index.web.tsx @@ -1,24 +1,25 @@ import React, {useEffect} from 'react' -import {View, StyleSheet, TouchableOpacity} from 'react-native' -import {useNavigation} from '@react-navigation/native' +import {StyleSheet, TouchableOpacity, View} from 'react-native' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' +import {useNavigation} from '@react-navigation/native' -import {ErrorBoundary} from '../com/util/ErrorBoundary' -import {Lightbox} from '../com/lightbox/Lightbox' -import {ModalsContainer} from '../com/modals/Modal' -import {Composer} from './Composer.web' -import {useColorSchemeStyle} from 'lib/hooks/useColorSchemeStyle' -import {s, colors} from 'lib/styles' -import {RoutesContainer, FlatNavigator} from '../../Navigation' -import {DrawerContent} from './Drawer' -import {useWebMediaQueries} from '../../lib/hooks/useWebMediaQueries' -import {NavigationProp} from 'lib/routes/types' +import {useWebBodyScrollLock} from '#/lib/hooks/useWebBodyScrollLock' import {useIsDrawerOpen, useSetDrawerOpen} from '#/state/shell' import {useCloseAllActiveElements} from '#/state/util' -import {useWebBodyScrollLock} from '#/lib/hooks/useWebBodyScrollLock' -import {Outlet as PortalOutlet} from '#/components/Portal' +import {useColorSchemeStyle} from 'lib/hooks/useColorSchemeStyle' +import {NavigationProp} from 'lib/routes/types' +import {colors, s} from 'lib/styles' import {MutedWordsDialog} from '#/components/dialogs/MutedWords' +import {SigninDialog} from '#/components/dialogs/Signin' +import {Outlet as PortalOutlet} from '#/components/Portal' +import {useWebMediaQueries} from '../../lib/hooks/useWebMediaQueries' +import {FlatNavigator, RoutesContainer} from '../../Navigation' +import {Lightbox} from '../com/lightbox/Lightbox' +import {ModalsContainer} from '../com/modals/Modal' +import {ErrorBoundary} from '../com/util/ErrorBoundary' +import {Composer} from './Composer.web' +import {DrawerContent} from './Drawer' function ShellInner() { const isDrawerOpen = useIsDrawerOpen() @@ -45,6 +46,7 @@ function ShellInner() { + From 4fab3c42f9b4c96b68b8779ab2e5334071887448 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Fri, 12 Apr 2024 14:43:55 -0700 Subject: [PATCH 040/185] Remove report post option from PWI (#3510) --- src/view/com/util/forms/PostDropdownBtn.tsx | 46 +++++++++++---------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/view/com/util/forms/PostDropdownBtn.tsx b/src/view/com/util/forms/PostDropdownBtn.tsx index 959e0f692e..04dfa203a1 100644 --- a/src/view/com/util/forms/PostDropdownBtn.tsx +++ b/src/view/com/util/forms/PostDropdownBtn.tsx @@ -283,29 +283,33 @@ let PostDropdownBtn = ({ )} - + {hasSession && ( + <> + - - {!isAuthor && ( - reportDialogControl.open()}> - {_(msg`Report post`)} - - - )} + + {!isAuthor && ( + reportDialogControl.open()}> + {_(msg`Report post`)} + + + )} - {isAuthor && ( - - {_(msg`Delete post`)} - - - )} - + {isAuthor && ( + + {_(msg`Delete post`)} + + + )} + + + )} From 7b02b5d716e172f30191fabb30fd2e943e594542 Mon Sep 17 00:00:00 2001 From: Minseo Lee Date: Sat, 13 Apr 2024 06:45:13 +0900 Subject: [PATCH 041/185] Update Korean localization (#3491) * Update messages.po * Update messages.po --- src/locale/locales/ko/messages.po | 629 +++++++++++++++--------------- 1 file changed, 307 insertions(+), 322 deletions(-) diff --git a/src/locale/locales/ko/messages.po b/src/locale/locales/ko/messages.po index 48c7a235bd..572b64a4f1 100644 --- a/src/locale/locales/ko/messages.po +++ b/src/locale/locales/ko/messages.po @@ -54,7 +54,7 @@ msgid "⚠Invalid Handle" msgstr "⚠잘못된 핸들" #: src/view/com/util/ViewHeader.tsx:89 -#: src/view/screens/Search/Search.tsx:649 +#: src/view/screens/Search/Search.tsx:739 msgid "Access navigation links and settings" msgstr "탐색 링크 및 설정으로 이동합니다" @@ -63,7 +63,7 @@ msgid "Access profile and other navigation links" msgstr "프로필 및 기타 탐색 링크로 이동합니다" #: src/view/com/modals/EditImage.tsx:300 -#: src/view/screens/Settings/index.tsx:470 +#: src/view/screens/Settings/index.tsx:413 msgid "Accessibility" msgstr "접근성" @@ -72,8 +72,8 @@ msgid "account" msgstr "계정" #: src/screens/Login/LoginForm.tsx:144 -#: src/view/screens/Settings/index.tsx:327 -#: src/view/screens/Settings/index.tsx:743 +#: src/view/screens/Settings/index.tsx:322 +#: src/view/screens/Settings/index.tsx:699 msgid "Account" msgstr "계정" @@ -123,7 +123,7 @@ msgstr "계정 언뮤트됨" #: src/view/com/auth/onboarding/RecommendedFeedsItem.tsx:150 #: src/view/com/modals/ListAddRemoveUsers.tsx:268 #: src/view/com/modals/UserAddRemoveLists.tsx:219 -#: src/view/screens/ProfileList.tsx:827 +#: src/view/screens/ProfileList.tsx:829 msgid "Add" msgstr "추가" @@ -131,13 +131,13 @@ msgstr "추가" msgid "Add a content warning" msgstr "콘텐츠 경고 추가" -#: src/view/screens/ProfileList.tsx:817 +#: src/view/screens/ProfileList.tsx:819 msgid "Add a user to this list" msgstr "이 리스트에 사용자 추가" #: src/components/dialogs/SwitchAccount.tsx:55 -#: src/view/screens/Settings/index.tsx:402 -#: src/view/screens/Settings/index.tsx:411 +#: src/view/screens/Settings/index.tsx:397 +#: src/view/screens/Settings/index.tsx:406 msgid "Add account" msgstr "계정 추가" @@ -210,7 +210,7 @@ msgid "Adult content is disabled." msgstr "성인 콘텐츠가 비활성화되어 있습니다." #: src/screens/Moderation/index.tsx:375 -#: src/view/screens/Settings/index.tsx:684 +#: src/view/screens/Settings/index.tsx:627 msgid "Advanced" msgstr "고급" @@ -287,13 +287,13 @@ msgstr "앱 비밀번호 이름에는 문자, 숫자, 공백, 대시, 밑줄만 msgid "App Password names must be at least 4 characters long." msgstr "앱 비밀번호 이름은 4자 이상이어야 합니다." -#: src/view/screens/Settings/index.tsx:695 +#: src/view/screens/Settings/index.tsx:638 msgid "App password settings" msgstr "앱 비밀번호 설정" #: src/Navigation.tsx:251 #: src/view/screens/AppPasswords.tsx:189 -#: src/view/screens/Settings/index.tsx:704 +#: src/view/screens/Settings/index.tsx:647 msgid "App Passwords" msgstr "앱 비밀번호" @@ -310,7 +310,7 @@ msgstr "\"{0}\" 라벨 이의신청" msgid "Appeal submitted." msgstr "이의신청 제출함" -#: src/view/screens/Settings/index.tsx:485 +#: src/view/screens/Settings/index.tsx:428 msgid "Appearance" msgstr "모양" @@ -366,7 +366,7 @@ msgstr "뒤로" msgid "Based on your interest in {interestsText}" msgstr "{interestsText}에 대한 관심사 기반" -#: src/view/screens/Settings/index.tsx:542 +#: src/view/screens/Settings/index.tsx:485 msgid "Basics" msgstr "기본" @@ -374,7 +374,7 @@ msgstr "기본" msgid "Birthday" msgstr "생년월일" -#: src/view/screens/Settings/index.tsx:359 +#: src/view/screens/Settings/index.tsx:354 msgid "Birthday:" msgstr "생년월일:" @@ -392,16 +392,16 @@ msgstr "계정 차단" msgid "Block Account?" msgstr "계정을 차단하시겠습니까?" -#: src/view/screens/ProfileList.tsx:530 +#: src/view/screens/ProfileList.tsx:532 msgid "Block accounts" msgstr "계정 차단" -#: src/view/screens/ProfileList.tsx:478 -#: src/view/screens/ProfileList.tsx:634 +#: src/view/screens/ProfileList.tsx:480 +#: src/view/screens/ProfileList.tsx:636 msgid "Block list" msgstr "리스트 차단" -#: src/view/screens/ProfileList.tsx:629 +#: src/view/screens/ProfileList.tsx:631 msgid "Block these accounts?" msgstr "이 계정들을 차단하시겠습니까?" @@ -431,11 +431,11 @@ msgstr "차단한 계정은 내 스레드에 답글을 달거나 나를 멘션 msgid "Blocked post." msgstr "차단된 게시물." -#: src/screens/Profile/Sections/Labels.tsx:152 +#: src/screens/Profile/Sections/Labels.tsx:163 msgid "Blocking does not prevent this labeler from placing labels on your account." msgstr "차단하더라도 이 라벨러가 내 계정에 라벨을 붙이는 것을 막지는 못합니다." -#: src/view/screens/ProfileList.tsx:631 +#: src/view/screens/ProfileList.tsx:633 msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." msgstr "차단 목록은 공개됩니다. 차단한 계정은 내 스레드에 답글을 달거나 나를 멘션하거나 기타 다른 방식으로 나와 상호작용할 수 없습니다." @@ -489,10 +489,6 @@ msgstr "이미지 흐리게 및 피드에서 필터링" msgid "Books" msgstr "책" -#: src/view/screens/Settings/index.tsx:893 -#~ msgid "Build version {0} {1}" -#~ msgstr "빌드 버전 {0} {1}" - #: src/view/com/auth/HomeLoggedOutCTA.tsx:92 #: src/view/com/auth/SplashScreen.web.tsx:166 msgid "Business" @@ -552,7 +548,7 @@ msgstr "글자, 숫자, 공백, 대시, 밑줄만 포함할 수 있습니다. #: src/view/com/modals/Repost.tsx:88 #: src/view/com/modals/VerifyEmail.tsx:247 #: src/view/com/modals/VerifyEmail.tsx:253 -#: src/view/screens/Search/Search.tsx:718 +#: src/view/screens/Search/Search.tsx:808 #: src/view/shell/desktop/Search.tsx:239 msgid "Cancel" msgstr "취소" @@ -598,17 +594,17 @@ msgstr "연결된 웹사이트를 여는 것을 취소합니다" msgid "Change" msgstr "변경" -#: src/view/screens/Settings/index.tsx:353 +#: src/view/screens/Settings/index.tsx:348 msgctxt "action" msgid "Change" msgstr "변경" -#: src/view/screens/Settings/index.tsx:716 +#: src/view/screens/Settings/index.tsx:659 msgid "Change handle" msgstr "핸들 변경" #: src/view/com/modals/ChangeHandle.tsx:162 -#: src/view/screens/Settings/index.tsx:727 +#: src/view/screens/Settings/index.tsx:670 msgid "Change Handle" msgstr "핸들 변경" @@ -616,12 +612,12 @@ msgstr "핸들 변경" msgid "Change my email" msgstr "내 이메일 변경하기" -#: src/view/screens/Settings/index.tsx:754 +#: src/view/screens/Settings/index.tsx:710 msgid "Change password" msgstr "비밀번호 변경" #: src/view/com/modals/ChangePassword.tsx:141 -#: src/view/screens/Settings/index.tsx:765 +#: src/view/screens/Settings/index.tsx:721 msgid "Change Password" msgstr "비밀번호 변경" @@ -675,32 +671,32 @@ msgstr "기본 피드 선택" msgid "Choose your password" msgstr "비밀번호를 입력하세요" -#: src/view/screens/Settings/index.tsx:868 +#: src/view/screens/Settings/index.tsx:824 msgid "Clear all legacy storage data" msgstr "모든 레거시 스토리지 데이터 지우기" -#: src/view/screens/Settings/index.tsx:871 +#: src/view/screens/Settings/index.tsx:827 msgid "Clear all legacy storage data (restart after this)" msgstr "모든 레거시 스토리지 데이터 지우기 (이후 다시 시작)" -#: src/view/screens/Settings/index.tsx:880 +#: src/view/screens/Settings/index.tsx:836 msgid "Clear all storage data" msgstr "모든 스토리지 데이터 지우기" -#: src/view/screens/Settings/index.tsx:883 +#: src/view/screens/Settings/index.tsx:839 msgid "Clear all storage data (restart after this)" msgstr "모든 스토리지 데이터 지우기 (이후 다시 시작)" #: src/view/com/util/forms/SearchInput.tsx:88 -#: src/view/screens/Search/Search.tsx:699 +#: src/view/screens/Search/Search.tsx:789 msgid "Clear search query" msgstr "검색어 지우기" -#: src/view/screens/Settings/index.tsx:869 +#: src/view/screens/Settings/index.tsx:825 msgid "Clears all legacy storage data" msgstr "모든 레거시 스토리지 데이터를 지웁니다" -#: src/view/screens/Settings/index.tsx:881 +#: src/view/screens/Settings/index.tsx:837 msgid "Clears all storage data" msgstr "모든 스토리지 데이터를 지웁니다" @@ -939,7 +935,7 @@ msgstr "요리" msgid "Copied" msgstr "복사됨" -#: src/view/screens/Settings/index.tsx:251 +#: src/view/screens/Settings/index.tsx:246 msgid "Copied build version to clipboard" msgstr "빌드 버전 클립보드에 복사됨" @@ -962,7 +958,7 @@ msgstr "복사" msgid "Copy {0}" msgstr "{0} 복사" -#: src/view/screens/ProfileList.tsx:388 +#: src/view/screens/ProfileList.tsx:390 msgid "Copy link to list" msgstr "리스트 링크 복사" @@ -985,7 +981,7 @@ msgstr "저작권 정책" msgid "Could not load feed" msgstr "피드를 불러올 수 없습니다" -#: src/view/screens/ProfileList.tsx:907 +#: src/view/screens/ProfileList.tsx:909 msgid "Could not load list" msgstr "리스트를 불러올 수 없습니다" @@ -995,7 +991,7 @@ msgstr "리스트를 불러올 수 없습니다" msgid "Create a new account" msgstr "새 계정 만들기" -#: src/view/screens/Settings/index.tsx:403 +#: src/view/screens/Settings/index.tsx:398 msgid "Create a new Bluesky account" msgstr "새 Bluesky 계정을 만듭니다" @@ -1013,7 +1009,7 @@ msgstr "앱 비밀번호 만들기" msgid "Create new account" msgstr "새 계정 만들기" -#: src/components/ReportDialog/SelectReportOptionView.tsx:93 +#: src/components/ReportDialog/SelectReportOptionView.tsx:94 msgid "Create report for {0}" msgstr "{0}에 대한 신고 작성하기" @@ -1047,8 +1043,8 @@ msgstr "커뮤니티에서 구축한 맞춤 피드는 새로운 경험을 제공 msgid "Customize media from external sites." msgstr "외부 사이트 미디어를 사용자 지정합니다." -#: src/view/screens/Settings/index.tsx:504 -#: src/view/screens/Settings/index.tsx:530 +#: src/view/screens/Settings/index.tsx:447 +#: src/view/screens/Settings/index.tsx:473 msgid "Dark" msgstr "어두움" @@ -1056,7 +1052,7 @@ msgstr "어두움" msgid "Dark mode" msgstr "어두운 모드" -#: src/view/screens/Settings/index.tsx:517 +#: src/view/screens/Settings/index.tsx:460 msgid "Dark Theme" msgstr "어두운 테마" @@ -1064,7 +1060,7 @@ msgstr "어두운 테마" msgid "Date of birth" msgstr "생년월일" -#: src/view/screens/Settings/index.tsx:841 +#: src/view/screens/Settings/index.tsx:797 msgid "Debug Moderation" msgstr "검토 디버그" @@ -1074,11 +1070,11 @@ msgstr "디버그 패널" #: src/view/com/util/forms/PostDropdownBtn.tsx:319 #: src/view/screens/AppPasswords.tsx:268 -#: src/view/screens/ProfileList.tsx:613 +#: src/view/screens/ProfileList.tsx:615 msgid "Delete" msgstr "삭제" -#: src/view/screens/Settings/index.tsx:796 +#: src/view/screens/Settings/index.tsx:752 msgid "Delete account" msgstr "계정 삭제" @@ -1094,7 +1090,7 @@ msgstr "앱 비밀번호 삭제" msgid "Delete app password?" msgstr "앱 비밀번호를 삭제하시겠습니까?" -#: src/view/screens/ProfileList.tsx:415 +#: src/view/screens/ProfileList.tsx:417 msgid "Delete List" msgstr "리스트 삭제" @@ -1102,7 +1098,7 @@ msgstr "리스트 삭제" msgid "Delete my account" msgstr "내 계정 삭제" -#: src/view/screens/Settings/index.tsx:808 +#: src/view/screens/Settings/index.tsx:764 msgid "Delete My Account…" msgstr "내 계정 삭제…" @@ -1111,7 +1107,7 @@ msgstr "내 계정 삭제…" msgid "Delete post" msgstr "게시물 삭제" -#: src/view/screens/ProfileList.tsx:608 +#: src/view/screens/ProfileList.tsx:610 msgid "Delete this list?" msgstr "이 리스트를 삭제하시겠습니까?" @@ -1138,10 +1134,18 @@ msgstr "설명" msgid "Did you want to say anything?" msgstr "하고 싶은 말이 있나요?" -#: src/view/screens/Settings/index.tsx:523 +#: src/view/screens/Settings/index.tsx:466 msgid "Dim" msgstr "어둑함" +#: src/view/screens/Settings/index.tsx:689 +msgid "Disable haptics" +msgstr "햅틱 끄기" + +#: src/view/screens/Settings/index.tsx:689 +msgid "Disable vibrations" +msgstr "진동 끄기" + #: src/lib/moderation/useLabelBehaviorDescription.ts:32 #: src/lib/moderation/useLabelBehaviorDescription.ts:42 #: src/lib/moderation/useLabelBehaviorDescription.ts:68 @@ -1302,7 +1306,7 @@ msgstr "아바타 편집" msgid "Edit image" msgstr "이미지 편집" -#: src/view/screens/ProfileList.tsx:403 +#: src/view/screens/ProfileList.tsx:405 msgid "Edit list details" msgstr "리스트 세부 정보 편집" @@ -1312,7 +1316,7 @@ msgstr "검토 리스트 편집" #: src/Navigation.tsx:256 #: src/view/screens/Feeds.tsx:434 -#: src/view/screens/SavedFeeds.tsx:84 +#: src/view/screens/SavedFeeds.tsx:85 msgid "Edit My Feeds" msgstr "내 피드 편집" @@ -1320,12 +1324,12 @@ msgstr "내 피드 편집" msgid "Edit my profile" msgstr "내 프로필 편집" -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:171 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:172 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:168 msgid "Edit profile" msgstr "프로필 편집" -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:174 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:175 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:171 msgid "Edit Profile" msgstr "프로필 편집" @@ -1373,13 +1377,13 @@ msgstr "이메일 변경됨" msgid "Email verified" msgstr "이메일 확인됨" -#: src/view/screens/Settings/index.tsx:331 +#: src/view/screens/Settings/index.tsx:326 msgid "Email:" msgstr "이메일:" #: src/components/dialogs/EmbedConsent.tsx:101 msgid "Enable {0} only" -msgstr "{0}만 사용" +msgstr "{0}에서만 사용" #: src/screens/Moderation/index.tsx:329 msgid "Enable adult content" @@ -1397,11 +1401,7 @@ msgstr "피드에서 성인 콘텐츠 사용" #: src/components/dialogs/EmbedConsent.tsx:82 #: src/components/dialogs/EmbedConsent.tsx:89 msgid "Enable external media" -msgstr "" - -#: src/view/com/modals/EmbedConsent.tsx:97 -#~ msgid "Enable External Media" -#~ msgstr "외부 미디어 사용" +msgstr "외부 미디어 사용" #: src/view/screens/PreferencesExternalEmbeds.tsx:75 msgid "Enable media players for" @@ -1413,13 +1413,13 @@ msgstr "내가 팔로우하는 사람들 간의 답글만 표시합니다." #: src/components/dialogs/EmbedConsent.tsx:94 msgid "Enable this source only" -msgstr "" +msgstr "이 소스에서만 사용" #: src/screens/Moderation/index.tsx:339 msgid "Enabled" msgstr "활성화됨" -#: src/screens/Profile/Sections/Feed.tsx:84 +#: src/screens/Profile/Sections/Feed.tsx:100 msgid "End of feed" msgstr "피드 끝" @@ -1477,7 +1477,7 @@ msgstr "사용자 이름 및 비밀번호 입력" msgid "Error receiving captcha response." msgstr "캡차 응답을 수신하는 동안 오류가 발생했습니다." -#: src/view/screens/Search/Search.tsx:111 +#: src/view/screens/Search/Search.tsx:112 msgid "Error:" msgstr "오류:" @@ -1527,12 +1527,12 @@ msgstr "노골적이거나 불쾌감을 줄 수 있는 미디어." msgid "Explicit sexual images." msgstr "노골적인 성적 이미지." -#: src/view/screens/Settings/index.tsx:777 +#: src/view/screens/Settings/index.tsx:733 msgid "Export my data" msgstr "내 데이터 내보내기" #: src/view/screens/Settings/ExportCarDialog.tsx:44 -#: src/view/screens/Settings/index.tsx:788 +#: src/view/screens/Settings/index.tsx:744 msgid "Export My Data" msgstr "내 데이터 내보내기" @@ -1548,11 +1548,11 @@ msgstr "외부 미디어는 웹사이트가 나와 내 기기에 대한 정보 #: src/Navigation.tsx:275 #: src/view/screens/PreferencesExternalEmbeds.tsx:52 -#: src/view/screens/Settings/index.tsx:677 +#: src/view/screens/Settings/index.tsx:620 msgid "External Media Preferences" msgstr "외부 미디어 설정" -#: src/view/screens/Settings/index.tsx:668 +#: src/view/screens/Settings/index.tsx:611 msgid "External media settings" msgstr "외부 미디어 설정" @@ -1598,8 +1598,8 @@ msgstr "피드백" #: src/Navigation.tsx:464 #: src/view/screens/Feeds.tsx:419 #: src/view/screens/Feeds.tsx:524 -#: src/view/screens/Profile.tsx:194 -#: src/view/shell/bottom-bar/BottomBar.tsx:191 +#: src/view/screens/Profile.tsx:200 +#: src/view/shell/bottom-bar/BottomBar.tsx:192 #: src/view/shell/desktop/LeftNav.tsx:346 #: src/view/shell/Drawer.tsx:479 #: src/view/shell/Drawer.tsx:480 @@ -1610,7 +1610,7 @@ msgstr "피드" msgid "Feeds are created by users to curate content. Choose some feeds that you find interesting." msgstr "피드는 콘텐츠를 큐레이션하기 위해 사용자에 의해 만들어집니다. 관심 있는 피드를 선택하세요." -#: src/view/screens/SavedFeeds.tsx:156 +#: src/view/screens/SavedFeeds.tsx:157 msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information." msgstr "피드는 사용자가 약간의 코딩 전문 지식만으로 구축할 수 있는 맞춤 알고리즘입니다. <0/>에서 자세한 내용을 확인하세요." @@ -1636,11 +1636,11 @@ msgstr "마무리 중" msgid "Find accounts to follow" msgstr "팔로우할 계정 찾아보기" -#: src/view/screens/Search/Search.tsx:442 +#: src/view/screens/Search/Search.tsx:532 msgid "Find users on Bluesky" msgstr "Bluesky에서 사용자 찾기" -#: src/view/screens/Search/Search.tsx:440 +#: src/view/screens/Search/Search.tsx:530 msgid "Find users with the search tool on the right" msgstr "오른쪽의 검색 도구로 사용자 찾기" @@ -1703,7 +1703,7 @@ msgstr "모두 팔로우" #: src/view/com/post-thread/PostThreadFollowBtn.tsx:144 msgid "Follow Back" -msgstr "" +msgstr "맞팔로우" #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:182 msgid "Follow selected accounts and continue to the next step" @@ -1745,7 +1745,7 @@ msgstr "팔로우 중" msgid "Following {0}" msgstr "{0} 님을 팔로우했습니다" -#: src/view/screens/Settings/index.tsx:553 +#: src/view/screens/Settings/index.tsx:496 msgid "Following feed preferences" msgstr "팔로우 중 피드 설정" @@ -1753,7 +1753,7 @@ msgstr "팔로우 중 피드 설정" #: src/view/com/home/HomeHeaderLayout.web.tsx:50 #: src/view/com/home/HomeHeaderLayoutMobile.tsx:84 #: src/view/screens/PreferencesFollowingFeed.tsx:104 -#: src/view/screens/Settings/index.tsx:562 +#: src/view/screens/Settings/index.tsx:505 msgid "Following Feed Preferences" msgstr "팔로우 중 피드 설정" @@ -1823,7 +1823,7 @@ msgstr "명백한 법률 또는 서비스 이용약관 위반 행위" #: src/view/com/auth/LoggedOut.tsx:83 #: src/view/screens/NotFound.tsx:55 #: src/view/screens/ProfileFeed.tsx:112 -#: src/view/screens/ProfileList.tsx:916 +#: src/view/screens/ProfileList.tsx:918 #: src/view/shell/desktop/LeftNav.tsx:108 msgid "Go back" msgstr "뒤로" @@ -1833,12 +1833,12 @@ msgstr "뒤로" #: src/screens/Profile/ErrorState.tsx:66 #: src/view/screens/NotFound.tsx:54 #: src/view/screens/ProfileFeed.tsx:117 -#: src/view/screens/ProfileList.tsx:921 +#: src/view/screens/ProfileList.tsx:923 msgid "Go Back" msgstr "뒤로" #: src/components/ReportDialog/SelectReportOptionView.tsx:73 -#: src/components/ReportDialog/SubmitView.tsx:104 +#: src/components/ReportDialog/SubmitView.tsx:102 #: src/screens/Onboarding/Layout.tsx:102 #: src/screens/Onboarding/Layout.tsx:191 #: src/screens/Signup/index.tsx:173 @@ -1853,7 +1853,7 @@ msgstr "홈으로 이동" msgid "Go Home" msgstr "홈으로 이동" -#: src/view/screens/Search/Search.tsx:749 +#: src/view/screens/Search/Search.tsx:839 #: src/view/shell/desktop/Search.tsx:263 msgid "Go to @{queryMaybeHandle}" msgstr "@{queryMaybeHandle}(으)로 이동" @@ -1973,7 +1973,7 @@ msgid "Hmmmm, we couldn't load that moderation service." msgstr "검토 서비스를 불러올 수 없습니다." #: src/Navigation.tsx:454 -#: src/view/shell/bottom-bar/BottomBar.tsx:147 +#: src/view/shell/bottom-bar/BottomBar.tsx:148 #: src/view/shell/desktop/LeftNav.tsx:310 #: src/view/shell/Drawer.tsx:401 #: src/view/shell/Drawer.tsx:402 @@ -2019,7 +2019,7 @@ msgstr "아무것도 선택하지 않으면 모든 연령대에 적합하다는 msgid "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." msgstr "해당 국가의 법률에 따라 아직 성인이 아닌 경우, 부모 또는 법적 보호자가 대신 이 약관을 읽어야 합니다." -#: src/view/screens/ProfileList.tsx:610 +#: src/view/screens/ProfileList.tsx:612 msgid "If you delete this list, you won't be able to recover it." msgstr "이 리스트를 삭제하면 다시 복구할 수 없습니다." @@ -2140,11 +2140,11 @@ msgstr "{0} 님이 라벨 지정함." msgid "Labeled by the author." msgstr "작성자가 라벨 지정함." -#: src/view/screens/Profile.tsx:188 +#: src/view/screens/Profile.tsx:194 msgid "Labels" msgstr "라벨" -#: src/screens/Profile/Sections/Labels.tsx:142 +#: src/screens/Profile/Sections/Labels.tsx:153 msgid "Labels are annotations on users and content. They can be used to hide, warn, and categorize the network." msgstr "라벨은 사용자 및 콘텐츠에 대한 주석입니다. 네트워크를 숨기고, 경고하고, 분류하는 데 사용할 수 있습니다." @@ -2164,7 +2164,7 @@ msgstr "내 콘텐츠의 라벨" msgid "Language selection" msgstr "언어 선택" -#: src/view/screens/Settings/index.tsx:614 +#: src/view/screens/Settings/index.tsx:557 msgid "Language settings" msgstr "언어 설정" @@ -2173,10 +2173,14 @@ msgstr "언어 설정" msgid "Language Settings" msgstr "언어 설정" -#: src/view/screens/Settings/index.tsx:623 +#: src/view/screens/Settings/index.tsx:566 msgid "Languages" msgstr "언어" +#: src/view/screens/Search/Search.tsx:380 +msgid "Latest" +msgstr "최신" + #: src/components/moderation/ScreenHider.tsx:136 msgid "Learn More" msgstr "더 알아보기" @@ -2211,7 +2215,7 @@ msgstr "Bluesky 떠나기" msgid "left to go." msgstr "명 남았습니다." -#: src/view/screens/Settings/index.tsx:296 +#: src/view/screens/Settings/index.tsx:291 msgid "Legacy storage cleared, you need to restart the app now." msgstr "레거시 스토리지가 지워졌으며 지금 앱을 다시 시작해야 합니다." @@ -2224,16 +2228,16 @@ msgstr "비밀번호를 재설정해 봅시다!" msgid "Let's go!" msgstr "출발!" -#: src/view/screens/Settings/index.tsx:498 +#: src/view/screens/Settings/index.tsx:441 msgid "Light" msgstr "밝음" -#: src/view/com/util/post-ctrls/PostCtrls.tsx:195 +#: src/view/com/util/post-ctrls/PostCtrls.tsx:197 msgid "Like" msgstr "좋아요" -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:258 -#: src/view/screens/ProfileFeed.tsx:573 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:259 +#: src/view/screens/ProfileFeed.tsx:585 msgid "Like this feed" msgstr "이 피드에 좋아요 표시" @@ -2257,9 +2261,9 @@ msgstr "{0}명의 사용자가 좋아함" msgid "Liked by {count} {0}" msgstr "{count}명의 사용자가 좋아함" -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:278 -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:292 -#: src/view/screens/ProfileFeed.tsx:588 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:279 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:293 +#: src/view/screens/ProfileFeed.tsx:600 msgid "Liked by {likeCount} {0}" msgstr "{likeCount}명의 사용자가 좋아함" @@ -2271,7 +2275,7 @@ msgstr "님이 내 맞춤 피드를 좋아합니다" msgid "liked your post" msgstr "님이 내 게시물을 좋아합니다" -#: src/view/screens/Profile.tsx:193 +#: src/view/screens/Profile.tsx:199 msgid "Likes" msgstr "좋아요" @@ -2287,7 +2291,7 @@ msgstr "리스트" msgid "List Avatar" msgstr "리스트 아바타" -#: src/view/screens/ProfileList.tsx:311 +#: src/view/screens/ProfileList.tsx:313 msgid "List blocked" msgstr "리스트 차단됨" @@ -2295,11 +2299,11 @@ msgstr "리스트 차단됨" msgid "List by {0}" msgstr "{0} 님의 리스트" -#: src/view/screens/ProfileList.tsx:355 +#: src/view/screens/ProfileList.tsx:357 msgid "List deleted" msgstr "리스트 삭제됨" -#: src/view/screens/ProfileList.tsx:283 +#: src/view/screens/ProfileList.tsx:285 msgid "List muted" msgstr "리스트 뮤트됨" @@ -2307,17 +2311,17 @@ msgstr "리스트 뮤트됨" msgid "List Name" msgstr "리스트 이름" -#: src/view/screens/ProfileList.tsx:325 +#: src/view/screens/ProfileList.tsx:327 msgid "List unblocked" msgstr "리스트 차단 해제됨" -#: src/view/screens/ProfileList.tsx:297 +#: src/view/screens/ProfileList.tsx:299 msgid "List unmuted" msgstr "리스트 언뮤트됨" #: src/Navigation.tsx:114 -#: src/view/screens/Profile.tsx:189 #: src/view/screens/Profile.tsx:195 +#: src/view/screens/Profile.tsx:201 #: src/view/shell/desktop/LeftNav.tsx:383 #: src/view/shell/Drawer.tsx:495 #: src/view/shell/Drawer.tsx:496 @@ -2328,10 +2332,10 @@ msgstr "리스트" msgid "Load new notifications" msgstr "새 알림 불러오기" -#: src/screens/Profile/Sections/Feed.tsx:70 +#: src/screens/Profile/Sections/Feed.tsx:86 #: src/view/com/feeds/FeedPage.tsx:138 -#: src/view/screens/ProfileFeed.tsx:496 -#: src/view/screens/ProfileList.tsx:695 +#: src/view/screens/ProfileFeed.tsx:507 +#: src/view/screens/ProfileList.tsx:697 msgid "Load new posts" msgstr "새 게시물 불러오기" @@ -2370,7 +2374,7 @@ msgstr "이곳이 당신이 가고자 하는 곳인지 확인하세요!" msgid "Manage your muted words and tags" msgstr "뮤트한 단어 및 태그 관리" -#: src/view/screens/Profile.tsx:192 +#: src/view/screens/Profile.tsx:198 msgid "Media" msgstr "미디어" @@ -2383,7 +2387,7 @@ msgid "Mentioned users" msgstr "멘션한 사용자" #: src/view/com/util/ViewHeader.tsx:87 -#: src/view/screens/Search/Search.tsx:648 +#: src/view/screens/Search/Search.tsx:738 msgid "Menu" msgstr "메뉴" @@ -2397,7 +2401,7 @@ msgstr "오해의 소지가 있는 계정" #: src/Navigation.tsx:119 #: src/screens/Moderation/index.tsx:104 -#: src/view/screens/Settings/index.tsx:645 +#: src/view/screens/Settings/index.tsx:588 #: src/view/shell/desktop/LeftNav.tsx:401 #: src/view/shell/Drawer.tsx:514 #: src/view/shell/Drawer.tsx:515 @@ -2413,13 +2417,13 @@ msgstr "검토 세부 정보" msgid "Moderation list by {0}" msgstr "{0} 님의 검토 리스트" -#: src/view/screens/ProfileList.tsx:789 +#: src/view/screens/ProfileList.tsx:791 msgid "Moderation list by <0/>" msgstr "<0/> 님의 검토 리스트" #: src/view/com/lists/ListCard.tsx:91 #: src/view/com/modals/UserAddRemoveLists.tsx:204 -#: src/view/screens/ProfileList.tsx:787 +#: src/view/screens/ProfileList.tsx:789 msgid "Moderation list by you" msgstr "내 검토 리스트" @@ -2440,7 +2444,7 @@ msgstr "검토 리스트" msgid "Moderation Lists" msgstr "검토 리스트" -#: src/view/screens/Settings/index.tsx:639 +#: src/view/screens/Settings/index.tsx:582 msgid "Moderation settings" msgstr "검토 설정" @@ -2465,7 +2469,7 @@ msgstr "더 보기" msgid "More feeds" msgstr "피드 더 보기" -#: src/view/screens/ProfileList.tsx:599 +#: src/view/screens/ProfileList.tsx:601 msgid "More options" msgstr "옵션 더 보기" @@ -2486,7 +2490,7 @@ msgstr "{truncatedTag} 뮤트" msgid "Mute Account" msgstr "계정 뮤트" -#: src/view/screens/ProfileList.tsx:518 +#: src/view/screens/ProfileList.tsx:520 msgid "Mute accounts" msgstr "계정 뮤트" @@ -2502,12 +2506,12 @@ msgstr "태그에서만 뮤트" msgid "Mute in text & tags" msgstr "글 및 태그에서 뮤트" -#: src/view/screens/ProfileList.tsx:461 -#: src/view/screens/ProfileList.tsx:624 +#: src/view/screens/ProfileList.tsx:463 +#: src/view/screens/ProfileList.tsx:626 msgid "Mute list" msgstr "리스트 뮤트" -#: src/view/screens/ProfileList.tsx:619 +#: src/view/screens/ProfileList.tsx:621 msgid "Mute these accounts?" msgstr "이 계정들을 뮤트하시겠습니까?" @@ -2554,7 +2558,7 @@ msgstr "\"{0}\" 님이 뮤트함" msgid "Muted words & tags" msgstr "뮤트한 단어 및 태그" -#: src/view/screens/ProfileList.tsx:621 +#: src/view/screens/ProfileList.tsx:623 msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them." msgstr "뮤트 목록은 비공개입니다. 뮤트한 계정은 나와 상호작용할 수 있지만 해당 계정의 게시물을 보거나 해당 계정으로부터 알림을 받을 수 없습니다." @@ -2571,11 +2575,11 @@ msgstr "내 피드" msgid "My Profile" msgstr "내 프로필" -#: src/view/screens/Settings/index.tsx:596 +#: src/view/screens/Settings/index.tsx:539 msgid "My saved feeds" msgstr "내 저장된 피드" -#: src/view/screens/Settings/index.tsx:602 +#: src/view/screens/Settings/index.tsx:545 msgid "My Saved Feeds" msgstr "내 저장된 피드" @@ -2599,7 +2603,7 @@ msgid "Nature" msgstr "자연" #: src/screens/Login/ForgotPasswordForm.tsx:173 -#: src/screens/Login/LoginForm.tsx:254 +#: src/screens/Login/LoginForm.tsx:255 #: src/view/com/modals/ChangePassword.tsx:168 msgid "Navigates to the next screen" msgstr "다음 화면으로 이동합니다" @@ -2608,15 +2612,10 @@ msgstr "다음 화면으로 이동합니다" msgid "Navigates to your profile" msgstr "내 프로필로 이동합니다" -#: src/components/ReportDialog/SelectReportOptionView.tsx:122 +#: src/components/ReportDialog/SelectReportOptionView.tsx:123 msgid "Need to report a copyright violation?" msgstr "저작권 위반을 신고해야 하나요?" -#: src/view/com/modals/EmbedConsent.tsx:107 -#: src/view/com/modals/EmbedConsent.tsx:123 -#~ msgid "Never load embeds from {0}" -#~ msgstr "{0}에서 임베드를 불러오지 않습니다" - #: src/view/com/auth/onboarding/WelcomeDesktop.tsx:72 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:74 msgid "Never lose access to your followers and data." @@ -2658,10 +2657,10 @@ msgstr "새 게시물" #: src/view/screens/Feeds.tsx:555 #: src/view/screens/Notifications.tsx:168 -#: src/view/screens/Profile.tsx:452 -#: src/view/screens/ProfileFeed.tsx:434 -#: src/view/screens/ProfileList.tsx:199 -#: src/view/screens/ProfileList.tsx:227 +#: src/view/screens/Profile.tsx:481 +#: src/view/screens/ProfileFeed.tsx:445 +#: src/view/screens/ProfileList.tsx:200 +#: src/view/screens/ProfileList.tsx:228 #: src/view/shell/desktop/LeftNav.tsx:252 msgid "New post" msgstr "새 게시물" @@ -2685,8 +2684,8 @@ msgstr "뉴스" #: src/screens/Login/ForgotPasswordForm.tsx:143 #: src/screens/Login/ForgotPasswordForm.tsx:150 -#: src/screens/Login/LoginForm.tsx:253 -#: src/screens/Login/LoginForm.tsx:260 +#: src/screens/Login/LoginForm.tsx:254 +#: src/screens/Login/LoginForm.tsx:261 #: src/screens/Login/SetNewPasswordForm.tsx:174 #: src/screens/Login/SetNewPasswordForm.tsx:180 #: src/screens/Signup/index.tsx:205 @@ -2714,8 +2713,8 @@ msgstr "다음 이미지" msgid "No" msgstr "아니요" -#: src/view/screens/ProfileFeed.tsx:562 -#: src/view/screens/ProfileList.tsx:769 +#: src/view/screens/ProfileFeed.tsx:574 +#: src/view/screens/ProfileList.tsx:771 msgid "No description" msgstr "설명 없음" @@ -2749,8 +2748,8 @@ msgid "No results found for \"{query}\"" msgstr "\"{query}\"에 대한 결과를 찾을 수 없습니다" #: src/view/com/modals/ListAddRemoveUsers.tsx:127 -#: src/view/screens/Search/Search.tsx:283 -#: src/view/screens/Search/Search.tsx:311 +#: src/view/screens/Search/Search.tsx:292 +#: src/view/screens/Search/Search.tsx:330 msgid "No results found for {query}" msgstr "{query}에 대한 결과를 찾을 수 없습니다" @@ -2777,7 +2776,7 @@ msgid "Not Applicable." msgstr "해당 없음." #: src/Navigation.tsx:109 -#: src/view/screens/Profile.tsx:99 +#: src/view/screens/Profile.tsx:101 msgid "Not Found" msgstr "찾을 수 없음" @@ -2788,7 +2787,7 @@ msgstr "나중에 하기" #: src/view/com/profile/ProfileMenu.tsx:368 #: src/view/com/util/forms/PostDropdownBtn.tsx:342 -#: src/view/com/util/post-ctrls/PostCtrls.tsx:246 +#: src/view/com/util/post-ctrls/PostCtrls.tsx:248 msgid "Note about sharing" msgstr "공유 관련 참고 사항" @@ -2799,7 +2798,7 @@ msgstr "참고: Bluesky는 개방형 공개 네트워크입니다. 이 설정은 #: src/Navigation.tsx:469 #: src/view/screens/Notifications.tsx:124 #: src/view/screens/Notifications.tsx:148 -#: src/view/shell/bottom-bar/BottomBar.tsx:215 +#: src/view/shell/bottom-bar/BottomBar.tsx:216 #: src/view/shell/desktop/LeftNav.tsx:365 #: src/view/shell/Drawer.tsx:438 #: src/view/shell/Drawer.tsx:439 @@ -2812,11 +2811,7 @@ msgstr "노출" #: src/lib/moderation/useReportOptions.ts:71 msgid "Nudity or adult content not labeled as such" -msgstr "" - -#: src/lib/moderation/useReportOptions.ts:71 -#~ msgid "Nudity or pornography not labeled as such" -#~ msgstr "누드 또는 음란물로 설정되지 않은 콘텐츠" +msgstr "누드 또는 성인 콘텐츠로 설정되지 않은 콘텐츠" #: src/screens/Signup/index.tsx:142 msgid "of" @@ -2835,7 +2830,7 @@ msgid "Oh no! Something went wrong." msgstr "이런! 뭔가 잘못되었습니다." #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:126 -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:327 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:328 msgid "OK" msgstr "확인" @@ -2847,7 +2842,7 @@ msgstr "확인" msgid "Oldest replies first" msgstr "오래된 순" -#: src/view/screens/Settings/index.tsx:244 +#: src/view/screens/Settings/index.tsx:239 msgid "Onboarding reset" msgstr "온보딩 재설정" @@ -2869,7 +2864,7 @@ msgstr "이런, 뭔가 잘못되었습니다!" #: src/components/Lists.tsx:170 #: src/view/screens/AppPasswords.tsx:67 -#: src/view/screens/Profile.tsx:99 +#: src/view/screens/Profile.tsx:101 msgid "Oops!" msgstr "이런!" @@ -2882,11 +2877,11 @@ msgstr "공개성" msgid "Open emoji picker" msgstr "이모티콘 선택기 열기" -#: src/view/screens/ProfileFeed.tsx:300 +#: src/view/screens/ProfileFeed.tsx:311 msgid "Open feed options menu" msgstr "피드 옵션 메뉴 열기" -#: src/view/screens/Settings/index.tsx:734 +#: src/view/screens/Settings/index.tsx:677 msgid "Open links with in-app browser" msgstr "링크를 인앱 브라우저로 열기" @@ -2902,12 +2897,12 @@ msgstr "내비게이션 열기" msgid "Open post options menu" msgstr "게시물 옵션 메뉴 열기" -#: src/view/screens/Settings/index.tsx:828 -#: src/view/screens/Settings/index.tsx:838 +#: src/view/screens/Settings/index.tsx:784 +#: src/view/screens/Settings/index.tsx:794 msgid "Open storybook page" msgstr "스토리북 페이지 열기" -#: src/view/screens/Settings/index.tsx:816 +#: src/view/screens/Settings/index.tsx:772 msgid "Open system log" msgstr "시스템 로그 열기" @@ -2931,7 +2926,7 @@ msgstr "기기에서 카메라를 엽니다" msgid "Opens composer" msgstr "답글 작성 상자를 엽니다" -#: src/view/screens/Settings/index.tsx:615 +#: src/view/screens/Settings/index.tsx:558 msgid "Opens configurable language settings" msgstr "구성 가능한 언어 설정을 엽니다" @@ -2939,7 +2934,7 @@ msgstr "구성 가능한 언어 설정을 엽니다" msgid "Opens device photo gallery" msgstr "기기의 사진 갤러리를 엽니다" -#: src/view/screens/Settings/index.tsx:669 +#: src/view/screens/Settings/index.tsx:612 msgid "Opens external embeds settings" msgstr "외부 임베드 설정을 엽니다" @@ -2959,23 +2954,23 @@ msgstr "존재하는 Bluesky 계정에 로그인하는 플로를 엽니다" msgid "Opens list of invite codes" msgstr "초대 코드 목록을 엽니다" -#: src/view/screens/Settings/index.tsx:798 +#: src/view/screens/Settings/index.tsx:754 msgid "Opens modal for account deletion confirmation. Requires email code" msgstr "계정 삭제 확인을 위한 대화 상자를 엽니다. 이메일 코드가 필요합니다" -#: src/view/screens/Settings/index.tsx:756 +#: src/view/screens/Settings/index.tsx:712 msgid "Opens modal for changing your Bluesky password" msgstr "Bluesky 비밀번호 변경을 위한 대화 상자를 엽니다" -#: src/view/screens/Settings/index.tsx:718 +#: src/view/screens/Settings/index.tsx:661 msgid "Opens modal for choosing a new Bluesky handle" msgstr "새로운 Bluesky 핸들을 선택하기 위한 대화 상자를 엽니다" -#: src/view/screens/Settings/index.tsx:779 +#: src/view/screens/Settings/index.tsx:735 msgid "Opens modal for downloading your Bluesky account data (repository)" msgstr "Bluesky 계정 데이터(저장소)를 다운로드하기 위한 대화 상자를 엽니다" -#: src/view/screens/Settings/index.tsx:968 +#: src/view/screens/Settings/index.tsx:924 msgid "Opens modal for email verification" msgstr "이메일 인증을 위한 대화 상자를 엽니다" @@ -2983,7 +2978,7 @@ msgstr "이메일 인증을 위한 대화 상자를 엽니다" msgid "Opens modal for using custom domain" msgstr "사용자 지정 도메인을 사용하기 위한 대화 상자를 엽니다" -#: src/view/screens/Settings/index.tsx:640 +#: src/view/screens/Settings/index.tsx:583 msgid "Opens moderation settings" msgstr "검토 설정을 엽니다" @@ -2996,15 +2991,15 @@ msgstr "비밀번호 재설정 양식을 엽니다" msgid "Opens screen to edit Saved Feeds" msgstr "저장된 피드를 편집할 수 있는 화면을 엽니다" -#: src/view/screens/Settings/index.tsx:597 +#: src/view/screens/Settings/index.tsx:540 msgid "Opens screen with all saved feeds" msgstr "모든 저장된 피드 화면을 엽니다" -#: src/view/screens/Settings/index.tsx:696 +#: src/view/screens/Settings/index.tsx:639 msgid "Opens the app password settings" msgstr "비밀번호 설정을 엽니다" -#: src/view/screens/Settings/index.tsx:554 +#: src/view/screens/Settings/index.tsx:497 msgid "Opens the Following feed preferences" msgstr "팔로우 중 피드 설정을 엽니다" @@ -3012,16 +3007,16 @@ msgstr "팔로우 중 피드 설정을 엽니다" msgid "Opens the linked website" msgstr "연결된 웹사이트를 엽니다" -#: src/view/screens/Settings/index.tsx:829 -#: src/view/screens/Settings/index.tsx:839 +#: src/view/screens/Settings/index.tsx:785 +#: src/view/screens/Settings/index.tsx:795 msgid "Opens the storybook page" msgstr "스토리북 페이지를 엽니다" -#: src/view/screens/Settings/index.tsx:817 +#: src/view/screens/Settings/index.tsx:773 msgid "Opens the system log page" msgstr "시스템 로그 페이지를 엽니다" -#: src/view/screens/Settings/index.tsx:575 +#: src/view/screens/Settings/index.tsx:518 msgid "Opens the threads preferences" msgstr "스레드 설정을 엽니다" @@ -3029,7 +3024,7 @@ msgstr "스레드 설정을 엽니다" msgid "Option {0} of {numItems}" msgstr "{numItems}개 중 {0}번째 옵션" -#: src/components/ReportDialog/SubmitView.tsx:162 +#: src/components/ReportDialog/SubmitView.tsx:160 msgid "Optionally provide additional information below:" msgstr "선택 사항으로 아래에 추가 정보를 입력하세요:" @@ -3077,6 +3072,11 @@ msgstr "비밀번호 변경됨" msgid "Password updated!" msgstr "비밀번호 변경됨" +#: src/view/screens/Search/Search.tsx:390 +#: src/view/screens/Search/Search.tsx:399 +msgid "People" +msgstr "사람들" + #: src/Navigation.tsx:164 msgid "People followed by @{0}" msgstr "@{0} 님이 팔로우한 사람들" @@ -3101,16 +3101,16 @@ msgstr "반려동물" msgid "Pictures meant for adults." msgstr "성인용 사진." -#: src/view/screens/ProfileFeed.tsx:292 -#: src/view/screens/ProfileList.tsx:563 +#: src/view/screens/ProfileFeed.tsx:303 +#: src/view/screens/ProfileList.tsx:565 msgid "Pin to home" msgstr "홈에 고정" -#: src/view/screens/ProfileFeed.tsx:295 +#: src/view/screens/ProfileFeed.tsx:306 msgid "Pin to Home" msgstr "홈에 고정" -#: src/view/screens/SavedFeeds.tsx:88 +#: src/view/screens/SavedFeeds.tsx:89 msgid "Pinned Feeds" msgstr "고정된 피드" @@ -3183,10 +3183,6 @@ msgstr "정치" msgid "Porn" msgstr "음란물" -#: src/lib/moderation/useGlobalLabelStrings.ts:34 -#~ msgid "Pornography" -#~ msgstr "음란물" - #: src/view/com/composer/Composer.tsx:367 #: src/view/com/composer/Composer.tsx:375 msgctxt "action" @@ -3243,7 +3239,8 @@ msgstr "게시물을 찾을 수 없음" msgid "posts" msgstr "게시물" -#: src/view/screens/Profile.tsx:190 +#: src/view/screens/Profile.tsx:196 +#: src/view/screens/Search/Search.tsx:410 msgid "Posts" msgstr "게시물" @@ -3259,7 +3256,7 @@ msgstr "게시물 숨겨짐" msgid "Potentially Misleading Link" msgstr "오해의 소지가 있는 링크" -#: src/components/forms/HostingProvider.tsx:45 +#: src/components/forms/HostingProvider.tsx:46 msgid "Press to change hosting provider" msgstr "호스팅 제공자를 변경하려면 누릅니다" @@ -3281,7 +3278,7 @@ msgstr "주 언어" msgid "Prioritize Your Follows" msgstr "내 팔로우 먼저 표시" -#: src/view/screens/Settings/index.tsx:652 +#: src/view/screens/Settings/index.tsx:595 #: src/view/shell/desktop/RightNav.tsx:72 msgid "Privacy" msgstr "개인정보" @@ -3289,7 +3286,7 @@ msgstr "개인정보" #: src/Navigation.tsx:231 #: src/screens/Signup/StepInfo/Policies.tsx:56 #: src/view/screens/PrivacyPolicy.tsx:29 -#: src/view/screens/Settings/index.tsx:923 +#: src/view/screens/Settings/index.tsx:879 #: src/view/shell/Drawer.tsx:265 msgid "Privacy Policy" msgstr "개인정보 처리방침" @@ -3299,11 +3296,11 @@ msgid "Processing..." msgstr "처리 중…" #: src/view/screens/DebugMod.tsx:888 -#: src/view/screens/Profile.tsx:342 +#: src/view/screens/Profile.tsx:362 msgid "profile" msgstr "프로필" -#: src/view/shell/bottom-bar/BottomBar.tsx:260 +#: src/view/shell/bottom-bar/BottomBar.tsx:261 #: src/view/shell/desktop/LeftNav.tsx:419 #: src/view/shell/Drawer.tsx:70 #: src/view/shell/Drawer.tsx:549 @@ -3315,7 +3312,7 @@ msgstr "프로필" msgid "Profile updated" msgstr "프로필 업데이트됨" -#: src/view/screens/Settings/index.tsx:981 +#: src/view/screens/Settings/index.tsx:937 msgid "Protect your account by verifying your email." msgstr "이메일을 인증하여 계정을 보호하세요." @@ -3361,7 +3358,7 @@ msgstr "무작위" msgid "Ratios" msgstr "비율" -#: src/view/screens/Search/Search.tsx:777 +#: src/view/screens/Search/Search.tsx:867 msgid "Recent Searches" msgstr "최근 검색" @@ -3404,8 +3401,8 @@ msgstr "피드를 제거하시겠습니까?" #: src/view/com/feeds/FeedSourceCard.tsx:173 #: src/view/com/feeds/FeedSourceCard.tsx:233 -#: src/view/screens/ProfileFeed.tsx:335 -#: src/view/screens/ProfileFeed.tsx:341 +#: src/view/screens/ProfileFeed.tsx:346 +#: src/view/screens/ProfileFeed.tsx:352 msgid "Remove from my feeds" msgstr "내 피드에서 제거" @@ -3442,7 +3439,7 @@ msgstr "리스트에서 제거됨" msgid "Removed from my feeds" msgstr "내 피드에서 제거됨" -#: src/view/screens/ProfileFeed.tsx:209 +#: src/view/screens/ProfileFeed.tsx:210 msgid "Removed from your feeds" msgstr "내 피드에서 제거됨" @@ -3450,7 +3447,7 @@ msgstr "내 피드에서 제거됨" msgid "Removes default thumbnail from {0}" msgstr "{0}에서 기본 미리보기 이미지를 제거합니다" -#: src/view/screens/Profile.tsx:191 +#: src/view/screens/Profile.tsx:197 msgid "Replies" msgstr "답글" @@ -3482,12 +3479,12 @@ msgstr "계정 신고" msgid "Report dialog" msgstr "신고 대화 상자" -#: src/view/screens/ProfileFeed.tsx:352 -#: src/view/screens/ProfileFeed.tsx:354 +#: src/view/screens/ProfileFeed.tsx:363 +#: src/view/screens/ProfileFeed.tsx:365 msgid "Report feed" msgstr "피드 신고" -#: src/view/screens/ProfileList.tsx:429 +#: src/view/screens/ProfileList.tsx:431 msgid "Report List" msgstr "리스트 신고" @@ -3563,7 +3560,7 @@ msgstr "변경 요청" msgid "Request Code" msgstr "코드 요청" -#: src/view/screens/Settings/index.tsx:475 +#: src/view/screens/Settings/index.tsx:418 msgid "Require alt text before posting" msgstr "게시하기 전 대체 텍스트 필수" @@ -3579,8 +3576,8 @@ msgstr "재설정 코드" msgid "Reset Code" msgstr "재설정 코드" -#: src/view/screens/Settings/index.tsx:858 -#: src/view/screens/Settings/index.tsx:861 +#: src/view/screens/Settings/index.tsx:814 +#: src/view/screens/Settings/index.tsx:817 msgid "Reset onboarding state" msgstr "온보딩 상태 초기화" @@ -3588,16 +3585,16 @@ msgstr "온보딩 상태 초기화" msgid "Reset password" msgstr "비밀번호 재설정" -#: src/view/screens/Settings/index.tsx:848 -#: src/view/screens/Settings/index.tsx:851 +#: src/view/screens/Settings/index.tsx:804 +#: src/view/screens/Settings/index.tsx:807 msgid "Reset preferences state" msgstr "설정 상태 초기화" -#: src/view/screens/Settings/index.tsx:859 +#: src/view/screens/Settings/index.tsx:815 msgid "Resets the onboarding state" msgstr "온보딩 상태 초기화" -#: src/view/screens/Settings/index.tsx:849 +#: src/view/screens/Settings/index.tsx:805 msgid "Resets the preferences state" msgstr "설정 상태 초기화" @@ -3623,7 +3620,7 @@ msgid "Retry" msgstr "다시 시도" #: src/components/Error.tsx:86 -#: src/view/screens/ProfileList.tsx:917 +#: src/view/screens/ProfileList.tsx:919 msgid "Return to previous page" msgstr "이전 페이지로 돌아갑니다" @@ -3669,12 +3666,12 @@ msgstr "핸들 변경 저장" msgid "Save image crop" msgstr "이미지 자르기 저장" -#: src/view/screens/ProfileFeed.tsx:336 -#: src/view/screens/ProfileFeed.tsx:342 +#: src/view/screens/ProfileFeed.tsx:347 +#: src/view/screens/ProfileFeed.tsx:353 msgid "Save to my feeds" msgstr "내 피드에 저장" -#: src/view/screens/SavedFeeds.tsx:122 +#: src/view/screens/SavedFeeds.tsx:123 msgid "Saved Feeds" msgstr "저장된 피드" @@ -3682,7 +3679,7 @@ msgstr "저장된 피드" msgid "Saved to your camera roll." msgstr "내 앨범에 저장됨" -#: src/view/screens/ProfileFeed.tsx:213 +#: src/view/screens/ProfileFeed.tsx:214 msgid "Saved to your feeds" msgstr "내 피드에 저장됨" @@ -3702,7 +3699,7 @@ msgstr "이미지 자르기 설정을 저장합니다" msgid "Science" msgstr "과학" -#: src/view/screens/ProfileList.tsx:873 +#: src/view/screens/ProfileList.tsx:875 msgid "Scroll to top" msgstr "맨 위로 스크롤" @@ -3711,10 +3708,10 @@ msgstr "맨 위로 스크롤" #: src/view/com/modals/ListAddRemoveUsers.tsx:75 #: src/view/com/util/forms/SearchInput.tsx:67 #: src/view/com/util/forms/SearchInput.tsx:79 -#: src/view/screens/Search/Search.tsx:421 -#: src/view/screens/Search/Search.tsx:670 -#: src/view/screens/Search/Search.tsx:688 -#: src/view/shell/bottom-bar/BottomBar.tsx:169 +#: src/view/screens/Search/Search.tsx:511 +#: src/view/screens/Search/Search.tsx:760 +#: src/view/screens/Search/Search.tsx:778 +#: src/view/shell/bottom-bar/BottomBar.tsx:170 #: src/view/shell/desktop/LeftNav.tsx:328 #: src/view/shell/desktop/Search.tsx:215 #: src/view/shell/desktop/Search.tsx:224 @@ -3723,7 +3720,7 @@ msgstr "맨 위로 스크롤" msgid "Search" msgstr "검색" -#: src/view/screens/Search/Search.tsx:737 +#: src/view/screens/Search/Search.tsx:827 #: src/view/shell/desktop/Search.tsx:256 msgid "Search for \"{query}\"" msgstr "\"{query}\"에 대한 검색 결과" @@ -3762,7 +3759,7 @@ msgstr "<0>{displayTag} 게시물 보기" msgid "See <0>{displayTag} posts by this user" msgstr "이 사용자의 <0>{displayTag} 게시물 보기" -#: src/view/screens/SavedFeeds.tsx:163 +#: src/view/screens/SavedFeeds.tsx:164 msgid "See this guide" msgstr "이 가이드" @@ -3798,7 +3795,7 @@ msgstr "{numItems}개 중 {i}번째 옵션을 선택합니다" msgid "Select some accounts below to follow" msgstr "아래에서 팔로우할 계정을 선택하세요" -#: src/components/ReportDialog/SubmitView.tsx:135 +#: src/components/ReportDialog/SubmitView.tsx:133 msgid "Select the moderation service(s) to report to" msgstr "신고할 검토 서비스를 선택하세요." @@ -3861,8 +3858,8 @@ msgstr "이메일 보내기" msgid "Send feedback" msgstr "피드백 보내기" -#: src/components/ReportDialog/SubmitView.tsx:214 -#: src/components/ReportDialog/SubmitView.tsx:218 +#: src/components/ReportDialog/SubmitView.tsx:213 +#: src/components/ReportDialog/SubmitView.tsx:217 msgid "Send report" msgstr "신고 보내기" @@ -3914,23 +3911,23 @@ msgstr "계정 설정하기" msgid "Sets Bluesky username" msgstr "Bluesky 사용자 이름을 설정합니다" -#: src/view/screens/Settings/index.tsx:507 +#: src/view/screens/Settings/index.tsx:450 msgid "Sets color theme to dark" msgstr "색상 테마를 어두움으로 설정합니다" -#: src/view/screens/Settings/index.tsx:500 +#: src/view/screens/Settings/index.tsx:443 msgid "Sets color theme to light" msgstr "색상 테마를 밝음으로 설정합니다" -#: src/view/screens/Settings/index.tsx:494 +#: src/view/screens/Settings/index.tsx:437 msgid "Sets color theme to system setting" msgstr "색상 테마를 시스템 설정에 맞춥니다" -#: src/view/screens/Settings/index.tsx:533 +#: src/view/screens/Settings/index.tsx:476 msgid "Sets dark theme to the dark theme" msgstr "어두운 테마를 완전히 어둡게 설정합니다" -#: src/view/screens/Settings/index.tsx:526 +#: src/view/screens/Settings/index.tsx:469 msgid "Sets dark theme to the dim theme" msgstr "어두운 테마를 살짝 밝게 설정합니다" @@ -3951,7 +3948,7 @@ msgid "Sets image aspect ratio to wide" msgstr "이미지 비율을 가로로 길게 설정합니다" #: src/Navigation.tsx:139 -#: src/view/screens/Settings/index.tsx:313 +#: src/view/screens/Settings/index.tsx:308 #: src/view/shell/desktop/LeftNav.tsx:437 #: src/view/shell/Drawer.tsx:570 #: src/view/shell/Drawer.tsx:571 @@ -3975,36 +3972,36 @@ msgstr "공유" #: src/view/com/profile/ProfileMenu.tsx:224 #: src/view/com/util/forms/PostDropdownBtn.tsx:228 #: src/view/com/util/forms/PostDropdownBtn.tsx:237 -#: src/view/com/util/post-ctrls/PostCtrls.tsx:235 -#: src/view/screens/ProfileList.tsx:388 +#: src/view/com/util/post-ctrls/PostCtrls.tsx:237 +#: src/view/screens/ProfileList.tsx:390 msgid "Share" msgstr "공유" #: src/view/com/profile/ProfileMenu.tsx:373 #: src/view/com/util/forms/PostDropdownBtn.tsx:347 -#: src/view/com/util/post-ctrls/PostCtrls.tsx:251 +#: src/view/com/util/post-ctrls/PostCtrls.tsx:253 msgid "Share anyway" msgstr "무시하고 공유" -#: src/view/screens/ProfileFeed.tsx:362 -#: src/view/screens/ProfileFeed.tsx:364 +#: src/view/screens/ProfileFeed.tsx:373 +#: src/view/screens/ProfileFeed.tsx:375 msgid "Share feed" msgstr "피드 공유" #: src/view/com/modals/LinkWarning.tsx:89 #: src/view/com/modals/LinkWarning.tsx:95 msgid "Share Link" -msgstr "" +msgstr "링크 공유" #: src/view/com/modals/LinkWarning.tsx:92 msgid "Shares the linked website" -msgstr "" +msgstr "연결된 웹사이트를 공유합니다" #: src/components/moderation/ContentHider.tsx:115 #: src/components/moderation/LabelPreference.tsx:136 #: src/components/moderation/PostHider.tsx:107 #: src/screens/Onboarding/StepModeration/ModerationOption.tsx:54 -#: src/view/screens/Settings/index.tsx:363 +#: src/view/screens/Settings/index.tsx:358 msgid "Show" msgstr "표시" @@ -4026,10 +4023,6 @@ msgstr "배지 표시" msgid "Show badge and filter from feeds" msgstr "배지 표시 및 피드에서 필터링" -#: src/view/com/modals/EmbedConsent.tsx:87 -#~ msgid "Show embeds from {0}" -#~ msgstr "{0} 임베드 표시" - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:200 msgid "Show follows similar to {0}" msgstr "{0} 님과 비슷한 팔로우 표시" @@ -4118,9 +4111,9 @@ msgstr "피드에 {0} 님의 게시물을 표시합니다" #: src/view/com/auth/SplashScreen.tsx:90 #: src/view/com/auth/SplashScreen.web.tsx:110 #: src/view/com/auth/SplashScreen.web.tsx:119 -#: src/view/shell/bottom-bar/BottomBar.tsx:300 #: src/view/shell/bottom-bar/BottomBar.tsx:301 -#: src/view/shell/bottom-bar/BottomBar.tsx:303 +#: src/view/shell/bottom-bar/BottomBar.tsx:302 +#: src/view/shell/bottom-bar/BottomBar.tsx:304 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:178 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:179 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:181 @@ -4130,12 +4123,6 @@ msgstr "피드에 {0} 님의 게시물을 표시합니다" msgid "Sign in" msgstr "로그인" -#: src/view/com/auth/HomeLoggedOutCTA.tsx:82 -#: src/view/com/auth/SplashScreen.tsx:90 -#: src/view/com/auth/SplashScreen.web.tsx:118 -#~ msgid "Sign In" -#~ msgstr "로그인" - #: src/components/AccountList.tsx:109 msgid "Sign in as {0}" msgstr "{0}(으)로 로그인" @@ -4144,14 +4131,14 @@ msgstr "{0}(으)로 로그인" msgid "Sign in as..." msgstr "로그인" -#: src/view/screens/Settings/index.tsx:107 #: src/view/screens/Settings/index.tsx:110 +#: src/view/screens/Settings/index.tsx:113 msgid "Sign out" msgstr "로그아웃" -#: src/view/shell/bottom-bar/BottomBar.tsx:290 #: src/view/shell/bottom-bar/BottomBar.tsx:291 -#: src/view/shell/bottom-bar/BottomBar.tsx:293 +#: src/view/shell/bottom-bar/BottomBar.tsx:292 +#: src/view/shell/bottom-bar/BottomBar.tsx:294 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:168 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:169 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:171 @@ -4170,7 +4157,7 @@ msgstr "가입 또는 로그인하여 대화에 참여하세요" msgid "Sign-in Required" msgstr "로그인 필요" -#: src/view/screens/Settings/index.tsx:374 +#: src/view/screens/Settings/index.tsx:369 msgid "Signed in as" msgstr "로그인한 계정" @@ -4178,10 +4165,6 @@ msgstr "로그인한 계정" msgid "Signed in as @{0}" msgstr "@{0}(으)로 로그인했습니다" -#: src/view/com/modals/SwitchAccount.tsx:71 -#~ msgid "Signs {0} out of Bluesky" -#~ msgstr "Bluesky에서 {0}을(를) 로그아웃합니다" - #: src/screens/Onboarding/StepInterests/index.tsx:239 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:203 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:35 @@ -4198,7 +4181,7 @@ msgstr "소프트웨어 개발" #: src/components/ReportDialog/index.tsx:59 #: src/screens/Moderation/index.tsx:114 -#: src/screens/Profile/Sections/Labels.tsx:76 +#: src/screens/Profile/Sections/Labels.tsx:87 msgid "Something went wrong, please try again." msgstr "뭔가 잘못되었습니다. 다시 시도해 주세요." @@ -4234,7 +4217,7 @@ msgstr "스포츠" msgid "Square" msgstr "정사각형" -#: src/view/screens/Settings/index.tsx:903 +#: src/view/screens/Settings/index.tsx:859 msgid "Status page" msgstr "상태 페이지" @@ -4242,12 +4225,12 @@ msgstr "상태 페이지" msgid "Step" msgstr "" -#: src/view/screens/Settings/index.tsx:292 +#: src/view/screens/Settings/index.tsx:287 msgid "Storage cleared, you need to restart the app now." msgstr "스토리지가 지워졌으며 지금 앱을 다시 시작해야 합니다." #: src/Navigation.tsx:211 -#: src/view/screens/Settings/index.tsx:831 +#: src/view/screens/Settings/index.tsx:787 msgid "Storybook" msgstr "스토리북" @@ -4256,15 +4239,15 @@ msgstr "스토리북" msgid "Submit" msgstr "확인" -#: src/view/screens/ProfileList.tsx:590 +#: src/view/screens/ProfileList.tsx:592 msgid "Subscribe" msgstr "구독" -#: src/screens/Profile/Sections/Labels.tsx:180 +#: src/screens/Profile/Sections/Labels.tsx:191 msgid "Subscribe to @{0} to use these labels:" msgstr "이 라벨을 사용하려면 @{0} 님을 구독하세요:" -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:221 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:222 msgid "Subscribe to Labeler" msgstr "라벨러 구독" @@ -4273,15 +4256,15 @@ msgstr "라벨러 구독" msgid "Subscribe to the {0} feed" msgstr "{0} 피드 구독하기" -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:184 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:185 msgid "Subscribe to this labeler" msgstr "이 라벨러 구독하기" -#: src/view/screens/ProfileList.tsx:586 +#: src/view/screens/ProfileList.tsx:588 msgid "Subscribe to this list" msgstr "이 리스트 구독하기" -#: src/view/screens/Search/Search.tsx:376 +#: src/view/screens/Search/Search.tsx:466 msgid "Suggested Follows" msgstr "팔로우 추천" @@ -4304,19 +4287,19 @@ msgstr "지원" msgid "Switch Account" msgstr "계정 전환" -#: src/view/screens/Settings/index.tsx:139 +#: src/view/screens/Settings/index.tsx:142 msgid "Switch to {0}" msgstr "{0}(으)로 전환" -#: src/view/screens/Settings/index.tsx:140 +#: src/view/screens/Settings/index.tsx:143 msgid "Switches the account you are logged in to" msgstr "로그인한 계정을 전환합니다" -#: src/view/screens/Settings/index.tsx:491 +#: src/view/screens/Settings/index.tsx:434 msgid "System" msgstr "시스템" -#: src/view/screens/Settings/index.tsx:819 +#: src/view/screens/Settings/index.tsx:775 msgid "System log" msgstr "시스템 로그" @@ -4346,7 +4329,7 @@ msgstr "이용약관" #: src/Navigation.tsx:236 #: src/screens/Signup/StepInfo/Policies.tsx:49 -#: src/view/screens/Settings/index.tsx:917 +#: src/view/screens/Settings/index.tsx:873 #: src/view/screens/TermsOfService.tsx:29 #: src/view/shell/Drawer.tsx:259 msgid "Terms of Service" @@ -4366,7 +4349,7 @@ msgstr "글" msgid "Text input field" msgstr "텍스트 입력 필드" -#: src/components/ReportDialog/SubmitView.tsx:78 +#: src/components/ReportDialog/SubmitView.tsx:76 msgid "Thank you. Your report has been sent." msgstr "감사합니다. 신고를 전송했습니다." @@ -4428,8 +4411,8 @@ msgstr "서비스 이용약관을 다음으로 이동했습니다:" msgid "There are many feeds to try:" msgstr "시도해 볼 만한 피드:" -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:112 -#: src/view/screens/ProfileFeed.tsx:544 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:113 +#: src/view/screens/ProfileFeed.tsx:556 msgid "There was an an issue contacting the server, please check your internet connection and try again." msgstr "서버에 연결하는 동안 문제가 발생했습니다. 인터넷 연결을 확인한 후 다시 시도하세요." @@ -4437,15 +4420,15 @@ msgstr "서버에 연결하는 동안 문제가 발생했습니다. 인터넷 msgid "There was an an issue removing this feed. Please check your internet connection and try again." msgstr "이 피드를 삭제하는 동안 문제가 발생했습니다. 인터넷 연결을 확인한 후 다시 시도하세요." -#: src/view/screens/ProfileFeed.tsx:218 +#: src/view/screens/ProfileFeed.tsx:219 msgid "There was an an issue updating your feeds, please check your internet connection and try again." msgstr "피드를 업데이트하는 동안 문제가 발생했습니다. 인터넷 연결을 확인한 후 다시 시도하세요." -#: src/view/screens/ProfileFeed.tsx:245 -#: src/view/screens/ProfileList.tsx:275 -#: src/view/screens/SavedFeeds.tsx:209 -#: src/view/screens/SavedFeeds.tsx:231 -#: src/view/screens/SavedFeeds.tsx:252 +#: src/view/screens/ProfileFeed.tsx:247 +#: src/view/screens/ProfileList.tsx:277 +#: src/view/screens/SavedFeeds.tsx:211 +#: src/view/screens/SavedFeeds.tsx:241 +#: src/view/screens/SavedFeeds.tsx:262 msgid "There was an issue contacting the server" msgstr "서버에 연결하는 동안 문제가 발생했습니다" @@ -4468,12 +4451,12 @@ msgstr "게시물을 가져오는 동안 문제가 발생했습니다. 이곳을 msgid "There was an issue fetching the list. Tap here to try again." msgstr "리스트를 가져오는 동안 문제가 발생했습니다. 이곳을 탭하여 다시 시도하세요." -#: src/view/com/feeds/ProfileFeedgens.tsx:148 -#: src/view/com/lists/ProfileLists.tsx:155 +#: src/view/com/feeds/ProfileFeedgens.tsx:156 +#: src/view/com/lists/ProfileLists.tsx:163 msgid "There was an issue fetching your lists. Tap here to try again." msgstr "리스트를 가져오는 동안 문제가 발생했습니다. 이곳을 탭하여 다시 시도하세요." -#: src/components/ReportDialog/SubmitView.tsx:83 +#: src/components/ReportDialog/SubmitView.tsx:81 msgid "There was an issue sending your report. Please check your internet connection." msgstr "신고를 전송하는 동안 문제가 발생했습니다. 인터넷 연결을 확인해 주세요." @@ -4499,10 +4482,10 @@ msgstr "앱 비밀번호를 가져오는 동안 문제가 발생했습니다" msgid "There was an issue! {0}" msgstr "문제가 발생했습니다! {0}" -#: src/view/screens/ProfileList.tsx:288 -#: src/view/screens/ProfileList.tsx:302 -#: src/view/screens/ProfileList.tsx:316 -#: src/view/screens/ProfileList.tsx:330 +#: src/view/screens/ProfileList.tsx:290 +#: src/view/screens/ProfileList.tsx:304 +#: src/view/screens/ProfileList.tsx:318 +#: src/view/screens/ProfileList.tsx:332 msgid "There was an issue. Please check your internet connection and try again." msgstr "문제가 발생했습니다. 인터넷 연결을 확인한 후 다시 시도하세요." @@ -4559,9 +4542,9 @@ msgstr "이 기능은 베타 버전입니다. 저장소 내보내기에 대한 msgid "This feed is currently receiving high traffic and is temporarily unavailable. Please try again later." msgstr "이 피드는 현재 트래픽이 많아 일시적으로 사용할 수 없습니다. 나중에 다시 시도해 주세요." -#: src/screens/Profile/Sections/Feed.tsx:50 -#: src/view/screens/ProfileFeed.tsx:477 -#: src/view/screens/ProfileList.tsx:675 +#: src/screens/Profile/Sections/Feed.tsx:59 +#: src/view/screens/ProfileFeed.tsx:488 +#: src/view/screens/ProfileList.tsx:677 msgid "This feed is empty!" msgstr "이 피드는 비어 있습니다." @@ -4581,7 +4564,7 @@ msgstr "이는 이메일을 변경하거나 비밀번호를 재설정해야 할 msgid "This label was applied by {0}." msgstr "이 라벨은 {0}이(가) 적용했습니다." -#: src/screens/Profile/Sections/Labels.tsx:167 +#: src/screens/Profile/Sections/Labels.tsx:178 msgid "This labeler hasn't declared what labels it publishes, and may not be active." msgstr "이 라벨러는 라벨을 게시하지 않았으며 활성화되어 있지 않을 수 있습니다." @@ -4589,7 +4572,7 @@ msgstr "이 라벨러는 라벨을 게시하지 않았으며 활성화되어 있 msgid "This link is taking you to the following website:" msgstr "이 링크를 클릭하면 다음 웹사이트로 이동합니다:" -#: src/view/screens/ProfileList.tsx:853 +#: src/view/screens/ProfileList.tsx:855 msgid "This list is empty!" msgstr "이 리스트는 비어 있습니다." @@ -4606,7 +4589,7 @@ msgid "This post has been deleted." msgstr "이 게시물은 삭제되었습니다." #: src/view/com/util/forms/PostDropdownBtn.tsx:344 -#: src/view/com/util/post-ctrls/PostCtrls.tsx:248 +#: src/view/com/util/post-ctrls/PostCtrls.tsx:250 msgid "This post is only visible to logged-in users. It won't be visible to people who aren't logged in." msgstr "이 게시물은 로그인한 사용자에게만 표시됩니다. 로그인하지 않은 사용자에게는 표시되지 않습니다." @@ -4659,12 +4642,12 @@ msgstr "이 경고는 미디어가 첨부된 게시물에만 사용할 수 있 msgid "This will delete {0} from your muted words. You can always add it back later." msgstr "뮤트한 단어에서 {0}이(가) 삭제됩니다. 나중에 언제든지 다시 추가할 수 있습니다." -#: src/view/screens/Settings/index.tsx:574 +#: src/view/screens/Settings/index.tsx:517 msgid "Thread preferences" msgstr "스레드 설정" #: src/view/screens/PreferencesThreads.tsx:53 -#: src/view/screens/Settings/index.tsx:584 +#: src/view/screens/Settings/index.tsx:527 msgid "Thread Preferences" msgstr "스레드 설정" @@ -4692,6 +4675,10 @@ msgstr "드롭다운 열기 및 닫기" msgid "Toggle to enable or disable adult content" msgstr "성인 콘텐츠 활성화 또는 비활성화 전환" +#: src/view/screens/Search/Search.tsx:370 +msgid "Top" +msgstr "인기" + #: src/view/com/modals/EditImage.tsx:272 msgid "Transformations" msgstr "변형" @@ -4712,11 +4699,11 @@ msgstr "다시 시도" msgid "Type:" msgstr "유형:" -#: src/view/screens/ProfileList.tsx:478 +#: src/view/screens/ProfileList.tsx:480 msgid "Un-block list" msgstr "리스트 차단 해제" -#: src/view/screens/ProfileList.tsx:461 +#: src/view/screens/ProfileList.tsx:463 msgid "Un-mute list" msgstr "리스트 언뮤트" @@ -4732,7 +4719,7 @@ msgstr "서비스에 연결할 수 없습니다. 인터넷 연결을 확인하 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:181 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:287 #: src/view/com/profile/ProfileMenu.tsx:361 -#: src/view/screens/ProfileList.tsx:572 +#: src/view/screens/ProfileList.tsx:574 msgid "Unblock" msgstr "차단 해제" @@ -4777,16 +4764,16 @@ msgstr "{0} 님을 언팔로우" msgid "Unfollow Account" msgstr "계정 언팔로우" -#: src/view/com/util/post-ctrls/PostCtrls.tsx:195 +#: src/view/com/util/post-ctrls/PostCtrls.tsx:197 msgid "Unlike" msgstr "좋아요 취소" -#: src/view/screens/ProfileFeed.tsx:573 +#: src/view/screens/ProfileFeed.tsx:585 msgid "Unlike this feed" msgstr "이 피드 좋아요 취소" #: src/components/TagMenu/index.tsx:249 -#: src/view/screens/ProfileList.tsx:579 +#: src/view/screens/ProfileList.tsx:581 msgid "Unmute" msgstr "언뮤트" @@ -4808,24 +4795,24 @@ msgstr "모든 {tag} 게시물 언뮤트" msgid "Unmute thread" msgstr "스레드 언뮤트" -#: src/view/screens/ProfileFeed.tsx:295 -#: src/view/screens/ProfileList.tsx:563 +#: src/view/screens/ProfileFeed.tsx:306 +#: src/view/screens/ProfileList.tsx:565 msgid "Unpin" msgstr "고정 해제" -#: src/view/screens/ProfileFeed.tsx:292 +#: src/view/screens/ProfileFeed.tsx:303 msgid "Unpin from home" msgstr "홈에서 고정 해제" -#: src/view/screens/ProfileList.tsx:444 +#: src/view/screens/ProfileList.tsx:446 msgid "Unpin moderation list" msgstr "검토 리스트 고정 해제" -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:219 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:220 msgid "Unsubscribe" msgstr "구독 취소" -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:183 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:184 msgid "Unsubscribe from this labeler" msgstr "이 라벨러 구독 취소하기" @@ -4932,13 +4919,13 @@ msgstr "나를 차단한 사용자" msgid "User list by {0}" msgstr "{0} 님의 사용자 리스트" -#: src/view/screens/ProfileList.tsx:777 +#: src/view/screens/ProfileList.tsx:779 msgid "User list by <0/>" msgstr "<0/> 님의 사용자 리스트" #: src/view/com/lists/ListCard.tsx:83 #: src/view/com/modals/UserAddRemoveLists.tsx:196 -#: src/view/screens/ProfileList.tsx:775 +#: src/view/screens/ProfileList.tsx:777 msgid "User list by you" msgstr "내 사용자 리스트" @@ -4958,7 +4945,9 @@ msgstr "사용자 리스트" msgid "Username or email address" msgstr "사용자 이름 또는 이메일 주소" -#: src/view/screens/ProfileList.tsx:811 +#: src/view/screens/ProfileList.tsx:813 +#: src/view/screens/Search/Search.tsx:416 +#: src/view/screens/Search/Search.tsx:425 msgid "Users" msgstr "사용자" @@ -4982,15 +4971,15 @@ msgstr "값:" msgid "Verify {0}" msgstr "{0} 확인" -#: src/view/screens/Settings/index.tsx:942 +#: src/view/screens/Settings/index.tsx:898 msgid "Verify email" msgstr "이메일 인증" -#: src/view/screens/Settings/index.tsx:967 +#: src/view/screens/Settings/index.tsx:923 msgid "Verify my email" msgstr "내 이메일 인증하기" -#: src/view/screens/Settings/index.tsx:976 +#: src/view/screens/Settings/index.tsx:932 msgid "Verify My Email" msgstr "내 이메일 인증하기" @@ -5003,7 +4992,7 @@ msgstr "새 이메일 인증" msgid "Verify Your Email" msgstr "이메일 인증하기" -#: src/view/screens/Settings/index.tsx:893 +#: src/view/screens/Settings/index.tsx:849 msgid "Version {0}" msgstr "버전 {0}" @@ -5019,11 +5008,11 @@ msgstr "{0} 님의 아바타를 봅니다" msgid "View debug entry" msgstr "디버그 항목 보기" -#: src/components/ReportDialog/SelectReportOptionView.tsx:131 +#: src/components/ReportDialog/SelectReportOptionView.tsx:132 msgid "View details" msgstr "세부 정보 보기" -#: src/components/ReportDialog/SelectReportOptionView.tsx:126 +#: src/components/ReportDialog/SelectReportOptionView.tsx:127 msgid "View details for reporting a copyright violation" msgstr "저작권 위반 신고에 대한 세부 정보 보기" @@ -5047,7 +5036,7 @@ msgstr "아바타 보기" msgid "View the labeling service provided by @{0}" msgstr "{0} 님이 제공하는 라벨링 서비스 보기" -#: src/view/screens/ProfileFeed.tsx:585 +#: src/view/screens/ProfileFeed.tsx:597 msgid "View users who like this feed" msgstr "이 피드를 좋아하는 사용자 보기" @@ -5071,10 +5060,6 @@ msgstr "콘텐츠 경고" msgid "Warn content and filter from feeds" msgstr "콘텐츠 경고 및 피드에서 필터링" -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:140 -#~ msgid "We also think you'll like \"For You\" by Skygaze:" -#~ msgstr "Skygaze의 \"For You\"를 사용해 볼 수도 있습니다:" - #: src/screens/Hashtag.tsx:133 msgid "We couldn't find any results for that hashtag." msgstr "해당 해시태그에 대한 결과를 찾을 수 없습니다." @@ -5123,7 +5108,7 @@ msgstr "이를 통해 사용자 환경을 맞춤 설정할 수 있습니다." msgid "We're so excited to have you join us!" msgstr "함께하게 되어 정말 기뻐요!" -#: src/view/screens/ProfileList.tsx:89 +#: src/view/screens/ProfileList.tsx:90 msgid "We're sorry, but we were unable to resolve this list. If this persists, please contact the list creator, @{handleOrDid}." msgstr "죄송하지만 이 리스트를 불러올 수 없습니다. 이 문제가 계속되면 리스트 작성자인 @{handleOrDid}에게 문의하세요." @@ -5131,7 +5116,7 @@ msgstr "죄송하지만 이 리스트를 불러올 수 없습니다. 이 문제 msgid "We're sorry, but we weren't able to load your muted words at this time. Please try again." msgstr "죄송하지만 현재 뮤트한 단어를 불러올 수 없습니다. 다시 시도해 주세요." -#: src/view/screens/Search/Search.tsx:256 +#: src/view/screens/Search/Search.tsx:265 msgid "We're sorry, but your search could not be completed. Please try again in a few minutes." msgstr "죄송하지만 검색을 완료할 수 없습니다. 몇 분 후에 다시 시도해 주세요." @@ -5140,7 +5125,7 @@ msgstr "죄송하지만 검색을 완료할 수 없습니다. 몇 분 후에 다 msgid "We're sorry! We can't find the page you were looking for." msgstr "죄송합니다. 페이지를 찾을 수 없습니다." -#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:321 +#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:322 msgid "We're sorry! You can only subscribe to ten labelers, and you've reached your limit of ten." msgstr "죄송합니다. 라벨러는 10개까지만 구독할 수 있으며 10개에 도달했습니다." @@ -5248,7 +5233,7 @@ msgstr "팔로워가 없습니다." msgid "You don't have any invite codes yet! We'll send you some when you've been on Bluesky for a little longer." msgstr "아직 초대 코드가 없습니다! Bluesky를 좀 더 오래 사용하신 후에 보내드리겠습니다." -#: src/view/screens/SavedFeeds.tsx:102 +#: src/view/screens/SavedFeeds.tsx:103 msgid "You don't have any pinned feeds." msgstr "고정된 피드가 없습니다." @@ -5256,7 +5241,7 @@ msgstr "고정된 피드가 없습니다." msgid "You don't have any saved feeds!" msgstr "저장된 피드가 없습니다!" -#: src/view/screens/SavedFeeds.tsx:135 +#: src/view/screens/SavedFeeds.tsx:136 msgid "You don't have any saved feeds." msgstr "저장된 피드가 없습니다." @@ -5294,12 +5279,12 @@ msgstr "내가 이 계정을 뮤트했습니다." msgid "You have muted this user" msgstr "내가 이 사용자를 뮤트했습니다" -#: src/view/com/feeds/ProfileFeedgens.tsx:136 +#: src/view/com/feeds/ProfileFeedgens.tsx:144 msgid "You have no feeds." msgstr "피드가 없습니다." #: src/view/com/lists/MyLists.tsx:89 -#: src/view/com/lists/ProfileLists.tsx:140 +#: src/view/com/lists/ProfileLists.tsx:148 msgid "You have no lists." msgstr "리스트가 없습니다." @@ -5331,7 +5316,7 @@ msgstr "가입하려면 만 13세 이상이어야 합니다." msgid "You must be 18 years or older to enable adult content" msgstr "성인 콘텐츠를 사용하려면 만 18세 이상이어야 합니다." -#: src/components/ReportDialog/SubmitView.tsx:205 +#: src/components/ReportDialog/SubmitView.tsx:203 msgid "You must select at least one labeler for a report" msgstr "신고하려면 하나 이상의 라벨을 선택해야 합니다." @@ -5438,7 +5423,7 @@ msgstr "게시물을 게시했습니다" msgid "Your posts, likes, and blocks are public. Mutes are private." msgstr "게시물, 좋아요, 차단 목록은 공개됩니다. 뮤트 목록은 공개되지 않습니다." -#: src/view/screens/Settings/index.tsx:125 +#: src/view/screens/Settings/index.tsx:128 msgid "Your profile" msgstr "내 프로필" From a306fbfca343f5729119f716dd8dbcbed3225b67 Mon Sep 17 00:00:00 2001 From: Frudrax Cheng Date: Sat, 13 Apr 2024 05:46:15 +0800 Subject: [PATCH 042/185] Update zh-TW Localization (#3478) * Update messages.po * Fix typo * Update messages.po * Remove superseded strings --- src/locale/locales/zh-TW/messages.po | 1264 ++++++-------------------- 1 file changed, 300 insertions(+), 964 deletions(-) diff --git a/src/locale/locales/zh-TW/messages.po b/src/locale/locales/zh-TW/messages.po index 484428079f..da6b060b37 100644 --- a/src/locale/locales/zh-TW/messages.po +++ b/src/locale/locales/zh-TW/messages.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"POT-Creation-Date: 2024-03-20 15:50+0800\n" +"POT-Creation-Date: 2024-04-12 11:00+0800\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -17,28 +17,10 @@ msgstr "" msgid "(no email)" msgstr "(沒有郵件)" -#: src/view/shell/desktop/RightNav.tsx:168 -#~ msgid "{0, plural, one {# invite code available} other {# invite codes available}}" -#~ msgstr "{0} 個可用的邀請碼" - #: src/screens/Profile/Header/Metrics.tsx:44 msgid "{following} following" msgstr "{following} 個跟隨中" -#: src/view/shell/desktop/RightNav.tsx:151 -#~ msgid "{invitesAvailable, plural, one {Invite codes: # available} other {Invite codes: # available}}" -#~ msgstr "可用的邀請碼:{invitesAvailable} 個" - -#: src/view/screens/Settings.tsx:435 -#: src/view/shell/Drawer.tsx:664 -#~ msgid "{invitesAvailable} invite code available" -#~ msgstr "{invitesAvailable} 個可用的邀請碼" - -#: src/view/screens/Settings.tsx:437 -#: src/view/shell/Drawer.tsx:666 -#~ msgid "{invitesAvailable} invite codes available" -#~ msgstr "{invitesAvailable} 個可用的邀請碼" - #: src/view/shell/Drawer.tsx:443 msgid "{numUnreadNotifications} unread" msgstr "{numUnreadNotifications} 個未讀" @@ -49,7 +31,7 @@ msgstr "<0/> 個成員" #: src/view/shell/Drawer.tsx:97 msgid "<0>{0} following" -msgstr "" +msgstr "<0>{0} 個跟隨中" #: src/screens/Profile/Header/Metrics.tsx:45 msgid "<0>{following} <1>following" @@ -71,14 +53,6 @@ msgstr "<0>歡迎來到<1>Bluesky" msgid "⚠Invalid Handle" msgstr "⚠無效的帳號代碼" -#: src/view/com/util/moderation/LabelInfo.tsx:45 -#~ msgid "A content warning has been applied to this {0}." -#~ msgstr "內容警告已套用到這個{0}。" - -#: src/lib/hooks/useOTAUpdate.ts:16 -#~ msgid "A new version of the app is available. Please update to continue using the app." -#~ msgstr "新版本應用程式已發佈,請更新以繼續使用。" - #: src/view/com/util/ViewHeader.tsx:89 #: src/view/screens/Search/Search.tsx:649 msgid "Access navigation links and settings" @@ -179,15 +153,6 @@ msgstr "新增替代文字" msgid "Add App Password" msgstr "新增應用程式專用密碼" -#: src/view/com/modals/report/InputIssueDetails.tsx:41 -#: src/view/com/modals/report/Modal.tsx:191 -#~ msgid "Add details" -#~ msgstr "新增細節" - -#: src/view/com/modals/report/Modal.tsx:194 -#~ msgid "Add details to report" -#~ msgstr "補充回報詳細內容" - #: src/view/com/composer/Composer.tsx:467 msgid "Add link card" msgstr "新增連結卡片" @@ -198,11 +163,11 @@ msgstr "新增連結卡片:" #: src/components/dialogs/MutedWords.tsx:157 msgid "Add mute word for configured settings" -msgstr "" +msgstr "在設定中新增靜音字詞" #: src/components/dialogs/MutedWords.tsx:86 msgid "Add muted words and tags" -msgstr "" +msgstr "新增靜音字詞及標籤" #: src/view/com/modals/ChangeHandle.tsx:416 msgid "Add the following DNS record to your domain:" @@ -240,13 +205,9 @@ msgstr "調整回覆要在你的訊息流顯示所需的最低喜歡數。" msgid "Adult Content" msgstr "成人內容" -#: src/view/com/modals/ContentFilteringSettings.tsx:141 -#~ msgid "Adult content can only be enabled via the Web at <0/>." -#~ msgstr "成人內容只能在網頁上<0/>啟用。" - #: src/components/moderation/LabelPreference.tsx:242 msgid "Adult content is disabled." -msgstr "" +msgstr "成人內容已停用" #: src/screens/Moderation/index.tsx:375 #: src/view/screens/Settings/index.tsx:684 @@ -288,7 +249,7 @@ msgstr "一封電子郵件已發送至先前填寫的電子郵件地址 {0}。 #: src/lib/moderation/useReportOptions.ts:26 msgid "An issue not included in these options" -msgstr "" +msgstr "這些選項中沒有包括的問題" #: src/view/com/profile/FollowButton.tsx:35 #: src/view/com/profile/FollowButton.tsx:45 @@ -308,7 +269,7 @@ msgstr "動物" #: src/lib/moderation/useReportOptions.ts:31 msgid "Anti-Social Behavior" -msgstr "" +msgstr "反社會行為" #: src/view/screens/LanguageSettings.tsx:95 msgid "App Language" @@ -330,10 +291,6 @@ msgstr "應用程式專用密碼名稱必須至少為 4 個字元。" msgid "App password settings" msgstr "應用程式專用密碼設定" -#: src/view/screens/Settings.tsx:650 -#~ msgid "App passwords" -#~ msgstr "應用程式專用密碼" - #: src/Navigation.tsx:251 #: src/view/screens/AppPasswords.tsx:189 #: src/view/screens/Settings/index.tsx:704 @@ -343,32 +300,15 @@ msgstr "應用程式專用密碼" #: src/components/moderation/LabelsOnMeDialog.tsx:133 #: src/components/moderation/LabelsOnMeDialog.tsx:136 msgid "Appeal" -msgstr "" +msgstr "申訴" #: src/components/moderation/LabelsOnMeDialog.tsx:201 msgid "Appeal \"{0}\" label" -msgstr "" - -#: src/view/com/util/forms/PostDropdownBtn.tsx:337 -#: src/view/com/util/forms/PostDropdownBtn.tsx:346 -#~ msgid "Appeal content warning" -#~ msgstr "申訴內容警告" - -#: src/view/com/modals/AppealLabel.tsx:65 -#~ msgid "Appeal Content Warning" -#~ msgstr "申訴內容警告" +msgstr "申訴標籤 \"{0}\"" #: src/components/moderation/LabelsOnMeDialog.tsx:192 msgid "Appeal submitted." -msgstr "" - -#: src/view/com/util/moderation/LabelInfo.tsx:52 -#~ msgid "Appeal this decision" -#~ msgstr "對此決定提出申訴" - -#: src/view/com/util/moderation/LabelInfo.tsx:56 -#~ msgid "Appeal this decision." -#~ msgstr "對此決定提出申訴。" +msgstr "申訴已提交。" #: src/view/screens/Settings/index.tsx:485 msgid "Appearance" @@ -380,7 +320,7 @@ msgstr "你確定要刪除這個應用程式專用密碼「{name}」嗎?" #: src/view/com/feeds/FeedSourceCard.tsx:280 msgid "Are you sure you want to remove {0} from your feeds?" -msgstr "" +msgstr "你確定要從你的訊息流中移除 {0} 嗎?" #: src/view/com/composer/Composer.tsx:509 msgid "Are you sure you'd like to discard this draft?" @@ -390,10 +330,6 @@ msgstr "你確定要捨棄此草稿嗎?" msgid "Are you sure?" msgstr "你確定嗎?" -#: src/view/com/util/forms/PostDropdownBtn.tsx:322 -#~ msgid "Are you sure? This cannot be undone." -#~ msgstr "你確定嗎?此操作無法撤銷。" - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:60 msgid "Are you writing in <0>{0}?" msgstr "你正在使用 <0>{0} 書寫嗎?" @@ -408,7 +344,7 @@ msgstr "藝術作品或非情色的裸露。" #: src/screens/Signup/StepHandle.tsx:118 msgid "At least 3 characters" -msgstr "" +msgstr "至少 3 個字元" #: src/components/moderation/LabelsOnMeDialog.tsx:246 #: src/components/moderation/LabelsOnMeDialog.tsx:247 @@ -426,11 +362,6 @@ msgstr "" msgid "Back" msgstr "返回" -#: src/view/com/post-thread/PostThread.tsx:480 -#~ msgctxt "action" -#~ msgid "Back" -#~ msgstr "返回" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:144 msgid "Based on your interest in {interestsText}" msgstr "因為你對 {interestsText} 感興趣" @@ -474,10 +405,6 @@ msgstr "封鎖列表" msgid "Block these accounts?" msgstr "封鎖這些帳號?" -#: src/view/screens/ProfileList.tsx:320 -#~ msgid "Block this List" -#~ msgstr "封鎖此列表" - #: src/view/com/lists/ListCard.tsx:110 #: src/view/com/util/post-embeds/QuoteEmbed.tsx:55 msgid "Blocked" @@ -506,7 +433,7 @@ msgstr "已封鎖貼文。" #: src/screens/Profile/Sections/Labels.tsx:152 msgid "Blocking does not prevent this labeler from placing labels on your account." -msgstr "" +msgstr "封鎖並不能阻止此標記者在你的帳戶上標記標籤。" #: src/view/screens/ProfileList.tsx:631 msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." @@ -514,7 +441,7 @@ msgstr "封鎖是公開的。被封鎖的帳號無法在你的貼文中回覆、 #: src/view/com/profile/ProfileMenu.tsx:353 msgid "Blocking will not prevent labels from being applied on your account, but it will stop this account from replying in your threads or interacting with you." -msgstr "" +msgstr "封鎖不會阻止標籤套用在你的帳戶上,但它會阻止此帳戶在你的討論串中回覆或與你進行互動。" #: src/view/com/auth/HomeLoggedOutCTA.tsx:98 #: src/view/com/auth/SplashScreen.web.tsx:169 @@ -546,43 +473,27 @@ msgstr "Bluesky 保持開放。" msgid "Bluesky is public." msgstr "Bluesky 為公眾而生。" -#: src/view/com/modals/Waitlist.tsx:70 -#~ msgid "Bluesky uses invites to build a healthier community. If you don't know anybody with an invite, you can sign up for the waitlist and we'll send one soon." -#~ msgstr "Bluesky 使用邀請制來打造更健康的社群環境。如果你不認識擁有邀請碼的人,你可以先填寫並加入候補清單,我們會儘快審核並發送邀請碼。" - #: src/screens/Moderation/index.tsx:533 msgid "Bluesky will not show your profile and posts to logged-out users. Other apps may not honor this request. This does not make your account private." msgstr "Bluesky 不會向未登入的使用者顯示你的個人資料和貼文。但其他應用可能不會遵照此請求,這無法確保你的帳號隱私。" -#: src/view/com/modals/ServerInput.tsx:78 -#~ msgid "Bluesky.Social" -#~ msgstr "Bluesky.Social" - #: src/lib/moderation/useLabelBehaviorDescription.ts:53 msgid "Blur images" -msgstr "" +msgstr "模糊圖片" #: src/lib/moderation/useLabelBehaviorDescription.ts:51 msgid "Blur images and filter from feeds" -msgstr "" +msgstr "從訊息流中模糊圖片並過濾" #: src/screens/Onboarding/index.tsx:33 msgid "Books" msgstr "書籍" -#: src/view/screens/Settings/index.tsx:893 -#~ msgid "Build version {0} {1}" -#~ msgstr "建構版本號 {0} {1}" - #: src/view/com/auth/HomeLoggedOutCTA.tsx:92 #: src/view/com/auth/SplashScreen.web.tsx:166 msgid "Business" msgstr "商務" -#: src/view/com/modals/ServerInput.tsx:115 -#~ msgid "Button disabled. Input custom domain to proceed." -#~ msgstr "按鈕已停用。請輸入自訂網域以繼續。" - #: src/view/com/profile/ProfileSubpageHeader.tsx:157 msgid "by —" msgstr "來自 —" @@ -601,7 +512,7 @@ msgstr "來自 <0/>" #: src/screens/Signup/StepInfo/Policies.tsx:74 msgid "By creating an account you agree to the {els}." -msgstr "" +msgstr 建立帳戶即表示你同意 {els}。" #: src/view/com/profile/ProfileSubpageHeader.tsx:159 msgid "by you" @@ -675,13 +586,9 @@ msgstr "取消引用貼文" msgid "Cancel search" msgstr "取消搜尋" -#: src/view/com/modals/Waitlist.tsx:136 -#~ msgid "Cancel waitlist signup" -#~ msgstr "取消候補清單註冊" - #: src/view/com/modals/LinkWarning.tsx:106 msgid "Cancels opening the linked website" -msgstr "" +msgstr "取消開啟連結的網站" #: src/view/com/modals/VerifyEmail.tsx:152 msgid "Change" @@ -718,10 +625,6 @@ msgstr "變更密碼" msgid "Change post language to {0}" msgstr "變更貼文的發佈語言至 {0}" -#: src/view/screens/Settings/index.tsx:733 -#~ msgid "Change your Bluesky password" -#~ msgstr "變更你的 Bluesky 密碼" - #: src/view/com/modals/ChangeEmail.tsx:109 msgid "Change Your Email" msgstr "變更你的電子郵件地址" @@ -747,10 +650,6 @@ msgstr "查看寄送至你電子郵件地址的確認郵件,然後在下方輸 msgid "Choose \"Everybody\" or \"Nobody\"" msgstr "選擇「所有人」或「沒有人」" -#: src/view/screens/Settings/index.tsx:697 -#~ msgid "Choose a new Bluesky username or create" -#~ msgstr "選擇一個新的 Bluesky 使用者名稱或重新建立" - #: src/view/com/auth/server-input/index.tsx:79 msgid "Choose Service" msgstr "選擇服務" @@ -795,11 +694,11 @@ msgstr "清除搜尋記錄" #: src/view/screens/Settings/index.tsx:869 msgid "Clears all legacy storage data" -msgstr "" +msgstr "清除所有舊儲存資料" #: src/view/screens/Settings/index.tsx:881 msgid "Clears all storage data" -msgstr "" +msgstr "清除所有資料" #: src/view/screens/Support.tsx:40 msgid "click here" @@ -807,11 +706,11 @@ msgstr "點擊這裡" #: src/components/TagMenu/index.web.tsx:138 msgid "Click here to open tag menu for {tag}" -msgstr "" +msgstr "點擊這裡開啟 {tag} 的標籤選單" #: src/components/RichText.tsx:192 msgid "Click here to open tag menu for #{tag}" -msgstr "" +msgstr "點擊這裡開啟 #{tag} 的標籤選單" #: src/screens/Onboarding/index.tsx:35 msgid "Climate" @@ -850,7 +749,7 @@ msgstr "關閉導覽頁腳" #: src/components/Menu/index.tsx:207 #: src/components/TagMenu/index.tsx:262 msgid "Close this dialog" -msgstr "" +msgstr "關閉此對話框" #: src/view/shell/index.web.tsx:56 msgid "Closes bottom navigation bar" @@ -907,11 +806,11 @@ msgstr "調整類別的內容過濾設定:{0}" #: src/components/moderation/LabelPreference.tsx:81 msgid "Configure content filtering setting for category: {name}" -msgstr "" +msgstr "為 {name} 分類配置內容過濾設定" #: src/components/moderation/LabelPreference.tsx:244 msgid "Configured in <0>moderation settings." -msgstr "" +msgstr "在<0>限制設定中進行配置" #: src/components/Prompt.tsx:153 #: src/components/Prompt.tsx:156 @@ -923,12 +822,6 @@ msgstr "" msgid "Confirm" msgstr "確認" -#: src/view/com/modals/Confirm.tsx:75 -#: src/view/com/modals/Confirm.tsx:78 -#~ msgctxt "action" -#~ msgid "Confirm" -#~ msgstr "確認" - #: src/view/com/modals/ChangeEmail.tsx:193 #: src/view/com/modals/ChangeEmail.tsx:195 msgid "Confirm Change" @@ -942,17 +835,13 @@ msgstr "確認內容語言設定" msgid "Confirm delete account" msgstr "確認刪除帳號" -#: src/view/com/modals/ContentFilteringSettings.tsx:156 -#~ msgid "Confirm your age to enable adult content." -#~ msgstr "確認你的年齡以顯示成人內容。" - #: src/screens/Moderation/index.tsx:301 msgid "Confirm your age:" -msgstr "" +msgstr "確認你的年齡:" #: src/screens/Moderation/index.tsx:292 msgid "Confirm your birthdate" -msgstr "" +msgstr "確認你的出生日期" #: src/view/com/modals/ChangeEmail.tsx:157 #: src/view/com/modals/DeleteAccount.tsx:175 @@ -961,10 +850,6 @@ msgstr "" msgid "Confirmation code" msgstr "驗證碼" -#: src/view/com/modals/Waitlist.tsx:120 -#~ msgid "Confirms signing up {email} to the waitlist" -#~ msgstr "確認將 {email} 註冊到候補列表" - #: src/screens/Login/LoginForm.tsx:248 msgid "Connecting..." msgstr "連線中…" @@ -975,19 +860,11 @@ msgstr "聯絡支援" #: src/components/moderation/LabelsOnMe.tsx:42 msgid "content" -msgstr "" +msgstr "內容" #: src/lib/moderation/useGlobalLabelStrings.ts:18 msgid "Content Blocked" -msgstr "" - -#: src/view/screens/Moderation.tsx:83 -#~ msgid "Content filtering" -#~ msgstr "內容過濾" - -#: src/view/com/modals/ContentFilteringSettings.tsx:44 -#~ msgid "Content Filtering" -#~ msgstr "內容過濾" +msgstr "已封鎖內容" #: src/screens/Moderation/index.tsx:285 msgid "Content filters" @@ -1016,7 +893,7 @@ msgstr "內容警告" #: src/components/Menu/index.web.tsx:84 msgid "Context menu backdrop, click to close the menu." -msgstr "" +msgstr "上下文菜單背景,點擊以關閉菜單" #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:161 #: src/screens/Onboarding/StepFollowingFeed.tsx:154 @@ -1031,7 +908,7 @@ msgstr "繼續" #: src/components/AccountList.tsx:108 msgid "Continue as {0} (currently signed in)" -msgstr "" +msgstr "以 {0} 繼續 (目前已登入)" #: src/screens/Onboarding/StepFollowingFeed.tsx:151 #: src/screens/Onboarding/StepInterests/index.tsx:249 @@ -1090,10 +967,6 @@ msgstr "複製列表連結" msgid "Copy link to post" msgstr "複製貼文連結" -#: src/view/com/profile/ProfileHeader.tsx:295 -#~ msgid "Copy link to profile" -#~ msgstr "複製個人資料連結" - #: src/view/com/util/forms/PostDropdownBtn.tsx:220 #: src/view/com/util/forms/PostDropdownBtn.tsx:222 msgid "Copy post text" @@ -1112,10 +985,6 @@ msgstr "無法載入訊息流" msgid "Could not load list" msgstr "無法載入列表" -#: src/view/com/auth/create/Step2.tsx:91 -#~ msgid "Country" -#~ msgstr "國家" - #: src/view/com/auth/HomeLoggedOutCTA.tsx:65 #: src/view/com/auth/SplashScreen.tsx:75 #: src/view/com/auth/SplashScreen.web.tsx:104 @@ -1142,20 +1011,12 @@ msgstr "建立新帳號" #: src/components/ReportDialog/SelectReportOptionView.tsx:93 msgid "Create report for {0}" -msgstr "" +msgstr "建立 {0} 的檢舉" #: src/view/screens/AppPasswords.tsx:246 msgid "Created {0}" msgstr "{0} 已建立" -#: src/view/screens/ProfileFeed.tsx:616 -#~ msgid "Created by <0/>" -#~ msgstr "由 <0/> 建立" - -#: src/view/screens/ProfileFeed.tsx:614 -#~ msgid "Created by you" -#~ msgstr "由你建立" - #: src/view/com/composer/Composer.tsx:469 msgid "Creates a card with a thumbnail. The card links to {url}" msgstr "建立帶有縮圖的卡片。該卡片連結到 {url}" @@ -1182,14 +1043,10 @@ msgstr "由社群打造的自訂訊息流帶來新鮮體驗,協助你找到所 msgid "Customize media from external sites." msgstr "自訂外部網站的媒體。" -#: src/view/screens/Settings.tsx:687 -#~ msgid "Danger Zone" -#~ msgstr "危險區域" - #: src/view/screens/Settings/index.tsx:504 #: src/view/screens/Settings/index.tsx:530 msgid "Dark" -msgstr "深黑" +msgstr "深色" #: src/view/screens/Debug.tsx:63 msgid "Dark mode" @@ -1201,11 +1058,11 @@ msgstr "深色主題" #: src/screens/Signup/StepInfo/index.tsx:132 msgid "Date of birth" -msgstr "" +msgstr "出生日期" #: src/view/screens/Settings/index.tsx:841 msgid "Debug Moderation" -msgstr "" +msgstr "限制除錯" #: src/view/screens/Debug.tsx:83 msgid "Debug panel" @@ -1241,10 +1098,6 @@ msgstr "刪除列表" msgid "Delete my account" msgstr "刪除我的帳號" -#: src/view/screens/Settings.tsx:706 -#~ msgid "Delete my account…" -#~ msgstr "刪除我的帳號…" - #: src/view/screens/Settings/index.tsx:808 msgid "Delete My Account…" msgstr "刪除我的帳號…" @@ -1256,7 +1109,7 @@ msgstr "刪除貼文" #: src/view/screens/ProfileList.tsx:608 msgid "Delete this list?" -msgstr "" +msgstr "刪除此列表?" #: src/view/com/util/forms/PostDropdownBtn.tsx:314 msgid "Delete this post?" @@ -1277,10 +1130,6 @@ msgstr "已刪除貼文。" msgid "Description" msgstr "描述" -#: src/view/screens/Settings.tsx:760 -#~ msgid "Developer Tools" -#~ msgstr "開發者工具" - #: src/view/com/composer/Composer.tsx:218 msgid "Did you want to say anything?" msgstr "有什麼想說的嗎?" @@ -1294,16 +1143,12 @@ msgstr "暗淡" #: src/lib/moderation/useLabelBehaviorDescription.ts:68 #: src/screens/Moderation/index.tsx:341 msgid "Disabled" -msgstr "" +msgstr "停用" #: src/view/com/composer/Composer.tsx:511 msgid "Discard" msgstr "捨棄" -#: src/view/com/composer/Composer.tsx:145 -#~ msgid "Discard draft" -#~ msgstr "捨棄草稿" - #: src/view/com/composer/Composer.tsx:508 msgid "Discard draft?" msgstr "捨棄草稿?" @@ -1318,10 +1163,6 @@ msgstr "鼓勵應用程式不要向未登入使用者顯示我的帳號" msgid "Discover new custom feeds" msgstr "探索新的自訂訊息流" -#: src/view/screens/Feeds.tsx:473 -#~ msgid "Discover new feeds" -#~ msgstr "探索新的訊息流" - #: src/view/screens/Feeds.tsx:689 msgid "Discover New Feeds" msgstr "探索新的訊息流" @@ -1336,28 +1177,24 @@ msgstr "顯示名稱" #: src/view/com/modals/ChangeHandle.tsx:397 msgid "DNS Panel" -msgstr "" +msgstr "DNS 控制台" #: src/lib/moderation/useGlobalLabelStrings.ts:39 msgid "Does not include nudity." -msgstr "" +msgstr "不包含裸露内容。" #: src/screens/Signup/StepHandle.tsx:104 msgid "Doesn't begin or end with a hyphen" -msgstr "" +msgstr "不以連字符開頭或結尾" #: src/view/com/modals/ChangeHandle.tsx:481 msgid "Domain Value" -msgstr "" +msgstr "網域設定值" #: src/view/com/modals/ChangeHandle.tsx:488 msgid "Domain verified!" msgstr "網域已驗證!" -#: src/view/com/auth/create/Step1.tsx:170 -#~ msgid "Don't have an invite code?" -#~ msgstr "沒有邀請碼?" - #: src/components/dialogs/BirthDateSettings.tsx:119 #: src/components/dialogs/BirthDateSettings.tsx:125 #: src/components/forms/DateField/index.tsx:74 @@ -1393,14 +1230,6 @@ msgstr "完成" msgid "Done{extraText}" msgstr "完成{extraText}" -#: src/view/com/auth/login/ChooseAccountForm.tsx:46 -#~ msgid "Double tap to sign in" -#~ msgstr "雙擊以登入" - -#: src/view/screens/Settings/index.tsx:755 -#~ msgid "Download Bluesky account data (repository)" -#~ msgstr "下載 Bluesky 帳號資料(存放庫)" - #: src/view/screens/Settings/ExportCarDialog.tsx:59 #: src/view/screens/Settings/ExportCarDialog.tsx:63 msgid "Download CAR file" @@ -1416,7 +1245,7 @@ msgstr "受 Apple 政策限制,成人內容只能在完成註冊後在網頁 #: src/view/com/modals/ChangeHandle.tsx:258 msgid "e.g. alice" -msgstr "" +msgstr "例如:alice" #: src/view/com/modals/EditProfile.tsx:186 msgid "e.g. Alice Roberts" @@ -1424,7 +1253,7 @@ msgstr "例如:張藍天" #: src/view/com/modals/ChangeHandle.tsx:380 msgid "e.g. alice.com" -msgstr "" +msgstr "例如:alice.com" #: src/view/com/modals/EditProfile.tsx:204 msgid "e.g. Artist, dog-lover, and avid reader." @@ -1432,7 +1261,7 @@ msgstr "例如:藝術家、愛狗人士和狂熱讀者。" #: src/lib/moderation/useGlobalLabelStrings.ts:43 msgid "E.g. artistic nudes." -msgstr "" +msgstr "例如:藝術裸露。" #: src/view/com/modals/CreateOrEditList.tsx:284 msgid "e.g. Great Posters" @@ -1462,7 +1291,7 @@ msgstr "編輯" #: src/view/com/util/UserAvatar.tsx:299 #: src/view/com/util/UserBanner.tsx:85 msgid "Edit avatar" -msgstr "" +msgstr "編輯頭像" #: src/view/com/composer/photos/Gallery.tsx:144 #: src/view/com/modals/EditImage.tsx:208 @@ -1564,11 +1393,7 @@ msgstr "允許在你的訊息流中出現成人內容" #: src/components/dialogs/EmbedConsent.tsx:82 #: src/components/dialogs/EmbedConsent.tsx:89 msgid "Enable external media" -msgstr "" - -#: src/view/com/modals/EmbedConsent.tsx:97 -#~ msgid "Enable External Media" -#~ msgstr "啟用外部媒體" +msgstr "啟用外部媒體" #: src/view/screens/PreferencesExternalEmbeds.tsx:75 msgid "Enable media players for" @@ -1580,7 +1405,7 @@ msgstr "啟用此設定來只顯示你跟隨的人之間的回覆。" #: src/components/dialogs/EmbedConsent.tsx:94 msgid "Enable this source only" -msgstr "" +msgstr "僅啟用此來源" #: src/screens/Moderation/index.tsx:339 msgid "Enabled" @@ -1596,12 +1421,12 @@ msgstr "輸入此應用程式專用密碼的名稱" #: src/screens/Login/SetNewPasswordForm.tsx:139 msgid "Enter a password" -msgstr "" +msgstr "輸入密碼" #: src/components/dialogs/MutedWords.tsx:99 #: src/components/dialogs/MutedWords.tsx:100 msgid "Enter a word or tag" -msgstr "" +msgstr "輸入詞彙或標籤" #: src/view/com/modals/VerifyEmail.tsx:105 msgid "Enter Confirmation Code" @@ -1623,10 +1448,6 @@ msgstr "輸入你用於建立帳號的電子郵件。我們將向你發送重設 msgid "Enter your birth date" msgstr "輸入你的出生日期" -#: src/view/com/modals/Waitlist.tsx:78 -#~ msgid "Enter your email" -#~ msgstr "輸入你的電子郵件地址" - #: src/screens/Login/ForgotPasswordForm.tsx:105 #: src/screens/Signup/StepInfo/index.tsx:91 msgid "Enter your email address" @@ -1640,10 +1461,6 @@ msgstr "請在上方輸入你的新電子郵件地址" msgid "Enter your new email address below." msgstr "請在下方輸入你的新電子郵件地址。" -#: src/view/com/auth/create/Step2.tsx:188 -#~ msgid "Enter your phone number" -#~ msgstr "輸入你的手機號碼" - #: src/screens/Login/index.tsx:101 msgid "Enter your username and password" msgstr "輸入你的使用者名稱和密碼" @@ -1662,11 +1479,11 @@ msgstr "所有人" #: src/lib/moderation/useReportOptions.ts:66 msgid "Excessive mentions or replies" -msgstr "" +msgstr "過多的提及或回覆" #: src/view/com/modals/DeleteAccount.tsx:230 msgid "Exits account deletion process" -msgstr "" +msgstr "離開帐户删除流程" #: src/view/com/modals/ChangeHandle.tsx:151 msgid "Exits handle change process" @@ -1674,7 +1491,7 @@ msgstr "離開修改帳號代碼流程" #: src/view/com/modals/crop-image/CropImage.web.tsx:136 msgid "Exits image cropping process" -msgstr "" +msgstr "離開圖片裁剪流程" #: src/view/com/lightbox/Lightbox.web.tsx:130 msgid "Exits image view" @@ -1685,10 +1502,6 @@ msgstr "離開圖片檢視器" msgid "Exits inputting search query" msgstr "離開搜尋字詞輸入" -#: src/view/com/modals/Waitlist.tsx:138 -#~ msgid "Exits signing up for waitlist with {email}" -#~ msgstr "將 {email} 從候補列表中移除" - #: src/view/com/lightbox/Lightbox.web.tsx:183 msgid "Expand alt text" msgstr "展開替代文字" @@ -1700,11 +1513,11 @@ msgstr "展開或摺疊你要回覆的完整貼文" #: src/lib/moderation/useGlobalLabelStrings.ts:47 msgid "Explicit or potentially disturbing media." -msgstr "" +msgstr "露骨或可能令人不安的媒體內容。" #: src/lib/moderation/useGlobalLabelStrings.ts:35 msgid "Explicit sexual images." -msgstr "" +msgstr "露骨的情色內容圖片。" #: src/view/screens/Settings/index.tsx:777 msgid "Export my data" @@ -1729,7 +1542,7 @@ msgstr "外部媒體可能允許網站收集有關你和你裝置的信息。在 #: src/view/screens/PreferencesExternalEmbeds.tsx:52 #: src/view/screens/Settings/index.tsx:677 msgid "External Media Preferences" -msgstr "外部媒體偏好設定" +msgstr "外部媒體設定偏好" #: src/view/screens/Settings/index.tsx:668 msgid "External media settings" @@ -1755,7 +1568,7 @@ msgstr "無法載入推薦訊息流" #: src/view/com/lightbox/Lightbox.tsx:83 msgid "Failed to save image: {0}" -msgstr "" +msgstr "無法儲存圖片:{0}" #: src/Navigation.tsx:196 msgid "Feed" @@ -1769,10 +1582,6 @@ msgstr "{0} 建立的訊息流" msgid "Feed offline" msgstr "訊息流已離線" -#: src/view/com/feeds/FeedPage.tsx:143 -#~ msgid "Feed Preferences" -#~ msgstr "訊息流偏好設定" - #: src/view/shell/desktop/RightNav.tsx:61 #: src/view/shell/Drawer.tsx:314 msgid "Feedback" @@ -1789,10 +1598,6 @@ msgstr "意見回饋" msgid "Feeds" msgstr "訊息流" -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:106 -#~ msgid "Feeds are created by users and organizations. They offer you varied experiences and suggest content you may like using algorithms." -#~ msgstr "訊息流由使用者和組織建立,結合演算法為你推薦可能喜歡的內容,可為你帶來不一樣的體驗。" - #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:57 msgid "Feeds are created by users to curate content. Choose some feeds that you find interesting." msgstr "訊息流由使用者建立並管理。選擇一些你覺得有趣的訊息流。" @@ -1807,11 +1612,11 @@ msgstr "訊息流也可以圍繞某些話題!" #: src/view/com/modals/ChangeHandle.tsx:481 msgid "File Contents" -msgstr "" +msgstr "檔案內容" #: src/lib/moderation/useLabelBehaviorDescription.ts:66 msgid "Filter from feeds" -msgstr "" +msgstr "從訊息流中篩選" #: src/screens/Onboarding/StepFinished.tsx:155 msgid "Finalizing" @@ -1837,11 +1642,7 @@ msgstr "正在尋找相似的帳號…" #: src/view/screens/PreferencesFollowingFeed.tsx:111 msgid "Fine-tune the content you see on your Following feed." -msgstr "" - -#: src/view/screens/PreferencesHomeFeed.tsx:111 -#~ msgid "Fine-tune the content you see on your home screen." -#~ msgstr "調整你在首頁上所看到的內容。" +msgstr "調整你在跟隨訊息流上所看到的內容。" #: src/view/screens/PreferencesThreads.tsx:60 msgid "Fine-tune the discussion threads." @@ -1894,7 +1695,7 @@ msgstr "跟隨所有" #: src/view/com/post-thread/PostThreadFollowBtn.tsx:144 msgid "Follow Back" -msgstr "" +msgstr "回追蹤" #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:182 msgid "Follow selected accounts and continue to the next step" @@ -1938,7 +1739,7 @@ msgstr "跟隨中:{0}" #: src/view/screens/Settings/index.tsx:553 msgid "Following feed preferences" -msgstr "" +msgstr "跟隨訊息流設定偏好" #: src/Navigation.tsx:262 #: src/view/com/home/HomeHeaderLayout.web.tsx:50 @@ -1946,7 +1747,7 @@ msgstr "" #: src/view/screens/PreferencesFollowingFeed.tsx:104 #: src/view/screens/Settings/index.tsx:562 msgid "Following Feed Preferences" -msgstr "" +msgstr "跟隨訊息流設定偏好" #: src/screens/Profile/Header/Handle.tsx:24 msgid "Follows you" @@ -1968,14 +1769,6 @@ msgstr "為了保護你的帳號安全,我們需要將驗證碼發送到你的 msgid "For security reasons, you won't be able to view this again. If you lose this password, you'll need to generate a new one." msgstr "為了保護你的帳號安全,你將無法再次查看此內容。如果你丟失了此密碼,你將需要產生一個新密碼。" -#: src/view/com/auth/login/LoginForm.tsx:244 -#~ msgid "Forgot" -#~ msgstr "忘記" - -#: src/view/com/auth/login/LoginForm.tsx:241 -#~ msgid "Forgot password" -#~ msgstr "忘記密碼" - #: src/screens/Login/index.tsx:129 #: src/screens/Login/index.tsx:144 msgid "Forgot Password" @@ -1983,20 +1776,20 @@ msgstr "忘記密碼" #: src/screens/Login/LoginForm.tsx:201 msgid "Forgot password?" -msgstr "" +msgstr "忘記密碼?" #: src/screens/Login/LoginForm.tsx:212 msgid "Forgot?" -msgstr "" +msgstr "忘記?" #: src/lib/moderation/useReportOptions.ts:52 msgid "Frequently Posts Unwanted Content" -msgstr "" +msgstr "經常發佈無關內容" #: src/screens/Hashtag.tsx:109 #: src/screens/Hashtag.tsx:149 msgid "From @{sanitizedAuthor}" -msgstr "" +msgstr "來自 @{sanitizedAuthor}" #: src/view/com/posts/FeedItem.tsx:179 msgctxt "from-feed" @@ -2014,7 +1807,7 @@ msgstr "開始" #: src/lib/moderation/useReportOptions.ts:37 msgid "Glaring violations of law or terms of service" -msgstr "" +msgstr "明顯違反法律或服務條款" #: src/components/moderation/ScreenHider.tsx:151 #: src/components/moderation/ScreenHider.tsx:160 @@ -2046,11 +1839,11 @@ msgstr "返回上一步" #: src/view/screens/NotFound.tsx:55 msgid "Go home" -msgstr "" +msgstr "前往首頁" #: src/view/screens/NotFound.tsx:54 msgid "Go Home" -msgstr "" +msgstr "前往首頁" #: src/view/screens/Search/Search.tsx:749 #: src/view/shell/desktop/Search.tsx:263 @@ -2064,7 +1857,7 @@ msgstr "前往下一步" #: src/lib/moderation/useGlobalLabelStrings.ts:46 msgid "Graphic Media" -msgstr "" +msgstr "平面媒體" #: src/view/com/modals/ChangeHandle.tsx:266 msgid "Handle" @@ -2072,19 +1865,15 @@ msgstr "帳號代碼" #: src/lib/moderation/useReportOptions.ts:32 msgid "Harassment, trolling, or intolerance" -msgstr "" +msgstr "騷擾、惡作劇或其他無法容忍的行為" #: src/Navigation.tsx:282 msgid "Hashtag" -msgstr "" - -#: src/components/RichText.tsx:188 -#~ msgid "Hashtag: {tag}" -#~ msgstr "" +msgstr "標籤" #: src/components/RichText.tsx:191 msgid "Hashtag: #{tag}" -msgstr "" +msgstr "標籤:#{tag}" #: src/screens/Signup/index.tsx:217 msgid "Having trouble?" @@ -2105,7 +1894,7 @@ msgstr "這裡有一些熱門的話題訊息流。跟隨的訊息流數量沒有 #: src/screens/Onboarding/StepTopicalFeeds.tsx:84 msgid "Here are some topical feeds based on your interests: {interestsText}. You can choose to follow as many as you like." -msgstr "這裡有一些根據您的興趣({interestsText})所推薦的熱門的話題訊息流。跟隨的訊息流數量沒有限制。" +msgstr "這裡有一些根據你的興趣({interestsText})所推薦的熱門的話題訊息流。跟隨的訊息流數量沒有限制。" #: src/view/com/modals/AddAppPasswords.tsx:154 msgid "Here is your app password." @@ -2147,10 +1936,6 @@ msgstr "隱藏這則貼文?" msgid "Hide user list" msgstr "隱藏使用者列表" -#: src/view/com/profile/ProfileHeader.tsx:487 -#~ msgid "Hides posts from {0} in your feed" -#~ msgstr "在你的訂閱中隱藏來自 {0} 的貼文" - #: src/view/com/posts/FeedErrorMessage.tsx:111 msgid "Hmm, some kind of issue occurred when contacting the feed server. Please let the feed owner know about this issue." msgstr "唔,與訊息流伺服器連線時發生了某種問題。請告訴該訊息流的擁有者這個問題。" @@ -2173,11 +1958,11 @@ msgstr "唔,我們無法找到這個訊息流,它可能已被刪除。" #: src/screens/Moderation/index.tsx:59 msgid "Hmmmm, it seems we're having trouble loading this data. See below for more details. If this issue persists, please contact us." -msgstr "" +msgstr "唔,看起來我們在載入這些資料時遇到了問題,詳情請參閱下方。如果問題持續存在,請聯絡我們。" #: src/screens/Profile/ErrorState.tsx:31 msgid "Hmmmm, we couldn't load that moderation service." -msgstr "" +msgstr "唔,我們無法載入該限制服務" #: src/Navigation.tsx:454 #: src/view/shell/bottom-bar/BottomBar.tsx:147 @@ -2187,16 +1972,9 @@ msgstr "" msgid "Home" msgstr "首頁" -#: src/Navigation.tsx:247 -#: src/view/com/pager/FeedsTabBarMobile.tsx:123 -#: src/view/screens/PreferencesHomeFeed.tsx:104 -#: src/view/screens/Settings/index.tsx:543 -#~ msgid "Home Feed Preferences" -#~ msgstr "首頁訊息流偏好" - #: src/view/com/modals/ChangeHandle.tsx:420 msgid "Host:" -msgstr "" +msgstr "主機:" #: src/screens/Login/ForgotPasswordForm.tsx:89 #: src/screens/Login/LoginForm.tsx:134 @@ -2231,15 +2009,15 @@ msgstr "若不勾選,則預設為全年齡向。" #: src/screens/Signup/StepInfo/Policies.tsx:83 msgid "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." -msgstr "" +msgstr "如果根據你所在國家的法律,你尚未成年,則你的父母或法定監護人必須代表你閱讀這些條款。" #: src/view/screens/ProfileList.tsx:610 msgid "If you delete this list, you won't be able to recover it." -msgstr "" +msgstr "如果刪除這個列表,你將無法恢復它。" #: src/view/com/util/forms/PostDropdownBtn.tsx:316 msgid "If you remove this post, you won't be able to recover it." -msgstr "" +msgstr "如果刪除這則貼文,你將無法恢復它。" #: src/view/com/modals/ChangePassword.tsx:148 msgid "If you want to change your password, we will send you a code to verify that this is your account." @@ -2247,7 +2025,7 @@ msgstr "如果你想更改密碼,我們將向你發送一個驗證碼以確認 #: src/lib/moderation/useReportOptions.ts:36 msgid "Illegal and Urgent" -msgstr "" +msgstr "違法" #: src/view/com/util/images/Gallery.tsx:38 msgid "Image" @@ -2257,14 +2035,9 @@ msgstr "圖片" msgid "Image alt text" msgstr "圖片替代文字" -#: src/view/com/util/UserAvatar.tsx:311 -#: src/view/com/util/UserBanner.tsx:118 -#~ msgid "Image options" -#~ msgstr "圖片選項" - #: src/lib/moderation/useReportOptions.ts:47 msgid "Impersonation or false claims about identity or affiliation" -msgstr "" +msgstr "冒充或虛假聲明身份或隸屬關係" #: src/screens/Login/SetNewPasswordForm.tsx:127 msgid "Input code sent to your email for password reset" @@ -2274,14 +2047,6 @@ msgstr "輸入發送到你電子郵件地址的重設碼以重設密碼" msgid "Input confirmation code for account deletion" msgstr "輸入刪除帳號的驗證碼" -#: src/view/com/auth/create/Step1.tsx:177 -#~ msgid "Input email for Bluesky account" -#~ msgstr "輸入 Bluesky 帳號的電子郵件地址" - -#: src/view/com/auth/create/Step1.tsx:151 -#~ msgid "Input invite code to proceed" -#~ msgstr "輸入邀請碼以繼續" - #: src/view/com/modals/AddAppPasswords.tsx:181 msgid "Input name for app password" msgstr "輸入應用程式專用密碼名稱" @@ -2294,10 +2059,6 @@ msgstr "輸入新密碼" msgid "Input password for account deletion" msgstr "輸入密碼以刪除帳號" -#: src/view/com/auth/create/Step2.tsx:196 -#~ msgid "Input phone number for SMS verification" -#~ msgstr "輸入手機號碼進行簡訊驗證" - #: src/screens/Login/LoginForm.tsx:195 msgid "Input the password tied to {identifier}" msgstr "輸入與 {identifier} 關聯的密碼" @@ -2306,21 +2067,13 @@ msgstr "輸入與 {identifier} 關聯的密碼" msgid "Input the username or email address you used at signup" msgstr "輸入註冊時使用的使用者名稱或電子郵件地址" -#: src/view/com/auth/create/Step2.tsx:271 -#~ msgid "Input the verification code we have texted to you" -#~ msgstr "輸入我們發送到你手機的驗證碼" - -#: src/view/com/modals/Waitlist.tsx:90 -#~ msgid "Input your email to get on the Bluesky waitlist" -#~ msgstr "輸入你的電子郵件地址以加入 Bluesky 候補列表" - #: src/screens/Login/LoginForm.tsx:194 msgid "Input your password" msgstr "輸入你的密碼" #: src/view/com/modals/ChangeHandle.tsx:389 msgid "Input your preferred hosting provider" -msgstr "" +msgstr "輸入你的托管服務提供商" #: src/screens/Signup/StepHandle.tsx:62 msgid "Input your user handle" @@ -2334,10 +2087,6 @@ msgstr "無效或不支援的貼文紀錄" msgid "Invalid username or password" msgstr "使用者名稱或密碼無效" -#: src/view/screens/Settings.tsx:411 -#~ msgid "Invite" -#~ msgstr "邀請" - #: src/view/com/modals/InviteCodes.tsx:94 msgid "Invite a Friend" msgstr "邀請朋友" @@ -2354,10 +2103,6 @@ msgstr "邀請碼無效。請檢查你輸入的內容是否正確,然後重試 msgid "Invite codes: {0} available" msgstr "邀請碼:{0} 個可用" -#: src/view/shell/Drawer.tsx:645 -#~ msgid "Invite codes: {invitesAvailable} available" -#~ msgstr "邀請碼:{invitesAvailable} 個可用" - #: src/view/com/modals/InviteCodes.tsx:170 msgid "Invite codes: 1 available" msgstr "邀請碼:1 個可用" @@ -2371,54 +2116,41 @@ msgstr "它會即時顯示你所跟隨的人發佈的貼文。" msgid "Jobs" msgstr "工作" -#: src/view/com/modals/Waitlist.tsx:67 -#~ msgid "Join the waitlist" -#~ msgstr "加入候補列表" - -#: src/view/com/auth/create/Step1.tsx:174 -#: src/view/com/auth/create/Step1.tsx:178 -#~ msgid "Join the waitlist." -#~ msgstr "加入候補列表。" - -#: src/view/com/modals/Waitlist.tsx:128 -#~ msgid "Join Waitlist" -#~ msgstr "加入候補列表" - #: src/screens/Onboarding/index.tsx:24 msgid "Journalism" msgstr "新聞學" #: src/components/moderation/LabelsOnMe.tsx:59 msgid "label has been placed on this {labelTarget}" -msgstr "" +msgstr "此標籤已放置於 {labelTarget} 上" #: src/components/moderation/ContentHider.tsx:144 msgid "Labeled by {0}." -msgstr "" +msgstr "由 {0} 標註。" #: src/components/moderation/ContentHider.tsx:142 msgid "Labeled by the author." -msgstr "" +msgstr "由作者標註。" #: src/view/screens/Profile.tsx:188 msgid "Labels" -msgstr "" +msgstr "標籤" #: src/screens/Profile/Sections/Labels.tsx:142 msgid "Labels are annotations on users and content. They can be used to hide, warn, and categorize the network." -msgstr "" +msgstr "標籤是對使用者和內容的標註,可用於隱藏、警告和對網路進行分類。" #: src/components/moderation/LabelsOnMe.tsx:61 msgid "labels have been placed on this {labelTarget}" -msgstr "" +msgstr "此標籤已放置於 {labelTarget} 上" #: src/components/moderation/LabelsOnMeDialog.tsx:62 msgid "Labels on your account" -msgstr "" +msgstr "你帳戶上的標籤" #: src/components/moderation/LabelsOnMeDialog.tsx:64 msgid "Labels on your content" -msgstr "" +msgstr "你內容上的標籤" #: src/view/com/composer/select-language/SelectLangBtn.tsx:104 msgid "Language selection" @@ -2437,14 +2169,6 @@ msgstr "語言設定" msgid "Languages" msgstr "語言" -#: src/view/com/auth/create/StepHeader.tsx:20 -#~ msgid "Last step!" -#~ msgstr "最後一步!" - -#: src/view/com/util/moderation/ContentHider.tsx:103 -#~ msgid "Learn more" -#~ msgstr "瞭解詳情" - #: src/components/moderation/ScreenHider.tsx:136 msgid "Learn More" msgstr "瞭解詳情" @@ -2452,7 +2176,7 @@ msgstr "瞭解詳情" #: src/components/moderation/ContentHider.tsx:65 #: src/components/moderation/ContentHider.tsx:128 msgid "Learn more about the moderation applied to this content." -msgstr "" +msgstr "詳細了解套用於此內容的限制。" #: src/components/moderation/PostHider.tsx:85 #: src/components/moderation/ScreenHider.tsx:125 @@ -2492,11 +2216,6 @@ msgstr "讓我們來重設你的密碼吧!" msgid "Let's go!" msgstr "讓我們開始吧!" -#: src/view/com/util/UserAvatar.tsx:248 -#: src/view/com/util/UserBanner.tsx:62 -#~ msgid "Library" -#~ msgstr "圖片庫" - #: src/view/screens/Settings/index.tsx:498 msgid "Light" msgstr "亮色" @@ -2528,7 +2247,7 @@ msgstr "{0} 個 {1} 喜歡" #: src/components/LabelingServiceCard/index.tsx:72 msgid "Liked by {count} {0}" -msgstr "" +msgstr "{count} 個 {0} 喜歡" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:278 #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:292 @@ -2597,11 +2316,6 @@ msgstr "解除靜音列表" msgid "Lists" msgstr "列表" -#: src/view/com/post-thread/PostThread.tsx:333 -#: src/view/com/post-thread/PostThread.tsx:341 -#~ msgid "Load more posts" -#~ msgstr "載入更多貼文" - #: src/view/screens/Notifications.tsx:159 msgid "Load new notifications" msgstr "載入新的通知" @@ -2617,10 +2331,6 @@ msgstr "載入新的貼文" msgid "Loading..." msgstr "載入中…" -#: src/view/com/modals/ServerInput.tsx:50 -#~ msgid "Local dev server" -#~ msgstr "本地開發伺服器" - #: src/Navigation.tsx:221 msgid "Log" msgstr "日誌" @@ -2642,7 +2352,7 @@ msgstr "登入未列出的帳號" #: src/screens/Login/SetNewPasswordForm.tsx:116 msgid "Looks like XXXXX-XXXXX" -msgstr "" +msgstr "看起來像是 XXXXX-XXXXX" #: src/view/com/modals/LinkWarning.tsx:79 msgid "Make sure this is where you intend to go!" @@ -2650,15 +2360,7 @@ msgstr "請確認這是你想要去的的地方!" #: src/components/dialogs/MutedWords.tsx:82 msgid "Manage your muted words and tags" -msgstr "" - -#: src/view/com/auth/create/Step2.tsx:118 -#~ msgid "May not be longer than 253 characters" -#~ msgstr "" - -#: src/view/com/auth/create/Step2.tsx:109 -#~ msgid "May only contain letters and numbers" -#~ msgstr "" +msgstr "管理你靜音的文字和標籤" #: src/view/screens/Profile.tsx:192 msgid "Media" @@ -2683,7 +2385,7 @@ msgstr "來自伺服器的訊息:{0}" #: src/lib/moderation/useReportOptions.ts:45 msgid "Misleading Account" -msgstr "" +msgstr "誤導性帳戶" #: src/Navigation.tsx:119 #: src/screens/Moderation/index.tsx:104 @@ -2696,7 +2398,7 @@ msgstr "限制" #: src/components/moderation/ModerationDetailsDialog.tsx:112 msgid "Moderation details" -msgstr "" +msgstr "限制詳情" #: src/view/com/lists/ListCard.tsx:93 #: src/view/com/modals/UserAddRemoveLists.tsx:206 @@ -2736,11 +2438,11 @@ msgstr "限制設定" #: src/Navigation.tsx:216 msgid "Moderation states" -msgstr "" +msgstr "限制狀態" #: src/screens/Moderation/index.tsx:215 msgid "Moderation tools" -msgstr "" +msgstr "限制工具" #: src/components/moderation/ModerationDetailsDialog.tsx:48 #: src/lib/moderation/useModerationCauseDescription.ts:40 @@ -2749,7 +2451,7 @@ msgstr "限制選擇對內容設定一般警告。" #: src/view/com/post-thread/PostThreadItem.tsx:541 msgid "More" -msgstr "" +msgstr "更多" #: src/view/shell/desktop/Feeds.tsx:65 msgid "More feeds" @@ -2759,25 +2461,17 @@ msgstr "更多訊息流" msgid "More options" msgstr "更多選項" -#: src/view/com/util/forms/PostDropdownBtn.tsx:315 -#~ msgid "More post options" -#~ msgstr "更多貼文選項" - #: src/view/screens/PreferencesThreads.tsx:82 msgid "Most-liked replies first" msgstr "最多按喜歡數優先" -#: src/view/com/auth/create/Step2.tsx:122 -#~ msgid "Must be at least 3 characters" -#~ msgstr "" - #: src/components/TagMenu/index.tsx:249 msgid "Mute" -msgstr "" +msgstr "靜音" #: src/components/TagMenu/index.web.tsx:105 msgid "Mute {truncatedTag}" -msgstr "" +msgstr "靜音 {truncatedTag}" #: src/view/com/profile/ProfileMenu.tsx:279 #: src/view/com/profile/ProfileMenu.tsx:286 @@ -2790,19 +2484,15 @@ msgstr "靜音帳號" #: src/components/TagMenu/index.tsx:209 msgid "Mute all {displayTag} posts" -msgstr "" - -#: src/components/TagMenu/index.tsx:211 -#~ msgid "Mute all {tag} posts" -#~ msgstr "" +msgstr "將所有 {displayTag} 貼文靜音" #: src/components/dialogs/MutedWords.tsx:148 msgid "Mute in tags only" -msgstr "" +msgstr "僅在標籤中靜音" #: src/components/dialogs/MutedWords.tsx:133 msgid "Mute in text & tags" -msgstr "" +msgstr "在文字和標籤中靜音" #: src/view/screens/ProfileList.tsx:461 #: src/view/screens/ProfileList.tsx:624 @@ -2813,10 +2503,6 @@ msgstr "靜音列表" msgid "Mute these accounts?" msgstr "靜音這些帳號?" -#: src/view/screens/ProfileList.tsx:279 -#~ msgid "Mute this List" -#~ msgstr "靜音這個列表" - #: src/components/dialogs/MutedWords.tsx:126 msgid "Mute this word in post text and tags" msgstr "在帖子文本和话题标签中隐藏该词" @@ -2833,7 +2519,7 @@ msgstr "靜音對話串" #: src/view/com/util/forms/PostDropdownBtn.tsx:267 #: src/view/com/util/forms/PostDropdownBtn.tsx:269 msgid "Mute words & tags" -msgstr "" +msgstr "靜音文字和標籤" #: src/view/com/lists/ListCard.tsx:102 msgid "Muted" @@ -2854,11 +2540,11 @@ msgstr "已靜音的帳號將不會在你的通知或時間線中顯示,被靜 #: src/lib/moderation/useModerationCauseDescription.ts:85 msgid "Muted by \"{0}\"" -msgstr "" +msgstr "被\"{0}\"靜音" #: src/screens/Moderation/index.tsx:231 msgid "Muted words & tags" -msgstr "" +msgstr "已靜音文字和標籤" #: src/view/screens/ProfileList.tsx:621 msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them." @@ -2885,10 +2571,6 @@ msgstr "我儲存的訊息流" msgid "My Saved Feeds" msgstr "我儲存的訊息流" -#: src/view/com/auth/server-input/index.tsx:118 -#~ msgid "my-server.com" -#~ msgstr "my-server.com" - #: src/view/com/modals/AddAppPasswords.tsx:180 #: src/view/com/modals/CreateOrEditList.tsx:291 msgid "Name" @@ -2902,7 +2584,7 @@ msgstr "名稱是必填項" #: src/lib/moderation/useReportOptions.ts:78 #: src/lib/moderation/useReportOptions.ts:86 msgid "Name or Description Violates Community Standards" -msgstr "" +msgstr "名稱或描述違反社群標準" #: src/screens/Onboarding/index.tsx:25 msgid "Nature" @@ -2920,12 +2602,7 @@ msgstr "切換到你的個人檔案" #: src/components/ReportDialog/SelectReportOptionView.tsx:122 msgid "Need to report a copyright violation?" -msgstr "" - -#: src/view/com/modals/EmbedConsent.tsx:107 -#: src/view/com/modals/EmbedConsent.tsx:123 -#~ msgid "Never load embeds from {0}" -#~ msgstr "永不載入來自 {0} 的嵌入內容" +msgstr "需要檢舉侵權嗎?" #: src/view/com/auth/onboarding/WelcomeDesktop.tsx:72 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:74 @@ -2936,13 +2613,9 @@ msgstr "永遠不會失去對你的跟隨者和資料的存取權。" msgid "Never lose access to your followers or data." msgstr "永遠不會失去對你的跟隨者或資料的存取權。" -#: src/components/dialogs/MutedWords.tsx:293 -#~ msgid "Nevermind" -#~ msgstr "" - #: src/view/com/modals/ChangeHandle.tsx:519 msgid "Nevermind, create a handle for me" -msgstr "" +msgstr "沒關係,為我創建一個帳號代碼" #: src/view/screens/Lists.tsx:76 msgctxt "action" @@ -3035,7 +2708,7 @@ msgstr "沒有描述" #: src/view/com/modals/ChangeHandle.tsx:405 msgid "No DNS Panel" -msgstr "" +msgstr "無 DNS 控制台" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:118 msgid "No longer following {0}" @@ -3043,7 +2716,7 @@ msgstr "不再跟隨 {0}" #: src/screens/Signup/StepHandle.tsx:114 msgid "No longer than 253 characters" -msgstr "" +msgstr "不超過 253 個字符" #: src/view/com/notifications/Feed.tsx:109 msgid "No notifications yet!" @@ -3080,11 +2753,11 @@ msgstr "沒有人" #: src/components/LikedByList.tsx:79 #: src/components/LikesDialog.tsx:99 msgid "Nobody has liked this yet. Maybe you should be the first!" -msgstr "" +msgstr "還沒有人喜歡這個,也許你應該成為第一個!" #: src/lib/moderation/useGlobalLabelStrings.ts:42 msgid "Non-sexual Nudity" -msgstr "" +msgstr "非情色內容裸體" #: src/view/com/modals/SelfLabel.tsx:135 msgid "Not Applicable." @@ -3104,7 +2777,7 @@ msgstr "暫時不需要" #: src/view/com/util/forms/PostDropdownBtn.tsx:342 #: src/view/com/util/post-ctrls/PostCtrls.tsx:246 msgid "Note about sharing" -msgstr "" +msgstr "關於分享的注意事項" #: src/screens/Moderation/index.tsx:540 msgid "Note: Bluesky is an open and public network. This setting only limits the visibility of your content on the Bluesky app and website, and other apps may not respect this setting. Your content may still be shown to logged-out users by other apps and websites." @@ -3126,19 +2799,15 @@ msgstr "裸露" #: src/lib/moderation/useReportOptions.ts:71 msgid "Nudity or adult content not labeled as such" -msgstr "" - -#: src/lib/moderation/useReportOptions.ts:71 -#~ msgid "Nudity or pornography not labeled as such" -#~ msgstr "" +msgstr "未貼上此類標籤的裸露或成人內容" #: src/screens/Signup/index.tsx:142 msgid "of" -msgstr "" +msgstr "of" #: src/lib/moderation/useLabelBehaviorDescription.ts:11 msgid "Off" -msgstr "" +msgstr "顯示" #: src/view/com/util/ErrorBoundary.tsx:49 msgid "Oh no!" @@ -3151,7 +2820,7 @@ msgstr "糟糕!發生了一些錯誤。" #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:126 #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:327 msgid "OK" -msgstr "" +msgstr "好的" #: src/screens/Login/PasswordUpdatedForm.tsx:44 msgid "Okay" @@ -3175,11 +2844,11 @@ msgstr "只有 {0} 可以回覆。" #: src/screens/Signup/StepHandle.tsx:97 msgid "Only contains letters, numbers, and hyphens" -msgstr "" +msgstr "只包含字母、數字和連字符" #: src/components/Lists.tsx:75 msgid "Oops, something went wrong!" -msgstr "" +msgstr "糟糕,發生了錯誤!" #: src/components/Lists.tsx:170 #: src/view/screens/AppPasswords.tsx:67 @@ -3191,10 +2860,6 @@ msgstr "糟糕!" msgid "Open" msgstr "開啟" -#: src/view/screens/Moderation.tsx:75 -#~ msgid "Open content filtering settings" -#~ msgstr "" - #: src/view/com/composer/Composer.tsx:491 #: src/view/com/composer/Composer.tsx:492 msgid "Open emoji picker" @@ -3202,7 +2867,7 @@ msgstr "開啟表情符號選擇器" #: src/view/screens/ProfileFeed.tsx:300 msgid "Open feed options menu" -msgstr "" +msgstr "開啟訊息流選項選單" #: src/view/screens/Settings/index.tsx:734 msgid "Open links with in-app browser" @@ -3210,11 +2875,7 @@ msgstr "在內建瀏覽器中開啟連結" #: src/screens/Moderation/index.tsx:227 msgid "Open muted words and tags settings" -msgstr "" - -#: src/view/screens/Moderation.tsx:92 -#~ msgid "Open muted words settings" -#~ msgstr "打开隐藏词设置" +msgstr "開啟靜音文字和標籤設定" #: src/view/com/home/HomeHeaderLayoutMobile.tsx:50 msgid "Open navigation" @@ -3222,7 +2883,7 @@ msgstr "開啟導覽" #: src/view/com/util/forms/PostDropdownBtn.tsx:183 msgid "Open post options menu" -msgstr "" +msgstr "開啟貼文選項選單" #: src/view/screens/Settings/index.tsx:828 #: src/view/screens/Settings/index.tsx:838 @@ -3231,7 +2892,7 @@ msgstr "開啟故事書頁面" #: src/view/screens/Settings/index.tsx:816 msgid "Open system log" -msgstr "" +msgstr "開啟系統日誌" #: src/view/com/util/forms/DropdownButton.tsx:154 msgid "Opens {numItems} options" @@ -3261,10 +2922,6 @@ msgstr "開啟可以更改的語言設定" msgid "Opens device photo gallery" msgstr "開啟裝置相簿" -#: src/view/com/profile/ProfileHeader.tsx:420 -#~ msgid "Opens editor for profile display name, avatar, background image, and description" -#~ msgstr "開啟個人資料(如名稱、頭貼、背景圖片、描述等)編輯器" - #: src/view/screens/Settings/index.tsx:669 msgid "Opens external embeds settings" msgstr "開啟外部嵌入設定" @@ -3273,25 +2930,13 @@ msgstr "開啟外部嵌入設定" #: src/view/com/auth/SplashScreen.tsx:68 #: src/view/com/auth/SplashScreen.web.tsx:97 msgid "Opens flow to create a new Bluesky account" -msgstr "" +msgstr "開始流程以建立新的 Bluesky 帳戶" #: src/view/com/auth/HomeLoggedOutCTA.tsx:75 #: src/view/com/auth/SplashScreen.tsx:83 #: src/view/com/auth/SplashScreen.web.tsx:112 msgid "Opens flow to sign into your existing Bluesky account" -msgstr "" - -#: src/view/com/profile/ProfileHeader.tsx:575 -#~ msgid "Opens followers list" -#~ msgstr "開啟跟隨者列表" - -#: src/view/com/profile/ProfileHeader.tsx:594 -#~ msgid "Opens following list" -#~ msgstr "開啟正在跟隨列表" - -#: src/view/screens/Settings.tsx:412 -#~ msgid "Opens invite code list" -#~ msgstr "開啟邀請碼列表" +msgstr "開啟流程以登入你現有的 Bluesky 帳戶" #: src/view/com/modals/InviteCodes.tsx:173 msgid "Opens list of invite codes" @@ -3299,27 +2944,23 @@ msgstr "開啟邀請碼列表" #: src/view/screens/Settings/index.tsx:798 msgid "Opens modal for account deletion confirmation. Requires email code" -msgstr "" - -#: src/view/screens/Settings/index.tsx:774 -#~ msgid "Opens modal for account deletion confirmation. Requires email code." -#~ msgstr "開啟用於帳號刪除確認的彈窗。需要電子郵件驗證碼。" +msgstr "開啟用於帳號刪除確認的彈窗。需要電子郵件驗證碼。" #: src/view/screens/Settings/index.tsx:756 msgid "Opens modal for changing your Bluesky password" -msgstr "" +msgstr "開啟用於修改你 Bluesky 密碼的彈窗" #: src/view/screens/Settings/index.tsx:718 msgid "Opens modal for choosing a new Bluesky handle" -msgstr "" +msgstr "開啟用於創建新 Bluesky 帳號代碼的彈窗" #: src/view/screens/Settings/index.tsx:779 msgid "Opens modal for downloading your Bluesky account data (repository)" -msgstr "" +msgstr "開啟用於下載 Bluesky 帳戶數據(存儲庫)的彈窗" #: src/view/screens/Settings/index.tsx:968 msgid "Opens modal for email verification" -msgstr "" +msgstr "開啟用於驗證電子郵件的彈窗" #: src/view/com/modals/ChangeHandle.tsx:282 msgid "Opens modal for using custom domain" @@ -3344,23 +2985,15 @@ msgstr "開啟包含所有已儲存訊息流的畫面" #: src/view/screens/Settings/index.tsx:696 msgid "Opens the app password settings" -msgstr "" - -#: src/view/screens/Settings/index.tsx:676 -#~ msgid "Opens the app password settings page" -#~ msgstr "開啟應用程式專用密碼設定頁面" +msgstr "開啟應用程式專用密碼設定的畫面" #: src/view/screens/Settings/index.tsx:554 msgid "Opens the Following feed preferences" -msgstr "" - -#: src/view/screens/Settings/index.tsx:535 -#~ msgid "Opens the home feed preferences" -#~ msgstr "開啟首頁訊息流設定偏好" +msgstr "開啟跟隨訊息流設定偏好" #: src/view/com/modals/LinkWarning.tsx:93 msgid "Opens the linked website" -msgstr "" +msgstr "開啟已連結的網站" #: src/view/screens/Settings/index.tsx:829 #: src/view/screens/Settings/index.tsx:839 @@ -3381,7 +3014,7 @@ msgstr "{0} 選項,共 {numItems} 個" #: src/components/ReportDialog/SubmitView.tsx:162 msgid "Optionally provide additional information below:" -msgstr "" +msgstr "以下是可選提供的额外信息:" #: src/view/com/modals/Threadgate.tsx:89 msgid "Or combine these options:" @@ -3389,16 +3022,12 @@ msgstr "或者選擇組合這些選項:" #: src/lib/moderation/useReportOptions.ts:25 msgid "Other" -msgstr "" +msgstr "其他" #: src/components/AccountList.tsx:73 msgid "Other account" msgstr "其他帳號" -#: src/view/com/modals/ServerInput.tsx:88 -#~ msgid "Other service" -#~ msgstr "其他服務" - #: src/view/com/composer/select-language/SelectLangBtn.tsx:91 msgid "Other..." msgstr "其他…" @@ -3421,7 +3050,7 @@ msgstr "密碼" #: src/view/com/modals/ChangePassword.tsx:142 msgid "Password Changed" -msgstr "" +msgstr "密碼已更改" #: src/screens/Login/index.tsx:157 msgid "Password updated" @@ -3451,10 +3080,6 @@ msgstr "相機的存取權限已被拒絕,請在系統設定中啟用。" msgid "Pets" msgstr "寵物" -#: src/view/com/auth/create/Step2.tsx:183 -#~ msgid "Phone number" -#~ msgstr "手機號碼" - #: src/view/com/modals/SelfLabel.tsx:121 msgid "Pictures meant for adults." msgstr "適合成年人的圖像。" @@ -3466,7 +3091,7 @@ msgstr "固定到首頁" #: src/view/screens/ProfileFeed.tsx:295 msgid "Pin to Home" -msgstr "" +msgstr "固定到首頁" #: src/view/screens/SavedFeeds.tsx:88 msgid "Pinned Feeds" @@ -3505,25 +3130,13 @@ msgstr "更改前請先確認你的電子郵件地址。這是電子郵件更新 msgid "Please enter a name for your app password. All spaces is not allowed." msgstr "請輸入應用程式專用密碼的名稱。所有空格均不允許使用。" -#: src/view/com/auth/create/Step2.tsx:206 -#~ msgid "Please enter a phone number that can receive SMS text messages." -#~ msgstr "請輸入可以接收簡訊的手機號碼。" - #: src/view/com/modals/AddAppPasswords.tsx:146 msgid "Please enter a unique name for this App Password or use our randomly generated one." msgstr "請輸入此應用程式專用密碼的唯一名稱,或使用我們提供的隨機生成名稱。" #: src/components/dialogs/MutedWords.tsx:67 msgid "Please enter a valid word, tag, or phrase to mute" -msgstr "" - -#: src/view/com/auth/create/state.ts:170 -#~ msgid "Please enter the code you received by SMS." -#~ msgstr "請輸入你收到的簡訊驗證碼。" - -#: src/view/com/auth/create/Step2.tsx:282 -#~ msgid "Please enter the verification code sent to {phoneNumberFormatted}." -#~ msgstr "請輸入發送到 {phoneNumberFormatted} 的驗證碼。" +msgstr "請輸入有效的詞語或標籤進行靜音" #: src/screens/Signup/state.ts:220 msgid "Please enter your email." @@ -3535,12 +3148,7 @@ msgstr "請輸入你的密碼:" #: src/components/moderation/LabelsOnMeDialog.tsx:221 msgid "Please explain why you think this label was incorrectly applied by {0}" -msgstr "" - -#: src/view/com/modals/AppealLabel.tsx:72 -#: src/view/com/modals/AppealLabel.tsx:75 -#~ msgid "Please tell us why you think this content warning was incorrectly applied!" -#~ msgstr "請告訴我們你認為這個內容警告標示有誤的原因!" +msgstr "請解釋你認為 {0} 不正確套用此標籤的原因" #: src/view/com/modals/VerifyEmail.tsx:101 msgid "Please Verify Your Email" @@ -3558,10 +3166,6 @@ msgstr "政治" msgid "Porn" msgstr "情色內容" -#: src/lib/moderation/useGlobalLabelStrings.ts:34 -#~ msgid "Pornography" -#~ msgstr "" - #: src/view/com/composer/Composer.tsx:367 #: src/view/com/composer/Composer.tsx:375 msgctxt "action" @@ -3594,12 +3198,12 @@ msgstr "貼文已隱藏" #: src/components/moderation/ModerationDetailsDialog.tsx:97 #: src/lib/moderation/useModerationCauseDescription.ts:99 msgid "Post Hidden by Muted Word" -msgstr "" +msgstr "貼文因靜音詞彙設定而被靜音" #: src/components/moderation/ModerationDetailsDialog.tsx:100 #: src/lib/moderation/useModerationCauseDescription.ts:108 msgid "Post Hidden by You" -msgstr "" +msgstr "你靜音了這則貼文" #: src/view/com/composer/select-language/SelectLangBtn.tsx:87 msgid "Post language" @@ -3624,7 +3228,7 @@ msgstr "貼文" #: src/components/dialogs/MutedWords.tsx:89 msgid "Posts can be muted based on their text, their tags, or both." -msgstr "" +msgstr "貼文可以根据所包含的文字和標籤来设定静音。" #: src/view/com/posts/FeedErrorMessage.tsx:64 msgid "Posts hidden" @@ -3636,13 +3240,13 @@ msgstr "潛在誤導性連結" #: src/components/forms/HostingProvider.tsx:45 msgid "Press to change hosting provider" -msgstr "" +msgstr "按下以更改主機提供商" #: src/components/Error.tsx:74 #: src/components/Lists.tsx:80 #: src/screens/Signup/index.tsx:186 msgid "Press to retry" -msgstr "" +msgstr "按下以重試" #: src/view/com/lightbox/Lightbox.web.tsx:150 msgid "Previous image" @@ -3738,7 +3342,7 @@ msgstr "比率" #: src/view/screens/Search/Search.tsx:777 msgid "Recent Searches" -msgstr "" +msgstr "最近的搜尋結果" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:116 msgid "Recommended Feeds" @@ -3757,21 +3361,17 @@ msgstr "推薦的使用者" msgid "Remove" msgstr "移除" -#: src/view/com/feeds/FeedSourceCard.tsx:108 -#~ msgid "Remove {0} from my feeds?" -#~ msgstr "將 {0} 從我的訊息流移除?" - #: src/view/com/util/AccountDropdownBtn.tsx:22 msgid "Remove account" msgstr "刪除帳號" #: src/view/com/util/UserAvatar.tsx:358 msgid "Remove Avatar" -msgstr "" +msgstr "刪除頭像" #: src/view/com/util/UserBanner.tsx:148 msgid "Remove Banner" -msgstr "" +msgstr "刪除橫幅圖片" #: src/view/com/posts/FeedErrorMessage.tsx:160 msgid "Remove feed" @@ -3779,7 +3379,7 @@ msgstr "刪除訊息流" #: src/view/com/posts/FeedErrorMessage.tsx:201 msgid "Remove feed?" -msgstr "" +msgstr "刪除訊息流?" #: src/view/com/feeds/FeedSourceCard.tsx:173 #: src/view/com/feeds/FeedSourceCard.tsx:233 @@ -3790,7 +3390,7 @@ msgstr "從我的訊息流中刪除" #: src/view/com/feeds/FeedSourceCard.tsx:278 msgid "Remove from my feeds?" -msgstr "" +msgstr "從我的訊息流中刪除?" #: src/view/com/composer/photos/Gallery.tsx:167 msgid "Remove image" @@ -3802,23 +3402,15 @@ msgstr "刪除圖片預覽" #: src/components/dialogs/MutedWords.tsx:329 msgid "Remove mute word from your list" -msgstr "" +msgstr "從你的列表中移除靜音詞" #: src/view/com/modals/Repost.tsx:48 msgid "Remove repost" msgstr "刪除轉發" -#: src/view/com/feeds/FeedSourceCard.tsx:175 -#~ msgid "Remove this feed from my feeds?" -#~ msgstr "將這個訊息流從我的訊息流列表中刪除?" - #: src/view/com/posts/FeedErrorMessage.tsx:202 msgid "Remove this feed from your saved feeds" -msgstr "" - -#: src/view/com/posts/FeedErrorMessage.tsx:132 -#~ msgid "Remove this feed from your saved feeds?" -#~ msgstr "將這個訊息流從儲存的訊息流列表中刪除?" +msgstr "將這個訊息流從儲存的訊息流列表中刪除" #: src/view/com/modals/ListAddRemoveUsers.tsx:199 #: src/view/com/modals/UserAddRemoveLists.tsx:152 @@ -3831,7 +3423,7 @@ msgstr "從我的訊息流中刪除" #: src/view/screens/ProfileFeed.tsx:209 msgid "Removed from your feeds" -msgstr "" +msgstr "從你的訊息流中刪除" #: src/view/com/composer/ExternalEmbed.tsx:71 msgid "Removes default thumbnail from {0}" @@ -3860,10 +3452,6 @@ msgctxt "description" msgid "Reply to <0/>" msgstr "回覆 <0/>" -#: src/view/com/modals/report/Modal.tsx:166 -#~ msgid "Report {collectionName}" -#~ msgstr "檢舉 {collectionName}" - #: src/view/com/profile/ProfileMenu.tsx:319 #: src/view/com/profile/ProfileMenu.tsx:322 msgid "Report Account" @@ -3871,7 +3459,7 @@ msgstr "檢舉帳號" #: src/components/ReportDialog/index.tsx:49 msgid "Report dialog" -msgstr "" +msgstr "檢舉頁" #: src/view/screens/ProfileFeed.tsx:352 #: src/view/screens/ProfileFeed.tsx:354 @@ -3889,23 +3477,23 @@ msgstr "檢舉貼文" #: src/components/ReportDialog/SelectReportOptionView.tsx:42 msgid "Report this content" -msgstr "" +msgstr "檢舉這個內容" #: src/components/ReportDialog/SelectReportOptionView.tsx:55 msgid "Report this feed" -msgstr "" +msgstr "檢舉這個訊息流" #: src/components/ReportDialog/SelectReportOptionView.tsx:52 msgid "Report this list" -msgstr "" +msgstr "檢舉這個列表" #: src/components/ReportDialog/SelectReportOptionView.tsx:49 msgid "Report this post" -msgstr "" +msgstr "檢舉這則貼文" #: src/components/ReportDialog/SelectReportOptionView.tsx:46 msgid "Report this user" -msgstr "" +msgstr "檢舉這個使用者" #: src/view/com/modals/Repost.tsx:44 #: src/view/com/modals/Repost.tsx:49 @@ -3949,10 +3537,6 @@ msgstr "轉發這條貼文" msgid "Request Change" msgstr "請求變更" -#: src/view/com/auth/create/Step2.tsx:219 -#~ msgid "Request code" -#~ msgstr "請求碼" - #: src/view/com/modals/ChangePassword.tsx:241 #: src/view/com/modals/ChangePassword.tsx:243 msgid "Request Code" @@ -3974,10 +3558,6 @@ msgstr "重設碼" msgid "Reset Code" msgstr "重設碼" -#: src/view/screens/Settings/index.tsx:824 -#~ msgid "Reset onboarding" -#~ msgstr "重設初始設定進行狀態" - #: src/view/screens/Settings/index.tsx:858 #: src/view/screens/Settings/index.tsx:861 msgid "Reset onboarding state" @@ -3987,14 +3567,10 @@ msgstr "重設初始設定進行狀態" msgid "Reset password" msgstr "重設密碼" -#: src/view/screens/Settings/index.tsx:814 -#~ msgid "Reset preferences" -#~ msgstr "重設偏好設定" - #: src/view/screens/Settings/index.tsx:848 #: src/view/screens/Settings/index.tsx:851 msgid "Reset preferences state" -msgstr "重設偏好設定狀態" +msgstr "重設設定偏好狀態" #: src/view/screens/Settings/index.tsx:859 msgid "Resets the onboarding state" @@ -4002,7 +3578,7 @@ msgstr "重設初始設定狀態" #: src/view/screens/Settings/index.tsx:849 msgid "Resets the preferences state" -msgstr "重設偏好設定狀態" +msgstr "重設設定偏好狀態" #: src/screens/Login/LoginForm.tsx:235 msgid "Retries login" @@ -4025,10 +3601,6 @@ msgstr "重試上次出錯的操作" msgid "Retry" msgstr "重試" -#: src/view/com/auth/create/Step2.tsx:247 -#~ msgid "Retry." -#~ msgstr "重試。" - #: src/components/Error.tsx:86 #: src/view/screens/ProfileList.tsx:917 msgid "Return to previous page" @@ -4036,16 +3608,12 @@ msgstr "返回上一頁" #: src/view/screens/NotFound.tsx:59 msgid "Returns to home page" -msgstr "" +msgstr "返回首頁" #: src/view/screens/NotFound.tsx:58 #: src/view/screens/ProfileFeed.tsx:113 msgid "Returns to previous page" -msgstr "" - -#: src/view/shell/desktop/RightNav.tsx:55 -#~ msgid "SANDBOX. Posts and accounts are not permanent." -#~ msgstr "沙盒模式。貼文和帳號不會永久儲存。" +msgstr "返回上一頁" #: src/components/dialogs/BirthDateSettings.tsx:125 #: src/view/com/modals/ChangeHandle.tsx:174 @@ -4066,7 +3634,7 @@ msgstr "儲存替代文字" #: src/components/dialogs/BirthDateSettings.tsx:119 msgid "Save birthday" -msgstr "" +msgstr "儲存生日" #: src/view/com/modals/EditProfile.tsx:233 msgid "Save Changes" @@ -4083,7 +3651,7 @@ msgstr "儲存圖片裁剪" #: src/view/screens/ProfileFeed.tsx:336 #: src/view/screens/ProfileFeed.tsx:342 msgid "Save to my feeds" -msgstr "" +msgstr "儲存到我的訊息流" #: src/view/screens/SavedFeeds.tsx:122 msgid "Saved Feeds" @@ -4091,11 +3659,11 @@ msgstr "已儲存訊息流" #: src/view/com/lightbox/Lightbox.tsx:81 msgid "Saved to your camera roll." -msgstr "" +msgstr "儲存到你的相機膠卷。" #: src/view/screens/ProfileFeed.tsx:213 msgid "Saved to your feeds" -msgstr "" +msgstr "儲存到你的訊息流" #: src/view/com/modals/EditProfile.tsx:226 msgid "Saves any changes to your profile" @@ -4107,7 +3675,7 @@ msgstr "儲存帳號代碼更改至 {handle}" #: src/view/com/modals/crop-image/CropImage.web.tsx:146 msgid "Saves image crop settings" -msgstr "" +msgstr "保存圖片裁剪設定" #: src/screens/Onboarding/index.tsx:36 msgid "Science" @@ -4141,19 +3709,11 @@ msgstr "搜尋「{query}」" #: src/components/TagMenu/index.tsx:145 msgid "Search for all posts by @{authorHandle} with tag {displayTag}" -msgstr "" - -#: src/components/TagMenu/index.tsx:145 -#~ msgid "Search for all posts by @{authorHandle} with tag {tag}" -#~ msgstr "" +msgstr "搜尋所有由 @{authorHandle} 發佈並具有標籤 {displayTag} 的貼文" #: src/components/TagMenu/index.tsx:94 msgid "Search for all posts with tag {displayTag}" -msgstr "" - -#: src/components/TagMenu/index.tsx:90 -#~ msgid "Search for all posts with tag {tag}" -#~ msgstr "" +msgstr "搜尋所有具有標籤 {displayTag} 的貼文" #: src/view/com/auth/LoggedOut.tsx:105 #: src/view/com/auth/LoggedOut.tsx:106 @@ -4167,27 +3727,19 @@ msgstr "所需的安全步驟" #: src/components/TagMenu/index.web.tsx:66 msgid "See {truncatedTag} posts" -msgstr "" +msgstr "查看 {truncatedTag} 的貼文" #: src/components/TagMenu/index.web.tsx:83 msgid "See {truncatedTag} posts by user" -msgstr "" +msgstr "查看使用者的 {truncatedTag} 貼文" #: src/components/TagMenu/index.tsx:128 msgid "See <0>{displayTag} posts" -msgstr "" +msgstr "查看 <0>{displayTag} 的貼文" #: src/components/TagMenu/index.tsx:187 msgid "See <0>{displayTag} posts by this user" -msgstr "" - -#: src/components/TagMenu/index.tsx:128 -#~ msgid "See <0>{tag} posts" -#~ msgstr "" - -#: src/components/TagMenu/index.tsx:189 -#~ msgid "See <0>{tag} posts by this user" -#~ msgstr "" +msgstr "查看這個使用者的 <0>{displayTag} 貼文" #: src/view/screens/SavedFeeds.tsx:163 msgid "See this guide" @@ -4203,11 +3755,7 @@ msgstr "選擇 {item}" #: src/screens/Login/ChooseAccountForm.tsx:61 msgid "Select account" -msgstr "" - -#: src/view/com/modals/ServerInput.tsx:75 -#~ msgid "Select Bluesky Social" -#~ msgstr "選擇 Bluesky Social" +msgstr "選擇帳號" #: src/screens/Login/index.tsx:120 msgid "Select from an existing account" @@ -4215,28 +3763,23 @@ msgstr "從現有帳號中選擇" #: src/view/screens/LanguageSettings.tsx:299 msgid "Select languages" -msgstr "" +msgstr "選擇語言" #: src/components/ReportDialog/SelectLabelerView.tsx:30 msgid "Select moderator" -msgstr "" +msgstr "選擇限制服務提供者" #: src/view/com/util/Selector.tsx:107 msgid "Select option {i} of {numItems}" msgstr "選擇 {numItems} 個項目中的第 {i} 項" -#: src/view/com/auth/create/Step1.tsx:96 -#: src/view/com/auth/login/LoginForm.tsx:153 -#~ msgid "Select service" -#~ msgstr "選擇服務" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:52 msgid "Select some accounts below to follow" msgstr "在下面選擇一些要跟隨的帳號" #: src/components/ReportDialog/SubmitView.tsx:135 msgid "Select the moderation service(s) to report to" -msgstr "" +msgstr "選擇要檢舉的限制服務提供者" #: src/view/com/auth/server-input/index.tsx:82 msgid "Select the service that hosts your data." @@ -4254,26 +3797,18 @@ msgstr "選擇你想看到(或不想看到)的內容,剩下的由我們來 msgid "Select which languages you want your subscribed feeds to include. If none are selected, all languages will be shown." msgstr "選擇你希望訂閱訊息流中所包含的語言。未選擇任何語言時會預設顯示所有語言。" -#: src/view/screens/LanguageSettings.tsx:98 -#~ msgid "Select your app language for the default text to display in the app" -#~ msgstr "選擇應用程式中顯示預設文字的語言" - #: src/view/screens/LanguageSettings.tsx:98 msgid "Select your app language for the default text to display in the app." -msgstr "" +msgstr "選擇你應用程式中要顯示的默認文字的語言。" #: src/screens/Signup/StepInfo/index.tsx:133 msgid "Select your date of birth" -msgstr "" +msgstr "選擇你的出生日期" #: src/screens/Onboarding/StepInterests/index.tsx:200 msgid "Select your interests from the options below" msgstr "下面選擇你感興趣的選項" -#: src/view/com/auth/create/Step2.tsx:155 -#~ msgid "Select your phone's country" -#~ msgstr "選擇你的電話區號" - #: src/view/screens/LanguageSettings.tsx:190 msgid "Select your preferred language for translations in your feed." msgstr "選擇你在訂閱訊息流中希望進行翻譯的目標語言偏好。" @@ -4308,15 +3843,11 @@ msgstr "提交意見" #: src/components/ReportDialog/SubmitView.tsx:214 #: src/components/ReportDialog/SubmitView.tsx:218 msgid "Send report" -msgstr "提交舉報" - -#: src/view/com/modals/report/SendReportButton.tsx:45 -#~ msgid "Send Report" -#~ msgstr "提交舉報" +msgstr "提交檢舉" #: src/components/ReportDialog/SelectLabelerView.tsx:44 msgid "Send report to {0}" -msgstr "" +msgstr "將檢舉提交至 {0}" #: src/view/com/modals/DeleteAccount.tsx:132 msgid "Sends email with confirmation code for account deletion" @@ -4326,48 +3857,14 @@ msgstr "發送包含帳號刪除確認碼的電子郵件" msgid "Server address" msgstr "伺服器地址" -#: src/view/com/modals/ContentFilteringSettings.tsx:311 -#~ msgid "Set {value} for {labelGroup} content moderation policy" -#~ msgstr "將 {labelGroup} 內容審核政策設為 {value}" - -#: src/view/com/modals/ContentFilteringSettings.tsx:160 -#: src/view/com/modals/ContentFilteringSettings.tsx:179 -#~ msgctxt "action" -#~ msgid "Set Age" -#~ msgstr "設定年齡" - #: src/screens/Moderation/index.tsx:304 msgid "Set birthdate" -msgstr "" - -#: src/view/screens/Settings/index.tsx:488 -#~ msgid "Set color theme to dark" -#~ msgstr "設定主題為深色模式" - -#: src/view/screens/Settings/index.tsx:481 -#~ msgid "Set color theme to light" -#~ msgstr "設定主題為亮色模式" - -#: src/view/screens/Settings/index.tsx:475 -#~ msgid "Set color theme to system setting" -#~ msgstr "設定主題跟隨系統設定" - -#: src/view/screens/Settings/index.tsx:514 -#~ msgid "Set dark theme to the dark theme" -#~ msgstr "設定深色模式至深黑" - -#: src/view/screens/Settings/index.tsx:507 -#~ msgid "Set dark theme to the dim theme" -#~ msgstr "設定深色模式至暗淡" +msgstr "設定生日" #: src/screens/Login/SetNewPasswordForm.tsx:102 msgid "Set new password" msgstr "設定新密碼" -#: src/view/com/auth/create/Step1.tsx:202 -#~ msgid "Set password" -#~ msgstr "設定密碼" - #: src/view/screens/PreferencesFollowingFeed.tsx:225 msgid "Set this setting to \"No\" to hide all quote posts from your feed. Reposts will still be visible." msgstr "將此設定項設為「關」會隱藏來自訂閱訊息流的所有引用貼文。轉發仍將可見。" @@ -4384,13 +3881,9 @@ msgstr "將此設定項設為「關」以隱藏來自訂閱訊息流的所有轉 msgid "Set this setting to \"Yes\" to show replies in a threaded view. This is an experimental feature." msgstr "將此設定項設為「開」以在分層視圖中顯示回覆。這是一個實驗性功能。" -#: src/view/screens/PreferencesHomeFeed.tsx:261 -#~ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your following feed. This is an experimental feature." -#~ msgstr "將此設定項設為「開」以在跟隨訊息流中顯示已儲存訊息流的樣本。這是一個實驗性功能。" - #: src/view/screens/PreferencesFollowingFeed.tsx:261 msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your Following feed. This is an experimental feature." -msgstr "" +msgstr "將此設定為「是」以在你的追蹤訊息流中顯示你保存的訊息流。這是一個實驗性功能。" #: src/screens/Onboarding/Layout.tsx:48 msgid "Set up your account" @@ -4402,48 +3895,39 @@ msgstr "設定 Bluesky 使用者名稱" #: src/view/screens/Settings/index.tsx:507 msgid "Sets color theme to dark" -msgstr "" +msgstr "將色彩主題設定為深色" #: src/view/screens/Settings/index.tsx:500 msgid "Sets color theme to light" -msgstr "" +msgstr "將色彩主題設定為亮色" #: src/view/screens/Settings/index.tsx:494 msgid "Sets color theme to system setting" -msgstr "" +msgstr "將色彩主題設定為跟隨系統設定" #: src/view/screens/Settings/index.tsx:533 msgid "Sets dark theme to the dark theme" -msgstr "" +msgstr "將深色主題設定為深色" #: src/view/screens/Settings/index.tsx:526 msgid "Sets dark theme to the dim theme" -msgstr "" +msgstr "將深色主題設定為暗淡" #: src/screens/Login/ForgotPasswordForm.tsx:113 msgid "Sets email for password reset" msgstr "設定用於重設密碼的電子郵件" -#: src/view/com/auth/login/ForgotPasswordForm.tsx:122 -#~ msgid "Sets hosting provider for password reset" -#~ msgstr "設定用於密碼重設的主機提供商資訊" - #: src/view/com/modals/crop-image/CropImage.web.tsx:124 msgid "Sets image aspect ratio to square" -msgstr "" +msgstr "將圖片寬高比設定為正方形" #: src/view/com/modals/crop-image/CropImage.web.tsx:114 msgid "Sets image aspect ratio to tall" -msgstr "" +msgstr "將圖像的寬高比設定為高" #: src/view/com/modals/crop-image/CropImage.web.tsx:104 msgid "Sets image aspect ratio to wide" -msgstr "" - -#: src/view/com/auth/create/Step1.tsx:97 -#: src/view/com/auth/login/LoginForm.tsx:154 -#~ msgid "Sets server for the Bluesky client" -#~ msgstr "設定 Bluesky 用戶端的伺服器" +msgstr "將圖像的寬高比設定為寬" #: src/Navigation.tsx:139 #: src/view/screens/Settings/index.tsx:313 @@ -4459,7 +3943,7 @@ msgstr "性行為或性暗示裸露。" #: src/lib/moderation/useGlobalLabelStrings.ts:38 msgid "Sexually Suggestive" -msgstr "" +msgstr "性暗示" #: src/view/com/lightbox/Lightbox.tsx:141 msgctxt "action" @@ -4479,7 +3963,7 @@ msgstr "分享" #: src/view/com/util/forms/PostDropdownBtn.tsx:347 #: src/view/com/util/post-ctrls/PostCtrls.tsx:251 msgid "Share anyway" -msgstr "" +msgstr "仍然分享" #: src/view/screens/ProfileFeed.tsx:362 #: src/view/screens/ProfileFeed.tsx:364 @@ -4489,11 +3973,11 @@ msgstr "分享訊息流" #: src/view/com/modals/LinkWarning.tsx:89 #: src/view/com/modals/LinkWarning.tsx:95 msgid "Share Link" -msgstr "" +msgstr "分享連結" #: src/view/com/modals/LinkWarning.tsx:92 msgid "Shares the linked website" -msgstr "" +msgstr "分享連結的網站" #: src/components/moderation/ContentHider.tsx:115 #: src/components/moderation/LabelPreference.tsx:136 @@ -4515,15 +3999,11 @@ msgstr "仍然顯示" #: src/lib/moderation/useLabelBehaviorDescription.ts:27 #: src/lib/moderation/useLabelBehaviorDescription.ts:63 msgid "Show badge" -msgstr "" +msgstr "顯示徽章" #: src/lib/moderation/useLabelBehaviorDescription.ts:61 msgid "Show badge and filter from feeds" -msgstr "" - -#: src/view/com/modals/EmbedConsent.tsx:87 -#~ msgid "Show embeds from {0}" -#~ msgstr "顯示來自 {0} 的嵌入內容" +msgstr "顯示徽章並從訊息流中篩選" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:200 msgid "Show follows similar to {0}" @@ -4594,15 +4074,11 @@ msgstr "顯示使用者" #: src/lib/moderation/useLabelBehaviorDescription.ts:58 msgid "Show warning" -msgstr "" +msgstr "顯示警告" #: src/lib/moderation/useLabelBehaviorDescription.ts:56 msgid "Show warning and filter from feeds" -msgstr "" - -#: src/view/com/profile/ProfileHeader.tsx:462 -#~ msgid "Shows a list of users similar to this user." -#~ msgstr "顯示與該使用者相似的使用者列表。" +msgstr "顯示警告並從訊息流中篩選" #: src/view/com/post-thread/PostThreadFollowBtn.tsx:130 msgid "Shows posts from {0} in your feed" @@ -4629,12 +4105,6 @@ msgstr "在你的訊息流中顯示來自 {0} 的貼文" msgid "Sign in" msgstr "登入" -#: src/view/com/auth/HomeLoggedOutCTA.tsx:82 -#: src/view/com/auth/SplashScreen.tsx:86 -#: src/view/com/auth/SplashScreen.web.tsx:91 -#~ msgid "Sign In" -#~ msgstr "登入" - #: src/components/AccountList.tsx:109 msgid "Sign in as {0}" msgstr "以 {0} 登入" @@ -4643,10 +4113,6 @@ msgstr "以 {0} 登入" msgid "Sign in as..." msgstr "登入為…" -#: src/view/com/auth/login/LoginForm.tsx:140 -#~ msgid "Sign into" -#~ msgstr "登入到" - #: src/view/screens/Settings/index.tsx:107 #: src/view/screens/Settings/index.tsx:110 msgid "Sign out" @@ -4681,10 +4147,6 @@ msgstr "登入身分" msgid "Signed in as @{0}" msgstr "以 @{0} 身分登入" -#: src/view/com/modals/SwitchAccount.tsx:70 -#~ msgid "Signs {0} out of Bluesky" -#~ msgstr "從 {0} 登出 Bluesky" - #: src/screens/Onboarding/StepInterests/index.tsx:239 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:203 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:35 @@ -4695,31 +4157,15 @@ msgstr "跳過" msgid "Skip this flow" msgstr "跳過此流程" -#: src/view/com/auth/create/Step2.tsx:82 -#~ msgid "SMS verification" -#~ msgstr "簡訊驗證" - #: src/screens/Onboarding/index.tsx:40 msgid "Software Dev" msgstr "軟體開發" -#: src/view/com/modals/ProfilePreview.tsx:62 -#~ msgid "Something went wrong and we're not sure what." -#~ msgstr "發生了一些問題,我們不確定是什麼原因。" - #: src/components/ReportDialog/index.tsx:59 #: src/screens/Moderation/index.tsx:114 #: src/screens/Profile/Sections/Labels.tsx:76 msgid "Something went wrong, please try again." -msgstr "" - -#: src/components/Lists.tsx:203 -#~ msgid "Something went wrong!" -#~ msgstr "發生了一些問題!" - -#: src/view/com/modals/Waitlist.tsx:51 -#~ msgid "Something went wrong. Check your email and try again." -#~ msgstr "發生了一些問題。請檢查你的電子郵件,然後重試。" +msgstr "發生了一些問題,請重試。" #: src/App.native.tsx:66 msgid "Sorry! Your session expired. Please log in again." @@ -4735,15 +4181,15 @@ msgstr "對同一貼文的回覆進行排序:" #: src/components/moderation/LabelsOnMeDialog.tsx:146 msgid "Source:" -msgstr "" +msgstr "來源:" #: src/lib/moderation/useReportOptions.ts:65 msgid "Spam" -msgstr "" +msgstr "垃圾訊息" #: src/lib/moderation/useReportOptions.ts:53 msgid "Spam; excessive mentions or replies" -msgstr "" +msgstr "垃圾訊息;過多的提及或回复" #: src/screens/Onboarding/index.tsx:30 msgid "Sports" @@ -4753,21 +4199,13 @@ msgstr "運動" msgid "Square" msgstr "方塊" -#: src/view/com/modals/ServerInput.tsx:62 -#~ msgid "Staging" -#~ msgstr "臨時" - #: src/view/screens/Settings/index.tsx:903 msgid "Status page" msgstr "狀態頁" #: src/screens/Signup/index.tsx:142 msgid "Step" -msgstr "" - -#: src/view/com/auth/create/StepHeader.tsx:22 -#~ msgid "Step {0} of {numSteps}" -#~ msgstr "第 {0} 步,共 {numSteps} 步" +msgstr "Step" #: src/view/screens/Settings/index.tsx:292 msgid "Storage cleared, you need to restart the app now." @@ -4789,11 +4227,11 @@ msgstr "訂閱" #: src/screens/Profile/Sections/Labels.tsx:180 msgid "Subscribe to @{0} to use these labels:" -msgstr "" +msgstr "訂閱 @{0} 以使用這些標籤:" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:221 msgid "Subscribe to Labeler" -msgstr "" +msgstr "訂閱標籤者" #: src/screens/Onboarding/StepAlgoFeeds/FeedCard.tsx:172 #: src/screens/Onboarding/StepAlgoFeeds/FeedCard.tsx:307 @@ -4802,7 +4240,7 @@ msgstr "訂閱 {0} 訊息流" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:184 msgid "Subscribe to this labeler" -msgstr "" +msgstr "訂閱這個標籤者" #: src/view/screens/ProfileList.tsx:586 msgid "Subscribe to this list" @@ -4826,10 +4264,6 @@ msgstr "建議" msgid "Support" msgstr "支援" -#: src/view/com/modals/ProfilePreview.tsx:110 -#~ msgid "Swipe up to see more" -#~ msgstr "向上滑動查看更多" - #: src/components/dialogs/SwitchAccount.tsx:46 #: src/components/dialogs/SwitchAccount.tsx:49 msgid "Switch Account" @@ -4853,15 +4287,11 @@ msgstr "系統日誌" #: src/components/dialogs/MutedWords.tsx:323 msgid "tag" -msgstr "" +msgstr "標籤" #: src/components/TagMenu/index.tsx:78 msgid "Tag menu: {displayTag}" -msgstr "" - -#: src/components/TagMenu/index.tsx:74 -#~ msgid "Tag menu: {tag}" -#~ msgstr "" +msgstr "標籤選單:{displayTag}" #: src/view/com/modals/crop-image/CropImage.web.tsx:113 msgid "Tall" @@ -4891,7 +4321,7 @@ msgstr "服務條款" #: src/lib/moderation/useReportOptions.ts:79 #: src/lib/moderation/useReportOptions.ts:87 msgid "Terms used violate community standards" -msgstr "" +msgstr "所使用的文字違反了社群標準" #: src/components/dialogs/MutedWords.tsx:323 msgid "text" @@ -4903,11 +4333,11 @@ msgstr "文字輸入框" #: src/components/ReportDialog/SubmitView.tsx:78 msgid "Thank you. Your report has been sent." -msgstr "" +msgstr "謝謝,你的檢舉已提交。" #: src/view/com/modals/ChangeHandle.tsx:465 msgid "That contains the following:" -msgstr "" +msgstr "其中包含以下內容:" #: src/screens/Signup/index.tsx:84 msgid "That handle is already taken." @@ -4920,7 +4350,7 @@ msgstr "解除封鎖後,該帳號將能夠與你互動。" #: src/components/moderation/ModerationDetailsDialog.tsx:127 msgid "the author" -msgstr "" +msgstr "作者" #: src/view/screens/CommunityGuidelines.tsx:36 msgid "The Community Guidelines have been moved to <0/>" @@ -4932,11 +4362,11 @@ msgstr "版權政策已移動到 <0/>" #: src/components/moderation/LabelsOnMeDialog.tsx:48 msgid "The following labels were applied to your account." -msgstr "" +msgstr "以下標籤已套用到你的帳戶。" #: src/components/moderation/LabelsOnMeDialog.tsx:49 msgid "The following labels were applied to your content." -msgstr "" +msgstr "以下標籤已套用到你的內容。" #: src/screens/Onboarding/Layout.tsx:58 msgid "The following steps will help customize your Bluesky experience." @@ -4945,7 +4375,7 @@ msgstr "以下步驟將幫助自訂你的 Bluesky 體驗。" #: src/view/com/post-thread/PostThread.tsx:153 #: src/view/com/post-thread/PostThread.tsx:165 msgid "The post may have been deleted." -msgstr "此貼文可能已被刪除。" +msgstr "這則貼文可能已被刪除。" #: src/view/screens/PrivacyPolicy.tsx:33 msgid "The Privacy Policy has been moved to <0/>" @@ -5010,11 +4440,11 @@ msgstr "取得列表時發生問題,點擊這裡重試。" #: src/components/ReportDialog/SubmitView.tsx:83 msgid "There was an issue sending your report. Please check your internet connection." -msgstr "" +msgstr "提交你的檢舉時出現問題,請檢查你的網路連線。" #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:65 msgid "There was an issue syncing your preferences with the server" -msgstr "與伺服器同步偏好設定時發生問題" +msgstr "與伺服器同步設定偏好時發生問題" #: src/view/screens/AppPasswords.tsx:68 msgid "There was an issue with fetching your app passwords" @@ -5049,10 +4479,6 @@ msgstr "應用程式中發生了意外問題。請告訴我們是否發生在你 msgid "There's been a rush of new users to Bluesky! We'll activate your account as soon as we can." msgstr "Bluesky 迎來了大量新使用者!我們將儘快啟用你的帳號。" -#: src/view/com/auth/create/Step2.tsx:55 -#~ msgid "There's something wrong with this number. Please choose your country and enter your full phone number!" -#~ msgstr "電話號碼有誤,請選擇區號並輸入完整的電話號碼!" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:146 msgid "These are popular accounts you might like:" msgstr "這裡是一些受歡迎的帳號,你可能會喜歡:" @@ -5067,15 +4493,15 @@ msgstr "此帳號要求使用者登入後才能查看其個人資料。" #: src/components/moderation/LabelsOnMeDialog.tsx:204 msgid "This appeal will be sent to <0>{0}." -msgstr "" +msgstr "此申訴將被提交至 <0>{0}。" #: src/lib/moderation/useGlobalLabelStrings.ts:19 msgid "This content has been hidden by the moderators." -msgstr "" +msgstr "此內容已被限制提供者隱藏。" #: src/lib/moderation/useGlobalLabelStrings.ts:24 msgid "This content has received a general warning from moderators." -msgstr "" +msgstr "此內容已套用限制提供者所設定的一般警告。" #: src/components/dialogs/EmbedConsent.tsx:64 msgid "This content is hosted by {0}. Do you want to enable external media?" @@ -5090,13 +4516,9 @@ msgstr "由於其中一個使用者封鎖了另一個使用者,無法查看此 msgid "This content is not viewable without a Bluesky account." msgstr "沒有 Bluesky 帳號,無法查看此內容。" -#: src/view/screens/Settings/ExportCarDialog.tsx:75 -#~ msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." -#~ msgstr "此功能目前為測試版本。您可以在<0>這篇部落格文章中了解更多有關匯出存放庫的資訊" - #: src/view/screens/Settings/ExportCarDialog.tsx:75 msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." -msgstr "" +msgstr "此功能目前為測試版本。你可以在<0>這篇部落格文章中了解更多有關資訊。" #: src/view/com/posts/FeedErrorMessage.tsx:114 msgid "This feed is currently receiving high traffic and is temporarily unavailable. Please try again later." @@ -5122,11 +4544,11 @@ msgstr "這很重要,以防你將來需要更改電子郵件地址或重設密 #: src/components/moderation/ModerationDetailsDialog.tsx:124 msgid "This label was applied by {0}." -msgstr "" +msgstr "此標籤是由 {0} 套用的。" #: src/screens/Profile/Sections/Labels.tsx:167 msgid "This labeler hasn't declared what labels it publishes, and may not be active." -msgstr "" +msgstr "此標籤者尚未宣告它發佈的標籤,可能不活躍。" #: src/view/com/modals/LinkWarning.tsx:72 msgid "This link is taking you to the following website:" @@ -5138,7 +4560,7 @@ msgstr "此列表為空!" #: src/screens/Profile/ErrorState.tsx:40 msgid "This moderation service is unavailable. See below for more details. If this issue persists, contact us." -msgstr "" +msgstr "此限制服務暫時無法使用,詳情請見下文。如果問題持續存在,請與我們聯絡。" #: src/view/com/modals/AddAppPasswords.tsx:107 msgid "This name is already in use" @@ -5146,32 +4568,32 @@ msgstr "此名稱已被使用" #: src/view/com/post-thread/PostThreadItem.tsx:125 msgid "This post has been deleted." -msgstr "此貼文已被刪除。" +msgstr "這則貼文已被刪除。" #: src/view/com/util/forms/PostDropdownBtn.tsx:344 #: src/view/com/util/post-ctrls/PostCtrls.tsx:248 msgid "This post is only visible to logged-in users. It won't be visible to people who aren't logged in." -msgstr "" +msgstr "這則貼文僅對登入使用者可見。 未登入的人將看不到它。" #: src/view/com/util/forms/PostDropdownBtn.tsx:326 msgid "This post will be hidden from feeds." -msgstr "" +msgstr "這則貼文將從訊息流中被隱藏。" #: src/view/com/profile/ProfileMenu.tsx:370 msgid "This profile is only visible to logged-in users. It won't be visible to people who aren't logged in." -msgstr "" +msgstr "此個人資料僅對登入使用者可見。 未登入的人將看不到它。" #: src/screens/Signup/StepInfo/Policies.tsx:37 msgid "This service has not provided terms of service or a privacy policy." -msgstr "" +msgstr "此服務尚未提供服務條款或隱私政策。" #: src/view/com/modals/ChangeHandle.tsx:445 msgid "This should create a domain record at:" -msgstr "" +msgstr "這應該在以下位置創建一個域記錄:" #: src/view/com/profile/ProfileFollowers.tsx:87 msgid "This user doesn't have any followers." -msgstr "" +msgstr "此使用者沒有任何追隨者。" #: src/components/moderation/ModerationDetailsDialog.tsx:72 #: src/lib/moderation/useModerationCauseDescription.ts:68 @@ -5180,31 +4602,19 @@ msgstr "此使用者已封鎖你,你無法查看他們的內容。" #: src/lib/moderation/useGlobalLabelStrings.ts:30 msgid "This user has requested that their content only be shown to signed-in users." -msgstr "" - -#: src/view/com/modals/ModerationDetails.tsx:42 -#~ msgid "This user is included in the <0/> list which you have blocked." -#~ msgstr "此使用者包含在你已封鎖的 <0/> 列表中。" - -#: src/view/com/modals/ModerationDetails.tsx:74 -#~ msgid "This user is included in the <0/> list which you have muted." -#~ msgstr "此使用者包含在你已靜音的 <0/> 列表中。" +msgstr "此用戶要求僅將其內容顯示給已登錄的用戶。" #: src/components/moderation/ModerationDetailsDialog.tsx:55 msgid "This user is included in the <0>{0} list which you have blocked." -msgstr "" +msgstr "此使用者包含在你已封鎖的 <0>{0} 列表中。" #: src/components/moderation/ModerationDetailsDialog.tsx:84 msgid "This user is included in the <0>{0} list which you have muted." -msgstr "" - -#: src/view/com/modals/ModerationDetails.tsx:74 -#~ msgid "This user is included the <0/> list which you have muted." -#~ msgstr "此使用者包含在你已靜音的 <0/> 列表中。" +msgstr "此使用者包含在你已靜音的 <0>{0} 列表中。" #: src/view/com/profile/ProfileFollows.tsx:87 msgid "This user isn't following anyone." -msgstr "" +msgstr "此使用者未跟隨任何人。" #: src/view/com/modals/SelfLabel.tsx:137 msgid "This warning is only available for posts with media attached." @@ -5212,15 +4622,11 @@ msgstr "此警告僅適用於附帶媒體的貼文。" #: src/components/dialogs/MutedWords.tsx:283 msgid "This will delete {0} from your muted words. You can always add it back later." -msgstr "" - -#: src/view/com/util/forms/PostDropdownBtn.tsx:282 -#~ msgid "This will hide this post from your feeds." -#~ msgstr "這將在你的訊息流中隱藏此貼文。" +msgstr "這將從你的靜音詞中刪除 {0},你隨時可以在稍後添加回來。" #: src/view/screens/Settings/index.tsx:574 msgid "Thread preferences" -msgstr "" +msgstr "對話串偏好" #: src/view/screens/PreferencesThreads.tsx:53 #: src/view/screens/Settings/index.tsx:584 @@ -5237,11 +4643,11 @@ msgstr "對話串偏好" #: src/components/ReportDialog/SelectLabelerView.tsx:33 msgid "To whom would you like to send this report?" -msgstr "" +msgstr "你希望向誰提交此檢舉?" #: src/components/dialogs/MutedWords.tsx:112 msgid "Toggle between muted word options." -msgstr "" +msgstr "在靜音詞選項之間切換。" #: src/view/com/util/forms/DropdownButton.tsx:246 msgid "Toggle dropdown" @@ -5249,7 +4655,7 @@ msgstr "切換下拉式選單" #: src/screens/Moderation/index.tsx:332 msgid "Toggle to enable or disable adult content" -msgstr "" +msgstr "切換以啟用或禁用成人內容" #: src/view/com/modals/EditImage.tsx:272 msgid "Transformations" @@ -5269,7 +4675,7 @@ msgstr "重試" #: src/view/com/modals/ChangeHandle.tsx:428 msgid "Type:" -msgstr "" +msgstr "類型:" #: src/view/screens/ProfileList.tsx:478 msgid "Un-block list" @@ -5308,7 +4714,7 @@ msgstr "取消封鎖" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:281 #: src/view/com/profile/ProfileMenu.tsx:343 msgid "Unblock Account?" -msgstr "" +msgstr "取消封鎖?" #: src/view/com/modals/Repost.tsx:43 #: src/view/com/modals/Repost.tsx:56 @@ -5320,7 +4726,7 @@ msgstr "取消轉發" #: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:141 #: src/view/com/profile/ProfileHeaderSuggestedFollows.tsx:246 msgid "Unfollow" -msgstr "" +msgstr "取消跟隨" #: src/view/com/profile/FollowButton.tsx:60 msgctxt "action" @@ -5334,11 +4740,7 @@ msgstr "取消跟隨 {0}" #: src/view/com/profile/ProfileMenu.tsx:241 #: src/view/com/profile/ProfileMenu.tsx:251 msgid "Unfollow Account" -msgstr "" - -#: src/view/com/auth/create/state.ts:262 -#~ msgid "Unfortunately, you do not meet the requirements to create an account." -#~ msgstr "很遺憾,你不符合建立帳號的要求。" +msgstr "取消跟隨" #: src/view/com/util/post-ctrls/PostCtrls.tsx:195 msgid "Unlike" @@ -5346,7 +4748,7 @@ msgstr "取消喜歡" #: src/view/screens/ProfileFeed.tsx:573 msgid "Unlike this feed" -msgstr "" +msgstr "取消喜歡這個訊息流" #: src/components/TagMenu/index.tsx:249 #: src/view/screens/ProfileList.tsx:579 @@ -5355,7 +4757,7 @@ msgstr "取消靜音" #: src/components/TagMenu/index.web.tsx:104 msgid "Unmute {truncatedTag}" -msgstr "" +msgstr "取消靜音 {truncatedTag}" #: src/view/com/profile/ProfileMenu.tsx:278 #: src/view/com/profile/ProfileMenu.tsx:284 @@ -5364,11 +4766,7 @@ msgstr "取消靜音帳號" #: src/components/TagMenu/index.tsx:208 msgid "Unmute all {displayTag} posts" -msgstr "" - -#: src/components/TagMenu/index.tsx:210 -#~ msgid "Unmute all {tag} posts" -#~ msgstr "" +msgstr "取消對所有 {displayTag} 貼文的靜音" #: src/view/com/util/forms/PostDropdownBtn.tsx:251 #: src/view/com/util/forms/PostDropdownBtn.tsx:256 @@ -5382,39 +4780,31 @@ msgstr "取消固定" #: src/view/screens/ProfileFeed.tsx:292 msgid "Unpin from home" -msgstr "" +msgstr "取消固定在首頁" #: src/view/screens/ProfileList.tsx:444 msgid "Unpin moderation list" msgstr "取消固定限制列表" -#: src/view/screens/ProfileFeed.tsx:346 -#~ msgid "Unsave" -#~ msgstr "取消儲存" - #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:219 msgid "Unsubscribe" -msgstr "" +msgstr "取消訂閱" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:183 msgid "Unsubscribe from this labeler" -msgstr "" +msgstr "取消訂閱這個標籤者" #: src/lib/moderation/useReportOptions.ts:70 msgid "Unwanted Sexual Content" -msgstr "" +msgstr "無關情色內容" #: src/view/com/modals/UserAddRemoveLists.tsx:70 msgid "Update {displayName} in Lists" msgstr "更新列表中的 {displayName}" -#: src/lib/hooks/useOTAUpdate.ts:15 -#~ msgid "Update Available" -#~ msgstr "更新可用" - #: src/view/com/modals/ChangeHandle.tsx:508 msgid "Update to {handle}" -msgstr "" +msgstr "更新至 {handle}" #: src/screens/Login/SetNewPasswordForm.tsx:186 msgid "Updating..." @@ -5429,31 +4819,31 @@ msgstr "上傳文字檔案至:" #: src/view/com/util/UserBanner.tsx:116 #: src/view/com/util/UserBanner.tsx:119 msgid "Upload from Camera" -msgstr "" +msgstr "從相機上傳" #: src/view/com/util/UserAvatar.tsx:343 #: src/view/com/util/UserBanner.tsx:133 msgid "Upload from Files" -msgstr "" +msgstr "從檔案上傳" #: src/view/com/util/UserAvatar.tsx:337 #: src/view/com/util/UserAvatar.tsx:341 #: src/view/com/util/UserBanner.tsx:127 #: src/view/com/util/UserBanner.tsx:131 msgid "Upload from Library" -msgstr "" +msgstr "從圖庫上傳" #: src/view/com/modals/ChangeHandle.tsx:408 msgid "Use a file on your server" -msgstr "" +msgstr "使用伺服器上的檔案" #: src/view/screens/AppPasswords.tsx:197 msgid "Use app passwords to login to other Bluesky clients without giving full access to your account or password." -msgstr "使用應用程式專用密碼登入到其他 Bluesky 用戶端,而無需提供你的帳號或密碼。" +msgstr "使用應用程式專用密碼登入到其他 Bluesky 使用者端,而無需提供你的帳號或密碼。" #: src/view/com/modals/ChangeHandle.tsx:517 msgid "Use bsky.social as hosting provider" -msgstr "" +msgstr "使用 bsky.social 作為主機提供商" #: src/view/com/modals/ChangeHandle.tsx:516 msgid "Use default provider" @@ -5471,16 +4861,12 @@ msgstr "使用我的預設瀏覽器" #: src/view/com/modals/ChangeHandle.tsx:400 msgid "Use the DNS panel" -msgstr "" +msgstr "使用 DNS 控制台" #: src/view/com/modals/AddAppPasswords.tsx:156 msgid "Use this to sign into the other app along with your handle." msgstr "使用這個和你的帳號代碼一起登入其他應用程式。" -#: src/view/com/modals/ServerInput.tsx:105 -#~ msgid "Use your domain as your Bluesky client service provider" -#~ msgstr "將你的網域用作 Bluesky 用戶端服務提供商" - #: src/view/com/modals/InviteCodes.tsx:201 msgid "Used by:" msgstr "使用者:" @@ -5492,7 +4878,7 @@ msgstr "使用者被封鎖" #: src/lib/moderation/useModerationCauseDescription.ts:48 msgid "User Blocked by \"{0}\"" -msgstr "" +msgstr "使用者被\"{0}\"封鎖" #: src/components/moderation/ModerationDetailsDialog.tsx:53 msgid "User Blocked by List" @@ -5500,16 +4886,12 @@ msgstr "使用者被列表封鎖" #: src/lib/moderation/useModerationCauseDescription.ts:66 msgid "User Blocking You" -msgstr "" +msgstr "使用者封鎖了你" #: src/components/moderation/ModerationDetailsDialog.tsx:70 msgid "User Blocks You" msgstr "使用者封鎖了你" -#: src/view/com/auth/create/Step2.tsx:79 -#~ msgid "User handle" -#~ msgstr "帳號代碼" - #: src/view/com/lists/ListCard.tsx:85 #: src/view/com/modals/UserAddRemoveLists.tsx:198 msgid "User list by {0}" @@ -5555,19 +4937,15 @@ msgstr "「{0}」中的使用者" #: src/components/LikesDialog.tsx:85 msgid "Users that have liked this content or profile" -msgstr "" +msgstr "喜歡此內容或個人資料的使用者" #: src/view/com/modals/ChangeHandle.tsx:436 msgid "Value:" -msgstr "" - -#: src/view/com/auth/create/Step2.tsx:243 -#~ msgid "Verification code" -#~ msgstr "驗證碼" +msgstr "值:" #: src/view/com/modals/ChangeHandle.tsx:509 msgid "Verify {0}" -msgstr "" +msgstr "驗證 {0}" #: src/view/screens/Settings/index.tsx:942 msgid "Verify email" @@ -5592,7 +4970,7 @@ msgstr "驗證你的電子郵件" #: src/view/screens/Settings/index.tsx:893 msgid "Version {0}" -msgstr "" +msgstr "版本 {0}" #: src/screens/Onboarding/index.tsx:42 msgid "Video Games" @@ -5608,11 +4986,11 @@ msgstr "查看除錯項目" #: src/components/ReportDialog/SelectReportOptionView.tsx:131 msgid "View details" -msgstr "" +msgstr "查看詳細信息" #: src/components/ReportDialog/SelectReportOptionView.tsx:126 msgid "View details for reporting a copyright violation" -msgstr "" +msgstr "查看詳細信息以檢舉侵權" #: src/view/com/posts/FeedSlice.tsx:99 msgid "View full thread" @@ -5620,7 +4998,7 @@ msgstr "查看整個對話串" #: src/components/moderation/LabelsOnMe.tsx:51 msgid "View information about these labels" -msgstr "" +msgstr "查看有關這些標籤的信息" #: src/view/com/posts/FeedErrorMessage.tsx:166 msgid "View profile" @@ -5632,11 +5010,11 @@ msgstr "查看頭像" #: src/components/LabelingServiceCard/index.tsx:140 msgid "View the labeling service provided by @{0}" -msgstr "" +msgstr "查看由 @{0} 提供的標籤服務" #: src/view/screens/ProfileFeed.tsx:585 msgid "View users who like this feed" -msgstr "" +msgstr "查看喜歡此訊息流的使用者" #: src/view/com/modals/LinkWarning.tsx:89 #: src/view/com/modals/LinkWarning.tsx:95 @@ -5652,19 +5030,15 @@ msgstr "警告" #: src/lib/moderation/useLabelBehaviorDescription.ts:48 msgid "Warn content" -msgstr "" +msgstr "警告內容" #: src/lib/moderation/useLabelBehaviorDescription.ts:46 msgid "Warn content and filter from feeds" -msgstr "" - -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:134 -#~ msgid "We also think you'll like \"For You\" by Skygaze:" -#~ msgstr "我們認為你還會喜歡 Skygaze 維護的「For You」:" +msgstr "警告內容並從訊息流中過濾" #: src/screens/Hashtag.tsx:133 msgid "We couldn't find any results for that hashtag." -msgstr "" +msgstr "我們找不到任何與該標籤相關的結果。" #: src/screens/Deactivated.tsx:133 msgid "We estimate {estimatedTime} until your account is ready." @@ -5680,7 +5054,7 @@ msgstr "你已看完了你跟隨的貼文。這是 <0/> 的最新貼文。" #: src/components/dialogs/MutedWords.tsx:203 msgid "We recommend avoiding common words that appear in many posts, since it can result in no posts being shown." -msgstr "" +msgstr "我們建議避免使用出現在許多貼文中的常用詞語,因為這可能導致沒有貼文可顯示。" #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:125 msgid "We recommend our \"Discover\" feed:" @@ -5688,11 +5062,11 @@ msgstr "我們推薦我們的「Discover」訊息流:" #: src/components/dialogs/BirthDateSettings.tsx:52 msgid "We were unable to load your birth date preferences. Please try again." -msgstr "" +msgstr "我們無法加載你的出生日期設定偏好,請再試一次。" #: src/screens/Moderation/index.tsx:385 msgid "We were unable to load your configured labelers at this time." -msgstr "" +msgstr "我們目前無法加載你已配置的標籤者。" #: src/screens/Onboarding/StepInterests/index.tsx:137 msgid "We weren't able to connect. Please try again to continue setting up your account. If it continues to fail, you can skip this flow." @@ -5702,10 +5076,6 @@ msgstr "我們無法連線到網際網路,請重試以繼續設定你的帳號 msgid "We will let you know when your account is ready." msgstr "我們會在你的帳號準備好時通知你。" -#: src/view/com/modals/AppealLabel.tsx:48 -#~ msgid "We'll look into your appeal promptly." -#~ msgstr "我們將迅速審查你的申訴。" - #: src/screens/Onboarding/StepInterests/index.tsx:142 msgid "We'll use this to help customize your experience." msgstr "我們將使用這些資訊來幫助定制你的體驗。" @@ -5720,7 +5090,7 @@ msgstr "很抱歉,我們無法解析此列表。如果問題持續發生,請 #: src/components/dialogs/MutedWords.tsx:229 msgid "We're sorry, but we weren't able to load your muted words at this time. Please try again." -msgstr "" +msgstr "很抱歉,我們目前無法加載你的靜音詞。請稍後再試。" #: src/view/screens/Search/Search.tsx:256 msgid "We're sorry, but your search could not be completed. Please try again in a few minutes." @@ -5733,7 +5103,7 @@ msgstr "很抱歉!我們找不到你正在尋找的頁面。" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:321 msgid "We're sorry! You can only subscribe to ten labelers, and you've reached your limit of ten." -msgstr "" +msgstr "抱歉!你只能訂閱十個標籤者,你已達到十個的限制。" #: src/view/com/auth/onboarding/WelcomeMobile.tsx:48 msgid "Welcome to <0>Bluesky" @@ -5743,10 +5113,6 @@ msgstr "歡迎來到 <0>Bluesky" msgid "What are your interests?" msgstr "你感興趣的是什麼?" -#: src/view/com/modals/report/Modal.tsx:169 -#~ msgid "What is the issue with this {collectionName}?" -#~ msgstr "這個 {collectionName} 有什麼問題?" - #: src/view/com/auth/SplashScreen.tsx:58 #: src/view/com/auth/SplashScreen.web.tsx:84 #: src/view/com/composer/Composer.tsx:296 @@ -5768,23 +5134,23 @@ msgstr "誰可以回覆" #: src/components/ReportDialog/SelectReportOptionView.tsx:43 msgid "Why should this content be reviewed?" -msgstr "" +msgstr "為什麼應該審查這個內容?" #: src/components/ReportDialog/SelectReportOptionView.tsx:56 msgid "Why should this feed be reviewed?" -msgstr "" +msgstr "為什麼應該審查這個訊息流?" #: src/components/ReportDialog/SelectReportOptionView.tsx:53 msgid "Why should this list be reviewed?" -msgstr "" +msgstr "為什麼應該審查這個列表?" #: src/components/ReportDialog/SelectReportOptionView.tsx:50 msgid "Why should this post be reviewed?" -msgstr "" +msgstr "為什麼應該審查這則貼文?" #: src/components/ReportDialog/SelectReportOptionView.tsx:47 msgid "Why should this user be reviewed?" -msgstr "" +msgstr "為什麼應該審查這個使用者?" #: src/view/com/modals/crop-image/CropImage.web.tsx:103 msgid "Wide" @@ -5803,10 +5169,6 @@ msgstr "撰寫你的回覆" msgid "Writers" msgstr "作家" -#: src/view/com/auth/create/Step2.tsx:263 -#~ msgid "XXXXXX" -#~ msgstr "XXXXXX" - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:77 #: src/view/screens/PreferencesFollowingFeed.tsx:129 #: src/view/screens/PreferencesFollowingFeed.tsx:201 @@ -5823,7 +5185,7 @@ msgstr "輪到你了。" #: src/view/com/profile/ProfileFollows.tsx:86 msgid "You are not following anyone." -msgstr "" +msgstr "你沒有跟隨任何人。" #: src/view/com/posts/FollowingEmptyState.tsx:67 #: src/view/com/posts/FollowingEndOfFeed.tsx:68 @@ -5841,7 +5203,7 @@ msgstr "你現在可以使用新密碼登入。" #: src/view/com/profile/ProfileFollowers.tsx:86 msgid "You do not have any followers." -msgstr "" +msgstr "你沒有任何跟隨者。" #: src/view/com/modals/InviteCodes.tsx:67 msgid "You don't have any invite codes yet! We'll send you some when you've been on Bluesky for a little longer." @@ -5878,24 +5240,20 @@ msgstr "你輸入的邀請碼無效。它應該長得像這樣 XXXXX-XXXXX。" #: src/lib/moderation/useModerationCauseDescription.ts:109 msgid "You have hidden this post" -msgstr "" +msgstr "你已隱藏這則貼文" #: src/components/moderation/ModerationDetailsDialog.tsx:101 msgid "You have hidden this post." -msgstr "" +msgstr "你已隱藏這則貼文。" #: src/components/moderation/ModerationDetailsDialog.tsx:94 #: src/lib/moderation/useModerationCauseDescription.ts:92 msgid "You have muted this account." -msgstr "" +msgstr "你已隱藏這個帳號。" #: src/lib/moderation/useModerationCauseDescription.ts:86 msgid "You have muted this user" -msgstr "" - -#: src/view/com/modals/ModerationDetails.tsx:87 -#~ msgid "You have muted this user." -#~ msgstr "你已將這個使用者靜音。" +msgstr "你已隱藏這個使用者。" #: src/view/com/feeds/ProfileFeedgens.tsx:136 msgid "You have no feeds." @@ -5908,11 +5266,7 @@ msgstr "你沒有列表。" #: src/view/screens/ModerationBlockedAccounts.tsx:132 msgid "You have not blocked any accounts yet. To block an account, go to their profile and select \"Block account\" from the menu on their account." -msgstr "" - -#: src/view/screens/ModerationBlockedAccounts.tsx:132 -#~ msgid "You have not blocked any accounts yet. To block an account, go to their profile and selected \"Block account\" from the menu on their account." -#~ msgstr "你還沒有封鎖任何帳號。要封鎖帳號,請轉到其個人資料並在其帳號上的選單中選擇「封鎖帳號」。" +msgstr "你還沒有封鎖任何帳號。要封鎖帳號,請轉到其個人資料並在其帳號上的選單中選擇「封鎖帳號」。" #: src/view/screens/AppPasswords.tsx:89 msgid "You have not created any app passwords yet. You can create one by pressing the button below." @@ -5920,11 +5274,7 @@ msgstr "你還沒有建立任何應用程式專用密碼,如你想建立一個 #: src/view/screens/ModerationMutedAccounts.tsx:131 msgid "You have not muted any accounts yet. To mute an account, go to their profile and select \"Mute account\" from the menu on their account." -msgstr "" - -#: src/view/screens/ModerationMutedAccounts.tsx:131 -#~ msgid "You have not muted any accounts yet. To mute an account, go to their profile and selected \"Mute account\" from the menu on their account." -#~ msgstr "你還沒有靜音任何帳號。要靜音帳號,請轉到其個人資料並在其帳號上的選單中選擇「靜音帳號」。" +msgstr "你還沒有靜音任何帳號。要靜音帳號,請轉到其個人資料並在其帳號上的選單中選擇「靜音帳號」。" #: src/components/dialogs/MutedWords.tsx:249 msgid "You haven't muted any words or tags yet" @@ -5932,15 +5282,11 @@ msgstr "你还没有隐藏任何词或话题标签" #: src/components/moderation/LabelsOnMeDialog.tsx:68 msgid "You may appeal these labels if you feel they were placed in error." -msgstr "" +msgstr "如果你覺得這些標籤是錯誤的,你可以申訴這些標籤。" #: src/screens/Signup/StepInfo/Policies.tsx:79 msgid "You must be 13 years of age or older to sign up." -msgstr "" - -#: src/view/com/modals/ContentFilteringSettings.tsx:175 -#~ msgid "You must be 18 or older to enable adult content." -#~ msgstr "你必須年滿 18 歲才能啟用成人內容。" +msgstr "你必須年滿 13 歲才能註冊。" #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:110 msgid "You must be 18 years or older to enable adult content" @@ -5948,7 +5294,7 @@ msgstr "你必須年滿 18 歲才能啟用成人內容" #: src/components/ReportDialog/SubmitView.tsx:205 msgid "You must select at least one labeler for a report" -msgstr "" +msgstr "你必須選擇至少一個標籤者來提交檢舉" #: src/view/com/util/forms/PostDropdownBtn.tsx:144 msgid "You will no longer receive notifications for this thread" @@ -5979,7 +5325,7 @@ msgstr "你已設定完成!" #: src/components/moderation/ModerationDetailsDialog.tsx:98 #: src/lib/moderation/useModerationCauseDescription.ts:101 msgid "You've chosen to hide a word or tag within this post." -msgstr "" +msgstr "您選擇在這則貼文中隱藏詞彙或標籤。" #: src/view/com/posts/FollowingEndOfFeed.tsx:48 msgid "You've reached the end of your feed! Find some more accounts to follow." @@ -6015,10 +5361,6 @@ msgstr "你的預設訊息流為「跟隨」" msgid "Your email appears to be invalid." msgstr "你的電子郵件地址似乎無效。" -#: src/view/com/modals/Waitlist.tsx:109 -#~ msgid "Your email has been saved! We'll be in touch soon." -#~ msgstr "你的電子郵件地址已儲存!我們將很快聯繫你。" - #: src/view/com/modals/ChangeEmail.tsx:125 msgid "Your email has been updated but not verified. As a next step, please verify your new email." msgstr "你的電子郵件地址已更新但尚未驗證。作為下一步,請驗證你的新電子郵件地址。" @@ -6039,15 +5381,9 @@ msgstr "你的完整帳號代碼將修改為" msgid "Your full handle will be <0>@{0}" msgstr "你的完整帳號代碼將修改為 <0>@{0}" -#: src/view/screens/Settings.tsx:430 -#: src/view/shell/desktop/RightNav.tsx:137 -#: src/view/shell/Drawer.tsx:660 -#~ msgid "Your invite codes are hidden when logged in using an App Password" -#~ msgstr "在使用應用程式專用密碼登入時,你的邀請碼將被隱藏" - #: src/components/dialogs/MutedWords.tsx:220 msgid "Your muted words" -msgstr "" +msgstr "你的靜音詞" #: src/view/com/modals/ChangePassword.tsx:157 msgid "Your password has been changed successfully!" From 5aed7db208a3eca95e08b477b29b9b8923a2ead5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Be=C3=A0?= Date: Fri, 12 Apr 2024 23:46:39 +0200 Subject: [PATCH 043/185] Update Catalan messages.po (#3476) * Update messages.po new lines translated * Update messages.po change {nom} by {name} * Update messages.po update changes by @jordimas --- src/locale/locales/ca/messages.po | 52 +++++++++++++++---------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/locale/locales/ca/messages.po b/src/locale/locales/ca/messages.po index 7945fe8b59..9c0d4cc180 100644 --- a/src/locale/locales/ca/messages.po +++ b/src/locale/locales/ca/messages.po @@ -426,7 +426,7 @@ msgstr "Nuesa artística o no eròtica." #: src/screens/Signup/StepHandle.tsx:118 msgid "At least 3 characters" -msgstr "" +msgstr "Almenys 3 caràcters" #: src/components/moderation/LabelsOnMeDialog.tsx:246 #: src/components/moderation/LabelsOnMeDialog.tsx:247 @@ -929,7 +929,7 @@ msgstr "Configura els filtres de continguts per la categoria: {0}" #: src/components/moderation/LabelPreference.tsx:81 msgid "Configure content filtering setting for category: {name}" -msgstr "" +msgstr "Configura els filtres de continguts per la categoria: {name}" #: src/components/moderation/LabelPreference.tsx:244 msgid "Configured in <0>moderation settings." @@ -1053,7 +1053,7 @@ msgstr "Continua" #: src/components/AccountList.tsx:108 msgid "Continue as {0} (currently signed in)" -msgstr "" +msgstr "Continua com a {0} (sessió actual)" #: src/screens/Onboarding/StepFollowingFeed.tsx:151 #: src/screens/Onboarding/StepInterests/index.tsx:249 @@ -1223,7 +1223,7 @@ msgstr "Tema fosc" #: src/screens/Signup/StepInfo/index.tsx:132 msgid "Date of birth" -msgstr "" +msgstr "Data de naixement" #: src/view/screens/Settings/index.tsx:841 msgid "Debug Moderation" @@ -1370,7 +1370,7 @@ msgstr "No inclou nuesa." #: src/screens/Signup/StepHandle.tsx:104 msgid "Doesn't begin or end with a hyphen" -msgstr "" +msgstr "No comença ni acaba amb un guionet" #: src/view/com/modals/ChangeHandle.tsx:481 msgid "Domain Value" @@ -1590,7 +1590,7 @@ msgstr "Habilita veure el contingut per adults als teus canals" #: src/components/dialogs/EmbedConsent.tsx:82 #: src/components/dialogs/EmbedConsent.tsx:89 msgid "Enable external media" -msgstr "" +msgstr "Habilita els continguts externs" #: src/view/com/modals/EmbedConsent.tsx:97 #~ msgid "Enable External Media" @@ -1606,7 +1606,7 @@ msgstr "Activa aquesta opció per a veure només les respostes entre els comptes #: src/components/dialogs/EmbedConsent.tsx:94 msgid "Enable this source only" -msgstr "" +msgstr "Habilita només per aquesta font" #: src/screens/Moderation/index.tsx:339 msgid "Enabled" @@ -1622,7 +1622,7 @@ msgstr "Posa un nom a aquesta contrasenya d'aplicació" #: src/screens/Login/SetNewPasswordForm.tsx:139 msgid "Enter a password" -msgstr "" +msgstr "Introdueix una contrasenya" #: src/components/dialogs/MutedWords.tsx:99 #: src/components/dialogs/MutedWords.tsx:100 @@ -1920,7 +1920,7 @@ msgstr "Segueix-los a tots" #: src/view/com/post-thread/PostThreadFollowBtn.tsx:144 msgid "Follow Back" -msgstr "" +msgstr "Segueix" #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:182 msgid "Follow selected accounts and continue to the next step" @@ -2013,11 +2013,11 @@ msgstr "He oblidat la contrasenya" #: src/screens/Login/LoginForm.tsx:201 msgid "Forgot password?" -msgstr "" +msgstr "Has oblidat la contrasenya?" #: src/screens/Login/LoginForm.tsx:212 msgid "Forgot?" -msgstr "" +msgstr "Oblidada?" #: src/lib/moderation/useReportOptions.ts:52 msgid "Frequently Posts Unwanted Content" @@ -2684,7 +2684,7 @@ msgstr "Accedeix a un compte que no està llistat" #: src/screens/Login/SetNewPasswordForm.tsx:116 msgid "Looks like XXXXX-XXXXX" -msgstr "" +msgstr "Té l'aspecte XXXXX-XXXXX" #: src/view/com/modals/LinkWarning.tsx:79 msgid "Make sure this is where you intend to go!" @@ -3093,7 +3093,7 @@ msgstr "Ja no segueixes a {0}" #: src/screens/Signup/StepHandle.tsx:114 msgid "No longer than 253 characters" -msgstr "" +msgstr "No pot tenir més de 253 caràcters" #: src/view/com/notifications/Feed.tsx:109 msgid "No notifications yet!" @@ -3176,7 +3176,7 @@ msgstr "Nuesa" #: src/lib/moderation/useReportOptions.ts:71 msgid "Nudity or adult content not labeled as such" -msgstr "" +msgstr "Nuesa o contingut per adults no etiquetat com a tal" #: src/lib/moderation/useReportOptions.ts:71 #~ msgid "Nudity or pornography not labeled as such" @@ -3184,7 +3184,7 @@ msgstr "" #: src/screens/Signup/index.tsx:142 msgid "of" -msgstr "" +msgstr "de" #: src/lib/moderation/useLabelBehaviorDescription.ts:11 msgid "Off" @@ -3225,7 +3225,7 @@ msgstr "Només {0} poden respondre." #: src/screens/Signup/StepHandle.tsx:97 msgid "Only contains letters, numbers, and hyphens" -msgstr "" +msgstr "Només pot tenir lletres, nombres i guionets" #: src/components/Lists.tsx:75 msgid "Oops, something went wrong!" @@ -3695,7 +3695,7 @@ msgstr "Enllaç potencialment enganyós" #: src/components/forms/HostingProvider.tsx:45 msgid "Press to change hosting provider" -msgstr "" +msgstr "Prem per canviar el proveïdor d'allotjament" #: src/components/Error.tsx:74 #: src/components/Lists.tsx:80 @@ -3934,7 +3934,7 @@ msgstr "Informa del compte" #: src/components/ReportDialog/index.tsx:49 msgid "Report dialog" -msgstr "" +msgstr "Diàleg de l'informe" #: src/view/screens/ProfileFeed.tsx:352 #: src/view/screens/ProfileFeed.tsx:354 @@ -4274,7 +4274,7 @@ msgstr "Selecciona {item}" #: src/screens/Login/ChooseAccountForm.tsx:61 msgid "Select account" -msgstr "" +msgstr "Selecciona el compte" #: src/view/com/modals/ServerInput.tsx:75 #~ msgid "Select Bluesky Social" @@ -4335,7 +4335,7 @@ msgstr "Selecciona l'idioma de l'aplicació perquè el text predeterminat es mos #: src/screens/Signup/StepInfo/index.tsx:133 msgid "Select your date of birth" -msgstr "" +msgstr "Selecciona la teva data de naixement" #: src/screens/Onboarding/StepInterests/index.tsx:200 msgid "Select your interests from the options below" @@ -4564,11 +4564,11 @@ msgstr "Comparteix el canal" #: src/view/com/modals/LinkWarning.tsx:89 #: src/view/com/modals/LinkWarning.tsx:95 msgid "Share Link" -msgstr "" +msgstr "Comparteix l'enllaç" #: src/view/com/modals/LinkWarning.tsx:92 msgid "Shares the linked website" -msgstr "" +msgstr "Comparteix la web enllaçada" #: src/components/moderation/ContentHider.tsx:115 #: src/components/moderation/LabelPreference.tsx:136 @@ -4838,7 +4838,7 @@ msgstr "Pàgina d'estat" #: src/screens/Signup/index.tsx:142 msgid "Step" -msgstr "" +msgstr "Pas" #: src/view/com/auth/create/StepHeader.tsx:22 #~ msgid "Step {0} of {numSteps}" @@ -5682,7 +5682,7 @@ msgstr "Verifica el teu correu" #: src/view/screens/Settings/index.tsx:893 msgid "Version {0}" -msgstr "" +msgstr "Versió {0}" #: src/screens/Onboarding/index.tsx:42 msgid "Video Games" @@ -6029,11 +6029,11 @@ msgstr "Encara no has silenciat cap paraula ni etiqueta" #: src/components/moderation/LabelsOnMeDialog.tsx:68 msgid "You may appeal these labels if you feel they were placed in error." -msgstr "Pots apel·lar aquestes etiquetes si creus que s'han col·locat per error," +msgstr "Pots apel·lar aquestes etiquetes si creus que s'han col·locat per error." #: src/screens/Signup/StepInfo/Policies.tsx:79 msgid "You must be 13 years of age or older to sign up." -msgstr "" +msgstr "Has de tenir 13 anys o més per registrar-te" #: src/view/com/modals/ContentFilteringSettings.tsx:175 #~ msgid "You must be 18 or older to enable adult content." From f6dc216110d1ab5b4387957b6ee8cc5fd272af9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gild=C3=A1sio=20Filho?= Date: Fri, 12 Apr 2024 18:47:16 -0300 Subject: [PATCH 044/185] Update pt-BR localization to latest version (#3472) * Update messages.po * Update messages.po --- src/locale/locales/pt-BR/messages.po | 574 ++------------------------- 1 file changed, 28 insertions(+), 546 deletions(-) diff --git a/src/locale/locales/pt-BR/messages.po b/src/locale/locales/pt-BR/messages.po index 6fcc18894a..83c497ea92 100644 --- a/src/locale/locales/pt-BR/messages.po +++ b/src/locale/locales/pt-BR/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: pt-BR\n" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-03-22 11:51\n" +"PO-Revision-Date: 2024-04-10 18:15\n" "Last-Translator: gildaswise\n" "Language-Team: maisondasilva, MightyLoggor, gildaswise, gleydson, faeriarum\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -53,14 +53,6 @@ msgstr "<0>Bem-vindo ao<1>Bluesky" msgid "⚠Invalid Handle" msgstr "⚠Usuário Inválido" -#: src/view/com/util/moderation/LabelInfo.tsx:45 -#~ msgid "A content warning has been applied to this {0}." -#~ msgstr "Um aviso de conteúdo foi aplicado a este {0}." - -#: src/lib/hooks/useOTAUpdate.ts:16 -#~ msgid "A new version of the app is available. Please update to continue using the app." -#~ msgstr "Uma nova versão do aplicativo está disponível. Por favor, atualize para continuar usando o aplicativo." - #: src/view/com/util/ViewHeader.tsx:89 #: src/view/screens/Search/Search.tsx:649 msgid "Access navigation links and settings" @@ -161,15 +153,6 @@ msgstr "Adicionar texto alternativo" msgid "Add App Password" msgstr "Adicionar Senha de Aplicativo" -#: src/view/com/modals/report/InputIssueDetails.tsx:41 -#: src/view/com/modals/report/Modal.tsx:191 -#~ msgid "Add details" -#~ msgstr "Adicionar detalhes" - -#: src/view/com/modals/report/Modal.tsx:194 -#~ msgid "Add details to report" -#~ msgstr "Adicionar detalhes à denúncia" - #: src/view/com/composer/Composer.tsx:467 msgid "Add link card" msgstr "Adicionar prévia de link" @@ -222,10 +205,6 @@ msgstr "Ajuste o número de curtidas para que uma resposta apareça no seu feed. msgid "Adult Content" msgstr "Conteúdo Adulto" -#: src/view/com/modals/ContentFilteringSettings.tsx:141 -#~ msgid "Adult content can only be enabled via the Web at <0/>." -#~ msgstr "Conteúdo adulto só pode ser habilitado no site: <0/>." - #: src/components/moderation/LabelPreference.tsx:242 msgid "Adult content is disabled." msgstr "O conteúdo adulto está desabilitado." @@ -312,10 +291,6 @@ msgstr "O nome da Senha de Aplicativo precisa ter no mínimo 4 caracteres." msgid "App password settings" msgstr "Configurações de Senha de Aplicativo" -#: src/view/screens/Settings.tsx:650 -#~ msgid "App passwords" -#~ msgstr "Senhas de aplicativos" - #: src/Navigation.tsx:251 #: src/view/screens/AppPasswords.tsx:189 #: src/view/screens/Settings/index.tsx:704 @@ -331,27 +306,10 @@ msgstr "Contestar" msgid "Appeal \"{0}\" label" msgstr "Contestar rótulo \"{0}\"" -#: src/view/com/util/forms/PostDropdownBtn.tsx:337 -#: src/view/com/util/forms/PostDropdownBtn.tsx:346 -#~ msgid "Appeal content warning" -#~ msgstr "Contestar aviso de conteúdo" - -#: src/view/com/modals/AppealLabel.tsx:65 -#~ msgid "Appeal Content Warning" -#~ msgstr "Contestar aviso de conteúdo" - #: src/components/moderation/LabelsOnMeDialog.tsx:192 msgid "Appeal submitted." msgstr "Contestação enviada." -#: src/view/com/util/moderation/LabelInfo.tsx:52 -#~ msgid "Appeal this decision" -#~ msgstr "Contestar esta decisão" - -#: src/view/com/util/moderation/LabelInfo.tsx:56 -#~ msgid "Appeal this decision." -#~ msgstr "Contestar esta decisão." - #: src/view/screens/Settings/index.tsx:485 msgid "Appearance" msgstr "Aparência" @@ -372,10 +330,6 @@ msgstr "Tem certeza que deseja descartar este rascunho?" msgid "Are you sure?" msgstr "Tem certeza?" -#: src/view/com/util/forms/PostDropdownBtn.tsx:322 -#~ msgid "Are you sure? This cannot be undone." -#~ msgstr "Tem certeza? Esta ação não poderá ser desfeita." - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:60 msgid "Are you writing in <0>{0}?" msgstr "Você está escrevendo em <0>{0}?" @@ -390,7 +344,7 @@ msgstr "Nudez artística ou não erótica." #: src/screens/Signup/StepHandle.tsx:118 msgid "At least 3 characters" -msgstr "" +msgstr "No mínimo 3 caracteres" #: src/components/moderation/LabelsOnMeDialog.tsx:246 #: src/components/moderation/LabelsOnMeDialog.tsx:247 @@ -408,11 +362,6 @@ msgstr "" msgid "Back" msgstr "Voltar" -#: src/view/com/post-thread/PostThread.tsx:480 -#~ msgctxt "action" -#~ msgid "Back" -#~ msgstr "Voltar" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:144 msgid "Based on your interest in {interestsText}" msgstr "Com base no seu interesse em {interestsText}" @@ -456,10 +405,6 @@ msgstr "Lista de bloqueio" msgid "Block these accounts?" msgstr "Bloquear estas contas?" -#: src/view/screens/ProfileList.tsx:320 -#~ msgid "Block this List" -#~ msgstr "Bloquear esta Lista" - #: src/view/com/lists/ListCard.tsx:110 #: src/view/com/util/post-embeds/QuoteEmbed.tsx:55 msgid "Blocked" @@ -528,10 +473,6 @@ msgstr "Bluesky é aberto." msgid "Bluesky is public." msgstr "Bluesky é público." -#: src/view/com/modals/Waitlist.tsx:70 -#~ msgid "Bluesky uses invites to build a healthier community. If you don't know anybody with an invite, you can sign up for the waitlist and we'll send one soon." -#~ msgstr "O Bluesky usa convites para criar uma comunidade mais saudável. Se você não conhece ninguém que tenha um convite, inscreva-se na lista de espera e em breve enviaremos um para você." - #: src/screens/Moderation/index.tsx:533 msgid "Bluesky will not show your profile and posts to logged-out users. Other apps may not honor this request. This does not make your account private." msgstr "O Bluesky não mostrará seu perfil e publicações para usuários desconectados. Outros aplicativos podem não honrar esta solicitação. Isso não torna a sua conta privada." @@ -548,10 +489,6 @@ msgstr "Desfocar imagens e filtrar dos feeds" msgid "Books" msgstr "Livros" -#: src/view/screens/Settings/index.tsx:893 -#~ msgid "Build version {0} {1}" -#~ msgstr "Versão {0} {1}" - #: src/view/com/auth/HomeLoggedOutCTA.tsx:92 #: src/view/com/auth/SplashScreen.web.tsx:166 msgid "Business" @@ -649,10 +586,6 @@ msgstr "Cancelar citação" msgid "Cancel search" msgstr "Cancelar busca" -#: src/view/com/modals/Waitlist.tsx:136 -#~ msgid "Cancel waitlist signup" -#~ msgstr "Cancelar inscrição na lista de espera" - #: src/view/com/modals/LinkWarning.tsx:106 msgid "Cancels opening the linked website" msgstr "Cancela a abertura do link" @@ -692,10 +625,6 @@ msgstr "Alterar Senha" msgid "Change post language to {0}" msgstr "Trocar idioma do post para {0}" -#: src/view/screens/Settings/index.tsx:733 -#~ msgid "Change your Bluesky password" -#~ msgstr "Alterar sua senha do Bluesky" - #: src/view/com/modals/ChangeEmail.tsx:109 msgid "Change Your Email" msgstr "Altere o Seu Email" @@ -721,10 +650,6 @@ msgstr "Verifique em sua caixa de entrada um e-mail com o código de confirmaç msgid "Choose \"Everybody\" or \"Nobody\"" msgstr "Escolha \"Todos\" ou \"Ninguém\"" -#: src/view/screens/Settings/index.tsx:697 -#~ msgid "Choose a new Bluesky username or create" -#~ msgstr "Crie ou escolha um novo usuário no Bluesky" - #: src/view/com/auth/server-input/index.tsx:79 msgid "Choose Service" msgstr "Escolher Serviço" @@ -881,7 +806,7 @@ msgstr "Configure o filtro de conteúdo por categoria: {0}" #: src/components/moderation/LabelPreference.tsx:81 msgid "Configure content filtering setting for category: {name}" -msgstr "" +msgstr "Configure o filtro de conteúdo por categoria: {name}" #: src/components/moderation/LabelPreference.tsx:244 msgid "Configured in <0>moderation settings." @@ -897,12 +822,6 @@ msgstr "Configure no <0>painel de moderação." msgid "Confirm" msgstr "Confirmar" -#: src/view/com/modals/Confirm.tsx:75 -#: src/view/com/modals/Confirm.tsx:78 -#~ msgctxt "action" -#~ msgid "Confirm" -#~ msgstr "Confirmar" - #: src/view/com/modals/ChangeEmail.tsx:193 #: src/view/com/modals/ChangeEmail.tsx:195 msgid "Confirm Change" @@ -916,10 +835,6 @@ msgstr "Confirmar configurações de idioma de conteúdo" msgid "Confirm delete account" msgstr "Confirmar a exclusão da conta" -#: src/view/com/modals/ContentFilteringSettings.tsx:156 -#~ msgid "Confirm your age to enable adult content." -#~ msgstr "Confirme sua idade para habilitar conteúdo adulto." - #: src/screens/Moderation/index.tsx:301 msgid "Confirm your age:" msgstr "Confirme sua idade:" @@ -935,10 +850,6 @@ msgstr "Confirme sua data de nascimento" msgid "Confirmation code" msgstr "Código de confirmação" -#: src/view/com/modals/Waitlist.tsx:120 -#~ msgid "Confirms signing up {email} to the waitlist" -#~ msgstr "Confirma adição de {email} à lista de espera" - #: src/screens/Login/LoginForm.tsx:248 msgid "Connecting..." msgstr "Conectando..." @@ -955,14 +866,6 @@ msgstr "conteúdo" msgid "Content Blocked" msgstr "Conteúdo bloqueado" -#: src/view/screens/Moderation.tsx:83 -#~ msgid "Content filtering" -#~ msgstr "Filtragem do conteúdo" - -#: src/view/com/modals/ContentFilteringSettings.tsx:44 -#~ msgid "Content Filtering" -#~ msgstr "Filtragem do Conteúdo" - #: src/screens/Moderation/index.tsx:285 msgid "Content filters" msgstr "Filtros de conteúdo" @@ -1005,7 +908,7 @@ msgstr "Continuar" #: src/components/AccountList.tsx:108 msgid "Continue as {0} (currently signed in)" -msgstr "" +msgstr "Continuar como {0} (já conectado)" #: src/screens/Onboarding/StepFollowingFeed.tsx:151 #: src/screens/Onboarding/StepInterests/index.tsx:249 @@ -1064,10 +967,6 @@ msgstr "Copiar link da lista" msgid "Copy link to post" msgstr "Copiar link do post" -#: src/view/com/profile/ProfileHeader.tsx:295 -#~ msgid "Copy link to profile" -#~ msgstr "Copiar link do perfil" - #: src/view/com/util/forms/PostDropdownBtn.tsx:220 #: src/view/com/util/forms/PostDropdownBtn.tsx:222 msgid "Copy post text" @@ -1118,14 +1017,6 @@ msgstr "Criar denúncia para {0}" msgid "Created {0}" msgstr "{0} criada" -#: src/view/screens/ProfileFeed.tsx:616 -#~ msgid "Created by <0/>" -#~ msgstr "Criado por <0/>" - -#: src/view/screens/ProfileFeed.tsx:614 -#~ msgid "Created by you" -#~ msgstr "Criado por você" - #: src/view/com/composer/Composer.tsx:469 msgid "Creates a card with a thumbnail. The card links to {url}" msgstr "Cria uma prévia com miniatura. A prévia faz um link para {url}" @@ -1167,7 +1058,7 @@ msgstr "Modo Escuro" #: src/screens/Signup/StepInfo/index.tsx:132 msgid "Date of birth" -msgstr "" +msgstr "Data de nascimento" #: src/view/screens/Settings/index.tsx:841 msgid "Debug Moderation" @@ -1239,10 +1130,6 @@ msgstr "Post excluído." msgid "Description" msgstr "Descrição" -#: src/view/screens/Settings.tsx:760 -#~ msgid "Developer Tools" -#~ msgstr "Ferramentas de Desenvolvedor" - #: src/view/com/composer/Composer.tsx:218 msgid "Did you want to say anything?" msgstr "Você gostaria de dizer alguma coisa?" @@ -1262,10 +1149,6 @@ msgstr "Desabilitado" msgid "Discard" msgstr "Descartar" -#: src/view/com/composer/Composer.tsx:145 -#~ msgid "Discard draft" -#~ msgstr "Descartar rascunho" - #: src/view/com/composer/Composer.tsx:508 msgid "Discard draft?" msgstr "Descartar rascunho?" @@ -1302,7 +1185,7 @@ msgstr "Não inclui nudez." #: src/screens/Signup/StepHandle.tsx:104 msgid "Doesn't begin or end with a hyphen" -msgstr "" +msgstr "Não começa ou termina com um hífen" #: src/view/com/modals/ChangeHandle.tsx:481 msgid "Domain Value" @@ -1312,10 +1195,6 @@ msgstr "Domínio" msgid "Domain verified!" msgstr "Domínio verificado!" -#: src/view/com/auth/create/Step1.tsx:170 -#~ msgid "Don't have an invite code?" -#~ msgstr "Não possui um convite?" - #: src/components/dialogs/BirthDateSettings.tsx:119 #: src/components/dialogs/BirthDateSettings.tsx:125 #: src/components/forms/DateField/index.tsx:74 @@ -1351,14 +1230,6 @@ msgstr "Feito" msgid "Done{extraText}" msgstr "Feito{extraText}" -#: src/view/com/auth/login/ChooseAccountForm.tsx:46 -#~ msgid "Double tap to sign in" -#~ msgstr "Toque duas vezes para logar" - -#: src/view/screens/Settings/index.tsx:755 -#~ msgid "Download Bluesky account data (repository)" -#~ msgstr "Baixar os dados da minha conta Bluesky (repositório)" - #: src/view/screens/Settings/ExportCarDialog.tsx:59 #: src/view/screens/Settings/ExportCarDialog.tsx:63 msgid "Download CAR file" @@ -1522,11 +1393,7 @@ msgstr "Habilitar conteúdo adulto nos feeds" #: src/components/dialogs/EmbedConsent.tsx:82 #: src/components/dialogs/EmbedConsent.tsx:89 msgid "Enable external media" -msgstr "" - -#: src/view/com/modals/EmbedConsent.tsx:97 -#~ msgid "Enable External Media" -#~ msgstr "Habilitar Mídia Externa" +msgstr "Habilitar mídia externa" #: src/view/screens/PreferencesExternalEmbeds.tsx:75 msgid "Enable media players for" @@ -1538,7 +1405,7 @@ msgstr "Ative esta configuração para ver respostas apenas entre as pessoas que #: src/components/dialogs/EmbedConsent.tsx:94 msgid "Enable this source only" -msgstr "" +msgstr "Habilitar mídia somente para este site" #: src/screens/Moderation/index.tsx:339 msgid "Enabled" @@ -1554,7 +1421,7 @@ msgstr "Insira um nome para esta Senha de Aplicativo" #: src/screens/Login/SetNewPasswordForm.tsx:139 msgid "Enter a password" -msgstr "" +msgstr "Insira uma senha" #: src/components/dialogs/MutedWords.tsx:99 #: src/components/dialogs/MutedWords.tsx:100 @@ -1581,10 +1448,6 @@ msgstr "Digite o e-mail que você usou para criar a sua conta. Nós lhe enviarem msgid "Enter your birth date" msgstr "Insira seu aniversário" -#: src/view/com/modals/Waitlist.tsx:78 -#~ msgid "Enter your email" -#~ msgstr "Digite seu e-mail" - #: src/screens/Login/ForgotPasswordForm.tsx:105 #: src/screens/Signup/StepInfo/index.tsx:91 msgid "Enter your email address" @@ -1639,10 +1502,6 @@ msgstr "Sair do visualizador de imagem" msgid "Exits inputting search query" msgstr "Sair da busca" -#: src/view/com/modals/Waitlist.tsx:138 -#~ msgid "Exits signing up for waitlist with {email}" -#~ msgstr "Desistir de entrar na lista de espera" - #: src/view/com/lightbox/Lightbox.web.tsx:183 msgid "Expand alt text" msgstr "Expandir texto alternativo" @@ -1723,10 +1582,6 @@ msgstr "Feed por {0}" msgid "Feed offline" msgstr "Feed offline" -#: src/view/com/feeds/FeedPage.tsx:143 -#~ msgid "Feed Preferences" -#~ msgstr "Preferências de Feeds" - #: src/view/shell/desktop/RightNav.tsx:61 #: src/view/shell/Drawer.tsx:314 msgid "Feedback" @@ -1840,7 +1695,7 @@ msgstr "Seguir Todas" #: src/view/com/post-thread/PostThreadFollowBtn.tsx:144 msgid "Follow Back" -msgstr "" +msgstr "Seguir De Volta" #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:182 msgid "Follow selected accounts and continue to the next step" @@ -1914,14 +1769,6 @@ msgstr "Por motivos de segurança, precisamos enviar um código de confirmação msgid "For security reasons, you won't be able to view this again. If you lose this password, you'll need to generate a new one." msgstr "Por motivos de segurança, você não poderá ver esta senha novamente. Se você perder esta senha, terá que gerar uma nova." -#: src/view/com/auth/login/LoginForm.tsx:244 -#~ msgid "Forgot" -#~ msgstr "Esqueci" - -#: src/view/com/auth/login/LoginForm.tsx:241 -#~ msgid "Forgot password" -#~ msgstr "Esqueci a senha" - #: src/screens/Login/index.tsx:129 #: src/screens/Login/index.tsx:144 msgid "Forgot Password" @@ -1929,11 +1776,11 @@ msgstr "Esqueci a Senha" #: src/screens/Login/LoginForm.tsx:201 msgid "Forgot password?" -msgstr "" +msgstr "Esqueceu a senha?" #: src/screens/Login/LoginForm.tsx:212 msgid "Forgot?" -msgstr "" +msgstr "Esqueceu?" #: src/lib/moderation/useReportOptions.ts:52 msgid "Frequently Posts Unwanted Content" @@ -2024,10 +1871,6 @@ msgstr "Assédio, intolerância ou \"trollagem\"" msgid "Hashtag" msgstr "Hashtag" -#: src/components/RichText.tsx:188 -#~ msgid "Hashtag: {tag}" -#~ msgstr "Hashtag: {tag}" - #: src/components/RichText.tsx:191 msgid "Hashtag: #{tag}" msgstr "Hashtag: #{tag}" @@ -2093,10 +1936,6 @@ msgstr "Ocultar este post?" msgid "Hide user list" msgstr "Ocultar lista de usuários" -#: src/view/com/profile/ProfileHeader.tsx:487 -#~ msgid "Hides posts from {0} in your feed" -#~ msgstr "Esconder posts de {0} no seu feed" - #: src/view/com/posts/FeedErrorMessage.tsx:111 msgid "Hmm, some kind of issue occurred when contacting the feed server. Please let the feed owner know about this issue." msgstr "Hmm, ocorreu algum problema ao entrar em contato com o servidor deste feed. Por favor, avise o criador do feed sobre este problema." @@ -2133,13 +1972,6 @@ msgstr "Hmmmm, não foi possível carregar este serviço de moderação." msgid "Home" msgstr "Página Inicial" -#: src/Navigation.tsx:247 -#: src/view/com/pager/FeedsTabBarMobile.tsx:123 -#: src/view/screens/PreferencesHomeFeed.tsx:104 -#: src/view/screens/Settings/index.tsx:543 -#~ msgid "Home Feed Preferences" -#~ msgstr "Preferências da Página Inicial" - #: src/view/com/modals/ChangeHandle.tsx:420 msgid "Host:" msgstr "Host:" @@ -2203,11 +2035,6 @@ msgstr "Imagem" msgid "Image alt text" msgstr "Texto alternativo da imagem" -#: src/view/com/util/UserAvatar.tsx:311 -#: src/view/com/util/UserBanner.tsx:118 -#~ msgid "Image options" -#~ msgstr "Opções de imagem" - #: src/lib/moderation/useReportOptions.ts:47 msgid "Impersonation or false claims about identity or affiliation" msgstr "Falsificação de identidade ou alegações falsas sobre identidade ou filiação" @@ -2220,14 +2047,6 @@ msgstr "Insira o código enviado para o seu e-mail para redefinir sua senha" msgid "Input confirmation code for account deletion" msgstr "Insira o código de confirmação para excluir sua conta" -#: src/view/com/auth/create/Step1.tsx:177 -#~ msgid "Input email for Bluesky account" -#~ msgstr "Insira o e-mail para a sua conta do Bluesky" - -#: src/view/com/auth/create/Step1.tsx:151 -#~ msgid "Input invite code to proceed" -#~ msgstr "Insira o convite para continuar" - #: src/view/com/modals/AddAppPasswords.tsx:181 msgid "Input name for app password" msgstr "Insira um nome para a senha de aplicativo" @@ -2248,10 +2067,6 @@ msgstr "Insira a senha da conta {identifier}" msgid "Input the username or email address you used at signup" msgstr "Insira o usuário ou e-mail que você cadastrou" -#: src/view/com/modals/Waitlist.tsx:90 -#~ msgid "Input your email to get on the Bluesky waitlist" -#~ msgstr "Insira seu e-mail para entrar na lista de espera do Bluesky" - #: src/screens/Login/LoginForm.tsx:194 msgid "Input your password" msgstr "Insira sua senha" @@ -2301,19 +2116,6 @@ msgstr "Mostra os posts de quem você segue conforme acontecem." msgid "Jobs" msgstr "Carreiras" -#: src/view/com/modals/Waitlist.tsx:67 -#~ msgid "Join the waitlist" -#~ msgstr "Junte-se à lista de espera" - -#: src/view/com/auth/create/Step1.tsx:174 -#: src/view/com/auth/create/Step1.tsx:178 -#~ msgid "Join the waitlist." -#~ msgstr "Junte-se à lista de espera." - -#: src/view/com/modals/Waitlist.tsx:128 -#~ msgid "Join Waitlist" -#~ msgstr "Junte-se à Lista de Espera" - #: src/screens/Onboarding/index.tsx:24 msgid "Journalism" msgstr "Jornalismo" @@ -2367,14 +2169,6 @@ msgstr "Configurações de Idiomas" msgid "Languages" msgstr "Idiomas" -#: src/view/com/auth/create/StepHeader.tsx:20 -#~ msgid "Last step!" -#~ msgstr "Último passo!" - -#: src/view/com/util/moderation/ContentHider.tsx:103 -#~ msgid "Learn more" -#~ msgstr "Saiba mais" - #: src/components/moderation/ScreenHider.tsx:136 msgid "Learn More" msgstr "Saiba Mais" @@ -2422,11 +2216,6 @@ msgstr "Vamos redefinir sua senha!" msgid "Let's go!" msgstr "Vamos lá!" -#: src/view/com/util/UserAvatar.tsx:248 -#: src/view/com/util/UserBanner.tsx:62 -#~ msgid "Library" -#~ msgstr "Biblioteca" - #: src/view/screens/Settings/index.tsx:498 msgid "Light" msgstr "Claro" @@ -2527,11 +2316,6 @@ msgstr "Lista dessilenciada" msgid "Lists" msgstr "Listas" -#: src/view/com/post-thread/PostThread.tsx:333 -#: src/view/com/post-thread/PostThread.tsx:341 -#~ msgid "Load more posts" -#~ msgstr "Carregar mais posts" - #: src/view/screens/Notifications.tsx:159 msgid "Load new notifications" msgstr "Carregar novas notificações" @@ -2547,10 +2331,6 @@ msgstr "Carregar novos posts" msgid "Loading..." msgstr "Carregando..." -#: src/view/com/modals/ServerInput.tsx:50 -#~ msgid "Local dev server" -#~ msgstr "Servidor de desenvolvimento local" - #: src/Navigation.tsx:221 msgid "Log" msgstr "Registros" @@ -2572,7 +2352,7 @@ msgstr "Fazer login em uma conta que não está listada" #: src/screens/Login/SetNewPasswordForm.tsx:116 msgid "Looks like XXXXX-XXXXX" -msgstr "" +msgstr "Tem esse formato: XXXXX-XXXXX" #: src/view/com/modals/LinkWarning.tsx:79 msgid "Make sure this is where you intend to go!" @@ -2582,14 +2362,6 @@ msgstr "Certifique-se de onde está indo!" msgid "Manage your muted words and tags" msgstr "Gerencie suas palavras/tags silenciadas" -#: src/view/com/auth/create/Step2.tsx:118 -#~ msgid "May not be longer than 253 characters" -#~ msgstr "Não pode ter mais que 253 caracteres" - -#: src/view/com/auth/create/Step2.tsx:109 -#~ msgid "May only contain letters and numbers" -#~ msgstr "Só pode conter letras e números" - #: src/view/screens/Profile.tsx:192 msgid "Media" msgstr "Mídia" @@ -2689,18 +2461,10 @@ msgstr "Mais feeds" msgid "More options" msgstr "Mais opções" -#: src/view/com/util/forms/PostDropdownBtn.tsx:315 -#~ msgid "More post options" -#~ msgstr "Mais opções do post" - #: src/view/screens/PreferencesThreads.tsx:82 msgid "Most-liked replies first" msgstr "Respostas mais curtidas primeiro" -#: src/view/com/auth/create/Step2.tsx:122 -#~ msgid "Must be at least 3 characters" -#~ msgstr "Deve ter no mínimo 3 caracteres" - #: src/components/TagMenu/index.tsx:249 msgid "Mute" msgstr "Silenciar" @@ -2722,13 +2486,9 @@ msgstr "Silenciar contas" msgid "Mute all {displayTag} posts" msgstr "Silenciar posts com {displayTag}" -#: src/components/TagMenu/index.tsx:211 -#~ msgid "Mute all {tag} posts" -#~ msgstr "Silenciar posts com {tag}" - #: src/components/dialogs/MutedWords.tsx:148 msgid "Mute in tags only" -msgstr "Silenciar apenas as tags" +msgstr "Silenciar apenas tags" #: src/components/dialogs/MutedWords.tsx:133 msgid "Mute in text & tags" @@ -2737,16 +2497,12 @@ msgstr "Silenciar texto e tags" #: src/view/screens/ProfileList.tsx:461 #: src/view/screens/ProfileList.tsx:624 msgid "Mute list" -msgstr "Lista de moderação" +msgstr "Silenciar lista" #: src/view/screens/ProfileList.tsx:619 msgid "Mute these accounts?" msgstr "Silenciar estas contas?" -#: src/view/screens/ProfileList.tsx:279 -#~ msgid "Mute this List" -#~ msgstr "Silenciar esta lista" - #: src/components/dialogs/MutedWords.tsx:126 msgid "Mute this word in post text and tags" msgstr "Silenciar esta palavra no conteúdo de um post e tags" @@ -2815,10 +2571,6 @@ msgstr "Meus feeds salvos" msgid "My Saved Feeds" msgstr "Meus Feeds Salvos" -#: src/view/com/auth/server-input/index.tsx:118 -#~ msgid "my-server.com" -#~ msgstr "meu-servidor.com.br" - #: src/view/com/modals/AddAppPasswords.tsx:180 #: src/view/com/modals/CreateOrEditList.tsx:291 msgid "Name" @@ -2852,11 +2604,6 @@ msgstr "Navega para seu perfil" msgid "Need to report a copyright violation?" msgstr "Precisa denunciar uma violação de copyright?" -#: src/view/com/modals/EmbedConsent.tsx:107 -#: src/view/com/modals/EmbedConsent.tsx:123 -#~ msgid "Never load embeds from {0}" -#~ msgstr "Nunca carregar anexos de {0}" - #: src/view/com/auth/onboarding/WelcomeDesktop.tsx:72 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:74 msgid "Never lose access to your followers and data." @@ -2866,10 +2613,6 @@ msgstr "Nunca perca o acesso aos seus seguidores e dados." msgid "Never lose access to your followers or data." msgstr "Nunca perca o acesso aos seus seguidores ou dados." -#: src/components/dialogs/MutedWords.tsx:293 -#~ msgid "Nevermind" -#~ msgstr "Deixa pra lá" - #: src/view/com/modals/ChangeHandle.tsx:519 msgid "Nevermind, create a handle for me" msgstr "Deixa pra lá, crie um usuário pra mim" @@ -2973,7 +2716,7 @@ msgstr "Você não está mais seguindo {0}" #: src/screens/Signup/StepHandle.tsx:114 msgid "No longer than 253 characters" -msgstr "" +msgstr "No máximo 253 caracteres" #: src/view/com/notifications/Feed.tsx:109 msgid "No notifications yet!" @@ -3056,15 +2799,11 @@ msgstr "Nudez" #: src/lib/moderation/useReportOptions.ts:71 msgid "Nudity or adult content not labeled as such" -msgstr "" - -#: src/lib/moderation/useReportOptions.ts:71 -#~ msgid "Nudity or pornography not labeled as such" -#~ msgstr "Nudez ou pornografia sem aviso aplicado" +msgstr "Nudez ou pornografia sem aviso aplicado" #: src/screens/Signup/index.tsx:142 msgid "of" -msgstr "" +msgstr "de" #: src/lib/moderation/useLabelBehaviorDescription.ts:11 msgid "Off" @@ -3105,7 +2844,7 @@ msgstr "Apenas {0} pode responder." #: src/screens/Signup/StepHandle.tsx:97 msgid "Only contains letters, numbers, and hyphens" -msgstr "" +msgstr "Contém apenas letras, números e hífens" #: src/components/Lists.tsx:75 msgid "Oops, something went wrong!" @@ -3121,10 +2860,6 @@ msgstr "Opa!" msgid "Open" msgstr "Abrir" -#: src/view/screens/Moderation.tsx:75 -#~ msgid "Open content filtering settings" -#~ msgstr "Abrir configurações de filtro" - #: src/view/com/composer/Composer.tsx:491 #: src/view/com/composer/Composer.tsx:492 msgid "Open emoji picker" @@ -3142,10 +2877,6 @@ msgstr "Abrir links no navegador interno" msgid "Open muted words and tags settings" msgstr "Abrir opções de palavras/tags silenciadas" -#: src/view/screens/Moderation.tsx:92 -#~ msgid "Open muted words settings" -#~ msgstr "Abrir configurações das palavras silenciadas" - #: src/view/com/home/HomeHeaderLayoutMobile.tsx:50 msgid "Open navigation" msgstr "Abrir navegação" @@ -3191,10 +2922,6 @@ msgstr "Abre definições de idioma configuráveis" msgid "Opens device photo gallery" msgstr "Abre a galeria de fotos do dispositivo" -#: src/view/com/profile/ProfileHeader.tsx:420 -#~ msgid "Opens editor for profile display name, avatar, background image, and description" -#~ msgstr "Abre o editor de nome, avatar, banner e descrição do perfil" - #: src/view/screens/Settings/index.tsx:669 msgid "Opens external embeds settings" msgstr "Abre as configurações de anexos externos" @@ -3211,14 +2938,6 @@ msgstr "Abre o fluxo de criação de conta do Bluesky" msgid "Opens flow to sign into your existing Bluesky account" msgstr "Abre o fluxo de entrar na sua conta do Bluesky" -#: src/view/com/profile/ProfileHeader.tsx:575 -#~ msgid "Opens followers list" -#~ msgstr "Abre lista de seguidores" - -#: src/view/com/profile/ProfileHeader.tsx:594 -#~ msgid "Opens following list" -#~ msgstr "Abre lista de seguidos" - #: src/view/com/modals/InviteCodes.tsx:173 msgid "Opens list of invite codes" msgstr "Abre a lista de códigos de convite" @@ -3419,14 +3138,6 @@ msgstr "Por favor, insira um nome único para esta Senha de Aplicativo ou use no msgid "Please enter a valid word, tag, or phrase to mute" msgstr "Por favor, insira uma palavra, tag ou frase para silenciar" -#: src/view/com/auth/create/state.ts:170 -#~ msgid "Please enter the code you received by SMS." -#~ msgstr "Por favor, digite o código recebido via SMS." - -#: src/view/com/auth/create/Step2.tsx:282 -#~ msgid "Please enter the verification code sent to {phoneNumberFormatted}." -#~ msgstr "Por favor, digite o código de verificação enviado para {phoneNumberFormatted}." - #: src/screens/Signup/state.ts:220 msgid "Please enter your email." msgstr "Por favor, digite o seu e-mail." @@ -3439,11 +3150,6 @@ msgstr "Por favor, digite sua senha também:" msgid "Please explain why you think this label was incorrectly applied by {0}" msgstr "Por favor, explique por que você acha que este rótulo foi aplicado incorrentamente por {0}" -#: src/view/com/modals/AppealLabel.tsx:72 -#: src/view/com/modals/AppealLabel.tsx:75 -#~ msgid "Please tell us why you think this content warning was incorrectly applied!" -#~ msgstr "Por favor, diga-nos por que você acha que este aviso de conteúdo foi aplicado incorretamente!" - #: src/view/com/modals/VerifyEmail.tsx:101 msgid "Please Verify Your Email" msgstr "Por favor, verifique seu e-mail" @@ -3460,10 +3166,6 @@ msgstr "Política" msgid "Porn" msgstr "Pornografia" -#: src/lib/moderation/useGlobalLabelStrings.ts:34 -#~ msgid "Pornography" -#~ msgstr "Pornografia" - #: src/view/com/composer/Composer.tsx:367 #: src/view/com/composer/Composer.tsx:375 msgctxt "action" @@ -3538,7 +3240,7 @@ msgstr "Link Potencialmente Enganoso" #: src/components/forms/HostingProvider.tsx:45 msgid "Press to change hosting provider" -msgstr "" +msgstr "Trocar de provedor de hospedagem" #: src/components/Error.tsx:74 #: src/components/Lists.tsx:80 @@ -3659,10 +3361,6 @@ msgstr "Usuários Recomendados" msgid "Remove" msgstr "Remover" -#: src/view/com/feeds/FeedSourceCard.tsx:108 -#~ msgid "Remove {0} from my feeds?" -#~ msgstr "Remover {0} dos meus feeds?" - #: src/view/com/util/AccountDropdownBtn.tsx:22 msgid "Remove account" msgstr "Remover conta" @@ -3710,18 +3408,10 @@ msgstr "Remover palavra silenciada da lista" msgid "Remove repost" msgstr "Desfazer repost" -#: src/view/com/feeds/FeedSourceCard.tsx:175 -#~ msgid "Remove this feed from my feeds?" -#~ msgstr "Remover este feed dos meus feeds?" - #: src/view/com/posts/FeedErrorMessage.tsx:202 msgid "Remove this feed from your saved feeds" msgstr "Remover este feed dos feeds salvos" -#: src/view/com/posts/FeedErrorMessage.tsx:132 -#~ msgid "Remove this feed from your saved feeds?" -#~ msgstr "Remover este feed dos feeds salvos?" - #: src/view/com/modals/ListAddRemoveUsers.tsx:199 #: src/view/com/modals/UserAddRemoveLists.tsx:152 msgid "Removed from list" @@ -3762,10 +3452,6 @@ msgctxt "description" msgid "Reply to <0/>" msgstr "Responder <0/>" -#: src/view/com/modals/report/Modal.tsx:166 -#~ msgid "Report {collectionName}" -#~ msgstr "Denunciar {collectionName}" - #: src/view/com/profile/ProfileMenu.tsx:319 #: src/view/com/profile/ProfileMenu.tsx:322 msgid "Report Account" @@ -3773,7 +3459,7 @@ msgstr "Denunciar Conta" #: src/components/ReportDialog/index.tsx:49 msgid "Report dialog" -msgstr "" +msgstr "Janela de denúncia" #: src/view/screens/ProfileFeed.tsx:352 #: src/view/screens/ProfileFeed.tsx:354 @@ -3872,10 +3558,6 @@ msgstr "Código de redefinição" msgid "Reset Code" msgstr "Código de Redefinição" -#: src/view/screens/Settings/index.tsx:824 -#~ msgid "Reset onboarding" -#~ msgstr "Redefinir tutoriais" - #: src/view/screens/Settings/index.tsx:858 #: src/view/screens/Settings/index.tsx:861 msgid "Reset onboarding state" @@ -3885,10 +3567,6 @@ msgstr "Redefinir tutoriais" msgid "Reset password" msgstr "Redefinir senha" -#: src/view/screens/Settings/index.tsx:814 -#~ msgid "Reset preferences" -#~ msgstr "Redefinir configurações" - #: src/view/screens/Settings/index.tsx:848 #: src/view/screens/Settings/index.tsx:851 msgid "Reset preferences state" @@ -3923,10 +3601,6 @@ msgstr "Tenta a última ação, que deu erro" msgid "Retry" msgstr "Tente novamente" -#: src/view/com/auth/create/Step2.tsx:247 -#~ msgid "Retry." -#~ msgstr "Tentar novamente." - #: src/components/Error.tsx:86 #: src/view/screens/ProfileList.tsx:917 msgid "Return to previous page" @@ -4037,18 +3711,10 @@ msgstr "Pesquisar por \"{query}\"" msgid "Search for all posts by @{authorHandle} with tag {displayTag}" msgstr "Pesquisar por posts de @{authorHandle} com a tag {displayTag}" -#: src/components/TagMenu/index.tsx:145 -#~ msgid "Search for all posts by @{authorHandle} with tag {tag}" -#~ msgstr "Pesquisar por posts de @{authorHandle} com a tag {tag}" - #: src/components/TagMenu/index.tsx:94 msgid "Search for all posts with tag {displayTag}" msgstr "Pesquisar por posts com a tag {displayTag}" -#: src/components/TagMenu/index.tsx:90 -#~ msgid "Search for all posts with tag {tag}" -#~ msgstr "Pesquisar por posts com a tag {tag}" - #: src/view/com/auth/LoggedOut.tsx:105 #: src/view/com/auth/LoggedOut.tsx:106 #: src/view/com/modals/ListAddRemoveUsers.tsx:70 @@ -4075,14 +3741,6 @@ msgstr "Ver posts com <0>{displayTag}" msgid "See <0>{displayTag} posts by this user" msgstr "Ver posts com <0>{displayTag} deste usuário" -#: src/components/TagMenu/index.tsx:128 -#~ msgid "See <0>{tag} posts" -#~ msgstr "Ver posts com <0>{tag}" - -#: src/components/TagMenu/index.tsx:189 -#~ msgid "See <0>{tag} posts by this user" -#~ msgstr "Ver posts com <0>{tag} deste usuário" - #: src/view/screens/SavedFeeds.tsx:163 msgid "See this guide" msgstr "Veja o guia" @@ -4097,7 +3755,7 @@ msgstr "Selecionar {item}" #: src/screens/Login/ChooseAccountForm.tsx:61 msgid "Select account" -msgstr "" +msgstr "Selecione uma conta" #: src/screens/Login/index.tsx:120 msgid "Select from an existing account" @@ -4115,11 +3773,6 @@ msgstr "Selecionar moderador" msgid "Select option {i} of {numItems}" msgstr "Seleciona opção {i} de {numItems}" -#: src/view/com/auth/create/Step1.tsx:96 -#: src/view/com/auth/login/LoginForm.tsx:153 -#~ msgid "Select service" -#~ msgstr "Selecionar serviço" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:52 msgid "Select some accounts below to follow" msgstr "Selecione algumas contas para seguir" @@ -4144,17 +3797,13 @@ msgstr "Selecione o que você quer (ou não) ver, e cuidaremos do resto." msgid "Select which languages you want your subscribed feeds to include. If none are selected, all languages will be shown." msgstr "Selecione quais idiomas você deseja ver nos seus feeds. Se nenhum for selecionado, todos os idiomas serão exibidos." -#: src/view/screens/LanguageSettings.tsx:98 -#~ msgid "Select your app language for the default text to display in the app" -#~ msgstr "Selecione o idioma do seu aplicativo" - #: src/view/screens/LanguageSettings.tsx:98 msgid "Select your app language for the default text to display in the app." msgstr "Selecione o idioma do seu aplicativo" #: src/screens/Signup/StepInfo/index.tsx:133 msgid "Select your date of birth" -msgstr "" +msgstr "Selecione sua data de nascimento" #: src/screens/Onboarding/StepInterests/index.tsx:200 msgid "Select your interests from the options below" @@ -4196,10 +3845,6 @@ msgstr "Enviar comentários" msgid "Send report" msgstr "Denunciar" -#: src/view/com/modals/report/SendReportButton.tsx:45 -#~ msgid "Send Report" -#~ msgstr "Denunciar" - #: src/components/ReportDialog/SelectLabelerView.tsx:44 msgid "Send report to {0}" msgstr "Denunciar via {0}" @@ -4212,48 +3857,14 @@ msgstr "Envia o e-mail com o código de confirmação para excluir a conta" msgid "Server address" msgstr "URL do servidor" -#: src/view/com/modals/ContentFilteringSettings.tsx:311 -#~ msgid "Set {value} for {labelGroup} content moderation policy" -#~ msgstr "Definir {value} para o filtro de moderação {labelGroup}" - -#: src/view/com/modals/ContentFilteringSettings.tsx:160 -#: src/view/com/modals/ContentFilteringSettings.tsx:179 -#~ msgctxt "action" -#~ msgid "Set Age" -#~ msgstr "Definir Idade" - #: src/screens/Moderation/index.tsx:304 msgid "Set birthdate" msgstr "Definir data de nascimento" -#: src/view/screens/Settings/index.tsx:488 -#~ msgid "Set color theme to dark" -#~ msgstr "Definir o tema de cor para escuro" - -#: src/view/screens/Settings/index.tsx:481 -#~ msgid "Set color theme to light" -#~ msgstr "Definir o tema de cor para claro" - -#: src/view/screens/Settings/index.tsx:475 -#~ msgid "Set color theme to system setting" -#~ msgstr "Definir o tema para acompanhar o sistema" - -#: src/view/screens/Settings/index.tsx:514 -#~ msgid "Set dark theme to the dark theme" -#~ msgstr "Definir o tema escuro para o padrão" - -#: src/view/screens/Settings/index.tsx:507 -#~ msgid "Set dark theme to the dim theme" -#~ msgstr "Definir o tema escuro para a versão menos escura" - #: src/screens/Login/SetNewPasswordForm.tsx:102 msgid "Set new password" msgstr "Definir uma nova senha" -#: src/view/com/auth/create/Step1.tsx:202 -#~ msgid "Set password" -#~ msgstr "Definir senha" - #: src/view/screens/PreferencesFollowingFeed.tsx:225 msgid "Set this setting to \"No\" to hide all quote posts from your feed. Reposts will still be visible." msgstr "Defina esta configuração como \"Não\" para ocultar todas as citações do seu feed. Reposts ainda serão visíveis." @@ -4306,10 +3917,6 @@ msgstr "Define o tema escuro para o menos escuro" msgid "Sets email for password reset" msgstr "Configura o e-mail para recuperação de senha" -#: src/view/com/auth/login/ForgotPasswordForm.tsx:122 -#~ msgid "Sets hosting provider for password reset" -#~ msgstr "Configura o provedor de hospedagem para recuperação de senha" - #: src/view/com/modals/crop-image/CropImage.web.tsx:124 msgid "Sets image aspect ratio to square" msgstr "Define a proporção da imagem para quadrada" @@ -4322,11 +3929,6 @@ msgstr "Define a proporção da imagem para alta" msgid "Sets image aspect ratio to wide" msgstr "Define a proporção da imagem para comprida" -#: src/view/com/auth/create/Step1.tsx:97 -#: src/view/com/auth/login/LoginForm.tsx:154 -#~ msgid "Sets server for the Bluesky client" -#~ msgstr "Configura o servidor para o cliente do Bluesky" - #: src/Navigation.tsx:139 #: src/view/screens/Settings/index.tsx:313 #: src/view/shell/desktop/LeftNav.tsx:437 @@ -4371,11 +3973,11 @@ msgstr "Compartilhar feed" #: src/view/com/modals/LinkWarning.tsx:89 #: src/view/com/modals/LinkWarning.tsx:95 msgid "Share Link" -msgstr "" +msgstr "Compartilhar Link" #: src/view/com/modals/LinkWarning.tsx:92 msgid "Shares the linked website" -msgstr "" +msgstr "Compartilha o link" #: src/components/moderation/ContentHider.tsx:115 #: src/components/moderation/LabelPreference.tsx:136 @@ -4403,10 +4005,6 @@ msgstr "Mostrar rótulo" msgid "Show badge and filter from feeds" msgstr "Mostrar rótulo e filtrar dos feeds" -#: src/view/com/modals/EmbedConsent.tsx:87 -#~ msgid "Show embeds from {0}" -#~ msgstr "Mostrar anexos de {0}" - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:200 msgid "Show follows similar to {0}" msgstr "Mostrar usuários parecidos com {0}" @@ -4482,10 +4080,6 @@ msgstr "Mostrar aviso" msgid "Show warning and filter from feeds" msgstr "Mostrar aviso e filtrar dos feeds" -#: src/view/com/profile/ProfileHeader.tsx:462 -#~ msgid "Shows a list of users similar to this user." -#~ msgstr "Mostra uma lista de usuários parecidos com este" - #: src/view/com/post-thread/PostThreadFollowBtn.tsx:130 msgid "Shows posts from {0} in your feed" msgstr "Mostra posts de {0} no seu feed" @@ -4511,12 +4105,6 @@ msgstr "Mostra posts de {0} no seu feed" msgid "Sign in" msgstr "Fazer login" -#: src/view/com/auth/HomeLoggedOutCTA.tsx:82 -#: src/view/com/auth/SplashScreen.tsx:86 -#: src/view/com/auth/SplashScreen.web.tsx:91 -#~ msgid "Sign In" -#~ msgstr "Fazer Login" - #: src/components/AccountList.tsx:109 msgid "Sign in as {0}" msgstr "Fazer login como {0}" @@ -4525,10 +4113,6 @@ msgstr "Fazer login como {0}" msgid "Sign in as..." msgstr "Fazer login como..." -#: src/view/com/auth/login/LoginForm.tsx:140 -#~ msgid "Sign into" -#~ msgstr "Fazer login" - #: src/view/screens/Settings/index.tsx:107 #: src/view/screens/Settings/index.tsx:110 msgid "Sign out" @@ -4563,10 +4147,6 @@ msgstr "Entrou como" msgid "Signed in as @{0}" msgstr "autenticado como @{0}" -#: src/view/com/modals/SwitchAccount.tsx:70 -#~ msgid "Signs {0} out of Bluesky" -#~ msgstr "Desloga a conta {0}" - #: src/screens/Onboarding/StepInterests/index.tsx:239 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:203 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:35 @@ -4581,24 +4161,12 @@ msgstr "Pular" msgid "Software Dev" msgstr "Desenvolvimento de software" -#: src/view/com/modals/ProfilePreview.tsx:62 -#~ msgid "Something went wrong and we're not sure what." -#~ msgstr "Algo deu errado e meio que não sabemos o que houve." - #: src/components/ReportDialog/index.tsx:59 #: src/screens/Moderation/index.tsx:114 #: src/screens/Profile/Sections/Labels.tsx:76 msgid "Something went wrong, please try again." msgstr "Algo deu errado. Por favor, tente novamente." -#: src/components/Lists.tsx:203 -#~ msgid "Something went wrong!" -#~ msgstr "Algo deu errado!" - -#: src/view/com/modals/Waitlist.tsx:51 -#~ msgid "Something went wrong. Check your email and try again." -#~ msgstr "Algo deu errado. Verifique seu e-mail e tente novamente." - #: src/App.native.tsx:66 msgid "Sorry! Your session expired. Please log in again." msgstr "Opa! Sua sessão expirou. Por favor, entre novamente." @@ -4637,11 +4205,7 @@ msgstr "Página de status" #: src/screens/Signup/index.tsx:142 msgid "Step" -msgstr "" - -#: src/view/com/auth/create/StepHeader.tsx:22 -#~ msgid "Step {0} of {numSteps}" -#~ msgstr "Passo {0} de {numSteps}" +msgstr "Passo" #: src/view/screens/Settings/index.tsx:292 msgid "Storage cleared, you need to restart the app now." @@ -4729,10 +4293,6 @@ msgstr "tag" msgid "Tag menu: {displayTag}" msgstr "Menu da tag: {displayTag}" -#: src/components/TagMenu/index.tsx:74 -#~ msgid "Tag menu: {tag}" -#~ msgstr "Menu da tag: {tag}" - #: src/view/com/modals/crop-image/CropImage.web.tsx:113 msgid "Tall" msgstr "Alto" @@ -4956,10 +4516,6 @@ msgstr "Este conteúdo não está disponível porque um dos usuários bloqueou o msgid "This content is not viewable without a Bluesky account." msgstr "Este conteúdo não é visível sem uma conta do Bluesky." -#: src/view/screens/Settings/ExportCarDialog.tsx:75 -#~ msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." -#~ msgstr "Esta funcionalidade está em beta. Você pode ler mais sobre exportação de repositórios <0>neste post do nosso blog." - #: src/view/screens/Settings/ExportCarDialog.tsx:75 msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." msgstr "Esta funcionalidade está em beta. Você pode ler mais sobre exportação de repositórios <0>neste post do nosso blog." @@ -5048,14 +4604,6 @@ msgstr "Este usuário te bloqueou. Você não pode ver este conteúdo." msgid "This user has requested that their content only be shown to signed-in users." msgstr "Este usuário requisitou que seu conteúdo só seja visível para usuários autenticados." -#: src/view/com/modals/ModerationDetails.tsx:42 -#~ msgid "This user is included in the <0/> list which you have blocked." -#~ msgstr "Este usuário está incluído na lista <0/>, que você bloqueou." - -#: src/view/com/modals/ModerationDetails.tsx:74 -#~ msgid "This user is included in the <0/> list which you have muted." -#~ msgstr "Este usuário está incluído na lista <0/>, que você silenciou." - #: src/components/moderation/ModerationDetailsDialog.tsx:55 msgid "This user is included in the <0>{0} list which you have blocked." msgstr "Este usuário está incluído na lista <0>{0}, que você bloqueou." @@ -5076,10 +4624,6 @@ msgstr "Este aviso só está disponível para publicações com mídia anexada." msgid "This will delete {0} from your muted words. You can always add it back later." msgstr "Isso removerá {0} das suas palavras silenciadas. Você pode adicioná-la novamente depois." -#: src/view/com/util/forms/PostDropdownBtn.tsx:282 -#~ msgid "This will hide this post from your feeds." -#~ msgstr "Isso ocultará este post de seus feeds." - #: src/view/screens/Settings/index.tsx:574 msgid "Thread preferences" msgstr "Preferências das Threads" @@ -5198,10 +4742,6 @@ msgstr "Deixar de seguir {0}" msgid "Unfollow Account" msgstr "Deixar de seguir" -#: src/view/com/auth/create/state.ts:262 -#~ msgid "Unfortunately, you do not meet the requirements to create an account." -#~ msgstr "Infelizmente, você não atende aos requisitos para criar uma conta." - #: src/view/com/util/post-ctrls/PostCtrls.tsx:195 msgid "Unlike" msgstr "Descurtir" @@ -5228,10 +4768,6 @@ msgstr "Dessilenciar conta" msgid "Unmute all {displayTag} posts" msgstr "Dessilenciar posts com {displayTag}" -#: src/components/TagMenu/index.tsx:210 -#~ msgid "Unmute all {tag} posts" -#~ msgstr "Dessilenciar posts com {tag}" - #: src/view/com/util/forms/PostDropdownBtn.tsx:251 #: src/view/com/util/forms/PostDropdownBtn.tsx:256 msgid "Unmute thread" @@ -5250,10 +4786,6 @@ msgstr "Desafixar da tela inicial" msgid "Unpin moderation list" msgstr "Desafixar lista de moderação" -#: src/view/screens/ProfileFeed.tsx:346 -#~ msgid "Unsave" -#~ msgstr "Remover" - #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:219 msgid "Unsubscribe" msgstr "Desinscrever-se" @@ -5270,10 +4802,6 @@ msgstr "Conteúdo Sexual Indesejado" msgid "Update {displayName} in Lists" msgstr "Atualizar {displayName} nas Listas" -#: src/lib/hooks/useOTAUpdate.ts:15 -#~ msgid "Update Available" -#~ msgstr "Atualização Disponível" - #: src/view/com/modals/ChangeHandle.tsx:508 msgid "Update to {handle}" msgstr "Alterar para {handle}" @@ -5364,10 +4892,6 @@ msgstr "Usuário Bloqueia Você" msgid "User Blocks You" msgstr "Este Usuário Te Bloqueou" -#: src/view/com/auth/create/Step2.tsx:79 -#~ msgid "User handle" -#~ msgstr "Usuário" - #: src/view/com/lists/ListCard.tsx:85 #: src/view/com/modals/UserAddRemoveLists.tsx:198 msgid "User list by {0}" @@ -5446,7 +4970,7 @@ msgstr "Verificar Seu E-mail" #: src/view/screens/Settings/index.tsx:893 msgid "Version {0}" -msgstr "" +msgstr "Versão {0}" #: src/screens/Onboarding/index.tsx:42 msgid "Video Games" @@ -5512,10 +5036,6 @@ msgstr "Avisar" msgid "Warn content and filter from feeds" msgstr "Avisar e filtrar dos feeds" -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:134 -#~ msgid "We also think you'll like \"For You\" by Skygaze:" -#~ msgstr "Também recomendamos o \"For You\", do Skygaze:" - #: src/screens/Hashtag.tsx:133 msgid "We couldn't find any results for that hashtag." msgstr "Não encontramos nenhum post com esta hashtag." @@ -5532,10 +5052,6 @@ msgstr "Esperamos que você se divirta. Lembre-se, o Bluesky é:" msgid "We ran out of posts from your follows. Here's the latest from <0/>." msgstr "Não temos mais posts de quem você segue. Aqui estão os mais novos de <0/>." -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:118 -#~ msgid "We recommend \"For You\" by Skygaze:" -#~ msgstr "Recomendamos o \"Para você\", do Skygaze:" - #: src/components/dialogs/MutedWords.tsx:203 msgid "We recommend avoiding common words that appear in many posts, since it can result in no posts being shown." msgstr "Não recomendamos utilizar palavras comuns que aparecem em muitos posts, já que isso pode resultar em filtrar todos eles." @@ -5560,10 +5076,6 @@ msgstr "Não conseguimos conectar. Por favor, tente novamente para continuar con msgid "We will let you know when your account is ready." msgstr "Avisaremos quando sua conta estiver pronta." -#: src/view/com/modals/AppealLabel.tsx:48 -#~ msgid "We'll look into your appeal promptly." -#~ msgstr "Avaliaremos sua contestação o quanto antes." - #: src/screens/Onboarding/StepInterests/index.tsx:142 msgid "We'll use this to help customize your experience." msgstr "Usaremos isto para customizar a sua experiência." @@ -5601,10 +5113,6 @@ msgstr "Bem-vindo ao <0>Bluesky" msgid "What are your interests?" msgstr "Do que você gosta?" -#: src/view/com/modals/report/Modal.tsx:169 -#~ msgid "What is the issue with this {collectionName}?" -#~ msgstr "Qual é o problema com este {collectionName}?" - #: src/view/com/auth/SplashScreen.tsx:58 #: src/view/com/auth/SplashScreen.web.tsx:84 #: src/view/com/composer/Composer.tsx:296 @@ -5747,10 +5255,6 @@ msgstr "Você silenciou esta conta." msgid "You have muted this user" msgstr "Você silenciou este usuário." -#: src/view/com/modals/ModerationDetails.tsx:87 -#~ msgid "You have muted this user." -#~ msgstr "Você silenciou este usuário." - #: src/view/com/feeds/ProfileFeedgens.tsx:136 msgid "You have no feeds." msgstr "Você não tem feeds." @@ -5764,10 +5268,6 @@ msgstr "Você não tem listas." msgid "You have not blocked any accounts yet. To block an account, go to their profile and select \"Block account\" from the menu on their account." msgstr "Você ainda não bloqueou nenhuma conta. Para bloquear uma conta, acesse um perfil e selecione \"Bloquear conta\" no menu." -#: src/view/screens/ModerationBlockedAccounts.tsx:132 -#~ msgid "You have not blocked any accounts yet. To block an account, go to their profile and selected \"Block account\" from the menu on their account." -#~ msgstr "Você ainda não bloqueou nenhuma conta. Para bloquear uma conta, acesse um perfil e selecione \"Bloquear conta\" no menu." - #: src/view/screens/AppPasswords.tsx:89 msgid "You have not created any app passwords yet. You can create one by pressing the button below." msgstr "Você ainda não criou nenhuma senha de aplicativo. Você pode criar uma pressionando o botão abaixo." @@ -5776,10 +5276,6 @@ msgstr "Você ainda não criou nenhuma senha de aplicativo. Você pode criar uma msgid "You have not muted any accounts yet. To mute an account, go to their profile and select \"Mute account\" from the menu on their account." msgstr "Você ainda não silenciou nenhuma conta. Para silenciar uma conta, acesse um perfil e selecione \"Silenciar conta\" no menu." -#: src/view/screens/ModerationMutedAccounts.tsx:131 -#~ msgid "You have not muted any accounts yet. To mute an account, go to their profile and selected \"Mute account\" from the menu on their account." -#~ msgstr "Você ainda não silenciou nenhuma conta. Para silenciar uma conta, acesse um perfil e selecione \"Silenciar conta\" no menu." - #: src/components/dialogs/MutedWords.tsx:249 msgid "You haven't muted any words or tags yet" msgstr "Você não silenciou nenhuma palavra ou tag ainda" @@ -5790,11 +5286,7 @@ msgstr "Você pode contestar estes rótulos se você acha que estão errados." #: src/screens/Signup/StepInfo/Policies.tsx:79 msgid "You must be 13 years of age or older to sign up." -msgstr "" - -#: src/view/com/modals/ContentFilteringSettings.tsx:175 -#~ msgid "You must be 18 or older to enable adult content." -#~ msgstr "Você precisa ser maior de idade para habilitar conteúdo adulto." +msgstr "Você precisa ter no mínimo 13 anos de idade para se cadastrar." #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:110 msgid "You must be 18 years or older to enable adult content" @@ -5869,10 +5361,6 @@ msgstr "Seu feed inicial é o \"Seguindo\"" msgid "Your email appears to be invalid." msgstr "Seu e-mail parece ser inválido." -#: src/view/com/modals/Waitlist.tsx:109 -#~ msgid "Your email has been saved! We'll be in touch soon." -#~ msgstr "Seu e-mail foi salvo! Logo entraremos em contato." - #: src/view/com/modals/ChangeEmail.tsx:125 msgid "Your email has been updated but not verified. As a next step, please verify your new email." msgstr "Seu e-mail foi atualizado mas não foi verificado. Como próximo passo, por favor verifique seu novo e-mail." @@ -5893,12 +5381,6 @@ msgstr "Seu identificador completo será" msgid "Your full handle will be <0>@{0}" msgstr "Seu usuário completo será <0>@{0}" -#: src/view/screens/Settings.tsx:430 -#: src/view/shell/desktop/RightNav.tsx:137 -#: src/view/shell/Drawer.tsx:660 -#~ msgid "Your invite codes are hidden when logged in using an App Password" -#~ msgstr "Seus códigos de convite estão ocultos quando conectado com uma Senha do Aplicativo" - #: src/components/dialogs/MutedWords.tsx:220 msgid "Your muted words" msgstr "Suas palavras silenciadas" From aa1d4d4e266495957137394557336155ac43c08f Mon Sep 17 00:00:00 2001 From: imbstt <83777889+imbstt@users.noreply.github.com> Date: Fri, 12 Apr 2024 23:48:08 +0200 Subject: [PATCH 045/185] Update German translations (#3466) * Change occurrences of "likt" to "liked" * Improve existing German translations * Translate new strings for German translation * Apply suggestions from code review Co-authored-by: Felix Siebeneicker --------- Co-authored-by: Felix Siebeneicker --- src/locale/locales/de/messages.po | 180 +++++++++++++++--------------- 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/src/locale/locales/de/messages.po b/src/locale/locales/de/messages.po index 28fd2256b6..8674b2a8d5 100644 --- a/src/locale/locales/de/messages.po +++ b/src/locale/locales/de/messages.po @@ -100,11 +100,11 @@ msgstr "Konto stummgeschaltet" #: src/components/moderation/ModerationDetailsDialog.tsx:93 #: src/lib/moderation/useModerationCauseDescription.ts:91 msgid "Account Muted" -msgstr "Konto Stummgeschaltet" +msgstr "Konto stummgeschaltet" #: src/components/moderation/ModerationDetailsDialog.tsx:82 msgid "Account Muted by List" -msgstr "Konto stummgeschaltet nach Liste" +msgstr "Konto stummgeschaltet gemäß Liste" #: src/view/com/util/AccountDropdownBtn.tsx:41 msgid "Account options" @@ -121,11 +121,11 @@ msgstr "Konto entblockiert" #: src/view/com/profile/ProfileMenu.tsx:166 msgid "Account unfollowed" -msgstr "" +msgstr "Konto entfolgt" #: src/view/com/profile/ProfileMenu.tsx:102 msgid "Account unmuted" -msgstr "Konto Stummschaltung aufgehoben" +msgstr "Stummschaltung für Konto aufgehoben" #: src/components/dialogs/MutedWords.tsx:164 #: src/view/com/auth/onboarding/RecommendedFeedsItem.tsx:150 @@ -270,7 +270,7 @@ msgstr "Eine E-Mail wurde an deine vorherige Adresse {0} gesendet. Sie enthält #: src/lib/moderation/useReportOptions.ts:26 msgid "An issue not included in these options" -msgstr "" +msgstr "Ein Problem, das hier nicht aufgelistet ist" #: src/view/com/profile/FollowButton.tsx:35 #: src/view/com/profile/FollowButton.tsx:45 @@ -290,7 +290,7 @@ msgstr "Tiere" #: src/lib/moderation/useReportOptions.ts:31 msgid "Anti-Social Behavior" -msgstr "" +msgstr "Asoziales Verhalten" #: src/view/screens/LanguageSettings.tsx:95 msgid "App Language" @@ -325,7 +325,7 @@ msgstr "" #: src/components/moderation/LabelsOnMeDialog.tsx:201 msgid "Appeal \"{0}\" label" -msgstr "" +msgstr "Kennzeichnung \"{0}\" anfechten" #: src/view/com/util/forms/PostDropdownBtn.tsx:337 #: src/view/com/util/forms/PostDropdownBtn.tsx:346 @@ -338,7 +338,7 @@ msgstr "" #: src/components/moderation/LabelsOnMeDialog.tsx:192 msgid "Appeal submitted." -msgstr "" +msgstr "Anfechtung abgeschickt." #: src/view/com/util/moderation/LabelInfo.tsx:52 #~ msgid "Appeal this decision" @@ -358,7 +358,7 @@ msgstr "Bist du sicher, dass du das App-Passwort \"{name}\" löschen möchtest?" #: src/view/com/feeds/FeedSourceCard.tsx:280 msgid "Are you sure you want to remove {0} from your feeds?" -msgstr "" +msgstr "Bist du sicher, dass du {0} von deinen Feeds entfernen möchtest?" #: src/view/com/composer/Composer.tsx:509 msgid "Are you sure you'd like to discard this draft?" @@ -386,7 +386,7 @@ msgstr "Künstlerische oder nicht-erotische Nacktheit." #: src/screens/Signup/StepHandle.tsx:118 msgid "At least 3 characters" -msgstr "" +msgstr "Mindestens 3 Zeichen" #: src/components/moderation/LabelsOnMeDialog.tsx:246 #: src/components/moderation/LabelsOnMeDialog.tsx:247 @@ -428,7 +428,7 @@ msgstr "Geburtstag:" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:287 #: src/view/com/profile/ProfileMenu.tsx:361 msgid "Block" -msgstr "" +msgstr "Blockieren" #: src/view/com/profile/ProfileMenu.tsx:300 #: src/view/com/profile/ProfileMenu.tsx:307 @@ -437,7 +437,7 @@ msgstr "Konto blockieren" #: src/view/com/profile/ProfileMenu.tsx:344 msgid "Block Account?" -msgstr "" +msgstr "Konto blockieren?" #: src/view/screens/ProfileList.tsx:530 msgid "Block accounts" @@ -480,19 +480,19 @@ msgstr "Blockierte Konten können nicht in deinen Threads antworten, dich erwäh #: src/view/com/post-thread/PostThread.tsx:313 msgid "Blocked post." -msgstr "Gesperrter Beitrag." +msgstr "Blockierter Beitrag." #: src/screens/Profile/Sections/Labels.tsx:152 msgid "Blocking does not prevent this labeler from placing labels on your account." -msgstr "" +msgstr "Blockieren hindert diesen Kennzeichnungsdienst nicht daran, Kennzeichnungen zu deinem Konto hinzuzufügen." #: src/view/screens/ProfileList.tsx:631 msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." -msgstr "Die Sperrung ist öffentlich. Gesperrte Konten können nicht in deinen Threads antworten, dich erwähnen oder anderweitig mit dir interagieren." +msgstr "Die Blockierung ist öffentlich. Blockierte Konten können nicht in deinen Threads antworten, dich erwähnen oder anderweitig mit dir interagieren." #: src/view/com/profile/ProfileMenu.tsx:353 msgid "Blocking will not prevent labels from being applied on your account, but it will stop this account from replying in your threads or interacting with you." -msgstr "" +msgstr "Blockieren verhindert nicht, dass Kennzeichnungen zu deinem Konto hinzugefügt werden, verhindert aber, dass dieses Konto in deinen Threads antworten oder interagieren kann." #: src/view/com/auth/HomeLoggedOutCTA.tsx:98 #: src/view/com/auth/SplashScreen.web.tsx:169 @@ -530,11 +530,11 @@ msgstr "Bluesky zeigt dein Profil und deine Beiträge nicht für abgemeldete Nut #: src/lib/moderation/useLabelBehaviorDescription.ts:53 msgid "Blur images" -msgstr "" +msgstr "Bilder verwischen" #: src/lib/moderation/useLabelBehaviorDescription.ts:51 msgid "Blur images and filter from feeds" -msgstr "" +msgstr "Bilder verwischen und aus Feeds herausfiltern" #: src/screens/Onboarding/index.tsx:33 msgid "Books" @@ -559,7 +559,7 @@ msgstr "von {0}" #: src/components/LabelingServiceCard/index.tsx:57 msgid "By {0}" -msgstr "" +msgstr "Von {0}" #: src/view/com/profile/ProfileSubpageHeader.tsx:161 msgid "by <0/>" @@ -567,7 +567,7 @@ msgstr "von <0/>" #: src/screens/Signup/StepInfo/Policies.tsx:74 msgid "By creating an account you agree to the {els}." -msgstr "" +msgstr "Mit dem Erstellen des Kontos akzeptierst du die {els}." #: src/view/com/profile/ProfileSubpageHeader.tsx:159 msgid "by you" @@ -869,11 +869,11 @@ msgstr "Inhaltsfilterungseinstellung der Kategorie {0} konfigurieren" #: src/components/moderation/LabelPreference.tsx:81 msgid "Configure content filtering setting for category: {name}" -msgstr "" +msgstr "Konfiguriere die Inhaltsfilterung für die Kategorie: {name}" #: src/components/moderation/LabelPreference.tsx:244 msgid "Configured in <0>moderation settings." -msgstr "" +msgstr "Konfiguriert in <0>Moderationseinstellungen" #: src/components/Prompt.tsx:153 #: src/components/Prompt.tsx:156 @@ -910,11 +910,11 @@ msgstr "Bestätige das Löschen des Kontos" #: src/screens/Moderation/index.tsx:301 msgid "Confirm your age:" -msgstr "" +msgstr "Bestätige dein Alter:" #: src/screens/Moderation/index.tsx:292 msgid "Confirm your birthdate" -msgstr "" +msgstr "Bestätige dein Geburtsdatum" #: src/view/com/modals/ChangeEmail.tsx:157 #: src/view/com/modals/DeleteAccount.tsx:175 @@ -937,7 +937,7 @@ msgstr "" #: src/lib/moderation/useGlobalLabelStrings.ts:18 msgid "Content Blocked" -msgstr "" +msgstr "Inhalt blockiert" #: src/view/screens/Moderation.tsx:83 #~ msgid "Content filtering" @@ -949,7 +949,7 @@ msgstr "" #: src/screens/Moderation/index.tsx:285 msgid "Content filters" -msgstr "" +msgstr "Inhaltsfilterung" #: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:74 #: src/view/screens/LanguageSettings.tsx:278 @@ -974,7 +974,7 @@ msgstr "Inhaltswarnungen" #: src/components/Menu/index.web.tsx:84 msgid "Context menu backdrop, click to close the menu." -msgstr "" +msgstr "Hintergrund des Kontextmenüs, klicken, um das Menü zu schließen" #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:161 #: src/screens/Onboarding/StepFollowingFeed.tsx:154 @@ -989,7 +989,7 @@ msgstr "Fortfahren" #: src/components/AccountList.tsx:108 msgid "Continue as {0} (currently signed in)" -msgstr "" +msgstr "Fortfahren mit {0} (aktuell angemeldet)" #: src/screens/Onboarding/StepFollowingFeed.tsx:151 #: src/screens/Onboarding/StepInterests/index.tsx:249 @@ -1037,7 +1037,7 @@ msgstr "Kopieren" #: src/view/com/modals/ChangeHandle.tsx:480 msgid "Copy {0}" -msgstr "" +msgstr "{} kopieren" #: src/view/screens/ProfileList.tsx:388 msgid "Copy link to list" @@ -1096,7 +1096,7 @@ msgstr "Neues Konto erstellen" #: src/components/ReportDialog/SelectReportOptionView.tsx:93 msgid "Create report for {0}" -msgstr "" +msgstr "Meldung für {0} erstellen" #: src/view/screens/AppPasswords.tsx:246 msgid "Created {0}" @@ -1165,7 +1165,7 @@ msgstr "Debug-Panel" #: src/view/screens/AppPasswords.tsx:268 #: src/view/screens/ProfileList.tsx:613 msgid "Delete" -msgstr "" +msgstr "Löschen" #: src/view/screens/Settings/index.tsx:796 msgid "Delete account" @@ -1181,7 +1181,7 @@ msgstr "App-Passwort löschen" #: src/view/screens/AppPasswords.tsx:263 msgid "Delete app password?" -msgstr "" +msgstr "App-Passwort löschen?" #: src/view/screens/ProfileList.tsx:415 msgid "Delete List" @@ -1202,7 +1202,7 @@ msgstr "Beitrag löschen" #: src/view/screens/ProfileList.tsx:608 msgid "Delete this list?" -msgstr "" +msgstr "Diese Liste löschen?" #: src/view/com/util/forms/PostDropdownBtn.tsx:314 msgid "Delete this post?" @@ -1236,7 +1236,7 @@ msgstr "Dimmen" #: src/lib/moderation/useLabelBehaviorDescription.ts:68 #: src/screens/Moderation/index.tsx:341 msgid "Disabled" -msgstr "" +msgstr "Deaktiviert" #: src/view/com/composer/Composer.tsx:511 msgid "Discard" @@ -1248,7 +1248,7 @@ msgstr "Verwerfen" #: src/view/com/composer/Composer.tsx:508 msgid "Discard draft?" -msgstr "" +msgstr "Entwurf löschen?" #: src/screens/Moderation/index.tsx:518 #: src/screens/Moderation/index.tsx:522 @@ -1278,11 +1278,11 @@ msgstr "" #: src/lib/moderation/useGlobalLabelStrings.ts:39 msgid "Does not include nudity." -msgstr "" +msgstr "Beinhaltet keine Nacktheit." #: src/screens/Signup/StepHandle.tsx:104 msgid "Doesn't begin or end with a hyphen" -msgstr "" +msgstr "Beginnt oder endet nicht mit einem Bindestrich" #: src/view/com/modals/ChangeHandle.tsx:481 msgid "Domain Value" @@ -1350,7 +1350,7 @@ msgstr "Aufgrund der Apple-Richtlinien können Inhalte für Erwachsene erst nach #: src/view/com/modals/ChangeHandle.tsx:258 msgid "e.g. alice" -msgstr "" +msgstr "z.B. alice" #: src/view/com/modals/EditProfile.tsx:186 msgid "e.g. Alice Roberts" @@ -1358,7 +1358,7 @@ msgstr "z.B. Alice Roberts" #: src/view/com/modals/ChangeHandle.tsx:380 msgid "e.g. alice.com" -msgstr "" +msgstr "z.B. alice.com" #: src/view/com/modals/EditProfile.tsx:204 msgid "e.g. Artist, dog-lover, and avid reader." @@ -1366,11 +1366,11 @@ msgstr "z.B. Künstlerin, Hundeliebhaberin und begeisterte Leserin." #: src/lib/moderation/useGlobalLabelStrings.ts:43 msgid "E.g. artistic nudes." -msgstr "" +msgstr "Z.B. künstlerische Nacktheit" #: src/view/com/modals/CreateOrEditList.tsx:284 msgid "e.g. Great Posters" -msgstr "z.B. Große Poster" +msgstr "z.B. Großartige Poster" #: src/view/com/modals/CreateOrEditList.tsx:285 msgid "e.g. Spammers" @@ -1396,7 +1396,7 @@ msgstr "Bearbeiten" #: src/view/com/util/UserAvatar.tsx:299 #: src/view/com/util/UserBanner.tsx:85 msgid "Edit avatar" -msgstr "" +msgstr "Avatar bearbeiten" #: src/view/com/composer/photos/Gallery.tsx:144 #: src/view/com/modals/EditImage.tsx:208 @@ -1484,7 +1484,7 @@ msgstr "Nur {0} aktivieren" #: src/screens/Moderation/index.tsx:329 msgid "Enable adult content" -msgstr "" +msgstr "Inhalte für Erwachsene aktivieren" #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:94 msgid "Enable Adult Content" @@ -1498,7 +1498,7 @@ msgstr "Aktiviere Inhalte für Erwachsene in deinen Feeds" #: src/components/dialogs/EmbedConsent.tsx:82 #: src/components/dialogs/EmbedConsent.tsx:89 msgid "Enable external media" -msgstr "" +msgstr "Externe Medien aktivieren" #: src/view/com/modals/EmbedConsent.tsx:97 #~ msgid "Enable External Media" @@ -1514,11 +1514,11 @@ msgstr "Aktiviere diese Einstellung, um nur Antworten von Personen zu sehen, den #: src/components/dialogs/EmbedConsent.tsx:94 msgid "Enable this source only" -msgstr "" +msgstr "Nur von dieser Seite erlauben" #: src/screens/Moderation/index.tsx:339 msgid "Enabled" -msgstr "" +msgstr "Aktiviert" #: src/screens/Profile/Sections/Feed.tsx:84 msgid "End of feed" @@ -1530,7 +1530,7 @@ msgstr "Gebe einen Namen für dieses App-Passwort ein" #: src/screens/Login/SetNewPasswordForm.tsx:139 msgid "Enter a password" -msgstr "" +msgstr "Gib ein Passwort ein" #: src/components/dialogs/MutedWords.tsx:99 #: src/components/dialogs/MutedWords.tsx:100 @@ -1588,28 +1588,28 @@ msgstr "Alle" #: src/lib/moderation/useReportOptions.ts:66 msgid "Excessive mentions or replies" -msgstr "" +msgstr "Übermäßig viele Erwähnungen oder Antworten" #: src/view/com/modals/DeleteAccount.tsx:230 msgid "Exits account deletion process" -msgstr "" +msgstr "Verlässt den Vorgang der Accountlöschung" #: src/view/com/modals/ChangeHandle.tsx:151 msgid "Exits handle change process" -msgstr "Beendet den Prozess des Handle-Wechsels" +msgstr "Verlässt den Vorgang des Handle-Wechsels" #: src/view/com/modals/crop-image/CropImage.web.tsx:136 msgid "Exits image cropping process" -msgstr "" +msgstr "Verlässt den Vorgang des Bildzuschneidens" #: src/view/com/lightbox/Lightbox.web.tsx:130 msgid "Exits image view" -msgstr "Beendet die Bildansicht" +msgstr "Verlässt die Bildansicht" #: src/view/com/modals/ListAddRemoveUsers.tsx:88 #: src/view/shell/desktop/Search.tsx:236 msgid "Exits inputting search query" -msgstr "Beendet die Eingabe der Suchanfrage" +msgstr "Verlässt die Eingabe der Suchanfrage" #: src/view/com/lightbox/Lightbox.web.tsx:183 msgid "Expand alt text" @@ -1677,7 +1677,7 @@ msgstr "Empfohlene Feeds konnten nicht geladen werden" #: src/view/com/lightbox/Lightbox.tsx:83 msgid "Failed to save image: {0}" -msgstr "" +msgstr "Das Speichern des Bildes ist fehlgeschlagen: {0}" #: src/Navigation.tsx:196 msgid "Feed" @@ -1721,11 +1721,11 @@ msgstr "Die Feeds können auch auf einem Thema basieren!" #: src/view/com/modals/ChangeHandle.tsx:481 msgid "File Contents" -msgstr "" +msgstr "Dateiinhalt" #: src/lib/moderation/useLabelBehaviorDescription.ts:66 msgid "Filter from feeds" -msgstr "" +msgstr "Aus Feeds filtern" #: src/screens/Onboarding/StepFinished.tsx:155 msgid "Finalizing" @@ -1796,7 +1796,7 @@ msgstr "{0} folgen" #: src/view/com/profile/ProfileMenu.tsx:242 #: src/view/com/profile/ProfileMenu.tsx:253 msgid "Follow Account" -msgstr "" +msgstr "Accounts folgen" #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:187 msgid "Follow All" @@ -1804,7 +1804,7 @@ msgstr "Allen folgen" #: src/view/com/post-thread/PostThreadFollowBtn.tsx:144 msgid "Follow Back" -msgstr "" +msgstr "Zurückfolgen" #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:182 msgid "Follow selected accounts and continue to the next step" @@ -1893,15 +1893,15 @@ msgstr "Passwort vergessen" #: src/screens/Login/LoginForm.tsx:201 msgid "Forgot password?" -msgstr "" +msgstr "Passwort vergessen?" #: src/screens/Login/LoginForm.tsx:212 msgid "Forgot?" -msgstr "" +msgstr "Vergessen?" #: src/lib/moderation/useReportOptions.ts:52 msgid "Frequently Posts Unwanted Content" -msgstr "" +msgstr "Postet oft unerwünschte Inhalte" #: src/screens/Hashtag.tsx:109 #: src/screens/Hashtag.tsx:149 @@ -1924,7 +1924,7 @@ msgstr "Los geht's" #: src/lib/moderation/useReportOptions.ts:37 msgid "Glaring violations of law or terms of service" -msgstr "" +msgstr "Eklatante Verstöße gegen Gesetze oder Nutzungsbedingungen" #: src/components/moderation/ScreenHider.tsx:151 #: src/components/moderation/ScreenHider.tsx:160 @@ -2134,11 +2134,11 @@ msgstr "" #: src/view/screens/ProfileList.tsx:610 msgid "If you delete this list, you won't be able to recover it." -msgstr "" +msgstr "Wenn du diese Liste löschst, kannst du sie nicht wiederherstellen." #: src/view/com/util/forms/PostDropdownBtn.tsx:316 msgid "If you remove this post, you won't be able to recover it." -msgstr "" +msgstr "Wenn du diesen Post löschst, kannst du ihn nicht wiederherstellen." #: src/view/com/modals/ChangePassword.tsx:148 msgid "If you want to change your password, we will send you a code to verify that this is your account." @@ -2146,7 +2146,7 @@ msgstr "Wenn du dein Passwort ändern möchtest, senden wir dir einen Code, um z #: src/lib/moderation/useReportOptions.ts:36 msgid "Illegal and Urgent" -msgstr "" +msgstr "Illegal und dringend" #: src/view/com/util/images/Gallery.tsx:38 msgid "Image" @@ -2380,35 +2380,35 @@ msgstr "Diesen Feed liken" #: src/Navigation.tsx:201 #: src/Navigation.tsx:206 msgid "Liked by" -msgstr "Gelikt von" +msgstr "Geliked von" #: src/screens/Profile/ProfileLabelerLikedBy.tsx:29 #: src/view/screens/PostLikedBy.tsx:27 #: src/view/screens/ProfileFeedLikedBy.tsx:27 msgid "Liked By" -msgstr "Gelikt von" +msgstr "Geliked von" #: src/view/com/feeds/FeedSourceCard.tsx:268 msgid "Liked by {0} {1}" -msgstr "Von {0} {1} gelikt" +msgstr "Von {0} {1} geliked" #: src/components/LabelingServiceCard/index.tsx:72 msgid "Liked by {count} {0}" -msgstr "" +msgstr "Geliked von {count} {0}" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:278 #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:292 #: src/view/screens/ProfileFeed.tsx:588 msgid "Liked by {likeCount} {0}" -msgstr "Von {likeCount} {0} gelikt" +msgstr "Von {likeCount} {0} geliked" #: src/view/com/notifications/FeedItem.tsx:174 msgid "liked your custom feed" -msgstr "hat deinen benutzerdefinierten Feed gelikt" +msgstr "hat deinen benutzerdefinierten Feed geliked" #: src/view/com/notifications/FeedItem.tsx:159 msgid "liked your post" -msgstr "hat deinen Beitrag gelikt" +msgstr "hat deinen Beitrag geliked" #: src/view/screens/Profile.tsx:193 msgid "Likes" @@ -2424,7 +2424,7 @@ msgstr "Liste" #: src/view/com/modals/CreateOrEditList.tsx:262 msgid "List Avatar" -msgstr "Avatar auflisten" +msgstr "Listenbild" #: src/view/screens/ProfileList.tsx:311 msgid "List blocked" @@ -2504,7 +2504,7 @@ msgstr "Anmeldung bei einem Konto, das nicht aufgelistet ist" #: src/screens/Login/SetNewPasswordForm.tsx:116 msgid "Looks like XXXXX-XXXXX" -msgstr "" +msgstr "Im Format XXXXX-XXXXX" #: src/view/com/modals/LinkWarning.tsx:79 msgid "Make sure this is where you intend to go!" @@ -2545,7 +2545,7 @@ msgstr "Nachricht vom Server: {0}" #: src/lib/moderation/useReportOptions.ts:45 msgid "Misleading Account" -msgstr "" +msgstr "Irreführender Account" #: src/Navigation.tsx:119 #: src/screens/Moderation/index.tsx:104 @@ -2602,7 +2602,7 @@ msgstr "" #: src/screens/Moderation/index.tsx:215 msgid "Moderation tools" -msgstr "" +msgstr "Moderationswerkzeuge" #: src/components/moderation/ModerationDetailsDialog.tsx:48 #: src/lib/moderation/useModerationCauseDescription.ts:40 @@ -2611,7 +2611,7 @@ msgstr "Der Moderator hat beschlossen, eine allgemeine Warnung vor dem Inhalt au #: src/view/com/post-thread/PostThreadItem.tsx:541 msgid "More" -msgstr "" +msgstr "Mehr" #: src/view/shell/desktop/Feeds.tsx:65 msgid "More feeds" @@ -2708,7 +2708,7 @@ msgstr "Bei stummgeschalteten Konten werden dazugehörige Beiträge aus deinem F #: src/lib/moderation/useModerationCauseDescription.ts:85 msgid "Muted by \"{0}\"" -msgstr "" +msgstr "Stummgeschaltet über \"{0}\"" #: src/screens/Moderation/index.tsx:231 msgid "Muted words & tags" @@ -2733,7 +2733,7 @@ msgstr "Mein Profil" #: src/view/screens/Settings/index.tsx:596 msgid "My saved feeds" -msgstr "" +msgstr "Meine gespeicherten Feeds" #: src/view/screens/Settings/index.tsx:602 msgid "My Saved Feeds" @@ -2897,7 +2897,7 @@ msgstr "{0} wird nicht mehr gefolgt" #: src/screens/Signup/StepHandle.tsx:114 msgid "No longer than 253 characters" -msgstr "" +msgstr "Nicht länger als 253 Zeichen" #: src/view/com/notifications/Feed.tsx:109 msgid "No notifications yet!" @@ -2938,7 +2938,7 @@ msgstr "" #: src/lib/moderation/useGlobalLabelStrings.ts:42 msgid "Non-sexual Nudity" -msgstr "" +msgstr "Nicht-sexuelle Nacktheit" #: src/view/com/modals/SelfLabel.tsx:135 msgid "Not Applicable." @@ -2988,11 +2988,11 @@ msgstr "" #: src/screens/Signup/index.tsx:142 msgid "of" -msgstr "" +msgstr "von" #: src/lib/moderation/useLabelBehaviorDescription.ts:11 msgid "Off" -msgstr "" +msgstr "Aus" #: src/view/com/util/ErrorBoundary.tsx:49 msgid "Oh no!" @@ -3005,7 +3005,7 @@ msgstr "Oh nein, da ist etwas schief gelaufen." #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:126 #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:327 msgid "OK" -msgstr "" +msgstr "OK" #: src/screens/Login/PasswordUpdatedForm.tsx:44 msgid "Okay" @@ -3029,7 +3029,7 @@ msgstr "Nur {0} kann antworten." #: src/screens/Signup/StepHandle.tsx:97 msgid "Only contains letters, numbers, and hyphens" -msgstr "" +msgstr "Enthält nur Buchstaben, Nummern und Bindestriche" #: src/components/Lists.tsx:75 msgid "Oops, something went wrong!" @@ -3064,7 +3064,7 @@ msgstr "Links mit In-App-Browser öffnen" #: src/screens/Moderation/index.tsx:227 msgid "Open muted words and tags settings" -msgstr "" +msgstr "Einstellungen für stummgeschaltete Wörter und Tags öffnen" #: src/view/screens/Moderation.tsx:92 #~ msgid "Open muted words settings" @@ -3097,7 +3097,7 @@ msgstr "Öffnet zusätzliche Details für einen Debug-Eintrag" #: src/view/com/notifications/FeedItem.tsx:353 msgid "Opens an expanded list of users in this notification" -msgstr "Öffnet eine erweiterte Liste der Benutzer in dieser Meldung" +msgstr "Öffnet eine erweiterte Liste der Benutzer in dieser Mitteilung" #: src/view/com/composer/photos/OpenCameraBtn.tsx:78 msgid "Opens camera on device" @@ -3127,13 +3127,13 @@ msgstr "Öffnet die Einstellungen für externe eingebettete Medien" #: src/view/com/auth/SplashScreen.tsx:68 #: src/view/com/auth/SplashScreen.web.tsx:97 msgid "Opens flow to create a new Bluesky account" -msgstr "" +msgstr "Öffnet den Vorgang, einen neuen Bluesky account anzulegen" #: src/view/com/auth/HomeLoggedOutCTA.tsx:75 #: src/view/com/auth/SplashScreen.tsx:83 #: src/view/com/auth/SplashScreen.web.tsx:112 msgid "Opens flow to sign into your existing Bluesky account" -msgstr "" +msgstr "Öffnet den Vorgang, sich mit einen bestehenden Bluesky Account anzumelden" #: src/view/com/profile/ProfileHeader.tsx:575 #~ msgid "Opens followers list" @@ -5346,7 +5346,7 @@ msgstr "Videospiele" #: src/screens/Profile/Header/Shell.tsx:107 msgid "View {0}'s avatar" -msgstr "Avatar {0} ansehen" +msgstr "Avatar von {0} ansehen" #: src/view/screens/Log.tsx:52 msgid "View debug entry" From 1f587ea4b66a6680d8d1fe06b1705994165973d5 Mon Sep 17 00:00:00 2001 From: surfdude29 <149612116+surfdude29@users.noreply.github.com> Date: Fri, 12 Apr 2024 23:49:36 +0200 Subject: [PATCH 046/185] Remove obsolete strings from `en` message catalog (#3462) --- src/locale/locales/en/messages.po | 697 ------------------------------ 1 file changed, 697 deletions(-) diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 8a88ef3ad1..f3b9b1977a 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -17,28 +17,10 @@ msgstr "" msgid "(no email)" msgstr "" -#: src/view/shell/desktop/RightNav.tsx:168 -#~ msgid "{0, plural, one {# invite code available} other {# invite codes available}}" -#~ msgstr "" - #: src/screens/Profile/Header/Metrics.tsx:44 msgid "{following} following" msgstr "" -#: src/view/shell/desktop/RightNav.tsx:151 -#~ msgid "{invitesAvailable, plural, one {Invite codes: # available} other {Invite codes: # available}}" -#~ msgstr "" - -#: src/view/screens/Settings.tsx:435 -#: src/view/shell/Drawer.tsx:664 -#~ msgid "{invitesAvailable} invite code available" -#~ msgstr "" - -#: src/view/screens/Settings.tsx:437 -#: src/view/shell/Drawer.tsx:666 -#~ msgid "{invitesAvailable} invite codes available" -#~ msgstr "" - #: src/view/shell/Drawer.tsx:443 msgid "{numUnreadNotifications} unread" msgstr "" @@ -71,14 +53,6 @@ msgstr "" msgid "⚠Invalid Handle" msgstr "" -#: src/view/com/util/moderation/LabelInfo.tsx:45 -#~ msgid "A content warning has been applied to this {0}." -#~ msgstr "" - -#: src/lib/hooks/useOTAUpdate.ts:16 -#~ msgid "A new version of the app is available. Please update to continue using the app." -#~ msgstr "" - #: src/view/com/util/ViewHeader.tsx:89 #: src/view/screens/Search/Search.tsx:649 msgid "Access navigation links and settings" @@ -179,15 +153,6 @@ msgstr "" msgid "Add App Password" msgstr "" -#: src/view/com/modals/report/InputIssueDetails.tsx:41 -#: src/view/com/modals/report/Modal.tsx:191 -#~ msgid "Add details" -#~ msgstr "" - -#: src/view/com/modals/report/Modal.tsx:194 -#~ msgid "Add details to report" -#~ msgstr "" - #: src/view/com/composer/Composer.tsx:467 msgid "Add link card" msgstr "" @@ -240,14 +205,6 @@ msgstr "" msgid "Adult Content" msgstr "" -#: src/view/com/modals/ContentFilteringSettings.tsx:141 -#~ msgid "Adult content can only be enabled via the Web at <0/>." -#~ msgstr "" - -#: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:78 -#~ msgid "Adult content can only be enabled via the Web at <0>bsky.app." -#~ msgstr "" - #: src/components/moderation/LabelPreference.tsx:242 msgid "Adult content is disabled." msgstr "" @@ -334,10 +291,6 @@ msgstr "" msgid "App password settings" msgstr "" -#: src/view/screens/Settings.tsx:650 -#~ msgid "App passwords" -#~ msgstr "" - #: src/Navigation.tsx:251 #: src/view/screens/AppPasswords.tsx:189 #: src/view/screens/Settings/index.tsx:704 @@ -353,27 +306,10 @@ msgstr "" msgid "Appeal \"{0}\" label" msgstr "" -#: src/view/com/util/forms/PostDropdownBtn.tsx:337 -#: src/view/com/util/forms/PostDropdownBtn.tsx:346 -#~ msgid "Appeal content warning" -#~ msgstr "" - -#: src/view/com/modals/AppealLabel.tsx:65 -#~ msgid "Appeal Content Warning" -#~ msgstr "" - #: src/components/moderation/LabelsOnMeDialog.tsx:192 msgid "Appeal submitted." msgstr "" -#: src/view/com/util/moderation/LabelInfo.tsx:52 -#~ msgid "Appeal this decision" -#~ msgstr "" - -#: src/view/com/util/moderation/LabelInfo.tsx:56 -#~ msgid "Appeal this decision." -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:485 msgid "Appearance" msgstr "" @@ -394,10 +330,6 @@ msgstr "" msgid "Are you sure?" msgstr "" -#: src/view/com/util/forms/PostDropdownBtn.tsx:322 -#~ msgid "Are you sure? This cannot be undone." -#~ msgstr "" - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:60 msgid "Are you writing in <0>{0}?" msgstr "" @@ -430,11 +362,6 @@ msgstr "" msgid "Back" msgstr "" -#: src/view/com/post-thread/PostThread.tsx:480 -#~ msgctxt "action" -#~ msgid "Back" -#~ msgstr "" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:144 msgid "Based on your interest in {interestsText}" msgstr "" @@ -478,10 +405,6 @@ msgstr "" msgid "Block these accounts?" msgstr "" -#: src/view/screens/ProfileList.tsx:320 -#~ msgid "Block this List" -#~ msgstr "" - #: src/view/com/lists/ListCard.tsx:110 #: src/view/com/util/post-embeds/QuoteEmbed.tsx:55 msgid "Blocked" @@ -550,18 +473,10 @@ msgstr "" msgid "Bluesky is public." msgstr "" -#: src/view/com/modals/Waitlist.tsx:70 -#~ msgid "Bluesky uses invites to build a healthier community. If you don't know anybody with an invite, you can sign up for the waitlist and we'll send one soon." -#~ msgstr "" - #: src/screens/Moderation/index.tsx:533 msgid "Bluesky will not show your profile and posts to logged-out users. Other apps may not honor this request. This does not make your account private." msgstr "" -#: src/view/com/modals/ServerInput.tsx:78 -#~ msgid "Bluesky.Social" -#~ msgstr "" - #: src/lib/moderation/useLabelBehaviorDescription.ts:53 msgid "Blur images" msgstr "" @@ -574,19 +489,11 @@ msgstr "" msgid "Books" msgstr "" -#: src/view/screens/Settings/index.tsx:893 -#~ msgid "Build version {0} {1}" -#~ msgstr "" - #: src/view/com/auth/HomeLoggedOutCTA.tsx:92 #: src/view/com/auth/SplashScreen.web.tsx:166 msgid "Business" msgstr "" -#: src/view/com/modals/ServerInput.tsx:115 -#~ msgid "Button disabled. Input custom domain to proceed." -#~ msgstr "" - #: src/view/com/profile/ProfileSubpageHeader.tsx:157 msgid "by —" msgstr "" @@ -679,10 +586,6 @@ msgstr "" msgid "Cancel search" msgstr "" -#: src/view/com/modals/Waitlist.tsx:136 -#~ msgid "Cancel waitlist signup" -#~ msgstr "" - #: src/view/com/modals/LinkWarning.tsx:106 msgid "Cancels opening the linked website" msgstr "" @@ -722,10 +625,6 @@ msgstr "" msgid "Change post language to {0}" msgstr "" -#: src/view/screens/Settings/index.tsx:733 -#~ msgid "Change your Bluesky password" -#~ msgstr "" - #: src/view/com/modals/ChangeEmail.tsx:109 msgid "Change Your Email" msgstr "" @@ -751,10 +650,6 @@ msgstr "" msgid "Choose \"Everybody\" or \"Nobody\"" msgstr "" -#: src/view/screens/Settings/index.tsx:697 -#~ msgid "Choose a new Bluesky username or create" -#~ msgstr "" - #: src/view/com/auth/server-input/index.tsx:79 msgid "Choose Service" msgstr "" @@ -768,10 +663,6 @@ msgstr "" msgid "Choose the algorithms that power your experience with custom feeds." msgstr "" -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:103 -#~ msgid "Choose your algorithmic feeds" -#~ msgstr "" - #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:104 msgid "Choose your main feeds" msgstr "" @@ -931,12 +822,6 @@ msgstr "" msgid "Confirm" msgstr "" -#: src/view/com/modals/Confirm.tsx:75 -#: src/view/com/modals/Confirm.tsx:78 -#~ msgctxt "action" -#~ msgid "Confirm" -#~ msgstr "" - #: src/view/com/modals/ChangeEmail.tsx:193 #: src/view/com/modals/ChangeEmail.tsx:195 msgid "Confirm Change" @@ -950,10 +835,6 @@ msgstr "" msgid "Confirm delete account" msgstr "" -#: src/view/com/modals/ContentFilteringSettings.tsx:156 -#~ msgid "Confirm your age to enable adult content." -#~ msgstr "" - #: src/screens/Moderation/index.tsx:301 msgid "Confirm your age:" msgstr "" @@ -969,10 +850,6 @@ msgstr "" msgid "Confirmation code" msgstr "" -#: src/view/com/modals/Waitlist.tsx:120 -#~ msgid "Confirms signing up {email} to the waitlist" -#~ msgstr "" - #: src/screens/Login/LoginForm.tsx:248 msgid "Connecting..." msgstr "" @@ -989,14 +866,6 @@ msgstr "" msgid "Content Blocked" msgstr "" -#: src/view/screens/Moderation.tsx:83 -#~ msgid "Content filtering" -#~ msgstr "" - -#: src/view/com/modals/ContentFilteringSettings.tsx:44 -#~ msgid "Content Filtering" -#~ msgstr "" - #: src/screens/Moderation/index.tsx:285 msgid "Content filters" msgstr "" @@ -1098,10 +967,6 @@ msgstr "" msgid "Copy link to post" msgstr "" -#: src/view/com/profile/ProfileHeader.tsx:295 -#~ msgid "Copy link to profile" -#~ msgstr "" - #: src/view/com/util/forms/PostDropdownBtn.tsx:220 #: src/view/com/util/forms/PostDropdownBtn.tsx:222 msgid "Copy post text" @@ -1120,10 +985,6 @@ msgstr "" msgid "Could not load list" msgstr "" -#: src/view/com/auth/create/Step2.tsx:91 -#~ msgid "Country" -#~ msgstr "" - #: src/view/com/auth/HomeLoggedOutCTA.tsx:65 #: src/view/com/auth/SplashScreen.tsx:75 #: src/view/com/auth/SplashScreen.web.tsx:104 @@ -1156,14 +1017,6 @@ msgstr "" msgid "Created {0}" msgstr "" -#: src/view/screens/ProfileFeed.tsx:616 -#~ msgid "Created by <0/>" -#~ msgstr "" - -#: src/view/screens/ProfileFeed.tsx:614 -#~ msgid "Created by you" -#~ msgstr "" - #: src/view/com/composer/Composer.tsx:469 msgid "Creates a card with a thumbnail. The card links to {url}" msgstr "" @@ -1190,10 +1043,6 @@ msgstr "" msgid "Customize media from external sites." msgstr "" -#: src/view/screens/Settings.tsx:687 -#~ msgid "Danger Zone" -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:504 #: src/view/screens/Settings/index.tsx:530 msgid "Dark" @@ -1249,10 +1098,6 @@ msgstr "" msgid "Delete my account" msgstr "" -#: src/view/screens/Settings.tsx:706 -#~ msgid "Delete my account…" -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:808 msgid "Delete My Account…" msgstr "" @@ -1285,10 +1130,6 @@ msgstr "" msgid "Description" msgstr "" -#: src/view/screens/Settings.tsx:760 -#~ msgid "Developer Tools" -#~ msgstr "" - #: src/view/com/composer/Composer.tsx:218 msgid "Did you want to say anything?" msgstr "" @@ -1308,10 +1149,6 @@ msgstr "" msgid "Discard" msgstr "" -#: src/view/com/composer/Composer.tsx:145 -#~ msgid "Discard draft" -#~ msgstr "" - #: src/view/com/composer/Composer.tsx:508 msgid "Discard draft?" msgstr "" @@ -1326,10 +1163,6 @@ msgstr "" msgid "Discover new custom feeds" msgstr "" -#: src/view/screens/Feeds.tsx:473 -#~ msgid "Discover new feeds" -#~ msgstr "" - #: src/view/screens/Feeds.tsx:689 msgid "Discover New Feeds" msgstr "" @@ -1362,10 +1195,6 @@ msgstr "" msgid "Domain verified!" msgstr "" -#: src/view/com/auth/create/Step1.tsx:170 -#~ msgid "Don't have an invite code?" -#~ msgstr "" - #: src/components/dialogs/BirthDateSettings.tsx:119 #: src/components/dialogs/BirthDateSettings.tsx:125 #: src/components/forms/DateField/index.tsx:74 @@ -1401,14 +1230,6 @@ msgstr "" msgid "Done{extraText}" msgstr "" -#: src/view/com/auth/login/ChooseAccountForm.tsx:46 -#~ msgid "Double tap to sign in" -#~ msgstr "" - -#: src/view/screens/Settings/index.tsx:755 -#~ msgid "Download Bluesky account data (repository)" -#~ msgstr "" - #: src/view/screens/Settings/ExportCarDialog.tsx:59 #: src/view/screens/Settings/ExportCarDialog.tsx:63 msgid "Download CAR file" @@ -1574,10 +1395,6 @@ msgstr "" msgid "Enable external media" msgstr "" -#: src/view/com/modals/EmbedConsent.tsx:97 -#~ msgid "Enable External Media" -#~ msgstr "" - #: src/view/screens/PreferencesExternalEmbeds.tsx:75 msgid "Enable media players for" msgstr "" @@ -1631,10 +1448,6 @@ msgstr "" msgid "Enter your birth date" msgstr "" -#: src/view/com/modals/Waitlist.tsx:78 -#~ msgid "Enter your email" -#~ msgstr "" - #: src/screens/Login/ForgotPasswordForm.tsx:105 #: src/screens/Signup/StepInfo/index.tsx:91 msgid "Enter your email address" @@ -1648,10 +1461,6 @@ msgstr "" msgid "Enter your new email address below." msgstr "" -#: src/view/com/auth/create/Step2.tsx:188 -#~ msgid "Enter your phone number" -#~ msgstr "" - #: src/screens/Login/index.tsx:101 msgid "Enter your username and password" msgstr "" @@ -1693,10 +1502,6 @@ msgstr "" msgid "Exits inputting search query" msgstr "" -#: src/view/com/modals/Waitlist.tsx:138 -#~ msgid "Exits signing up for waitlist with {email}" -#~ msgstr "" - #: src/view/com/lightbox/Lightbox.web.tsx:183 msgid "Expand alt text" msgstr "" @@ -1777,10 +1582,6 @@ msgstr "" msgid "Feed offline" msgstr "" -#: src/view/com/feeds/FeedPage.tsx:143 -#~ msgid "Feed Preferences" -#~ msgstr "" - #: src/view/shell/desktop/RightNav.tsx:61 #: src/view/shell/Drawer.tsx:314 msgid "Feedback" @@ -1797,14 +1598,6 @@ msgstr "" msgid "Feeds" msgstr "" -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:106 -#~ msgid "Feeds are created by users and can give you entirely new experiences." -#~ msgstr "" - -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:106 -#~ msgid "Feeds are created by users and organizations. They offer you varied experiences and suggest content you may like using algorithms." -#~ msgstr "" - #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:57 msgid "Feeds are created by users to curate content. Choose some feeds that you find interesting." msgstr "" @@ -1851,10 +1644,6 @@ msgstr "" msgid "Fine-tune the content you see on your Following feed." msgstr "" -#: src/view/screens/PreferencesHomeFeed.tsx:111 -#~ msgid "Fine-tune the content you see on your home screen." -#~ msgstr "" - #: src/view/screens/PreferencesThreads.tsx:60 msgid "Fine-tune the discussion threads." msgstr "" @@ -1980,14 +1769,6 @@ msgstr "" msgid "For security reasons, you won't be able to view this again. If you lose this password, you'll need to generate a new one." msgstr "" -#: src/view/com/auth/login/LoginForm.tsx:244 -#~ msgid "Forgot" -#~ msgstr "" - -#: src/view/com/auth/login/LoginForm.tsx:241 -#~ msgid "Forgot password" -#~ msgstr "" - #: src/screens/Login/index.tsx:129 #: src/screens/Login/index.tsx:144 msgid "Forgot Password" @@ -2090,10 +1871,6 @@ msgstr "" msgid "Hashtag" msgstr "" -#: src/components/RichText.tsx:188 -#~ msgid "Hashtag: {tag}" -#~ msgstr "" - #: src/components/RichText.tsx:191 msgid "Hashtag: #{tag}" msgstr "" @@ -2159,10 +1936,6 @@ msgstr "" msgid "Hide user list" msgstr "" -#: src/view/com/profile/ProfileHeader.tsx:487 -#~ msgid "Hides posts from {0} in your feed" -#~ msgstr "" - #: src/view/com/posts/FeedErrorMessage.tsx:111 msgid "Hmm, some kind of issue occurred when contacting the feed server. Please let the feed owner know about this issue." msgstr "" @@ -2199,13 +1972,6 @@ msgstr "" msgid "Home" msgstr "" -#: src/Navigation.tsx:247 -#: src/view/com/pager/FeedsTabBarMobile.tsx:123 -#: src/view/screens/PreferencesHomeFeed.tsx:104 -#: src/view/screens/Settings/index.tsx:543 -#~ msgid "Home Feed Preferences" -#~ msgstr "" - #: src/view/com/modals/ChangeHandle.tsx:420 msgid "Host:" msgstr "" @@ -2269,11 +2035,6 @@ msgstr "" msgid "Image alt text" msgstr "" -#: src/view/com/util/UserAvatar.tsx:311 -#: src/view/com/util/UserBanner.tsx:118 -#~ msgid "Image options" -#~ msgstr "" - #: src/lib/moderation/useReportOptions.ts:47 msgid "Impersonation or false claims about identity or affiliation" msgstr "" @@ -2286,14 +2047,6 @@ msgstr "" msgid "Input confirmation code for account deletion" msgstr "" -#: src/view/com/auth/create/Step1.tsx:177 -#~ msgid "Input email for Bluesky account" -#~ msgstr "" - -#: src/view/com/auth/create/Step1.tsx:151 -#~ msgid "Input invite code to proceed" -#~ msgstr "" - #: src/view/com/modals/AddAppPasswords.tsx:181 msgid "Input name for app password" msgstr "" @@ -2306,10 +2059,6 @@ msgstr "" msgid "Input password for account deletion" msgstr "" -#: src/view/com/auth/create/Step2.tsx:196 -#~ msgid "Input phone number for SMS verification" -#~ msgstr "" - #: src/screens/Login/LoginForm.tsx:195 msgid "Input the password tied to {identifier}" msgstr "" @@ -2318,14 +2067,6 @@ msgstr "" msgid "Input the username or email address you used at signup" msgstr "" -#: src/view/com/auth/create/Step2.tsx:271 -#~ msgid "Input the verification code we have texted to you" -#~ msgstr "" - -#: src/view/com/modals/Waitlist.tsx:90 -#~ msgid "Input your email to get on the Bluesky waitlist" -#~ msgstr "" - #: src/screens/Login/LoginForm.tsx:194 msgid "Input your password" msgstr "" @@ -2346,10 +2087,6 @@ msgstr "" msgid "Invalid username or password" msgstr "" -#: src/view/screens/Settings.tsx:411 -#~ msgid "Invite" -#~ msgstr "" - #: src/view/com/modals/InviteCodes.tsx:94 msgid "Invite a Friend" msgstr "" @@ -2366,10 +2103,6 @@ msgstr "" msgid "Invite codes: {0} available" msgstr "" -#: src/view/shell/Drawer.tsx:645 -#~ msgid "Invite codes: {invitesAvailable} available" -#~ msgstr "" - #: src/view/com/modals/InviteCodes.tsx:170 msgid "Invite codes: 1 available" msgstr "" @@ -2383,19 +2116,6 @@ msgstr "" msgid "Jobs" msgstr "" -#: src/view/com/modals/Waitlist.tsx:67 -#~ msgid "Join the waitlist" -#~ msgstr "" - -#: src/view/com/auth/create/Step1.tsx:174 -#: src/view/com/auth/create/Step1.tsx:178 -#~ msgid "Join the waitlist." -#~ msgstr "" - -#: src/view/com/modals/Waitlist.tsx:128 -#~ msgid "Join Waitlist" -#~ msgstr "" - #: src/screens/Onboarding/index.tsx:24 msgid "Journalism" msgstr "" @@ -2449,14 +2169,6 @@ msgstr "" msgid "Languages" msgstr "" -#: src/view/com/auth/create/StepHeader.tsx:20 -#~ msgid "Last step!" -#~ msgstr "" - -#: src/view/com/util/moderation/ContentHider.tsx:103 -#~ msgid "Learn more" -#~ msgstr "" - #: src/components/moderation/ScreenHider.tsx:136 msgid "Learn More" msgstr "" @@ -2504,11 +2216,6 @@ msgstr "" msgid "Let's go!" msgstr "" -#: src/view/com/util/UserAvatar.tsx:248 -#: src/view/com/util/UserBanner.tsx:62 -#~ msgid "Library" -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:498 msgid "Light" msgstr "" @@ -2609,11 +2316,6 @@ msgstr "" msgid "Lists" msgstr "" -#: src/view/com/post-thread/PostThread.tsx:333 -#: src/view/com/post-thread/PostThread.tsx:341 -#~ msgid "Load more posts" -#~ msgstr "" - #: src/view/screens/Notifications.tsx:159 msgid "Load new notifications" msgstr "" @@ -2629,10 +2331,6 @@ msgstr "" msgid "Loading..." msgstr "" -#: src/view/com/modals/ServerInput.tsx:50 -#~ msgid "Local dev server" -#~ msgstr "" - #: src/Navigation.tsx:221 msgid "Log" msgstr "" @@ -2664,14 +2362,6 @@ msgstr "" msgid "Manage your muted words and tags" msgstr "" -#: src/view/com/auth/create/Step2.tsx:118 -#~ msgid "May not be longer than 253 characters" -#~ msgstr "" - -#: src/view/com/auth/create/Step2.tsx:109 -#~ msgid "May only contain letters and numbers" -#~ msgstr "" - #: src/view/screens/Profile.tsx:192 msgid "Media" msgstr "" @@ -2771,18 +2461,10 @@ msgstr "" msgid "More options" msgstr "" -#: src/view/com/util/forms/PostDropdownBtn.tsx:315 -#~ msgid "More post options" -#~ msgstr "" - #: src/view/screens/PreferencesThreads.tsx:82 msgid "Most-liked replies first" msgstr "" -#: src/view/com/auth/create/Step2.tsx:122 -#~ msgid "Must be at least 3 characters" -#~ msgstr "" - #: src/components/TagMenu/index.tsx:249 msgid "Mute" msgstr "" @@ -2804,10 +2486,6 @@ msgstr "" msgid "Mute all {displayTag} posts" msgstr "" -#: src/components/TagMenu/index.tsx:211 -#~ msgid "Mute all {tag} posts" -#~ msgstr "" - #: src/components/dialogs/MutedWords.tsx:148 msgid "Mute in tags only" msgstr "" @@ -2825,10 +2503,6 @@ msgstr "" msgid "Mute these accounts?" msgstr "" -#: src/view/screens/ProfileList.tsx:279 -#~ msgid "Mute this List" -#~ msgstr "" - #: src/components/dialogs/MutedWords.tsx:126 msgid "Mute this word in post text and tags" msgstr "" @@ -2897,10 +2571,6 @@ msgstr "" msgid "My Saved Feeds" msgstr "" -#: src/view/com/auth/server-input/index.tsx:118 -#~ msgid "my-server.com" -#~ msgstr "" - #: src/view/com/modals/AddAppPasswords.tsx:180 #: src/view/com/modals/CreateOrEditList.tsx:291 msgid "Name" @@ -2934,11 +2604,6 @@ msgstr "" msgid "Need to report a copyright violation?" msgstr "" -#: src/view/com/modals/EmbedConsent.tsx:107 -#: src/view/com/modals/EmbedConsent.tsx:123 -#~ msgid "Never load embeds from {0}" -#~ msgstr "" - #: src/view/com/auth/onboarding/WelcomeDesktop.tsx:72 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:74 msgid "Never lose access to your followers and data." @@ -2948,10 +2613,6 @@ msgstr "" msgid "Never lose access to your followers or data." msgstr "" -#: src/components/dialogs/MutedWords.tsx:293 -#~ msgid "Nevermind" -#~ msgstr "" - #: src/view/com/modals/ChangeHandle.tsx:519 msgid "Nevermind, create a handle for me" msgstr "" @@ -3140,10 +2801,6 @@ msgstr "" msgid "Nudity or adult content not labeled as such" msgstr "" -#: src/lib/moderation/useReportOptions.ts:71 -#~ msgid "Nudity or pornography not labeled as such" -#~ msgstr "" - #: src/screens/Signup/index.tsx:142 msgid "of" msgstr "" @@ -3203,10 +2860,6 @@ msgstr "" msgid "Open" msgstr "" -#: src/view/screens/Moderation.tsx:75 -#~ msgid "Open content filtering settings" -#~ msgstr "" - #: src/view/com/composer/Composer.tsx:491 #: src/view/com/composer/Composer.tsx:492 msgid "Open emoji picker" @@ -3224,10 +2877,6 @@ msgstr "" msgid "Open muted words and tags settings" msgstr "" -#: src/view/screens/Moderation.tsx:92 -#~ msgid "Open muted words settings" -#~ msgstr "" - #: src/view/com/home/HomeHeaderLayoutMobile.tsx:50 msgid "Open navigation" msgstr "" @@ -3273,10 +2922,6 @@ msgstr "" msgid "Opens device photo gallery" msgstr "" -#: src/view/com/profile/ProfileHeader.tsx:420 -#~ msgid "Opens editor for profile display name, avatar, background image, and description" -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:669 msgid "Opens external embeds settings" msgstr "" @@ -3293,18 +2938,6 @@ msgstr "" msgid "Opens flow to sign into your existing Bluesky account" msgstr "" -#: src/view/com/profile/ProfileHeader.tsx:575 -#~ msgid "Opens followers list" -#~ msgstr "" - -#: src/view/com/profile/ProfileHeader.tsx:594 -#~ msgid "Opens following list" -#~ msgstr "" - -#: src/view/screens/Settings.tsx:412 -#~ msgid "Opens invite code list" -#~ msgstr "" - #: src/view/com/modals/InviteCodes.tsx:173 msgid "Opens list of invite codes" msgstr "" @@ -3313,10 +2946,6 @@ msgstr "" msgid "Opens modal for account deletion confirmation. Requires email code" msgstr "" -#: src/view/screens/Settings/index.tsx:774 -#~ msgid "Opens modal for account deletion confirmation. Requires email code." -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:756 msgid "Opens modal for changing your Bluesky password" msgstr "" @@ -3358,18 +2987,10 @@ msgstr "" msgid "Opens the app password settings" msgstr "" -#: src/view/screens/Settings/index.tsx:676 -#~ msgid "Opens the app password settings page" -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:554 msgid "Opens the Following feed preferences" msgstr "" -#: src/view/screens/Settings/index.tsx:535 -#~ msgid "Opens the home feed preferences" -#~ msgstr "" - #: src/view/com/modals/LinkWarning.tsx:93 msgid "Opens the linked website" msgstr "" @@ -3407,10 +3028,6 @@ msgstr "" msgid "Other account" msgstr "" -#: src/view/com/modals/ServerInput.tsx:88 -#~ msgid "Other service" -#~ msgstr "" - #: src/view/com/composer/select-language/SelectLangBtn.tsx:91 msgid "Other..." msgstr "" @@ -3463,10 +3080,6 @@ msgstr "" msgid "Pets" msgstr "" -#: src/view/com/auth/create/Step2.tsx:183 -#~ msgid "Phone number" -#~ msgstr "" - #: src/view/com/modals/SelfLabel.tsx:121 msgid "Pictures meant for adults." msgstr "" @@ -3517,10 +3130,6 @@ msgstr "" msgid "Please enter a name for your app password. All spaces is not allowed." msgstr "" -#: src/view/com/auth/create/Step2.tsx:206 -#~ msgid "Please enter a phone number that can receive SMS text messages." -#~ msgstr "" - #: src/view/com/modals/AddAppPasswords.tsx:146 msgid "Please enter a unique name for this App Password or use our randomly generated one." msgstr "" @@ -3529,14 +3138,6 @@ msgstr "" msgid "Please enter a valid word, tag, or phrase to mute" msgstr "" -#: src/view/com/auth/create/state.ts:170 -#~ msgid "Please enter the code you received by SMS." -#~ msgstr "" - -#: src/view/com/auth/create/Step2.tsx:282 -#~ msgid "Please enter the verification code sent to {phoneNumberFormatted}." -#~ msgstr "" - #: src/screens/Signup/state.ts:220 msgid "Please enter your email." msgstr "" @@ -3549,16 +3150,6 @@ msgstr "" msgid "Please explain why you think this label was incorrectly applied by {0}" msgstr "" -#: src/view/com/modals/AppealLabel.tsx:72 -#: src/view/com/modals/AppealLabel.tsx:75 -#~ msgid "Please tell us why you think this content warning was incorrectly applied!" -#~ msgstr "" - -#: src/view/com/modals/AppealLabel.tsx:72 -#: src/view/com/modals/AppealLabel.tsx:75 -#~ msgid "Please tell us why you think this decision was incorrect." -#~ msgstr "" - #: src/view/com/modals/VerifyEmail.tsx:101 msgid "Please Verify Your Email" msgstr "" @@ -3575,10 +3166,6 @@ msgstr "" msgid "Porn" msgstr "" -#: src/lib/moderation/useGlobalLabelStrings.ts:34 -#~ msgid "Pornography" -#~ msgstr "" - #: src/view/com/composer/Composer.tsx:367 #: src/view/com/composer/Composer.tsx:375 msgctxt "action" @@ -3774,10 +3361,6 @@ msgstr "" msgid "Remove" msgstr "" -#: src/view/com/feeds/FeedSourceCard.tsx:108 -#~ msgid "Remove {0} from my feeds?" -#~ msgstr "" - #: src/view/com/util/AccountDropdownBtn.tsx:22 msgid "Remove account" msgstr "" @@ -3825,18 +3408,10 @@ msgstr "" msgid "Remove repost" msgstr "" -#: src/view/com/feeds/FeedSourceCard.tsx:175 -#~ msgid "Remove this feed from my feeds?" -#~ msgstr "" - #: src/view/com/posts/FeedErrorMessage.tsx:202 msgid "Remove this feed from your saved feeds" msgstr "" -#: src/view/com/posts/FeedErrorMessage.tsx:132 -#~ msgid "Remove this feed from your saved feeds?" -#~ msgstr "" - #: src/view/com/modals/ListAddRemoveUsers.tsx:199 #: src/view/com/modals/UserAddRemoveLists.tsx:152 msgid "Removed from list" @@ -3877,10 +3452,6 @@ msgctxt "description" msgid "Reply to <0/>" msgstr "" -#: src/view/com/modals/report/Modal.tsx:166 -#~ msgid "Report {collectionName}" -#~ msgstr "" - #: src/view/com/profile/ProfileMenu.tsx:319 #: src/view/com/profile/ProfileMenu.tsx:322 msgid "Report Account" @@ -3966,10 +3537,6 @@ msgstr "" msgid "Request Change" msgstr "" -#: src/view/com/auth/create/Step2.tsx:219 -#~ msgid "Request code" -#~ msgstr "" - #: src/view/com/modals/ChangePassword.tsx:241 #: src/view/com/modals/ChangePassword.tsx:243 msgid "Request Code" @@ -3991,10 +3558,6 @@ msgstr "" msgid "Reset Code" msgstr "" -#: src/view/screens/Settings/index.tsx:824 -#~ msgid "Reset onboarding" -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:858 #: src/view/screens/Settings/index.tsx:861 msgid "Reset onboarding state" @@ -4004,10 +3567,6 @@ msgstr "" msgid "Reset password" msgstr "" -#: src/view/screens/Settings/index.tsx:814 -#~ msgid "Reset preferences" -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:848 #: src/view/screens/Settings/index.tsx:851 msgid "Reset preferences state" @@ -4042,10 +3601,6 @@ msgstr "" msgid "Retry" msgstr "" -#: src/view/com/auth/create/Step2.tsx:247 -#~ msgid "Retry." -#~ msgstr "" - #: src/components/Error.tsx:86 #: src/view/screens/ProfileList.tsx:917 msgid "Return to previous page" @@ -4060,10 +3615,6 @@ msgstr "" msgid "Returns to previous page" msgstr "" -#: src/view/shell/desktop/RightNav.tsx:55 -#~ msgid "SANDBOX. Posts and accounts are not permanent." -#~ msgstr "" - #: src/components/dialogs/BirthDateSettings.tsx:125 #: src/view/com/modals/ChangeHandle.tsx:174 #: src/view/com/modals/CreateOrEditList.tsx:338 @@ -4160,18 +3711,10 @@ msgstr "" msgid "Search for all posts by @{authorHandle} with tag {displayTag}" msgstr "" -#: src/components/TagMenu/index.tsx:145 -#~ msgid "Search for all posts by @{authorHandle} with tag {tag}" -#~ msgstr "" - #: src/components/TagMenu/index.tsx:94 msgid "Search for all posts with tag {displayTag}" msgstr "" -#: src/components/TagMenu/index.tsx:90 -#~ msgid "Search for all posts with tag {tag}" -#~ msgstr "" - #: src/view/com/auth/LoggedOut.tsx:105 #: src/view/com/auth/LoggedOut.tsx:106 #: src/view/com/modals/ListAddRemoveUsers.tsx:70 @@ -4198,14 +3741,6 @@ msgstr "" msgid "See <0>{displayTag} posts by this user" msgstr "" -#: src/components/TagMenu/index.tsx:128 -#~ msgid "See <0>{tag} posts" -#~ msgstr "" - -#: src/components/TagMenu/index.tsx:189 -#~ msgid "See <0>{tag} posts by this user" -#~ msgstr "" - #: src/view/screens/SavedFeeds.tsx:163 msgid "See this guide" msgstr "" @@ -4222,10 +3757,6 @@ msgstr "" msgid "Select account" msgstr "" -#: src/view/com/modals/ServerInput.tsx:75 -#~ msgid "Select Bluesky Social" -#~ msgstr "" - #: src/screens/Login/index.tsx:120 msgid "Select from an existing account" msgstr "" @@ -4242,11 +3773,6 @@ msgstr "" msgid "Select option {i} of {numItems}" msgstr "" -#: src/view/com/auth/create/Step1.tsx:96 -#: src/view/com/auth/login/LoginForm.tsx:153 -#~ msgid "Select service" -#~ msgstr "" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:52 msgid "Select some accounts below to follow" msgstr "" @@ -4259,10 +3785,6 @@ msgstr "" msgid "Select the service that hosts your data." msgstr "" -#: src/screens/Onboarding/StepModeration/index.tsx:49 -#~ msgid "Select the types of content that you want to see (or not see), and we'll handle the rest." -#~ msgstr "" - #: src/screens/Onboarding/StepTopicalFeeds.tsx:100 msgid "Select topical feeds to follow from the list below" msgstr "" @@ -4275,10 +3797,6 @@ msgstr "" msgid "Select which languages you want your subscribed feeds to include. If none are selected, all languages will be shown." msgstr "" -#: src/view/screens/LanguageSettings.tsx:98 -#~ msgid "Select your app language for the default text to display in the app" -#~ msgstr "" - #: src/view/screens/LanguageSettings.tsx:98 msgid "Select your app language for the default text to display in the app." msgstr "" @@ -4291,10 +3809,6 @@ msgstr "" msgid "Select your interests from the options below" msgstr "" -#: src/view/com/auth/create/Step2.tsx:155 -#~ msgid "Select your phone's country" -#~ msgstr "" - #: src/view/screens/LanguageSettings.tsx:190 msgid "Select your preferred language for translations in your feed." msgstr "" @@ -4331,10 +3845,6 @@ msgstr "" msgid "Send report" msgstr "" -#: src/view/com/modals/report/SendReportButton.tsx:45 -#~ msgid "Send Report" -#~ msgstr "" - #: src/components/ReportDialog/SelectLabelerView.tsx:44 msgid "Send report to {0}" msgstr "" @@ -4347,48 +3857,14 @@ msgstr "" msgid "Server address" msgstr "" -#: src/view/com/modals/ContentFilteringSettings.tsx:311 -#~ msgid "Set {value} for {labelGroup} content moderation policy" -#~ msgstr "" - -#: src/view/com/modals/ContentFilteringSettings.tsx:160 -#: src/view/com/modals/ContentFilteringSettings.tsx:179 -#~ msgctxt "action" -#~ msgid "Set Age" -#~ msgstr "" - #: src/screens/Moderation/index.tsx:304 msgid "Set birthdate" msgstr "" -#: src/view/screens/Settings/index.tsx:488 -#~ msgid "Set color theme to dark" -#~ msgstr "" - -#: src/view/screens/Settings/index.tsx:481 -#~ msgid "Set color theme to light" -#~ msgstr "" - -#: src/view/screens/Settings/index.tsx:475 -#~ msgid "Set color theme to system setting" -#~ msgstr "" - -#: src/view/screens/Settings/index.tsx:514 -#~ msgid "Set dark theme to the dark theme" -#~ msgstr "" - -#: src/view/screens/Settings/index.tsx:507 -#~ msgid "Set dark theme to the dim theme" -#~ msgstr "" - #: src/screens/Login/SetNewPasswordForm.tsx:102 msgid "Set new password" msgstr "" -#: src/view/com/auth/create/Step1.tsx:202 -#~ msgid "Set password" -#~ msgstr "" - #: src/view/screens/PreferencesFollowingFeed.tsx:225 msgid "Set this setting to \"No\" to hide all quote posts from your feed. Reposts will still be visible." msgstr "" @@ -4405,10 +3881,6 @@ msgstr "" msgid "Set this setting to \"Yes\" to show replies in a threaded view. This is an experimental feature." msgstr "" -#: src/view/screens/PreferencesHomeFeed.tsx:261 -#~ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your following feed. This is an experimental feature." -#~ msgstr "" - #: src/view/screens/PreferencesFollowingFeed.tsx:261 msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your Following feed. This is an experimental feature." msgstr "" @@ -4445,10 +3917,6 @@ msgstr "" msgid "Sets email for password reset" msgstr "" -#: src/view/com/auth/login/ForgotPasswordForm.tsx:122 -#~ msgid "Sets hosting provider for password reset" -#~ msgstr "" - #: src/view/com/modals/crop-image/CropImage.web.tsx:124 msgid "Sets image aspect ratio to square" msgstr "" @@ -4461,11 +3929,6 @@ msgstr "" msgid "Sets image aspect ratio to wide" msgstr "" -#: src/view/com/auth/create/Step1.tsx:97 -#: src/view/com/auth/login/LoginForm.tsx:154 -#~ msgid "Sets server for the Bluesky client" -#~ msgstr "" - #: src/Navigation.tsx:139 #: src/view/screens/Settings/index.tsx:313 #: src/view/shell/desktop/LeftNav.tsx:437 @@ -4542,10 +4005,6 @@ msgstr "" msgid "Show badge and filter from feeds" msgstr "" -#: src/view/com/modals/EmbedConsent.tsx:87 -#~ msgid "Show embeds from {0}" -#~ msgstr "" - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:200 msgid "Show follows similar to {0}" msgstr "" @@ -4621,10 +4080,6 @@ msgstr "" msgid "Show warning and filter from feeds" msgstr "" -#: src/view/com/profile/ProfileHeader.tsx:462 -#~ msgid "Shows a list of users similar to this user." -#~ msgstr "" - #: src/view/com/post-thread/PostThreadFollowBtn.tsx:130 msgid "Shows posts from {0} in your feed" msgstr "" @@ -4650,12 +4105,6 @@ msgstr "" msgid "Sign in" msgstr "" -#: src/view/com/auth/HomeLoggedOutCTA.tsx:82 -#: src/view/com/auth/SplashScreen.tsx:86 -#: src/view/com/auth/SplashScreen.web.tsx:91 -#~ msgid "Sign In" -#~ msgstr "" - #: src/components/AccountList.tsx:109 msgid "Sign in as {0}" msgstr "" @@ -4664,10 +4113,6 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/view/com/auth/login/LoginForm.tsx:140 -#~ msgid "Sign into" -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:107 #: src/view/screens/Settings/index.tsx:110 msgid "Sign out" @@ -4702,10 +4147,6 @@ msgstr "" msgid "Signed in as @{0}" msgstr "" -#: src/view/com/modals/SwitchAccount.tsx:70 -#~ msgid "Signs {0} out of Bluesky" -#~ msgstr "" - #: src/screens/Onboarding/StepInterests/index.tsx:239 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:203 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:35 @@ -4716,32 +4157,16 @@ msgstr "" msgid "Skip this flow" msgstr "" -#: src/view/com/auth/create/Step2.tsx:82 -#~ msgid "SMS verification" -#~ msgstr "" - #: src/screens/Onboarding/index.tsx:40 msgid "Software Dev" msgstr "" -#: src/view/com/modals/ProfilePreview.tsx:62 -#~ msgid "Something went wrong and we're not sure what." -#~ msgstr "" - #: src/components/ReportDialog/index.tsx:59 #: src/screens/Moderation/index.tsx:114 #: src/screens/Profile/Sections/Labels.tsx:76 msgid "Something went wrong, please try again." msgstr "" -#: src/components/Lists.tsx:203 -#~ msgid "Something went wrong!" -#~ msgstr "" - -#: src/view/com/modals/Waitlist.tsx:51 -#~ msgid "Something went wrong. Check your email and try again." -#~ msgstr "" - #: src/App.native.tsx:66 msgid "Sorry! Your session expired. Please log in again." msgstr "" @@ -4774,10 +4199,6 @@ msgstr "" msgid "Square" msgstr "" -#: src/view/com/modals/ServerInput.tsx:62 -#~ msgid "Staging" -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:903 msgid "Status page" msgstr "" @@ -4786,10 +4207,6 @@ msgstr "" msgid "Step" msgstr "" -#: src/view/com/auth/create/StepHeader.tsx:22 -#~ msgid "Step {0} of {numSteps}" -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:292 msgid "Storage cleared, you need to restart the app now." msgstr "" @@ -4847,10 +4264,6 @@ msgstr "" msgid "Support" msgstr "" -#: src/view/com/modals/ProfilePreview.tsx:110 -#~ msgid "Swipe up to see more" -#~ msgstr "" - #: src/components/dialogs/SwitchAccount.tsx:46 #: src/components/dialogs/SwitchAccount.tsx:49 msgid "Switch Account" @@ -4880,10 +4293,6 @@ msgstr "" msgid "Tag menu: {displayTag}" msgstr "" -#: src/components/TagMenu/index.tsx:74 -#~ msgid "Tag menu: {tag}" -#~ msgstr "" - #: src/view/com/modals/crop-image/CropImage.web.tsx:113 msgid "Tall" msgstr "" @@ -5070,10 +4479,6 @@ msgstr "" msgid "There's been a rush of new users to Bluesky! We'll activate your account as soon as we can." msgstr "" -#: src/view/com/auth/create/Step2.tsx:55 -#~ msgid "There's something wrong with this number. Please choose your country and enter your full phone number!" -#~ msgstr "" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:146 msgid "These are popular accounts you might like:" msgstr "" @@ -5111,10 +4516,6 @@ msgstr "" msgid "This content is not viewable without a Bluesky account." msgstr "" -#: src/view/screens/Settings/ExportCarDialog.tsx:75 -#~ msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." -#~ msgstr "" - #: src/view/screens/Settings/ExportCarDialog.tsx:75 msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." msgstr "" @@ -5203,14 +4604,6 @@ msgstr "" msgid "This user has requested that their content only be shown to signed-in users." msgstr "" -#: src/view/com/modals/ModerationDetails.tsx:42 -#~ msgid "This user is included in the <0/> list which you have blocked." -#~ msgstr "" - -#: src/view/com/modals/ModerationDetails.tsx:74 -#~ msgid "This user is included in the <0/> list which you have muted." -#~ msgstr "" - #: src/components/moderation/ModerationDetailsDialog.tsx:55 msgid "This user is included in the <0>{0} list which you have blocked." msgstr "" @@ -5219,10 +4612,6 @@ msgstr "" msgid "This user is included in the <0>{0} list which you have muted." msgstr "" -#: src/view/com/modals/ModerationDetails.tsx:74 -#~ msgid "This user is included the <0/> list which you have muted." -#~ msgstr "" - #: src/view/com/profile/ProfileFollows.tsx:87 msgid "This user isn't following anyone." msgstr "" @@ -5235,10 +4624,6 @@ msgstr "" msgid "This will delete {0} from your muted words. You can always add it back later." msgstr "" -#: src/view/com/util/forms/PostDropdownBtn.tsx:282 -#~ msgid "This will hide this post from your feeds." -#~ msgstr "" - #: src/view/screens/Settings/index.tsx:574 msgid "Thread preferences" msgstr "" @@ -5357,10 +4742,6 @@ msgstr "" msgid "Unfollow Account" msgstr "" -#: src/view/com/auth/create/state.ts:262 -#~ msgid "Unfortunately, you do not meet the requirements to create an account." -#~ msgstr "" - #: src/view/com/util/post-ctrls/PostCtrls.tsx:195 msgid "Unlike" msgstr "" @@ -5387,10 +4768,6 @@ msgstr "" msgid "Unmute all {displayTag} posts" msgstr "" -#: src/components/TagMenu/index.tsx:210 -#~ msgid "Unmute all {tag} posts" -#~ msgstr "" - #: src/view/com/util/forms/PostDropdownBtn.tsx:251 #: src/view/com/util/forms/PostDropdownBtn.tsx:256 msgid "Unmute thread" @@ -5409,10 +4786,6 @@ msgstr "" msgid "Unpin moderation list" msgstr "" -#: src/view/screens/ProfileFeed.tsx:346 -#~ msgid "Unsave" -#~ msgstr "" - #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:219 msgid "Unsubscribe" msgstr "" @@ -5429,10 +4802,6 @@ msgstr "" msgid "Update {displayName} in Lists" msgstr "" -#: src/lib/hooks/useOTAUpdate.ts:15 -#~ msgid "Update Available" -#~ msgstr "" - #: src/view/com/modals/ChangeHandle.tsx:508 msgid "Update to {handle}" msgstr "" @@ -5498,10 +4867,6 @@ msgstr "" msgid "Use this to sign into the other app along with your handle." msgstr "" -#: src/view/com/modals/ServerInput.tsx:105 -#~ msgid "Use your domain as your Bluesky client service provider" -#~ msgstr "" - #: src/view/com/modals/InviteCodes.tsx:201 msgid "Used by:" msgstr "" @@ -5527,10 +4892,6 @@ msgstr "" msgid "User Blocks You" msgstr "" -#: src/view/com/auth/create/Step2.tsx:79 -#~ msgid "User handle" -#~ msgstr "" - #: src/view/com/lists/ListCard.tsx:85 #: src/view/com/modals/UserAddRemoveLists.tsx:198 msgid "User list by {0}" @@ -5582,10 +4943,6 @@ msgstr "" msgid "Value:" msgstr "" -#: src/view/com/auth/create/Step2.tsx:243 -#~ msgid "Verification code" -#~ msgstr "" - #: src/view/com/modals/ChangeHandle.tsx:509 msgid "Verify {0}" msgstr "" @@ -5679,10 +5036,6 @@ msgstr "" msgid "Warn content and filter from feeds" msgstr "" -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:134 -#~ msgid "We also think you'll like \"For You\" by Skygaze:" -#~ msgstr "" - #: src/screens/Hashtag.tsx:133 msgid "We couldn't find any results for that hashtag." msgstr "" @@ -5699,10 +5052,6 @@ msgstr "" msgid "We ran out of posts from your follows. Here's the latest from <0/>." msgstr "" -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:118 -#~ msgid "We recommend \"For You\" by Skygaze:" -#~ msgstr "" - #: src/components/dialogs/MutedWords.tsx:203 msgid "We recommend avoiding common words that appear in many posts, since it can result in no posts being shown." msgstr "" @@ -5727,10 +5076,6 @@ msgstr "" msgid "We will let you know when your account is ready." msgstr "" -#: src/view/com/modals/AppealLabel.tsx:48 -#~ msgid "We'll look into your appeal promptly." -#~ msgstr "" - #: src/screens/Onboarding/StepInterests/index.tsx:142 msgid "We'll use this to help customize your experience." msgstr "" @@ -5768,10 +5113,6 @@ msgstr "" msgid "What are your interests?" msgstr "" -#: src/view/com/modals/report/Modal.tsx:169 -#~ msgid "What is the issue with this {collectionName}?" -#~ msgstr "" - #: src/view/com/auth/SplashScreen.tsx:58 #: src/view/com/auth/SplashScreen.web.tsx:84 #: src/view/com/composer/Composer.tsx:296 @@ -5828,10 +5169,6 @@ msgstr "" msgid "Writers" msgstr "" -#: src/view/com/auth/create/Step2.tsx:263 -#~ msgid "XXXXXX" -#~ msgstr "" - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:77 #: src/view/screens/PreferencesFollowingFeed.tsx:129 #: src/view/screens/PreferencesFollowingFeed.tsx:201 @@ -5842,10 +5179,6 @@ msgstr "" msgid "Yes" msgstr "" -#: src/screens/Onboarding/StepModeration/index.tsx:46 -#~ msgid "You are in control" -#~ msgstr "" - #: src/screens/Deactivated.tsx:130 msgid "You are in line." msgstr "" @@ -5859,10 +5192,6 @@ msgstr "" msgid "You can also discover new Custom Feeds to follow." msgstr "" -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:123 -#~ msgid "You can also try our \"Discover\" algorithm:" -#~ msgstr "" - #: src/screens/Onboarding/StepFollowingFeed.tsx:143 msgid "You can change these settings later." msgstr "" @@ -5926,10 +5255,6 @@ msgstr "" msgid "You have muted this user" msgstr "" -#: src/view/com/modals/ModerationDetails.tsx:87 -#~ msgid "You have muted this user." -#~ msgstr "" - #: src/view/com/feeds/ProfileFeedgens.tsx:136 msgid "You have no feeds." msgstr "" @@ -5943,10 +5268,6 @@ msgstr "" msgid "You have not blocked any accounts yet. To block an account, go to their profile and select \"Block account\" from the menu on their account." msgstr "" -#: src/view/screens/ModerationBlockedAccounts.tsx:132 -#~ msgid "You have not blocked any accounts yet. To block an account, go to their profile and selected \"Block account\" from the menu on their account." -#~ msgstr "" - #: src/view/screens/AppPasswords.tsx:89 msgid "You have not created any app passwords yet. You can create one by pressing the button below." msgstr "" @@ -5955,10 +5276,6 @@ msgstr "" msgid "You have not muted any accounts yet. To mute an account, go to their profile and select \"Mute account\" from the menu on their account." msgstr "" -#: src/view/screens/ModerationMutedAccounts.tsx:131 -#~ msgid "You have not muted any accounts yet. To mute an account, go to their profile and selected \"Mute account\" from the menu on their account." -#~ msgstr "" - #: src/components/dialogs/MutedWords.tsx:249 msgid "You haven't muted any words or tags yet" msgstr "" @@ -5971,10 +5288,6 @@ msgstr "" msgid "You must be 13 years of age or older to sign up." msgstr "" -#: src/view/com/modals/ContentFilteringSettings.tsx:175 -#~ msgid "You must be 18 or older to enable adult content." -#~ msgstr "" - #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:110 msgid "You must be 18 years or older to enable adult content" msgstr "" @@ -6048,10 +5361,6 @@ msgstr "" msgid "Your email appears to be invalid." msgstr "" -#: src/view/com/modals/Waitlist.tsx:109 -#~ msgid "Your email has been saved! We'll be in touch soon." -#~ msgstr "" - #: src/view/com/modals/ChangeEmail.tsx:125 msgid "Your email has been updated but not verified. As a next step, please verify your new email." msgstr "" @@ -6072,12 +5381,6 @@ msgstr "" msgid "Your full handle will be <0>@{0}" msgstr "" -#: src/view/screens/Settings.tsx:430 -#: src/view/shell/desktop/RightNav.tsx:137 -#: src/view/shell/Drawer.tsx:660 -#~ msgid "Your invite codes are hidden when logged in using an App Password" -#~ msgstr "" - #: src/components/dialogs/MutedWords.tsx:220 msgid "Your muted words" msgstr "" From f91aa37c6bd900bdc4eec1095c9ecd83da2f13f2 Mon Sep 17 00:00:00 2001 From: Hailey Date: Fri, 12 Apr 2024 14:51:53 -0700 Subject: [PATCH 047/185] Enable updates for `production` behind `receive_updates` gate (#3496) * add gate type * gate the updates * enable updates in `production` * web placeholder for `useOTAUpdates()` * update comment --- app.config.js | 16 +++++--- src/App.native.tsx | 2 - src/lib/hooks/useOTAUpdates.ts | 66 +++++++++++++++--------------- src/lib/hooks/useOTAUpdates.web.ts | 1 + src/lib/statsig/gates.ts | 1 + src/view/screens/Home.tsx | 3 ++ 6 files changed, 49 insertions(+), 40 deletions(-) create mode 100644 src/lib/hooks/useOTAUpdates.web.ts diff --git a/app.config.js b/app.config.js index 9036d5e331..40feed40c5 100644 --- a/app.config.js +++ b/app.config.js @@ -42,8 +42,14 @@ module.exports = function (config) { const IS_DEV = process.env.EXPO_PUBLIC_ENV === 'development' const IS_TESTFLIGHT = process.env.EXPO_PUBLIC_ENV === 'testflight' + const IS_PRODUCTION = process.env.EXPO_PUBLIC_ENV === 'production' - const UPDATES_CHANNEL = IS_TESTFLIGHT ? 'testflight' : 'production' + const UPDATES_CHANNEL = IS_TESTFLIGHT + ? 'testflight' + : IS_PRODUCTION + ? 'production' + : undefined + const UPDATES_ENABLED = !!UPDATES_CHANNEL return { expo: { @@ -126,14 +132,12 @@ module.exports = function (config) { }, updates: { url: 'https://updates.bsky.app/manifest', - // TODO Eventually we want to enable this for all environments, but for now it will only be used for - // TestFlight builds - enabled: IS_TESTFLIGHT, + enabled: UPDATES_ENABLED, fallbackToCacheTimeout: 30000, - codeSigningCertificate: IS_TESTFLIGHT + codeSigningCertificate: UPDATES_ENABLED ? './code-signing/certificate.pem' : undefined, - codeSigningMetadata: IS_TESTFLIGHT + codeSigningMetadata: UPDATES_ENABLED ? { keyid: 'main', alg: 'rsa-v1_5-sha256', diff --git a/src/App.native.tsx b/src/App.native.tsx index 9abe4a559d..ede587c899 100644 --- a/src/App.native.tsx +++ b/src/App.native.tsx @@ -19,7 +19,6 @@ import {init as initPersistedState} from '#/state/persisted' import * as persisted from '#/state/persisted' import {Provider as LabelDefsProvider} from '#/state/preferences/label-defs' import {useIntentHandler} from 'lib/hooks/useIntentHandler' -import {useOTAUpdates} from 'lib/hooks/useOTAUpdates' import {useNotificationsListener} from 'lib/notifications/notifications' import {QueryProvider} from 'lib/react-query' import {s} from 'lib/styles' @@ -58,7 +57,6 @@ function InnerApp() { const {_} = useLingui() useIntentHandler() - useOTAUpdates() // init useEffect(() => { diff --git a/src/lib/hooks/useOTAUpdates.ts b/src/lib/hooks/useOTAUpdates.ts index 51fd18aa04..70905c1373 100644 --- a/src/lib/hooks/useOTAUpdates.ts +++ b/src/lib/hooks/useOTAUpdates.ts @@ -12,6 +12,7 @@ import { import {logger} from '#/logger' import {IS_TESTFLIGHT} from 'lib/app-info' +import {useGate} from 'lib/statsig/statsig' import {isIOS} from 'platform/detection' const MINIMUM_MINIMIZE_TIME = 15 * 60e3 @@ -30,6 +31,9 @@ async function setExtraParams() { } export function useOTAUpdates() { + const shouldReceiveUpdates = + useGate('receive_updates') && isEnabled && !__DEV__ + const appState = React.useRef('active') const lastMinimize = React.useRef(0) const ranInitialCheck = React.useRef(false) @@ -51,61 +55,59 @@ export function useOTAUpdates() { logger.debug('No update available.') } } catch (e) { - logger.warn('OTA Update Error', {error: `${e}`}) + logger.error('OTA Update Error', {error: `${e}`}) } }, 10e3) }, []) - const onIsTestFlight = React.useCallback(() => { - setTimeout(async () => { - try { - await setExtraParams() + const onIsTestFlight = React.useCallback(async () => { + try { + await setExtraParams() - const res = await checkForUpdateAsync() - if (res.isAvailable) { - await fetchUpdateAsync() + const res = await checkForUpdateAsync() + if (res.isAvailable) { + await fetchUpdateAsync() - Alert.alert( - 'Update Available', - 'A new version of the app is available. Relaunch now?', - [ - { - text: 'No', - style: 'cancel', + Alert.alert( + 'Update Available', + 'A new version of the app is available. Relaunch now?', + [ + { + text: 'No', + style: 'cancel', + }, + { + text: 'Relaunch', + style: 'default', + onPress: async () => { + await reloadAsync() }, - { - text: 'Relaunch', - style: 'default', - onPress: async () => { - await reloadAsync() - }, - }, - ], - ) - } - } catch (e: any) { - // No need to handle + }, + ], + ) } - }, 3e3) + } catch (e: any) { + logger.error('Internal OTA Update Error', {error: `${e}`}) + } }, []) React.useEffect(() => { + // We use this setTimeout to allow Statsig to initialize before we check for an update // For Testflight users, we can prompt the user to update immediately whenever there's an available update. This // is suspect however with the Apple App Store guidelines, so we don't want to prompt production users to update // immediately. if (IS_TESTFLIGHT) { onIsTestFlight() return - } else if (!isEnabled || __DEV__ || ranInitialCheck.current) { - // Development client shouldn't check for updates at all, so we skip that here. + } else if (!shouldReceiveUpdates || ranInitialCheck.current) { return } setCheckTimeout() ranInitialCheck.current = true - }, [onIsTestFlight, setCheckTimeout]) + }, [onIsTestFlight, setCheckTimeout, shouldReceiveUpdates]) - // After the app has been minimized for 30 minutes, we want to either A. install an update if one has become available + // After the app has been minimized for 15 minutes, we want to either A. install an update if one has become available // or B check for an update again. React.useEffect(() => { if (!isEnabled) return diff --git a/src/lib/hooks/useOTAUpdates.web.ts b/src/lib/hooks/useOTAUpdates.web.ts new file mode 100644 index 0000000000..1baf4894ee --- /dev/null +++ b/src/lib/hooks/useOTAUpdates.web.ts @@ -0,0 +1 @@ +export function useOTAUpdates() {} diff --git a/src/lib/statsig/gates.ts b/src/lib/statsig/gates.ts index acf0b2aff2..81f3f19d56 100644 --- a/src/lib/statsig/gates.ts +++ b/src/lib/statsig/gates.ts @@ -5,6 +5,7 @@ export type Gate = | 'disable_poll_on_discover' | 'new_profile_scroll_component' | 'new_search' + | 'receive_updates' | 'show_follow_back_label' | 'start_session_with_following' | 'use_new_suggestions_endpoint' diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index 7a2a88265b..b55053af0a 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -14,6 +14,7 @@ import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types' import {useSession} from '#/state/session' import {useSetDrawerSwipeDisabled, useSetMinimalShellMode} from '#/state/shell' import {useSelectedFeed, useSetSelectedFeed} from '#/state/shell/selected-feed' +import {useOTAUpdates} from 'lib/hooks/useOTAUpdates' import {HomeTabNavigatorParams, NativeStackScreenProps} from 'lib/routes/types' import {FeedPage} from 'view/com/feeds/FeedPage' import {Pager, PagerRef, RenderTabBarFnProps} from 'view/com/pager/Pager' @@ -51,6 +52,8 @@ function HomeScreenReady({ preferences: UsePreferencesQueryResponse pinnedFeedInfos: FeedSourceInfo[] }) { + useOTAUpdates() + const allFeeds = React.useMemo(() => { const feeds: FeedDescriptor[] = [] feeds.push('home') From 1f61109cfa8307cbbceea604b1daec7486dd3393 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 12 Apr 2024 17:01:32 -0500 Subject: [PATCH 048/185] Profile card hover preview (#3508) * feat: initial user card hover * feat: flesh it out some more * fix: initialize middlewares once * chore: remove floating-ui react-native * chore: clean up * Update moderation apis, fix lint * Refactor profile hover card to alf * Clean up * Debounce, fix positioning when loading * Fix going away * Close on all link presses * Tweak styles * Disable on mobile web * cleanup some of the changes pt. 1 * cleanup some of the changes pt. 2 * cleanup some of the changes pt. 3 * cleanup some of the changes pt. 4 * Re-revert files * Fix handle presentation * Don't follow yourself, silly * Collapsed notifications group * ProfileCard * Tree view replies * Suggested follows * Fix hover-back-on-card edge case * Moar --------- Co-authored-by: Mary Co-authored-by: Hailey --- package.json | 2 + src/components/ProfileHoverCard/index.tsx | 5 + src/components/ProfileHoverCard/index.web.tsx | 290 ++++++++++++++++++ src/components/ProfileHoverCard/types.ts | 6 + src/components/RichText.tsx | 10 +- src/components/hooks/useFollowMethods.ts | 60 ++++ src/components/hooks/useRichText.ts | 33 ++ src/lib/statsig/events.ts | 2 + src/screens/Profile/Header/Handle.tsx | 7 +- src/state/queries/profile.ts | 4 +- src/view/com/notifications/FeedItem.tsx | 105 ++++--- src/view/com/profile/ProfileCard.tsx | 37 ++- .../profile/ProfileHeaderSuggestedFollows.tsx | 32 +- src/view/com/util/PostMeta.tsx | 23 +- src/view/com/util/UserAvatar.tsx | 48 +-- src/view/com/util/UserPreviewLink.tsx | 31 -- yarn.lock | 27 ++ 17 files changed, 576 insertions(+), 146 deletions(-) create mode 100644 src/components/ProfileHoverCard/index.tsx create mode 100644 src/components/ProfileHoverCard/index.web.tsx create mode 100644 src/components/ProfileHoverCard/types.ts create mode 100644 src/components/hooks/useFollowMethods.ts create mode 100644 src/components/hooks/useRichText.ts delete mode 100644 src/view/com/util/UserPreviewLink.tsx diff --git a/package.json b/package.json index 85db718dc1..8b99b70cce 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,8 @@ "@emoji-mart/react": "^1.1.1", "@expo/html-elements": "^0.4.2", "@expo/webpack-config": "^19.0.0", + "@floating-ui/dom": "^1.6.3", + "@floating-ui/react-dom": "^2.0.8", "@fortawesome/fontawesome-svg-core": "^6.1.1", "@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", diff --git a/src/components/ProfileHoverCard/index.tsx b/src/components/ProfileHoverCard/index.tsx new file mode 100644 index 0000000000..980336ee4a --- /dev/null +++ b/src/components/ProfileHoverCard/index.tsx @@ -0,0 +1,5 @@ +import {ProfileHoverCardProps} from './types' + +export function ProfileHoverCard({children}: ProfileHoverCardProps) { + return children +} diff --git a/src/components/ProfileHoverCard/index.web.tsx b/src/components/ProfileHoverCard/index.web.tsx new file mode 100644 index 0000000000..cfb8cf2fc4 --- /dev/null +++ b/src/components/ProfileHoverCard/index.web.tsx @@ -0,0 +1,290 @@ +import React from 'react' +import {View} from 'react-native' +import Animated, {FadeIn, FadeOut} from 'react-native-reanimated' +import {AppBskyActorDefs, moderateProfile, ModerationOpts} from '@atproto/api' +import {flip, offset, shift, size, useFloating} from '@floating-ui/react-dom' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {makeProfileLink} from '#/lib/routes/links' +import {sanitizeDisplayName} from '#/lib/strings/display-names' +import {sanitizeHandle} from '#/lib/strings/handles' +import {pluralize} from '#/lib/strings/helpers' +import {useModerationOpts} from '#/state/queries/preferences' +import {usePrefetchProfileQuery, useProfileQuery} from '#/state/queries/profile' +import {useSession} from '#/state/session' +import {useProfileShadow} from 'state/cache/profile-shadow' +import {formatCount} from '#/view/com/util/numeric/format' +import {UserAvatar} from '#/view/com/util/UserAvatar' +import {ProfileHeaderHandle} from '#/screens/Profile/Header/Handle' +import {atoms as a, useTheme} from '#/alf' +import {Button, ButtonIcon, ButtonText} from '#/components/Button' +import {useFollowMethods} from '#/components/hooks/useFollowMethods' +import {useRichText} from '#/components/hooks/useRichText' +import {Check_Stroke2_Corner0_Rounded as Check} from '#/components/icons/Check' +import {PlusLarge_Stroke2_Corner0_Rounded as Plus} from '#/components/icons/Plus' +import {InlineLinkText, Link} from '#/components/Link' +import {Loader} from '#/components/Loader' +import {Portal} from '#/components/Portal' +import {RichText} from '#/components/RichText' +import {Text} from '#/components/Typography' +import {ProfileHoverCardProps} from './types' + +const floatingMiddlewares = [ + offset(4), + flip({padding: 16}), + shift({padding: 16}), + size({ + padding: 16, + apply({availableWidth, availableHeight, elements}) { + Object.assign(elements.floating.style, { + maxWidth: `${availableWidth}px`, + maxHeight: `${availableHeight}px`, + }) + }, + }), +] + +const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0 + +export function ProfileHoverCard(props: ProfileHoverCardProps) { + return isTouchDevice ? props.children : +} + +export function ProfileHoverCardInner(props: ProfileHoverCardProps) { + const [hovered, setHovered] = React.useState(false) + const {refs, floatingStyles} = useFloating({ + middleware: floatingMiddlewares, + }) + const prefetchProfileQuery = usePrefetchProfileQuery() + + const prefetchedProfile = React.useRef(false) + const targetHovered = React.useRef(false) + const cardHovered = React.useRef(false) + const targetClicked = React.useRef(false) + + const onPointerEnterTarget = React.useCallback(() => { + targetHovered.current = true + + if (prefetchedProfile.current) { + // if we're navigating + if (targetClicked.current) return + setHovered(true) + } else { + prefetchProfileQuery(props.did).then(() => { + if (targetHovered.current) { + setHovered(true) + } + prefetchedProfile.current = true + }) + } + }, [props.did, prefetchProfileQuery]) + const onPointerEnterCard = React.useCallback(() => { + cardHovered.current = true + // if we're navigating + if (targetClicked.current) return + setHovered(true) + }, []) + const onPointerLeaveTarget = React.useCallback(() => { + targetHovered.current = false + setTimeout(() => { + if (cardHovered.current) return + setHovered(false) + }, 100) + }, []) + const onPointerLeaveCard = React.useCallback(() => { + cardHovered.current = false + setTimeout(() => { + if (targetHovered.current) return + setHovered(false) + }, 100) + }, []) + const onClickTarget = React.useCallback(() => { + targetClicked.current = true + setHovered(false) + }, []) + const hide = React.useCallback(() => { + setHovered(false) + }, []) + + return ( +
+ {props.children} + + {hovered && ( + + +
+ +
+
+
+ )} +
+ ) +} + +function Card({did, hide}: {did: string; hide: () => void}) { + const t = useTheme() + + const profile = useProfileQuery({did}) + const moderationOpts = useModerationOpts() + + const data = profile.data + + return ( + + {data && moderationOpts ? ( + + ) : ( + + + + )} + + ) +} + +function Inner({ + profile, + moderationOpts, + hide, +}: { + profile: AppBskyActorDefs.ProfileViewDetailed + moderationOpts: ModerationOpts + hide: () => void +}) { + const t = useTheme() + const {_} = useLingui() + const {currentAccount} = useSession() + const moderation = React.useMemo( + () => moderateProfile(profile, moderationOpts), + [profile, moderationOpts], + ) + const [descriptionRT] = useRichText(profile.description ?? '') + const profileShadow = useProfileShadow(profile) + const {follow, unfollow} = useFollowMethods({ + profile: profileShadow, + logContext: 'ProfileHoverCard', + }) + const blockHide = profile.viewer?.blocking || profile.viewer?.blockedBy + const following = formatCount(profile.followsCount || 0) + const followers = formatCount(profile.followersCount || 0) + const pluralizedFollowers = pluralize(profile.followersCount || 0, 'follower') + const profileURL = makeProfileLink({ + did: profile.did, + handle: profile.handle, + }) + const isMe = React.useMemo( + () => currentAccount?.did === profile.did, + [currentAccount, profile], + ) + + return ( + + + + + + + {!isMe && ( + + )} + + + + + + {sanitizeDisplayName( + profile.displayName || sanitizeHandle(profile.handle), + moderation.ui('displayName'), + )} + + + + + + + {!blockHide && ( + <> + + + + {followers} + + {pluralizedFollowers} + + + + + + {following} + following + + + + + {profile.description?.trim() && !moderation.ui('profileView').blur ? ( + + + + ) : undefined} + + )} + + ) +} diff --git a/src/components/ProfileHoverCard/types.ts b/src/components/ProfileHoverCard/types.ts new file mode 100644 index 0000000000..4e70df5f0d --- /dev/null +++ b/src/components/ProfileHoverCard/types.ts @@ -0,0 +1,6 @@ +import React from 'react' + +export type ProfileHoverCardProps = { + children: React.ReactElement + did: string +} diff --git a/src/components/RichText.tsx b/src/components/RichText.tsx index 5cfa0b24f9..17f36c1418 100644 --- a/src/components/RichText.tsx +++ b/src/components/RichText.tsx @@ -7,7 +7,7 @@ import {toShortUrl} from '#/lib/strings/url-helpers' import {isNative} from '#/platform/detection' import {atoms as a, flatten, native, TextStyleProp, useTheme, web} from '#/alf' import {useInteractionState} from '#/components/hooks/useInteractionState' -import {InlineLinkText} from '#/components/Link' +import {InlineLinkText, LinkProps} from '#/components/Link' import {TagMenu, useTagMenuControl} from '#/components/TagMenu' import {Text, TextProps} from '#/components/Typography' @@ -22,6 +22,7 @@ export function RichText({ selectable, enableTags = false, authorHandle, + onLinkPress, }: TextStyleProp & Pick & { value: RichTextAPI | string @@ -30,6 +31,7 @@ export function RichText({ disableLinks?: boolean enableTags?: boolean authorHandle?: string + onLinkPress?: LinkProps['onPress'] }) { const richText = React.useMemo( () => @@ -90,7 +92,8 @@ export function RichText({ to={`/profile/${mention.did}`} style={[...styles, {pointerEvents: 'auto'}]} // @ts-ignore TODO - dataSet={WORD_WRAP}> + dataSet={WORD_WRAP} + onPress={onLinkPress}> {segment.text} , ) @@ -106,7 +109,8 @@ export function RichText({ style={[...styles, {pointerEvents: 'auto'}]} // @ts-ignore TODO dataSet={WORD_WRAP} - shareOnLongPress> + shareOnLongPress + onPress={onLinkPress}> {toShortUrl(segment.text)} , ) diff --git a/src/components/hooks/useFollowMethods.ts b/src/components/hooks/useFollowMethods.ts new file mode 100644 index 0000000000..1e91a1f38a --- /dev/null +++ b/src/components/hooks/useFollowMethods.ts @@ -0,0 +1,60 @@ +import React from 'react' +import {AppBskyActorDefs} from '@atproto/api' +import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {LogEvents} from '#/lib/statsig/statsig' +import {logger} from '#/logger' +import {Shadow} from '#/state/cache/types' +import {useProfileFollowMutationQueue} from '#/state/queries/profile' +import {useRequireAuth} from '#/state/session' +import * as Toast from '#/view/com/util/Toast' + +export function useFollowMethods({ + profile, + logContext, +}: { + profile: Shadow + logContext: LogEvents['profile:follow']['logContext'] & + LogEvents['profile:unfollow']['logContext'] +}) { + const {_} = useLingui() + const requireAuth = useRequireAuth() + const [queueFollow, queueUnfollow] = useProfileFollowMutationQueue( + profile, + logContext, + ) + + const follow = React.useCallback(() => { + requireAuth(async () => { + try { + await queueFollow() + } catch (e: any) { + logger.error(`useFollowMethods: failed to follow`, {message: String(e)}) + if (e?.name !== 'AbortError') { + Toast.show(_(msg`An issue occurred, please try again.`)) + } + } + }) + }, [_, queueFollow, requireAuth]) + + const unfollow = React.useCallback(() => { + requireAuth(async () => { + try { + await queueUnfollow() + } catch (e: any) { + logger.error(`useFollowMethods: failed to unfollow`, { + message: String(e), + }) + if (e?.name !== 'AbortError') { + Toast.show(_(msg`An issue occurred, please try again.`)) + } + } + }) + }, [_, queueUnfollow, requireAuth]) + + return { + follow, + unfollow, + } +} diff --git a/src/components/hooks/useRichText.ts b/src/components/hooks/useRichText.ts new file mode 100644 index 0000000000..e363ae5a93 --- /dev/null +++ b/src/components/hooks/useRichText.ts @@ -0,0 +1,33 @@ +import React from 'react' +import {RichText as RichTextAPI} from '@atproto/api' + +import {getAgent} from '#/state/session' + +export function useRichText(text: string): [RichTextAPI, boolean] { + const [prevText, setPrevText] = React.useState(text) + const [rawRT, setRawRT] = React.useState(() => new RichTextAPI({text})) + const [resolvedRT, setResolvedRT] = React.useState(null) + if (text !== prevText) { + setPrevText(text) + setRawRT(new RichTextAPI({text})) + setResolvedRT(null) + // This will queue an immediate re-render + } + React.useEffect(() => { + let ignore = false + async function resolveRTFacets() { + // new each time + const resolvedRT = new RichTextAPI({text}) + await resolvedRT.detectFacets(getAgent()) + if (!ignore) { + setResolvedRT(resolvedRT) + } + } + resolveRTFacets() + return () => { + ignore = true + } + }, [text]) + const isResolving = resolvedRT === null + return [resolvedRT ?? rawRT, isResolving] +} diff --git a/src/lib/statsig/events.ts b/src/lib/statsig/events.ts index 3d650b8b73..1231c5de5d 100644 --- a/src/lib/statsig/events.ts +++ b/src/lib/statsig/events.ts @@ -99,6 +99,7 @@ export type LogEvents = { | 'ProfileHeader' | 'ProfileHeaderSuggestedFollows' | 'ProfileMenu' + | 'ProfileHoverCard' } 'profile:unfollow': { logContext: @@ -108,5 +109,6 @@ export type LogEvents = { | 'ProfileHeader' | 'ProfileHeaderSuggestedFollows' | 'ProfileMenu' + | 'ProfileHoverCard' } } diff --git a/src/screens/Profile/Header/Handle.tsx b/src/screens/Profile/Header/Handle.tsx index fd1cbe5333..9ab24fbbed 100644 --- a/src/screens/Profile/Header/Handle.tsx +++ b/src/screens/Profile/Header/Handle.tsx @@ -1,10 +1,10 @@ import React from 'react' import {View} from 'react-native' import {AppBskyActorDefs} from '@atproto/api' -import {isInvalidHandle} from 'lib/strings/handles' -import {Shadow} from '#/state/cache/types' import {Trans} from '@lingui/macro' +import {Shadow} from '#/state/cache/types' +import {isInvalidHandle} from 'lib/strings/handles' import {atoms as a, useTheme, web} from '#/alf' import {Text} from '#/components/Typography' @@ -26,6 +26,7 @@ export function ProfileHeaderHandle({
) : undefined} {invalidHandle ? ⚠Invalid Handle : `@${profile.handle}`} diff --git a/src/state/queries/profile.ts b/src/state/queries/profile.ts index a962fecff7..7842d53d4d 100644 --- a/src/state/queries/profile.ts +++ b/src/state/queries/profile.ts @@ -90,8 +90,8 @@ export function useProfilesQuery({handles}: {handles: string[]}) { export function usePrefetchProfileQuery() { const queryClient = useQueryClient() const prefetchProfileQuery = useCallback( - (did: string) => { - queryClient.prefetchQuery({ + async (did: string) => { + await queryClient.prefetchQuery({ queryKey: RQKEY(did), queryFn: async () => { const res = await getAgent().getProfile({actor: did || ''}) diff --git a/src/view/com/notifications/FeedItem.tsx b/src/view/com/notifications/FeedItem.tsx index 78b1677c3d..e1dae6659f 100644 --- a/src/view/com/notifications/FeedItem.tsx +++ b/src/view/com/notifications/FeedItem.tsx @@ -1,20 +1,20 @@ -import React, {memo, useMemo, useState, useEffect} from 'react' +import React, {memo, useEffect, useMemo, useState} from 'react' import { Animated, - TouchableOpacity, Pressable, StyleSheet, + TouchableOpacity, View, } from 'react-native' import { + AppBskyActorDefs, AppBskyEmbedImages, + AppBskyEmbedRecordWithMedia, AppBskyFeedDefs, AppBskyFeedPost, - ModerationOpts, - ModerationDecision, moderateProfile, - AppBskyEmbedRecordWithMedia, - AppBskyActorDefs, + ModerationDecision, + ModerationOpts, } from '@atproto/api' import {AtUri} from '@atproto/api' import { @@ -22,28 +22,30 @@ import { FontAwesomeIconStyle, Props, } from '@fortawesome/react-native-fontawesome' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' + import {FeedNotification} from '#/state/queries/notifications/feed' -import {s, colors} from 'lib/styles' -import {niceDate} from 'lib/strings/time' +import {useAnimatedValue} from 'lib/hooks/useAnimatedValue' +import {usePalette} from 'lib/hooks/usePalette' +import {HeartIconSolid} from 'lib/icons' +import {makeProfileLink} from 'lib/routes/links' import {sanitizeDisplayName} from 'lib/strings/display-names' import {sanitizeHandle} from 'lib/strings/handles' import {pluralize} from 'lib/strings/helpers' -import {HeartIconSolid} from 'lib/icons' -import {Text} from '../util/text/Text' -import {UserAvatar, PreviewableUserAvatar} from '../util/UserAvatar' -import {UserPreviewLink} from '../util/UserPreviewLink' -import {ImageHorzList} from '../util/images/ImageHorzList' -import {Post} from '../post/Post' -import {Link, TextLink} from '../util/Link' -import {usePalette} from 'lib/hooks/usePalette' -import {useAnimatedValue} from 'lib/hooks/useAnimatedValue' -import {formatCount} from '../util/numeric/format' -import {makeProfileLink} from 'lib/routes/links' -import {TimeElapsed} from '../util/TimeElapsed' +import {niceDate} from 'lib/strings/time' +import {colors, s} from 'lib/styles' import {isWeb} from 'platform/detection' -import {Trans, msg} from '@lingui/macro' -import {useLingui} from '@lingui/react' +import {Link as NewLink} from '#/components/Link' +import {ProfileHoverCard} from '#/components/ProfileHoverCard' import {FeedSourceCard} from '../feeds/FeedSourceCard' +import {Post} from '../post/Post' +import {ImageHorzList} from '../util/images/ImageHorzList' +import {Link, TextLink} from '../util/Link' +import {formatCount} from '../util/numeric/format' +import {Text} from '../util/text/Text' +import {TimeElapsed} from '../util/TimeElapsed' +import {PreviewableUserAvatar, UserAvatar} from '../util/UserAvatar' const MAX_AUTHORS = 5 @@ -356,8 +358,10 @@ function CondensedAuthorsList({ {authors.slice(0, MAX_AUTHORS).map(author => ( - {authors.map(author => ( - - - - - - - {sanitizeDisplayName(author.displayName || author.handle)} -   - - {sanitizeHandle(author.handle)} + label={_(msg`See profile`)} + to={makeProfileLink({ + did: author.did, + handle: author.handle, + })}> + + + + + + + + + {sanitizeDisplayName(author.displayName || author.handle)} +   + + {sanitizeHandle(author.handle)} + - + - + ))} ) diff --git a/src/view/com/profile/ProfileCard.tsx b/src/view/com/profile/ProfileCard.tsx index 235139fff0..e6df5f6d0e 100644 --- a/src/view/com/profile/ProfileCard.tsx +++ b/src/view/com/profile/ProfileCard.tsx @@ -6,22 +6,23 @@ import { ModerationCause, ModerationDecision, } from '@atproto/api' -import {Link} from '../util/Link' -import {Text} from '../util/text/Text' -import {UserAvatar} from '../util/UserAvatar' -import {s} from 'lib/styles' -import {usePalette} from 'lib/hooks/usePalette' -import {FollowButton} from './FollowButton' -import {sanitizeDisplayName} from 'lib/strings/display-names' -import {sanitizeHandle} from 'lib/strings/handles' -import {makeProfileLink} from 'lib/routes/links' -import {getModerationCauseKey, isJustAMute} from 'lib/moderation' +import {Trans} from '@lingui/macro' + +import {useModerationCauseDescription} from '#/lib/moderation/useModerationCauseDescription' +import {useProfileShadow} from '#/state/cache/profile-shadow' import {Shadow} from '#/state/cache/types' import {useModerationOpts} from '#/state/queries/preferences' -import {useProfileShadow} from '#/state/cache/profile-shadow' import {useSession} from '#/state/session' -import {Trans} from '@lingui/macro' -import {useModerationCauseDescription} from '#/lib/moderation/useModerationCauseDescription' +import {usePalette} from 'lib/hooks/usePalette' +import {getModerationCauseKey, isJustAMute} from 'lib/moderation' +import {makeProfileLink} from 'lib/routes/links' +import {sanitizeDisplayName} from 'lib/strings/display-names' +import {sanitizeHandle} from 'lib/strings/handles' +import {s} from 'lib/styles' +import {Link} from '../util/Link' +import {Text} from '../util/text/Text' +import {PreviewableUserAvatar} from '../util/UserAvatar' +import {FollowButton} from './FollowButton' export function ProfileCard({ testID, @@ -76,8 +77,10 @@ export function ProfileCard({ anchorNoUnderline> - ( - diff --git a/src/view/com/profile/ProfileHeaderSuggestedFollows.tsx b/src/view/com/profile/ProfileHeaderSuggestedFollows.tsx index 3602cdb9a8..cf35885cd2 100644 --- a/src/view/com/profile/ProfileHeaderSuggestedFollows.tsx +++ b/src/view/com/profile/ProfileHeaderSuggestedFollows.tsx @@ -1,28 +1,28 @@ import React from 'react' -import {View, StyleSheet, Pressable, ScrollView} from 'react-native' +import {Pressable, ScrollView, StyleSheet, View} from 'react-native' import {AppBskyActorDefs, moderateProfile} from '@atproto/api' import { FontAwesomeIcon, FontAwesomeIconStyle, } from '@fortawesome/react-native-fontawesome' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' -import * as Toast from '../util/Toast' +import {useProfileShadow} from '#/state/cache/profile-shadow' +import {useModerationOpts} from '#/state/queries/preferences' +import {useProfileFollowMutationQueue} from '#/state/queries/profile' +import {useSuggestedFollowsByActorQuery} from '#/state/queries/suggested-follows' +import {useAnalytics} from 'lib/analytics/analytics' import {usePalette} from 'lib/hooks/usePalette' -import {Text} from 'view/com/util/text/Text' -import {UserAvatar} from 'view/com/util/UserAvatar' -import {Button} from 'view/com/util/forms/Button' +import {makeProfileLink} from 'lib/routes/links' import {sanitizeDisplayName} from 'lib/strings/display-names' import {sanitizeHandle} from 'lib/strings/handles' -import {makeProfileLink} from 'lib/routes/links' -import {Link} from 'view/com/util/Link' -import {useAnalytics} from 'lib/analytics/analytics' import {isWeb} from 'platform/detection' -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 {useLingui} from '@lingui/react' -import {Trans, msg} from '@lingui/macro' +import {Button} from 'view/com/util/forms/Button' +import {Link} from 'view/com/util/Link' +import {Text} from 'view/com/util/text/Text' +import {PreviewableUserAvatar} from 'view/com/util/UserAvatar' +import * as Toast from '../util/Toast' const OUTER_PADDING = 10 const INNER_PADDING = 14 @@ -218,8 +218,10 @@ function SuggestedFollow({ backgroundColor: pal.view.backgroundColor, }, ]}> - diff --git a/src/view/com/util/PostMeta.tsx b/src/view/com/util/PostMeta.tsx index 529fc54e01..b37c69448e 100644 --- a/src/view/com/util/PostMeta.tsx +++ b/src/view/com/util/PostMeta.tsx @@ -1,18 +1,19 @@ import React, {memo} from 'react' import {StyleProp, StyleSheet, TextStyle, View, ViewStyle} from 'react-native' -import {Text} from './text/Text' -import {TextLinkOnWebOnly} from './Link' -import {niceDate} from 'lib/strings/time' +import {AppBskyActorDefs, ModerationDecision, ModerationUI} from '@atproto/api' + +import {usePrefetchProfileQuery} from '#/state/queries/profile' import {usePalette} from 'lib/hooks/usePalette' -import {TypographyVariant} from 'lib/ThemeContext' -import {UserAvatar} from './UserAvatar' +import {makeProfileLink} from 'lib/routes/links' import {sanitizeDisplayName} from 'lib/strings/display-names' import {sanitizeHandle} from 'lib/strings/handles' +import {niceDate} from 'lib/strings/time' +import {TypographyVariant} from 'lib/ThemeContext' import {isAndroid, isWeb} from 'platform/detection' +import {TextLinkOnWebOnly} from './Link' +import {Text} from './text/Text' import {TimeElapsed} from './TimeElapsed' -import {makeProfileLink} from 'lib/routes/links' -import {AppBskyActorDefs, ModerationDecision, ModerationUI} from '@atproto/api' -import {usePrefetchProfileQuery} from '#/state/queries/profile' +import {PreviewableUserAvatar} from './UserAvatar' interface PostMetaOpts { author: AppBskyActorDefs.ProfileViewBasic @@ -38,9 +39,11 @@ let PostMeta = (opts: PostMetaOpts): React.ReactNode => { {opts.showAvatar && ( - diff --git a/src/view/com/util/UserAvatar.tsx b/src/view/com/util/UserAvatar.tsx index 4beedbd5b4..89aa56b736 100644 --- a/src/view/com/util/UserAvatar.tsx +++ b/src/view/com/util/UserAvatar.tsx @@ -1,30 +1,32 @@ import React, {memo, useMemo} from 'react' import {Image, StyleSheet, TouchableOpacity, View} from 'react-native' -import Svg, {Circle, Rect, Path} from 'react-native-svg' import {Image as RNImage} from 'react-native-image-crop-picker' -import {useLingui} from '@lingui/react' -import {msg, Trans} from '@lingui/macro' -import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' +import Svg, {Circle, Path, Rect} from 'react-native-svg' import {ModerationUI} from '@atproto/api' +import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' -import {HighPriorityImage} from 'view/com/util/images/Image' -import {openCamera, openCropper, openPicker} from '../../../lib/media/picker' -import { - usePhotoLibraryPermission, - useCameraPermission, -} from 'lib/hooks/usePermissions' -import {colors} from 'lib/styles' import {usePalette} from 'lib/hooks/usePalette' -import {isWeb, isAndroid, isNative} from 'platform/detection' -import {UserPreviewLink} from './UserPreviewLink' -import * as Menu from '#/components/Menu' import { - Camera_Stroke2_Corner0_Rounded as Camera, + useCameraPermission, + usePhotoLibraryPermission, +} from 'lib/hooks/usePermissions' +import {makeProfileLink} from 'lib/routes/links' +import {colors} from 'lib/styles' +import {isAndroid, isNative, isWeb} from 'platform/detection' +import {HighPriorityImage} from 'view/com/util/images/Image' +import {tokens, useTheme} from '#/alf' +import { Camera_Filled_Stroke2_Corner0_Rounded as CameraFilled, + Camera_Stroke2_Corner0_Rounded as Camera, } from '#/components/icons/Camera' import {StreamingLive_Stroke2_Corner0_Rounded as Library} from '#/components/icons/StreamingLive' import {Trash_Stroke2_Corner0_Rounded as Trash} from '#/components/icons/Trash' -import {useTheme, tokens} from '#/alf' +import {Link} from '#/components/Link' +import * as Menu from '#/components/Menu' +import {ProfileHoverCard} from '#/components/ProfileHoverCard' +import {openCamera, openCropper, openPicker} from '../../../lib/media/picker' export type UserAvatarType = 'user' | 'algo' | 'list' | 'labeler' @@ -372,10 +374,18 @@ export {EditableUserAvatar} let PreviewableUserAvatar = ( props: PreviewableUserAvatarProps, ): React.ReactNode => { + const {_} = useLingui() return ( - - - + + + + + ) } PreviewableUserAvatar = memo(PreviewableUserAvatar) diff --git a/src/view/com/util/UserPreviewLink.tsx b/src/view/com/util/UserPreviewLink.tsx deleted file mode 100644 index a2c46afc01..0000000000 --- a/src/view/com/util/UserPreviewLink.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react' -import {StyleProp, ViewStyle} from 'react-native' -import {Link} from './Link' -import {isWeb} from 'platform/detection' -import {makeProfileLink} from 'lib/routes/links' -import {usePrefetchProfileQuery} from '#/state/queries/profile' - -interface UserPreviewLinkProps { - did: string - handle: string - style?: StyleProp -} -export function UserPreviewLink( - props: React.PropsWithChildren, -) { - const prefetchProfileQuery = usePrefetchProfileQuery() - return ( - { - if (isWeb) { - prefetchProfileQuery(props.did) - } - }} - href={makeProfileLink(props)} - title={props.handle} - asAnchor - style={props.style}> - {props.children} - - ) -} diff --git a/yarn.lock b/yarn.lock index 1a61c8b037..39bfc6a206 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3511,6 +3511,13 @@ resolved "https://registry.yarnpkg.com/@flatten-js/interval-tree/-/interval-tree-1.1.2.tgz#fcc891da48bc230392884be01c26fe8c625702e8" integrity sha512-OwLoV9E/XM6b7bes2rSFnGNjyRy7vcoIHFTnmBR2WAaZTf0Fe4EX4GdA65vU1KgFAasti7iRSg2dZfYd1Zt00Q== +"@floating-ui/core@^1.0.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" + integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== + dependencies: + "@floating-ui/utils" "^0.2.1" + "@floating-ui/core@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.4.1.tgz#0d633f4b76052668afb932492ac452f7ebe97f17" @@ -3526,6 +3533,14 @@ "@floating-ui/core" "^1.4.1" "@floating-ui/utils" "^0.1.1" +"@floating-ui/dom@^1.6.1", "@floating-ui/dom@^1.6.3": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef" + integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== + dependencies: + "@floating-ui/core" "^1.0.0" + "@floating-ui/utils" "^0.2.0" + "@floating-ui/react-dom@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.1.tgz#7972a4fc488a8c746cded3cfe603b6057c308a91" @@ -3533,11 +3548,23 @@ dependencies: "@floating-ui/dom" "^1.3.0" +"@floating-ui/react-dom@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.8.tgz#afc24f9756d1b433e1fe0d047c24bd4d9cefaa5d" + integrity sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw== + dependencies: + "@floating-ui/dom" "^1.6.1" + "@floating-ui/utils@^0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.1.tgz#1a5b1959a528e374e8037c4396c3e825d6cf4a83" integrity sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw== +"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" + integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== + "@fortawesome/fontawesome-common-types@6.4.2": version "6.4.2" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz#1766039cad33f8ad87f9467b98e0d18fbc8f01c5" From 6218eb0eeac2ccab33c56fda97a52837edd58694 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 12 Apr 2024 17:19:58 -0500 Subject: [PATCH 049/185] Zhuzh sign in dialog (#3512) --- src/components/dialogs/Signin.tsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/components/dialogs/Signin.tsx b/src/components/dialogs/Signin.tsx index 488eb5c73a..b9c939e94b 100644 --- a/src/components/dialogs/Signin.tsx +++ b/src/components/dialogs/Signin.tsx @@ -45,7 +45,7 @@ function SigninDialogInner({}: {control: Dialog.DialogOuterProps['control']}) { - + - + Sign in or create your account to join the conversation! From c3821fdc311fe7ddebede427715892d3a1e53716 Mon Sep 17 00:00:00 2001 From: Hailey Date: Fri, 12 Apr 2024 15:22:09 -0700 Subject: [PATCH 050/185] Remove vertical scrollbars from views on native (#3429) * remove vertical scrollbars * add to a few missing lists * gate this change * use `hide_vertical_scroll_indicators` * fix gate lint * fix bool --- src/lib/statsig/gates.ts | 1 + .../com/auth/onboarding/RecommendedFeeds.tsx | 20 ++++++------ .../auth/onboarding/RecommendedFollows.tsx | 28 +++++++++-------- src/view/com/util/List.tsx | 13 +++++--- src/view/com/util/Views.jsx | 16 +++++++++- .../screens/ModerationBlockedAccounts.tsx | 31 ++++++++++++------- src/view/screens/ModerationMutedAccounts.tsx | 30 +++++++++++------- 7 files changed, 88 insertions(+), 51 deletions(-) diff --git a/src/lib/statsig/gates.ts b/src/lib/statsig/gates.ts index 81f3f19d56..314799f288 100644 --- a/src/lib/statsig/gates.ts +++ b/src/lib/statsig/gates.ts @@ -3,6 +3,7 @@ export type Gate = | 'autoexpand_suggestions_on_profile_follow' | 'disable_min_shell_on_foregrounding' | 'disable_poll_on_discover' + | 'hide_vertical_scroll_indicators' | 'new_profile_scroll_component' | 'new_search' | 'receive_updates' diff --git a/src/view/com/auth/onboarding/RecommendedFeeds.tsx b/src/view/com/auth/onboarding/RecommendedFeeds.tsx index d3318bffd8..95f8502f81 100644 --- a/src/view/com/auth/onboarding/RecommendedFeeds.tsx +++ b/src/view/com/auth/onboarding/RecommendedFeeds.tsx @@ -1,18 +1,19 @@ import React from 'react' import {ActivityIndicator, FlatList, StyleSheet, View} from 'react-native' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' -import {TabletOrDesktop, Mobile} from 'view/com/util/layouts/Breakpoints' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {useSuggestedFeedsQuery} from '#/state/queries/suggested-feeds' +import {usePalette} from 'lib/hooks/usePalette' +import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' +import {ErrorMessage} from 'view/com/util/error/ErrorMessage' +import {Button} from 'view/com/util/forms/Button' +import {Mobile, TabletOrDesktop} from 'view/com/util/layouts/Breakpoints' +import {TitleColumnLayout} from 'view/com/util/layouts/TitleColumnLayout' import {Text} from 'view/com/util/text/Text' import {ViewHeader} from 'view/com/util/ViewHeader' -import {TitleColumnLayout} from 'view/com/util/layouts/TitleColumnLayout' -import {Button} from 'view/com/util/forms/Button' import {RecommendedFeedsItem} from './RecommendedFeedsItem' -import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' -import {usePalette} from 'lib/hooks/usePalette' -import {ErrorMessage} from 'view/com/util/error/ErrorMessage' -import {Trans, msg} from '@lingui/macro' -import {useLingui} from '@lingui/react' -import {useSuggestedFeedsQuery} from '#/state/queries/suggested-feeds' type Props = { next: () => void @@ -130,6 +131,7 @@ export function RecommendedFeeds({next}: Props) { renderItem={({item}) => } keyExtractor={item => item.uri} style={{flex: 1}} + showsVerticalScrollIndicator={false} /> ) : isLoading ? ( diff --git a/src/view/com/auth/onboarding/RecommendedFollows.tsx b/src/view/com/auth/onboarding/RecommendedFollows.tsx index d275f6c90e..a840f949e4 100644 --- a/src/view/com/auth/onboarding/RecommendedFollows.tsx +++ b/src/view/com/auth/onboarding/RecommendedFollows.tsx @@ -1,21 +1,22 @@ import React from 'react' import {ActivityIndicator, FlatList, StyleSheet, View} from 'react-native' -import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {AppBskyActorDefs, moderateProfile} from '@atproto/api' -import {TabletOrDesktop, Mobile} from 'view/com/util/layouts/Breakpoints' -import {Text} from 'view/com/util/text/Text' -import {ViewHeader} from 'view/com/util/ViewHeader' -import {TitleColumnLayout} from 'view/com/util/layouts/TitleColumnLayout' -import {Button} from 'view/com/util/forms/Button' -import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' -import {usePalette} from 'lib/hooks/usePalette' -import {RecommendedFollowsItem} from './RecommendedFollowsItem' +import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {logger} from '#/logger' +import {useModerationOpts} from '#/state/queries/preferences' import {useSuggestedFollowsQuery} from '#/state/queries/suggested-follows' import {useGetSuggestedFollowersByActor} from '#/state/queries/suggested-follows' -import {useModerationOpts} from '#/state/queries/preferences' -import {logger} from '#/logger' -import {Trans, msg} from '@lingui/macro' -import {useLingui} from '@lingui/react' +import {usePalette} from 'lib/hooks/usePalette' +import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' +import {Button} from 'view/com/util/forms/Button' +import {Mobile, TabletOrDesktop} from 'view/com/util/layouts/Breakpoints' +import {TitleColumnLayout} from 'view/com/util/layouts/TitleColumnLayout' +import {Text} from 'view/com/util/text/Text' +import {ViewHeader} from 'view/com/util/ViewHeader' +import {RecommendedFollowsItem} from './RecommendedFollowsItem' type Props = { next: () => void @@ -202,6 +203,7 @@ export function RecommendedFollows({next}: Props) { )} keyExtractor={item => item.did} style={{flex: 1}} + showsVerticalScrollIndicator={false} /> )} + + ) +} + +function toShareUrl(path: string) { + return `https://bsky.app${path}` +} + +/** + * Based on a snippet of code from React, which itself was based on the escape-html library. + * Copyright (c) Meta Platforms, Inc. and affiliates + * Copyright (c) 2012-2013 TJ Holowaychuk + * Copyright (c) 2015 Andreas Lubbe + * Copyright (c) 2015 Tiancheng "Timothy" Gu + * Licensed as MIT. + */ +const matchHtmlRegExp = /["'&<>]/ +function escapeHtml(string: string) { + const str = String(string) + const match = matchHtmlRegExp.exec(str) + if (!match) { + return str + } + let escape + let html = '' + let index + let lastIndex = 0 + for (index = match.index; index < str.length; index++) { + switch (str.charCodeAt(index)) { + case 34: // " + escape = '"' + break + case 38: // & + escape = '&' + break + case 39: // ' + escape = ''' + break + case 60: // < + escape = '<' + break + case 62: // > + escape = '>' + break + default: + continue + } + if (lastIndex !== index) { + html += str.slice(lastIndex, index) + } + lastIndex = index + 1 + html += escape + } + return lastIndex !== index ? html + str.slice(lastIndex, index) : html +} diff --git a/bskyembed/src/main.tsx b/bskyembed/src/screens/post.tsx similarity index 85% rename from bskyembed/src/main.tsx rename to bskyembed/src/screens/post.tsx index 895675434c..76c921540e 100644 --- a/bskyembed/src/main.tsx +++ b/bskyembed/src/screens/post.tsx @@ -1,27 +1,27 @@ -import './index.css' +import '../index.css' import {AppBskyFeedDefs, BskyAgent} from '@atproto/api' import {h, render} from 'preact' -import logo from '../assets/logo.svg' -import {Container} from './container' -import {Link} from './link' -import {Post} from './post' -import {getRkey} from './utils' +import logo from '../../assets/logo.svg' +import {Container} from '../components/container' +import {Link} from '../components/link' +import {Post} from '../components/post' +import {getRkey} from '../utils' const root = document.getElementById('app') if (!root) throw new Error('No root element') -const searchParams = new URLSearchParams(window.location.search) - const agent = new BskyAgent({ service: 'https://public.api.bsky.app', }) -const uri = searchParams.get('uri') +const uri = `at://${window.location.pathname.slice('/embed/'.length)}` + +console.log(uri) if (!uri) { - throw new Error('No uri in query string') + throw new Error('No uri in path') } agent diff --git a/bskyembed/src/utils.ts b/bskyembed/src/utils.ts index 3408fcd97a..1f6fd5061c 100644 --- a/bskyembed/src/utils.ts +++ b/bskyembed/src/utils.ts @@ -1,3 +1,5 @@ +import {AtUri} from '@atproto/api' + export function niceDate(date: number | string | Date) { const d = new Date(date) return `${d.toLocaleDateString('en-us', { @@ -11,5 +13,6 @@ export function niceDate(date: number | string | Date) { } export function getRkey({uri}: {uri: string}): string { - return uri.split('/').pop() as string + const at = new AtUri(uri) + return at.rkey } diff --git a/bskyembed/tsconfig.snippet.json b/bskyembed/tsconfig.snippet.json new file mode 100644 index 0000000000..a6b6071dd6 --- /dev/null +++ b/bskyembed/tsconfig.snippet.json @@ -0,0 +1,10 @@ + +{ + "compilerOptions": { + "target": "ES5", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "strict": true, + "outDir": "dist" + }, + "include": ["snippet"], +} diff --git a/bskyembed/vite.config.ts b/bskyembed/vite.config.ts index 8d0b920713..9acc9d5ee4 100644 --- a/bskyembed/vite.config.ts +++ b/bskyembed/vite.config.ts @@ -1,3 +1,5 @@ +import {resolve} from 'node:path' + import preact from '@preact/preset-vite' import legacy from '@vitejs/plugin-legacy' import type {UserConfig} from 'vite' @@ -12,7 +14,13 @@ const config: UserConfig = { }), ], build: { - assetsDir: 'static/embed/assets', + assetsDir: 'static', + rollupOptions: { + input: { + index: resolve(__dirname, 'index.html'), + post: resolve(__dirname, 'post.html'), + }, + }, }, } diff --git a/bskyweb/.gitignore b/bskyweb/.gitignore index 1d945e1dab..ace9fbf51d 100644 --- a/bskyweb/.gitignore +++ b/bskyweb/.gitignore @@ -9,6 +9,10 @@ static/js/*.js static/js/*.map static/js/*.js.LICENSE.txt templates/scripts.html +templates/*-embed.html +static/embed/*.html +static/embed/assets/*.js +static/embed/assets/*.css # Don't ignore this file !.gitignore From 4c966e5d6d1cbafe7a41d58268ffcb2cee31abe8 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Sat, 13 Apr 2024 05:13:53 +0100 Subject: [PATCH 056/185] [Embeds] "Embed post" post dropdown option (#3513) * add embed option to post dropdown menu * put embed post button behind a gate * increase line height in dialog * add gate to gate name union * hide embed button if PWI optout * Ungate embed button * Escape HTML, align implementations * Make dialog conditionally rendered * Memoize EmbedDialog * Render dialog lazily --------- Co-authored-by: Dan Abramov --- .../codeBrackets_stroke2_corner0_rounded.svg | 1 + bskyembed/src/screens/landing.tsx | 6 +- src/components/dialogs/Embed.tsx | 191 ++++++++++++++++++ src/components/icons/CodeBrackets.tsx | 5 + src/lib/constants.ts | 2 + src/view/com/util/forms/PostDropdownBtn.tsx | 31 ++- src/view/com/util/post-ctrls/PostCtrls.tsx | 1 + 7 files changed, 233 insertions(+), 4 deletions(-) create mode 100644 assets/icons/codeBrackets_stroke2_corner0_rounded.svg create mode 100644 src/components/dialogs/Embed.tsx create mode 100644 src/components/icons/CodeBrackets.tsx diff --git a/assets/icons/codeBrackets_stroke2_corner0_rounded.svg b/assets/icons/codeBrackets_stroke2_corner0_rounded.svg new file mode 100644 index 0000000000..0cc239210e --- /dev/null +++ b/assets/icons/codeBrackets_stroke2_corner0_rounded.svg @@ -0,0 +1 @@ + diff --git a/bskyembed/src/screens/landing.tsx b/bskyembed/src/screens/landing.tsx index 88e84ffb67..7c8ef28108 100644 --- a/bskyembed/src/screens/landing.tsx +++ b/bskyembed/src/screens/landing.tsx @@ -159,6 +159,7 @@ function Snippet({thread}: {thread: AppBskyFeedDefs.ThreadViewPost}) { return '' } + const lang = record.langs && record.langs.length > 0 ? record.langs[0] : '' const profileHref = toShareUrl( ['/profile', thread.post.author.did].join('/'), ) @@ -167,10 +168,9 @@ function Snippet({thread}: {thread: AppBskyFeedDefs.ThreadViewPost}) { ['/profile', thread.post.author.did, 'post', urip.rkey].join('/'), ) - const lang = record.langs ? record.langs[0] : '' - // x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x - // DO NOT ADD ANY NEW INTERPOLATIOONS BELOW WITHOUT ESCAPING THEM! + // DO NOT ADD ANY NEW INTERPOLATIONS BELOW WITHOUT ESCAPING THEM! + // Also, keep this code synced with the app code in Embed.tsx. // x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x return `

${escapeHtml(record.text)}${ + record.embed + ? `

[image or embed]` + : '' + }

— ${escapeHtml( + postAuthor.displayName || postAuthor.handle, + )} (@${escapeHtml( + postAuthor.handle, + )}) ${escapeHtml( + niceDate(timestamp), + )}
` + }, [postUri, postCid, record, timestamp, postAuthor]) + + return ( + + + + Embed post + + + + Embed this post in your website. Simply copy the following snippet + and paste it into the HTML code of your website. + + + + + + + + + + + + + + ) +} + +/** + * Based on a snippet of code from React, which itself was based on the escape-html library. + * Copyright (c) Meta Platforms, Inc. and affiliates + * Copyright (c) 2012-2013 TJ Holowaychuk + * Copyright (c) 2015 Andreas Lubbe + * Copyright (c) 2015 Tiancheng "Timothy" Gu + * Licensed as MIT. + */ +const matchHtmlRegExp = /["'&<>]/ +function escapeHtml(string: string) { + const str = String(string) + const match = matchHtmlRegExp.exec(str) + if (!match) { + return str + } + let escape + let html = '' + let index + let lastIndex = 0 + for (index = match.index; index < str.length; index++) { + switch (str.charCodeAt(index)) { + case 34: // " + escape = '"' + break + case 38: // & + escape = '&' + break + case 39: // ' + escape = ''' + break + case 60: // < + escape = '<' + break + case 62: // > + escape = '>' + break + default: + continue + } + if (lastIndex !== index) { + html += str.slice(lastIndex, index) + } + lastIndex = index + 1 + html += escape + } + return lastIndex !== index ? html + str.slice(lastIndex, index) : html +} diff --git a/src/components/icons/CodeBrackets.tsx b/src/components/icons/CodeBrackets.tsx new file mode 100644 index 0000000000..59d5fca900 --- /dev/null +++ b/src/components/icons/CodeBrackets.tsx @@ -0,0 +1,5 @@ +import {createSinglePathSVG} from './TEMPLATE' + +export const CodeBrackets_Stroke2_Corner0_Rounded = createSinglePathSVG({ + path: 'M14.242 3.03a1 1 0 0 1 .728 1.213l-4 16a1 1 0 1 1-1.94-.485l4-16a1 1 0 0 1 1.213-.728ZM6.707 7.293a1 1 0 0 1 0 1.414L3.414 12l3.293 3.293a1 1 0 1 1-1.414 1.414l-4-4a1 1 0 0 1 0-1.414l4-4a1 1 0 0 1 1.414 0Zm10.586 0a1 1 0 0 1 1.414 0l4 4a1 1 0 0 1 0 1.414l-4 4a1 1 0 1 1-1.414-1.414L20.586 12l-3.293-3.293a1 1 0 0 1 0-1.414Z', +}) diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 401c39362b..bb49387c4c 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -7,6 +7,8 @@ export const BSKY_SERVICE = 'https://bsky.social' export const DEFAULT_SERVICE = BSKY_SERVICE const HELP_DESK_LANG = 'en-us' export const HELP_DESK_URL = `https://blueskyweb.zendesk.com/hc/${HELP_DESK_LANG}` +export const EMBED_SERVICE = 'https://embed.bsky.app' +export const EMBED_SCRIPT = `${EMBED_SERVICE}/static/embed.js` const BASE_FEEDBACK_FORM_URL = `${HELP_DESK_URL}/requests/new` export function FEEDBACK_FORM_URL({ diff --git a/src/view/com/util/forms/PostDropdownBtn.tsx b/src/view/com/util/forms/PostDropdownBtn.tsx index 04dfa203a1..31032396f3 100644 --- a/src/view/com/util/forms/PostDropdownBtn.tsx +++ b/src/view/com/util/forms/PostDropdownBtn.tsx @@ -28,12 +28,14 @@ import {getCurrentRoute} from 'lib/routes/helpers' import {shareUrl} from 'lib/sharing' import {toShareUrl} from 'lib/strings/url-helpers' import {useTheme} from 'lib/ThemeContext' -import {atoms as a, useTheme as useAlf} from '#/alf' +import {atoms as a, useBreakpoints, useTheme as useAlf} from '#/alf' import {useDialogControl} from '#/components/Dialog' import {useGlobalDialogsControlContext} from '#/components/dialogs/Context' +import {EmbedDialog} from '#/components/dialogs/Embed' import {ArrowOutOfBox_Stroke2_Corner0_Rounded as Share} from '#/components/icons/ArrowOutOfBox' import {BubbleQuestion_Stroke2_Corner0_Rounded as Translate} from '#/components/icons/Bubble' import {Clipboard_Stroke2_Corner2_Rounded as ClipboardIcon} from '#/components/icons/Clipboard' +import {CodeBrackets_Stroke2_Corner0_Rounded as CodeBrackets} from '#/components/icons/CodeBrackets' import {EyeSlash_Stroke2_Corner0_Rounded as EyeSlash} from '#/components/icons/EyeSlash' import {Filter_Stroke2_Corner0_Rounded as Filter} from '#/components/icons/Filter' import {Mute_Stroke2_Corner0_Rounded as Mute} from '#/components/icons/Mute' @@ -55,6 +57,7 @@ let PostDropdownBtn = ({ richText, style, hitSlop, + timestamp, }: { testID: string postAuthor: AppBskyActorDefs.ProfileViewBasic @@ -64,10 +67,12 @@ let PostDropdownBtn = ({ richText: RichTextAPI style?: StyleProp hitSlop?: PressableProps['hitSlop'] + timestamp: string }): React.ReactNode => { const {hasSession, currentAccount} = useSession() const theme = useTheme() const alf = useAlf() + const {gtMobile} = useBreakpoints() const {_} = useLingui() const defaultCtrlColor = theme.palette.default.postCtrl const langPrefs = useLanguagePrefs() @@ -83,6 +88,7 @@ let PostDropdownBtn = ({ const deletePromptControl = useDialogControl() const hidePromptControl = useDialogControl() const loggedOutWarningPromptControl = useDialogControl() + const embedPostControl = useDialogControl() const rootUri = record.reply?.root?.uri || postUri const isThreadMuted = mutedThreads.includes(rootUri) @@ -177,6 +183,8 @@ let PostDropdownBtn = ({ shareUrl(url) }, [href]) + const canEmbed = isWeb && gtMobile && !shouldShowLoggedOutWarning + return ( @@ -238,6 +246,16 @@ let PostDropdownBtn = ({ + + {canEmbed && ( + + {_(msg`Embed post`)} + + + )} {hasSession && ( @@ -350,6 +368,17 @@ let PostDropdownBtn = ({ onConfirm={onSharePost} confirmButtonCta={_(msg`Share anyway`)} /> + + {canEmbed && ( + + )} ) } diff --git a/src/view/com/util/post-ctrls/PostCtrls.tsx b/src/view/com/util/post-ctrls/PostCtrls.tsx index cd4a363730..cb50ee6dc3 100644 --- a/src/view/com/util/post-ctrls/PostCtrls.tsx +++ b/src/view/com/util/post-ctrls/PostCtrls.tsx @@ -264,6 +264,7 @@ let PostCtrls = ({ richText={richText} style={styles.btnPad} hitSlop={big ? HITSLOP_20 : HITSLOP_10} + timestamp={post.indexedAt} />
From a845587e1f0b74b087b0c59d1cdc8e6c5feaf98f Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 13 Apr 2024 05:50:09 +0100 Subject: [PATCH 057/185] [Embeds] Show error for users with PWI flag on landing (#3524) --- bskyembed/src/screens/landing.tsx | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/bskyembed/src/screens/landing.tsx b/bskyembed/src/screens/landing.tsx index 7c8ef28108..06b455981d 100644 --- a/bskyembed/src/screens/landing.tsx +++ b/bskyembed/src/screens/landing.tsx @@ -86,7 +86,14 @@ function LandingPage() { if (!AppBskyFeedDefs.isThreadViewPost(data.thread)) { throw new Error('Post not found') } - + const pwiOptOut = !!data.thread.post.author.labels?.find( + label => label.val === '!no-unauthenticated', + ) + if (pwiOptOut) { + throw new Error( + 'The author of this post has requested their posts not be displayed on external sites.', + ) + } setThread(data.thread) } catch (err) { console.error(err) @@ -113,25 +120,15 @@ function LandingPage() { className="border rounded-lg py-3 w-full max-w-[600px] px-4" placeholder={DEFAULT_POST} /> -

{error}

{uri && !error && thread && } - - {thread ? ( - - ) : ( - - - - -
- + {!error && thread && } + {error && ( +

{error}

)}
From f5bb348bf51df6f6d35eb23cdf771c184d77fec4 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sat, 13 Apr 2024 00:13:53 -0500 Subject: [PATCH 058/185] Profile hovers (#3518) * Add hover card for mentions * Reposted by * Fix key * Add to composer reply to --- src/components/ProfileHoverCard/index.web.tsx | 5 +- src/components/ProfileHoverCard/types.ts | 1 + src/components/RichText.tsx | 22 +++--- src/view/com/composer/ComposerReplyTo.tsx | 18 +++-- src/view/com/posts/FeedItem.tsx | 67 ++++++++++--------- 5 files changed, 64 insertions(+), 49 deletions(-) diff --git a/src/components/ProfileHoverCard/index.web.tsx b/src/components/ProfileHoverCard/index.web.tsx index 0d62a52a39..d0e1b58ee4 100644 --- a/src/components/ProfileHoverCard/index.web.tsx +++ b/src/components/ProfileHoverCard/index.web.tsx @@ -116,7 +116,10 @@ export function ProfileHoverCardInner(props: ProfileHoverCardProps) { ref={refs.setReference} onPointerEnter={onPointerEnterTarget} onPointerLeave={onPointerLeaveTarget} - onMouseUp={onClickTarget}> + onMouseUp={onClickTarget} + style={{ + display: props.inline ? 'inline' : 'block', + }}> {props.children} {hovered && ( diff --git a/src/components/ProfileHoverCard/types.ts b/src/components/ProfileHoverCard/types.ts index 4e70df5f0d..a62279c96c 100644 --- a/src/components/ProfileHoverCard/types.ts +++ b/src/components/ProfileHoverCard/types.ts @@ -3,4 +3,5 @@ import React from 'react' export type ProfileHoverCardProps = { children: React.ReactElement did: string + inline?: boolean } diff --git a/src/components/RichText.tsx b/src/components/RichText.tsx index 17f36c1418..82cdda1076 100644 --- a/src/components/RichText.tsx +++ b/src/components/RichText.tsx @@ -8,6 +8,7 @@ import {isNative} from '#/platform/detection' import {atoms as a, flatten, native, TextStyleProp, useTheme, web} from '#/alf' import {useInteractionState} from '#/components/hooks/useInteractionState' import {InlineLinkText, LinkProps} from '#/components/Link' +import {ProfileHoverCard} from '#/components/ProfileHoverCard' import {TagMenu, useTagMenuControl} from '#/components/TagMenu' import {Text, TextProps} from '#/components/Typography' @@ -86,16 +87,17 @@ export function RichText({ !disableLinks ) { els.push( - - {segment.text} - , + + + {segment.text} + + , ) } else if (link && AppBskyRichtextFacet.validateLink(link).success) { if (disableLinks) { diff --git a/src/view/com/composer/ComposerReplyTo.tsx b/src/view/com/composer/ComposerReplyTo.tsx index 0c1b87d04d..24a2373f5c 100644 --- a/src/view/com/composer/ComposerReplyTo.tsx +++ b/src/view/com/composer/ComposerReplyTo.tsx @@ -1,21 +1,22 @@ import React from 'react' import {LayoutAnimation, Pressable, StyleSheet, View} from 'react-native' import {Image} from 'expo-image' -import {useLingui} from '@lingui/react' -import {msg} from '@lingui/macro' import { AppBskyEmbedImages, AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, AppBskyFeedPost, } from '@atproto/api' -import {ComposerOptsPostRef} from 'state/shell/composer' +import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' + import {usePalette} from 'lib/hooks/usePalette' import {sanitizeDisplayName} from 'lib/strings/display-names' import {sanitizeHandle} from 'lib/strings/handles' -import {UserAvatar} from 'view/com/util/UserAvatar' -import {Text} from 'view/com/util/text/Text' +import {ComposerOptsPostRef} from 'state/shell/composer' import {QuoteEmbed} from 'view/com/util/post-embeds/QuoteEmbed' +import {Text} from 'view/com/util/text/Text' +import {PreviewableUserAvatar} from 'view/com/util/UserAvatar' export function ComposerReplyTo({replyTo}: {replyTo: ComposerOptsPostRef}) { const pal = usePalette('default') @@ -83,9 +84,11 @@ export function ComposerReplyTo({replyTo}: {replyTo: ComposerOptsPostRef}) { accessibilityHint={_( msg`Expand or collapse the full post you are replying to`, )}> - @@ -216,6 +219,7 @@ function ComposerReplyToImages({ const styles = StyleSheet.create({ replyToLayout: { flexDirection: 'row', + alignItems: 'flex-start', borderTopWidth: 1, paddingTop: 16, paddingBottom: 16, diff --git a/src/view/com/posts/FeedItem.tsx b/src/view/com/posts/FeedItem.tsx index 0fbcc4a13c..cc403b7742 100644 --- a/src/view/com/posts/FeedItem.tsx +++ b/src/view/com/posts/FeedItem.tsx @@ -11,31 +11,33 @@ import { FontAwesomeIcon, FontAwesomeIconStyle, } from '@fortawesome/react-native-fontawesome' -import {ReasonFeedSource, isReasonFeedSource} from 'lib/api/feed/types' -import {Link, TextLinkOnWebOnly, TextLink} from '../util/Link' -import {Text} from '../util/text/Text' -import {UserInfoText} from '../util/UserInfoText' -import {PostMeta} from '../util/PostMeta' -import {PostCtrls} from '../util/post-ctrls/PostCtrls' -import {PostEmbeds} from '../util/post-embeds' -import {ContentHider} from '#/components/moderation/ContentHider' -import {PostAlerts} from '../../../components/moderation/PostAlerts' -import {LabelsOnMyPost} from '../../../components/moderation/LabelsOnMe' -import {RichText} from '#/components/RichText' -import {PreviewableUserAvatar} from '../util/UserAvatar' -import {s} from 'lib/styles' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {POST_TOMBSTONE, Shadow, usePostShadow} from '#/state/cache/post-shadow' +import {useComposerControls} from '#/state/shell/composer' +import {isReasonFeedSource, ReasonFeedSource} from 'lib/api/feed/types' +import {MAX_POST_LINES} from 'lib/constants' import {usePalette} from 'lib/hooks/usePalette' +import {makeProfileLink} from 'lib/routes/links' import {sanitizeDisplayName} from 'lib/strings/display-names' import {sanitizeHandle} from 'lib/strings/handles' -import {makeProfileLink} from 'lib/routes/links' -import {MAX_POST_LINES} from 'lib/constants' import {countLines} from 'lib/strings/helpers' -import {useComposerControls} from '#/state/shell/composer' -import {Shadow, usePostShadow, POST_TOMBSTONE} from '#/state/cache/post-shadow' -import {FeedNameText} from '../util/FeedInfoText' -import {Trans, msg} from '@lingui/macro' -import {useLingui} from '@lingui/react' +import {s} from 'lib/styles' import {atoms as a} from '#/alf' +import {ContentHider} from '#/components/moderation/ContentHider' +import {ProfileHoverCard} from '#/components/ProfileHoverCard' +import {RichText} from '#/components/RichText' +import {LabelsOnMyPost} from '../../../components/moderation/LabelsOnMe' +import {PostAlerts} from '../../../components/moderation/PostAlerts' +import {FeedNameText} from '../util/FeedInfoText' +import {Link, TextLink, TextLinkOnWebOnly} from '../util/Link' +import {PostCtrls} from '../util/post-ctrls/PostCtrls' +import {PostEmbeds} from '../util/post-embeds' +import {PostMeta} from '../util/PostMeta' +import {Text} from '../util/text/Text' +import {PreviewableUserAvatar} from '../util/UserAvatar' +import {UserInfoText} from '../util/UserInfoText' export function FeedItem({ post, @@ -213,17 +215,20 @@ let FeedItemInner = ({ numberOfLines={1}> Reposted by{' '} - + + + From 826f6b043ca73f3cc459fbac62ae6de5f82e362b Mon Sep 17 00:00:00 2001 From: Hailey Date: Sat, 13 Apr 2024 03:18:18 -0700 Subject: [PATCH 059/185] Moderate content in embeds (#3525) * move info to its own file * Revert "move info to its own file" This reverts commit 1d45a2f4034f50cbe9cb25070f954042cdf9127a. * better way * all cases * pass labelInfo to ImageEmbed * blur avatars * add back as string * one more as string * external embed * add back as string again --- bskyembed/src/components/embed.tsx | 70 +++++++++++++++++++++++++----- bskyembed/src/components/post.tsx | 17 +++++--- bskyembed/src/labels.ts | 21 +++++++++ 3 files changed, 91 insertions(+), 17 deletions(-) create mode 100644 bskyembed/src/labels.ts diff --git a/bskyembed/src/components/embed.tsx b/bskyembed/src/components/embed.tsx index 2f9f6b3cdb..d880199652 100644 --- a/bskyembed/src/components/embed.tsx +++ b/bskyembed/src/components/embed.tsx @@ -9,23 +9,33 @@ import { AppBskyLabelerDefs, } from '@atproto/api' import {ComponentChildren, h} from 'preact' +import {useMemo} from 'preact/hooks' import infoIcon from '../../assets/circleInfo_stroke2_corner0_rounded.svg' +import {CONTENT_LABELS, labelsToInfo} from '../labels' import {getRkey} from '../utils' import {Link} from './link' -export function Embed({content}: {content: AppBskyFeedDefs.PostView['embed']}) { +export function Embed({ + content, + labels, +}: { + content: AppBskyFeedDefs.PostView['embed'] + labels: AppBskyFeedDefs.PostView['labels'] +}) { + const labelInfo = useMemo(() => labelsToInfo(labels), [labels]) + if (!content) return null try { // Case 1: Image if (AppBskyEmbedImages.isView(content)) { - return + return } // Case 2: External link if (AppBskyEmbedExternal.isView(content)) { - return + return } // Case 3: Record (quote or linked post) @@ -50,15 +60,22 @@ export function Embed({content}: {content: AppBskyFeedDefs.PostView['embed']}) { if (AppBskyFeedPost.isRecord(record.value)) { text = record.value.text } + + const isAuthorLabeled = record.author.labels?.some(label => + CONTENT_LABELS.includes(label.val), + ) + return (
- +
+ +

{record.author.displayName} @@ -74,7 +91,11 @@ export function Embed({content}: {content: AppBskyFeedDefs.PostView['embed']}) { return false }) .map(embed => ( - + ))} ) @@ -137,15 +158,19 @@ export function Embed({content}: {content: AppBskyFeedDefs.PostView['embed']}) { } // Case 4: Record with media - if (AppBskyEmbedRecordWithMedia.isView(content)) { + if ( + AppBskyEmbedRecordWithMedia.isView(content) && + AppBskyEmbedRecord.isViewRecord(content.record.record) + ) { return (

- +
) @@ -168,7 +193,17 @@ function Info({children}: {children: ComponentChildren}) { ) } -function ImageEmbed({content}: {content: AppBskyEmbedImages.View}) { +function ImageEmbed({ + content, + labelInfo, +}: { + content: AppBskyEmbedImages.View + labelInfo?: string +}) { + if (labelInfo) { + return {labelInfo} + } + switch (content.images.length) { case 1: return ( @@ -229,7 +264,13 @@ function ImageEmbed({content}: {content: AppBskyEmbedImages.View}) { } } -function ExternalEmbed({content}: {content: AppBskyEmbedExternal.View}) { +function ExternalEmbed({ + content, + labelInfo, +}: { + content: AppBskyEmbedExternal.View + labelInfo?: string +}) { function toNiceDomain(url: string): string { try { const urlp = new URL(url) @@ -238,6 +279,11 @@ function ExternalEmbed({content}: {content: AppBskyEmbedExternal.View}) { return url } } + + if (labelInfo) { + return {labelInfo} + } + return ( + CONTENT_LABELS.includes(label.val), + ) + let record: AppBskyFeedPost.Record | null = null if (AppBskyFeedPost.isRecord(post.record)) { record = post.record @@ -28,10 +33,12 @@ export function Post({thread}: Props) {
- +
+ +
- +
From acbadc610bc373752cf19e17ea48d1921dd5315e Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Sat, 13 Apr 2024 11:42:23 +0100 Subject: [PATCH 061/185] add hideRecord prop (#3527) --- bskyembed/src/components/embed.tsx | 34 ++++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/bskyembed/src/components/embed.tsx b/bskyembed/src/components/embed.tsx index d880199652..4457defce4 100644 --- a/bskyembed/src/components/embed.tsx +++ b/bskyembed/src/components/embed.tsx @@ -19,9 +19,11 @@ import {Link} from './link' export function Embed({ content, labels, + hideRecord, }: { content: AppBskyFeedDefs.PostView['embed'] labels: AppBskyFeedDefs.PostView['labels'] + hideRecord?: boolean }) { const labelInfo = useMemo(() => labelsToInfo(labels), [labels]) @@ -40,6 +42,10 @@ export function Embed({ // Case 3: Record (quote or linked post) if (AppBskyEmbedRecord.isView(content)) { + if (hideRecord) { + return null + } + const record = content.record // Case 3.1: Post @@ -84,19 +90,14 @@ export function Embed({

{text &&

{text}

} - {record.embeds - ?.filter(embed => { - if (AppBskyEmbedImages.isView(embed)) return true - if (AppBskyEmbedExternal.isView(embed)) return true - return false - }) - .map(embed => ( - - ))} + {record.embeds?.map(embed => ( + + ))} ) } @@ -164,13 +165,18 @@ export function Embed({ ) { return (
- +
) From c3f75330ed995121f7eb7cde435396741493b7b3 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 13 Apr 2024 11:46:16 +0100 Subject: [PATCH 062/185] More obvious click area (#3528) --- bskyembed/src/components/post.tsx | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/bskyembed/src/components/post.tsx b/bskyembed/src/components/post.tsx index d0eaf228ac..3f2c745bdd 100644 --- a/bskyembed/src/components/post.tsx +++ b/bskyembed/src/components/post.tsx @@ -31,7 +31,7 @@ export function Post({thread}: Props) { return (
-
+
-
+
@@ -52,6 +52,7 @@ export function Post({thread}: Props) {

@{post.author.handle}

+
@@ -60,12 +61,14 @@ export function Post({thread}: Props) {
- -
+ + + +
{!!post.likeCount && (
From 1390b1dc9e35aafda328877c46e90860c6268453 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 13 Apr 2024 12:09:49 +0100 Subject: [PATCH 063/185] [Statsig] Send ref source (#3531) * [Statsig] Send ref source * Add is web check * Fix types --- src/lib/statsig/statsig.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/lib/statsig/statsig.tsx b/src/lib/statsig/statsig.tsx index 7513b945c6..3d2dc13092 100644 --- a/src/lib/statsig/statsig.tsx +++ b/src/lib/statsig/statsig.tsx @@ -9,11 +9,20 @@ import { } from 'statsig-react-native-expo' import {logger} from '#/logger' +import {isWeb} from '#/platform/detection' import {IS_TESTFLIGHT} from 'lib/app-info' import {useSession} from '../../state/session' import {LogEvents} from './events' import {Gate} from './gates' +let refSrc: string | undefined +let refUrl: string | undefined +if (isWeb && typeof window !== 'undefined') { + const params = new URLSearchParams(window.location.search) + refSrc = params.get('ref_src') ?? undefined + refUrl = params.get('ref_url') ?? undefined +} + export type {LogEvents} const statsigOptions = { @@ -97,6 +106,8 @@ function toStatsigUser(did: string | undefined) { userID, platform: Platform.OS, custom: { + refSrc, + refUrl, // Need to specify here too for gating. platform: Platform.OS, }, From 9fb20915e890be0993c15ad19b59105b78cf8f12 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 13 Apr 2024 12:19:21 +0100 Subject: [PATCH 064/185] [Embed] Don't reuse DOM when changing embed (#3530) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Don't reuse DOM when changing embed * add skeleton loading state 💀 * autoselect text --------- Co-authored-by: Samuel Newman --- bskyembed/src/components/container.tsx | 6 +-- bskyembed/src/screens/landing.tsx | 51 +++++++++++++++++++++----- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/bskyembed/src/components/container.tsx b/bskyembed/src/components/container.tsx index a96addc8ce..5b1b2b7fb4 100644 --- a/bskyembed/src/components/container.tsx +++ b/bskyembed/src/components/container.tsx @@ -8,7 +8,7 @@ export function Container({ href, }: { children: ComponentChildren - href: string + href?: string }) { const ref = useRef(null) const prevHeight = useRef(0) @@ -39,7 +39,7 @@ export function Container({ ref={ref} className="w-full bg-white hover:bg-neutral-50 relative transition-colors max-w-[600px] min-w-[300px] flex border rounded-xl" onClick={() => { - if (ref.current) { + if (ref.current && href) { // forwardRef requires preact/compat - let's keep it simple // to keep the bundle size down const anchor = ref.current.querySelector('a') @@ -48,7 +48,7 @@ export function Container({ } } }}> - + {href && }
{children}
) diff --git a/bskyembed/src/screens/landing.tsx b/bskyembed/src/screens/landing.tsx index f10100baa3..0c55089357 100644 --- a/bskyembed/src/screens/landing.tsx +++ b/bskyembed/src/screens/landing.tsx @@ -1,7 +1,7 @@ import '../index.css' import {AppBskyFeedDefs, AppBskyFeedPost, AtUri, BskyAgent} from '@atproto/api' -import {Fragment, h, render} from 'preact' +import {h, render} from 'preact' import {useEffect, useMemo, useRef, useState} from 'preact/hooks' import arrowBottom from '../../assets/arrowBottom_stroke2_corner0_rounded.svg' @@ -30,6 +30,7 @@ render(, root) function LandingPage() { const [uri, setUri] = useState('') const [error, setError] = useState(null) + const [loading, setLoading] = useState(false) const [thread, setThread] = useState( null, ) @@ -37,6 +38,8 @@ function LandingPage() { useEffect(() => { void (async () => { setError(null) + setThread(null) + setLoading(true) try { let atUri = DEFAULT_URI @@ -98,6 +101,8 @@ function LandingPage() { } catch (err) { console.error(err) setError(err instanceof Error ? err.message : 'Invalid Bluesky URL') + } finally { + setLoading(false) } })() }, [uri]) @@ -122,19 +127,42 @@ function LandingPage() { -
- {uri && !error && thread && } - {!error && thread && } - {error && ( -
-

{error}

-
- )} -
+ {loading ? ( + + ) : ( +
+ {!error && thread && uri && } + {!error && thread && } + {error && ( +
+

{error}

+
+ )} +
+ )} ) } +function Skeleton() { + return ( + +
+
+
+
+
+
+
+
+
+
+
+
+ + ) +} + function Snippet({thread}: {thread: AppBskyFeedDefs.ThreadViewPost}) { const ref = useRef(null) const [copied, setCopied] = useState(false) @@ -195,6 +223,9 @@ function Snippet({thread}: {thread: AppBskyFeedDefs.ThreadViewPost}) { className="border rounded-lg py-3 w-full px-4" readOnly autoFocus + onFocus={() => { + ref.current?.select() + }} />
From 7543f72b778804b5293bb04505da01e8cc2bace1 Mon Sep 17 00:00:00 2001 From: Hailey Date: Sat, 13 Apr 2024 16:55:49 -0700 Subject: [PATCH 075/185] Remove extra wrapper on notification user links (#3548) --- src/view/com/notifications/FeedItem.tsx | 47 ++++++++++++------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/view/com/notifications/FeedItem.tsx b/src/view/com/notifications/FeedItem.tsx index e1dae6659f..3c9c64061a 100644 --- a/src/view/com/notifications/FeedItem.tsx +++ b/src/view/com/notifications/FeedItem.tsx @@ -420,31 +420,30 @@ function ExpandedAuthorsList({ to={makeProfileLink({ did: author.did, handle: author.handle, - })}> - - - - - - - - - {sanitizeDisplayName(author.displayName || author.handle)} -   - - {sanitizeHandle(author.handle)} - + })} + style={styles.expandedAuthor}> + + + + + + + + {sanitizeDisplayName(author.displayName || author.handle)} +   + + {sanitizeHandle(author.handle)} - + ))} From 3b9c5ceeb3c5944e5de7b3fdec9be83d2a3da2f1 Mon Sep 17 00:00:00 2001 From: Hailey Date: Sat, 13 Apr 2024 17:02:32 -0700 Subject: [PATCH 076/185] Cache DID and profile basic on profile card presses (#3523) * cache profiles add onPress back rm log cache profile and did when pressing profile card * minimal diff --- src/view/com/profile/ProfileCard.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/view/com/profile/ProfileCard.tsx b/src/view/com/profile/ProfileCard.tsx index e6df5f6d0e..b52573a018 100644 --- a/src/view/com/profile/ProfileCard.tsx +++ b/src/view/com/profile/ProfileCard.tsx @@ -1,4 +1,4 @@ -import * as React from 'react' +import React from 'react' import {StyleProp, StyleSheet, View, ViewStyle} from 'react-native' import { AppBskyActorDefs, @@ -7,6 +7,7 @@ import { ModerationDecision, } from '@atproto/api' import {Trans} from '@lingui/macro' +import {useQueryClient} from '@tanstack/react-query' import {useModerationCauseDescription} from '#/lib/moderation/useModerationCauseDescription' import {useProfileShadow} from '#/state/cache/profile-shadow' @@ -19,6 +20,8 @@ import {makeProfileLink} from 'lib/routes/links' import {sanitizeDisplayName} from 'lib/strings/display-names' import {sanitizeHandle} from 'lib/strings/handles' import {s} from 'lib/styles' +import {profileBasicQueryKey as RQKEY_PROFILE_BASIC} from 'state/queries/profile' +import {RQKEY as RQKEY_URI} from 'state/queries/resolve-uri' import {Link} from '../util/Link' import {Text} from '../util/text/Text' import {PreviewableUserAvatar} from '../util/UserAvatar' @@ -47,10 +50,19 @@ export function ProfileCard({ onPress?: () => void style?: StyleProp }) { + const queryClient = useQueryClient() const pal = usePalette('default') const profile = useProfileShadow(profileUnshadowed) const moderationOpts = useModerationOpts() const isLabeler = profile?.associated?.labeler + + const onBeforePress = React.useCallback(() => { + onPress?.() + + queryClient.setQueryData(RQKEY_URI(profile.handle), profile.did) + queryClient.setQueryData(RQKEY_PROFILE_BASIC(profile.did), profile) + }, [onPress, profile, queryClient]) + if (!moderationOpts) { return null } @@ -72,8 +84,8 @@ export function ProfileCard({ ]} href={makeProfileLink(profile)} title={profile.handle} - onBeforePress={onPress} asAnchor + onBeforePress={onBeforePress} anchorNoUnderline> From cb3f246822516bfca5b77d0f291bc24b27b4c48b Mon Sep 17 00:00:00 2001 From: Nick Manos Date: Sat, 13 Apr 2024 20:02:44 -0400 Subject: [PATCH 077/185] Fix Android in-app browser closing when switching apps (#3546) --- src/state/preferences/in-app-browser.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/state/preferences/in-app-browser.tsx b/src/state/preferences/in-app-browser.tsx index 2398f1f812..73c4bbbe78 100644 --- a/src/state/preferences/in-app-browser.tsx +++ b/src/state/preferences/in-app-browser.tsx @@ -1,15 +1,16 @@ import React from 'react' -import * as persisted from '#/state/persisted' import {Linking} from 'react-native' import * as WebBrowser from 'expo-web-browser' + import {isNative} from '#/platform/detection' -import {useModalControls} from '../modals' +import * as persisted from '#/state/persisted' import {usePalette} from 'lib/hooks/usePalette' import { + createBskyAppAbsoluteUrl, isBskyRSSUrl, isRelativeUrl, - createBskyAppAbsoluteUrl, } from 'lib/strings/url-helpers' +import {useModalControls} from '../modals' type StateContext = persisted.Schema['useInAppBrowser'] type SetContext = (v: persisted.Schema['useInAppBrowser']) => void @@ -78,6 +79,7 @@ export function useOpenLink() { presentationStyle: WebBrowser.WebBrowserPresentationStyle.FULL_SCREEN, toolbarColor: pal.colors.backgroundLight, + createTask: false, }) return } From 23056daa292905b0019565dc0c42870037ed98fe Mon Sep 17 00:00:00 2001 From: Mary <148872143+mary-ext@users.noreply.github.com> Date: Sun, 14 Apr 2024 07:13:05 +0700 Subject: [PATCH 078/185] fix: only close drawer if directly tapping backdrop (#3534) --- src/view/shell/index.web.tsx | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/view/shell/index.web.tsx b/src/view/shell/index.web.tsx index 51fb4a0a11..9dab23671f 100644 --- a/src/view/shell/index.web.tsx +++ b/src/view/shell/index.web.tsx @@ -1,5 +1,5 @@ import React, {useEffect} from 'react' -import {StyleSheet, TouchableOpacity, View} from 'react-native' +import {StyleSheet, TouchableWithoutFeedback, View} from 'react-native' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useNavigation} from '@react-navigation/native' @@ -51,15 +51,21 @@ function ShellInner() { {!isDesktop && isDrawerOpen && ( - setDrawerOpen(false)} - style={styles.drawerMask} + { + // Only close if press happens outside of the drawer + if (ev.target === ev.currentTarget) { + setDrawerOpen(false) + } + }} accessibilityLabel={_(msg`Close navigation footer`)} accessibilityHint={_(msg`Closes bottom navigation bar`)}> - - + + + + - + )} ) From 0b43d728e4b95fe2f8085b8d01e34963f8663c0d Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Sat, 13 Apr 2024 19:49:52 -0700 Subject: [PATCH 079/185] Improve the language behaviors around the PWI (#3545) * Handle leftnav overflow with longer languages' copy * Update the language dropdown to set ALL language prefs * Add hackfix to language cachebusting on PWI * Reset feeds on language change --- src/components/AppLanguageDropdown.tsx | 10 ++- src/components/AppLanguageDropdown.web.tsx | 10 ++- src/lib/api/feed/custom.ts | 81 +++++++++++++++++++--- src/state/preferences/languages.tsx | 8 ++- src/state/queries/post-feed.ts | 8 +++ src/view/shell/NavSignupCard.tsx | 8 ++- 6 files changed, 111 insertions(+), 14 deletions(-) diff --git a/src/components/AppLanguageDropdown.tsx b/src/components/AppLanguageDropdown.tsx index dea9e66fbf..02cd0ce2d4 100644 --- a/src/components/AppLanguageDropdown.tsx +++ b/src/components/AppLanguageDropdown.tsx @@ -1,16 +1,19 @@ import React from 'react' import {View} from 'react-native' import RNPickerSelect, {PickerSelectProps} from 'react-native-picker-select' +import {useQueryClient} from '@tanstack/react-query' import {sanitizeAppLanguageSetting} from '#/locale/helpers' import {APP_LANGUAGES} from '#/locale/languages' import {useLanguagePrefs, useLanguagePrefsApi} from '#/state/preferences' +import {resetPostsFeedQueries} from '#/state/queries/post-feed' import {atoms as a, useTheme} from '#/alf' import {ChevronBottom_Stroke2_Corner0_Rounded as ChevronDown} from '#/components/icons/Chevron' export function AppLanguageDropdown() { const t = useTheme() + const queryClient = useQueryClient() const langPrefs = useLanguagePrefs() const setLangPrefs = useLanguagePrefsApi() const sanitizedLang = sanitizeAppLanguageSetting(langPrefs.appLanguage) @@ -21,8 +24,13 @@ export function AppLanguageDropdown() { if (sanitizedLang !== value) { setLangPrefs.setAppLanguage(sanitizeAppLanguageSetting(value)) } + setLangPrefs.setPrimaryLanguage(value) + setLangPrefs.setContentLanguage(value) + + // reset feeds to refetch content + resetPostsFeedQueries(queryClient) }, - [sanitizedLang, setLangPrefs], + [sanitizedLang, setLangPrefs, queryClient], ) return ( diff --git a/src/components/AppLanguageDropdown.web.tsx b/src/components/AppLanguageDropdown.web.tsx index 8052a4ef3e..aea1b2b900 100644 --- a/src/components/AppLanguageDropdown.web.tsx +++ b/src/components/AppLanguageDropdown.web.tsx @@ -1,9 +1,11 @@ import React from 'react' import {View} from 'react-native' +import {useQueryClient} from '@tanstack/react-query' import {sanitizeAppLanguageSetting} from '#/locale/helpers' import {APP_LANGUAGES} from '#/locale/languages' import {useLanguagePrefs, useLanguagePrefsApi} from '#/state/preferences' +import {resetPostsFeedQueries} from '#/state/queries/post-feed' import {atoms as a, useTheme} from '#/alf' import {ChevronBottom_Stroke2_Corner0_Rounded as ChevronDown} from '#/components/icons/Chevron' import {Text} from '#/components/Typography' @@ -11,6 +13,7 @@ import {Text} from '#/components/Typography' export function AppLanguageDropdown() { const t = useTheme() + const queryClient = useQueryClient() const langPrefs = useLanguagePrefs() const setLangPrefs = useLanguagePrefsApi() @@ -24,8 +27,13 @@ export function AppLanguageDropdown() { if (sanitizedLang !== value) { setLangPrefs.setAppLanguage(sanitizeAppLanguageSetting(value)) } + setLangPrefs.setPrimaryLanguage(value) + setLangPrefs.setContentLanguage(value) + + // reset feeds to refetch content + resetPostsFeedQueries(queryClient) }, - [sanitizedLang, setLangPrefs], + [sanitizedLang, setLangPrefs, queryClient], ) return ( diff --git a/src/lib/api/feed/custom.ts b/src/lib/api/feed/custom.ts index 41c5367e57..bd30d58acb 100644 --- a/src/lib/api/feed/custom.ts +++ b/src/lib/api/feed/custom.ts @@ -1,10 +1,12 @@ import { AppBskyFeedDefs, AppBskyFeedGetFeed as GetCustomFeed, + AtpAgent, } from '@atproto/api' -import {FeedAPI, FeedAPIResponse} from './types' -import {getAgent} from '#/state/session' + import {getContentLanguages} from '#/state/preferences/languages' +import {getAgent} from '#/state/session' +import {FeedAPI, FeedAPIResponse} from './types' export class CustomFeedAPI implements FeedAPI { constructor(public params: GetCustomFeed.QueryParams) {} @@ -29,14 +31,17 @@ export class CustomFeedAPI implements FeedAPI { limit: number }): Promise { const contentLangs = getContentLanguages().join(',') - const res = await getAgent().app.bsky.feed.getFeed( - { - ...this.params, - cursor, - limit, - }, - {headers: {'Accept-Language': contentLangs}}, - ) + const agent = getAgent() + const res = agent.session + ? await getAgent().app.bsky.feed.getFeed( + { + ...this.params, + cursor, + limit, + }, + {headers: {'Accept-Language': contentLangs}}, + ) + : await loggedOutFetch({...this.params, cursor, limit}) if (res.success) { // NOTE // some custom feeds fail to enforce the pagination limit @@ -55,3 +60,59 @@ export class CustomFeedAPI implements FeedAPI { } } } + +// HACK +// we want feeds to give language-specific results immediately when a +// logged-out user changes their language. this comes with two problems: +// 1. not all languages have content, and +// 2. our public caching layer isnt correctly busting against the accept-language header +// for now we handle both of these with a manual workaround +// -prf +async function loggedOutFetch({ + feed, + limit, + cursor, +}: { + feed: string + limit: number + cursor?: string +}) { + let contentLangs = getContentLanguages().join(',') + + // manually construct fetch call so we can add the `lang` cache-busting param + let res = await AtpAgent.fetch!( + `https://api.bsky.app/xrpc/app.bsky.feed.getFeed?feed=${feed}${ + cursor ? `&cursor=${cursor}` : '' + }&limit=${limit}&lang=${contentLangs}`, + 'GET', + {'Accept-Language': contentLangs}, + undefined, + ) + if (res.body?.feed?.length) { + return { + success: true, + data: res.body, + } + } + + // no data, try again with language headers removed + res = await AtpAgent.fetch!( + `https://api.bsky.app/xrpc/app.bsky.feed.getFeed?feed=${feed}${ + cursor ? `&cursor=${cursor}` : '' + }&limit=${limit}`, + 'GET', + {'Accept-Language': ''}, + undefined, + ) + if (res.body?.feed?.length) { + return { + success: true, + data: res.body, + } + } + + return { + success: false, + data: {feed: []}, + } +} diff --git a/src/state/preferences/languages.tsx b/src/state/preferences/languages.tsx index df774c05e2..b7494c1f93 100644 --- a/src/state/preferences/languages.tsx +++ b/src/state/preferences/languages.tsx @@ -1,6 +1,7 @@ import React from 'react' -import * as persisted from '#/state/persisted' + import {AppLanguage} from '#/locale/languages' +import * as persisted from '#/state/persisted' type SetStateCb = ( s: persisted.Schema['languagePrefs'], @@ -9,6 +10,7 @@ type StateContext = persisted.Schema['languagePrefs'] type ApiContext = { setPrimaryLanguage: (code2: string) => void setPostLanguage: (commaSeparatedLangCodes: string) => void + setContentLanguage: (code2: string) => void toggleContentLanguage: (code2: string) => void togglePostLanguage: (code2: string) => void savePostLanguageToHistory: () => void @@ -21,6 +23,7 @@ const stateContext = React.createContext( const apiContext = React.createContext({ setPrimaryLanguage: (_: string) => {}, setPostLanguage: (_: string) => {}, + setContentLanguage: (_: string) => {}, toggleContentLanguage: (_: string) => {}, togglePostLanguage: (_: string) => {}, savePostLanguageToHistory: () => {}, @@ -53,6 +56,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) { setPostLanguage(commaSeparatedLangCodes: string) { setStateWrapped(s => ({...s, postLanguage: commaSeparatedLangCodes})) }, + setContentLanguage(code2: string) { + setStateWrapped(s => ({...s, contentLanguages: [code2]})) + }, toggleContentLanguage(code2: string) { setStateWrapped(s => { const exists = s.contentLanguages.includes(code2) diff --git a/src/state/queries/post-feed.ts b/src/state/queries/post-feed.ts index ee22bac691..3453a77648 100644 --- a/src/state/queries/post-feed.ts +++ b/src/state/queries/post-feed.ts @@ -459,6 +459,14 @@ function assertSomePostsPassModeration(feed: AppBskyFeedDefs.FeedViewPost[]) { } } +export function resetPostsFeedQueries(queryClient: QueryClient, timeout = 0) { + setTimeout(() => { + queryClient.resetQueries({ + predicate: query => query.queryKey[0] === RQKEY_ROOT, + }) + }, timeout) +} + export function resetProfilePostsQueries( queryClient: QueryClient, did: string, diff --git a/src/view/shell/NavSignupCard.tsx b/src/view/shell/NavSignupCard.tsx index aa807f0cc6..12bfa7ea05 100644 --- a/src/view/shell/NavSignupCard.tsx +++ b/src/view/shell/NavSignupCard.tsx @@ -48,7 +48,13 @@ let NavSignupCard = ({}: {}): React.ReactNode => { - + ) : ( + ) : null} + @@ -586,7 +613,7 @@ const styles = StyleSheet.create({ }, bottomBar: { flexDirection: 'row', - paddingVertical: 10, + paddingVertical: 4, paddingLeft: 15, paddingRight: 20, alignItems: 'center', diff --git a/src/view/com/composer/photos/OpenCameraBtn.tsx b/src/view/com/composer/photos/OpenCameraBtn.tsx index 4353704d57..8f9152e34d 100644 --- a/src/view/com/composer/photos/OpenCameraBtn.tsx +++ b/src/view/com/composer/photos/OpenCameraBtn.tsx @@ -1,32 +1,31 @@ import React, {useCallback} from 'react' -import {TouchableOpacity, StyleSheet} from 'react-native' import * as MediaLibrary from 'expo-media-library' -import { - FontAwesomeIcon, - FontAwesomeIconStyle, -} from '@fortawesome/react-native-fontawesome' -import {usePalette} from 'lib/hooks/usePalette' -import {useAnalytics} from 'lib/analytics/analytics' -import {openCamera} from 'lib/media/picker' -import {useCameraPermission} from 'lib/hooks/usePermissions' -import {HITSLOP_10, POST_IMG_MAX} from 'lib/constants' -import {GalleryModel} from 'state/models/media/gallery' -import {isMobileWeb, isNative} from 'platform/detection' -import {logger} from '#/logger' -import {useLingui} from '@lingui/react' import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {useAnalytics} from '#/lib/analytics/analytics' +import {POST_IMG_MAX} from '#/lib/constants' +import {useCameraPermission} from '#/lib/hooks/usePermissions' +import {openCamera} from '#/lib/media/picker' +import {logger} from '#/logger' +import {isMobileWeb, isNative} from '#/platform/detection' +import {GalleryModel} from '#/state/models/media/gallery' +import {atoms as a, useTheme} from '#/alf' +import {Button} from '#/components/Button' +import {Camera_Stroke2_Corner0_Rounded as Camera} from '#/components/icons/Camera' type Props = { gallery: GalleryModel + disabled?: boolean } -export function OpenCameraBtn({gallery}: Props) { - const pal = usePalette('default') +export function OpenCameraBtn({gallery, disabled}: Props) { const {track} = useAnalytics() const {_} = useLingui() const {requestCameraAccessIfNeeded} = useCameraPermission() const [mediaPermissionRes, requestMediaPermission] = MediaLibrary.usePermissions() + const t = useTheme() const onPressTakePicture = useCallback(async () => { track('Composer:CameraOpened') @@ -68,25 +67,17 @@ export function OpenCameraBtn({gallery}: Props) { } return ( - - - + label={_(msg`Camera`)} + accessibilityHint={_(msg`Opens camera on device`)} + style={a.p_sm} + variant="ghost" + shape="round" + color="primary" + disabled={disabled}> + + ) } - -const styles = StyleSheet.create({ - button: { - paddingHorizontal: 15, - }, -}) diff --git a/src/view/com/composer/photos/SelectGifBtn.tsx b/src/view/com/composer/photos/SelectGifBtn.tsx new file mode 100644 index 0000000000..31310fdc1d --- /dev/null +++ b/src/view/com/composer/photos/SelectGifBtn.tsx @@ -0,0 +1,53 @@ +import React, {useCallback} from 'react' +import {Keyboard} from 'react-native' +import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {logEvent} from '#/lib/statsig/statsig' +import {Gif} from '#/state/queries/giphy' +import {atoms as a, useTheme} from '#/alf' +import {Button} from '#/components/Button' +import {useDialogControl} from '#/components/Dialog' +import {GifSelectDialog} from '#/components/dialogs/GifSelect' +import {GifSquare_Stroke2_Corner0_Rounded as GifIcon} from '#/components/icons/Gif' + +type Props = { + onClose: () => void + onSelectGif: (gif: Gif) => void + disabled?: boolean +} + +export function SelectGifBtn({onClose, onSelectGif, disabled}: Props) { + const {_} = useLingui() + const control = useDialogControl() + const t = useTheme() + + const onPressSelectGif = useCallback(async () => { + logEvent('composer:gif:open', {}) + Keyboard.dismiss() + control.open() + }, [control]) + + return ( + <> + + + + + ) +} diff --git a/src/view/com/composer/photos/SelectPhotoBtn.tsx b/src/view/com/composer/photos/SelectPhotoBtn.tsx index f7fa9502d6..747653fc8d 100644 --- a/src/view/com/composer/photos/SelectPhotoBtn.tsx +++ b/src/view/com/composer/photos/SelectPhotoBtn.tsx @@ -1,27 +1,26 @@ +/* eslint-disable react-native-a11y/has-valid-accessibility-ignores-invert-colors */ import React, {useCallback} from 'react' -import {TouchableOpacity, StyleSheet} from 'react-native' -import { - FontAwesomeIcon, - FontAwesomeIconStyle, -} from '@fortawesome/react-native-fontawesome' -import {usePalette} from 'lib/hooks/usePalette' -import {useAnalytics} from 'lib/analytics/analytics' -import {usePhotoLibraryPermission} from 'lib/hooks/usePermissions' -import {GalleryModel} from 'state/models/media/gallery' -import {HITSLOP_10} from 'lib/constants' -import {isNative} from 'platform/detection' -import {useLingui} from '@lingui/react' import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {useAnalytics} from '#/lib/analytics/analytics' +import {usePhotoLibraryPermission} from '#/lib/hooks/usePermissions' +import {isNative} from '#/platform/detection' +import {GalleryModel} from '#/state/models/media/gallery' +import {atoms as a, useTheme} from '#/alf' +import {Button} from '#/components/Button' +import {Image_Stroke2_Corner0_Rounded as Image} from '#/components/icons/Image' type Props = { gallery: GalleryModel + disabled?: boolean } -export function SelectPhotoBtn({gallery}: Props) { - const pal = usePalette('default') +export function SelectPhotoBtn({gallery, disabled}: Props) { const {track} = useAnalytics() const {_} = useLingui() const {requestPhotoAccessIfNeeded} = usePhotoLibraryPermission() + const t = useTheme() const onPressSelectPhotos = useCallback(async () => { track('Composer:GalleryOpened') @@ -34,25 +33,17 @@ export function SelectPhotoBtn({gallery}: Props) { }, [track, requestPhotoAccessIfNeeded, gallery]) return ( - - - + label={_(msg`Gallery`)} + accessibilityHint={_(msg`Opens device photo gallery`)} + style={a.p_sm} + variant="ghost" + shape="round" + color="primary" + disabled={disabled}> + + ) } - -const styles = StyleSheet.create({ - button: { - paddingHorizontal: 15, - }, -}) diff --git a/src/view/screens/Storybook/Buttons.tsx b/src/view/screens/Storybook/Buttons.tsx index cae8ec3144..b532b0dd16 100644 --- a/src/view/screens/Storybook/Buttons.tsx +++ b/src/view/screens/Storybook/Buttons.tsx @@ -9,7 +9,7 @@ import { ButtonText, ButtonVariant, } from '#/components/Button' -import {ArrowTopRight_Stroke2_Corner0_Rounded as ArrowTopRight} from '#/components/icons/ArrowTopRight' +import {ArrowTopRight_Stroke2_Corner0_Rounded as ArrowTopRight} from '#/components/icons/Arrow' import {ChevronLeft_Stroke2_Corner0_Rounded as ChevronLeft} from '#/components/icons/Chevron' import {Globe_Stroke2_Corner0_Rounded as Globe} from '#/components/icons/Globe' import {H1} from '#/components/Typography' diff --git a/src/view/screens/Storybook/Icons.tsx b/src/view/screens/Storybook/Icons.tsx index 9d7dc0aa8a..bff1fdc9b7 100644 --- a/src/view/screens/Storybook/Icons.tsx +++ b/src/view/screens/Storybook/Icons.tsx @@ -2,11 +2,11 @@ import React from 'react' import {View} from 'react-native' import {atoms as a, useTheme} from '#/alf' -import {H1} from '#/components/Typography' -import {Globe_Stroke2_Corner0_Rounded as Globe} from '#/components/icons/Globe' -import {ArrowTopRight_Stroke2_Corner0_Rounded as ArrowTopRight} from '#/components/icons/ArrowTopRight' +import {ArrowTopRight_Stroke2_Corner0_Rounded as ArrowTopRight} from '#/components/icons/Arrow' import {CalendarDays_Stroke2_Corner0_Rounded as CalendarDays} from '#/components/icons/CalendarDays' +import {Globe_Stroke2_Corner0_Rounded as Globe} from '#/components/icons/Globe' import {Loader} from '#/components/Loader' +import {H1} from '#/components/Typography' export function Icons() { const t = useTheme() From c91f065be5d3f9b34431cee7113367b085e84030 Mon Sep 17 00:00:00 2001 From: Hailey Date: Thu, 18 Apr 2024 21:32:25 -0700 Subject: [PATCH 118/185] add dimensions to data (#3616) * add dimensions to data * keep alt text * put it in the right url * just send the original height and width instead --- src/view/com/composer/Composer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index f0f630dd46..77bec9bff8 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -333,7 +333,7 @@ export const ComposePost = observer(function ComposePost({ const onSelectGif = useCallback( (gif: Gif) => setExtLink({ - uri: gif.url, + uri: `${gif.url}?hh=${gif.images.original.height}&ww=${gif.images.original.width}`, isLoading: true, meta: { url: gif.url, From f709fbcbddde49a812197d79758482b6497be8d2 Mon Sep 17 00:00:00 2001 From: Hailey Date: Thu, 18 Apr 2024 21:38:54 -0700 Subject: [PATCH 119/185] align center post meta in threaded (#3615) * align center post meta in threaded * put `displayNameStyle` in correct place * maybe? * with mobile padding too? --- src/view/com/post-thread/PostThreadItem.tsx | 8 +++++++- src/view/com/util/PostMeta.tsx | 6 ++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index 089714c727..ddcf1a1306 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -27,6 +27,7 @@ import {sanitizeHandle} from 'lib/strings/handles' import {countLines, pluralize} from 'lib/strings/helpers' import {niceDate} from 'lib/strings/time' import {s} from 'lib/styles' +import {isWeb} from 'platform/detection' import {useSession} from 'state/session' import {PostThreadFollowBtn} from 'view/com/post-thread/PostThreadFollowBtn' import {atoms as a} from '#/alf' @@ -478,7 +479,12 @@ let PostThreadItemLoaded = ({ avatarSize={28} displayNameType="md-bold" displayNameStyle={isThreadedChild && s.ml2} - style={isThreadedChild && s.mb2} + style={ + isThreadedChild && { + alignItems: 'center', + paddingBottom: isWeb ? 5 : 2, + } + } /> { /> )} - + Date: Fri, 19 Apr 2024 15:23:47 +0100 Subject: [PATCH 120/185] [Statsig] Update experiments (#3617) --- src/lib/statsig/gates.ts | 10 ++++----- .../Profile/Header/ProfileHeaderStandard.tsx | 2 +- src/state/shell/selected-feed.tsx | 2 +- src/view/com/feeds/FeedPage.tsx | 22 +++++++------------ .../com/post-thread/PostThreadFollowBtn.tsx | 2 +- src/view/screens/Home.tsx | 18 +++++++++++---- 6 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/lib/statsig/gates.ts b/src/lib/statsig/gates.ts index 314799f288..d540cde10b 100644 --- a/src/lib/statsig/gates.ts +++ b/src/lib/statsig/gates.ts @@ -1,12 +1,12 @@ export type Gate = // Keep this alphabetic please. - | 'autoexpand_suggestions_on_profile_follow' - | 'disable_min_shell_on_foregrounding' - | 'disable_poll_on_discover' + | 'autoexpand_suggestions_on_profile_follow_v2' + | 'disable_min_shell_on_foregrounding_v2' + | 'disable_poll_on_discover_v2' | 'hide_vertical_scroll_indicators' | 'new_profile_scroll_component' | 'new_search' | 'receive_updates' - | 'show_follow_back_label' - | 'start_session_with_following' + | 'show_follow_back_label_v2' + | 'start_session_with_following_v2' | 'use_new_suggestions_endpoint' diff --git a/src/screens/Profile/Header/ProfileHeaderStandard.tsx b/src/screens/Profile/Header/ProfileHeaderStandard.tsx index 9e03613263..7c52bcbda7 100644 --- a/src/screens/Profile/Header/ProfileHeaderStandard.tsx +++ b/src/screens/Profile/Header/ProfileHeaderStandard.tsx @@ -94,7 +94,7 @@ let ProfileHeaderStandard = ({ )}`, ), ) - if (isWeb && gate('autoexpand_suggestions_on_profile_follow')) { + if (isWeb && gate('autoexpand_suggestions_on_profile_follow_v2')) { setShowSuggestedFollows(true) } } catch (e: any) { diff --git a/src/state/shell/selected-feed.tsx b/src/state/shell/selected-feed.tsx index dca3445f33..df50b3952f 100644 --- a/src/state/shell/selected-feed.tsx +++ b/src/state/shell/selected-feed.tsx @@ -27,7 +27,7 @@ function getInitialFeed(gate: (gateName: Gate) => boolean) { return feedFromSession } } - if (!gate('start_session_with_following')) { + if (!gate('start_session_with_following_v2')) { const feedFromPersisted = persisted.get('lastSelectedHomeFeed') if (feedFromPersisted) { // Fall back to the last chosen one across all tabs. diff --git a/src/view/com/feeds/FeedPage.tsx b/src/view/com/feeds/FeedPage.tsx index 2b8fde632c..4ebf64da9a 100644 --- a/src/view/com/feeds/FeedPage.tsx +++ b/src/view/com/feeds/FeedPage.tsx @@ -104,17 +104,11 @@ export function FeedPage({ }) }, [scrollToTop, feed, queryClient, setHasNew]) - let feedPollInterval - if ( - feed === // Discover - 'feedgen|at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/whats-hot' && - // TODO: This gate check is still too early. Move it to where the polling happens. - gate('disable_poll_on_discover') - ) { - feedPollInterval = undefined - } else { - feedPollInterval = POLL_FREQ - } + const isDiscoverFeed = + feed === + 'feedgen|at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/whats-hot' + const adjustedHasNew = + hasNew && !(isDiscoverFeed && gate('disable_poll_on_discover_v2')) return ( @@ -124,7 +118,7 @@ export function FeedPage({ enabled={isPageFocused} feed={feed} feedParams={feedParams} - pollInterval={feedPollInterval} + pollInterval={POLL_FREQ} disablePoll={hasNew} scrollElRef={scrollElRef} onScrolledDownChange={setIsScrolledDown} @@ -134,11 +128,11 @@ export function FeedPage({ headerOffset={headerOffset} /> - {(isScrolledDown || hasNew) && ( + {(isScrolledDown || adjustedHasNew) && ( )} diff --git a/src/view/com/post-thread/PostThreadFollowBtn.tsx b/src/view/com/post-thread/PostThreadFollowBtn.tsx index 7c9a544515..1f70f41c4a 100644 --- a/src/view/com/post-thread/PostThreadFollowBtn.tsx +++ b/src/view/com/post-thread/PostThreadFollowBtn.tsx @@ -140,7 +140,7 @@ function PostThreadFollowBtnLoaded({ style={[!isFollowing ? palInverted.text : pal.text, s.bold]} numberOfLines={1}> {!isFollowing ? ( - isFollowedBy && gate('show_follow_back_label') ? ( + isFollowedBy && gate('show_follow_back_label_v2') ? ( Follow Back ) : ( Follow diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index fbaa49a321..3eaa1b8757 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -5,6 +5,7 @@ import {useFocusEffect} from '@react-navigation/native' import {PROD_DEFAULT_FEED} from '#/lib/constants' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' import {useSetTitle} from '#/lib/hooks/useSetTitle' +import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' import {logEvent, LogEvents, useGate} from '#/lib/statsig/statsig' import {emitSoftReset} from '#/state/events' import {FeedSourceInfo, usePinnedFeedsInfos} from '#/state/queries/feed' @@ -12,7 +13,11 @@ import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed' import {usePreferencesQuery} from '#/state/queries/preferences' import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types' import {useSession} from '#/state/session' -import {useSetDrawerSwipeDisabled, useSetMinimalShellMode} from '#/state/shell' +import { + useMinimalShellMode, + useSetDrawerSwipeDisabled, + useSetMinimalShellMode, +} from '#/state/shell' import {useSelectedFeed, useSetSelectedFeed} from '#/state/shell/selected-feed' import {useOTAUpdates} from 'lib/hooks/useOTAUpdates' import {HomeTabNavigatorParams, NativeStackScreenProps} from 'lib/routes/types' @@ -112,11 +117,16 @@ function HomeScreenReady({ ) const gate = useGate() + const mode = useMinimalShellMode() + const {isMobile} = useWebMediaQueries() React.useEffect(() => { const listener = AppState.addEventListener('change', nextAppState => { if (nextAppState === 'active') { - // TODO: Check if minimal shell is on before logging an exposure. - if (gate('disable_min_shell_on_foregrounding')) { + if ( + isMobile && + mode.value === 1 && + gate('disable_min_shell_on_foregrounding_v2') + ) { setMinimalShellMode(false) } } @@ -124,7 +134,7 @@ function HomeScreenReady({ return () => { listener.remove() } - }, [setMinimalShellMode, gate]) + }, [setMinimalShellMode, mode, isMobile, gate]) const onPageSelected = React.useCallback( (index: number) => { From c42a557417960a8eed7eb132c24790f4a94cff37 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 19 Apr 2024 15:51:41 +0100 Subject: [PATCH 121/185] [Statsig] Send locale info (#3621) --- src/lib/statsig/statsig.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/lib/statsig/statsig.tsx b/src/lib/statsig/statsig.tsx index c43d2bf8a3..2e3fdfd5cb 100644 --- a/src/lib/statsig/statsig.tsx +++ b/src/lib/statsig/statsig.tsx @@ -6,6 +6,7 @@ import {Statsig, StatsigProvider} from 'statsig-react-native-expo' import {logger} from '#/logger' import {isWeb} from '#/platform/detection' +import * as persisted from '#/state/persisted' import {IS_TESTFLIGHT} from 'lib/app-info' import {useSession} from '../../state/session' import {timeout} from '../async/timeout' @@ -23,6 +24,8 @@ type StatsigUser = { platform: 'ios' | 'android' | 'web' refSrc: string refUrl: string + appLanguage: string + contentLanguages: string[] } } @@ -132,6 +135,7 @@ function toStatsigUser(did: string | undefined): StatsigUser { if (did) { userID = sha256(did) } + const languagePrefs = persisted.get('languagePrefs') return { userID, platform: Platform.OS as 'ios' | 'android' | 'web', @@ -139,6 +143,8 @@ function toStatsigUser(did: string | undefined): StatsigUser { refSrc, refUrl, platform: Platform.OS as 'ios' | 'android' | 'web', + appLanguage: languagePrefs.appLanguage, + contentLanguages: languagePrefs.contentLanguages, }, } } From ade2ea6172a71d60bd7ce6aed97d09dbddb352d0 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 19 Apr 2024 21:58:18 +0100 Subject: [PATCH 122/185] Ungate Top/Latest search (#3627) --- src/lib/statsig/gates.ts | 1 - src/view/screens/Search/Search.tsx | 105 +++++++++++------------------ 2 files changed, 38 insertions(+), 68 deletions(-) diff --git a/src/lib/statsig/gates.ts b/src/lib/statsig/gates.ts index d540cde10b..301746fb21 100644 --- a/src/lib/statsig/gates.ts +++ b/src/lib/statsig/gates.ts @@ -5,7 +5,6 @@ export type Gate = | 'disable_poll_on_discover_v2' | 'hide_vertical_scroll_indicators' | 'new_profile_scroll_component' - | 'new_search' | 'receive_updates' | 'show_follow_back_label_v2' | 'start_session_with_following_v2' diff --git a/src/view/screens/Search/Search.tsx b/src/view/screens/Search/Search.tsx index 0b11ff767b..36e780c77c 100644 --- a/src/view/screens/Search/Search.tsx +++ b/src/view/screens/Search/Search.tsx @@ -407,7 +407,6 @@ export function SearchScreenInner({ const {isDesktop} = useWebMediaQueries() const [activeTab, setActiveTab] = React.useState(0) const {_} = useLingui() - const gate = useGate() const onPageSelected = React.useCallback( (index: number) => { @@ -420,74 +419,46 @@ export function SearchScreenInner({ const sections = React.useMemo(() => { if (!query) return [] - if (gate('new_search')) { - if (hasSession) { - return [ - { - title: _(msg`Top`), - component: ( - - ), - }, - { - title: _(msg`Latest`), - component: ( - - ), - }, - { - title: _(msg`People`), - component: ( - - ), - }, - ] - } else { - return [ - { - title: _(msg`People`), - component: ( - - ), - }, - ] - } + if (hasSession) { + return [ + { + title: _(msg`Top`), + component: ( + + ), + }, + { + title: _(msg`Latest`), + component: ( + + ), + }, + { + title: _(msg`People`), + component: ( + + ), + }, + ] } else { - if (hasSession) { - return [ - { - title: _(msg`Posts`), - component: ( - - ), - }, - { - title: _(msg`Users`), - component: ( - - ), - }, - ] - } else { - return [ - { - title: _(msg`Users`), - component: ( - - ), - }, - ] - } + return [ + { + title: _(msg`People`), + component: ( + + ), + }, + ] } - }, [hasSession, gate, _, query, activeTab]) + }, [hasSession, _, query, activeTab]) if (hasSession) { return query ? ( From 8b33ffdfb5ca606708c8104ecad4fa5430268483 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 19 Apr 2024 22:10:37 +0100 Subject: [PATCH 123/185] Add disable autoplay preference and group related settings into a dedicated page (#3626) * add autoplay preference * group accessibility settings into a dedicated page * fix gray background on web * Put a11y first --------- Co-authored-by: Dan Abramov --- bskyweb/cmd/bskyweb/server.go | 1 + src/Navigation.tsx | 9 ++ src/lib/routes/types.ts | 1 + src/routes.ts | 1 + src/state/persisted/schema.ts | 2 + src/state/preferences/autoplay.tsx | 42 +++++++ src/state/preferences/index.tsx | 11 +- src/view/icons/index.tsx | 75 ++++++------ src/view/screens/AccessibilitySettings.tsx | 132 +++++++++++++++++++++ src/view/screens/Settings/index.tsx | 71 +++++------ 10 files changed, 263 insertions(+), 82 deletions(-) create mode 100644 src/state/preferences/autoplay.tsx create mode 100644 src/view/screens/AccessibilitySettings.tsx diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go index 17d6210148..cc2ed54264 100644 --- a/bskyweb/cmd/bskyweb/server.go +++ b/bskyweb/cmd/bskyweb/server.go @@ -190,6 +190,7 @@ func serve(cctx *cli.Context) error { e.GET("/settings/saved-feeds", server.WebGeneric) e.GET("/settings/threads", server.WebGeneric) e.GET("/settings/external-embeds", server.WebGeneric) + e.GET("/settings/accessibility", server.WebGeneric) e.GET("/sys/debug", server.WebGeneric) e.GET("/sys/debug-mod", server.WebGeneric) e.GET("/sys/log", server.WebGeneric) diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 99c0ebf3c3..363875dcb6 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -53,6 +53,7 @@ import { setEmailConfirmationRequested, shouldRequestEmailConfirmation, } from './state/shell/reminders' +import {AccessibilitySettingsScreen} from './view/screens/AccessibilitySettings' import {CommunityGuidelinesScreen} from './view/screens/CommunityGuidelines' import {CopyrightPolicyScreen} from './view/screens/CopyrightPolicy' import {DebugModScreen} from './view/screens/DebugMod' @@ -276,6 +277,14 @@ function commonScreens(Stack: typeof HomeTab, unreadCountLabel?: string) { requireAuth: true, }} /> + AccessibilitySettingsScreen} + options={{ + title: title(msg`Accessibility Settings`), + requireAuth: true, + }} + /> HashtagScreen} diff --git a/src/lib/routes/types.ts b/src/lib/routes/types.ts index 95af2f237d..ac5cb0bce0 100644 --- a/src/lib/routes/types.ts +++ b/src/lib/routes/types.ts @@ -35,6 +35,7 @@ export type CommonNavigatorParams = { PreferencesFollowingFeed: undefined PreferencesThreads: undefined PreferencesExternalEmbeds: undefined + AccessibilitySettings: undefined Search: {q?: string} Hashtag: {tag: string; author?: string} } diff --git a/src/routes.ts b/src/routes.ts index f6f3729475..f27839698f 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -29,6 +29,7 @@ export const router = new Router({ PreferencesFollowingFeed: '/settings/following-feed', PreferencesThreads: '/settings/threads', PreferencesExternalEmbeds: '/settings/external-embeds', + AccessibilitySettings: '/settings/accessibility', SavedFeeds: '/settings/saved-feeds', Support: '/support', PrivacyPolicy: '/support/privacy', diff --git a/src/state/persisted/schema.ts b/src/state/persisted/schema.ts index 67e082a95d..1b77d138bd 100644 --- a/src/state/persisted/schema.ts +++ b/src/state/persisted/schema.ts @@ -60,6 +60,7 @@ export const schema = z.object({ lastSelectedHomeFeed: z.string().optional(), pdsAddressHistory: z.array(z.string()).optional(), disableHaptics: z.boolean().optional(), + disableAutoplay: z.boolean().optional(), }) export type Schema = z.infer @@ -96,4 +97,5 @@ export const defaults: Schema = { lastSelectedHomeFeed: undefined, pdsAddressHistory: [], disableHaptics: false, + disableAutoplay: false, } diff --git a/src/state/preferences/autoplay.tsx b/src/state/preferences/autoplay.tsx new file mode 100644 index 0000000000..d5aa049f36 --- /dev/null +++ b/src/state/preferences/autoplay.tsx @@ -0,0 +1,42 @@ +import React from 'react' + +import * as persisted from '#/state/persisted' + +type StateContext = boolean +type SetContext = (v: boolean) => void + +const stateContext = React.createContext( + Boolean(persisted.defaults.disableAutoplay), +) +const setContext = React.createContext((_: boolean) => {}) + +export function Provider({children}: {children: React.ReactNode}) { + const [state, setState] = React.useState( + Boolean(persisted.get('disableAutoplay')), + ) + + const setStateWrapped = React.useCallback( + (autoplayDisabled: persisted.Schema['disableAutoplay']) => { + setState(Boolean(autoplayDisabled)) + persisted.write('disableAutoplay', autoplayDisabled) + }, + [setState], + ) + + React.useEffect(() => { + return persisted.onUpdate(() => { + setState(Boolean(persisted.get('disableAutoplay'))) + }) + }, [setStateWrapped]) + + return ( + + + {children} + + + ) +} + +export const useAutoplayDisabled = () => React.useContext(stateContext) +export const useSetAutoplayDisabled = () => React.useContext(setContext) diff --git a/src/state/preferences/index.tsx b/src/state/preferences/index.tsx index 804d0fc310..5c8fab2ad7 100644 --- a/src/state/preferences/index.tsx +++ b/src/state/preferences/index.tsx @@ -1,9 +1,10 @@ import React from 'react' -import {Provider as AltTextRequiredProvider} from '../preferences/alt-text-required' -import {Provider as HiddenPostsProvider} from '../preferences/hidden-posts' +import {Provider as AltTextRequiredProvider} from './alt-text-required' +import {Provider as AutoplayProvider} from './autoplay' import {Provider as DisableHapticsProvider} from './disable-haptics' import {Provider as ExternalEmbedsProvider} from './external-embeds-prefs' +import {Provider as HiddenPostsProvider} from './hidden-posts' import {Provider as InAppBrowserProvider} from './in-app-browser' import {Provider as LanguagesProvider} from './languages' @@ -11,6 +12,8 @@ export { useRequireAltTextEnabled, useSetRequireAltTextEnabled, } from './alt-text-required' +export {useAutoplayDisabled, useSetAutoplayDisabled} from './autoplay' +export {useHapticsDisabled, useSetHapticsDisabled} from './disable-haptics' export { useExternalEmbedsPrefs, useSetExternalEmbedPref, @@ -26,7 +29,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) { - {children} + + {children} + diff --git a/src/view/icons/index.tsx b/src/view/icons/index.tsx index ede1e63355..b9af6a519c 100644 --- a/src/view/icons/index.tsx +++ b/src/view/icons/index.tsx @@ -1,63 +1,72 @@ import {library} from '@fortawesome/fontawesome-svg-core' - import {faAddressCard} from '@fortawesome/free-regular-svg-icons' +import {faBell as farBell} from '@fortawesome/free-regular-svg-icons/faBell' +import {faBookmark as farBookmark} from '@fortawesome/free-regular-svg-icons/faBookmark' +import {faCalendar as farCalendar} from '@fortawesome/free-regular-svg-icons/faCalendar' +import {faCircle} from '@fortawesome/free-regular-svg-icons/faCircle' +import {faCircleCheck as farCircleCheck} from '@fortawesome/free-regular-svg-icons/faCircleCheck' +import {faCirclePlay} from '@fortawesome/free-regular-svg-icons/faCirclePlay' +import {faCircleUser} from '@fortawesome/free-regular-svg-icons/faCircleUser' +import {faClone as farClone} from '@fortawesome/free-regular-svg-icons/faClone' +import {faComment} from '@fortawesome/free-regular-svg-icons/faComment' +import {faComments} from '@fortawesome/free-regular-svg-icons/faComments' +import {faCompass} from '@fortawesome/free-regular-svg-icons/faCompass' +import {faEyeSlash as farEyeSlash} from '@fortawesome/free-regular-svg-icons/faEyeSlash' +import {faFaceSmile} from '@fortawesome/free-regular-svg-icons/faFaceSmile' +import {faFloppyDisk} from '@fortawesome/free-regular-svg-icons/faFloppyDisk' +import {faHand as farHand} from '@fortawesome/free-regular-svg-icons/faHand' +import {faHeart} from '@fortawesome/free-regular-svg-icons/faHeart' +import {faImage as farImage} from '@fortawesome/free-regular-svg-icons/faImage' +import {faMessage} from '@fortawesome/free-regular-svg-icons/faMessage' +import {faPaste} from '@fortawesome/free-regular-svg-icons/faPaste' +import {faSquare} from '@fortawesome/free-regular-svg-icons/faSquare' +import {faSquareCheck} from '@fortawesome/free-regular-svg-icons/faSquareCheck' +import {faSquarePlus} from '@fortawesome/free-regular-svg-icons/faSquarePlus' +import {faTrashCan} from '@fortawesome/free-regular-svg-icons/faTrashCan' +import {faUser} from '@fortawesome/free-regular-svg-icons/faUser' +import {faFlask} from '@fortawesome/free-solid-svg-icons' +import {faUniversalAccess} from '@fortawesome/free-solid-svg-icons' import {faAngleDown} from '@fortawesome/free-solid-svg-icons/faAngleDown' import {faAngleLeft} from '@fortawesome/free-solid-svg-icons/faAngleLeft' import {faAngleRight} from '@fortawesome/free-solid-svg-icons/faAngleRight' import {faAngleUp} from '@fortawesome/free-solid-svg-icons/faAngleUp' +import {faArrowDown} from '@fortawesome/free-solid-svg-icons/faArrowDown' import {faArrowLeft} from '@fortawesome/free-solid-svg-icons/faArrowLeft' import {faArrowRight} from '@fortawesome/free-solid-svg-icons/faArrowRight' -import {faArrowUp} from '@fortawesome/free-solid-svg-icons/faArrowUp' -import {faArrowDown} from '@fortawesome/free-solid-svg-icons/faArrowDown' import {faArrowRightFromBracket} from '@fortawesome/free-solid-svg-icons/faArrowRightFromBracket' +import {faArrowRotateLeft} from '@fortawesome/free-solid-svg-icons/faArrowRotateLeft' +import {faArrowsRotate} from '@fortawesome/free-solid-svg-icons/faArrowsRotate' +import {faArrowTrendUp} from '@fortawesome/free-solid-svg-icons/faArrowTrendUp' +import {faArrowUp} from '@fortawesome/free-solid-svg-icons/faArrowUp' import {faArrowUpFromBracket} from '@fortawesome/free-solid-svg-icons/faArrowUpFromBracket' import {faArrowUpRightFromSquare} from '@fortawesome/free-solid-svg-icons/faArrowUpRightFromSquare' -import {faArrowRotateLeft} from '@fortawesome/free-solid-svg-icons/faArrowRotateLeft' -import {faArrowTrendUp} from '@fortawesome/free-solid-svg-icons/faArrowTrendUp' -import {faArrowsRotate} from '@fortawesome/free-solid-svg-icons/faArrowsRotate' import {faAt} from '@fortawesome/free-solid-svg-icons/faAt' -import {faBars} from '@fortawesome/free-solid-svg-icons/faBars' import {faBan} from '@fortawesome/free-solid-svg-icons/faBan' +import {faBars} from '@fortawesome/free-solid-svg-icons/faBars' import {faBell} from '@fortawesome/free-solid-svg-icons/faBell' -import {faBell as farBell} from '@fortawesome/free-regular-svg-icons/faBell' import {faBookmark} from '@fortawesome/free-solid-svg-icons/faBookmark' -import {faBookmark as farBookmark} from '@fortawesome/free-regular-svg-icons/faBookmark' -import {faCalendar as farCalendar} from '@fortawesome/free-regular-svg-icons/faCalendar' import {faCamera} from '@fortawesome/free-solid-svg-icons/faCamera' import {faCheck} from '@fortawesome/free-solid-svg-icons/faCheck' +import {faChevronDown} from '@fortawesome/free-solid-svg-icons/faChevronDown' import {faChevronRight} from '@fortawesome/free-solid-svg-icons/faChevronRight' -import {faCircle} from '@fortawesome/free-regular-svg-icons/faCircle' -import {faCircleCheck as farCircleCheck} from '@fortawesome/free-regular-svg-icons/faCircleCheck' import {faCircleCheck} from '@fortawesome/free-solid-svg-icons/faCircleCheck' import {faCircleDot} from '@fortawesome/free-solid-svg-icons/faCircleDot' import {faCircleExclamation} from '@fortawesome/free-solid-svg-icons/faCircleExclamation' -import {faCirclePlay} from '@fortawesome/free-regular-svg-icons/faCirclePlay' -import {faCircleUser} from '@fortawesome/free-regular-svg-icons/faCircleUser' import {faClone} from '@fortawesome/free-solid-svg-icons/faClone' -import {faClone as farClone} from '@fortawesome/free-regular-svg-icons/faClone' -import {faComment} from '@fortawesome/free-regular-svg-icons/faComment' import {faCommentSlash} from '@fortawesome/free-solid-svg-icons/faCommentSlash' -import {faComments} from '@fortawesome/free-regular-svg-icons/faComments' -import {faCompass} from '@fortawesome/free-regular-svg-icons/faCompass' import {faDownload} from '@fortawesome/free-solid-svg-icons/faDownload' import {faEllipsis} from '@fortawesome/free-solid-svg-icons/faEllipsis' import {faEnvelope} from '@fortawesome/free-solid-svg-icons/faEnvelope' import {faExclamation} from '@fortawesome/free-solid-svg-icons/faExclamation' import {faEye} from '@fortawesome/free-solid-svg-icons/faEye' -import {faEyeSlash as farEyeSlash} from '@fortawesome/free-regular-svg-icons/faEyeSlash' -import {faFaceSmile} from '@fortawesome/free-regular-svg-icons/faFaceSmile' +import {faFilter} from '@fortawesome/free-solid-svg-icons/faFilter' import {faFire} from '@fortawesome/free-solid-svg-icons/faFire' -import {faFlask} from '@fortawesome/free-solid-svg-icons' -import {faFloppyDisk} from '@fortawesome/free-regular-svg-icons/faFloppyDisk' import {faGear} from '@fortawesome/free-solid-svg-icons/faGear' import {faGlobe} from '@fortawesome/free-solid-svg-icons/faGlobe' import {faHand} from '@fortawesome/free-solid-svg-icons/faHand' -import {faHand as farHand} from '@fortawesome/free-regular-svg-icons/faHand' import {faHashtag} from '@fortawesome/free-solid-svg-icons/faHashtag' -import {faHeart} from '@fortawesome/free-regular-svg-icons/faHeart' import {faHeart as fasHeart} from '@fortawesome/free-solid-svg-icons/faHeart' import {faHouse} from '@fortawesome/free-solid-svg-icons/faHouse' -import {faImage as farImage} from '@fortawesome/free-regular-svg-icons/faImage' import {faImage} from '@fortawesome/free-solid-svg-icons/faImage' import {faInfo} from '@fortawesome/free-solid-svg-icons/faInfo' import {faLanguage} from '@fortawesome/free-solid-svg-icons/faLanguage' @@ -66,10 +75,8 @@ import {faList} from '@fortawesome/free-solid-svg-icons/faList' import {faListUl} from '@fortawesome/free-solid-svg-icons/faListUl' import {faLock} from '@fortawesome/free-solid-svg-icons/faLock' import {faMagnifyingGlass} from '@fortawesome/free-solid-svg-icons/faMagnifyingGlass' -import {faMessage} from '@fortawesome/free-regular-svg-icons/faMessage' import {faNoteSticky} from '@fortawesome/free-solid-svg-icons/faNoteSticky' import {faPause} from '@fortawesome/free-solid-svg-icons/faPause' -import {faPaste} from '@fortawesome/free-regular-svg-icons/faPaste' import {faPen} from '@fortawesome/free-solid-svg-icons/faPen' import {faPenNib} from '@fortawesome/free-solid-svg-icons/faPenNib' import {faPenToSquare} from '@fortawesome/free-solid-svg-icons/faPenToSquare' @@ -87,23 +94,16 @@ import {faShareFromSquare} from '@fortawesome/free-solid-svg-icons/faShareFromSq import {faShield} from '@fortawesome/free-solid-svg-icons/faShield' import {faSignal} from '@fortawesome/free-solid-svg-icons/faSignal' import {faSliders} from '@fortawesome/free-solid-svg-icons/faSliders' -import {faSquare} from '@fortawesome/free-regular-svg-icons/faSquare' -import {faSquareCheck} from '@fortawesome/free-regular-svg-icons/faSquareCheck' -import {faSquarePlus} from '@fortawesome/free-regular-svg-icons/faSquarePlus' import {faThumbtack} from '@fortawesome/free-solid-svg-icons/faThumbtack' import {faTicket} from '@fortawesome/free-solid-svg-icons/faTicket' -import {faTrashCan} from '@fortawesome/free-regular-svg-icons/faTrashCan' -import {faUser} from '@fortawesome/free-regular-svg-icons/faUser' -import {faUsers} from '@fortawesome/free-solid-svg-icons/faUsers' import {faUserCheck} from '@fortawesome/free-solid-svg-icons/faUserCheck' -import {faUserSlash} from '@fortawesome/free-solid-svg-icons/faUserSlash' import {faUserPlus} from '@fortawesome/free-solid-svg-icons/faUserPlus' -import {faUserXmark} from '@fortawesome/free-solid-svg-icons/faUserXmark' +import {faUsers} from '@fortawesome/free-solid-svg-icons/faUsers' +import {faUserSlash} from '@fortawesome/free-solid-svg-icons/faUserSlash' import {faUsersSlash} from '@fortawesome/free-solid-svg-icons/faUsersSlash' +import {faUserXmark} from '@fortawesome/free-solid-svg-icons/faUserXmark' import {faX} from '@fortawesome/free-solid-svg-icons/faX' import {faXmark} from '@fortawesome/free-solid-svg-icons/faXmark' -import {faChevronDown} from '@fortawesome/free-solid-svg-icons/faChevronDown' -import {faFilter} from '@fortawesome/free-solid-svg-icons/faFilter' library.add( faAddressCard, @@ -196,6 +196,7 @@ library.add( faSquare, faSquareCheck, faSquarePlus, + faUniversalAccess, faUser, faUsers, faUserCheck, diff --git a/src/view/screens/AccessibilitySettings.tsx b/src/view/screens/AccessibilitySettings.tsx new file mode 100644 index 0000000000..ac0d985f10 --- /dev/null +++ b/src/view/screens/AccessibilitySettings.tsx @@ -0,0 +1,132 @@ +import React from 'react' +import {StyleSheet, View} from 'react-native' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' +import {useFocusEffect} from '@react-navigation/native' + +import {isNative} from '#/platform/detection' +import {useSetMinimalShellMode} from '#/state/shell' +import {useAnalytics} from 'lib/analytics/analytics' +import {usePalette} from 'lib/hooks/usePalette' +import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' +import {CommonNavigatorParams, NativeStackScreenProps} from 'lib/routes/types' +import {s} from 'lib/styles' +import { + useAutoplayDisabled, + useHapticsDisabled, + useRequireAltTextEnabled, + useSetAutoplayDisabled, + useSetHapticsDisabled, + useSetRequireAltTextEnabled, +} from 'state/preferences' +import {ToggleButton} from 'view/com/util/forms/ToggleButton' +import {SimpleViewHeader} from '../com/util/SimpleViewHeader' +import {Text} from '../com/util/text/Text' +import {ScrollView} from '../com/util/Views' + +type Props = NativeStackScreenProps< + CommonNavigatorParams, + 'AccessibilitySettings' +> +export function AccessibilitySettingsScreen({}: Props) { + const pal = usePalette('default') + const setMinimalShellMode = useSetMinimalShellMode() + const {screen} = useAnalytics() + const {isMobile} = useWebMediaQueries() + const {_} = useLingui() + + const requireAltTextEnabled = useRequireAltTextEnabled() + const setRequireAltTextEnabled = useSetRequireAltTextEnabled() + const autoplayDisabled = useAutoplayDisabled() + const setAutoplayDisabled = useSetAutoplayDisabled() + const hapticsDisabled = useHapticsDisabled() + const setHapticsDisabled = useSetHapticsDisabled() + + useFocusEffect( + React.useCallback(() => { + screen('PreferencesExternalEmbeds') + setMinimalShellMode(false) + }, [screen, setMinimalShellMode]), + ) + + return ( + + + + + Accessibility Settings + + + + + + Alt text + + + setRequireAltTextEnabled(!requireAltTextEnabled)} + /> + + + Media + + + setAutoplayDisabled(!autoplayDisabled)} + /> + + {isNative && ( + <> + + Haptics + + + setHapticsDisabled(!hapticsDisabled)} + /> + + + )} + + + ) +} + +const styles = StyleSheet.create({ + heading: { + paddingHorizontal: 18, + paddingTop: 14, + paddingBottom: 6, + }, + toggleCard: { + paddingVertical: 8, + paddingHorizontal: 6, + marginBottom: 1, + }, +}) diff --git a/src/view/screens/Settings/index.tsx b/src/view/screens/Settings/index.tsx index b97faafad1..bb38da676c 100644 --- a/src/view/screens/Settings/index.tsx +++ b/src/view/screens/Settings/index.tsx @@ -20,14 +20,10 @@ import {useLingui} from '@lingui/react' import {useFocusEffect, useNavigation} from '@react-navigation/native' import {useQueryClient} from '@tanstack/react-query' -import {isIOS, isNative} from '#/platform/detection' +import {isNative} from '#/platform/detection' import {useModalControls} from '#/state/modals' import {clearLegacyStorage} from '#/state/persisted/legacy' import {clear as clearStorage} from '#/state/persisted/store' -import { - useRequireAltTextEnabled, - useSetRequireAltTextEnabled, -} from '#/state/preferences' import { useInAppBrowser, useSetInAppBrowser, @@ -56,10 +52,6 @@ import {makeProfileLink} from 'lib/routes/links' import {CommonNavigatorParams, NativeStackScreenProps} from 'lib/routes/types' import {NavigationProp} from 'lib/routes/types' import {colors, s} from 'lib/styles' -import { - useHapticsDisabled, - useSetHapticsDisabled, -} from 'state/preferences/disable-haptics' import {AccountDropdownBtn} from 'view/com/util/AccountDropdownBtn' import {SelectableBtn} from 'view/com/util/forms/SelectableBtn' import {ToggleButton} from 'view/com/util/forms/ToggleButton' @@ -162,12 +154,8 @@ export function SettingsScreen({}: Props) { const pal = usePalette('default') const {_} = useLingui() const setMinimalShellMode = useSetMinimalShellMode() - const requireAltTextEnabled = useRequireAltTextEnabled() - const setRequireAltTextEnabled = useSetRequireAltTextEnabled() const inAppBrowserPref = useInAppBrowser() const setUseInAppBrowser = useSetInAppBrowser() - const isHapticsDisabled = useHapticsDisabled() - const setHapticsDisabled = useSetHapticsDisabled() const onboardingDispatch = useOnboardingDispatch() const navigation = useNavigation() const {isMobile} = useWebMediaQueries() @@ -282,6 +270,10 @@ export function SettingsScreen({}: Props) { navigation.navigate('SavedFeeds') }, [navigation]) + const onPressAccessibilitySettings = React.useCallback(() => { + navigation.navigate('AccessibilitySettings') + }, [navigation]) + const onPressStatusPage = React.useCallback(() => { Linking.openURL(STATUS_PAGE_URL) }, []) @@ -318,7 +310,7 @@ export function SettingsScreen({}: Props) { - - Accessibility - - - setRequireAltTextEnabled(!requireAltTextEnabled)} - /> - - - - Appearance @@ -492,6 +469,29 @@ export function SettingsScreen({}: Props) { Basics + + + + + + Accessibility + + )} - {isNative && ( - - setHapticsDisabled(!isHapticsDisabled)} - /> - - )} Account From edbb18afa44bcfee4560ac19880a0c32563b6a0e Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 19 Apr 2024 22:55:53 +0100 Subject: [PATCH 124/185] Throttle gif search by 500ms (#3622) * debounce gif search by 300ms * Throttle it instead --------- Co-authored-by: Dan Abramov --- src/components/dialogs/GifSelect.tsx | 11 +++------ src/components/hooks/useThrottledValue.ts | 27 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 src/components/hooks/useThrottledValue.ts diff --git a/src/components/dialogs/GifSelect.tsx b/src/components/dialogs/GifSelect.tsx index 92e21af47d..c8897da364 100644 --- a/src/components/dialogs/GifSelect.tsx +++ b/src/components/dialogs/GifSelect.tsx @@ -1,10 +1,4 @@ -import React, { - useCallback, - useDeferredValue, - useMemo, - useRef, - useState, -} from 'react' +import React, {useCallback, useMemo, useRef, useState} from 'react' import {TextInput, View} from 'react-native' import {Image} from 'expo-image' import {msg, Trans} from '@lingui/macro' @@ -22,6 +16,7 @@ import {Gif, useGifphySearch, useGiphyTrending} from '#/state/queries/giphy' import {atoms as a, useBreakpoints, useTheme} from '#/alf' import * as Dialog from '#/components/Dialog' import * as TextField from '#/components/forms/TextField' +import {useThrottledValue} from '#/components/hooks/useThrottledValue' import {ArrowLeft_Stroke2_Corner0_Rounded as Arrow} from '#/components/icons/Arrow' import {MagnifyingGlass2_Stroke2_Corner0_Rounded as Search} from '#/components/icons/MagnifyingGlass2' import {InlineLinkText} from '#/components/Link' @@ -82,7 +77,7 @@ function GifList({ const {gtMobile} = useBreakpoints() const ref = useRef(null) const [undeferredSearch, setSearch] = useState('') - const search = useDeferredValue(undeferredSearch) + const search = useThrottledValue(undeferredSearch, 500) const isSearching = search.length > 0 diff --git a/src/components/hooks/useThrottledValue.ts b/src/components/hooks/useThrottledValue.ts new file mode 100644 index 0000000000..5764c547e4 --- /dev/null +++ b/src/components/hooks/useThrottledValue.ts @@ -0,0 +1,27 @@ +import {useEffect, useRef, useState} from 'react' + +import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' + +export function useThrottledValue(value: T, time?: number) { + const pendingValueRef = useRef(value) + const [throttledValue, setThrottledValue] = useState(value) + + useEffect(() => { + pendingValueRef.current = value + }, [value]) + + const handleTick = useNonReactiveCallback(() => { + if (pendingValueRef.current !== throttledValue) { + setThrottledValue(pendingValueRef.current) + } + }) + + useEffect(() => { + const id = setInterval(handleTick, time) + return () => { + clearInterval(id) + } + }, [handleTick, time]) + + return throttledValue +} From 22e86c99033a55881bf02a3129b653a13bac619e Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 19 Apr 2024 23:26:04 +0100 Subject: [PATCH 125/185] fix onEndReached issue by forcing flatlist to scroll (#3623) --- src/components/Dialog/index.web.tsx | 16 ++++++++++++++-- src/components/dialogs/GifSelect.tsx | 6 +++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/components/Dialog/index.web.tsx b/src/components/Dialog/index.web.tsx index d00d2d832b..a086955db6 100644 --- a/src/components/Dialog/index.web.tsx +++ b/src/components/Dialog/index.web.tsx @@ -199,11 +199,23 @@ export const ScrollableInner = Inner export function InnerFlatList({ label, + style, ...props }: FlatListProps & {label: string}) { + const {gtMobile} = useBreakpoints() return ( - - + + ) } diff --git a/src/components/dialogs/GifSelect.tsx b/src/components/dialogs/GifSelect.tsx index c8897da364..baff31168b 100644 --- a/src/components/dialogs/GifSelect.tsx +++ b/src/components/dialogs/GifSelect.tsx @@ -147,7 +147,11 @@ function GifList({ From c0ca891501cbc60eb945e3235800ec1e29a15ccd Mon Sep 17 00:00:00 2001 From: Hailey Date: Fri, 19 Apr 2024 15:31:20 -0700 Subject: [PATCH 126/185] Player improvement pre-reqs (#3618) * add dims to type * save * add the dimensions to the embed info * add a new case * add a new case * limit this case to giphy * use gate * flip mp4/webp * fix tests * add new test --- __tests__/lib/string.test.ts | 56 ++++++++++++------- src/lib/statsig/gates.ts | 1 + src/lib/strings/embed-player.ts | 28 ++++++++-- .../util/post-embeds/ExternalLinkEmbed.tsx | 47 ++++++++++------ 4 files changed, 89 insertions(+), 43 deletions(-) diff --git a/__tests__/lib/string.test.ts b/__tests__/lib/string.test.ts index f003e5acc0..eeb5ae1572 100644 --- a/__tests__/lib/string.test.ts +++ b/__tests__/lib/string.test.ts @@ -1,17 +1,18 @@ import {RichText} from '@atproto/api' + +import {parseEmbedPlayerFromUrl} from 'lib/strings/embed-player' +import {cleanError} from '../../src/lib/strings/errors' +import {createFullHandle, makeValidHandle} from '../../src/lib/strings/handles' +import {enforceLen, pluralize} from '../../src/lib/strings/helpers' +import {detectLinkables} from '../../src/lib/strings/rich-text-detection' +import {shortenLinks} from '../../src/lib/strings/rich-text-manip' +import {ago} from '../../src/lib/strings/time' import { makeRecordUri, toNiceDomain, - toShortUrl, toShareUrl, + toShortUrl, } from '../../src/lib/strings/url-helpers' -import {pluralize, enforceLen} from '../../src/lib/strings/helpers' -import {ago} from '../../src/lib/strings/time' -import {detectLinkables} from '../../src/lib/strings/rich-text-detection' -import {shortenLinks} from '../../src/lib/strings/rich-text-manip' -import {makeValidHandle, createFullHandle} from '../../src/lib/strings/handles' -import {cleanError} from '../../src/lib/strings/errors' -import {parseEmbedPlayerFromUrl} from 'lib/strings/embed-player' describe('detectLinkables', () => { const inputs = [ @@ -434,6 +435,8 @@ describe('parseEmbedPlayerFromUrl', () => { 'https://giphy.com/gif/some-random-gif-name-gifId', 'https://giphy.com/gifs/', + 'https://giphy.com/gifs/39248209509382934029?hh=100&ww=100', + 'https://media.giphy.com/media/gifId/giphy.webp', 'https://media0.giphy.com/media/gifId/giphy.webp', 'https://media1.giphy.com/media/gifId/giphy.gif', @@ -621,18 +624,31 @@ describe('parseEmbedPlayerFromUrl', () => { isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, undefined, undefined, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/39248209509382934029', + playerUri: 'https://i.giphy.com/media/39248209509382934029/200.mp4', + dimensions: { + width: 100, + height: 100, + }, + }, + { type: 'giphy_gif', source: 'giphy', isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, { type: 'giphy_gif', @@ -640,7 +656,7 @@ describe('parseEmbedPlayerFromUrl', () => { isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, { type: 'giphy_gif', @@ -648,7 +664,7 @@ describe('parseEmbedPlayerFromUrl', () => { isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, { type: 'giphy_gif', @@ -656,7 +672,7 @@ describe('parseEmbedPlayerFromUrl', () => { isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, { type: 'giphy_gif', @@ -664,7 +680,7 @@ describe('parseEmbedPlayerFromUrl', () => { isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, { type: 'giphy_gif', @@ -672,7 +688,7 @@ describe('parseEmbedPlayerFromUrl', () => { isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, undefined, undefined, @@ -684,7 +700,7 @@ describe('parseEmbedPlayerFromUrl', () => { isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, { @@ -693,7 +709,7 @@ describe('parseEmbedPlayerFromUrl', () => { isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, { type: 'giphy_gif', @@ -701,7 +717,7 @@ describe('parseEmbedPlayerFromUrl', () => { isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, { type: 'giphy_gif', @@ -709,7 +725,7 @@ describe('parseEmbedPlayerFromUrl', () => { isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, { type: 'giphy_gif', @@ -717,7 +733,7 @@ describe('parseEmbedPlayerFromUrl', () => { isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', }, { diff --git a/src/lib/statsig/gates.ts b/src/lib/statsig/gates.ts index 301746fb21..e42e9efe1e 100644 --- a/src/lib/statsig/gates.ts +++ b/src/lib/statsig/gates.ts @@ -4,6 +4,7 @@ export type Gate = | 'disable_min_shell_on_foregrounding_v2' | 'disable_poll_on_discover_v2' | 'hide_vertical_scroll_indicators' + | 'new_gif_player' | 'new_profile_scroll_component' | 'receive_updates' | 'show_follow_back_label_v2' diff --git a/src/lib/strings/embed-player.ts b/src/lib/strings/embed-player.ts index ee73284785..bbc58a2063 100644 --- a/src/lib/strings/embed-player.ts +++ b/src/lib/strings/embed-player.ts @@ -1,4 +1,5 @@ import {Dimensions} from 'react-native' + import {isWeb} from 'platform/detection' const {height: SCREEN_HEIGHT} = Dimensions.get('window') @@ -60,6 +61,10 @@ export interface EmbedPlayerParams { source: EmbedPlayerSource metaUri?: string hideDetails?: boolean + dimensions?: { + height: number + width: number + } } const giphyRegex = /media(?:[0-4]\.giphy\.com|\.giphy\.com)/i @@ -250,6 +255,16 @@ export function parseEmbedPlayerFromUrl( if (urlp.hostname === 'giphy.com' || urlp.hostname === 'www.giphy.com') { const [_, gifs, nameAndId] = urlp.pathname.split('/') + const h = urlp.searchParams.get('hh') + const w = urlp.searchParams.get('ww') + let dimensions + if (h && w) { + dimensions = { + height: Number(h), + width: Number(w), + } + } + /* * nameAndId is a string that consists of the name (dash separated) and the id of the gif (the last part of the name) * We want to get the id of the gif, then direct to media.giphy.com/media/{id}/giphy.webp so we can @@ -266,7 +281,10 @@ export function parseEmbedPlayerFromUrl( isGif: true, hideDetails: true, metaUri: `https://giphy.com/gifs/${gifId}`, - playerUri: `https://i.giphy.com/media/${gifId}/giphy.webp`, + playerUri: `https://i.giphy.com/media/${gifId}/${ + dimensions ? '200.mp4' : '200.webp' + }`, + dimensions, } } } @@ -287,7 +305,7 @@ export function parseEmbedPlayerFromUrl( isGif: true, hideDetails: true, metaUri: `https://giphy.com/gifs/${trackingOrId}`, - playerUri: `https://i.giphy.com/media/${trackingOrId}/giphy.webp`, + playerUri: `https://i.giphy.com/media/${trackingOrId}/200.webp`, } } else if (filename && gifFilenameRegex.test(filename)) { return { @@ -296,7 +314,7 @@ export function parseEmbedPlayerFromUrl( isGif: true, hideDetails: true, metaUri: `https://giphy.com/gifs/${idOrFilename}`, - playerUri: `https://i.giphy.com/media/${idOrFilename}/giphy.webp`, + playerUri: `https://i.giphy.com/media/${idOrFilename}/200.webp`, } } } @@ -315,7 +333,7 @@ export function parseEmbedPlayerFromUrl( isGif: true, hideDetails: true, metaUri: `https://giphy.com/gifs/${gifId}`, - playerUri: `https://i.giphy.com/media/${gifId}/giphy.webp`, + playerUri: `https://i.giphy.com/media/${gifId}/200.webp`, } } else if (mediaOrFilename) { const gifId = mediaOrFilename.split('.')[0] @@ -327,7 +345,7 @@ export function parseEmbedPlayerFromUrl( metaUri: `https://giphy.com/gifs/${gifId}`, playerUri: `https://i.giphy.com/media/${ mediaOrFilename.split('.')[0] - }/giphy.webp`, + }/200.webp`, } } } diff --git a/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx b/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx index aaa98a41f6..ff7c643f62 100644 --- a/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx +++ b/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx @@ -1,15 +1,17 @@ import React from 'react' -import {Image} from 'expo-image' -import {Text} from '../text/Text' import {StyleSheet, View} from 'react-native' +import {Image} from 'expo-image' +import {AppBskyEmbedExternal} from '@atproto/api' + import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' -import {AppBskyEmbedExternal} from '@atproto/api' -import {toNiceDomain} from 'lib/strings/url-helpers' +import {useGate} from 'lib/statsig/statsig' import {parseEmbedPlayerFromUrl} from 'lib/strings/embed-player' -import {ExternalPlayer} from 'view/com/util/post-embeds/ExternalPlayerEmbed' -import {ExternalGifEmbed} from 'view/com/util/post-embeds/ExternalGifEmbed' +import {toNiceDomain} from 'lib/strings/url-helpers' import {useExternalEmbedsPrefs} from 'state/preferences' +import {ExternalGifEmbed} from 'view/com/util/post-embeds/ExternalGifEmbed' +import {ExternalPlayer} from 'view/com/util/post-embeds/ExternalPlayerEmbed' +import {Text} from '../text/Text' export const ExternalLinkEmbed = ({ link, @@ -19,6 +21,7 @@ export const ExternalLinkEmbed = ({ const pal = usePalette('default') const {isMobile} = useWebMediaQueries() const externalEmbedPrefs = useExternalEmbedsPrefs() + const gate = useGate() const embedPlayerParams = React.useMemo(() => { const params = parseEmbedPlayerFromUrl(link.uri) @@ -27,6 +30,10 @@ export const ExternalLinkEmbed = ({ return params } }, [link.uri, externalEmbedPrefs]) + const isCompatibleGiphy = + embedPlayerParams?.source === 'giphy' && + embedPlayerParams.dimensions && + gate('new_gif_player') return ( @@ -37,20 +44,24 @@ export const ExternalLinkEmbed = ({ accessibilityIgnoresInvertColors /> ) : undefined} - {(embedPlayerParams?.isGif && ( + {isCompatibleGiphy ? ( + + ) : embedPlayerParams?.isGif ? ( - )) || - (embedPlayerParams && ( - - ))} + ) : embedPlayerParams ? ( + + ) : undefined} - - {toNiceDomain(link.uri)} - - {!embedPlayerParams?.isGif && ( + {!isCompatibleGiphy && ( + + {toNiceDomain(link.uri)} + + )} + + {!embedPlayerParams?.isGif && !embedPlayerParams?.dimensions && ( {link.title || link.uri} From d3c0b48da3053727dd4e02acc353f6372121d944 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 19 Apr 2024 23:37:11 +0100 Subject: [PATCH 127/185] Top/Latest for hashtags (#3625) * Split HashtagScreen into two components * Hashtag tabs * Visual fixes --- src/screens/Hashtag.tsx | 208 +++++++++++++++++++++---------- src/view/com/util/ViewHeader.tsx | 55 +++++--- 2 files changed, 184 insertions(+), 79 deletions(-) diff --git a/src/screens/Hashtag.tsx b/src/screens/Hashtag.tsx index 5388593f14..34539f5102 100644 --- a/src/screens/Hashtag.tsx +++ b/src/screens/Hashtag.tsx @@ -1,11 +1,12 @@ import React from 'react' -import {ListRenderItemInfo, Pressable} from 'react-native' +import {ListRenderItemInfo, Pressable, StyleSheet, View} from 'react-native' import {PostView} from '@atproto/api/dist/client/types/app/bsky/feed/defs' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useFocusEffect} from '@react-navigation/native' import {NativeStackScreenProps} from '@react-navigation/native-stack' +import {usePalette} from '#/lib/hooks/usePalette' import {HITSLOP_10} from 'lib/constants' import {useInitialNumToRender} from 'lib/hooks/useInitialNumToRender' import {CommonNavigatorParams} from 'lib/routes/types' @@ -13,18 +14,17 @@ import {shareUrl} from 'lib/sharing' import {cleanError} from 'lib/strings/errors' import {sanitizeHandle} from 'lib/strings/handles' import {enforceLen} from 'lib/strings/helpers' -import {isNative} from 'platform/detection' +import {isNative, isWeb} from 'platform/detection' import {useSearchPostsQuery} from 'state/queries/search-posts' -import {useSetMinimalShellMode} from 'state/shell' +import {useSetDrawerSwipeDisabled, useSetMinimalShellMode} from 'state/shell' +import {Pager} from '#/view/com/pager/Pager' +import {TabBar} from '#/view/com/pager/TabBar' +import {CenteredView} from '#/view/com/util/Views' import {Post} from 'view/com/post/Post' import {List} from 'view/com/util/List' import {ViewHeader} from 'view/com/util/ViewHeader' import {ArrowOutOfBox_Stroke2_Corner0_Rounded} from '#/components/icons/ArrowOutOfBox' -import { - ListFooter, - ListHeaderDesktop, - ListMaybePlaceholder, -} from '#/components/Lists' +import {ListFooter, ListMaybePlaceholder} from '#/components/Lists' const renderItem = ({item}: ListRenderItemInfo) => { return @@ -38,20 +38,13 @@ export default function HashtagScreen({ route, }: NativeStackScreenProps) { const {tag, author} = route.params - const setMinimalShellMode = useSetMinimalShellMode() const {_} = useLingui() - const initialNumToRender = useInitialNumToRender() - const [isPTR, setIsPTR] = React.useState(false) + const pal = usePalette('default') const fullTag = React.useMemo(() => { return `#${decodeURIComponent(tag)}` }, [tag]) - const queryParam = React.useMemo(() => { - if (!author) return fullTag - return `${fullTag} from:${sanitizeHandle(author)}` - }, [fullTag, author]) - const headerTitle = React.useMemo(() => { return enforceLen(fullTag.toLowerCase(), 24, true, 'middle') }, [fullTag]) @@ -61,27 +54,6 @@ export default function HashtagScreen({ return sanitizeHandle(author) }, [author]) - const { - data, - isFetchingNextPage, - isLoading, - isError, - error, - refetch, - fetchNextPage, - hasNextPage, - } = useSearchPostsQuery({query: queryParam}) - - const posts = React.useMemo(() => { - return data?.pages.flatMap(page => page.posts) || [] - }, [data]) - - useFocusEffect( - React.useCallback(() => { - setMinimalShellMode(false) - }, [setMinimalShellMode]), - ) - const onShare = React.useCallback(() => { const url = new URL('https://bsky.app') url.pathname = `/hashtag/${decodeURIComponent(tag)}` @@ -91,6 +63,131 @@ export default function HashtagScreen({ shareUrl(url.toString()) }, [tag, author]) + const [activeTab, setActiveTab] = React.useState(0) + const setMinimalShellMode = useSetMinimalShellMode() + const setDrawerSwipeDisabled = useSetDrawerSwipeDisabled() + + useFocusEffect( + React.useCallback(() => { + setMinimalShellMode(false) + }, [setMinimalShellMode]), + ) + + const onPageSelected = React.useCallback( + (index: number) => { + setMinimalShellMode(false) + setDrawerSwipeDisabled(index > 0) + setActiveTab(index) + }, + [setDrawerSwipeDisabled, setMinimalShellMode], + ) + + const sections = React.useMemo(() => { + return [ + { + title: _(msg`Top`), + component: ( + + ), + }, + { + title: _(msg`Latest`), + component: ( + + ), + }, + ] + }, [_, fullTag, author, activeTab]) + + return ( + <> + + ( + + + + ) + : undefined + } + /> + + ( + + section.title)} {...props} /> + + )} + initialPage={0}> + {sections.map((section, i) => ( + {section.component} + ))} + + + ) +} + +function HashtagScreenTab({ + fullTag, + author, + sort, + active, +}: { + fullTag: string + author: string | undefined + sort: 'top' | 'latest' + active: boolean +}) { + const {_} = useLingui() + const initialNumToRender = useInitialNumToRender() + const [isPTR, setIsPTR] = React.useState(false) + + const queryParam = React.useMemo(() => { + if (!author) return fullTag + return `${fullTag} from:${sanitizeHandle(author)}` + }, [fullTag, author]) + + const { + data, + isFetched, + isFetchingNextPage, + isLoading, + isError, + error, + refetch, + fetchNextPage, + hasNextPage, + } = useSearchPostsQuery({query: queryParam, sort, enabled: active}) + + const posts = React.useMemo(() => { + return data?.pages.flatMap(page => page.posts) || [] + }, [data]) + const onRefresh = React.useCallback(async () => { setIsPTR(true) await refetch() @@ -104,29 +201,9 @@ export default function HashtagScreen({ return ( <> - ( - - - - ) - : undefined - } - /> {posts.length < 1 ? ( - } ListFooterComponent={ ) } + +const styles = StyleSheet.create({ + tabBarContainer: { + // @ts-ignore web only + position: isWeb ? 'sticky' : '', + top: 0, + zIndex: 1, + }, +}) diff --git a/src/view/com/util/ViewHeader.tsx b/src/view/com/util/ViewHeader.tsx index 872e10eef0..63a2b3de39 100644 --- a/src/view/com/util/ViewHeader.tsx +++ b/src/view/com/util/ViewHeader.tsx @@ -1,19 +1,20 @@ import React from 'react' import {StyleSheet, TouchableOpacity, View} from 'react-native' -import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' -import {useNavigation} from '@react-navigation/native' -import {CenteredView} from './Views' -import {Text} from './text/Text' -import {usePalette} from 'lib/hooks/usePalette' -import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' -import {useAnalytics} from 'lib/analytics/analytics' -import {NavigationProp} from 'lib/routes/types' -import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode' import Animated from 'react-native-reanimated' -import {useSetDrawerOpen} from '#/state/shell' +import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' +import {useNavigation} from '@react-navigation/native' + +import {useSetDrawerOpen} from '#/state/shell' +import {useAnalytics} from 'lib/analytics/analytics' +import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode' +import {usePalette} from 'lib/hooks/usePalette' +import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' +import {NavigationProp} from 'lib/routes/types' import {useTheme} from '#/alf' +import {Text} from './text/Text' +import {CenteredView} from './Views' const BACK_HITSLOP = {left: 20, top: 20, right: 50, bottom: 20} @@ -62,6 +63,7 @@ export function ViewHeader({ return ( @@ -136,14 +138,17 @@ export function ViewHeader({ function DesktopWebHeader({ title, + subtitle, renderButton, showBorder = true, }: { title: string + subtitle?: string renderButton?: () => JSX.Element showBorder?: boolean }) { const pal = usePalette('default') + const t = useTheme() return ( - - - {title} - + + + + {title} + + + {renderButton?.()} - {renderButton?.()} + {subtitle ? ( + + + + {subtitle} + + + + ) : null} ) } @@ -236,6 +258,9 @@ const styles = StyleSheet.create({ subtitle: { fontSize: 13, }, + subtitleDesktop: { + fontSize: 15, + }, backBtn: { width: 30, height: 30, From ce1c1e1cbed05183b42dd44e620fe1d4065bce1e Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 20 Apr 2024 00:29:35 +0100 Subject: [PATCH 128/185] Search in PWI (#3628) --- src/view/screens/Search/Search.tsx | 144 +++++++++++------------------ 1 file changed, 52 insertions(+), 92 deletions(-) diff --git a/src/view/screens/Search/Search.tsx b/src/view/screens/Search/Search.tsx index 36e780c77c..099174b9b3 100644 --- a/src/view/screens/Search/Search.tsx +++ b/src/view/screens/Search/Search.tsx @@ -393,13 +393,7 @@ function SearchScreenUserResults({ ) } -export function SearchScreenInner({ - query, - primarySearch, -}: { - query?: string - primarySearch?: boolean -}) { +export function SearchScreenInner({query}: {query?: string}) { const pal = usePalette('default') const setMinimalShellMode = useSetMinimalShellMode() const setDrawerSwipeDisabled = useSetDrawerSwipeDisabled() @@ -419,86 +413,35 @@ export function SearchScreenInner({ const sections = React.useMemo(() => { if (!query) return [] - if (hasSession) { - return [ - { - title: _(msg`Top`), - component: ( - - ), - }, - { - title: _(msg`Latest`), - component: ( - - ), - }, - { - title: _(msg`People`), - component: ( - - ), - }, - ] - } else { - return [ - { - title: _(msg`People`), - component: ( - - ), - }, - ] - } - }, [hasSession, _, query, activeTab]) - - if (hasSession) { - return query ? ( - ( - - section.title)} {...props} /> - - )} - initialPage={0}> - {sections.map((section, i) => ( - {section.component} - ))} - - ) : ( - - - - Suggested Follows - - - - - - ) - } + return [ + { + title: _(msg`Top`), + component: ( + + ), + }, + { + title: _(msg`Latest`), + component: ( + + ), + }, + { + title: _(msg`People`), + component: ( + + ), + }, + ] + }, [_, query, activeTab]) return query ? ( {section.component} ))} + ) : hasSession ? ( + + + + Suggested Follows + + + + + ) : ( - {isDesktop && !primarySearch ? ( - Find users with the search tool on the right - ) : ( - Find users on Bluesky - )} + Find posts and users on Bluesky From 0e3a13b6df3c3e0c72473715be7d6eb809cae597 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Mon, 22 Apr 2024 19:44:44 +0200 Subject: [PATCH 129/185] docs(build): update build instructions (#3641) --- docs/build.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/build.md b/docs/build.md index 0eb2315098..deab91a5ba 100644 --- a/docs/build.md +++ b/docs/build.md @@ -2,7 +2,8 @@ ## App Build -- Set up your environment [using the react native instructions](https://reactnative.dev/docs/environment-setup). +- Set up your environment [using the expo instructions](https://docs.expo.dev/guides/local-app-development/). + - make sure that the JAVA_HOME points to the zulu-17 directory in your `.zshrc` or `.bashrc` file: `export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home`. DO NOT use another JDK or you will encounter build errors. - If you're running macOS, make sure you are running the correct versions of Ruby and Cocoapods: - Check if you've installed Cocoapods through `homebrew`. If you have, remove it: - `brew info cocoapods` @@ -14,7 +15,7 @@ - `rbenv global 2.7.6` - Add `eval "$(rbenv init - zsh)"` to your `~/.zshrc` - From inside the project directory: - - `bundler install` + - `bundler install` (this will install Cocoapods) - Setup your environment [for e2e testing using detox](https://wix.github.io/Detox/docs/introduction/getting-started): - `yarn global add detox-cli` - `brew tap wix/brew` @@ -27,7 +28,7 @@ - `git clone git@github.com:bluesky-social/atproto.git` - `cd atproto` - `brew install pnpm` - - `brew install jq` + - optional: `brew install jq` - `pnpm i` - `pnpm build` - Start the docker daemon (on MacOS this entails starting the Docker Desktop app) @@ -38,11 +39,22 @@ - Xcode must be installed for this to run. - A simulator must be preconfigured in Xcode settings. - if no iOS versions are available, install the iOS runtime at `Xcode > Settings > Platforms`. + - if the simulator download keeps failing you can download it from the developer website. + - [Apple Developer](https://developer.apple.com/download/all/?q=Simulator%20Runtime) + - `xcode-select -s /Applications/Xcode.app` + - `xcodebuild -runFirstLaunch` + - `xcrun simctl runtime add "~/Downloads/iOS_17.4_Simulator_Runtime.dmg"` (adapt the path to the downloaded file) - In addition, ensure Xcode Command Line Tools are installed using `xcode-select --install`. - - Pods must be installed: - - From the project directory root: `cd ios && pod install`. - Expo will require you to configure Xcode Signing. Follow the linked instructions. Error messages in Xcode related to the signing process can be safely ignored when installing on the iOS Simulator; Expo merely requires the profile to exist in order to install the app on the Simulator. + - Make sure you do have a certificate: open Xcode > Settings > Accounts > (sign-in) > Manage Certificates > + > Apple Development > Done. + - If you still encounter issues, try `rm -rf ios` before trying to build again (`yarn ios`) - Android: `yarn android` + - Install "Android Studio" + - Make sure you have the Android SDK installed (Android Studio > Tools > Android SDK). + - In "SDK Platforms": "Android x" (where x is Android's current version). + - In "SDK Tools": "Android SDK Build-Tools" and "Android Emulator" are required. + - Add `export ANDROID_HOME=/Users//Library/Android/sdk` to your `.zshrc` or `.bashrc` (and restart your terminal). + - Setup an emulator (Android Studio > Tools > Device Manager). - Web: `yarn web` - If you are cloning or forking this repo as an open-source developer, please check the tips below as well - Run e2e tests From 243769e6577f1fc2a23dc4542bd57eab3bba45de Mon Sep 17 00:00:00 2001 From: Hailey Date: Mon, 22 Apr 2024 13:06:25 -0700 Subject: [PATCH 130/185] remove gate from updates (#3646) --- src/lib/hooks/useOTAUpdates.ts | 4 +--- src/lib/statsig/gates.ts | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/lib/hooks/useOTAUpdates.ts b/src/lib/hooks/useOTAUpdates.ts index b8d331c6f1..a1692e62cc 100644 --- a/src/lib/hooks/useOTAUpdates.ts +++ b/src/lib/hooks/useOTAUpdates.ts @@ -12,7 +12,6 @@ import { import {logger} from '#/logger' import {IS_TESTFLIGHT} from 'lib/app-info' -import {useGate} from 'lib/statsig/statsig' import {isIOS} from 'platform/detection' const MINIMUM_MINIMIZE_TIME = 15 * 60e3 @@ -31,8 +30,7 @@ async function setExtraParams() { } export function useOTAUpdates() { - const gate = useGate() - const shouldReceiveUpdates = isEnabled && !__DEV__ && gate('receive_updates') + const shouldReceiveUpdates = isEnabled && !__DEV__ const appState = React.useRef('active') const lastMinimize = React.useRef(0) diff --git a/src/lib/statsig/gates.ts b/src/lib/statsig/gates.ts index e42e9efe1e..843c14f04d 100644 --- a/src/lib/statsig/gates.ts +++ b/src/lib/statsig/gates.ts @@ -6,7 +6,6 @@ export type Gate = | 'hide_vertical_scroll_indicators' | 'new_gif_player' | 'new_profile_scroll_component' - | 'receive_updates' | 'show_follow_back_label_v2' | 'start_session_with_following_v2' | 'use_new_suggestions_endpoint' From bcd88b088a43d64f34da5ec0d16dadaa74beedb3 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 22 Apr 2024 21:24:50 +0100 Subject: [PATCH 131/185] add maxwidth to app language dropdown (#3635) --- src/components/AppLanguageDropdown.web.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/AppLanguageDropdown.web.tsx b/src/components/AppLanguageDropdown.web.tsx index c3c8575a10..a106d99663 100644 --- a/src/components/AppLanguageDropdown.web.tsx +++ b/src/components/AppLanguageDropdown.web.tsx @@ -71,6 +71,7 @@ export function AppLanguageDropdown() { color: t.atoms.text.color, background: t.atoms.bg.backgroundColor, padding: 4, + maxWidth: '100%', }}> {APP_LANGUAGES.filter(l => Boolean(l.code2)).map(l => ( ))} From f4e72cc83c431285dee454b6201377871dbed09a Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 22 Apr 2024 22:07:48 +0100 Subject: [PATCH 138/185] [GIFs] Add error boundary to GIF picker (#3643) * error boundary on gif picker * add dialog.close for web users * fix size of dialog on web * Safer coercion --------- Co-authored-by: Dan Abramov --- src/components/dialogs/GifSelect.tsx | 37 +++++++++++++++++++++++++++- src/view/com/util/ErrorBoundary.tsx | 12 ++++++--- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/components/dialogs/GifSelect.tsx b/src/components/dialogs/GifSelect.tsx index baff31168b..ad4fbeadea 100644 --- a/src/components/dialogs/GifSelect.tsx +++ b/src/components/dialogs/GifSelect.tsx @@ -13,6 +13,8 @@ import { useSetExternalEmbedPref, } from '#/state/preferences' import {Gif, useGifphySearch, useGiphyTrending} from '#/state/queries/giphy' +import {ErrorScreen} from '#/view/com/util/error/ErrorScreen' +import {ErrorBoundary} from '#/view/com/util/ErrorBoundary' import {atoms as a, useBreakpoints, useTheme} from '#/alf' import * as Dialog from '#/components/Dialog' import * as TextField from '#/components/forms/TextField' @@ -54,13 +56,18 @@ export function GifSelectDialog({ break } + const renderErrorBoundary = useCallback( + (error: any) => , + [], + ) + return ( - {content} + {content} ) } @@ -357,3 +364,31 @@ function GiphyConsentPrompt({control}: {control: Dialog.DialogControlProps}) { ) } + +function DialogError({details}: {details?: string}) { + const {_} = useLingui() + const control = Dialog.useDialogContext() + + return ( + + + + + + ) +} diff --git a/src/view/com/util/ErrorBoundary.tsx b/src/view/com/util/ErrorBoundary.tsx index 22fdd606e4..dccd2bbc9b 100644 --- a/src/view/com/util/ErrorBoundary.tsx +++ b/src/view/com/util/ErrorBoundary.tsx @@ -1,12 +1,14 @@ import React, {Component, ErrorInfo, ReactNode} from 'react' +import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {logger} from '#/logger' import {ErrorScreen} from './error/ErrorScreen' import {CenteredView} from './Views' -import {msg} from '@lingui/macro' -import {logger} from '#/logger' -import {useLingui} from '@lingui/react' interface Props { children?: ReactNode + renderError?: (error: any) => ReactNode } interface State { @@ -30,6 +32,10 @@ export class ErrorBoundary extends Component { public render() { if (this.state.hasError) { + if (this.props.renderError) { + return this.props.renderError(this.state.error) + } + return ( From 0b3cc5901996e58f8c26566c547a2ea3ea5b6e0b Mon Sep 17 00:00:00 2001 From: surfdude29 <149612116+surfdude29@users.noreply.github.com> Date: Mon, 22 Apr 2024 22:13:10 +0100 Subject: [PATCH 139/185] Update French translations (#3644) * Update French translations * Apply suggestions from code review Co-authored-by: Stanislas Signoud --------- Co-authored-by: Stanislas Signoud --- src/locale/locales/fr/messages.po | 988 +++++++++--------------------- 1 file changed, 292 insertions(+), 696 deletions(-) diff --git a/src/locale/locales/fr/messages.po b/src/locale/locales/fr/messages.po index a8402fe505..23a477fc7f 100644 --- a/src/locale/locales/fr/messages.po +++ b/src/locale/locales/fr/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: fr\n" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-03-12 09:00+0000\n" +"PO-Revision-Date: 2024-04-22 15:00+0100\n" "Last-Translator: surfdude29\n" "Language-Team: Stanislas Signoud (@signez.fr), surfdude29\n" "Plural-Forms: \n" @@ -32,11 +32,11 @@ msgstr "<0/> membres" #: src/view/shell/Drawer.tsx:97 msgid "<0>{0} following" -msgstr "" +msgstr "<0>{0} abonnements" #: src/components/ProfileHoverCard/index.web.tsx:314 msgid "<0>{followers} <1>{pluralizedFollowers}" -msgstr "" +msgstr "<0>{followers} <1>{pluralizedFollowers}" #: src/components/ProfileHoverCard/index.web.tsx:326 #: src/screens/Profile/Header/Metrics.tsx:45 @@ -59,14 +59,6 @@ msgstr "<0>Bienvenue sur<1>Bluesky" msgid "⚠Invalid Handle" msgstr "⚠Pseudo invalide" -#: src/view/com/util/moderation/LabelInfo.tsx:45 -#~ msgid "A content warning has been applied to this {0}." -#~ msgstr "Un avertissement sur le contenu a été appliqué sur ce {0}." - -#: src/lib/hooks/useOTAUpdate.ts:16 -#~ msgid "A new version of the app is available. Please update to continue using the app." -#~ msgstr "Une nouvelle version de l’application est disponible. Veuillez faire la mise à jour pour continuer à utiliser l’application." - #: src/view/com/util/ViewHeader.tsx:89 #: src/view/screens/Search/Search.tsx:796 msgid "Access navigation links and settings" @@ -83,7 +75,7 @@ msgstr "Accessibilité" #: src/components/moderation/LabelsOnMe.tsx:42 msgid "account" -msgstr "" +msgstr "compte" #: src/screens/Login/LoginForm.tsx:144 #: src/view/screens/Settings/index.tsx:330 @@ -97,7 +89,7 @@ msgstr "Compte bloqué" #: src/view/com/profile/ProfileMenu.tsx:153 msgid "Account followed" -msgstr "" +msgstr "Compte suivi" #: src/view/com/profile/ProfileMenu.tsx:113 msgid "Account muted" @@ -127,7 +119,7 @@ msgstr "Compte débloqué" #: src/view/com/profile/ProfileMenu.tsx:166 msgid "Account unfollowed" -msgstr "" +msgstr "Compte désabonné" #: src/view/com/profile/ProfileMenu.tsx:102 msgid "Account unmuted" @@ -167,15 +159,6 @@ msgstr "Ajouter un texte alt" msgid "Add App Password" msgstr "Ajouter un mot de passe d’application" -#: src/view/com/modals/report/InputIssueDetails.tsx:41 -#: src/view/com/modals/report/Modal.tsx:191 -#~ msgid "Add details" -#~ msgstr "Ajouter des détails" - -#: src/view/com/modals/report/Modal.tsx:194 -#~ msgid "Add details to report" -#~ msgstr "Ajouter des détails au rapport" - #: src/view/com/composer/Composer.tsx:467 msgid "Add link card" msgstr "Ajouter une carte de lien" @@ -228,13 +211,9 @@ msgstr "Définissez le nombre de likes qu’une réponse doit avoir pour être a msgid "Adult Content" msgstr "Contenu pour adultes" -#: src/view/com/modals/ContentFilteringSettings.tsx:141 -#~ msgid "Adult content can only be enabled via the Web at <0/>." -#~ msgstr "Le contenu pour adultes ne peut être activé que via le Web à <0/>." - #: src/components/moderation/LabelPreference.tsx:242 msgid "Adult content is disabled." -msgstr "" +msgstr "Le contenu pour adultes est désactivé." #: src/screens/Moderation/index.tsx:375 #: src/view/screens/Settings/index.tsx:635 @@ -272,11 +251,11 @@ msgstr "Un e-mail a été envoyé à {0}. Il comprend un code de confirmation qu #: src/view/com/modals/ChangeEmail.tsx:119 msgid "An email has been sent to your previous address, {0}. It includes a confirmation code which you can enter below." -msgstr "Un courriel a été envoyé à votre ancienne adresse, {0}. Il comprend un code de confirmation que vous pouvez saisir ici." +msgstr "Un e-mail a été envoyé à votre ancienne adresse, {0}. Il comprend un code de confirmation que vous pouvez saisir ici." #: src/lib/moderation/useReportOptions.ts:26 msgid "An issue not included in these options" -msgstr "" +msgstr "Un problème qui ne fait pas partie de ces options" #: src/components/hooks/useFollowMethods.ts:35 #: src/components/hooks/useFollowMethods.ts:50 @@ -298,7 +277,7 @@ msgstr "Animaux" #: src/lib/moderation/useReportOptions.ts:31 msgid "Anti-Social Behavior" -msgstr "" +msgstr "Comportement antisocial" #: src/view/screens/LanguageSettings.tsx:95 msgid "App Language" @@ -329,32 +308,15 @@ msgstr "Mots de passe d’application" #: src/components/moderation/LabelsOnMeDialog.tsx:133 #: src/components/moderation/LabelsOnMeDialog.tsx:136 msgid "Appeal" -msgstr "" +msgstr "Faire appel" #: src/components/moderation/LabelsOnMeDialog.tsx:201 msgid "Appeal \"{0}\" label" -msgstr "" - -#: src/view/com/util/forms/PostDropdownBtn.tsx:337 -#: src/view/com/util/forms/PostDropdownBtn.tsx:346 -#~ msgid "Appeal content warning" -#~ msgstr "Faire appel de l’avertissement sur le contenu" - -#: src/view/com/modals/AppealLabel.tsx:65 -#~ msgid "Appeal Content Warning" -#~ msgstr "Faire appel de l’avertissement sur le contenu" +msgstr "Faire appel de l’étiquette « {0} »" #: src/components/moderation/LabelsOnMeDialog.tsx:192 msgid "Appeal submitted." -msgstr "" - -#: src/view/com/util/moderation/LabelInfo.tsx:52 -#~ msgid "Appeal this decision" -#~ msgstr "Faire appel de cette décision" - -#: src/view/com/util/moderation/LabelInfo.tsx:56 -#~ msgid "Appeal this decision." -#~ msgstr "Faire appel de cette décision." +msgstr "Appel soumis." #: src/view/screens/Settings/index.tsx:436 msgid "Appearance" @@ -366,7 +328,7 @@ msgstr "Êtes-vous sûr de vouloir supprimer le mot de passe de l’application #: src/view/com/feeds/FeedSourceCard.tsx:280 msgid "Are you sure you want to remove {0} from your feeds?" -msgstr "" +msgstr "Êtes-vous sûr de vouloir supprimer {0} de vos fils d’actu ?" #: src/view/com/composer/Composer.tsx:509 msgid "Are you sure you'd like to discard this draft?" @@ -376,10 +338,6 @@ msgstr "Êtes-vous sûr de vouloir rejeter ce brouillon ?" msgid "Are you sure?" msgstr "Vous confirmez ?" -#: src/view/com/util/forms/PostDropdownBtn.tsx:322 -#~ msgid "Are you sure? This cannot be undone." -#~ msgstr "Vous confirmez ? Cela ne pourra pas être annulé." - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:60 msgid "Are you writing in <0>{0}?" msgstr "Écrivez-vous en <0>{0} ?" @@ -394,7 +352,7 @@ msgstr "Nudité artistique ou non érotique." #: src/screens/Signup/StepHandle.tsx:119 msgid "At least 3 characters" -msgstr "" +msgstr "Au moins 3 caractères" #: src/components/moderation/LabelsOnMeDialog.tsx:246 #: src/components/moderation/LabelsOnMeDialog.tsx:247 @@ -412,11 +370,6 @@ msgstr "" msgid "Back" msgstr "Arrière" -#: src/view/com/post-thread/PostThread.tsx:480 -#~ msgctxt "action" -#~ msgid "Back" -#~ msgstr "Retour" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:144 msgid "Based on your interest in {interestsText}" msgstr "En fonction de votre intérêt pour {interestsText}" @@ -436,7 +389,7 @@ msgstr "Date de naissance :" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:286 #: src/view/com/profile/ProfileMenu.tsx:361 msgid "Block" -msgstr "" +msgstr "Bloquer" #: src/view/com/profile/ProfileMenu.tsx:300 #: src/view/com/profile/ProfileMenu.tsx:307 @@ -445,7 +398,7 @@ msgstr "Bloquer ce compte" #: src/view/com/profile/ProfileMenu.tsx:344 msgid "Block Account?" -msgstr "" +msgstr "Bloquer ce compte ?" #: src/view/screens/ProfileList.tsx:532 msgid "Block accounts" @@ -460,10 +413,6 @@ msgstr "Liste de blocage" msgid "Block these accounts?" msgstr "Bloquer ces comptes ?" -#: src/view/screens/ProfileList.tsx:320 -#~ msgid "Block this List" -#~ msgstr "Bloquer cette liste" - #: src/view/com/lists/ListCard.tsx:110 #: src/view/com/util/post-embeds/QuoteEmbed.tsx:58 msgid "Blocked" @@ -492,7 +441,7 @@ msgstr "Post bloqué." #: src/screens/Profile/Sections/Labels.tsx:163 msgid "Blocking does not prevent this labeler from placing labels on your account." -msgstr "" +msgstr "Le blocage n’empêche pas cet étiqueteur de placer des étiquettes sur votre compte." #: src/view/screens/ProfileList.tsx:633 msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." @@ -500,7 +449,7 @@ msgstr "Le blocage est public. Les comptes bloqués ne peuvent pas répondre à #: src/view/com/profile/ProfileMenu.tsx:353 msgid "Blocking will not prevent labels from being applied on your account, but it will stop this account from replying in your threads or interacting with you." -msgstr "" +msgstr "Le blocage n’empêchera pas les étiquettes d’être appliquées à votre compte, mais il empêchera ce compte de répondre à vos discussions ou d’interagir avec vous." #: src/view/com/auth/SplashScreen.web.tsx:149 msgid "Blog" @@ -536,20 +485,16 @@ msgstr "Bluesky n’affichera pas votre profil et vos posts à des personnes non #: src/lib/moderation/useLabelBehaviorDescription.ts:53 msgid "Blur images" -msgstr "" +msgstr "Flouter les images" #: src/lib/moderation/useLabelBehaviorDescription.ts:51 msgid "Blur images and filter from feeds" -msgstr "" +msgstr "Flouter les images et les filtrer des fils d’actu" #: src/screens/Onboarding/index.tsx:33 msgid "Books" msgstr "Livres" -#: src/view/screens/Settings/index.tsx:893 -#~ msgid "Build version {0} {1}" -#~ msgstr "Version Build {0} {1}" - #: src/view/com/auth/SplashScreen.web.tsx:146 msgid "Business" msgstr "Affaires" @@ -564,7 +509,7 @@ msgstr "par {0}" #: src/components/LabelingServiceCard/index.tsx:57 msgid "By {0}" -msgstr "" +msgstr "Par {0}" #: src/view/com/profile/ProfileSubpageHeader.tsx:161 msgid "by <0/>" @@ -572,7 +517,7 @@ msgstr "par <0/>" #: src/screens/Signup/StepInfo/Policies.tsx:74 msgid "By creating an account you agree to the {els}." -msgstr "" +msgstr "En créant un compte, vous acceptez les {els}." #: src/view/com/profile/ProfileSubpageHeader.tsx:159 msgid "by you" @@ -648,11 +593,11 @@ msgstr "Annuler la recherche" #: src/view/com/modals/LinkWarning.tsx:106 msgid "Cancels opening the linked website" -msgstr "" +msgstr "Annule l’ouverture du site web lié" #: src/view/com/modals/VerifyEmail.tsx:152 msgid "Change" -msgstr "" +msgstr "Modifier" #: src/view/screens/Settings/index.tsx:356 msgctxt "action" @@ -685,10 +630,6 @@ msgstr "Modifier le mot de passe" msgid "Change post language to {0}" msgstr "Modifier la langue de post en {0}" -#: src/view/screens/Settings/index.tsx:733 -#~ msgid "Change your Bluesky password" -#~ msgstr "Changer votre mot de passe pour Bluesky" - #: src/view/com/modals/ChangeEmail.tsx:109 msgid "Change Your Email" msgstr "Modifier votre e-mail" @@ -714,10 +655,6 @@ msgstr "Consultez votre boîte de réception, vous avez du recevoir un e-mail co msgid "Choose \"Everybody\" or \"Nobody\"" msgstr "Choisir « Tout le monde » ou « Personne »" -#: src/view/screens/Settings/index.tsx:697 -#~ msgid "Choose a new Bluesky username or create" -#~ msgstr "Choisir un nouveau pseudo Bluesky ou en créer un" - #: src/view/com/auth/server-input/index.tsx:79 msgid "Choose Service" msgstr "Choisir un service" @@ -762,11 +699,11 @@ msgstr "Effacer la recherche" #: src/view/screens/Settings/index.tsx:833 msgid "Clears all legacy storage data" -msgstr "" +msgstr "Efface toutes les données de stockage existantes" #: src/view/screens/Settings/index.tsx:845 msgid "Clears all storage data" -msgstr "" +msgstr "Efface toutes les données de stockage" #: src/view/screens/Support.tsx:40 msgid "click here" @@ -874,11 +811,11 @@ msgstr "Configurer les paramètres de filtrage de contenu pour la catégorie : #: src/components/moderation/LabelPreference.tsx:81 msgid "Configure content filtering setting for category: {name}" -msgstr "" +msgstr "Configure les paramètres de filtrage de contenu pour la catégorie : {name}" #: src/components/moderation/LabelPreference.tsx:244 msgid "Configured in <0>moderation settings." -msgstr "" +msgstr "Configuré dans <0>les paramètres de modération." #: src/components/Prompt.tsx:153 #: src/components/Prompt.tsx:156 @@ -890,12 +827,6 @@ msgstr "" msgid "Confirm" msgstr "Confirmer" -#: src/view/com/modals/Confirm.tsx:75 -#: src/view/com/modals/Confirm.tsx:78 -#~ msgctxt "action" -#~ msgid "Confirm" -#~ msgstr "Confirmer" - #: src/view/com/modals/ChangeEmail.tsx:193 #: src/view/com/modals/ChangeEmail.tsx:195 msgid "Confirm Change" @@ -909,17 +840,13 @@ msgstr "Confirmer les paramètres de langue" msgid "Confirm delete account" msgstr "Confirmer la suppression du compte" -#: src/view/com/modals/ContentFilteringSettings.tsx:156 -#~ msgid "Confirm your age to enable adult content." -#~ msgstr "Confirmez votre âge pour activer le contenu pour adultes." - #: src/screens/Moderation/index.tsx:301 msgid "Confirm your age:" -msgstr "" +msgstr "Confirmez votre âge :" #: src/screens/Moderation/index.tsx:292 msgid "Confirm your birthdate" -msgstr "" +msgstr "Confirme votre date de naissance" #: src/view/com/modals/ChangeEmail.tsx:157 #: src/view/com/modals/DeleteAccount.tsx:175 @@ -938,23 +865,15 @@ msgstr "Contacter le support" #: src/components/moderation/LabelsOnMe.tsx:42 msgid "content" -msgstr "" +msgstr "contenu" #: src/lib/moderation/useGlobalLabelStrings.ts:18 msgid "Content Blocked" -msgstr "" - -#: src/view/screens/Moderation.tsx:83 -#~ msgid "Content filtering" -#~ msgstr "Filtrage du contenu" - -#: src/view/com/modals/ContentFilteringSettings.tsx:44 -#~ msgid "Content Filtering" -#~ msgstr "Filtrage du contenu" +msgstr "Contenu bloqué" #: src/screens/Moderation/index.tsx:285 msgid "Content filters" -msgstr "" +msgstr "Filtres de contenu" #: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:74 #: src/view/screens/LanguageSettings.tsx:278 @@ -979,7 +898,7 @@ msgstr "Avertissements sur le contenu" #: src/components/Menu/index.web.tsx:84 msgid "Context menu backdrop, click to close the menu." -msgstr "" +msgstr "Menu contextuel en arrière-plan, cliquez pour fermer le menu." #: src/screens/Onboarding/StepAlgoFeeds/index.tsx:161 #: src/screens/Onboarding/StepFollowingFeed.tsx:154 @@ -994,7 +913,7 @@ msgstr "Continuer" #: src/components/AccountList.tsx:108 msgid "Continue as {0} (currently signed in)" -msgstr "" +msgstr "Continuer comme {0} (actuellement connecté)" #: src/screens/Onboarding/StepFollowingFeed.tsx:151 #: src/screens/Onboarding/StepInterests/index.tsx:249 @@ -1034,7 +953,7 @@ msgstr "Copié dans le presse-papier" #: src/components/dialogs/Embed.tsx:134 msgid "Copied!" -msgstr "" +msgstr "Copié !" #: src/view/com/modals/AddAppPasswords.tsx:190 msgid "Copies app password" @@ -1042,16 +961,16 @@ msgstr "Copie le mot de passe d’application" #: src/view/com/modals/AddAppPasswords.tsx:189 msgid "Copy" -msgstr "Copie" +msgstr "Copier" #: src/view/com/modals/ChangeHandle.tsx:480 msgid "Copy {0}" -msgstr "" +msgstr "Copier {0}" #: src/components/dialogs/Embed.tsx:120 #: src/components/dialogs/Embed.tsx:139 msgid "Copy code" -msgstr "" +msgstr "Copier ce code" #: src/view/screens/ProfileList.tsx:390 msgid "Copy link to list" @@ -1062,10 +981,6 @@ msgstr "Copier le lien vers la liste" msgid "Copy link to post" msgstr "Copier le lien vers le post" -#: src/view/com/profile/ProfileHeader.tsx:295 -#~ msgid "Copy link to profile" -#~ msgstr "Copier le lien vers le profil" - #: src/view/com/util/forms/PostDropdownBtn.tsx:228 #: src/view/com/util/forms/PostDropdownBtn.tsx:230 msgid "Copy post text" @@ -1100,7 +1015,7 @@ msgstr "Créer un compte" #: src/components/dialogs/Signin.tsx:86 #: src/components/dialogs/Signin.tsx:88 msgid "Create an account" -msgstr "" +msgstr "Créer un compte" #: src/view/com/modals/AddAppPasswords.tsx:227 msgid "Create App Password" @@ -1113,20 +1028,12 @@ msgstr "Créer un nouveau compte" #: src/components/ReportDialog/SelectReportOptionView.tsx:94 msgid "Create report for {0}" -msgstr "" +msgstr "Créer un rapport pour {0}" #: src/view/screens/AppPasswords.tsx:246 msgid "Created {0}" msgstr "{0} créé" -#: src/view/screens/ProfileFeed.tsx:616 -#~ msgid "Created by <0/>" -#~ msgstr "Créée par <0/>" - -#: src/view/screens/ProfileFeed.tsx:614 -#~ msgid "Created by you" -#~ msgstr "Créée par vous" - #: src/view/com/composer/Composer.tsx:469 msgid "Creates a card with a thumbnail. The card links to {url}" msgstr "Crée une carte avec une miniature. La carte pointe vers {url}" @@ -1168,11 +1075,11 @@ msgstr "Thème sombre" #: src/screens/Signup/StepInfo/index.tsx:134 msgid "Date of birth" -msgstr "" +msgstr "Date de naissance" #: src/view/screens/Settings/index.tsx:805 msgid "Debug Moderation" -msgstr "" +msgstr "Déboguer la modération" #: src/view/screens/Debug.tsx:83 msgid "Debug panel" @@ -1182,7 +1089,7 @@ msgstr "Panneau de débug" #: src/view/screens/AppPasswords.tsx:268 #: src/view/screens/ProfileList.tsx:615 msgid "Delete" -msgstr "" +msgstr "Supprimer" #: src/view/screens/Settings/index.tsx:760 msgid "Delete account" @@ -1198,7 +1105,7 @@ msgstr "Supprimer le mot de passe de l’appli" #: src/view/screens/AppPasswords.tsx:263 msgid "Delete app password?" -msgstr "" +msgstr "Supprimer le mot de passe de l’appli ?" #: src/view/screens/ProfileList.tsx:417 msgid "Delete List" @@ -1219,7 +1126,7 @@ msgstr "Supprimer le post" #: src/view/screens/ProfileList.tsx:610 msgid "Delete this list?" -msgstr "" +msgstr "Supprimer cette liste ?" #: src/view/com/util/forms/PostDropdownBtn.tsx:336 msgid "Delete this post?" @@ -1250,30 +1157,26 @@ msgstr "Atténué" #: src/view/screens/Settings/index.tsx:697 msgid "Disable haptics" -msgstr "" +msgstr "Désactiver l’haptique" #: src/view/screens/Settings/index.tsx:697 msgid "Disable vibrations" -msgstr "" +msgstr "Désactiver les vibrations" #: src/lib/moderation/useLabelBehaviorDescription.ts:32 #: src/lib/moderation/useLabelBehaviorDescription.ts:42 #: src/lib/moderation/useLabelBehaviorDescription.ts:68 #: src/screens/Moderation/index.tsx:341 msgid "Disabled" -msgstr "" +msgstr "Désactivé" #: src/view/com/composer/Composer.tsx:511 msgid "Discard" msgstr "Ignorer" -#: src/view/com/composer/Composer.tsx:145 -#~ msgid "Discard draft" -#~ msgstr "Ignorer le brouillon" - #: src/view/com/composer/Composer.tsx:508 msgid "Discard draft?" -msgstr "" +msgstr "Abandonner le brouillon ?" #: src/screens/Moderation/index.tsx:518 #: src/screens/Moderation/index.tsx:522 @@ -1299,19 +1202,19 @@ msgstr "Afficher le nom" #: src/view/com/modals/ChangeHandle.tsx:397 msgid "DNS Panel" -msgstr "" +msgstr "Panneau DNS" #: src/lib/moderation/useGlobalLabelStrings.ts:39 msgid "Does not include nudity." -msgstr "" +msgstr "Ne comprend pas de nudité." #: src/screens/Signup/StepHandle.tsx:105 msgid "Doesn't begin or end with a hyphen" -msgstr "" +msgstr "Ne commence pas ou ne se termine pas par un trait d’union" #: src/view/com/modals/ChangeHandle.tsx:481 msgid "Domain Value" -msgstr "" +msgstr "Valeur du domaine" #: src/view/com/modals/ChangeHandle.tsx:488 msgid "Domain verified!" @@ -1352,14 +1255,6 @@ msgstr "Terminer" msgid "Done{extraText}" msgstr "Terminé{extraText}" -#: src/view/com/auth/login/ChooseAccountForm.tsx:46 -#~ msgid "Double tap to sign in" -#~ msgstr "Tapotez deux fois pour vous connecter" - -#: src/view/screens/Settings/index.tsx:755 -#~ msgid "Download Bluesky account data (repository)" -#~ msgstr "Télécharger les données du compte Bluesky (dépôt)" - #: src/view/screens/Settings/ExportCarDialog.tsx:59 #: src/view/screens/Settings/ExportCarDialog.tsx:63 msgid "Download CAR file" @@ -1375,7 +1270,7 @@ msgstr "En raison des politiques d’Apple, le contenu pour adultes ne peut êtr #: src/view/com/modals/ChangeHandle.tsx:258 msgid "e.g. alice" -msgstr "" +msgstr "ex. alice" #: src/view/com/modals/EditProfile.tsx:186 msgid "e.g. Alice Roberts" @@ -1383,7 +1278,7 @@ msgstr "ex. Alice Dupont" #: src/view/com/modals/ChangeHandle.tsx:380 msgid "e.g. alice.com" -msgstr "" +msgstr "ex. alice.fr" #: src/view/com/modals/EditProfile.tsx:204 msgid "e.g. Artist, dog-lover, and avid reader." @@ -1391,7 +1286,7 @@ msgstr "ex. Artiste, amoureuse des chiens et lectrice passionnée." #: src/lib/moderation/useGlobalLabelStrings.ts:43 msgid "E.g. artistic nudes." -msgstr "" +msgstr "Ex. nus artistiques." #: src/view/com/modals/CreateOrEditList.tsx:284 msgid "e.g. Great Posters" @@ -1421,7 +1316,7 @@ msgstr "Modifier" #: src/view/com/util/UserAvatar.tsx:301 #: src/view/com/util/UserBanner.tsx:85 msgid "Edit avatar" -msgstr "" +msgstr "Modifier l’avatar" #: src/view/com/composer/photos/Gallery.tsx:144 #: src/view/com/modals/EditImage.tsx:208 @@ -1505,17 +1400,17 @@ msgstr "E-mail :" #: src/components/dialogs/Embed.tsx:112 msgid "Embed HTML code" -msgstr "" +msgstr "Code HTML à intégrer" #: src/components/dialogs/Embed.tsx:97 #: src/view/com/util/forms/PostDropdownBtn.tsx:253 #: src/view/com/util/forms/PostDropdownBtn.tsx:255 msgid "Embed post" -msgstr "" +msgstr "Intégrer le post" #: src/components/dialogs/Embed.tsx:101 msgid "Embed this post in your website. Simply copy the following snippet and paste it into the HTML code of your website." -msgstr "" +msgstr "Intégrez ce post à votre site web. Il suffit de copier l’extrait suivant et de le coller dans le code HTML de votre site web." #: src/components/dialogs/EmbedConsent.tsx:101 msgid "Enable {0} only" @@ -1523,7 +1418,7 @@ msgstr "Activer {0} uniquement" #: src/screens/Moderation/index.tsx:329 msgid "Enable adult content" -msgstr "" +msgstr "Activer le contenu pour adultes" #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:94 msgid "Enable Adult Content" @@ -1537,11 +1432,7 @@ msgstr "Activer le contenu pour adultes dans vos fils d’actu" #: src/components/dialogs/EmbedConsent.tsx:82 #: src/components/dialogs/EmbedConsent.tsx:89 msgid "Enable external media" -msgstr "" - -#: src/view/com/modals/EmbedConsent.tsx:97 -#~ msgid "Enable External Media" -#~ msgstr "Activer les médias externes" +msgstr "Activer les médias externes" #: src/view/screens/PreferencesExternalEmbeds.tsx:75 msgid "Enable media players for" @@ -1553,11 +1444,11 @@ msgstr "Activez ce paramètre pour ne voir que les réponses des personnes que v #: src/components/dialogs/EmbedConsent.tsx:94 msgid "Enable this source only" -msgstr "" +msgstr "Active cette source uniquement" #: src/screens/Moderation/index.tsx:339 msgid "Enabled" -msgstr "" +msgstr "Activé" #: src/screens/Profile/Sections/Feed.tsx:100 msgid "End of feed" @@ -1569,7 +1460,7 @@ msgstr "Entrer un nom pour ce mot de passe d’application" #: src/screens/Login/SetNewPasswordForm.tsx:139 msgid "Enter a password" -msgstr "" +msgstr "Saisir un mot de passe" #: src/components/dialogs/MutedWords.tsx:99 #: src/components/dialogs/MutedWords.tsx:100 @@ -1627,11 +1518,11 @@ msgstr "Tout le monde" #: src/lib/moderation/useReportOptions.ts:66 msgid "Excessive mentions or replies" -msgstr "" +msgstr "Mentions ou réponses excessives" #: src/view/com/modals/DeleteAccount.tsx:230 msgid "Exits account deletion process" -msgstr "" +msgstr "Sort du processus de suppression du compte" #: src/view/com/modals/ChangeHandle.tsx:151 msgid "Exits handle change process" @@ -1639,7 +1530,7 @@ msgstr "Sort du processus de changement de pseudo" #: src/view/com/modals/crop-image/CropImage.web.tsx:136 msgid "Exits image cropping process" -msgstr "" +msgstr "Sort du processus de recadrage de l’image" #: src/view/com/lightbox/Lightbox.web.tsx:130 msgid "Exits image view" @@ -1661,11 +1552,11 @@ msgstr "Développe ou réduit le post complet auquel vous répondez" #: src/lib/moderation/useGlobalLabelStrings.ts:47 msgid "Explicit or potentially disturbing media." -msgstr "" +msgstr "Médias explicites ou potentiellement dérangeants." #: src/lib/moderation/useGlobalLabelStrings.ts:35 msgid "Explicit sexual images." -msgstr "" +msgstr "Images sexuelles explicites." #: src/view/screens/Settings/index.tsx:741 msgid "Export my data" @@ -1716,7 +1607,7 @@ msgstr "Échec du chargement des fils d’actu recommandés" #: src/view/com/lightbox/Lightbox.tsx:83 msgid "Failed to save image: {0}" -msgstr "" +msgstr "Échec de l’enregistrement de l’image : {0}" #: src/Navigation.tsx:196 msgid "Feed" @@ -1760,11 +1651,11 @@ msgstr "Les fils d’actu peuvent également être thématiques !" #: src/view/com/modals/ChangeHandle.tsx:481 msgid "File Contents" -msgstr "" +msgstr "Contenu du fichier" #: src/lib/moderation/useLabelBehaviorDescription.ts:66 msgid "Filter from feeds" -msgstr "" +msgstr "Filtrer des fils d’actu" #: src/screens/Onboarding/StepFinished.tsx:155 msgid "Finalizing" @@ -1835,7 +1726,7 @@ msgstr "Suivre {0}" #: src/view/com/profile/ProfileMenu.tsx:242 #: src/view/com/profile/ProfileMenu.tsx:253 msgid "Follow Account" -msgstr "" +msgstr "Suivre le compte" #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:187 msgid "Follow All" @@ -1843,7 +1734,7 @@ msgstr "Suivre tous" #: src/view/com/post-thread/PostThreadFollowBtn.tsx:144 msgid "Follow Back" -msgstr "" +msgstr "Suivre en retour" #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:182 msgid "Follow selected accounts and continue to the next step" @@ -1887,7 +1778,7 @@ msgstr "Suit {0}" #: src/view/screens/Settings/index.tsx:504 msgid "Following feed preferences" -msgstr "" +msgstr "Préférences du fil d’actu « Following »" #: src/Navigation.tsx:262 #: src/view/com/home/HomeHeaderLayout.web.tsx:54 @@ -1917,14 +1808,6 @@ msgstr "Pour des raisons de sécurité, nous devrons envoyer un code de confirma msgid "For security reasons, you won't be able to view this again. If you lose this password, you'll need to generate a new one." msgstr "Pour des raisons de sécurité, vous ne pourrez plus afficher ceci. Si vous perdez ce mot de passe, vous devrez en générer un autre." -#: src/view/com/auth/login/LoginForm.tsx:244 -#~ msgid "Forgot" -#~ msgstr "Oublié" - -#: src/view/com/auth/login/LoginForm.tsx:241 -#~ msgid "Forgot password" -#~ msgstr "Mot de passe oublié" - #: src/screens/Login/index.tsx:129 #: src/screens/Login/index.tsx:144 msgid "Forgot Password" @@ -1932,15 +1815,15 @@ msgstr "Mot de passe oublié" #: src/screens/Login/LoginForm.tsx:201 msgid "Forgot password?" -msgstr "" +msgstr "Mot de passe oublié ?" #: src/screens/Login/LoginForm.tsx:212 msgid "Forgot?" -msgstr "" +msgstr "Oublié ?" #: src/lib/moderation/useReportOptions.ts:52 msgid "Frequently Posts Unwanted Content" -msgstr "" +msgstr "Publication fréquente de contenu indésirable" #: src/screens/Hashtag.tsx:109 #: src/screens/Hashtag.tsx:149 @@ -1963,7 +1846,7 @@ msgstr "C’est parti" #: src/lib/moderation/useReportOptions.ts:37 msgid "Glaring violations of law or terms of service" -msgstr "" +msgstr "Violations flagrantes de la loi ou des conditions d’utilisation" #: src/components/moderation/ScreenHider.tsx:151 #: src/components/moderation/ScreenHider.tsx:160 @@ -1995,11 +1878,11 @@ msgstr "Retour à l’étape précédente" #: src/view/screens/NotFound.tsx:55 msgid "Go home" -msgstr "" +msgstr "Accéder à l’accueil" #: src/view/screens/NotFound.tsx:54 msgid "Go Home" -msgstr "" +msgstr "Accéder à l’accueil" #: src/view/screens/Search/Search.tsx:896 #: src/view/shell/desktop/Search.tsx:263 @@ -2013,7 +1896,7 @@ msgstr "Aller à la suite" #: src/lib/moderation/useGlobalLabelStrings.ts:46 msgid "Graphic Media" -msgstr "" +msgstr "Médias crus" #: src/view/com/modals/ChangeHandle.tsx:266 msgid "Handle" @@ -2021,7 +1904,7 @@ msgstr "Pseudo" #: src/lib/moderation/useReportOptions.ts:32 msgid "Harassment, trolling, or intolerance" -msgstr "" +msgstr "Harcèlement, trolling ou intolérance" #: src/Navigation.tsx:282 msgid "Hashtag" @@ -2092,10 +1975,6 @@ msgstr "Cacher ce post ?" msgid "Hide user list" msgstr "Cacher la liste des comptes" -#: src/view/com/profile/ProfileHeader.tsx:487 -#~ msgid "Hides posts from {0} in your feed" -#~ msgstr "Masque les posts de {0} dans votre fil d’actu" - #: src/view/com/posts/FeedErrorMessage.tsx:111 msgid "Hmm, some kind of issue occurred when contacting the feed server. Please let the feed owner know about this issue." msgstr "Hmm, un problème s’est produit avec le serveur de fils d’actu. Veuillez informer la personne propriétaire du fil d’actu de ce problème." @@ -2106,11 +1985,11 @@ msgstr "Hmm, le serveur du fils d’actu semble être mal configuré. Veuillez i #: src/view/com/posts/FeedErrorMessage.tsx:105 msgid "Hmm, the feed server appears to be offline. Please let the feed owner know about this issue." -msgstr "Mmm… le serveur de fils d’actu semble être hors ligne. Veuillez informer la personne propriétaire du fil d’actu de ce problème." +msgstr "Hmm, le serveur de fils d’actu semble être hors ligne. Veuillez informer la personne propriétaire du fil d’actu de ce problème." #: src/view/com/posts/FeedErrorMessage.tsx:102 msgid "Hmm, the feed server gave a bad response. Please let the feed owner know about this issue." -msgstr "Mmm… le serveur de fils d’actu ne répond pas. Veuillez informer la personne propriétaire du fil d’actu de ce problème." +msgstr "Hmm, le serveur de fils d’actu ne répond pas. Veuillez informer la personne propriétaire du fil d’actu de ce problème." #: src/view/com/posts/FeedErrorMessage.tsx:96 msgid "Hmm, we're having trouble finding this feed. It may have been deleted." @@ -2118,11 +1997,11 @@ msgstr "Hmm, nous n’arrivons pas à trouver ce fil d’actu. Il a peut-être #: src/screens/Moderation/index.tsx:59 msgid "Hmmmm, it seems we're having trouble loading this data. See below for more details. If this issue persists, please contact us." -msgstr "" +msgstr "Hmm, il semble que nous ayons des difficultés à charger ces données. Voir ci-dessous pour plus de détails. Si le problème persiste, veuillez nous contacter." #: src/screens/Profile/ErrorState.tsx:31 msgid "Hmmmm, we couldn't load that moderation service." -msgstr "" +msgstr "Hmm, nous n’avons pas pu charger ce service de modération." #: src/Navigation.tsx:446 #: src/view/shell/bottom-bar/BottomBar.tsx:148 @@ -2134,7 +2013,7 @@ msgstr "Accueil" #: src/view/com/modals/ChangeHandle.tsx:420 msgid "Host:" -msgstr "" +msgstr "Hébergeur :" #: src/screens/Login/ForgotPasswordForm.tsx:89 #: src/screens/Login/LoginForm.tsx:134 @@ -2169,15 +2048,15 @@ msgstr "Si rien n’est sélectionné, il n’y a pas de restriction d’âge." #: src/screens/Signup/StepInfo/Policies.tsx:83 msgid "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." -msgstr "" +msgstr "Si vous n’êtes pas encore un adulte selon les lois de votre pays, vos parents ou votre tuteur légal doivent lire ces conditions en votre nom." #: src/view/screens/ProfileList.tsx:612 msgid "If you delete this list, you won't be able to recover it." -msgstr "" +msgstr "Si vous supprimez cette liste, vous ne pourrez pas la récupérer." #: src/view/com/util/forms/PostDropdownBtn.tsx:338 msgid "If you remove this post, you won't be able to recover it." -msgstr "" +msgstr "Si vous supprimez ce post, vous ne pourrez pas le récupérer." #: src/view/com/modals/ChangePassword.tsx:148 msgid "If you want to change your password, we will send you a code to verify that this is your account." @@ -2185,7 +2064,7 @@ msgstr "Si vous souhaitez modifier votre mot de passe, nous vous enverrons un co #: src/lib/moderation/useReportOptions.ts:36 msgid "Illegal and Urgent" -msgstr "" +msgstr "Illégal et urgent" #: src/view/com/util/images/Gallery.tsx:38 msgid "Image" @@ -2195,14 +2074,9 @@ msgstr "Image" msgid "Image alt text" msgstr "Texte alt de l’image" -#: src/view/com/util/UserAvatar.tsx:311 -#: src/view/com/util/UserBanner.tsx:118 -#~ msgid "Image options" -#~ msgstr "Options d’images" - #: src/lib/moderation/useReportOptions.ts:47 msgid "Impersonation or false claims about identity or affiliation" -msgstr "" +msgstr "Usurpation d’identité ou fausses déclarations concernant l’identité ou l’affiliation" #: src/screens/Login/SetNewPasswordForm.tsx:127 msgid "Input code sent to your email for password reset" @@ -2212,14 +2086,6 @@ msgstr "Entrez le code envoyé à votre e-mail pour réinitialiser le mot de pas msgid "Input confirmation code for account deletion" msgstr "Entrez le code de confirmation pour supprimer le compte" -#: src/view/com/auth/create/Step1.tsx:177 -#~ msgid "Input email for Bluesky account" -#~ msgstr "Saisir l’email pour le compte Bluesky" - -#: src/view/com/auth/create/Step1.tsx:151 -#~ msgid "Input invite code to proceed" -#~ msgstr "Entrez le code d’invitation pour continuer" - #: src/view/com/modals/AddAppPasswords.tsx:181 msgid "Input name for app password" msgstr "Entrez le nom du mot de passe de l’appli" @@ -2246,7 +2112,7 @@ msgstr "Entrez votre mot de passe" #: src/view/com/modals/ChangeHandle.tsx:389 msgid "Input your preferred hosting provider" -msgstr "" +msgstr "Entrez votre hébergeur préféré" #: src/screens/Signup/StepHandle.tsx:63 msgid "Input your user handle" @@ -2294,35 +2160,35 @@ msgstr "Journalisme" #: src/components/moderation/LabelsOnMe.tsx:59 msgid "label has been placed on this {labelTarget}" -msgstr "" +msgstr "étiquette a été placée sur ce {labelTarget}" #: src/components/moderation/ContentHider.tsx:144 msgid "Labeled by {0}." -msgstr "" +msgstr "Étiqueté par {0}." #: src/components/moderation/ContentHider.tsx:142 msgid "Labeled by the author." -msgstr "" +msgstr "Étiqueté par l’auteur." #: src/view/screens/Profile.tsx:193 msgid "Labels" -msgstr "" +msgstr "Étiquettes" #: src/screens/Profile/Sections/Labels.tsx:153 msgid "Labels are annotations on users and content. They can be used to hide, warn, and categorize the network." -msgstr "" +msgstr "Les étiquettes sont des annotations sur les comptes et le contenu. Elles peuvent être utilisées pour masquer, avertir et catégoriser le réseau." #: src/components/moderation/LabelsOnMe.tsx:61 msgid "labels have been placed on this {labelTarget}" -msgstr "" +msgstr "étiquettes ont été placées sur ce {labelTarget}" #: src/components/moderation/LabelsOnMeDialog.tsx:62 msgid "Labels on your account" -msgstr "" +msgstr "Étiquettes sur votre compte" #: src/components/moderation/LabelsOnMeDialog.tsx:64 msgid "Labels on your content" -msgstr "" +msgstr "Étiquettes sur votre contenu" #: src/view/com/composer/select-language/SelectLangBtn.tsx:104 msgid "Language selection" @@ -2341,17 +2207,9 @@ msgstr "Paramètres linguistiques" msgid "Languages" msgstr "Langues" -#: src/view/com/auth/create/StepHeader.tsx:20 -#~ msgid "Last step!" -#~ msgstr "Dernière étape !" - #: src/view/screens/Search/Search.tsx:437 msgid "Latest" -msgstr "" - -#: src/view/com/util/moderation/ContentHider.tsx:103 -#~ msgid "Learn more" -#~ msgstr "En savoir plus" +msgstr "Dernier" #: src/components/moderation/ScreenHider.tsx:136 msgid "Learn More" @@ -2360,7 +2218,7 @@ msgstr "En savoir plus" #: src/components/moderation/ContentHider.tsx:65 #: src/components/moderation/ContentHider.tsx:128 msgid "Learn more about the moderation applied to this content." -msgstr "" +msgstr "En savoir plus sur la modération appliquée à ce contenu." #: src/components/moderation/PostHider.tsx:85 #: src/components/moderation/ScreenHider.tsx:125 @@ -2373,7 +2231,7 @@ msgstr "En savoir plus sur ce qui est public sur Bluesky." #: src/components/moderation/ContentHider.tsx:152 msgid "Learn more." -msgstr "" +msgstr "En savoir plus." #: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:82 msgid "Leave them all unchecked to see any language." @@ -2400,11 +2258,6 @@ msgstr "Réinitialisez votre mot de passe !" msgid "Let's go!" msgstr "Allons-y !" -#: src/view/com/util/UserAvatar.tsx:248 -#: src/view/com/util/UserBanner.tsx:62 -#~ msgid "Library" -#~ msgstr "Bibliothèque" - #: src/view/screens/Settings/index.tsx:449 msgid "Light" msgstr "Clair" @@ -2436,7 +2289,7 @@ msgstr "Liké par {0} {1}" #: src/components/LabelingServiceCard/index.tsx:72 msgid "Liked by {count} {0}" -msgstr "" +msgstr "Liké par {count} {0}"" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:284 #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:298 @@ -2505,11 +2358,6 @@ msgstr "Liste démasquée" msgid "Lists" msgstr "Listes" -#: src/view/com/post-thread/PostThread.tsx:333 -#: src/view/com/post-thread/PostThread.tsx:341 -#~ msgid "Load more posts" -#~ msgstr "Charger plus de posts" - #: src/view/screens/Notifications.tsx:159 msgid "Load new notifications" msgstr "Charger les nouvelles notifications" @@ -2546,7 +2394,7 @@ msgstr "Se connecter à un compte qui n’est pas listé" #: src/screens/Login/SetNewPasswordForm.tsx:116 msgid "Looks like XXXXX-XXXXX" -msgstr "" +msgstr "De la forme XXXXX-XXXXX" #: src/view/com/modals/LinkWarning.tsx:79 msgid "Make sure this is where you intend to go!" @@ -2556,14 +2404,6 @@ msgstr "Assurez-vous que c’est bien là que vous avez l’intention d’aller msgid "Manage your muted words and tags" msgstr "Gérer les mots et les mots-clés masqués" -#: src/view/com/auth/create/Step2.tsx:118 -#~ msgid "May not be longer than 253 characters" -#~ msgstr "Ne doit pas dépasser 253 caractères" - -#: src/view/com/auth/create/Step2.tsx:109 -#~ msgid "May only contain letters and numbers" -#~ msgstr "Ne peut contenir que des lettres et des chiffres" - #: src/view/screens/Profile.tsx:197 msgid "Media" msgstr "Média" @@ -2587,7 +2427,7 @@ msgstr "Message du serveur : {0}" #: src/lib/moderation/useReportOptions.ts:45 msgid "Misleading Account" -msgstr "" +msgstr "Compte trompeur" #: src/Navigation.tsx:119 #: src/screens/Moderation/index.tsx:104 @@ -2600,7 +2440,7 @@ msgstr "Modération" #: src/components/moderation/ModerationDetailsDialog.tsx:112 msgid "Moderation details" -msgstr "" +msgstr "Détails de la modération" #: src/view/com/lists/ListCard.tsx:93 #: src/view/com/modals/UserAddRemoveLists.tsx:206 @@ -2640,11 +2480,11 @@ msgstr "Paramètres de modération" #: src/Navigation.tsx:216 msgid "Moderation states" -msgstr "" +msgstr "États de modération" #: src/screens/Moderation/index.tsx:215 msgid "Moderation tools" -msgstr "" +msgstr "Outils de modération" #: src/components/moderation/ModerationDetailsDialog.tsx:48 #: src/lib/moderation/useModerationCauseDescription.ts:40 @@ -2653,7 +2493,7 @@ msgstr "La modération a choisi d’ajouter un avertissement général sur le co #: src/view/com/post-thread/PostThreadItem.tsx:535 msgid "More" -msgstr "" +msgstr "Plus" #: src/view/shell/desktop/Feeds.tsx:65 msgid "More feeds" @@ -2667,10 +2507,6 @@ msgstr "Plus d’options" msgid "Most-liked replies first" msgstr "Réponses les plus likées en premier" -#: src/view/com/auth/create/Step2.tsx:122 -#~ msgid "Must be at least 3 characters" -#~ msgstr "Doit comporter au moins 3 caractères" - #: src/components/TagMenu/index.tsx:249 msgid "Mute" msgstr "Masquer" @@ -2709,10 +2545,6 @@ msgstr "Masquer la liste" msgid "Mute these accounts?" msgstr "Masquer ces comptes ?" -#: src/view/screens/ProfileList.tsx:279 -#~ msgid "Mute this List" -#~ msgstr "Masquer cette liste" - #: src/components/dialogs/MutedWords.tsx:126 msgid "Mute this word in post text and tags" msgstr "Masquer ce mot dans le texte du post et les mots-clés" @@ -2750,7 +2582,7 @@ msgstr "Les comptes masqués voient leurs posts supprimés de votre fil d’actu #: src/lib/moderation/useModerationCauseDescription.ts:85 msgid "Muted by \"{0}\"" -msgstr "" +msgstr "Masqué par « {0} »" #: src/screens/Moderation/index.tsx:231 msgid "Muted words & tags" @@ -2775,16 +2607,12 @@ msgstr "Mon profil" #: src/view/screens/Settings/index.tsx:547 msgid "My saved feeds" -msgstr "" +msgstr "Mes fils d’actu enregistrés" #: src/view/screens/Settings/index.tsx:553 msgid "My Saved Feeds" msgstr "Mes fils d’actu enregistrés" -#: src/view/com/auth/server-input/index.tsx:118 -#~ msgid "my-server.com" -#~ msgstr "mon-serveur.fr" - #: src/view/com/modals/AddAppPasswords.tsx:180 #: src/view/com/modals/CreateOrEditList.tsx:291 msgid "Name" @@ -2798,7 +2626,7 @@ msgstr "Le nom est requis" #: src/lib/moderation/useReportOptions.ts:78 #: src/lib/moderation/useReportOptions.ts:86 msgid "Name or Description Violates Community Standards" -msgstr "" +msgstr "Nom ou description qui viole les normes communautaires" #: src/screens/Onboarding/index.tsx:25 msgid "Nature" @@ -2816,29 +2644,20 @@ msgstr "Navigue vers votre profil" #: src/components/ReportDialog/SelectReportOptionView.tsx:123 msgid "Need to report a copyright violation?" -msgstr "" - -#: src/view/com/modals/EmbedConsent.tsx:107 -#: src/view/com/modals/EmbedConsent.tsx:123 -#~ msgid "Never load embeds from {0}" -#~ msgstr "Ne jamais charger les contenus intégrés de {0}" +msgstr "Besoin de signaler une violation des droits d’auteur ?" #: src/view/com/auth/onboarding/WelcomeDesktop.tsx:72 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:74 msgid "Never lose access to your followers and data." -msgstr "Ne perdez jamais l’accès à vos followers et à vos données." +msgstr "Ne perdez jamais l’accès à vos abonné·e·s et à vos données." #: src/screens/Onboarding/StepFinished.tsx:123 msgid "Never lose access to your followers or data." -msgstr "Ne perdez jamais l’accès à vos followers ou à vos données." - -#: src/components/dialogs/MutedWords.tsx:293 -#~ msgid "Nevermind" -#~ msgstr "Peu importe" +msgstr "Ne perdez jamais l’accès à vos abonné·e·s ou à vos données." #: src/view/com/modals/ChangeHandle.tsx:519 msgid "Nevermind, create a handle for me" -msgstr "" +msgstr "Peu importe, créez un pseudo pour moi" #: src/view/screens/Lists.tsx:76 msgctxt "action" @@ -2931,7 +2750,7 @@ msgstr "Aucune description" #: src/view/com/modals/ChangeHandle.tsx:405 msgid "No DNS Panel" -msgstr "" +msgstr "Pas de panneau DNS" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:118 msgid "No longer following {0}" @@ -2939,7 +2758,7 @@ msgstr "Ne suit plus {0}" #: src/screens/Signup/StepHandle.tsx:115 msgid "No longer than 253 characters" -msgstr "" +msgstr "Pas plus de 253 caractères" #: src/view/com/notifications/Feed.tsx:109 msgid "No notifications yet!" @@ -2976,11 +2795,11 @@ msgstr "Personne" #: src/components/LikedByList.tsx:79 #: src/components/LikesDialog.tsx:99 msgid "Nobody has liked this yet. Maybe you should be the first!" -msgstr "" +msgstr "Personne n’a encore liké. Peut-être devriez-vous ouvrir la voie !" #: src/lib/moderation/useGlobalLabelStrings.ts:42 msgid "Non-sexual Nudity" -msgstr "" +msgstr "Nudité non sexuelle" #: src/view/com/modals/SelfLabel.tsx:135 msgid "Not Applicable." @@ -3000,7 +2819,7 @@ msgstr "Pas maintenant" #: src/view/com/util/forms/PostDropdownBtn.tsx:364 #: src/view/com/util/post-ctrls/PostCtrls.tsx:248 msgid "Note about sharing" -msgstr "" +msgstr "Note sur le partage" #: src/screens/Moderation/index.tsx:540 msgid "Note: Bluesky is an open and public network. This setting only limits the visibility of your content on the Bluesky app and website, and other apps may not respect this setting. Your content may still be shown to logged-out users by other apps and websites." @@ -3022,19 +2841,15 @@ msgstr "Nudité" #: src/lib/moderation/useReportOptions.ts:71 msgid "Nudity or adult content not labeled as such" -msgstr "" - -#: src/lib/moderation/useReportOptions.ts:71 -#~ msgid "Nudity or pornography not labeled as such" -#~ msgstr "" +msgstr "Nudité ou contenu adulte non identifié comme tel" #: src/screens/Signup/index.tsx:143 msgid "of" -msgstr "" +msgstr "sur" #: src/lib/moderation/useLabelBehaviorDescription.ts:11 msgid "Off" -msgstr "" +msgstr "Éteint" #: src/view/com/util/ErrorBoundary.tsx:49 msgid "Oh no!" @@ -3047,7 +2862,7 @@ msgstr "Oh non ! Il y a eu un problème." #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:126 #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:333 msgid "OK" -msgstr "" +msgstr "OK" #: src/screens/Login/PasswordUpdatedForm.tsx:44 msgid "Okay" @@ -3071,7 +2886,7 @@ msgstr "Seul {0} peut répondre." #: src/screens/Signup/StepHandle.tsx:98 msgid "Only contains letters, numbers, and hyphens" -msgstr "" +msgstr "Ne contient que des lettres, des chiffres et des traits d’union" #: src/components/Lists.tsx:75 msgid "Oops, something went wrong!" @@ -3087,10 +2902,6 @@ msgstr "Oups !" msgid "Open" msgstr "Ouvrir" -#: src/view/screens/Moderation.tsx:75 -#~ msgid "Open content filtering settings" -#~ msgstr "Ouvrir les paramètres de filtrage de contenu" - #: src/view/com/composer/Composer.tsx:491 #: src/view/com/composer/Composer.tsx:492 msgid "Open emoji picker" @@ -3098,7 +2909,7 @@ msgstr "Ouvrir le sélecteur d’emoji" #: src/view/screens/ProfileFeed.tsx:311 msgid "Open feed options menu" -msgstr "" +msgstr "Ouvrir le menu des options de fil d’actu" #: src/view/screens/Settings/index.tsx:685 msgid "Open links with in-app browser" @@ -3106,11 +2917,7 @@ msgstr "Ouvrir des liens avec le navigateur interne à l’appli" #: src/screens/Moderation/index.tsx:227 msgid "Open muted words and tags settings" -msgstr "" - -#: src/view/screens/Moderation.tsx:92 -#~ msgid "Open muted words settings" -#~ msgstr "Ouvrir les paramètres des mots masqués" +msgstr "Ouvrir les paramètres des mots masqués et mots-clés" #: src/view/com/home/HomeHeaderLayoutMobile.tsx:52 msgid "Open navigation" @@ -3127,7 +2934,7 @@ msgstr "Ouvrir la page Storybook" #: src/view/screens/Settings/index.tsx:780 msgid "Open system log" -msgstr "" +msgstr "Ouvrir le journal du système" #: src/view/com/util/forms/DropdownButton.tsx:154 msgid "Opens {numItems} options" @@ -3157,10 +2964,6 @@ msgstr "Ouvre les paramètres linguistiques configurables" msgid "Opens device photo gallery" msgstr "Ouvre la galerie de photos de l’appareil" -#: src/view/com/profile/ProfileHeader.tsx:420 -#~ msgid "Opens editor for profile display name, avatar, background image, and description" -#~ msgstr "Ouvre l’éditeur pour le nom d’affichage du profil, l’avatar, l’image d’arrière-plan et la description" - #: src/view/screens/Settings/index.tsx:620 msgid "Opens external embeds settings" msgstr "Ouvre les paramètres d’intégration externe" @@ -3168,20 +2971,12 @@ msgstr "Ouvre les paramètres d’intégration externe" #: src/view/com/auth/SplashScreen.tsx:50 #: src/view/com/auth/SplashScreen.web.tsx:94 msgid "Opens flow to create a new Bluesky account" -msgstr "" +msgstr "Ouvre le flux de création d’un nouveau compte Bluesky" #: src/view/com/auth/SplashScreen.tsx:65 #: src/view/com/auth/SplashScreen.web.tsx:109 msgid "Opens flow to sign into your existing Bluesky account" -msgstr "" - -#: src/view/com/profile/ProfileHeader.tsx:575 -#~ msgid "Opens followers list" -#~ msgstr "Ouvre la liste des comptes abonnés" - -#: src/view/com/profile/ProfileHeader.tsx:594 -#~ msgid "Opens following list" -#~ msgstr "Ouvre la liste des abonnements" +msgstr "Ouvre le flux pour vous connecter à votre compte Bluesky existant" #: src/view/com/modals/InviteCodes.tsx:173 msgid "Opens list of invite codes" @@ -3189,27 +2984,23 @@ msgstr "Ouvre la liste des codes d’invitation" #: src/view/screens/Settings/index.tsx:762 msgid "Opens modal for account deletion confirmation. Requires email code" -msgstr "" - -#: src/view/screens/Settings/index.tsx:774 -#~ msgid "Opens modal for account deletion confirmation. Requires email code." -#~ msgstr "Ouvre la fenêtre modale pour confirmer la suppression du compte. Requiert un code e-mail." +msgstr "Ouvre la fenêtre modale pour confirmer la suppression du compte. Requiert un code e-mail." #: src/view/screens/Settings/index.tsx:720 msgid "Opens modal for changing your Bluesky password" -msgstr "" +msgstr "Ouvre une fenêtre modale pour changer le mot de passe de Bluesky" #: src/view/screens/Settings/index.tsx:669 msgid "Opens modal for choosing a new Bluesky handle" -msgstr "" +msgstr "Ouvre une fenêtre modale pour choisir un nouveau pseudo Bluesky" #: src/view/screens/Settings/index.tsx:743 msgid "Opens modal for downloading your Bluesky account data (repository)" -msgstr "" +msgstr "Ouvre une fenêtre modale pour télécharger les données du compte Bluesky (dépôt)" #: src/view/screens/Settings/index.tsx:932 msgid "Opens modal for email verification" -msgstr "" +msgstr "Ouvre une fenêtre modale pour la vérification de l’e-mail" #: src/view/com/modals/ChangeHandle.tsx:282 msgid "Opens modal for using custom domain" @@ -3234,23 +3025,15 @@ msgstr "Ouvre l’écran avec tous les fils d’actu enregistrés" #: src/view/screens/Settings/index.tsx:647 msgid "Opens the app password settings" -msgstr "" - -#: src/view/screens/Settings/index.tsx:676 -#~ msgid "Opens the app password settings page" -#~ msgstr "Ouvre la page de configuration du mot de passe" +msgstr "Ouvre les paramètres du mot de passe de l’application" #: src/view/screens/Settings/index.tsx:505 msgid "Opens the Following feed preferences" -msgstr "" - -#: src/view/screens/Settings/index.tsx:535 -#~ msgid "Opens the home feed preferences" -#~ msgstr "Ouvre les préférences du fil d’accueil" +msgstr "Ouvre les préférences du fil d’actu « Following »" #: src/view/com/modals/LinkWarning.tsx:93 msgid "Opens the linked website" -msgstr "" +msgstr "Ouvre le site web lié" #: src/view/screens/Settings/index.tsx:793 #: src/view/screens/Settings/index.tsx:803 @@ -3271,7 +3054,7 @@ msgstr "Option {0} sur {numItems}" #: src/components/ReportDialog/SubmitView.tsx:160 msgid "Optionally provide additional information below:" -msgstr "" +msgstr "Ajoutez des informations supplémentaires ci-dessous (optionnel) :" #: src/view/com/modals/Threadgate.tsx:89 msgid "Or combine these options:" @@ -3279,7 +3062,7 @@ msgstr "Ou une combinaison de ces options :" #: src/lib/moderation/useReportOptions.ts:25 msgid "Other" -msgstr "" +msgstr "Autre" #: src/components/AccountList.tsx:73 msgid "Other account" @@ -3307,7 +3090,7 @@ msgstr "Mot de passe" #: src/view/com/modals/ChangePassword.tsx:142 msgid "Password Changed" -msgstr "" +msgstr "Mot de passe modifié" #: src/screens/Login/index.tsx:157 msgid "Password updated" @@ -3320,7 +3103,7 @@ msgstr "Mot de passe mis à jour !" #: src/view/screens/Search/Search.tsx:447 #: src/view/screens/Search/Search.tsx:456 msgid "People" -msgstr "" +msgstr "Personnes" #: src/Navigation.tsx:164 msgid "People followed by @{0}" @@ -3353,7 +3136,7 @@ msgstr "Ajouter à l’accueil" #: src/view/screens/ProfileFeed.tsx:306 msgid "Pin to Home" -msgstr "" +msgstr "Ajouter à l’accueil" #: src/view/screens/SavedFeeds.tsx:89 msgid "Pinned Feeds" @@ -3410,12 +3193,7 @@ msgstr "Veuillez également entrer votre mot de passe :" #: src/components/moderation/LabelsOnMeDialog.tsx:221 msgid "Please explain why you think this label was incorrectly applied by {0}" -msgstr "" - -#: src/view/com/modals/AppealLabel.tsx:72 -#: src/view/com/modals/AppealLabel.tsx:75 -#~ msgid "Please tell us why you think this content warning was incorrectly applied!" -#~ msgstr "Dites-nous donc pourquoi vous pensez que cet avertissement de contenu a été appliqué à tort !" +msgstr "Veuillez expliquer pourquoi vous pensez que cette étiquette a été appliquée à tort par {0}" #: src/view/com/modals/VerifyEmail.tsx:101 msgid "Please Verify Your Email" @@ -3433,10 +3211,6 @@ msgstr "Politique" msgid "Porn" msgstr "Porno" -#: src/lib/moderation/useGlobalLabelStrings.ts:34 -#~ msgid "Pornography" -#~ msgstr "" - #: src/view/com/composer/Composer.tsx:367 #: src/view/com/composer/Composer.tsx:375 msgctxt "action" @@ -3469,12 +3243,12 @@ msgstr "Post caché" #: src/components/moderation/ModerationDetailsDialog.tsx:97 #: src/lib/moderation/useModerationCauseDescription.ts:99 msgid "Post Hidden by Muted Word" -msgstr "" +msgstr "Post caché par mot masqué" #: src/components/moderation/ModerationDetailsDialog.tsx:100 #: src/lib/moderation/useModerationCauseDescription.ts:108 msgid "Post Hidden by You" -msgstr "" +msgstr "Post caché par vous" #: src/view/com/composer/select-language/SelectLangBtn.tsx:87 msgid "Post language" @@ -3512,13 +3286,13 @@ msgstr "Lien potentiellement trompeur" #: src/components/forms/HostingProvider.tsx:46 msgid "Press to change hosting provider" -msgstr "" +msgstr "Appuyer pour changer d’hébergeur" #: src/components/Error.tsx:74 #: src/components/Lists.tsx:80 #: src/screens/Signup/index.tsx:187 msgid "Press to retry" -msgstr "" +msgstr "Appuyer pour réessayer" #: src/view/com/lightbox/Lightbox.web.tsx:150 msgid "Previous image" @@ -3552,7 +3326,7 @@ msgstr "Traitement…" #: src/view/screens/DebugMod.tsx:888 #: src/view/screens/Profile.tsx:361 msgid "profile" -msgstr "" +msgstr "profil" #: src/view/shell/bottom-bar/BottomBar.tsx:261 #: src/view/shell/desktop/LeftNav.tsx:419 @@ -3614,7 +3388,7 @@ msgstr "Ratios" #: src/view/screens/Search/Search.tsx:924 msgid "Recent Searches" -msgstr "" +msgstr "Recherches récentes" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:117 msgid "Recommended Feeds" @@ -3633,29 +3407,25 @@ msgstr "Comptes recommandés" msgid "Remove" msgstr "Supprimer" -#: src/view/com/feeds/FeedSourceCard.tsx:108 -#~ msgid "Remove {0} from my feeds?" -#~ msgstr "Supprimer {0} de mes fils d’actu ?" - #: src/view/com/util/AccountDropdownBtn.tsx:22 msgid "Remove account" msgstr "Supprimer compte" #: src/view/com/util/UserAvatar.tsx:360 msgid "Remove Avatar" -msgstr "" +msgstr "Supprimer l’avatar" #: src/view/com/util/UserBanner.tsx:148 msgid "Remove Banner" -msgstr "" +msgstr "Supprimer l’image d’en-tête" #: src/view/com/posts/FeedErrorMessage.tsx:160 msgid "Remove feed" -msgstr "Supprimer fil d’actu" +msgstr "Supprimer le fil d’actu" #: src/view/com/posts/FeedErrorMessage.tsx:201 msgid "Remove feed?" -msgstr "" +msgstr "Supprimer le fil d’actu ?" #: src/view/com/feeds/FeedSourceCard.tsx:173 #: src/view/com/feeds/FeedSourceCard.tsx:233 @@ -3666,7 +3436,7 @@ msgstr "Supprimer de mes fils d’actu" #: src/view/com/feeds/FeedSourceCard.tsx:278 msgid "Remove from my feeds?" -msgstr "" +msgstr "Supprimer de mes fils d’actu ?" #: src/view/com/composer/photos/Gallery.tsx:167 msgid "Remove image" @@ -3684,17 +3454,9 @@ msgstr "Supprimer le mot masqué de votre liste" msgid "Remove repost" msgstr "Supprimer le repost" -#: src/view/com/feeds/FeedSourceCard.tsx:175 -#~ msgid "Remove this feed from my feeds?" -#~ msgstr "Supprimer ce fil d’actu ?" - #: src/view/com/posts/FeedErrorMessage.tsx:202 msgid "Remove this feed from your saved feeds" -msgstr "" - -#: src/view/com/posts/FeedErrorMessage.tsx:132 -#~ msgid "Remove this feed from your saved feeds?" -#~ msgstr "Supprimer ce fil d’actu de vos fils d’actu enregistrés ?" +msgstr "Supprimer ce fil d’actu de vos fils d’actu enregistrés" #: src/view/com/modals/ListAddRemoveUsers.tsx:199 #: src/view/com/modals/UserAddRemoveLists.tsx:152 @@ -3707,7 +3469,7 @@ msgstr "Supprimé de mes fils d’actu" #: src/view/screens/ProfileFeed.tsx:210 msgid "Removed from your feeds" -msgstr "" +msgstr "Supprimé de vos fils d’actu" #: src/view/com/composer/ExternalEmbed.tsx:71 msgid "Removes default thumbnail from {0}" @@ -3736,10 +3498,6 @@ msgctxt "description" msgid "Reply to <0/>" msgstr "Réponse à <0/>" -#: src/view/com/modals/report/Modal.tsx:166 -#~ msgid "Report {collectionName}" -#~ msgstr "Signaler {collectionName}" - #: src/view/com/profile/ProfileMenu.tsx:319 #: src/view/com/profile/ProfileMenu.tsx:322 msgid "Report Account" @@ -3747,7 +3505,7 @@ msgstr "Signaler le compte" #: src/components/ReportDialog/index.tsx:49 msgid "Report dialog" -msgstr "" +msgstr "Fenêtre de dialogue de signalement" #: src/view/screens/ProfileFeed.tsx:363 #: src/view/screens/ProfileFeed.tsx:365 @@ -3765,23 +3523,23 @@ msgstr "Signaler le post" #: src/components/ReportDialog/SelectReportOptionView.tsx:42 msgid "Report this content" -msgstr "" +msgstr "Signaler ce contenu" #: src/components/ReportDialog/SelectReportOptionView.tsx:55 msgid "Report this feed" -msgstr "" +msgstr "Signaler ce fil d’actu" #: src/components/ReportDialog/SelectReportOptionView.tsx:52 msgid "Report this list" -msgstr "" +msgstr "Signaler cette liste" #: src/components/ReportDialog/SelectReportOptionView.tsx:49 msgid "Report this post" -msgstr "" +msgstr "Signaler ce post" #: src/components/ReportDialog/SelectReportOptionView.tsx:46 msgid "Report this user" -msgstr "" +msgstr "Signaler ce compte" #: src/view/com/modals/Repost.tsx:44 #: src/view/com/modals/Repost.tsx:49 @@ -3808,13 +3566,9 @@ msgstr "Republié par" msgid "Reposted by {0}" msgstr "Republié par {0}" -#: src/view/com/posts/FeedItem.tsx:214 -#~ msgid "Reposted by <0/>" -#~ msgstr "Republié par <0/>" - #: src/view/com/posts/FeedItem.tsx:216 msgid "Reposted by <0><1/>" -msgstr "" +msgstr "Republié par <0><1/>" #: src/view/com/notifications/FeedItem.tsx:168 msgid "reposted your post" @@ -3850,10 +3604,6 @@ msgstr "Réinitialiser le code" msgid "Reset Code" msgstr "Code de réinitialisation" -#: src/view/screens/Settings/index.tsx:824 -#~ msgid "Reset onboarding" -#~ msgstr "Réinitialiser le didacticiel" - #: src/view/screens/Settings/index.tsx:822 #: src/view/screens/Settings/index.tsx:825 msgid "Reset onboarding state" @@ -3863,10 +3613,6 @@ msgstr "Réinitialisation du didacticiel" msgid "Reset password" msgstr "Réinitialiser mot de passe" -#: src/view/screens/Settings/index.tsx:814 -#~ msgid "Reset preferences" -#~ msgstr "Réinitialiser les préférences" - #: src/view/screens/Settings/index.tsx:812 #: src/view/screens/Settings/index.tsx:815 msgid "Reset preferences state" @@ -3908,12 +3654,12 @@ msgstr "Retourne à la page précédente" #: src/view/screens/NotFound.tsx:59 msgid "Returns to home page" -msgstr "" +msgstr "Retour à la page d’accueil" #: src/view/screens/NotFound.tsx:58 #: src/view/screens/ProfileFeed.tsx:113 msgid "Returns to previous page" -msgstr "" +msgstr "Retour à la page précédente" #: src/components/dialogs/BirthDateSettings.tsx:125 #: src/view/com/modals/ChangeHandle.tsx:174 @@ -3934,7 +3680,7 @@ msgstr "Enregistrer le texte alt" #: src/components/dialogs/BirthDateSettings.tsx:119 msgid "Save birthday" -msgstr "" +msgstr "Enregistrer la date de naissance" #: src/view/com/modals/EditProfile.tsx:233 msgid "Save Changes" @@ -3951,7 +3697,7 @@ msgstr "Enregistrer le recadrage de l’image" #: src/view/screens/ProfileFeed.tsx:347 #: src/view/screens/ProfileFeed.tsx:353 msgid "Save to my feeds" -msgstr "" +msgstr "Enregistrer dans mes fils d’actu" #: src/view/screens/SavedFeeds.tsx:123 msgid "Saved Feeds" @@ -3959,11 +3705,11 @@ msgstr "Fils d’actu enregistrés" #: src/view/com/lightbox/Lightbox.tsx:81 msgid "Saved to your camera roll." -msgstr "" +msgstr "Enregistré dans votre photothèque" #: src/view/screens/ProfileFeed.tsx:214 msgid "Saved to your feeds" -msgstr "" +msgstr "Enregistré à mes fils d’actu" #: src/view/com/modals/EditProfile.tsx:226 msgid "Saves any changes to your profile" @@ -3975,7 +3721,7 @@ msgstr "Enregistre le changement de pseudo en {handle}" #: src/view/com/modals/crop-image/CropImage.web.tsx:146 msgid "Saves image crop settings" -msgstr "" +msgstr "Enregistre les paramètres de recadrage de l’image" #: src/screens/Onboarding/index.tsx:36 msgid "Science" @@ -4044,23 +3790,19 @@ msgstr "Voir les posts <0>{displayTag} de ce compte" #: src/view/com/notifications/FeedItem.tsx:419 #: src/view/com/util/UserAvatar.tsx:381 msgid "See profile" -msgstr "" +msgstr "Voir le profil" #: src/view/screens/SavedFeeds.tsx:164 msgid "See this guide" msgstr "Voir ce guide" -#: src/view/com/auth/HomeLoggedOutCTA.tsx:40 -#~ msgid "See what's next" -#~ msgstr "Voir la suite" - #: src/view/com/util/Selector.tsx:106 msgid "Select {item}" msgstr "Sélectionner {item}" #: src/screens/Login/ChooseAccountForm.tsx:61 msgid "Select account" -msgstr "" +msgstr "Sélectionner un compte" #: src/screens/Login/index.tsx:120 msgid "Select from an existing account" @@ -4068,28 +3810,23 @@ msgstr "Sélectionner un compte existant" #: src/view/screens/LanguageSettings.tsx:299 msgid "Select languages" -msgstr "" +msgstr "Sélectionner les langues" #: src/components/ReportDialog/SelectLabelerView.tsx:30 msgid "Select moderator" -msgstr "" +msgstr "Sélectionner une modération" #: src/view/com/util/Selector.tsx:107 msgid "Select option {i} of {numItems}" msgstr "Sélectionne l’option {i} sur {numItems}" -#: src/view/com/auth/create/Step1.tsx:96 -#: src/view/com/auth/login/LoginForm.tsx:153 -#~ msgid "Select service" -#~ msgstr "Sélectionner un service" - #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:52 msgid "Select some accounts below to follow" msgstr "Sélectionnez quelques comptes à suivre ci-dessous" #: src/components/ReportDialog/SubmitView.tsx:133 msgid "Select the moderation service(s) to report to" -msgstr "" +msgstr "Sélectionnez le(s) service(s) de modération destinataires du signalement" #: src/view/com/auth/server-input/index.tsx:82 msgid "Select the service that hosts your data." @@ -4107,17 +3844,13 @@ msgstr "Sélectionnez ce que vous voulez voir (ou ne pas voir), et nous nous occ msgid "Select which languages you want your subscribed feeds to include. If none are selected, all languages will be shown." msgstr "Sélectionnez les langues que vous souhaitez voir figurer dans les fils d’actu que vous suivez. Si aucune langue n’est sélectionnée, toutes les langues seront affichées." -#: src/view/screens/LanguageSettings.tsx:98 -#~ msgid "Select your app language for the default text to display in the app" -#~ msgstr "Sélectionnez la langue de votre application à afficher par défaut" - #: src/view/screens/LanguageSettings.tsx:98 msgid "Select your app language for the default text to display in the app." -msgstr "" +msgstr "Sélectionnez votre langue par défaut pour les textes de l’application." #: src/screens/Signup/StepInfo/index.tsx:135 msgid "Select your date of birth" -msgstr "" +msgstr "Sélectionnez votre date de naissance" #: src/screens/Onboarding/StepInterests/index.tsx:200 msgid "Select your interests from the options below" @@ -4157,15 +3890,11 @@ msgstr "Envoyer des commentaires" #: src/components/ReportDialog/SubmitView.tsx:213 #: src/components/ReportDialog/SubmitView.tsx:217 msgid "Send report" -msgstr "" - -#: src/view/com/modals/report/SendReportButton.tsx:45 -#~ msgid "Send Report" -#~ msgstr "Envoyer le rapport" +msgstr "Envoyer le rapport" #: src/components/ReportDialog/SelectLabelerView.tsx:44 msgid "Send report to {0}" -msgstr "" +msgstr "Envoyer le rapport à {0}" #: src/view/com/modals/DeleteAccount.tsx:132 msgid "Sends email with confirmation code for account deletion" @@ -4175,48 +3904,14 @@ msgstr "Envoie un e-mail avec le code de confirmation pour la suppression du com msgid "Server address" msgstr "Adresse du serveur" -#: src/view/com/modals/ContentFilteringSettings.tsx:311 -#~ msgid "Set {value} for {labelGroup} content moderation policy" -#~ msgstr "Choisis {value} pour la politique de modération de contenu {labelGroup}" - -#: src/view/com/modals/ContentFilteringSettings.tsx:160 -#: src/view/com/modals/ContentFilteringSettings.tsx:179 -#~ msgctxt "action" -#~ msgid "Set Age" -#~ msgstr "Enregistrer l’âge" - #: src/screens/Moderation/index.tsx:304 msgid "Set birthdate" -msgstr "" - -#: src/view/screens/Settings/index.tsx:488 -#~ msgid "Set color theme to dark" -#~ msgstr "Change le thème de couleur en sombre" - -#: src/view/screens/Settings/index.tsx:481 -#~ msgid "Set color theme to light" -#~ msgstr "Change le thème de couleur en clair" - -#: src/view/screens/Settings/index.tsx:475 -#~ msgid "Set color theme to system setting" -#~ msgstr "Change le thème de couleur en fonction du paramètre système" - -#: src/view/screens/Settings/index.tsx:514 -#~ msgid "Set dark theme to the dark theme" -#~ msgstr "Choisir le thème le plus sombre comme thème sombre" - -#: src/view/screens/Settings/index.tsx:507 -#~ msgid "Set dark theme to the dim theme" -#~ msgstr "Choisir le thème atténué comme thème sombre" +msgstr "Entrez votre date de naissance" #: src/screens/Login/SetNewPasswordForm.tsx:102 msgid "Set new password" msgstr "Définir un nouveau mot de passe" -#: src/view/com/auth/create/Step1.tsx:202 -#~ msgid "Set password" -#~ msgstr "Définit le mot de passe" - #: src/view/screens/PreferencesFollowingFeed.tsx:225 msgid "Set this setting to \"No\" to hide all quote posts from your feed. Reposts will still be visible." msgstr "Choisissez « Non » pour cacher toutes les citations sur votre fils d’actu. Les reposts seront toujours visibles." @@ -4247,48 +3942,39 @@ msgstr "Définit le pseudo Bluesky" #: src/view/screens/Settings/index.tsx:458 msgid "Sets color theme to dark" -msgstr "" +msgstr "Change le thème de couleur en sombre" #: src/view/screens/Settings/index.tsx:451 msgid "Sets color theme to light" -msgstr "" +msgstr "Change le thème de couleur en clair" #: src/view/screens/Settings/index.tsx:445 msgid "Sets color theme to system setting" -msgstr "" +msgstr "Change le thème de couleur en fonction du paramètre système" #: src/view/screens/Settings/index.tsx:484 msgid "Sets dark theme to the dark theme" -msgstr "" +msgstr "Change le thème sombre comme étant le plus sombre" #: src/view/screens/Settings/index.tsx:477 msgid "Sets dark theme to the dim theme" -msgstr "" +msgstr "Change le thème sombre comme étant le thème atténué" #: src/screens/Login/ForgotPasswordForm.tsx:113 msgid "Sets email for password reset" msgstr "Définit l’e-mail pour la réinitialisation du mot de passe" -#: src/view/com/auth/login/ForgotPasswordForm.tsx:122 -#~ msgid "Sets hosting provider for password reset" -#~ msgstr "Définit l’hébergeur pour la réinitialisation du mot de passe" - #: src/view/com/modals/crop-image/CropImage.web.tsx:124 msgid "Sets image aspect ratio to square" -msgstr "" +msgstr "Définit le rapport d’aspect de l’image comme étant carré" #: src/view/com/modals/crop-image/CropImage.web.tsx:114 msgid "Sets image aspect ratio to tall" -msgstr "" +msgstr "Définit le rapport d’aspect de l’image comme portrait" #: src/view/com/modals/crop-image/CropImage.web.tsx:104 msgid "Sets image aspect ratio to wide" -msgstr "" - -#: src/view/com/auth/create/Step1.tsx:97 -#: src/view/com/auth/login/LoginForm.tsx:154 -#~ msgid "Sets server for the Bluesky client" -#~ msgstr "Définit le serveur pour le client Bluesky" +msgstr "Définit le rapport d’aspect de l’image comme paysage" #: src/Navigation.tsx:139 #: src/view/screens/Settings/index.tsx:316 @@ -4304,7 +3990,7 @@ msgstr "Activité sexuelle ou nudité érotique." #: src/lib/moderation/useGlobalLabelStrings.ts:38 msgid "Sexually Suggestive" -msgstr "" +msgstr "Sexuellement suggestif" #: src/view/com/lightbox/Lightbox.tsx:141 msgctxt "action" @@ -4324,7 +4010,7 @@ msgstr "Partager" #: src/view/com/util/forms/PostDropdownBtn.tsx:369 #: src/view/com/util/post-ctrls/PostCtrls.tsx:253 msgid "Share anyway" -msgstr "" +msgstr "Partager quand même" #: src/view/screens/ProfileFeed.tsx:373 #: src/view/screens/ProfileFeed.tsx:375 @@ -4334,11 +4020,11 @@ msgstr "Partager le fil d’actu" #: src/view/com/modals/LinkWarning.tsx:89 #: src/view/com/modals/LinkWarning.tsx:95 msgid "Share Link" -msgstr "" +msgstr "Partager le lien" #: src/view/com/modals/LinkWarning.tsx:92 msgid "Shares the linked website" -msgstr "" +msgstr "Partage le site web lié" #: src/components/moderation/ContentHider.tsx:115 #: src/components/moderation/LabelPreference.tsx:136 @@ -4360,15 +4046,11 @@ msgstr "Afficher quand même" #: src/lib/moderation/useLabelBehaviorDescription.ts:27 #: src/lib/moderation/useLabelBehaviorDescription.ts:63 msgid "Show badge" -msgstr "" +msgstr "Afficher le badge" #: src/lib/moderation/useLabelBehaviorDescription.ts:61 msgid "Show badge and filter from feeds" -msgstr "" - -#: src/view/com/modals/EmbedConsent.tsx:87 -#~ msgid "Show embeds from {0}" -#~ msgstr "Afficher les intégrations de {0}" +msgstr "Afficher les badges et filtrer des fils d’actu" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:200 msgid "Show follows similar to {0}" @@ -4439,15 +4121,11 @@ msgstr "Afficher les comptes" #: src/lib/moderation/useLabelBehaviorDescription.ts:58 msgid "Show warning" -msgstr "" +msgstr "Afficher l’avertissement" #: src/lib/moderation/useLabelBehaviorDescription.ts:56 msgid "Show warning and filter from feeds" -msgstr "" - -#: src/view/com/profile/ProfileHeader.tsx:462 -#~ msgid "Shows a list of users similar to this user." -#~ msgstr "Affiche une liste de comptes similaires à ce compte." +msgstr "Afficher l’avertissement et filtrer des fils d’actu" #: src/view/com/post-thread/PostThreadFollowBtn.tsx:130 msgid "Shows posts from {0} in your feed" @@ -4474,12 +4152,6 @@ msgstr "Affiche les posts de {0} dans votre fil d’actu" msgid "Sign in" msgstr "Connexion" -#: src/view/com/auth/HomeLoggedOutCTA.tsx:82 -#: src/view/com/auth/SplashScreen.tsx:86 -#: src/view/com/auth/SplashScreen.web.tsx:91 -#~ msgid "Sign In" -#~ msgstr "Connexion" - #: src/components/AccountList.tsx:109 msgid "Sign in as {0}" msgstr "Se connecter en tant que {0}" @@ -4490,15 +4162,11 @@ msgstr "Se connecter en tant que…" #: src/components/dialogs/Signin.tsx:75 msgid "Sign in or create your account to join the conversation!" -msgstr "" - -#: src/view/com/auth/login/LoginForm.tsx:140 -#~ msgid "Sign into" -#~ msgstr "Se connecter à" +msgstr "Connectez-vous ou créez votre compte pour participer à la conversation !" #: src/components/dialogs/Signin.tsx:46 msgid "Sign into Bluesky or create a new account" -msgstr "" +msgstr "Connectez-vous à Bluesky ou créez un nouveau compte" #: src/view/screens/Settings/index.tsx:118 #: src/view/screens/Settings/index.tsx:121 @@ -4534,10 +4202,6 @@ msgstr "Connecté en tant que" msgid "Signed in as @{0}" msgstr "Connecté en tant que @{0}" -#: src/view/com/modals/SwitchAccount.tsx:70 -#~ msgid "Signs {0} out of Bluesky" -#~ msgstr "Déconnecte {0} de Bluesky" - #: src/screens/Onboarding/StepInterests/index.tsx:239 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:203 #: src/view/com/auth/onboarding/WelcomeMobile.tsx:35 @@ -4556,11 +4220,7 @@ msgstr "Développement de logiciels" #: src/screens/Moderation/index.tsx:114 #: src/screens/Profile/Sections/Labels.tsx:87 msgid "Something went wrong, please try again." -msgstr "" - -#: src/components/Lists.tsx:203 -#~ msgid "Something went wrong!" -#~ msgstr "Quelque chose n’a pas marché !" +msgstr "Quelque chose n’a pas marché, veuillez réessayer." #: src/App.native.tsx:64 msgid "Sorry! Your session expired. Please log in again." @@ -4576,15 +4236,15 @@ msgstr "Trier les réponses au même post par :" #: src/components/moderation/LabelsOnMeDialog.tsx:146 msgid "Source:" -msgstr "" +msgstr "Source :" #: src/lib/moderation/useReportOptions.ts:65 msgid "Spam" -msgstr "" +msgstr "Spam" #: src/lib/moderation/useReportOptions.ts:53 msgid "Spam; excessive mentions or replies" -msgstr "" +msgstr "Spam ; mentions ou réponses excessives" #: src/screens/Onboarding/index.tsx:30 msgid "Sports" @@ -4600,11 +4260,7 @@ msgstr "État du service" #: src/screens/Signup/index.tsx:143 msgid "Step" -msgstr "" - -#: src/view/com/auth/create/StepHeader.tsx:22 -#~ msgid "Step {0} of {numSteps}" -#~ msgstr "Étape {0} sur {numSteps}" +msgstr "Étape" #: src/view/screens/Settings/index.tsx:295 msgid "Storage cleared, you need to restart the app now." @@ -4626,11 +4282,11 @@ msgstr "S’abonner" #: src/screens/Profile/Sections/Labels.tsx:191 msgid "Subscribe to @{0} to use these labels:" -msgstr "" +msgstr "Abonnez-vous à @{0} pour utiliser ces étiquettes :" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:227 msgid "Subscribe to Labeler" -msgstr "" +msgstr "S’abonner à l’étiqueteur" #: src/screens/Onboarding/StepAlgoFeeds/FeedCard.tsx:172 #: src/screens/Onboarding/StepAlgoFeeds/FeedCard.tsx:307 @@ -4639,7 +4295,7 @@ msgstr "S’abonner au fil d’actu {0}" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:191 msgid "Subscribe to this labeler" -msgstr "" +msgstr "S’abonner à cet étiqueteur" #: src/view/screens/ProfileList.tsx:588 msgid "Subscribe to this list" @@ -4720,7 +4376,7 @@ msgstr "Conditions d’utilisation" #: src/lib/moderation/useReportOptions.ts:79 #: src/lib/moderation/useReportOptions.ts:87 msgid "Terms used violate community standards" -msgstr "" +msgstr "Termes utilisés qui violent les normes de la communauté" #: src/components/dialogs/MutedWords.tsx:323 msgid "text" @@ -4732,11 +4388,11 @@ msgstr "Champ de saisie de texte" #: src/components/ReportDialog/SubmitView.tsx:76 msgid "Thank you. Your report has been sent." -msgstr "" +msgstr "Nous vous remercions. Votre rapport a été envoyé." #: src/view/com/modals/ChangeHandle.tsx:465 msgid "That contains the following:" -msgstr "" +msgstr "Qui contient les éléments suivants :" #: src/screens/Signup/index.tsx:85 msgid "That handle is already taken." @@ -4749,7 +4405,7 @@ msgstr "Ce compte pourra interagir avec vous après le déblocage." #: src/components/moderation/ModerationDetailsDialog.tsx:127 msgid "the author" -msgstr "" +msgstr "l’auteur" #: src/view/screens/CommunityGuidelines.tsx:36 msgid "The Community Guidelines have been moved to <0/>" @@ -4761,11 +4417,11 @@ msgstr "Notre politique de droits d’auteur a été déplacée vers <0/>" #: src/components/moderation/LabelsOnMeDialog.tsx:48 msgid "The following labels were applied to your account." -msgstr "" +msgstr "Les étiquettes suivantes ont été appliquées à votre compte." #: src/components/moderation/LabelsOnMeDialog.tsx:49 msgid "The following labels were applied to your content." -msgstr "" +msgstr "Les étiquettes suivantes ont été appliquées à votre contenu." #: src/screens/Onboarding/Layout.tsx:58 msgid "The following steps will help customize your Bluesky experience." @@ -4839,7 +4495,7 @@ msgstr "Il y a eu un problème lors de la récupération de vos listes. Appuyez #: src/components/ReportDialog/SubmitView.tsx:81 msgid "There was an issue sending your report. Please check your internet connection." -msgstr "" +msgstr "Il y a eu un problème lors de l’envoi de votre rapport. Veuillez vérifier votre connexion internet." #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:65 msgid "There was an issue syncing your preferences with the server" @@ -4892,15 +4548,15 @@ msgstr "Ce compte a demandé aux personnes de se connecter pour voir son profil. #: src/components/moderation/LabelsOnMeDialog.tsx:204 msgid "This appeal will be sent to <0>{0}." -msgstr "" +msgstr "Cet appel sera envoyé à <0>{0}." #: src/lib/moderation/useGlobalLabelStrings.ts:19 msgid "This content has been hidden by the moderators." -msgstr "" +msgstr "Ce contenu a été masqué par la modération." #: src/lib/moderation/useGlobalLabelStrings.ts:24 msgid "This content has received a general warning from moderators." -msgstr "" +msgstr "Ce contenu a reçu un avertissement général de la part de la modération." #: src/components/dialogs/EmbedConsent.tsx:64 msgid "This content is hosted by {0}. Do you want to enable external media?" @@ -4915,13 +4571,9 @@ msgstr "Ce contenu n’est pas disponible car l’un des comptes impliqués a bl msgid "This content is not viewable without a Bluesky account." msgstr "Ce contenu n’est pas visible sans un compte Bluesky." -#: src/view/screens/Settings/ExportCarDialog.tsx:75 -#~ msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." -#~ msgstr "Cette fonctionnalité est en version bêta. Vous pouvez en savoir plus sur les exportations de dépôts dans <0>ce blogpost." - #: src/view/screens/Settings/ExportCarDialog.tsx:75 msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost." -msgstr "" +msgstr "Cette fonctionnalité est en version bêta. Vous pouvez en savoir plus sur les exportations de dépôts dans <0>ce blogpost." #: src/view/com/posts/FeedErrorMessage.tsx:114 msgid "This feed is currently receiving high traffic and is temporarily unavailable. Please try again later." @@ -4947,11 +4599,11 @@ msgstr "Ceci est important au cas où vous auriez besoin de changer d’e-mail o #: src/components/moderation/ModerationDetailsDialog.tsx:124 msgid "This label was applied by {0}." -msgstr "" +msgstr "Cette étiquette a été apposée par {0}." #: src/screens/Profile/Sections/Labels.tsx:178 msgid "This labeler hasn't declared what labels it publishes, and may not be active." -msgstr "" +msgstr "Cet étiqueteur n’a pas déclaré les étiquettes qu’il publie et peut ne pas être actif." #: src/view/com/modals/LinkWarning.tsx:72 msgid "This link is taking you to the following website:" @@ -4963,7 +4615,7 @@ msgstr "Cette liste est vide !" #: src/screens/Profile/ErrorState.tsx:40 msgid "This moderation service is unavailable. See below for more details. If this issue persists, contact us." -msgstr "" +msgstr "Ce service de modération n’est pas disponible. Voir ci-dessous pour plus de détails. Si le problème persiste, contactez-nous." #: src/view/com/modals/AddAppPasswords.tsx:107 msgid "This name is already in use" @@ -4976,27 +4628,27 @@ msgstr "Ce post a été supprimé." #: src/view/com/util/forms/PostDropdownBtn.tsx:366 #: src/view/com/util/post-ctrls/PostCtrls.tsx:250 msgid "This post is only visible to logged-in users. It won't be visible to people who aren't logged in." -msgstr "" +msgstr "Ce post n’est visible que pour les personnes connectées. Il ne sera pas visible pour les personnes qui ne sont pas connectées." #: src/view/com/util/forms/PostDropdownBtn.tsx:348 msgid "This post will be hidden from feeds." -msgstr "" +msgstr "Ce post sera masqué des fils d’actu." #: src/view/com/profile/ProfileMenu.tsx:370 msgid "This profile is only visible to logged-in users. It won't be visible to people who aren't logged in." -msgstr "" +msgstr "Ce profil n’est visible que pour les personnes connectées. Il ne sera pas visible pour les personnes qui ne sont pas connectées." #: src/screens/Signup/StepInfo/Policies.tsx:37 msgid "This service has not provided terms of service or a privacy policy." -msgstr "" +msgstr "Ce service n’a pas fourni de conditions d’utilisation ni de politique de confidentialité." #: src/view/com/modals/ChangeHandle.tsx:445 msgid "This should create a domain record at:" -msgstr "" +msgstr "Cela devrait créer un enregistrement de domaine à :" #: src/view/com/profile/ProfileFollowers.tsx:87 msgid "This user doesn't have any followers." -msgstr "" +msgstr "Ce compte n’a pas d’abonné·e·s." #: src/components/moderation/ModerationDetailsDialog.tsx:72 #: src/lib/moderation/useModerationCauseDescription.ts:68 @@ -5005,27 +4657,19 @@ msgstr "Ce compte vous a bloqué. Vous ne pouvez pas voir son contenu." #: src/lib/moderation/useGlobalLabelStrings.ts:30 msgid "This user has requested that their content only be shown to signed-in users." -msgstr "" - -#: src/view/com/modals/ModerationDetails.tsx:42 -#~ msgid "This user is included in the <0/> list which you have blocked." -#~ msgstr "Ce compte est inclus dans la liste <0/> que vous avez bloquée." - -#: src/view/com/modals/ModerationDetails.tsx:74 -#~ msgid "This user is included in the <0/> list which you have muted." -#~ msgstr "Ce compte est inclus dans la liste <0/> que vous avez masquée." +msgstr "Cette personne a demandé que son contenu ne soit affiché qu’aux personnes connectées." #: src/components/moderation/ModerationDetailsDialog.tsx:55 msgid "This user is included in the <0>{0} list which you have blocked." -msgstr "" +msgstr "Ce compte est inclus dans la liste <0>{0} que vous avez bloquée." #: src/components/moderation/ModerationDetailsDialog.tsx:84 msgid "This user is included in the <0>{0} list which you have muted." -msgstr "" +msgstr "Ce compte est inclus dans la liste <0>{0} que vous avez masquée." #: src/view/com/profile/ProfileFollows.tsx:87 msgid "This user isn't following anyone." -msgstr "" +msgstr "Ce compte ne suit personne." #: src/view/com/modals/SelfLabel.tsx:137 msgid "This warning is only available for posts with media attached." @@ -5035,13 +4679,9 @@ msgstr "Cet avertissement n’est disponible que pour les posts contenant des m msgid "This will delete {0} from your muted words. You can always add it back later." msgstr "Cela supprimera {0} de vos mots masqués. Vous pourrez toujours le réintégrer plus tard." -#: src/view/com/util/forms/PostDropdownBtn.tsx:282 -#~ msgid "This will hide this post from your feeds." -#~ msgstr "Cela va masquer ce post de vos fils d’actu." - #: src/view/screens/Settings/index.tsx:525 msgid "Thread preferences" -msgstr "" +msgstr "Préférences des fils de discussion" #: src/view/screens/PreferencesThreads.tsx:53 #: src/view/screens/Settings/index.tsx:535 @@ -5054,11 +4694,11 @@ msgstr "Mode arborescent" #: src/Navigation.tsx:269 msgid "Threads Preferences" -msgstr "Préférences de fils de discussion" +msgstr "Préférences des fils de discussion" #: src/components/ReportDialog/SelectLabelerView.tsx:33 msgid "To whom would you like to send this report?" -msgstr "" +msgstr "À qui souhaitez-vous envoyer ce rapport ?" #: src/components/dialogs/MutedWords.tsx:112 msgid "Toggle between muted word options." @@ -5070,11 +4710,11 @@ msgstr "Activer le menu déroulant" #: src/screens/Moderation/index.tsx:332 msgid "Toggle to enable or disable adult content" -msgstr "" +msgstr "Activer ou désactiver le contenu pour adultes" #: src/view/screens/Search/Search.tsx:427 msgid "Top" -msgstr "" +msgstr "Meilleur" #: src/view/com/modals/EditImage.tsx:272 msgid "Transformations" @@ -5094,7 +4734,7 @@ msgstr "Réessayer" #: src/view/com/modals/ChangeHandle.tsx:428 msgid "Type:" -msgstr "" +msgstr "Type :" #: src/view/screens/ProfileList.tsx:480 msgid "Un-block list" @@ -5133,7 +4773,7 @@ msgstr "Débloquer le compte" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:280 #: src/view/com/profile/ProfileMenu.tsx:343 msgid "Unblock Account?" -msgstr "" +msgstr "Débloquer le compte ?" #: src/view/com/modals/Repost.tsx:43 #: src/view/com/modals/Repost.tsx:56 @@ -5145,7 +4785,7 @@ msgstr "Annuler le repost" #: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:141 #: src/view/com/profile/ProfileHeaderSuggestedFollows.tsx:248 msgid "Unfollow" -msgstr "" +msgstr "Se désabonner" #: src/view/com/profile/FollowButton.tsx:60 msgctxt "action" @@ -5159,11 +4799,7 @@ msgstr "Se désabonner de {0}" #: src/view/com/profile/ProfileMenu.tsx:241 #: src/view/com/profile/ProfileMenu.tsx:251 msgid "Unfollow Account" -msgstr "" - -#: src/view/com/auth/create/state.ts:262 -#~ msgid "Unfortunately, you do not meet the requirements to create an account." -#~ msgstr "Malheureusement, vous ne remplissez pas les conditions requises pour créer un compte." +msgstr "Se désabonner du compte" #: src/view/com/util/post-ctrls/PostCtrls.tsx:197 msgid "Unlike" @@ -5171,7 +4807,7 @@ msgstr "Déliker" #: src/view/screens/ProfileFeed.tsx:585 msgid "Unlike this feed" -msgstr "" +msgstr "Déliker ce fil d’actu" #: src/components/TagMenu/index.tsx:249 #: src/view/screens/ProfileList.tsx:581 @@ -5203,39 +4839,31 @@ msgstr "Désépingler" #: src/view/screens/ProfileFeed.tsx:303 msgid "Unpin from home" -msgstr "" +msgstr "Désépingler de l’accueil" #: src/view/screens/ProfileList.tsx:446 msgid "Unpin moderation list" msgstr "Supprimer la liste de modération" -#: src/view/screens/ProfileFeed.tsx:346 -#~ msgid "Unsave" -#~ msgstr "Supprimer" - #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:225 msgid "Unsubscribe" -msgstr "" +msgstr "Se désabonner" #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:190 msgid "Unsubscribe from this labeler" -msgstr "" +msgstr "Se désabonner de cet étiqueteur" #: src/lib/moderation/useReportOptions.ts:70 msgid "Unwanted Sexual Content" -msgstr "" +msgstr "Contenu sexuel non désiré" #: src/view/com/modals/UserAddRemoveLists.tsx:70 msgid "Update {displayName} in Lists" msgstr "Mise à jour de {displayName} dans les listes" -#: src/lib/hooks/useOTAUpdate.ts:15 -#~ msgid "Update Available" -#~ msgstr "Mise à jour disponible" - #: src/view/com/modals/ChangeHandle.tsx:508 msgid "Update to {handle}" -msgstr "" +msgstr "Mettre à jour pour {handle}" #: src/screens/Login/SetNewPasswordForm.tsx:186 msgid "Updating..." @@ -5250,23 +4878,23 @@ msgstr "Envoyer un fichier texte vers :" #: src/view/com/util/UserBanner.tsx:116 #: src/view/com/util/UserBanner.tsx:119 msgid "Upload from Camera" -msgstr "" +msgstr "Envoyer à partir de l’appareil photo" #: src/view/com/util/UserAvatar.tsx:345 #: src/view/com/util/UserBanner.tsx:133 msgid "Upload from Files" -msgstr "" +msgstr "Envoyer à partir de fichiers" #: src/view/com/util/UserAvatar.tsx:339 #: src/view/com/util/UserAvatar.tsx:343 #: src/view/com/util/UserBanner.tsx:127 #: src/view/com/util/UserBanner.tsx:131 msgid "Upload from Library" -msgstr "" +msgstr "Envoyer à partir de la photothèque" #: src/view/com/modals/ChangeHandle.tsx:408 msgid "Use a file on your server" -msgstr "" +msgstr "Utiliser un fichier sur votre serveur" #: src/view/screens/AppPasswords.tsx:197 msgid "Use app passwords to login to other Bluesky clients without giving full access to your account or password." @@ -5274,7 +4902,7 @@ msgstr "Utilisez les mots de passe de l’appli pour se connecter à d’autres #: src/view/com/modals/ChangeHandle.tsx:517 msgid "Use bsky.social as hosting provider" -msgstr "" +msgstr "Utiliser bsky.social comme hébergeur" #: src/view/com/modals/ChangeHandle.tsx:516 msgid "Use default provider" @@ -5292,7 +4920,7 @@ msgstr "Utiliser mon navigateur par défaut" #: src/view/com/modals/ChangeHandle.tsx:400 msgid "Use the DNS panel" -msgstr "" +msgstr "Utiliser le panneau DNS" #: src/view/com/modals/AddAppPasswords.tsx:156 msgid "Use this to sign into the other app along with your handle." @@ -5309,7 +4937,7 @@ msgstr "Compte bloqué" #: src/lib/moderation/useModerationCauseDescription.ts:48 msgid "User Blocked by \"{0}\"" -msgstr "" +msgstr "Compte bloqué par « {0} »" #: src/components/moderation/ModerationDetailsDialog.tsx:53 msgid "User Blocked by List" @@ -5317,16 +4945,12 @@ msgstr "Compte bloqué par liste" #: src/lib/moderation/useModerationCauseDescription.ts:66 msgid "User Blocking You" -msgstr "" +msgstr "Compte qui vous bloque" #: src/components/moderation/ModerationDetailsDialog.tsx:70 msgid "User Blocks You" msgstr "Compte qui vous bloque" -#: src/view/com/auth/create/Step2.tsx:79 -#~ msgid "User handle" -#~ msgstr "Pseudo" - #: src/view/com/lists/ListCard.tsx:85 #: src/view/com/modals/UserAddRemoveLists.tsx:198 msgid "User list by {0}" @@ -5374,15 +4998,15 @@ msgstr "Comptes dans « {0} »" #: src/components/LikesDialog.tsx:85 msgid "Users that have liked this content or profile" -msgstr "" +msgstr "Comptes qui ont liké ce contenu ou ce profil" #: src/view/com/modals/ChangeHandle.tsx:436 msgid "Value:" -msgstr "" +msgstr "Valeur :" #: src/view/com/modals/ChangeHandle.tsx:509 msgid "Verify {0}" -msgstr "" +msgstr "Vérifier {0}" #: src/view/screens/Settings/index.tsx:906 msgid "Verify email" @@ -5407,7 +5031,7 @@ msgstr "Vérifiez votre e-mail" #: src/view/screens/Settings/index.tsx:857 msgid "Version {0}" -msgstr "" +msgstr "Version {0}" #: src/screens/Onboarding/index.tsx:42 msgid "Video Games" @@ -5423,11 +5047,11 @@ msgstr "Afficher l’entrée de débogage" #: src/components/ReportDialog/SelectReportOptionView.tsx:132 msgid "View details" -msgstr "" +msgstr "Voir les détails" #: src/components/ReportDialog/SelectReportOptionView.tsx:127 msgid "View details for reporting a copyright violation" -msgstr "" +msgstr "Voir les détails pour signaler une violation du droit d’auteur" #: src/view/com/posts/FeedSlice.tsx:99 msgid "View full thread" @@ -5435,7 +5059,7 @@ msgstr "Voir le fil de discussion entier" #: src/components/moderation/LabelsOnMe.tsx:51 msgid "View information about these labels" -msgstr "" +msgstr "Voir les informations sur ces étiquettes" #: src/components/ProfileHoverCard/index.web.tsx:264 #: src/components/ProfileHoverCard/index.web.tsx:293 @@ -5449,11 +5073,11 @@ msgstr "Afficher l’avatar" #: src/components/LabelingServiceCard/index.tsx:140 msgid "View the labeling service provided by @{0}" -msgstr "" +msgstr "Voir le service d’étiquetage fourni par @{0}" #: src/view/screens/ProfileFeed.tsx:597 msgid "View users who like this feed" -msgstr "" +msgstr "Voir les comptes qui a liké ce fil d’actu" #: src/view/com/modals/LinkWarning.tsx:89 #: src/view/com/modals/LinkWarning.tsx:95 @@ -5469,15 +5093,11 @@ msgstr "Avertir" #: src/lib/moderation/useLabelBehaviorDescription.ts:48 msgid "Warn content" -msgstr "" +msgstr "Avertir du contenu" #: src/lib/moderation/useLabelBehaviorDescription.ts:46 msgid "Warn content and filter from feeds" -msgstr "" - -#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:134 -#~ msgid "We also think you'll like \"For You\" by Skygaze:" -#~ msgstr "Nous pensons également que vous aimerez « For You » de Skygaze :" +msgstr "Avertir du contenu et filtrer des fils d’actu" #: src/screens/Hashtag.tsx:133 msgid "We couldn't find any results for that hashtag." @@ -5505,11 +5125,11 @@ msgstr "Nous vous recommandons notre fil d’actu « Discover » :" #: src/components/dialogs/BirthDateSettings.tsx:52 msgid "We were unable to load your birth date preferences. Please try again." -msgstr "" +msgstr "Nous n’avons pas pu charger vos préférences en matière de date de naissance. Veuillez réessayer." #: src/screens/Moderation/index.tsx:385 msgid "We were unable to load your configured labelers at this time." -msgstr "" +msgstr "Nous n’avons pas pu charger vos étiqueteurs configurés pour le moment." #: src/screens/Onboarding/StepInterests/index.tsx:137 msgid "We weren't able to connect. Please try again to continue setting up your account. If it continues to fail, you can skip this flow." @@ -5519,10 +5139,6 @@ msgstr "Nous n’avons pas pu nous connecter. Veuillez réessayer pour continuer msgid "We will let you know when your account is ready." msgstr "Nous vous informerons lorsque votre compte sera prêt." -#: src/view/com/modals/AppealLabel.tsx:48 -#~ msgid "We'll look into your appeal promptly." -#~ msgstr "Nous examinerons votre appel rapidement." - #: src/screens/Onboarding/StepInterests/index.tsx:142 msgid "We'll use this to help customize your experience." msgstr "Nous utiliserons ces informations pour personnaliser votre expérience." @@ -5550,7 +5166,7 @@ msgstr "Nous sommes désolés ! La page que vous recherchez est introuvable." #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:327 msgid "We're sorry! You can only subscribe to ten labelers, and you've reached your limit of ten." -msgstr "" +msgstr "Nous sommes désolés ! Vous ne pouvez vous abonner qu’à dix étiqueteurs, et vous avez atteint votre limite de dix." #: src/view/com/auth/onboarding/WelcomeMobile.tsx:48 msgid "Welcome to <0>Bluesky" @@ -5560,10 +5176,6 @@ msgstr "Bienvenue sur <0>Bluesky" msgid "What are your interests?" msgstr "Quels sont vos centres d’intérêt ?" -#: src/view/com/modals/report/Modal.tsx:169 -#~ msgid "What is the issue with this {collectionName}?" -#~ msgstr "Quel est le problème avec cette {collectionName} ?" - #: src/view/com/auth/SplashScreen.tsx:40 #: src/view/com/auth/SplashScreen.web.tsx:81 #: src/view/com/composer/Composer.tsx:296 @@ -5585,23 +5197,23 @@ msgstr "Qui peut répondre ?" #: src/components/ReportDialog/SelectReportOptionView.tsx:43 msgid "Why should this content be reviewed?" -msgstr "" +msgstr "Pourquoi ce contenu doit-il être examiné ?" #: src/components/ReportDialog/SelectReportOptionView.tsx:56 msgid "Why should this feed be reviewed?" -msgstr "" +msgstr "Pourquoi ce fil d’actu doit-il être examiné ?" #: src/components/ReportDialog/SelectReportOptionView.tsx:53 msgid "Why should this list be reviewed?" -msgstr "" +msgstr "Pourquoi cette liste devrait-elle être examinée ?" #: src/components/ReportDialog/SelectReportOptionView.tsx:50 msgid "Why should this post be reviewed?" -msgstr "" +msgstr "Pourquoi ce post devrait-il être examiné ?" #: src/components/ReportDialog/SelectReportOptionView.tsx:47 msgid "Why should this user be reviewed?" -msgstr "" +msgstr "Pourquoi ce compte doit-il être examiné ?" #: src/view/com/modals/crop-image/CropImage.web.tsx:103 msgid "Wide" @@ -5636,7 +5248,7 @@ msgstr "Vous êtes dans la file d’attente." #: src/view/com/profile/ProfileFollows.tsx:86 msgid "You are not following anyone." -msgstr "" +msgstr "Vous ne suivez personne." #: src/view/com/posts/FollowingEmptyState.tsx:67 #: src/view/com/posts/FollowingEndOfFeed.tsx:68 @@ -5654,7 +5266,7 @@ msgstr "Vous pouvez maintenant vous connecter avec votre nouveau mot de passe." #: src/view/com/profile/ProfileFollowers.tsx:86 msgid "You do not have any followers." -msgstr "" +msgstr "Vous n’avez pas d’abonné·e·s." #: src/view/com/modals/InviteCodes.tsx:67 msgid "You don't have any invite codes yet! We'll send you some when you've been on Bluesky for a little longer." @@ -5691,24 +5303,20 @@ msgstr "Vous avez introduit un code non valide. Il devrait ressembler à XXXXX-X #: src/lib/moderation/useModerationCauseDescription.ts:109 msgid "You have hidden this post" -msgstr "" +msgstr "Vous avez caché ce post" #: src/components/moderation/ModerationDetailsDialog.tsx:101 msgid "You have hidden this post." -msgstr "" +msgstr "Vous avez caché ce post." #: src/components/moderation/ModerationDetailsDialog.tsx:94 #: src/lib/moderation/useModerationCauseDescription.ts:92 msgid "You have muted this account." -msgstr "" +msgstr "Vous avez masqué ce compte." #: src/lib/moderation/useModerationCauseDescription.ts:86 msgid "You have muted this user" -msgstr "" - -#: src/view/com/modals/ModerationDetails.tsx:87 -#~ msgid "You have muted this user." -#~ msgstr "Vous avez masqué ce compte." +msgstr "Vous avez masqué ce compte" #: src/view/com/feeds/ProfileFeedgens.tsx:144 msgid "You have no feeds." @@ -5721,11 +5329,7 @@ msgstr "Vous n’avez aucune liste." #: src/view/screens/ModerationBlockedAccounts.tsx:138 msgid "You have not blocked any accounts yet. To block an account, go to their profile and select \"Block account\" from the menu on their account." -msgstr "" - -#: src/view/screens/ModerationBlockedAccounts.tsx:132 -#~ msgid "You have not blocked any accounts yet. To block an account, go to their profile and selected \"Block account\" from the menu on their account." -#~ msgstr "Vous n’avez pas encore bloqué de comptes. Pour bloquer un compte, accédez à son profil et sélectionnez « Bloquer le compte » dans le menu de son compte." +msgstr "Vous n’avez pas encore bloqué de comptes. Pour bloquer un compte, allez sur son profil et sélectionnez « Bloquer le compte » dans le menu de son compte." #: src/view/screens/AppPasswords.tsx:89 msgid "You have not created any app passwords yet. You can create one by pressing the button below." @@ -5733,11 +5337,7 @@ msgstr "Vous n’avez encore créé aucun mot de passe pour l’appli. Vous pouv #: src/view/screens/ModerationMutedAccounts.tsx:136 msgid "You have not muted any accounts yet. To mute an account, go to their profile and select \"Mute account\" from the menu on their account." -msgstr "" - -#: src/view/screens/ModerationMutedAccounts.tsx:131 -#~ msgid "You have not muted any accounts yet. To mute an account, go to their profile and selected \"Mute account\" from the menu on their account." -#~ msgstr "Vous n’avez encore masqué aucun compte. Pour désactiver un compte, allez sur son profil et sélectionnez « Masquer le compte » dans le menu de son compte." +msgstr "Vous n’avez encore masqué aucun compte. Pour masquer un compte, allez sur son profil et sélectionnez « Masquer le compte » dans le menu de son compte." #: src/components/dialogs/MutedWords.tsx:249 msgid "You haven't muted any words or tags yet" @@ -5745,15 +5345,11 @@ msgstr "Vous n’avez pas encore masqué de mot ou de mot-clé" #: src/components/moderation/LabelsOnMeDialog.tsx:68 msgid "You may appeal these labels if you feel they were placed in error." -msgstr "" +msgstr "Vous pouvez faire appel de ces étiquettes si vous estimez qu’elles ont été apposées par erreur." #: src/screens/Signup/StepInfo/Policies.tsx:79 msgid "You must be 13 years of age or older to sign up." -msgstr "" - -#: src/view/com/modals/ContentFilteringSettings.tsx:175 -#~ msgid "You must be 18 or older to enable adult content." -#~ msgstr "Vous devez avoir 18 ans ou plus pour activer le contenu pour adultes." +msgstr "Vous devez avoir 13 ans ou plus pour vous inscrire." #: src/screens/Onboarding/StepModeration/AdultContentEnabledPref.tsx:110 msgid "You must be 18 years or older to enable adult content" @@ -5761,7 +5357,7 @@ msgstr "Vous devez avoir 18 ans ou plus pour activer le contenu pour adultes." #: src/components/ReportDialog/SubmitView.tsx:203 msgid "You must select at least one labeler for a report" -msgstr "" +msgstr "Vous devez sélectionner au moins un étiqueteur pour un rapport" #: src/view/com/util/forms/PostDropdownBtn.tsx:150 msgid "You will no longer receive notifications for this thread" @@ -5792,7 +5388,7 @@ msgstr "Vous êtes prêt à partir !" #: src/components/moderation/ModerationDetailsDialog.tsx:98 #: src/lib/moderation/useModerationCauseDescription.ts:101 msgid "You've chosen to hide a word or tag within this post." -msgstr "" +msgstr "Vous avez choisi de masquer un mot ou un mot-clé dans ce post." #: src/view/com/posts/FollowingEndOfFeed.tsx:48 msgid "You've reached the end of your feed! Find some more accounts to follow." From f49d73dd00462528bd2ff73fd51746756c12fe9d Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 22 Apr 2024 22:18:39 +0100 Subject: [PATCH 140/185] [GIFs] Reset scroll on query change (#3642) * scroll list to top on query change * dismiss keyboard on swipe list * don't need an effect --- src/components/Dialog/index.web.tsx | 12 ++++++------ src/components/dialogs/GifSelect.tsx | 17 ++++++++++++----- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/components/Dialog/index.web.tsx b/src/components/Dialog/index.web.tsx index a086955db6..4cb4e7570c 100644 --- a/src/components/Dialog/index.web.tsx +++ b/src/components/Dialog/index.web.tsx @@ -197,11 +197,10 @@ export function Inner({ export const ScrollableInner = Inner -export function InnerFlatList({ - label, - style, - ...props -}: FlatListProps & {label: string}) { +export const InnerFlatList = React.forwardRef< + FlatList, + FlatListProps & {label: string} +>(function InnerFlatList({label, style, ...props}, ref) { const {gtMobile} = useBreakpoints() return ( ) -} +}) export function Handle() { return null diff --git a/src/components/dialogs/GifSelect.tsx b/src/components/dialogs/GifSelect.tsx index ad4fbeadea..a8fe016d10 100644 --- a/src/components/dialogs/GifSelect.tsx +++ b/src/components/dialogs/GifSelect.tsx @@ -1,6 +1,7 @@ import React, {useCallback, useMemo, useRef, useState} from 'react' -import {TextInput, View} from 'react-native' +import {Keyboard, TextInput, View} from 'react-native' import {Image} from 'expo-image' +import {BottomSheetFlatListMethods} from '@discord/bottom-sheet' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' @@ -82,7 +83,8 @@ function GifList({ const {_} = useLingui() const t = useTheme() const {gtMobile} = useBreakpoints() - const ref = useRef(null) + const textInputRef = useRef(null) + const listRef = useRef(null) const [undeferredSearch, setSearch] = useState('') const search = useThrottledValue(undeferredSearch, 500) @@ -133,7 +135,7 @@ function GifList({ const onGoBack = useCallback(() => { if (isSearching) { // clear the input and reset the state - ref.current?.clear() + textInputRef.current?.clear() setSearch('') } else { control.close() @@ -180,10 +182,13 @@ function GifList({ { + setSearch(text) + listRef.current?.scrollToOffset({offset: 0, animated: false}) + }} returnKeyType="search" clearButtonMode="while-editing" - inputRef={ref} + inputRef={textInputRef} maxLength={50} onKeyPress={({nativeEvent}) => { if (nativeEvent.key === 'Escape') { @@ -200,6 +205,7 @@ function GifList({ <> {gtMobile && } item.id} // @ts-expect-error web only style={isWeb && {minHeight: '100vh'}} + onScrollBeginDrag={() => Keyboard.dismiss()} ListFooterComponent={ hasData ? ( Date: Mon, 22 Apr 2024 14:46:05 -0700 Subject: [PATCH 141/185] properly close the switch account dialog (#3558) * properly close the switch account dialog * use it for switch account as well * ensure dialog is closed on unmount Revert "properly check if the ref is null" This reverts commit 8f563808a5d39389b0bc47a31e73cd147d1e7e8b. properly check if the ref is null ensure dialog is closed on unmount * Revert "ensure dialog is closed on unmount" This reverts commit a48548fd8ed53ae3eb08a0e05bb89f641c112b95. --- src/components/dialogs/SwitchAccount.tsx | 17 +++++++++-------- src/lib/hooks/useAccountSwitcher.ts | 18 ++++-------------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/components/dialogs/SwitchAccount.tsx b/src/components/dialogs/SwitchAccount.tsx index 645113d4af..55628a790d 100644 --- a/src/components/dialogs/SwitchAccount.tsx +++ b/src/components/dialogs/SwitchAccount.tsx @@ -6,7 +6,6 @@ import {useLingui} from '@lingui/react' import {useAccountSwitcher} from '#/lib/hooks/useAccountSwitcher' import {type SessionAccount, useSession} from '#/state/session' import {useLoggedOutViewControls} from '#/state/shell/logged-out' -import {useCloseAllActiveElements} from '#/state/util' import {atoms as a} from '#/alf' import * as Dialog from '#/components/Dialog' import {AccountList} from '../AccountList' @@ -21,23 +20,25 @@ export function SwitchAccountDialog({ const {currentAccount} = useSession() const {onPressSwitchAccount} = useAccountSwitcher() const {setShowLoggedOut} = useLoggedOutViewControls() - const closeAllActiveElements = useCloseAllActiveElements() const onSelectAccount = useCallback( (account: SessionAccount) => { - if (account.did === currentAccount?.did) { - control.close() + if (account.did !== currentAccount?.did) { + control.close(() => { + onPressSwitchAccount(account, 'SwitchAccount') + }) } else { - onPressSwitchAccount(account, 'SwitchAccount') + control.close() } }, [currentAccount, control, onPressSwitchAccount], ) const onPressAddAccount = useCallback(() => { - setShowLoggedOut(true) - closeAllActiveElements() - }, [setShowLoggedOut, closeAllActiveElements]) + control.close(() => { + setShowLoggedOut(true) + }) + }, [setShowLoggedOut, control]) return ( diff --git a/src/lib/hooks/useAccountSwitcher.ts b/src/lib/hooks/useAccountSwitcher.ts index eb1685a0ae..6a1cea2345 100644 --- a/src/lib/hooks/useAccountSwitcher.ts +++ b/src/lib/hooks/useAccountSwitcher.ts @@ -1,17 +1,15 @@ import {useCallback} from 'react' -import {isWeb} from '#/platform/detection' import {useAnalytics} from '#/lib/analytics/analytics' -import {useSessionApi, SessionAccount} from '#/state/session' -import * as Toast from '#/view/com/util/Toast' -import {useCloseAllActiveElements} from '#/state/util' +import {isWeb} from '#/platform/detection' +import {SessionAccount, useSessionApi} from '#/state/session' import {useLoggedOutViewControls} from '#/state/shell/logged-out' +import * as Toast from '#/view/com/util/Toast' import {LogEvents} from '../statsig/statsig' export function useAccountSwitcher() { const {track} = useAnalytics() const {selectAccount, clearCurrentAccount} = useSessionApi() - const closeAllActiveElements = useCloseAllActiveElements() const {requestSwitchToAccount} = useLoggedOutViewControls() const onPressSwitchAccount = useCallback( @@ -23,7 +21,6 @@ export function useAccountSwitcher() { try { if (account.accessJwt) { - closeAllActiveElements() if (isWeb) { // We're switching accounts, which remounts the entire app. // On mobile, this gets us Home, but on the web we also need reset the URL. @@ -37,7 +34,6 @@ export function useAccountSwitcher() { Toast.show(`Signed in as @${account.handle}`) }, 100) } else { - closeAllActiveElements() requestSwitchToAccount({requestedAccount: account.did}) Toast.show( `Please sign in as @${account.handle}`, @@ -49,13 +45,7 @@ export function useAccountSwitcher() { clearCurrentAccount() // back user out to login } }, - [ - track, - clearCurrentAccount, - selectAccount, - closeAllActiveElements, - requestSwitchToAccount, - ], + [track, clearCurrentAccount, selectAccount, requestSwitchToAccount], ) return {onPressSwitchAccount} From 76449fb6ef9b3eb327b6d059614d0da31c9d8e1f Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 22 Apr 2024 23:39:32 +0100 Subject: [PATCH 142/185] [GIFs] Replace GIPHY with Tenor (#3651) * replace GIPHY with Tenor * remove "directly" wording * replace GIPHY wording * remove log --- src/components/dialogs/GifSelect.tsx | 65 ++-- src/lib/constants.ts | 14 +- src/state/queries/giphy.ts | 280 ------------------ src/state/queries/tenor.ts | 177 +++++++++++ src/view/com/composer/Composer.tsx | 17 +- src/view/com/composer/photos/SelectGifBtn.tsx | 2 +- 6 files changed, 220 insertions(+), 335 deletions(-) delete mode 100644 src/state/queries/giphy.ts create mode 100644 src/state/queries/tenor.ts diff --git a/src/components/dialogs/GifSelect.tsx b/src/components/dialogs/GifSelect.tsx index a8fe016d10..41612aa5d9 100644 --- a/src/components/dialogs/GifSelect.tsx +++ b/src/components/dialogs/GifSelect.tsx @@ -5,7 +5,6 @@ import {BottomSheetFlatListMethods} from '@discord/bottom-sheet' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {GIPHY_PRIVACY_POLICY} from '#/lib/constants' import {logEvent} from '#/lib/statsig/statsig' import {cleanError} from '#/lib/strings/errors' import {isWeb} from '#/platform/detection' @@ -13,7 +12,11 @@ import { useExternalEmbedsPrefs, useSetExternalEmbedPref, } from '#/state/preferences' -import {Gif, useGifphySearch, useGiphyTrending} from '#/state/queries/giphy' +import { + Gif, + useFeaturedGifsQuery, + useGifSearchQuery, +} from '#/state/queries/tenor' import {ErrorScreen} from '#/view/com/util/error/ErrorScreen' import {ErrorBoundary} from '#/view/com/util/ErrorBoundary' import {atoms as a, useBreakpoints, useTheme} from '#/alf' @@ -22,7 +25,6 @@ import * as TextField from '#/components/forms/TextField' import {useThrottledValue} from '#/components/hooks/useThrottledValue' import {ArrowLeft_Stroke2_Corner0_Rounded as Arrow} from '#/components/icons/Arrow' import {MagnifyingGlass2_Stroke2_Corner0_Rounded as Search} from '#/components/icons/MagnifyingGlass2' -import {InlineLinkText} from '#/components/Link' import {Button, ButtonIcon, ButtonText} from '../Button' import {ListFooter, ListMaybePlaceholder} from '../Lists' import {Text} from '../Typography' @@ -46,14 +48,14 @@ export function GifSelectDialog({ let content = null let snapPoints - switch (externalEmbedsPrefs?.giphy) { + switch (externalEmbedsPrefs?.tenor) { case 'show': content = snapPoints = ['100%'] break case 'hide': default: - content = + content = break } @@ -90,8 +92,8 @@ function GifList({ const isSearching = search.length > 0 - const trendingQuery = useGiphyTrending() - const searchQuery = useGifphySearch(search) + const trendingQuery = useFeaturedGifsQuery() + const searchQuery = useGifSearchQuery(search) const { data, @@ -105,17 +107,7 @@ function GifList({ } = isSearching ? searchQuery : trendingQuery const flattenedData = useMemo(() => { - const uniquenessSet = new Set() - - function filter(gif: Gif) { - if (!gif) return false - if (uniquenessSet.has(gif.id)) { - return false - } - uniquenessSet.add(gif.id) - return true - } - return data?.pages.flatMap(page => page.data.filter(filter)) || [] + return data?.pages.flatMap(page => page.results) || [] }, [data]) const renderItem = useCallback( @@ -181,7 +173,7 @@ function GifList({ { setSearch(text) listRef.current?.scrollToOffset({offset: 0, animated: false}) @@ -223,12 +215,12 @@ function GifList({ emptyType="results" sideBorders={false} errorTitle={_(msg`Failed to load GIFs`)} - errorMessage={_(msg`There was an issue connecting to GIPHY.`)} + errorMessage={_(msg`There was an issue connecting to Tenor.`)} emptyMessage={ isSearching ? _(msg`No search results found for "${search}".`) : _( - msg`No trending GIFs found. There may be an issue with GIPHY.`, + msg`No featured GIFs found. There may be an issue with Tenor.`, ) } /> @@ -287,7 +279,9 @@ function GifPreview({ {aspectRatio: 1, opacity: pressed ? 0.8 : 1}, t.atoms.bg_contrast_25, ]} - source={{uri: gif.images.preview_gif.url}} + source={{ + uri: gif.media_formats.tinygif.url, + }} contentFit="cover" accessibilityLabel={gif.title} accessibilityHint="" @@ -299,61 +293,56 @@ function GifPreview({ ) } -function GiphyConsentPrompt({control}: {control: Dialog.DialogControlProps}) { +function TenorConsentPrompt({control}: {control: Dialog.DialogControlProps}) { const {_} = useLingui() const t = useTheme() const {gtMobile} = useBreakpoints() const setExternalEmbedPref = useSetExternalEmbedPref() const onShowPress = useCallback(() => { - setExternalEmbedPref('giphy', 'show') + setExternalEmbedPref('tenor', 'show') }, [setExternalEmbedPref]) const onHidePress = useCallback(() => { - setExternalEmbedPref('giphy', 'hide') + setExternalEmbedPref('tenor', 'hide') control.close() }, [control, setExternalEmbedPref]) const gtMobileWeb = gtMobile && isWeb return ( - + - Permission to use GIPHY + Permission to use Tenor - Bluesky uses GIPHY to provide the GIF selector feature. + Bluesky uses Tenor to provide the GIF selector feature. - GIPHY may collect information about you and your device. You can - find out more in their{' '} - control.close()}> - privacy policy - - . + Tenor is a third-party service that provides GIFs for use in + Bluesky. By enabling Tenor, requests will be made to Tenor's + servers to retrieve the GIFs. - - - - ) -} - function DialogError({details}: {details?: string}) { const {_} = useLingui() const control = Dialog.useDialogContext() diff --git a/src/view/screens/PreferencesExternalEmbeds.tsx b/src/view/screens/PreferencesExternalEmbeds.tsx index 1e8cedf7e2..5eec7e5077 100644 --- a/src/view/screens/PreferencesExternalEmbeds.tsx +++ b/src/view/screens/PreferencesExternalEmbeds.tsx @@ -1,25 +1,26 @@ import React from 'react' import {StyleSheet, View} from 'react-native' +import {Trans} from '@lingui/macro' import {useFocusEffect} from '@react-navigation/native' -import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types' -import {s} from 'lib/styles' -import {Text} from '../com/util/text/Text' -import {usePalette} from 'lib/hooks/usePalette' -import {useAnalytics} from 'lib/analytics/analytics' -import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' + import { EmbedPlayerSource, externalEmbedLabels, } from '#/lib/strings/embed-player' import {useSetMinimalShellMode} from '#/state/shell' -import {Trans} from '@lingui/macro' -import {ScrollView} from '../com/util/Views' +import {useAnalytics} from 'lib/analytics/analytics' +import {usePalette} from 'lib/hooks/usePalette' +import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' +import {CommonNavigatorParams, NativeStackScreenProps} from 'lib/routes/types' +import {s} from 'lib/styles' import { useExternalEmbedsPrefs, useSetExternalEmbedPref, } from 'state/preferences' import {ToggleButton} from 'view/com/util/forms/ToggleButton' import {SimpleViewHeader} from '../com/util/SimpleViewHeader' +import {Text} from '../com/util/text/Text' +import {ScrollView} from '../com/util/Views' type Props = NativeStackScreenProps< CommonNavigatorParams, @@ -74,13 +75,16 @@ export function PreferencesExternalEmbeds({}: Props) { Enable media players for - {Object.entries(externalEmbedLabels).map(([key, label]) => ( - - ))} + {Object.entries(externalEmbedLabels) + // TODO: Remove special case when we disable the old integration. + .filter(([key]) => key !== 'tenor') + .map(([key, label]) => ( + + ))} ) From 49b5d420e6ae7c3c9cfd56f47248b686f5c0128a Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 23 Apr 2024 00:37:46 +0100 Subject: [PATCH 144/185] rm country param (#3653) --- src/state/queries/tenor.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/state/queries/tenor.ts b/src/state/queries/tenor.ts index 66cfcec6af..80c57479e6 100644 --- a/src/state/queries/tenor.ts +++ b/src/state/queries/tenor.ts @@ -65,10 +65,6 @@ function createTenorApi( if (locale) { params.set('locale', locale.languageTag.replace('-', '_')) - - if (locale.regionCode) { - params.set('country', locale.regionCode) - } } for (const [key, value] of Object.entries(input)) { From fe9b3f0432d36fd60e5da4ed16be87cd0470e64b Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 23 Apr 2024 00:54:59 +0100 Subject: [PATCH 145/185] Ungate profile scroll fix (#3655) --- src/lib/statsig/gates.ts | 1 - src/view/screens/Profile.tsx | 24 ++++-------------------- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/src/lib/statsig/gates.ts b/src/lib/statsig/gates.ts index 843c14f04d..c41083afba 100644 --- a/src/lib/statsig/gates.ts +++ b/src/lib/statsig/gates.ts @@ -5,7 +5,6 @@ export type Gate = | 'disable_poll_on_discover_v2' | 'hide_vertical_scroll_indicators' | 'new_gif_player' - | 'new_profile_scroll_component' | 'show_follow_back_label_v2' | 'start_session_with_following_v2' | 'use_new_suggestions_endpoint' diff --git a/src/view/screens/Profile.tsx b/src/view/screens/Profile.tsx index c7f5a6627a..9cf2352c8a 100644 --- a/src/view/screens/Profile.tsx +++ b/src/view/screens/Profile.tsx @@ -25,7 +25,6 @@ import {useAnalytics} from 'lib/analytics/analytics' import {useSetTitle} from 'lib/hooks/useSetTitle' import {ComposeIcon2} from 'lib/icons' import {CommonNavigatorParams, NativeStackScreenProps} from 'lib/routes/types' -import {useGate} from 'lib/statsig/statsig' import {combinedDisplayName} from 'lib/strings/display-names' import {isInvalidHandle} from 'lib/strings/handles' import {colors, s} from 'lib/styles' @@ -143,7 +142,6 @@ function ProfileScreenLoaded({ const setMinimalShellMode = useSetMinimalShellMode() const {openComposer} = useComposerControls() const {screen, track} = useAnalytics() - const gate = useGate() const { data: labelerInfo, error: labelerError, @@ -317,21 +315,8 @@ function ProfileScreenLoaded({ // = const renderHeader = React.useCallback(() => { - if (gate('new_profile_scroll_component')) { - return ( - - - - ) - } else { - return ( + return ( + - ) - } + + ) }, [ - gate, scrollViewTag, profile, labelerInfo, From cbb817b5b707042afefbf8ca46a7104d62349492 Mon Sep 17 00:00:00 2001 From: Hailey Date: Mon, 22 Apr 2024 18:54:15 -0700 Subject: [PATCH 146/185] GIF Viewer (#3605) * ios player autoplay after recycle remove all items from AVPlayer queue recurururururursion use managers in the view add prefetch make sure player items stay in order add controller and item managers start of the view create module, ios * android player smoother basic caching prep cache somewhat works backup other files android impl blegh lets go touchup add prefetch to js use caching * bogus testing commit * add dims to type * save * add the dimensions to the embed info * add a new case * add a new case * limit this case to giphy * use gate * Revert "bogus testing commit" This reverts commit b3c8751b71f7108de9aa843b22ded4e0249fa854. * add web player base * flip mp4/webp * basic mp4 player for web * move some stuff into `ExternalLinkEmbed` instead * use a class component for web * remove extra component * add `onPlayerStateChange` event type on web * layer properly * fix tests * add new test * about ready. native portions done, a few touch ups on web needed show placeholder on ios fix type rm log display thumbnail until video is ready to play add oncanplay, playsinline remove unused method add `isLoaded` change event release player when finished apply gc to the view cleanup logs android gc rm log automatic gc for assets make `nativeRef` private remove unnecessary `await` cleanup rev log only play on prepare whenever needed rm unused perfperfperf rm var comment + android width native height calculations rm pressable add event dispatcher on android add event dispatcher on ios * ready to test ios fix autoplay ios clean oops * autoplay on web * normalize across all platforms add check for `ALT:` separate gif embed logic to another file handle permissions requests flatten web styles normalize styles normalize styles prefetch functions pause animatable on foreground android nits one more oops idk where that code went lint rethink the usage wrap up android clear bg update gradle more android rename dir update android namespace web ios add deps use webp rm unused update types use webp on mobile * rm gate from types * remove unused event param * only start placeholder op if doesn't exist in disk cache * fix gifs animating on app resume android * remove comment * add `isLoaded` for ios * add `isLoaded` to Android * onload for web * add visual loading state * rm a log * implement isloaded for android * dialogs * replace `webpSource` with `source` * update prop name * Move to Tenor for GIFs (#3654) * update some urls * right order for dimensions * add GIF coder for ios * remove giphy check * rewrite tenor urls * remove all the unnecessary stuff for consent * rm print * rm log * check if id and filename are strings * full size playback controls * pass tests * add accessibility to gifs * use `onPlay` and `onPause` * rm unused logic for description * add accessibility label to the controls * add gif into to external embed in composer * make it optional * gif dimensions * make the jsx look nicer --------- Co-authored-by: Dan Abramov Co-authored-by: Samuel Newman --- __tests__/lib/string.test.ts | 230 +++++++++--------- .../android/build.gradle | 98 ++++++++ .../android/src/main/AndroidManifest.xml | 2 + .../AppCompatImageViewExtended.kt | 37 +++ .../ExpoBlueskyGifViewModule.kt | 54 ++++ .../expo/modules/blueskygifview/GifView.kt | 180 ++++++++++++++ .../expo-module.config.json | 9 + modules/expo-bluesky-gif-view/index.ts | 1 + .../ios/ExpoBlueskyGifView.podspec | 23 ++ .../ios/ExpoBlueskyGifViewModule.swift | 47 ++++ .../expo-bluesky-gif-view/ios/GifView.swift | 185 ++++++++++++++ modules/expo-bluesky-gif-view/ios/Util.swift | 17 ++ modules/expo-bluesky-gif-view/src/GifView.tsx | 39 +++ .../src/GifView.types.ts | 15 ++ .../expo-bluesky-gif-view/src/GifView.web.tsx | 82 +++++++ src/lib/statsig/gates.ts | 1 - src/lib/strings/embed-player.ts | 46 ++-- src/view/com/composer/Composer.tsx | 10 +- src/view/com/composer/ExternalEmbed.tsx | 70 ++++-- .../util/post-embeds/ExternalLinkEmbed.tsx | 150 +++++++----- src/view/com/util/post-embeds/GifEmbed.tsx | 140 +++++++++++ src/view/com/util/post-embeds/index.tsx | 52 +--- 22 files changed, 1223 insertions(+), 265 deletions(-) create mode 100644 modules/expo-bluesky-gif-view/android/build.gradle create mode 100644 modules/expo-bluesky-gif-view/android/src/main/AndroidManifest.xml create mode 100644 modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/AppCompatImageViewExtended.kt create mode 100644 modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/ExpoBlueskyGifViewModule.kt create mode 100644 modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/GifView.kt create mode 100644 modules/expo-bluesky-gif-view/expo-module.config.json create mode 100644 modules/expo-bluesky-gif-view/index.ts create mode 100644 modules/expo-bluesky-gif-view/ios/ExpoBlueskyGifView.podspec create mode 100644 modules/expo-bluesky-gif-view/ios/ExpoBlueskyGifViewModule.swift create mode 100644 modules/expo-bluesky-gif-view/ios/GifView.swift create mode 100644 modules/expo-bluesky-gif-view/ios/Util.swift create mode 100644 modules/expo-bluesky-gif-view/src/GifView.tsx create mode 100644 modules/expo-bluesky-gif-view/src/GifView.types.ts create mode 100644 modules/expo-bluesky-gif-view/src/GifView.web.tsx create mode 100644 src/view/com/util/post-embeds/GifEmbed.tsx diff --git a/__tests__/lib/string.test.ts b/__tests__/lib/string.test.ts index eeb5ae1572..03d6852494 100644 --- a/__tests__/lib/string.test.ts +++ b/__tests__/lib/string.test.ts @@ -459,6 +459,12 @@ describe('parseEmbedPlayerFromUrl', () => { 'https://tenor.com/view', 'https://tenor.com/view/gifId.gif', 'https://tenor.com/intl/view/gifId.gif', + + 'https://media.tenor.com/someID_AAAAC/someName.gif?hh=100&ww=100', + 'https://media.tenor.com/someID_AAAAC/someName.gif', + 'https://media.tenor.com/someID/someName.gif', + 'https://media.tenor.com/someID', + 'https://media.tenor.com', ] const outputs = [ @@ -628,137 +634,129 @@ describe('parseEmbedPlayerFromUrl', () => { }, undefined, undefined, - { type: 'giphy_gif', source: 'giphy', isGif: true, hideDetails: true, metaUri: 'https://giphy.com/gifs/39248209509382934029', - playerUri: 'https://i.giphy.com/media/39248209509382934029/200.mp4', + playerUri: 'https://i.giphy.com/media/39248209509382934029/200.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', + }, + undefined, + undefined, + undefined, + + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', + }, + + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/200.webp', + }, + + undefined, + undefined, + undefined, + undefined, + undefined, + + { + type: 'tenor_gif', + source: 'tenor', + isGif: true, + hideDetails: true, + playerUri: 'https://t.gifs.bsky.app/someID_AAAAM/someName.gif', dimensions: { width: 100, height: 100, }, }, - - { - type: 'giphy_gif', - source: 'giphy', - isGif: true, - hideDetails: true, - metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/200.webp', - }, - { - type: 'giphy_gif', - source: 'giphy', - isGif: true, - hideDetails: true, - metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/200.webp', - }, - { - type: 'giphy_gif', - source: 'giphy', - isGif: true, - hideDetails: true, - metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/200.webp', - }, - { - type: 'giphy_gif', - source: 'giphy', - isGif: true, - hideDetails: true, - metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/200.webp', - }, - { - type: 'giphy_gif', - source: 'giphy', - isGif: true, - hideDetails: true, - metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/200.webp', - }, - { - type: 'giphy_gif', - source: 'giphy', - isGif: true, - hideDetails: true, - metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/200.webp', - }, undefined, undefined, undefined, - - { - type: 'giphy_gif', - source: 'giphy', - isGif: true, - hideDetails: true, - metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/200.webp', - }, - - { - type: 'giphy_gif', - source: 'giphy', - isGif: true, - hideDetails: true, - metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/200.webp', - }, - { - type: 'giphy_gif', - source: 'giphy', - isGif: true, - hideDetails: true, - metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/200.webp', - }, - { - type: 'giphy_gif', - source: 'giphy', - isGif: true, - hideDetails: true, - metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/200.webp', - }, - { - type: 'giphy_gif', - source: 'giphy', - isGif: true, - hideDetails: true, - metaUri: 'https://giphy.com/gifs/gifId', - playerUri: 'https://i.giphy.com/media/gifId/200.webp', - }, - - { - type: 'tenor_gif', - source: 'tenor', - isGif: true, - hideDetails: true, - playerUri: 'https://tenor.com/view/gifId.gif', - }, undefined, - undefined, - { - type: 'tenor_gif', - source: 'tenor', - isGif: true, - hideDetails: true, - playerUri: 'https://tenor.com/view/gifId.gif', - }, - { - type: 'tenor_gif', - source: 'tenor', - isGif: true, - hideDetails: true, - playerUri: 'https://tenor.com/intl/view/gifId.gif', - }, ] it('correctly grabs the correct id from uri', () => { diff --git a/modules/expo-bluesky-gif-view/android/build.gradle b/modules/expo-bluesky-gif-view/android/build.gradle new file mode 100644 index 0000000000..c209a35aec --- /dev/null +++ b/modules/expo-bluesky-gif-view/android/build.gradle @@ -0,0 +1,98 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'maven-publish' + +group = 'expo.modules.blueskygifview' +version = '0.5.0' + +buildscript { + def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle") + if (expoModulesCorePlugin.exists()) { + apply from: expoModulesCorePlugin + applyKotlinExpoModulesCorePlugin() + } + + // Simple helper that allows the root project to override versions declared by this library. + ext.safeExtGet = { prop, fallback -> + rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback + } + + // Ensures backward compatibility + ext.getKotlinVersion = { + if (ext.has("kotlinVersion")) { + ext.kotlinVersion() + } else { + ext.safeExtGet("kotlinVersion", "1.8.10") + } + } + + repositories { + mavenCentral() + } + + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${getKotlinVersion()}") + } +} + +afterEvaluate { + publishing { + publications { + release(MavenPublication) { + from components.release + } + } + repositories { + maven { + url = mavenLocal().url + } + } + } +} + +android { + compileSdkVersion safeExtGet("compileSdkVersion", 33) + + def agpVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION + if (agpVersion.tokenize('.')[0].toInteger() < 8) { + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.majorVersion + } + } + + namespace "expo.modules.blueskygifview" + defaultConfig { + minSdkVersion safeExtGet("minSdkVersion", 21) + targetSdkVersion safeExtGet("targetSdkVersion", 34) + versionCode 1 + versionName "0.5.0" + } + lintOptions { + abortOnError false + } + publishing { + singleVariant("release") { + withSourcesJar() + } + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.6.1' + def GLIDE_VERSION = "4.13.2" + + implementation project(':expo-modules-core') + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${getKotlinVersion()}" + + // Keep glide version up to date with expo-image so that we don't have duplicate deps + implementation 'com.github.bumptech.glide:glide:4.13.2' +} diff --git a/modules/expo-bluesky-gif-view/android/src/main/AndroidManifest.xml b/modules/expo-bluesky-gif-view/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..bdae66c8f5 --- /dev/null +++ b/modules/expo-bluesky-gif-view/android/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/AppCompatImageViewExtended.kt b/modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/AppCompatImageViewExtended.kt new file mode 100644 index 0000000000..5d20848453 --- /dev/null +++ b/modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/AppCompatImageViewExtended.kt @@ -0,0 +1,37 @@ +package expo.modules.blueskygifview + +import android.content.Context +import android.graphics.Canvas +import android.graphics.drawable.Animatable +import androidx.appcompat.widget.AppCompatImageView + +class AppCompatImageViewExtended(context: Context, private val parent: GifView): AppCompatImageView(context) { + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + + if (this.drawable is Animatable) { + if (!parent.isLoaded) { + parent.isLoaded = true + parent.firePlayerStateChange() + } + + if (!parent.isPlaying) { + this.pause() + } + } + } + + fun pause() { + val drawable = this.drawable + if (drawable is Animatable) { + drawable.stop() + } + } + + fun play() { + val drawable = this.drawable + if (drawable is Animatable) { + drawable.start() + } + } +} \ No newline at end of file diff --git a/modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/ExpoBlueskyGifViewModule.kt b/modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/ExpoBlueskyGifViewModule.kt new file mode 100644 index 0000000000..625e1d45f9 --- /dev/null +++ b/modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/ExpoBlueskyGifViewModule.kt @@ -0,0 +1,54 @@ +package expo.modules.blueskygifview + +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import expo.modules.kotlin.modules.Module +import expo.modules.kotlin.modules.ModuleDefinition + +class ExpoBlueskyGifViewModule : Module() { + override fun definition() = ModuleDefinition { + Name("ExpoBlueskyGifView") + + AsyncFunction("prefetchAsync") { sources: List -> + val activity = appContext.currentActivity ?: return@AsyncFunction + val glide = Glide.with(activity) + + sources.forEach { source -> + glide + .download(source) + .diskCacheStrategy(DiskCacheStrategy.DATA) + .submit() + } + } + + View(GifView::class) { + Events( + "onPlayerStateChange" + ) + + Prop("source") { view: GifView, source: String -> + view.source = source + } + + Prop("placeholderSource") { view: GifView, source: String -> + view.placeholderSource = source + } + + Prop("autoplay") { view: GifView, autoplay: Boolean -> + view.autoplay = autoplay + } + + AsyncFunction("playAsync") { view: GifView -> + view.play() + } + + AsyncFunction("pauseAsync") { view: GifView -> + view.pause() + } + + AsyncFunction("toggleAsync") { view: GifView -> + view.toggle() + } + } + } +} diff --git a/modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/GifView.kt b/modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/GifView.kt new file mode 100644 index 0000000000..be5830df7a --- /dev/null +++ b/modules/expo-bluesky-gif-view/android/src/main/java/expo/modules/blueskygifview/GifView.kt @@ -0,0 +1,180 @@ +package expo.modules.blueskygifview + + +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.Animatable +import android.graphics.drawable.Drawable +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import expo.modules.kotlin.AppContext +import expo.modules.kotlin.exception.Exceptions +import expo.modules.kotlin.viewevent.EventDispatcher +import expo.modules.kotlin.views.ExpoView + +class GifView(context: Context, appContext: AppContext) : ExpoView(context, appContext) { + // Events + private val onPlayerStateChange by EventDispatcher() + + // Glide + private val activity = appContext.currentActivity ?: throw Exceptions.MissingActivity() + private val glide = Glide.with(activity) + val imageView = AppCompatImageViewExtended(context, this) + var isPlaying = true + var isLoaded = false + + // Requests + private var placeholderRequest: Target? = null + private var webpRequest: Target? = null + + // Props + var placeholderSource: String? = null + var source: String? = null + var autoplay: Boolean = true + set(value) { + field = value + + if (value) { + this.play() + } else { + this.pause() + } + } + + + // + + init { + this.setBackgroundColor(Color.TRANSPARENT) + + this.imageView.setBackgroundColor(Color.TRANSPARENT) + this.imageView.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) + + this.addView(this.imageView) + } + + override fun onAttachedToWindow() { + if (this.imageView.drawable == null || this.imageView.drawable !is Animatable) { + this.load() + } else if (this.isPlaying) { + this.imageView.play() + } + super.onAttachedToWindow() + } + + override fun onDetachedFromWindow() { + this.imageView.pause() + super.onDetachedFromWindow() + } + + // + + // + + private fun load() { + if (placeholderSource == null || source == null) { + return + } + + this.webpRequest = glide.load(source) + .diskCacheStrategy(DiskCacheStrategy.DATA) + .skipMemoryCache(false) + .listener(object: RequestListener { + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: com.bumptech.glide.load.DataSource?, + isFirstResource: Boolean + ): Boolean { + if (placeholderRequest != null) { + glide.clear(placeholderRequest) + } + return false + } + + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + return true + } + }) + .into(this.imageView) + + if (this.imageView.drawable == null || this.imageView.drawable !is Animatable) { + this.placeholderRequest = glide.load(placeholderSource) + .diskCacheStrategy(DiskCacheStrategy.DATA) + // Let's not bloat the memory cache with placeholders + .skipMemoryCache(true) + .listener(object: RequestListener { + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: com.bumptech.glide.load.DataSource?, + isFirstResource: Boolean + ): Boolean { + // Incase this request finishes after the webp, let's just not set + // the drawable. This shouldn't happen because the request should get cancelled + if (imageView.drawable == null) { + imageView.setImageDrawable(resource) + } + return true + } + + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + return true + } + }) + .submit() + } + } + + // + + // + + fun play() { + this.imageView.play() + this.isPlaying = true + this.firePlayerStateChange() + } + + fun pause() { + this.imageView.pause() + this.isPlaying = false + this.firePlayerStateChange() + } + + fun toggle() { + if (this.isPlaying) { + this.pause() + } else { + this.play() + } + } + + // + + // + + fun firePlayerStateChange() { + onPlayerStateChange(mapOf( + "isPlaying" to this.isPlaying, + "isLoaded" to this.isLoaded, + )) + } + + // +} diff --git a/modules/expo-bluesky-gif-view/expo-module.config.json b/modules/expo-bluesky-gif-view/expo-module.config.json new file mode 100644 index 0000000000..0756c8e24c --- /dev/null +++ b/modules/expo-bluesky-gif-view/expo-module.config.json @@ -0,0 +1,9 @@ +{ + "platforms": ["ios", "android", "web"], + "ios": { + "modules": ["ExpoBlueskyGifViewModule"] + }, + "android": { + "modules": ["expo.modules.blueskygifview.ExpoBlueskyGifViewModule"] + } +} diff --git a/modules/expo-bluesky-gif-view/index.ts b/modules/expo-bluesky-gif-view/index.ts new file mode 100644 index 0000000000..0244a54914 --- /dev/null +++ b/modules/expo-bluesky-gif-view/index.ts @@ -0,0 +1 @@ +export {GifView} from './src/GifView' diff --git a/modules/expo-bluesky-gif-view/ios/ExpoBlueskyGifView.podspec b/modules/expo-bluesky-gif-view/ios/ExpoBlueskyGifView.podspec new file mode 100644 index 0000000000..ddd0877b24 --- /dev/null +++ b/modules/expo-bluesky-gif-view/ios/ExpoBlueskyGifView.podspec @@ -0,0 +1,23 @@ +Pod::Spec.new do |s| + s.name = 'ExpoBlueskyGifView' + s.version = '1.0.0' + s.summary = 'A simple GIF player for Bluesky' + s.description = 'A simple GIF player for Bluesky' + s.author = '' + s.homepage = 'https://github.com/bluesky-social/social-app' + s.platforms = { :ios => '13.4', :tvos => '13.4' } + s.source = { git: '' } + s.static_framework = true + + s.dependency 'ExpoModulesCore' + s.dependency 'SDWebImage', '~> 5.17.0' + s.dependency 'SDWebImageWebPCoder', '~> 0.13.0' + + # Swift/Objective-C compatibility + s.pod_target_xcconfig = { + 'DEFINES_MODULE' => 'YES', + 'SWIFT_COMPILATION_MODE' => 'wholemodule' + } + + s.source_files = "**/*.{h,m,mm,swift,hpp,cpp}" +end diff --git a/modules/expo-bluesky-gif-view/ios/ExpoBlueskyGifViewModule.swift b/modules/expo-bluesky-gif-view/ios/ExpoBlueskyGifViewModule.swift new file mode 100644 index 0000000000..7c7132290d --- /dev/null +++ b/modules/expo-bluesky-gif-view/ios/ExpoBlueskyGifViewModule.swift @@ -0,0 +1,47 @@ +import ExpoModulesCore +import SDWebImage +import SDWebImageWebPCoder + +public class ExpoBlueskyGifViewModule: Module { + public func definition() -> ModuleDefinition { + Name("ExpoBlueskyGifView") + + OnCreate { + SDImageCodersManager.shared.addCoder(SDImageGIFCoder.shared) + } + + AsyncFunction("prefetchAsync") { (sources: [URL]) in + SDWebImagePrefetcher.shared.prefetchURLs(sources, context: Util.createContext(), progress: nil) + } + + View(GifView.self) { + Events( + "onPlayerStateChange" + ) + + Prop("source") { (view: GifView, prop: String) in + view.source = prop + } + + Prop("placeholderSource") { (view: GifView, prop: String) in + view.placeholderSource = prop + } + + Prop("autoplay") { (view: GifView, prop: Bool) in + view.autoplay = prop + } + + AsyncFunction("toggleAsync") { (view: GifView) in + view.toggle() + } + + AsyncFunction("playAsync") { (view: GifView) in + view.play() + } + + AsyncFunction("pauseAsync") { (view: GifView) in + view.pause() + } + } + } +} diff --git a/modules/expo-bluesky-gif-view/ios/GifView.swift b/modules/expo-bluesky-gif-view/ios/GifView.swift new file mode 100644 index 0000000000..de722d7a63 --- /dev/null +++ b/modules/expo-bluesky-gif-view/ios/GifView.swift @@ -0,0 +1,185 @@ +import ExpoModulesCore +import SDWebImage +import SDWebImageWebPCoder + +typealias SDWebImageContext = [SDWebImageContextOption: Any] + +public class GifView: ExpoView, AVPlayerViewControllerDelegate { + // Events + private let onPlayerStateChange = EventDispatcher() + + // SDWebImage + private let imageView = SDAnimatedImageView(frame: .zero) + private let imageManager = SDWebImageManager( + cache: SDImageCache.shared, + loader: SDImageLoadersManager.shared + ) + private var isPlaying = true + private var isLoaded = false + + // Requests + private var webpOperation: SDWebImageCombinedOperation? + private var placeholderOperation: SDWebImageCombinedOperation? + + // Props + var source: String? = nil + var placeholderSource: String? = nil + var autoplay = true { + didSet { + if !autoplay { + self.pause() + } else { + self.play() + } + } + } + + // MARK: - Lifecycle + + public required init(appContext: AppContext? = nil) { + super.init(appContext: appContext) + self.clipsToBounds = true + + self.imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + self.imageView.layer.masksToBounds = false + self.imageView.backgroundColor = .clear + self.imageView.contentMode = .scaleToFill + + // We have to explicitly set this to false. If we don't, every time + // the view comes into the viewport, it will start animating again + self.imageView.autoPlayAnimatedImage = false + + self.addSubview(self.imageView) + } + + public override func willMove(toWindow newWindow: UIWindow?) { + if newWindow == nil { + // Don't cancel the placeholder operation, because we really want that to complete for + // when we scroll back up + self.webpOperation?.cancel() + self.placeholderOperation?.cancel() + } else if self.imageView.image == nil { + self.load() + } + } + + // MARK: - Loading + + private func load() { + guard let source = self.source, let placeholderSource = self.placeholderSource else { + return + } + + self.webpOperation?.cancel() + self.placeholderOperation?.cancel() + + // We only need to start an operation for the placeholder if it doesn't exist + // in the cache already. Cache key is by default the absolute URL of the image. + // See: + // https://github.com/SDWebImage/SDWebImage/blob/master/Docs/HowToUse.md#using-asynchronous-image-caching-independently + if !SDImageCache.shared.diskImageDataExists(withKey: source), + let url = URL(string: placeholderSource) + { + self.placeholderOperation = imageManager.loadImage( + with: url, + options: [.retryFailed], + context: Util.createContext(), + progress: onProgress(_:_:_:), + completed: onLoaded(_:_:_:_:_:_:) + ) + } + + if let url = URL(string: source) { + self.webpOperation = imageManager.loadImage( + with: url, + options: [.retryFailed], + context: Util.createContext(), + progress: onProgress(_:_:_:), + completed: onLoaded(_:_:_:_:_:_:) + ) + } + } + + private func setImage(_ image: UIImage) { + if self.imageView.image == nil || image.sd_isAnimated { + self.imageView.image = image + } + + if image.sd_isAnimated { + self.firePlayerStateChange() + if isPlaying { + self.imageView.startAnimating() + } + } + } + + // MARK: - Loading blocks + + private func onProgress(_ receivedSize: Int, _ expectedSize: Int, _ imageUrl: URL?) {} + + private func onLoaded( + _ image: UIImage?, + _ data: Data?, + _ error: Error?, + _ cacheType: SDImageCacheType, + _ finished: Bool, + _ imageUrl: URL? + ) { + guard finished else { + return + } + + if let placeholderSource = self.placeholderSource, + imageUrl?.absoluteString == placeholderSource, + self.imageView.image == nil, + let image = image + { + self.setImage(image) + return + } + + if let source = self.source, + imageUrl?.absoluteString == source, + // UIImage perf suckssss if the image is animated + let data = data, + let animatedImage = SDAnimatedImage(data: data) + { + self.placeholderOperation?.cancel() + self.isPlaying = self.autoplay + self.isLoaded = true + self.setImage(animatedImage) + self.firePlayerStateChange() + } + } + + // MARK: - Playback Controls + + func play() { + self.imageView.startAnimating() + self.isPlaying = true + self.firePlayerStateChange() + } + + func pause() { + self.imageView.stopAnimating() + self.isPlaying = false + self.firePlayerStateChange() + } + + func toggle() { + if self.isPlaying { + self.pause() + } else { + self.play() + } + } + + // MARK: - Util + + private func firePlayerStateChange() { + onPlayerStateChange([ + "isPlaying": self.isPlaying, + "isLoaded": self.isLoaded + ]) + } +} diff --git a/modules/expo-bluesky-gif-view/ios/Util.swift b/modules/expo-bluesky-gif-view/ios/Util.swift new file mode 100644 index 0000000000..55ed4152aa --- /dev/null +++ b/modules/expo-bluesky-gif-view/ios/Util.swift @@ -0,0 +1,17 @@ +import SDWebImage + +class Util { + static func createContext() -> SDWebImageContext { + var context = SDWebImageContext() + + // SDAnimatedImage for some reason has issues whenever loaded from memory. Instead, we + // will just use the disk. SDWebImage will manage this cache for us, so we don't need + // to worry about clearing it. + context[.originalQueryCacheType] = SDImageCacheType.disk.rawValue + context[.originalStoreCacheType] = SDImageCacheType.disk.rawValue + context[.queryCacheType] = SDImageCacheType.disk.rawValue + context[.storeCacheType] = SDImageCacheType.disk.rawValue + + return context + } +} diff --git a/modules/expo-bluesky-gif-view/src/GifView.tsx b/modules/expo-bluesky-gif-view/src/GifView.tsx new file mode 100644 index 0000000000..87258de17b --- /dev/null +++ b/modules/expo-bluesky-gif-view/src/GifView.tsx @@ -0,0 +1,39 @@ +import React from 'react' +import {requireNativeModule} from 'expo' +import {requireNativeViewManager} from 'expo-modules-core' + +import {GifViewProps} from './GifView.types' + +const NativeModule = requireNativeModule('ExpoBlueskyGifView') +const NativeView: React.ComponentType< + GifViewProps & {ref: React.RefObject} +> = requireNativeViewManager('ExpoBlueskyGifView') + +export class GifView extends React.PureComponent { + // TODO native types, should all be the same as those in this class + private nativeRef: React.RefObject = React.createRef() + + constructor(props: GifViewProps | Readonly) { + super(props) + } + + static async prefetchAsync(sources: string[]): Promise { + return await NativeModule.prefetchAsync(sources) + } + + async playAsync(): Promise { + await this.nativeRef.current.playAsync() + } + + async pauseAsync(): Promise { + await this.nativeRef.current.pauseAsync() + } + + async toggleAsync(): Promise { + await this.nativeRef.current.toggleAsync() + } + + render() { + return + } +} diff --git a/modules/expo-bluesky-gif-view/src/GifView.types.ts b/modules/expo-bluesky-gif-view/src/GifView.types.ts new file mode 100644 index 0000000000..29ec277f2b --- /dev/null +++ b/modules/expo-bluesky-gif-view/src/GifView.types.ts @@ -0,0 +1,15 @@ +import {ViewProps} from 'react-native' + +export interface GifViewStateChangeEvent { + nativeEvent: { + isPlaying: boolean + isLoaded: boolean + } +} + +export interface GifViewProps extends ViewProps { + autoplay?: boolean + source?: string + placeholderSource?: string + onPlayerStateChange?: (event: GifViewStateChangeEvent) => void +} diff --git a/modules/expo-bluesky-gif-view/src/GifView.web.tsx b/modules/expo-bluesky-gif-view/src/GifView.web.tsx new file mode 100644 index 0000000000..c197e01a1d --- /dev/null +++ b/modules/expo-bluesky-gif-view/src/GifView.web.tsx @@ -0,0 +1,82 @@ +import * as React from 'react' +import {StyleSheet} from 'react-native' + +import {GifViewProps} from './GifView.types' + +export class GifView extends React.PureComponent { + private readonly videoPlayerRef: React.RefObject = + React.createRef() + private isLoaded = false + + constructor(props: GifViewProps | Readonly) { + super(props) + } + + componentDidUpdate(prevProps: Readonly) { + if (prevProps.autoplay !== this.props.autoplay) { + if (this.props.autoplay) { + this.playAsync() + } else { + this.pauseAsync() + } + } + } + + static async prefetchAsync(_: string[]): Promise { + console.warn('prefetchAsync is not supported on web') + } + + private firePlayerStateChangeEvent = () => { + this.props.onPlayerStateChange?.({ + nativeEvent: { + isPlaying: !this.videoPlayerRef.current?.paused, + isLoaded: this.isLoaded, + }, + }) + } + + private onLoad = () => { + // Prevent multiple calls to onLoad because onCanPlay will fire after each loop + if (this.isLoaded) { + return + } + + this.isLoaded = true + this.firePlayerStateChangeEvent() + } + + async playAsync(): Promise { + this.videoPlayerRef.current?.play() + } + + async pauseAsync(): Promise { + this.videoPlayerRef.current?.pause() + } + + async toggleAsync(): Promise { + if (this.videoPlayerRef.current?.paused) { + await this.playAsync() + } else { + await this.pauseAsync() + } + } + + render() { + return ( +