···108108 {% else %}
109109 <meta property="og:title" content="@{{ profileHandle }}">
110110 {% endif -%}
111111- <meta name="description" content="This post requires authentication to view.">
112112- <meta property="og:description" content="This post requires authentication to view.">
113113- <meta property="twitter:description" content="This post requires authentication to view.">
111111+ <meta name="description" content="This author has chosen to make their posts visible only to people who are signed in.">
112112+ <meta property="og:description" content="This author has chosen to make their posts visible only to people who are signed in.">
113113+ <meta property="twitter:description" content="This author has chosen to make their posts visible only to people who are signed in.">
114114 <meta name="twitter:card" content="summary">
115115{% endif -%}
116116{%- endblock %}
···129129<div id="bsky_post_summary">
130130 <h3>Post</h3>
131131 <p id="bsky_handle">{{ profileHandle }}</p>
132132- <p id="bsky_post_text">This post requires authentication to view.</p>
132132+ <p id="bsky_post_text">This author has chosen to make their posts visible only to people who are signed in.</p>
133133</div>
134134{% endif -%}
135135{%- endblock %}
···11-diff --git a/node_modules/react-native-screens/ios/RNSScreen.mm b/node_modules/react-native-screens/ios/RNSScreen.mm
22-index b62a2e2..cb469db 100644
33---- a/node_modules/react-native-screens/ios/RNSScreen.mm
44-+++ b/node_modules/react-native-screens/ios/RNSScreen.mm
55-@@ -729,9 +729,26 @@ - (void)notifyTransitionProgress:(double)progress closing:(BOOL)closing goingFor
66- #endif
77- }
88-99--#if !RCT_NEW_ARCH_ENABLED
1010-+- (void)willMoveToWindow:(UIWindow *)newWindow
1111-+{
1212-+ if (@available(iOS 26, *)) {
1313-+ // In iOS 26, as soon as another screen appears in transition, it is interactable
1414-+ // To avoid glitches resulting from clicking buttons mid transition, we temporarily disable all interactions
1515-+ // Disabling interactions for parent navigation controller won't be enough in case of nested stack
1616-+ // Furthermore, a stack put inside a modal will exist in an entirely different hierarchy
1717-+ // To be sure, we block interactions on the whole window.
1818-+ // Note that newWindows is nil when moving from instead of moving to, and Obj-C handles nil correctly
1919-+ newWindow.userInteractionEnabled = false;
2020-+ }
2121-+}
2222-+
2323- - (void)presentationControllerWillDismiss:(UIPresentationController *)presentationController
2424- {
2525-+ if (@available(iOS 26, *)) {
2626-+ // Disable interactions to disallow multiple modals dismissed at once; see willMoveToWindow
2727-+ presentationController.containerView.window.userInteractionEnabled = false;
2828-+ }
2929-+#if !RCT_NEW_ARCH_ENABLED
3030- // On Paper, we need to call both "cancel" and "reset" here because RN's gesture
3131- // recognizer does not handle the scenario when it gets cancelled by other top
3232- // level gesture recognizer. In this case by the modal dismiss gesture.
3333-@@ -744,8 +761,8 @@ - (void)presentationControllerWillDismiss:(UIPresentationController *)presentati
3434- // down.
3535- [_touchHandler cancel];
3636- [_touchHandler reset];
3737--}
3838- #endif // !RCT_NEW_ARCH_ENABLED
3939-+}
4040-4141- - (BOOL)presentationControllerShouldDismiss:(UIPresentationController *)presentationController
4242- {
4343-@@ -757,6 +774,10 @@ - (BOOL)presentationControllerShouldDismiss:(UIPresentationController *)presenta
4444-4545- - (void)presentationControllerDidAttemptToDismiss:(UIPresentationController *)presentationController
4646- {
4747-+ if (@available(iOS 26, *)) {
4848-+ // Reenable interactions; see presentationControllerWillDismiss
4949-+ presentationController.containerView.window.userInteractionEnabled = true;
5050-+ }
5151- // NOTE(kkafar): We should consider depracating the use of gesture cancel here & align
5252- // with usePreventRemove API of react-navigation v7.
5353- [self notifyGestureCancel];
5454-@@ -767,6 +788,11 @@ - (void)presentationControllerDidAttemptToDismiss:(UIPresentationController *)pr
5555-5656- - (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController
5757- {
5858-+ if (@available(iOS 26, *)) {
5959-+ // Reenable interactions; see presentationControllerWillDismiss
6060-+ // Dismissed screen doesn't hold a reference to window, but presentingViewController.view does
6161-+ presentationController.presentingViewController.view.window.userInteractionEnabled = true;
6262-+ }
6363- if ([_reactSuperview respondsToSelector:@selector(presentationControllerDidDismiss:)]) {
6464- [_reactSuperview performSelector:@selector(presentationControllerDidDismiss:) withObject:presentationController];
6565- }
6666-@@ -1518,6 +1544,10 @@ - (void)viewWillDisappear:(BOOL)animated
6767-6868- - (void)viewDidAppear:(BOOL)animated
6969- {
7070-+ if (@available(iOS 26, *)) {
7171-+ // Reenable interactions, see willMoveToWindow
7272-+ self.view.window.userInteractionEnabled = true;
7373-+ }
7474- [super viewDidAppear:animated];
7575- if (!_isSwiping || _shouldNotify) {
7676- // we are going forward or dismissing without swipe
7777-diff --git a/node_modules/react-native-screens/ios/RNSScreenStack.mm b/node_modules/react-native-screens/ios/RNSScreenStack.mm
7878-index 229dc58..10b365b 100644
7979---- a/node_modules/react-native-screens/ios/RNSScreenStack.mm
8080-+++ b/node_modules/react-native-screens/ios/RNSScreenStack.mm
8181-@@ -62,26 +62,6 @@ @interface RNSScreenStackView () <
8282-8383- @implementation RNSNavigationController
8484-8585--#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
8686--- (void)viewDidLoad
8787--{
8888-- // iOS 26 introduces new gesture recognizer which replaces our RNSPanGestureRecognizer.
8989-- // The problem is that we are not able to handle it here for various reasons:
9090-- // - the new recognizer comes with its own delegate and our current approach is to wire
9191-- // all recognizers to RNSScreenStackView; to be 100% sure we don't break the logic,
9292-- // we would have to decorate its delegate and call it after our code, which would
9393-- // break other recognizers that the stack view is the delegate for
9494-- // - when RNSScreenStackView.setupGestureHandler method is called, the recognizer hasn't been
9595-- // loaded yet and there is no other place to configure in a not "hacky" way
9696-- // - the official docs warn us to not use it for anything other than "setting up failure requirements with it"
9797-- // - we expose fullScreenGestureEnabled prop to enable/disable the feature,
9898-- // so we need control over the delegate
9999-- if (@available(iOS 26.0, *)) {
100100-- self.interactiveContentPopGestureRecognizer.enabled = NO;
101101-- }
102102--}
103103--#endif // iOS 26
104104--
105105- #if !TARGET_OS_TV
106106- - (UIViewController *)childViewControllerForStatusBarStyle
107107- {
108108-@@ -219,50 +199,6 @@ - (bool)onRepeatedTabSelectionOfTabScreenController:(RNSTabsScreenViewController
109109- return false;
110110- }
111111-112112--#pragma mark - UINavigationBarDelegate
113113--
114114--#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
115115--- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
116116--{
117117-- if (@available(iOS 26, *)) {
118118-- // To prevent popping multiple screens when back button is pressed repeatedly,
119119-- // We allow for pop operation to proceed only if no transition is in progress,
120120-- // which we check indirectly by checking if transitionCoordinator is set.
121121-- // If it's not, we are safe to proceed.
122122-- if (self.transitionCoordinator == nil) {
123123-- // We still need to disable interactions for back button so click effects are not applied,
124124-- // and there is unfortunately no better place for it currently
125125-- UIView *button = [navigationBar rnscreens_findBackButtonWrapperView];
126126-- if (button != nil) {
127127-- button.userInteractionEnabled = false;
128128-- }
129129--
130130-- return true;
131131-- }
132132--
133133-- return false;
134134-- }
135135--
136136-- return true;
137137--}
138138--
139139--- (void)navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item
140140--{
141141-- if (@available(iOS 26, *)) {
142142-- // Reset interactions on back button -> see navigationBar:shouldPopItem
143143-- // IMPORTANT: This reset won't execute when preventNativeDismiss is on.
144144-- // However, on iOS 26, unlike in previous versions, the back button instance changes
145145-- // when handling preventNativeDismiss and userIteractionEnabled is reset.
146146-- // The instance also changes when regular screen pop happens, but in that case
147147-- // the value of userInteractionEnabled is carried on, and we reset it here.
148148-- UIView *button = [navigationBar rnscreens_findBackButtonWrapperView];
149149-- if (button != nil) {
150150-- button.userInteractionEnabled = true;
151151-- }
152152-- }
153153--}
154154--#endif // Check for iOS >= 26
155155--
156156- #pragma mark - RNSFrameCorrectionProvider
157157-158158- #ifdef RNS_GAMMA_ENABLED
159159-@@ -327,7 +263,7 @@ @implementation RNSScreenStackView {
160160- UINavigationController *_controller;
161161- NSMutableArray<RNSScreenView *> *_reactSubviews;
162162- BOOL _invalidated;
163163-- BOOL _isFullWidthSwiping;
164164-+ BOOL _isFullWidthSwipingWithPanGesture; // used only for content swipe with RNSPanGestureRecognizer
165165- RNSPercentDrivenInteractiveTransition *_interactionController;
166166- __weak RNSScreenStackManager *_manager;
167167- BOOL _updateScheduled;
168168-@@ -522,6 +458,11 @@ - (void)reactAddControllerToClosestParent:(UIViewController *)controller
169169- [self addSubview:controller.view];
170170- #if !TARGET_OS_TV
171171- _controller.interactivePopGestureRecognizer.delegate = self;
172172-+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
173173-+ if (@available(iOS 26, *)) {
174174-+ _controller.interactiveContentPopGestureRecognizer.delegate = self;
175175-+ }
176176-+#endif // Check for iOS >= 26.0
177177- #endif
178178- [controller didMoveToParentViewController:parentView.reactViewController];
179179- // On iOS pre 12 we observed that `willShowViewController` delegate method does not always
180180-@@ -943,7 +884,7 @@ - (void)dismissOnReload
181181- // when preventing the native dismiss with back button, we have to return the animator.
182182- // Also, we need to return the animator when full width swiping even if the animation is not custom,
183183- // otherwise the screen will be just popped immediately due to no animation
184184-- ((operation == UINavigationControllerOperationPop && shouldCancelDismiss) || _isFullWidthSwiping ||
185185-+ ((operation == UINavigationControllerOperationPop && shouldCancelDismiss) || _isFullWidthSwipingWithPanGesture ||
186186- [RNSScreenStackAnimator isCustomAnimation:screen.stackAnimation] || _customAnimation)) {
187187- return [[RNSScreenStackAnimator alloc] initWithOperation:operation];
188188- }
189189-@@ -967,23 +908,39 @@ - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
190190- }
191191- RNSScreenView *topScreen = _reactSubviews.lastObject;
192192-193193-+ BOOL customAnimationOnSwipePropSetAndSelectedAnimationIsCustom =
194194-+ topScreen.customAnimationOnSwipe && [RNSScreenStackAnimator isCustomAnimation:topScreen.stackAnimation];
195195-+
196196- #if TARGET_OS_TV || TARGET_OS_VISION
197197- [self cancelTouchesInParent];
198198- return YES;
199199- #else
200200-- // RNSPanGestureRecognizer will receive events iff topScreen.fullScreenSwipeEnabled == YES;
201201-- // Events are filtered in gestureRecognizer:shouldReceivePressOrTouchEvent: method
202202- if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]]) {
203203-- if ([self isInGestureResponseDistance:gestureRecognizer topScreen:topScreen]) {
204204-- _isFullWidthSwiping = YES;
205205-- [self cancelTouchesInParent];
206206-- return YES;
207207-+ // On iOS < 26, we have a custom full screen swipe recognizer that functions similarily
208208-+ // to interactiveContentPopGestureRecognizer introduced in iOS 26.
209209-+ // On iOS >= 26, we want to use the native one, but we are unable to handle custom animations
210210-+ // with native interactiveContentPopGestureRecognizer, so we have to fallback to the old implementation.
211211-+ // In this case, the old one should behave as close as the new native one, having only the difference
212212-+ // in animation, and without any customization that is exclusive for it (e.g. gestureResponseDistance).
213213-+ if (@available(iOS 26, *)) {
214214-+ if (customAnimationOnSwipePropSetAndSelectedAnimationIsCustom) {
215215-+ _isFullWidthSwipingWithPanGesture = YES;
216216-+ [self cancelTouchesInParent];
217217-+ return YES;
218218-+ }
219219-+ return NO;
220220-+ } else {
221221-+ if ([self isInGestureResponseDistance:gestureRecognizer topScreen:topScreen]) {
222222-+ _isFullWidthSwipingWithPanGesture = YES;
223223-+ [self cancelTouchesInParent];
224224-+ return YES;
225225-+ }
226226-+ return NO;
227227- }
228228-- return NO;
229229- }
230230-231231- // Now we're dealing with RNSScreenEdgeGestureRecognizer (or _UIParallaxTransitionPanGestureRecognizer)
232232-- if (topScreen.customAnimationOnSwipe && [RNSScreenStackAnimator isCustomAnimation:topScreen.stackAnimation]) {
233233-+ if (customAnimationOnSwipePropSetAndSelectedAnimationIsCustom) {
234234- if ([gestureRecognizer isKindOfClass:[RNSScreenEdgeGestureRecognizer class]]) {
235235- UIRectEdge edges = ((RNSScreenEdgeGestureRecognizer *)gestureRecognizer).edges;
236236- BOOL isRTL = _controller.view.semanticContentAttribute == UISemanticContentAttributeForceRightToLeft;
237237-@@ -1028,7 +985,9 @@ - (void)setupGestureHandlers
238238- rightEdgeSwipeGestureRecognizer.delegate = self;
239239- [self addGestureRecognizer:rightEdgeSwipeGestureRecognizer];
240240-241241-- // gesture recognizer for full width swipe gesture
242242-+ // Starting from iOS 26, RNSPanGestureRecognizer has been mostly replaced by native
243243-+ // interactiveContentPopGestureRecognizer. It still needs to handle custom dismiss animations,
244244-+ // which we are not able to handle with the latter.
245245- RNSPanGestureRecognizer *panRecognizer = [[RNSPanGestureRecognizer alloc] initWithTarget:self
246246- action:@selector(handleSwipe:)];
247247- panRecognizer.delegate = self;
248248-@@ -1091,7 +1050,7 @@ - (void)handleSwipe:(UIPanGestureRecognizer *)gestureRecognizer
249249- [_interactionController cancelInteractiveTransition];
250250- }
251251- _interactionController = nil;
252252-- _isFullWidthSwiping = NO;
253253-+ _isFullWidthSwipingWithPanGesture = NO;
254254- }
255255- default: {
256256- break;
257257-@@ -1225,14 +1184,6 @@ - (BOOL)isScrollViewPanGestureRecognizer:(UIGestureRecognizer *)gestureRecognize
258258- // Be careful when adding another type of gesture recognizer.
259259- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePressOrTouchEvent:(NSObject *)event
260260- {
261261-- if (@available(iOS 26, *)) {
262262-- // in iOS 26, you can swipe to pop screen before the previous one finished transitioning;
263263-- // this prevents from registering the second gesture
264264-- if ([self isTransitionInProgress]) {
265265-- return NO;
266266-- }
267267-- }
268268--
269269- RNSScreenView *topScreen = _reactSubviews.lastObject;
270270-271271- for (RNSScreenView *s in _reactSubviews.reverseObjectEnumerator) {
272272-@@ -1249,10 +1200,30 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive
273273- return NO;
274274- }
275275-276276-+ BOOL customAnimationOnSwipePropSetAndSelectedAnimationIsCustom =
277277-+ topScreen.customAnimationOnSwipe && [RNSScreenStackAnimator isCustomAnimation:topScreen.stackAnimation];
278278-+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
279279-+ if (@available(iOS 26, *)) {
280280-+ // On iOS 26, fullScreenSwipeEnabled takes no effect, and depending on whether custom animations are on,
281281-+ // we select either interactiveContentPopGestureRecognizer or RNSPanGestureRecognizer
282282-+ if (([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]] &&
283283-+ !customAnimationOnSwipePropSetAndSelectedAnimationIsCustom) ||
284284-+ (gestureRecognizer == _controller.interactiveContentPopGestureRecognizer &&
285285-+ customAnimationOnSwipePropSetAndSelectedAnimationIsCustom)) {
286286-+ return NO;
287287-+ }
288288-+ } else {
289289-+ // We want to pass events to RNSPanGestureRecognizer iff full screen swipe is enabled.
290290-+ if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]]) {
291291-+ return topScreen.fullScreenSwipeEnabled;
292292-+ }
293293-+ }
294294-+#else // check for iOS >= 26
295295- // We want to pass events to RNSPanGestureRecognizer iff full screen swipe is enabled.
296296- if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]]) {
297297- return topScreen.fullScreenSwipeEnabled;
298298- }
299299-+#endif // check for iOS >= 26
300300-301301- // RNSScreenEdgeGestureRecognizer || _UIParallaxTransitionPanGestureRecognizer
302302- return YES;
303303-@@ -1268,15 +1239,6 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive
304304- return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:touch];
305305- }
306306-307307--- (BOOL)isTransitionInProgress
308308--{
309309-- if (_controller.transitionCoordinator != nil) {
310310-- return YES;
311311-- }
312312--
313313-- return NO;
314314--}
315315--
316316- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
317317- shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
318318- {
319319-@@ -1289,7 +1251,6 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
320320- if (gestureRecognizer.state == UIGestureRecognizerStateBegan || isBackGesture) {
321321- return NO;
322322- }
323323--
324324- return YES;
325325- }
326326- return NO;
+13-3
src/Navigation.tsx
···646646 * The TabsNavigator is used by native mobile to represent the routes
647647 * in 3 distinct tab-stacks with a different root screen on each.
648648 */
649649-function TabsNavigator() {
649649+function TabsNavigator({
650650+ layout,
651651+}: {
652652+ layout: React.ComponentProps<typeof Tab.Navigator>['layout']
653653+}) {
650654 const tabBar = useCallback(
651655 (props: JSX.IntrinsicAttributes & BottomTabBarProps) => (
652656 <BottomBar {...props} />
···659663 initialRouteName="HomeTab"
660664 backBehavior="initialRoute"
661665 screenOptions={{headerShown: false, lazy: true}}
662662- tabBar={tabBar}>
666666+ tabBar={tabBar}
667667+ layout={layout}>
663668 <Tab.Screen name="HomeTab" getComponent={() => HomeTabNavigator} />
664669 <Tab.Screen name="SearchTab" getComponent={() => SearchTabNavigator} />
665670 <Tab.Screen
···767772 * The FlatNavigator is used by Web to represent the routes
768773 * in a single ("flat") stack.
769774 */
770770-const FlatNavigator = () => {
775775+const FlatNavigator = ({
776776+ layout,
777777+}: {
778778+ layout: React.ComponentProps<typeof Flat.Navigator>['layout']
779779+}) => {
771780 const t = useTheme()
772781 const numUnread = useUnreadNotifications()
773782 const screenListeners = useWebScrollRestoration()
···775784776785 return (
777786 <Flat.Navigator
787787+ layout={layout}
778788 screenListeners={screenListeners}
779789 screenOptions={screenOptions(t)}>
780790 <Flat.Screen
···55import {useLingui} from '@lingui/react'
6677import {cleanError} from '#/lib/strings/errors'
88-import {useWarnMaxGraphemeCount} from '#/lib/strings/helpers'
88+import {isOverMaxGraphemeCount} from '#/lib/strings/helpers'
99import {richTextToString} from '#/lib/strings/rich-text-helpers'
1010import {shortenLinks, stripInvalidMentions} from '#/lib/strings/rich-text-manip'
1111import {logger} from '#/logger'
···262262 _,
263263 ])
264264265265- const displayNameTooLong = useWarnMaxGraphemeCount({
265265+ const displayNameTooLong = isOverMaxGraphemeCount({
266266 text: displayName,
267267 maxCount: DISPLAY_NAME_MAX_GRAPHEMES,
268268 })
269269- const descriptionTooLong = useWarnMaxGraphemeCount({
269269+ const descriptionTooLong = isOverMaxGraphemeCount({
270270 text: descriptionRt,
271271 maxCount: DESCRIPTION_MAX_GRAPHEMES,
272272 })
+1-2
src/components/moderation/ReportDialog/index.tsx
···11import React from 'react'
22-import {Pressable, View} from 'react-native'
33-import {type ScrollView} from 'react-native-gesture-handler'
22+import {Pressable, type ScrollView, View} from 'react-native'
43import {type AppBskyLabelerDefs, BSKY_LABELER_DID} from '@atproto/api'
54import {msg, Trans} from '@lingui/macro'
65import {useLingui} from '@lingui/react'
+7-27
src/lib/strings/helpers.ts
···11-import {useCallback, useMemo} from 'react'
21import {type RichText} from '@atproto/api'
33-import Graphemer from 'graphemer'
22+import {countGraphemes} from 'unicode-segmenter/grapheme'
4354import {shortenLinks} from './rich-text-manip'
65···2928 return str
3029}
31303232-export function useEnforceMaxGraphemeCount() {
3333- const splitter = useMemo(() => new Graphemer(), [])
3434-3535- return useCallback(
3636- (text: string, maxCount: number) => {
3737- if (splitter.countGraphemes(text) > maxCount) {
3838- return splitter.splitGraphemes(text).slice(0, maxCount).join('')
3939- } else {
4040- return text
4141- }
4242- },
4343- [splitter],
4444- )
4545-}
4646-4747-export function useWarnMaxGraphemeCount({
3131+export function isOverMaxGraphemeCount({
4832 text,
4933 maxCount,
5034}: {
5135 text: string | RichText
5236 maxCount: number
5337}) {
5454- const splitter = useMemo(() => new Graphemer(), [])
5555-5656- return useMemo(() => {
5757- if (typeof text === 'string') {
5858- return splitter.countGraphemes(text) > maxCount
5959- } else {
6060- return shortenLinks(text).graphemeLength > maxCount
6161- }
6262- }, [splitter, maxCount, text])
3838+ if (typeof text === 'string') {
3939+ return countGraphemes(text) > maxCount
4040+ } else {
4141+ return shortenLinks(text).graphemeLength > maxCount
4242+ }
6343}
64446545export function countLines(str: string | undefined): number {
···436436msgstr ""
437437438438#: src/screens/Settings/FindContactsSettings.tsx:430
439439-msgid "{numMatches, plural, one {1 contact found} other {# contacts found}}"
439439+msgid "{numMatches, plural, one {# contact found} other {# contacts found}}"
440440msgstr ""
441441442442#: src/components/NewskieDialog.tsx:113
···574574msgid "A screenshot of a profile page with a bell icon next to the follow button, indicating the new activity notifications feature."
575575msgstr ""
576576577577-#: src/Navigation.tsx:534
577577+#: src/Navigation.tsx:535
578578#: src/screens/Settings/AboutSettings.tsx:75
579579#: src/screens/Settings/Settings.tsx:262
580580#: src/screens/Settings/Settings.tsx:265
···609609msgid "Accessibility"
610610msgstr ""
611611612612-#: src/Navigation.tsx:385
612612+#: src/Navigation.tsx:386
613613msgid "Accessibility Settings"
614614msgstr ""
615615616616-#: src/Navigation.tsx:401
616616+#: src/Navigation.tsx:402
617617#: src/screens/Login/LoginForm.tsx:194
618618#: src/screens/Settings/AccountSettings.tsx:51
619619#: src/screens/Settings/Settings.tsx:180
···648648msgid "Account Muted by List"
649649msgstr ""
650650651651-#: src/screens/Settings/Settings.tsx:644
651651+#: src/screens/Settings/Settings.tsx:646
652652msgid "Account options"
653653msgstr ""
654654···656656msgid "Account provider"
657657msgstr ""
658658659659-#: src/screens/Settings/Settings.tsx:680
659659+#: src/screens/Settings/Settings.tsx:682
660660msgid "Account removed from quick access"
661661msgstr ""
662662···688688msgid "Activity from others"
689689msgstr ""
690690691691-#: src/Navigation.tsx:502
691691+#: src/Navigation.tsx:503
692692msgid "Activity notifications"
693693msgstr ""
694694···770770msgid "Add emoji reaction"
771771msgstr ""
772772773773-#: src/view/com/feeds/ComposerPrompt.tsx:224
773773+#: src/view/com/feeds/ComposerPrompt.tsx:222
774774msgid "Add image"
775775msgstr ""
776776···10111011msgid "Already signed in as @{0}"
10121012msgstr ""
1013101310141014-#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:186
10141014+#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:197
10151015#: src/view/com/composer/GifAltText.tsx:100
10161016#: src/view/com/composer/photos/Gallery.tsx:188
10171017msgid "ALT"
···10271027msgid "Alt text"
10281028msgstr ""
1029102910301030-#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:191
10301030+#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:202
10311031msgid "Alt Text"
10321032msgstr ""
10331033···11671167msgid "Animals"
11681168msgstr ""
1169116911701170-#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:149
11701170+#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:160
11711171msgid "Animated GIF"
11721172msgstr ""
11731173···11931193msgid "Anyone who follows me"
11941194msgstr ""
1195119511961196-#: src/Navigation.tsx:542
11961196+#: src/Navigation.tsx:543
11971197#: src/screens/Settings/AppIconSettings/index.tsx:67
11981198#: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:18
11991199#: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:23
···12341234msgid "App passwords"
12351235msgstr ""
1236123612371237-#: src/Navigation.tsx:353
12371237+#: src/Navigation.tsx:354
12381238#: src/screens/Settings/AppPasswords.tsx:50
12391239msgid "App Passwords"
12401240msgstr ""
···12701270msgid "Appeal this decision"
12711271msgstr ""
1272127212731273-#: src/Navigation.tsx:393
12731273+#: src/Navigation.tsx:394
12741274#: src/screens/Settings/AppearanceSettings.tsx:73
12751275#: src/screens/Settings/Settings.tsx:230
12761276#: src/screens/Settings/Settings.tsx:233
···15201520msgid "Blocked accounts"
15211521msgstr ""
1522152215231523-#: src/Navigation.tsx:194
15231523+#: src/Navigation.tsx:195
15241524#: src/view/screens/ModerationBlockedAccounts.tsx:104
15251525msgid "Blocked Accounts"
15261526msgstr ""
···16421642msgid "Browse custom feeds"
16431643msgstr ""
1644164416451645-#: src/components/FeedInterstitials.tsx:778
16451645+#: src/components/FeedInterstitials.tsx:777
16461646msgid "Browse more accounts"
16471647msgstr ""
1648164816491649-#: src/components/FeedInterstitials.tsx:907
16491649+#: src/components/FeedInterstitials.tsx:905
16501650msgid "Browse more feeds on the Explore page"
16511651msgstr ""
1652165216531653-#: src/components/FeedInterstitials.tsx:888
16541654-#: src/components/FeedInterstitials.tsx:891
16531653+#: src/components/FeedInterstitials.tsx:886
16541654+#: src/components/FeedInterstitials.tsx:889
16551655msgid "Browse more suggestions"
16561656msgstr ""
1657165716581658-#: src/components/FeedInterstitials.tsx:916
16581658+#: src/components/FeedInterstitials.tsx:914
16591659msgid "Browse more suggestions on the Explore page"
16601660msgstr ""
16611661···18721872msgstr ""
1873187318741874#: src/lib/hooks/useNotificationHandler.ts:99
18751875-#: src/Navigation.tsx:559
18751875+#: src/Navigation.tsx:560
18761876#: src/view/shell/bottom-bar/BottomBar.tsx:221
18771877#: src/view/shell/desktop/LeftNav.tsx:608
18781878#: src/view/shell/Drawer.tsx:466
···18981898msgid "Chat muted"
18991899msgstr ""
1900190019011901-#: src/Navigation.tsx:569
19011901+#: src/Navigation.tsx:570
19021902#: src/screens/Messages/components/InboxPreview.tsx:22
19031903msgid "Chat request inbox"
19041904msgstr ""
···19101910msgstr ""
1911191119121912#: src/components/dms/ConvoMenu.tsx:78
19131913-#: src/Navigation.tsx:564
19131913+#: src/Navigation.tsx:565
19141914#: src/screens/Messages/ChatList.tsx:81
19151915#: src/screens/Messages/ChatList.tsx:85
19161916#: src/screens/Messages/ChatList.tsx:380
···20812081#: src/components/live/EditLiveDialog.tsx:235
20822082#: src/components/NewskieDialog.tsx:167
20832083#: src/components/NewskieDialog.tsx:173
20842084-#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:197
20842084+#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:208
20852085#: src/components/ProgressGuide/FollowDialog.tsx:440
20862086#: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:118
20872087#: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:124
···21992199msgstr ""
2200220022012201#: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:45
22022202-#: src/Navigation.tsx:343
22022202+#: src/Navigation.tsx:344
22032203#: src/view/screens/CommunityGuidelines.tsx:37
22042204msgid "Community Guidelines"
22052205msgstr ""
···2298229822992299#: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:93
23002300msgid "Contact us"
23012301+msgstr ""
23022302+23032303+#: src/screens/Settings/FindContactsSettings.tsx:498
23042304+msgid "Contacts imported"
23012305msgstr ""
2302230623032307#: src/screens/Settings/FindContactsSettings.tsx:471
23042308msgid "Contacts removed"
23052309msgstr ""
2306231023072307-#: src/screens/Settings/FindContactsSettings.tsx:498
23082308-msgid "Contacts uploaded"
23092309-msgstr ""
23102310-23112311#: src/screens/Settings/ContentAndMediaSettings.tsx:51
23122312msgid "Content & Media"
23132313msgstr ""
···23172317msgid "Content and media"
23182318msgstr ""
2319231923202320-#: src/Navigation.tsx:518
23202320+#: src/Navigation.tsx:519
23212321msgid "Content and Media"
23222322msgstr ""
23232323···2515251525162516#: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:40
25172517#: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:107
25182518-#: src/Navigation.tsx:348
25182518+#: src/Navigation.tsx:349
25192519#: src/view/screens/CopyrightPolicy.tsx:34
25202520msgid "Copyright Policy"
25212521msgstr ""
···2604260426052605#: src/components/StarterPack/ProfileStarterPacks.tsx:206
26062606#: src/components/StarterPack/ProfileStarterPacks.tsx:315
26072607-#: src/Navigation.tsx:599
26072607+#: src/Navigation.tsx:600
26082608msgid "Create a starter pack"
26092609msgstr ""
26102610···32303230msgid "Edit moderation list"
32313231msgstr ""
3232323232333233-#: src/Navigation.tsx:358
32333233+#: src/Navigation.tsx:359
32343234#: src/view/screens/Feeds.tsx:518
32353235msgid "Edit My Feeds"
32363236msgstr ""
···32723272msgid "Edit who can reply"
32733273msgstr ""
3274327432753275-#: src/Navigation.tsx:604
32753275+#: src/Navigation.tsx:605
32763276msgid "Edit your starter pack"
32773277msgstr ""
32783278···36013601msgid "Explicit sexual images."
36023602msgstr ""
3603360336043604-#: src/Navigation.tsx:778
36043604+#: src/Navigation.tsx:780
36053605#: src/screens/Search/Shell.tsx:327
36063606#: src/view/shell/desktop/LeftNav.tsx:690
36073607#: src/view/shell/Drawer.tsx:414
···36373637msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button."
36383638msgstr ""
3639363936403640-#: src/Navigation.tsx:377
36403640+#: src/Navigation.tsx:378
36413641#: src/screens/Settings/ExternalMediaPreferences.tsx:34
36423642msgid "External Media Preferences"
36433643msgstr ""
···38743874msgid "False information about elections"
38753875msgstr ""
3876387638773877-#: src/Navigation.tsx:293
38773877+#: src/Navigation.tsx:294
38783878msgid "Feed"
38793879msgstr ""
38803880···39153915msgid "Feedback sent to feed operator"
39163916msgstr ""
3917391739183918-#: src/Navigation.tsx:584
39183918+#: src/Navigation.tsx:585
39193919#: src/screens/SavedFeeds.tsx:108
39203920#: src/screens/Search/SearchResults.tsx:78
39213921#: src/screens/StarterPack/StarterPackScreen.tsx:190
···39863986msgid "Find accounts to follow"
39873987msgstr ""
3988398839893989-#: src/Navigation.tsx:425
39903990-#: src/Navigation.tsx:626
39893989+#: src/Navigation.tsx:426
39903990+#: src/Navigation.tsx:627
39913991msgid "Find Contacts"
39923992msgstr ""
39933993···41414141msgid "Followed by <0>{0}</0>, <1>{1}</1>, and {2, plural, one {# other} other {# others}}"
41424142msgstr ""
4143414341444144-#: src/Navigation.tsx:247
41444144+#: src/Navigation.tsx:248
41454145msgid "Followers of @{0} that you know"
41464146msgstr ""
41474147···41844184msgid "Following feed preferences"
41854185msgstr ""
4186418641874187-#: src/Navigation.tsx:364
41874187+#: src/Navigation.tsx:365
41884188#: src/screens/Settings/FollowingFeedPreferences.tsx:56
41894189msgid "Following Feed Preferences"
41904190msgstr ""
···45104510msgid "Harming or endangering minors"
45114511msgstr ""
4512451245134513-#: src/Navigation.tsx:549
45134513+#: src/Navigation.tsx:550
45144514msgid "Hashtag"
45154515msgstr ""
45164516···46964696msgid "Hold up! We’re gradually giving access to video, and you’re still waiting in line. Check back soon!"
46974697msgstr ""
4698469846994699-#: src/Navigation.tsx:773
47004700-#: src/Navigation.tsx:793
46994699+#: src/Navigation.tsx:775
47004700+#: src/Navigation.tsx:795
47014701#: src/view/shell/bottom-bar/BottomBar.tsx:178
47024702#: src/view/shell/desktop/LeftNav.tsx:672
47034703#: src/view/shell/Drawer.tsx:440
···48534853msgid "Import contacts to find your friends"
48544854msgstr ""
4855485548564856+#: src/screens/Settings/FindContactsSettings.tsx:507
48574857+msgid "Imported on {0}"
48584858+msgstr ""
48594859+48564860#: src/ageAssurance/components/NoAccessScreen.tsx:204
48574861msgid "In order to provide an age-appropriate experience, we need to know your birthdate. This is a one-time thing, and your data will be kept private."
48584862msgstr ""
···50815085msgid "Labels on your content"
50825086msgstr ""
5083508750845084-#: src/Navigation.tsx:220
50885088+#: src/Navigation.tsx:221
50855089msgid "Language Settings"
50865090msgstr ""
50875091···52585262msgid "Like 10 posts to train the Discover feed"
52595263msgstr ""
5260526452615261-#: src/Navigation.tsx:462
52655265+#: src/Navigation.tsx:463
52625266msgid "Like notifications"
52635267msgstr ""
52645268···52705274msgid "Like this labeler"
52715275msgstr ""
5272527652735273-#: src/Navigation.tsx:298
52745274-#: src/Navigation.tsx:303
52775277+#: src/Navigation.tsx:299
52785278+#: src/Navigation.tsx:304
52755279msgid "Liked by"
52765280msgstr ""
52775281···53065310msgid "Likes of your reposts"
53075311msgstr ""
5308531253095309-#: src/Navigation.tsx:486
53135313+#: src/Navigation.tsx:487
53105314msgid "Likes of your reposts notifications"
53115315msgstr ""
53125316···53195323msgid "Linear"
53205324msgstr ""
5321532553225322-#: src/Navigation.tsx:253
53265326+#: src/Navigation.tsx:254
53235327msgid "List"
53245328msgstr ""
53255329···53995403msgid "List unmuted"
54005404msgstr ""
5401540554025402-#: src/Navigation.tsx:174
54065406+#: src/Navigation.tsx:175
54035407#: src/view/screens/Lists.tsx:67
54045408#: src/view/screens/Profile.tsx:233
54055409#: src/view/screens/Profile.tsx:241
···54645468msgid "Loading..."
54655469msgstr ""
5466547054675467-#: src/Navigation.tsx:323
54715471+#: src/Navigation.tsx:324
54685472msgid "Log"
54695473msgstr ""
54705474···55595563msgid "Media that may be disturbing or inappropriate for some audiences."
55605564msgstr ""
5561556555625562-#: src/Navigation.tsx:446
55665566+#: src/Navigation.tsx:447
55635567msgid "Mention notifications"
55645568msgstr ""
55655569···56125616msgid "Message options"
56135617msgstr ""
5614561856155615-#: src/Navigation.tsx:788
56195619+#: src/Navigation.tsx:790
56165620msgid "Messages"
56175621msgstr ""
56185622···56255629msgid "Minor harassment or bullying"
56265630msgstr ""
5627563156285628-#: src/Navigation.tsx:510
56325632+#: src/Navigation.tsx:511
56295633msgid "Miscellaneous notifications"
56305634msgstr ""
56315635···56335637msgid "Misleading"
56345638msgstr ""
5635563956365636-#: src/Navigation.tsx:179
56405640+#: src/Navigation.tsx:180
56375641#: src/screens/Moderation/index.tsx:99
56385642#: src/screens/Settings/Settings.tsx:194
56395643#: src/screens/Settings/Settings.tsx:197
···56725676msgid "Moderation lists"
56735677msgstr ""
5674567856755675-#: src/Navigation.tsx:184
56795679+#: src/Navigation.tsx:185
56765680#: src/view/screens/ModerationModlists.tsx:67
56775681msgid "Moderation Lists"
56785682msgstr ""
···56815685msgid "moderation settings"
56825686msgstr ""
5683568756845684-#: src/Navigation.tsx:313
56885688+#: src/Navigation.tsx:314
56855689msgid "Moderation states"
56865690msgstr ""
56875691···58045808msgid "Muted accounts"
58055809msgstr ""
5806581058075807-#: src/Navigation.tsx:189
58115811+#: src/Navigation.tsx:190
58085812#: src/view/screens/ModerationMutedAccounts.tsx:116
58095813msgid "Muted Accounts"
58105814msgstr ""
···59035907msgid "New Feature"
59045908msgstr ""
5905590959065906-#: src/Navigation.tsx:478
59105910+#: src/Navigation.tsx:479
59075911msgid "New follower notifications"
59085912msgstr ""
59095913···62096213msgid "Not followed by anyone you're following"
62106214msgstr ""
6211621562126212-#: src/Navigation.tsx:169
62166216+#: src/Navigation.tsx:170
62136217#: src/view/screens/Profile.tsx:132
62146218msgid "Not Found"
62156219msgstr ""
···62356239msgid "Nothing saved yet"
62366240msgstr ""
6237624162386238-#: src/Navigation.tsx:432
62396239-#: src/Navigation.tsx:579
62426242+#: src/Navigation.tsx:433
62436243+#: src/Navigation.tsx:580
62406244#: src/view/screens/Notifications.tsx:136
62416245msgid "Notification settings"
62426246msgstr ""
···62496253msgid "Notification Sounds"
62506254msgstr ""
6251625562526252-#: src/Navigation.tsx:574
62536253-#: src/Navigation.tsx:783
62566256+#: src/Navigation.tsx:575
62576257+#: src/Navigation.tsx:785
62546258#: src/screens/Notifications/ActivityList.tsx:30
62556259#: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:90
62566260#: src/screens/Settings/NotificationSettings/index.tsx:92
···63926396msgid "Open avatar creator"
63936397msgstr ""
6394639863956395-#: src/view/com/feeds/ComposerPrompt.tsx:202
63996399+#: src/view/com/feeds/ComposerPrompt.tsx:200
63966400msgid "Open camera"
63976401msgstr ""
63986402···65016505msgid "Opens composer"
65026506msgstr ""
6503650765046504-#: src/view/com/feeds/ComposerPrompt.tsx:203
65086508+#: src/view/com/feeds/ComposerPrompt.tsx:201
65056509msgid "Opens device camera"
65066510msgstr ""
65076511···65326536msgid "Opens helpdesk in browser"
65336537msgstr ""
6534653865356535-#: src/view/com/feeds/ComposerPrompt.tsx:225
65396539+#: src/view/com/feeds/ComposerPrompt.tsx:223
65366540msgid "Opens image picker"
65376541msgstr ""
65386542···66756679msgid "Password updated!"
66766680msgstr ""
6677668166786678-#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43
66826682+#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:44
66796683#: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerNative.tsx:137
66806684#: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/VideoControls.tsx:369
66816685msgid "Pause"
···66916695msgid "People"
66926696msgstr ""
6693669766946694-#: src/Navigation.tsx:240
66986698+#: src/Navigation.tsx:241
66956699msgid "People followed by @{0}"
66966700msgstr ""
6697670166986698-#: src/Navigation.tsx:233
67026702+#: src/Navigation.tsx:234
66996703msgid "People following @{0}"
67006704msgstr ""
67016705···67866790msgid "Pinned to your feeds"
67876791msgstr ""
6788679267896789-#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43
67936793+#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:44
67906794#: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerNative.tsx:137
67916795#: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/VideoControls.tsx:370
67926796msgid "Play"
···68056809msgid "Play Video"
68066810msgstr ""
6807681168086808-#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:42
68126812+#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43
68096813msgid "Plays or pauses the GIF"
68106814msgstr ""
68116815···69536957msgid "Please sign in as @{0}"
69546958msgstr ""
6955695969606960+#: src/screens/Settings/FindContactsSettings.tsx:102
69616961+msgid "Please use the native app to import your contacts."
69626962+msgstr ""
69636963+69566964#: src/screens/FindContactsFlowScreen.tsx:71
69576957-#: src/screens/Settings/FindContactsSettings.tsx:102
69586965msgid "Please use the native app to sync your contacts."
69596966msgstr ""
69606967···70047011msgid "Post blocked"
70057012msgstr ""
7006701370077007-#: src/Navigation.tsx:266
70087008-#: src/Navigation.tsx:273
70097009-#: src/Navigation.tsx:280
70107010-#: src/Navigation.tsx:287
70147014+#: src/Navigation.tsx:267
70157015+#: src/Navigation.tsx:274
70167016+#: src/Navigation.tsx:281
70177017+#: src/Navigation.tsx:288
70117018msgid "Post by @{0}"
70127019msgstr ""
70137020···70417048msgid "Post interaction settings"
70427049msgstr ""
7043705070447044-#: src/Navigation.tsx:200
70517051+#: src/Navigation.tsx:201
70457052#: src/screens/ModerationInteractionSettings/index.tsx:34
70467053msgid "Post Interaction Settings"
70477054msgstr ""
···71407147msgid "Privacy and security"
71417148msgstr ""
7142714971437143-#: src/Navigation.tsx:409
71447144-#: src/Navigation.tsx:417
71507150+#: src/Navigation.tsx:410
71517151+#: src/Navigation.tsx:418
71457152#: src/screens/Settings/ActivityPrivacySettings.tsx:40
71467153#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:44
71477154msgid "Privacy and Security"
···7154716171557162#: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:35
71567163#: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:102
71577157-#: src/Navigation.tsx:333
71647164+#: src/Navigation.tsx:334
71587165#: src/screens/Settings/AboutSettings.tsx:92
71597166#: src/screens/Settings/AboutSettings.tsx:95
71607167#: src/view/screens/PrivacyPolicy.tsx:34
···72537260msgid "QR code saved to your camera roll!"
72547261msgstr ""
7255726272567256-#: src/Navigation.tsx:454
72637263+#: src/Navigation.tsx:455
72577264msgid "Quote notifications"
72587265msgstr ""
72597266···74147421#: src/components/StarterPack/Wizard/WizardListCard.tsx:105
74157422#: src/components/StarterPack/Wizard/WizardListCard.tsx:112
74167423#: src/screens/Bookmarks/index.tsx:266
74177417-#: src/screens/Settings/Settings.tsx:682
74247424+#: src/screens/Settings/Settings.tsx:684
74187425#: src/view/com/modals/UserAddRemoveLists.tsx:235
74197426#: src/view/com/posts/PostFeedErrorMessage.tsx:220
74207427msgid "Remove"
···74287435msgid "Remove {historyItem}"
74297436msgstr ""
7430743774317431-#: src/screens/Settings/Settings.tsx:661
74327432-#: src/screens/Settings/Settings.tsx:664
74387438+#: src/screens/Settings/Settings.tsx:663
74397439+#: src/screens/Settings/Settings.tsx:666
74337440msgid "Remove account"
74347441msgstr ""
74357442···74747481msgid "Remove from my feeds"
74757482msgstr ""
7476748374777477-#: src/screens/Settings/Settings.tsx:674
74847484+#: src/screens/Settings/Settings.tsx:676
74787485msgid "Remove from quick access?"
74797486msgstr ""
74807487···76417648msgid "Reply Hidden by You"
76427649msgstr ""
7643765076447644-#: src/Navigation.tsx:438
76517651+#: src/Navigation.tsx:439
76457652msgid "Reply notifications"
76467653msgstr ""
76477654···77567763msgid "Repost ({0, plural, one {# repost} other {# reposts}})"
77577764msgstr ""
7758776577597759-#: src/Navigation.tsx:470
77667766+#: src/Navigation.tsx:471
77607767msgid "Repost notifications"
77617768msgstr ""
77627769···77977804msgid "Reposts of your reposts"
77987805msgstr ""
7799780678007800-#: src/Navigation.tsx:494
78077807+#: src/Navigation.tsx:495
78017808msgid "Reposts of your reposts notifications"
78027809msgstr ""
78037810···80068013msgstr ""
8007801480088015#: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:143
80098009-#: src/Navigation.tsx:618
80168016+#: src/Navigation.tsx:619
80108017#: src/screens/Bookmarks/index.tsx:60
80118018msgid "Saved Posts"
80128019msgstr ""
···80528059msgid "Search"
80538060msgstr ""
8054806180558055-#: src/Navigation.tsx:259
80628062+#: src/Navigation.tsx:260
80568063#: src/screens/Profile/ProfileSearch.tsx:37
80578064msgid "Search @{0}'s posts"
80588065msgstr ""
···81698176msgstr ""
8170817781718178#: src/components/FeedInterstitials.tsx:730
81728172-#: src/components/FeedInterstitials.tsx:793
81798179+#: src/components/FeedInterstitials.tsx:791
81738180msgid "See more"
81748181msgstr ""
81758182···84488455msgid "Sets email for password reset"
84498456msgstr ""
8450845784518451-#: src/Navigation.tsx:215
84588458+#: src/Navigation.tsx:216
84528459#: src/screens/Settings/Settings.tsx:105
84538460#: src/view/shell/desktop/LeftNav.tsx:805
84548461#: src/view/shell/Drawer.tsx:609
···85938600msgid "Share your favorite feed!"
85948601msgstr ""
8595860285968596-#: src/Navigation.tsx:318
86038603+#: src/Navigation.tsx:319
85978604msgid "Shared Preferences Tester"
85988605msgstr ""
85998606···86038610msgid "Show"
86048611msgstr ""
8605861286068606-#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:178
86138613+#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:189
86078614msgid "Show alt text"
86088615msgstr ""
86098616···88428849msgid "Some of your verifications are invalid."
88438850msgstr ""
8844885188458845-#: src/components/FeedInterstitials.tsx:870
88528852+#: src/components/FeedInterstitials.tsx:868
88468853msgid "Some other feeds you might like"
88478854msgstr ""
88488855···89568963msgid "Start chat with {displayName}"
89578964msgstr ""
8958896589598959-#: src/Navigation.tsx:589
89608960-#: src/Navigation.tsx:594
89668966+#: src/Navigation.tsx:590
89678967+#: src/Navigation.tsx:595
89618968#: src/screens/StarterPack/Wizard/index.tsx:209
89628969msgid "Starter Pack"
89638970msgstr ""
···90109017msgid "Stored as part of a secure code for matching with others"
90119018msgstr ""
9012901990139013-#: src/Navigation.tsx:308
90209020+#: src/Navigation.tsx:309
90149021#: src/screens/Settings/Settings.tsx:466
90159022msgid "Storybook"
90169023msgstr ""
···91019108msgid "Sunset"
91029109msgstr ""
9103911091049104-#: src/Navigation.tsx:328
91119111+#: src/Navigation.tsx:329
91059112#: src/view/screens/Support.tsx:34
91069113#: src/view/screens/Support.tsx:37
91079114msgid "Support"
···92159222#: src/components/dialogs/BirthDateSettings.tsx:182
92169223#: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:30
92179224#: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:97
92189218-#: src/Navigation.tsx:338
92259225+#: src/Navigation.tsx:339
92199226#: src/screens/Settings/AboutSettings.tsx:84
92209227#: src/screens/Settings/AboutSettings.tsx:87
92219228#: src/view/screens/TermsOfService.tsx:34
···95289535msgid "This appeal will be sent to Bluesky's moderation service."
95299536msgstr ""
9530953795389538+#: src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx:27
95399539+#: src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx:47
95409540+msgid "This author has chosen to make their posts visible only to people who are signed in."
95419541+msgstr ""
95429542+95319543#: src/screens/Messages/components/MessageListError.tsx:18
95329544msgid "This chat was disconnected"
95339545msgstr ""
···97379749msgid "This will delete \"{0}\" from your muted words. You can always add it back later."
97389750msgstr ""
9739975197409740-#: src/screens/Settings/Settings.tsx:676
97529752+#: src/screens/Settings/Settings.tsx:678
97419753msgid "This will remove @{0} from the quick access list."
97429754msgstr ""
97439755···97649776msgid "Threaded"
97659777msgstr ""
9766977897679767-#: src/Navigation.tsx:371
97799779+#: src/Navigation.tsx:372
97689780msgid "Threads Preferences"
97699781msgstr ""
97709782···98309842msgid "Top replies first"
98319843msgstr ""
9832984498339833-#: src/Navigation.tsx:554
98459845+#: src/Navigation.tsx:555
98349846msgid "Topic"
98359847msgstr ""
98369848···1020010212msgid "Upload from Library"
1020110213msgstr ""
10202102141020310203-#: src/screens/Settings/FindContactsSettings.tsx:507
1020410204-msgid "Uploaded on {0}"
1020510205-msgstr ""
1020610206-1020710215#: src/lib/api/index.ts:302
1020810216msgid "Uploading images..."
1020910217msgstr ""
···1034110349msgid "Verification settings"
1034210350msgstr ""
10343103511034410344-#: src/Navigation.tsx:208
1035210352+#: src/Navigation.tsx:209
1034510353#: src/screens/Moderation/VerificationSettings.tsx:32
1034610354msgid "Verification Settings"
1034710355msgstr ""
···1044710455msgid "Video failed to process"
1044810456msgstr ""
10449104571045010450-#: src/Navigation.tsx:610
1045810458+#: src/Navigation.tsx:611
1045110459msgid "Video Feed"
1045210460msgstr ""
1045310461···1085810866#: src/view/com/auth/SplashScreen.tsx:51
1085910867#: src/view/com/auth/SplashScreen.web.tsx:103
1086010868#: src/view/com/composer/Composer.tsx:857
1086110861-#: src/view/com/feeds/ComposerPrompt.tsx:193
1086910869+#: src/view/com/feeds/ComposerPrompt.tsx:191
1086210870msgid "What's up?"
1086310871msgstr ""
1086410872···1127811286msgid "You must grant access to your photo library to save a QR code"
1127911287msgstr ""
11280112881128111281-#: src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx:27
1128211282-#: src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx:47
1128311283-msgid "You must sign in to view this post."
1128411284-msgstr ""
1128511285-1128611289#: src/view/com/composer/SelectMediaButton.tsx:442
1128711290msgid "You need to allow access to your media library."
1128811291msgstr ""
···1152411527msgid "Your full handle will be <0>@{0}</0>"
1152511528msgstr ""
11526115291152711527-#: src/Navigation.tsx:526
1153011530+#: src/Navigation.tsx:527
1152811531#: src/screens/Search/modules/ExploreInterestsCard.tsx:67
1152911532#: src/screens/Settings/ContentAndMediaSettings.tsx:92
1153011533#: src/screens/Settings/ContentAndMediaSettings.tsx:95
+2-2
src/screens/Messages/components/MessageInput.tsx
···1414import {useSafeAreaInsets} from 'react-native-safe-area-context'
1515import {msg} from '@lingui/macro'
1616import {useLingui} from '@lingui/react'
1717-import Graphemer from 'graphemer'
1717+import {countGraphemes} from 'unicode-segmenter/grapheme'
18181919import {HITSLOP_10, MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants'
2020import {useHaptics} from '#/lib/haptics'
···7878 if (!hasEmbed && message.trim() === '') {
7979 return
8080 }
8181- if (new Graphemer().countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) {
8181+ if (countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) {
8282 Toast.show(_(msg`Message is too long`), 'xmark')
8383 return
8484 }
···22import {Pressable, View} from 'react-native'
33import {msg} from '@lingui/macro'
44import {useLingui} from '@lingui/react'
55-import Graphemer from 'graphemer'
65import {flushSync} from 'react-dom'
76import TextareaAutosize from 'react-textarea-autosize'
77+import {countGraphemes} from 'unicode-segmenter/grapheme'
8899import {isSafari, isTouchDevice} from '#/lib/browser'
1010import {MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants'
···5959 if (!hasEmbed && message.trim() === '') {
6060 return
6161 }
6262- if (new Graphemer().countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) {
6262+ if (countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) {
6363 Toast.show(_(msg`Message is too long`), 'xmark')
6464 return
6565 }
···22import {View} from 'react-native'
33import {msg, Trans} from '@lingui/macro'
44import {useLingui} from '@lingui/react'
55-import deepEqual from 'lodash.isequal'
55+import deepEqual from 'fast-deep-equal'
6677import {logger} from '#/logger'
88import {usePostInteractionSettingsMutation} from '#/state/queries/post-interaction-settings'
···24242525 <View style={[a.py_sm]}>
2626 <Text style={[a.text_xl, a.italic, t.atoms.text_contrast_medium]}>
2727- <Trans>You must sign in to view this post.</Trans>
2727+ <Trans>
2828+ This author has chosen to make their posts visible only to people
2929+ who are signed in.
3030+ </Trans>
2831 </Text>
2932 </View>
3033 </View>
···4444 </Skele.Circle>
45454646 <Text style={[a.text_md, a.italic, t.atoms.text_contrast_medium]}>
4747- <Trans>You must sign in to view this post.</Trans>
4747+ <Trans>
4848+ This author has chosen to make their posts visible only to people
4949+ who are signed in.
5050+ </Trans>
4851 </Text>
4952 </Skele.Row>
5053 <View
+3-3
src/screens/Profile/Header/EditProfileDialog.tsx
···6677import {urls} from '#/lib/constants'
88import {cleanError} from '#/lib/strings/errors'
99-import {useWarnMaxGraphemeCount} from '#/lib/strings/helpers'
99+import {isOverMaxGraphemeCount} from '#/lib/strings/helpers'
1010import {logger} from '#/logger'
1111import {type ImageMeta} from '#/state/gallery'
1212import {useEnableSquareAvatars} from '#/state/preferences/enable-square-avatars'
···208208 _,
209209 ])
210210211211- const displayNameTooLong = useWarnMaxGraphemeCount({
211211+ const displayNameTooLong = isOverMaxGraphemeCount({
212212 text: displayName,
213213 maxCount: DISPLAY_NAME_MAX_GRAPHEMES,
214214 })
215215- const descriptionTooLong = useWarnMaxGraphemeCount({
215215+ const descriptionTooLong = isOverMaxGraphemeCount({
216216 text: description,
217217 maxCount: DESCRIPTION_MAX_GRAPHEMES,
218218 })
···44import {type AppBskyFeedPostgate} from '@atproto/api'
55import {msg, Trans} from '@lingui/macro'
66import {useLingui} from '@lingui/react'
77-import deepEqual from 'lodash.isequal'
77+import deepEqual from 'fast-deep-equal'
8899import {isNetworkError} from '#/lib/strings/errors'
1010import {logger} from '#/logger'
···2727 'unicode-segmenter/grapheme': require
2828 .resolve('unicode-segmenter/grapheme')
2929 .replace(/\.cjs$/, '.js'),
3030+ 'react-native-gesture-handler': false, // RNGH should not be used on web, so let's cause a build error if it sneaks in
3031 })
3132 config.module.rules = [
3233 ...(config.module.rules || []),