+{% endif -%}
{%- endblock %}
diff --git a/docs/build.md b/docs/build.md
index 2bf7324b9d..c0ffefeefb 100644
--- a/docs/build.md
+++ b/docs/build.md
@@ -10,6 +10,7 @@
- After initial setup:
- Copy `google-services.json.example` to `google-services.json` or provide your own `google-services.json`. (A real firebase project is NOT required)
- `npx expo prebuild` -> you will also need to run this anytime `app.json` or native `package.json` deps change
+ - `yarn intl:build` -> you will also need to run this anytime `./src/locale/{locale}/messages.po` change
- Start the dev servers
- `git clone git@github.com:bluesky-social/atproto.git`
- `cd atproto`
diff --git a/docs/internationalization.md b/docs/localization.md
similarity index 93%
rename from docs/internationalization.md
rename to docs/localization.md
index 3c1af7a4dc..b3dce7b418 100644
--- a/docs/internationalization.md
+++ b/docs/localization.md
@@ -110,4 +110,10 @@ export function Welcome() {
return
{welcome}
;
}
-```
\ No newline at end of file
+```
+
+
+### Credits
+Please check each individual `messages.po` file for the credits of the translators. We are very grateful for their help!
+
+If you would like to translate the Bluesky app into your language, please open a PR or issue on this repo.
\ No newline at end of file
diff --git a/jest/test-pds.ts b/jest/test-pds.ts
index 25faddfa7b..d86ebd787a 100644
--- a/jest/test-pds.ts
+++ b/jest/test-pds.ts
@@ -78,7 +78,7 @@ export async function createServer(
})
const pic = fs.readFileSync(
- path.join(__dirname, '..', 'assets', 'default-avatar.jpg'),
+ path.join(__dirname, '..', 'assets', 'default-avatar.png'),
)
return {
diff --git a/package.json b/package.json
index 758b7fbea0..bed17e9dc2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "bsky.app",
- "version": "1.59.0",
+ "version": "1.60.0",
"private": true,
"scripts": {
"prepare": "is-ci || husky install",
@@ -35,7 +35,7 @@
"intl:compile": "lingui compile"
},
"dependencies": {
- "@atproto/api": "^0.7.3",
+ "@atproto/api": "^0.7.4",
"@bam.tech/react-native-image-resizer": "^3.0.4",
"@braintree/sanitize-url": "^6.0.2",
"@emoji-mart/react": "^1.1.1",
@@ -54,6 +54,7 @@
"@react-native-clipboard/clipboard": "^1.10.0",
"@react-native-community/blur": "^4.3.0",
"@react-native-community/datetimepicker": "7.2.0",
+ "@react-native-masked-view/masked-view": "^0.3.1",
"@react-native-menu/menu": "^0.8.0",
"@react-native-picker/picker": "2.4.10",
"@react-navigation/bottom-tabs": "^6.5.7",
diff --git a/src/App.native.tsx b/src/App.native.tsx
index d11d05e705..6402b4a898 100644
--- a/src/App.native.tsx
+++ b/src/App.native.tsx
@@ -6,6 +6,10 @@ import {RootSiblingParent} from 'react-native-root-siblings'
import * as SplashScreen from 'expo-splash-screen'
import {GestureHandlerRootView} from 'react-native-gesture-handler'
import {QueryClientProvider} from '@tanstack/react-query'
+import {
+ SafeAreaProvider,
+ initialWindowMetrics,
+} from 'react-native-safe-area-context'
import 'view/icons'
@@ -34,6 +38,7 @@ import {
} from 'state/session'
import {Provider as UnreadNotifsProvider} from 'state/queries/notifications/unread'
import * as persisted from '#/state/persisted'
+import {Splash} from '#/Splash'
SplashScreen.preventAutoHideAsync()
@@ -53,27 +58,28 @@ function InnerApp() {
resumeSession(account)
}, [resumeSession])
- // wait for session to resume
- if (isInitialLoad) return null
-
return (
-
-
-
-
- {/* All components should be within this provider */}
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+ {/* All components should be within this provider */}
+
+
+
+
+
+
+
+
+
+
+
+
)
}
diff --git a/src/Navigation.tsx b/src/Navigation.tsx
index 3f6b5ba20c..c9f9272194 100644
--- a/src/Navigation.tsx
+++ b/src/Navigation.tsx
@@ -1,6 +1,5 @@
import * as React from 'react'
import {StyleSheet} from 'react-native'
-import * as SplashScreen from 'expo-splash-screen'
import {
NavigationContainer,
createNavigationContainerRef,
@@ -182,7 +181,7 @@ function commonScreens(Stack: typeof HomeTab, unreadCountLabel?: string) {
ProfileFeedScreen}
- options={{title: title('Feed')}}
+ options={{title: title('Feed'), requireAuth: true}}
/>
- HomeScreen} />
+ HomeScreen}
+ options={{requireAuth: true}}
+ />
{commonScreens(HomeTab)}
)
@@ -327,7 +330,11 @@ function FeedsTabNavigator() {
animationDuration: 250,
contentStyle,
}}>
- FeedsScreen} />
+ FeedsScreen}
+ options={{requireAuth: true}}
+ />
{commonScreens(FeedsTab as typeof HomeTab)}
)
@@ -399,7 +406,7 @@ const FlatNavigator = () => {
HomeScreen}
- options={{title: title('Home')}}
+ options={{title: title('Home'), requireAuth: true}}
/>
{
FeedsScreen}
- options={{title: title('Feeds')}}
+ options={{title: title('Feeds'), requireAuth: true}}
/>
) {
linking={LINKING}
theme={theme}
onReady={() => {
- SplashScreen.hideAsync()
logModuleInitTime()
onReady()
}}>
diff --git a/src/Splash.tsx b/src/Splash.tsx
new file mode 100644
index 0000000000..ead8e0f006
--- /dev/null
+++ b/src/Splash.tsx
@@ -0,0 +1,164 @@
+import React, {useCallback, useEffect} from 'react'
+import {View, StyleSheet, Image as RNImage} from 'react-native'
+import * as SplashScreen from 'expo-splash-screen'
+import {Image} from 'expo-image'
+import Animated, {
+ interpolate,
+ runOnJS,
+ useAnimatedStyle,
+ useSharedValue,
+ withTiming,
+ Easing,
+} from 'react-native-reanimated'
+import MaskedView from '@react-native-masked-view/masked-view'
+import {useSafeAreaInsets} from 'react-native-safe-area-context'
+import Svg, {Path, SvgProps} from 'react-native-svg'
+
+// @ts-ignore
+import splashImagePointer from '../assets/splash.png'
+const splashImageUri = RNImage.resolveAssetSource(splashImagePointer).uri
+
+export const Logo = React.forwardRef(function LogoImpl(props: SvgProps, ref) {
+ const width = 1000
+ const height = width * (67 / 64)
+ return (
+
+ )
+})
+
+type Props = {
+ isReady: boolean
+}
+
+SplashScreen.preventAutoHideAsync().catch(() => {})
+
+const AnimatedLogo = Animated.createAnimatedComponent(Logo)
+
+export function Splash(props: React.PropsWithChildren) {
+ const insets = useSafeAreaInsets()
+ const intro = useSharedValue(0)
+ const outroLogo = useSharedValue(0)
+ const outroApp = useSharedValue(0)
+ const [isAnimationComplete, setIsAnimationComplete] = React.useState(false)
+ const [isImageLoaded, setIsImageLoaded] = React.useState(false)
+ const isReady = props.isReady && isImageLoaded
+
+ const logoAnimations = useAnimatedStyle(() => {
+ return {
+ transform: [
+ {
+ scale: interpolate(intro.value, [0, 1], [0.8, 1], 'clamp'),
+ },
+ {
+ scale: interpolate(
+ outroLogo.value,
+ [0, 0.06, 0.08, 1],
+ [1, 0.8, 0.8, 400],
+ 'clamp',
+ ),
+ },
+ ],
+ opacity: interpolate(intro.value, [0, 1], [0, 1], 'clamp'),
+ }
+ })
+
+ const appAnimation = useAnimatedStyle(() => {
+ return {
+ transform: [
+ {
+ scale: interpolate(outroApp.value, [0, 1], [1.1, 1], 'clamp'),
+ },
+ ],
+ opacity: interpolate(outroApp.value, [0, 0.9, 1], [0, 1, 1], 'clamp'),
+ }
+ })
+
+ const onFinish = useCallback(() => setIsAnimationComplete(true), [])
+
+ useEffect(() => {
+ if (isReady) {
+ // hide on mount
+ SplashScreen.hideAsync().catch(() => {})
+
+ intro.value = withTiming(
+ 1,
+ {duration: 200, easing: Easing.out(Easing.cubic)},
+ async () => {
+ // set these values to check animation at specific point
+ // outroLogo.value = 0.1
+ // outroApp.value = 0.1
+ outroLogo.value = withTiming(
+ 1,
+ {duration: 1000, easing: Easing.in(Easing.cubic)},
+ () => {
+ runOnJS(onFinish)()
+ },
+ )
+ outroApp.value = withTiming(
+ 1,
+ {duration: 1000, easing: Easing.inOut(Easing.cubic)},
+ () => {
+ runOnJS(onFinish)()
+ },
+ )
+ },
+ )
+ }
+ }, [onFinish, intro, outroLogo, outroApp, isReady])
+
+ const onLoadEnd = useCallback(() => {
+ setIsImageLoaded(true)
+ }, [setIsImageLoaded])
+
+ return (
+
+ {!isAnimationComplete && (
+
+ )}
+
+
+
+
+ }>
+ {!isAnimationComplete && (
+
+ )}
+
+
+ {props.children}
+
+
+
+ )
+}
diff --git a/src/lib/ScrollContext.tsx b/src/lib/ScrollContext.tsx
new file mode 100644
index 0000000000..00b197bedc
--- /dev/null
+++ b/src/lib/ScrollContext.tsx
@@ -0,0 +1,35 @@
+import React, {createContext, useContext, useMemo} from 'react'
+import {ScrollHandlers} from 'react-native-reanimated'
+
+const ScrollContext = createContext>({
+ onBeginDrag: undefined,
+ onEndDrag: undefined,
+ onScroll: undefined,
+})
+
+export function useScrollHandlers(): ScrollHandlers {
+ return useContext(ScrollContext)
+}
+
+type ProviderProps = {children: React.ReactNode} & ScrollHandlers
+
+// Note: this completely *overrides* the parent handlers.
+// It's up to you to compose them with the parent ones via useScrollHandlers() if needed.
+export function ScrollProvider({
+ children,
+ onBeginDrag,
+ onEndDrag,
+ onScroll,
+}: ProviderProps) {
+ const handlers = useMemo(
+ () => ({
+ onBeginDrag,
+ onEndDrag,
+ onScroll,
+ }),
+ [onBeginDrag, onEndDrag, onScroll],
+ )
+ return (
+ {children}
+ )
+}
diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts
index d94ee4643b..440dfa5ee3 100644
--- a/src/lib/api/index.ts
+++ b/src/lib/api/index.ts
@@ -104,12 +104,18 @@ export async function post(agent: BskyAgent, opts: PostOpts) {
// add image embed if present
if (opts.images?.length) {
+ logger.info(`Uploading images`, {
+ count: opts.images.length,
+ })
+
const images: AppBskyEmbedImages.Image[] = []
for (const image of opts.images) {
opts.onStateChange?.(`Uploading image #${images.length + 1}...`)
+ logger.info(`Compressing image`)
await image.compress()
const path = image.compressed?.path ?? image.path
const {width, height} = image.compressed || image
+ logger.info(`Uploading image`)
const res = await uploadBlob(agent, path, 'image/jpeg')
images.push({
image: res.data.blob,
diff --git a/src/lib/assets.native.ts b/src/lib/assets.native.ts
index d7ef9a05eb..754bc9d2b0 100644
--- a/src/lib/assets.native.ts
+++ b/src/lib/assets.native.ts
@@ -1,5 +1,4 @@
import {ImageRequireSource} from 'react-native'
-export const DEF_AVATAR: ImageRequireSource = require('../../assets/default-avatar.jpg')
-export const TABS_EXPLAINER: ImageRequireSource = require('../../assets/tabs-explainer.jpg')
-export const CLOUD_SPLASH: ImageRequireSource = require('../../assets/cloud-splash.png')
+export const DEF_AVATAR: ImageRequireSource = require('../../assets/default-avatar.png')
+export const CLOUD_SPLASH: ImageRequireSource = require('../../assets/splash.png')
diff --git a/src/lib/assets.ts b/src/lib/assets.ts
index 216478762d..8859607d56 100644
--- a/src/lib/assets.ts
+++ b/src/lib/assets.ts
@@ -1,10 +1,6 @@
import {ImageRequireSource} from 'react-native'
// @ts-ignore we need to pretend -prf
-export const DEF_AVATAR: ImageRequireSource = {uri: '/img/default-avatar.jpg'}
+export const DEF_AVATAR: ImageRequireSource = {uri: '/img/default-avatar.png'}
// @ts-ignore we need to pretend -prf
-export const TABS_EXPLAINER: ImageRequireSource = {
- uri: '/img/tabs-explainer.jpg',
-}
-// @ts-ignore we need to pretend -prf
-export const CLOUD_SPLASH: ImageRequireSource = {uri: '/img/cloud-splash.png'}
+export const CLOUD_SPLASH: ImageRequireSource = {uri: '/img/splash.png'}
diff --git a/src/lib/build-flags.ts b/src/lib/build-flags.ts
index faefdd6ab7..cf05114e02 100644
--- a/src/lib/build-flags.ts
+++ b/src/lib/build-flags.ts
@@ -1,2 +1,2 @@
export const LOGIN_INCLUDE_DEV_SERVERS = true
-export const PWI_ENABLED = false
+export const PWI_ENABLED = true
diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po
index 6cb186fe50..7b0c651680 100644
--- a/src/locale/locales/en/messages.po
+++ b/src/locale/locales/en/messages.po
@@ -47,7 +47,7 @@ msgstr ""
msgid "{invitesAvailable} invite codes available"
msgstr ""
-#: src/view/screens/Search/Search.tsx:87
+#: src/view/screens/Search/Search.tsx:88
msgid "{message}"
msgstr ""
@@ -95,7 +95,7 @@ msgstr ""
#: src/view/com/modals/ListAddRemoveUsers.tsx:264
#: src/view/com/modals/UserAddRemoveLists.tsx:193
-#: src/view/screens/ProfileList.tsx:783
+#: src/view/screens/ProfileList.tsx:754
msgid "Add"
msgstr ""
@@ -103,7 +103,7 @@ msgstr ""
msgid "Add a content warning"
msgstr ""
-#: src/view/screens/ProfileList.tsx:773
+#: src/view/screens/ProfileList.tsx:744
msgid "Add a user to this list"
msgstr ""
@@ -126,11 +126,11 @@ msgstr ""
msgid "Add details to report"
msgstr ""
-#: src/view/com/composer/Composer.tsx:432
+#: src/view/com/composer/Composer.tsx:438
msgid "Add link card"
msgstr ""
-#: src/view/com/composer/Composer.tsx:435
+#: src/view/com/composer/Composer.tsx:441
msgid "Add link card:"
msgstr ""
@@ -142,7 +142,7 @@ msgstr ""
msgid "Add to Lists"
msgstr ""
-#: src/view/screens/ProfileFeed.tsx:280
+#: src/view/screens/ProfileFeed.tsx:270
msgid "Add to my feeds"
msgstr ""
@@ -224,11 +224,11 @@ msgstr ""
msgid "Are you sure you want to delete the app password \"{name}\"?"
msgstr ""
-#: src/view/com/composer/Composer.tsx:141
+#: src/view/com/composer/Composer.tsx:142
msgid "Are you sure you'd like to discard this draft?"
msgstr ""
-#: src/view/screens/ProfileList.tsx:375
+#: src/view/screens/ProfileList.tsx:352
msgid "Are you sure?"
msgstr ""
@@ -250,9 +250,9 @@ msgstr ""
#: src/view/com/auth/login/LoginForm.tsx:249
#: src/view/com/auth/login/SetNewPasswordForm.tsx:148
#: src/view/com/modals/report/InputIssueDetails.tsx:45
-#: src/view/com/post-thread/PostThread.tsx:392
-#: src/view/com/post-thread/PostThread.tsx:442
-#: src/view/com/post-thread/PostThread.tsx:450
+#: src/view/com/post-thread/PostThread.tsx:395
+#: src/view/com/post-thread/PostThread.tsx:445
+#: src/view/com/post-thread/PostThread.tsx:453
#: src/view/com/profile/ProfileHeader.tsx:672
msgid "Back"
msgstr ""
@@ -275,15 +275,15 @@ msgstr ""
msgid "Block Account"
msgstr ""
-#: src/view/screens/ProfileList.tsx:545
+#: src/view/screens/ProfileList.tsx:522
msgid "Block accounts"
msgstr ""
-#: src/view/screens/ProfileList.tsx:495
+#: src/view/screens/ProfileList.tsx:472
msgid "Block list"
msgstr ""
-#: src/view/screens/ProfileList.tsx:330
+#: src/view/screens/ProfileList.tsx:307
msgid "Block these accounts?"
msgstr ""
@@ -303,15 +303,19 @@ msgstr ""
msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you. You will not see their content and they will be prevented from seeing yours."
msgstr ""
-#: src/view/com/post-thread/PostThread.tsx:248
+#: src/view/com/post-thread/PostThread.tsx:251
msgid "Blocked post."
msgstr ""
-#: src/view/screens/ProfileList.tsx:332
+#: src/view/screens/ProfileList.tsx:309
msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you."
msgstr ""
-#: src/view/com/auth/SplashScreen.tsx:26
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:93
+msgid "Blog"
+msgstr ""
+
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:31
msgid "Bluesky"
msgstr ""
@@ -343,6 +347,10 @@ msgstr ""
msgid "Build version {0} {1}"
msgstr ""
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:87
+msgid "Business"
+msgstr ""
+
#: src/view/com/composer/photos/OpenCameraBtn.tsx:60
#: src/view/com/util/UserAvatar.tsx:221
#: src/view/com/util/UserBanner.tsx:38
@@ -353,8 +361,8 @@ msgstr ""
msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long."
msgstr ""
-#: src/view/com/composer/Composer.tsx:279
-#: src/view/com/composer/Composer.tsx:282
+#: src/view/com/composer/Composer.tsx:285
+#: src/view/com/composer/Composer.tsx:288
#: src/view/com/modals/AltImage.tsx:127
#: src/view/com/modals/ChangeEmail.tsx:218
#: src/view/com/modals/ChangeEmail.tsx:220
@@ -368,7 +376,7 @@ msgstr ""
#: src/view/com/modals/LinkWarning.tsx:85
#: src/view/com/modals/Repost.tsx:73
#: src/view/com/modals/Waitlist.tsx:136
-#: src/view/screens/Search/Search.tsx:558
+#: src/view/screens/Search/Search.tsx:592
#: src/view/shell/desktop/Search.tsx:182
msgid "Cancel"
msgstr ""
@@ -473,7 +481,7 @@ msgid "Clear all storage data (restart after this)"
msgstr ""
#: src/view/com/util/forms/SearchInput.tsx:73
-#: src/view/screens/Search/Search.tsx:543
+#: src/view/screens/Search/Search.tsx:577
msgid "Clear search query"
msgstr ""
@@ -551,7 +559,7 @@ msgstr ""
msgid "Content Languages"
msgstr ""
-#: src/view/com/util/moderation/ScreenHider.tsx:69
+#: src/view/com/util/moderation/ScreenHider.tsx:78
msgid "Content Warning"
msgstr ""
@@ -573,7 +581,7 @@ msgstr ""
msgid "Copy"
msgstr ""
-#: src/view/screens/ProfileList.tsx:407
+#: src/view/screens/ProfileList.tsx:384
msgid "Copy link to list"
msgstr ""
@@ -593,15 +601,16 @@ msgstr ""
msgid "Copyright Policy"
msgstr ""
-#: src/view/screens/ProfileFeed.tsx:103
+#: src/view/screens/ProfileFeed.tsx:94
msgid "Could not load feed"
msgstr ""
-#: src/view/screens/ProfileList.tsx:860
+#: src/view/screens/ProfileList.tsx:830
msgid "Could not load list"
msgstr ""
-#: src/view/com/auth/SplashScreen.tsx:41
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:62
+#: src/view/com/auth/SplashScreen.tsx:46
msgid "Create a new account"
msgstr ""
@@ -609,7 +618,8 @@ msgstr ""
msgid "Create Account"
msgstr ""
-#: src/view/com/auth/SplashScreen.tsx:38
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:54
+#: src/view/com/auth/SplashScreen.tsx:43
msgid "Create new account"
msgstr ""
@@ -643,8 +653,8 @@ msgstr ""
msgid "Delete app password"
msgstr ""
-#: src/view/screens/ProfileList.tsx:374
-#: src/view/screens/ProfileList.tsx:434
+#: src/view/screens/ProfileList.tsx:351
+#: src/view/screens/ProfileList.tsx:411
msgid "Delete List"
msgstr ""
@@ -664,7 +674,7 @@ msgstr ""
msgid "Delete this post?"
msgstr ""
-#: src/view/com/post-thread/PostThread.tsx:240
+#: src/view/com/post-thread/PostThread.tsx:243
msgid "Deleted post."
msgstr ""
@@ -683,11 +693,11 @@ msgstr ""
msgid "Developer Tools"
msgstr ""
-#: src/view/com/composer/Composer.tsx:142
+#: src/view/com/composer/Composer.tsx:143
msgid "Discard"
msgstr ""
-#: src/view/com/composer/Composer.tsx:136
+#: src/view/com/composer/Composer.tsx:137
msgid "Discard draft"
msgstr ""
@@ -739,7 +749,7 @@ msgstr ""
msgid "Edit image"
msgstr ""
-#: src/view/screens/ProfileList.tsx:422
+#: src/view/screens/ProfileList.tsx:399
msgid "Edit list details"
msgstr ""
@@ -787,7 +797,7 @@ msgstr ""
msgid "Enable this setting to only see replies between people you follow."
msgstr ""
-#: src/view/screens/Profile.tsx:471
+#: src/view/screens/Profile.tsx:425
msgid "End of feed"
msgstr ""
@@ -815,7 +825,7 @@ msgstr ""
msgid "Enter your username and password"
msgstr ""
-#: src/view/screens/Search/Search.tsx:105
+#: src/view/screens/Search/Search.tsx:106
msgid "Error:"
msgstr ""
@@ -836,7 +846,7 @@ msgstr ""
msgid "Feed offline"
msgstr ""
-#: src/view/com/feeds/FeedPage.tsx:140
+#: src/view/com/feeds/FeedPage.tsx:143
msgid "Feed Preferences"
msgstr ""
@@ -847,8 +857,8 @@ msgstr ""
#: src/view/screens/Feeds.tsx:475
#: src/view/screens/Profile.tsx:164
-#: src/view/shell/bottom-bar/BottomBar.tsx:160
-#: src/view/shell/desktop/LeftNav.tsx:333
+#: src/view/shell/bottom-bar/BottomBar.tsx:181
+#: src/view/shell/desktop/LeftNav.tsx:339
#: src/view/shell/Drawer.tsx:455
#: src/view/shell/Drawer.tsx:456
msgid "Feeds"
@@ -862,6 +872,14 @@ msgstr ""
msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information."
msgstr ""
+#: src/view/screens/Search/Search.tsx:422
+msgid "Find users on Bluesky"
+msgstr ""
+
+#: src/view/screens/Search/Search.tsx:420
+msgid "Find users with the search tool on the right"
+msgstr ""
+
#: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:150
msgid "Finding similar accounts..."
msgstr ""
@@ -940,17 +958,17 @@ msgstr ""
msgid "Get Started"
msgstr ""
-#: src/view/com/auth/LoggedOut.tsx:68
-#: src/view/com/auth/LoggedOut.tsx:69
-#: src/view/com/util/moderation/ScreenHider.tsx:105
+#: src/view/com/auth/LoggedOut.tsx:70
+#: src/view/com/auth/LoggedOut.tsx:71
+#: src/view/com/util/moderation/ScreenHider.tsx:123
#: src/view/shell/desktop/LeftNav.tsx:103
msgid "Go back"
msgstr ""
-#: src/view/screens/ProfileFeed.tsx:112
-#: src/view/screens/ProfileFeed.tsx:117
-#: src/view/screens/ProfileList.tsx:869
-#: src/view/screens/ProfileList.tsx:874
+#: src/view/screens/ProfileFeed.tsx:103
+#: src/view/screens/ProfileFeed.tsx:108
+#: src/view/screens/ProfileList.tsx:839
+#: src/view/screens/ProfileList.tsx:844
msgid "Go Back"
msgstr ""
@@ -974,6 +992,7 @@ msgid "Here is your app password."
msgstr ""
#: src/view/com/notifications/FeedItem.tsx:316
+#: src/view/com/util/moderation/ContentHider.tsx:103
msgid "Hide"
msgstr ""
@@ -1009,14 +1028,14 @@ msgstr ""
#~ msgid "Hmmm, we're having trouble finding this feed. It may have been deleted."
#~ msgstr ""
-#: src/view/shell/bottom-bar/BottomBar.tsx:116
-#: src/view/shell/desktop/LeftNav.tsx:297
+#: src/view/shell/bottom-bar/BottomBar.tsx:137
+#: src/view/shell/desktop/LeftNav.tsx:303
#: src/view/shell/Drawer.tsx:379
#: src/view/shell/Drawer.tsx:380
msgid "Home"
msgstr ""
-#: src/view/com/pager/FeedsTabBarMobile.tsx:99
+#: src/view/com/pager/FeedsTabBarMobile.tsx:96
#: src/view/screens/PreferencesHomeFeed.tsx:95
#: src/view/screens/Settings.tsx:481
msgid "Home Feed Preferences"
@@ -1082,6 +1101,10 @@ msgstr ""
msgid "Invite codes: {invitesAvailable} available"
msgstr ""
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:99
+msgid "Jobs"
+msgstr ""
+
#: src/view/com/modals/Waitlist.tsx:67
msgid "Join the waitlist"
msgstr ""
@@ -1107,9 +1130,13 @@ msgstr ""
msgid "Languages"
msgstr ""
+#: src/view/com/util/moderation/ContentHider.tsx:101
+msgid "Learn more"
+msgstr ""
+
#: src/view/com/util/moderation/PostAlerts.tsx:47
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:65
-#: src/view/com/util/moderation/ScreenHider.tsx:88
+#: src/view/com/util/moderation/ScreenHider.tsx:104
msgid "Learn More"
msgstr ""
@@ -1117,7 +1144,7 @@ msgstr ""
#: src/view/com/util/moderation/PostAlerts.tsx:40
#: src/view/com/util/moderation/PostHider.tsx:76
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:49
-#: src/view/com/util/moderation/ScreenHider.tsx:85
+#: src/view/com/util/moderation/ScreenHider.tsx:101
msgid "Learn more about this warning"
msgstr ""
@@ -1147,7 +1174,7 @@ msgstr ""
#~ msgid "Light"
#~ msgstr ""
-#: src/view/screens/ProfileFeed.tsx:643
+#: src/view/screens/ProfileFeed.tsx:577
msgid "Like this feed"
msgstr ""
@@ -1177,22 +1204,22 @@ msgid "List Name"
msgstr ""
#: src/view/screens/Profile.tsx:165
-#: src/view/shell/desktop/LeftNav.tsx:373
+#: src/view/shell/desktop/LeftNav.tsx:376
#: src/view/shell/Drawer.tsx:471
#: src/view/shell/Drawer.tsx:472
msgid "Lists"
msgstr ""
-#: src/view/com/post-thread/PostThread.tsx:257
-#: src/view/com/post-thread/PostThread.tsx:265
+#: src/view/com/post-thread/PostThread.tsx:260
+#: src/view/com/post-thread/PostThread.tsx:268
msgid "Load more posts"
msgstr ""
-#: src/view/screens/Notifications.tsx:141
+#: src/view/screens/Notifications.tsx:144
msgid "Load new notifications"
msgstr ""
-#: src/view/com/feeds/FeedPage.tsx:185
+#: src/view/com/feeds/FeedPage.tsx:189
msgid "Load new posts"
msgstr ""
@@ -1216,9 +1243,9 @@ msgstr ""
msgid "Login to account that is not listed"
msgstr ""
-#: src/view/screens/ProfileFeed.tsx:482
-msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!"
-msgstr ""
+#: src/view/screens/ProfileFeed.tsx:472
+#~ msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!"
+#~ msgstr ""
#: src/view/com/modals/LinkWarning.tsx:63
msgid "Make sure this is where you intend to go!"
@@ -1236,18 +1263,17 @@ msgstr ""
msgid "Mentioned users"
msgstr ""
-#: src/view/screens/Search/Search.tsx:503
+#: src/view/screens/Search/Search.tsx:537
msgid "Menu"
msgstr ""
#: src/view/com/posts/FeedErrorMessage.tsx:194
-#: src/view/screens/ProfileFeed.tsx:490
msgid "Message from server"
msgstr ""
#: src/view/screens/Moderation.tsx:64
#: src/view/screens/Settings.tsx:563
-#: src/view/shell/desktop/LeftNav.tsx:391
+#: src/view/shell/desktop/LeftNav.tsx:394
#: src/view/shell/Drawer.tsx:490
#: src/view/shell/Drawer.tsx:491
msgid "Moderation"
@@ -1266,8 +1292,8 @@ msgid "More feeds"
msgstr ""
#: src/view/com/profile/ProfileHeader.tsx:548
-#: src/view/screens/ProfileFeed.tsx:370
-#: src/view/screens/ProfileList.tsx:606
+#: src/view/screens/ProfileFeed.tsx:360
+#: src/view/screens/ProfileList.tsx:583
msgid "More options"
msgstr ""
@@ -1279,15 +1305,15 @@ msgstr ""
msgid "Mute Account"
msgstr ""
-#: src/view/screens/ProfileList.tsx:533
+#: src/view/screens/ProfileList.tsx:510
msgid "Mute accounts"
msgstr ""
-#: src/view/screens/ProfileList.tsx:480
+#: src/view/screens/ProfileList.tsx:457
msgid "Mute list"
msgstr ""
-#: src/view/screens/ProfileList.tsx:293
+#: src/view/screens/ProfileList.tsx:270
msgid "Mute these accounts?"
msgstr ""
@@ -1307,7 +1333,7 @@ msgstr ""
msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private."
msgstr ""
-#: src/view/screens/ProfileList.tsx:295
+#: src/view/screens/ProfileList.tsx:272
msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them."
msgstr ""
@@ -1345,12 +1371,12 @@ msgstr ""
msgid "New"
msgstr ""
-#: src/view/com/feeds/FeedPage.tsx:196
+#: src/view/com/feeds/FeedPage.tsx:200
#: src/view/screens/Feeds.tsx:510
-#: src/view/screens/Profile.tsx:389
-#: src/view/screens/ProfileFeed.tsx:451
-#: src/view/screens/ProfileList.tsx:212
-#: src/view/screens/ProfileList.tsx:244
+#: src/view/screens/Profile.tsx:353
+#: src/view/screens/ProfileFeed.tsx:430
+#: src/view/screens/ProfileList.tsx:193
+#: src/view/screens/ProfileList.tsx:221
#: src/view/shell/desktop/LeftNav.tsx:246
msgid "New post"
msgstr ""
@@ -1379,8 +1405,8 @@ msgstr ""
msgid "No"
msgstr ""
-#: src/view/screens/ProfileFeed.tsx:636
-#: src/view/screens/ProfileList.tsx:740
+#: src/view/screens/ProfileFeed.tsx:570
+#: src/view/screens/ProfileList.tsx:711
msgid "No description"
msgstr ""
@@ -1398,9 +1424,9 @@ msgstr ""
#~ msgstr ""
#: src/view/com/modals/ListAddRemoveUsers.tsx:127
-#: src/view/screens/Search/Search.tsx:270
-#: src/view/screens/Search/Search.tsx:298
-#: src/view/screens/Search/Search.tsx:581
+#: src/view/screens/Search/Search.tsx:271
+#: src/view/screens/Search/Search.tsx:299
+#: src/view/screens/Search/Search.tsx:615
#: src/view/shell/desktop/Search.tsx:210
msgid "No results found for {query}"
msgstr ""
@@ -1429,10 +1455,10 @@ msgstr ""
#~ msgid "Note: Third-party apps that display Bluesky content may not respect this setting."
#~ msgstr ""
-#: src/view/screens/Notifications.tsx:108
-#: src/view/screens/Notifications.tsx:132
-#: src/view/shell/bottom-bar/BottomBar.tsx:187
-#: src/view/shell/desktop/LeftNav.tsx:355
+#: src/view/screens/Notifications.tsx:109
+#: src/view/screens/Notifications.tsx:133
+#: src/view/shell/bottom-bar/BottomBar.tsx:205
+#: src/view/shell/desktop/LeftNav.tsx:358
#: src/view/shell/Drawer.tsx:416
#: src/view/shell/Drawer.tsx:417
msgid "Notifications"
@@ -1446,7 +1472,7 @@ msgstr ""
msgid "Okay"
msgstr ""
-#: src/view/com/composer/Composer.tsx:348
+#: src/view/com/composer/Composer.tsx:354
msgid "One or more images is missing alt text."
msgstr ""
@@ -1454,7 +1480,7 @@ msgstr ""
msgid "Only {0} can reply."
msgstr ""
-#: src/view/com/pager/FeedsTabBarMobile.tsx:79
+#: src/view/com/pager/FeedsTabBarMobile.tsx:76
msgid "Open navigation"
msgstr ""
@@ -1569,13 +1595,13 @@ msgstr ""
msgid "Please tell us why you think this decision was incorrect."
msgstr ""
-#: src/view/com/composer/Composer.tsx:331
-#: src/view/com/post-thread/PostThread.tsx:223
-#: src/view/screens/PostThread.tsx:78
+#: src/view/com/composer/Composer.tsx:337
+#: src/view/com/post-thread/PostThread.tsx:226
+#: src/view/screens/PostThread.tsx:80
msgid "Post"
msgstr ""
-#: src/view/com/post-thread/PostThread.tsx:382
+#: src/view/com/post-thread/PostThread.tsx:385
msgid "Post hidden"
msgstr ""
@@ -1587,7 +1613,7 @@ msgstr ""
msgid "Post Languages"
msgstr ""
-#: src/view/com/post-thread/PostThread.tsx:434
+#: src/view/com/post-thread/PostThread.tsx:437
msgid "Post not found"
msgstr ""
@@ -1623,7 +1649,8 @@ msgstr ""
msgid "Processing..."
msgstr ""
-#: src/view/shell/bottom-bar/BottomBar.tsx:229
+#: src/view/shell/bottom-bar/BottomBar.tsx:247
+#: src/view/shell/desktop/LeftNav.tsx:412
#: src/view/shell/Drawer.tsx:69
#: src/view/shell/Drawer.tsx:525
#: src/view/shell/Drawer.tsx:526
@@ -1690,7 +1717,7 @@ msgstr ""
#: src/view/com/feeds/FeedSourceCard.tsx:105
#: src/view/com/feeds/FeedSourceCard.tsx:172
-#: src/view/screens/ProfileFeed.tsx:280
+#: src/view/screens/ProfileFeed.tsx:270
msgid "Remove from my feeds"
msgstr ""
@@ -1735,11 +1762,11 @@ msgstr ""
msgid "Report Account"
msgstr ""
-#: src/view/screens/ProfileFeed.tsx:300
+#: src/view/screens/ProfileFeed.tsx:290
msgid "Report feed"
msgstr ""
-#: src/view/screens/ProfileList.tsx:448
+#: src/view/screens/ProfileList.tsx:425
msgid "Report List"
msgstr ""
@@ -1851,10 +1878,10 @@ msgstr ""
#: src/view/com/modals/ListAddRemoveUsers.tsx:75
#: src/view/com/util/forms/SearchInput.tsx:64
-#: src/view/screens/Search/Search.tsx:381
-#: src/view/screens/Search/Search.tsx:533
-#: src/view/shell/bottom-bar/BottomBar.tsx:138
-#: src/view/shell/desktop/LeftNav.tsx:315
+#: src/view/screens/Search/Search.tsx:401
+#: src/view/screens/Search/Search.tsx:567
+#: src/view/shell/bottom-bar/BottomBar.tsx:159
+#: src/view/shell/desktop/LeftNav.tsx:321
#: src/view/shell/desktop/Search.tsx:161
#: src/view/shell/desktop/Search.tsx:170
#: src/view/shell/Drawer.tsx:343
@@ -1863,14 +1890,14 @@ msgid "Search"
msgstr ""
#: src/view/screens/Search/Search.tsx:390
-msgid "Search for posts and users."
-msgstr ""
+#~ msgid "Search for posts and users."
+#~ msgstr ""
#: src/view/com/modals/ChangeEmail.tsx:110
msgid "Security Step Required"
msgstr ""
-#: src/view/com/auth/SplashScreen.tsx:29
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:39
msgid "See what's next"
msgstr ""
@@ -1944,7 +1971,7 @@ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your f
msgstr ""
#: src/view/screens/Settings.tsx:277
-#: src/view/shell/desktop/LeftNav.tsx:427
+#: src/view/shell/desktop/LeftNav.tsx:430
#: src/view/shell/Drawer.tsx:546
#: src/view/shell/Drawer.tsx:547
msgid "Settings"
@@ -1956,11 +1983,11 @@ msgstr ""
#: src/view/com/profile/ProfileHeader.tsx:338
#: src/view/com/util/forms/PostDropdownBtn.tsx:129
-#: src/view/screens/ProfileList.tsx:407
+#: src/view/screens/ProfileList.tsx:384
msgid "Share"
msgstr ""
-#: src/view/screens/ProfileFeed.tsx:312
+#: src/view/screens/ProfileFeed.tsx:302
msgid "Share feed"
msgstr ""
@@ -1968,11 +1995,12 @@ msgstr ""
#~ msgid "Share link"
#~ msgstr ""
+#: src/view/com/util/moderation/ContentHider.tsx:105
#: src/view/screens/Settings.tsx:316
msgid "Show"
msgstr ""
-#: src/view/com/util/moderation/ScreenHider.tsx:114
+#: src/view/com/util/moderation/ScreenHider.tsx:132
msgid "Show anyway"
msgstr ""
@@ -2000,15 +2028,23 @@ msgstr ""
msgid "Show users"
msgstr ""
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:70
#: src/view/com/auth/login/Login.tsx:98
-#: src/view/com/auth/SplashScreen.tsx:49
-#: src/view/shell/NavSignupCard.tsx:52
-#: src/view/shell/NavSignupCard.tsx:53
+#: src/view/com/auth/SplashScreen.tsx:54
+#: src/view/shell/bottom-bar/BottomBar.tsx:285
+#: src/view/shell/bottom-bar/BottomBar.tsx:286
+#: src/view/shell/bottom-bar/BottomBar.tsx:288
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:177
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:178
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:180
+#: src/view/shell/NavSignupCard.tsx:58
+#: src/view/shell/NavSignupCard.tsx:59
msgid "Sign in"
msgstr ""
-#: src/view/com/auth/SplashScreen.tsx:52
-#: src/view/com/auth/SplashScreen.web.tsx:84
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:78
+#: src/view/com/auth/SplashScreen.tsx:57
+#: src/view/com/auth/SplashScreen.web.tsx:87
msgid "Sign In"
msgstr ""
@@ -2030,16 +2066,26 @@ msgstr ""
msgid "Sign out"
msgstr ""
-#: src/view/shell/NavSignupCard.tsx:43
-#: src/view/shell/NavSignupCard.tsx:44
-#: src/view/shell/NavSignupCard.tsx:46
+#: src/view/shell/bottom-bar/BottomBar.tsx:275
+#: src/view/shell/bottom-bar/BottomBar.tsx:276
+#: src/view/shell/bottom-bar/BottomBar.tsx:278
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:167
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:168
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:170
+#: src/view/shell/NavSignupCard.tsx:49
+#: src/view/shell/NavSignupCard.tsx:50
+#: src/view/shell/NavSignupCard.tsx:52
msgid "Sign up"
msgstr ""
-#: src/view/shell/NavSignupCard.tsx:36
+#: src/view/shell/NavSignupCard.tsx:42
msgid "Sign up or sign in to join the conversation"
msgstr ""
+#: src/view/com/util/moderation/ScreenHider.tsx:76
+msgid "Sign-in Required"
+msgstr ""
+
#: src/view/screens/Settings.tsx:327
msgid "Signed in as"
msgstr ""
@@ -2077,15 +2123,15 @@ msgstr ""
msgid "Submit"
msgstr "Submit"
-#: src/view/screens/ProfileList.tsx:597
+#: src/view/screens/ProfileList.tsx:574
msgid "Subscribe"
msgstr ""
-#: src/view/screens/ProfileList.tsx:593
+#: src/view/screens/ProfileList.tsx:570
msgid "Subscribe to this list"
msgstr ""
-#: src/view/screens/Search/Search.tsx:354
+#: src/view/screens/Search/Search.tsx:357
msgid "Suggested Follows"
msgstr ""
@@ -2135,7 +2181,7 @@ msgstr ""
msgid "The Copyright Policy has been moved to <0/>"
msgstr ""
-#: src/view/com/post-thread/PostThread.tsx:437
+#: src/view/com/post-thread/PostThread.tsx:440
msgid "The post may have been deleted."
msgstr ""
@@ -2159,10 +2205,14 @@ msgstr ""
msgid "This {0} has been labeled."
msgstr ""
-#: src/view/com/util/moderation/ScreenHider.tsx:72
+#: src/view/com/util/moderation/ScreenHider.tsx:88
msgid "This {screenDescription} has been flagged:"
msgstr ""
+#: src/view/com/util/moderation/ScreenHider.tsx:83
+msgid "This account has requested that users sign in to view their profile."
+msgstr ""
+
#: src/view/com/posts/FeedErrorMessage.tsx:107
msgid "This content is not viewable without a Bluesky account."
msgstr ""
@@ -2222,11 +2272,11 @@ msgstr ""
msgid "Try again"
msgstr ""
-#: src/view/screens/ProfileList.tsx:495
+#: src/view/screens/ProfileList.tsx:472
msgid "Un-block list"
msgstr ""
-#: src/view/screens/ProfileList.tsx:480
+#: src/view/screens/ProfileList.tsx:457
msgid "Un-mute list"
msgstr ""
@@ -2262,7 +2312,7 @@ msgstr ""
msgid "Unmute thread"
msgstr ""
-#: src/view/screens/ProfileList.tsx:463
+#: src/view/screens/ProfileList.tsx:440
msgid "Unpin moderation list"
msgstr ""
@@ -2311,7 +2361,7 @@ msgstr ""
msgid "Username or email address"
msgstr ""
-#: src/view/screens/ProfileList.tsx:767
+#: src/view/screens/ProfileList.tsx:738
msgid "Users"
msgstr ""
@@ -2368,7 +2418,7 @@ msgstr ""
#~ msgid "We're sorry, but this feed is currently receiving high traffic and is temporarily unavailable. Please try again later."
#~ msgstr ""
-#: src/view/screens/Search/Search.tsx:237
+#: src/view/screens/Search/Search.tsx:238
msgid "We're sorry, but your search could not be completed. Please try again in a few minutes."
msgstr ""
@@ -2384,6 +2434,10 @@ msgstr ""
msgid "What is the issue with this {collectionName}?"
msgstr ""
+#: src/view/com/auth/SplashScreen.tsx:34
+msgid "What's up?"
+msgstr ""
+
#: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:78
msgid "Which languages are used in this post?"
msgstr ""
@@ -2405,7 +2459,7 @@ msgstr ""
msgid "Wide"
msgstr ""
-#: src/view/com/composer/Composer.tsx:403
+#: src/view/com/composer/Composer.tsx:409
msgid "Write post"
msgstr ""
@@ -2444,16 +2498,16 @@ msgstr ""
msgid "You don't have any saved feeds."
msgstr ""
-#: src/view/com/post-thread/PostThread.tsx:385
+#: src/view/com/post-thread/PostThread.tsx:388
msgid "You have blocked the author or you have been blocked by the author."
msgstr ""
-#: src/view/com/feeds/ProfileFeedgens.tsx:154
+#: src/view/com/feeds/ProfileFeedgens.tsx:141
msgid "You have no feeds."
msgstr ""
#: src/view/com/lists/MyLists.tsx:89
-#: src/view/com/lists/ProfileLists.tsx:158
+#: src/view/com/lists/ProfileLists.tsx:145
msgid "You have no lists."
msgstr ""
diff --git a/src/locale/locales/hi/messages.po b/src/locale/locales/hi/messages.po
index cd7151d8d9..67eeb13b06 100644
--- a/src/locale/locales/hi/messages.po
+++ b/src/locale/locales/hi/messages.po
@@ -47,7 +47,7 @@ msgstr ""
msgid "{invitesAvailable} invite codes available"
msgstr ""
-#: src/view/screens/Search/Search.tsx:87
+#: src/view/screens/Search/Search.tsx:88
msgid "{message}"
msgstr ""
@@ -95,7 +95,7 @@ msgstr "अकाउंट के विकल्प"
#: src/view/com/modals/ListAddRemoveUsers.tsx:264
#: src/view/com/modals/UserAddRemoveLists.tsx:193
-#: src/view/screens/ProfileList.tsx:783
+#: src/view/screens/ProfileList.tsx:754
msgid "Add"
msgstr "ऐड करो"
@@ -103,7 +103,7 @@ msgstr "ऐड करो"
msgid "Add a content warning"
msgstr "सामग्री चेतावनी जोड़ें"
-#: src/view/screens/ProfileList.tsx:773
+#: src/view/screens/ProfileList.tsx:744
msgid "Add a user to this list"
msgstr "इस सूची में किसी को जोड़ें"
@@ -126,11 +126,11 @@ msgstr "विवरण जोड़ें"
msgid "Add details to report"
msgstr "रिपोर्ट करने के लिए विवरण जोड़ें"
-#: src/view/com/composer/Composer.tsx:432
+#: src/view/com/composer/Composer.tsx:438
msgid "Add link card"
msgstr "लिंक कार्ड जोड़ें"
-#: src/view/com/composer/Composer.tsx:435
+#: src/view/com/composer/Composer.tsx:441
msgid "Add link card:"
msgstr "लिंक कार्ड जोड़ें:"
@@ -142,7 +142,7 @@ msgstr "अपने डोमेन में निम्नलिखित DN
msgid "Add to Lists"
msgstr "सूचियों में जोड़ें"
-#: src/view/screens/ProfileFeed.tsx:280
+#: src/view/screens/ProfileFeed.tsx:270
msgid "Add to my feeds"
msgstr "इस फ़ीड को सहेजें"
@@ -224,11 +224,11 @@ msgstr "दिखावट"
msgid "Are you sure you want to delete the app password \"{name}\"?"
msgstr "क्या आप वाकई ऐप पासवर्ड \"{name}\" हटाना चाहते हैं?"
-#: src/view/com/composer/Composer.tsx:141
+#: src/view/com/composer/Composer.tsx:142
msgid "Are you sure you'd like to discard this draft?"
msgstr "क्या आप वाकई इस ड्राफ्ट को हटाना करना चाहेंगे?"
-#: src/view/screens/ProfileList.tsx:375
+#: src/view/screens/ProfileList.tsx:352
msgid "Are you sure?"
msgstr "क्या आप वास्तव में इसे करना चाहते हैं?"
@@ -250,9 +250,9 @@ msgstr "कलात्मक या गैर-कामुक नग्नत
#: src/view/com/auth/login/LoginForm.tsx:249
#: src/view/com/auth/login/SetNewPasswordForm.tsx:148
#: src/view/com/modals/report/InputIssueDetails.tsx:45
-#: src/view/com/post-thread/PostThread.tsx:392
-#: src/view/com/post-thread/PostThread.tsx:442
-#: src/view/com/post-thread/PostThread.tsx:450
+#: src/view/com/post-thread/PostThread.tsx:395
+#: src/view/com/post-thread/PostThread.tsx:445
+#: src/view/com/post-thread/PostThread.tsx:453
#: src/view/com/profile/ProfileHeader.tsx:672
msgid "Back"
msgstr "वापस"
@@ -275,15 +275,15 @@ msgstr "जन्मदिन:"
msgid "Block Account"
msgstr "खाता ब्लॉक करें"
-#: src/view/screens/ProfileList.tsx:545
+#: src/view/screens/ProfileList.tsx:522
msgid "Block accounts"
msgstr "खाता ब्लॉक करें"
-#: src/view/screens/ProfileList.tsx:495
+#: src/view/screens/ProfileList.tsx:472
msgid "Block list"
msgstr ""
-#: src/view/screens/ProfileList.tsx:330
+#: src/view/screens/ProfileList.tsx:307
msgid "Block these accounts?"
msgstr "खाता ब्लॉक करें?"
@@ -303,15 +303,19 @@ msgstr "अवरुद्ध खाते आपके थ्रेड्स
msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you. You will not see their content and they will be prevented from seeing yours."
msgstr "अवरुद्ध खाते आपके थ्रेड्स में उत्तर नहीं दे सकते, आपका उल्लेख नहीं कर सकते, या अन्यथा आपके साथ बातचीत नहीं कर सकते। आप उनकी सामग्री नहीं देख पाएंगे और उन्हें आपकी सामग्री देखने से रोका जाएगा।"
-#: src/view/com/post-thread/PostThread.tsx:248
+#: src/view/com/post-thread/PostThread.tsx:251
msgid "Blocked post."
msgstr "ब्लॉक पोस्ट।"
-#: src/view/screens/ProfileList.tsx:332
+#: src/view/screens/ProfileList.tsx:309
msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you."
msgstr "अवरोधन सार्वजनिक है. अवरुद्ध खाते आपके थ्रेड्स में उत्तर नहीं दे सकते, आपका उल्लेख नहीं कर सकते, या अन्यथा आपके साथ बातचीत नहीं कर सकते।"
-#: src/view/com/auth/SplashScreen.tsx:26
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:93
+msgid "Blog"
+msgstr ""
+
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:31
msgid "Bluesky"
msgstr "Bluesky"
@@ -343,6 +347,10 @@ msgstr "Bluesky.Social"
msgid "Build version {0} {1}"
msgstr "Build version {0} {1}"
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:87
+msgid "Business"
+msgstr ""
+
#: src/view/com/composer/photos/OpenCameraBtn.tsx:60
#: src/view/com/util/UserAvatar.tsx:221
#: src/view/com/util/UserBanner.tsx:38
@@ -353,8 +361,8 @@ msgstr "कैमरा"
msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long."
msgstr "केवल अक्षर, संख्या, रिक्त स्थान, डैश और अंडरस्कोर हो सकते हैं। कम से कम 4 अक्षर लंबा होना चाहिए, लेकिन 32 अक्षरों से अधिक लंबा नहीं होना चाहिए।।"
-#: src/view/com/composer/Composer.tsx:279
-#: src/view/com/composer/Composer.tsx:282
+#: src/view/com/composer/Composer.tsx:285
+#: src/view/com/composer/Composer.tsx:288
#: src/view/com/modals/AltImage.tsx:127
#: src/view/com/modals/ChangeEmail.tsx:218
#: src/view/com/modals/ChangeEmail.tsx:220
@@ -368,7 +376,7 @@ msgstr "केवल अक्षर, संख्या, रिक्त स्
#: src/view/com/modals/LinkWarning.tsx:85
#: src/view/com/modals/Repost.tsx:73
#: src/view/com/modals/Waitlist.tsx:136
-#: src/view/screens/Search/Search.tsx:558
+#: src/view/screens/Search/Search.tsx:592
#: src/view/shell/desktop/Search.tsx:182
msgid "Cancel"
msgstr "कैंसिल"
@@ -469,7 +477,7 @@ msgid "Clear all storage data (restart after this)"
msgstr ""
#: src/view/com/util/forms/SearchInput.tsx:73
-#: src/view/screens/Search/Search.tsx:543
+#: src/view/screens/Search/Search.tsx:577
msgid "Clear search query"
msgstr "खोज क्वेरी साफ़ करें"
@@ -547,7 +555,7 @@ msgstr "सामग्री फ़िल्टरिंग"
msgid "Content Languages"
msgstr "सामग्री भाषा"
-#: src/view/com/util/moderation/ScreenHider.tsx:69
+#: src/view/com/util/moderation/ScreenHider.tsx:78
msgid "Content Warning"
msgstr "सामग्री चेतावनी"
@@ -569,7 +577,7 @@ msgstr "कॉपी कर ली"
msgid "Copy"
msgstr "कॉपी"
-#: src/view/screens/ProfileList.tsx:407
+#: src/view/screens/ProfileList.tsx:384
msgid "Copy link to list"
msgstr ""
@@ -589,15 +597,16 @@ msgstr "पोस्ट टेक्स्ट कॉपी करें"
msgid "Copyright Policy"
msgstr "कॉपीराइट नीति"
-#: src/view/screens/ProfileFeed.tsx:103
+#: src/view/screens/ProfileFeed.tsx:94
msgid "Could not load feed"
msgstr "फ़ीड लोड नहीं कर सकता"
-#: src/view/screens/ProfileList.tsx:860
+#: src/view/screens/ProfileList.tsx:830
msgid "Could not load list"
msgstr "सूची लोड नहीं कर सकता"
-#: src/view/com/auth/SplashScreen.tsx:41
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:62
+#: src/view/com/auth/SplashScreen.tsx:46
msgid "Create a new account"
msgstr "नया खाता बनाएं"
@@ -605,7 +614,8 @@ msgstr "नया खाता बनाएं"
msgid "Create Account"
msgstr "खाता बनाएँ"
-#: src/view/com/auth/SplashScreen.tsx:38
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:54
+#: src/view/com/auth/SplashScreen.tsx:43
msgid "Create new account"
msgstr "नया खाता बनाएं"
@@ -639,8 +649,8 @@ msgstr "खाता हटाएं"
msgid "Delete app password"
msgstr "अप्प पासवर्ड हटाएं"
-#: src/view/screens/ProfileList.tsx:374
-#: src/view/screens/ProfileList.tsx:434
+#: src/view/screens/ProfileList.tsx:351
+#: src/view/screens/ProfileList.tsx:411
msgid "Delete List"
msgstr "सूची हटाएँ"
@@ -660,7 +670,7 @@ msgstr "पोस्ट को हटाएं"
msgid "Delete this post?"
msgstr "इस पोस्ट को डीलीट करें?"
-#: src/view/com/post-thread/PostThread.tsx:240
+#: src/view/com/post-thread/PostThread.tsx:243
msgid "Deleted post."
msgstr "यह पोस्ट मिटाई जा चुकी है"
@@ -679,11 +689,11 @@ msgstr "देव सर्वर"
msgid "Developer Tools"
msgstr "डेवलपर उपकरण"
-#: src/view/com/composer/Composer.tsx:142
+#: src/view/com/composer/Composer.tsx:143
msgid "Discard"
msgstr ""
-#: src/view/com/composer/Composer.tsx:136
+#: src/view/com/composer/Composer.tsx:137
msgid "Discard draft"
msgstr "ड्राफ्ट हटाएं"
@@ -735,7 +745,7 @@ msgstr "प्रत्येक कोड एक बार काम करत
msgid "Edit image"
msgstr "छवि संपादित करें"
-#: src/view/screens/ProfileList.tsx:422
+#: src/view/screens/ProfileList.tsx:399
msgid "Edit list details"
msgstr "सूची विवरण संपादित करें"
@@ -783,7 +793,7 @@ msgstr "ईमेल:"
msgid "Enable this setting to only see replies between people you follow."
msgstr "इस सेटिंग को केवल उन लोगों के बीच जवाब देखने में सक्षम करें जिन्हें आप फॉलो करते हैं।।"
-#: src/view/screens/Profile.tsx:471
+#: src/view/screens/Profile.tsx:425
msgid "End of feed"
msgstr ""
@@ -811,7 +821,7 @@ msgstr "नीचे अपना नया ईमेल पता दर्ज
msgid "Enter your username and password"
msgstr "अपने यूज़रनेम और पासवर्ड दर्ज करें"
-#: src/view/screens/Search/Search.tsx:105
+#: src/view/screens/Search/Search.tsx:106
msgid "Error:"
msgstr ""
@@ -832,7 +842,7 @@ msgstr "अनुशंसित फ़ीड लोड करने में
msgid "Feed offline"
msgstr "फ़ीड ऑफ़लाइन है"
-#: src/view/com/feeds/FeedPage.tsx:140
+#: src/view/com/feeds/FeedPage.tsx:143
msgid "Feed Preferences"
msgstr "फ़ीड प्राथमिकता"
@@ -843,8 +853,8 @@ msgstr "प्रतिक्रिया"
#: src/view/screens/Feeds.tsx:475
#: src/view/screens/Profile.tsx:164
-#: src/view/shell/bottom-bar/BottomBar.tsx:160
-#: src/view/shell/desktop/LeftNav.tsx:333
+#: src/view/shell/bottom-bar/BottomBar.tsx:181
+#: src/view/shell/desktop/LeftNav.tsx:339
#: src/view/shell/Drawer.tsx:455
#: src/view/shell/Drawer.tsx:456
msgid "Feeds"
@@ -858,6 +868,14 @@ msgstr "सामग्री को व्यवस्थित करने
msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information."
msgstr "फ़ीड कस्टम एल्गोरिदम हैं जिन्हें उपयोगकर्ता थोड़ी कोडिंग विशेषज्ञता के साथ बनाते हैं। <0/> अधिक जानकारी के लिए."
+#: src/view/screens/Search/Search.tsx:422
+msgid "Find users on Bluesky"
+msgstr ""
+
+#: src/view/screens/Search/Search.tsx:420
+msgid "Find users with the search tool on the right"
+msgstr ""
+
#: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:150
msgid "Finding similar accounts..."
msgstr "मिलते-जुलते खाते ढूँढना"
@@ -932,17 +950,17 @@ msgstr "गैलरी"
msgid "Get Started"
msgstr "प्रारंभ करें"
-#: src/view/com/auth/LoggedOut.tsx:68
-#: src/view/com/auth/LoggedOut.tsx:69
-#: src/view/com/util/moderation/ScreenHider.tsx:105
+#: src/view/com/auth/LoggedOut.tsx:70
+#: src/view/com/auth/LoggedOut.tsx:71
+#: src/view/com/util/moderation/ScreenHider.tsx:123
#: src/view/shell/desktop/LeftNav.tsx:103
msgid "Go back"
msgstr "वापस जाओ"
-#: src/view/screens/ProfileFeed.tsx:112
-#: src/view/screens/ProfileFeed.tsx:117
-#: src/view/screens/ProfileList.tsx:869
-#: src/view/screens/ProfileList.tsx:874
+#: src/view/screens/ProfileFeed.tsx:103
+#: src/view/screens/ProfileFeed.tsx:108
+#: src/view/screens/ProfileList.tsx:839
+#: src/view/screens/ProfileList.tsx:844
msgid "Go Back"
msgstr "वापस जाओ"
@@ -966,6 +984,7 @@ msgid "Here is your app password."
msgstr "यहां आपका ऐप पासवर्ड है."
#: src/view/com/notifications/FeedItem.tsx:316
+#: src/view/com/util/moderation/ContentHider.tsx:103
msgid "Hide"
msgstr "इसे छिपाएं"
@@ -1001,14 +1020,14 @@ msgstr ""
#~ msgid "Hmmm, we're having trouble finding this feed. It may have been deleted."
#~ msgstr ""
-#: src/view/shell/bottom-bar/BottomBar.tsx:116
-#: src/view/shell/desktop/LeftNav.tsx:297
+#: src/view/shell/bottom-bar/BottomBar.tsx:137
+#: src/view/shell/desktop/LeftNav.tsx:303
#: src/view/shell/Drawer.tsx:379
#: src/view/shell/Drawer.tsx:380
msgid "Home"
msgstr "होम फीड"
-#: src/view/com/pager/FeedsTabBarMobile.tsx:99
+#: src/view/com/pager/FeedsTabBarMobile.tsx:96
#: src/view/screens/PreferencesHomeFeed.tsx:95
#: src/view/screens/Settings.tsx:481
msgid "Home Feed Preferences"
@@ -1074,6 +1093,10 @@ msgstr ""
msgid "Invite codes: {invitesAvailable} available"
msgstr ""
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:99
+msgid "Jobs"
+msgstr ""
+
#: src/view/com/modals/Waitlist.tsx:67
msgid "Join the waitlist"
msgstr "प्रतीक्षा सूची में शामिल हों"
@@ -1099,9 +1122,13 @@ msgstr "भाषा सेटिंग्स"
msgid "Languages"
msgstr "भाषा"
+#: src/view/com/util/moderation/ContentHider.tsx:101
+msgid "Learn more"
+msgstr ""
+
#: src/view/com/util/moderation/PostAlerts.tsx:47
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:65
-#: src/view/com/util/moderation/ScreenHider.tsx:88
+#: src/view/com/util/moderation/ScreenHider.tsx:104
msgid "Learn More"
msgstr "अधिक जानें"
@@ -1109,7 +1136,7 @@ msgstr "अधिक जानें"
#: src/view/com/util/moderation/PostAlerts.tsx:40
#: src/view/com/util/moderation/PostHider.tsx:76
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:49
-#: src/view/com/util/moderation/ScreenHider.tsx:85
+#: src/view/com/util/moderation/ScreenHider.tsx:101
msgid "Learn more about this warning"
msgstr "इस चेतावनी के बारे में अधिक जानें"
@@ -1139,7 +1166,7 @@ msgstr "चित्र पुस्तकालय"
#~ msgid "Light"
#~ msgstr "लाइट मोड"
-#: src/view/screens/ProfileFeed.tsx:643
+#: src/view/screens/ProfileFeed.tsx:577
msgid "Like this feed"
msgstr "इस फ़ीड को लाइक करो"
@@ -1169,22 +1196,22 @@ msgid "List Name"
msgstr "सूची का नाम"
#: src/view/screens/Profile.tsx:165
-#: src/view/shell/desktop/LeftNav.tsx:373
+#: src/view/shell/desktop/LeftNav.tsx:376
#: src/view/shell/Drawer.tsx:471
#: src/view/shell/Drawer.tsx:472
msgid "Lists"
msgstr "सूची"
-#: src/view/com/post-thread/PostThread.tsx:257
-#: src/view/com/post-thread/PostThread.tsx:265
+#: src/view/com/post-thread/PostThread.tsx:260
+#: src/view/com/post-thread/PostThread.tsx:268
msgid "Load more posts"
msgstr "अधिक पोस्ट लोड करें"
-#: src/view/screens/Notifications.tsx:141
+#: src/view/screens/Notifications.tsx:144
msgid "Load new notifications"
msgstr "नई सूचनाएं लोड करें"
-#: src/view/com/feeds/FeedPage.tsx:185
+#: src/view/com/feeds/FeedPage.tsx:189
msgid "Load new posts"
msgstr "नई पोस्ट लोड करें"
@@ -1208,9 +1235,9 @@ msgstr ""
msgid "Login to account that is not listed"
msgstr "उस खाते में लॉग इन करें जो सूचीबद्ध नहीं है"
-#: src/view/screens/ProfileFeed.tsx:482
-msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!"
-msgstr ""
+#: src/view/screens/ProfileFeed.tsx:472
+#~ msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!"
+#~ msgstr ""
#: src/view/com/modals/LinkWarning.tsx:63
msgid "Make sure this is where you intend to go!"
@@ -1228,18 +1255,17 @@ msgstr ""
msgid "Mentioned users"
msgstr ""
-#: src/view/screens/Search/Search.tsx:503
+#: src/view/screens/Search/Search.tsx:537
msgid "Menu"
msgstr "मेनू"
#: src/view/com/posts/FeedErrorMessage.tsx:194
-#: src/view/screens/ProfileFeed.tsx:490
msgid "Message from server"
msgstr ""
#: src/view/screens/Moderation.tsx:64
#: src/view/screens/Settings.tsx:563
-#: src/view/shell/desktop/LeftNav.tsx:391
+#: src/view/shell/desktop/LeftNav.tsx:394
#: src/view/shell/Drawer.tsx:490
#: src/view/shell/Drawer.tsx:491
msgid "Moderation"
@@ -1258,8 +1284,8 @@ msgid "More feeds"
msgstr "अधिक फ़ीड"
#: src/view/com/profile/ProfileHeader.tsx:548
-#: src/view/screens/ProfileFeed.tsx:370
-#: src/view/screens/ProfileList.tsx:606
+#: src/view/screens/ProfileFeed.tsx:360
+#: src/view/screens/ProfileList.tsx:583
msgid "More options"
msgstr "अधिक विकल्प"
@@ -1271,15 +1297,15 @@ msgstr "अधिक विकल्प"
msgid "Mute Account"
msgstr "खाता म्यूट करें"
-#: src/view/screens/ProfileList.tsx:533
+#: src/view/screens/ProfileList.tsx:510
msgid "Mute accounts"
msgstr "खातों को म्यूट करें"
-#: src/view/screens/ProfileList.tsx:480
+#: src/view/screens/ProfileList.tsx:457
msgid "Mute list"
msgstr ""
-#: src/view/screens/ProfileList.tsx:293
+#: src/view/screens/ProfileList.tsx:270
msgid "Mute these accounts?"
msgstr "इन खातों को म्यूट करें?"
@@ -1299,7 +1325,7 @@ msgstr "म्यूट किए गए खाते"
msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private."
msgstr "म्यूट किए गए खातों की पोस्ट आपके फ़ीड और आपकी सूचनाओं से हटा दी जाती हैं। म्यूट पूरी तरह से निजी हैं."
-#: src/view/screens/ProfileList.tsx:295
+#: src/view/screens/ProfileList.tsx:272
msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them."
msgstr "म्यूट करना निजी है. म्यूट किए गए खाते आपके साथ इंटरैक्ट कर सकते हैं, लेकिन आप उनकी पोस्ट नहीं देखेंगे या उनसे सूचनाएं प्राप्त नहीं करेंगे।"
@@ -1337,12 +1363,12 @@ msgstr "अपने फ़ॉलोअर्स और डेटा तक प
msgid "New"
msgstr "नया"
-#: src/view/com/feeds/FeedPage.tsx:196
+#: src/view/com/feeds/FeedPage.tsx:200
#: src/view/screens/Feeds.tsx:510
-#: src/view/screens/Profile.tsx:389
-#: src/view/screens/ProfileFeed.tsx:451
-#: src/view/screens/ProfileList.tsx:212
-#: src/view/screens/ProfileList.tsx:244
+#: src/view/screens/Profile.tsx:353
+#: src/view/screens/ProfileFeed.tsx:430
+#: src/view/screens/ProfileList.tsx:193
+#: src/view/screens/ProfileList.tsx:221
#: src/view/shell/desktop/LeftNav.tsx:246
msgid "New post"
msgstr "नई पोस्ट"
@@ -1371,8 +1397,8 @@ msgstr "अगली फोटो"
msgid "No"
msgstr "नहीं"
-#: src/view/screens/ProfileFeed.tsx:636
-#: src/view/screens/ProfileList.tsx:740
+#: src/view/screens/ProfileFeed.tsx:570
+#: src/view/screens/ProfileList.tsx:711
msgid "No description"
msgstr "कोई विवरण नहीं"
@@ -1390,9 +1416,9 @@ msgstr "\"{query}\" के लिए कोई परिणाम नहीं
#~ msgstr "{0} के लिए कोई परिणाम नहीं मिला"
#: src/view/com/modals/ListAddRemoveUsers.tsx:127
-#: src/view/screens/Search/Search.tsx:270
-#: src/view/screens/Search/Search.tsx:298
-#: src/view/screens/Search/Search.tsx:581
+#: src/view/screens/Search/Search.tsx:271
+#: src/view/screens/Search/Search.tsx:299
+#: src/view/screens/Search/Search.tsx:615
#: src/view/shell/desktop/Search.tsx:210
msgid "No results found for {query}"
msgstr ""
@@ -1421,10 +1447,10 @@ msgstr ""
#~ msgid "Note: Third-party apps that display Bluesky content may not respect this setting."
#~ msgstr ""
-#: src/view/screens/Notifications.tsx:108
-#: src/view/screens/Notifications.tsx:132
-#: src/view/shell/bottom-bar/BottomBar.tsx:187
-#: src/view/shell/desktop/LeftNav.tsx:355
+#: src/view/screens/Notifications.tsx:109
+#: src/view/screens/Notifications.tsx:133
+#: src/view/shell/bottom-bar/BottomBar.tsx:205
+#: src/view/shell/desktop/LeftNav.tsx:358
#: src/view/shell/Drawer.tsx:416
#: src/view/shell/Drawer.tsx:417
msgid "Notifications"
@@ -1438,7 +1464,7 @@ msgstr "अरे नहीं!"
msgid "Okay"
msgstr "ठीक है"
-#: src/view/com/composer/Composer.tsx:348
+#: src/view/com/composer/Composer.tsx:354
msgid "One or more images is missing alt text."
msgstr "एक या अधिक छवियाँ alt पाठ याद आती हैं।।"
@@ -1446,7 +1472,7 @@ msgstr "एक या अधिक छवियाँ alt पाठ याद
msgid "Only {0} can reply."
msgstr ""
-#: src/view/com/pager/FeedsTabBarMobile.tsx:79
+#: src/view/com/pager/FeedsTabBarMobile.tsx:76
msgid "Open navigation"
msgstr "ओपन नेविगेशन"
@@ -1561,13 +1587,13 @@ msgstr "कृपया अपना पासवर्ड भी दर्ज
msgid "Please tell us why you think this decision was incorrect."
msgstr ""
-#: src/view/com/composer/Composer.tsx:331
-#: src/view/com/post-thread/PostThread.tsx:223
-#: src/view/screens/PostThread.tsx:78
+#: src/view/com/composer/Composer.tsx:337
+#: src/view/com/post-thread/PostThread.tsx:226
+#: src/view/screens/PostThread.tsx:80
msgid "Post"
msgstr "पोस्ट"
-#: src/view/com/post-thread/PostThread.tsx:382
+#: src/view/com/post-thread/PostThread.tsx:385
msgid "Post hidden"
msgstr "छुपा पोस्ट"
@@ -1579,7 +1605,7 @@ msgstr "पोस्ट भाषा"
msgid "Post Languages"
msgstr "पोस्ट भाषा"
-#: src/view/com/post-thread/PostThread.tsx:434
+#: src/view/com/post-thread/PostThread.tsx:437
msgid "Post not found"
msgstr "पोस्ट नहीं मिला"
@@ -1615,7 +1641,8 @@ msgstr "गोपनीयता नीति"
msgid "Processing..."
msgstr "प्रसंस्करण..."
-#: src/view/shell/bottom-bar/BottomBar.tsx:229
+#: src/view/shell/bottom-bar/BottomBar.tsx:247
+#: src/view/shell/desktop/LeftNav.tsx:412
#: src/view/shell/Drawer.tsx:69
#: src/view/shell/Drawer.tsx:525
#: src/view/shell/Drawer.tsx:526
@@ -1682,7 +1709,7 @@ msgstr "फ़ीड हटाएँ"
#: src/view/com/feeds/FeedSourceCard.tsx:105
#: src/view/com/feeds/FeedSourceCard.tsx:172
-#: src/view/screens/ProfileFeed.tsx:280
+#: src/view/screens/ProfileFeed.tsx:270
msgid "Remove from my feeds"
msgstr "मेरे फ़ीड से हटाएँ"
@@ -1727,11 +1754,11 @@ msgstr "रिपोर्ट {collectionName}"
msgid "Report Account"
msgstr "रिपोर्ट"
-#: src/view/screens/ProfileFeed.tsx:300
+#: src/view/screens/ProfileFeed.tsx:290
msgid "Report feed"
msgstr "रिपोर्ट फ़ीड"
-#: src/view/screens/ProfileList.tsx:448
+#: src/view/screens/ProfileList.tsx:425
msgid "Report List"
msgstr "रिपोर्ट सूची"
@@ -1843,10 +1870,10 @@ msgstr "सहेजे गए फ़ीड"
#: src/view/com/modals/ListAddRemoveUsers.tsx:75
#: src/view/com/util/forms/SearchInput.tsx:64
-#: src/view/screens/Search/Search.tsx:381
-#: src/view/screens/Search/Search.tsx:533
-#: src/view/shell/bottom-bar/BottomBar.tsx:138
-#: src/view/shell/desktop/LeftNav.tsx:315
+#: src/view/screens/Search/Search.tsx:401
+#: src/view/screens/Search/Search.tsx:567
+#: src/view/shell/bottom-bar/BottomBar.tsx:159
+#: src/view/shell/desktop/LeftNav.tsx:321
#: src/view/shell/desktop/Search.tsx:161
#: src/view/shell/desktop/Search.tsx:170
#: src/view/shell/Drawer.tsx:343
@@ -1855,14 +1882,14 @@ msgid "Search"
msgstr "खोज"
#: src/view/screens/Search/Search.tsx:390
-msgid "Search for posts and users."
-msgstr ""
+#~ msgid "Search for posts and users."
+#~ msgstr ""
#: src/view/com/modals/ChangeEmail.tsx:110
msgid "Security Step Required"
msgstr "सुरक्षा चरण आवश्यक"
-#: src/view/com/auth/SplashScreen.tsx:29
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:39
msgid "See what's next"
msgstr "आगे क्या है"
@@ -1936,7 +1963,7 @@ msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your f
msgstr "इस सेटिंग को अपने निम्नलिखित फ़ीड में अपने सहेजे गए फ़ीड के नमूने दिखाने के लिए \"हाँ\" पर सेट करें। यह एक प्रयोगात्मक विशेषता है।।"
#: src/view/screens/Settings.tsx:277
-#: src/view/shell/desktop/LeftNav.tsx:427
+#: src/view/shell/desktop/LeftNav.tsx:430
#: src/view/shell/Drawer.tsx:546
#: src/view/shell/Drawer.tsx:547
msgid "Settings"
@@ -1948,11 +1975,11 @@ msgstr "यौन गतिविधि या कामुक नग्नत
#: src/view/com/profile/ProfileHeader.tsx:338
#: src/view/com/util/forms/PostDropdownBtn.tsx:129
-#: src/view/screens/ProfileList.tsx:407
+#: src/view/screens/ProfileList.tsx:384
msgid "Share"
msgstr "शेयर"
-#: src/view/screens/ProfileFeed.tsx:312
+#: src/view/screens/ProfileFeed.tsx:302
msgid "Share feed"
msgstr ""
@@ -1960,11 +1987,12 @@ msgstr ""
#~ msgid "Share link"
#~ msgstr "लिंक शेयर करें"
+#: src/view/com/util/moderation/ContentHider.tsx:105
#: src/view/screens/Settings.tsx:316
msgid "Show"
msgstr "दिखाओ"
-#: src/view/com/util/moderation/ScreenHider.tsx:114
+#: src/view/com/util/moderation/ScreenHider.tsx:132
msgid "Show anyway"
msgstr "दिखाओ"
@@ -1992,15 +2020,23 @@ msgstr "रीपोस्ट दिखाएँ"
msgid "Show users"
msgstr "लोग दिखाएँ"
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:70
#: src/view/com/auth/login/Login.tsx:98
-#: src/view/com/auth/SplashScreen.tsx:49
-#: src/view/shell/NavSignupCard.tsx:52
-#: src/view/shell/NavSignupCard.tsx:53
+#: src/view/com/auth/SplashScreen.tsx:54
+#: src/view/shell/bottom-bar/BottomBar.tsx:285
+#: src/view/shell/bottom-bar/BottomBar.tsx:286
+#: src/view/shell/bottom-bar/BottomBar.tsx:288
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:177
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:178
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:180
+#: src/view/shell/NavSignupCard.tsx:58
+#: src/view/shell/NavSignupCard.tsx:59
msgid "Sign in"
msgstr "साइन इन करें"
-#: src/view/com/auth/SplashScreen.tsx:52
-#: src/view/com/auth/SplashScreen.web.tsx:84
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:78
+#: src/view/com/auth/SplashScreen.tsx:57
+#: src/view/com/auth/SplashScreen.web.tsx:87
msgid "Sign In"
msgstr "साइन इन करें"
@@ -2022,16 +2058,26 @@ msgstr "साइन इन करें"
msgid "Sign out"
msgstr "साइन आउट"
-#: src/view/shell/NavSignupCard.tsx:43
-#: src/view/shell/NavSignupCard.tsx:44
-#: src/view/shell/NavSignupCard.tsx:46
+#: src/view/shell/bottom-bar/BottomBar.tsx:275
+#: src/view/shell/bottom-bar/BottomBar.tsx:276
+#: src/view/shell/bottom-bar/BottomBar.tsx:278
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:167
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:168
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:170
+#: src/view/shell/NavSignupCard.tsx:49
+#: src/view/shell/NavSignupCard.tsx:50
+#: src/view/shell/NavSignupCard.tsx:52
msgid "Sign up"
msgstr ""
-#: src/view/shell/NavSignupCard.tsx:36
+#: src/view/shell/NavSignupCard.tsx:42
msgid "Sign up or sign in to join the conversation"
msgstr ""
+#: src/view/com/util/moderation/ScreenHider.tsx:76
+msgid "Sign-in Required"
+msgstr ""
+
#: src/view/screens/Settings.tsx:327
msgid "Signed in as"
msgstr "आपने इस रूप में साइन इन करा है:"
@@ -2069,15 +2115,15 @@ msgstr "Storybook"
msgid "Submit"
msgstr ""
-#: src/view/screens/ProfileList.tsx:597
+#: src/view/screens/ProfileList.tsx:574
msgid "Subscribe"
msgstr "सब्सक्राइब"
-#: src/view/screens/ProfileList.tsx:593
+#: src/view/screens/ProfileList.tsx:570
msgid "Subscribe to this list"
msgstr "इस सूची को सब्सक्राइब करें"
-#: src/view/screens/Search/Search.tsx:354
+#: src/view/screens/Search/Search.tsx:357
msgid "Suggested Follows"
msgstr "अनुशंसित लोग"
@@ -2127,7 +2173,7 @@ msgstr "सामुदायिक दिशानिर्देशों क
msgid "The Copyright Policy has been moved to <0/>"
msgstr "कॉपीराइट नीति को <0/> पर स्थानांतरित कर दिया गया है"
-#: src/view/com/post-thread/PostThread.tsx:437
+#: src/view/com/post-thread/PostThread.tsx:440
msgid "The post may have been deleted."
msgstr "हो सकता है कि यह पोस्ट हटा दी गई हो।"
@@ -2151,10 +2197,14 @@ msgstr "एप्लिकेशन में एक अप्रत्याश
msgid "This {0} has been labeled."
msgstr ""
-#: src/view/com/util/moderation/ScreenHider.tsx:72
+#: src/view/com/util/moderation/ScreenHider.tsx:88
msgid "This {screenDescription} has been flagged:"
msgstr "यह {screenDescription} फ्लैग किया गया है:"
+#: src/view/com/util/moderation/ScreenHider.tsx:83
+msgid "This account has requested that users sign in to view their profile."
+msgstr ""
+
#: src/view/com/posts/FeedErrorMessage.tsx:107
msgid "This content is not viewable without a Bluesky account."
msgstr ""
@@ -2214,11 +2264,11 @@ msgstr "अनुवाद"
msgid "Try again"
msgstr "फिर से कोशिश करो"
-#: src/view/screens/ProfileList.tsx:495
+#: src/view/screens/ProfileList.tsx:472
msgid "Un-block list"
msgstr ""
-#: src/view/screens/ProfileList.tsx:480
+#: src/view/screens/ProfileList.tsx:457
msgid "Un-mute list"
msgstr ""
@@ -2254,7 +2304,7 @@ msgstr "अनम्यूट खाता"
msgid "Unmute thread"
msgstr "थ्रेड को अनम्यूट करें"
-#: src/view/screens/ProfileList.tsx:463
+#: src/view/screens/ProfileList.tsx:440
msgid "Unpin moderation list"
msgstr ""
@@ -2303,7 +2353,7 @@ msgstr "लोग सूचियाँ"
msgid "Username or email address"
msgstr "यूजर नाम या ईमेल पता"
-#: src/view/screens/ProfileList.tsx:767
+#: src/view/screens/ProfileList.tsx:738
msgid "Users"
msgstr "यूजर लोग"
@@ -2360,7 +2410,7 @@ msgstr "हम आपके हमारी सेवा में शामि
#~ msgid "We're sorry, but this feed is currently receiving high traffic and is temporarily unavailable. Please try again later."
#~ msgstr ""
-#: src/view/screens/Search/Search.tsx:237
+#: src/view/screens/Search/Search.tsx:238
msgid "We're sorry, but your search could not be completed. Please try again in a few minutes."
msgstr ""
@@ -2376,6 +2426,10 @@ msgstr "<0>Bluesky0> में आपका स्वागत है"
msgid "What is the issue with this {collectionName}?"
msgstr "इस {collectionName} के साथ क्या मुद्दा है?"
+#: src/view/com/auth/SplashScreen.tsx:34
+msgid "What's up?"
+msgstr ""
+
#: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:78
msgid "Which languages are used in this post?"
msgstr "इस पोस्ट में किस भाषा का उपयोग किया जाता है?"
@@ -2397,7 +2451,7 @@ msgstr ""
msgid "Wide"
msgstr "चौड़ा"
-#: src/view/com/composer/Composer.tsx:403
+#: src/view/com/composer/Composer.tsx:409
msgid "Write post"
msgstr "पोस्ट लिखो"
@@ -2436,16 +2490,16 @@ msgstr ""
msgid "You don't have any saved feeds."
msgstr "आपके पास कोई सहेजी गई फ़ीड नहीं है."
-#: src/view/com/post-thread/PostThread.tsx:385
+#: src/view/com/post-thread/PostThread.tsx:388
msgid "You have blocked the author or you have been blocked by the author."
msgstr "आपने लेखक को अवरुद्ध किया है या आपने लेखक द्वारा अवरुद्ध किया है।।"
-#: src/view/com/feeds/ProfileFeedgens.tsx:154
+#: src/view/com/feeds/ProfileFeedgens.tsx:141
msgid "You have no feeds."
msgstr ""
#: src/view/com/lists/MyLists.tsx:89
-#: src/view/com/lists/ProfileLists.tsx:158
+#: src/view/com/lists/ProfileLists.tsx:145
msgid "You have no lists."
msgstr "आपके पास कोई सूची नहीं है।।"
diff --git a/src/locale/locales/ja/messages.po b/src/locale/locales/ja/messages.po
index b6877181c0..7858a85cec 100644
--- a/src/locale/locales/ja/messages.po
+++ b/src/locale/locales/ja/messages.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
-"POT-Creation-Date: 2023-11-22 17:10-0800\n"
-"MIME-Version: 1.0\n"
+"POT-Creation-Date: 2023-12-18 14:40+0900\n"
+"MIME-Version: 2.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
@@ -9,13 +9,13 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: \n"
-"Last-Translator: \n"
-"Language-Team: \n"
+"Last-Translator: Hima-Zinn\n"
+"Language-Team: Hima-Zinn, tkusano, dolciss, oboenikui, noritada\n"
"Plural-Forms: \n"
#: src/view/shell/desktop/RightNav.tsx:160
msgid "{0, plural, one {# invite code available} other {# invite codes available}}"
-msgstr ""
+msgstr "{0, plural, other {# 個の招待コードが利用可能}}"
#: src/view/com/modals/Repost.tsx:44
msgid "{0}"
@@ -27,37 +27,37 @@ msgstr "{0} {purposeLabel} リスト"
#: src/view/shell/desktop/RightNav.tsx:143
msgid "{invitesAvailable, plural, one {Invite codes: # available} other {Invite codes: # available}}"
-msgstr ""
+msgstr "{invitesAvailable, plural, other {招待コード: # 個利用可能}}"
#: src/view/screens/Settings.tsx:407
#: src/view/shell/Drawer.tsx:640
msgid "{invitesAvailable} invite code available"
-msgstr ""
+msgstr "{invitesAvailable}個の招待コードが利用可能"
#: src/view/screens/Settings.tsx:409
#: src/view/shell/Drawer.tsx:642
msgid "{invitesAvailable} invite codes available"
-msgstr ""
+msgstr "{invitesAvailable}個の招待コードが利用可能"
-#: src/view/screens/Search/Search.tsx:87
+#: src/view/screens/Search/Search.tsx:88
msgid "{message}"
msgstr "{message}"
#: src/view/com/threadgate/WhoCanReply.tsx:158
msgid "<0/> members"
-msgstr ""
+msgstr "<0/>のメンバー"
#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:30
msgid "<0>Choose your0><1>Recommended1><2>Feeds2>"
-msgstr "<1>推奨1><2>フィード2><0>を選択0>"
+msgstr "<1>おすすめの1><2>フィード2><0>を選択0>"
#: src/view/com/auth/onboarding/RecommendedFollows.tsx:37
msgid "<0>Follow some0><1>Recommended1><2>Users2>"
-msgstr "<1>推奨1><2>ユーザー2><0>をフォロー0>"
+msgstr "<1>おすすめの1><2>ユーザー2><0>をフォロー0>"
#: src/lib/hooks/useOTAUpdate.ts:16
msgid "A new version of the app is available. Please update to continue using the app."
-msgstr "新しいバージョンのアプリが利用可能です。アプリを継続して使用するにはアップデートしてください。"
+msgstr "新しいバージョンのアプリが利用可能です。継続して使用するためにはアップデートしてください。"
#: src/view/com/modals/EditImage.tsx:299
#: src/view/screens/Settings.tsx:417
@@ -75,15 +75,15 @@ msgstr "アカウントオプション"
#: src/view/com/modals/ListAddRemoveUsers.tsx:264
#: src/view/com/modals/UserAddRemoveLists.tsx:193
-#: src/view/screens/ProfileList.tsx:783
+#: src/view/screens/ProfileList.tsx:754
msgid "Add"
msgstr "追加"
#: src/view/com/modals/SelfLabel.tsx:56
msgid "Add a content warning"
-msgstr "コンテンツ警告を追加"
+msgstr "コンテンツの警告を追加"
-#: src/view/screens/ProfileList.tsx:773
+#: src/view/screens/ProfileList.tsx:744
msgid "Add a user to this list"
msgstr "リストにユーザーを追加"
@@ -106,13 +106,13 @@ msgstr "詳細を追加"
msgid "Add details to report"
msgstr "レポートに詳細を追加"
-#: src/view/com/composer/Composer.tsx:432
+#: src/view/com/composer/Composer.tsx:438
msgid "Add link card"
msgstr "リンクカードを追加"
-#: src/view/com/composer/Composer.tsx:435
+#: src/view/com/composer/Composer.tsx:441
msgid "Add link card:"
-msgstr "リンクカードの追加:"
+msgstr "リンクカードを追加:"
#: src/view/com/modals/ChangeHandle.tsx:415
msgid "Add the following DNS record to your domain:"
@@ -122,7 +122,7 @@ msgstr "次のDNSレコードをドメインに追加してください:"
msgid "Add to Lists"
msgstr "リストに追加"
-#: src/view/screens/ProfileFeed.tsx:280
+#: src/view/screens/ProfileFeed.tsx:270
msgid "Add to my feeds"
msgstr "マイフィードに追加"
@@ -141,7 +141,7 @@ msgstr "成人向けコンテンツ"
#: src/view/screens/Settings.tsx:569
msgid "Advanced"
-msgstr "アドバンス"
+msgstr "高度な設定"
#: src/view/com/composer/photos/Gallery.tsx:130
msgid "ALT"
@@ -153,15 +153,15 @@ msgstr "ALTテキスト"
#: src/view/com/composer/photos/Gallery.tsx:209
msgid "Alt text describes images for blind and low-vision users, and helps give context to everyone."
-msgstr "ALTテキストは、視覚障害者や低視力者のために画像を説明し、すべての人に文脈を与えるのに役立ちます。"
+msgstr "ALTテキストは、すべての人が文脈を理解できるようにするために、視覚障害者や低視力者向けに提供する画像の説明文です。"
#: src/view/com/modals/VerifyEmail.tsx:118
msgid "An email has been sent to {0}. It includes a confirmation code which you can enter below."
-msgstr "Eメールが{0}に送信されました。以下に入力できる確認コードが含まれています。"
+msgstr "メールが{0}に送信されました。以下に入力できる確認コードがそのメールに記載されています。"
#: src/view/com/modals/ChangeEmail.tsx:119
msgid "An email has been sent to your previous address, {0}. It includes a confirmation code which you can enter below."
-msgstr "以前のアドレス{0}にEメールが送信されました。以下に入力できる確認コードが含まれています。"
+msgstr "以前のメールアドレス{0}にメールが送信されました。以下に入力できる確認コードがそのメールに記載されています。"
#: src/view/com/notifications/FeedItem.tsx:236
#: src/view/com/threadgate/WhoCanReply.tsx:178
@@ -170,7 +170,7 @@ msgstr "および"
#: src/view/screens/LanguageSettings.tsx:95
msgid "App Language"
-msgstr "アプリケーション言語"
+msgstr "アプリの言語"
#: src/view/screens/Settings.tsx:589
msgid "App passwords"
@@ -182,15 +182,15 @@ msgstr "アプリパスワード"
#: src/view/com/modals/AppealLabel.tsx:65
msgid "Appeal Decision"
-msgstr ""
+msgstr "判断に異議"
#: src/view/com/util/moderation/LabelInfo.tsx:51
msgid "Appeal this decision"
-msgstr ""
+msgstr "この判断に異議を申し立てる"
#: src/view/com/util/moderation/LabelInfo.tsx:55
msgid "Appeal this decision."
-msgstr ""
+msgstr "この判断に異議を申し立てる"
#: src/view/screens/Settings.tsx:432
msgid "Appearance"
@@ -200,21 +200,21 @@ msgstr "外観"
msgid "Are you sure you want to delete the app password \"{name}\"?"
msgstr "本当にアプリパスワード「{name}」を削除しますか?"
-#: src/view/com/composer/Composer.tsx:141
+#: src/view/com/composer/Composer.tsx:142
msgid "Are you sure you'd like to discard this draft?"
msgstr "本当にこの下書きを破棄しますか?"
-#: src/view/screens/ProfileList.tsx:375
+#: src/view/screens/ProfileList.tsx:352
msgid "Are you sure?"
-msgstr "本当ですか?"
+msgstr "本当によろしいですか?"
#: src/view/com/util/forms/PostDropdownBtn.tsx:188
msgid "Are you sure? This cannot be undone."
-msgstr "本当ですか?これは元に戻せません。"
+msgstr "本当によろしいですか?これは元に戻せません。"
#: src/view/com/modals/SelfLabel.tsx:123
msgid "Artistic or non-erotic nudity."
-msgstr "芸術的または非エロティックなヌード。"
+msgstr "芸術的または性的ではないヌード。"
#: src/view/com/auth/create/CreateAccount.tsx:145
#: src/view/com/auth/login/ChooseAccountForm.tsx:151
@@ -222,9 +222,9 @@ msgstr "芸術的または非エロティックなヌード。"
#: src/view/com/auth/login/LoginForm.tsx:249
#: src/view/com/auth/login/SetNewPasswordForm.tsx:148
#: src/view/com/modals/report/InputIssueDetails.tsx:45
-#: src/view/com/post-thread/PostThread.tsx:392
-#: src/view/com/post-thread/PostThread.tsx:442
-#: src/view/com/post-thread/PostThread.tsx:450
+#: src/view/com/post-thread/PostThread.tsx:395
+#: src/view/com/post-thread/PostThread.tsx:445
+#: src/view/com/post-thread/PostThread.tsx:453
#: src/view/com/profile/ProfileHeader.tsx:672
msgid "Back"
msgstr "戻る"
@@ -245,45 +245,49 @@ msgstr "誕生日:"
#: src/view/com/profile/ProfileHeader.tsx:282
#: src/view/com/profile/ProfileHeader.tsx:389
msgid "Block Account"
-msgstr "アカウントのブロック"
+msgstr "アカウントをブロック"
-#: src/view/screens/ProfileList.tsx:545
+#: src/view/screens/ProfileList.tsx:522
msgid "Block accounts"
-msgstr "アカウントのブロック"
+msgstr "アカウントをブロック"
-#: src/view/screens/ProfileList.tsx:495
+#: src/view/screens/ProfileList.tsx:472
msgid "Block list"
-msgstr ""
+msgstr "リストをブロック"
-#: src/view/screens/ProfileList.tsx:330
+#: src/view/screens/ProfileList.tsx:307
msgid "Block these accounts?"
msgstr "これらのアカウントをブロックしますか?"
#: src/view/screens/Moderation.tsx:123
msgid "Blocked accounts"
-msgstr "ブロックされたブロック"
+msgstr "ブロック中のアカウント"
#: src/view/screens/ModerationBlockedAccounts.tsx:106
msgid "Blocked Accounts"
-msgstr "ブロックされたアカウント"
+msgstr "ブロック中のアカウント"
#: src/view/com/profile/ProfileHeader.tsx:284
msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you."
-msgstr "ブロックされたアカウントは、スレッド内で返信したり、ユーザーに言及したり、その他の方法でユーザーとやり取りすることはできません。"
+msgstr "ブロック中のアカウントは、あなたのスレッドでの返信、あなたへのメンション、その他の方法であなたとやり取りすることはできません。"
#: src/view/screens/ModerationBlockedAccounts.tsx:114
msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you. You will not see their content and they will be prevented from seeing yours."
-msgstr "ブロックされたアカウントは、スレッド内で返信したり、ユーザーに言及したり、その他の方法でユーザーとやり取りすることはできません。あなたは相手のコンテンツを見ることができず、相手はあなたのコンテンツを見ることができなくなります。"
+msgstr "ブロック中のアカウントは、あなたのスレッドでの返信、あなたへのメンション、その他の方法であなたとやり取りすることはできません。あなたは相手のコンテンツを見ることができず、相手はあなたのコンテンツを見ることができなくなります。"
-#: src/view/com/post-thread/PostThread.tsx:248
+#: src/view/com/post-thread/PostThread.tsx:251
msgid "Blocked post."
msgstr "投稿をブロックしました。"
-#: src/view/screens/ProfileList.tsx:332
+#: src/view/screens/ProfileList.tsx:309
msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you."
-msgstr "ブロックは公開されます。ブロックされたアカウントは、スレッド内で返信したり、ユーザーに言及したり、その他の方法でユーザーとやり取りすることはできません。"
+msgstr "ブロックしたことは公開されます。ブロック中のアカウントは、あなたのスレッドでの返信、あなたへのメンション、その他の方法であなたとやり取りすることはできません。"
-#: src/view/com/auth/SplashScreen.tsx:26
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:93
+msgid "Blog"
+msgstr "ブログ"
+
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:31
msgid "Bluesky"
msgstr "Bluesky"
@@ -293,19 +297,19 @@ msgstr "Blueskyは柔軟です。"
#: src/view/com/auth/onboarding/WelcomeMobile.tsx:69
msgid "Bluesky is open."
-msgstr "Blueskyは開いています。"
+msgstr "Blueskyは開かれています。"
#: src/view/com/auth/onboarding/WelcomeMobile.tsx:56
msgid "Bluesky is public."
-msgstr "Blueskyはオープンです。"
+msgstr "Blueskyはパブリックです。"
#: src/view/com/modals/Waitlist.tsx:70
msgid "Bluesky uses invites to build a healthier community. If you don't know anybody with an invite, you can sign up for the waitlist and we'll send one soon."
-msgstr "Blueskyはより健全なコミュニティを構築するために招待状を使用します。招待状をお持ちでない方の場合、waitlistに申し込めば招待状をお送りします。"
+msgstr "Blueskyはより健全なコミュニティを構築するために招待状を使用します。招待状をお持ちでない場合、Waitlistにお申し込みいただくと招待状をお送りします。"
#: src/view/screens/Moderation.tsx:225
msgid "Bluesky will not show your profile and posts to logged-out users. Other apps may not honor this request. This does not make your account private."
-msgstr ""
+msgstr "Blueskyはログアウトしたユーザーにあなたのプロフィールや投稿を表示しません。他のアプリはこのリクエストに応じない場合があります。この設定はあなたのアカウントを非公開にするものではありません。"
#: src/view/com/modals/ServerInput.tsx:78
msgid "Bluesky.Social"
@@ -315,6 +319,10 @@ msgstr "Bluesky.Social"
msgid "Build version {0} {1}"
msgstr "ビルドバージョン {0} {1}"
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:87
+msgid "Business"
+msgstr "ビジネス"
+
#: src/view/com/composer/photos/OpenCameraBtn.tsx:60
#: src/view/com/util/UserAvatar.tsx:221
#: src/view/com/util/UserBanner.tsx:38
@@ -323,10 +331,10 @@ msgstr "カメラ"
#: src/view/com/modals/AddAppPasswords.tsx:214
msgid "Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long."
-msgstr "文字、数字、スペース、ハイフン、およびアンダースコアのみを含めることができます。長さは4文字以上32文字以下である必要があります。"
+msgstr "文字、数字、スペース、ハイフン、およびアンダースコアのみが使用可能です。長さは4文字以上32文字以下である必要があります。"
-#: src/view/com/composer/Composer.tsx:279
-#: src/view/com/composer/Composer.tsx:282
+#: src/view/com/composer/Composer.tsx:285
+#: src/view/com/composer/Composer.tsx:288
#: src/view/com/modals/AltImage.tsx:127
#: src/view/com/modals/ChangeEmail.tsx:218
#: src/view/com/modals/ChangeEmail.tsx:220
@@ -340,7 +348,7 @@ msgstr "文字、数字、スペース、ハイフン、およびアンダース
#: src/view/com/modals/LinkWarning.tsx:85
#: src/view/com/modals/Repost.tsx:73
#: src/view/com/modals/Waitlist.tsx:136
-#: src/view/screens/Search/Search.tsx:558
+#: src/view/screens/Search/Search.tsx:592
#: src/view/shell/desktop/Search.tsx:182
msgid "Cancel"
msgstr "キャンセル"
@@ -368,7 +376,7 @@ msgstr "プロフィールの編集をキャンセル"
#: src/view/com/modals/Repost.tsx:64
msgid "Cancel quote post"
-msgstr "引用投稿をキャンセル"
+msgstr "引用をキャンセル"
#: src/view/com/modals/ListAddRemoveUsers.tsx:87
#: src/view/shell/desktop/Search.tsx:178
@@ -394,23 +402,23 @@ msgstr "ハンドルを変更"
#: src/view/com/modals/VerifyEmail.tsx:141
msgid "Change my email"
-msgstr "Eメールの変更"
+msgstr "メールアドレスを変更"
#: src/view/com/modals/ChangeEmail.tsx:109
msgid "Change Your Email"
-msgstr "Eメールを変更"
+msgstr "メールアドレスを変更"
#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:121
msgid "Check out some recommended feeds. Tap + to add them to your list of pinned feeds."
-msgstr "推奨フィードを確認してください。「+」をタップすればフィードに追加されます。"
+msgstr "おすすめのフィードを確認してください。「+」をタップするとピン留めしたフィードのリストに追加されます。"
#: src/view/com/auth/onboarding/RecommendedFollows.tsx:185
msgid "Check out some recommended users. Follow them to see similar users."
-msgstr "推奨ユーザーを確認してください。フォローする事であなたに合ったユーザーが見つかるかもしれません。"
+msgstr "おすすめのユーザーを確認してください。フォローすることであなたに合ったユーザーが見つかるかもしれません。"
#: src/view/com/modals/DeleteAccount.tsx:163
msgid "Check your inbox for an email with the confirmation code to enter below:"
-msgstr "Eメールの受信トレイを確認して、以下に入力するコードが記載されたメールが届いていないか確認してください:"
+msgstr "入力したメールアドレスの受信トレイを確認して、以下に入力するための確認コードが記載されたメールが届いていないか確認してください:"
#: src/view/com/modals/ServerInput.tsx:38
msgid "Choose Service"
@@ -418,7 +426,7 @@ msgstr "サービスを選択"
#: src/view/com/auth/onboarding/WelcomeMobile.tsx:83
msgid "Choose the algorithms that power your experience with custom feeds."
-msgstr "カスタムフィードを使用して経験を強化するアルゴリズムを選択します。"
+msgstr "カスタムフィードを使用してあなたの体験を強化するアルゴリズムを選択します。"
#: src/view/com/auth/create/Step2.tsx:106
msgid "Choose your password"
@@ -430,7 +438,7 @@ msgstr "レガシーストレージデータをすべてクリア"
#: src/view/screens/Settings.tsx:696
msgid "Clear all legacy storage data (restart after this)"
-msgstr "すべてのレガシーストレージデータをクリア(この後再起動)"
+msgstr "すべてのレガシーストレージデータをクリア(この後再起動します)"
#: src/view/screens/Settings.tsx:706
msgid "Clear all storage data"
@@ -438,10 +446,10 @@ msgstr "すべてのストレージデータをクリア"
#: src/view/screens/Settings.tsx:708
msgid "Clear all storage data (restart after this)"
-msgstr "すべてのストレージデータをクリア(この後再起動)"
+msgstr "すべてのストレージデータをクリア(この後再起動します)"
#: src/view/com/util/forms/SearchInput.tsx:73
-#: src/view/screens/Search/Search.tsx:543
+#: src/view/screens/Search/Search.tsx:577
msgid "Clear search query"
msgstr "検索クエリをクリア"
@@ -489,7 +497,7 @@ msgstr "変更を確認"
#: src/view/com/modals/lang-settings/ConfirmLanguagesButton.tsx:34
msgid "Confirm content language settings"
-msgstr "コンテンツ言語の設定を確認"
+msgstr "コンテンツの言語設定を確認"
#: src/view/com/modals/DeleteAccount.tsx:209
msgid "Confirm delete account"
@@ -508,24 +516,24 @@ msgstr "接続中..."
#: src/view/screens/Moderation.tsx:81
msgid "Content filtering"
-msgstr "コンテンツフィルタリング"
+msgstr "コンテンツのフィルタリング"
#: src/view/com/modals/ContentFilteringSettings.tsx:44
msgid "Content Filtering"
-msgstr "コンテンツフィルタリング"
+msgstr "コンテンツのフィルタリング"
#: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:74
#: src/view/screens/LanguageSettings.tsx:278
msgid "Content Languages"
-msgstr "コンテンツ言語"
+msgstr "コンテンツの言語"
-#: src/view/com/util/moderation/ScreenHider.tsx:69
+#: src/view/com/util/moderation/ScreenHider.tsx:78
msgid "Content Warning"
-msgstr "コンテンツ警告"
+msgstr "コンテンツの警告"
#: src/view/com/composer/labels/LabelsBtn.tsx:31
msgid "Content warnings"
-msgstr "コンテンツ警告"
+msgstr "コンテンツの警告"
#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:148
#: src/view/com/auth/onboarding/RecommendedFollows.tsx:209
@@ -535,41 +543,42 @@ msgstr "続行"
#: src/view/com/modals/AddAppPasswords.tsx:193
#: src/view/com/modals/InviteCodes.tsx:179
msgid "Copied"
-msgstr "コピー済み"
+msgstr "コピーしました"
#: src/view/com/modals/AddAppPasswords.tsx:186
msgid "Copy"
msgstr "コピー"
-#: src/view/screens/ProfileList.tsx:407
+#: src/view/screens/ProfileList.tsx:384
msgid "Copy link to list"
-msgstr ""
+msgstr "リストへのリンクをコピー"
#: src/view/com/util/forms/PostDropdownBtn.tsx:129
msgid "Copy link to post"
-msgstr ""
+msgstr "投稿へのリンクをコピー"
#: src/view/com/profile/ProfileHeader.tsx:338
msgid "Copy link to profile"
-msgstr ""
+msgstr "プロフィールへのリンクをコピー"
#: src/view/com/util/forms/PostDropdownBtn.tsx:115
msgid "Copy post text"
-msgstr "投稿テキストをコピー"
+msgstr "投稿のテキストをコピー"
#: src/view/screens/CopyrightPolicy.tsx:29
msgid "Copyright Policy"
msgstr "著作権ポリシー"
-#: src/view/screens/ProfileFeed.tsx:103
+#: src/view/screens/ProfileFeed.tsx:94
msgid "Could not load feed"
-msgstr "フィードのロードに失敗"
+msgstr "フィードのロードに失敗しました"
-#: src/view/screens/ProfileList.tsx:860
+#: src/view/screens/ProfileList.tsx:830
msgid "Could not load list"
-msgstr "リストのロードに失敗"
+msgstr "リストのロードに失敗しました"
-#: src/view/com/auth/SplashScreen.tsx:41
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:62
+#: src/view/com/auth/SplashScreen.tsx:46
msgid "Create a new account"
msgstr "新しいアカウントを作成"
@@ -577,7 +586,8 @@ msgstr "新しいアカウントを作成"
msgid "Create Account"
msgstr "アカウントを作成"
-#: src/view/com/auth/SplashScreen.tsx:38
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:54
+#: src/view/com/auth/SplashScreen.tsx:43
msgid "Create new account"
msgstr "新しいアカウントを作成"
@@ -607,8 +617,8 @@ msgstr "アカウントを削除"
msgid "Delete app password"
msgstr "アプリパスワードを削除"
-#: src/view/screens/ProfileList.tsx:374
-#: src/view/screens/ProfileList.tsx:434
+#: src/view/screens/ProfileList.tsx:351
+#: src/view/screens/ProfileList.tsx:411
msgid "Delete List"
msgstr "リストを削除"
@@ -628,7 +638,7 @@ msgstr "投稿を削除"
msgid "Delete this post?"
msgstr "この投稿を削除しますか?"
-#: src/view/com/post-thread/PostThread.tsx:240
+#: src/view/com/post-thread/PostThread.tsx:243
msgid "Deleted post."
msgstr "投稿を削除しました。"
@@ -647,21 +657,21 @@ msgstr "開発者サーバー"
msgid "Developer Tools"
msgstr "開発者ツール"
-#: src/view/com/composer/Composer.tsx:142
+#: src/view/com/composer/Composer.tsx:143
msgid "Discard"
msgstr "破棄"
-#: src/view/com/composer/Composer.tsx:136
+#: src/view/com/composer/Composer.tsx:137
msgid "Discard draft"
-msgstr "ドラフトを破棄"
+msgstr "下書きを破棄"
#: src/view/screens/Moderation.tsx:207
msgid "Discourage apps from showing my account to logged-out users"
-msgstr ""
+msgstr "アプリがログアウトしたユーザーに自分のアカウントを表示しないようにする"
#: src/view/screens/Feeds.tsx:405
msgid "Discover new feeds"
-msgstr "新しいフィードを検出"
+msgstr "新しいフィードを見つける"
#: src/view/com/modals/EditProfile.tsx:191
msgid "Display name"
@@ -696,14 +706,14 @@ msgstr "完了{extraText}"
#: src/view/com/modals/InviteCodes.tsx:94
msgid "Each code works once. You'll receive more invite codes periodically."
-msgstr "それぞれのコードは一度ずつ動作します。定期的により多くの招待コードを受け取ります。"
+msgstr "それぞれのコードは一度ずつ動作します。定期的に招待コードをお送りします。"
#: src/view/com/composer/photos/Gallery.tsx:144
#: src/view/com/modals/EditImage.tsx:207
msgid "Edit image"
msgstr "画像を編集"
-#: src/view/screens/ProfileList.tsx:422
+#: src/view/screens/ProfileList.tsx:399
msgid "Edit list details"
msgstr "リストの詳細を編集"
@@ -726,34 +736,34 @@ msgstr "プロフィールを編集"
#: src/view/screens/Feeds.tsx:330
msgid "Edit Saved Feeds"
-msgstr "保存済みフィードを編集"
+msgstr "保存されたフィードを編集"
#: src/view/com/auth/create/Step2.tsx:90
#: src/view/com/auth/login/ForgotPasswordForm.tsx:148
#: src/view/com/modals/ChangeEmail.tsx:141
#: src/view/com/modals/Waitlist.tsx:88
msgid "Email"
-msgstr "Eメール"
+msgstr "メールアドレス"
#: src/view/com/auth/create/Step2.tsx:81
msgid "Email address"
-msgstr "Eメールアドレス"
+msgstr "メールアドレス"
#: src/view/com/modals/ChangeEmail.tsx:111
msgid "Email Updated"
-msgstr "Eメール更新"
+msgstr "メールアドレスを更新"
#: src/view/screens/Settings.tsx:290
msgid "Email:"
-msgstr "Eメール:"
+msgstr "メールアドレス:"
#: src/view/screens/PreferencesHomeFeed.tsx:138
msgid "Enable this setting to only see replies between people you follow."
-msgstr "この設定を有効にすると、フォローしているユーザー間の応答だけが表示されます。"
+msgstr "この設定を有効にすると、フォローしているユーザー間の返信だけが表示されます。"
-#: src/view/screens/Profile.tsx:471
+#: src/view/screens/Profile.tsx:425
msgid "End of feed"
-msgstr ""
+msgstr "フィードの終わり"
#: src/view/com/auth/create/Step1.tsx:71
msgid "Enter the address of your provider:"
@@ -761,15 +771,15 @@ msgstr "プロバイダーのアドレスを入力してください:"
#: src/view/com/modals/ChangeHandle.tsx:369
msgid "Enter the domain you want to use"
-msgstr "使用するドメインを入力"
+msgstr "使用するドメインを入力してください"
#: src/view/com/auth/login/ForgotPasswordForm.tsx:101
msgid "Enter the email you used to create your account. We'll send you a \"reset code\" so you can set a new password."
-msgstr "アカウントの作成に使用したEメールを入力します。新しいパスワードを設定できるように、「リセットコード」をお送りします。"
+msgstr "アカウントの作成に使用したメールアドレスを入力します。新しいパスワードを設定できるように、「リセットコード」をお送りします。"
#: src/view/com/auth/create/Step2.tsx:86
msgid "Enter your email address"
-msgstr "Eメールアドレスを入力"
+msgstr "メールアドレスを入力してください"
#: src/view/com/modals/ChangeEmail.tsx:117
msgid "Enter your new email address below."
@@ -779,13 +789,13 @@ msgstr "以下に新しいメールアドレスを入力してください。"
msgid "Enter your username and password"
msgstr "ユーザー名とパスワードを入力"
-#: src/view/screens/Search/Search.tsx:105
+#: src/view/screens/Search/Search.tsx:106
msgid "Error:"
msgstr "エラー:"
#: src/view/com/modals/Threadgate.tsx:76
msgid "Everybody"
-msgstr ""
+msgstr "全員"
#: src/view/com/lightbox/Lightbox.web.tsx:156
msgid "Expand alt text"
@@ -794,15 +804,15 @@ msgstr "ALTテキストを展開"
#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109
#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141
msgid "Failed to load recommended feeds"
-msgstr "推奨フィードのロードに失敗"
+msgstr "おすすめのフィードのロードに失敗しました"
#: src/view/screens/Feeds.tsx:559
msgid "Feed offline"
-msgstr "フィードはオフライン"
+msgstr "フィードはオフラインです"
-#: src/view/com/feeds/FeedPage.tsx:140
+#: src/view/com/feeds/FeedPage.tsx:143
msgid "Feed Preferences"
-msgstr "フィード設定"
+msgstr "フィードの設定"
#: src/view/shell/desktop/RightNav.tsx:65
#: src/view/shell/Drawer.tsx:292
@@ -811,8 +821,8 @@ msgstr "フィードバック"
#: src/view/screens/Feeds.tsx:475
#: src/view/screens/Profile.tsx:164
-#: src/view/shell/bottom-bar/BottomBar.tsx:160
-#: src/view/shell/desktop/LeftNav.tsx:333
+#: src/view/shell/bottom-bar/BottomBar.tsx:181
+#: src/view/shell/desktop/LeftNav.tsx:339
#: src/view/shell/Drawer.tsx:455
#: src/view/shell/Drawer.tsx:456
msgid "Feeds"
@@ -820,15 +830,23 @@ msgstr "フィード"
#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:57
msgid "Feeds are created by users to curate content. Choose some feeds that you find interesting."
-msgstr "フィードはコンテンツを整理する為にユーザーによって作成されます。興味具かいフィードをいくつか選択してください。"
+msgstr "フィードはコンテンツを整理する為にユーザーによって作成されます。興味のあるフィードをいくつか選択してください。"
#: src/view/screens/SavedFeeds.tsx:156
msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information."
msgstr "フィードはユーザーがプログラミングの専門知識を持って構築するカスタムアルゴリズムです。詳細については、<0/>を参照してください。"
+#: src/view/screens/Search/Search.tsx:422
+msgid "Find users on Bluesky"
+msgstr "Blueskyでユーザーを検索"
+
+#: src/view/screens/Search/Search.tsx:420
+msgid "Find users with the search tool on the right"
+msgstr "右側の検索ツールでユーザーを検索"
+
#: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:150
msgid "Finding similar accounts..."
-msgstr "似通ったアカウントを検索中..."
+msgstr "似ているアカウントを検索中..."
#: src/view/screens/PreferencesHomeFeed.tsx:102
msgid "Fine-tune the content you see on your home screen."
@@ -844,11 +862,11 @@ msgstr "フォロー"
#: src/view/com/auth/onboarding/RecommendedFollows.tsx:64
msgid "Follow some users to get started. We can recommend you more users based on who you find interesting."
-msgstr "いくつかのユーザーをフォローして開始します。興味を持っている人に基づいて、より多くのユーザーをお勧めできます。"
+msgstr "何人かのユーザーをフォローして開始します。興味を持っている人に基づいて、より多くのユーザーをおすすめします。"
#: src/view/com/modals/Threadgate.tsx:98
msgid "Followed users"
-msgstr ""
+msgstr "フォローしているユーザー"
#: src/view/screens/PreferencesHomeFeed.tsx:145
msgid "Followed users only"
@@ -873,7 +891,7 @@ msgstr "あなたをフォロー"
#: src/view/com/modals/DeleteAccount.tsx:107
msgid "For security reasons, we'll need to send a confirmation code to your email address."
-msgstr "セキュリティ上の理由から、Eメールアドレスに確認コードを送信する必要があります。"
+msgstr "セキュリティ上の理由から、メールアドレスに確認コードを送信する必要があります。"
#: src/view/com/modals/AddAppPasswords.tsx:207
msgid "For security reasons, you won't be able to view this again. If you lose this password, you'll need to generate a new one."
@@ -881,16 +899,16 @@ msgstr "セキュリティ上の理由から、これを再度表示すること
#: src/view/com/auth/login/LoginForm.tsx:231
msgid "Forgot"
-msgstr "失念"
+msgstr "忘れた"
#: src/view/com/auth/login/LoginForm.tsx:228
msgid "Forgot password"
-msgstr "パスワードを失念"
+msgstr "パスワードを忘れた"
#: src/view/com/auth/login/Login.tsx:127
#: src/view/com/auth/login/Login.tsx:143
msgid "Forgot Password"
-msgstr "パスワードを失念"
+msgstr "パスワードを忘れた"
#: src/view/com/composer/photos/SelectPhotoBtn.tsx:43
msgid "Gallery"
@@ -900,17 +918,17 @@ msgstr "ギャラリー"
msgid "Get Started"
msgstr "はじめに"
-#: src/view/com/auth/LoggedOut.tsx:68
-#: src/view/com/auth/LoggedOut.tsx:69
-#: src/view/com/util/moderation/ScreenHider.tsx:105
+#: src/view/com/auth/LoggedOut.tsx:70
+#: src/view/com/auth/LoggedOut.tsx:71
+#: src/view/com/util/moderation/ScreenHider.tsx:123
#: src/view/shell/desktop/LeftNav.tsx:103
msgid "Go back"
msgstr "戻る"
-#: src/view/screens/ProfileFeed.tsx:112
-#: src/view/screens/ProfileFeed.tsx:117
-#: src/view/screens/ProfileList.tsx:869
-#: src/view/screens/ProfileList.tsx:874
+#: src/view/screens/ProfileFeed.tsx:103
+#: src/view/screens/ProfileFeed.tsx:108
+#: src/view/screens/ProfileList.tsx:839
+#: src/view/screens/ProfileList.tsx:844
msgid "Go Back"
msgstr "戻る"
@@ -934,41 +952,42 @@ msgid "Here is your app password."
msgstr "アプリパスワードをお知らせします。"
#: src/view/com/notifications/FeedItem.tsx:316
+#: src/view/com/util/moderation/ContentHider.tsx:103
msgid "Hide"
msgstr "非表示"
#: src/view/com/notifications/FeedItem.tsx:308
msgid "Hide user list"
-msgstr "ユーザーリストを非表示にする"
+msgstr "ユーザーリストを非表示"
#: src/view/com/posts/FeedErrorMessage.tsx:110
msgid "Hmm, some kind of issue occurred when contacting the feed server. Please let the feed owner know about this issue."
-msgstr ""
+msgstr "フィードサーバーに問い合わせたところ、なんらかの問題が発生しました。この問題をフィードのオーナーにお知らせください。"
#: src/view/com/posts/FeedErrorMessage.tsx:98
msgid "Hmm, the feed server appears to be misconfigured. Please let the feed owner know about this issue."
-msgstr ""
+msgstr "フィードサーバーの設定が間違っているようです。この問題をフィードのオーナーにお知らせください。"
#: src/view/com/posts/FeedErrorMessage.tsx:104
msgid "Hmm, the feed server appears to be offline. Please let the feed owner know about this issue."
-msgstr ""
+msgstr "フィードサーバーがオフラインのようです。この問題をフィードのオーナーにお知らせください。"
#: src/view/com/posts/FeedErrorMessage.tsx:101
msgid "Hmm, the feed server gave a bad response. Please let the feed owner know about this issue."
-msgstr ""
+msgstr "フィードサーバーの反応が悪いようです。この問題をフィードのオーナーにお知らせください。"
#: src/view/com/posts/FeedErrorMessage.tsx:95
msgid "Hmm, we're having trouble finding this feed. It may have been deleted."
-msgstr ""
+msgstr "このフィードが見つからないようです。もしかしたら削除されたのかもしれません。"
-#: src/view/shell/bottom-bar/BottomBar.tsx:116
-#: src/view/shell/desktop/LeftNav.tsx:297
+#: src/view/shell/bottom-bar/BottomBar.tsx:137
+#: src/view/shell/desktop/LeftNav.tsx:303
#: src/view/shell/Drawer.tsx:379
#: src/view/shell/Drawer.tsx:380
msgid "Home"
msgstr "ホーム"
-#: src/view/com/pager/FeedsTabBarMobile.tsx:99
+#: src/view/com/pager/FeedsTabBarMobile.tsx:96
#: src/view/screens/PreferencesHomeFeed.tsx:95
#: src/view/screens/Settings.tsx:481
msgid "Home Feed Preferences"
@@ -981,15 +1000,15 @@ msgstr "ホスティングプロバイダー"
#: src/view/com/auth/create/Step1.tsx:76
#: src/view/com/auth/create/Step1.tsx:81
msgid "Hosting provider address"
-msgstr "ホスティングプロバイダーアドレス"
+msgstr "ホスティングプロバイダーのアドレス"
#: src/view/com/modals/VerifyEmail.tsx:208
msgid "I have a code"
-msgstr "コードを持っている"
+msgstr "コードを持っています"
#: src/view/com/modals/ChangeHandle.tsx:281
msgid "I have my own domain"
-msgstr "自分のドメインを持っている"
+msgstr "自分のドメインを持っています"
#: src/view/com/modals/SelfLabel.tsx:127
msgid "If none are selected, suitable for all ages."
@@ -1002,7 +1021,7 @@ msgstr "画像のALTテキスト"
#: src/view/com/util/UserAvatar.tsx:308
#: src/view/com/util/UserBanner.tsx:116
msgid "Image options"
-msgstr "イメージオプション"
+msgstr "画像のオプション"
#: src/view/com/auth/login/LoginForm.tsx:113
msgid "Invalid username or password"
@@ -1015,7 +1034,7 @@ msgstr "招待"
#: src/view/com/modals/InviteCodes.tsx:91
#: src/view/screens/Settings.tsx:371
msgid "Invite a Friend"
-msgstr "友人を招待"
+msgstr "友達を招待"
#: src/view/com/auth/create/Step2.tsx:57
msgid "Invite code"
@@ -1023,40 +1042,48 @@ msgstr "招待コード"
#: src/view/com/auth/create/state.ts:136
msgid "Invite code not accepted. Check that you input it correctly and try again."
-msgstr "招待コードが確認できません。正しく入力されている事を確認し、もう一度実行してください。"
+msgstr "招待コードが確認できません。正しく入力されていることを確認し、もう一度実行してください。"
#: src/view/shell/Drawer.tsx:621
msgid "Invite codes: {invitesAvailable} available"
-msgstr ""
+msgstr "使用可能な招待コード: {invitesAvailable} 個"
+
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:99
+msgid "Jobs"
+msgstr "仕事"
#: src/view/com/modals/Waitlist.tsx:67
msgid "Join the waitlist"
-msgstr "待機リストに参加"
+msgstr "Waitlistに参加"
#: src/view/com/auth/create/Step2.tsx:68
#: src/view/com/auth/create/Step2.tsx:72
msgid "Join the waitlist."
-msgstr "待機リストに参加します。"
+msgstr "Waitlistに参加します。"
#: src/view/com/modals/Waitlist.tsx:124
msgid "Join Waitlist"
-msgstr "待機リストに参加"
+msgstr "Waitlistに参加"
#: src/view/com/composer/select-language/SelectLangBtn.tsx:104
msgid "Language selection"
-msgstr "言語選択"
+msgstr "言語の選択"
#: src/view/screens/LanguageSettings.tsx:89
msgid "Language Settings"
-msgstr "言語設定"
+msgstr "言語の設定"
#: src/view/screens/Settings.tsx:541
msgid "Languages"
msgstr "言語"
+#: src/view/com/util/moderation/ContentHider.tsx:101
+msgid "Learn more"
+msgstr "詳細"
+
#: src/view/com/util/moderation/PostAlerts.tsx:47
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:65
-#: src/view/com/util/moderation/ScreenHider.tsx:88
+#: src/view/com/util/moderation/ScreenHider.tsx:104
msgid "Learn More"
msgstr "詳細"
@@ -1064,13 +1091,13 @@ msgstr "詳細"
#: src/view/com/util/moderation/PostAlerts.tsx:40
#: src/view/com/util/moderation/PostHider.tsx:76
#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:49
-#: src/view/com/util/moderation/ScreenHider.tsx:85
+#: src/view/com/util/moderation/ScreenHider.tsx:101
msgid "Learn more about this warning"
msgstr "この警告の詳細"
#: src/view/screens/Moderation.tsx:242
msgid "Learn more about what is public on Bluesky."
-msgstr ""
+msgstr "Blueskyで公開されている内容はこちらを参照してください。"
#: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:82
msgid "Leave them all unchecked to see any language."
@@ -1090,22 +1117,22 @@ msgstr "パスワードをリセットしましょう!"
msgid "Library"
msgstr "ライブラリー"
-#: src/view/screens/ProfileFeed.tsx:643
+#: src/view/screens/ProfileFeed.tsx:577
msgid "Like this feed"
msgstr "このフィードをいいね"
#: src/view/screens/PostLikedBy.tsx:27
#: src/view/screens/ProfileFeedLikedBy.tsx:27
msgid "Liked by"
-msgstr "いいねした人:"
+msgstr "いいねした人"
#: src/view/screens/Profile.tsx:163
msgid "Likes"
-msgstr ""
+msgstr "いいね"
#: src/view/screens/Moderation.tsx:203
#~ msgid "Limit the visibility of my account to logged-out users"
-#~ msgstr ""
+#~ msgstr "ログアウトしたユーザーに対して私のアカウントの閲覧を制限"
#: src/view/com/modals/CreateOrEditList.tsx:186
msgid "List Avatar"
@@ -1113,27 +1140,27 @@ msgstr "リストアバター"
#: src/view/com/modals/CreateOrEditList.tsx:199
msgid "List Name"
-msgstr "リスト名"
+msgstr "リストの名前"
#: src/view/screens/Profile.tsx:165
-#: src/view/shell/desktop/LeftNav.tsx:373
+#: src/view/shell/desktop/LeftNav.tsx:376
#: src/view/shell/Drawer.tsx:471
#: src/view/shell/Drawer.tsx:472
msgid "Lists"
msgstr "リスト"
-#: src/view/com/post-thread/PostThread.tsx:257
-#: src/view/com/post-thread/PostThread.tsx:265
+#: src/view/com/post-thread/PostThread.tsx:260
+#: src/view/com/post-thread/PostThread.tsx:268
msgid "Load more posts"
msgstr "より多くの投稿をロード"
-#: src/view/screens/Notifications.tsx:141
+#: src/view/screens/Notifications.tsx:144
msgid "Load new notifications"
msgstr "新しい通知をロード"
-#: src/view/com/feeds/FeedPage.tsx:185
+#: src/view/com/feeds/FeedPage.tsx:189
msgid "Load new posts"
-msgstr "新しい投稿をロード"
+msgstr "投稿をロード"
#: src/view/com/composer/text-input/mobile/Autocomplete.tsx:95
msgid "Loading..."
@@ -1145,68 +1172,67 @@ msgstr "ローカル開発者サーバー"
#: src/view/screens/Moderation.tsx:134
#~ msgid "Logged-out users"
-#~ msgstr ""
+#~ msgstr "ログアウトしたユーザー"
#: src/view/screens/Moderation.tsx:136
msgid "Logged-out visibility"
-msgstr ""
+msgstr "ログアウトした状態の可視性"
#: src/view/com/auth/login/ChooseAccountForm.tsx:133
msgid "Login to account that is not listed"
msgstr "リストにないアカウントにログイン"
-#: src/view/screens/ProfileFeed.tsx:482
-msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!"
-msgstr ""
+#: src/view/screens/ProfileFeed.tsx:472
+#~ msgid "Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!"
+#~ msgstr "このフィードはBlueskyのアカウントを持っているユーザーのみが利用できるようです。このフィードを表示するには、サインアップするかサインインしてください!"
#: src/view/com/modals/LinkWarning.tsx:63
msgid "Make sure this is where you intend to go!"
-msgstr "意図する場所である事を確認してください!"
+msgstr "意図した場所であることを確認してください!"
#: src/view/screens/Profile.tsx:162
msgid "Media"
-msgstr ""
+msgstr "メディア"
#: src/view/com/threadgate/WhoCanReply.tsx:139
msgid "mentioned users"
-msgstr ""
+msgstr "メンションされたユーザー"
#: src/view/com/modals/Threadgate.tsx:93
msgid "Mentioned users"
-msgstr ""
+msgstr "メンションされたユーザー"
-#: src/view/screens/Search/Search.tsx:503
+#: src/view/screens/Search/Search.tsx:537
msgid "Menu"
msgstr "メニュー"
#: src/view/com/posts/FeedErrorMessage.tsx:194
-#: src/view/screens/ProfileFeed.tsx:490
msgid "Message from server"
-msgstr ""
+msgstr "サーバーからのメッセージ"
#: src/view/screens/Moderation.tsx:64
#: src/view/screens/Settings.tsx:563
-#: src/view/shell/desktop/LeftNav.tsx:391
+#: src/view/shell/desktop/LeftNav.tsx:394
#: src/view/shell/Drawer.tsx:490
#: src/view/shell/Drawer.tsx:491
msgid "Moderation"
-msgstr "モデレート"
+msgstr "モデレーション"
#: src/view/screens/Moderation.tsx:95
msgid "Moderation lists"
-msgstr "モデレートリスト"
+msgstr "モデレーションリスト"
#: src/view/screens/ModerationModlists.tsx:58
msgid "Moderation Lists"
-msgstr ""
+msgstr "モデレーションリスト"
#: src/view/shell/desktop/Feeds.tsx:53
msgid "More feeds"
msgstr "その他のフィード"
#: src/view/com/profile/ProfileHeader.tsx:548
-#: src/view/screens/ProfileFeed.tsx:370
-#: src/view/screens/ProfileList.tsx:606
+#: src/view/screens/ProfileFeed.tsx:360
+#: src/view/screens/ProfileList.tsx:583
msgid "More options"
msgstr "その他のオプション"
@@ -1214,15 +1240,15 @@ msgstr "その他のオプション"
msgid "Mute Account"
msgstr "アカウントをミュート"
-#: src/view/screens/ProfileList.tsx:533
+#: src/view/screens/ProfileList.tsx:510
msgid "Mute accounts"
msgstr "アカウントをミュート"
-#: src/view/screens/ProfileList.tsx:480
+#: src/view/screens/ProfileList.tsx:457
msgid "Mute list"
-msgstr ""
+msgstr "リストをミュート"
-#: src/view/screens/ProfileList.tsx:293
+#: src/view/screens/ProfileList.tsx:270
msgid "Mute these accounts?"
msgstr "これらのアカウントをミュートしますか?"
@@ -1232,19 +1258,19 @@ msgstr "スレッドをミュート"
#: src/view/screens/Moderation.tsx:109
msgid "Muted accounts"
-msgstr "ミュート済みアカウント"
+msgstr "ミュートされたアカウント"
#: src/view/screens/ModerationMutedAccounts.tsx:106
msgid "Muted Accounts"
-msgstr "ミュート済みアカウント"
+msgstr "ミュートされたアカウント"
#: src/view/screens/ModerationMutedAccounts.tsx:114
msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private."
-msgstr "ミュート済みのアカウントは、フィードと通知からの投稿が削除されます。ミュート設定は知られることはありません。"
+msgstr "ミュートをされたアカウントは、フィードと通知からの投稿が削除されます。ミュートの設定は完全に非公開です。"
-#: src/view/screens/ProfileList.tsx:295
+#: src/view/screens/ProfileList.tsx:272
msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them."
-msgstr "ミュートはプライベートです。ミュート済みアカウントはユーザーと相互作用することができますが、そのアカウントの投稿や通知を受信することはできません。"
+msgstr "ミュートは非公開です。ミュートをされたアカウントはあなたと引き続き関わることができますが、そのアカウントの投稿や通知を受信することはできません。"
#: src/view/com/modals/BirthDateSettings.tsx:56
msgid "My Birthday"
@@ -1260,7 +1286,7 @@ msgstr "マイプロフィール"
#: src/view/screens/Settings.tsx:520
msgid "My Saved Feeds"
-msgstr "保存済みフィード"
+msgstr "保存されたフィード"
#: src/view/com/modals/AddAppPasswords.tsx:177
#: src/view/com/modals/CreateOrEditList.tsx:211
@@ -1269,19 +1295,19 @@ msgstr "名前"
#: src/view/com/auth/onboarding/WelcomeMobile.tsx:72
msgid "Never lose access to your followers and data."
-msgstr "決してフォロワーやデータへのアクセスを失わないでください。"
+msgstr "フォロワーやデータへのアクセスを失うことはありません。"
#: src/view/screens/Lists.tsx:76
#: src/view/screens/ModerationModlists.tsx:78
msgid "New"
msgstr "新規"
-#: src/view/com/feeds/FeedPage.tsx:196
+#: src/view/com/feeds/FeedPage.tsx:200
#: src/view/screens/Feeds.tsx:510
-#: src/view/screens/Profile.tsx:389
-#: src/view/screens/ProfileFeed.tsx:451
-#: src/view/screens/ProfileList.tsx:212
-#: src/view/screens/ProfileList.tsx:244
+#: src/view/screens/Profile.tsx:353
+#: src/view/screens/ProfileFeed.tsx:430
+#: src/view/screens/ProfileList.tsx:193
+#: src/view/screens/ProfileList.tsx:221
#: src/view/shell/desktop/LeftNav.tsx:246
msgid "New post"
msgstr "新しい投稿"
@@ -1308,32 +1334,32 @@ msgstr "次の画像"
#: src/view/screens/PreferencesHomeFeed.tsx:226
#: src/view/screens/PreferencesHomeFeed.tsx:263
msgid "No"
-msgstr "なし"
+msgstr "いいえ"
-#: src/view/screens/ProfileFeed.tsx:636
-#: src/view/screens/ProfileList.tsx:740
+#: src/view/screens/ProfileFeed.tsx:570
+#: src/view/screens/ProfileList.tsx:711
msgid "No description"
-msgstr "説明なし"
+msgstr "説明はありません"
#: src/view/com/composer/text-input/mobile/Autocomplete.tsx:97
msgid "No result"
-msgstr "結果なし"
+msgstr "結果はありません"
#: src/view/screens/Feeds.tsx:452
msgid "No results found for \"{query}\""
-msgstr "「\\{query}」の検索結果がない"
+msgstr "「{query}」の検索結果はありません"
#: src/view/com/modals/ListAddRemoveUsers.tsx:127
-#: src/view/screens/Search/Search.tsx:270
-#: src/view/screens/Search/Search.tsx:298
-#: src/view/screens/Search/Search.tsx:581
+#: src/view/screens/Search/Search.tsx:271
+#: src/view/screens/Search/Search.tsx:299
+#: src/view/screens/Search/Search.tsx:615
#: src/view/shell/desktop/Search.tsx:210
msgid "No results found for {query}"
-msgstr "\\{query}の検索結果がない"
+msgstr "「{query}」の検索結果はありません"
#: src/view/com/modals/Threadgate.tsx:82
msgid "Nobody"
-msgstr ""
+msgstr "返信不可"
#: src/view/com/modals/SelfLabel.tsx:135
msgid "Not Applicable."
@@ -1341,16 +1367,16 @@ msgstr "該当なし。"
#: src/view/screens/Moderation.tsx:227
#~ msgid "Note: Bluesky is an open and public network, and enabling this will not make your profile private or limit the ability of logged in users to see your posts. This setting only limits the visibility of posts on the Bluesky app and website; third-party apps that display Bluesky content may not respect this setting, and could show your content to logged-out users."
-#~ msgstr ""
+#~ msgstr "注記:Blueskyはオープンでパブリックなネットワークであり、この設定を有効にしてもログインしているユーザーはあなたのプロフィールや投稿を制限なく閲覧できます。この設定はBlueskyのアプリおよびウェブサイト上のみでのあなたのコンテンツの可視性を制限するものです。Blueskyのコンテンツを表示するサードパーティーのアプリやウェブサイトなどはこの設定を尊重しない場合があり、ログアウトしたユーザーに対しあなたのコンテンツが表示される可能性があります。"
#: src/view/screens/Moderation.tsx:232
msgid "Note: Bluesky is an open and public network. This setting only limits the visibility of your content on the Bluesky app and website, and other apps may not respect this setting. Your content may still be shown to logged-out users by other apps and websites."
-msgstr ""
+msgstr "注記:Blueskyはオープンでパブリックなネットワークです。この設定はBlueskyのアプリおよびウェブサイト上のみでのあなたのコンテンツの可視性を制限するものであり、他のアプリではこの設定を尊重しない場合があります。他のアプリやウェブサイトでは、ログアウトしたユーザーにあなたのコンテンツが表示される場合があります。"
-#: src/view/screens/Notifications.tsx:108
-#: src/view/screens/Notifications.tsx:132
-#: src/view/shell/bottom-bar/BottomBar.tsx:187
-#: src/view/shell/desktop/LeftNav.tsx:355
+#: src/view/screens/Notifications.tsx:109
+#: src/view/screens/Notifications.tsx:133
+#: src/view/shell/bottom-bar/BottomBar.tsx:205
+#: src/view/shell/desktop/LeftNav.tsx:358
#: src/view/shell/Drawer.tsx:416
#: src/view/shell/Drawer.tsx:417
msgid "Notifications"
@@ -1364,15 +1390,15 @@ msgstr "ちょっと!"
msgid "Okay"
msgstr "OK"
-#: src/view/com/composer/Composer.tsx:348
+#: src/view/com/composer/Composer.tsx:354
msgid "One or more images is missing alt text."
-msgstr "1つ以上の画像にALTテキストがありません。"
+msgstr "1つもしくは複数の画像にALTテキストがありません。"
#: src/view/com/threadgate/WhoCanReply.tsx:100
msgid "Only {0} can reply."
-msgstr ""
+msgstr "{0}のみ返信可能"
-#: src/view/com/pager/FeedsTabBarMobile.tsx:79
+#: src/view/com/pager/FeedsTabBarMobile.tsx:76
msgid "Open navigation"
msgstr "ナビゲーションを開く"
@@ -1383,7 +1409,7 @@ msgstr "構成可能な言語設定を開く"
#: src/view/shell/desktop/RightNav.tsx:148
#: src/view/shell/Drawer.tsx:622
msgid "Opens list of invite codes"
-msgstr ""
+msgstr "招待コードのリストを開く"
#: src/view/com/modals/ChangeHandle.tsx:279
msgid "Opens modal for using custom domain"
@@ -1391,7 +1417,7 @@ msgstr "カスタムドメインを使用するためのモーダルを開く"
#: src/view/screens/Settings.tsx:558
msgid "Opens moderation settings"
-msgstr "モデレート設定を開く"
+msgstr "モデレーションの設定を開く"
#: src/view/screens/Settings.tsx:514
msgid "Opens screen with all saved feeds"
@@ -1399,11 +1425,11 @@ msgstr "保存されたすべてのフィードで画面を開く"
#: src/view/screens/Settings.tsx:581
msgid "Opens the app password settings page"
-msgstr "アプリのパスワード設定ページを開く"
+msgstr "アプリパスワード設定ページを開く"
#: src/view/screens/Settings.tsx:473
msgid "Opens the home feed preferences"
-msgstr "ホームフィード設定を開きます"
+msgstr "ホームフィードの設定を開く"
#: src/view/screens/Settings.tsx:664
msgid "Opens the storybook page"
@@ -1415,7 +1441,7 @@ msgstr "システムログのページを開く"
#: src/view/screens/Settings.tsx:494
msgid "Opens the threads preferences"
-msgstr "スレッド設定を開きます"
+msgstr "スレッドの設定を開く"
#: src/view/com/auth/login/ChooseAccountForm.tsx:138
msgid "Other account"
@@ -1432,7 +1458,7 @@ msgstr "その他..."
#: src/view/screens/NotFound.tsx:42
#: src/view/screens/NotFound.tsx:45
msgid "Page not found"
-msgstr "ページが見つからない"
+msgstr "ページが見つかりません"
#: src/view/com/auth/create/Step2.tsx:101
#: src/view/com/auth/create/Step2.tsx:111
@@ -1444,7 +1470,7 @@ msgstr "パスワード"
#: src/view/com/auth/login/Login.tsx:157
msgid "Password updated"
-msgstr "パスワードが更新された"
+msgstr "パスワードが更新されました"
#: src/view/com/auth/login/PasswordUpdatedForm.tsx:28
msgid "Password updated!"
@@ -1452,11 +1478,11 @@ msgstr "パスワードが更新されました!"
#: src/view/com/modals/SelfLabel.tsx:121
msgid "Pictures meant for adults."
-msgstr "写真は成人向けです。"
+msgstr "成人向けの写真です。"
#: src/view/screens/SavedFeeds.tsx:88
msgid "Pinned Feeds"
-msgstr "ピン接続フィード"
+msgstr "ピン留めされたフィード"
#: src/view/com/auth/create/state.ts:116
msgid "Please choose your handle."
@@ -1468,7 +1494,7 @@ msgstr "パスワードを選択してください。"
#: src/view/com/modals/ChangeEmail.tsx:67
msgid "Please confirm your email before changing it. This is a temporary requirement while email-updating tools are added, and it will soon be removed."
-msgstr "変更する前にメールを確認してください。これは、Eメールアップデートツールが追加されている間の一時的な要件であり、まもなく削除されます。"
+msgstr "変更する前にメールを確認してください。これは、メールアップデートツールが追加されている間の一時的な要件であり、まもなく削除されます。"
#: src/view/com/modals/AddAppPasswords.tsx:140
msgid "Please enter a unique name for this App Password or use our randomly generated one."
@@ -1476,7 +1502,7 @@ msgstr "このアプリパスワードに固有の名前を入力するか、ラ
#: src/view/com/auth/create/state.ts:95
msgid "Please enter your email."
-msgstr "Eメールを入力してください。"
+msgstr "メールアドレスを入力してください。"
#: src/view/com/modals/DeleteAccount.tsx:180
msgid "Please enter your password as well:"
@@ -1485,33 +1511,33 @@ msgstr "パスワードも入力してください:"
#: src/view/com/modals/AppealLabel.tsx:72
#: src/view/com/modals/AppealLabel.tsx:75
msgid "Please tell us why you think this decision was incorrect."
-msgstr ""
+msgstr "この判断が誤っていると考える理由を教えてください。"
-#: src/view/com/composer/Composer.tsx:331
-#: src/view/com/post-thread/PostThread.tsx:223
-#: src/view/screens/PostThread.tsx:78
+#: src/view/com/composer/Composer.tsx:337
+#: src/view/com/post-thread/PostThread.tsx:226
+#: src/view/screens/PostThread.tsx:80
msgid "Post"
msgstr "投稿"
-#: src/view/com/post-thread/PostThread.tsx:382
+#: src/view/com/post-thread/PostThread.tsx:385
msgid "Post hidden"
-msgstr "投稿非表示"
+msgstr "投稿を非表示"
#: src/view/com/composer/select-language/SelectLangBtn.tsx:87
msgid "Post language"
-msgstr "ポスト言語"
+msgstr "投稿の言語"
#: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:75
msgid "Post Languages"
-msgstr "投稿言語"
+msgstr "投稿の言語"
-#: src/view/com/post-thread/PostThread.tsx:434
+#: src/view/com/post-thread/PostThread.tsx:437
msgid "Post not found"
-msgstr "投稿が見つからない"
+msgstr "投稿が見つかりません"
#: src/view/screens/Profile.tsx:160
msgid "Posts"
-msgstr ""
+msgstr "投稿"
#: src/view/com/modals/LinkWarning.tsx:44
msgid "Potentially Misleading Link"
@@ -1527,7 +1553,7 @@ msgstr "第一言語"
#: src/view/screens/PreferencesThreads.tsx:91
msgid "Prioritize Your Follows"
-msgstr "フォローの優先順位付け"
+msgstr "あなたのフォローを優先"
#: src/view/shell/desktop/RightNav.tsx:76
msgid "Privacy"
@@ -1541,7 +1567,8 @@ msgstr "プライバシーポリシー"
msgid "Processing..."
msgstr "処理中..."
-#: src/view/shell/bottom-bar/BottomBar.tsx:229
+#: src/view/shell/bottom-bar/BottomBar.tsx:247
+#: src/view/shell/desktop/LeftNav.tsx:412
#: src/view/shell/Drawer.tsx:69
#: src/view/shell/Drawer.tsx:525
#: src/view/shell/Drawer.tsx:526
@@ -1550,24 +1577,24 @@ msgstr "プロフィール"
#: src/view/screens/Settings.tsx:789
msgid "Protect your account by verifying your email."
-msgstr "Eメールを確認してアカウントを保護します。"
+msgstr "メールアドレスを確認してアカウントを保護します。"
#: src/view/screens/ModerationModlists.tsx:61
msgid "Public, shareable lists of users to mute or block in bulk."
-msgstr ""
+msgstr "ユーザーを一括でミュートまたはブロックする、公開された共有可能なリスト。"
#: src/view/screens/Lists.tsx:61
msgid "Public, shareable lists which can drive feeds."
-msgstr "フィードを駆動できるパブリックで共有可能なリスト。"
+msgstr "フィードとして利用できる、公開された共有可能なリスト。"
#: src/view/com/modals/Repost.tsx:52
#: src/view/com/util/post-ctrls/RepostButton.web.tsx:58
msgid "Quote post"
-msgstr "引用投稿"
+msgstr "引用"
#: src/view/com/modals/Repost.tsx:56
msgid "Quote Post"
-msgstr "引用投稿"
+msgstr "引用"
#: src/view/com/modals/EditImage.tsx:236
msgid "Ratios"
@@ -1575,11 +1602,11 @@ msgstr "比率"
#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:116
msgid "Recommended Feeds"
-msgstr "推奨フィード"
+msgstr "おすすめのフィード"
#: src/view/com/auth/onboarding/RecommendedFollows.tsx:180
msgid "Recommended Users"
-msgstr "推奨ユーザー"
+msgstr "おすすめのユーザー"
#: src/view/com/modals/ListAddRemoveUsers.tsx:264
#: src/view/com/modals/SelfLabel.tsx:83
@@ -1603,7 +1630,7 @@ msgstr "フィードを削除"
#: src/view/com/feeds/FeedSourceCard.tsx:105
#: src/view/com/feeds/FeedSourceCard.tsx:172
-#: src/view/screens/ProfileFeed.tsx:280
+#: src/view/screens/ProfileFeed.tsx:270
msgid "Remove from my feeds"
msgstr "マイフィードから削除"
@@ -1617,7 +1644,7 @@ msgstr "イメージプレビューを削除"
#: src/view/com/feeds/FeedSourceCard.tsx:173
msgid "Remove this feed from my feeds?"
-msgstr ""
+msgstr "このフィードをマイフィードから削除しますか?"
#: src/view/com/posts/FeedErrorMessage.tsx:131
msgid "Remove this feed from your saved feeds?"
@@ -1626,53 +1653,53 @@ msgstr "保存したフィードからこのフィードを削除しますか?
#: src/view/com/modals/ListAddRemoveUsers.tsx:199
#: src/view/com/modals/UserAddRemoveLists.tsx:136
msgid "Removed from list"
-msgstr "リストから削除された"
+msgstr "リストから削除されました"
#: src/view/screens/Profile.tsx:161
msgid "Replies"
-msgstr ""
+msgstr "返信"
#: src/view/com/threadgate/WhoCanReply.tsx:98
msgid "Replies to this thread are disabled"
-msgstr ""
+msgstr "このスレッドへの返信はできません"
#: src/view/screens/PreferencesHomeFeed.tsx:135
msgid "Reply Filters"
-msgstr "返信フィルター"
+msgstr "返信のフィルター"
#: src/view/com/modals/report/Modal.tsx:166
msgid "Report {collectionName}"
-msgstr "レポート \\{collectionName}"
+msgstr "{collectionName}を報告"
#: src/view/com/profile/ProfileHeader.tsx:404
msgid "Report Account"
-msgstr "レポートアカウント"
+msgstr "アカウントを報告"
-#: src/view/screens/ProfileFeed.tsx:300
+#: src/view/screens/ProfileFeed.tsx:290
msgid "Report feed"
-msgstr "レポートフィード"
+msgstr "フィードを報告"
-#: src/view/screens/ProfileList.tsx:448
+#: src/view/screens/ProfileList.tsx:425
msgid "Report List"
-msgstr "レポートリスト"
+msgstr "リストを報告"
#: src/view/com/modals/report/SendReportButton.tsx:37
#: src/view/com/util/forms/PostDropdownBtn.tsx:165
msgid "Report post"
-msgstr "レポート投稿"
+msgstr "投稿を報告"
#: src/view/com/util/post-ctrls/RepostButton.web.tsx:48
msgid "Repost"
-msgstr "再投稿"
+msgstr "リポスト"
#: src/view/com/util/post-ctrls/RepostButton.web.tsx:94
#: src/view/com/util/post-ctrls/RepostButton.web.tsx:105
msgid "Repost or quote post"
-msgstr "再投稿または引用投稿"
+msgstr "リポストまたは引用"
#: src/view/screens/PostRepostedBy.tsx:27
msgid "Reposted by"
-msgstr "再投稿者"
+msgstr "リポストした人"
#: src/view/com/modals/ChangeEmail.tsx:181
#: src/view/com/modals/ChangeEmail.tsx:183
@@ -1689,7 +1716,7 @@ msgstr "コードをリセット"
#: src/view/screens/Settings.tsx:686
msgid "Reset onboarding state"
-msgstr "オンボード状態をリセット"
+msgstr "オンボーディングの状態をリセット"
#: src/view/com/auth/login/ForgotPasswordForm.tsx:98
msgid "Reset password"
@@ -1701,11 +1728,11 @@ msgstr "設定をリセット"
#: src/view/screens/Settings.tsx:684
msgid "Resets the onboarding state"
-msgstr "オンボード状態をリセット"
+msgstr "オンボーディングの状態をリセット"
#: src/view/screens/Settings.tsx:674
msgid "Resets the preferences state"
-msgstr "設定状態をリセット"
+msgstr "設定の状態をリセット"
#: src/view/com/auth/create/CreateAccount.tsx:167
#: src/view/com/auth/create/CreateAccount.tsx:171
@@ -1744,14 +1771,14 @@ msgstr "画像の切り抜きを保存"
#: src/view/screens/SavedFeeds.tsx:122
msgid "Saved Feeds"
-msgstr "保存済みフィード"
+msgstr "保存されたフィード"
#: src/view/com/modals/ListAddRemoveUsers.tsx:75
#: src/view/com/util/forms/SearchInput.tsx:64
-#: src/view/screens/Search/Search.tsx:381
-#: src/view/screens/Search/Search.tsx:533
-#: src/view/shell/bottom-bar/BottomBar.tsx:138
-#: src/view/shell/desktop/LeftNav.tsx:315
+#: src/view/screens/Search/Search.tsx:401
+#: src/view/screens/Search/Search.tsx:567
+#: src/view/shell/bottom-bar/BottomBar.tsx:159
+#: src/view/shell/desktop/LeftNav.tsx:321
#: src/view/shell/desktop/Search.tsx:161
#: src/view/shell/desktop/Search.tsx:170
#: src/view/shell/Drawer.tsx:343
@@ -1760,14 +1787,14 @@ msgid "Search"
msgstr "検索"
#: src/view/screens/Search/Search.tsx:390
-msgid "Search for posts and users."
-msgstr "投稿とユーザーを検索します。"
+#~ msgid "Search for posts and users."
+#~ msgstr "投稿とユーザーを検索します。"
#: src/view/com/modals/ChangeEmail.tsx:110
msgid "Security Step Required"
-msgstr "必要なセキュリティ手順"
+msgstr "必要なセキュリティの手順"
-#: src/view/com/auth/SplashScreen.tsx:29
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:39
msgid "See what's next"
msgstr "次を見る"
@@ -1785,11 +1812,11 @@ msgstr "サービスを選択"
#: src/view/screens/LanguageSettings.tsx:281
msgid "Select which languages you want your subscribed feeds to include. If none are selected, all languages will be shown."
-msgstr "登録済みフィードに含める言語を選択します。選択されていない場合は、すべての言語が表示されます。"
+msgstr "登録されたフィードに含める言語を選択します。選択されていない場合は、すべての言語が表示されます。"
#: src/view/screens/LanguageSettings.tsx:98
msgid "Select your app language for the default text to display in the app"
-msgstr "アプリに表示するデフォルトのテキストのアプリ言語を選択する"
+msgstr "アプリに表示されるデフォルトのテキストの言語を選択"
#: src/view/screens/LanguageSettings.tsx:190
msgid "Select your preferred language for translations in your feed."
@@ -1797,15 +1824,15 @@ msgstr "フィード内の翻訳に使用する言語を選択します。"
#: src/view/com/modals/VerifyEmail.tsx:196
msgid "Send Confirmation Email"
-msgstr "確認Eメールを送信"
+msgstr "確認のメールを送信"
#: src/view/com/modals/DeleteAccount.tsx:127
msgid "Send email"
-msgstr "Eメールを送信"
+msgstr "メールを送信"
#: src/view/com/modals/DeleteAccount.tsx:138
msgid "Send Email"
-msgstr "Eメールを送信"
+msgstr "メールを送信"
#: src/view/shell/Drawer.tsx:276
#: src/view/shell/Drawer.tsx:297
@@ -1814,7 +1841,7 @@ msgstr "フィードバックを送信"
#: src/view/com/modals/report/SendReportButton.tsx:45
msgid "Send Report"
-msgstr "レポートを送信"
+msgstr "報告を送信"
#: src/view/com/auth/login/SetNewPasswordForm.tsx:78
msgid "Set new password"
@@ -1822,7 +1849,7 @@ msgstr "新しいパスワードを設定"
#: src/view/screens/PreferencesHomeFeed.tsx:216
msgid "Set this setting to \"No\" to hide all quote posts from your feed. Reposts will still be visible."
-msgstr "フィードから全ての引用投稿を非表示にするには、この設定を「いいえ」にします。再投稿は引き続き表示されます。"
+msgstr "フィードから全ての引用を非表示にするには、この設定を「いいえ」にします。リポストは引き続き表示されます。"
#: src/view/screens/PreferencesHomeFeed.tsx:113
msgid "Set this setting to \"No\" to hide all replies from your feed."
@@ -1830,7 +1857,7 @@ msgstr "フィードから全ての返信を非表示にするには、この設
#: src/view/screens/PreferencesHomeFeed.tsx:182
msgid "Set this setting to \"No\" to hide all reposts from your feed."
-msgstr "フィードから全ての再投稿を非表示にするには、この設定を「いいえ」にします。"
+msgstr "フィードから全てのリポストを非表示にするには、この設定を「いいえ」にします。"
#: src/view/screens/PreferencesThreads.tsx:116
msgid "Set this setting to \"Yes\" to show replies in a threaded view. This is an experimental feature."
@@ -1838,10 +1865,10 @@ msgstr "スレッド表示で返信を表示するには、この設定を「は
#: src/view/screens/PreferencesHomeFeed.tsx:252
msgid "Set this setting to \"Yes\" to show samples of your saved feeds in your following feed. This is an experimental feature."
-msgstr "保存したフィードのサンプルを次のフィードに表示するには、この設定を「はい」にします。これは実験的な機能です。"
+msgstr "保存されたフィードのサンプルを次のフィードに表示するには、この設定を「はい」にします。これは実験的な機能です。"
#: src/view/screens/Settings.tsx:277
-#: src/view/shell/desktop/LeftNav.tsx:427
+#: src/view/shell/desktop/LeftNav.tsx:430
#: src/view/shell/Drawer.tsx:546
#: src/view/shell/Drawer.tsx:547
msgid "Settings"
@@ -1849,23 +1876,24 @@ msgstr "設定"
#: src/view/com/modals/SelfLabel.tsx:125
msgid "Sexual activity or erotic nudity."
-msgstr "性行為またはエロティックなヌード。"
+msgstr "性的行為または性的なヌード。"
#: src/view/com/profile/ProfileHeader.tsx:338
#: src/view/com/util/forms/PostDropdownBtn.tsx:129
-#: src/view/screens/ProfileList.tsx:407
+#: src/view/screens/ProfileList.tsx:384
msgid "Share"
msgstr "共有"
-#: src/view/screens/ProfileFeed.tsx:312
+#: src/view/screens/ProfileFeed.tsx:302
msgid "Share feed"
msgstr "フィードを共有"
+#: src/view/com/util/moderation/ContentHider.tsx:105
#: src/view/screens/Settings.tsx:316
msgid "Show"
msgstr "表示"
-#: src/view/com/util/moderation/ScreenHider.tsx:114
+#: src/view/com/util/moderation/ScreenHider.tsx:132
msgid "Show anyway"
msgstr "とにかく表示"
@@ -1875,7 +1903,7 @@ msgstr "マイフィードからの投稿を表示"
#: src/view/screens/PreferencesHomeFeed.tsx:213
msgid "Show Quote Posts"
-msgstr "引用投稿を表示"
+msgstr "引用を表示"
#: src/view/screens/PreferencesHomeFeed.tsx:110
msgid "Show Replies"
@@ -1887,21 +1915,29 @@ msgstr "他のすべての返信の前に、フォローしている人からの
#: src/view/screens/PreferencesHomeFeed.tsx:179
msgid "Show Reposts"
-msgstr "再投稿を表示"
+msgstr "リポストを表示"
#: src/view/com/notifications/FeedItem.tsx:337
msgid "Show users"
msgstr "ユーザーを表示"
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:70
#: src/view/com/auth/login/Login.tsx:98
-#: src/view/com/auth/SplashScreen.tsx:49
-#: src/view/shell/NavSignupCard.tsx:52
-#: src/view/shell/NavSignupCard.tsx:53
+#: src/view/com/auth/SplashScreen.tsx:54
+#: src/view/shell/bottom-bar/BottomBar.tsx:285
+#: src/view/shell/bottom-bar/BottomBar.tsx:286
+#: src/view/shell/bottom-bar/BottomBar.tsx:288
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:177
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:178
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:180
+#: src/view/shell/NavSignupCard.tsx:58
+#: src/view/shell/NavSignupCard.tsx:59
msgid "Sign in"
msgstr "サインイン"
-#: src/view/com/auth/SplashScreen.tsx:52
-#: src/view/com/auth/SplashScreen.web.tsx:84
+#: src/view/com/auth/HomeLoggedOutCTA.tsx:78
+#: src/view/com/auth/SplashScreen.tsx:57
+#: src/view/com/auth/SplashScreen.web.tsx:87
msgid "Sign In"
msgstr "サインイン"
@@ -1912,7 +1948,7 @@ msgstr "{0}としてサインイン"
#: src/view/com/auth/login/ChooseAccountForm.tsx:118
#: src/view/com/auth/login/Login.tsx:116
msgid "Sign in as..."
-msgstr "...としてサインイン"
+msgstr "アカウントの選択"
#: src/view/com/auth/login/LoginForm.tsx:130
msgid "Sign into"
@@ -1923,15 +1959,25 @@ msgstr "サインイン"
msgid "Sign out"
msgstr "サインアウト"
-#: src/view/shell/NavSignupCard.tsx:43
-#: src/view/shell/NavSignupCard.tsx:44
-#: src/view/shell/NavSignupCard.tsx:46
+#: src/view/shell/bottom-bar/BottomBar.tsx:275
+#: src/view/shell/bottom-bar/BottomBar.tsx:276
+#: src/view/shell/bottom-bar/BottomBar.tsx:278
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:167
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:168
+#: src/view/shell/bottom-bar/BottomBarWeb.tsx:170
+#: src/view/shell/NavSignupCard.tsx:49
+#: src/view/shell/NavSignupCard.tsx:50
+#: src/view/shell/NavSignupCard.tsx:52
msgid "Sign up"
msgstr "サインアップ"
-#: src/view/shell/NavSignupCard.tsx:36
+#: src/view/shell/NavSignupCard.tsx:42
msgid "Sign up or sign in to join the conversation"
-msgstr "登録またはログインして会話に参加する"
+msgstr "登録またはログインして会話に参加"
+
+#: src/view/com/util/moderation/ScreenHider.tsx:76
+msgid "Sign-in Required"
+msgstr "サインインが必要"
#: src/view/screens/Settings.tsx:327
msgid "Signed in as"
@@ -1968,19 +2014,19 @@ msgstr "ストーリーブック"
#: src/view/com/modals/AppealLabel.tsx:101
msgid "Submit"
-msgstr ""
+msgstr "送信"
-#: src/view/screens/ProfileList.tsx:597
+#: src/view/screens/ProfileList.tsx:574
msgid "Subscribe"
msgstr "登録"
-#: src/view/screens/ProfileList.tsx:593
+#: src/view/screens/ProfileList.tsx:570
msgid "Subscribe to this list"
msgstr "このリストに登録"
-#: src/view/screens/Search/Search.tsx:354
+#: src/view/screens/Search/Search.tsx:357
msgid "Suggested Follows"
-msgstr "推奨されるフォロー"
+msgstr "おすすめのフォロー"
#: src/view/screens/Support.tsx:30
#: src/view/screens/Support.tsx:33
@@ -2010,35 +2056,35 @@ msgstr "利用規約"
#: src/view/com/modals/AppealLabel.tsx:70
#: src/view/com/modals/report/InputIssueDetails.tsx:50
msgid "Text input field"
-msgstr "テキスト入力フィールド"
+msgstr "テキストの入力フィールド"
#: src/view/com/profile/ProfileHeader.tsx:306
msgid "The account will be able to interact with you after unblocking."
-msgstr "このアカウントは、ブロック解除後にお客様とやり取りすることができます。"
+msgstr "このアカウントは、ブロック解除後にあなたとやり取りすることができます。"
#: src/view/screens/CommunityGuidelines.tsx:36
msgid "The Community Guidelines have been moved to <0/>"
-msgstr "コミュニティ ガイドラインが<0/>に移動された"
+msgstr "コミュニティガイドラインは<0/>に移動されました"
#: src/view/screens/CopyrightPolicy.tsx:33
msgid "The Copyright Policy has been moved to <0/>"
-msgstr "著作権ポリシーが<0/>に移動された"
+msgstr "著作権ポリシーが<0/>に移動されました"
-#: src/view/com/post-thread/PostThread.tsx:437
+#: src/view/com/post-thread/PostThread.tsx:440
msgid "The post may have been deleted."
msgstr "投稿が削除された可能性があります。"
#: src/view/screens/PrivacyPolicy.tsx:33
msgid "The Privacy Policy has been moved to <0/>"
-msgstr "プライバシーポリシーが<0/>に移動された"
+msgstr "プライバシーポリシーが<0/>に移動されました"
#: src/view/screens/Support.tsx:36
msgid "The support form has been moved. If you need help, please<0/> or visit {HELP_DESK_URL} to get in touch with us."
-msgstr "サポートフォームが移動しました。サポートが必要な場合は、<0/>または\\{HELP_DESK_URL}にアクセスしてご連絡ください。"
+msgstr "サポートフォームが移動しました。サポートが必要な場合は、<0/>または{HELP_DESK_URL}にアクセスしてご連絡ください。"
#: src/view/screens/TermsOfService.tsx:33
msgid "The Terms of Service have been moved to"
-msgstr "サービス規約が移動された"
+msgstr "サービス規約が移動されました"
#: src/view/com/util/ErrorBoundary.tsx:35
msgid "There was an unexpected issue in the application. Please let us know if this happened to you!"
@@ -2046,19 +2092,23 @@ msgstr "アプリケーションに予期しない問題が発生しました。
#: src/view/com/util/moderation/LabelInfo.tsx:45
msgid "This {0} has been labeled."
-msgstr ""
+msgstr "この{0}にはラベルが貼られています"
-#: src/view/com/util/moderation/ScreenHider.tsx:72
+#: src/view/com/util/moderation/ScreenHider.tsx:88
msgid "This {screenDescription} has been flagged:"
-msgstr "この\\{screenDescription}にはフラグが設定されています。"
+msgstr "この{screenDescription}にはフラグが設定されています:"
+
+#: src/view/com/util/moderation/ScreenHider.tsx:83
+msgid "This account has requested that users sign in to view their profile."
+msgstr "このアカウントを閲覧するためにはサインインが必要です。"
#: src/view/com/posts/FeedErrorMessage.tsx:107
msgid "This content is not viewable without a Bluesky account."
-msgstr ""
+msgstr "このコンテンツはBlueskyのアカウントがないと閲覧できません。"
#: src/view/com/posts/FeedErrorMessage.tsx:113
msgid "This feed is currently receiving high traffic and is temporarily unavailable. Please try again later."
-msgstr ""
+msgstr "現在このフィードにはアクセスが集中しており、一時的にご利用いただけません。時間をおいてもう一度お試しください。"
#: src/view/com/modals/BirthDateSettings.tsx:61
msgid "This information is not shared with other users."
@@ -2066,7 +2116,7 @@ msgstr "この情報は他のユーザーと共有されません。"
#: src/view/com/modals/VerifyEmail.tsx:113
msgid "This is important in case you ever need to change your email or reset your password."
-msgstr "これは、Eメールの変更やパスワードのリセットが必要な場合に重要です。"
+msgstr "これは、メールアドレスの変更やパスワードのリセットが必要な場合に重要です。"
#: src/view/com/auth/create/Step1.tsx:55
msgid "This is the service that keeps you online."
@@ -2095,7 +2145,7 @@ msgstr "スレッドモード"
#: src/view/com/util/forms/DropdownButton.tsx:230
msgid "Toggle dropdown"
-msgstr "トグルドロップダウン"
+msgstr "ドロップダウンをトグル"
#: src/view/com/modals/EditImage.tsx:271
msgid "Transformations"
@@ -2111,33 +2161,33 @@ msgstr "翻訳"
msgid "Try again"
msgstr "再試行"
-#: src/view/screens/ProfileList.tsx:495
+#: src/view/screens/ProfileList.tsx:472
msgid "Un-block list"
-msgstr ""
+msgstr "リストでのブロックを解除"
-#: src/view/screens/ProfileList.tsx:480
+#: src/view/screens/ProfileList.tsx:457
msgid "Un-mute list"
-msgstr ""
+msgstr "リストでのミュートを解除"
#: src/view/com/auth/create/CreateAccount.tsx:64
#: src/view/com/auth/login/Login.tsx:76
#: src/view/com/auth/login/LoginForm.tsx:117
msgid "Unable to contact your service. Please check your Internet connection."
-msgstr "サービスに接続できません。インターネット接続を確認してください。"
+msgstr "あなたのサービスに接続できません。インターネットの接続を確認してください。"
#: src/view/com/profile/ProfileHeader.tsx:466
#: src/view/com/profile/ProfileHeader.tsx:469
msgid "Unblock"
-msgstr "ブロック解除"
+msgstr "ブロックを解除"
#: src/view/com/profile/ProfileHeader.tsx:304
#: src/view/com/profile/ProfileHeader.tsx:388
msgid "Unblock Account"
-msgstr "アカウントのブロック解除"
+msgstr "アカウントのブロックを解除"
#: src/view/com/util/post-ctrls/RepostButton.web.tsx:48
msgid "Undo repost"
-msgstr "再投稿を元に戻す"
+msgstr "リポストを元に戻す"
#: src/view/com/auth/create/state.ts:210
msgid "Unfortunately, you do not meet the requirements to create an account."
@@ -2145,19 +2195,19 @@ msgstr "残念ながら、アカウントを作成するための要件を満た
#: src/view/com/profile/ProfileHeader.tsx:369
msgid "Unmute Account"
-msgstr "アカウントのミュート解除"
+msgstr "アカウントのミュートを解除"
#: src/view/com/util/forms/PostDropdownBtn.tsx:147
msgid "Unmute thread"
-msgstr "スレッドのミュート解除"
+msgstr "スレッドのミュートを解除"
-#: src/view/screens/ProfileList.tsx:463
+#: src/view/screens/ProfileList.tsx:440
msgid "Unpin moderation list"
-msgstr ""
+msgstr "モデレーションリストのピン留めを解除"
#: src/view/com/modals/UserAddRemoveLists.tsx:54
msgid "Update {displayName} in Lists"
-msgstr "リストの\\{displayName}を更新"
+msgstr "リストの{displayName}を更新"
#: src/lib/hooks/useOTAUpdate.ts:15
msgid "Update Available"
@@ -2198,36 +2248,36 @@ msgstr "ユーザーリスト"
#: src/view/com/auth/login/LoginForm.tsx:170
#: src/view/com/auth/login/LoginForm.tsx:187
msgid "Username or email address"
-msgstr "ユーザー名またはEメールアドレス"
+msgstr "ユーザー名またはメールアドレス"
-#: src/view/screens/ProfileList.tsx:767
+#: src/view/screens/ProfileList.tsx:738
msgid "Users"
msgstr "ユーザー"
#: src/view/com/threadgate/WhoCanReply.tsx:143
msgid "users followed by <0/>"
-msgstr ""
+msgstr "<0/>にフォローされているユーザー"
#: src/view/com/modals/Threadgate.tsx:106
msgid "Users in \"{0}\""
-msgstr ""
+msgstr "{0}のユーザー"
#: src/view/screens/Settings.tsx:750
msgid "Verify email"
-msgstr "Eメールを確認"
+msgstr "メールアドレスを確認"
#: src/view/screens/Settings.tsx:775
msgid "Verify my email"
-msgstr "Eメールを確認"
+msgstr "メールアドレスを確認"
#: src/view/screens/Settings.tsx:784
msgid "Verify My Email"
-msgstr "Eメールを確認"
+msgstr "メールアドレスを確認"
#: src/view/com/modals/ChangeEmail.tsx:205
#: src/view/com/modals/ChangeEmail.tsx:207
msgid "Verify New Email"
-msgstr "新しいEメールを確認"
+msgstr "新しいメールアドレスを確認"
#: src/view/screens/Log.tsx:52
msgid "View debug entry"
@@ -2243,15 +2293,15 @@ msgstr "サイトへアクセス"
#: src/view/com/auth/create/CreateAccount.tsx:125
msgid "We're so excited to have you join us!"
-msgstr "あなたが参加してくれることをとても楽しみにしています!"
+msgstr "私たちはあなたが参加してくれることをとても楽しみにしています!"
-#: src/view/screens/Search/Search.tsx:237
+#: src/view/screens/Search/Search.tsx:238
msgid "We're sorry, but your search could not be completed. Please try again in a few minutes."
-msgstr "申し訳ありませんが、検索を完了できませんでした。数分後に再試行してください。"
+msgstr "大変申し訳ありませんが、検索を完了できませんでした。数分後に再試行してください。"
#: src/view/screens/NotFound.tsx:48
msgid "We're sorry! We can't find the page you were looking for."
-msgstr "申し訳ありません! お探しのページが見つかりません。"
+msgstr "大変申し訳ありません!お探しのページが見つかりません。"
#: src/view/com/auth/onboarding/WelcomeMobile.tsx:46
msgid "Welcome to <0>Bluesky0>"
@@ -2259,7 +2309,11 @@ msgstr "<0>Bluesky0>へようこそ"
#: src/view/com/modals/report/Modal.tsx:169
msgid "What is the issue with this {collectionName}?"
-msgstr "この\\{collectionName}の問題は何ですか?"
+msgstr "この{collectionName}の問題は何ですか?"
+
+#: src/view/com/auth/SplashScreen.tsx:34
+msgid "What's up?"
+msgstr "最近どう?"
#: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:78
msgid "Which languages are used in this post?"
@@ -2267,18 +2321,18 @@ msgstr "この投稿ではどの言語が使われていますか?"
#: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:77
msgid "Which languages would you like to see in your algorithmic feeds?"
-msgstr "アルゴリズムフィードに表示する言語を選択しますか?"
+msgstr "アルゴリズムによるフィードにはどの言語を使用しますか?"
#: src/view/com/composer/threadgate/ThreadgateBtn.tsx:47
#: src/view/com/modals/Threadgate.tsx:66
msgid "Who can reply"
-msgstr ""
+msgstr "返信できる人"
#: src/view/com/modals/crop-image/CropImage.web.tsx:102
msgid "Wide"
msgstr "ワイド"
-#: src/view/com/composer/Composer.tsx:403
+#: src/view/com/composer/Composer.tsx:409
msgid "Write post"
msgstr "投稿を書く"
@@ -2307,7 +2361,7 @@ msgstr "まだ招待コードがありません!Blueskyをもうしばらく
#: src/view/screens/SavedFeeds.tsx:102
msgid "You don't have any pinned feeds."
-msgstr "ピンで固定されたフィードがありません。"
+msgstr "ピン留めされたフィードがありません。"
#: src/view/screens/Feeds.tsx:383
msgid "You don't have any saved feeds!"
@@ -2317,26 +2371,26 @@ msgstr "保存されたフィードがありません!"
msgid "You don't have any saved feeds."
msgstr "保存されたフィードがありません。"
-#: src/view/com/post-thread/PostThread.tsx:385
+#: src/view/com/post-thread/PostThread.tsx:388
msgid "You have blocked the author or you have been blocked by the author."
-msgstr "著者をブロックしたか、または著者によってブロックされました。"
+msgstr "あなたが著者をブロックしているか、または著者によってあなたはブロックされています。"
-#: src/view/com/feeds/ProfileFeedgens.tsx:154
+#: src/view/com/feeds/ProfileFeedgens.tsx:141
msgid "You have no feeds."
-msgstr ""
+msgstr "フィードがありません。"
#: src/view/com/lists/MyLists.tsx:89
-#: src/view/com/lists/ProfileLists.tsx:158
+#: src/view/com/lists/ProfileLists.tsx:145
msgid "You have no lists."
msgstr "リストがありません。"
#: src/view/screens/ModerationBlockedAccounts.tsx:131
msgid "You have not blocked any accounts yet. To block an account, go to their profile and selected \"Block account\" from the menu on their account."
-msgstr "ブロックしているアカウントはまだありません。アカウントをブロックするには、ユーザーのプロフィールに移動し、アカウントメニューから「アカウントをブロック」を選択します。"
+msgstr "ブロック中のアカウントはまだありません。アカウントをブロックするには、ユーザーのプロフィールに移動し、アカウントメニューから「アカウントをブロック」を選択します。"
#: src/view/screens/AppPasswords.tsx:86
msgid "You have not created any app passwords yet. You can create one by pressing the button below."
-msgstr "アプリパスワードはまだ作成されていません。 下のボタンを押すと作成できます。"
+msgstr "アプリパスワードはまだ作成されていません。下のボタンを押すと作成できます。"
#: src/view/screens/ModerationMutedAccounts.tsx:130
msgid "You have not muted any accounts yet. To mute an account, go to their profile and selected \"Mute account\" from the menu on their account."
@@ -2344,11 +2398,11 @@ msgstr "ミュートしているアカウントはまだありません。アカ
#: src/view/com/auth/login/SetNewPasswordForm.tsx:81
msgid "You will receive an email with a \"reset code.\" Enter that code here, then enter your new password."
-msgstr "「リセットコード」が記載されたEメールが届きます。ここにコードを入力し、新しいパスワードを入力します。"
+msgstr "「リセットコード」が記載されたメールが届きます。ここにコードを入力し、新しいパスワードを入力します。"
#: src/view/com/auth/create/Step2.tsx:43
msgid "Your account"
-msgstr "アカウント"
+msgstr "あなたのアカウント"
#: src/view/com/auth/create/Step2.tsx:122
msgid "Your birth date"
@@ -2356,19 +2410,19 @@ msgstr "生年月日"
#: src/view/com/auth/create/state.ts:102
msgid "Your email appears to be invalid."
-msgstr "Eメールが無効なようです。"
+msgstr "メールアドレスが無効なようです。"
#: src/view/com/modals/Waitlist.tsx:107
msgid "Your email has been saved! We'll be in touch soon."
-msgstr "Eメールが保存されました!すぐにご連絡いたします。"
+msgstr "メールアドレスが保存されました!すぐにご連絡いたします。"
#: src/view/com/modals/ChangeEmail.tsx:125
msgid "Your email has been updated but not verified. As a next step, please verify your new email."
-msgstr "Eメールは更新されましたが、確認されていません。次のステップとして、新しいEメールを確認してください。"
+msgstr "メールアドレスは更新されましたが、確認されていません。次のステップとして、新しいEメールを確認してください。"
#: src/view/com/modals/VerifyEmail.tsx:108
msgid "Your email has not yet been verified. This is an important security step which we recommend."
-msgstr "Eメールはまだ確認されていません。これは、当社が推奨する重要なセキュリティステップです。"
+msgstr "メールアドレスはまだ確認されていません。これは、当社が推奨する重要なセキュリティステップです。"
#: src/view/com/auth/create/Step3.tsx:42
#: src/view/com/modals/ChangeHandle.tsx:270
@@ -2383,20 +2437,20 @@ msgstr "ホスティングプロバイダー"
#: src/view/shell/desktop/RightNav.tsx:129
#: src/view/shell/Drawer.tsx:636
msgid "Your invite codes are hidden when logged in using an App Password"
-msgstr ""
+msgstr "アプリパスワードを使用してログインすると、招待コードは非表示になります。"
#: src/view/com/auth/onboarding/WelcomeMobile.tsx:59
msgid "Your posts, likes, and blocks are public. Mutes are private."
-msgstr "投稿、いいね、ブロックは公開されます。ミュートはプライベートです。"
+msgstr "投稿、いいね、ブロックは公開されます。ミュートは非公開です。"
#: src/view/com/modals/SwitchAccount.tsx:82
msgid "Your profile"
-msgstr "プロフィール"
+msgstr "あなたのプロフィール"
#: src/view/screens/Moderation.tsx:220
#~ msgid "Your profile and posts will not be visible to people visiting the Bluesky app or website without having an account and being logged in."
-#~ msgstr ""
+#~ msgstr "あなたのプロフィールと投稿は、アカウントを持っておらずログインしていない状態でBlueskyのアプリまたはウェブサイトを訪問する人々には表示されません。"
#: src/view/com/auth/create/Step3.tsx:28
msgid "Your user handle"
-msgstr "ユーザーハンドル"
+msgstr "あなたのユーザーハンドル"
diff --git a/src/state/queries/actor-autocomplete.ts b/src/state/queries/actor-autocomplete.ts
index fbd1b38f9d..fe207371d0 100644
--- a/src/state/queries/actor-autocomplete.ts
+++ b/src/state/queries/actor-autocomplete.ts
@@ -1,16 +1,27 @@
import React from 'react'
-import {AppBskyActorDefs} from '@atproto/api'
+import {AppBskyActorDefs, ModerationOpts, moderateProfile} from '@atproto/api'
import {useQuery, useQueryClient} from '@tanstack/react-query'
import {logger} from '#/logger'
import {getAgent} from '#/state/session'
import {useMyFollowsQuery} from '#/state/queries/my-follows'
import {STALE} from '#/state/queries'
+import {
+ DEFAULT_LOGGED_OUT_PREFERENCES,
+ getModerationOpts,
+ useModerationOpts,
+} from './preferences'
+
+const DEFAULT_MOD_OPTS = getModerationOpts({
+ userDid: '',
+ preferences: DEFAULT_LOGGED_OUT_PREFERENCES,
+})
export const RQKEY = (prefix: string) => ['actor-autocomplete', prefix]
export function useActorAutocompleteQuery(prefix: string) {
const {data: follows, isFetching} = useMyFollowsQuery()
+ const moderationOpts = useModerationOpts()
return useQuery({
staleTime: STALE.MINUTES.ONE,
@@ -22,9 +33,20 @@ export function useActorAutocompleteQuery(prefix: string) {
limit: 8,
})
: undefined
- return computeSuggestions(prefix, follows, res?.data.actors)
+ return res?.data.actors || []
},
enabled: !isFetching,
+ select: React.useCallback(
+ (data: AppBskyActorDefs.ProfileViewBasic[]) => {
+ return computeSuggestions(
+ prefix,
+ follows,
+ data,
+ moderationOpts || DEFAULT_MOD_OPTS,
+ )
+ },
+ [prefix, follows, moderationOpts],
+ ),
})
}
@@ -32,6 +54,7 @@ export type ActorAutocompleteFn = ReturnType
export function useActorAutocompleteFn() {
const queryClient = useQueryClient()
const {data: follows} = useMyFollowsQuery()
+ const moderationOpts = useModerationOpts()
return React.useCallback(
async ({query, limit = 8}: {query: string; limit?: number}) => {
@@ -54,9 +77,14 @@ export function useActorAutocompleteFn() {
}
}
- return computeSuggestions(query, follows, res?.data.actors)
+ return computeSuggestions(
+ query,
+ follows,
+ res?.data.actors,
+ moderationOpts || DEFAULT_MOD_OPTS,
+ )
},
- [follows, queryClient],
+ [follows, queryClient, moderationOpts],
)
}
@@ -64,6 +92,7 @@ function computeSuggestions(
prefix: string,
follows: AppBskyActorDefs.ProfileViewBasic[] | undefined,
searched: AppBskyActorDefs.ProfileViewBasic[] = [],
+ moderationOpts: ModerationOpts,
) {
let items: AppBskyActorDefs.ProfileViewBasic[] = []
if (follows) {
@@ -76,10 +105,14 @@ function computeSuggestions(
handle: item.handle,
displayName: item.displayName,
avatar: item.avatar,
+ labels: item.labels,
})
}
}
- return items
+ return items.filter(profile => {
+ const mod = moderateProfile(profile, moderationOpts)
+ return !mod.account.filter
+ })
}
function prefixMatch(
diff --git a/src/state/queries/feed.ts b/src/state/queries/feed.ts
index e431643e71..c9d81bc170 100644
--- a/src/state/queries/feed.ts
+++ b/src/state/queries/feed.ts
@@ -161,51 +161,6 @@ export function useFeedSourceInfoQuery({uri}: {uri: string}) {
})
}
-export const isFeedPublicQueryKey = ({uri}: {uri: string}) => [
- 'isFeedPublic',
- uri,
-]
-
-export function useIsFeedPublicQuery({uri}: {uri: string}) {
- return useQuery({
- queryKey: isFeedPublicQueryKey({uri}),
- queryFn: async ({queryKey}) => {
- const [, uri] = queryKey
- try {
- const res = await getAgent().app.bsky.feed.getFeed({
- feed: uri,
- limit: 1,
- })
- return {
- isPublic: Boolean(res.data.feed),
- error: undefined,
- }
- } catch (e: any) {
- /**
- * This should be an `XRPCError`, but I can't safely import from
- * `@atproto/xrpc` due to a depdency on node's `crypto` module.
- *
- * @see https://github.com/bluesky-social/atproto/blob/c17971a2d8e424cc7f10c071d97c07c08aa319cf/packages/xrpc/src/client.ts#L126
- */
- if (e?.status === 401) {
- return {
- isPublic: false,
- error: e,
- }
- }
-
- /*
- * Non-401 response means something else went wrong on the server
- */
- return {
- isPublic: true,
- error: e,
- }
- }
- },
- })
-}
-
export const useGetPopularFeedsQueryKey = ['getPopularFeeds']
export function useGetPopularFeedsQuery() {
diff --git a/src/state/queries/notifications/feed.ts b/src/state/queries/notifications/feed.ts
index dc206df79a..d652f493df 100644
--- a/src/state/queries/notifications/feed.ts
+++ b/src/state/queries/notifications/feed.ts
@@ -16,7 +16,7 @@
* 3. Don't call this query's `refetch()` if you're trying to sync latest; call `checkUnread()` instead.
*/
-import {useEffect} from 'react'
+import {useEffect, useRef} from 'react'
import {AppBskyFeedDefs} from '@atproto/api'
import {
useInfiniteQuery,
@@ -49,6 +49,7 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) {
const threadMutes = useMutedThreads()
const unreads = useUnreadNotificationsApi()
const enabled = opts?.enabled !== false
+ const lastPageCountRef = useRef(0)
const query = useInfiniteQuery<
FeedPage,
@@ -104,24 +105,26 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) {
useEffect(() => {
const {isFetching, hasNextPage, data} = query
-
- let count = 0
- let numEmpties = 0
- for (const page of data?.pages || []) {
- if (!page.items.length) {
- numEmpties++
- }
- count += page.items.length
+ if (isFetching || !hasNextPage) {
+ return
}
+ // avoid double-fires of fetchNextPage()
if (
- !isFetching &&
- hasNextPage &&
- count < PAGE_SIZE &&
- numEmpties < 3 &&
- (data?.pages.length || 0) < 6
+ lastPageCountRef.current !== 0 &&
+ lastPageCountRef.current === data?.pages?.length
) {
+ return
+ }
+
+ // fetch next page if we haven't gotten a full page of content
+ let count = 0
+ for (const page of data?.pages || []) {
+ count += page.items.length
+ }
+ if (count < PAGE_SIZE && (data?.pages.length || 0) < 6) {
query.fetchNextPage()
+ lastPageCountRef.current = data?.pages?.length || 0
}
}, [query])
diff --git a/src/state/queries/post-feed.ts b/src/state/queries/post-feed.ts
index efdb42dd2b..b91af372f0 100644
--- a/src/state/queries/post-feed.ts
+++ b/src/state/queries/post-feed.ts
@@ -1,4 +1,4 @@
-import React, {useCallback, useEffect} from 'react'
+import React, {useCallback, useEffect, useRef} from 'react'
import {
AppBskyFeedDefs,
AppBskyFeedPost,
@@ -78,6 +78,7 @@ export interface FeedPageUnselected {
api: FeedAPI
cursor: string | undefined
feed: AppBskyFeedDefs.FeedViewPost[]
+ fetchedAt: number
}
export interface FeedPage {
@@ -85,6 +86,7 @@ export interface FeedPage {
tuner: FeedTuner | NoopFeedTuner
cursor: string | undefined
slices: FeedPostSlice[]
+ fetchedAt: number
}
const PAGE_SIZE = 30
@@ -98,11 +100,12 @@ export function usePostFeedQuery(
const feedTuners = useFeedTuners(feedDesc)
const moderationOpts = useModerationOpts()
const enabled = opts?.enabled !== false && Boolean(moderationOpts)
- const lastRun = React.useRef<{
+ const lastRun = useRef<{
data: InfiniteData
args: typeof selectArgs
result: InfiniteData
} | null>(null)
+ const lastPageCountRef = useRef(0)
// Make sure this doesn't invalidate unless really needed.
const selectArgs = React.useMemo(
@@ -152,6 +155,7 @@ export function usePostFeedQuery(
api,
cursor: res.cursor,
feed: res.feed,
+ fetchedAt: Date.now(),
}
},
initialPageParam: undefined,
@@ -214,6 +218,7 @@ export function usePostFeedQuery(
api: page.api,
tuner,
cursor: page.cursor,
+ fetchedAt: page.fetchedAt,
slices: tuner
.tune(page.feed)
.map(slice => {
@@ -279,26 +284,28 @@ export function usePostFeedQuery(
useEffect(() => {
const {isFetching, hasNextPage, data} = query
+ if (isFetching || !hasNextPage) {
+ return
+ }
+ // avoid double-fires of fetchNextPage()
+ if (
+ lastPageCountRef.current !== 0 &&
+ lastPageCountRef.current === data?.pages?.length
+ ) {
+ return
+ }
+
+ // fetch next page if we haven't gotten a full page of content
let count = 0
- let numEmpties = 0
for (const page of data?.pages || []) {
- if (page.slices.length === 0) {
- numEmpties++
- }
for (const slice of page.slices) {
count += slice.items.length
}
}
-
- if (
- !isFetching &&
- hasNextPage &&
- count < PAGE_SIZE &&
- numEmpties < 3 &&
- (data?.pages.length || 0) < 6
- ) {
+ if (count < PAGE_SIZE && (data?.pages.length || 0) < 6) {
query.fetchNextPage()
+ lastPageCountRef.current = data?.pages?.length || 0
}
}, [query])
@@ -409,6 +416,9 @@ export function* findAllPostsInQueryData(
}
function assertSomePostsPassModeration(feed: AppBskyFeedDefs.FeedViewPost[]) {
+ // no posts in this feed
+ if (feed.length === 0) return true
+
// assume false
let somePostsPassModeration = false
diff --git a/src/state/queries/profile.ts b/src/state/queries/profile.ts
index 5fd0b4e344..40ba0653c1 100644
--- a/src/state/queries/profile.ts
+++ b/src/state/queries/profile.ts
@@ -35,9 +35,7 @@ export function useProfileQuery({did}: {did: string | undefined}) {
// if you remove it, the UI infinite-loops
// -prf
staleTime: isCurrentAccount ? STALE.SECONDS.THIRTY : STALE.MINUTES.FIVE,
- refetchInterval: isCurrentAccount
- ? STALE.SECONDS.THIRTY
- : STALE.MINUTES.FIVE,
+ refetchInterval: STALE.MINUTES.FIVE,
queryKey: RQKEY(did || ''),
queryFn: async () => {
const res = await getAgent().getProfile({actor: did || ''})
diff --git a/src/state/shell/logged-out.tsx b/src/state/shell/logged-out.tsx
index a06a6d969f..8fe2a9c01f 100644
--- a/src/state/shell/logged-out.tsx
+++ b/src/state/shell/logged-out.tsx
@@ -22,7 +22,7 @@ type Controls = {
/**
* The did of the account to populate the login form with.
*/
- requestedAccount?: string
+ requestedAccount?: string | 'none' | 'new'
}) => void
/**
* Clears the requested account so that next time the logged out view is
diff --git a/src/view/com/auth/HomeLoggedOutCTA.tsx b/src/view/com/auth/HomeLoggedOutCTA.tsx
new file mode 100644
index 0000000000..32b873ac67
--- /dev/null
+++ b/src/view/com/auth/HomeLoggedOutCTA.tsx
@@ -0,0 +1,165 @@
+import React from 'react'
+import {StyleSheet, TouchableOpacity, View} from 'react-native'
+import {useLingui} from '@lingui/react'
+import {Trans, msg} from '@lingui/macro'
+import {ScrollView} from '../util/Views'
+import {Text} from '../util/text/Text'
+import {usePalette} from '#/lib/hooks/usePalette'
+import {colors, s} from '#/lib/styles'
+import {TextLink} from '../util/Link'
+import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries'
+import {useLoggedOutViewControls} from '#/state/shell/logged-out'
+
+export function HomeLoggedOutCTA() {
+ const pal = usePalette('default')
+ const {_} = useLingui()
+ const {isMobile} = useWebMediaQueries()
+ const {requestSwitchToAccount} = useLoggedOutViewControls()
+
+ const showCreateAccount = React.useCallback(() => {
+ requestSwitchToAccount({requestedAccount: 'new'})
+ }, [requestSwitchToAccount])
+
+ const showSignIn = React.useCallback(() => {
+ requestSwitchToAccount({requestedAccount: 'none'})
+ }, [requestSwitchToAccount])
+
+ return (
+
+
+
+ Bluesky
+
+
+ See what's next
+
+
+
+
+
+ Create a new account
+
+
+
+
+ Sign In
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+const styles = StyleSheet.create({
+ container: {
+ height: '100%',
+ },
+ hero: {
+ justifyContent: 'center',
+ paddingTop: 100,
+ paddingBottom: 30,
+ },
+ heroMobile: {
+ paddingBottom: 50,
+ },
+ title: {
+ textAlign: 'center',
+ fontSize: 68,
+ fontWeight: 'bold',
+ },
+ subtitle: {
+ textAlign: 'center',
+ fontSize: 48,
+ fontWeight: 'bold',
+ },
+ subtitleMobile: {
+ fontSize: 42,
+ },
+ btnsDesktop: {
+ flexDirection: 'row',
+ justifyContent: 'center',
+ gap: 20,
+ marginHorizontal: 20,
+ },
+ btn: {
+ borderRadius: 32,
+ width: 230,
+ paddingVertical: 12,
+ marginBottom: 20,
+ },
+ btnMobile: {
+ flex: 1,
+ width: 'auto',
+ marginHorizontal: 20,
+ paddingVertical: 16,
+ },
+ btnLabel: {
+ textAlign: 'center',
+ fontSize: 18,
+ },
+ btnLabelMobile: {
+ textAlign: 'center',
+ fontSize: 21,
+ },
+
+ footer: {
+ flexDirection: 'row',
+ gap: 20,
+ justifyContent: 'center',
+ },
+ footerLink: {},
+})
diff --git a/src/view/com/auth/LoggedOut.tsx b/src/view/com/auth/LoggedOut.tsx
index fcff4f7821..b0b2bf7edc 100644
--- a/src/view/com/auth/LoggedOut.tsx
+++ b/src/view/com/auth/LoggedOut.tsx
@@ -33,7 +33,9 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) {
const {requestedAccountSwitchTo} = useLoggedOutView()
const [screenState, setScreenState] = React.useState(
requestedAccountSwitchTo
- ? ScreenState.S_Login
+ ? requestedAccountSwitchTo === 'new'
+ ? ScreenState.S_CreateAccount
+ : ScreenState.S_Login
: ScreenState.S_LoginOrCreateAccount,
)
const {isMobile} = useWebMediaQueries()
diff --git a/src/view/com/auth/SplashScreen.tsx b/src/view/com/auth/SplashScreen.tsx
index d88627f65a..ffd07d945b 100644
--- a/src/view/com/auth/SplashScreen.tsx
+++ b/src/view/com/auth/SplashScreen.tsx
@@ -7,6 +7,8 @@ import {usePalette} from 'lib/hooks/usePalette'
import {CenteredView} from '../util/Views'
import {Trans, msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'
+import {Logo} from '#/view/icons/Logo'
+import {Logotype} from '#/view/icons/Logotype'
export const SplashScreen = ({
onPressSignin,
@@ -22,11 +24,14 @@ export const SplashScreen = ({
-
- Bluesky
-
-
- See what's next
+
+
+
+
+
+
+
+ What's up?
@@ -65,6 +70,7 @@ const styles = StyleSheet.create({
hero: {
flex: 2,
justifyContent: 'center',
+ alignItems: 'center',
},
btns: {
paddingBottom: 40,
diff --git a/src/view/com/auth/SplashScreen.web.tsx b/src/view/com/auth/SplashScreen.web.tsx
index 08cf701da6..1cc7b9146d 100644
--- a/src/view/com/auth/SplashScreen.web.tsx
+++ b/src/view/com/auth/SplashScreen.web.tsx
@@ -10,6 +10,8 @@ import {CenteredView} from '../util/Views'
import {isWeb} from 'platform/detection'
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
import {Trans} from '@lingui/macro'
+import {Logo} from '#/view/icons/Logo'
+import {Logotype} from '#/view/icons/Logotype'
export const SplashScreen = ({
onDismiss,
@@ -55,14 +57,15 @@ export const SplashScreen = ({
styles.containerInner,
isMobileWeb && styles.containerInnerMobile,
pal.border,
+ {alignItems: 'center'},
]}>
-
- Bluesky
-
-
- See what's next
-
+
+
+
+
+
+
}) {
)
}
const useStyles = () => {
- const {isTabletOrMobile} = useWebMediaQueries()
- const isMobileWeb = isWeb && isTabletOrMobile
return StyleSheet.create({
container: {
height: '100%',
@@ -161,8 +162,7 @@ const useStyles = () => {
paddingBottom: 30,
},
btns: {
- flexDirection: isMobileWeb ? 'column' : 'row',
- gap: 20,
+ gap: 10,
justifyContent: 'center',
paddingBottom: 40,
},
diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx
index f510be0be5..c4453e0c3e 100644
--- a/src/view/com/composer/Composer.tsx
+++ b/src/view/com/composer/Composer.tsx
@@ -62,6 +62,7 @@ import {useProfileQuery} from '#/state/queries/profile'
import {useComposerControls} from '#/state/shell/composer'
import {emitPostCreated} from '#/state/events'
import {ThreadgateSetting} from '#/state/queries/threadgate'
+import {logger} from '#/logger'
type Props = ComposerOpts
export const ComposePost = observer(function ComposePost({
@@ -228,6 +229,11 @@ export const ComposePost = observer(function ComposePost({
})
).uri
} catch (e: any) {
+ logger.error(e, {
+ message: `Composer: create post failed`,
+ hasImages: gallery.size > 0,
+ })
+
if (extLink) {
setExtLink({
...extLink,
diff --git a/src/view/com/feeds/FeedPage.tsx b/src/view/com/feeds/FeedPage.tsx
index 31ebc75a19..84d49e3b09 100644
--- a/src/view/com/feeds/FeedPage.tsx
+++ b/src/view/com/feeds/FeedPage.tsx
@@ -7,13 +7,15 @@ import {useNavigation} from '@react-navigation/native'
import {useAnalytics} from 'lib/analytics/analytics'
import {useQueryClient} from '@tanstack/react-query'
import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed'
-import {useOnMainScroll} from 'lib/hooks/useOnMainScroll'
+import {MainScrollProvider} from '../util/MainScrollProvider'
import {usePalette} from 'lib/hooks/usePalette'
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
+import {useSetMinimalShellMode} from '#/state/shell'
import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed'
import {ComposeIcon2} from 'lib/icons'
import {colors, s} from 'lib/styles'
-import {FlatList, View, useWindowDimensions} from 'react-native'
+import {View, useWindowDimensions} from 'react-native'
+import {ListMethods} from '../util/List'
import {Feed} from '../posts/Feed'
import {TextLink} from '../util/Link'
import {FAB} from '../util/fab/FAB'
@@ -27,7 +29,7 @@ import {truncateAndInvalidate} from '#/state/queries/util'
import {TabState, getTabState, getRootNavigation} from '#/lib/routes/helpers'
import {isNative} from '#/platform/detection'
-const POLL_FREQ = 30e3 // 30sec
+const POLL_FREQ = 60e3 // 60sec
export function FeedPage({
testID,
@@ -51,10 +53,11 @@ export function FeedPage({
const {isDesktop} = useWebMediaQueries()
const queryClient = useQueryClient()
const {openComposer} = useComposerControls()
- const [onMainScroll, isScrolledDown, resetMainScroll] = useOnMainScroll()
+ const [isScrolledDown, setIsScrolledDown] = React.useState(false)
+ const setMinimalShellMode = useSetMinimalShellMode()
const {screen, track} = useAnalytics()
const headerOffset = useHeaderOffset()
- const scrollElRef = React.useRef(null)
+ const scrollElRef = React.useRef(null)
const [hasNew, setHasNew] = React.useState(false)
const scrollToTop = React.useCallback(() => {
@@ -62,8 +65,8 @@ export function FeedPage({
animated: isNative,
offset: -headerOffset,
})
- resetMainScroll()
- }, [headerOffset, resetMainScroll])
+ setMinimalShellMode(false)
+ }, [headerOffset, setMinimalShellMode])
const onSoftReset = React.useCallback(() => {
const isScreenFocused =
@@ -164,21 +167,22 @@ export function FeedPage({
return (
-
+
+
+
{(isScrolledDown || hasNew) && (
| null>
- onScroll?: OnScrollHandler
- scrollEventThrottle?: number
+ scrollElRef: ListRef
headerOffset: number
enabled?: boolean
style?: StyleProp
@@ -50,16 +46,7 @@ export const ProfileFeedgens = React.forwardRef<
SectionRef,
ProfileFeedgensProps
>(function ProfileFeedgensImpl(
- {
- did,
- scrollElRef,
- onScroll,
- scrollEventThrottle,
- headerOffset,
- enabled,
- style,
- testID,
- },
+ {did, scrollElRef, headerOffset, enabled, style, testID},
ref,
) {
const pal = usePalette('default')
@@ -185,10 +172,9 @@ export const ProfileFeedgens = React.forwardRef<
[error, refetch, onPressRetryLoadMore, pal, preferences],
)
- const scrollHandler = useAnimatedScrollHandler(onScroll || {})
return (
-
- scrollElRef?: MutableRefObject | null>
- onScroll: OnScrollHandler
+ scrollElRef?: ListRef
+ onScrolledDownChange: (isScrolledDown: boolean) => void
onPressTryAgain?: () => void
renderHeader: () => JSX.Element
renderEmptyState: () => JSX.Element
testID?: string
- scrollEventThrottle?: number
headerOffset?: number
desktopFixedHeightOffset?: number
}) {
@@ -209,10 +205,9 @@ export function ListMembers({
[isFetching],
)
- const scrollHandler = useAnimatedScrollHandler(onScroll)
return (
-
{items.length > 0 && (
diff --git a/src/view/com/lists/ProfileLists.tsx b/src/view/com/lists/ProfileLists.tsx
index 1bd9d188ff..e3d9bd0b43 100644
--- a/src/view/com/lists/ProfileLists.tsx
+++ b/src/view/com/lists/ProfileLists.tsx
@@ -1,4 +1,4 @@
-import React, {MutableRefObject} from 'react'
+import React from 'react'
import {
Dimensions,
RefreshControl,
@@ -8,7 +8,7 @@ import {
ViewStyle,
} from 'react-native'
import {useQueryClient} from '@tanstack/react-query'
-import {FlatList} from '../util/Views'
+import {List, ListRef} from '../util/List'
import {ListCard} from './ListCard'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn'
@@ -16,11 +16,9 @@ import {Text} from '../util/text/Text'
import {useAnalytics} from 'lib/analytics/analytics'
import {usePalette} from 'lib/hooks/usePalette'
import {useProfileListsQuery, RQKEY} from '#/state/queries/profile-lists'
-import {OnScrollHandler} from '#/lib/hooks/useOnMainScroll'
import {logger} from '#/logger'
import {Trans} from '@lingui/macro'
import {cleanError} from '#/lib/strings/errors'
-import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED'
import {useTheme} from '#/lib/ThemeContext'
import {FeedLoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder'
import {isNative} from '#/platform/detection'
@@ -36,9 +34,7 @@ interface SectionRef {
interface ProfileListsProps {
did: string
- scrollElRef: MutableRefObject | null>
- onScroll?: OnScrollHandler
- scrollEventThrottle?: number
+ scrollElRef: ListRef
headerOffset: number
enabled?: boolean
style?: StyleProp
@@ -47,16 +43,7 @@ interface ProfileListsProps {
export const ProfileLists = React.forwardRef(
function ProfileListsImpl(
- {
- did,
- scrollElRef,
- onScroll,
- scrollEventThrottle,
- headerOffset,
- enabled,
- style,
- testID,
- },
+ {did, scrollElRef, headerOffset, enabled, style, testID},
ref,
) {
const pal = usePalette('default')
@@ -187,10 +174,9 @@ export const ProfileLists = React.forwardRef(
[error, refetch, onPressRetryLoadMore, pal],
)
- const scrollHandler = useAnimatedScrollHandler(onScroll || {})
return (
- (
minHeight: Dimensions.get('window').height * 1.5,
}}
style={{paddingTop: headerOffset}}
- onScroll={onScroll != null ? scrollHandler : undefined}
- scrollEventThrottle={scrollEventThrottle}
indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'}
removeClippedSubviews={true}
contentOffset={{x: 0, y: headerOffset * -1}}
diff --git a/src/view/com/notifications/Feed.tsx b/src/view/com/notifications/Feed.tsx
index 260c9bbd58..52d534c4fd 100644
--- a/src/view/com/notifications/Feed.tsx
+++ b/src/view/com/notifications/Feed.tsx
@@ -1,13 +1,11 @@
-import React, {MutableRefObject} from 'react'
-import {CenteredView, FlatList} from '../util/Views'
+import React from 'react'
+import {CenteredView} from '../util/Views'
import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native'
import {FeedItem} from './FeedItem'
import {NotificationFeedLoadingPlaceholder} from '../util/LoadingPlaceholder'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn'
import {EmptyState} from '../util/EmptyState'
-import {OnScrollHandler} from 'lib/hooks/useOnMainScroll'
-import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED'
import {s} from 'lib/styles'
import {usePalette} from 'lib/hooks/usePalette'
import {useNotificationFeedQuery} from '#/state/queries/notifications/feed'
@@ -15,6 +13,7 @@ import {useUnreadNotificationsApi} from '#/state/queries/notifications/unread'
import {logger} from '#/logger'
import {cleanError} from '#/lib/strings/errors'
import {useModerationOpts} from '#/state/queries/preferences'
+import {List, ListRef} from '../util/List'
const EMPTY_FEED_ITEM = {_reactKey: '__empty__'}
const LOAD_MORE_ERROR_ITEM = {_reactKey: '__load_more_error__'}
@@ -23,12 +22,12 @@ const LOADING_ITEM = {_reactKey: '__loading__'}
export function Feed({
scrollElRef,
onPressTryAgain,
- onScroll,
+ onScrolledDownChange,
ListHeaderComponent,
}: {
- scrollElRef?: MutableRefObject | null>
+ scrollElRef?: ListRef
onPressTryAgain?: () => void
- onScroll?: OnScrollHandler
+ onScrolledDownChange: (isScrolledDown: boolean) => void
ListHeaderComponent?: () => JSX.Element
}) {
const pal = usePalette('default')
@@ -135,7 +134,6 @@ export function Feed({
[isFetchingNextPage],
)
- const scrollHandler = useAnimatedScrollHandler(onScroll || {})
return (
{error && (
@@ -146,7 +144,7 @@ export function Feed({
/>
)}
- void},
) {
const pal = usePalette('default')
- const {isSandbox, hasSession} = useSession()
+ const {hasSession} = useSession()
const {_} = useLingui()
const setDrawerOpen = useSetDrawerOpen()
const navigation = useNavigation()
const {feeds, hasPinnedCustom} = usePinnedFeedsInfos()
- const brandBlue = useColorSchemeStyle(s.brandBlue, s.blue3)
const {headerHeight} = useShellLayout()
const {headerMinimalShellTransform} = useMinimalShellMode()
const pinnedDisplayNames = hasSession ? feeds.map(f => f.displayName) : []
@@ -86,9 +83,9 @@ export function FeedsTabBar(
/>
-
- {isSandbox ? 'SANDBOX' : 'Bluesky'}
-
+
+
+
{hasSession && (
| ScrollView | null>
+ scrollElRef: React.MutableRefObject
}
export interface PagerWithHeaderProps {
@@ -62,7 +58,6 @@ export const PagerWithHeader = React.forwardRef(
const [currentPage, setCurrentPage] = React.useState(0)
const [tabBarHeight, setTabBarHeight] = React.useState(0)
const [headerOnlyHeight, setHeaderOnlyHeight] = React.useState(0)
- const [isScrolledDown, setIsScrolledDown] = React.useState(false)
const scrollY = useSharedValue(0)
const headerHeight = headerOnlyHeight + tabBarHeight
@@ -155,15 +150,7 @@ export const PagerWithHeader = React.forwardRef(
if (!throttleTimeout.current) {
throttleTimeout.current = setTimeout(() => {
throttleTimeout.current = null
-
runOnUI(adjustScrollForOtherPages)()
-
- const nextIsScrolledDown = scrollY.value > SCROLLED_DOWN_LIMIT
- if (isScrolledDown !== nextIsScrolledDown) {
- React.startTransition(() => {
- setIsScrolledDown(nextIsScrolledDown)
- })
- }
}, 80 /* Sync often enough you're unlikely to catch it unsynced */)
}
})
@@ -211,7 +198,6 @@ export const PagerWithHeader = React.forwardRef(
index={i}
isReady={isReady}
isFocused={i === currentPage}
- isScrolledDown={isScrolledDown}
onScrollWorklet={i === currentPage ? onScrollWorklet : noop}
registerRef={registerRef}
renderTab={child}
@@ -293,7 +279,6 @@ function PagerItem({
index,
isReady,
isFocused,
- isScrolledDown,
onScrollWorklet,
renderTab,
registerRef,
@@ -302,7 +287,6 @@ function PagerItem({
index: number
isFocused: boolean
isReady: boolean
- isScrolledDown: boolean
registerRef: (scrollRef: AnimatedRef | null, atIndex: number) => void
onScrollWorklet: (e: NativeScrollEvent) => void
renderTab: ((props: PagerWithHeaderChildParams) => JSX.Element) | null
@@ -316,24 +300,21 @@ function PagerItem({
}
}, [scrollElRef, registerRef, index])
- const scrollHandler = React.useMemo(
- () => ({onScroll: onScrollWorklet}),
- [onScrollWorklet],
- )
-
if (!isReady || renderTab == null) {
return null
}
- return renderTab({
- headerHeight,
- isFocused,
- isScrolledDown,
- onScroll: scrollHandler,
- scrollElRef: scrollElRef as React.MutableRefObject<
- FlatList | ScrollView | null
- >,
- })
+ return (
+
+ {renderTab({
+ headerHeight,
+ isFocused,
+ scrollElRef: scrollElRef as React.MutableRefObject<
+ ListMethods | ScrollView | null
+ >,
+ })}
+
+ )
}
const styles = StyleSheet.create({
diff --git a/src/view/com/post-thread/PostLikedBy.tsx b/src/view/com/post-thread/PostLikedBy.tsx
index 60afe1f9c6..245ba59e8c 100644
--- a/src/view/com/post-thread/PostLikedBy.tsx
+++ b/src/view/com/post-thread/PostLikedBy.tsx
@@ -1,7 +1,8 @@
import React, {useCallback, useMemo, useState} from 'react'
import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native'
import {AppBskyFeedGetLikes as GetLikes} from '@atproto/api'
-import {CenteredView, FlatList} from '../util/Views'
+import {CenteredView} from '../util/Views'
+import {List} from '../util/List'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {ProfileCardWithFollowBtn} from '../profile/ProfileCard'
import {usePalette} from 'lib/hooks/usePalette'
@@ -84,7 +85,7 @@ export function PostLikedBy({uri}: {uri: string}) {
// loaded
// =
return (
- item.actor.did}
refreshControl={
diff --git a/src/view/com/post-thread/PostRepostedBy.tsx b/src/view/com/post-thread/PostRepostedBy.tsx
index 1162fec403..5cc0063885 100644
--- a/src/view/com/post-thread/PostRepostedBy.tsx
+++ b/src/view/com/post-thread/PostRepostedBy.tsx
@@ -1,7 +1,8 @@
import React, {useMemo, useCallback, useState} from 'react'
import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native'
import {AppBskyActorDefs as ActorDefs} from '@atproto/api'
-import {CenteredView, FlatList} from '../util/Views'
+import {CenteredView} from '../util/Views'
+import {List} from '../util/List'
import {ProfileCardWithFollowBtn} from '../profile/ProfileCard'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {usePalette} from 'lib/hooks/usePalette'
@@ -85,7 +86,7 @@ export function PostRepostedBy({uri}: {uri: string}) {
// loaded
// =
return (
- item.did}
refreshControl={
diff --git a/src/view/com/post-thread/PostThread.tsx b/src/view/com/post-thread/PostThread.tsx
index 051bc7849f..9175508847 100644
--- a/src/view/com/post-thread/PostThread.tsx
+++ b/src/view/com/post-thread/PostThread.tsx
@@ -8,7 +8,8 @@ import {
View,
} from 'react-native'
import {AppBskyFeedDefs} from '@atproto/api'
-import {CenteredView, FlatList} from '../util/Views'
+import {CenteredView} from '../util/Views'
+import {List, ListMethods} from '../util/List'
import {
FontAwesomeIcon,
FontAwesomeIconStyle,
@@ -140,7 +141,7 @@ function PostThreadLoaded({
const {_} = useLingui()
const pal = usePalette('default')
const {isTablet, isDesktop} = useWebMediaQueries()
- const ref = useRef(null)
+ const ref = useRef(null)
const highlightedPostRef = useRef(null)
const needsScrollAdjustment = useRef(
!isNative || // web always uses scroll adjustment
@@ -156,7 +157,9 @@ function PostThreadLoaded({
// construct content
const posts = React.useMemo(() => {
let arr = [TOP_COMPONENT].concat(
- Array.from(flattenThreadSkeleton(sortThread(thread, threadViewPrefs))),
+ Array.from(
+ flattenThreadSkeleton(sortThread(thread, threadViewPrefs), hasSession),
+ ),
)
if (arr.length > maxVisible) {
arr = arr.slice(0, maxVisible).concat([LOAD_MORE])
@@ -165,7 +168,7 @@ function PostThreadLoaded({
arr.push(BOTTOM_COMPONENT)
}
return arr
- }, [thread, maxVisible, threadViewPrefs])
+ }, [thread, maxVisible, threadViewPrefs, hasSession])
/**
* NOTE
@@ -335,7 +338,7 @@ function PostThreadLoaded({
)
return (
- {
if (node.type === 'post') {
if (node.parent) {
- yield* flattenThreadSkeleton(node.parent)
+ yield* flattenThreadSkeleton(node.parent, hasSession)
} else if (node.ctx.isParentLoading) {
yield PARENT_SPINNER
}
+ if (!hasSession && node.ctx.depth > 0 && hasPwiOptOut(node)) {
+ return
+ }
yield node
if (node.ctx.isHighlightedPost && !node.post.viewer?.replyDisabled) {
yield REPLY_PROMPT
}
if (node.replies?.length) {
for (const reply of node.replies) {
- yield* flattenThreadSkeleton(reply)
+ yield* flattenThreadSkeleton(reply, hasSession)
}
} else if (node.ctx.isChildLoading) {
yield CHILD_SPINNER
@@ -492,6 +499,10 @@ function* flattenThreadSkeleton(
}
}
+function hasPwiOptOut(node: ThreadPost) {
+ return !!node.post.author.labels?.find(l => l.val === '!no-unauthenticated')
+}
+
function hasBranchingReplies(node: ThreadNode) {
if (node.type !== 'post') {
return false
diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx
index 8d12117071..e6adfc85b5 100644
--- a/src/view/com/post-thread/PostThreadItem.tsx
+++ b/src/view/com/post-thread/PostThreadItem.tsx
@@ -187,6 +187,9 @@ let PostThreadItemLoaded = ({
return makeProfileLink(post.author, 'post', urip.rkey, 'reposted-by')
}, [post.uri, post.author])
const repostsTitle = 'Reposts of this post'
+ const isSelfLabeledPost =
+ moderation.decisions.post.cause?.type === 'label' &&
+ moderation.decisions.post.cause.label.src === currentAccount?.did
const translatorUrl = getTranslatorLink(
record?.text || '',
@@ -351,7 +354,7 @@ let PostThreadItemLoaded = ({
includeMute
style={styles.alert}
/>
- {post.author.did === currentAccount?.did ? (
+ {post.author.did === currentAccount?.did && !isSelfLabeledPost ? (
enabled?: boolean
pollInterval?: number
- scrollElRef?: MutableRefObject | null>
+ scrollElRef?: ListRef
onHasNew?: (v: boolean) => void
- onScroll?: OnScrollHandler
- scrollEventThrottle?: number
+ onScrolledDownChange?: (isScrolledDown: boolean) => void
renderEmptyState: () => JSX.Element
renderEndOfFeed?: () => JSX.Element
testID?: string
@@ -81,6 +81,7 @@ let Feed = ({
const {currentAccount} = useSession()
const [isPTRing, setIsPTRing] = React.useState(false)
const checkForNewRef = React.useRef<(() => void) | null>(null)
+ const lastFetchRef = React.useRef(Date.now())
const opts = React.useMemo(
() => ({enabled, ignoreFilterFor}),
@@ -98,6 +99,9 @@ let Feed = ({
fetchNextPage,
} = usePostFeedQuery(feed, feedParams, opts)
const isEmpty = !isFetching && !data?.pages[0]?.slices.length
+ if (data?.pages[0]) {
+ lastFetchRef.current = data?.pages[0].fetchedAt
+ }
const checkForNew = React.useCallback(async () => {
if (!data?.pages[0] || isFetching || !onHasNew || !enabled) {
@@ -137,11 +141,21 @@ let Feed = ({
checkForNewRef.current = checkForNew
}, [checkForNew])
React.useEffect(() => {
- if (enabled && checkForNewRef.current) {
- // check for new on enable (aka on focus)
- checkForNewRef.current()
+ if (enabled) {
+ const timeSinceFirstLoad = Date.now() - lastFetchRef.current
+ if (timeSinceFirstLoad > REFRESH_AFTER) {
+ // do a full refresh
+ scrollElRef?.current?.scrollToOffset({offset: 0, animated: false})
+ queryClient.resetQueries({queryKey: RQKEY(feed)})
+ } else if (
+ timeSinceFirstLoad > CHECK_LATEST_AFTER &&
+ checkForNewRef.current
+ ) {
+ // check for new on enable (aka on focus)
+ checkForNewRef.current()
+ }
}
- }, [enabled])
+ }, [enabled, feed, queryClient, scrollElRef])
React.useEffect(() => {
let cleanup1: () => void | undefined, cleanup2: () => void | undefined
const subscription = AppState.addEventListener('change', nextAppState => {
@@ -270,10 +284,9 @@ let Feed = ({
)
}, [isFetchingNextPage, shouldRenderEndOfFeed, renderEndOfFeed, headerOffset])
- const scrollHandler = useAnimatedScrollHandler(onScroll || {})
return (
- item.did}
refreshControl={
diff --git a/src/view/com/profile/ProfileFollows.tsx b/src/view/com/profile/ProfileFollows.tsx
index 890c13eb23..5265ee07ea 100644
--- a/src/view/com/profile/ProfileFollows.tsx
+++ b/src/view/com/profile/ProfileFollows.tsx
@@ -1,7 +1,8 @@
import React from 'react'
import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native'
import {AppBskyActorDefs as ActorDefs} from '@atproto/api'
-import {CenteredView, FlatList} from '../util/Views'
+import {CenteredView} from '../util/Views'
+import {List} from '../util/List'
import {ErrorMessage} from '../util/error/ErrorMessage'
import {ProfileCardWithFollowBtn} from './ProfileCard'
import {usePalette} from 'lib/hooks/usePalette'
@@ -86,7 +87,7 @@ export function ProfileFollows({name}: {name: string}) {
// loaded
// =
return (
- item.did}
refreshControl={
diff --git a/src/view/com/util/List.tsx b/src/view/com/util/List.tsx
new file mode 100644
index 0000000000..5947fe87a1
--- /dev/null
+++ b/src/view/com/util/List.tsx
@@ -0,0 +1,64 @@
+import React, {memo, startTransition} from 'react'
+import {FlatListProps} from 'react-native'
+import {FlatList_INTERNAL} from './Views'
+import {useScrollHandlers} from '#/lib/ScrollContext'
+import {runOnJS, useSharedValue} from 'react-native-reanimated'
+import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED'
+
+export type ListMethods = FlatList_INTERNAL
+export type ListProps = Omit<
+ FlatListProps,
+ 'onScroll' // Use ScrollContext instead.
+> & {
+ onScrolledDownChange?: (isScrolledDown: boolean) => void
+}
+export type ListRef = React.MutableRefObject
+
+const SCROLLED_DOWN_LIMIT = 200
+
+function ListImpl(
+ {onScrolledDownChange, ...props}: ListProps,
+ ref: React.Ref,
+) {
+ const isScrolledDown = useSharedValue(false)
+ const contextScrollHandlers = useScrollHandlers()
+
+ function handleScrolledDownChange(didScrollDown: boolean) {
+ startTransition(() => {
+ onScrolledDownChange?.(didScrollDown)
+ })
+ }
+
+ const scrollHandler = useAnimatedScrollHandler({
+ onBeginDrag(e, ctx) {
+ contextScrollHandlers.onBeginDrag?.(e, ctx)
+ },
+ onEndDrag(e, ctx) {
+ contextScrollHandlers.onEndDrag?.(e, ctx)
+ },
+ onScroll(e, ctx) {
+ contextScrollHandlers.onScroll?.(e, ctx)
+
+ const didScrollDown = e.contentOffset.y > SCROLLED_DOWN_LIMIT
+ if (isScrolledDown.value !== didScrollDown) {
+ isScrolledDown.value = didScrollDown
+ if (onScrolledDownChange != null) {
+ runOnJS(handleScrolledDownChange)(didScrollDown)
+ }
+ }
+ },
+ })
+
+ return (
+
+ )
+}
+
+export const List = memo(React.forwardRef(ListImpl)) as (
+ props: ListProps & {ref?: React.Ref},
+) => React.ReactElement
diff --git a/src/lib/hooks/useOnMainScroll.ts b/src/view/com/util/MainScrollProvider.tsx
similarity index 69%
rename from src/lib/hooks/useOnMainScroll.ts
rename to src/view/com/util/MainScrollProvider.tsx
index 2e7a799137..31a4ef0c85 100644
--- a/src/lib/hooks/useOnMainScroll.ts
+++ b/src/view/com/util/MainScrollProvider.tsx
@@ -1,30 +1,18 @@
-import {useState, useCallback, useMemo} from 'react'
-import {NativeSyntheticEvent, NativeScrollEvent} from 'react-native'
+import React, {useCallback} from 'react'
+import {ScrollProvider} from '#/lib/ScrollContext'
+import {NativeScrollEvent} from 'react-native'
import {useSetMinimalShellMode, useMinimalShellMode} from '#/state/shell'
import {useShellLayout} from '#/state/shell/shell-layout'
-import {s} from 'lib/styles'
import {isWeb} from 'platform/detection'
-import {
- useSharedValue,
- interpolate,
- runOnJS,
- ScrollHandlers,
-} from 'react-native-reanimated'
+import {useSharedValue, interpolate} from 'react-native-reanimated'
function clamp(num: number, min: number, max: number) {
'worklet'
return Math.min(Math.max(num, min), max)
}
-export type OnScrollCb = (
- event: NativeSyntheticEvent,
-) => void
-export type OnScrollHandler = ScrollHandlers
-export type ResetCb = () => void
-
-export function useOnMainScroll(): [OnScrollHandler, boolean, ResetCb] {
+export function MainScrollProvider({children}: {children: React.ReactNode}) {
const {headerHeight} = useShellLayout()
- const [isScrolledDown, setIsScrolledDown] = useState(false)
const mode = useMinimalShellMode()
const setMode = useSetMinimalShellMode()
const startDragOffset = useSharedValue(null)
@@ -58,13 +46,6 @@ export function useOnMainScroll(): [OnScrollHandler, boolean, ResetCb] {
const onScroll = useCallback(
(e: NativeScrollEvent) => {
'worklet'
- // Keep track of whether we want to show "scroll to top".
- if (!isScrolledDown && e.contentOffset.y > s.window.height) {
- runOnJS(setIsScrolledDown)(true)
- } else if (isScrolledDown && e.contentOffset.y < s.window.height) {
- runOnJS(setIsScrolledDown)(false)
- }
-
if (startDragOffset.value === null || startMode.value === null) {
if (mode.value !== 0 && e.contentOffset.y < headerHeight.value) {
// If we're close enough to the top, always show the shell.
@@ -102,24 +83,15 @@ export function useOnMainScroll(): [OnScrollHandler, boolean, ResetCb] {
startMode.value = mode.value
}
},
- [headerHeight, mode, setMode, isScrolledDown, startDragOffset, startMode],
+ [headerHeight, mode, setMode, startDragOffset, startMode],
)
- const scrollHandler: ScrollHandlers = useMemo(
- () => ({
- onBeginDrag,
- onEndDrag,
- onScroll,
- }),
- [onBeginDrag, onEndDrag, onScroll],
+ return (
+
+ {children}
+
)
-
- return [
- scrollHandler,
- isScrolledDown,
- useCallback(() => {
- setIsScrolledDown(false)
- setMode(false)
- }, [setMode]),
- ]
}
diff --git a/src/view/com/util/ViewSelector.tsx b/src/view/com/util/ViewSelector.tsx
index 935d93033b..ee993c564d 100644
--- a/src/view/com/util/ViewSelector.tsx
+++ b/src/view/com/util/ViewSelector.tsx
@@ -1,13 +1,14 @@
import React, {useEffect, useState} from 'react'
import {
+ NativeSyntheticEvent,
+ NativeScrollEvent,
Pressable,
RefreshControl,
StyleSheet,
View,
ScrollView,
} from 'react-native'
-import {FlatList} from './Views'
-import {OnScrollCb} from 'lib/hooks/useOnMainScroll'
+import {FlatList_INTERNAL} from './Views'
import {useColorSchemeStyle} from 'lib/hooks/useColorSchemeStyle'
import {Text} from './text/Text'
import {usePalette} from 'lib/hooks/usePalette'
@@ -38,7 +39,7 @@ export const ViewSelector = React.forwardRef<
| null
| undefined
onSelectView?: (viewIndex: number) => void
- onScroll?: OnScrollCb
+ onScroll?: (event: NativeSyntheticEvent) => void
onRefresh?: () => void
onEndReached?: (info: {distanceFromEnd: number}) => void
}
@@ -59,7 +60,7 @@ export const ViewSelector = React.forwardRef<
) {
const pal = usePalette('default')
const [selectedIndex, setSelectedIndex] = useState(0)
- const flatListRef = React.useRef(null)
+ const flatListRef = React.useRef(null)
// events
// =
@@ -110,7 +111,7 @@ export const ViewSelector = React.forwardRef<
[items],
)
return (
-
diff --git a/src/view/com/util/Views.web.tsx b/src/view/com/util/Views.web.tsx
index 5a4f266fd5..db3b9de0d8 100644
--- a/src/view/com/util/Views.web.tsx
+++ b/src/view/com/util/Views.web.tsx
@@ -49,7 +49,7 @@ export function CenteredView({
return
}
-export const FlatList = React.forwardRef(function FlatListImpl(
+export const FlatList_INTERNAL = React.forwardRef(function FlatListImpl(
{
contentContainerStyle,
style,
diff --git a/src/view/com/util/moderation/ContentHider.tsx b/src/view/com/util/moderation/ContentHider.tsx
index b1ea76621b..1269b7ebf6 100644
--- a/src/view/com/util/moderation/ContentHider.tsx
+++ b/src/view/com/util/moderation/ContentHider.tsx
@@ -7,7 +7,7 @@ import {Text} from '../text/Text'
import {ShieldExclamation} from 'lib/icons'
import {describeModerationCause} from 'lib/moderation'
import {useLingui} from '@lingui/react'
-import {msg} from '@lingui/macro'
+import {msg, Trans} from '@lingui/macro'
import {useModalControls} from '#/state/modals'
import {isPostMediaBlurred} from 'lib/moderation'
@@ -95,13 +95,17 @@ export function ContentHider({
{desc.name}
- {!moderation.noOverride && (
-
-
- {override ? 'Hide' : 'Show'}
-
-
- )}
+
+
+ {moderation.noOverride ? (
+ Learn more
+ ) : override ? (
+ Hide
+ ) : (
+ Show
+ )}
+
+
{override && {children}}
diff --git a/src/view/com/util/moderation/LabelInfo.tsx b/src/view/com/util/moderation/LabelInfo.tsx
index 8fe3765c2b..970338752c 100644
--- a/src/view/com/util/moderation/LabelInfo.tsx
+++ b/src/view/com/util/moderation/LabelInfo.tsx
@@ -43,7 +43,8 @@ export function LabelInfo({
]}>
- This {'did' in details ? 'account' : 'post'} has been labeled.
+ A content warning has been applied to this{' '}
+ {'did' in details ? 'account' : 'post'}.
{' '}
+
- Content Warning
+ {isNoPwi ? (
+ Sign-in Required
+ ) : (
+ Content Warning
+ )}
- This {screenDescription} has been flagged:
-
- {desc.name}.
-
- {
- openModal({
- name: 'moderation-details',
- context: 'account',
- moderation,
- })
- }}
- accessibilityRole="button"
- accessibilityLabel={_(msg`Learn more about this warning`)}
- accessibilityHint="">
-
- Learn More
-
-
+ {isNoPwi ? (
+
+ This account has requested that users sign in to view their profile.
+
+ ) : (
+ <>
+ This {screenDescription} has been flagged:
+
+ {desc.name}.
+
+ {
+ openModal({
+ name: 'moderation-details',
+ context: 'account',
+ moderation,
+ })
+ }}
+ accessibilityRole="button"
+ accessibilityLabel={_(msg`Learn more about this warning`)}
+ accessibilityHint="">
+
+ Learn More
+
+
+ >
+ )}{' '}
{isMobile && }
@@ -116,7 +134,7 @@ export function ScreenHider({
)}
-
+
)
}
diff --git a/src/view/com/util/post-ctrls/PostCtrls.tsx b/src/view/com/util/post-ctrls/PostCtrls.tsx
index 83ea3e8c9f..414fb1e094 100644
--- a/src/view/com/util/post-ctrls/PostCtrls.tsx
+++ b/src/view/com/util/post-ctrls/PostCtrls.tsx
@@ -10,7 +10,7 @@ import {AppBskyFeedDefs, AppBskyFeedPost} from '@atproto/api'
import {Text} from '../text/Text'
import {PostDropdownBtn} from '../forms/PostDropdownBtn'
import {HeartIcon, HeartIconSolid, CommentBottomArrow} from 'lib/icons'
-import {s, colors} from 'lib/styles'
+import {s} from 'lib/styles'
import {pluralize} from 'lib/strings/helpers'
import {useTheme} from 'lib/ThemeContext'
import {RepostButton} from './RepostButton'
@@ -180,7 +180,7 @@ let PostCtrls = ({
accessibilityHint=""
hitSlop={big ? HITSLOP_20 : HITSLOP_10}>
{post.viewer?.like ? (
-
+
) : (
{post.likeCount}
@@ -233,9 +233,6 @@ const styles = StyleSheet.create({
paddingLeft: 5,
paddingRight: 5,
},
- ctrlIconLiked: {
- color: colors.like,
- },
mt1: {
marginTop: 1,
},
diff --git a/src/view/icons/Logo.tsx b/src/view/icons/Logo.tsx
new file mode 100644
index 0000000000..15ab5a11c0
--- /dev/null
+++ b/src/view/icons/Logo.tsx
@@ -0,0 +1,48 @@
+import React from 'react'
+import Svg, {
+ Path,
+ Defs,
+ LinearGradient,
+ Stop,
+ SvgProps,
+ PathProps,
+} from 'react-native-svg'
+
+import {colors} from '#/lib/styles'
+
+const ratio = 57 / 64
+
+type Props = {
+ fill?: PathProps['fill']
+} & SvgProps
+
+export const Logo = React.forwardRef(function LogoImpl(props: Props, ref) {
+ const {fill, ...rest} = props
+ const gradient = fill === 'sky'
+ const _fill = gradient ? 'url(#sky)' : fill || colors.blue3
+ // @ts-ignore it's fiiiiine
+ const size = parseInt(rest.width || 32)
+ return (
+
+ )
+})
diff --git a/src/view/icons/Logotype.tsx b/src/view/icons/Logotype.tsx
new file mode 100644
index 0000000000..080c402fb3
--- /dev/null
+++ b/src/view/icons/Logotype.tsx
@@ -0,0 +1,29 @@
+import React from 'react'
+import Svg, {Path, SvgProps, PathProps} from 'react-native-svg'
+
+import {usePalette} from '#/lib/hooks/usePalette'
+
+const ratio = 17 / 64
+
+export function Logotype({
+ fill,
+ ...rest
+}: {fill?: PathProps['fill']} & SvgProps) {
+ const pal = usePalette('default')
+ // @ts-ignore it's fiiiiine
+ const size = parseInt(rest.width || 32)
+
+ return (
+
+ )
+}
diff --git a/src/view/icons.ts b/src/view/icons/index.tsx
similarity index 100%
rename from src/view/icons.ts
rename to src/view/icons/index.tsx
diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx
index f319fbc390..d2d0aafb8f 100644
--- a/src/view/screens/Feeds.tsx
+++ b/src/view/screens/Feeds.tsx
@@ -19,7 +19,7 @@ import {
import {ErrorMessage} from 'view/com/util/error/ErrorMessage'
import debounce from 'lodash.debounce'
import {Text} from 'view/com/util/text/Text'
-import {FlatList} from 'view/com/util/Views'
+import {List} from 'view/com/util/List'
import {useFocusEffect} from '@react-navigation/native'
import {FeedSourceCard} from 'view/com/feeds/FeedSourceCard'
import {Trans, msg} from '@lingui/macro'
@@ -481,7 +481,7 @@ export function FeedsScreen(_props: Props) {
{preferences ? : }
- item.key}
diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx
index 42a958b95d..bfe4402653 100644
--- a/src/view/screens/Home.tsx
+++ b/src/view/screens/Home.tsx
@@ -9,6 +9,7 @@ import {CustomFeedEmptyState} from 'view/com/posts/CustomFeedEmptyState'
import {FeedsTabBar} from '../com/pager/FeedsTabBar'
import {Pager, RenderTabBarFnProps} from 'view/com/pager/Pager'
import {FeedPage} from 'view/com/feeds/FeedPage'
+import {HomeLoggedOutCTA} from '../com/auth/HomeLoggedOutCTA'
import {useSetMinimalShellMode, useSetDrawerSwipeDisabled} from '#/state/shell'
import {usePreferencesQuery} from '#/state/queries/preferences'
import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types'
@@ -199,12 +200,7 @@ function HomeScreenReady({
onPageScrollStateChanged={onPageScrollStateChanged}
renderTabBar={renderTabBar}
tabBarPosition="top">
-
+
)
}
diff --git a/src/view/screens/Notifications.tsx b/src/view/screens/Notifications.tsx
index fceaa60c29..e28a67e370 100644
--- a/src/view/screens/Notifications.tsx
+++ b/src/view/screens/Notifications.tsx
@@ -1,5 +1,5 @@
import React from 'react'
-import {FlatList, View} from 'react-native'
+import {View} from 'react-native'
import {useFocusEffect} from '@react-navigation/native'
import {useQueryClient} from '@tanstack/react-query'
import {
@@ -9,8 +9,9 @@ import {
import {ViewHeader} from '../com/util/ViewHeader'
import {Feed} from '../com/notifications/Feed'
import {TextLink} from 'view/com/util/Link'
+import {ListMethods} from 'view/com/util/List'
import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn'
-import {useOnMainScroll} from 'lib/hooks/useOnMainScroll'
+import {MainScrollProvider} from '../com/util/MainScrollProvider'
import {usePalette} from 'lib/hooks/usePalette'
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
import {s, colors} from 'lib/styles'
@@ -35,8 +36,8 @@ type Props = NativeStackScreenProps<
export function NotificationsScreen({}: Props) {
const {_} = useLingui()
const setMinimalShellMode = useSetMinimalShellMode()
- const [onMainScroll, isScrolledDown, resetMainScroll] = useOnMainScroll()
- const scrollElRef = React.useRef(null)
+ const [isScrolledDown, setIsScrolledDown] = React.useState(false)
+ const scrollElRef = React.useRef(null)
const checkLatestRef = React.useRef<() => void | null>()
const {screen} = useAnalytics()
const pal = usePalette('default')
@@ -50,8 +51,8 @@ export function NotificationsScreen({}: Props) {
// =
const scrollToTop = React.useCallback(() => {
scrollElRef.current?.scrollToOffset({animated: isNative, offset: 0})
- resetMainScroll()
- }, [scrollElRef, resetMainScroll])
+ setMinimalShellMode(false)
+ }, [scrollElRef, setMinimalShellMode])
const onPressLoadLatest = React.useCallback(() => {
scrollToTop()
@@ -130,11 +131,13 @@ export function NotificationsScreen({}: Props) {
return (
-
+
+
+
{(isScrolledDown || hasNew) && (
export function PostThreadScreen({route}: Props) {
const queryClient = useQueryClient()
const {_} = useLingui()
+ const {hasSession} = useSession()
const {fabMinimalShellTransform} = useMinimalShellMode()
const setMinimalShellMode = useSetMinimalShellMode()
const {openComposer} = useComposerControls()
@@ -89,7 +91,7 @@ export function PostThreadScreen({route}: Props) {
/>
)}
- {isMobile && canReply && (
+ {isMobile && canReply && hasSession && (
(() => {
return [
@@ -277,103 +277,67 @@ function ProfileScreenLoaded({
onPageSelected={onPageSelected}
onCurrentPageSelected={onCurrentPageSelected}
renderHeader={renderHeader}>
- {({onScroll, headerHeight, isFocused, isScrolledDown, scrollElRef}) => (
+ {({headerHeight, isFocused, scrollElRef}) => (
| null>
- }
+ scrollElRef={scrollElRef as ListRef}
ignoreFilterFor={profile.did}
/>
)}
{showRepliesTab
- ? ({
- onScroll,
- headerHeight,
- isFocused,
- isScrolledDown,
- scrollElRef,
- }) => (
+ ? ({headerHeight, isFocused, scrollElRef}) => (
| null>
- }
+ scrollElRef={scrollElRef as ListRef}
ignoreFilterFor={profile.did}
/>
)
: null}
- {({onScroll, headerHeight, isFocused, isScrolledDown, scrollElRef}) => (
+ {({headerHeight, isFocused, scrollElRef}) => (
| null>
- }
+ scrollElRef={scrollElRef as ListRef}
ignoreFilterFor={profile.did}
/>
)}
{showLikesTab
- ? ({
- onScroll,
- headerHeight,
- isFocused,
- isScrolledDown,
- scrollElRef,
- }) => (
+ ? ({headerHeight, isFocused, scrollElRef}) => (
| null>
- }
+ scrollElRef={scrollElRef as ListRef}
ignoreFilterFor={profile.did}
/>
)
: null}
{showFeedsTab
- ? ({onScroll, headerHeight, isFocused, scrollElRef}) => (
+ ? ({headerHeight, isFocused, scrollElRef}) => (
| null>
- }
- onScroll={onScroll}
- scrollEventThrottle={1}
+ scrollElRef={scrollElRef as ListRef}
headerOffset={headerHeight}
enabled={isFocused}
/>
)
: null}
{showListsTab
- ? ({onScroll, headerHeight, isFocused, scrollElRef}) => (
+ ? ({headerHeight, isFocused, scrollElRef}) => (
| null>
- }
- onScroll={onScroll}
- scrollEventThrottle={1}
+ scrollElRef={scrollElRef as ListRef}
headerOffset={headerHeight}
enabled={isFocused}
/>
@@ -396,28 +360,19 @@ function ProfileScreenLoaded({
interface FeedSectionProps {
feed: FeedDescriptor
- onScroll: OnScrollHandler
headerHeight: number
isFocused: boolean
- isScrolledDown: boolean
- scrollElRef: React.MutableRefObject | null>
+ scrollElRef: ListRef
ignoreFilterFor?: string
}
const FeedSection = React.forwardRef(
function FeedSectionImpl(
- {
- feed,
- onScroll,
- headerHeight,
- isFocused,
- isScrolledDown,
- scrollElRef,
- ignoreFilterFor,
- },
+ {feed, headerHeight, isFocused, scrollElRef, ignoreFilterFor},
ref,
) {
const queryClient = useQueryClient()
const [hasNew, setHasNew] = React.useState(false)
+ const [isScrolledDown, setIsScrolledDown] = React.useState(false)
const onScrollToTop = React.useCallback(() => {
scrollElRef.current?.scrollToOffset({
@@ -443,8 +398,7 @@ const FeedSection = React.forwardRef(
feed={feed}
scrollElRef={scrollElRef}
onHasNew={setHasNew}
- onScroll={onScroll}
- scrollEventThrottle={1}
+ onScrolledDownChange={setIsScrolledDown}
renderEmptyState={renderPostsEmpty}
headerOffset={headerHeight}
renderEndOfFeed={ProfileEndOfFeed}
diff --git a/src/view/screens/ProfileFeed.tsx b/src/view/screens/ProfileFeed.tsx
index 620b1814af..cde39a33f4 100644
--- a/src/view/screens/ProfileFeed.tsx
+++ b/src/view/screens/ProfileFeed.tsx
@@ -1,25 +1,20 @@
import React, {useMemo, useCallback} from 'react'
-import {
- Dimensions,
- StyleSheet,
- View,
- ActivityIndicator,
- FlatList,
-} from 'react-native'
+import {Dimensions, StyleSheet, View, ActivityIndicator} from 'react-native'
import {NativeStackScreenProps} from '@react-navigation/native-stack'
-import {useNavigation} from '@react-navigation/native'
+import {useIsFocused, useNavigation} from '@react-navigation/native'
import {useQueryClient} from '@tanstack/react-query'
import {usePalette} from 'lib/hooks/usePalette'
import {HeartIcon, HeartIconSolid} from 'lib/icons'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {CommonNavigatorParams} from 'lib/routes/types'
import {makeRecordUri} from 'lib/strings/url-helpers'
-import {colors, s} from 'lib/styles'
+import {s} from 'lib/styles'
import {FeedDescriptor} from '#/state/queries/post-feed'
import {PagerWithHeader} from 'view/com/pager/PagerWithHeader'
import {ProfileSubpageHeader} from 'view/com/profile/ProfileSubpageHeader'
import {Feed} from 'view/com/posts/Feed'
import {TextLink} from 'view/com/util/Link'
+import {ListRef} from 'view/com/util/List'
import {Button} from 'view/com/util/forms/Button'
import {Text} from 'view/com/util/text/Text'
import {RichText} from 'view/com/util/text/RichText'
@@ -29,12 +24,13 @@ import {EmptyState} from 'view/com/util/EmptyState'
import * as Toast from 'view/com/util/Toast'
import {useSetTitle} from 'lib/hooks/useSetTitle'
import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed'
-import {OnScrollHandler} from 'lib/hooks/useOnMainScroll'
import {shareUrl} from 'lib/sharing'
import {toShareUrl} from 'lib/strings/url-helpers'
import {Haptics} from 'lib/haptics'
import {useAnalytics} from 'lib/analytics/analytics'
import {NativeDropdown, DropdownItem} from 'view/com/util/forms/NativeDropdown'
+import {useScrollHandlers} from '#/lib/ScrollContext'
+import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED'
import {makeCustomFeedLink} from 'lib/routes/links'
import {pluralize} from 'lib/strings/helpers'
import {CenteredView, ScrollView} from 'view/com/util/Views'
@@ -46,12 +42,7 @@ import {logger} from '#/logger'
import {Trans, msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {useModalControls} from '#/state/modals'
-import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED'
-import {
- useFeedSourceInfoQuery,
- FeedSourceFeedInfo,
- useIsFeedPublicQuery,
-} from '#/state/queries/feed'
+import {useFeedSourceInfoQuery, FeedSourceFeedInfo} from '#/state/queries/feed'
import {useResolveUriQuery} from '#/state/queries/resolve-uri'
import {
UsePreferencesQueryResponse,
@@ -137,10 +128,8 @@ export function ProfileFeedScreen(props: Props) {
function ProfileFeedScreenIntermediate({feedUri}: {feedUri: string}) {
const {data: preferences} = usePreferencesQuery()
const {data: info} = useFeedSourceInfoQuery({uri: feedUri})
- const {isLoading: isPublicStatusLoading, data: isPublicResponse} =
- useIsFeedPublicQuery({uri: feedUri})
- if (!preferences || !info || isPublicStatusLoading) {
+ if (!preferences || !info) {
return (
@@ -154,7 +143,6 @@ function ProfileFeedScreenIntermediate({feedUri}: {feedUri: string}) {
)
}
@@ -162,11 +150,9 @@ function ProfileFeedScreenIntermediate({feedUri}: {feedUri: string}) {
export function ProfileFeedScreenInner({
preferences,
feedInfo,
- isPublicResponse,
}: {
preferences: UsePreferencesQueryResponse
feedInfo: FeedSourceFeedInfo
- isPublicResponse: ReturnType['data']
}) {
const {_} = useLingui()
const pal = usePalette('default')
@@ -175,6 +161,7 @@ export function ProfileFeedScreenInner({
const {openComposer} = useComposerControls()
const {track} = useAnalytics()
const feedSectionRef = React.useRef(null)
+ const isScreenFocused = useIsFocused()
const {
mutateAsync: saveFeed,
@@ -210,6 +197,9 @@ export function ProfileFeedScreenInner({
useSetTitle(feedInfo?.displayName)
+ // event handlers
+ //
+
const onToggleSaved = React.useCallback(async () => {
try {
Haptics.default()
@@ -403,32 +393,21 @@ export function ProfileFeedScreenInner({
isHeaderReady={true}
renderHeader={renderHeader}
onCurrentPageSelected={onCurrentPageSelected}>
- {({onScroll, headerHeight, isScrolledDown, scrollElRef, isFocused}) =>
- isPublicResponse?.isPublic ? (
- | null>
- }
- isFocused={isFocused}
- />
- ) : (
-
-
-
- )
- }
- {({onScroll, headerHeight, scrollElRef}) => (
+ {({headerHeight, scrollElRef, isFocused}) => (
+
+ )}
+ {({headerHeight, scrollElRef}) => (
}
@@ -456,59 +435,16 @@ export function ProfileFeedScreenInner({
)
}
-function NonPublicFeedMessage({rawError}: {rawError?: Error}) {
- const pal = usePalette('default')
-
- return (
-
-
-
-
- Looks like this feed is only available to users with a Bluesky
- account. Please sign up or sign in to view this feed!
-
-
-
- {rawError?.message && (
-
- Message from server: {rawError.message}
-
- )}
-
-
- )
-}
-
interface FeedSectionProps {
feed: FeedDescriptor
- onScroll: OnScrollHandler
headerHeight: number
- isScrolledDown: boolean
- scrollElRef: React.MutableRefObject | null>
+ scrollElRef: ListRef
isFocused: boolean
}
const FeedSection = React.forwardRef(
- function FeedSectionImpl(
- {feed, onScroll, headerHeight, isScrolledDown, scrollElRef, isFocused},
- ref,
- ) {
+ function FeedSectionImpl({feed, headerHeight, scrollElRef, isFocused}, ref) {
const [hasNew, setHasNew] = React.useState(false)
+ const [isScrolledDown, setIsScrolledDown] = React.useState(false)
const queryClient = useQueryClient()
const onScrollToTop = useCallback(() => {
@@ -533,11 +469,10 @@ const FeedSection = React.forwardRef(
@@ -558,7 +493,6 @@ function AboutSection({
feedRkey,
feedInfo,
headerHeight,
- onScroll,
scrollElRef,
isOwner,
}: {
@@ -566,13 +500,13 @@ function AboutSection({
feedRkey: string
feedInfo: FeedSourceFeedInfo
headerHeight: number
- onScroll: OnScrollHandler
scrollElRef: React.MutableRefObject
isOwner: boolean
}) {
const pal = usePalette('default')
const {_} = useLingui()
- const scrollHandler = useAnimatedScrollHandler(onScroll)
+ const scrollHandlers = useScrollHandlers()
+ const onScroll = useAnimatedScrollHandler(scrollHandlers)
const [likeUri, setLikeUri] = React.useState(feedInfo.likeUri)
const {hasSession} = useSession()
const {track} = useAnalytics()
@@ -608,12 +542,12 @@ function AboutSection({
return (
+ }}>
{isLiked ? (
-
+
) : (
)}
@@ -689,9 +623,6 @@ const styles = StyleSheet.create({
borderRadius: 50,
marginLeft: 6,
},
- liked: {
- color: colors.red3,
- },
notFoundContainer: {
margin: 10,
paddingHorizontal: 18,
diff --git a/src/view/screens/ProfileList.tsx b/src/view/screens/ProfileList.tsx
index 3dcc7121fd..2db768cc57 100644
--- a/src/view/screens/ProfileList.tsx
+++ b/src/view/screens/ProfileList.tsx
@@ -1,12 +1,6 @@
import React, {useCallback, useMemo} from 'react'
-import {
- ActivityIndicator,
- FlatList,
- Pressable,
- StyleSheet,
- View,
-} from 'react-native'
-import {useFocusEffect} from '@react-navigation/native'
+import {ActivityIndicator, Pressable, StyleSheet, View} from 'react-native'
+import {useFocusEffect, useIsFocused} from '@react-navigation/native'
import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types'
import {useNavigation} from '@react-navigation/native'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
@@ -22,6 +16,7 @@ import {EmptyState} from 'view/com/util/EmptyState'
import {RichText} from 'view/com/util/text/RichText'
import {Button} from 'view/com/util/forms/Button'
import {TextLink} from 'view/com/util/Link'
+import {ListRef} from 'view/com/util/List'
import * as Toast from 'view/com/util/Toast'
import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn'
import {FAB} from 'view/com/util/fab/FAB'
@@ -31,7 +26,6 @@ import {usePalette} from 'lib/hooks/usePalette'
import {useSetTitle} from 'lib/hooks/useSetTitle'
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed'
-import {OnScrollHandler} from 'lib/hooks/useOnMainScroll'
import {NavigationProp} from 'lib/routes/types'
import {toShareUrl} from 'lib/strings/url-helpers'
import {shareUrl} from 'lib/sharing'
@@ -121,6 +115,7 @@ function ProfileListScreenLoaded({
const aboutSectionRef = React.useRef(null)
const {openModal} = useModalControls()
const isCurateList = list.purpose === 'app.bsky.graph.defs#curatelist'
+ const isScreenFocused = useIsFocused()
useSetTitle(list.name)
@@ -165,36 +160,22 @@ function ProfileListScreenLoaded({
isHeaderReady={true}
renderHeader={renderHeader}
onCurrentPageSelected={onCurrentPageSelected}>
- {({
- onScroll,
- headerHeight,
- isScrolledDown,
- scrollElRef,
- isFocused,
- }) => (
+ {({headerHeight, scrollElRef, isFocused}) => (
| null>
- }
- onScroll={onScroll}
+ scrollElRef={scrollElRef as ListRef}
headerHeight={headerHeight}
- isScrolledDown={isScrolledDown}
- isFocused={isFocused}
+ isFocused={isScreenFocused && isFocused}
/>
)}
- {({onScroll, headerHeight, isScrolledDown, scrollElRef}) => (
+ {({headerHeight, scrollElRef}) => (
| null>
- }
+ scrollElRef={scrollElRef as ListRef}
list={list}
onPressAddUser={onPressAddUser}
- onScroll={onScroll}
headerHeight={headerHeight}
- isScrolledDown={isScrolledDown}
/>
)}
@@ -221,16 +202,12 @@ function ProfileListScreenLoaded({
items={SECTION_TITLES_MOD}
isHeaderReady={true}
renderHeader={renderHeader}>
- {({onScroll, headerHeight, isScrolledDown, scrollElRef}) => (
+ {({headerHeight, scrollElRef}) => (
| null>
- }
+ scrollElRef={scrollElRef as ListRef}
onPressAddUser={onPressAddUser}
- onScroll={onScroll}
headerHeight={headerHeight}
- isScrolledDown={isScrolledDown}
/>
)}
@@ -615,19 +592,15 @@ function Header({rkey, list}: {rkey: string; list: AppBskyGraphDefs.ListView}) {
interface FeedSectionProps {
feed: FeedDescriptor
- onScroll: OnScrollHandler
headerHeight: number
- isScrolledDown: boolean
- scrollElRef: React.MutableRefObject | null>
+ scrollElRef: ListRef
isFocused: boolean
}
const FeedSection = React.forwardRef(
- function FeedSectionImpl(
- {feed, scrollElRef, onScroll, headerHeight, isScrolledDown, isFocused},
- ref,
- ) {
+ function FeedSectionImpl({feed, scrollElRef, headerHeight, isFocused}, ref) {
const queryClient = useQueryClient()
const [hasNew, setHasNew] = React.useState(false)
+ const [isScrolledDown, setIsScrolledDown] = React.useState(false)
const onScrollToTop = useCallback(() => {
scrollElRef.current?.scrollToOffset({
@@ -651,11 +624,10 @@ const FeedSection = React.forwardRef(
testID="listFeed"
enabled={isFocused}
feed={feed}
- pollInterval={30e3}
+ pollInterval={60e3}
scrollElRef={scrollElRef}
onHasNew={setHasNew}
- onScroll={onScroll}
- scrollEventThrottle={1}
+ onScrolledDownChange={setIsScrolledDown}
renderEmptyState={renderPostsEmpty}
headerOffset={headerHeight}
/>
@@ -674,20 +646,19 @@ const FeedSection = React.forwardRef(
interface AboutSectionProps {
list: AppBskyGraphDefs.ListView
onPressAddUser: () => void
- onScroll: OnScrollHandler
headerHeight: number
- isScrolledDown: boolean
- scrollElRef: React.MutableRefObject | null>
+ scrollElRef: ListRef
}
const AboutSection = React.forwardRef(
function AboutSectionImpl(
- {list, onPressAddUser, onScroll, headerHeight, isScrolledDown, scrollElRef},
+ {list, onPressAddUser, headerHeight, scrollElRef},
ref,
) {
const pal = usePalette('default')
const {_} = useLingui()
const {isMobile} = useWebMediaQueries()
const {currentAccount} = useSession()
+ const [isScrolledDown, setIsScrolledDown] = React.useState(false)
const isCurateList = list.purpose === 'app.bsky.graph.defs#curatelist'
const isOwner = list.creator.did === currentAccount?.did
@@ -817,8 +788,7 @@ const AboutSection = React.forwardRef(
renderHeader={renderHeader}
renderEmptyState={renderEmptyState}
headerOffset={headerHeight}
- onScroll={onScroll}
- scrollEventThrottle={1}
+ onScrolledDownChange={setIsScrolledDown}
/>
{isScrolledDown && (
}
keyExtractor={item => item.did}
@@ -243,7 +244,7 @@ function SearchScreenPostResults({query}: {query: string}) {
{isFetched ? (
<>
{posts.length ? (
- {
if (item.type === 'post') {
@@ -284,7 +285,7 @@ function SearchScreenUserResults({query}: {query: string}) {
return isFetched && results ? (
<>
{results.length ? (
- (
@@ -303,7 +304,8 @@ function SearchScreenUserResults({query}: {query: string}) {
)
}
-const SECTIONS = ['Posts', 'Users']
+const SECTIONS_LOGGEDOUT = ['Users']
+const SECTIONS_LOGGEDIN = ['Posts', 'Users']
export function SearchScreenInner({query}: {query?: string}) {
const pal = usePalette('default')
const setMinimalShellMode = useSetMinimalShellMode()
@@ -319,44 +321,62 @@ export function SearchScreenInner({query}: {query?: string}) {
[setDrawerSwipeDisabled, setMinimalShellMode],
)
+ if (hasSession) {
+ return query ? (
+ (
+
+
+
+ )}
+ initialPage={0}>
+
+
+
+
+
+
+
+ ) : (
+
+
+
+ Suggested Follows
+
+
+
+
+
+ )
+ }
+
return query ? (
(
-
+
)}
initialPage={0}>
-
-
-
- ) : hasSession ? (
-
-
-
- Suggested Follows
-
-
-
-
-
) : (
)}
-
- Search for posts and users.
-
+
+
+
+ {isDesktop ? (
+ Find users with the search tool on the right
+ ) : (
+ Find users on Bluesky
+ )}
+
+
)
diff --git a/src/view/shell/Drawer.tsx b/src/view/shell/Drawer.tsx
index 4d3a9531de..e5d2a38639 100644
--- a/src/view/shell/Drawer.tsx
+++ b/src/view/shell/Drawer.tsx
@@ -221,19 +221,17 @@ let DrawerContent = ({}: {}): React.ReactNode => {
)}
- {hasSession && }
- {hasSession && }
-
-
- {hasSession && (
-
- )}
-
- {hasSession && (
+ {hasSession ? (
<>
+
+
+
+
+
+ {
/>
>
+ ) : (
+
)}
diff --git a/src/view/shell/NavSignupCard.tsx b/src/view/shell/NavSignupCard.tsx
index 11dd7ffee4..bae37e8380 100644
--- a/src/view/shell/NavSignupCard.tsx
+++ b/src/view/shell/NavSignupCard.tsx
@@ -5,22 +5,28 @@ import {useLingui} from '@lingui/react'
import {s} from 'lib/styles'
import {usePalette} from 'lib/hooks/usePalette'
-import {DefaultAvatar} from '#/view/com/util/UserAvatar'
import {Text} from '#/view/com/util/text/Text'
import {Button} from '#/view/com/util/forms/Button'
import {useLoggedOutViewControls} from '#/state/shell/logged-out'
import {useCloseAllActiveElements} from '#/state/util'
+import {Logo} from '#/view/icons/Logo'
let NavSignupCard = ({}: {}): React.ReactNode => {
const {_} = useLingui()
const pal = usePalette('default')
- const {setShowLoggedOut} = useLoggedOutViewControls()
+ const {requestSwitchToAccount} = useLoggedOutViewControls()
const closeAllActiveElements = useCloseAllActiveElements()
- const showLoggedOut = React.useCallback(() => {
+ const showSignIn = React.useCallback(() => {
closeAllActiveElements()
- setShowLoggedOut(true)
- }, [setShowLoggedOut, closeAllActiveElements])
+ requestSwitchToAccount({requestedAccount: 'none'})
+ }, [requestSwitchToAccount, closeAllActiveElements])
+
+ const showCreateAccount = React.useCallback(() => {
+ closeAllActiveElements()
+ requestSwitchToAccount({requestedAccount: 'new'})
+ // setShowLoggedOut(true)
+ }, [requestSwitchToAccount, closeAllActiveElements])
return (
{
paddingTop: 6,
marginBottom: 24,
}}>
-
+
-
-
+
+ Sign up or sign in to join the conversation
)
diff --git a/src/view/shell/bottom-bar/BottomBarWeb.tsx b/src/view/shell/bottom-bar/BottomBarWeb.tsx
index 3a60bd3b1d..c5dc376b72 100644
--- a/src/view/shell/bottom-bar/BottomBarWeb.tsx
+++ b/src/view/shell/bottom-bar/BottomBarWeb.tsx
@@ -3,6 +3,9 @@ import {usePalette} from 'lib/hooks/usePalette'
import {useNavigationState} from '@react-navigation/native'
import Animated from 'react-native-reanimated'
import {useSafeAreaInsets} from 'react-native-safe-area-context'
+import {View} from 'react-native'
+import {msg, Trans} from '@lingui/macro'
+import {useLingui} from '@lingui/react'
import {getCurrentRoute, isTab} from 'lib/routes/helpers'
import {styles} from './BottomBarStyles'
import {clamp} from 'lib/numbers'
@@ -22,12 +25,33 @@ import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode'
import {makeProfileLink} from 'lib/routes/links'
import {CommonNavigatorParams} from 'lib/routes/types'
import {useSession} from '#/state/session'
+import {useLoggedOutViewControls} from '#/state/shell/logged-out'
+import {useCloseAllActiveElements} from '#/state/util'
+import {Button} from '#/view/com/util/forms/Button'
+import {Text} from '#/view/com/util/text/Text'
+import {s} from 'lib/styles'
+import {Logo} from '#/view/icons/Logo'
+import {Logotype} from '#/view/icons/Logotype'
export function BottomBarWeb() {
+ const {_} = useLingui()
const {hasSession, currentAccount} = useSession()
const pal = usePalette('default')
const safeAreaInsets = useSafeAreaInsets()
const {footerMinimalShellTransform} = useMinimalShellMode()
+ const {requestSwitchToAccount} = useLoggedOutViewControls()
+ const closeAllActiveElements = useCloseAllActiveElements()
+
+ const showSignIn = React.useCallback(() => {
+ closeAllActiveElements()
+ requestSwitchToAccount({requestedAccount: 'none'})
+ }, [requestSwitchToAccount, closeAllActiveElements])
+
+ const showCreateAccount = React.useCallback(() => {
+ closeAllActiveElements()
+ requestSwitchToAccount({requestedAccount: 'new'})
+ // setShowLoggedOut(true)
+ }, [requestSwitchToAccount, closeAllActiveElements])
return (
-
- {({isActive}) => {
- const Icon = isActive ? HomeIconSolid : HomeIcon
- return (
-
- )
- }}
-
-
- {({isActive}) => {
- const Icon = isActive
- ? MagnifyingGlassIcon2Solid
- : MagnifyingGlassIcon2
- return (
-
- )
- }}
-
-
- {({isActive}) => {
- return (
-
- )
- }}
-
-
- {hasSession && (
+ {hasSession ? (
<>
-
+
{({isActive}) => {
- const Icon = isActive ? BellIconSolid : BellIcon
+ const Icon = isActive ? HomeIconSolid : HomeIcon
return (
)
}}
-
+
{({isActive}) => {
- const Icon = isActive ? UserIconSolid : UserIcon
+ const Icon = isActive
+ ? MagnifyingGlassIcon2Solid
+ : MagnifyingGlassIcon2
return (
)
}}
+
+ {hasSession && (
+ <>
+
+ {({isActive}) => {
+ return (
+
+ )
+ }}
+
+
+ {({isActive}) => {
+ const Icon = isActive ? BellIconSolid : BellIcon
+ return (
+
+ )
+ }}
+
+
+ {({isActive}) => {
+ const Icon = isActive ? UserIconSolid : UserIcon
+ return (
+
+ )
+ }}
+
+ >
+ )}
+ >
+ ) : (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+ Sign up
+
+
+
+
+
+ Sign in
+
+
+
+
>
)}
diff --git a/src/view/shell/desktop/LeftNav.tsx b/src/view/shell/desktop/LeftNav.tsx
index e294431f31..df6cb64999 100644
--- a/src/view/shell/desktop/LeftNav.tsx
+++ b/src/view/shell/desktop/LeftNav.tsx
@@ -266,6 +266,10 @@ export function DesktopLeftNav() {
const {isDesktop, isTablet} = useWebMediaQueries()
const numUnread = useUnreadNotifications()
+ if (!hasSession && !isDesktop) {
+ return null
+ }
+
return (
) : null}
-
-
- }
- iconFilled={
-
- }
- label={_(msg`Home`)}
- />
-
- }
- iconFilled={
-
- }
- label={_(msg`Search`)}
- />
-
- }
- iconFilled={
-
- }
- label={_(msg`Feeds`)}
- />
-
{hasSession && (
<>
+
+
+ }
+ iconFilled={
+
+ }
+ label={_(msg`Home`)}
+ />
+
+ }
+ iconFilled={
+
+ }
+ label={_(msg`Search`)}
+ />
+
+ }
+ iconFilled={
+
+ }
+ label={_(msg`Feeds`)}
+ />
}
- label="Profile"
+ label={_(msg`Profile`)}
/>
) : undefined}
-
+
{hasSession && (
<>
-
-
-
-
-
-
-
+
+
+
+
+
+
)
}
diff --git a/yarn.lock b/yarn.lock
index e58cba1641..ab569ca5b8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -48,10 +48,10 @@
typed-emitter "^2.1.0"
zod "^3.21.4"
-"@atproto/api@^0.7.3":
- version "0.7.3"
- resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.7.3.tgz#3224000353619970d5e397a157c6e189e195ef47"
- integrity sha512-fKU+W+S4kKxClE6IcPBHPZAjcyBYxG28S0FW/bv3T/ZYDkNxGzDV4xuoHOyEDGtB30slltl5U83njuuRZs5xtw==
+"@atproto/api@^0.7.4":
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.7.4.tgz#0dd6e725c88d1f941c57670dc82b60fde10f4ec6"
+ integrity sha512-7DBy6/OcXemzCPzA0dx52LLYRABBs8bq9Docs3is+WRgEx5/Pd1kHSAlCHIaBhsym8fZ3/U4Fks/5FSHkSm4yQ==
dependencies:
"@atproto/common-web" "^0.2.3"
"@atproto/lexicon" "^0.3.1"
@@ -4448,6 +4448,11 @@
resolved "https://registry.yarnpkg.com/@react-native-community/eslint-plugin/-/eslint-plugin-1.3.0.tgz#9e558170c106bbafaa1ef502bd8e6d4651012bf9"
integrity sha512-+zDZ20NUnSWghj7Ku5aFphMzuM9JulqCW+aPXT6IfIXFbb8tzYTTOSeRFOtuekJ99ibW2fUCSsjuKNlwDIbHFg==
+"@react-native-masked-view/masked-view@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@react-native-masked-view/masked-view/-/masked-view-0.3.1.tgz#5bd76f17004a6ccbcec03856893777ee91f23d29"
+ integrity sha512-uVm8U6nwFIlUd1iDIB5cS+lDadApKR+l8k4k84d9hn+GN4lzAIJhUZ9syYX7c022MxNgAlbxoFLt0pqKoyaAGg==
+
"@react-native-menu/menu@^0.8.0":
version "0.8.0"
resolved "https://registry.yarnpkg.com/@react-native-menu/menu/-/menu-0.8.0.tgz#dbf227c2081e5ffd3d2073ee68ecc84cf8639727"