Bluesky app fork with some witchin' additions 💫

Merge feature/skeethook

thanks callie https://tangled.org/jollywhoppers.com/witchsky.app/pulls/54

xan.lol e31d3ba4 88f2b979

verified
+536 -274
+10 -10
src/Navigation.tsx
··· 218 218 name="ModerationInteractionSettings" 219 219 getComponent={() => ModerationInteractionSettings} 220 220 options={{ 221 - title: title(msg`Skeet Interaction Settings`), 221 + title: title(msg`Post Interaction Settings`), 222 222 requireAuth: true, 223 223 }} 224 224 /> ··· 277 277 name="ProfileSearch" 278 278 getComponent={() => ProfileSearchScreen} 279 279 options={({route}) => ({ 280 - title: title(msg`Search @${route.params.name}'s skeets`), 280 + title: title(msg`Search @${route.params.name}'s posts`), 281 281 })} 282 282 /> 283 283 <Stack.Screen 284 284 name="PostThread" 285 285 getComponent={() => PostThreadScreen} 286 286 options={({route}) => ({ 287 - title: title(msg`Skeet by @${route.params.name}`), 287 + title: title(msg`Post by @${route.params.name}`), 288 288 })} 289 289 /> 290 290 <Stack.Screen 291 291 name="PostLikedBy" 292 292 getComponent={() => PostLikedByScreen} 293 293 options={({route}) => ({ 294 - title: title(msg`Skeet by @${route.params.name}`), 294 + title: title(msg`Post by @${route.params.name}`), 295 295 })} 296 296 /> 297 297 <Stack.Screen 298 298 name="PostRepostedBy" 299 299 getComponent={() => PostRepostedByScreen} 300 300 options={({route}) => ({ 301 - title: title(msg`Skeet by @${route.params.name}`), 301 + title: title(msg`Post by @${route.params.name}`), 302 302 })} 303 303 /> 304 304 <Stack.Screen 305 305 name="PostQuotes" 306 306 getComponent={() => PostQuotesScreen} 307 307 options={({route}) => ({ 308 - title: title(msg`Skeet by @${route.params.name}`), 308 + title: title(msg`Post by @${route.params.name}`), 309 309 })} 310 310 /> 311 311 <Stack.Screen ··· 496 496 name="RepostNotificationSettings" 497 497 getComponent={() => RepostNotificationSettingsScreen} 498 498 options={{ 499 - title: title(msg`Reskeet notifications`), 499 + title: title(msg`Repost notifications`), 500 500 requireAuth: true, 501 501 }} 502 502 /> ··· 512 512 name="LikesOnRepostsNotificationSettings" 513 513 getComponent={() => LikesOnRepostsNotificationSettingsScreen} 514 514 options={{ 515 - title: title(msg`Likes of your reskeets notifications`), 515 + title: title(msg`Likes of your reposts notifications`), 516 516 requireAuth: true, 517 517 }} 518 518 /> ··· 520 520 name="RepostsOnRepostsNotificationSettings" 521 521 getComponent={() => RepostsOnRepostsNotificationSettingsScreen} 522 522 options={{ 523 - title: title(msg`Reskeets of your reskeets notifications`), 523 + title: title(msg`Reposts of your reposts notifications`), 524 524 requireAuth: true, 525 525 }} 526 526 /> ··· 644 644 name="Bookmarks" 645 645 getComponent={() => BookmarksScreen} 646 646 options={{ 647 - title: title(msg`Saved Skeets`), 647 + title: title(msg`Saved Posts`), 648 648 requireAuth: true, 649 649 }} 650 650 />
+2 -2
src/components/Post/PostRepliedTo.tsx
··· 25 25 26 26 let label 27 27 if (isParentBlocked) { 28 - label = <Trans context="description">Replied to a blocked skeet</Trans> 28 + label = <Trans context="description">Replied to a blocked post</Trans> 29 29 } else if (isParentNotFound) { 30 - label = <Trans context="description">Replied to a skeet</Trans> 30 + label = <Trans context="description">Replied to a post</Trans> 31 31 } else if (parentAuthor) { 32 32 const did = 33 33 typeof parentAuthor === 'string' ? parentAuthor : parentAuthor.did
+4 -4
src/components/PostControls/BookmarkButton.tsx
··· 64 64 <toast.Outer> 65 65 <toast.Icon /> 66 66 <toast.Text> 67 - <Trans>Skeet saved</Trans> 67 + <Trans>Post saved</Trans> 68 68 </toast.Text> 69 69 {!disableUndo && ( 70 70 <toast.Action ··· 104 104 <toast.Outer> 105 105 <toast.Icon icon={TrashIcon} /> 106 106 <toast.Text> 107 - <Trans>Removed from saved skeets</Trans> 107 + <Trans>Removed from saved posts</Trans> 108 108 </toast.Text> 109 109 {!disableUndo && ( 110 110 <toast.Action ··· 138 138 big={big} 139 139 label={ 140 140 isBookmarked 141 - ? _(msg`Remove from saved skeets`) 142 - : _(msg`Add to saved skeets`) 141 + ? _(msg`Remove from saved posts`) 142 + : _(msg`Add to saved posts`) 143 143 } 144 144 onPress={onHandlePress} 145 145 hitSlop={hitSlop}>
+20 -20
src/components/PostControls/PostMenu/PostMenuItems.tsx
··· 205 205 const onDeletePost = () => { 206 206 deletePostMutate({uri: postUri}).then( 207 207 () => { 208 - Toast.show(_(msg({message: 'Skeet deleted', context: 'toast'}))) 208 + Toast.show(_(msg({message: 'Post deleted', context: 'toast'}))) 209 209 210 210 const route = getCurrentRoute(navigation.getState()) 211 211 if (route.name === 'PostThread') { ··· 225 225 }, 226 226 e => { 227 227 logger.error('Failed to delete post', {message: e}) 228 - Toast.show(_(msg`Failed to delete skeet, please try again`), 'xmark') 228 + Toast.show(_(msg`Failed to delete post, please try again`), 'xmark') 229 229 }, 230 230 ) 231 231 } ··· 503 503 }) 504 504 Toast.show( 505 505 isDetach 506 - ? _(msg`Quote skeet was successfully detached`) 507 - : _(msg`Quote skeet was re-attached`), 506 + ? _(msg`Quote post was successfully detached`) 507 + : _(msg`Quote post was re-attached`), 508 508 ) 509 509 } catch (e: any) { 510 510 Toast.show( ··· 694 694 <> 695 695 <Prompt.Basic 696 696 control={redraftPromptControl} 697 - title={_(msg`Redraft this skeet?`)} 697 + title={_(msg`Redraft this post?`)} 698 698 description={_( 699 - msg`This will delete the original skeet and open the composer with its content.`, 699 + msg`This will delete the original post and open the composer with its content.`, 700 700 )} 701 701 onConfirm={onConfirmRedraft} 702 702 confirmButtonCta={_(msg`Redraft`)} ··· 782 782 testID="postDropdownCopyTextBtn" 783 783 label={_(msg`Copy post text`)} 784 784 onPress={onCopyPostText}> 785 - <Menu.ItemText>{_(msg`Copy skeet text`)}</Menu.ItemText> 785 + <Menu.ItemText>{_(msg`Copy post text`)}</Menu.ItemText> 786 786 <Menu.ItemIcon icon={ClipboardIcon} position="right" /> 787 787 </Menu.Item> 788 788 </> 789 789 ) : ( 790 790 <Menu.Item 791 791 testID="postDropdownSignInBtn" 792 - label={_(msg`Sign in to view skeet`)} 792 + label={_(msg`Sign in to view post`)} 793 793 onPress={onSignIn}> 794 - <Menu.ItemText>{_(msg`Sign in to view skeet`)}</Menu.ItemText> 794 + <Menu.ItemText>{_(msg`Sign in to view post`)}</Menu.ItemText> 795 795 <Menu.ItemIcon icon={Eye} position="right" /> 796 796 </Menu.Item> 797 797 )} ··· 874 874 label={ 875 875 isReply 876 876 ? _(msg`Hide reply for me`) 877 - : _(msg`Hide skeet for me`) 877 + : _(msg`Hide post for me`) 878 878 } 879 879 onPress={() => hidePromptControl.open()}> 880 880 <Menu.ItemText> 881 881 {isReply 882 882 ? _(msg`Hide reply for me`) 883 - : _(msg`Hide skeet for me`)} 883 + : _(msg`Hide post for me`)} 884 884 </Menu.ItemText> 885 885 <Menu.ItemIcon icon={EyeSlash} position="right" /> 886 886 </Menu.Item> ··· 982 982 983 983 <Menu.Item 984 984 testID="postDropdownReportBtn" 985 - label={_(msg`Report skeet`)} 985 + label={_(msg`Report post`)} 986 986 onPress={() => reportDialogControl.open()}> 987 - <Menu.ItemText>{_(msg`Report skeet`)}</Menu.ItemText> 987 + <Menu.ItemText>{_(msg`Report post`)}</Menu.ItemText> 988 988 <Menu.ItemIcon icon={Warning} position="right" /> 989 989 </Menu.Item> 990 990 </> ··· 1015 1015 testID="postDropdownDeleteBtn" 1016 1016 label={_(msg`Delete post`)} 1017 1017 onPress={() => deletePromptControl.open()}> 1018 - <Menu.ItemText>{_(msg`Delete skeet`)}</Menu.ItemText> 1018 + <Menu.ItemText>{_(msg`Delete post`)}</Menu.ItemText> 1019 1019 <Menu.ItemIcon icon={Trash} position="right" /> 1020 1020 </Menu.Item> 1021 1021 </> ··· 1027 1027 1028 1028 <Prompt.Basic 1029 1029 control={deletePromptControl} 1030 - title={_(msg`Delete this skeet?`)} 1030 + title={_(msg`Delete this post?`)} 1031 1031 description={_( 1032 - msg`If you remove this skeet, you won't be able to recover it.`, 1032 + msg`If you remove this post, you won't be able to recover it.`, 1033 1033 )} 1034 1034 onConfirm={onDeletePost} 1035 1035 confirmButtonCta={_(msg`Delete`)} ··· 1038 1038 1039 1039 <Prompt.Basic 1040 1040 control={hidePromptControl} 1041 - title={isReply ? _(msg`Hide this reply?`) : _(msg`Hide this skeet?`)} 1041 + title={isReply ? _(msg`Hide this reply?`) : _(msg`Hide this post?`)} 1042 1042 description={_( 1043 - msg`This skeet will be hidden from feeds and threads. This cannot be undone.`, 1043 + msg`This post will be hidden from feeds and threads. This cannot be undone.`, 1044 1044 )} 1045 1045 onConfirm={onHidePost} 1046 1046 confirmButtonCta={_(msg`Hide`)} ··· 1063 1063 1064 1064 <Prompt.Basic 1065 1065 control={quotePostDetachConfirmControl} 1066 - title={_(msg`Detach quote skeet?`)} 1066 + title={_(msg`Detach quote post?`)} 1067 1067 description={_( 1068 - msg`This will remove your skeet from this quote skeet for all users, and replace it with a placeholder.`, 1068 + msg`This will remove your post from this quote post for all users, and replace it with a placeholder.`, 1069 1069 )} 1070 1070 onConfirm={onToggleQuotePostAttachment} 1071 1071 confirmButtonCta={_(msg`Yes, detach`)}
+1 -1
src/components/PostControls/PostMenu/index.tsx
··· 63 63 return ( 64 64 <EventStopper onKeyDown={false}> 65 65 <Menu.Root control={lazyMenuControl}> 66 - <Menu.Trigger label={_(msg`Open skeet options menu`)}> 66 + <Menu.Trigger label={_(msg`Open post options menu`)}> 67 67 {({props}) => { 68 68 return ( 69 69 <PostControlButton
+10 -10
src/components/PostControls/RepostButton.tsx
··· 142 142 const onPressClose = useCallback(() => control.close(), [control]) 143 143 144 144 return ( 145 - <Dialog.ScrollableInner label={_(msg`Reskeet or quote skeet`)}> 145 + <Dialog.ScrollableInner label={_(msg`Repost or quote post`)}> 146 146 <View style={a.gap_xl}> 147 147 <View style={a.gap_xs}> 148 148 <Button 149 149 style={[a.justify_start, a.px_md, a.gap_sm]} 150 150 label={ 151 151 isReposted 152 - ? _(msg`Remove reskeet`) 153 - : _(msg({message: `Reskeet`, context: 'action'})) 152 + ? _(msg`Remove repost`) 153 + : _(msg({message: `Repost`, context: 'action'})) 154 154 } 155 155 onPress={onPressRepost} 156 156 size="large" ··· 159 159 <RepostIcon size="lg" fill={t.palette.primary_500} /> 160 160 <Text style={[a.font_semi_bold, a.text_xl]}> 161 161 {isReposted ? ( 162 - <Trans>Remove reskeet</Trans> 162 + <Trans>Remove repost</Trans> 163 163 ) : ( 164 - <Trans context="action">Reskeet</Trans> 164 + <Trans context="action">Repost</Trans> 165 165 )} 166 166 </Text> 167 167 </Button> ··· 171 171 style={[a.justify_start, a.px_md, a.gap_sm]} 172 172 label={ 173 173 embeddingDisabled 174 - ? _(msg`Quote skeets disabled`) 175 - : _(msg`Quote skeet`) 174 + ? _(msg`Quote posts disabled`) 175 + : _(msg`Quote post`) 176 176 } 177 177 onPress={onPressQuote} 178 178 size="large" ··· 193 193 embeddingDisabled && t.atoms.text_contrast_low, 194 194 ]}> 195 195 {embeddingDisabled ? ( 196 - <Trans>Quote skeets disabled</Trans> 196 + <Trans>Quote posts disabled</Trans> 197 197 ) : ( 198 - <Trans>Quote skeet</Trans> 198 + <Trans>Quote post</Trans> 199 199 )} 200 200 </Text> 201 201 </Button> 202 202 </View> 203 203 <Button 204 - label={_(msg`Cancel quote skeet`)} 204 + label={_(msg`Cancel quote post`)} 205 205 onPress={onPressClose} 206 206 size="large" 207 207 color="secondary">
+9 -9
src/components/PostControls/RepostButton.web.tsx
··· 65 65 <Menu.Item 66 66 label={ 67 67 isReposted 68 - ? _(msg`Undo reskeet`) 69 - : _(msg({message: `Reskeet`, context: `action`})) 68 + ? _(msg`Undo repost`) 69 + : _(msg({message: `Repost`, context: `action`})) 70 70 } 71 71 testID="repostDropdownRepostBtn" 72 72 onPress={onRepost}> 73 73 <Menu.ItemText> 74 74 {isReposted 75 - ? _(msg`Undo reskeet`) 76 - : _(msg({message: `Reskeet`, context: `action`}))} 75 + ? _(msg`Undo repost`) 76 + : _(msg({message: `Repost`, context: `action`}))} 77 77 </Menu.ItemText> 78 78 <Menu.ItemIcon icon={Repost} position="right" /> 79 79 </Menu.Item> ··· 81 81 disabled={embeddingDisabled} 82 82 label={ 83 83 embeddingDisabled 84 - ? _(msg`Quote skeets disabled`) 85 - : _(msg`Quote skeet`) 84 + ? _(msg`Quote posts disabled`) 85 + : _(msg`Quote post`) 86 86 } 87 87 testID="repostDropdownQuoteBtn" 88 88 onPress={onQuote}> 89 89 <Menu.ItemText> 90 90 {embeddingDisabled 91 - ? _(msg`Quote skeets disabled`) 92 - : _(msg`Quote skeet`)} 91 + ? _(msg`Quote posts disabled`) 92 + : _(msg`Quote post`)} 93 93 </Menu.ItemText> 94 94 <Menu.ItemIcon icon={Quote} position="right" /> 95 95 </Menu.Item> ··· 101 101 onPress={() => requireAuth(() => {})} 102 102 active={isReposted} 103 103 activeColor={t.palette.positive_500} 104 - label={_(msg`Reskeet or quote skeet`)} 104 + label={_(msg`Repost or quote post`)} 105 105 big={big}> 106 106 <PostControlButtonIcon icon={Repost} /> 107 107 {typeof repostCount !== 'undefined' && repostCount > 0 && (
+1 -1
src/components/PostControls/ShareMenu/RecentChats.tsx
··· 120 120 return ( 121 121 <Button 122 122 onPress={onPress} 123 - label={_(msg`Send skeet to ${name}`)} 123 + label={_(msg`Send post to ${name}`)} 124 124 style={[ 125 125 a.flex_col, 126 126 {width: WIDTH},
+5 -5
src/components/PostControls/ShareMenu/ShareMenuItems.tsx
··· 161 161 label={_(msg`Open original post`)} 162 162 onPress={onOpenOriginalPost}> 163 163 <Menu.ItemText> 164 - <Trans>Open original skeet</Trans> 164 + <Trans>Open original post</Trans> 165 165 </Menu.ItemText> 166 166 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 167 167 </Menu.Item> ··· 172 172 label={_(msg`Open post in PDSls`)} 173 173 onPress={onOpenPostInPdsls}> 174 174 <Menu.ItemText> 175 - <Trans>Open skeet in PDSls</Trans> 175 + <Trans>Open post in PDSls</Trans> 176 176 </Menu.ItemText> 177 177 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 178 178 </Menu.Item> ··· 205 205 label={_(msg`Copy link to post`)} 206 206 onPress={onCopyLink}> 207 207 <Menu.ItemText> 208 - <Trans>Copy link to skeet</Trans> 208 + <Trans>Copy link to post</Trans> 209 209 </Menu.ItemText> 210 210 <Menu.ItemIcon icon={ChainLinkIcon} position="right" /> 211 211 </Menu.Item> ··· 227 227 <Admonition 228 228 type="warning" 229 229 style={[a.flex_1, a.border_0, a.p_0, a.bg_transparent]}> 230 - <Trans>This skeet is only visible to logged-in users.</Trans> 230 + <Trans>This post is only visible to logged-in users.</Trans> 231 231 </Admonition> 232 232 </Menu.ContainerItem> 233 233 </Menu.Group> ··· 240 240 label={_(msg`Share post at:// URI`)} 241 241 onPress={onShareATURI}> 242 242 <Menu.ItemText> 243 - <Trans>Share skeet at:// URI</Trans> 243 + <Trans>Share post at:// URI</Trans> 244 244 </Menu.ItemText> 245 245 <Menu.ItemIcon icon={ClipboardIcon} position="right" /> 246 246 </Menu.Item>
+6 -8
src/components/PostControls/ShareMenu/ShareMenuItems.web.tsx
··· 115 115 label={_(msg`Copy link to post`)} 116 116 onPress={onCopyLink}> 117 117 <Menu.ItemText> 118 - <Trans>Copy link to skeet</Trans> 118 + <Trans>Copy link to post</Trans> 119 119 </Menu.ItemText> 120 120 <Menu.ItemIcon icon={ChainLinkIcon} position="right" /> 121 121 </Menu.Item> ··· 142 142 label={_(msg`Open original post`)} 143 143 onPress={onOpenOriginalPost}> 144 144 <Menu.ItemText> 145 - <Trans>Open original skeet</Trans> 145 + <Trans>Open original post</Trans> 146 146 </Menu.ItemText> 147 147 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 148 148 </Menu.Item> ··· 154 154 label={_(msg`Open post in PDSls`)} 155 155 onPress={onOpenPostInPdsls}> 156 156 <Menu.ItemText> 157 - <Trans>Open skeet in PDSls</Trans> 157 + <Trans>Open post in PDSls</Trans> 158 158 </Menu.ItemText> 159 159 <Menu.ItemIcon icon={ExternalIcon} position="right" /> 160 160 </Menu.Item> ··· 183 183 ax.metric('share:press:embed', {}) 184 184 embedPostControl.open() 185 185 }}> 186 - <Menu.ItemText>{_(msg`Embed skeet`)}</Menu.ItemText> 186 + <Menu.ItemText>{_(msg`Embed post`)}</Menu.ItemText> 187 187 <Menu.ItemIcon icon={CodeBracketsIcon} position="right" /> 188 188 </Menu.Item> 189 189 )} ··· 193 193 {hasSession && <Menu.Divider />} 194 194 {copyLinkItem} 195 195 <Menu.LabelText style={{maxWidth: 220}}> 196 - <Trans> 197 - Note: This skeet is only visible to logged-in users. 198 - </Trans> 196 + <Trans>Note: This post is only visible to logged-in users.</Trans> 199 197 </Menu.LabelText> 200 198 </> 201 199 )} ··· 208 206 label={_(msg`Copy post at:// URI`)} 209 207 onPress={onShareATURI}> 210 208 <Menu.ItemText> 211 - <Trans>Copy skeet at:// URI</Trans> 209 + <Trans>Copy post at:// URI</Trans> 212 210 </Menu.ItemText> 213 211 <Menu.ItemIcon icon={ClipboardIcon} position="right" /> 214 212 </Menu.Item>
+1 -1
src/components/ProgressGuide/List.tsx
··· 93 93 <ProgressGuideTask 94 94 current={guide.numLikes + 1} 95 95 total={10 + 1} 96 - title={_(msg`Like 10 skeets`)} 96 + title={_(msg`Like 10 posts`)} 97 97 subtitle={_(msg`Teach our algorithm what you like`)} 98 98 /> 99 99 <ProgressGuideTask
+2 -2
src/components/TrendingTopics.tsx
··· 180 180 if (link.startsWith('/search')) { 181 181 return { 182 182 type: 'topic', 183 - label: _(msg`Browse skeets about ${displayName}`), 183 + label: _(msg`Browse posts about ${displayName}`), 184 184 displayName, 185 185 uri: undefined, 186 186 url: link, ··· 188 188 } else if (link.startsWith('/hashtag')) { 189 189 return { 190 190 type: 'tag', 191 - label: _(msg`Browse skeets tagged with ${displayName}`), 191 + label: _(msg`Browse posts tagged with ${displayName}`), 192 192 displayName, 193 193 // displayName: displayName.replace(/^#/, ''), 194 194 uri: undefined,
+5 -5
src/components/WhoCanReply.tsx
··· 222 222 style={web({maxWidth: 400})}> 223 223 <View style={[a.gap_sm]}> 224 224 <Text style={[a.font_semi_bold, a.text_xl, a.pb_sm]}> 225 - <Trans>Who can interact with this skeet?</Trans> 225 + <Trans>Who can interact with this post?</Trans> 226 226 </Text> 227 227 <Rules 228 228 post={post} ··· 271 271 ]}> 272 272 {settings.length === 0 ? ( 273 273 <Trans> 274 - This skeet has an unknown type of threadgate on it. Your app may be 274 + This post has an unknown type of threadgate on it. Your app may be 275 275 out of date. 276 276 </Trans> 277 277 ) : settings[0].type === 'everybody' ? ( 278 - <Trans>Everybody can reply to this skeet.</Trans> 278 + <Trans>Everybody can reply to this post.</Trans> 279 279 ) : settings[0].type === 'nobody' ? ( 280 - <Trans>Replies to this skeet are disabled.</Trans> 280 + <Trans>Replies to this post are disabled.</Trans> 281 281 ) : ( 282 282 <Trans> 283 283 Only{' '} ··· 299 299 a.flex_wrap, 300 300 t.atoms.text_contrast_medium, 301 301 ]}> 302 - <Trans>No one but the author can quote this skeet.</Trans> 302 + <Trans>No one but the author can quote this post.</Trans> 303 303 </Text> 304 304 )} 305 305 </>
+3 -3
src/components/activity-notifications/SubscribeProfileButton.tsx
··· 57 57 const wrappedOnPress = requireEmailVerification(onPress, { 58 58 instructions: [ 59 59 <Trans key="message"> 60 - Before you can get notifications for {name}'s skeets, you must first 60 + Before you can get notifications for {name}'s posts, you must first 61 61 verify your email. 62 62 </Trans>, 63 63 ], ··· 86 86 size="small" 87 87 color={tooltipVisible ? 'primary_subtle' : 'secondary'} 88 88 shape={enableSquareButtons ? 'square' : 'round'} 89 - label={_(msg`Get notified when ${name} skeets`)} 89 + label={_(msg`Get notified when ${name} posts`)} 90 90 onPress={wrappedOnPress}> 91 91 <ButtonIcon icon={Icon} size="md" /> 92 92 </Button> 93 93 </Tooltip.Target> 94 94 <Tooltip.TextBubble> 95 95 <Text> 96 - <Trans>Get notified about new skeets</Trans> 96 + <Trans>Get notified about new posts</Trans> 97 97 </Text> 98 98 </Tooltip.TextBubble> 99 99 </Tooltip.Outer>
+3 -3
src/components/activity-notifications/SubscribeProfileDialog.tsx
··· 216 216 return ( 217 217 <Dialog.ScrollableInner 218 218 style={web({maxWidth: 400})} 219 - label={_(msg`Get notified of new skeets from ${name}`)}> 219 + label={_(msg`Get notified of new posts from ${name}`)}> 220 220 <View style={[a.gap_lg]}> 221 221 <View style={[a.gap_xs]}> 222 222 <Text style={[a.font_bold, a.text_2xl]}> ··· 247 247 onChange={onChange}> 248 248 <View style={[a.gap_sm]}> 249 249 <Toggle.Item 250 - label={_(msg`Skeets`)} 250 + label={_(msg`Posts`)} 251 251 name="post" 252 252 style={[ 253 253 a.flex_1, ··· 259 259 ]}> 260 260 <Toggle.LabelText 261 261 style={[t.atoms.text, a.font_normal, a.text_md, a.flex_1]}> 262 - <Trans>Skeets</Trans> 262 + <Trans>Posts</Trans> 263 263 </Toggle.LabelText> 264 264 <Toggle.Switch /> 265 265 </Toggle.Item>
+2 -2
src/components/dialogs/Embed.tsx
··· 105 105 <View style={[a.gap_lg]}> 106 106 <View style={[a.gap_sm]}> 107 107 <Text style={[a.text_2xl, a.font_bold]}> 108 - <Trans>Embed skeet</Trans> 108 + <Trans>Embed post</Trans> 109 109 </Text> 110 110 <Text 111 111 style={[a.text_md, t.atoms.text_contrast_medium, a.leading_normal]}> 112 112 <Trans> 113 - Embed this skeet in your website. Simply copy the following snippet 113 + Embed this post in your website. Simply copy the following snippet 114 114 and paste it into the HTML code of your website. 115 115 </Trans> 116 116 </Text>
+4 -4
src/components/dialogs/MutedWords.tsx
··· 119 119 </Text> 120 120 <Text style={[a.pb_lg, a.leading_snug, t.atoms.text_contrast_medium]}> 121 121 <Trans> 122 - Skeets can be muted based on their text, their tags, or both. We 123 - recommend avoiding common words that appear in many skeets, since it 124 - can result in no skeets being shown. 122 + Posts can be muted based on their text, their tags, or both. We 123 + recommend avoiding common words that appear in many posts, since it 124 + can result in no posts being shown. 125 125 </Trans> 126 126 </Text> 127 127 ··· 261 261 262 262 <View style={[a.flex_row, a.align_center, a.gap_sm, a.flex_wrap]}> 263 263 <Toggle.Item 264 - label={_(msg`Mute this word in skeet text and tags`)} 264 + label={_(msg`Mute this word in post text and tags`)} 265 265 name="content" 266 266 style={[a.flex_1]}> 267 267 <TargetToggle>
+4 -4
src/components/dialogs/PostInteractionSettingsDialog.tsx
··· 260 260 261 261 return ( 262 262 <Dialog.ScrollableInner 263 - label={_(msg`Edit skeet interaction settings`)} 263 + label={_(msg`Edit post interaction settings`)} 264 264 style={[web({maxWidth: 400}), a.w_full]}> 265 265 {isLoading ? ( 266 266 <View ··· 273 273 ]}> 274 274 <Loader size="xl" /> 275 275 <Text style={[a.italic, a.text_center]}> 276 - <Trans>Loading skeet interaction settings...</Trans> 276 + <Trans>Loading post interaction settings...</Trans> 277 277 </Text> 278 278 </View> 279 279 ) : ( ··· 630 630 {({selected}) => ( 631 631 <Toggle.Panel active={selected}> 632 632 <Toggle.PanelText icon={QuoteIcon}> 633 - <Trans>Allow quote skeets</Trans> 633 + <Trans>Allow quote posts</Trans> 634 634 </Toggle.PanelText> 635 635 <Toggle.Switch /> 636 636 </Toggle.Panel> ··· 679 679 return ( 680 680 <View style={[a.pb_lg]}> 681 681 <Text style={[a.text_2xl, a.font_bold]}> 682 - <Trans>Skeet interaction settings</Trans> 682 + <Trans>Post interaction settings</Trans> 683 683 </Text> 684 684 </View> 685 685 )
+2 -2
src/components/dialogs/lists/CreateOrEditListDialog.tsx
··· 354 354 : _(msg`Create moderation list`) 355 355 356 356 const displayNamePlaceholder = isCurateList 357 - ? _(msg`e.g. Great Skeeters`) 357 + ? _(msg`e.g. Great Posters`) 358 358 : _(msg`e.g. Spammers`) 359 359 360 360 const descriptionPlaceholder = isCurateList 361 - ? _(msg`e.g. The skeeters who never miss.`) 361 + ? _(msg`e.g. The posters who never miss.`) 362 362 : _(msg`e.g. Users that repeatedly reply with ads.`) 363 363 364 364 return (
+3 -3
src/components/dialogs/nuxs/BookmarksAnnouncement.tsx
··· 34 34 <Dialog.Handle /> 35 35 36 36 <Dialog.ScrollableInner 37 - label={_(msg`Introducing saved skeets AKA bookmarks`)} 37 + label={_(msg`Introducing saved posts AKA bookmarks`)} 38 38 style={[web({maxWidth: 440})]} 39 39 contentContainerStyle={[ 40 40 { ··· 140 140 maxWidth: 300, 141 141 }, 142 142 ]}> 143 - <Trans>Saved Skeets</Trans> 143 + <Trans>Saved Posts</Trans> 144 144 </Text> 145 145 <Text 146 146 style={[ ··· 152 152 }, 153 153 ]}> 154 154 <Trans> 155 - Finally! Keep track of skeets that matter to you. Save them to 155 + Finally! Keep track of posts that matter to you. Save them to 156 156 revisit anytime. 157 157 </Trans> 158 158 </Text>
+3 -3
src/components/dms/ChatEmptyPill.tsx
··· 33 33 34 34 const prompts = React.useMemo(() => { 35 35 return [ 36 - _(msg`Say hi!`), 36 + _(msg`Say hello!`), 37 37 _(msg`Share your favorite feed!`), 38 - _(msg`Say something funny!`), 38 + _(msg`Tell a joke!`), 39 39 _(msg`Share a fun fact!`), 40 40 _(msg`Share a cool story!`), 41 41 _(msg`Send a neat website!`), 42 - _(msg`Clip 🐴 clop 🐴 #horsefacts`), 42 + _(msg`Clip 🐴 clop 🐴`), 43 43 ] 44 44 }, [_]) 45 45
+1 -1
src/components/dms/dialogs/ShareViaChatDialog.tsx
··· 60 60 61 61 return ( 62 62 <SearchablePeopleList 63 - title={_(msg`Send skeet to...`)} 63 + title={_(msg`Send post to...`)} 64 64 onSelectChat={onCreateChat} 65 65 showRecentConvos 66 66 sortByMessageDeclaration
+4 -4
src/components/moderation/ModerationDetailsDialog.tsx
··· 106 106 description = _(msg`You have muted this account.`) 107 107 } 108 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.`) 109 + name = _(msg`Post Hidden by Muted Word`) 110 + description = _(msg`You've chosen to hide a word or tag within this post.`) 111 111 } else if (modcause.type === 'hidden') { 112 - name = _(msg`Skeet Hidden by You`) 113 - description = _(msg`You have hidden this skeet.`) 112 + name = _(msg`Post Hidden by You`) 113 + description = _(msg`You have hidden this post.`) 114 114 } else if (modcause.type === 'reply-hidden') { 115 115 const isYou = currentAccount?.did === modcause.source.did 116 116 name = isYou
+2 -2
src/components/moderation/ReportDialog/copy.ts
··· 22 22 } 23 23 case 'post': { 24 24 return { 25 - title: _(msg`Report this skeet`), 26 - subtitle: _(msg`Why should this skeet be reviewed?`), 25 + title: _(msg`Report this post`), 26 + subtitle: _(msg`Why should this post be reviewed?`), 27 27 } 28 28 } 29 29 case 'list': {
+1 -1
src/lib/api/index.ts
··· 187 187 }) 188 188 if (isNetworkError(e)) { 189 189 throw new Error( 190 - t`Skeet failed to upload. Please check your Internet connection and try again.`, 190 + t`Post failed to upload. Please check your Internet connection and try again.`, 191 191 ) 192 192 } else { 193 193 throw e
+3 -3
src/lib/hooks/useNotificationHandler.ts
··· 133 133 Notifications.setNotificationChannelAsync( 134 134 'repost' satisfies NotificationReason, 135 135 { 136 - name: _(msg`Reskeets`), 136 + name: _(msg`Reposts`), 137 137 importance: Notifications.AndroidImportance.HIGH, 138 138 }, 139 139 ) ··· 168 168 Notifications.setNotificationChannelAsync( 169 169 'like-via-repost' satisfies NotificationReason, 170 170 { 171 - name: _(msg`Likes of your reskeets`), 171 + name: _(msg`Likes of your reposts`), 172 172 importance: Notifications.AndroidImportance.HIGH, 173 173 }, 174 174 ) 175 175 Notifications.setNotificationChannelAsync( 176 176 'repost-via-repost' satisfies NotificationReason, 177 177 { 178 - name: _(msg`Reskeets of your reskeets`), 178 + name: _(msg`Reposts of your reposts`), 179 179 importance: Notifications.AndroidImportance.HIGH, 180 180 }, 181 181 )
+4 -4
src/lib/moderation/useModerationCauseDescription.ts
··· 104 104 if (cause.type === 'mute-word') { 105 105 return { 106 106 icon: EyeSlash, 107 - name: _(msg`Skeet Hidden by Muted Word`), 107 + name: _(msg`Post Hidden by Muted Word`), 108 108 description: _( 109 - msg`You've chosen to hide a word or tag within this skeet.`, 109 + msg`You've chosen to hide a word or tag within this post.`, 110 110 ), 111 111 } 112 112 } 113 113 if (cause.type === 'hidden') { 114 114 return { 115 115 icon: EyeSlash, 116 - name: _(msg`Skeet Hidden by You`), 117 - description: _(msg`You have hidden this skeet.`), 116 + name: _(msg`Post Hidden by You`), 117 + description: _(msg`You have hidden this post`), 118 118 } 119 119 } 120 120 if (cause.type === 'reply-hidden') {
+5 -3
src/locale/i18n.ts
··· 13 13 14 14 import {sanitizeAppLanguageSetting} from '#/locale/helpers' 15 15 import {AppLanguage} from '#/locale/languages' 16 + import {applySkeetReplacements} from '#/locale/linguiHook' 16 17 import {messages as messagesAn} from '#/locale/locales/an/messages' 17 18 import {messages as messagesAst} from '#/locale/locales/ast/messages' 18 19 import {messages as messagesCa} from '#/locale/locales/ca/messages' ··· 125 126 break 126 127 } 127 128 case AppLanguage.en_GB: { 128 - i18n.loadAndActivate({locale, messages: messagesEn_GB}) 129 + const transformedMsgs = applySkeetReplacements(messagesEn_GB, locale) 130 + i18n.loadAndActivate({locale, messages: transformedMsgs}) 129 131 await Promise.all([ 130 132 import('@formatjs/intl-pluralrules/locale-data/en'), 131 133 import('@formatjs/intl-numberformat/locale-data/en-GB'), ··· 418 420 await Promise.all([ 419 421 import('@formatjs/intl-pluralrules/locale-data/zh'), 420 422 import('@formatjs/intl-numberformat/locale-data/zh'), 421 - import('@formatjs/intl-displaynames/locale-data/zh'), 422 423 ]) 423 424 break 424 425 } 425 426 default: { 426 - i18n.loadAndActivate({locale, messages: messagesEn}) 427 + const transformedMsgs = applySkeetReplacements(messagesEn, locale) 428 + i18n.loadAndActivate({locale, messages: transformedMsgs}) 427 429 break 428 430 } 429 431 }
+22 -5
src/locale/i18n.web.ts
··· 1 1 import {useEffect} from 'react' 2 - import {i18n} from '@lingui/core' 2 + import {i18n, type Messages} from '@lingui/core' 3 3 4 4 import {sanitizeAppLanguageSetting} from '#/locale/helpers' 5 5 import {AppLanguage} from '#/locale/languages' 6 + import {applySkeetReplacements} from '#/locale/linguiHook' 6 7 import {useLanguagePrefs} from '#/state/preferences' 7 8 8 9 /** 9 10 * We do a dynamic import of just the catalog that we need 10 11 */ 11 12 export async function dynamicActivate(locale: AppLanguage) { 12 - let mod: any 13 + let mod: {messages: Messages} 13 14 14 15 switch (locale) { 15 16 case AppLanguage.an: { ··· 40 41 mod = await import(`./locales/el/messages`) 41 42 break 42 43 } 44 + case AppLanguage.en: { 45 + mod = await import(`./locales/en/messages`) 46 + const transformedEnMessages = applySkeetReplacements(mod.messages, locale) 47 + i18n.load(locale, transformedEnMessages) 48 + i18n.activate(locale) 49 + break 50 + } 43 51 case AppLanguage.en_GB: { 44 52 mod = await import(`./locales/en-GB/messages`) 53 + const transformedEnGbMessages = applySkeetReplacements( 54 + mod.messages, 55 + locale, 56 + ) 57 + i18n.load(locale, transformedEnGbMessages) 58 + i18n.activate(locale) 45 59 break 46 60 } 47 61 case AppLanguage.eo: { ··· 174 188 } 175 189 default: { 176 190 mod = await import(`./locales/en/messages`) 191 + const transformedDefaultMessages = applySkeetReplacements( 192 + mod.messages, 193 + locale, 194 + ) 195 + i18n.load(locale, transformedDefaultMessages) 196 + i18n.activate(locale) 177 197 break 178 198 } 179 199 } 180 - 181 - i18n.load(locale, mod.messages) 182 - i18n.activate(locale) 183 200 } 184 201 185 202 export function useLocaleLanguage() {
+61
src/locale/linguiHook.ts
··· 1 + import {type Messages} from '@lingui/core' 2 + 3 + import * as persisted from '#/state/persisted' 4 + 5 + // Helper to apply the replacement to a single string 6 + function replaceInString(text: string): string { 7 + const {string: replacement, enabled} = persisted.get('postReplacement') 8 + if (!enabled) return text 9 + let repl = replacement?.length ? replacement.toLowerCase() : 'skeet' 10 + return text 11 + .replaceAll('Post', repl[0].toUpperCase() + repl.slice(1)) 12 + .replaceAll('post', repl) 13 + } 14 + 15 + // Recursive helper to traverse and replace strings in nested structures 16 + function traverseAndReplace(value: any): any { 17 + if (typeof value === 'string') { 18 + return replaceInString(value) 19 + } 20 + if (Array.isArray(value)) { 21 + return value.map(item => traverseAndReplace(item)) 22 + } 23 + if (typeof value === 'object' && value !== null) { 24 + const newObject: Record<string, any> = {} 25 + for (const key in value) { 26 + if (Object.prototype.hasOwnProperty.call(value, key)) { 27 + newObject[key] = traverseAndReplace(value[key]) 28 + } 29 + } 30 + return newObject 31 + } 32 + return value 33 + } 34 + 35 + /** 36 + * Applies "Post" to "Skeet" replacements (case-insensitive) to messages 37 + * for English locales. 38 + * @param messages The raw messages object loaded from Lingui. 39 + * @param locale The current locale string. 40 + * @returns The messages object with replacements applied if the locale is English, 41 + * otherwise the original messages object. 42 + */ 43 + export function applySkeetReplacements( 44 + messages: Messages, 45 + locale: string, 46 + ): Messages { 47 + const {enabled} = persisted.get('postReplacement') 48 + console.log('replacements enabled:', enabled) 49 + if (!enabled || !locale.startsWith('en')) { 50 + return messages 51 + } 52 + 53 + // Traverse the entire messages catalog and apply replacements 54 + const transformedCatalog: Messages = {} 55 + for (const key in messages) { 56 + if (Object.prototype.hasOwnProperty.call(messages, key)) { 57 + transformedCatalog[key] = traverseAndReplace(messages[key]) 58 + } 59 + } 60 + return transformedCatalog 61 + }
+1 -1
src/locale/locales/en/messages.po
··· 11031 11031 #: src/view/com/composer/Composer.tsx:859 11032 11032 #: src/view/com/feeds/ComposerPrompt.tsx:191 11033 11033 msgid "What's up?" 11034 - msgstr "" 11034 + msgstr "Post yo shit! 🗣️" 11035 11035 11036 11036 #: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:147 11037 11037 msgid "When you tap on a check, you’ll see which organizations have granted verification."
+4 -4
src/screens/Bookmarks/index.tsx
··· 58 58 <Layout.Header.BackButton /> 59 59 <Layout.Header.Content> 60 60 <Layout.Header.TitleText> 61 - <Trans>Saved Skeets</Trans> 61 + <Trans>Saved Posts</Trans> 62 62 </Layout.Header.TitleText> 63 63 </Layout.Header.Content> 64 64 <Layout.Header.Slot /> ··· 216 216 const remove = async () => { 217 217 try { 218 218 await bookmark({action: 'delete', uri: post.uri}) 219 - toast.show(_(msg`Removed from saved skeets`), { 219 + toast.show(_(msg`Removed from saved posts`), { 220 220 type: 'info', 221 221 }) 222 222 } catch (e: any) { ··· 254 254 a.italic, 255 255 t.atoms.text_contrast_medium, 256 256 ]}> 257 - <Trans>This skeet was deleted by its author</Trans> 257 + <Trans>This post was deleted by its author</Trans> 258 258 </Text> 259 259 </View> 260 260 <Button 261 - label={_(msg`Remove from saved skeets`)} 261 + label={_(msg`Remove from saved posts`)} 262 262 size="tiny" 263 263 color="secondary" 264 264 onPress={remove}>
+1 -1
src/screens/Moderation/index.tsx
··· 243 243 t.atoms.bg_contrast_25, 244 244 ]}> 245 245 <Link 246 - label={_(msg`View your default skeet interaction settings`)} 246 + label={_(msg`View your default post interaction settings`)} 247 247 testID="interactionSettingsBtn" 248 248 to="/moderation/interaction-settings"> 249 249 {state => (
+2 -2
src/screens/ModerationInteractionSettings/index.tsx
··· 31 31 <Layout.Header.BackButton /> 32 32 <Layout.Header.Content> 33 33 <Layout.Header.TitleText> 34 - <Trans>Skeet Interaction Settings</Trans> 34 + <Trans>Post Interaction Settings</Trans> 35 35 </Layout.Header.TitleText> 36 36 </Layout.Header.Content> 37 37 <Layout.Header.Slot /> ··· 41 41 <Admonition type="tip"> 42 42 <Trans> 43 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 44 + new posts. You can edit these for a specific post from the 45 45 composer. 46 46 </Trans> 47 47 </Admonition>
+1 -1
src/screens/Post/PostLikedBy.tsx
··· 27 27 const {data: resolvedDid} = useResolveDidQuery(name) 28 28 const {data: profile} = useProfileQuery({did: resolvedDid}) 29 29 30 - useSetTitle(profile ? _(msg`Skeet by @${profile.handle}`) : undefined) 30 + useSetTitle(profile ? _(msg`Post by @${profile.handle}`) : undefined) 31 31 32 32 let likeCount 33 33 if (post) {
+1 -1
src/screens/Post/PostQuotes.tsx
··· 27 27 const {data: resolvedDid} = useResolveDidQuery(name) 28 28 const {data: profile} = useProfileQuery({did: resolvedDid}) 29 29 30 - useSetTitle(profile ? _(msg`Skeet by @${profile.handle}`) : undefined) 30 + useSetTitle(profile ? _(msg`Post by @${profile.handle}`) : undefined) 31 31 32 32 let quoteCount 33 33 if (post) {
+4 -4
src/screens/Post/PostRepostedBy.tsx
··· 27 27 const {data: resolvedDid} = useResolveDidQuery(name) 28 28 const {data: profile} = useProfileQuery({did: resolvedDid}) 29 29 30 - useSetTitle(profile ? _(msg`Skeet by @${profile.handle}`) : undefined) 30 + useSetTitle(profile ? _(msg`Post by @${profile.handle}`) : undefined) 31 31 32 32 let quoteCount 33 33 if (post) { ··· 48 48 {post && ( 49 49 <> 50 50 <Layout.Header.TitleText> 51 - <Trans>Reskeeted By</Trans> 51 + <Trans>Reposted By</Trans> 52 52 </Layout.Header.TitleText> 53 53 <Layout.Header.SubtitleText> 54 54 <Plural 55 55 value={quoteCount ?? 0} 56 - one="# reskeet" 57 - other="# reskeets" 56 + one="# repost" 57 + other="# reposts" 58 58 /> 59 59 </Layout.Header.SubtitleText> 60 60 </>
+2 -2
src/screens/PostThread/components/ThreadError.tsx
··· 23 23 const cleanError = useCleanError() 24 24 25 25 const {title, message} = useMemo(() => { 26 - let title = _(msg`Error loading skeet`) 26 + let title = _(msg`Error loading post`) 27 27 let message = _(msg`Something went wrong. Please try again in a moment.`) 28 28 29 29 const {raw, clean} = cleanError(error) 30 30 31 31 if (error.message.startsWith('Post not found')) { 32 - title = _(msg`Skeet not found`) 32 + title = _(msg`Post not found`) 33 33 message = clean || raw || message 34 34 } 35 35
+8 -8
src/screens/PostThread/components/ThreadItemAnchor.tsx
··· 141 141 </View> 142 142 <Text 143 143 style={[a.text_md, a.font_semi_bold, t.atoms.text_contrast_medium]}> 144 - <Trans>Skeet has been deleted</Trans> 144 + <Trans>Post has been deleted</Trans> 145 145 </Text> 146 146 </View> 147 147 </View> ··· 465 465 {post.repostCount != null && 466 466 post.repostCount !== 0 && 467 467 !disableRepostsMetrics ? ( 468 - <Link to={repostsHref} label={_(msg`Reskeets of this skeet`)}> 468 + <Link to={repostsHref} label={_(msg`Reposts of this post`)}> 469 469 <Text 470 470 testID="repostCount-expanded" 471 471 style={[a.text_md, t.atoms.text_contrast_medium]}> ··· 474 474 </Text>{' '} 475 475 <Plural 476 476 value={post.repostCount} 477 - one="reskeet" 478 - other="reskeets" 477 + one="repost" 478 + other="reposts" 479 479 /> 480 480 </Text> 481 481 </Link> ··· 484 484 post.quoteCount !== 0 && 485 485 !post.viewer?.embeddingDisabled && 486 486 !disableQuotesMetrics ? ( 487 - <Link to={quotesHref} label={_(msg`Quotes of this skeet`)}> 487 + <Link to={quotesHref} label={_(msg`Quotes of this post`)}> 488 488 <Text 489 489 testID="quoteCount-expanded" 490 490 style={[a.text_md, t.atoms.text_contrast_medium]}> ··· 502 502 {post.likeCount != null && 503 503 post.likeCount !== 0 && 504 504 !disableLikesMetrics ? ( 505 - <Link to={likesHref} label={_(msg`Likes on this skeet`)}> 505 + <Link to={likesHref} label={_(msg`Likes on this post`)}> 506 506 <Text 507 507 testID="likeCount-expanded" 508 508 style={[a.text_md, t.atoms.text_contrast_medium]}> ··· 679 679 <Button 680 680 label={_(msg`Archived post`)} 681 681 accessibilityHint={_( 682 - msg`Shows information about when this skeet was created`, 682 + msg`Shows information about when this post was created`, 683 683 )} 684 684 onPress={e => { 685 685 e.preventDefault() ··· 720 720 </Prompt.TitleText> 721 721 <Prompt.DescriptionText> 722 722 <Trans> 723 - This skeet claims to have been created on{' '} 723 + This post claims to have been created on{' '} 724 724 <RNText style={[a.font_semi_bold]}> 725 725 {niceDate(i18n, createdAt)} 726 726 </RNText>
+1 -1
src/screens/PostThread/components/ThreadItemPost.tsx
··· 109 109 </View> 110 110 <Text 111 111 style={[a.text_md, a.font_semi_bold, t.atoms.text_contrast_medium]}> 112 - <Trans>Skeet has been deleted</Trans> 112 + <Trans>Post has been deleted</Trans> 113 113 </Text> 114 114 </View> 115 115
+2 -2
src/screens/PostThread/components/ThreadItemPostTombstone.tsx
··· 19 19 const {copy, Icon} = useMemo(() => { 20 20 switch (type) { 21 21 case 'blocked': 22 - return {copy: _(msg`Skeet blocked`), Icon: PersonXIcon} 22 + return {copy: _(msg`Post blocked`), Icon: PersonXIcon} 23 23 case 'not-found': 24 24 default: 25 - return {copy: _(msg`Skeet not found`), Icon: TrashIcon} 25 + return {copy: _(msg`Post not found`), Icon: TrashIcon} 26 26 } 27 27 }, [_, type]) 28 28
+1 -1
src/screens/PostThread/components/ThreadItemTreePost.tsx
··· 105 105 ]}> 106 106 <TrashIcon style={[t.atoms.text]} width={14} /> 107 107 <Text style={[t.atoms.text_contrast_medium, a.mt_2xs]}> 108 - <Trans>Skeet has been deleted</Trans> 108 + <Trans>Post has been deleted</Trans> 109 109 </Text> 110 110 </View> 111 111 {item.ui.isLastChild && !item.ui.precedesChildReadMore && (
+1 -1
src/screens/PostThread/index.tsx
··· 525 525 <Layout.Header.BackButton /> 526 526 <Layout.Header.Content> 527 527 <Layout.Header.TitleText> 528 - <Trans context="description">Skeet</Trans> 528 + <Trans context="description">Post</Trans> 529 529 </Layout.Header.TitleText> 530 530 </Layout.Header.Content> 531 531 <Layout.Header.Slot>
+11 -4
src/screens/Profile/Header/Metrics.tsx
··· 38 38 39 39 return ( 40 40 <> 41 - {disableFollowersMetrics && disableFollowingMetrics && disablePostsMetrics ? ( null ) : 41 + {disableFollowersMetrics && 42 + disableFollowingMetrics && 43 + disablePostsMetrics ? null : ( 42 44 <View 43 45 style={[a.flex_row, a.gap_sm, a.align_center]} 44 46 pointerEvents="box-none"> ··· 69 71 {!disablePostsMetrics ? ( 70 72 <Text style={[a.font_semi_bold, t.atoms.text, a.text_md]}> 71 73 {formatCount(i18n, profile.postsCount || 0)}{' '} 72 - <Text style={[t.atoms.text_contrast_medium, a.font_normal, a.text_md]}> 73 - {plural(profile.postsCount || 0, {one: 'skeet', other: 'skeets'})} 74 + <Text 75 + style={[ 76 + t.atoms.text_contrast_medium, 77 + a.font_normal, 78 + a.text_md, 79 + ]}> 80 + {plural(profile.postsCount || 0, {one: 'post', other: 'posts'})} 74 81 </Text> 75 82 </Text> 76 83 ) : null} 77 84 </View> 78 - } 85 + )} 79 86 </> 80 87 ) 81 88 }
+1 -1
src/screens/Profile/ProfileFeed/index.tsx
··· 228 228 {(isScrolledDown || hasNew) && ( 229 229 <LoadLatestBtn 230 230 onPress={onScrollToTop} 231 - label={_(msg`Load new skeets`)} 231 + label={_(msg`Load new posts`)} 232 232 showIndicator={hasNew} 233 233 /> 234 234 )}
+3 -3
src/screens/Profile/ProfileSearch.tsx
··· 21 21 const {data: resolvedDid} = useResolveDidQuery(name) 22 22 const {data: profile} = useProfileQuery({did: resolvedDid}) 23 23 24 - useSetTitle(profile ? _(msg`Search @${profile.handle}'s skeets`) : undefined) 24 + useSetTitle(profile ? _(msg`Search @${profile.handle}'s posts`) : undefined) 25 25 26 26 const fixedParams = useMemo( 27 27 () => ({ ··· 36 36 inputPlaceholder={ 37 37 profile 38 38 ? currentAccount?.did === profile.did 39 - ? _(msg`Search my skeets`) 40 - : _(msg`Search @${profile.handle}'s skeets`) 39 + ? _(msg`Search my posts`) 40 + : _(msg`Search @${profile.handle}'s posts`) 41 41 : _(msg`Search...`) 42 42 } 43 43 fixedParams={fixedParams}
+1 -1
src/screens/Profile/Sections/Feed.tsx
··· 113 113 {(isScrolledDown || hasNew) && ( 114 114 <LoadLatestBtn 115 115 onPress={onScrollToTop} 116 - label={_(msg`Load new skeets`)} 116 + label={_(msg`Load new posts`)} 117 117 showIndicator={hasNew} 118 118 /> 119 119 )}
+1 -1
src/screens/ProfileList/FeedSection.tsx
··· 109 109 {(isScrolledDown || hasNew) && ( 110 110 <LoadLatestBtn 111 111 onPress={onScrollToTop} 112 - label={_(msg`Load new skeets`)} 112 + label={_(msg`Load new posts`)} 113 113 showIndicator={hasNew} 114 114 /> 115 115 )}
+1 -1
src/screens/ProfileList/components/SubscribeMenu.tsx
··· 105 105 control={subscribeMutePromptControl} 106 106 title={_(msg`Mute these accounts?`)} 107 107 description={_( 108 - msg`Muting is private. Muted accounts can interact with you, but you will not see their skeets or receive notifications from them.`, 108 + msg`Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them.`, 109 109 )} 110 110 onConfirm={onSubscribeMute} 111 111 confirmButtonCta={_(msg`Mute list`)}
+1 -1
src/screens/ProfileList/index.tsx
··· 163 163 const isOwner = currentAccount?.did === list.creator.did 164 164 const scrollElRef = useAnimatedRef() 165 165 const addUserDialogControl = useDialogControl() 166 - const sectionTitlesCurate = [_(msg`Skeets`), _(msg`People`)] 166 + const sectionTitlesCurate = [_(msg`Posts`), _(msg`People`)] 167 167 168 168 const moderation = useMemo(() => { 169 169 return moderateUserList(list, moderationOpts)
+1 -1
src/screens/Search/Explore.tsx
··· 985 985 return ( 986 986 <LoadMoreRetryBtn 987 987 label={_( 988 - msg`There was an issue fetching skeets. Tap here to try again.`, 988 + msg`There was an issue fetching posts. Tap here to try again.`, 989 989 )} 990 990 onPress={fetchNextPageFeedPreviews} 991 991 />
+2 -2
src/screens/Search/Shell.tsx
··· 351 351 onSubmitEditing={onSubmit} 352 352 placeholder={ 353 353 inputPlaceholder ?? 354 - _(msg`Search for skeets, users, or feeds`) 354 + _(msg`Search for posts, users, or feeds`) 355 355 } 356 356 hitSlop={{...HITSLOP_20, top: 0}} 357 357 /> ··· 523 523 style={t.atoms.text_contrast_medium as StyleProp<ViewStyle>} 524 524 /> 525 525 <Text style={[t.atoms.text_contrast_medium, a.text_md]}> 526 - <Trans>Find skeets, users, and feeds on Witchsky</Trans> 526 + <Trans>Find posts, users, and feeds on Witchsky</Trans> 527 527 </Text> 528 528 </View> 529 529 </View>
+1 -1
src/screens/Search/modules/ExploreTrendingTopics.tsx
··· 78 78 const postCount = trend.postCount 79 79 ? _( 80 80 plural(trend.postCount, { 81 - other: `${formatCount(i18n, trend.postCount)} skeets`, 81 + other: `${formatCount(i18n, trend.postCount)} posts`, 82 82 }), 83 83 ) 84 84 : null
+2 -2
src/screens/Settings/AccessibilitySettings.tsx
··· 55 55 </SettingsList.ItemText> 56 56 <Toggle.Item 57 57 name="require_alt_text" 58 - label={_(msg`Require alt text before skeeting`)} 58 + label={_(msg`Require alt text before posting`)} 59 59 value={requireAltTextEnabled ?? false} 60 60 onChange={value => setRequireAltTextEnabled(value)} 61 61 style={[a.w_full]}> 62 62 <Toggle.LabelText style={[a.flex_1]}> 63 - <Trans>Require alt text before skeeting</Trans> 63 + <Trans>Require alt text before posting</Trans> 64 64 </Toggle.LabelText> 65 65 <Toggle.Platform /> 66 66 </Toggle.Item>
+2 -2
src/screens/Settings/ActivityPrivacySettings.tsx
··· 49 49 <ItemTextWithSubtitle 50 50 bold 51 51 titleText={ 52 - <Trans>Allow others to be notified of your skeets</Trans> 52 + <Trans>Allow others to be notified of your posts</Trans> 53 53 } 54 54 subtitleText={ 55 55 <Trans> 56 56 This feature allows users to receive notifications for your 57 - new skeets and replies. Who do you want to enable this for? 57 + new posts and replies. Who do you want to enable this for? 58 58 </Trans> 59 59 } 60 60 />
+95 -12
src/screens/Settings/DeerSettings.tsx
··· 100 100 useSetNoDiscoverFallback, 101 101 } from '#/state/preferences/no-discover-fallback' 102 102 import { 103 + usePostReplacement, 104 + useSetPostReplacement, 105 + } from '#/state/preferences/post-name-replacement' 106 + import { 103 107 useRepostCarouselEnabled, 104 108 useSetRepostCarouselEnabled, 105 109 } from '#/state/preferences/repost-carousel-enabled' ··· 119 123 import {Admonition} from '#/components/Admonition' 120 124 import {Button, ButtonText} from '#/components/Button' 121 125 import * as Dialog from '#/components/Dialog' 126 + import * as TextField from '#/components/forms/TextField' 122 127 import * as Toggle from '#/components/forms/Toggle' 123 128 import {Atom_Stroke2_Corner0_Rounded as DeerIcon} from '#/components/icons/Atom' 124 129 import {ChainLink_Stroke2_Corner0_Rounded as ChainLinkIcon} from '#/components/icons/ChainLink' ··· 126 131 import {Earth_Stroke2_Corner2_Rounded as EarthIcon} from '#/components/icons/Globe' 127 132 import {Lab_Stroke2_Corner0_Rounded as _BeakerIcon} from '#/components/icons/Lab' 128 133 import {PaintRoller_Stroke2_Corner2_Rounded as PaintRollerIcon} from '#/components/icons/PaintRoller' 134 + import {Pencil_Stroke2_Corner0_Rounded as PencilIcon} from '#/components/icons/Pencil' 129 135 import {RaisingHand4Finger_Stroke2_Corner0_Rounded as RaisingHandIcon} from '#/components/icons/RaisingHand' 130 136 import {Star_Stroke2_Corner0_Rounded as StarIcon} from '#/components/icons/Star' 131 137 import {Verified_Stroke2_Corner2_Rounded as VerifiedIcon} from '#/components/icons/Verified' ··· 425 431 426 432 const setLibreTranslateInstanceControl = Dialog.useDialogControl() 427 433 434 + const postReplacement = usePostReplacement() 435 + const setPostReplacement = useSetPostReplacement() 436 + 428 437 return ( 429 438 <Layout.Screen> 430 439 <Layout.Header.Outer> ··· 487 496 <Toggle.Item 488 497 name="external_share_buttons" 489 498 label={_( 490 - msg`Show "Open original skeet" and "Open skeet in PDSls" buttons`, 499 + msg`Show "Open original post" and "Open post in PDSls" buttons`, 491 500 )} 492 501 value={showExternalShareButtons} 493 502 onChange={value => setShowExternalShareButtons(value)} 494 503 style={[a.w_full]}> 495 504 <Toggle.LabelText style={[a.flex_1]}> 496 505 <Trans> 497 - Show "Open original skeet" and "Open skeet in PDSls" buttons 506 + Show "Open original post" and "Open post in PDSls" buttons 498 507 </Trans> 499 508 </Toggle.LabelText> 500 509 <Toggle.Platform /> ··· 576 585 <SettingsList.Divider /> 577 586 578 587 <SettingsList.Group contentContainerStyle={[a.gap_sm]}> 588 + <SettingsList.ItemIcon icon={PencilIcon} /> 589 + <SettingsList.ItemText> 590 + <Trans> 591 + Call posts{' '} 592 + {postReplacement.string.length 593 + ? postReplacement.string.toLowerCase() 594 + : 'skeet'} 595 + s 596 + </Trans> 597 + </SettingsList.ItemText> 598 + <Toggle.Item 599 + name="call_posts_skeets" 600 + label={_( 601 + msg`Changes post to another word of your choosing. Requires a refresh to update.`, 602 + )} 603 + value={postReplacement.enabled} 604 + onChange={value => 605 + setPostReplacement({ 606 + enabled: value, 607 + string: postReplacement.string, 608 + }) 609 + } 610 + style={[a.w_full]}> 611 + <Toggle.LabelText style={[a.flex_1]}> 612 + <Trans> 613 + Changes post to another word of your choosing. Requires a 614 + refresh to update. 615 + </Trans> 616 + </Toggle.LabelText> 617 + <Toggle.Platform /> 618 + </Toggle.Item> 619 + 620 + {postReplacement.enabled && ( 621 + <SettingsList.Item> 622 + <TextField.Root> 623 + <TextField.Input 624 + label={_(msg`Custom post name`)} 625 + value={postReplacement.string} 626 + onChangeText={(value: string) => 627 + setPostReplacement( 628 + (curr: {enabled: boolean; string: string}) => ({ 629 + ...curr, 630 + string: value, 631 + }), 632 + ) 633 + } 634 + /> 635 + </TextField.Root> 636 + </SettingsList.Item> 637 + )} 638 + </SettingsList.Group> 639 + 640 + <SettingsList.Group contentContainerStyle={[a.gap_sm]}> 579 641 <SettingsList.ItemIcon icon={PaintRollerIcon} /> 580 642 <SettingsList.ItemText> 581 643 <Trans>Tweaks</Trans> 582 644 </SettingsList.ItemText> 583 - 645 + <Toggle.Item 646 + name="repost_carousel" 647 + label={_(msg`Combine reposts into a horizontal carousel`)} 648 + value={repostCarouselEnabled} 649 + onChange={value => setRepostCarouselEnabled(value)} 650 + style={[a.w_full]}> 651 + <Toggle.LabelText style={[a.flex_1]}> 652 + <Trans>Combine reposts into a horizontal carousel</Trans> 653 + </Toggle.LabelText> 654 + <Toggle.Platform /> 655 + </Toggle.Item> 656 + <Toggle.Item 657 + name="no_discover_fallback" 658 + label={_(msg`Do not fall back to discover feed`)} 659 + value={noDiscoverFallback} 660 + onChange={value => setNoDiscoverFallback(value)} 661 + style={[a.w_full]}> 662 + <Toggle.LabelText style={[a.flex_1]}> 663 + <Trans>Do not fall back to discover feed</Trans> 664 + </Toggle.LabelText> 665 + <Toggle.Platform /> 666 + </Toggle.Item> 584 667 <Toggle.Item 585 668 name="show_link_in_handle" 586 669 label={_( ··· 599 682 600 683 <Toggle.Item 601 684 name="repost_carousel" 602 - label={_(msg`Combine reskeets into a horizontal carousel`)} 685 + label={_(msg`Combine reposts into a horizontal carousel`)} 603 686 value={repostCarouselEnabled} 604 687 onChange={value => setRepostCarouselEnabled(value)} 605 688 style={[a.w_full]}> 606 689 <Toggle.LabelText style={[a.flex_1]}> 607 - <Trans>Combine reskeets into a horizontal carousel</Trans> 690 + <Trans>Combine reposts into a horizontal carousel</Trans> 608 691 </Toggle.LabelText> 609 692 <Toggle.Platform /> 610 693 </Toggle.Item> ··· 655 738 656 739 <Toggle.Item 657 740 name="disable_via_repost_notification" 658 - label={_(msg`Disable "via reskeet" notifications`)} 741 + label={_(msg`Disable via repost notifications`)} 659 742 value={disableViaRepostNotification} 660 743 onChange={value => setDisableViaRepostNotification(value)} 661 744 style={[a.w_full]}> 662 745 <Toggle.LabelText style={[a.flex_1]}> 663 - <Trans>Disable "via reskeet" notifications</Trans> 746 + <Trans>Disable via repost notifications</Trans> 664 747 </Toggle.LabelText> 665 748 <Toggle.Platform /> 666 749 </Toggle.Item> 667 750 <Admonition type="info" style={[a.flex_1]}> 668 751 <Trans> 669 752 Forcefully disables the notifications other people receive when 670 - you like/reskeet a skeet someone else has reskeeted for privacy. 753 + you like/repost a post someone else has reposted for privacy. 671 754 </Trans> 672 755 </Admonition> 673 756 ··· 825 908 826 909 <Toggle.Item 827 910 name="disable_reposts_metrics" 828 - label={_(msg`Disable reskeet metrics`)} 911 + label={_(msg`Disable Reposts Metrics`)} 829 912 value={disableRepostsMetrics} 830 913 onChange={value => setDisableRepostsMetrics(value)} 831 914 style={[a.w_full]}> 832 915 <Toggle.LabelText style={[a.flex_1]}> 833 - <Trans>Disable reskeet metrics</Trans> 916 + <Trans>Disable Reposts Metrics</Trans> 834 917 </Toggle.LabelText> 835 918 <Toggle.Platform /> 836 919 </Toggle.Item> ··· 909 992 910 993 <Toggle.Item 911 994 name="disable_posts_metrics" 912 - label={_(msg`Disable skeets metrics`)} 995 + label={_(msg`Disable posts metrics`)} 913 996 value={disablePostsMetrics} 914 997 onChange={value => setDisablePostsMetrics(value)} 915 998 style={[a.w_full]}> 916 999 <Toggle.LabelText style={[a.flex_1]}> 917 - <Trans>Disable skeets metrics</Trans> 1000 + <Trans>Disable posts metrics</Trans> 918 1001 </Toggle.LabelText> 919 1002 <Toggle.Platform /> 920 1003 </Toggle.Item>
+4 -4
src/screens/Settings/FollowingFeedPreferences.tsx
··· 86 86 <Toggle.Item 87 87 type="checkbox" 88 88 name="show-reposts" 89 - label={_(msg`Show reskeets`)} 89 + label={_(msg`Show reposts`)} 90 90 value={showReposts} 91 91 onChange={value => 92 92 setFeedViewPref({ ··· 96 96 <SettingsList.Item> 97 97 <SettingsList.ItemIcon icon={RepostIcon} /> 98 98 <SettingsList.ItemText> 99 - <Trans>Show reskeets</Trans> 99 + <Trans>Show reposts</Trans> 100 100 </SettingsList.ItemText> 101 101 <Toggle.Platform /> 102 102 </SettingsList.Item> ··· 104 104 <Toggle.Item 105 105 type="checkbox" 106 106 name="show-quotes" 107 - label={_(msg`Show quote skeets`)} 107 + label={_(msg`Show quote posts`)} 108 108 value={showQuotePosts} 109 109 onChange={value => 110 110 setFeedViewPref({ ··· 114 114 <SettingsList.Item> 115 115 <SettingsList.ItemIcon icon={QuoteIcon} /> 116 116 <SettingsList.ItemText> 117 - <Trans>Show quote skeets</Trans> 117 + <Trans>Show quote posts</Trans> 118 118 </SettingsList.ItemText> 119 119 <Toggle.Platform /> 120 120 </SettingsList.Item>
+3 -3
src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx
··· 102 102 titleText={<Trans>Activity from others</Trans>} 103 103 subtitleText={ 104 104 <Trans> 105 - Get notified about skeets and replies from accounts you 105 + Get notified about posts and replies from accounts you 106 106 choose. 107 107 </Trans> 108 108 } ··· 211 211 const preview = useMemo(() => { 212 212 const actSub = profile.viewer?.activitySubscription 213 213 if (actSub?.post && actSub?.reply) { 214 - return _(msg`Skeets, Replies`) 214 + return _(msg`Posts, Replies`) 215 215 } else if (actSub?.post) { 216 - return _(msg`Skeets`) 216 + return _(msg`Posts`) 217 217 } else if (actSub?.reply) { 218 218 return _(msg`Replies`) 219 219 }
+1 -1
src/screens/Settings/NotificationSettings/LikeNotificationSettings.tsx
··· 40 40 bold 41 41 titleText={<Trans>Likes</Trans>} 42 42 subtitleText={ 43 - <Trans>Get notifications when people like your skeets.</Trans> 43 + <Trans>Get notifications when people like your posts.</Trans> 44 44 } 45 45 /> 46 46 </SettingsList.Item>
+2 -2
src/screens/Settings/NotificationSettings/LikesOnRepostsNotificationSettings.tsx
··· 38 38 <SettingsList.ItemIcon icon={LikeRepostIcon} /> 39 39 <ItemTextWithSubtitle 40 40 bold 41 - titleText={<Trans>Likes of your reskeets</Trans>} 41 + titleText={<Trans>Likes of your reposts</Trans>} 42 42 subtitleText={ 43 43 <Trans> 44 - Get notifications when people like skeets that you've reskeeted. 44 + Get notifications when people like posts that you've reposted. 45 45 </Trans> 46 46 } 47 47 />
+1 -1
src/screens/Settings/NotificationSettings/QuoteNotificationSettings.tsx
··· 40 40 bold 41 41 titleText={<Trans>Quotes</Trans>} 42 42 subtitleText={ 43 - <Trans>Get notifications when people quote your skeets.</Trans> 43 + <Trans>Get notifications when people quote your posts.</Trans> 44 44 } 45 45 /> 46 46 </SettingsList.Item>
+1 -1
src/screens/Settings/NotificationSettings/ReplyNotificationSettings.tsx
··· 41 41 titleText={<Trans>Replies</Trans>} 42 42 subtitleText={ 43 43 <Trans> 44 - Get notifications when people reply to your skeets. 44 + Get notifications when people reply to your posts. 45 45 </Trans> 46 46 } 47 47 />
+2 -2
src/screens/Settings/NotificationSettings/RepostNotificationSettings.tsx
··· 38 38 <SettingsList.ItemIcon icon={RepostIcon} /> 39 39 <ItemTextWithSubtitle 40 40 bold 41 - titleText={<Trans>Reskeets</Trans>} 41 + titleText={<Trans>Reposts</Trans>} 42 42 subtitleText={ 43 - <Trans>Get notifications when people reskeet your skeets.</Trans> 43 + <Trans>Get notifications when people repost your posts.</Trans> 44 44 } 45 45 /> 46 46 </SettingsList.Item>
+3 -3
src/screens/Settings/NotificationSettings/RepostsOnRepostsNotificationSettings.tsx
··· 38 38 <SettingsList.ItemIcon icon={RepostRepostIcon} /> 39 39 <ItemTextWithSubtitle 40 40 bold 41 - titleText={<Trans>Reskeets of your reskeets</Trans>} 41 + titleText={<Trans>Reposts of your reposts</Trans>} 42 42 subtitleText={ 43 43 <Trans> 44 - Get notifications when people reskeet skeets that you've 45 - reskeeted. 44 + Get notifications when people repost posts that you've 45 + reposted. 46 46 </Trans> 47 47 } 48 48 />
+4 -4
src/screens/Settings/NotificationSettings/index.tsx
··· 173 173 /> 174 174 </SettingsList.LinkItem> 175 175 <SettingsList.LinkItem 176 - label={_(msg`Settings for reskeet notifications`)} 176 + label={_(msg`Settings for repost notifications`)} 177 177 to={{screen: 'RepostNotificationSettings'}} 178 178 contentContainerStyle={[a.align_start]}> 179 179 <SettingsList.ItemIcon icon={RepostIcon} /> 180 180 <ItemTextWithSubtitle 181 - titleText={<Trans>Reskeets</Trans>} 181 + titleText={<Trans>Reposts</Trans>} 182 182 subtitleText={<SettingPreview preference={settings?.repost} />} 183 183 showSkeleton={!settings} 184 184 /> ··· 204 204 contentContainerStyle={[a.align_start]}> 205 205 <SettingsList.ItemIcon icon={LikeRepostIcon} /> 206 206 <ItemTextWithSubtitle 207 - titleText={<Trans>Likes of your reskeets</Trans>} 207 + titleText={<Trans>Likes of your reposts</Trans>} 208 208 subtitleText={ 209 209 <SettingPreview preference={settings?.likeViaRepost} /> 210 210 } ··· 219 219 contentContainerStyle={[a.align_start]}> 220 220 <SettingsList.ItemIcon icon={RepostRepostIcon} /> 221 221 <ItemTextWithSubtitle 222 - titleText={<Trans>Reskeets of your reskeets</Trans>} 222 + titleText={<Trans>Reposts of your reposts</Trans>} 223 223 subtitleText={ 224 224 <SettingPreview preference={settings?.repostViaRepost} /> 225 225 }
+2 -2
src/screens/Settings/PrivacyAndSecuritySettings.tsx
··· 81 81 </SettingsList.LinkItem> 82 82 <SettingsList.LinkItem 83 83 label={_( 84 - msg`Settings for allowing others to be notified of your skeets`, 84 + msg`Settings for allowing others to be notified of your posts`, 85 85 )} 86 86 to={{screen: 'ActivityPrivacySettings'}} 87 87 contentContainerStyle={[a.align_start]}> 88 88 <SettingsList.ItemIcon icon={BellRingingIcon} /> 89 89 <ItemTextWithSubtitle 90 90 titleText={ 91 - <Trans>Allow others to be notified of your skeets</Trans> 91 + <Trans>Allow others to be notified of your posts</Trans> 92 92 } 93 93 subtitleText={ 94 94 <NotificationDeclaration
+2 -2
src/screens/Settings/ThreadPreferences.tsx
··· 45 45 </SettingsList.ItemText> 46 46 <View style={[a.w_full, a.gap_md]}> 47 47 <Text style={[a.flex_1, t.atoms.text_contrast_medium]}> 48 - <Trans>Sort replies to the same skeet by:</Trans> 48 + <Trans>Sort replies to the same post by:</Trans> 49 49 </Text> 50 50 <Toggle.Group 51 51 label={_(msg`Sort replies by`)} ··· 95 95 } 96 96 style={[a.w_full, a.gap_md]}> 97 97 <Toggle.LabelText style={[a.flex_1]}> 98 - <Trans>Show skeet replies in a threaded tree view</Trans> 98 + <Trans>Show post replies in a threaded tree view</Trans> 99 99 </Toggle.LabelText> 100 100 <Toggle.Platform /> 101 101 </Toggle.Item>
+2 -2
src/screens/StarterPack/StarterPackScreen.tsx
··· 192 192 const tabs = [ 193 193 ...(showPeopleTab ? [_(msg`People`)] : []), 194 194 ...(showFeedsTab ? [_(msg`Feeds`)] : []), 195 - ...(showPostsTab ? [_(msg`Skeets`)] : []), 195 + ...(showPostsTab ? [_(msg`Posts`)] : []), 196 196 ] 197 197 198 198 const qrCodeDialogControl = useDialogControl() ··· 568 568 return ( 569 569 <> 570 570 <Menu.Root> 571 - <Menu.Trigger label={_(msg`Reskeet or quote skeet`)}> 571 + <Menu.Trigger label={_(msg`Repost or quote post`)}> 572 572 {({props}) => ( 573 573 <Button 574 574 {...props}
+1 -1
src/screens/VideoFeed/index.tsx
··· 549 549 a.leading_tight, 550 550 a.mx_xl, 551 551 ]}> 552 - <Trans>Skeet has been deleted</Trans> 552 + <Trans>Post has been deleted</Trans> 553 553 </Text> 554 554 </View> 555 555 ) : (
+10
src/state/persisted/schema.ts
··· 170 170 highQualityImages: z.boolean().optional(), 171 171 hideUnreplyablePosts: z.boolean().optional(), 172 172 173 + postReplacement: z.object({ 174 + enabled: z.boolean().optional(), 175 + string: z.string().optional(), 176 + }), 177 + 173 178 showExternalShareButtons: z.boolean().optional(), 174 179 175 180 translationServicePreference: z.enum([ ··· 291 296 showExternalShareButtons: false, 292 297 translationServicePreference: 'google', 293 298 libreTranslateInstance: 'https://libretranslate.com/', 299 + 300 + postReplacement: { 301 + enabled: false, 302 + string: 'skeet', 303 + }, 294 304 } 295 305 296 306 export function tryParse(rawData: string): Schema | undefined {
+12 -9
src/state/preferences/index.tsx
··· 35 35 import {Provider as LargeAltBadgeProvider} from './large-alt-badge' 36 36 import {Provider as NoAppLabelersProvider} from './no-app-labelers' 37 37 import {Provider as NoDiscoverProvider} from './no-discover-fallback' 38 + import {Provider as PostNameReplacementProvider} from './post-name-replacement.tsx' 38 39 import {Provider as RepostCarouselProvider} from './repost-carousel-enabled' 39 40 import {Provider as ShowLinkInHandleProvider} from './show-link-in-handle' 40 41 import {Provider as SubtitlesProvider} from './subtitles' ··· 110 111 <HideUnreplyablePostsProvider> 111 112 <EnableSquareAvatarsProvider> 112 113 <EnableSquareButtonsProvider> 113 - <DisableVerifyEmailReminderProvider> 114 - <TranslationServicePreferenceProvider> 115 - <DisableComposerPromptProvider> 116 - { 117 - children 118 - } 119 - </DisableComposerPromptProvider> 120 - </TranslationServicePreferenceProvider> 121 - </DisableVerifyEmailReminderProvider> 114 + <PostNameReplacementProvider> 115 + <DisableVerifyEmailReminderProvider> 116 + <TranslationServicePreferenceProvider> 117 + <DisableComposerPromptProvider> 118 + { 119 + children 120 + } 121 + </DisableComposerPromptProvider> 122 + </TranslationServicePreferenceProvider> 123 + </DisableVerifyEmailReminderProvider> 124 + </PostNameReplacementProvider> 122 125 </EnableSquareButtonsProvider> 123 126 </EnableSquareAvatarsProvider> 124 127 </HideUnreplyablePostsProvider>
+81
src/state/preferences/post-name-replacement.tsx
··· 1 + import React from 'react' 2 + 3 + import * as persisted from '#/state/persisted' 4 + 5 + interface PostReplacementState { 6 + enabled: boolean 7 + string: string 8 + } 9 + 10 + type StateContext = PostReplacementState 11 + type SetContext = ( 12 + v: 13 + | PostReplacementState 14 + | ((curr: PostReplacementState) => PostReplacementState), 15 + ) => void 16 + 17 + const stateContext = React.createContext<StateContext>( 18 + persisted.defaults.postReplacement as PostReplacementState, 19 + ) 20 + const setContext = React.createContext<SetContext>( 21 + ( 22 + _: 23 + | PostReplacementState 24 + | ((curr: PostReplacementState) => PostReplacementState), 25 + ) => {}, 26 + ) 27 + 28 + export function Provider({children}: React.PropsWithChildren<{}>) { 29 + const [state, _setState] = React.useState<PostReplacementState>(() => { 30 + const persistedState = persisted.get('postReplacement') 31 + return { 32 + enabled: 33 + persistedState?.enabled ?? persisted.defaults.postReplacement.enabled!, 34 + string: 35 + persistedState?.string ?? persisted.defaults.postReplacement.string!, 36 + } 37 + }) 38 + 39 + const setState = React.useCallback( 40 + ( 41 + val: 42 + | PostReplacementState 43 + | ((curr: PostReplacementState) => PostReplacementState), 44 + ) => { 45 + _setState(curr => { 46 + const next = typeof val === 'function' ? val(curr) : val 47 + persisted.write('postReplacement', next) 48 + return next 49 + }) 50 + }, 51 + [], 52 + ) 53 + 54 + React.useEffect(() => { 55 + return persisted.onUpdate('postReplacement', next => { 56 + setState({string: next.string ?? 'skeet', enabled: next.enabled ?? true}) 57 + /* 58 + if (nextVal) { 59 + _setState({ 60 + enabled: 61 + nextVal.enabled ?? persisted.defaults.postReplacement.enabled!, 62 + string: nextVal.string ?? persisted.defaults.postReplacement.string!, 63 + }) 64 + }*/ 65 + }) 66 + }, []) 67 + 68 + return ( 69 + <stateContext.Provider value={state}> 70 + <setContext.Provider value={setState}>{children}</setContext.Provider> 71 + </stateContext.Provider> 72 + ) 73 + } 74 + 75 + export function usePostReplacement() { 76 + return React.useContext(stateContext) 77 + } 78 + 79 + export function useSetPostReplacement() { 80 + return React.useContext(setContext) 81 + }
+3 -3
src/state/queries/pinned-post.ts
··· 56 56 }) 57 57 58 58 if (pinCurrentPost) { 59 - Toast.show(_(msg({message: 'Skeet pinned', context: 'toast'}))) 59 + Toast.show(_(msg({message: 'Post pinned', context: 'toast'}))) 60 60 } else { 61 - Toast.show(_(msg({message: 'Skeet unpinned', context: 'toast'}))) 61 + Toast.show(_(msg({message: 'Post unpinned', context: 'toast'}))) 62 62 } 63 63 64 64 queryClient.invalidateQueries({ ··· 72 72 ), 73 73 }) 74 74 } catch (e: any) { 75 - Toast.show(_(msg`Failed to pin skeet`)) 75 + Toast.show(_(msg`Failed to pin post`)) 76 76 logger.error('Failed to pin post', {message: String(e)}) 77 77 // revert optimistic update 78 78 updatePostShadow(queryClient, postUri, {
+2 -2
src/state/shell/progress-guide.tsx
··· 214 214 <ProgressGuideToast 215 215 ref={firstLikeToastRef} 216 216 title={_(msg`Your first like!`)} 217 - subtitle={_(msg`Like 10 skeets to train the Discover feed`)} 217 + subtitle={_(msg`Like 10 posts to train the Discover feed`)} 218 218 /> 219 219 <ProgressGuideToast 220 220 ref={fifthLikeToastRef} 221 221 title={_(msg`Half way there!`)} 222 - subtitle={_(msg`Like 10 skeets to train the Discover feed`)} 222 + subtitle={_(msg`Like 10 posts to train the Discover feed`)} 223 223 /> 224 224 <ProgressGuideToast 225 225 ref={tenthLikeToastRef}
+12 -12
src/view/com/composer/Composer.tsx
··· 511 511 let err = cleanError(e.message) 512 512 if (err.includes('not locate record')) { 513 513 err = _( 514 - msg`We're sorry! The skeet you are replying to has been deleted.`, 514 + msg`We're sorry! The post you are replying to has been deleted.`, 515 515 ) 516 516 } else if (e instanceof EmbeddingDisabledError) { 517 - err = _(msg`This skeet's author has disabled quote skeets.`) 517 + err = _(msg`This post's author has disabled quote posts.`) 518 518 } 519 519 setError(err) 520 520 setIsPublishing(false) ··· 574 574 <Toast.Icon /> 575 575 <Toast.Text> 576 576 {thread.posts.length > 1 577 - ? _(msg`Your skeets were sent`) 577 + ? _(msg`Your posts were sent`) 578 578 : replyTo 579 579 ? _(msg`Your reply was sent`) 580 - : _(msg`Your skeet was sent`)} 580 + : _(msg`Your post was sent`)} 581 581 </Toast.Text> 582 582 {postUri && ( 583 583 <Toast.Action 584 - label={_(msg`View skeet`)} 584 + label={_(msg`View post`)} 585 585 onPress={() => { 586 586 const {host: name, rkey} = new AtUri(postUri) 587 587 navigation.navigate('PostThread', {name, rkey}) 588 588 }}> 589 - <Trans context="Action to view the skeet the user just created"> 589 + <Trans context="Action to view the post the user just created"> 590 590 View 591 591 </Trans> 592 592 </Toast.Action> ··· 859 859 const selectTextInputPlaceholder = isReply 860 860 ? isFirstPost 861 861 ? _(msg`Write your reply`) 862 - : _(msg`Add another skeet`) 862 + : _(msg`Add another post`) 863 863 : _(msg`Anything but skeet`) 864 864 const discardPromptControl = Prompt.usePromptControl() 865 865 ··· 974 974 {canRemovePost && isActive && ( 975 975 <> 976 976 <Button 977 - label={_(msg`Delete skeet`)} 977 + label={_(msg`Delete post`)} 978 978 size="small" 979 979 color="secondary" 980 980 variant="ghost" ··· 999 999 </Button> 1000 1000 <Prompt.Basic 1001 1001 control={discardPromptControl} 1002 - title={_(msg`Discard skeet?`)} 1003 - description={_(msg`Are you sure you'd like to discard this skeet?`)} 1002 + title={_(msg`Discard post?`)} 1003 + description={_(msg`Are you sure you'd like to discard this post?`)} 1004 1004 onConfirm={() => { 1005 1005 dispatch({ 1006 1006 type: 'remove_post', ··· 1135 1135 {isReply ? ( 1136 1136 <Trans context="action">Reply</Trans> 1137 1137 ) : isThread ? ( 1138 - <Trans context="action">Skeet All</Trans> 1138 + <Trans context="action">Post All</Trans> 1139 1139 ) : ( 1140 - <Trans context="action">Skeet</Trans> 1140 + <Trans context="action">Post</Trans> 1141 1141 )} 1142 1142 </ButtonText> 1143 1143 </Button>
+1 -1
src/view/com/composer/labels/LabelsBtn.tsx
··· 109 109 <Text style={[t.atoms.text_contrast_medium, a.leading_snug]}> 110 110 <Trans> 111 111 Please add any content warning labels that are applicable for the 112 - media you are skeeting. 112 + media you are posting. 113 113 </Trans> 114 114 </Text> 115 115 </View>
+2 -2
src/view/com/composer/select-language/PostLanguageSelect.tsx
··· 54 54 return ( 55 55 <> 56 56 <Menu.Root> 57 - <Menu.Trigger label={_(msg`Select skeet language`)}> 57 + <Menu.Trigger label={_(msg`Select post language`)}> 58 58 {({props}) => ( 59 59 <LanguageBtn currentLanguages={currentLanguages} {...props} /> 60 60 )} ··· 122 122 hitSlop={LANG_DROPDOWN_HITSLOP} 123 123 label={_( 124 124 msg({ 125 - message: `Skeet language selection`, 125 + message: `Post language selection`, 126 126 comment: `Accessibility label for button that opens dialog to choose post language settings`, 127 127 }), 128 128 )}
+2 -2
src/view/com/composer/select-language/PostLanguageSelectDialog.tsx
··· 184 184 a.text_xl, 185 185 a.mb_sm, 186 186 ]}> 187 - <Trans>Choose Skeet Languages</Trans> 187 + <Trans>Choose Post Languages</Trans> 188 188 </Text> 189 189 <Text 190 190 nativeID="dialog-description" ··· 194 194 a.text_md, 195 195 a.mb_lg, 196 196 ]}> 197 - <Trans>Select up to 3 languages used in this skeet</Trans> 197 + <Trans>Select up to 3 languages used in this post</Trans> 198 198 </Text> 199 199 </View> 200 200
+1 -1
src/view/com/composer/select-language/SuggestedLanguage.tsx
··· 117 117 label={ 118 118 <RNText> 119 119 <Trans> 120 - The skeet you're replying to was marked as being written in{' '} 120 + The post you're replying to was marked as being written in{' '} 121 121 {suggestedLanguageName} by its author. Would you like to reply in{' '} 122 122 <Text style={[a.font_bold]}>{suggestedLanguageName}</Text>? 123 123 </Trans>
+1 -1
src/view/com/feeds/ComposerPrompt.tsx
··· 188 188 a.text_md, 189 189 {includeFontPadding: false}, 190 190 ]}> 191 - <Trans>What's up?</Trans> 191 + <Trans>Anything but skeet</Trans> 192 192 </Text> 193 193 <View style={[a.flex_row, a.gap_md]}> 194 194 {IS_NATIVE && (
+1 -1
src/view/com/feeds/FeedPage.tsx
··· 167 167 {(isScrolledDown || hasNew) && ( 168 168 <LoadLatestBtn 169 169 onPress={onPressLoadLatest} 170 - label={_(msg`Load new skeets`)} 170 + label={_(msg`Load new posts`)} 171 171 showIndicator={hasNew} 172 172 /> 173 173 )}
+12 -12
src/view/com/notifications/NotificationFeedItem.tsx
··· 306 306 other={`${formattedAuthorsCount} others`} 307 307 /> 308 308 </Text>{' '} 309 - liked your skeet 309 + liked your post 310 310 </Trans> 311 311 ) : ( 312 - <Trans>{firstAuthorLink} liked your skeet</Trans> 312 + <Trans>{firstAuthorLink} liked your post</Trans> 313 313 ) 314 314 } else if (item.type === 'repost') { 315 315 a11yLabel = hasMultipleAuthors ··· 330 330 other={`${formattedAuthorsCount} others`} 331 331 /> 332 332 </Text>{' '} 333 - reskeeted your skeet 333 + reposted your post 334 334 </Trans> 335 335 ) : ( 336 - <Trans>{firstAuthorLink} reskeeted your skeet</Trans> 336 + <Trans>{firstAuthorLink} reposted your post</Trans> 337 337 ) 338 338 icon = <RepostIcon size="xl" style={{color: t.palette.positive_500}} /> 339 339 } else if (item.type === 'follow') { ··· 502 502 other={`${formattedAuthorsCount} others`} 503 503 /> 504 504 </Text>{' '} 505 - liked your reskeet 505 + liked your repost 506 506 </Trans> 507 507 ) : ( 508 - <Trans>{firstAuthorLink} liked your reskeet</Trans> 508 + <Trans>{firstAuthorLink} liked your repost</Trans> 509 509 ) 510 510 icon = <RepostHeartIcon size="xl" style={[s.likeColor]} /> 511 511 } else if (item.type === 'repost-via-repost') { ··· 527 527 other={`${formattedAuthorsCount} others`} 528 528 /> 529 529 </Text>{' '} 530 - reskeeted your reskeet 530 + reposted your repost 531 531 </Trans> 532 532 ) : ( 533 - <Trans>{firstAuthorLink} reskeeted your reskeet</Trans> 533 + <Trans>{firstAuthorLink} reposted your repost</Trans> 534 534 ) 535 535 icon = ( 536 536 <RepostRepostIcon size="xl" style={{color: t.palette.positive_500}} /> ··· 549 549 ) 550 550 : _( 551 551 msg`New ${plural(postsCount, { 552 - one: 'skeet', 553 - other: 'skeets', 552 + one: 'post', 553 + other: 'posts', 554 554 })} from ${firstAuthorName}`, 555 555 ) 556 556 notificationContent = hasMultipleAuthors ? ( 557 557 <Trans> 558 - New skeets from {firstAuthorLink} and{' '} 558 + New posts from {firstAuthorLink} and{' '} 559 559 <Text style={[a.text_md, a.font_semi_bold, a.leading_snug]}> 560 560 <Plural 561 561 value={additionalAuthorsCount} ··· 566 566 </Trans> 567 567 ) : ( 568 568 <Trans> 569 - New <Plural value={postsCount} one="skeet" other="skeets" /> from{' '} 569 + New <Plural value={postsCount} one="post" other="posts" /> from{' '} 570 570 {firstAuthorLink} 571 571 </Trans> 572 572 )
+2 -2
src/view/com/post-thread/PostRepostedBy.tsx
··· 87 87 isLoading={isLoadingUri || isLoadingRepostedBy} 88 88 isError={isError} 89 89 emptyType="results" 90 - emptyTitle={_(msg`No reskeets yet`)} 90 + emptyTitle={_(msg`No reposts yet`)} 91 91 emptyMessage={_( 92 - msg`Nobody has reskeeted this yet. Maybe you should be the first!`, 92 + msg`Nobody has reposted this yet. Maybe you should be the first!`, 93 93 )} 94 94 errorMessage={cleanError(resolveError || error)} 95 95 sideBorders={false}
+1 -1
src/view/com/posts/DiscoverFallbackHeader.tsx
··· 27 27 <View style={{flex: 1}}> 28 28 <Text type="md" style={pal.text}> 29 29 <Trans> 30 - We ran out of skeets from your follows. Here's the latest from{' '} 30 + We ran out of posts from your follows. Here's the latest from{' '} 31 31 <TextLink 32 32 type="md-medium" 33 33 href="/profile/bsky.app/feed/whats-hot"
+1 -1
src/view/com/posts/PostFeed.tsx
··· 868 868 return ( 869 869 <LoadMoreRetryBtn 870 870 label={_( 871 - msg`There was an issue fetching skeets. Tap here to try again.`, 871 + msg`There was an issue fetching posts. Tap here to try again.`, 872 872 )} 873 873 onPress={onPressRetryLoadMore} 874 874 />
+1 -1
src/view/com/posts/PostFeedItemCarousel.tsx
··· 63 63 ]}> 64 64 <Text style={[a.text_sm, a.font_bold, t.atoms.text_contrast_medium]}> 65 65 {items.length}{' '} 66 - <Plural value={items.length} one="reskeet" other="reskeets" /> 66 + <Plural value={items.length} one="repost" other="reposts" /> 67 67 </Text> 68 68 <View style={[a.gap_md, a.flex_row, a.align_end]}> 69 69 <Button
+3 -3
src/view/com/posts/PostFeedReason.tsx
··· 74 74 style={styles.includeReason} 75 75 to={makeProfileLink(reason.by)} 76 76 label={ 77 - isOwner ? _(msg`Reskeeted by you`) : _(msg`Reskeeted by ${reposter}`) 77 + isOwner ? _(msg`Reposted by you`) : _(msg`Reposted by ${reposter}`) 78 78 } 79 79 onPress={onOpenReposter}> 80 80 <RepostIcon ··· 91 91 ]} 92 92 numberOfLines={1}> 93 93 {isOwner ? ( 94 - <Trans>Reskeeted by you</Trans> 94 + <Trans>Reposted by you</Trans> 95 95 ) : ( 96 - <Trans>Reskeeted by {reposter}</Trans> 96 + <Trans>Reposted by {reposter}</Trans> 97 97 )} 98 98 </Text> 99 99 </ProfileHoverCard>
+2 -2
src/view/com/profile/ProfileMenu.tsx
··· 337 337 </Menu.Item> 338 338 <Menu.Item 339 339 testID="profileHeaderDropdownSearchBtn" 340 - label={_(msg`Search skeets`)} 340 + label={_(msg`Search posts`)} 341 341 onPress={onPressSearch}> 342 342 <Menu.ItemText> 343 - <Trans>Search skeets</Trans> 343 + <Trans>Search posts</Trans> 344 344 </Menu.ItemText> 345 345 <Menu.ItemIcon icon={SearchIcon} /> 346 346 </Menu.Item>
+1 -1
src/view/screens/ModerationMutedAccounts.tsx
··· 200 200 ]}> 201 201 <Text style={[a.text_center, a.text_sm, t.atoms.text_contrast_high]}> 202 202 <Trans> 203 - Muted accounts have their skeets removed from your feed and from your 203 + Muted accounts have their posts removed from your feed and from your 204 204 notifications. Mutes are completely private. 205 205 </Trans> 206 206 </Text>
+1 -1
src/view/screens/PostThread.tsx
··· 26 26 const {data: resolvedDid} = useResolveDidQuery(name) 27 27 const {data: profile} = useProfileQuery({did: resolvedDid}) 28 28 29 - useSetTitle(profile ? _(msg`Skeet by @${profile.handle}`) : undefined) 29 + useSetTitle(profile ? _(msg`Post by @${profile.handle}`) : undefined) 30 30 31 31 useFocusEffect( 32 32 useCallback(() => {
+1 -1
src/view/screens/Profile.tsx
··· 231 231 const sectionTitles = [ 232 232 showFiltersTab ? _(msg`Labels`) : undefined, 233 233 showListsTab && hasLabeler ? _(msg`Lists`) : undefined, 234 - showPostsTab ? _(msg`Skeets`) : undefined, 234 + showPostsTab ? _(msg`Posts`) : undefined, 235 235 showRepliesTab ? _(msg`Replies`) : undefined, 236 236 showMediaTab ? _(msg`Media`) : undefined, 237 237 showVideosTab ? _(msg`Videos`) : undefined,
+1 -1
src/view/shell/desktop/LeftNav.tsx
··· 588 588 style={enableSquareButtons ? [a.rounded_sm] : [a.rounded_full]}> 589 589 <ButtonIcon icon={EditBig} position="left" /> 590 590 <ButtonText> 591 - <Trans context="action">New Skeet</Trans> 591 + <Trans context="action">New Post</Trans> 592 592 </ButtonText> 593 593 </Button> 594 594 </View>