Bluesky app fork with some witchin' additions 💫

Actually call them skeets + readme update also one more default please & ChatEmptyPills

xan.lol 5cdd5bba e0f3a3c6

verified
+262 -263
+16 -17
README.md
··· 16 17 - Funner name (still love you tho bsky!) 18 - Nicer colors (kinda like gruvbox? not really) 19 - - We call them skeets (at least for English users) 20 - - Attempts to ignore `!no-unauthenticated` labels 21 - Share links to bitchsky.app or bsky.app 22 - Embed player works with [stream.place](https://stream.place/) links! 23 - No push notifications (may be added later) 24 - Kept as up-to-date as possible (sporadically unstable as a result) 25 ··· 28 These are all available as options in a sub-page of the app's settings. 29 30 - Toggle go.bsky.app link proxying for analytics 31 - - Toggle to see skeets in quotes through blocks and detachments (broken 💔) 32 - Toggle to trust your own preferred verifiers (and to operate as one yourself) 33 - - Toggle to disable the default app labeler 34 35 #### Tweaks 36 ··· 41 - Toggle to only show a single tab if only one feed is pinned 42 - Toggle to prevent others from getting notified when you interact with their reskeets 43 - Toggle similar account recommendations 44 45 #### Metrics 46 ··· 58 - Toggle to show feed context for debugging 59 - Toggle to hide the 'show latest' button 60 - Toggle to make reply button open thread from feeds 61 - - More may be available in developer mode 62 - (Accessible by holding the version in the About settings screen) 63 64 ## Upcoming or wishful features ··· 82 - [ ] Automatic PDS detection like other social-app forks (fallback/email addresses to use bitchsky.social) 83 - [ ] Like of or repost of repost icons in notifications 84 - [ ] Change followed accounts [on onboarding](https://github.com/blacksky-algorithms/blacksky.community/commit/e36ee43efb4999f070860d7f70122e45b28c1e2b) 85 - - [ ] Change ChatEmptyPill strings for English locale 86 - - [ ] Pronouns+ from forks like [deer.aylac.top](https://github.com/ayla6/deer-social-test) 87 - [ ] Visual replies indicator like the [Firmament userstyle](https://bitchsky.app/profile/did:plc:jwhxcrf5uvl3vyw7nurecgt5/post/3m4rr3vzmak2a) (and likes?) 88 - [ ] Additional translation service providers + setting (Deepl, Kagi) 89 - [ ] Move Mutuals label to the follow button 90 - - [ ] Change defaults (alt text nation, link non-bsky handles, autoplay OFF, hide similar account recommendations) 91 - [ ] Bitchsky PDS and .social site (list good songs containing 'bitch' in their titles) 92 93 - #### Bugs 94 - 95 - - [ ] Fix app crash on tapping profile header (./src/view/com/util/UserBanner.tsx) 96 - - [ ] Fix regression causing zooming in to break on image lightboxes 97 - 98 ### Even more wishful or far off 99 100 - [ ] Collapse labels past a customizable number (from the same labeler?) into a labeler clip "(+)" 101 - [ ] Submit releases to the Google Play Store and iOS App Store 102 - - [ ] Likes tab on profiles for other users 103 - - [ ] Move from GitHub to Tangled? 104 - - [ ] Experimental toggle between handle and DID in share links? 105 - - [ ] New fun language/locale(s) like Minecraft 106 - [ ] Move TOS and privacy policy to Jollywhoppers website? 107 - [ ] Rewrite ALF for M3 Expressive (with in-app color slider like red dwarf, for web?) 108 109 ## Development Resources
··· 16 17 - Funner name (still love you tho bsky!) 18 - Nicer colors (kinda like gruvbox? not really) 19 + - Posts are called Skeets 20 - Share links to bitchsky.app or bsky.app 21 - Embed player works with [stream.place](https://stream.place/) links! 22 + - Open skeets in PDSls and original pages from bridged posts 23 + - Better defaults (alt text required 😉) 24 - No push notifications (may be added later) 25 - Kept as up-to-date as possible (sporadically unstable as a result) 26 ··· 29 These are all available as options in a sub-page of the app's settings. 30 31 - Toggle go.bsky.app link proxying for analytics 32 + - Toggle to see skeets in quotes through blocks and detachments 33 - Toggle to trust your own preferred verifiers (and to operate as one yourself) 34 + - Toggle to disable the default app labeler(s) 35 36 #### Tweaks 37 ··· 42 - Toggle to only show a single tab if only one feed is pinned 43 - Toggle to prevent others from getting notified when you interact with their reskeets 44 - Toggle similar account recommendations 45 + - Toggle to make all user avatars square (like labelers) 46 47 #### Metrics 48 ··· 60 - Toggle to show feed context for debugging 61 - Toggle to hide the 'show latest' button 62 - Toggle to make reply button open thread from feeds 63 + - More may be available in developer mode? 64 - (Accessible by holding the version in the About settings screen) 65 66 ## Upcoming or wishful features ··· 84 - [ ] Automatic PDS detection like other social-app forks (fallback/email addresses to use bitchsky.social) 85 - [ ] Like of or repost of repost icons in notifications 86 - [ ] Change followed accounts [on onboarding](https://github.com/blacksky-algorithms/blacksky.community/commit/e36ee43efb4999f070860d7f70122e45b28c1e2b) 87 + - [ ] Join date & switch accounts from composer from a fork like [deer.aylac.top](https://github.com/ayla6/deer-social-test) 88 - [ ] Visual replies indicator like the [Firmament userstyle](https://bitchsky.app/profile/did:plc:jwhxcrf5uvl3vyw7nurecgt5/post/3m4rr3vzmak2a) (and likes?) 89 - [ ] Additional translation service providers + setting (Deepl, Kagi) 90 - [ ] Move Mutuals label to the follow button 91 + - [ ] Put DeerSettings into separate subpages 92 + - [ ] After subpages for options, add [Outlinks page](https://bitchsky.app/profile/did:plc:q7suwaz53ztc4mbiqyygbn43/post/3m5zjhhshic2g) & 93 + - [ ] ShareMenuItems.tsx, ShareMenuItems.web.tsx 94 + - [ ] For profile meatball button, Open profile in PDSls & Open bridged OG fedi account page 95 + - [ ] ProfileMenu.tsx 96 - [ ] Bitchsky PDS and .social site (list good songs containing 'bitch' in their titles) 97 98 ### Even more wishful or far off 99 100 - [ ] Collapse labels past a customizable number (from the same labeler?) into a labeler clip "(+)" 101 - [ ] Submit releases to the Google Play Store and iOS App Store 102 + - [ ] Move from GitHub to Tangled (and Cloudflare Pages to wisp.place)? 103 + - [ ] Toggle between handle and DID in share links 104 - [ ] Move TOS and privacy policy to Jollywhoppers website? 105 + - [ ] Ignore `!no-unauthenticated` labels 106 - [ ] Rewrite ALF for M3 Expressive (with in-app color slider like red dwarf, for web?) 107 108 ## Development Resources
+10 -10
src/Navigation.tsx
··· 196 name="ModerationInteractionSettings" 197 getComponent={() => ModerationInteractionSettings} 198 options={{ 199 - title: title(msg`Post Interaction Settings`), 200 requireAuth: true, 201 }} 202 /> ··· 255 name="ProfileSearch" 256 getComponent={() => ProfileSearchScreen} 257 options={({route}) => ({ 258 - title: title(msg`Search @${route.params.name}'s posts`), 259 })} 260 /> 261 <Stack.Screen 262 name="PostThread" 263 getComponent={() => PostThreadScreen} 264 options={({route}) => ({ 265 - title: title(msg`Post by @${route.params.name}`), 266 })} 267 /> 268 <Stack.Screen 269 name="PostLikedBy" 270 getComponent={() => PostLikedByScreen} 271 options={({route}) => ({ 272 - title: title(msg`Post by @${route.params.name}`), 273 })} 274 /> 275 <Stack.Screen 276 name="PostRepostedBy" 277 getComponent={() => PostRepostedByScreen} 278 options={({route}) => ({ 279 - title: title(msg`Post by @${route.params.name}`), 280 })} 281 /> 282 <Stack.Screen 283 name="PostQuotes" 284 getComponent={() => PostQuotesScreen} 285 options={({route}) => ({ 286 - title: title(msg`Post by @${route.params.name}`), 287 })} 288 /> 289 <Stack.Screen ··· 466 name="RepostNotificationSettings" 467 getComponent={() => RepostNotificationSettingsScreen} 468 options={{ 469 - title: title(msg`Repost notifications`), 470 requireAuth: true, 471 }} 472 /> ··· 482 name="LikesOnRepostsNotificationSettings" 483 getComponent={() => LikesOnRepostsNotificationSettingsScreen} 484 options={{ 485 - title: title(msg`Likes of your reposts notifications`), 486 requireAuth: true, 487 }} 488 /> ··· 490 name="RepostsOnRepostsNotificationSettings" 491 getComponent={() => RepostsOnRepostsNotificationSettingsScreen} 492 options={{ 493 - title: title(msg`Reposts of your reposts notifications`), 494 requireAuth: true, 495 }} 496 /> ··· 614 name="Bookmarks" 615 getComponent={() => BookmarksScreen} 616 options={{ 617 - title: title(msg`Saved Posts`), 618 requireAuth: true, 619 }} 620 />
··· 196 name="ModerationInteractionSettings" 197 getComponent={() => ModerationInteractionSettings} 198 options={{ 199 + title: title(msg`Skeet Interaction Settings`), 200 requireAuth: true, 201 }} 202 /> ··· 255 name="ProfileSearch" 256 getComponent={() => ProfileSearchScreen} 257 options={({route}) => ({ 258 + title: title(msg`Search @${route.params.name}'s skeets`), 259 })} 260 /> 261 <Stack.Screen 262 name="PostThread" 263 getComponent={() => PostThreadScreen} 264 options={({route}) => ({ 265 + title: title(msg`Skeet by @${route.params.name}`), 266 })} 267 /> 268 <Stack.Screen 269 name="PostLikedBy" 270 getComponent={() => PostLikedByScreen} 271 options={({route}) => ({ 272 + title: title(msg`Skeet by @${route.params.name}`), 273 })} 274 /> 275 <Stack.Screen 276 name="PostRepostedBy" 277 getComponent={() => PostRepostedByScreen} 278 options={({route}) => ({ 279 + title: title(msg`Skeet by @${route.params.name}`), 280 })} 281 /> 282 <Stack.Screen 283 name="PostQuotes" 284 getComponent={() => PostQuotesScreen} 285 options={({route}) => ({ 286 + title: title(msg`Skeet by @${route.params.name}`), 287 })} 288 /> 289 <Stack.Screen ··· 466 name="RepostNotificationSettings" 467 getComponent={() => RepostNotificationSettingsScreen} 468 options={{ 469 + title: title(msg`Reskeet notifications`), 470 requireAuth: true, 471 }} 472 /> ··· 482 name="LikesOnRepostsNotificationSettings" 483 getComponent={() => LikesOnRepostsNotificationSettingsScreen} 484 options={{ 485 + title: title(msg`Likes of your reskeets notifications`), 486 requireAuth: true, 487 }} 488 /> ··· 490 name="RepostsOnRepostsNotificationSettings" 491 getComponent={() => RepostsOnRepostsNotificationSettingsScreen} 492 options={{ 493 + title: title(msg`Reskeets of your reskeets notifications`), 494 requireAuth: true, 495 }} 496 /> ··· 614 name="Bookmarks" 615 getComponent={() => BookmarksScreen} 616 options={{ 617 + title: title(msg`Saved Skeets`), 618 requireAuth: true, 619 }} 620 />
+2 -2
src/components/Post/PostRepliedTo.tsx
··· 25 26 let label 27 if (isParentBlocked) { 28 - label = <Trans context="description">Replied to a blocked post</Trans> 29 } else if (isParentNotFound) { 30 - label = <Trans context="description">Replied to a post</Trans> 31 } else if (parentAuthor) { 32 const did = 33 typeof parentAuthor === 'string' ? parentAuthor : parentAuthor.did
··· 25 26 let label 27 if (isParentBlocked) { 28 + label = <Trans context="description">Replied to a blocked skeet</Trans> 29 } else if (isParentNotFound) { 30 + label = <Trans context="description">Replied to a skeet</Trans> 31 } else if (parentAuthor) { 32 const did = 33 typeof parentAuthor === 'string' ? parentAuthor : parentAuthor.did
+4 -4
src/components/PostControls/BookmarkButton.tsx
··· 56 <toast.Outer> 57 <toast.Icon /> 58 <toast.Text> 59 - <Trans>Post saved</Trans> 60 </toast.Text> 61 {!disableUndo && ( 62 <toast.Action ··· 91 <toast.Outer> 92 <toast.Icon icon={TrashIcon} /> 93 <toast.Text> 94 - <Trans>Removed from saved posts</Trans> 95 </toast.Text> 96 {!disableUndo && ( 97 <toast.Action ··· 125 big={big} 126 label={ 127 isBookmarked 128 - ? _(msg`Remove from saved posts`) 129 - : _(msg`Add to saved posts`) 130 } 131 onPress={onHandlePress} 132 hitSlop={hitSlop}>
··· 56 <toast.Outer> 57 <toast.Icon /> 58 <toast.Text> 59 + <Trans>Skeet saved</Trans> 60 </toast.Text> 61 {!disableUndo && ( 62 <toast.Action ··· 91 <toast.Outer> 92 <toast.Icon icon={TrashIcon} /> 93 <toast.Text> 94 + <Trans>Removed from saved skeets</Trans> 95 </toast.Text> 96 {!disableUndo && ( 97 <toast.Action ··· 125 big={big} 126 label={ 127 isBookmarked 128 + ? _(msg`Remove from saved skeets`) 129 + : _(msg`Add to saved skeets`) 130 } 131 onPress={onHandlePress} 132 hitSlop={hitSlop}>
+18 -18
src/components/PostControls/PostMenu/PostMenuItems.tsx
··· 189 const onDeletePost = () => { 190 deletePostMutate({uri: postUri}).then( 191 () => { 192 - Toast.show(_(msg({message: 'Post deleted', context: 'toast'}))) 193 194 const route = getCurrentRoute(navigation.getState()) 195 if (route.name === 'PostThread') { ··· 209 }, 210 e => { 211 logger.error('Failed to delete post', {message: e}) 212 - Toast.show(_(msg`Failed to delete post, please try again`), 'xmark') 213 }, 214 ) 215 } ··· 318 }) 319 Toast.show( 320 isDetach 321 - ? _(msg`Quote post was successfully detached`) 322 - : _(msg`Quote post was re-attached`), 323 ) 324 } catch (e: any) { 325 Toast.show( ··· 581 testID="postDropdownCopyTextBtn" 582 label={_(msg`Copy post text`)} 583 onPress={onCopyPostText}> 584 - <Menu.ItemText>{_(msg`Copy post text`)}</Menu.ItemText> 585 <Menu.ItemIcon icon={ClipboardIcon} position="right" /> 586 </Menu.Item> 587 </> 588 ) : ( 589 <Menu.Item 590 testID="postDropdownSignInBtn" 591 - label={_(msg`Sign in to view post`)} 592 onPress={onSignIn}> 593 - <Menu.ItemText>{_(msg`Sign in to view post`)}</Menu.ItemText> 594 <Menu.ItemIcon icon={Eye} position="right" /> 595 </Menu.Item> 596 )} ··· 673 label={ 674 isReply 675 ? _(msg`Hide reply for me`) 676 - : _(msg`Hide post for me`) 677 } 678 onPress={() => hidePromptControl.open()}> 679 <Menu.ItemText> 680 {isReply 681 ? _(msg`Hide reply for me`) 682 - : _(msg`Hide post for me`)} 683 </Menu.ItemText> 684 <Menu.ItemIcon icon={EyeSlash} position="right" /> 685 </Menu.Item> ··· 781 782 <Menu.Item 783 testID="postDropdownReportBtn" 784 - label={_(msg`Report post`)} 785 onPress={() => reportDialogControl.open()}> 786 - <Menu.ItemText>{_(msg`Report post`)}</Menu.ItemText> 787 <Menu.ItemIcon icon={Warning} position="right" /> 788 </Menu.Item> 789 </> ··· 814 testID="postDropdownDeleteBtn" 815 label={_(msg`Delete post`)} 816 onPress={() => deletePromptControl.open()}> 817 - <Menu.ItemText>{_(msg`Delete post`)}</Menu.ItemText> 818 <Menu.ItemIcon icon={Trash} position="right" /> 819 </Menu.Item> 820 </> ··· 826 827 <Prompt.Basic 828 control={deletePromptControl} 829 - title={_(msg`Delete this post?`)} 830 description={_( 831 - msg`If you remove this post, you won't be able to recover it.`, 832 )} 833 onConfirm={onDeletePost} 834 confirmButtonCta={_(msg`Delete`)} ··· 837 838 <Prompt.Basic 839 control={hidePromptControl} 840 - title={isReply ? _(msg`Hide this reply?`) : _(msg`Hide this post?`)} 841 description={_( 842 - msg`This post will be hidden from feeds and threads. This cannot be undone.`, 843 )} 844 onConfirm={onHidePost} 845 confirmButtonCta={_(msg`Hide`)} ··· 862 863 <Prompt.Basic 864 control={quotePostDetachConfirmControl} 865 - title={_(msg`Detach quote post?`)} 866 description={_( 867 - msg`This will remove your post from this quote post for all users, and replace it with a placeholder.`, 868 )} 869 onConfirm={onToggleQuotePostAttachment} 870 confirmButtonCta={_(msg`Yes, detach`)}
··· 189 const onDeletePost = () => { 190 deletePostMutate({uri: postUri}).then( 191 () => { 192 + Toast.show(_(msg({message: 'Skeet deleted', context: 'toast'}))) 193 194 const route = getCurrentRoute(navigation.getState()) 195 if (route.name === 'PostThread') { ··· 209 }, 210 e => { 211 logger.error('Failed to delete post', {message: e}) 212 + Toast.show(_(msg`Failed to delete skeet, please try again`), 'xmark') 213 }, 214 ) 215 } ··· 318 }) 319 Toast.show( 320 isDetach 321 + ? _(msg`Quote skeet was successfully detached`) 322 + : _(msg`Quote skeet was re-attached`), 323 ) 324 } catch (e: any) { 325 Toast.show( ··· 581 testID="postDropdownCopyTextBtn" 582 label={_(msg`Copy post text`)} 583 onPress={onCopyPostText}> 584 + <Menu.ItemText>{_(msg`Copy skeet text`)}</Menu.ItemText> 585 <Menu.ItemIcon icon={ClipboardIcon} position="right" /> 586 </Menu.Item> 587 </> 588 ) : ( 589 <Menu.Item 590 testID="postDropdownSignInBtn" 591 + label={_(msg`Sign in to view skeet`)} 592 onPress={onSignIn}> 593 + <Menu.ItemText>{_(msg`Sign in to view skeet`)}</Menu.ItemText> 594 <Menu.ItemIcon icon={Eye} position="right" /> 595 </Menu.Item> 596 )} ··· 673 label={ 674 isReply 675 ? _(msg`Hide reply for me`) 676 + : _(msg`Hide skeet for me`) 677 } 678 onPress={() => hidePromptControl.open()}> 679 <Menu.ItemText> 680 {isReply 681 ? _(msg`Hide reply for me`) 682 + : _(msg`Hide skeet for me`)} 683 </Menu.ItemText> 684 <Menu.ItemIcon icon={EyeSlash} position="right" /> 685 </Menu.Item> ··· 781 782 <Menu.Item 783 testID="postDropdownReportBtn" 784 + label={_(msg`Report skeet`)} 785 onPress={() => reportDialogControl.open()}> 786 + <Menu.ItemText>{_(msg`Report skeet`)}</Menu.ItemText> 787 <Menu.ItemIcon icon={Warning} position="right" /> 788 </Menu.Item> 789 </> ··· 814 testID="postDropdownDeleteBtn" 815 label={_(msg`Delete post`)} 816 onPress={() => deletePromptControl.open()}> 817 + <Menu.ItemText>{_(msg`Delete skeet`)}</Menu.ItemText> 818 <Menu.ItemIcon icon={Trash} position="right" /> 819 </Menu.Item> 820 </> ··· 826 827 <Prompt.Basic 828 control={deletePromptControl} 829 + title={_(msg`Delete this skeet?`)} 830 description={_( 831 + msg`If you remove this skeet, you won't be able to recover it.`, 832 )} 833 onConfirm={onDeletePost} 834 confirmButtonCta={_(msg`Delete`)} ··· 837 838 <Prompt.Basic 839 control={hidePromptControl} 840 + title={isReply ? _(msg`Hide this reply?`) : _(msg`Hide this skeet?`)} 841 description={_( 842 + msg`This skeet will be hidden from feeds and threads. This cannot be undone.`, 843 )} 844 onConfirm={onHidePost} 845 confirmButtonCta={_(msg`Hide`)} ··· 862 863 <Prompt.Basic 864 control={quotePostDetachConfirmControl} 865 + title={_(msg`Detach quote skeet?`)} 866 description={_( 867 + msg`This will remove your skeet from this quote skeet for all users, and replace it with a placeholder.`, 868 )} 869 onConfirm={onToggleQuotePostAttachment} 870 confirmButtonCta={_(msg`Yes, detach`)}
+1 -1
src/components/PostControls/PostMenu/index.tsx
··· 61 return ( 62 <EventStopper onKeyDown={false}> 63 <Menu.Root control={lazyMenuControl}> 64 - <Menu.Trigger label={_(msg`Open post options menu`)}> 65 {({props}) => { 66 return ( 67 <PostControlButton
··· 61 return ( 62 <EventStopper onKeyDown={false}> 63 <Menu.Root control={lazyMenuControl}> 64 + <Menu.Trigger label={_(msg`Open skeet options menu`)}> 65 {({props}) => { 66 return ( 67 <PostControlButton
+10 -10
src/components/PostControls/RepostButton.tsx
··· 142 const onPressClose = useCallback(() => control.close(), [control]) 143 144 return ( 145 - <Dialog.ScrollableInner label={_(msg`Repost or quote post`)}> 146 <View style={a.gap_xl}> 147 <View style={a.gap_xs}> 148 <Button 149 style={[a.justify_start, a.px_md, a.gap_sm]} 150 label={ 151 isReposted 152 - ? _(msg`Remove repost`) 153 - : _(msg({message: `Repost`, context: 'action'})) 154 } 155 onPress={onPressRepost} 156 size="large" ··· 159 <Repost size="lg" fill={t.palette.primary_500} /> 160 <Text style={[a.font_semi_bold, a.text_xl]}> 161 {isReposted ? ( 162 - <Trans>Remove repost</Trans> 163 ) : ( 164 - <Trans context="action">Repost</Trans> 165 )} 166 </Text> 167 </Button> ··· 171 style={[a.justify_start, a.px_md, a.gap_sm]} 172 label={ 173 embeddingDisabled 174 - ? _(msg`Quote posts disabled`) 175 - : _(msg`Quote post`) 176 } 177 onPress={onPressQuote} 178 size="large" ··· 193 embeddingDisabled && t.atoms.text_contrast_low, 194 ]}> 195 {embeddingDisabled ? ( 196 - <Trans>Quote posts disabled</Trans> 197 ) : ( 198 - <Trans>Quote post</Trans> 199 )} 200 </Text> 201 </Button> 202 </View> 203 <Button 204 - label={_(msg`Cancel quote post`)} 205 onPress={onPressClose} 206 size="large" 207 color="secondary">
··· 142 const onPressClose = useCallback(() => control.close(), [control]) 143 144 return ( 145 + <Dialog.ScrollableInner label={_(msg`Reskeet or quote skeet`)}> 146 <View style={a.gap_xl}> 147 <View style={a.gap_xs}> 148 <Button 149 style={[a.justify_start, a.px_md, a.gap_sm]} 150 label={ 151 isReposted 152 + ? _(msg`Remove reskeet`) 153 + : _(msg({message: `Reskeet`, context: 'action'})) 154 } 155 onPress={onPressRepost} 156 size="large" ··· 159 <Repost size="lg" fill={t.palette.primary_500} /> 160 <Text style={[a.font_semi_bold, a.text_xl]}> 161 {isReposted ? ( 162 + <Trans>Remove reskeet</Trans> 163 ) : ( 164 + <Trans context="action">Reskeet</Trans> 165 )} 166 </Text> 167 </Button> ··· 171 style={[a.justify_start, a.px_md, a.gap_sm]} 172 label={ 173 embeddingDisabled 174 + ? _(msg`Quote skeets disabled`) 175 + : _(msg`Quote skeet`) 176 } 177 onPress={onPressQuote} 178 size="large" ··· 193 embeddingDisabled && t.atoms.text_contrast_low, 194 ]}> 195 {embeddingDisabled ? ( 196 + <Trans>Quote skeets disabled</Trans> 197 ) : ( 198 + <Trans>Quote skeet</Trans> 199 )} 200 </Text> 201 </Button> 202 </View> 203 <Button 204 + label={_(msg`Cancel quote skeet`)} 205 onPress={onPressClose} 206 size="large" 207 color="secondary">
+9 -9
src/components/PostControls/RepostButton.web.tsx
··· 65 <Menu.Item 66 label={ 67 isReposted 68 - ? _(msg`Undo repost`) 69 - : _(msg({message: `Repost`, context: `action`})) 70 } 71 testID="repostDropdownRepostBtn" 72 onPress={onRepost}> 73 <Menu.ItemText> 74 {isReposted 75 - ? _(msg`Undo repost`) 76 - : _(msg({message: `Repost`, context: `action`}))} 77 </Menu.ItemText> 78 <Menu.ItemIcon icon={Repost} position="right" /> 79 </Menu.Item> ··· 81 disabled={embeddingDisabled} 82 label={ 83 embeddingDisabled 84 - ? _(msg`Quote posts disabled`) 85 - : _(msg`Quote post`) 86 } 87 testID="repostDropdownQuoteBtn" 88 onPress={onQuote}> 89 <Menu.ItemText> 90 {embeddingDisabled 91 - ? _(msg`Quote posts disabled`) 92 - : _(msg`Quote post`)} 93 </Menu.ItemText> 94 <Menu.ItemIcon icon={Quote} position="right" /> 95 </Menu.Item> ··· 101 onPress={() => requireAuth(() => {})} 102 active={isReposted} 103 activeColor={t.palette.positive_500} 104 - label={_(msg`Repost or quote post`)} 105 big={big}> 106 <PostControlButtonIcon icon={Repost} /> 107 {typeof repostCount !== 'undefined' && repostCount > 0 && (
··· 65 <Menu.Item 66 label={ 67 isReposted 68 + ? _(msg`Undo reskeet`) 69 + : _(msg({message: `Reskeet`, context: `action`})) 70 } 71 testID="repostDropdownRepostBtn" 72 onPress={onRepost}> 73 <Menu.ItemText> 74 {isReposted 75 + ? _(msg`Undo reskeet`) 76 + : _(msg({message: `Reskeet`, context: `action`}))} 77 </Menu.ItemText> 78 <Menu.ItemIcon icon={Repost} position="right" /> 79 </Menu.Item> ··· 81 disabled={embeddingDisabled} 82 label={ 83 embeddingDisabled 84 + ? _(msg`Quote skeets disabled`) 85 + : _(msg`Quote skeet`) 86 } 87 testID="repostDropdownQuoteBtn" 88 onPress={onQuote}> 89 <Menu.ItemText> 90 {embeddingDisabled 91 + ? _(msg`Quote skeets disabled`) 92 + : _(msg`Quote skeet`)} 93 </Menu.ItemText> 94 <Menu.ItemIcon icon={Quote} position="right" /> 95 </Menu.Item> ··· 101 onPress={() => requireAuth(() => {})} 102 active={isReposted} 103 activeColor={t.palette.positive_500} 104 + label={_(msg`Reskeet or quote skeet`)} 105 big={big}> 106 <PostControlButtonIcon icon={Repost} /> 107 {typeof repostCount !== 'undefined' && repostCount > 0 && (
+1 -1
src/components/PostControls/ShareMenu/RecentChats.tsx
··· 118 return ( 119 <Button 120 onPress={onPress} 121 - label={_(msg`Send post to ${name}`)} 122 style={[ 123 a.flex_col, 124 {width: WIDTH},
··· 118 return ( 119 <Button 120 onPress={onPress} 121 + label={_(msg`Send skeet to ${name}`)} 122 style={[ 123 a.flex_col, 124 {width: WIDTH},
+5 -5
src/components/PostControls/ShareMenu/ShareMenuItems.tsx
··· 157 label={_(msg`Open original post`)} 158 onPress={onOpenOriginalPost}> 159 <Menu.ItemText> 160 - <Trans>Open original post</Trans> 161 </Menu.ItemText> 162 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 163 </Menu.Item> ··· 168 label={_(msg`Open post in PDSls`)} 169 onPress={onOpenPostInPdsls}> 170 <Menu.ItemText> 171 - <Trans>Open post in PDSls</Trans> 172 </Menu.ItemText> 173 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 174 </Menu.Item> ··· 201 label={_(msg`Copy link to post`)} 202 onPress={onCopyLink}> 203 <Menu.ItemText> 204 - <Trans>Copy link to post</Trans> 205 </Menu.ItemText> 206 <Menu.ItemIcon icon={ChainLinkIcon} position="right" /> 207 </Menu.Item> ··· 223 <Admonition 224 type="warning" 225 style={[a.flex_1, a.border_0, a.p_0, a.bg_transparent]}> 226 - <Trans>This post is only visible to logged-in users.</Trans> 227 </Admonition> 228 </Menu.ContainerItem> 229 </Menu.Group> ··· 236 label={_(msg`Share post at:// URI`)} 237 onPress={onShareATURI}> 238 <Menu.ItemText> 239 - <Trans>Share post at:// URI</Trans> 240 </Menu.ItemText> 241 <Menu.ItemIcon icon={ClipboardIcon} position="right" /> 242 </Menu.Item>
··· 157 label={_(msg`Open original post`)} 158 onPress={onOpenOriginalPost}> 159 <Menu.ItemText> 160 + <Trans>Open original skeet</Trans> 161 </Menu.ItemText> 162 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 163 </Menu.Item> ··· 168 label={_(msg`Open post in PDSls`)} 169 onPress={onOpenPostInPdsls}> 170 <Menu.ItemText> 171 + <Trans>Open skeet in PDSls</Trans> 172 </Menu.ItemText> 173 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 174 </Menu.Item> ··· 201 label={_(msg`Copy link to post`)} 202 onPress={onCopyLink}> 203 <Menu.ItemText> 204 + <Trans>Copy link to skeet</Trans> 205 </Menu.ItemText> 206 <Menu.ItemIcon icon={ChainLinkIcon} position="right" /> 207 </Menu.Item> ··· 223 <Admonition 224 type="warning" 225 style={[a.flex_1, a.border_0, a.p_0, a.bg_transparent]}> 226 + <Trans>This skeet is only visible to logged-in users.</Trans> 227 </Admonition> 228 </Menu.ContainerItem> 229 </Menu.Group> ··· 236 label={_(msg`Share post at:// URI`)} 237 onPress={onShareATURI}> 238 <Menu.ItemText> 239 + <Trans>Share skeet at:// URI</Trans> 240 </Menu.ItemText> 241 <Menu.ItemIcon icon={ClipboardIcon} position="right" /> 242 </Menu.Item>
+6 -6
src/components/PostControls/ShareMenu/ShareMenuItems.web.tsx
··· 112 label={_(msg`Copy link to post`)} 113 onPress={onCopyLink}> 114 <Menu.ItemText> 115 - <Trans>Copy link to post</Trans> 116 </Menu.ItemText> 117 <Menu.ItemIcon icon={ChainLinkIcon} position="right" /> 118 </Menu.Item> ··· 139 label={_(msg`Open original post`)} 140 onPress={onOpenOriginalPost}> 141 <Menu.ItemText> 142 - <Trans>Open original post</Trans> 143 </Menu.ItemText> 144 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 145 </Menu.Item> ··· 151 label={_(msg`Open post in PDSls`)} 152 onPress={onOpenPostInPdsls}> 153 <Menu.ItemText> 154 - <Trans>Open post in PDSls</Trans> 155 </Menu.ItemText> 156 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 157 </Menu.Item> ··· 180 logger.metric('share:press:embed', {}, {statsig: true}) 181 embedPostControl.open() 182 }}> 183 - <Menu.ItemText>{_(msg`Embed post`)}</Menu.ItemText> 184 <Menu.ItemIcon icon={CodeBracketsIcon} position="right" /> 185 </Menu.Item> 186 )} ··· 190 {hasSession && <Menu.Divider />} 191 {copyLinkItem} 192 <Menu.LabelText style={{maxWidth: 220}}> 193 - <Trans>Note: This post is only visible to logged-in users.</Trans> 194 </Menu.LabelText> 195 </> 196 )} ··· 203 label={_(msg`Copy post at:// URI`)} 204 onPress={onShareATURI}> 205 <Menu.ItemText> 206 - <Trans>Copy post at:// URI</Trans> 207 </Menu.ItemText> 208 <Menu.ItemIcon icon={ClipboardIcon} position="right" /> 209 </Menu.Item>
··· 112 label={_(msg`Copy link to post`)} 113 onPress={onCopyLink}> 114 <Menu.ItemText> 115 + <Trans>Copy link to skeet</Trans> 116 </Menu.ItemText> 117 <Menu.ItemIcon icon={ChainLinkIcon} position="right" /> 118 </Menu.Item> ··· 139 label={_(msg`Open original post`)} 140 onPress={onOpenOriginalPost}> 141 <Menu.ItemText> 142 + <Trans>Open original skeet</Trans> 143 </Menu.ItemText> 144 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 145 </Menu.Item> ··· 151 label={_(msg`Open post in PDSls`)} 152 onPress={onOpenPostInPdsls}> 153 <Menu.ItemText> 154 + <Trans>Open skeet in PDSls</Trans> 155 </Menu.ItemText> 156 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 157 </Menu.Item> ··· 180 logger.metric('share:press:embed', {}, {statsig: true}) 181 embedPostControl.open() 182 }}> 183 + <Menu.ItemText>{_(msg`Embed skeet`)}</Menu.ItemText> 184 <Menu.ItemIcon icon={CodeBracketsIcon} position="right" /> 185 </Menu.Item> 186 )} ··· 190 {hasSession && <Menu.Divider />} 191 {copyLinkItem} 192 <Menu.LabelText style={{maxWidth: 220}}> 193 + <Trans>Note: This skeet is only visible to logged-in users.</Trans> 194 </Menu.LabelText> 195 </> 196 )} ··· 203 label={_(msg`Copy post at:// URI`)} 204 onPress={onShareATURI}> 205 <Menu.ItemText> 206 + <Trans>Copy skeet at:// URI</Trans> 207 </Menu.ItemText> 208 <Menu.ItemIcon icon={ClipboardIcon} position="right" /> 209 </Menu.Item>
+1 -1
src/components/ProgressGuide/List.tsx
··· 60 <ProgressGuideTask 61 current={guide.numLikes + 1} 62 total={10 + 1} 63 - title={_(msg`Like 10 posts`)} 64 subtitle={_(msg`Teach our algorithm what you like`)} 65 /> 66 <ProgressGuideTask
··· 60 <ProgressGuideTask 61 current={guide.numLikes + 1} 62 total={10 + 1} 63 + title={_(msg`Like 10 skeets`)} 64 subtitle={_(msg`Teach our algorithm what you like`)} 65 /> 66 <ProgressGuideTask
+4 -4
src/components/RichTextTag.tsx
··· 109 <Menu.Outer> 110 <Menu.Group> 111 <Menu.Item 112 - label={_(msg`See ${tag} posts`)} 113 onPress={() => { 114 navigation.push('Hashtag', { 115 tag: encodeURIComponent(tag), 116 }) 117 }}> 118 <Menu.ItemText> 119 - <Trans>See #{tag} posts</Trans> 120 </Menu.ItemText> 121 <Menu.ItemIcon icon={Search} /> 122 </Menu.Item> 123 {authorHandle && !isInvalidHandle(authorHandle) && ( 124 <Menu.Item 125 - label={_(msg`See ${tag} posts by user`)} 126 onPress={() => { 127 navigation.push('Hashtag', { 128 tag: encodeURIComponent(tag), ··· 130 }) 131 }}> 132 <Menu.ItemText> 133 - <Trans>See #{tag} posts by user</Trans> 134 </Menu.ItemText> 135 <Menu.ItemIcon icon={Person} /> 136 </Menu.Item>
··· 109 <Menu.Outer> 110 <Menu.Group> 111 <Menu.Item 112 + label={_(msg`See ${tag} skeets`)} 113 onPress={() => { 114 navigation.push('Hashtag', { 115 tag: encodeURIComponent(tag), 116 }) 117 }}> 118 <Menu.ItemText> 119 + <Trans>See #{tag} skeets</Trans> 120 </Menu.ItemText> 121 <Menu.ItemIcon icon={Search} /> 122 </Menu.Item> 123 {authorHandle && !isInvalidHandle(authorHandle) && ( 124 <Menu.Item 125 + label={_(msg`See ${tag} skeets by user`)} 126 onPress={() => { 127 navigation.push('Hashtag', { 128 tag: encodeURIComponent(tag), ··· 130 }) 131 }}> 132 <Menu.ItemText> 133 + <Trans>See #{tag} skeets by user</Trans> 134 </Menu.ItemText> 135 <Menu.ItemIcon icon={Person} /> 136 </Menu.Item>
+2 -2
src/components/TrendingTopics.tsx
··· 175 if (link.startsWith('/search')) { 176 return { 177 type: 'topic', 178 - label: _(msg`Browse posts about ${displayName}`), 179 displayName, 180 uri: undefined, 181 url: link, ··· 183 } else if (link.startsWith('/hashtag')) { 184 return { 185 type: 'tag', 186 - label: _(msg`Browse posts tagged with ${displayName}`), 187 displayName, 188 // displayName: displayName.replace(/^#/, ''), 189 uri: undefined,
··· 175 if (link.startsWith('/search')) { 176 return { 177 type: 'topic', 178 + label: _(msg`Browse skeets about ${displayName}`), 179 displayName, 180 uri: undefined, 181 url: link, ··· 183 } else if (link.startsWith('/hashtag')) { 184 return { 185 type: 'tag', 186 + label: _(msg`Browse skeets tagged with ${displayName}`), 187 displayName, 188 // displayName: displayName.replace(/^#/, ''), 189 uri: undefined,
+5 -5
src/components/WhoCanReply.tsx
··· 221 style={web({maxWidth: 400})}> 222 <View style={[a.gap_sm]}> 223 <Text style={[a.font_semi_bold, a.text_xl, a.pb_sm]}> 224 - <Trans>Who can interact with this post?</Trans> 225 </Text> 226 <Rules 227 post={post} ··· 270 ]}> 271 {settings.length === 0 ? ( 272 <Trans> 273 - This post has an unknown type of threadgate on it. Your app may be 274 out of date. 275 </Trans> 276 ) : settings[0].type === 'everybody' ? ( 277 - <Trans>Everybody can reply to this post.</Trans> 278 ) : settings[0].type === 'nobody' ? ( 279 - <Trans>Replies to this post are disabled.</Trans> 280 ) : ( 281 <Trans> 282 Only{' '} ··· 298 a.flex_wrap, 299 t.atoms.text_contrast_medium, 300 ]}> 301 - <Trans>No one but the author can quote this post.</Trans> 302 </Text> 303 )} 304 </>
··· 221 style={web({maxWidth: 400})}> 222 <View style={[a.gap_sm]}> 223 <Text style={[a.font_semi_bold, a.text_xl, a.pb_sm]}> 224 + <Trans>Who can interact with this skeet?</Trans> 225 </Text> 226 <Rules 227 post={post} ··· 270 ]}> 271 {settings.length === 0 ? ( 272 <Trans> 273 + This skeet has an unknown type of threadgate on it. Your app may be 274 out of date. 275 </Trans> 276 ) : settings[0].type === 'everybody' ? ( 277 + <Trans>Everybody can reply to this skeet.</Trans> 278 ) : settings[0].type === 'nobody' ? ( 279 + <Trans>Replies to this skeet are disabled.</Trans> 280 ) : ( 281 <Trans> 282 Only{' '} ··· 298 a.flex_wrap, 299 t.atoms.text_contrast_medium, 300 ]}> 301 + <Trans>No one but the author can quote this skeet.</Trans> 302 </Text> 303 )} 304 </>
+3 -3
src/components/activity-notifications/SubscribeProfileButton.tsx
··· 54 const wrappedOnPress = requireEmailVerification(onPress, { 55 instructions: [ 56 <Trans key="message"> 57 - Before you can get notifications for {name}'s posts, you must first 58 verify your email. 59 </Trans>, 60 ], ··· 79 size="small" 80 color="secondary" 81 shape="round" 82 - label={_(msg`Get notified when ${name} posts`)} 83 onPress={wrappedOnPress}> 84 <ButtonIcon icon={Icon} size="md" /> 85 </Button> 86 </Tooltip.Target> 87 <Tooltip.TextBubble> 88 <Text> 89 - <Trans>Get notified about new posts</Trans> 90 </Text> 91 </Tooltip.TextBubble> 92 </Tooltip.Outer>
··· 54 const wrappedOnPress = requireEmailVerification(onPress, { 55 instructions: [ 56 <Trans key="message"> 57 + Before you can get notifications for {name}'s skeets, you must first 58 verify your email. 59 </Trans>, 60 ], ··· 79 size="small" 80 color="secondary" 81 shape="round" 82 + label={_(msg`Get notified when ${name} skeets`)} 83 onPress={wrappedOnPress}> 84 <ButtonIcon icon={Icon} size="md" /> 85 </Button> 86 </Tooltip.Target> 87 <Tooltip.TextBubble> 88 <Text> 89 + <Trans>Get notified about new skeets</Trans> 90 </Text> 91 </Tooltip.TextBubble> 92 </Tooltip.Outer>
+3 -3
src/components/activity-notifications/SubscribeProfileDialog.tsx
··· 216 return ( 217 <Dialog.ScrollableInner 218 style={web({maxWidth: 400})} 219 - label={_(msg`Get notified of new posts from ${name}`)}> 220 <View style={[a.gap_lg]}> 221 <View style={[a.gap_xs]}> 222 <Text style={[a.font_bold, a.text_2xl]}> ··· 247 onChange={onChange}> 248 <View style={[a.gap_sm]}> 249 <Toggle.Item 250 - label={_(msg`Posts`)} 251 name="post" 252 style={[ 253 a.flex_1, ··· 259 ]}> 260 <Toggle.LabelText 261 style={[t.atoms.text, a.font_normal, a.text_md, a.flex_1]}> 262 - <Trans>Posts</Trans> 263 </Toggle.LabelText> 264 <Toggle.Switch /> 265 </Toggle.Item>
··· 216 return ( 217 <Dialog.ScrollableInner 218 style={web({maxWidth: 400})} 219 + label={_(msg`Get notified of new skeets from ${name}`)}> 220 <View style={[a.gap_lg]}> 221 <View style={[a.gap_xs]}> 222 <Text style={[a.font_bold, a.text_2xl]}> ··· 247 onChange={onChange}> 248 <View style={[a.gap_sm]}> 249 <Toggle.Item 250 + label={_(msg`Skeets`)} 251 name="post" 252 style={[ 253 a.flex_1, ··· 259 ]}> 260 <Toggle.LabelText 261 style={[t.atoms.text, a.font_normal, a.text_md, a.flex_1]}> 262 + <Trans>Skeets</Trans> 263 </Toggle.LabelText> 264 <Toggle.Switch /> 265 </Toggle.Item>
+2 -2
src/components/dialogs/Embed.tsx
··· 105 <View style={[a.gap_lg]}> 106 <View style={[a.gap_sm]}> 107 <Text style={[a.text_2xl, a.font_bold]}> 108 - <Trans>Embed post</Trans> 109 </Text> 110 <Text 111 style={[a.text_md, t.atoms.text_contrast_medium, a.leading_normal]}> 112 <Trans> 113 - Embed this post in your website. Simply copy the following snippet 114 and paste it into the HTML code of your website. 115 </Trans> 116 </Text>
··· 105 <View style={[a.gap_lg]}> 106 <View style={[a.gap_sm]}> 107 <Text style={[a.text_2xl, a.font_bold]}> 108 + <Trans>Embed skeet</Trans> 109 </Text> 110 <Text 111 style={[a.text_md, t.atoms.text_contrast_medium, a.leading_normal]}> 112 <Trans> 113 + Embed this skeet in your website. Simply copy the following snippet 114 and paste it into the HTML code of your website. 115 </Trans> 116 </Text>
+4 -4
src/components/dialogs/MutedWords.tsx
··· 118 </Text> 119 <Text style={[a.pb_lg, a.leading_snug, t.atoms.text_contrast_medium]}> 120 <Trans> 121 - Posts can be muted based on their text, their tags, or both. We 122 - recommend avoiding common words that appear in many posts, since it 123 - can result in no posts being shown. 124 </Trans> 125 </Text> 126 ··· 260 261 <View style={[a.flex_row, a.align_center, a.gap_sm, a.flex_wrap]}> 262 <Toggle.Item 263 - label={_(msg`Mute this word in post text and tags`)} 264 name="content" 265 style={[a.flex_1]}> 266 <TargetToggle>
··· 118 </Text> 119 <Text style={[a.pb_lg, a.leading_snug, t.atoms.text_contrast_medium]}> 120 <Trans> 121 + Skeets can be muted based on their text, their tags, or both. We 122 + recommend avoiding common words that appear in many skeets, since it 123 + can result in no skeets being shown. 124 </Trans> 125 </Text> 126 ··· 260 261 <View style={[a.flex_row, a.align_center, a.gap_sm, a.flex_wrap]}> 262 <Toggle.Item 263 + label={_(msg`Mute this word in skeet text and tags`)} 264 name="content" 265 style={[a.flex_1]}> 266 <TargetToggle>
+4 -4
src/components/dialogs/PostInteractionSettingsDialog.tsx
··· 257 258 return ( 259 <Dialog.ScrollableInner 260 - label={_(msg`Edit post interaction settings`)} 261 style={[web({maxWidth: 400}), a.w_full]}> 262 {isLoading ? ( 263 <View ··· 270 ]}> 271 <Loader size="xl" /> 272 <Text style={[a.italic, a.text_center]}> 273 - <Trans>Loading post interaction settings...</Trans> 274 </Text> 275 </View> 276 ) : ( ··· 627 {({selected}) => ( 628 <Toggle.Panel active={selected}> 629 <Toggle.PanelText icon={QuoteIcon}> 630 - <Trans>Allow quote posts</Trans> 631 </Toggle.PanelText> 632 <Toggle.Switch /> 633 </Toggle.Panel> ··· 676 return ( 677 <View style={[a.pb_lg]}> 678 <Text style={[a.text_2xl, a.font_bold]}> 679 - <Trans>Post interaction settings</Trans> 680 </Text> 681 </View> 682 )
··· 257 258 return ( 259 <Dialog.ScrollableInner 260 + label={_(msg`Edit skeet interaction settings`)} 261 style={[web({maxWidth: 400}), a.w_full]}> 262 {isLoading ? ( 263 <View ··· 270 ]}> 271 <Loader size="xl" /> 272 <Text style={[a.italic, a.text_center]}> 273 + <Trans>Loading skeet interaction settings...</Trans> 274 </Text> 275 </View> 276 ) : ( ··· 627 {({selected}) => ( 628 <Toggle.Panel active={selected}> 629 <Toggle.PanelText icon={QuoteIcon}> 630 + <Trans>Allow quote skeets</Trans> 631 </Toggle.PanelText> 632 <Toggle.Switch /> 633 </Toggle.Panel> ··· 676 return ( 677 <View style={[a.pb_lg]}> 678 <Text style={[a.text_2xl, a.font_bold]}> 679 + <Trans>Skeet interaction settings</Trans> 680 </Text> 681 </View> 682 )
+2 -2
src/components/dialogs/lists/CreateOrEditListDialog.tsx
··· 350 : _(msg`Create moderation list`) 351 352 const displayNamePlaceholder = isCurateList 353 - ? _(msg`e.g. Great Posters`) 354 : _(msg`e.g. Spammers`) 355 356 const descriptionPlaceholder = isCurateList 357 - ? _(msg`e.g. The posters who never miss.`) 358 : _(msg`e.g. Users that repeatedly reply with ads.`) 359 360 return (
··· 350 : _(msg`Create moderation list`) 351 352 const displayNamePlaceholder = isCurateList 353 + ? _(msg`e.g. Great Skeeters`) 354 : _(msg`e.g. Spammers`) 355 356 const descriptionPlaceholder = isCurateList 357 + ? _(msg`e.g. The skeeters who never miss.`) 358 : _(msg`e.g. Users that repeatedly reply with ads.`) 359 360 return (
+3 -3
src/components/dialogs/nuxs/BookmarksAnnouncement.tsx
··· 34 <Dialog.Handle /> 35 36 <Dialog.ScrollableInner 37 - label={_(msg`Introducing saved posts AKA bookmarks`)} 38 style={[web({maxWidth: 440})]} 39 contentContainerStyle={[ 40 { ··· 140 maxWidth: 300, 141 }, 142 ]}> 143 - <Trans>Saved Posts</Trans> 144 </Text> 145 <Text 146 style={[ ··· 152 }, 153 ]}> 154 <Trans> 155 - Finally! Keep track of posts that matter to you. Save them to 156 revisit anytime. 157 </Trans> 158 </Text>
··· 34 <Dialog.Handle /> 35 36 <Dialog.ScrollableInner 37 + label={_(msg`Introducing saved skeets AKA bookmarks`)} 38 style={[web({maxWidth: 440})]} 39 contentContainerStyle={[ 40 { ··· 140 maxWidth: 300, 141 }, 142 ]}> 143 + <Trans>Saved Skeets</Trans> 144 </Text> 145 <Text 146 style={[ ··· 152 }, 153 ]}> 154 <Trans> 155 + Finally! Keep track of skeets that matter to you. Save them to 156 revisit anytime. 157 </Trans> 158 </Text>
+3 -3
src/components/dms/ChatEmptyPill.tsx
··· 30 31 const prompts = React.useMemo(() => { 32 return [ 33 - _(msg`Say hello!`), 34 _(msg`Share your favorite feed!`), 35 - _(msg`Tell a joke!`), 36 _(msg`Share a fun fact!`), 37 _(msg`Share a cool story!`), 38 _(msg`Send a neat website!`), 39 - _(msg`Clip 🐴 clop 🐴`), 40 ] 41 }, [_]) 42
··· 30 31 const prompts = React.useMemo(() => { 32 return [ 33 + _(msg`Say hi!`), 34 _(msg`Share your favorite feed!`), 35 + _(msg`Say something funny!`), 36 _(msg`Share a fun fact!`), 37 _(msg`Share a cool story!`), 38 _(msg`Send a neat website!`), 39 + _(msg`Clip 🐴 clop 🐴 #horsefacts`), 40 ] 41 }, [_]) 42
+1 -1
src/components/dms/dialogs/ShareViaChatDialog.tsx
··· 59 60 return ( 61 <SearchablePeopleList 62 - title={_(msg`Send post to...`)} 63 onSelectChat={onCreateChat} 64 showRecentConvos 65 sortByMessageDeclaration
··· 59 60 return ( 61 <SearchablePeopleList 62 + title={_(msg`Send skeet to...`)} 63 onSelectChat={onCreateChat} 64 showRecentConvos 65 sortByMessageDeclaration
+4 -4
src/components/moderation/ModerationDetailsDialog.tsx
··· 106 description = _(msg`You have muted this account.`) 107 } 108 } else if (modcause.type === 'mute-word') { 109 - name = _(msg`Post Hidden by Muted Word`) 110 - description = _(msg`You've chosen to hide a word or tag within this post.`) 111 } else if (modcause.type === 'hidden') { 112 - name = _(msg`Post Hidden by You`) 113 - description = _(msg`You have hidden this post.`) 114 } else if (modcause.type === 'reply-hidden') { 115 const isYou = currentAccount?.did === modcause.source.did 116 name = isYou
··· 106 description = _(msg`You have muted this account.`) 107 } 108 } else if (modcause.type === 'mute-word') { 109 + name = _(msg`Skeet Hidden by Muted Word`) 110 + description = _(msg`You've chosen to hide a word or tag within this skeet.`) 111 } else if (modcause.type === 'hidden') { 112 + name = _(msg`Skeet Hidden by You`) 113 + description = _(msg`You have hidden this skeet.`) 114 } else if (modcause.type === 'reply-hidden') { 115 const isYou = currentAccount?.did === modcause.source.did 116 name = isYou
+2 -2
src/components/moderation/ReportDialog/copy.ts
··· 16 } 17 case 'post': { 18 return { 19 - title: _(msg`Report this post`), 20 - subtitle: _(msg`Why should this post be reviewed?`), 21 } 22 } 23 case 'list': {
··· 16 } 17 case 'post': { 18 return { 19 + title: _(msg`Report this skeet`), 20 + subtitle: _(msg`Why should this skeet be reviewed?`), 21 } 22 } 23 case 'list': {
+1 -1
src/lib/api/index.ts
··· 183 }) 184 if (isNetworkError(e)) { 185 throw new Error( 186 - t`Post failed to upload. Please check your Internet connection and try again.`, 187 ) 188 } else { 189 throw e
··· 183 }) 184 if (isNetworkError(e)) { 185 throw new Error( 186 + t`Skeet failed to upload. Please check your Internet connection and try again.`, 187 ) 188 } else { 189 throw e
+3 -3
src/lib/hooks/useNotificationHandler.ts
··· 130 Notifications.setNotificationChannelAsync( 131 'repost' satisfies NotificationReason, 132 { 133 - name: _(msg`Reposts`), 134 importance: Notifications.AndroidImportance.HIGH, 135 }, 136 ) ··· 165 Notifications.setNotificationChannelAsync( 166 'like-via-repost' satisfies NotificationReason, 167 { 168 - name: _(msg`Likes of your reposts`), 169 importance: Notifications.AndroidImportance.HIGH, 170 }, 171 ) 172 Notifications.setNotificationChannelAsync( 173 'repost-via-repost' satisfies NotificationReason, 174 { 175 - name: _(msg`Reposts of your reposts`), 176 importance: Notifications.AndroidImportance.HIGH, 177 }, 178 )
··· 130 Notifications.setNotificationChannelAsync( 131 'repost' satisfies NotificationReason, 132 { 133 + name: _(msg`Reskeets`), 134 importance: Notifications.AndroidImportance.HIGH, 135 }, 136 ) ··· 165 Notifications.setNotificationChannelAsync( 166 'like-via-repost' satisfies NotificationReason, 167 { 168 + name: _(msg`Likes of your reskeets`), 169 importance: Notifications.AndroidImportance.HIGH, 170 }, 171 ) 172 Notifications.setNotificationChannelAsync( 173 'repost-via-repost' satisfies NotificationReason, 174 { 175 + name: _(msg`Reskeets of your reskeets`), 176 importance: Notifications.AndroidImportance.HIGH, 177 }, 178 )
+4 -4
src/lib/moderation/useModerationCauseDescription.ts
··· 104 if (cause.type === 'mute-word') { 105 return { 106 icon: EyeSlash, 107 - name: _(msg`Post Hidden by Muted Word`), 108 description: _( 109 - msg`You've chosen to hide a word or tag within this post.`, 110 ), 111 } 112 } 113 if (cause.type === 'hidden') { 114 return { 115 icon: EyeSlash, 116 - name: _(msg`Post Hidden by You`), 117 - description: _(msg`You have hidden this post`), 118 } 119 } 120 if (cause.type === 'reply-hidden') {
··· 104 if (cause.type === 'mute-word') { 105 return { 106 icon: EyeSlash, 107 + name: _(msg`Skeet Hidden by Muted Word`), 108 description: _( 109 + msg`You've chosen to hide a word or tag within this skeet.`, 110 ), 111 } 112 } 113 if (cause.type === 'hidden') { 114 return { 115 icon: EyeSlash, 116 + name: _(msg`Skeet Hidden by You`), 117 + description: _(msg`You have hidden this skeet.`), 118 } 119 } 120 if (cause.type === 'reply-hidden') {
+1 -1
src/locale/locales/en/messages.po
··· 10519 #: src/view/com/auth/SplashScreen.web.tsx:103 10520 #: src/view/com/composer/Composer.tsx:855 10521 msgid "What's up?" 10522 - msgstr "Skeet yo shit! 🗣️" 10523 10524 #: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:146 10525 msgid "When you tap on a check, you’ll see which organizations have granted verification."
··· 10519 #: src/view/com/auth/SplashScreen.web.tsx:103 10520 #: src/view/com/composer/Composer.tsx:855 10521 msgid "What's up?" 10522 + msgstr "" 10523 10524 #: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:146 10525 msgid "When you tap on a check, you’ll see which organizations have granted verification."
+4 -4
src/screens/Bookmarks/index.tsx
··· 52 <Layout.Header.BackButton /> 53 <Layout.Header.Content> 54 <Layout.Header.TitleText> 55 - <Trans>Saved Posts</Trans> 56 </Layout.Header.TitleText> 57 </Layout.Header.Content> 58 <Layout.Header.Slot /> ··· 204 const remove = async () => { 205 try { 206 await bookmark({action: 'delete', uri: post.uri}) 207 - toast.show(_(msg`Removed from saved posts`), { 208 type: 'info', 209 }) 210 } catch (e: any) { ··· 242 a.italic, 243 t.atoms.text_contrast_medium, 244 ]}> 245 - <Trans>This post was deleted by its author</Trans> 246 </Text> 247 </View> 248 <Button 249 - label={_(msg`Remove from saved posts`)} 250 size="tiny" 251 color="secondary" 252 onPress={remove}>
··· 52 <Layout.Header.BackButton /> 53 <Layout.Header.Content> 54 <Layout.Header.TitleText> 55 + <Trans>Saved Skeets</Trans> 56 </Layout.Header.TitleText> 57 </Layout.Header.Content> 58 <Layout.Header.Slot /> ··· 204 const remove = async () => { 205 try { 206 await bookmark({action: 'delete', uri: post.uri}) 207 + toast.show(_(msg`Removed from saved skeets`), { 208 type: 'info', 209 }) 210 } catch (e: any) { ··· 242 a.italic, 243 t.atoms.text_contrast_medium, 244 ]}> 245 + <Trans>This skeet was deleted by its author</Trans> 246 </Text> 247 </View> 248 <Button 249 + label={_(msg`Remove from saved skeets`)} 250 size="tiny" 251 color="secondary" 252 onPress={remove}>
+1 -1
src/screens/Moderation/index.tsx
··· 238 t.atoms.bg_contrast_25, 239 ]}> 240 <Link 241 - label={_(msg`View your default post interaction settings`)} 242 testID="interactionSettingsBtn" 243 to="/moderation/interaction-settings"> 244 {state => (
··· 238 t.atoms.bg_contrast_25, 239 ]}> 240 <Link 241 + label={_(msg`View your default skeet interaction settings`)} 242 testID="interactionSettingsBtn" 243 to="/moderation/interaction-settings"> 244 {state => (
+2 -2
src/screens/ModerationInteractionSettings/index.tsx
··· 31 <Layout.Header.BackButton /> 32 <Layout.Header.Content> 33 <Layout.Header.TitleText> 34 - <Trans>Post Interaction Settings</Trans> 35 </Layout.Header.TitleText> 36 </Layout.Header.Content> 37 <Layout.Header.Slot /> ··· 41 <Admonition type="tip"> 42 <Trans> 43 The following settings will be used as your defaults when creating 44 - new posts. You can edit these for a specific post from the 45 composer. 46 </Trans> 47 </Admonition>
··· 31 <Layout.Header.BackButton /> 32 <Layout.Header.Content> 33 <Layout.Header.TitleText> 34 + <Trans>Skeet Interaction Settings</Trans> 35 </Layout.Header.TitleText> 36 </Layout.Header.Content> 37 <Layout.Header.Slot /> ··· 41 <Admonition type="tip"> 42 <Trans> 43 The following settings will be used as your defaults when creating 44 + new skeets. You can edit these for a specific skeet from the 45 composer. 46 </Trans> 47 </Admonition>
+1 -1
src/screens/Notifications/ActivityList.tsx
··· 35 feed={`posts|${uris}`} 36 disablePoll 37 renderEmptyState={() => ( 38 - <EmptyState icon="growth" message={_(msg`No posts here`)} /> 39 )} 40 renderEndOfFeed={() => <ListFooter />} 41 />
··· 35 feed={`posts|${uris}`} 36 disablePoll 37 renderEmptyState={() => ( 38 + <EmptyState icon="growth" message={_(msg`No skeets here`)} /> 39 )} 40 renderEndOfFeed={() => <ListFooter />} 41 />
+3 -3
src/screens/Post/PostRepostedBy.tsx
··· 38 {post && ( 39 <> 40 <Layout.Header.TitleText> 41 - <Trans>Reposted By</Trans> 42 </Layout.Header.TitleText> 43 <Layout.Header.SubtitleText> 44 <Plural 45 value={quoteCount ?? 0} 46 - one="# repost" 47 - other="# reposts" 48 /> 49 </Layout.Header.SubtitleText> 50 </>
··· 38 {post && ( 39 <> 40 <Layout.Header.TitleText> 41 + <Trans>Reskeeted By</Trans> 42 </Layout.Header.TitleText> 43 <Layout.Header.SubtitleText> 44 <Plural 45 value={quoteCount ?? 0} 46 + one="# reskeet" 47 + other="# reskeets" 48 /> 49 </Layout.Header.SubtitleText> 50 </>
+2 -2
src/screens/PostThread/components/ThreadError.tsx
··· 23 const cleanError = useCleanError() 24 25 const {title, message} = useMemo(() => { 26 - let title = _(msg`Error loading post`) 27 let message = _(msg`Something went wrong. Please try again in a moment.`) 28 29 const {raw, clean} = cleanError(error) 30 31 if (error.message.startsWith('Post not found')) { 32 - title = _(msg`Post not found`) 33 message = clean || raw || message 34 } 35
··· 23 const cleanError = useCleanError() 24 25 const {title, message} = useMemo(() => { 26 + let title = _(msg`Error loading skeet`) 27 let message = _(msg`Something went wrong. Please try again in a moment.`) 28 29 const {raw, clean} = cleanError(error) 30 31 if (error.message.startsWith('Post not found')) { 32 + title = _(msg`Skeet not found`) 33 message = clean || raw || message 34 } 35
+8 -8
src/screens/PostThread/components/ThreadItemAnchor.tsx
··· 135 </View> 136 <Text 137 style={[a.text_md, a.font_semi_bold, t.atoms.text_contrast_medium]}> 138 - <Trans>Post has been deleted</Trans> 139 </Text> 140 </View> 141 </View> ··· 445 {post.repostCount != null && 446 post.repostCount !== 0 && 447 !disableRepostsMetrics ? ( 448 - <Link to={repostsHref} label={_(msg`Reposts of this post`)}> 449 <Text 450 testID="repostCount-expanded" 451 style={[a.text_md, t.atoms.text_contrast_medium]}> ··· 454 </Text>{' '} 455 <Plural 456 value={post.repostCount} 457 - one="repost" 458 - other="reposts" 459 /> 460 </Text> 461 </Link> ··· 464 post.quoteCount !== 0 && 465 !post.viewer?.embeddingDisabled && 466 !disableQuotesMetrics ? ( 467 - <Link to={quotesHref} label={_(msg`Quotes of this post`)}> 468 <Text 469 testID="quoteCount-expanded" 470 style={[a.text_md, t.atoms.text_contrast_medium]}> ··· 482 {post.likeCount != null && 483 post.likeCount !== 0 && 484 !disableLikesMetrics ? ( 485 - <Link to={likesHref} label={_(msg`Likes on this post`)}> 486 <Text 487 testID="likeCount-expanded" 488 style={[a.text_md, t.atoms.text_contrast_medium]}> ··· 643 <Button 644 label={_(msg`Archived post`)} 645 accessibilityHint={_( 646 - msg`Shows information about when this post was created`, 647 )} 648 onPress={e => { 649 e.preventDefault() ··· 684 </Prompt.TitleText> 685 <Prompt.DescriptionText> 686 <Trans> 687 - This post claims to have been created on{' '} 688 <RNText style={[a.font_semi_bold]}> 689 {niceDate(i18n, createdAt)} 690 </RNText>
··· 135 </View> 136 <Text 137 style={[a.text_md, a.font_semi_bold, t.atoms.text_contrast_medium]}> 138 + <Trans>Skeet has been deleted</Trans> 139 </Text> 140 </View> 141 </View> ··· 445 {post.repostCount != null && 446 post.repostCount !== 0 && 447 !disableRepostsMetrics ? ( 448 + <Link to={repostsHref} label={_(msg`Reskeets of this skeet`)}> 449 <Text 450 testID="repostCount-expanded" 451 style={[a.text_md, t.atoms.text_contrast_medium]}> ··· 454 </Text>{' '} 455 <Plural 456 value={post.repostCount} 457 + one="reskeet" 458 + other="reskeets" 459 /> 460 </Text> 461 </Link> ··· 464 post.quoteCount !== 0 && 465 !post.viewer?.embeddingDisabled && 466 !disableQuotesMetrics ? ( 467 + <Link to={quotesHref} label={_(msg`Quotes of this skeet`)}> 468 <Text 469 testID="quoteCount-expanded" 470 style={[a.text_md, t.atoms.text_contrast_medium]}> ··· 482 {post.likeCount != null && 483 post.likeCount !== 0 && 484 !disableLikesMetrics ? ( 485 + <Link to={likesHref} label={_(msg`Likes on this skeet`)}> 486 <Text 487 testID="likeCount-expanded" 488 style={[a.text_md, t.atoms.text_contrast_medium]}> ··· 643 <Button 644 label={_(msg`Archived post`)} 645 accessibilityHint={_( 646 + msg`Shows information about when this skeet was created`, 647 )} 648 onPress={e => { 649 e.preventDefault() ··· 684 </Prompt.TitleText> 685 <Prompt.DescriptionText> 686 <Trans> 687 + This skeet claims to have been created on{' '} 688 <RNText style={[a.font_semi_bold]}> 689 {niceDate(i18n, createdAt)} 690 </RNText>
+1 -1
src/screens/PostThread/components/ThreadItemPost.tsx
··· 109 </View> 110 <Text 111 style={[a.text_md, a.font_semi_bold, t.atoms.text_contrast_medium]}> 112 - <Trans>Post has been deleted</Trans> 113 </Text> 114 </View> 115
··· 109 </View> 110 <Text 111 style={[a.text_md, a.font_semi_bold, t.atoms.text_contrast_medium]}> 112 + <Trans>Skeet has been deleted</Trans> 113 </Text> 114 </View> 115
+2 -2
src/screens/PostThread/components/ThreadItemPostTombstone.tsx
··· 19 const {copy, Icon} = useMemo(() => { 20 switch (type) { 21 case 'blocked': 22 - return {copy: _(msg`Post blocked`), Icon: PersonXIcon} 23 case 'not-found': 24 default: 25 - return {copy: _(msg`Post not found`), Icon: TrashIcon} 26 } 27 }, [_, type]) 28
··· 19 const {copy, Icon} = useMemo(() => { 20 switch (type) { 21 case 'blocked': 22 + return {copy: _(msg`Skeet blocked`), Icon: PersonXIcon} 23 case 'not-found': 24 default: 25 + return {copy: _(msg`Skeet not found`), Icon: TrashIcon} 26 } 27 }, [_, type]) 28
+1 -1
src/screens/PostThread/components/ThreadItemTreePost.tsx
··· 105 ]}> 106 <TrashIcon style={[t.atoms.text]} width={14} /> 107 <Text style={[t.atoms.text_contrast_medium, a.mt_2xs]}> 108 - <Trans>Post has been deleted</Trans> 109 </Text> 110 </View> 111 {item.ui.isLastChild && !item.ui.precedesChildReadMore && (
··· 105 ]}> 106 <TrashIcon style={[t.atoms.text]} width={14} /> 107 <Text style={[t.atoms.text_contrast_medium, a.mt_2xs]}> 108 + <Trans>Skeet has been deleted</Trans> 109 </Text> 110 </View> 111 {item.ui.isLastChild && !item.ui.precedesChildReadMore && (
+1 -1
src/screens/PostThread/index.tsx
··· 501 <Layout.Header.BackButton /> 502 <Layout.Header.Content> 503 <Layout.Header.TitleText> 504 - <Trans context="description">Post</Trans> 505 </Layout.Header.TitleText> 506 </Layout.Header.Content> 507 <Layout.Header.Slot>
··· 501 <Layout.Header.BackButton /> 502 <Layout.Header.Content> 503 <Layout.Header.TitleText> 504 + <Trans context="description">Skeet</Trans> 505 </Layout.Header.TitleText> 506 </Layout.Header.Content> 507 <Layout.Header.Slot>
+1 -1
src/screens/Profile/Header/Metrics.tsx
··· 55 <Text style={[a.font_semi_bold, t.atoms.text, a.text_md]}> 56 {formatCount(i18n, profile.postsCount || 0)}{' '} 57 <Text style={[t.atoms.text_contrast_medium, a.font_normal, a.text_md]}> 58 - {plural(profile.postsCount || 0, {one: 'post', other: 'posts'})} 59 </Text> 60 </Text> 61 </View>
··· 55 <Text style={[a.font_semi_bold, t.atoms.text, a.text_md]}> 56 {formatCount(i18n, profile.postsCount || 0)}{' '} 57 <Text style={[t.atoms.text_contrast_medium, a.font_normal, a.text_md]}> 58 + {plural(profile.postsCount || 0, {one: 'skeet', other: 'skeets'})} 59 </Text> 60 </Text> 61 </View>
+1 -1
src/screens/Profile/ProfileFeed/index.tsx
··· 221 {(isScrolledDown || hasNew) && ( 222 <LoadLatestBtn 223 onPress={onScrollToTop} 224 - label={_(msg`Load new posts`)} 225 showIndicator={hasNew} 226 /> 227 )}
··· 221 {(isScrolledDown || hasNew) && ( 222 <LoadLatestBtn 223 onPress={onScrollToTop} 224 + label={_(msg`Load new skeets`)} 225 showIndicator={hasNew} 226 /> 227 )}
+2 -2
src/screens/Profile/ProfileSearch.tsx
··· 33 inputPlaceholder={ 34 profile 35 ? currentAccount?.did === profile.did 36 - ? _(msg`Search my posts`) 37 - : _(msg`Search @${profile.handle}'s posts`) 38 : _(msg`Search...`) 39 } 40 fixedParams={fixedParams}
··· 33 inputPlaceholder={ 34 profile 35 ? currentAccount?.did === profile.did 36 + ? _(msg`Search my skeets`) 37 + : _(msg`Search @${profile.handle}'s skeets`) 38 : _(msg`Search...`) 39 } 40 fixedParams={fixedParams}
+2 -2
src/screens/Profile/Sections/Feed.tsx
··· 59 })) 60 61 const renderPostsEmpty = useCallback(() => { 62 - return <EmptyState icon="growth" message={_(msg`No posts yet.`)} /> 63 }, [_]) 64 65 useEffect(() => { ··· 91 {(isScrolledDown || hasNew) && ( 92 <LoadLatestBtn 93 onPress={onScrollToTop} 94 - label={_(msg`Load new posts`)} 95 showIndicator={hasNew} 96 /> 97 )}
··· 59 })) 60 61 const renderPostsEmpty = useCallback(() => { 62 + return <EmptyState icon="growth" message={_(msg`No skeets yet.`)} /> 63 }, [_]) 64 65 useEffect(() => { ··· 91 {(isScrolledDown || hasNew) && ( 92 <LoadLatestBtn 93 onPress={onScrollToTop} 94 + label={_(msg`Load new skeets`)} 95 showIndicator={hasNew} 96 /> 97 )}
+1 -1
src/screens/ProfileList/FeedSection.tsx
··· 102 {(isScrolledDown || hasNew) && ( 103 <LoadLatestBtn 104 onPress={onScrollToTop} 105 - label={_(msg`Load new posts`)} 106 showIndicator={hasNew} 107 /> 108 )}
··· 102 {(isScrolledDown || hasNew) && ( 103 <LoadLatestBtn 104 onPress={onScrollToTop} 105 + label={_(msg`Load new skeets`)} 106 showIndicator={hasNew} 107 /> 108 )}
+1 -1
src/screens/ProfileList/components/SubscribeMenu.tsx
··· 109 control={subscribeMutePromptControl} 110 title={_(msg`Mute these accounts?`)} 111 description={_( 112 - msg`Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them.`, 113 )} 114 onConfirm={onSubscribeMute} 115 confirmButtonCta={_(msg`Mute list`)}
··· 109 control={subscribeMutePromptControl} 110 title={_(msg`Mute these accounts?`)} 111 description={_( 112 + msg`Muting is private. Muted accounts can interact with you, but you will not see their skeets or receive notifications from them.`, 113 )} 114 onConfirm={onSubscribeMute} 115 confirmButtonCta={_(msg`Mute list`)}
+1 -1
src/screens/ProfileList/index.tsx
··· 163 const isOwner = currentAccount?.did === list.creator.did 164 const scrollElRef = useAnimatedRef() 165 const addUserDialogControl = useDialogControl() 166 - const sectionTitlesCurate = [_(msg`Posts`), _(msg`People`)] 167 168 const moderation = useMemo(() => { 169 return moderateUserList(list, moderationOpts)
··· 163 const isOwner = currentAccount?.did === list.creator.did 164 const scrollElRef = useAnimatedRef() 165 const addUserDialogControl = useDialogControl() 166 + const sectionTitlesCurate = [_(msg`Skeets`), _(msg`People`)] 167 168 const moderation = useMemo(() => { 169 return moderateUserList(list, moderationOpts)
+1 -1
src/screens/Search/Explore.tsx
··· 989 return ( 990 <LoadMoreRetryBtn 991 label={_( 992 - msg`There was an issue fetching posts. Tap here to try again.`, 993 )} 994 onPress={fetchNextPageFeedPreviews} 995 />
··· 989 return ( 990 <LoadMoreRetryBtn 991 label={_( 992 + msg`There was an issue fetching skeets. Tap here to try again.`, 993 )} 994 onPress={fetchNextPageFeedPreviews} 995 />
+2 -2
src/screens/Search/Shell.tsx
··· 351 onSubmitEditing={onSubmit} 352 placeholder={ 353 inputPlaceholder ?? 354 - _(msg`Search for posts, users, or feeds`) 355 } 356 hitSlop={{...HITSLOP_20, top: 0}} 357 /> ··· 523 style={t.atoms.text_contrast_medium as StyleProp<ViewStyle>} 524 /> 525 <Text style={[t.atoms.text_contrast_medium, a.text_md]}> 526 - <Trans>Find posts, users, and feeds on Bluesky</Trans> 527 </Text> 528 </View> 529 </View>
··· 351 onSubmitEditing={onSubmit} 352 placeholder={ 353 inputPlaceholder ?? 354 + _(msg`Search for skeets, users, or feeds`) 355 } 356 hitSlop={{...HITSLOP_20, top: 0}} 357 /> ··· 523 style={t.atoms.text_contrast_medium as StyleProp<ViewStyle>} 524 /> 525 <Text style={[t.atoms.text_contrast_medium, a.text_md]}> 526 + <Trans>Find skeets, users, and feeds on Witchsky</Trans> 527 </Text> 528 </View> 529 </View>
+1 -1
src/screens/Search/modules/ExploreTrendingTopics.tsx
··· 80 const postCount = trend.postCount 81 ? _( 82 plural(trend.postCount, { 83 - other: `${formatCount(i18n, trend.postCount)} posts`, 84 }), 85 ) 86 : null
··· 80 const postCount = trend.postCount 81 ? _( 82 plural(trend.postCount, { 83 + other: `${formatCount(i18n, trend.postCount)} skeets`, 84 }), 85 ) 86 : null
+2 -2
src/screens/Settings/AccessibilitySettings.tsx
··· 55 </SettingsList.ItemText> 56 <Toggle.Item 57 name="require_alt_text" 58 - label={_(msg`Require alt text before posting`)} 59 value={requireAltTextEnabled ?? false} 60 onChange={value => setRequireAltTextEnabled(value)} 61 style={[a.w_full]}> 62 <Toggle.LabelText style={[a.flex_1]}> 63 - <Trans>Require alt text before posting</Trans> 64 </Toggle.LabelText> 65 <Toggle.Platform /> 66 </Toggle.Item>
··· 55 </SettingsList.ItemText> 56 <Toggle.Item 57 name="require_alt_text" 58 + label={_(msg`Require alt text before skeeting`)} 59 value={requireAltTextEnabled ?? false} 60 onChange={value => setRequireAltTextEnabled(value)} 61 style={[a.w_full]}> 62 <Toggle.LabelText style={[a.flex_1]}> 63 + <Trans>Require alt text before skeeting</Trans> 64 </Toggle.LabelText> 65 <Toggle.Platform /> 66 </Toggle.Item>
+2 -2
src/screens/Settings/ActivityPrivacySettings.tsx
··· 49 <ItemTextWithSubtitle 50 bold 51 titleText={ 52 - <Trans>Allow others to be notified of your posts</Trans> 53 } 54 subtitleText={ 55 <Trans> 56 This feature allows users to receive notifications for your 57 - new posts and replies. Who do you want to enable this for? 58 </Trans> 59 } 60 />
··· 49 <ItemTextWithSubtitle 50 bold 51 titleText={ 52 + <Trans>Allow others to be notified of your skeets</Trans> 53 } 54 subtitleText={ 55 <Trans> 56 This feature allows users to receive notifications for your 57 + new skeets and replies. Who do you want to enable this for? 58 </Trans> 59 } 60 />
+4 -4
src/screens/Settings/FollowingFeedPreferences.tsx
··· 86 <Toggle.Item 87 type="checkbox" 88 name="show-reposts" 89 - label={_(msg`Show reposts`)} 90 value={showReposts} 91 onChange={value => 92 setFeedViewPref({ ··· 96 <SettingsList.Item> 97 <SettingsList.ItemIcon icon={RepostIcon} /> 98 <SettingsList.ItemText> 99 - <Trans>Show reposts</Trans> 100 </SettingsList.ItemText> 101 <Toggle.Platform /> 102 </SettingsList.Item> ··· 104 <Toggle.Item 105 type="checkbox" 106 name="show-quotes" 107 - label={_(msg`Show quote posts`)} 108 value={showQuotePosts} 109 onChange={value => 110 setFeedViewPref({ ··· 114 <SettingsList.Item> 115 <SettingsList.ItemIcon icon={QuoteIcon} /> 116 <SettingsList.ItemText> 117 - <Trans>Show quote posts</Trans> 118 </SettingsList.ItemText> 119 <Toggle.Platform /> 120 </SettingsList.Item>
··· 86 <Toggle.Item 87 type="checkbox" 88 name="show-reposts" 89 + label={_(msg`Show reskeets`)} 90 value={showReposts} 91 onChange={value => 92 setFeedViewPref({ ··· 96 <SettingsList.Item> 97 <SettingsList.ItemIcon icon={RepostIcon} /> 98 <SettingsList.ItemText> 99 + <Trans>Show reskeets</Trans> 100 </SettingsList.ItemText> 101 <Toggle.Platform /> 102 </SettingsList.Item> ··· 104 <Toggle.Item 105 type="checkbox" 106 name="show-quotes" 107 + label={_(msg`Show quote skeets`)} 108 value={showQuotePosts} 109 onChange={value => 110 setFeedViewPref({ ··· 114 <SettingsList.Item> 115 <SettingsList.ItemIcon icon={QuoteIcon} /> 116 <SettingsList.ItemText> 117 + <Trans>Show quote skeets</Trans> 118 </SettingsList.ItemText> 119 <Toggle.Platform /> 120 </SettingsList.Item>
+3 -3
src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx
··· 102 titleText={<Trans>Activity from others</Trans>} 103 subtitleText={ 104 <Trans> 105 - Get notified about posts and replies from accounts you 106 choose. 107 </Trans> 108 } ··· 211 const preview = useMemo(() => { 212 const actSub = profile.viewer?.activitySubscription 213 if (actSub?.post && actSub?.reply) { 214 - return _(msg`Posts, Replies`) 215 } else if (actSub?.post) { 216 - return _(msg`Posts`) 217 } else if (actSub?.reply) { 218 return _(msg`Replies`) 219 }
··· 102 titleText={<Trans>Activity from others</Trans>} 103 subtitleText={ 104 <Trans> 105 + Get notified about skeets and replies from accounts you 106 choose. 107 </Trans> 108 } ··· 211 const preview = useMemo(() => { 212 const actSub = profile.viewer?.activitySubscription 213 if (actSub?.post && actSub?.reply) { 214 + return _(msg`Skeets, Replies`) 215 } else if (actSub?.post) { 216 + return _(msg`Skeets`) 217 } else if (actSub?.reply) { 218 return _(msg`Replies`) 219 }
+1 -1
src/screens/Settings/NotificationSettings/LikeNotificationSettings.tsx
··· 40 bold 41 titleText={<Trans>Likes</Trans>} 42 subtitleText={ 43 - <Trans>Get notifications when people like your posts.</Trans> 44 } 45 /> 46 </SettingsList.Item>
··· 40 bold 41 titleText={<Trans>Likes</Trans>} 42 subtitleText={ 43 + <Trans>Get notifications when people like your skeets.</Trans> 44 } 45 /> 46 </SettingsList.Item>
+2 -2
src/screens/Settings/NotificationSettings/LikesOnRepostsNotificationSettings.tsx
··· 38 <SettingsList.ItemIcon icon={LikeRepostIcon} /> 39 <ItemTextWithSubtitle 40 bold 41 - titleText={<Trans>Likes of your reposts</Trans>} 42 subtitleText={ 43 <Trans> 44 - Get notifications when people like posts that you've reposted. 45 </Trans> 46 } 47 />
··· 38 <SettingsList.ItemIcon icon={LikeRepostIcon} /> 39 <ItemTextWithSubtitle 40 bold 41 + titleText={<Trans>Likes of your reskeets</Trans>} 42 subtitleText={ 43 <Trans> 44 + Get notifications when people like skeets that you've reskeeted. 45 </Trans> 46 } 47 />
+1 -1
src/screens/Settings/NotificationSettings/QuoteNotificationSettings.tsx
··· 40 bold 41 titleText={<Trans>Quotes</Trans>} 42 subtitleText={ 43 - <Trans>Get notifications when people quote your posts.</Trans> 44 } 45 /> 46 </SettingsList.Item>
··· 40 bold 41 titleText={<Trans>Quotes</Trans>} 42 subtitleText={ 43 + <Trans>Get notifications when people quote your skeets.</Trans> 44 } 45 /> 46 </SettingsList.Item>
+1 -1
src/screens/Settings/NotificationSettings/ReplyNotificationSettings.tsx
··· 41 titleText={<Trans>Replies</Trans>} 42 subtitleText={ 43 <Trans> 44 - Get notifications when people reply to your posts. 45 </Trans> 46 } 47 />
··· 41 titleText={<Trans>Replies</Trans>} 42 subtitleText={ 43 <Trans> 44 + Get notifications when people reply to your skeets. 45 </Trans> 46 } 47 />
+2 -2
src/screens/Settings/NotificationSettings/RepostNotificationSettings.tsx
··· 38 <SettingsList.ItemIcon icon={RepostIcon} /> 39 <ItemTextWithSubtitle 40 bold 41 - titleText={<Trans>Reposts</Trans>} 42 subtitleText={ 43 - <Trans>Get notifications when people repost your posts.</Trans> 44 } 45 /> 46 </SettingsList.Item>
··· 38 <SettingsList.ItemIcon icon={RepostIcon} /> 39 <ItemTextWithSubtitle 40 bold 41 + titleText={<Trans>Reskeets</Trans>} 42 subtitleText={ 43 + <Trans>Get notifications when people reskeet your skeets.</Trans> 44 } 45 /> 46 </SettingsList.Item>
+3 -3
src/screens/Settings/NotificationSettings/RepostsOnRepostsNotificationSettings.tsx
··· 38 <SettingsList.ItemIcon icon={RepostRepostIcon} /> 39 <ItemTextWithSubtitle 40 bold 41 - titleText={<Trans>Reposts of your reposts</Trans>} 42 subtitleText={ 43 <Trans> 44 - Get notifications when people repost posts that you've 45 - reposted. 46 </Trans> 47 } 48 />
··· 38 <SettingsList.ItemIcon icon={RepostRepostIcon} /> 39 <ItemTextWithSubtitle 40 bold 41 + titleText={<Trans>Reskeets of your reskeets</Trans>} 42 subtitleText={ 43 <Trans> 44 + Get notifications when people reskeet skeets that you've 45 + reskeeted. 46 </Trans> 47 } 48 />
+4 -4
src/screens/Settings/NotificationSettings/index.tsx
··· 173 /> 174 </SettingsList.LinkItem> 175 <SettingsList.LinkItem 176 - label={_(msg`Settings for repost notifications`)} 177 to={{screen: 'RepostNotificationSettings'}} 178 contentContainerStyle={[a.align_start]}> 179 <SettingsList.ItemIcon icon={RepostIcon} /> 180 <ItemTextWithSubtitle 181 - titleText={<Trans>Reposts</Trans>} 182 subtitleText={<SettingPreview preference={settings?.repost} />} 183 showSkeleton={!settings} 184 /> ··· 204 contentContainerStyle={[a.align_start]}> 205 <SettingsList.ItemIcon icon={LikeRepostIcon} /> 206 <ItemTextWithSubtitle 207 - titleText={<Trans>Likes of your reposts</Trans>} 208 subtitleText={ 209 <SettingPreview preference={settings?.likeViaRepost} /> 210 } ··· 219 contentContainerStyle={[a.align_start]}> 220 <SettingsList.ItemIcon icon={RepostRepostIcon} /> 221 <ItemTextWithSubtitle 222 - titleText={<Trans>Reposts of your reposts</Trans>} 223 subtitleText={ 224 <SettingPreview preference={settings?.repostViaRepost} /> 225 }
··· 173 /> 174 </SettingsList.LinkItem> 175 <SettingsList.LinkItem 176 + label={_(msg`Settings for reskeet notifications`)} 177 to={{screen: 'RepostNotificationSettings'}} 178 contentContainerStyle={[a.align_start]}> 179 <SettingsList.ItemIcon icon={RepostIcon} /> 180 <ItemTextWithSubtitle 181 + titleText={<Trans>Reskeets</Trans>} 182 subtitleText={<SettingPreview preference={settings?.repost} />} 183 showSkeleton={!settings} 184 /> ··· 204 contentContainerStyle={[a.align_start]}> 205 <SettingsList.ItemIcon icon={LikeRepostIcon} /> 206 <ItemTextWithSubtitle 207 + titleText={<Trans>Likes of your reskeets</Trans>} 208 subtitleText={ 209 <SettingPreview preference={settings?.likeViaRepost} /> 210 } ··· 219 contentContainerStyle={[a.align_start]}> 220 <SettingsList.ItemIcon icon={RepostRepostIcon} /> 221 <ItemTextWithSubtitle 222 + titleText={<Trans>Reskeets of your reskeets</Trans>} 223 subtitleText={ 224 <SettingPreview preference={settings?.repostViaRepost} /> 225 }
+2 -2
src/screens/Settings/PrivacyAndSecuritySettings.tsx
··· 81 </SettingsList.LinkItem> 82 <SettingsList.LinkItem 83 label={_( 84 - msg`Settings for allowing others to be notified of your posts`, 85 )} 86 to={{screen: 'ActivityPrivacySettings'}} 87 contentContainerStyle={[a.align_start]}> 88 <SettingsList.ItemIcon icon={BellRingingIcon} /> 89 <ItemTextWithSubtitle 90 titleText={ 91 - <Trans>Allow others to be notified of your posts</Trans> 92 } 93 subtitleText={ 94 <NotificationDeclaration
··· 81 </SettingsList.LinkItem> 82 <SettingsList.LinkItem 83 label={_( 84 + msg`Settings for allowing others to be notified of your skeets`, 85 )} 86 to={{screen: 'ActivityPrivacySettings'}} 87 contentContainerStyle={[a.align_start]}> 88 <SettingsList.ItemIcon icon={BellRingingIcon} /> 89 <ItemTextWithSubtitle 90 titleText={ 91 + <Trans>Allow others to be notified of your skeets</Trans> 92 } 93 subtitleText={ 94 <NotificationDeclaration
+2 -2
src/screens/Settings/ThreadPreferences.tsx
··· 45 </SettingsList.ItemText> 46 <View style={[a.w_full, a.gap_md]}> 47 <Text style={[a.flex_1, t.atoms.text_contrast_medium]}> 48 - <Trans>Sort replies to the same post by:</Trans> 49 </Text> 50 <Toggle.Group 51 label={_(msg`Sort replies by`)} ··· 95 } 96 style={[a.w_full, a.gap_md]}> 97 <Toggle.LabelText style={[a.flex_1]}> 98 - <Trans>Show post replies in a threaded tree view</Trans> 99 </Toggle.LabelText> 100 <Toggle.Platform /> 101 </Toggle.Item>
··· 45 </SettingsList.ItemText> 46 <View style={[a.w_full, a.gap_md]}> 47 <Text style={[a.flex_1, t.atoms.text_contrast_medium]}> 48 + <Trans>Sort replies to the same skeet by:</Trans> 49 </Text> 50 <Toggle.Group 51 label={_(msg`Sort replies by`)} ··· 95 } 96 style={[a.w_full, a.gap_md]}> 97 <Toggle.LabelText style={[a.flex_1]}> 98 + <Trans>Show skeet replies in a threaded tree view</Trans> 99 </Toggle.LabelText> 100 <Toggle.Platform /> 101 </Toggle.Item>
+2 -2
src/screens/StarterPack/StarterPackScreen.tsx
··· 188 const tabs = [ 189 ...(showPeopleTab ? [_(msg`People`)] : []), 190 ...(showFeedsTab ? [_(msg`Feeds`)] : []), 191 - ...(showPostsTab ? [_(msg`Posts`)] : []), 192 ] 193 194 const qrCodeDialogControl = useDialogControl() ··· 560 return ( 561 <> 562 <Menu.Root> 563 - <Menu.Trigger label={_(msg`Repost or quote post`)}> 564 {({props}) => ( 565 <Button 566 {...props}
··· 188 const tabs = [ 189 ...(showPeopleTab ? [_(msg`People`)] : []), 190 ...(showFeedsTab ? [_(msg`Feeds`)] : []), 191 + ...(showPostsTab ? [_(msg`Skeets`)] : []), 192 ] 193 194 const qrCodeDialogControl = useDialogControl() ··· 560 return ( 561 <> 562 <Menu.Root> 563 + <Menu.Trigger label={_(msg`Reskeet or quote skeet`)}> 564 {({props}) => ( 565 <Button 566 {...props}
+1 -1
src/screens/VideoFeed/index.tsx
··· 532 a.leading_tight, 533 a.mx_xl, 534 ]}> 535 - <Trans>Post has been deleted</Trans> 536 </Text> 537 </View> 538 ) : (
··· 532 a.leading_tight, 533 a.mx_xl, 534 ]}> 535 + <Trans>Skeet has been deleted</Trans> 536 </Text> 537 </View> 538 ) : (
+4 -4
src/state/persisted/schema.ts
··· 202 kawaii: false, 203 hasCheckedForStarterPack: false, 204 subtitlesEnabled: true, 205 - trendingDisabled: false, 206 - trendingVideoDisabled: false, 207 208 // deer 209 goLinksEnabled: true, 210 - constellationEnabled: false, 211 directFetchRecords: true, 212 noAppLabelers: false, 213 noDiscoverFallback: false, ··· 221 disableQuotesMetrics: false, 222 disableSavesMetrics: false, 223 disableReplyMetrics: false, 224 - hideSimilarAccountsRecomm: false, 225 enableSquareAvatars: false, 226 deerVerification: { 227 enabled: false,
··· 202 kawaii: false, 203 hasCheckedForStarterPack: false, 204 subtitlesEnabled: true, 205 + trendingDisabled: true, 206 + trendingVideoDisabled: true, 207 208 // deer 209 goLinksEnabled: true, 210 + constellationEnabled: true, 211 directFetchRecords: true, 212 noAppLabelers: false, 213 noDiscoverFallback: false, ··· 221 disableQuotesMetrics: false, 222 disableSavesMetrics: false, 223 disableReplyMetrics: false, 224 + hideSimilarAccountsRecomm: true, 225 enableSquareAvatars: false, 226 deerVerification: { 227 enabled: false,
+3 -3
src/state/queries/pinned-post.ts
··· 56 }) 57 58 if (pinCurrentPost) { 59 - Toast.show(_(msg({message: 'Post pinned', context: 'toast'}))) 60 } else { 61 - Toast.show(_(msg({message: 'Post unpinned', context: 'toast'}))) 62 } 63 64 queryClient.invalidateQueries({ ··· 72 ), 73 }) 74 } catch (e: any) { 75 - Toast.show(_(msg`Failed to pin post`)) 76 logger.error('Failed to pin post', {message: String(e)}) 77 // revert optimistic update 78 updatePostShadow(queryClient, postUri, {
··· 56 }) 57 58 if (pinCurrentPost) { 59 + Toast.show(_(msg({message: 'Skeet pinned', context: 'toast'}))) 60 } else { 61 + Toast.show(_(msg({message: 'Skeet unpinned', context: 'toast'}))) 62 } 63 64 queryClient.invalidateQueries({ ··· 72 ), 73 }) 74 } catch (e: any) { 75 + Toast.show(_(msg`Failed to pin skeet`)) 76 logger.error('Failed to pin post', {message: String(e)}) 77 // revert optimistic update 78 updatePostShadow(queryClient, postUri, {
+2 -2
src/state/shell/progress-guide.tsx
··· 213 <ProgressGuideToast 214 ref={firstLikeToastRef} 215 title={_(msg`Your first like!`)} 216 - subtitle={_(msg`Like 10 posts to train the Discover feed`)} 217 /> 218 <ProgressGuideToast 219 ref={fifthLikeToastRef} 220 title={_(msg`Half way there!`)} 221 - subtitle={_(msg`Like 10 posts to train the Discover feed`)} 222 /> 223 <ProgressGuideToast 224 ref={tenthLikeToastRef}
··· 213 <ProgressGuideToast 214 ref={firstLikeToastRef} 215 title={_(msg`Your first like!`)} 216 + subtitle={_(msg`Like 10 skeets to train the Discover feed`)} 217 /> 218 <ProgressGuideToast 219 ref={fifthLikeToastRef} 220 title={_(msg`Half way there!`)} 221 + subtitle={_(msg`Like 10 skeets to train the Discover feed`)} 222 /> 223 <ProgressGuideToast 224 ref={tenthLikeToastRef}
+1 -1
src/view/com/auth/SplashScreen.tsx
··· 48 t.atoms.text_contrast_medium, 49 a.text_center, 50 ]}> 51 - <Trans>What's up?</Trans> 52 </Text> 53 </View> 54
··· 48 t.atoms.text_contrast_medium, 49 a.text_center, 50 ]}> 51 + <Trans>Skeet yo stuff! 🗣️</Trans> 52 </Text> 53 </View> 54
+1 -1
src/view/com/auth/SplashScreen.web.tsx
··· 100 a.font_semi_bold, 101 t.atoms.text_contrast_medium, 102 ]}> 103 - <Trans>What's up?</Trans> 104 </Text> 105 </View> 106
··· 100 a.font_semi_bold, 101 t.atoms.text_contrast_medium, 102 ]}> 103 + <Trans>Skeet yo shit! 🗣️</Trans> 104 </Text> 105 </View> 106
+13 -13
src/view/com/composer/Composer.tsx
··· 507 let err = cleanError(e.message) 508 if (err.includes('not locate record')) { 509 err = _( 510 - msg`We're sorry! The post you are replying to has been deleted.`, 511 ) 512 } else if (e instanceof EmbeddingDisabledError) { 513 - err = _(msg`This post's author has disabled quote posts.`) 514 } 515 setError(err) 516 setIsPublishing(false) ··· 570 <Toast.Icon /> 571 <Toast.Text> 572 {thread.posts.length > 1 573 - ? _(msg`Your posts were sent`) 574 : replyTo 575 ? _(msg`Your reply was sent`) 576 - : _(msg`Your post was sent`)} 577 </Toast.Text> 578 {postUri && ( 579 <Toast.Action 580 - label={_(msg`View post`)} 581 onPress={() => { 582 const {host: name, rkey} = new AtUri(postUri) 583 navigation.navigate('PostThread', {name, rkey}) 584 }}> 585 - <Trans context="Action to view the post the user just created"> 586 View 587 </Trans> 588 </Toast.Action> ··· 851 const selectTextInputPlaceholder = isReply 852 ? isFirstPost 853 ? _(msg`Write your reply`) 854 - : _(msg`Add another post`) 855 - : _(msg`What's up?`) 856 const discardPromptControl = Prompt.usePromptControl() 857 858 const dispatchPost = useCallback( ··· 964 {canRemovePost && isActive && ( 965 <> 966 <Button 967 - label={_(msg`Delete post`)} 968 size="small" 969 color="secondary" 970 variant="ghost" ··· 989 </Button> 990 <Prompt.Basic 991 control={discardPromptControl} 992 - title={_(msg`Discard post?`)} 993 - description={_(msg`Are you sure you'd like to discard this post?`)} 994 onConfirm={() => { 995 dispatch({ 996 type: 'remove_post', ··· 1115 {isReply ? ( 1116 <Trans context="action">Reply</Trans> 1117 ) : isThread ? ( 1118 - <Trans context="action">Post All</Trans> 1119 ) : ( 1120 - <Trans context="action">Post</Trans> 1121 )} 1122 </ButtonText> 1123 </Button>
··· 507 let err = cleanError(e.message) 508 if (err.includes('not locate record')) { 509 err = _( 510 + msg`We're sorry! The skeet you are replying to has been deleted.`, 511 ) 512 } else if (e instanceof EmbeddingDisabledError) { 513 + err = _(msg`This skeet's author has disabled quote skeets.`) 514 } 515 setError(err) 516 setIsPublishing(false) ··· 570 <Toast.Icon /> 571 <Toast.Text> 572 {thread.posts.length > 1 573 + ? _(msg`Your skeets were sent`) 574 : replyTo 575 ? _(msg`Your reply was sent`) 576 + : _(msg`Your skeet was sent`)} 577 </Toast.Text> 578 {postUri && ( 579 <Toast.Action 580 + label={_(msg`View skeet`)} 581 onPress={() => { 582 const {host: name, rkey} = new AtUri(postUri) 583 navigation.navigate('PostThread', {name, rkey}) 584 }}> 585 + <Trans context="Action to view the skeet the user just created"> 586 View 587 </Trans> 588 </Toast.Action> ··· 851 const selectTextInputPlaceholder = isReply 852 ? isFirstPost 853 ? _(msg`Write your reply`) 854 + : _(msg`Add another skeet`) 855 + : _(msg`Anything but skeet`) 856 const discardPromptControl = Prompt.usePromptControl() 857 858 const dispatchPost = useCallback( ··· 964 {canRemovePost && isActive && ( 965 <> 966 <Button 967 + label={_(msg`Delete skeet`)} 968 size="small" 969 color="secondary" 970 variant="ghost" ··· 989 </Button> 990 <Prompt.Basic 991 control={discardPromptControl} 992 + title={_(msg`Discard skeet?`)} 993 + description={_(msg`Are you sure you'd like to discard this skeet?`)} 994 onConfirm={() => { 995 dispatch({ 996 type: 'remove_post', ··· 1115 {isReply ? ( 1116 <Trans context="action">Reply</Trans> 1117 ) : isThread ? ( 1118 + <Trans context="action">Skeet All</Trans> 1119 ) : ( 1120 + <Trans context="action">Skeet</Trans> 1121 )} 1122 </ButtonText> 1123 </Button>
+1 -1
src/view/com/composer/labels/LabelsBtn.tsx
··· 109 <Text style={[t.atoms.text_contrast_medium, a.leading_snug]}> 110 <Trans> 111 Please add any content warning labels that are applicable for the 112 - media you are posting. 113 </Trans> 114 </Text> 115 </View>
··· 109 <Text style={[t.atoms.text_contrast_medium, a.leading_snug]}> 110 <Trans> 111 Please add any content warning labels that are applicable for the 112 + media you are skeeting. 113 </Trans> 114 </Text> 115 </View>
+2 -2
src/view/com/composer/select-language/PostLanguageSelect.tsx
··· 54 return ( 55 <> 56 <Menu.Root> 57 - <Menu.Trigger label={_(msg`Select post language`)}> 58 {({props}) => ( 59 <LanguageBtn currentLanguages={currentLanguages} {...props} /> 60 )} ··· 122 hitSlop={LANG_DROPDOWN_HITSLOP} 123 label={_( 124 msg({ 125 - message: `Post language selection`, 126 comment: `Accessibility label for button that opens dialog to choose post language settings`, 127 }), 128 )}
··· 54 return ( 55 <> 56 <Menu.Root> 57 + <Menu.Trigger label={_(msg`Select skeet language`)}> 58 {({props}) => ( 59 <LanguageBtn currentLanguages={currentLanguages} {...props} /> 60 )} ··· 122 hitSlop={LANG_DROPDOWN_HITSLOP} 123 label={_( 124 msg({ 125 + message: `Skeet language selection`, 126 comment: `Accessibility label for button that opens dialog to choose post language settings`, 127 }), 128 )}
+2 -2
src/view/com/composer/select-language/PostLanguageSelectDialog.tsx
··· 181 a.text_xl, 182 a.mb_sm, 183 ]}> 184 - <Trans>Choose Post Languages</Trans> 185 </Text> 186 <Text 187 nativeID="dialog-description" ··· 191 a.text_md, 192 a.mb_lg, 193 ]}> 194 - <Trans>Select up to 3 languages used in this post</Trans> 195 </Text> 196 </View> 197
··· 181 a.text_xl, 182 a.mb_sm, 183 ]}> 184 + <Trans>Choose Skeet Languages</Trans> 185 </Text> 186 <Text 187 nativeID="dialog-description" ··· 191 a.text_md, 192 a.mb_lg, 193 ]}> 194 + <Trans>Select up to 3 languages used in this skeet</Trans> 195 </Text> 196 </View> 197
+1 -1
src/view/com/composer/select-language/SuggestedLanguage.tsx
··· 117 label={ 118 <RNText> 119 <Trans> 120 - The post you're replying to was marked as being written in{' '} 121 {suggestedLanguageName} by its author. Would you like to reply in{' '} 122 <Text style={[a.font_bold]}>{suggestedLanguageName}</Text>? 123 </Trans>
··· 117 label={ 118 <RNText> 119 <Trans> 120 + The skeet you're replying to was marked as being written in{' '} 121 {suggestedLanguageName} by its author. Would you like to reply in{' '} 122 <Text style={[a.font_bold]}>{suggestedLanguageName}</Text>? 123 </Trans>
+1 -1
src/view/com/feeds/FeedPage.tsx
··· 166 {(isScrolledDown || hasNew) && ( 167 <LoadLatestBtn 168 onPress={onPressLoadLatest} 169 - label={_(msg`Load new posts`)} 170 showIndicator={hasNew} 171 /> 172 )}
··· 166 {(isScrolledDown || hasNew) && ( 167 <LoadLatestBtn 168 onPress={onPressLoadLatest} 169 + label={_(msg`Load new skeets`)} 170 showIndicator={hasNew} 171 /> 172 )}
+12 -12
src/view/com/notifications/NotificationFeedItem.tsx
··· 309 other={`${formattedAuthorsCount} others`} 310 /> 311 </Text>{' '} 312 - liked your post 313 </Trans> 314 ) : ( 315 - <Trans>{firstAuthorLink} liked your post</Trans> 316 ) 317 } else if (item.type === 'repost') { 318 a11yLabel = hasMultipleAuthors ··· 333 other={`${formattedAuthorsCount} others`} 334 /> 335 </Text>{' '} 336 - reposted your post 337 </Trans> 338 ) : ( 339 - <Trans>{firstAuthorLink} reposted your post</Trans> 340 ) 341 icon = <RepostIcon size="xl" style={{color: t.palette.positive_500}} /> 342 } else if (item.type === 'follow') { ··· 497 other={`${formattedAuthorsCount} others`} 498 /> 499 </Text>{' '} 500 - liked your repost 501 </Trans> 502 ) : ( 503 - <Trans>{firstAuthorLink} liked your repost</Trans> 504 ) 505 } else if (item.type === 'repost-via-repost') { 506 a11yLabel = hasMultipleAuthors ··· 521 other={`${formattedAuthorsCount} others`} 522 /> 523 </Text>{' '} 524 - reposted your repost 525 </Trans> 526 ) : ( 527 - <Trans>{firstAuthorLink} reposted your repost</Trans> 528 ) 529 icon = <RepostIcon size="xl" style={{color: t.palette.positive_500}} /> 530 } else if (item.type === 'subscribed-post') { ··· 541 ) 542 : _( 543 msg`New ${plural(postsCount, { 544 - one: 'post', 545 - other: 'posts', 546 })} from ${firstAuthorName}`, 547 ) 548 notificationContent = hasMultipleAuthors ? ( 549 <Trans> 550 - New posts from {firstAuthorLink} and{' '} 551 <Text style={[a.text_md, a.font_semi_bold, a.leading_snug]}> 552 <Plural 553 value={additionalAuthorsCount} ··· 558 </Trans> 559 ) : ( 560 <Trans> 561 - New <Plural value={postsCount} one="post" other="posts" /> from{' '} 562 {firstAuthorLink} 563 </Trans> 564 )
··· 309 other={`${formattedAuthorsCount} others`} 310 /> 311 </Text>{' '} 312 + liked your skeet 313 </Trans> 314 ) : ( 315 + <Trans>{firstAuthorLink} liked your skeet</Trans> 316 ) 317 } else if (item.type === 'repost') { 318 a11yLabel = hasMultipleAuthors ··· 333 other={`${formattedAuthorsCount} others`} 334 /> 335 </Text>{' '} 336 + reskeeted your skeet 337 </Trans> 338 ) : ( 339 + <Trans>{firstAuthorLink} reskeeted your skeet</Trans> 340 ) 341 icon = <RepostIcon size="xl" style={{color: t.palette.positive_500}} /> 342 } else if (item.type === 'follow') { ··· 497 other={`${formattedAuthorsCount} others`} 498 /> 499 </Text>{' '} 500 + liked your reskeet 501 </Trans> 502 ) : ( 503 + <Trans>{firstAuthorLink} liked your reskeet</Trans> 504 ) 505 } else if (item.type === 'repost-via-repost') { 506 a11yLabel = hasMultipleAuthors ··· 521 other={`${formattedAuthorsCount} others`} 522 /> 523 </Text>{' '} 524 + reskeeted your reskeet 525 </Trans> 526 ) : ( 527 + <Trans>{firstAuthorLink} reskeeted your reskeet</Trans> 528 ) 529 icon = <RepostIcon size="xl" style={{color: t.palette.positive_500}} /> 530 } else if (item.type === 'subscribed-post') { ··· 541 ) 542 : _( 543 msg`New ${plural(postsCount, { 544 + one: 'skeet', 545 + other: 'skeets', 546 })} from ${firstAuthorName}`, 547 ) 548 notificationContent = hasMultipleAuthors ? ( 549 <Trans> 550 + New skeets from {firstAuthorLink} and{' '} 551 <Text style={[a.text_md, a.font_semi_bold, a.leading_snug]}> 552 <Plural 553 value={additionalAuthorsCount} ··· 558 </Trans> 559 ) : ( 560 <Trans> 561 + New <Plural value={postsCount} one="skeet" other="skeets" /> from{' '} 562 {firstAuthorLink} 563 </Trans> 564 )
+2 -2
src/view/com/post-thread/PostRepostedBy.tsx
··· 87 isLoading={isLoadingUri || isLoadingRepostedBy} 88 isError={isError} 89 emptyType="results" 90 - emptyTitle={_(msg`No reposts yet`)} 91 emptyMessage={_( 92 - msg`Nobody has reposted this yet. Maybe you should be the first!`, 93 )} 94 errorMessage={cleanError(resolveError || error)} 95 sideBorders={false}
··· 87 isLoading={isLoadingUri || isLoadingRepostedBy} 88 isError={isError} 89 emptyType="results" 90 + emptyTitle={_(msg`No reskeets yet`)} 91 emptyMessage={_( 92 + msg`Nobody has reskeeted this yet. Maybe you should be the first!`, 93 )} 94 errorMessage={cleanError(resolveError || error)} 95 sideBorders={false}
+1 -1
src/view/com/posts/DiscoverFallbackHeader.tsx
··· 27 <View style={{flex: 1}}> 28 <Text type="md" style={pal.text}> 29 <Trans> 30 - We ran out of posts from your follows. Here's the latest from{' '} 31 <TextLink 32 type="md-medium" 33 href="/profile/bsky.app/feed/whats-hot"
··· 27 <View style={{flex: 1}}> 28 <Text type="md" style={pal.text}> 29 <Trans> 30 + We ran out of skeets from your follows. Here's the latest from{' '} 31 <TextLink 32 type="md-medium" 33 href="/profile/bsky.app/feed/whats-hot"
+1 -1
src/view/com/posts/PostFeed.tsx
··· 795 return ( 796 <LoadMoreRetryBtn 797 label={_( 798 - msg`There was an issue fetching posts. Tap here to try again.`, 799 )} 800 onPress={onPressRetryLoadMore} 801 />
··· 795 return ( 796 <LoadMoreRetryBtn 797 label={_( 798 + msg`There was an issue fetching skeets. Tap here to try again.`, 799 )} 800 onPress={onPressRetryLoadMore} 801 />
+1 -1
src/view/com/posts/PostFeedErrorMessage.tsx
··· 69 return ( 70 <EmptyState 71 icon="ban" 72 - message={_l(msgLingui`Posts hidden`)} 73 style={{paddingVertical: 40}} 74 /> 75 )
··· 69 return ( 70 <EmptyState 71 icon="ban" 72 + message={_l(msgLingui`Skeets hidden`)} 73 style={{paddingVertical: 40}} 74 /> 75 )
+1 -1
src/view/com/posts/PostFeedItemCarousel.tsx
··· 60 ]}> 61 <Text style={[a.text_sm, a.font_bold, t.atoms.text_contrast_medium]}> 62 {items.length}{' '} 63 - <Plural value={items.length} one="repost" other="reposts" /> 64 </Text> 65 <View style={[a.gap_md, a.flex_row, a.align_end]}> 66 <Button
··· 60 ]}> 61 <Text style={[a.text_sm, a.font_bold, t.atoms.text_contrast_medium]}> 62 {items.length}{' '} 63 + <Plural value={items.length} one="reskeet" other="reskeets" /> 64 </Text> 65 <View style={[a.gap_md, a.flex_row, a.align_end]}> 66 <Button
+3 -3
src/view/com/posts/PostFeedReason.tsx
··· 74 style={styles.includeReason} 75 to={makeProfileLink(reason.by)} 76 label={ 77 - isOwner ? _(msg`Reposted by you`) : _(msg`Reposted by ${reposter}`) 78 } 79 onPress={onOpenReposter}> 80 <RepostIcon ··· 86 style={[t.atoms.text_contrast_medium, a.font_medium, a.leading_snug]} 87 numberOfLines={1}> 88 {isOwner ? ( 89 - <Trans>Reposted by you</Trans> 90 ) : ( 91 <Trans> 92 - Reposted by{' '} 93 <ProfileHoverCard did={reason.by.did}> 94 <WebOnlyInlineLinkText 95 label={reposter}
··· 74 style={styles.includeReason} 75 to={makeProfileLink(reason.by)} 76 label={ 77 + isOwner ? _(msg`Reskeeted by you`) : _(msg`Reskeeted by ${reposter}`) 78 } 79 onPress={onOpenReposter}> 80 <RepostIcon ··· 86 style={[t.atoms.text_contrast_medium, a.font_medium, a.leading_snug]} 87 numberOfLines={1}> 88 {isOwner ? ( 89 + <Trans>Reskeeted by you</Trans> 90 ) : ( 91 <Trans> 92 + Reskeeted by{' '} 93 <ProfileHoverCard did={reason.by.did}> 94 <WebOnlyInlineLinkText 95 label={reposter}
+2 -2
src/view/com/profile/ProfileMenu.tsx
··· 304 </Menu.Item> 305 <Menu.Item 306 testID="profileHeaderDropdownSearchBtn" 307 - label={_(msg`Search posts`)} 308 onPress={onPressSearch}> 309 <Menu.ItemText> 310 - <Trans>Search posts</Trans> 311 </Menu.ItemText> 312 <Menu.ItemIcon icon={SearchIcon} /> 313 </Menu.Item>
··· 304 </Menu.Item> 305 <Menu.Item 306 testID="profileHeaderDropdownSearchBtn" 307 + label={_(msg`Search skeets`)} 308 onPress={onPressSearch}> 309 <Menu.ItemText> 310 + <Trans>Search skeets</Trans> 311 </Menu.ItemText> 312 <Menu.ItemIcon icon={SearchIcon} /> 313 </Menu.Item>
+1 -1
src/view/screens/ModerationMutedAccounts.tsx
··· 200 ]}> 201 <Text style={[a.text_center, a.text_sm, t.atoms.text_contrast_high]}> 202 <Trans> 203 - Muted accounts have their posts removed from your feed and from your 204 notifications. Mutes are completely private. 205 </Trans> 206 </Text>
··· 200 ]}> 201 <Text style={[a.text_center, a.text_sm, t.atoms.text_contrast_high]}> 202 <Trans> 203 + Muted accounts have their skeets removed from your feed and from your 204 notifications. Mutes are completely private. 205 </Trans> 206 </Text>
+1 -1
src/view/screens/Profile.tsx
··· 222 const sectionTitles = [ 223 showFiltersTab ? _(msg`Labels`) : undefined, 224 showListsTab && hasLabeler ? _(msg`Lists`) : undefined, 225 - showPostsTab ? _(msg`Posts`) : undefined, 226 showRepliesTab ? _(msg`Replies`) : undefined, 227 showMediaTab ? _(msg`Media`) : undefined, 228 showVideosTab ? _(msg`Videos`) : undefined,
··· 222 const sectionTitles = [ 223 showFiltersTab ? _(msg`Labels`) : undefined, 224 showListsTab && hasLabeler ? _(msg`Lists`) : undefined, 225 + showPostsTab ? _(msg`Skeets`) : undefined, 226 showRepliesTab ? _(msg`Replies`) : undefined, 227 showMediaTab ? _(msg`Media`) : undefined, 228 showVideosTab ? _(msg`Videos`) : undefined,
+1 -1
src/view/shell/desktop/LeftNav.tsx
··· 580 style={[a.rounded_full]}> 581 <ButtonIcon icon={EditBig} position="left" /> 582 <ButtonText> 583 - <Trans context="action">New Post</Trans> 584 </ButtonText> 585 </Button> 586 </View>
··· 580 style={[a.rounded_full]}> 581 <ButtonIcon icon={EditBig} position="left" /> 582 <ButtonText> 583 + <Trans context="action">New Skeet</Trans> 584 </ButtonText> 585 </Button> 586 </View>