From df73f835381b267f3e5741a4eff50fcb86b59c53 Mon Sep 17 00:00:00 2001 From: Ansh Date: Fri, 22 Dec 2023 03:30:24 +0530 Subject: [PATCH 1/7] Add French localization (#2265) --- lingui.config.js | 2 +- src/locale/__tests__/helpers.test.ts | 4 +- src/locale/helpers.ts | 2 + src/locale/i18n.ts | 5 + src/locale/i18n.web.ts | 4 + src/locale/languages.ts | 2 + src/locale/locales/en/messages.po | 54 +- src/locale/locales/fr/messages.po | 2462 ++++++++++++++++++++++++++ src/locale/locales/hi/messages.po | 54 +- src/locale/locales/ja/messages.po | 54 +- 10 files changed, 2559 insertions(+), 84 deletions(-) create mode 100644 src/locale/locales/fr/messages.po diff --git a/lingui.config.js b/lingui.config.js index 118798a0a8..3af72ebd01 100644 --- a/lingui.config.js +++ b/lingui.config.js @@ -1,6 +1,6 @@ /** @type {import('@lingui/conf').LinguiConfig} */ module.exports = { - locales: ['en', 'hi', 'ja'], + locales: ['en', 'hi', 'ja', 'fr'], catalogs: [ { path: '/src/locale/locales/{locale}/messages', diff --git a/src/locale/__tests__/helpers.test.ts b/src/locale/__tests__/helpers.test.ts index d4bc6c3386..d4028c643b 100644 --- a/src/locale/__tests__/helpers.test.ts +++ b/src/locale/__tests__/helpers.test.ts @@ -7,6 +7,6 @@ test('sanitizeAppLanguageSetting', () => { expect(sanitizeAppLanguageSetting('en')).toBe(AppLanguage.en) expect(sanitizeAppLanguageSetting('hi')).toBe(AppLanguage.hi) expect(sanitizeAppLanguageSetting('foo')).toBe(AppLanguage.en) - expect(sanitizeAppLanguageSetting('en,fr')).toBe(AppLanguage.en) - expect(sanitizeAppLanguageSetting('fr,en')).toBe(AppLanguage.en) + expect(sanitizeAppLanguageSetting('en,foo')).toBe(AppLanguage.en) + expect(sanitizeAppLanguageSetting('foo,en')).toBe(AppLanguage.en) }) diff --git a/src/locale/helpers.ts b/src/locale/helpers.ts index 3039e587d0..6433eee7ce 100644 --- a/src/locale/helpers.ts +++ b/src/locale/helpers.ts @@ -114,6 +114,8 @@ export function sanitizeAppLanguageSetting(appLanguage: string): AppLanguage { return AppLanguage.hi case 'ja': return AppLanguage.ja + case 'fr': + return AppLanguage.fr default: continue } diff --git a/src/locale/i18n.ts b/src/locale/i18n.ts index 174d56be5f..d6af397299 100644 --- a/src/locale/i18n.ts +++ b/src/locale/i18n.ts @@ -5,6 +5,7 @@ import {useLanguagePrefs} from '#/state/preferences' import {messages as messagesEn} from '#/locale/locales/en/messages' import {messages as messagesHi} from '#/locale/locales/hi/messages' import {messages as messagesJa} from '#/locale/locales/ja/messages' +import {messages as messagesFr} from '#/locale/locales/fr/messages' import {sanitizeAppLanguageSetting} from '#/locale/helpers' import {AppLanguage} from '#/locale/languages' @@ -21,6 +22,10 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesJa}) break } + case AppLanguage.fr: { + i18n.loadAndActivate({locale, messages: messagesFr}) + break + } default: { i18n.loadAndActivate({locale, messages: messagesEn}) break diff --git a/src/locale/i18n.web.ts b/src/locale/i18n.web.ts index 6edf23e054..4172ad47b8 100644 --- a/src/locale/i18n.web.ts +++ b/src/locale/i18n.web.ts @@ -20,6 +20,10 @@ export async function dynamicActivate(locale: AppLanguage) { mod = await import(`./locales/ja/messages`) break } + case AppLanguage.fr: { + mod = await import(`./locales/fr/messages`) + break + } default: { mod = await import(`./locales/en/messages`) break diff --git a/src/locale/languages.ts b/src/locale/languages.ts index 411b4a262a..fb8073e8ba 100644 --- a/src/locale/languages.ts +++ b/src/locale/languages.ts @@ -8,6 +8,7 @@ export enum AppLanguage { en = 'en', hi = 'hi', ja = 'ja', + fr = 'fr', } interface AppLanguageConfig { @@ -19,6 +20,7 @@ export const APP_LANGUAGES: AppLanguageConfig[] = [ {code2: AppLanguage.en, name: 'English'}, {code2: AppLanguage.hi, name: 'हिंदी'}, {code2: AppLanguage.ja, name: '日本語'}, + {code2: AppLanguage.fr, name: 'Français'}, ] export const LANGUAGES: Language[] = [ diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 7485c163e8..1f3ef567ed 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -375,7 +375,7 @@ msgstr "" #: 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/AltImage.tsx:128 #: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:220 #: src/view/com/modals/Confirm.tsx:88 @@ -398,7 +398,7 @@ msgstr "" msgid "Cancel account deletion" msgstr "" -#: src/view/com/modals/AltImage.tsx:122 +#: src/view/com/modals/AltImage.tsx:123 msgid "Cancel add image alt text" msgstr "" @@ -809,7 +809,7 @@ msgstr "" msgid "Enable this setting to only see replies between people you follow." msgstr "" -#: src/view/screens/Profile.tsx:425 +#: src/view/screens/Profile.tsx:426 msgid "End of feed" msgstr "" @@ -854,7 +854,7 @@ msgstr "" msgid "Failed to load recommended feeds" msgstr "" -#: src/view/screens/Feeds.tsx:559 +#: src/view/screens/Feeds.tsx:560 msgid "Feed offline" msgstr "" @@ -868,9 +868,9 @@ msgid "Feedback" msgstr "" #: src/view/screens/Feeds.tsx:475 -#: src/view/screens/Profile.tsx:164 +#: src/view/screens/Profile.tsx:165 #: src/view/shell/bottom-bar/BottomBar.tsx:181 -#: src/view/shell/desktop/LeftNav.tsx:339 +#: src/view/shell/desktop/LeftNav.tsx:340 #: src/view/shell/Drawer.tsx:455 #: src/view/shell/Drawer.tsx:456 msgid "Feeds" @@ -973,7 +973,7 @@ msgstr "" #: src/view/com/auth/LoggedOut.tsx:81 #: src/view/com/auth/LoggedOut.tsx:82 #: src/view/com/util/moderation/ScreenHider.tsx:123 -#: src/view/shell/desktop/LeftNav.tsx:103 +#: src/view/shell/desktop/LeftNav.tsx:104 msgid "Go back" msgstr "" @@ -1041,7 +1041,7 @@ msgstr "" #~ msgstr "" #: src/view/shell/bottom-bar/BottomBar.tsx:137 -#: src/view/shell/desktop/LeftNav.tsx:303 +#: src/view/shell/desktop/LeftNav.tsx:304 #: src/view/shell/Drawer.tsx:379 #: src/view/shell/Drawer.tsx:380 msgid "Home" @@ -1074,7 +1074,7 @@ msgstr "" msgid "If none are selected, suitable for all ages." msgstr "" -#: src/view/com/modals/AltImage.tsx:96 +#: src/view/com/modals/AltImage.tsx:97 msgid "Image alt text" msgstr "" @@ -1195,7 +1195,7 @@ msgstr "" msgid "Liked by" msgstr "" -#: src/view/screens/Profile.tsx:163 +#: src/view/screens/Profile.tsx:164 msgid "Likes" msgstr "" @@ -1215,8 +1215,8 @@ msgstr "" msgid "List Name" msgstr "" -#: src/view/screens/Profile.tsx:165 -#: src/view/shell/desktop/LeftNav.tsx:376 +#: src/view/screens/Profile.tsx:166 +#: src/view/shell/desktop/LeftNav.tsx:377 #: src/view/shell/Drawer.tsx:471 #: src/view/shell/Drawer.tsx:472 msgid "Lists" @@ -1263,7 +1263,7 @@ msgstr "" msgid "Make sure this is where you intend to go!" msgstr "" -#: src/view/screens/Profile.tsx:162 +#: src/view/screens/Profile.tsx:163 msgid "Media" msgstr "" @@ -1285,7 +1285,7 @@ msgstr "" #: src/view/screens/Moderation.tsx:64 #: src/view/screens/Settings.tsx:563 -#: src/view/shell/desktop/LeftNav.tsx:394 +#: src/view/shell/desktop/LeftNav.tsx:395 #: src/view/shell/Drawer.tsx:490 #: src/view/shell/Drawer.tsx:491 msgid "Moderation" @@ -1361,7 +1361,7 @@ msgstr "" msgid "My Feeds" msgstr "" -#: src/view/shell/desktop/LeftNav.tsx:64 +#: src/view/shell/desktop/LeftNav.tsx:65 msgid "My Profile" msgstr "" @@ -1384,16 +1384,16 @@ msgid "New" msgstr "" #: src/view/com/feeds/FeedPage.tsx:200 -#: src/view/screens/Feeds.tsx:510 -#: src/view/screens/Profile.tsx:353 +#: src/view/screens/Feeds.tsx:511 +#: src/view/screens/Profile.tsx:354 #: 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 +#: src/view/shell/desktop/LeftNav.tsx:247 msgid "New post" msgstr "" -#: src/view/shell/desktop/LeftNav.tsx:256 +#: src/view/shell/desktop/LeftNav.tsx:257 msgid "New Post" msgstr "" @@ -1470,7 +1470,7 @@ msgstr "" #: 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/desktop/LeftNav.tsx:359 #: src/view/shell/Drawer.tsx:416 #: src/view/shell/Drawer.tsx:417 msgid "Notifications" @@ -1634,7 +1634,7 @@ msgstr "" msgid "Post not found" msgstr "" -#: src/view/screens/Profile.tsx:160 +#: src/view/screens/Profile.tsx:161 msgid "Posts" msgstr "" @@ -1667,7 +1667,7 @@ msgid "Processing..." msgstr "" #: src/view/shell/bottom-bar/BottomBar.tsx:247 -#: src/view/shell/desktop/LeftNav.tsx:412 +#: src/view/shell/desktop/LeftNav.tsx:413 #: src/view/shell/Drawer.tsx:69 #: src/view/shell/Drawer.tsx:525 #: src/view/shell/Drawer.tsx:526 @@ -1759,7 +1759,7 @@ msgstr "" msgid "Removed from list" msgstr "" -#: src/view/screens/Profile.tsx:161 +#: src/view/screens/Profile.tsx:162 msgid "Replies" msgstr "" @@ -1859,7 +1859,7 @@ msgstr "" #~ msgid "Retry change handle" #~ msgstr "" -#: src/view/com/modals/AltImage.tsx:114 +#: src/view/com/modals/AltImage.tsx:115 #: src/view/com/modals/BirthDateSettings.tsx:93 #: src/view/com/modals/BirthDateSettings.tsx:96 #: src/view/com/modals/ChangeHandle.tsx:173 @@ -1869,7 +1869,7 @@ msgstr "" msgid "Save" msgstr "" -#: src/view/com/modals/AltImage.tsx:105 +#: src/view/com/modals/AltImage.tsx:106 msgid "Save alt text" msgstr "" @@ -1898,7 +1898,7 @@ msgstr "" #: 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/LeftNav.tsx:322 #: src/view/shell/desktop/Search.tsx:161 #: src/view/shell/desktop/Search.tsx:170 #: src/view/shell/Drawer.tsx:343 @@ -1993,7 +1993,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:430 +#: src/view/shell/desktop/LeftNav.tsx:431 #: src/view/shell/Drawer.tsx:546 #: src/view/shell/Drawer.tsx:547 msgid "Settings" diff --git a/src/locale/locales/fr/messages.po b/src/locale/locales/fr/messages.po new file mode 100644 index 0000000000..25c072ed16 --- /dev/null +++ b/src/locale/locales/fr/messages.po @@ -0,0 +1,2462 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2023-12-20 21:42+0530\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: fr\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/view/shell/desktop/RightNav.tsx:160 +msgid "{0, plural, one {# invite code available} other {# invite codes available}}" +msgstr "{0, plural, one {# invite code available} other {# invite codes available}}" + +#: src/view/com/modals/Repost.tsx:44 +msgid "{0}" +msgstr "{0}" + +#: src/view/com/modals/CreateOrEditList.tsx:176 +msgid "{0} {purposeLabel} List" +msgstr "{0} {purposeLabel} Liste" + +#: src/view/shell/desktop/RightNav.tsx:143 +msgid "{invitesAvailable, plural, one {Invite codes: # available} other {Invite codes: # available}}" +msgstr "{invitesAvailable, plural, one {Invite codes: # available} other {Invite codes: # available}}" + +#: src/view/screens/Settings.tsx:407 +#: src/view/shell/Drawer.tsx:640 +msgid "{invitesAvailable} invite code available" +msgstr "{invitesAvailable} code d’invitation disponible" + +#: src/view/screens/Settings.tsx:409 +#: src/view/shell/Drawer.tsx:642 +msgid "{invitesAvailable} invite codes available" +msgstr "{invitesAvailable} codes d’invitation disponibles" + +#: src/view/screens/Search/Search.tsx:88 +msgid "{message}" +msgstr "{message}" + +#: src/view/com/threadgate/WhoCanReply.tsx:158 +msgid "<0/> members" +msgstr "<0/> membres" + +#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:30 +msgid "<0>Choose your<1>Recommended<2>Feeds" +msgstr "<0>Choisissez vos<1>fils d’actualité<2>recommandés" + +#: src/view/com/auth/onboarding/RecommendedFollows.tsx:37 +msgid "<0>Follow some<1>Recommended<2>Users" +msgstr "<0>Suivre certains<1>utilisateurs<2>recommandés" + +#: src/view/com/util/moderation/LabelInfo.tsx:45 +msgid "A content warning has been applied to this {0}." +msgstr "" + +#: src/lib/hooks/useOTAUpdate.ts:16 +msgid "A new version of the app is available. Please update to continue using the app." +msgstr "Une nouvelle version de l’application est disponible. Veuillez faire la mise à jour pour continuer à utiliser l’application." + +#: src/view/com/modals/EditImage.tsx:299 +#: src/view/screens/Settings.tsx:417 +msgid "Accessibility" +msgstr "Accessibilité" + +#: src/view/com/auth/login/LoginForm.tsx:159 +#: src/view/screens/Settings.tsx:286 +msgid "Account" +msgstr "Compte" + +#: src/view/com/util/AccountDropdownBtn.tsx:41 +msgid "Account options" +msgstr "Options de compte" + +#: src/view/com/modals/ListAddRemoveUsers.tsx:264 +#: src/view/com/modals/UserAddRemoveLists.tsx:193 +#: src/view/screens/ProfileList.tsx:754 +msgid "Add" +msgstr "Ajouter" + +#: src/view/com/modals/SelfLabel.tsx:56 +msgid "Add a content warning" +msgstr "Ajouter un avertissement sur le contenu" + +#: src/view/screens/ProfileList.tsx:744 +msgid "Add a user to this list" +msgstr "Ajouter un utilisateur à cette liste" + +#: src/view/screens/Settings.tsx:355 +#: src/view/screens/Settings.tsx:364 +msgid "Add account" +msgstr "Ajouter un compte" + +#: src/view/com/composer/photos/Gallery.tsx:119 +#: src/view/com/composer/photos/Gallery.tsx:180 +msgid "Add alt text" +msgstr "Ajouter un texte alt" + +#: src/view/com/modals/report/InputIssueDetails.tsx:41 +#: src/view/com/modals/report/Modal.tsx:191 +msgid "Add details" +msgstr "Ajouter des détails" + +#: src/view/com/modals/report/Modal.tsx:194 +msgid "Add details to report" +msgstr "Ajouter des détails au rapport" + +#: src/view/com/composer/Composer.tsx:438 +msgid "Add link card" +msgstr "Ajouter une carte link card" + +#: src/view/com/composer/Composer.tsx:441 +msgid "Add link card:" +msgstr "Ajouter une carte link card :" + +#: src/view/com/modals/ChangeHandle.tsx:415 +msgid "Add the following DNS record to your domain:" +msgstr "Ajoutez le registre DNS suivant à votre domaine :" + +#: src/view/com/profile/ProfileHeader.tsx:353 +msgid "Add to Lists" +msgstr "Ajouter aux listes" + +#: src/view/screens/ProfileFeed.tsx:270 +msgid "Add to my feeds" +msgstr "Ajouter à mes fils d’actu" + +#: src/view/com/modals/ListAddRemoveUsers.tsx:191 +#: src/view/com/modals/UserAddRemoveLists.tsx:128 +msgid "Added to list" +msgstr "Ajouté à la liste" + +#: src/view/screens/PreferencesHomeFeed.tsx:164 +msgid "Adjust the number of likes a reply must have to be shown in your feed." +msgstr "Définissez le nombre de likes qu’une réponse doit avoir pour être affichée dans votre fil d’actualité." + +#: src/view/com/modals/SelfLabel.tsx:75 +msgid "Adult Content" +msgstr "Contenu pour adultes" + +#: src/view/screens/Settings.tsx:569 +msgid "Advanced" +msgstr "Avancé" + +#: src/view/com/composer/photos/Gallery.tsx:130 +msgid "ALT" +msgstr "ALT" + +#: src/view/com/modals/EditImage.tsx:315 +msgid "Alt text" +msgstr "Texte 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 "Le texte Alt décrit les images pour les utilisateurs aveugles et malvoyants, et aide à donner un contexte à tout le monde." + +#: 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 "Un e-mail a été envoyé à {0}. Il comprend un code de confirmation que vous pouvez saisir ici." + +#: src/view/com/modals/ChangeEmail.tsx:119 +msgid "An email has been sent to your previous address, {0}. It includes a confirmation code which you can enter below." +msgstr "Un courriel a été envoyé à votre ancienne adresse, {0}. Il comprend un code de confirmation que vous pouvez saisir ici." + +#: src/view/com/notifications/FeedItem.tsx:236 +#: src/view/com/threadgate/WhoCanReply.tsx:178 +msgid "and" +msgstr "et" + +#: src/view/screens/LanguageSettings.tsx:95 +msgid "App Language" +msgstr "Langue de l’application" + +#: src/view/screens/Settings.tsx:589 +msgid "App passwords" +msgstr "Mots de passe de l’appli" + +#: src/view/screens/AppPasswords.tsx:186 +msgid "App Passwords" +msgstr "Mots de passe de l’appli" + +#: src/view/com/util/forms/PostDropdownBtn.tsx:207 +msgid "Appeal content warning" +msgstr "" + +#: src/view/com/modals/AppealLabel.tsx:65 +msgid "Appeal Content Warning" +msgstr "" + +#: src/view/com/modals/AppealLabel.tsx:65 +#~ msgid "Appeal Decision" +#~ msgstr "Appel de la décision" + +#: src/view/com/util/moderation/LabelInfo.tsx:52 +msgid "Appeal this decision" +msgstr "Faire appel de cette décision" + +#: src/view/com/util/moderation/LabelInfo.tsx:56 +msgid "Appeal this decision." +msgstr "Faire appel de cette décision." + +#: src/view/screens/Settings.tsx:432 +msgid "Appearance" +msgstr "Affichage" + +#: src/view/screens/AppPasswords.tsx:223 +msgid "Are you sure you want to delete the app password \"{name}\"?" +msgstr "Êtes-vous sûr de vouloir supprimer le mot de passe de l’application \"{name}\" ?" + +#: src/view/com/composer/Composer.tsx:142 +msgid "Are you sure you'd like to discard this draft?" +msgstr "Êtes-vous sûr de vouloir rejeter ce brouillon ?" + +#: src/view/screens/ProfileList.tsx:352 +msgid "Are you sure?" +msgstr "Vous confirmez ?" + +#: src/view/com/util/forms/PostDropdownBtn.tsx:190 +msgid "Are you sure? This cannot be undone." +msgstr "Vous confirmez ? Cela ne pourra pas être annulé." + +#: src/view/com/modals/SelfLabel.tsx:123 +msgid "Artistic or non-erotic nudity." +msgstr "Nudité artistique ou non érotique." + +#: src/view/com/auth/create/CreateAccount.tsx:141 +#: src/view/com/auth/login/ChooseAccountForm.tsx:151 +#: src/view/com/auth/login/ForgotPasswordForm.tsx:166 +#: 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: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 "Arrière" + +#: src/view/screens/Settings.tsx:461 +msgid "Basics" +msgstr "Principes de base" + +#: src/view/com/auth/create/Step2.tsx:131 +#: src/view/com/modals/BirthDateSettings.tsx:72 +msgid "Birthday" +msgstr "Date de naissance" + +#: src/view/screens/Settings.tsx:312 +msgid "Birthday:" +msgstr "Date de naissance :" + +#: src/view/com/profile/ProfileHeader.tsx:282 +#: src/view/com/profile/ProfileHeader.tsx:389 +msgid "Block Account" +msgstr "Bloquer ce compte" + +#: src/view/screens/ProfileList.tsx:522 +msgid "Block accounts" +msgstr "Bloquer ces comptes" + +#: src/view/screens/ProfileList.tsx:472 +msgid "Block list" +msgstr "Liste de blocage" + +#: src/view/screens/ProfileList.tsx:307 +msgid "Block these accounts?" +msgstr "Bloquer ces comptes ?" + +#: src/view/screens/Moderation.tsx:123 +msgid "Blocked accounts" +msgstr "Comptes bloqués" + +#: src/view/screens/ModerationBlockedAccounts.tsx:106 +msgid "Blocked Accounts" +msgstr "Comptes bloqués" + +#: src/view/com/profile/ProfileHeader.tsx:284 +msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." +msgstr "Les comptes bloqués ne peuvent pas répondre à vos discussions, vous mentionner ou interagir avec vous." + +#: 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 "Les comptes bloqués ne peuvent pas répondre à vos discussions, vous mentionner ou interagir avec vous. Vous ne verrez pas leur contenu et ils ne pourront pas voir le vôtre." + +#: src/view/com/post-thread/PostThread.tsx:251 +msgid "Blocked post." +msgstr "Publication bloquée." + +#: 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 "Le blocage est public. Les comptes bloqués ne peuvent pas répondre à vos discussions, vous mentionner ou interagir avec vous." + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:93 +msgid "Blog" +msgstr "Blog" + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:31 +msgid "Bluesky" +msgstr "Bluesky" + +#: src/view/com/auth/onboarding/WelcomeMobile.tsx:80 +msgid "Bluesky is flexible." +msgstr "Bluesky est adaptable." + +#: src/view/com/auth/onboarding/WelcomeMobile.tsx:69 +msgid "Bluesky is open." +msgstr "Bluesky est ouvert." + +#: src/view/com/auth/onboarding/WelcomeMobile.tsx:56 +msgid "Bluesky is public." +msgstr "Bluesky est public." + +#: 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 distribue des invitations pour construire une communauté plus saine. Si personne ne peut vous donner une invitation, vous pouvez vous inscrire sur notre liste d’attente et nous vous en enverrons une bientôt." + +#: 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 "Bluesky n’affichera pas votre profil et vos messages à des utilisateurs non connectés. Il est possible que d’autres applications n’honorent pas cette demande. Cela ne privatise pas votre compte." + +#: src/view/com/modals/ServerInput.tsx:78 +msgid "Bluesky.Social" +msgstr "Bluesky.Social" + +#: src/view/screens/Settings.tsx:718 +msgid "Build version {0} {1}" +msgstr "Version Build {0} {1}" + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:87 +msgid "Business" +msgstr "Affaires" + +#: src/view/com/composer/photos/OpenCameraBtn.tsx:60 +#: src/view/com/util/UserAvatar.tsx:221 +#: src/view/com/util/UserBanner.tsx:38 +msgid "Camera" +msgstr "Caméra" + +#: 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 "Ne peut contenir que des lettres, des chiffres, des espaces, des tirets et des tirets bas. La longueur doit être d’au moins 4 caractères, mais pas plus de 32." + +#: src/view/com/composer/Composer.tsx:285 +#: src/view/com/composer/Composer.tsx:288 +#: src/view/com/modals/AltImage.tsx:128 +#: src/view/com/modals/ChangeEmail.tsx:218 +#: src/view/com/modals/ChangeEmail.tsx:220 +#: src/view/com/modals/Confirm.tsx:88 +#: src/view/com/modals/CreateOrEditList.tsx:267 +#: src/view/com/modals/CreateOrEditList.tsx:272 +#: src/view/com/modals/DeleteAccount.tsx:150 +#: src/view/com/modals/DeleteAccount.tsx:223 +#: src/view/com/modals/EditImage.tsx:323 +#: src/view/com/modals/EditProfile.tsx:248 +#: 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:592 +#: src/view/shell/desktop/Search.tsx:182 +msgid "Cancel" +msgstr "Annuler" + +#: src/view/com/modals/DeleteAccount.tsx:146 +#: src/view/com/modals/DeleteAccount.tsx:219 +msgid "Cancel account deletion" +msgstr "Annuler suppression de compte" + +#: src/view/com/modals/AltImage.tsx:123 +msgid "Cancel add image alt text" +msgstr "Annuler l’ajout d’un texte alt à l’image" + +#: src/view/com/modals/ChangeHandle.tsx:149 +msgid "Cancel change handle" +msgstr "Annuler changement pseudo" + +#: src/view/com/modals/crop-image/CropImage.web.tsx:134 +msgid "Cancel image crop" +msgstr "Annuler recadrage de l’image" + +#: src/view/com/modals/EditProfile.tsx:243 +msgid "Cancel profile editing" +msgstr "Annuler modification du profil" + +#: src/view/com/modals/Repost.tsx:64 +msgid "Cancel quote post" +msgstr "Annuler la citation" + +#: src/view/com/modals/ListAddRemoveUsers.tsx:87 +#: src/view/shell/desktop/Search.tsx:178 +msgid "Cancel search" +msgstr "Annuler la recherche" + +#: src/view/com/modals/Waitlist.tsx:132 +msgid "Cancel waitlist signup" +msgstr "Annuler l’inscription sur la liste d’attente" + +#: src/view/screens/Settings.tsx:306 +msgid "Change" +msgstr "Changer" + +#: src/view/screens/Settings.tsx:601 +#: src/view/screens/Settings.tsx:610 +msgid "Change handle" +msgstr "Changer pseudo" + +#: src/view/com/modals/ChangeHandle.tsx:161 +msgid "Change Handle" +msgstr "Changer Pseudo" + +#: src/view/com/modals/VerifyEmail.tsx:141 +msgid "Change my email" +msgstr "Modifier mon e-mail" + +#: src/view/com/modals/ChangeEmail.tsx:109 +msgid "Change Your Email" +msgstr "Modifiez votre e-mail" + +#: 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 "Consultez quelques fils d’actu recommandés. Appuyez sur + pour les ajouter à votre liste de fils d’actualité." + +#: src/view/com/auth/onboarding/RecommendedFollows.tsx:185 +msgid "Check out some recommended users. Follow them to see similar users." +msgstr "Consultez quelques utilisateurs recommandés. Suivez-les pour voir des utilisateurs similaires." + +#: src/view/com/modals/DeleteAccount.tsx:163 +msgid "Check your inbox for an email with the confirmation code to enter below:" +msgstr "Consultez votre boîte de réception, vous avez du recevoir un e-mail contenant un code de confirmation à saisir ci-dessous :" + +#: src/view/com/modals/ServerInput.tsx:38 +msgid "Choose Service" +msgstr "Choisir un service" + +#: src/view/com/auth/onboarding/WelcomeMobile.tsx:83 +msgid "Choose the algorithms that power your experience with custom feeds." +msgstr "Choisissez les algorithmes qui alimentent votre expérience avec des fils d’actualité personnalisés." + +#: src/view/com/auth/create/Step2.tsx:106 +msgid "Choose your password" +msgstr "Choisissez votre mot de passe" + +#: src/view/screens/Settings.tsx:694 +msgid "Clear all legacy storage data" +msgstr "Effacer toutes les données de stockage existantes" + +#: src/view/screens/Settings.tsx:696 +msgid "Clear all legacy storage data (restart after this)" +msgstr "Effacer toutes les données de stockage existantes (redémarrer ensuite)" + +#: src/view/screens/Settings.tsx:706 +msgid "Clear all storage data" +msgstr "Effacer toutes les données de stockage" + +#: src/view/screens/Settings.tsx:708 +msgid "Clear all storage data (restart after this)" +msgstr "Effacer toutes les données de stockage (redémarrer ensuite)" + +#: src/view/com/util/forms/SearchInput.tsx:73 +#: src/view/screens/Search/Search.tsx:577 +msgid "Clear search query" +msgstr "Effacer la recherche" + +#: src/view/com/auth/login/PasswordUpdatedForm.tsx:38 +msgid "Close alert" +msgstr "Fermer l’alerte" + +#: src/view/com/util/BottomSheetCustomBackdrop.tsx:33 +msgid "Close bottom drawer" +msgstr "Fermer le tiroir du bas" + +#: src/view/com/lightbox/ImageViewing/components/ImageDefaultHeader.tsx:26 +msgid "Close image" +msgstr "Fermer l’image" + +#: src/view/com/lightbox/Lightbox.web.tsx:112 +msgid "Close image viewer" +msgstr "Fermer la visionneuse d’images" + +#: src/view/shell/index.web.tsx:49 +msgid "Close navigation footer" +msgstr "Fermer le pied de page de navigation" + +#: src/view/screens/CommunityGuidelines.tsx:32 +msgid "Community Guidelines" +msgstr "Directives communautaires" + +#: src/view/com/composer/Prompt.tsx:24 +msgid "Compose reply" +msgstr "Rédiger une réponse" + +#: src/view/com/modals/AppealLabel.tsx:98 +#: src/view/com/modals/Confirm.tsx:75 +#: src/view/com/modals/SelfLabel.tsx:154 +#: src/view/com/modals/VerifyEmail.tsx:225 +#: src/view/screens/PreferencesHomeFeed.tsx:299 +#: src/view/screens/PreferencesThreads.tsx:153 +msgid "Confirm" +msgstr "Confirmer" + +#: src/view/com/modals/ChangeEmail.tsx:193 +#: src/view/com/modals/ChangeEmail.tsx:195 +msgid "Confirm Change" +msgstr "Confirmer le changement" + +#: src/view/com/modals/lang-settings/ConfirmLanguagesButton.tsx:34 +msgid "Confirm content language settings" +msgstr "Confirmer les paramètres de langue" + +#: src/view/com/modals/DeleteAccount.tsx:209 +msgid "Confirm delete account" +msgstr "Confirmer la suppression du compte" + +#: src/view/com/modals/ChangeEmail.tsx:157 +#: src/view/com/modals/DeleteAccount.tsx:176 +#: src/view/com/modals/VerifyEmail.tsx:159 +msgid "Confirmation code" +msgstr "Code de confirmation" + +#: src/view/com/auth/create/CreateAccount.tsx:174 +#: src/view/com/auth/login/LoginForm.tsx:268 +msgid "Connecting..." +msgstr "Connexion..." + +#: src/view/screens/Moderation.tsx:81 +msgid "Content filtering" +msgstr "Filtrage du contenu" + +#: src/view/com/modals/ContentFilteringSettings.tsx:44 +msgid "Content Filtering" +msgstr "Filtrage du contenu" + +#: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:74 +#: src/view/screens/LanguageSettings.tsx:278 +msgid "Content Languages" +msgstr "Langues du contenu" + +#: src/view/com/util/moderation/ScreenHider.tsx:78 +msgid "Content Warning" +msgstr "Avertissement sur le contenu" + +#: src/view/com/composer/labels/LabelsBtn.tsx:31 +msgid "Content warnings" +msgstr "Avertissements sur le contenu" + +#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:148 +#: src/view/com/auth/onboarding/RecommendedFollows.tsx:209 +msgid "Continue" +msgstr "Continuer" + +#: src/view/com/modals/AddAppPasswords.tsx:193 +#: src/view/com/modals/InviteCodes.tsx:179 +msgid "Copied" +msgstr "Copié" + +#: src/view/com/modals/AddAppPasswords.tsx:186 +msgid "Copy" +msgstr "Copie" + +#: src/view/screens/ProfileList.tsx:384 +msgid "Copy link to list" +msgstr "Copier le lien dans la liste" + +#: src/view/com/util/forms/PostDropdownBtn.tsx:131 +msgid "Copy link to post" +msgstr "Copier le lien dans la publication" + +#: src/view/com/profile/ProfileHeader.tsx:338 +msgid "Copy link to profile" +msgstr "Copier le lien sur le profil" + +#: src/view/com/util/forms/PostDropdownBtn.tsx:117 +msgid "Copy post text" +msgstr "Copier le texte de la publication" + +#: src/view/screens/CopyrightPolicy.tsx:29 +msgid "Copyright Policy" +msgstr "Politique sur les droits d’auteur" + +#: src/view/screens/ProfileFeed.tsx:94 +msgid "Could not load feed" +msgstr "Impossible de charger le fil d’actu" + +#: src/view/screens/ProfileList.tsx:830 +msgid "Could not load list" +msgstr "Impossible de charger la liste" + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:62 +#: src/view/com/auth/SplashScreen.tsx:46 +msgid "Create a new account" +msgstr "Créer un nouveau compte" + +#: src/view/com/auth/create/CreateAccount.tsx:120 +msgid "Create Account" +msgstr "Créer un compte" + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:54 +#: src/view/com/auth/SplashScreen.tsx:43 +msgid "Create new account" +msgstr "Créer un nouveau compte" + +#: src/view/screens/AppPasswords.tsx:248 +msgid "Created {0}" +msgstr "{0} créé" + +#: src/view/com/modals/ChangeHandle.tsx:387 +#: src/view/com/modals/ServerInput.tsx:102 +msgid "Custom domain" +msgstr "Domaine personnalisé" + +#: src/view/screens/Settings.tsx:615 +msgid "Danger Zone" +msgstr "Zone de danger" + +#: src/view/screens/Settings.tsx:622 +msgid "Delete account" +msgstr "Supprimer compte" + +#: src/view/com/modals/DeleteAccount.tsx:83 +msgid "Delete Account" +msgstr "Supprimer compte" + +#: src/view/screens/AppPasswords.tsx:221 +#: src/view/screens/AppPasswords.tsx:241 +msgid "Delete app password" +msgstr "Supprimer le mot de passe de l’appli" + +#: src/view/screens/ProfileList.tsx:351 +#: src/view/screens/ProfileList.tsx:411 +msgid "Delete List" +msgstr "Supprimer la liste" + +#: src/view/com/modals/DeleteAccount.tsx:212 +msgid "Delete my account" +msgstr "Supprimer mon compte" + +#: src/view/screens/Settings.tsx:632 +msgid "Delete my account…" +msgstr "Supprimer mon compte..." + +#: src/view/com/util/forms/PostDropdownBtn.tsx:185 +msgid "Delete post" +msgstr "Supprimer publication" + +#: src/view/com/util/forms/PostDropdownBtn.tsx:189 +msgid "Delete this post?" +msgstr "Supprimer cette publication ?" + +#: src/view/com/post-thread/PostThread.tsx:243 +msgid "Deleted post." +msgstr "Publication supprimée." + +#: src/view/com/modals/CreateOrEditList.tsx:218 +#: src/view/com/modals/CreateOrEditList.tsx:234 +#: src/view/com/modals/EditProfile.tsx:197 +#: src/view/com/modals/EditProfile.tsx:209 +msgid "Description" +msgstr "Description" + +#: src/view/com/auth/create/Step1.tsx:96 +msgid "Dev Server" +msgstr "Serveur de dév" + +#: src/view/screens/Settings.tsx:637 +msgid "Developer Tools" +msgstr "Outils du dév" + +#: src/view/com/composer/Composer.tsx:143 +msgid "Discard" +msgstr "Ignorer" + +#: src/view/com/composer/Composer.tsx:137 +msgid "Discard draft" +msgstr "Ignorer brouillon" + +#: src/view/screens/Moderation.tsx:207 +msgid "Discourage apps from showing my account to logged-out users" +msgstr "Empêcher les appli de montrer mon compte aux utilisateurs déconnectés" + +#: src/view/screens/Feeds.tsx:405 +msgid "Discover new feeds" +msgstr "Découvrir de nouveaux fils d’actu" + +#: src/view/com/modals/EditProfile.tsx:191 +msgid "Display name" +msgstr "Afficher nom" + +#: src/view/com/modals/EditProfile.tsx:179 +msgid "Display Name" +msgstr "Afficher nom" + +#: src/view/com/modals/ChangeHandle.tsx:485 +msgid "Domain verified!" +msgstr "Domaine vérifié !" + +#: src/view/com/auth/onboarding/RecommendedFollows.tsx:86 +#: src/view/com/modals/ContentFilteringSettings.tsx:88 +#: src/view/com/modals/ContentFilteringSettings.tsx:96 +#: src/view/com/modals/crop-image/CropImage.web.tsx:152 +#: src/view/com/modals/EditImage.tsx:333 +#: src/view/com/modals/ListAddRemoveUsers.tsx:142 +#: src/view/com/modals/SelfLabel.tsx:157 +#: src/view/com/modals/Threadgate.tsx:129 +#: src/view/com/modals/Threadgate.tsx:132 +#: src/view/com/modals/UserAddRemoveLists.tsx:79 +#: src/view/screens/PreferencesHomeFeed.tsx:302 +#: src/view/screens/PreferencesThreads.tsx:156 +msgid "Done" +msgstr "Terminé" + +#: src/view/com/modals/lang-settings/ConfirmLanguagesButton.tsx:42 +msgid "Done{extraText}" +msgstr "Terminé{extraText}" + +#: src/view/com/modals/InviteCodes.tsx:94 +msgid "Each code works once. You'll receive more invite codes periodically." +msgstr "Chaque code ne fonctionne qu’une seule fois. Vous recevrez régulièrement d’autres codes d’invitation." + +#: src/view/com/composer/photos/Gallery.tsx:144 +#: src/view/com/modals/EditImage.tsx:207 +msgid "Edit image" +msgstr "Modifier l’image" + +#: src/view/screens/ProfileList.tsx:399 +msgid "Edit list details" +msgstr "Modifier les infos de la liste" + +#: src/view/screens/Feeds.tsx:367 +#: src/view/screens/SavedFeeds.tsx:84 +msgid "Edit My Feeds" +msgstr "Modifier mes fils d’actu" + +#: src/view/com/modals/EditProfile.tsx:151 +msgid "Edit my profile" +msgstr "Modifier mon profil" + +#: src/view/com/profile/ProfileHeader.tsx:453 +msgid "Edit profile" +msgstr "Modifier profil" + +#: src/view/com/profile/ProfileHeader.tsx:456 +msgid "Edit Profile" +msgstr "Modifier profil" + +#: src/view/screens/Feeds.tsx:330 +msgid "Edit Saved Feeds" +msgstr "Modifier les fils d’actu enregistrés" + +#: 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-mail" + +#: src/view/com/auth/create/Step2.tsx:81 +msgid "Email address" +msgstr "Adresse e-mail" + +#: src/view/com/modals/ChangeEmail.tsx:111 +msgid "Email Updated" +msgstr "E-mail mis à jour" + +#: src/view/screens/Settings.tsx:290 +msgid "Email:" +msgstr "E-mail :" + +#: src/view/screens/PreferencesHomeFeed.tsx:138 +msgid "Enable this setting to only see replies between people you follow." +msgstr "Activez ce paramètre pour ne voir que les réponses des personnes que vous suivez." + +#: src/view/screens/Profile.tsx:426 +msgid "End of feed" +msgstr "Fin du fil d’actu" + +#: src/view/com/auth/create/Step1.tsx:71 +msgid "Enter the address of your provider:" +msgstr "Saisissez l’adresse de votre fournisseur :" + +#: src/view/com/modals/ChangeHandle.tsx:369 +msgid "Enter the domain you want to use" +msgstr "Entrez le domaine que vous voulez utiliser" + +#: 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 "Saisissez l’e-mail que vous avez utilisé pour créer votre compte. Nous vous enverrons un « code de réinitialisation » afin changer votre mot de passe." + +#: src/view/com/auth/create/Step2.tsx:86 +msgid "Enter your email address" +msgstr "Entrez votre e-mail" + +#: src/view/com/modals/ChangeEmail.tsx:117 +msgid "Enter your new email address below." +msgstr "Entrez votre nouvelle e-mail ci-dessous." + +#: src/view/com/auth/login/Login.tsx:99 +msgid "Enter your username and password" +msgstr "Entrez votre nom d’utilisateur et votre mot de passe" + +#: src/view/screens/Search/Search.tsx:106 +msgid "Error:" +msgstr "Erreur :" + +#: src/view/com/modals/Threadgate.tsx:76 +msgid "Everybody" +msgstr "Tout le monde" + +#: src/view/com/lightbox/Lightbox.web.tsx:156 +msgid "Expand alt text" +msgstr "Développer le texte alt" + +#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109 +#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141 +msgid "Failed to load recommended feeds" +msgstr "Échec du chargement des fils d’actu recommandés" + +#: src/view/screens/Feeds.tsx:560 +msgid "Feed offline" +msgstr "Fil d’actu hors ligne" + +#: src/view/com/feeds/FeedPage.tsx:143 +msgid "Feed Preferences" +msgstr "Préférences en matière de fil d’actu" + +#: src/view/shell/desktop/RightNav.tsx:65 +#: src/view/shell/Drawer.tsx:292 +msgid "Feedback" +msgstr "Feedback" + +#: src/view/screens/Feeds.tsx:475 +#: src/view/screens/Profile.tsx:165 +#: src/view/shell/bottom-bar/BottomBar.tsx:181 +#: src/view/shell/desktop/LeftNav.tsx:340 +#: src/view/shell/Drawer.tsx:455 +#: src/view/shell/Drawer.tsx:456 +msgid "Feeds" +msgstr "Fil d’actu" + +#: 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 "Les fils d’actu sont créés par les utilisateurs pour rassembler du contenu. Choisissez des fils d’actu qui vous intéressent." + +#: src/view/screens/SavedFeeds.tsx:156 +msgid "Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information." +msgstr "Les fils d’actu sont des algorithmes personnalisés que les utilisateurs construisent avec un peu d’expertise en codage. <0/> pour obtenir de plus amples informations." + +#: src/view/screens/Search/Search.tsx:422 +msgid "Find users on Bluesky" +msgstr "Trouver des utilisateurs sur Bluesky" + +#: src/view/screens/Search/Search.tsx:420 +msgid "Find users with the search tool on the right" +msgstr "Trouvez des utilisateurs à l’aide de l’outil de recherche, à droite." + +#: src/view/com/auth/onboarding/RecommendedFollowsItem.tsx:150 +msgid "Finding similar accounts..." +msgstr "Recherche de comptes similaires..." + +#: src/view/screens/PreferencesHomeFeed.tsx:102 +msgid "Fine-tune the content you see on your home screen." +msgstr "Affinez le contenu de votre écran d’accueil." + +#: src/view/screens/PreferencesThreads.tsx:60 +msgid "Fine-tune the discussion threads." +msgstr "Affiner les fils de discussion." + +#: src/view/com/profile/ProfileHeader.tsx:538 +msgid "Follow" +msgstr "Suivre" + +#: 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 "Suivez quelques utilisateurs pour commencer. Nous pouvons vous recommander d’autres utilisateurs en fonction des personnes qui vous intéressent." + +#: src/view/com/modals/Threadgate.tsx:98 +msgid "Followed users" +msgstr "Utilisateurs suivis" + +#: src/view/screens/PreferencesHomeFeed.tsx:145 +msgid "Followed users only" +msgstr "Utilisateurs suivis uniquement" + +#: src/view/screens/ProfileFollowers.tsx:25 +msgid "Followers" +msgstr "Followers" + +#: src/view/com/profile/ProfileHeader.tsx:624 +msgid "following" +msgstr "suivi" + +#: src/view/com/profile/ProfileHeader.tsx:522 +#: src/view/screens/ProfileFollows.tsx:25 +msgid "Following" +msgstr "Suivi" + +#: src/view/com/profile/ProfileHeader.tsx:571 +msgid "Follows you" +msgstr "Vous suit" + +#: src/view/com/modals/DeleteAccount.tsx:107 +msgid "For security reasons, we'll need to send a confirmation code to your email address." +msgstr "Pour des raisons de sécurité, nous devrons envoyer un code de confirmation à votre e-mail." + +#: 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." +msgstr "Pour des raisons de sécurité, vous ne pourrez plus afficher ceci. Si vous perdez ce mot de passe, vous devrez en générer un autre." + +#: src/view/com/auth/login/LoginForm.tsx:231 +msgid "Forgot" +msgstr "Oublié" + +#: src/view/com/auth/login/LoginForm.tsx:228 +msgid "Forgot password" +msgstr "Mot de passe oublié" + +#: src/view/com/auth/login/Login.tsx:127 +#: src/view/com/auth/login/Login.tsx:143 +msgid "Forgot Password" +msgstr "Mot de passe oublié" + +#: src/view/com/composer/photos/SelectPhotoBtn.tsx:43 +msgid "Gallery" +msgstr "Galerie" + +#: src/view/com/modals/VerifyEmail.tsx:183 +msgid "Get Started" +msgstr "C’est parti" + +#: src/view/com/auth/LoggedOut.tsx:81 +#: src/view/com/auth/LoggedOut.tsx:82 +#: src/view/com/util/moderation/ScreenHider.tsx:123 +#: src/view/shell/desktop/LeftNav.tsx:104 +msgid "Go back" +msgstr "Retour" + +#: 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 "Retour" + +#: src/view/com/auth/login/ForgotPasswordForm.tsx:181 +#: src/view/com/auth/login/LoginForm.tsx:278 +#: src/view/com/auth/login/SetNewPasswordForm.tsx:163 +msgid "Go to next" +msgstr "Aller à la suite" + +#: src/view/com/modals/ChangeHandle.tsx:265 +msgid "Handle" +msgstr "Pseudo" + +#: src/view/shell/desktop/RightNav.tsx:94 +#: src/view/shell/Drawer.tsx:302 +msgid "Help" +msgstr "Aide" + +#: src/view/com/modals/AddAppPasswords.tsx:148 +msgid "Here is your app password." +msgstr "Voici le mot de passe de votre appli." + +#: src/view/com/notifications/FeedItem.tsx:316 +#: src/view/com/util/moderation/ContentHider.tsx:103 +msgid "Hide" +msgstr "Masquer" + +#: src/view/com/notifications/FeedItem.tsx:308 +msgid "Hide user list" +msgstr "Masquer la liste des utilisateurs" + +#: 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 "Hmm, un problème s’est produit avec le serveur de fils d’actu. Veuillez informer le propriétaire du fil d’actu de ce problème." + +#: 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 "Hmm, le serveur du fils d’actu semble être mal configuré. Veuillez informer le propriétaire du fil d’actu de ce problème." + +#: 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 "Mmm... le serveur de fils d’actu semble être hors ligne. Veuillez informer le propriétaire du fil d’actu de ce problème." + +#: 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 "Mmm... le serveur de fils d’actu ne répond pas. Veuillez informer le propriétaire du fil d’actu de ce problème." + +#: src/view/com/posts/FeedErrorMessage.tsx:95 +msgid "Hmm, we're having trouble finding this feed. It may have been deleted." +msgstr "Hmm, nous n’arrivons pas à trouver ce fils d’actu. Il a peut-être été supprimé." + +#: src/view/shell/bottom-bar/BottomBar.tsx:137 +#: src/view/shell/desktop/LeftNav.tsx:304 +#: src/view/shell/Drawer.tsx:379 +#: src/view/shell/Drawer.tsx:380 +msgid "Home" +msgstr "Accueil" + +#: src/view/com/pager/FeedsTabBarMobile.tsx:96 +#: src/view/screens/PreferencesHomeFeed.tsx:95 +#: src/view/screens/Settings.tsx:481 +msgid "Home Feed Preferences" +msgstr "Préférences de fils d’actu de l’accueil" + +#: src/view/com/auth/login/ForgotPasswordForm.tsx:114 +msgid "Hosting provider" +msgstr "Fournisseur d’hébergement" + +#: src/view/com/auth/create/Step1.tsx:76 +#: src/view/com/auth/create/Step1.tsx:81 +msgid "Hosting provider address" +msgstr "Adresse de l’hébergeur" + +#: src/view/com/modals/VerifyEmail.tsx:208 +msgid "I have a code" +msgstr "J’ai un code" + +#: src/view/com/modals/ChangeHandle.tsx:281 +msgid "I have my own domain" +msgstr "J’ai mon propre domaine" + +#: src/view/com/modals/SelfLabel.tsx:127 +msgid "If none are selected, suitable for all ages." +msgstr "Si rien n’est sélectionné, il n’y a pas de restriction d’âge." + +#: src/view/com/modals/AltImage.tsx:97 +msgid "Image alt text" +msgstr "Texte alt de l’image" + +#: src/view/com/util/UserAvatar.tsx:308 +#: src/view/com/util/UserBanner.tsx:116 +msgid "Image options" +msgstr "Options d’images" + +#: src/view/com/auth/login/LoginForm.tsx:113 +msgid "Invalid username or password" +msgstr "Nom d’utilisateur ou mot de passe incorrect" + +#: src/view/screens/Settings.tsx:383 +msgid "Invite" +msgstr "Inviter" + +#: src/view/com/modals/InviteCodes.tsx:91 +#: src/view/screens/Settings.tsx:371 +msgid "Invite a Friend" +msgstr "Inviter un ami" + +#: src/view/com/auth/create/Step2.tsx:57 +msgid "Invite code" +msgstr "Code d’invitation" + +#: src/view/com/auth/create/state.ts:136 +msgid "Invite code not accepted. Check that you input it correctly and try again." +msgstr "Code d’invitation refusé. Vérifiez que vous l’avez saisi correctement et réessayez." + +#: src/view/shell/Drawer.tsx:621 +msgid "Invite codes: {invitesAvailable} available" +msgstr "Codes d’invitation : {invitesAvailable} disponible" + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:99 +msgid "Jobs" +msgstr "Emplois" + +#: src/view/com/modals/Waitlist.tsx:67 +msgid "Join the waitlist" +msgstr "S’inscrire sur la liste d’attente" + +#: src/view/com/auth/create/Step2.tsx:68 +#: src/view/com/auth/create/Step2.tsx:72 +msgid "Join the waitlist." +msgstr "S’inscrire sur la liste d’attente." + +#: src/view/com/modals/Waitlist.tsx:124 +msgid "Join Waitlist" +msgstr "S’inscrire sur la liste d’attente" + +#: src/view/com/composer/select-language/SelectLangBtn.tsx:104 +msgid "Language selection" +msgstr "Sélection de la langue" + +#: src/view/screens/LanguageSettings.tsx:89 +msgid "Language Settings" +msgstr "Paramètres linguistiques" + +#: src/view/screens/Settings.tsx:541 +msgid "Languages" +msgstr "Langues" + +#: src/view/com/util/moderation/ContentHider.tsx:101 +msgid "Learn more" +msgstr "En savoir plus" + +#: src/view/com/util/moderation/PostAlerts.tsx:47 +#: src/view/com/util/moderation/ProfileHeaderAlerts.tsx:65 +#: src/view/com/util/moderation/ScreenHider.tsx:104 +msgid "Learn More" +msgstr "En savoir plus" + +#: src/view/com/util/moderation/ContentHider.tsx:83 +#: 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:101 +msgid "Learn more about this warning" +msgstr "En savoir plus sur cet avertissement" + +#: src/view/screens/Moderation.tsx:242 +msgid "Learn more about what is public on Bluesky." +msgstr "En savoir plus sur ce qui est public sur Bluesky." + +#: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:82 +msgid "Leave them all unchecked to see any language." +msgstr "Si vous ne cochez rien, toutes les langues s’afficheront." + +#: src/view/com/modals/LinkWarning.tsx:49 +msgid "Leaving Bluesky" +msgstr "Quitter Bluesky" + +#: src/view/com/auth/login/Login.tsx:128 +#: src/view/com/auth/login/Login.tsx:144 +msgid "Let's get your password reset!" +msgstr "Réinitialisez votre mot de passe !" + +#: src/view/com/util/UserAvatar.tsx:245 +#: src/view/com/util/UserBanner.tsx:60 +msgid "Library" +msgstr "Bibliothèque" + +#: src/view/screens/ProfileFeed.tsx:577 +msgid "Like this feed" +msgstr "Likez ce fils d’actu" + +#: src/view/screens/PostLikedBy.tsx:27 +#: src/view/screens/ProfileFeedLikedBy.tsx:27 +msgid "Liked by" +msgstr "Liké par" + +#: src/view/screens/Profile.tsx:164 +msgid "Likes" +msgstr "Likes" + +#: src/view/com/modals/CreateOrEditList.tsx:186 +msgid "List Avatar" +msgstr "Liste des avatars" + +#: src/view/com/modals/CreateOrEditList.tsx:199 +msgid "List Name" +msgstr "Nom de liste" + +#: src/view/screens/Profile.tsx:166 +#: src/view/shell/desktop/LeftNav.tsx:377 +#: src/view/shell/Drawer.tsx:471 +#: src/view/shell/Drawer.tsx:472 +msgid "Lists" +msgstr "Listes" + +#: src/view/com/post-thread/PostThread.tsx:260 +#: src/view/com/post-thread/PostThread.tsx:268 +msgid "Load more posts" +msgstr "Charger plus d’articles" + +#: src/view/screens/Notifications.tsx:144 +msgid "Load new notifications" +msgstr "Charger les nouvelles notifications" + +#: src/view/com/feeds/FeedPage.tsx:189 +msgid "Load new posts" +msgstr "Charger les nouveaux messages" + +#: src/view/com/composer/text-input/mobile/Autocomplete.tsx:95 +msgid "Loading..." +msgstr "Chargement..." + +#: src/view/com/modals/ServerInput.tsx:50 +msgid "Local dev server" +msgstr "Serveur de dév local" + +#: src/view/screens/Moderation.tsx:136 +msgid "Logged-out visibility" +msgstr "Visibilité déconnectée" + +#: src/view/com/auth/login/ChooseAccountForm.tsx:133 +msgid "Login to account that is not listed" +msgstr "Se connecter à un compte qui n’est pas listé" + +#: 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 "On dirait que ce fils d’actu n’est disponible que pour les utilisateurs disposant d’un compte Bluesky. Veuillez vous inscrire ou vous connecter pour voir ce fils d’actu !" + +#: src/view/com/modals/LinkWarning.tsx:63 +msgid "Make sure this is where you intend to go!" +msgstr "Assurez-vous que c’est bien là que vous avez l’intention d’aller !" + +#: src/view/screens/Profile.tsx:163 +msgid "Media" +msgstr "Média" + +#: src/view/com/threadgate/WhoCanReply.tsx:139 +msgid "mentioned users" +msgstr "utilisateurs mentionnés" + +#: src/view/com/modals/Threadgate.tsx:93 +msgid "Mentioned users" +msgstr "Utilisateurs mentionnés" + +#: src/view/screens/Search/Search.tsx:537 +msgid "Menu" +msgstr "Menu" + +#: src/view/com/posts/FeedErrorMessage.tsx:194 +msgid "Message from server" +msgstr "Message du serveur" + +#: src/view/screens/Moderation.tsx:64 +#: src/view/screens/Settings.tsx:563 +#: src/view/shell/desktop/LeftNav.tsx:395 +#: src/view/shell/Drawer.tsx:490 +#: src/view/shell/Drawer.tsx:491 +msgid "Moderation" +msgstr "Modération" + +#: src/view/screens/Moderation.tsx:95 +msgid "Moderation lists" +msgstr "Listes de modération" + +#: src/view/screens/ModerationModlists.tsx:58 +msgid "Moderation Lists" +msgstr "Listes de modération" + +#: src/view/shell/desktop/Feeds.tsx:53 +msgid "More feeds" +msgstr "Plus de fils d’actu" + +#: src/view/com/profile/ProfileHeader.tsx:548 +#: src/view/screens/ProfileFeed.tsx:360 +#: src/view/screens/ProfileList.tsx:583 +msgid "More options" +msgstr "Plus d’options" + +#: src/view/com/profile/ProfileHeader.tsx:370 +msgid "Mute Account" +msgstr "Compte en sourdine" + +#: src/view/screens/ProfileList.tsx:510 +msgid "Mute accounts" +msgstr "Comptes en sourdine" + +#: src/view/screens/ProfileList.tsx:457 +msgid "Mute list" +msgstr "Mettre en sourdine" + +#: src/view/screens/ProfileList.tsx:270 +msgid "Mute these accounts?" +msgstr "Mettre ces comptes en sourdine ?" + +#: src/view/com/util/forms/PostDropdownBtn.tsx:149 +msgid "Mute thread" +msgstr "Mettre fil en sourdine" + +#: src/view/screens/Moderation.tsx:109 +msgid "Muted accounts" +msgstr "Comptes en sourdine" + +#: src/view/screens/ModerationMutedAccounts.tsx:106 +msgid "Muted Accounts" +msgstr "Comptes en sourdine" + +#: 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 "Les comptes mis en sourdine voient leurs publications supprimées de votre fil d’actualité et de vos notifications. Cette option est totalement privée." + +#: 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 "Ce que vous mettez en sourdine reste privé. Les comptes en sourdine peuvent interagir avec vous, mais vous ne verrez pas leurs publications et ne recevrez pas de notifications de leur part." + +#: src/view/com/modals/BirthDateSettings.tsx:56 +msgid "My Birthday" +msgstr "Ma date de naissance" + +#: src/view/screens/Feeds.tsx:363 +msgid "My Feeds" +msgstr "Mes fils d’actu" + +#: src/view/shell/desktop/LeftNav.tsx:65 +msgid "My Profile" +msgstr "Mon profil" + +#: src/view/screens/Settings.tsx:520 +msgid "My Saved Feeds" +msgstr "Mes fils d’actu enregistrés" + +#: src/view/com/modals/AddAppPasswords.tsx:177 +#: src/view/com/modals/CreateOrEditList.tsx:211 +msgid "Name" +msgstr "Nom" + +#: src/view/com/auth/onboarding/WelcomeMobile.tsx:72 +msgid "Never lose access to your followers and data." +msgstr "Ne perdez jamais l’accès à vos followers et à vos données." + +#: src/view/screens/Lists.tsx:76 +#: src/view/screens/ModerationModlists.tsx:78 +msgid "New" +msgstr "Nouveau" + +#: src/view/com/feeds/FeedPage.tsx:200 +#: src/view/screens/Feeds.tsx:511 +#: src/view/screens/Profile.tsx:354 +#: src/view/screens/ProfileFeed.tsx:430 +#: src/view/screens/ProfileList.tsx:193 +#: src/view/screens/ProfileList.tsx:221 +#: src/view/shell/desktop/LeftNav.tsx:247 +msgid "New post" +msgstr "Nouvelle publication" + +#: src/view/shell/desktop/LeftNav.tsx:257 +msgid "New Post" +msgstr "Nouvelle publication" + +#: src/view/com/auth/create/CreateAccount.tsx:154 +#: src/view/com/auth/login/ForgotPasswordForm.tsx:174 +#: src/view/com/auth/login/ForgotPasswordForm.tsx:184 +#: src/view/com/auth/login/LoginForm.tsx:281 +#: src/view/com/auth/login/SetNewPasswordForm.tsx:156 +#: src/view/com/auth/login/SetNewPasswordForm.tsx:166 +#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:79 +msgid "Next" +msgstr "Suivant" + +#: src/view/com/lightbox/Lightbox.web.tsx:142 +msgid "Next image" +msgstr "Image suivante" + +#: src/view/screens/PreferencesHomeFeed.tsx:191 +#: src/view/screens/PreferencesHomeFeed.tsx:226 +#: src/view/screens/PreferencesHomeFeed.tsx:263 +msgid "No" +msgstr "Non" + +#: src/view/screens/ProfileFeed.tsx:570 +#: src/view/screens/ProfileList.tsx:711 +msgid "No description" +msgstr "Aucune description" + +#: src/view/com/composer/text-input/mobile/Autocomplete.tsx:97 +msgid "No result" +msgstr "Aucun résultat" + +#: src/view/screens/Feeds.tsx:452 +msgid "No results found for \"{query}\"" +msgstr "Aucun résultat trouvé pour \"{query}\"" + +#: src/view/com/modals/ListAddRemoveUsers.tsx:127 +#: 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 "Aucun résultat trouvé pour {query}" + +#: src/view/com/modals/Threadgate.tsx:82 +msgid "Nobody" +msgstr "Personne" + +#: src/view/com/modals/SelfLabel.tsx:135 +msgid "Not Applicable." +msgstr "Sans objet." + +#: 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 "Remarque : Bluesky est un réseau ouvert et public. Ce paramètre limite uniquement la visibilité de votre contenu sur l’application et le site Web de Bluesky, et d’autres applications peuvent ne pas respecter ce paramètre. Votre contenu peut toujours être montré aux utilisateurs déconnectés par d’autres applications et sites Web." + +#: 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:359 +#: src/view/shell/Drawer.tsx:416 +#: src/view/shell/Drawer.tsx:417 +msgid "Notifications" +msgstr "Notifications" + +#: src/view/com/util/ErrorBoundary.tsx:34 +msgid "Oh no!" +msgstr "Oh non !" + +#: src/view/com/auth/login/PasswordUpdatedForm.tsx:41 +msgid "Okay" +msgstr "D’accord" + +#: src/view/com/composer/Composer.tsx:354 +msgid "One or more images is missing alt text." +msgstr "Une ou plusieurs images n’ont pas de texte alt." + +#: src/view/com/threadgate/WhoCanReply.tsx:100 +msgid "Only {0} can reply." +msgstr "Seul {0} peut répondre." + +#: src/view/com/pager/FeedsTabBarMobile.tsx:76 +msgid "Open navigation" +msgstr "Navigation ouverte" + +#: src/view/screens/Settings.tsx:533 +msgid "Opens configurable language settings" +msgstr "Ouvre les paramètres linguistiques configurables" + +#: src/view/shell/desktop/RightNav.tsx:148 +#: src/view/shell/Drawer.tsx:622 +msgid "Opens list of invite codes" +msgstr "Ouvre la liste des codes d’invitation" + +#: src/view/com/modals/ChangeHandle.tsx:279 +msgid "Opens modal for using custom domain" +msgstr "Ouvre une fenêtre modale pour utiliser un domaine personnalisé" + +#: src/view/screens/Settings.tsx:558 +msgid "Opens moderation settings" +msgstr "Ouvre les paramètres de modération" + +#: src/view/screens/Settings.tsx:514 +msgid "Opens screen with all saved feeds" +msgstr "Ouvre l’écran avec tous les fils d’actu enregistrés" + +#: src/view/screens/Settings.tsx:581 +msgid "Opens the app password settings page" +msgstr "Ouvre la page de configuration du mot de passe" + +#: src/view/screens/Settings.tsx:473 +msgid "Opens the home feed preferences" +msgstr "Ouvre les préférences du fil d’accueil" + +#: src/view/screens/Settings.tsx:664 +msgid "Opens the storybook page" +msgstr "Ouvre la page de l’historique" + +#: src/view/screens/Settings.tsx:644 +msgid "Opens the system log page" +msgstr "Ouvre la page du journal système" + +#: src/view/screens/Settings.tsx:494 +msgid "Opens the threads preferences" +msgstr "Ouvre les préférences relatives aux fils de discussion" + +#: src/view/com/auth/login/ChooseAccountForm.tsx:138 +msgid "Other account" +msgstr "Autre compte" + +#: src/view/com/modals/ServerInput.tsx:88 +msgid "Other service" +msgstr "Autre service" + +#: src/view/com/composer/select-language/SelectLangBtn.tsx:91 +msgid "Other..." +msgstr "Autre..." + +#: src/view/screens/NotFound.tsx:42 +#: src/view/screens/NotFound.tsx:45 +msgid "Page not found" +msgstr "Page introuvable" + +#: src/view/com/auth/create/Step2.tsx:101 +#: src/view/com/auth/create/Step2.tsx:111 +#: src/view/com/auth/login/LoginForm.tsx:216 +#: src/view/com/auth/login/SetNewPasswordForm.tsx:130 +#: src/view/com/modals/DeleteAccount.tsx:191 +msgid "Password" +msgstr "Mot de passe" + +#: src/view/com/auth/login/Login.tsx:157 +msgid "Password updated" +msgstr "Mise à jour du mot de passe" + +#: src/view/com/auth/login/PasswordUpdatedForm.tsx:28 +msgid "Password updated!" +msgstr "Mot de passe mis à jour !" + +#: src/view/com/modals/SelfLabel.tsx:121 +msgid "Pictures meant for adults." +msgstr "Images destinées aux adultes." + +#: src/view/screens/SavedFeeds.tsx:88 +msgid "Pinned Feeds" +msgstr "Fils épinglés" + +#: src/view/com/auth/create/state.ts:116 +msgid "Please choose your handle." +msgstr "Veuillez choisir votre pseudo." + +#: src/view/com/auth/create/state.ts:109 +msgid "Please choose your password." +msgstr "Veuillez choisir votre mot de passe." + +#: 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 "Veuillez confirmer votre e-mail avant de le modifier. Ceci est temporairement requis pendant que des outils de mise à jour d’e-mail sont ajoutés, cette étape ne sera bientôt plus nécessaire." + +#: src/view/com/modals/AddAppPasswords.tsx:140 +msgid "Please enter a unique name for this App Password or use our randomly generated one." +msgstr "Veuillez saisir un nom unique pour le mot de passe de l’application ou utiliser celui que nous avons généré de manière aléatoire." + +#: src/view/com/auth/create/state.ts:95 +msgid "Please enter your email." +msgstr "Veuillez entrer votre e-mail." + +#: src/view/com/modals/DeleteAccount.tsx:180 +msgid "Please enter your password as well:" +msgstr "Veuillez également entrer votre mot de passe :" + +#: src/view/com/modals/AppealLabel.tsx:72 +#: src/view/com/modals/AppealLabel.tsx:75 +msgid "Please tell us why you think this content warning was incorrectly applied!" +msgstr "" + +#: src/view/com/modals/AppealLabel.tsx:72 +#: src/view/com/modals/AppealLabel.tsx:75 +#~ msgid "Please tell us why you think this decision was incorrect." +#~ msgstr "Dites-nous pourquoi vous pensez que cette décision était incorrecte." + +#: src/view/com/composer/Composer.tsx:337 +#: src/view/com/post-thread/PostThread.tsx:226 +#: src/view/screens/PostThread.tsx:80 +msgid "Post" +msgstr "Publication" + +#: src/view/com/post-thread/PostThread.tsx:385 +msgid "Post hidden" +msgstr "Publications cachées" + +#: src/view/com/composer/select-language/SelectLangBtn.tsx:87 +msgid "Post language" +msgstr "Langue de publication" + +#: src/view/com/modals/lang-settings/PostLanguagesSettings.tsx:75 +msgid "Post Languages" +msgstr "Langues de publication" + +#: src/view/com/post-thread/PostThread.tsx:437 +msgid "Post not found" +msgstr "Publication introuvable" + +#: src/view/screens/Profile.tsx:161 +msgid "Posts" +msgstr "Publications" + +#: src/view/com/modals/LinkWarning.tsx:44 +msgid "Potentially Misleading Link" +msgstr "Lien potentiellement trompeur" + +#: src/view/com/lightbox/Lightbox.web.tsx:128 +msgid "Previous image" +msgstr "Image précédente" + +#: src/view/screens/LanguageSettings.tsx:187 +msgid "Primary Language" +msgstr "Langue principale" + +#: src/view/screens/PreferencesThreads.tsx:91 +msgid "Prioritize Your Follows" +msgstr "Définissez des priorités de vos suivis" + +#: src/view/shell/desktop/RightNav.tsx:76 +msgid "Privacy" +msgstr "Vie privée" + +#: src/view/screens/PrivacyPolicy.tsx:29 +msgid "Privacy Policy" +msgstr "Charte de confidentialité" + +#: src/view/com/auth/login/ForgotPasswordForm.tsx:190 +msgid "Processing..." +msgstr "Traitement..." + +#: src/view/shell/bottom-bar/BottomBar.tsx:247 +#: src/view/shell/desktop/LeftNav.tsx:413 +#: src/view/shell/Drawer.tsx:69 +#: src/view/shell/Drawer.tsx:525 +#: src/view/shell/Drawer.tsx:526 +msgid "Profile" +msgstr "Profil" + +#: src/view/screens/Settings.tsx:789 +msgid "Protect your account by verifying your email." +msgstr "Protégez votre compte en vérifiant votre e-mail." + +#: src/view/screens/ModerationModlists.tsx:61 +msgid "Public, shareable lists of users to mute or block in bulk." +msgstr "Listes publiques et partageables d’utilisateurs à mettre en sourdine ou à bloquer." + +#: src/view/screens/Lists.tsx:61 +msgid "Public, shareable lists which can drive feeds." +msgstr "Les listes publiques et partageables qui peuvent alimenter les fils d’actu." + +#: src/view/com/modals/Repost.tsx:52 +#: src/view/com/util/post-ctrls/RepostButton.web.tsx:58 +msgid "Quote post" +msgstr "Citer une publication" + +#: src/view/com/modals/Repost.tsx:56 +msgid "Quote Post" +msgstr "Citer une publication" + +#: src/view/com/modals/EditImage.tsx:236 +msgid "Ratios" +msgstr "Ratios" + +#: src/view/com/auth/onboarding/RecommendedFeeds.tsx:116 +msgid "Recommended Feeds" +msgstr "Fils d’actu recommandés" + +#: src/view/com/auth/onboarding/RecommendedFollows.tsx:180 +msgid "Recommended Users" +msgstr "Utilisateurs recommandés" + +#: src/view/com/modals/ListAddRemoveUsers.tsx:264 +#: src/view/com/modals/SelfLabel.tsx:83 +#: src/view/com/modals/UserAddRemoveLists.tsx:193 +#: src/view/com/util/UserAvatar.tsx:282 +#: src/view/com/util/UserBanner.tsx:89 +msgid "Remove" +msgstr "Supprimer" + +#: src/view/com/feeds/FeedSourceCard.tsx:106 +msgid "Remove {0} from my feeds?" +msgstr "Supprimer {0} de mes fils d’actu ?" + +#: src/view/com/util/AccountDropdownBtn.tsx:22 +msgid "Remove account" +msgstr "Supprimer compte" + +#: src/view/com/posts/FeedErrorMessage.tsx:130 +msgid "Remove feed" +msgstr "Supprimer fil d’actu" + +#: src/view/com/feeds/FeedSourceCard.tsx:105 +#: src/view/com/feeds/FeedSourceCard.tsx:172 +#: src/view/screens/ProfileFeed.tsx:270 +msgid "Remove from my feeds" +msgstr "Supprimer de mes fils d’actu" + +#: src/view/com/composer/photos/Gallery.tsx:167 +msgid "Remove image" +msgstr "Supprimer image" + +#: src/view/com/composer/ExternalEmbed.tsx:70 +msgid "Remove image preview" +msgstr "Supprimer aperçu d’image" + +#: src/view/com/feeds/FeedSourceCard.tsx:173 +msgid "Remove this feed from my feeds?" +msgstr "Supprimer ce fils d’actu ?" + +#: src/view/com/posts/FeedErrorMessage.tsx:131 +msgid "Remove this feed from your saved feeds?" +msgstr "Supprimer ce fils d’actu de vos fils d’actu enregistrés ?" + +#: src/view/com/modals/ListAddRemoveUsers.tsx:199 +#: src/view/com/modals/UserAddRemoveLists.tsx:136 +msgid "Removed from list" +msgstr "Supprimé de la liste" + +#: src/view/screens/Profile.tsx:162 +msgid "Replies" +msgstr "Réponses" + +#: src/view/com/threadgate/WhoCanReply.tsx:98 +msgid "Replies to this thread are disabled" +msgstr "Les réponses à ce fil de discussion sont désactivées" + +#: src/view/screens/PreferencesHomeFeed.tsx:135 +msgid "Reply Filters" +msgstr "Filtres de réponse" + +#: src/view/com/modals/report/Modal.tsx:166 +msgid "Report {collectionName}" +msgstr "Signaler {collectionName}" + +#: src/view/com/profile/ProfileHeader.tsx:404 +msgid "Report Account" +msgstr "Signaler Compte" + +#: src/view/screens/ProfileFeed.tsx:290 +msgid "Report feed" +msgstr "Signaler fil d’actu" + +#: src/view/screens/ProfileList.tsx:425 +msgid "Report List" +msgstr "Signaler Liste" + +#: src/view/com/modals/report/SendReportButton.tsx:37 +#: src/view/com/util/forms/PostDropdownBtn.tsx:167 +msgid "Report post" +msgstr "Signaler publication" + +#: src/view/com/util/post-ctrls/RepostButton.web.tsx:48 +msgid "Repost" +msgstr "Republier" + +#: 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 "Republier ou citer" + +#: src/view/screens/PostRepostedBy.tsx:27 +msgid "Reposted by" +msgstr "Republié par" + +#: src/view/com/modals/ChangeEmail.tsx:181 +#: src/view/com/modals/ChangeEmail.tsx:183 +msgid "Request Change" +msgstr "Demande de modification" + +#: src/view/com/auth/create/Step2.tsx:53 +msgid "Required for this provider" +msgstr "Obligatoire pour ce fournisseur" + +#: src/view/com/auth/login/SetNewPasswordForm.tsx:108 +msgid "Reset code" +msgstr "Réinitialiser code" + +#: src/view/screens/Settings.tsx:686 +msgid "Reset onboarding state" +msgstr "Réinitialisation de l’état d’accueil" + +#: src/view/com/auth/login/ForgotPasswordForm.tsx:98 +msgid "Reset password" +msgstr "Réinitialiser mot de passe" + +#: src/view/screens/Settings.tsx:676 +msgid "Reset preferences state" +msgstr "Réinitialiser l’état des préférences" + +#: src/view/screens/Settings.tsx:684 +msgid "Resets the onboarding state" +msgstr "Réinitialise l’état d’accueil" + +#: src/view/screens/Settings.tsx:674 +msgid "Resets the preferences state" +msgstr "Réinitialise l’état des préférences" + +#: src/view/com/auth/create/CreateAccount.tsx:163 +#: src/view/com/auth/create/CreateAccount.tsx:167 +#: src/view/com/auth/login/LoginForm.tsx:258 +#: src/view/com/auth/login/LoginForm.tsx:261 +#: src/view/com/util/error/ErrorMessage.tsx:55 +#: src/view/com/util/error/ErrorScreen.tsx:65 +msgid "Retry" +msgstr "Réessayer" + +#: src/view/com/modals/AltImage.tsx:115 +#: src/view/com/modals/BirthDateSettings.tsx:93 +#: src/view/com/modals/BirthDateSettings.tsx:96 +#: src/view/com/modals/ChangeHandle.tsx:173 +#: src/view/com/modals/CreateOrEditList.tsx:249 +#: src/view/com/modals/CreateOrEditList.tsx:257 +#: src/view/com/modals/EditProfile.tsx:223 +msgid "Save" +msgstr "Enregistrer" + +#: src/view/com/modals/AltImage.tsx:106 +msgid "Save alt text" +msgstr "Enregistrer texte alt" + +#: src/view/com/modals/EditProfile.tsx:231 +msgid "Save Changes" +msgstr "Enregistrer modifications" + +#: src/view/com/modals/ChangeHandle.tsx:170 +msgid "Save handle change" +msgstr "Enregistrer le changement de pseudo" + +#: src/view/com/modals/crop-image/CropImage.web.tsx:144 +msgid "Save image crop" +msgstr "Enregistrer le recadrage de l’image" + +#: src/view/screens/SavedFeeds.tsx:122 +msgid "Saved Feeds" +msgstr "Fils d’actu enregistrés" + +#: src/view/com/modals/ListAddRemoveUsers.tsx:75 +#: src/view/com/util/forms/SearchInput.tsx:64 +#: 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:322 +#: src/view/shell/desktop/Search.tsx:161 +#: src/view/shell/desktop/Search.tsx:170 +#: src/view/shell/Drawer.tsx:343 +#: src/view/shell/Drawer.tsx:344 +msgid "Search" +msgstr "Recherche" + +#: src/view/com/auth/LoggedOut.tsx:104 +#: src/view/com/auth/LoggedOut.tsx:105 +msgid "Search for users" +msgstr "" + +#: src/view/com/modals/ChangeEmail.tsx:110 +msgid "Security Step Required" +msgstr "Étape de sécurité requise" + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:39 +msgid "See what's next" +msgstr "Voir la suite" + +#: src/view/com/modals/ServerInput.tsx:75 +msgid "Select Bluesky Social" +msgstr "Sélectionner Bluesky Social" + +#: src/view/com/auth/login/Login.tsx:117 +msgid "Select from an existing account" +msgstr "Sélectionner un compte existant" + +#: src/view/com/auth/login/LoginForm.tsx:143 +msgid "Select service" +msgstr "Sélectionner un service" + +#: 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 "Sélectionnez les langues que vous souhaitez voir figurer dans les fils d’actu auxquels vous êtes abonné. Si aucune langue n’est sélectionnée, toutes les langues seront affichées." + +#: src/view/screens/LanguageSettings.tsx:98 +msgid "Select your app language for the default text to display in the app" +msgstr "Sélectionnez la langue de votre application à afficher par défaut" + +#: src/view/screens/LanguageSettings.tsx:190 +msgid "Select your preferred language for translations in your feed." +msgstr "Sélectionnez votre langue préférée pour traduire votre fils d’actu." + +#: src/view/com/modals/VerifyEmail.tsx:196 +msgid "Send Confirmation Email" +msgstr "Envoyer un e-mail de confirmation" + +#: src/view/com/modals/DeleteAccount.tsx:127 +msgid "Send email" +msgstr "Envoyer e-mail" + +#: src/view/com/modals/DeleteAccount.tsx:138 +msgid "Send Email" +msgstr "Envoyer e-mail" + +#: src/view/shell/Drawer.tsx:276 +#: src/view/shell/Drawer.tsx:297 +msgid "Send feedback" +msgstr "Envoyer commentaire" + +#: src/view/com/modals/report/SendReportButton.tsx:45 +msgid "Send Report" +msgstr "Envoyer rapport" + +#: src/view/com/auth/login/SetNewPasswordForm.tsx:78 +msgid "Set new password" +msgstr "Définir un nouveau mot de passe" + +#: 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 "Choisissez « Non » pour masquer toutes les citations sur votre fils d’actu. Les republications seront toujours visibles." + +#: src/view/screens/PreferencesHomeFeed.tsx:113 +msgid "Set this setting to \"No\" to hide all replies from your feed." +msgstr "Choisissez « Non » pour masquer toutes les réponses dans votre fils d’actu." + +#: src/view/screens/PreferencesHomeFeed.tsx:182 +msgid "Set this setting to \"No\" to hide all reposts from your feed." +msgstr "Choisissez « Non » pour masquer toutes les republications de votre fils d’actu." + +#: src/view/screens/PreferencesThreads.tsx:116 +msgid "Set this setting to \"Yes\" to show replies in a threaded view. This is an experimental feature." +msgstr "Choisissez « Oui » pour afficher les réponses dans un fil de discussion. C’est une fonctionnalité expérimentale." + +#: 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 "Choisissez « Oui » pour afficher des échantillons de vos fils d’actu enregistrés dans votre fils d’actu suivant. C’est une fonctionnalité expérimentale." + +#: src/view/screens/Settings.tsx:277 +#: src/view/shell/desktop/LeftNav.tsx:431 +#: src/view/shell/Drawer.tsx:546 +#: src/view/shell/Drawer.tsx:547 +msgid "Settings" +msgstr "Paramètres" + +#: src/view/com/modals/SelfLabel.tsx:125 +msgid "Sexual activity or erotic nudity." +msgstr "Activité sexuelle ou nudité érotique." + +#: src/view/com/profile/ProfileHeader.tsx:338 +#: src/view/com/util/forms/PostDropdownBtn.tsx:131 +#: src/view/screens/ProfileList.tsx:384 +msgid "Share" +msgstr "Partager" + +#: src/view/screens/ProfileFeed.tsx:302 +msgid "Share feed" +msgstr "Partager fils d’actu" + +#: src/view/com/util/moderation/ContentHider.tsx:105 +#: src/view/screens/Settings.tsx:316 +msgid "Show" +msgstr "Afficher" + +#: src/view/com/util/moderation/ScreenHider.tsx:132 +msgid "Show anyway" +msgstr "Afficher quand même" + +#: src/view/screens/PreferencesHomeFeed.tsx:249 +msgid "Show Posts from My Feeds" +msgstr "Afficher les Publications de Mes fils d’actu" + +#: src/view/screens/PreferencesHomeFeed.tsx:213 +msgid "Show Quote Posts" +msgstr "Afficher les Publications de citation" + +#: src/view/screens/PreferencesHomeFeed.tsx:110 +msgid "Show Replies" +msgstr "Afficher réponses" + +#: src/view/screens/PreferencesThreads.tsx:94 +msgid "Show replies by people you follow before all other replies." +msgstr "Afficher les réponses des personnes que vous suivez avant toutes les autres réponses." + +#: src/view/screens/PreferencesHomeFeed.tsx:179 +msgid "Show Reposts" +msgstr "Afficher les republications" + +#: src/view/com/notifications/FeedItem.tsx:337 +msgid "Show users" +msgstr "Afficher les utilisateurs" + +#: src/view/com/auth/HomeLoggedOutCTA.tsx:70 +#: src/view/com/auth/login/Login.tsx:98 +#: 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 "Connexion" + +#: 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 "Connexion" + +#: src/view/com/auth/login/ChooseAccountForm.tsx:44 +msgid "Sign in as {0}" +msgstr "Se connecter en tant que {0}" + +#: src/view/com/auth/login/ChooseAccountForm.tsx:118 +#: src/view/com/auth/login/Login.tsx:116 +msgid "Sign in as..." +msgstr "Se connecter en tant que..." + +#: src/view/com/auth/login/LoginForm.tsx:130 +msgid "Sign into" +msgstr "Se connecter à" + +#: src/view/com/modals/SwitchAccount.tsx:64 +#: src/view/com/modals/SwitchAccount.tsx:67 +msgid "Sign out" +msgstr "Déconnexion" + +#: 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 "S’inscrire" + +#: src/view/shell/NavSignupCard.tsx:42 +msgid "Sign up or sign in to join the conversation" +msgstr "S’inscrire ou se connecter pour participer à la conversation" + +#: src/view/com/util/moderation/ScreenHider.tsx:76 +msgid "Sign-in Required" +msgstr "Connexion requise" + +#: src/view/screens/Settings.tsx:327 +msgid "Signed in as" +msgstr "Connecté en tant que" + +#: src/view/com/auth/onboarding/WelcomeMobile.tsx:33 +msgid "Skip" +msgstr "Ignorer" + +#: src/view/screens/PreferencesThreads.tsx:69 +msgid "Sort Replies" +msgstr "Trier réponses" + +#: src/view/screens/PreferencesThreads.tsx:72 +msgid "Sort replies to the same post by:" +msgstr "Trier les réponses à la même publication par :" + +#: src/view/com/modals/crop-image/CropImage.web.tsx:122 +msgid "Square" +msgstr "Carré" + +#: src/view/com/auth/create/Step1.tsx:90 +#: src/view/com/modals/ServerInput.tsx:62 +msgid "Staging" +msgstr "Mise en scène" + +#: src/view/screens/Settings.tsx:730 +msgid "Status page" +msgstr "Page de statut" + +#: src/view/screens/Settings.tsx:666 +msgid "Storybook" +msgstr "Historique" + +#: src/view/com/modals/AppealLabel.tsx:101 +msgid "Submit" +msgstr "Envoyer" + +#: src/view/screens/ProfileList.tsx:574 +msgid "Subscribe" +msgstr "S’abonner" + +#: src/view/screens/ProfileList.tsx:570 +msgid "Subscribe to this list" +msgstr "S’abonner à cette liste" + +#: src/view/screens/Search/Search.tsx:357 +msgid "Suggested Follows" +msgstr "Suivis suggérés" + +#: src/view/screens/Support.tsx:30 +#: src/view/screens/Support.tsx:33 +msgid "Support" +msgstr "Soutien" + +#: src/view/com/modals/SwitchAccount.tsx:115 +msgid "Switch Account" +msgstr "Changer de compte" + +#: src/view/screens/Settings.tsx:646 +msgid "System log" +msgstr "Journal système" + +#: src/view/com/modals/crop-image/CropImage.web.tsx:112 +msgid "Tall" +msgstr "Grand" + +#: src/view/shell/desktop/RightNav.tsx:85 +msgid "Terms" +msgstr "Conditions générales" + +#: src/view/screens/TermsOfService.tsx:29 +msgid "Terms of Service" +msgstr "Conditions d’utilisation" + +#: src/view/com/modals/AppealLabel.tsx:70 +#: src/view/com/modals/report/InputIssueDetails.tsx:50 +msgid "Text input field" +msgstr "Champ de saisie de texte" + +#: src/view/com/profile/ProfileHeader.tsx:306 +msgid "The account will be able to interact with you after unblocking." +msgstr "Ce compte pourra interagir avec vous après le déblocage." + +#: src/view/screens/CommunityGuidelines.tsx:36 +msgid "The Community Guidelines have been moved to <0/>" +msgstr "Les lignes directrices communautaires ont été déplacées vers <0/>" + +#: src/view/screens/CopyrightPolicy.tsx:33 +msgid "The Copyright Policy has been moved to <0/>" +msgstr "Notre politique de droits d’auteur a été déplacée vers <0/>" + +#: src/view/com/post-thread/PostThread.tsx:440 +msgid "The post may have been deleted." +msgstr "Cette publication a peut-être été supprimée." + +#: src/view/screens/PrivacyPolicy.tsx:33 +msgid "The Privacy Policy has been moved to <0/>" +msgstr "Notre politique de confidentialité a été déplacée vers <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 "Le formulaire d’assistance a été déplacé. Si vous avez besoin d’aide, veuillez <0/> ou rendez-vous {HELP_DESK_URL} pour nous contacter." + +#: src/view/screens/TermsOfService.tsx:33 +msgid "The Terms of Service have been moved to" +msgstr "Nos conditions d’utilisation ont été déplacées vers" + +#: 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!" +msgstr "Un problème inattendu s’est produit dans l’application. N’hésitez pas à nous faire savoir si cela vous est arrivé !" + +#: src/view/com/util/moderation/LabelInfo.tsx:45 +#~ msgid "This {0} has been labeled." +#~ msgstr "Ce {0} a été classé." + +#: src/view/com/util/moderation/ScreenHider.tsx:88 +msgid "This {screenDescription} has been flagged:" +msgstr "Ce {screenDescription} a été signalé :" + +#: src/view/com/util/moderation/ScreenHider.tsx:83 +msgid "This account has requested that users sign in to view their profile." +msgstr "Ce compte a demandé aux utilisateurs de s’identifier pour voir son profil." + +#: src/view/com/posts/FeedErrorMessage.tsx:107 +msgid "This content is not viewable without a Bluesky account." +msgstr "Ce contenu n’est pas visible sans un compte 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 "Ce fil d’actu reçoit actuellement un trafic important, il est temporairement indisponible. Veuillez réessayer plus tard." + +#: src/view/com/modals/BirthDateSettings.tsx:61 +msgid "This information is not shared with other users." +msgstr "Ces informations ne sont pas partagées avec d’autres utilisateurs." + +#: 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 "Ceci est important au cas où vous auriez besoin de changer d’e-mail ou de réinitialiser votre mot de passe." + +#: src/view/com/auth/create/Step1.tsx:55 +msgid "This is the service that keeps you online." +msgstr "C’est le service qui vous permet de rester en ligne." + +#: src/view/com/modals/LinkWarning.tsx:56 +msgid "This link is taking you to the following website:" +msgstr "Ce lien vous conduit au site Web suivant :" + +#: src/view/com/post-thread/PostThreadItem.tsx:123 +msgid "This post has been deleted." +msgstr "Cette publication a été supprimée." + +#: src/view/com/modals/SelfLabel.tsx:137 +msgid "This warning is only available for posts with media attached." +msgstr "Cet avertissement n’est disponible que pour les messages contenant des médias." + +#: src/view/screens/PreferencesThreads.tsx:53 +#: src/view/screens/Settings.tsx:503 +msgid "Thread Preferences" +msgstr "Préférences des fils de discussion" + +#: src/view/screens/PreferencesThreads.tsx:113 +msgid "Threaded Mode" +msgstr "Mode arborescent" + +#: src/view/com/util/forms/DropdownButton.tsx:230 +msgid "Toggle dropdown" +msgstr "Basculer menu déroulant" + +#: src/view/com/modals/EditImage.tsx:271 +msgid "Transformations" +msgstr "Transformations" + +#: src/view/com/post-thread/PostThreadItem.tsx:704 +#: src/view/com/post-thread/PostThreadItem.tsx:706 +#: src/view/com/util/forms/PostDropdownBtn.tsx:103 +msgid "Translate" +msgstr "Traduire" + +#: src/view/com/util/error/ErrorScreen.tsx:73 +msgid "Try again" +msgstr "Réessayer" + +#: src/view/screens/ProfileList.tsx:472 +msgid "Un-block list" +msgstr "Débloquer liste" + +#: src/view/screens/ProfileList.tsx:457 +msgid "Un-mute list" +msgstr "Désactiver sourdine sur cette liste" + +#: 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 "Impossible de contacter votre service. Veuillez vérifier votre connexion Internet." + +#: src/view/com/profile/ProfileHeader.tsx:466 +#: src/view/com/profile/ProfileHeader.tsx:469 +msgid "Unblock" +msgstr "Débloquer" + +#: src/view/com/profile/ProfileHeader.tsx:304 +#: src/view/com/profile/ProfileHeader.tsx:388 +msgid "Unblock Account" +msgstr "Débloquer compte" + +#: src/view/com/util/post-ctrls/RepostButton.web.tsx:48 +msgid "Undo repost" +msgstr "Annuler transfert" + +#: src/view/com/auth/create/state.ts:210 +msgid "Unfortunately, you do not meet the requirements to create an account." +msgstr "Malheureusement, vous ne remplissez pas les conditions requises pour créer un compte." + +#: src/view/com/profile/ProfileHeader.tsx:369 +msgid "Unmute Account" +msgstr "Désactiver sourdine sur ce compte" + +#: src/view/com/util/forms/PostDropdownBtn.tsx:149 +msgid "Unmute thread" +msgstr "Désactiver sourdine sur ce fil de discussion" + +#: src/view/screens/ProfileList.tsx:440 +msgid "Unpin moderation list" +msgstr "Supprimer la liste de modération" + +#: src/view/com/modals/UserAddRemoveLists.tsx:54 +msgid "Update {displayName} in Lists" +msgstr "Mise à jour de {displayName} dans les listes" + +#: src/lib/hooks/useOTAUpdate.ts:15 +msgid "Update Available" +msgstr "Mise à jour disponible" + +#: src/view/com/auth/login/SetNewPasswordForm.tsx:172 +msgid "Updating..." +msgstr "Mise à jour..." + +#: src/view/com/modals/ChangeHandle.tsx:453 +msgid "Upload a text file to:" +msgstr "Télécharger un fichier texte vers :" + +#: src/view/screens/AppPasswords.tsx:194 +msgid "Use app passwords to login to other Bluesky clients without giving full access to your account or password." +msgstr "Utiliser les mots de passe de l’appli pour se connecter à d’autres clients Bluesky sans donner un accès complet à votre compte ou à votre mot de passe." + +#: src/view/com/modals/ChangeHandle.tsx:513 +msgid "Use default provider" +msgstr "Utiliser le fournisseur par défaut" + +#: src/view/com/modals/AddAppPasswords.tsx:150 +msgid "Use this to sign into the other app along with your handle." +msgstr "Utilisez-le pour vous connecter à l’autre application avec votre identifiant." + +#: src/view/com/modals/InviteCodes.tsx:197 +msgid "Used by:" +msgstr "Utilisé par :" + +#: src/view/com/auth/create/Step3.tsx:38 +msgid "User handle" +msgstr "Pseudo utilisateur" + +#: src/view/screens/Lists.tsx:58 +msgid "User Lists" +msgstr "Listes d’utilisateurs" + +#: src/view/com/auth/login/LoginForm.tsx:170 +#: src/view/com/auth/login/LoginForm.tsx:187 +msgid "Username or email address" +msgstr "Nom d’utilisateur ou e-mail" + +#: src/view/screens/ProfileList.tsx:738 +msgid "Users" +msgstr "Utilisateurs" + +#: src/view/com/threadgate/WhoCanReply.tsx:143 +msgid "users followed by <0/>" +msgstr "utilisateurs suivis par <0/>" + +#: src/view/com/modals/Threadgate.tsx:106 +msgid "Users in \"{0}\"" +msgstr "Utilisateurs dans \"{0}\"" + +#: src/view/screens/Settings.tsx:750 +msgid "Verify email" +msgstr "Confirmer e-mail" + +#: src/view/screens/Settings.tsx:775 +msgid "Verify my email" +msgstr "Confirmer mon e-mail" + +#: src/view/screens/Settings.tsx:784 +msgid "Verify My Email" +msgstr "Confirmer mon e-mail" + +#: src/view/com/modals/ChangeEmail.tsx:205 +#: src/view/com/modals/ChangeEmail.tsx:207 +msgid "Verify New Email" +msgstr "Confirmer nouvel e-mail" + +#: src/view/screens/Log.tsx:52 +msgid "View debug entry" +msgstr "Afficher l’entrée de débogage" + +#: src/view/com/profile/ProfileSubpageHeader.tsx:128 +msgid "View the avatar" +msgstr "Afficher avatar" + +#: src/view/com/modals/LinkWarning.tsx:73 +msgid "Visit Site" +msgstr "Visiter le site" + +#: src/view/com/auth/create/CreateAccount.tsx:121 +msgid "We're so excited to have you join us!" +msgstr "Nous sommes ravis de vous accueillir !" + +#: 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 "Nous sommes désolés, mais votre recherche a été annulée. Veuillez réessayer dans quelques minutes." + +#: src/view/screens/NotFound.tsx:48 +msgid "We're sorry! We can't find the page you were looking for." +msgstr "Nous sommes désolés ! La page que vous recherchez est introuvable." + +#: src/view/com/auth/onboarding/WelcomeMobile.tsx:46 +msgid "Welcome to <0>Bluesky" +msgstr "Bienvenue sur <0>Bluesky" + +#: src/view/com/modals/report/Modal.tsx:169 +msgid "What is the issue with this {collectionName}?" +msgstr "Quel est le problème avec cette {collectionName} ?" + +#: src/view/com/auth/SplashScreen.tsx:34 +#~ msgid "What's next?" +#~ msgstr "Et après ?" + +#: 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 "Quelles sont les langues utilisées dans cette publication ?" + +#: src/view/com/modals/lang-settings/ContentLanguagesSettings.tsx:77 +msgid "Which languages would you like to see in your algorithmic feeds?" +msgstr "Quelles langues aimeriez-vous voir apparaître dans vos flux algorithmiques ?" + +#: src/view/com/composer/threadgate/ThreadgateBtn.tsx:47 +#: src/view/com/modals/Threadgate.tsx:66 +msgid "Who can reply" +msgstr "Qui peut répondre ?" + +#: src/view/com/modals/crop-image/CropImage.web.tsx:102 +msgid "Wide" +msgstr "Large" + +#: src/view/com/composer/Composer.tsx:409 +msgid "Write post" +msgstr "Rédiger une publication" + +#: src/view/com/composer/Prompt.tsx:33 +msgid "Write your reply" +msgstr "Rédigez votre réponse" + +#: src/view/screens/PreferencesHomeFeed.tsx:192 +#: src/view/screens/PreferencesHomeFeed.tsx:227 +#: src/view/screens/PreferencesHomeFeed.tsx:262 +msgid "Yes" +msgstr "Oui" + +#: src/view/com/auth/create/Step1.tsx:106 +msgid "You can change hosting providers at any time." +msgstr "Vous pouvez changer d’hébergeur à tout moment." + +#: src/view/com/auth/login/Login.tsx:158 +#: src/view/com/auth/login/PasswordUpdatedForm.tsx:31 +msgid "You can now sign in with your new password." +msgstr "Vous pouvez maintenant vous connecter avec votre nouveau mot de passe." + +#: src/view/com/modals/InviteCodes.tsx:64 +msgid "You don't have any invite codes yet! We'll send you some when you've been on Bluesky for a little longer." +msgstr "Vous n’avez encore aucun code d’invitation ! Nous vous en enverrons lorsque vous serez sur Bluesky depuis un peu plus longtemps." + +#: src/view/screens/SavedFeeds.tsx:102 +msgid "You don't have any pinned feeds." +msgstr "Vous n’avez encore aucun fil épinglé." + +#: src/view/screens/Feeds.tsx:383 +msgid "You don't have any saved feeds!" +msgstr "Vous n’avez encore aucun fil enregistré !" + +#: src/view/screens/SavedFeeds.tsx:135 +msgid "You don't have any saved feeds." +msgstr "Vous n’avez encore aucun fil enregistré." + +#: src/view/com/post-thread/PostThread.tsx:388 +msgid "You have blocked the author or you have been blocked by the author." +msgstr "Vous avez bloqué cet auteur ou il/elle vous a bloqué." + +#: src/view/com/feeds/ProfileFeedgens.tsx:141 +msgid "You have no feeds." +msgstr "Vous n’avez aucun fil." + +#: src/view/com/lists/MyLists.tsx:89 +#: src/view/com/lists/ProfileLists.tsx:145 +msgid "You have no lists." +msgstr "Vous n’avez aucune liste." + +#: 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 "Vous n’avez pas encore bloqué de comptes. Pour bloquer un compte, accédez à son profil et sélectionnez « Bloquer compte » dans le menu de son compte." + +#: 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 "Vous n’avez encore créé aucun mot de passe pour l’appli. Vous pouvez en créer un en cliquant sur le bouton suivant." + +#: 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." +msgstr "Vous n’avez encore mis aucun compte en sourdine. Pour désactiver un compte, allez sur son profil et sélectionnez « Désactiver compte » dans le menu de son compte." + +#: 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 "Vous recevrez un e-mail contenant un « code de réinitialisation » Saisissez ce code ici, puis votre nouveau mot de passe." + +#: src/view/com/auth/create/Step2.tsx:43 +msgid "Your account" +msgstr "Votre compte" + +#: src/view/com/auth/create/Step2.tsx:122 +msgid "Your birth date" +msgstr "Votre date de naissance" + +#: src/view/com/auth/create/state.ts:102 +msgid "Your email appears to be invalid." +msgstr "Votre e-mail semble être invalide." + +#: src/view/com/modals/Waitlist.tsx:107 +msgid "Your email has been saved! We'll be in touch soon." +msgstr "Votre e-mail a été enregistré ! Nous vous contacterons bientôt." + +#: 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 "Votre e-mail a été mis à jour, mais n’a pas été vérifié. L’étape suivante consiste à vérifier votre nouvel e-mail." + +#: 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 "Votre e-mail n’a pas encore été vérifié. Il s’agit d’une mesure de sécurité importante que nous recommandons." + +#: src/view/com/auth/create/Step3.tsx:42 +#: src/view/com/modals/ChangeHandle.tsx:270 +msgid "Your full handle will be" +msgstr "Votre nom complet sera" + +#: src/view/com/auth/create/Step1.tsx:53 +msgid "Your hosting provider" +msgstr "Votre fournisseur d’hébergement" + +#: src/view/screens/Settings.tsx:402 +#: 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 "Vos codes d’invitation sont cachés lorsque vous êtes connecté à l’aide d’un mot de passe d’application." + +#: src/view/com/auth/onboarding/WelcomeMobile.tsx:59 +msgid "Your posts, likes, and blocks are public. Mutes are private." +msgstr "Vos publications, les mentions « J’aime » et les blocages sont publics. Les sourdines sont privées." + +#: src/view/com/modals/SwitchAccount.tsx:82 +msgid "Your profile" +msgstr "Votre profil" + +#: src/view/com/auth/create/Step3.tsx:28 +msgid "Your user handle" +msgstr "Votre pseudo" diff --git a/src/locale/locales/hi/messages.po b/src/locale/locales/hi/messages.po index d45512147d..9aabca57f1 100644 --- a/src/locale/locales/hi/messages.po +++ b/src/locale/locales/hi/messages.po @@ -375,7 +375,7 @@ msgstr "केवल अक्षर, संख्या, रिक्त स् #: 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/AltImage.tsx:128 #: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:220 #: src/view/com/modals/Confirm.tsx:88 @@ -398,7 +398,7 @@ msgstr "कैंसिल" msgid "Cancel account deletion" msgstr "अकाउंट बंद मत करो" -#: src/view/com/modals/AltImage.tsx:122 +#: src/view/com/modals/AltImage.tsx:123 msgid "Cancel add image alt text" msgstr "ऑल्ट टेक्स्ट मत जोड़ें" @@ -805,7 +805,7 @@ msgstr "ईमेल:" msgid "Enable this setting to only see replies between people you follow." msgstr "इस सेटिंग को केवल उन लोगों के बीच जवाब देखने में सक्षम करें जिन्हें आप फॉलो करते हैं।।" -#: src/view/screens/Profile.tsx:425 +#: src/view/screens/Profile.tsx:426 msgid "End of feed" msgstr "" @@ -850,7 +850,7 @@ msgstr "ऑल्ट टेक्स्ट" msgid "Failed to load recommended feeds" msgstr "अनुशंसित फ़ीड लोड करने में विफल" -#: src/view/screens/Feeds.tsx:559 +#: src/view/screens/Feeds.tsx:560 msgid "Feed offline" msgstr "फ़ीड ऑफ़लाइन है" @@ -864,9 +864,9 @@ msgid "Feedback" msgstr "प्रतिक्रिया" #: src/view/screens/Feeds.tsx:475 -#: src/view/screens/Profile.tsx:164 +#: src/view/screens/Profile.tsx:165 #: src/view/shell/bottom-bar/BottomBar.tsx:181 -#: src/view/shell/desktop/LeftNav.tsx:339 +#: src/view/shell/desktop/LeftNav.tsx:340 #: src/view/shell/Drawer.tsx:455 #: src/view/shell/Drawer.tsx:456 msgid "Feeds" @@ -965,7 +965,7 @@ msgstr "प्रारंभ करें" #: src/view/com/auth/LoggedOut.tsx:81 #: src/view/com/auth/LoggedOut.tsx:82 #: src/view/com/util/moderation/ScreenHider.tsx:123 -#: src/view/shell/desktop/LeftNav.tsx:103 +#: src/view/shell/desktop/LeftNav.tsx:104 msgid "Go back" msgstr "वापस जाओ" @@ -1033,7 +1033,7 @@ msgstr "" #~ msgstr "" #: src/view/shell/bottom-bar/BottomBar.tsx:137 -#: src/view/shell/desktop/LeftNav.tsx:303 +#: src/view/shell/desktop/LeftNav.tsx:304 #: src/view/shell/Drawer.tsx:379 #: src/view/shell/Drawer.tsx:380 msgid "Home" @@ -1066,7 +1066,7 @@ msgstr "मेरे पास अपना डोमेन है" msgid "If none are selected, suitable for all ages." msgstr "यदि किसी को चुना जाता है, तो सभी उम्र के लिए उपयुक्त है।।" -#: src/view/com/modals/AltImage.tsx:96 +#: src/view/com/modals/AltImage.tsx:97 msgid "Image alt text" msgstr "छवि alt पाठ" @@ -1187,7 +1187,7 @@ msgstr "इस फ़ीड को लाइक करो" msgid "Liked by" msgstr "इन यूजर ने लाइक किया है" -#: src/view/screens/Profile.tsx:163 +#: src/view/screens/Profile.tsx:164 msgid "Likes" msgstr "" @@ -1207,8 +1207,8 @@ msgstr "सूची अवतार" msgid "List Name" msgstr "सूची का नाम" -#: src/view/screens/Profile.tsx:165 -#: src/view/shell/desktop/LeftNav.tsx:376 +#: src/view/screens/Profile.tsx:166 +#: src/view/shell/desktop/LeftNav.tsx:377 #: src/view/shell/Drawer.tsx:471 #: src/view/shell/Drawer.tsx:472 msgid "Lists" @@ -1255,7 +1255,7 @@ msgstr "उस खाते में लॉग इन करें जो स msgid "Make sure this is where you intend to go!" msgstr "यह सुनिश्चित करने के लिए कि आप कहाँ जाना चाहते हैं!" -#: src/view/screens/Profile.tsx:162 +#: src/view/screens/Profile.tsx:163 msgid "Media" msgstr "" @@ -1277,7 +1277,7 @@ msgstr "" #: src/view/screens/Moderation.tsx:64 #: src/view/screens/Settings.tsx:563 -#: src/view/shell/desktop/LeftNav.tsx:394 +#: src/view/shell/desktop/LeftNav.tsx:395 #: src/view/shell/Drawer.tsx:490 #: src/view/shell/Drawer.tsx:491 msgid "Moderation" @@ -1353,7 +1353,7 @@ msgstr "जन्मदिन" msgid "My Feeds" msgstr "मेरी फ़ीड" -#: src/view/shell/desktop/LeftNav.tsx:64 +#: src/view/shell/desktop/LeftNav.tsx:65 msgid "My Profile" msgstr "मेरी प्रोफाइल" @@ -1376,16 +1376,16 @@ msgid "New" msgstr "नया" #: src/view/com/feeds/FeedPage.tsx:200 -#: src/view/screens/Feeds.tsx:510 -#: src/view/screens/Profile.tsx:353 +#: src/view/screens/Feeds.tsx:511 +#: src/view/screens/Profile.tsx:354 #: 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 +#: src/view/shell/desktop/LeftNav.tsx:247 msgid "New post" msgstr "नई पोस्ट" -#: src/view/shell/desktop/LeftNav.tsx:256 +#: src/view/shell/desktop/LeftNav.tsx:257 msgid "New Post" msgstr "नई पोस्ट" @@ -1462,7 +1462,7 @@ msgstr "" #: 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/desktop/LeftNav.tsx:359 #: src/view/shell/Drawer.tsx:416 #: src/view/shell/Drawer.tsx:417 msgid "Notifications" @@ -1626,7 +1626,7 @@ msgstr "पोस्ट भाषा" msgid "Post not found" msgstr "पोस्ट नहीं मिला" -#: src/view/screens/Profile.tsx:160 +#: src/view/screens/Profile.tsx:161 msgid "Posts" msgstr "" @@ -1659,7 +1659,7 @@ msgid "Processing..." msgstr "प्रसंस्करण..." #: src/view/shell/bottom-bar/BottomBar.tsx:247 -#: src/view/shell/desktop/LeftNav.tsx:412 +#: src/view/shell/desktop/LeftNav.tsx:413 #: src/view/shell/Drawer.tsx:69 #: src/view/shell/Drawer.tsx:525 #: src/view/shell/Drawer.tsx:526 @@ -1751,7 +1751,7 @@ msgstr "इस फ़ीड को सहेजे गए फ़ीड से msgid "Removed from list" msgstr "" -#: src/view/screens/Profile.tsx:161 +#: src/view/screens/Profile.tsx:162 msgid "Replies" msgstr "" @@ -1851,7 +1851,7 @@ msgstr "फिर से कोशिश करो" #~ msgid "Retry change handle" #~ msgstr "हैंडल बदलना फिर से कोशिश करो" -#: src/view/com/modals/AltImage.tsx:114 +#: src/view/com/modals/AltImage.tsx:115 #: src/view/com/modals/BirthDateSettings.tsx:93 #: src/view/com/modals/BirthDateSettings.tsx:96 #: src/view/com/modals/ChangeHandle.tsx:173 @@ -1861,7 +1861,7 @@ msgstr "फिर से कोशिश करो" msgid "Save" msgstr "सेव करो" -#: src/view/com/modals/AltImage.tsx:105 +#: src/view/com/modals/AltImage.tsx:106 msgid "Save alt text" msgstr "सेव ऑल्ट टेक्स्ट" @@ -1890,7 +1890,7 @@ msgstr "सहेजे गए फ़ीड" #: 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/LeftNav.tsx:322 #: src/view/shell/desktop/Search.tsx:161 #: src/view/shell/desktop/Search.tsx:170 #: src/view/shell/Drawer.tsx:343 @@ -1985,7 +1985,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:430 +#: src/view/shell/desktop/LeftNav.tsx:431 #: src/view/shell/Drawer.tsx:546 #: src/view/shell/Drawer.tsx:547 msgid "Settings" diff --git a/src/locale/locales/ja/messages.po b/src/locale/locales/ja/messages.po index 17d40dbe23..4cde1ed952 100644 --- a/src/locale/locales/ja/messages.po +++ b/src/locale/locales/ja/messages.po @@ -347,7 +347,7 @@ msgstr "文字、数字、スペース、ハイフン、およびアンダース #: 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/AltImage.tsx:128 #: src/view/com/modals/ChangeEmail.tsx:218 #: src/view/com/modals/ChangeEmail.tsx:220 #: src/view/com/modals/Confirm.tsx:88 @@ -370,7 +370,7 @@ msgstr "キャンセル" msgid "Cancel account deletion" msgstr "アカウントの削除をキャンセル" -#: src/view/com/modals/AltImage.tsx:122 +#: src/view/com/modals/AltImage.tsx:123 msgid "Cancel add image alt text" msgstr "画像のALTテキストの追加をキャンセル" @@ -773,7 +773,7 @@ msgstr "メールアドレス:" msgid "Enable this setting to only see replies between people you follow." msgstr "この設定を有効にすると、フォローしているユーザー間の返信だけが表示されます。" -#: src/view/screens/Profile.tsx:425 +#: src/view/screens/Profile.tsx:426 msgid "End of feed" msgstr "フィードの終わり" @@ -818,7 +818,7 @@ msgstr "ALTテキストを展開" msgid "Failed to load recommended feeds" msgstr "おすすめのフィードのロードに失敗しました" -#: src/view/screens/Feeds.tsx:559 +#: src/view/screens/Feeds.tsx:560 msgid "Feed offline" msgstr "フィードはオフラインです" @@ -832,9 +832,9 @@ msgid "Feedback" msgstr "フィードバック" #: src/view/screens/Feeds.tsx:475 -#: src/view/screens/Profile.tsx:164 +#: src/view/screens/Profile.tsx:165 #: src/view/shell/bottom-bar/BottomBar.tsx:181 -#: src/view/shell/desktop/LeftNav.tsx:339 +#: src/view/shell/desktop/LeftNav.tsx:340 #: src/view/shell/Drawer.tsx:455 #: src/view/shell/Drawer.tsx:456 msgid "Feeds" @@ -933,7 +933,7 @@ msgstr "はじめに" #: src/view/com/auth/LoggedOut.tsx:81 #: src/view/com/auth/LoggedOut.tsx:82 #: src/view/com/util/moderation/ScreenHider.tsx:123 -#: src/view/shell/desktop/LeftNav.tsx:103 +#: src/view/shell/desktop/LeftNav.tsx:104 msgid "Go back" msgstr "戻る" @@ -993,7 +993,7 @@ msgid "Hmm, we're having trouble finding this feed. It may have been deleted." msgstr "このフィードが見つからないようです。もしかしたら削除されたのかもしれません。" #: src/view/shell/bottom-bar/BottomBar.tsx:137 -#: src/view/shell/desktop/LeftNav.tsx:303 +#: src/view/shell/desktop/LeftNav.tsx:304 #: src/view/shell/Drawer.tsx:379 #: src/view/shell/Drawer.tsx:380 msgid "Home" @@ -1026,7 +1026,7 @@ msgstr "自分のドメインを持っています" msgid "If none are selected, suitable for all ages." msgstr "選択されていない場合は、すべての年齢に適しています。" -#: src/view/com/modals/AltImage.tsx:96 +#: src/view/com/modals/AltImage.tsx:97 msgid "Image alt text" msgstr "画像のALTテキスト" @@ -1138,7 +1138,7 @@ msgstr "このフィードをいいね" msgid "Liked by" msgstr "いいねした人" -#: src/view/screens/Profile.tsx:163 +#: src/view/screens/Profile.tsx:164 msgid "Likes" msgstr "いいね" @@ -1154,8 +1154,8 @@ msgstr "リストアバター" msgid "List Name" msgstr "リストの名前" -#: src/view/screens/Profile.tsx:165 -#: src/view/shell/desktop/LeftNav.tsx:376 +#: src/view/screens/Profile.tsx:166 +#: src/view/shell/desktop/LeftNav.tsx:377 #: src/view/shell/Drawer.tsx:471 #: src/view/shell/Drawer.tsx:472 msgid "Lists" @@ -1202,7 +1202,7 @@ msgstr "リストにないアカウントにログイン" msgid "Make sure this is where you intend to go!" msgstr "意図した場所であることを確認してください!" -#: src/view/screens/Profile.tsx:162 +#: src/view/screens/Profile.tsx:163 msgid "Media" msgstr "メディア" @@ -1224,7 +1224,7 @@ msgstr "サーバーからのメッセージ" #: src/view/screens/Moderation.tsx:64 #: src/view/screens/Settings.tsx:563 -#: src/view/shell/desktop/LeftNav.tsx:394 +#: src/view/shell/desktop/LeftNav.tsx:395 #: src/view/shell/Drawer.tsx:490 #: src/view/shell/Drawer.tsx:491 msgid "Moderation" @@ -1292,7 +1292,7 @@ msgstr "誕生日" msgid "My Feeds" msgstr "マイフィード" -#: src/view/shell/desktop/LeftNav.tsx:64 +#: src/view/shell/desktop/LeftNav.tsx:65 msgid "My Profile" msgstr "マイプロフィール" @@ -1315,16 +1315,16 @@ msgid "New" msgstr "新規" #: src/view/com/feeds/FeedPage.tsx:200 -#: src/view/screens/Feeds.tsx:510 -#: src/view/screens/Profile.tsx:353 +#: src/view/screens/Feeds.tsx:511 +#: src/view/screens/Profile.tsx:354 #: 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 +#: src/view/shell/desktop/LeftNav.tsx:247 msgid "New post" msgstr "新しい投稿" -#: src/view/shell/desktop/LeftNav.tsx:256 +#: src/view/shell/desktop/LeftNav.tsx:257 msgid "New Post" msgstr "新しい投稿" @@ -1388,7 +1388,7 @@ msgstr "注記:Blueskyはオープンでパブリックなネットワーク #: 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/desktop/LeftNav.tsx:359 #: src/view/shell/Drawer.tsx:416 #: src/view/shell/Drawer.tsx:417 msgid "Notifications" @@ -1552,7 +1552,7 @@ msgstr "投稿の言語" msgid "Post not found" msgstr "投稿が見つかりません" -#: src/view/screens/Profile.tsx:160 +#: src/view/screens/Profile.tsx:161 msgid "Posts" msgstr "投稿" @@ -1585,7 +1585,7 @@ msgid "Processing..." msgstr "処理中..." #: src/view/shell/bottom-bar/BottomBar.tsx:247 -#: src/view/shell/desktop/LeftNav.tsx:412 +#: src/view/shell/desktop/LeftNav.tsx:413 #: src/view/shell/Drawer.tsx:69 #: src/view/shell/Drawer.tsx:525 #: src/view/shell/Drawer.tsx:526 @@ -1672,7 +1672,7 @@ msgstr "保存したフィードからこのフィードを削除しますか? msgid "Removed from list" msgstr "リストから削除されました" -#: src/view/screens/Profile.tsx:161 +#: src/view/screens/Profile.tsx:162 msgid "Replies" msgstr "返信" @@ -1760,7 +1760,7 @@ msgstr "設定の状態をリセット" msgid "Retry" msgstr "再試行" -#: src/view/com/modals/AltImage.tsx:114 +#: src/view/com/modals/AltImage.tsx:115 #: src/view/com/modals/BirthDateSettings.tsx:93 #: src/view/com/modals/BirthDateSettings.tsx:96 #: src/view/com/modals/ChangeHandle.tsx:173 @@ -1770,7 +1770,7 @@ msgstr "再試行" msgid "Save" msgstr "保存" -#: src/view/com/modals/AltImage.tsx:105 +#: src/view/com/modals/AltImage.tsx:106 msgid "Save alt text" msgstr "ALTテキストを保存" @@ -1795,7 +1795,7 @@ msgstr "保存されたフィード" #: 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/LeftNav.tsx:322 #: src/view/shell/desktop/Search.tsx:161 #: src/view/shell/desktop/Search.tsx:170 #: src/view/shell/Drawer.tsx:343 @@ -1890,7 +1890,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:430 +#: src/view/shell/desktop/LeftNav.tsx:431 #: src/view/shell/Drawer.tsx:546 #: src/view/shell/Drawer.tsx:547 msgid "Settings" From 7ab188dc1f316599ad6f5ecf5d15231c03547fa8 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Thu, 21 Dec 2023 14:29:23 -0800 Subject: [PATCH 2/7] Bump react-native-drawer-layout@4.0.0-alpha.3 (#2261) --- package.json | 2 +- yarn.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b80456b792..3e87da93a3 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "react-dom": "^18.2.0", "react-native": "0.72.5", "react-native-appstate-hook": "^1.0.6", - "react-native-drawer-layout": "^3.2.0", + "react-native-drawer-layout": "^4.0.0-alpha.3", "react-native-fs": "^2.20.0", "react-native-gesture-handler": "^2.12.1", "react-native-get-random-values": "^1.8.0", diff --git a/yarn.lock b/yarn.lock index ab569ca5b8..8866537e7b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17535,12 +17535,12 @@ react-native-dotenv@^3.3.1: dependencies: dotenv "^16.3.1" -react-native-drawer-layout@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/react-native-drawer-layout/-/react-native-drawer-layout-3.2.1.tgz#eb626216181965e72de6d9377ca619fab40226f2" - integrity sha512-9GDzSLBblxox1zEACcbdXHMU8m22gCTdpT9g1G3Za4Bu766IDxVnIbgRGz6Z2dL99EMtz5E2JoWx257tdHkbpw== +react-native-drawer-layout@^4.0.0-alpha.3: + version "4.0.0-alpha.3" + resolved "https://registry.yarnpkg.com/react-native-drawer-layout/-/react-native-drawer-layout-4.0.0-alpha.3.tgz#0adf51e816f2ce094d415fe33d9f43c1e6df6ae2" + integrity sha512-BRlX8l2gDD41fs8RfaemjDBDV0PPspDMvej/3b9QWfp+JQ/H8tkSdWBtUBbSBzYdqyqy2bHV4epOCMb4t+0B0g== dependencies: - use-latest-callback "^0.1.5" + use-latest-callback "^0.1.9" react-native-fs@^2.20.0: version "2.20.0" @@ -20142,6 +20142,11 @@ use-latest-callback@^0.1.5: resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.1.6.tgz#3fa6e7babbb5f9bfa24b5094b22939e1e92ebcf6" integrity sha512-VO/P91A/PmKH9bcN9a7O3duSuxe6M14ZoYXgA6a8dab8doWNdhiIHzEkX/jFeTTRBsX0Ubk6nG4q2NIjNsj+bg== +use-latest-callback@^0.1.9: + version "0.1.9" + resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.1.9.tgz#10191dc54257e65a8e52322127643a8940271e2a" + integrity sha512-CL/29uS74AwreI/f2oz2hLTW7ZqVeV5+gxFeGudzQrgkCytrHw33G4KbnQOrRlAEzzAFXi7dDLMC9zhWcVpzmw== + use-sidecar@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" From fedb94dd70903ba5b653bd7fc76800ddb1f2bc4d Mon Sep 17 00:00:00 2001 From: Hailey <153161762+haileyok@users.noreply.github.com> Date: Thu, 21 Dec 2023 14:33:46 -0800 Subject: [PATCH 3/7] 3rd party embed player (#2217) * Implement embed player for YT, spotify, and twitch * fix: handle blur event * fix: use video dimensions for twitch * fix: remove hack (?) * fix: remove origin whitelist (?) * fix: prevent ads from opening in browser * fix: handle embeds that don't have a thumb * feat: handle dark/light mode * fix: ts warning * fix: adjust height of no-thumb label * fix: adjust height of no-thumb label * fix: remove debug log, set collapsable to false for player view * fix: fix dimensions "flash" * chore: remove old youtube link test * tests: add tests * fix: thumbless embed position when loading * fix: remove background from webview * cleanup embeds (almost) * more refactoring - Use separate layers for player and overlay to prevent weird sizing issues - Be sure the image is not visible under the player - Clean up some * cleanup styles * parse youtube shorts urls * remove debug * add soundcloud tracks and sets (playlists) * move logic into `ExternalLinkEmbed` * border radius for yt player on native * fix styling on web * allow scrolling in webview on android * remove unnecessary check * autoplay yt on web * fix tests after adding autoplay * move `useNavigation` to top of component --------- Co-authored-by: Paul Frazee --- __tests__/lib/string.test.ts | 167 ++++++++++-- package.json | 3 + src/lib/strings/embed-player.ts | 147 ++++++++++ src/lib/strings/url-helpers.ts | 29 -- src/locale/locales/en/messages.js | 1 + src/locale/locales/hi/messages.js | 1 + src/locale/locales/ja/messages.js | 1 + .../util/post-embeds/ExternalLinkEmbed.tsx | 18 +- .../util/post-embeds/ExternalPlayerEmbed.tsx | 251 ++++++++++++++++++ .../com/util/post-embeds/YoutubeEmbed.tsx | 55 ---- src/view/com/util/post-embeds/index.tsx | 18 +- yarn.lock | 41 ++- 12 files changed, 597 insertions(+), 135 deletions(-) create mode 100644 src/lib/strings/embed-player.ts create mode 100644 src/locale/locales/en/messages.js create mode 100644 src/locale/locales/hi/messages.js create mode 100644 src/locale/locales/ja/messages.js create mode 100644 src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx delete mode 100644 src/view/com/util/post-embeds/YoutubeEmbed.tsx diff --git a/__tests__/lib/string.test.ts b/__tests__/lib/string.test.ts index 63bd785ea7..99b0d25373 100644 --- a/__tests__/lib/string.test.ts +++ b/__tests__/lib/string.test.ts @@ -1,6 +1,5 @@ import {RichText} from '@atproto/api' import { - getYoutubeVideoId, makeRecordUri, toNiceDomain, toShortUrl, @@ -12,6 +11,7 @@ import {detectLinkables} from '../../src/lib/strings/rich-text-detection' import {shortenLinks} from '../../src/lib/strings/rich-text-manip' import {makeValidHandle, createFullHandle} from '../../src/lib/strings/handles' import {cleanError} from '../../src/lib/strings/errors' +import {parseEmbedPlayerFromUrl} from 'lib/strings/embed-player' describe('detectLinkables', () => { const inputs = [ @@ -335,32 +335,6 @@ describe('toShareUrl', () => { }) }) -describe('getYoutubeVideoId', () => { - it(' should return undefined for invalid youtube links', () => { - expect(getYoutubeVideoId('')).toBeUndefined() - expect(getYoutubeVideoId('https://www.google.com')).toBeUndefined() - expect(getYoutubeVideoId('https://www.youtube.com')).toBeUndefined() - expect( - getYoutubeVideoId('https://www.youtube.com/channelName'), - ).toBeUndefined() - expect( - getYoutubeVideoId('https://www.youtube.com/channel/channelName'), - ).toBeUndefined() - }) - - it('getYoutubeVideoId should return video id for valid youtube links', () => { - expect(getYoutubeVideoId('https://www.youtube.com/watch?v=videoId')).toBe( - 'videoId', - ) - expect( - getYoutubeVideoId( - 'https://www.youtube.com/watch?v=videoId&feature=share', - ), - ).toBe('videoId') - expect(getYoutubeVideoId('https://youtu.be/videoId')).toBe('videoId') - }) -}) - describe('shortenLinks', () => { const inputs = [ 'start https://middle.com/foo/bar?baz=bux#hash end', @@ -396,6 +370,7 @@ describe('shortenLinks', () => { ], ], ] + it('correctly shortens rich text while preserving facet URIs', () => { for (let i = 0; i < inputs.length; i++) { const input = inputs[i] @@ -410,3 +385,141 @@ describe('shortenLinks', () => { } }) }) + +describe('parseEmbedPlayerFromUrl', () => { + const inputs = [ + 'https://youtu.be/videoId', + 'https://www.youtube.com/watch?v=videoId', + 'https://www.youtube.com/watch?v=videoId&feature=share', + 'https://youtube.com/watch?v=videoId', + 'https://youtube.com/watch?v=videoId&feature=share', + 'https://youtube.com/shorts/videoId', + + 'https://youtube.com/shorts/', + 'https://youtube.com/', + 'https://youtube.com/random', + + 'https://twitch.tv/channelName', + 'https://www.twitch.tv/channelName', + + 'https://open.spotify.com/playlist/playlistId', + 'https://open.spotify.com/playlist/playlistId?param=value', + + 'https://open.spotify.com/track/songId', + 'https://open.spotify.com/track/songId?param=value', + + 'https://open.spotify.com/album/albumId', + 'https://open.spotify.com/album/albumId?param=value', + + 'https://soundcloud.com/user/track', + 'https://soundcloud.com/user/sets/set', + 'https://soundcloud.com/user/', + ] + + const outputs = [ + { + type: 'youtube_video', + videoId: 'videoId', + playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + }, + { + type: 'youtube_video', + videoId: 'videoId', + playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + }, + { + type: 'youtube_video', + videoId: 'videoId', + playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + }, + { + type: 'youtube_video', + videoId: 'videoId', + playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + }, + { + type: 'youtube_video', + videoId: 'videoId', + playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + }, + { + type: 'youtube_video', + videoId: 'videoId', + playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + }, + undefined, + undefined, + undefined, + + { + type: 'twitch_live', + channelId: 'channelName', + playerUri: `https://player.twitch.tv/?volume=0.5&!muted&autoplay&channel=channelName&parent=localhost`, + }, + { + type: 'twitch_live', + channelId: 'channelName', + playerUri: `https://player.twitch.tv/?volume=0.5&!muted&autoplay&channel=channelName&parent=localhost`, + }, + + { + type: 'spotify_playlist', + playlistId: 'playlistId', + playerUri: `https://open.spotify.com/embed/playlist/playlistId`, + }, + { + type: 'spotify_playlist', + playlistId: 'playlistId', + playerUri: `https://open.spotify.com/embed/playlist/playlistId`, + }, + + { + type: 'spotify_song', + songId: 'songId', + playerUri: `https://open.spotify.com/embed/track/songId`, + }, + { + type: 'spotify_song', + songId: 'songId', + playerUri: `https://open.spotify.com/embed/track/songId`, + }, + + { + type: 'spotify_album', + albumId: 'albumId', + playerUri: `https://open.spotify.com/embed/album/albumId`, + }, + { + type: 'spotify_album', + albumId: 'albumId', + playerUri: `https://open.spotify.com/embed/album/albumId`, + }, + + { + type: 'soundcloud_track', + user: 'user', + track: 'track', + playerUri: `https://w.soundcloud.com/player/?url=https://soundcloud.com/user/track&auto_play=true&visual=false&hide_related=true`, + }, + { + type: 'soundcloud_set', + user: 'user', + set: 'set', + playerUri: `https://w.soundcloud.com/player/?url=https://soundcloud.com/user/sets/set&auto_play=true&visual=false&hide_related=true`, + }, + undefined, + ] + + it('correctly grabs the correct id from uri', () => { + for (let i = 0; i < inputs.length; i++) { + const input = inputs[i] + const output = outputs[i] + + const res = parseEmbedPlayerFromUrl(input) + + console.log(input) + + expect(res).toEqual(output) + } + }) +}) diff --git a/package.json b/package.json index 3e87da93a3..e69ad6bf04 100644 --- a/package.json +++ b/package.json @@ -160,6 +160,9 @@ "react-native-version-number": "^0.3.6", "react-native-web": "~0.19.6", "react-native-web-linear-gradient": "^1.1.2", + "react-native-web-webview": "^1.0.2", + "react-native-webview": "^13.6.2", + "react-native-youtube-iframe": "^2.3.0", "react-responsive": "^9.0.2", "rn-fetch-blob": "^0.12.0", "sentry-expo": "~7.0.1", diff --git a/src/lib/strings/embed-player.ts b/src/lib/strings/embed-player.ts new file mode 100644 index 0000000000..fdd39280ed --- /dev/null +++ b/src/lib/strings/embed-player.ts @@ -0,0 +1,147 @@ +export type EmbedPlayerParams = + | {type: 'youtube_video'; videoId: string; playerUri: string} + | {type: 'twitch_live'; channelId: string; playerUri: string} + | {type: 'spotify_album'; albumId: string; playerUri: string} + | { + type: 'spotify_playlist' + playlistId: string + playerUri: string + } + | {type: 'spotify_song'; songId: string; playerUri: string} + | {type: 'soundcloud_track'; user: string; track: string; playerUri: string} + | {type: 'soundcloud_set'; user: string; set: string; playerUri: string} + +export function parseEmbedPlayerFromUrl( + url: string, +): EmbedPlayerParams | undefined { + let urlp + try { + urlp = new URL(url) + } catch (e) { + return undefined + } + + // youtube + if (urlp.hostname === 'youtu.be') { + const videoId = urlp.pathname.split('/')[1] + if (videoId) { + return { + type: 'youtube_video', + videoId, + playerUri: `https://www.youtube.com/embed/${videoId}?autoplay=1`, + } + } + } + if (urlp.hostname === 'www.youtube.com' || urlp.hostname === 'youtube.com') { + const [_, page, shortVideoId] = urlp.pathname.split('/') + const videoId = + page === 'shorts' ? shortVideoId : (urlp.searchParams.get('v') as string) + + if (videoId) { + return { + type: 'youtube_video', + videoId, + playerUri: `https://www.youtube.com/embed/${videoId}?autoplay=1`, + } + } + } + + // twitch + if (urlp.hostname === 'twitch.tv' || urlp.hostname === 'www.twitch.tv') { + const parts = urlp.pathname.split('/') + if (parts.length === 2 && parts[1]) { + return { + type: 'twitch_live', + channelId: parts[1], + playerUri: `https://player.twitch.tv/?volume=0.5&!muted&autoplay&channel=${parts[1]}&parent=localhost`, + } + } + } + + // spotify + if (urlp.hostname === 'open.spotify.com') { + const [_, type, id] = urlp.pathname.split('/') + if (type && id) { + if (type === 'playlist') { + return { + type: 'spotify_playlist', + playlistId: id, + playerUri: `https://open.spotify.com/embed/playlist/${id}`, + } + } + if (type === 'album') { + return { + type: 'spotify_album', + albumId: id, + playerUri: `https://open.spotify.com/embed/album/${id}`, + } + } + if (type === 'track') { + return { + type: 'spotify_song', + songId: id, + playerUri: `https://open.spotify.com/embed/track/${id}`, + } + } + } + } + + // soundcloud + if ( + urlp.hostname === 'soundcloud.com' || + urlp.hostname === 'www.soundcloud.com' + ) { + const [_, user, trackOrSets, set] = urlp.pathname.split('/') + + if (user && trackOrSets) { + if (trackOrSets === 'sets' && set) { + return { + type: 'soundcloud_set', + user, + set: set, + playerUri: `https://w.soundcloud.com/player/?url=${url}&auto_play=true&visual=false&hide_related=true`, + } + } + + return { + type: 'soundcloud_track', + user, + track: trackOrSets, + playerUri: `https://w.soundcloud.com/player/?url=${url}&auto_play=true&visual=false&hide_related=true`, + } + } + } +} + +export function getPlayerHeight({ + type, + width, + hasThumb, +}: { + type: EmbedPlayerParams['type'] + width: number + hasThumb: boolean +}) { + if (!hasThumb) return (width / 16) * 9 + + switch (type) { + case 'youtube_video': + case 'twitch_live': + return (width / 16) * 9 + case 'spotify_album': + return 380 + case 'spotify_playlist': + return 360 + case 'spotify_song': + if (width <= 300) { + return 180 + } + return 232 + case 'soundcloud_track': + return 165 + case 'soundcloud_set': + return 360 + default: + return width + } +} diff --git a/src/lib/strings/url-helpers.ts b/src/lib/strings/url-helpers.ts index e9bf4111d3..8a71718c8d 100644 --- a/src/lib/strings/url-helpers.ts +++ b/src/lib/strings/url-helpers.ts @@ -139,35 +139,6 @@ export function feedUriToHref(url: string): string { } } -export function getYoutubeVideoId(link: string): string | undefined { - let url - try { - url = new URL(link) - } catch (e) { - return undefined - } - - if ( - url.hostname !== 'www.youtube.com' && - url.hostname !== 'youtube.com' && - url.hostname !== 'youtu.be' - ) { - return undefined - } - if (url.hostname === 'youtu.be') { - const videoId = url.pathname.split('/')[1] - if (!videoId) { - return undefined - } - return videoId - } - const videoId = url.searchParams.get('v') as string - if (!videoId) { - return undefined - } - return videoId -} - /** * Checks if the label in the post text matches the host of the link facet. * diff --git a/src/locale/locales/en/messages.js b/src/locale/locales/en/messages.js new file mode 100644 index 0000000000..9d5ca51a21 --- /dev/null +++ b/src/locale/locales/en/messages.js @@ -0,0 +1 @@ +/*eslint-disable*/module.exports={messages:JSON.parse("{\"PBodTo\":\"- end of feed -\",\"EtUMsZ\":\". This warning is only available for posts with media attached.\",\"ebOBhv\":[[\"0\",\"plural\",{\"one\":[\"#\",\" invite code available\"],\"other\":[\"#\",\" invite codes available\"]}]],\"J/hVSQ\":[[\"0\"]],\"hZQerY\":[[\"0\"],\" \",[\"purposeLabel\"],\" List\"],\"zgN03j\":[[\"invitesAvailable\",\"plural\",{\"one\":[\"Invite codes: \",\"#\",\" available\"],\"other\":[\"Invite codes: \",\"#\",\" available\"]}]],\"OyEWua\":[[\"invitesAvailable\"],\" invite code available\"],\"eFIdHP\":[[\"invitesAvailable\"],\" invite codes available\"],\"wapGcj\":[[\"message\"]],\"umrH9L\":\"<0/> members\",\"gMjqbV\":\"<0>Choose your<1>Recommended<2>Feeds\",\"F657la\":\"<0>Follow some<1>Recommended<2>Users\",\"6RmyWt\":\"<0>Here is your app password. Use this to sign into the other app along with your handle.\",\"GH9ldj\":\"<0>Note: This setting may not be respected by third-party apps that display Bluesky content.\",\"Ga0T2l\":\"<0>Note: Your profile and posts will remain publicly available. Third-party apps that display Bluesky content may not respect this setting.\",\"XCTqGE\":\"A new version of the app is available. Please update to continue using the app.\",\"AnNF5e\":\"Accessibility\",\"AeXO77\":\"Account\",\"4WY4MD\":\"Account options\",\"m16xKo\":\"Add\",\"fBBX+K\":\"Add a content warning\",\"JU3hs2\":\"Add a user to this list\",\"MPPZ54\":\"Add account\",\"LkA8jz\":\"Add alt text\",\"Z8idyM\":\"Add details\",\"AoXl11\":\"Add details to report\",\"iE6B/9\":\"Add link card\",\"EXHdP1\":\"Add link card:\",\"x6laaL\":\"Add the following DNS record to your domain:\",\"UmzMP4\":\"Add to Lists\",\"hCrQ0L\":\"Add to my feeds\",\"GluCXm\":\"Added to list\",\"jRrQFe\":\"Adjust the number of likes a reply must have to be shown in your feed.\",\"qLa52r\":\"Adult Content\",\"sxkWRg\":\"Advanced\",\"u2HO/d\":\"ALT\",\"u/DP73\":\"Alt text\",\"0QlT7/\":\"Alt text describes images for blind and low-vision users, and helps give context to everyone.\",\"woXbjq\":[\"An email has been sent to \",[\"0\"],\". It includes a confirmation code which you can enter below.\"],\"Fon2dK\":[\"An email has been sent to your previous address, \",[\"0\"],\". It includes a confirmation code which you can enter below.\"],\"HZFm5R\":\"and\",\"fdjKGe\":\"App Language\",\"SMmUnj\":\"App passwords\",\"8q4WlH\":\"App Passwords\",\"e6un1h\":\"Appeal Decision\",\"c0PCYD\":\"Appeal this decision\",\"oifO1p\":\"Appeal this decision.\",\"aAIQg2\":\"Appearance\",\"9K5XIM\":\"Apps that respect this setting, including the official Bluesky app and bsky.app website, won't show your content to logged out users.\",\"SSDZ+T\":[\"Are you sure you want to delete the app password \\\"\",[\"name\"],\"\\\"?\"],\"0BIeIs\":\"Are you sure you'd like to discard this draft?\",\"6foA8n\":\"Are you sure?\",\"/mSd6b\":\"Are you sure? This cannot be undone.\",\"EbvWd3\":\"Artistic or non-erotic nudity.\",\"uVotT3\":\"Ask apps to limit the visibility of my account\",\"iH8pgl\":\"Back\",\"ehOkF+\":\"Basics\",\"+gCI2a\":\"Birthday\",\"pieVBA\":\"Birthday:\",\"m1dqxu\":\"Block Account\",\"ffIfdM\":\"Block accounts\",\"hIysMc\":\"Block list\",\"fdYcMy\":\"Block these accounts?\",\"KWykPE\":\"Blocked accounts\",\"JuqQpF\":\"Blocked Accounts\",\"HG4qt4\":\"Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you.\",\"8LNSUt\":\"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.\",\"HFCE4A\":\"Blocked post.\",\"zl+QbX\":\"Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you.\",\"7A9u1j\":\"Bluesky\",\"ZHmKSm\":\"Bluesky is flexible.\",\"odLrdl\":\"Bluesky is open.\",\"/LsWK4\":\"Bluesky is public.\",\"C50OGr\":\"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.\",\"u9cCQU\":\"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.\",\"klVoaP\":\"Bluesky.Social\",\"qxBitM\":[\"Build version \",[\"0\"],\" \",[\"1\"]],\"rT2cV+\":\"Camera\",\"JGGrPC\":\"Can only contain letters, numbers, spaces, dashes, and underscores. Must be at least 4 characters long, but no more than 32 characters long.\",\"dEgA5A\":\"Cancel\",\"aMH9rr\":\"Cancel account deletion\",\"kc3E4R\":\"Cancel add image alt text\",\"wg4LHQ\":\"Cancel change handle\",\"hFL1Li\":\"Cancel image crop\",\"tijH8t\":\"Cancel profile editing\",\"Qe4C/d\":\"Cancel quote post\",\"5TviPn\":\"Cancel search\",\"nss3UV\":\"Cancel waitlist signup\",\"o+XJ9D\":\"Change\",\"pQco5R\":\"Change handle\",\"Q5e1U/\":\"Change Handle\",\"a3NAfL\":\"Change my email\",\"4vatyk\":\"Change Your Email\",\"Yn3C90\":\"Check out some recommended feeds. Tap + to add them to your list of pinned feeds.\",\"ioZXIH\":\"Check out some recommended users. Follow them to see similar users.\",\"/+X+/K\":\"Check your inbox for an email with the confirmation code to enter below:\",\"Rt502e\":\"Choose Service\",\"/L45sc\":\"Choose the algorithms that power your experience with custom feeds.\",\"BwcLKv\":\"Choose your\",\"Wk8hkn\":\"Choose your password\",\"Us7A1O\":\"Clear all legacy storage data\",\"X3zEXo\":\"Clear all legacy storage data (restart after this)\",\"zxFM2c\":\"Clear all storage data\",\"r+lhUL\":\"Clear all storage data (restart after this)\",\"QbvBNV\":\"Clear search query\",\"flH7u/\":\"Close alert\",\"hYmnbk\":\"Close bottom drawer\",\"47L1V1\":\"Close image\",\"l49ujN\":\"Close image viewer\",\"UryHFO\":\"Close navigation footer\",\"KHzDTk\":\"Community Guidelines\",\"o8UUti\":\"Compose reply\",\"7VpPHA\":\"Confirm\",\"q8upsf\":\"Confirm Change\",\"8pNKIr\":\"Confirm content language settings\",\"tGg8Kt\":\"Confirm delete account\",\"ioZOzk\":\"Confirmation code\",\"J28zul\":\"Connecting...\",\"l879p1\":\"Content filtering\",\"m8j6up\":\"Content Filtering\",\"/PlAsF\":\"Content Languages\",\"cogwXi\":\"Content Warning\",\"FG7AQv\":\"Content warnings\",\"xGVfLh\":\"Continue\",\"6V3Ea3\":\"Copied\",\"he3ygx\":\"Copy\",\"7LTXf4\":\"Copy link to list\",\"dWsPi5\":\"Copy link to post\",\"jw+abr\":\"Copy link to profile\",\"iQgJaz\":\"Copy post text\",\"u40k/o\":\"Copyright Policy\",\"7wWvgo\":\"Could not load feed\",\"8NNr/O\":\"Could not load list\",\"mpt9T+\":\"Create a new account\",\"IS0nrP\":\"Create Account\",\"6HbhpU\":\"Create new account\",\"MXSt4t\":[\"Created \",[\"0\"]],\"GAD3Dx\":\"Custom domain\",\"ZQKLI1\":\"Danger Zone\",\"pvnfJD\":\"Dark\",\"ZDGm40\":\"Delete account\",\"vzX5FB\":\"Delete Account\",\"gUEtxf\":\"Delete app password\",\"84uE/A\":\"Delete List\",\"ktknoE\":\"Delete my account\",\"szz0+N\":\"Delete my account…\",\"04G5Az\":\"Delete post\",\"FbPNuJ\":\"Delete this post?\",\"u+1OHY\":\"Deleted post.\",\"Nu4oKW\":\"Description\",\"dacKHE\":\"Dev Server\",\"2ygkE8\":\"Developer Tools\",\"bzSI52\":\"Discard\",\"BryYJR\":\"Discard draft\",\"9Y7FMD\":\"Discourage apps from showing my account to logged-out users\",\"pbLwal\":\"Discover new feeds\",\"pfa8F0\":\"Display name\",\"0gS7M5\":\"Display Name\",\"iZ5pMB\":\"Domain verified!\",\"DPfwMq\":\"Done\",\"zT97vP\":[\"Done\",[\"extraText\"]],\"4uwlSD\":\"Each code works once. You'll receive more invite codes periodically.\",\"XQFMOm\":\"Edit image\",\"S7M0uU\":\"Edit list details\",\"cLmurE\":\"Edit My Feeds\",\"bRZ5XW\":\"Edit my profile\",\"9OpVZg\":\"Edit profile\",\"QJQd1J\":\"Edit Profile\",\"Jn7kox\":\"Edit Saved Feeds\",\"O3oNi5\":\"Email\",\"ATGYL1\":\"Email address\",\"pJJ0Vp\":\"Email Updated\",\"9Qs99X\":\"Email:\",\"96mted\":\"Enable this setting to only see replies between people you follow.\",\"9xK+YC\":\"End of feed\",\"YbIxza\":\"Enter the address of your provider:\",\"BfIgP6\":\"Enter the domain you want to use\",\"cHrOqs\":\"Enter the email you used to create your account. We'll send you a \\\"reset code\\\" so you can set a new password.\",\"xRPn3U\":\"Enter your email address\",\"+inPGm\":\"Enter your new email address below.\",\"T0KLp4\":\"Enter your username and password\",\"4BITzH\":\"Error:\",\"wlzBtv\":\"Everybody\",\"0PkE20\":\"Expand alt text\",\"/5K/KL\":\"Failed to load recommended feeds\",\"4yCy8i\":\"Feed offline\",\"N0CqyO\":\"Feed Preferences\",\"YirHq7\":\"Feedback\",\"2DoBvq\":\"Feeds\",\"I3iUBQ\":\"Feeds are created by users to curate content. Choose some feeds that you find interesting.\",\"2+6lmO\":\"Feeds are custom algorithms that users build with a little coding expertise. <0/> for more information.\",\"Qzj1WT\":\"Finding similar accounts...\",\"QKSrQV\":\"Fine-tune the content you see on your home screen.\",\"r+KeyR\":\"Fine-tune the discussion threads.\",\"MKEPCY\":\"Follow\",\"AD4dxh\":\"Follow some\",\"Wezu5M\":\"Follow some users to get started. We can recommend you more users based on who you find interesting.\",\"jdbMSV\":\"Followed users\",\"YY2BTA\":\"Followed users only\",\"x5LEuB\":\"Followers\",\"NIjL2Y\":\"following\",\"y6sq5j\":\"Following\",\"p3UO/y\":\"Follows you\",\"5RhDkD\":\"For security reasons, we'll need to send a confirmation code to your email address.\",\"NJPhAO\":\"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.\",\"5bDfuq\":\"Forgot\",\"hEPLrs\":\"Forgot password\",\"dn8X5t\":\"Forgot Password\",\"U+kFad\":\"Gallery\",\"c3b0B0\":\"Get Started\",\"CKyk7Q\":\"Go back\",\"sr0UJD\":\"Go Back\",\"Rtp0y7\":\"Go to next\",\"Nf7oXL\":\"Handle\",\"c3XJ18\":\"Help\",\"uX/4+/\":\"Here is your app password.\",\"vLyv1R\":\"Hide\",\"qdOx2q\":\"Hide user list\",\"up7j9X\":\"Hmm, some kind of issue occured when contacting the feed server. Please let the feed owner know about this issue.\",\"FynkM2\":\"Hmm, some kind of issue occurred when contacting the feed server. Please let the feed owner know about this issue.\",\"WTcLyw\":\"Hmm, the feed server appears to be misconfigured. Please let the feed owner know about this issue.\",\"/8MHCt\":\"Hmm, the feed server appears to be offline. Please let the feed owner know about this issue.\",\"3zJH1g\":\"Hmm, the feed server gave a bad response. Please let the feed owner know about this issue.\",\"wkCNhr\":\"Hmm, we're having trouble finding this feed. It may have been deleted.\",\"yNNyhI\":\"Hmmm, we're having trouble finding this feed. It may have been deleted.\",\"i0qMbr\":\"Home\",\"sXZ8IU\":\"Home Feed Preferences\",\"yt7fhu\":\"Hosting provider\",\"s2xA6t\":\"Hosting provider address\",\"o+axy6\":\"I have a code\",\"wey2os\":\"I have my own domain\",\"WlEcKr\":\"If none are selected, suitable for all ages.\",\"VCk0rR\":\"Image alt text\",\"STGpNQ\":\"Image options\",\"6o7+En\":\"In Your Network\",\"dSKHAa\":\"Invalid username or password\",\"MFKlMB\":\"Invite\",\"F5MZVk\":\"Invite a Friend\",\"6KlkHI\":\"Invite code\",\"MYTV5o\":\"Invite code not accepted. Check that you input it correctly and try again.\",\"UY2916\":[\"Invite codes: \",[\"invitesAvailable\"],\" available\"],\"F75w8j\":\"Join the waitlist\",\"6iVTdm\":\"Join the waitlist.\",\"SNzppu\":\"Join Waitlist\",\"Dcq5kL\":\"Language selection\",\"pVhZHk\":\"Language Settings\",\"GAmD3h\":\"Languages\",\"NgeSlx\":\"Learn More\",\"rj0Lke\":\"Learn more about this warning\",\"lvYkpV\":\"Learn more about what is public on Bluesky.\",\"kq2ga7\":\"Leave them all unchecked to see any language.\",\"QfDITI\":\"Leaving Bluesky\",\"Esfg1M\":\"Let's get your password reset!\",\"exYcTF\":\"Library\",\"1njn7W\":\"Light\",\"BvSY1i\":\"Like this feed\",\"8/ALSr\":\"Liked by\",\"zZOZj7\":\"Likes\",\"KGL/DU\":\"Limit the visibility of my account\",\"AUSVsF\":\"Limit the visibility of my account to logged-out users\",\"FuZWua\":\"List Avatar\",\"8mjA4F\":\"List Name\",\"h16FyT\":\"Lists\",\"ujW4FW\":\"Load more posts\",\"7EHsGr\":\"Load new notifications\",\"VkLESX\":\"Load new posts\",\"Z3FXyt\":\"Loading...\",\"jl0AFf\":\"Local dev server\",\"5Aq6mk\":\"Logged-out users\",\"w2yNjr\":\"Logged-out visibility\",\"cR9UpQ\":\"Login to account that is not listed\",\"kkGiug\":\"Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!\",\"2U/gDT\":\"Make sure this is where you intend to go!\",\"xYilR2\":\"Media\",\"S9V0C/\":\"mentioned users\",\"31/84x\":\"Mentioned users\",\"zucql+\":\"Menu\",\"kTQnAw\":\"Message from server\",\"DzmsLV\":\"Moderation\",\"NTIbv4\":\"Moderation lists\",\"3j2OjF\":\"Moderation Lists\",\"FIJUJb\":\"More feeds\",\"3Siwmw\":\"More options\",\"Y17r45\":\"More post options\",\"RA1KUZ\":\"Mute Account\",\"du0opt\":\"Mute accounts\",\"25PHAB\":\"Mute list\",\"izOxJM\":\"Mute these accounts?\",\"jq7SjD\":\"Mute thread\",\"s22grX\":\"Muted accounts\",\"qUa+lV\":\"Muted Accounts\",\"gA0D9A\":\"Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private.\",\"1QJzM7\":\"Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them.\",\"qhwV2C\":\"My Account\",\"Mysqyf\":\"My Birthday\",\"6MBNS/\":\"My Feeds\",\"hKtWk2\":\"My Profile\",\"Ha6iBv\":\"My Saved Feeds\",\"6YtxFj\":\"Name\",\"8yolS6\":\"Never lose access to your followers and data.\",\"isRobC\":\"New\",\"2B7HLH\":\"New post\",\"FGrimz\":\"New Post\",\"hXzOVo\":\"Next\",\"EatZYJ\":\"Next image\",\"1UzENP\":\"No\",\"flmDTf\":\"No description\",\"zfN9gJ\":\"No result\",\"fOlAiK\":[\"No results found for \\\"\",[\"query\"],\"\\\"\"],\"kA9DpB\":[\"No results found for \",[\"0\"]],\"SVF205\":[\"No results found for \",[\"query\"]],\"xpF9po\":\"Nobody\",\"ispbnl\":\"Not Applicable\",\"iyUCYw\":\"Not Applicable.\",\"ACqM3c\":\"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.\",\"+lYa0i\":\"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.\",\"OdiASL\":\"Note: Third-party apps that display Bluesky content may not respect this setting.\",\"iDNBZe\":\"Notifications\",\"5GGAqz\":\"Oh no!\",\"UaXeX3\":\"Okay\",\"Cqo2D+\":\"One or more images is missing alt text.\",\"Kq2/SU\":[\"Only \",[\"0\"],\" can reply.\"],\"M/Q2aG\":\"Open navigation\",\"M5PuNq\":\"Opens configurable language settings\",\"S67TOE\":\"Opens list of invite codes\",\"eSqpax\":\"Opens modal for using custom domain\",\"vYwHHI\":\"Opens moderation settings\",\"0tHyB7\":\"Opens screen with all saved feeds\",\"nmRoY/\":\"Opens the app password settings page\",\"6e9Apv\":\"Opens the home feed preferences\",\"O87Dr/\":\"Opens the storybook page\",\"G+PVmg\":\"Opens the system log page\",\"Jqb7sy\":\"Opens the threads preferences\",\"b22AVl\":\"Other account\",\"n+HLOP\":\"Other service\",\"1PKxQ7\":\"Other...\",\"8F1i42\":\"Page not found\",\"8ZsakT\":\"Password\",\"ogtYkT\":\"Password updated\",\"DKeVgZ\":\"Password updated!\",\"VeZE5Q\":\"Pictures meant for adults.\",\"zgoxy5\":\"Pinned Feeds\",\"Aw5fOC\":\"Please choose your handle.\",\"5vI4sE\":\"Please choose your password.\",\"Apyknf\":\"Please confirm your email before changing it. This is a temporary requirement while email-updating tools are added, and it will soon be removed.\",\"9qpQ5O\":\"Please enter a unique name for this App Password or use our randomly generated one.\",\"hV+cYN\":\"Please enter your email.\",\"QJr5Xp\":\"Please enter your password as well:\",\"d7tryi\":\"Please tell us why you think this decision was incorrect.\",\"y28hnO\":\"Post\",\"h5RcXU\":\"Post hidden\",\"r5zLS0\":\"Post language\",\"AzCucI\":\"Post Languages\",\"tJFPmV\":\"Post not found\",\"+owNNn\":\"Posts\",\"0+DQbr\":\"Potentially Misleading Link\",\"MHk+7g\":\"Previous image\",\"HeBcM5\":\"Primary Language\",\"x8iR7V\":\"Prioritize Your Follows\",\"rjGI/Q\":\"Privacy\",\"LcET2C\":\"Privacy Policy\",\"k1ifdL\":\"Processing...\",\"vERlcd\":\"Profile\",\"MrgqOW\":\"Protect your account by verifying your email.\",\"9nSV9I\":\"Public, shareable lists of users to mute or block in bulk.\",\"p1UmBX\":\"Public, shareable lists which can drive feeds.\",\"8HFFRQ\":\"Quote post\",\"+KrAHa\":\"Quote Post\",\"WlWsdE\":\"Ratios\",\"WEYdDv\":\"Recommended\",\"QNzcT3\":\"Recommended Feeds\",\"41UoJb\":\"Recommended Users\",\"t/YqKh\":\"Remove\",\"p/cRzf\":[\"Remove \",[\"0\"],\" from my feeds?\"],\"1O32oy\":\"Remove account\",\"W44VX5\":\"Remove feed\",\"Yy3FzB\":\"Remove from my feeds\",\"5ywtDz\":\"Remove image\",\"Dw/XUh\":\"Remove image preview\",\"3fdNAy\":\"Remove this feed from my feeds?\",\"TbDEfs\":\"Remove this feed from your saved feeds?\",\"Obm5+c\":\"Removed from list\",\"N8UzTV\":\"Replies\",\"oQPadq\":\"Replies to this thread are disabled\",\"Veu9gK\":\"Reply Filters\",\"lQWbAr\":[\"Report \",[\"collectionName\"]],\"bDHSjj\":\"Report Account\",\"NKmI9f\":\"Report feed\",\"6iwm2r\":\"Report List\",\"6IcSvC\":\"Report post\",\"mkude1\":\"Repost\",\"JOV5dR\":\"Repost or quote post\",\"0zb9FX\":\"Reposted by\",\"bqG37Z\":\"Request Change\",\"pJoi/P\":\"Request to limit the visibility of my account\",\"2d9VrZ\":\"Require alt text before posting\",\"8XIT+P\":\"Required for this provider\",\"vJgYMA\":\"Reset code\",\"xEL92I\":\"Reset onboarding state\",\"RfwZxd\":\"Reset password\",\"bee/Fw\":\"Reset preferences state\",\"wToeoz\":\"Resets the onboarding state\",\"nIU7qI\":\"Resets the preferences state\",\"6gRgw8\":\"Retry\",\"hAbYQa\":\"Retry change handle\",\"tfDRzk\":\"Save\",\"KV2YQQ\":\"Save alt text\",\"y3aU20\":\"Save changes\",\"IUwGEM\":\"Save Changes\",\"Xs07Tg\":\"Save handle change\",\"BckA7m\":\"Save image crop\",\"+K+JDj\":\"Saved Feeds\",\"A1taO8\":\"Search\",\"BF8cu3\":\"Search for posts and users.\",\"CKROFy\":\"Security Step Required\",\"cNzyJW\":\"See what's next\",\"L5sM7N\":\"Select Bluesky Social\",\"o3dwub\":\"Select from an existing account\",\"GGw2AK\":\"Select service\",\"vECNLO\":\"Select which languages you want your subscribed feeds to include. If none are selected, all languages will be shown.\",\"m5aabx\":\"Select your app language for the default text to display in the app\",\"TiiOza\":\"Select your preferred language for translations in your feed.\",\"vp9yIB\":\"Send Confirmation Email\",\"65dxv8\":\"Send email\",\"i/TzEU\":\"Send Email\",\"RoafuO\":\"Send feedback\",\"4cijjm\":\"Send Report\",\"V/e7nf\":\"Set new password\",\"gwsie4\":\"Set this setting to \\\"No\\\" to hide all quote posts from your feed. Reposts will still be visible.\",\"IZjC3J\":\"Set this setting to \\\"No\\\" to hide all replies from your feed.\",\"KIgU3l\":\"Set this setting to \\\"No\\\" to hide all reposts from your feed.\",\"zaAyrz\":\"Set this setting to \\\"Yes\\\" to show replies in a threaded view. This is an experimental feature.\",\"fQV2eE\":\"Set this setting to \\\"Yes\\\" to show samples of your saved feeds in your following feed. This is an experimental feature.\",\"Tz0i8g\":\"Settings\",\"HfWHhJ\":\"Sexual activity or erotic nudity.\",\"Z8lGw6\":\"Share\",\"P33tEA\":\"Share feed\",\"uIZ2tg\":\"Share link\",\"8vETh9\":\"Show\",\"aWAdCb\":\"Show anyway\",\"NijgXr\":\"Show Posts from My Feeds\",\"T3Mt8m\":\"Show Quote Posts\",\"BlW8X/\":\"Show Replies\",\"X4GwDb\":\"Show replies by people you follow before all other replies.\",\"GiogzH\":\"Show Reposts\",\"fhY/fL\":\"Show users\",\"5lWFkC\":\"Sign in\",\"n1ekoW\":\"Sign In\",\"N9o7n5\":[\"Sign in as \",[\"0\"]],\"FT1MVS\":\"Sign in as...\",\"+UpfFC\":\"Sign into\",\"fcWrnU\":\"Sign out\",\"e+RpCP\":\"Sign up\",\"MiE4Vp\":\"Sign up or sign in to join the conversation\",\"zU+Ro7\":\"Signed in as\",\"6Uau97\":\"Skip\",\"0o5BFH\":\"Sort Replies\",\"GH1Rgk\":\"Sort replies to the same post by:\",\"1DA6ap\":\"Square\",\"aKEHLj\":\"Staging\",\"tgEXwM\":\"Status page\",\"P5jja7\":\"Storybook\",\"hQRttt\":\"Submit\",\"EDl9kS\":\"Subscribe\",\"5z3ICN\":\"Subscribe to this list\",\"TVFyMD\":\"Suggested Follows\",\"XYLcNv\":\"Support\",\"VjWeLI\":\"Switch Account\",\"D+NlUC\":\"System\",\"fP8jTZ\":\"System log\",\"HF6Iah\":\"Tall\",\"4Y5H+g\":\"Terms\",\"xowcRf\":\"Terms of Service\",\"p8Iz39\":\"Text input field\",\"GlPXQJ\":\"The account will be able to interact with you after unblocking.\",\"o4M2MP\":\"The Community Guidelines have been moved to <0/>\",\"U42lKc\":\"The Copyright Policy has been moved to <0/>\",\"G4EksE\":\"The post may have been deleted.\",\"WNR9db\":\"The Privacy Policy has been moved to <0/>\",\"LbEbIk\":[\"The support form has been moved. If you need help, please<0/> or visit \",[\"HELP_DESK_URL\"],\" to get in touch with us.\"],\"FGbRSr\":\"The Terms of Service have been moved to\",\"yUqcy2\":\"There was an unexpected issue in the application. Please let us know if this happened to you!\",\"jSe8k/\":[\"This \",[\"0\"],\" has been labeled.\"],\"KRYn8w\":[\"This \",[\"screenDescription\"],\" has been flagged:\"],\"aBX1qv\":\"This content is not viewable without a Bluesky account.\",\"xI4xW5\":\"This feed is currently receiving high traffic and is temporarily unavailable. Please try again later.\",\"lm845B\":\"This information is not shared with other users.\",\"5Pvw/O\":\"This is important in case you ever need to change your email or reset your password.\",\"sQQfZ9\":\"This is the service that keeps you online.\",\"CvX8qs\":\"This link is taking you to the following website:\",\"WKrUVy\":\"This post has been deleted.\",\"qpCA5s\":\"This warning is only available for posts with media attached.\",\"u9ThjD\":\"Thread Preferences\",\"zmXsk5\":\"Threaded Mode\",\"1x30Qt\":\"Toggle dropdown\",\"KFXQEt\":\"Transformations\",\"pi8x/S\":\"Translate\",\"KDw4GX\":\"Try again\",\"RF3/jE\":\"Un-block list\",\"+/SGK9\":\"Un-mute list\",\"nc4Wfd\":\"Unable to contact your service. Please check your Internet connection.\",\"tuS5Jz\":\"Unblock\",\"0VrZZv\":\"Unblock Account\",\"6pYY4t\":\"Undo repost\",\"05f3UA\":\"Unfortunately, you do not meet the requirements to create an account.\",\"wx9wqY\":\"Unmute Account\",\"s12/Py\":\"Unmute thread\",\"EvGmWj\":\"Unpin moderation list\",\"vaz2uI\":[\"Update \",[\"displayName\"],\" in Lists\"],\"YXMY4w\":\"Update Available\",\"RXbEvi\":\"Updating...\",\"Vwkfp4\":\"Upload a text file to:\",\"jTdnU6\":\"Use app passwords to login to other Bluesky clients without giving full access to your account or password.\",\"CH1am9\":\"Use default provider\",\"ZG8UvP\":\"Use this to sign into the other app along with your handle.\",\"cKXwwI\":\"Used by:\",\"t4Yp4Z\":\"User handle\",\"8tsrUV\":\"User Lists\",\"nZx9mr\":\"Username or email address\",\"Sxm8rQ\":\"Users\",\"Hbhyg2\":\"users followed by <0/>\",\"1Z9Mdf\":\"Users followed by <0/>\",\"9k1aoj\":[\"Users in \\\"\",[\"0\"],\"\\\"\"],\"MBOY4U\":\"Verify email\",\"Ejyv0o\":\"Verify my email\",\"9czCrB\":\"Verify My Email\",\"ibSVGR\":\"Verify New Email\",\"nHsQde\":\"View debug entry\",\"47jzzd\":\"View the avatar\",\"wK4H1r\":\"Visit Site\",\"qjBGxf\":\"We're so excited to have you join us!\",\"1xpRAp\":\"We're sorry, but this content is not viewable without a Bluesky account.\",\"2iYPLH\":\"We're sorry, but this feed is currently receiving high traffic and is temporarily unavailable. Please try again later.\",\"WBQOQ0\":\"We're sorry, but your search could not be completed. Please try again in a few minutes.\",\"/mVVX2\":\"We're sorry! We can't find the page you were looking for.\",\"meB+tZ\":\"Welcome to <0>Bluesky\",\"Mj7rl/\":[\"What is the issue with this \",[\"collectionName\"],\"?\"],\"3qn29J\":\"Which languages are used in this post?\",\"uawiGa\":\"Which languages would you like to see in your algorithmic feeds?\",\"yvDWMs\":\"Who can reply\",\"GKc8LT\":\"Who can reply?\",\"I5S9ZE\":\"Wide\",\"y02THm\":\"Write post\",\"6ckZRB\":\"Write your reply\",\"l75CjT\":\"Yes\",\"STPj0e\":\"You can change hosting providers at any time.\",\"67nRLM\":\"You can now sign in with your new password.\",\"lIcbCU\":\"You don't have any invite codes yet! We'll send you some when you've been on Bluesky for a little longer.\",\"aFZZYi\":\"You don't have any pinned feeds.\",\"kX/cKs\":\"You don't have any saved feeds!\",\"nbz3Iq\":\"You don't have any saved feeds.\",\"RkXibf\":\"You have blocked the author or you have been blocked by the author.\",\"CbrOgr\":\"You have no feeds.\",\"tCLJ9E\":\"You have no lists.\",\"soH9qC\":\"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.\",\"NDgp3i\":\"You have not created any app passwords yet. You can create one by pressing the button below.\",\"grqdXb\":\"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.\",\"RrDyEb\":\"You will receive an email with a \\\"reset code.\\\" Enter that code here, then enter your new password.\",\"gdRnT7\":\"Your account\",\"k7hmsH\":\"Your birth date\",\"tBpzKB\":\"Your email appears to be invalid.\",\"OubkcP\":\"Your email has been saved! We'll be in touch soon.\",\"z2L+/9\":\"Your email has been updated but not verified. As a next step, please verify your new email.\",\"XZlIVw\":\"Your email has not yet been verified. This is an important security step which we recommend.\",\"qv9f4I\":\"Your full handle will be\",\"lvcqqG\":\"Your hosting provider\",\"fbFyAZ\":\"Your invite codes are hidden when logged in using an App Password\",\"Oqt/PG\":\"Your posts, likes, and blocks are public. Mutes are private.\",\"okRPtW\":\"Your profile\",\"rsWkoR\":\"Your profile and account will not be visible to anyone visiting the Bluesky app without an account, or to account holders who are not logged in. Enabling this will not make your profile private.\",\"jjscPy\":\"Your profile and content will not be visible to anyone visiting the Bluesky app without an account. Enabling this will not make your profile private.\",\"ogY7EU\":\"Your profile and posts will not be visible to people visiting the Bluesky app or website without having an account and being logged in.\",\"MvWO9d\":\"Your user handle\"}")}; \ No newline at end of file diff --git a/src/locale/locales/hi/messages.js b/src/locale/locales/hi/messages.js new file mode 100644 index 0000000000..fd35fb8a78 --- /dev/null +++ b/src/locale/locales/hi/messages.js @@ -0,0 +1 @@ +/*eslint-disable*/module.exports={messages:JSON.parse("{\"PBodTo\":\"- फ़ीड का अंत -\",\"EtUMsZ\":\"यह चेतावनी केवल मीडिया वाले पोस्ट के लिए उपलब्ध है।\",\"ebOBhv\":[[\"0\",\"plural\",{\"one\":[\"#\",\" invite code available\"],\"other\":[\"#\",\" invite codes available\"]}]],\"J/hVSQ\":[[\"0\"]],\"hZQerY\":[[\"0\"],\" \",[\"purposeLabel\"],\" सूची\"],\"zgN03j\":[[\"invitesAvailable\",\"plural\",{\"one\":[\"Invite codes: \",\"#\",\" available\"],\"other\":[\"Invite codes: \",\"#\",\" available\"]}]],\"OyEWua\":[[\"invitesAvailable\"],\" invite code available\"],\"eFIdHP\":[[\"invitesAvailable\"],\" invite codes available\"],\"wapGcj\":[[\"message\"]],\"umrH9L\":\"<0/> members\",\"gMjqbV\":\"<0>अपना<1>पसंदीदा<2>फ़ीड चुनें\",\"F657la\":\"<0>कुछ<1>पसंदीदा उपयोगकर्ताओं<2>का अनुसरण करें\",\"6RmyWt\":\"<0>इधर आपका ऐप पासवर्ड है। इसे अपने हैंडल के साथ दूसरे ऐप में साइन करने के लिए उपयोग करें।।\",\"GH9ldj\":\"<0>Note: This setting may not be respected by third-party apps that display Bluesky content.\",\"Ga0T2l\":\"<0>Note: Your profile and posts will remain publicly available. Third-party apps that display Bluesky content may not respect this setting.\",\"XCTqGE\":\"ऐप का एक नया संस्करण उपलब्ध है. कृपया ऐप का उपयोग जारी रखने के लिए अपडेट करें।\",\"AnNF5e\":\"प्रवेर्शयोग्यता\",\"AeXO77\":\"अकाउंट\",\"4WY4MD\":\"अकाउंट के विकल्प\",\"m16xKo\":\"ऐड करो\",\"fBBX+K\":\"सामग्री चेतावनी जोड़ें\",\"JU3hs2\":\"इस सूची में किसी को जोड़ें\",\"MPPZ54\":\"अकाउंट जोड़ें\",\"LkA8jz\":\"इस फ़ोटो में विवरण जोड़ें\",\"Z8idyM\":\"विवरण जोड़ें\",\"AoXl11\":\"रिपोर्ट करने के लिए विवरण जोड़ें\",\"iE6B/9\":\"लिंक कार्ड जोड़ें\",\"EXHdP1\":\"लिंक कार्ड जोड़ें:\",\"x6laaL\":\"अपने डोमेन में निम्नलिखित DNS रिकॉर्ड जोड़ें:\",\"UmzMP4\":\"सूचियों में जोड़ें\",\"hCrQ0L\":\"इस फ़ीड को सहेजें\",\"GluCXm\":\"Added to list\",\"jRrQFe\":\"पसंद की संख्या को समायोजित करें उत्तर को आपके फ़ीड में दिखाया जाना चाहिए।।\",\"qLa52r\":\"वयस्क सामग्री\",\"sxkWRg\":\"विकसित\",\"u2HO/d\":\"ALT\",\"u/DP73\":\"वैकल्पिक पाठ\",\"0QlT7/\":\"ऑल्ट टेक्स्ट अंधा और कम दृश्य लोगों के लिए छवियों का वर्णन करता है, और हर किसी को संदर्भ देने में मदद करता है।।\",\"woXbjq\":[[\"0\"],\" को ईमेल भेजा गया है। इसमें एक OTP कोड शामिल है जिसे आप नीचे दर्ज कर सकते हैं।।\"],\"Fon2dK\":[[\"0\"],\" को ईमेल भेजा गया है। इसमें एक OTP कोड शामिल है जिसे आप नीचे दर्ज कर सकते हैं।।\"],\"HZFm5R\":\"और\",\"fdjKGe\":\"ऐप भाषा\",\"SMmUnj\":\"ऐप पासवर्ड\",\"8q4WlH\":\"ऐप पासवर्ड\",\"e6un1h\":\"Appeal Decision\",\"c0PCYD\":\"Appeal this decision\",\"oifO1p\":\"Appeal this decision.\",\"aAIQg2\":\"दिखावट\",\"9K5XIM\":\"Apps that respect this setting, including the official Bluesky app and bsky.app website, won't show your content to logged out users.\",\"SSDZ+T\":[\"क्या आप वाकई ऐप पासवर्ड \\\"\",[\"name\"],\"\\\" हटाना चाहते हैं?\"],\"0BIeIs\":\"क्या आप वाकई इस ड्राफ्ट को हटाना करना चाहेंगे?\",\"6foA8n\":\"क्या आप वास्तव में इसे करना चाहते हैं?\",\"/mSd6b\":\"क्या आप वास्तव में इसे करना चाहते हैं? इसे असंपादित नहीं किया जा सकता है।\",\"EbvWd3\":\"कलात्मक या गैर-कामुक नग्नता।।\",\"uVotT3\":\"Ask apps to limit the visibility of my account\",\"iH8pgl\":\"वापस\",\"ehOkF+\":\"मूल बातें\",\"+gCI2a\":\"जन्मदिन\",\"pieVBA\":\"जन्मदिन:\",\"m1dqxu\":\"खाता ब्लॉक करें\",\"ffIfdM\":\"खाता ब्लॉक करें\",\"hIysMc\":\"Block list\",\"fdYcMy\":\"खाता ब्लॉक करें?\",\"KWykPE\":\"ब्लॉक किए गए खाते\",\"JuqQpF\":\"ब्लॉक किए गए खाते\",\"HG4qt4\":\"अवरुद्ध खाते आपके थ्रेड्स में उत्तर नहीं दे सकते, आपका उल्लेख नहीं कर सकते, या अन्यथा आपके साथ बातचीत नहीं कर सकते।\",\"8LNSUt\":\"अवरुद्ध खाते आपके थ्रेड्स में उत्तर नहीं दे सकते, आपका उल्लेख नहीं कर सकते, या अन्यथा आपके साथ बातचीत नहीं कर सकते। आप उनकी सामग्री नहीं देख पाएंगे और उन्हें आपकी सामग्री देखने से रोका जाएगा।\",\"HFCE4A\":\"ब्लॉक पोस्ट।\",\"zl+QbX\":\"अवरोधन सार्वजनिक है. अवरुद्ध खाते आपके थ्रेड्स में उत्तर नहीं दे सकते, आपका उल्लेख नहीं कर सकते, या अन्यथा आपके साथ बातचीत नहीं कर सकते।\",\"7A9u1j\":\"Bluesky\",\"ZHmKSm\":\"Bluesky लचीला है।।\",\"odLrdl\":\"Bluesky खुला है।।\",\"/LsWK4\":\"Bluesky सार्वजनिक है।।\",\"C50OGr\":\"ब्लूस्की एक स्वस्थ समुदाय बनाने के लिए आमंत्रित करता है। यदि आप किसी को आमंत्रित नहीं करते हैं, तो आप प्रतीक्षा सूची के लिए साइन अप कर सकते हैं और हम जल्द ही एक भेज देंगे।।\",\"u9cCQU\":\"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.\",\"klVoaP\":\"Bluesky.Social\",\"qxBitM\":[\"Build version \",[\"0\"],\" \",[\"1\"]],\"rT2cV+\":\"कैमरा\",\"JGGrPC\":\"केवल अक्षर, संख्या, रिक्त स्थान, डैश और अंडरस्कोर हो सकते हैं। कम से कम 4 अक्षर लंबा होना चाहिए, लेकिन 32 अक्षरों से अधिक लंबा नहीं होना चाहिए।।\",\"dEgA5A\":\"कैंसिल\",\"aMH9rr\":\"अकाउंट बंद मत करो\",\"kc3E4R\":\"ऑल्ट टेक्स्ट मत जोड़ें\",\"wg4LHQ\":\"नाम मत बदलो\",\"hFL1Li\":\"तस्वीर को क्रॉप मत करो\",\"tijH8t\":\"प्रोफ़ाइल संपादन मत करो\",\"Qe4C/d\":\"कोटे पोस्ट मत करो\",\"5TviPn\":\"खोज मत करो\",\"nss3UV\":\"प्रतीक्षा सूची पंजीकरण मत करो\",\"o+XJ9D\":\"परिवर्तन\",\"pQco5R\":\"हैंडल बदलें\",\"Q5e1U/\":\"हैंडल बदलें\",\"a3NAfL\":\"मेरा ईमेल बदलें\",\"4vatyk\":\"मेरा ईमेल बदलें\",\"Yn3C90\":\"कुछ अनुशंसित फ़ीड देखें. उन्हें अपनी पिन की गई फ़ीड की सूची में जोड़ने के लिए + टैप करें।\",\"ioZXIH\":\"कुछ अनुशंसित उपयोगकर्ताओं की जाँच करें। ऐसे ही उपयोगकर्ता देखने के लिए उनका अनुसरण करें।\",\"/+X+/K\":\"नीचे प्रवेश करने के लिए OTP कोड के साथ एक ईमेल के लिए अपने इनबॉक्स की जाँच करें:\",\"Rt502e\":\"सेवा चुनें\",\"/L45sc\":\"उन एल्गोरिदम का चयन करें जो कस्टम फीड्स के साथ अपने अनुभव को शक्ति देते हैं।।\",\"Wk8hkn\":\"अपना पासवर्ड चुनें\",\"Us7A1O\":\"Clear all legacy storage data\",\"X3zEXo\":\"Clear all legacy storage data (restart after this)\",\"zxFM2c\":\"Clear all storage data\",\"r+lhUL\":\"Clear all storage data (restart after this)\",\"QbvBNV\":\"खोज क्वेरी साफ़ करें\",\"flH7u/\":\"चेतावनी को बंद करो\",\"hYmnbk\":\"बंद करो\",\"47L1V1\":\"छवि बंद करें\",\"l49ujN\":\"छवि बंद करें\",\"UryHFO\":\"नेविगेशन पाद बंद करें\",\"KHzDTk\":\"समुदाय दिशानिर्देश\",\"o8UUti\":\"जवाब लिखो\",\"7VpPHA\":\"हो गया\",\"q8upsf\":\"बदलाव की पुष्टि करें\",\"8pNKIr\":\"सामग्री भाषा सेटिंग्स की पुष्टि करें\",\"tGg8Kt\":\"खाते को हटा दें\",\"ioZOzk\":\"OTP कोड\",\"J28zul\":\"कनेक्टिंग ..।\",\"l879p1\":\"सामग्री फ़िल्टरिंग\",\"m8j6up\":\"सामग्री फ़िल्टरिंग\",\"/PlAsF\":\"सामग्री भाषा\",\"cogwXi\":\"सामग्री चेतावनी\",\"FG7AQv\":\"सामग्री चेतावनी\",\"xGVfLh\":\"आगे बढ़ें\",\"6V3Ea3\":\"कॉपी कर ली\",\"he3ygx\":\"कॉपी\",\"7LTXf4\":\"Copy link to list\",\"dWsPi5\":\"Copy link to post\",\"jw+abr\":\"Copy link to profile\",\"iQgJaz\":\"पोस्ट टेक्स्ट कॉपी करें\",\"u40k/o\":\"कॉपीराइट नीति\",\"7wWvgo\":\"फ़ीड लोड नहीं कर सकता\",\"8NNr/O\":\"सूची लोड नहीं कर सकता\",\"mpt9T+\":\"नया खाता बनाएं\",\"IS0nrP\":\"खाता बनाएँ\",\"6HbhpU\":\"नया खाता बनाएं\",\"MXSt4t\":[\"बनाया गया \",[\"0\"]],\"GAD3Dx\":\"कस्टम डोमेन\",\"ZQKLI1\":\"खतरा क्षेत्र\",\"pvnfJD\":\"डार्क मोड\",\"ZDGm40\":\"खाता हटाएं\",\"vzX5FB\":\"खाता हटाएं\",\"gUEtxf\":\"अप्प पासवर्ड हटाएं\",\"84uE/A\":\"सूची हटाएँ\",\"ktknoE\":\"मेरा खाता हटाएं\",\"szz0+N\":\"मेरा खाता हटाएं…\",\"04G5Az\":\"पोस्ट को हटाएं\",\"FbPNuJ\":\"इस पोस्ट को डीलीट करें?\",\"u+1OHY\":\"यह पोस्ट मिटाई जा चुकी है\",\"Nu4oKW\":\"विवरण\",\"dacKHE\":\"देव सर्वर\",\"2ygkE8\":\"डेवलपर उपकरण\",\"bzSI52\":\"Discard\",\"BryYJR\":\"ड्राफ्ट हटाएं\",\"9Y7FMD\":\"Discourage apps from showing my account to logged-out users\",\"pbLwal\":\"नए फ़ीड की खोज करें\",\"pfa8F0\":\"नाम\",\"0gS7M5\":\"प्रदर्शन का नाम\",\"iZ5pMB\":\"डोमेन सत्यापित!\",\"DPfwMq\":\"खत्म\",\"zT97vP\":[\"खत्म \",[\"extraText\"]],\"4uwlSD\":\"प्रत्येक कोड एक बार काम करता है। आपको समय-समय पर अधिक आमंत्रण कोड प्राप्त होंगे।\",\"XQFMOm\":\"छवि संपादित करें\",\"S7M0uU\":\"सूची विवरण संपादित करें\",\"cLmurE\":\"मेरी फ़ीड संपादित करें\",\"bRZ5XW\":\"मेरी प्रोफ़ाइल संपादित करें\",\"9OpVZg\":\"मेरी प्रोफ़ाइल संपादित करें\",\"QJQd1J\":\"मेरी प्रोफ़ाइल संपादित करें\",\"Jn7kox\":\"एडिट सेव्ड फीड\",\"O3oNi5\":\"ईमेल\",\"ATGYL1\":\"ईमेल\",\"pJJ0Vp\":\"ईमेल अपडेट किया गया\",\"9Qs99X\":\"ईमेल:\",\"96mted\":\"इस सेटिंग को केवल उन लोगों के बीच जवाब देखने में सक्षम करें जिन्हें आप फॉलो करते हैं।।\",\"9xK+YC\":\"End of feed\",\"YbIxza\":\"अपने प्रदाता का पता दर्ज करें:\",\"BfIgP6\":\"आप जिस डोमेन का उपयोग करना चाहते हैं उसे दर्ज करें\",\"cHrOqs\":\"वह ईमेल दर्ज करें जिसका उपयोग आपने अपना खाता बनाने के लिए किया था। हम आपको एक \\\"reset code\\\" भेजेंगे ताकि आप एक नया पासवर्ड सेट कर सकें।\",\"xRPn3U\":\"अपना ईमेल पता दर्ज करें\",\"+inPGm\":\"नीचे अपना नया ईमेल पता दर्ज करें।।\",\"T0KLp4\":\"अपने यूज़रनेम और पासवर्ड दर्ज करें\",\"4BITzH\":\"Error:\",\"wlzBtv\":\"Everybody\",\"0PkE20\":\"ऑल्ट टेक्स्ट\",\"/5K/KL\":\"अनुशंसित फ़ीड लोड करने में विफल\",\"4yCy8i\":\"फ़ीड ऑफ़लाइन है\",\"N0CqyO\":\"फ़ीड प्राथमिकता\",\"YirHq7\":\"प्रतिक्रिया\",\"2DoBvq\":\"सभी फ़ीड\",\"I3iUBQ\":\"सामग्री को व्यवस्थित करने के लिए उपयोगकर्ताओं द्वारा फ़ीड बनाए जाते हैं। कुछ फ़ीड चुनें जो आपको दिलचस्प लगें।\",\"2+6lmO\":\"फ़ीड कस्टम एल्गोरिदम हैं जिन्हें उपयोगकर्ता थोड़ी कोडिंग विशेषज्ञता के साथ बनाते हैं। <0/> अधिक जानकारी के लिए.\",\"Qzj1WT\":\"मिलते-जुलते खाते ढूँढना\",\"QKSrQV\":\"अपने मुख्य फ़ीड की स्क्रीन पर दिखाई देने वाली सामग्री को ठीक करें।।\",\"r+KeyR\":\"चर्चा धागे को ठीक-ट्यून करें।।\",\"MKEPCY\":\"फॉलो\",\"Wezu5M\":\"आरंभ करने के लिए कुछ उपयोगकर्ताओं का अनुसरण करें. आपको कौन दिलचस्प लगता है, इसके आधार पर हम आपको और अधिक उपयोगकर्ताओं की अनुशंसा कर सकते हैं।\",\"jdbMSV\":\"Followed users\",\"YY2BTA\":\"केवल वे यूजर को फ़ॉलो किया गया\",\"x5LEuB\":\"यह यूजर आपका फ़ोलो करता है\",\"NIjL2Y\":\"फोल्लोविंग\",\"y6sq5j\":\"फोल्लोविंग\",\"p3UO/y\":\"यह यूजर आपका फ़ोलो करता है\",\"5RhDkD\":\"सुरक्षा कारणों के लिए, हमें आपके ईमेल पते पर एक OTP कोड भेजने की आवश्यकता होगी।।\",\"NJPhAO\":\"सुरक्षा कारणों के लिए, आप इसे फिर से देखने में सक्षम नहीं होंगे। यदि आप इस पासवर्ड को खो देते हैं, तो आपको एक नया उत्पन्न करना होगा।।\",\"5bDfuq\":\"भूल\",\"hEPLrs\":\"पासवर्ड भूल गए\",\"dn8X5t\":\"पासवर्ड भूल गए\",\"U+kFad\":\"गैलरी\",\"c3b0B0\":\"प्रारंभ करें\",\"CKyk7Q\":\"वापस जाओ\",\"sr0UJD\":\"वापस जाओ\",\"Rtp0y7\":\"अगला\",\"Nf7oXL\":\"हैंडल\",\"c3XJ18\":\"सहायता\",\"uX/4+/\":\"यहां आपका ऐप पासवर्ड है.\",\"vLyv1R\":\"इसे छिपाएं\",\"qdOx2q\":\"उपयोगकर्ता सूची छुपाएँ\",\"up7j9X\":\"Hmm, some kind of issue occured when contacting the feed server. Please let the feed owner know about this issue.\",\"FynkM2\":\"Hmm, some kind of issue occurred when contacting the feed server. Please let the feed owner know about this issue.\",\"WTcLyw\":\"Hmm, the feed server appears to be misconfigured. Please let the feed owner know about this issue.\",\"/8MHCt\":\"Hmm, the feed server appears to be offline. Please let the feed owner know about this issue.\",\"3zJH1g\":\"Hmm, the feed server gave a bad response. Please let the feed owner know about this issue.\",\"wkCNhr\":\"Hmm, we're having trouble finding this feed. It may have been deleted.\",\"yNNyhI\":\"Hmmm, we're having trouble finding this feed. It may have been deleted.\",\"i0qMbr\":\"होम फीड\",\"sXZ8IU\":\"होम फ़ीड प्राथमिकताएं\",\"yt7fhu\":\"होस्टिंग प्रदाता\",\"s2xA6t\":\"होस्टिंग प्रदाता पता\",\"o+axy6\":\"मेरे पास एक OTP कोड है\",\"wey2os\":\"मेरे पास अपना डोमेन है\",\"WlEcKr\":\"यदि किसी को चुना जाता है, तो सभी उम्र के लिए उपयुक्त है।।\",\"VCk0rR\":\"छवि alt पाठ\",\"STGpNQ\":\"छवि विकल्प\",\"6o7+En\":\"आपके नेटवर्क में\",\"dSKHAa\":\"अवैध उपयोगकर्ता नाम या पासवर्ड\",\"MFKlMB\":\"आमंत्रण भेजो\",\"F5MZVk\":\"एक दोस्त को आमंत्रित करें\",\"6KlkHI\":\"आमंत्रण कोड\",\"MYTV5o\":\"Invite code not accepted. Check that you input it correctly and try again.\",\"UY2916\":[\"Invite codes: \",[\"invitesAvailable\"],\" available\"],\"F75w8j\":\"प्रतीक्षा सूची में शामिल हों\",\"6iVTdm\":\"प्रतीक्षा सूची में शामिल हों।।\",\"SNzppu\":\"वेटरलिस्ट में शामिल हों\",\"Dcq5kL\":\"अपनी भाषा चुने\",\"pVhZHk\":\"भाषा सेटिंग्स\",\"GAmD3h\":\"भाषा\",\"NgeSlx\":\"अधिक जानें\",\"rj0Lke\":\"इस चेतावनी के बारे में अधिक जानें\",\"lvYkpV\":\"Learn more about what is public on Bluesky.\",\"kq2ga7\":\"उन्हें किसी भी भाषा को देखने के लिए अनचेक छोड़ दें।।\",\"QfDITI\":\"लीविंग Bluesky\",\"Esfg1M\":\"चलो अपना पासवर्ड रीसेट करें!\",\"exYcTF\":\"चित्र पुस्तकालय\",\"1njn7W\":\"लाइट मोड\",\"BvSY1i\":\"इस फ़ीड को लाइक करो\",\"8/ALSr\":\"इन यूजर ने लाइक किया है\",\"zZOZj7\":\"Likes\",\"KGL/DU\":\"Limit the visibility of my account\",\"AUSVsF\":\"Limit the visibility of my account to logged-out users\",\"FuZWua\":\"सूची अवतार\",\"8mjA4F\":\"सूची का नाम\",\"h16FyT\":\"सूची\",\"ujW4FW\":\"अधिक पोस्ट लोड करें\",\"7EHsGr\":\"नई सूचनाएं लोड करें\",\"VkLESX\":\"नई पोस्ट लोड करें\",\"Z3FXyt\":\"Loading...\",\"jl0AFf\":\"स्थानीय देव सर्वर\",\"5Aq6mk\":\"Logged-out users\",\"w2yNjr\":\"Logged-out visibility\",\"cR9UpQ\":\"उस खाते में लॉग इन करें जो सूचीबद्ध नहीं है\",\"kkGiug\":\"Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!\",\"2U/gDT\":\"यह सुनिश्चित करने के लिए कि आप कहाँ जाना चाहते हैं!\",\"xYilR2\":\"Media\",\"S9V0C/\":\"mentioned users\",\"31/84x\":\"Mentioned users\",\"zucql+\":\"मेनू\",\"kTQnAw\":\"Message from server\",\"DzmsLV\":\"मॉडरेशन\",\"NTIbv4\":\"मॉडरेशन सूचियाँ\",\"3j2OjF\":\"Moderation Lists\",\"FIJUJb\":\"अधिक फ़ीड\",\"3Siwmw\":\"अधिक विकल्प\",\"Y17r45\":\"पोस्ट विकल्प\",\"RA1KUZ\":\"खाता म्यूट करें\",\"du0opt\":\"खातों को म्यूट करें\",\"25PHAB\":\"Mute list\",\"izOxJM\":\"इन खातों को म्यूट करें?\",\"jq7SjD\":\"थ्रेड म्यूट करें\",\"s22grX\":\"म्यूट किए गए खाते\",\"qUa+lV\":\"म्यूट किए गए खाते\",\"gA0D9A\":\"म्यूट किए गए खातों की पोस्ट आपके फ़ीड और आपकी सूचनाओं से हटा दी जाती हैं। म्यूट पूरी तरह से निजी हैं.\",\"1QJzM7\":\"म्यूट करना निजी है. म्यूट किए गए खाते आपके साथ इंटरैक्ट कर सकते हैं, लेकिन आप उनकी पोस्ट नहीं देखेंगे या उनसे सूचनाएं प्राप्त नहीं करेंगे।\",\"qhwV2C\":\"My Account\",\"Mysqyf\":\"जन्मदिन\",\"6MBNS/\":\"मेरी फ़ीड\",\"hKtWk2\":\"मेरी प्रोफाइल\",\"Ha6iBv\":\"मेरी फ़ीड\",\"6YtxFj\":\"नाम\",\"8yolS6\":\"अपने फ़ॉलोअर्स और डेटा तक पहुंच कभी न खोएं।\",\"isRobC\":\"नया\",\"2B7HLH\":\"नई पोस्ट\",\"FGrimz\":\"नई पोस्ट\",\"hXzOVo\":\"अगला\",\"EatZYJ\":\"अगली फोटो\",\"1UzENP\":\"नहीं\",\"flmDTf\":\"कोई विवरण नहीं\",\"zfN9gJ\":\"No result\",\"fOlAiK\":[\"\\\"\",[\"query\"],\"\\\" के लिए कोई परिणाम नहीं मिला\"],\"kA9DpB\":[[\"0\"],\" के लिए कोई परिणाम नहीं मिला\"],\"SVF205\":[\"No results found for \",[\"query\"]],\"xpF9po\":\"Nobody\",\"ispbnl\":\"लागू नहीं\",\"iyUCYw\":\"लागू नहीं।\",\"ACqM3c\":\"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.\",\"+lYa0i\":\"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.\",\"OdiASL\":\"Note: Third-party apps that display Bluesky content may not respect this setting.\",\"iDNBZe\":\"सूचनाएं\",\"5GGAqz\":\"अरे नहीं!\",\"UaXeX3\":\"ठीक है\",\"Cqo2D+\":\"एक या अधिक छवियाँ alt पाठ याद आती हैं।।\",\"Kq2/SU\":[\"Only \",[\"0\"],\" can reply.\"],\"M/Q2aG\":\"ओपन नेविगेशन\",\"M5PuNq\":\"भाषा सेटिंग्स खोलें\",\"S67TOE\":\"Opens list of invite codes\",\"eSqpax\":\"कस्टम डोमेन का उपयोग करने के लिए मोडल खोलें\",\"vYwHHI\":\"मॉडरेशन सेटिंग्स खोलें\",\"0tHyB7\":\"सभी बचाया फ़ीड के साथ स्क्रीन खोलें\",\"nmRoY/\":\"ऐप पासवर्ड सेटिंग पेज खोलें\",\"6e9Apv\":\"होम फीड वरीयताओं को खोलता है\",\"O87Dr/\":\"स्टोरीबुक पेज खोलें\",\"G+PVmg\":\"सिस्टम लॉग पेज खोलें\",\"Jqb7sy\":\"धागे वरीयताओं को खोलता है\",\"b22AVl\":\"अन्य खाता\",\"n+HLOP\":\"अन्य सेवा\",\"1PKxQ7\":\"अन्य..।\",\"8F1i42\":\"पृष्ठ नहीं मिला\",\"8ZsakT\":\"पासवर्ड\",\"ogtYkT\":\"Password updated\",\"DKeVgZ\":\"पासवर्ड अद्यतन!\",\"VeZE5Q\":\"चित्र वयस्कों के लिए थे।।\",\"zgoxy5\":\"पिन किया गया फ़ीड\",\"Aw5fOC\":\"Please choose your handle.\",\"5vI4sE\":\"Please choose your password.\",\"Apyknf\":\"इसे बदलने से पहले कृपया अपने ईमेल की पुष्टि करें। यह एक अस्थायी आवश्यकता है जबकि ईमेल-अपडेटिंग टूल जोड़ा जाता है, और इसे जल्द ही हटा दिया जाएगा।।\",\"9qpQ5O\":\"कृपया इस ऐप पासवर्ड के लिए एक अद्वितीय नाम दर्ज करें या हमारे यादृच्छिक रूप से उत्पन्न एक का उपयोग करें।।\",\"hV+cYN\":\"Please enter your email.\",\"QJr5Xp\":\"कृपया अपना पासवर्ड भी दर्ज करें:\",\"d7tryi\":\"Please tell us why you think this decision was incorrect.\",\"y28hnO\":\"पोस्ट\",\"h5RcXU\":\"छुपा पोस्ट\",\"r5zLS0\":\"पोस्ट भाषा\",\"AzCucI\":\"पोस्ट भाषा\",\"tJFPmV\":\"पोस्ट नहीं मिला\",\"+owNNn\":\"Posts\",\"0+DQbr\":\"शायद एक भ्रामक लिंक\",\"MHk+7g\":\"पिछली छवि\",\"HeBcM5\":\"प्राथमिक भाषा\",\"x8iR7V\":\"अपने फ़ॉलोअर्स को प्राथमिकता दें\",\"rjGI/Q\":\"गोपनीयता\",\"LcET2C\":\"गोपनीयता नीति\",\"k1ifdL\":\"प्रसंस्करण...\",\"vERlcd\":\"प्रोफ़ाइल\",\"MrgqOW\":\"अपने ईमेल को सत्यापित करके अपने खाते को सुरक्षित रखें।।\",\"9nSV9I\":\"Public, shareable lists of users to mute or block in bulk.\",\"p1UmBX\":\"सार्वजनिक, साझा करने योग्य सूचियाँ जो फ़ीड चला सकती हैं।\",\"8HFFRQ\":\"कोटे पोस्ट\",\"+KrAHa\":\"कोटे पोस्ट\",\"WlWsdE\":\"अनुपात\",\"WEYdDv\":\"अनुशंसित\",\"QNzcT3\":\"अनुशंसित फ़ीड\",\"41UoJb\":\"अनुशंसित लोग\",\"t/YqKh\":\"निकालें\",\"p/cRzf\":[\"मेरे फ़ीड से \",[\"0\"],\" हटाएं?\"],\"1O32oy\":\"खाता हटाएं\",\"W44VX5\":\"फ़ीड हटाएँ\",\"Yy3FzB\":\"मेरे फ़ीड से हटाएँ\",\"5ywtDz\":\"छवि निकालें\",\"Dw/XUh\":\"छवि पूर्वावलोकन निकालें\",\"3fdNAy\":\"Remove this feed from my feeds?\",\"TbDEfs\":\"इस फ़ीड को सहेजे गए फ़ीड से हटा दें?\",\"Obm5+c\":\"Removed from list\",\"N8UzTV\":\"Replies\",\"oQPadq\":\"Replies to this thread are disabled\",\"Veu9gK\":\"फिल्टर\",\"lQWbAr\":[\"रिपोर्ट \",[\"collectionName\"]],\"bDHSjj\":\"रिपोर्ट\",\"NKmI9f\":\"रिपोर्ट फ़ीड\",\"6iwm2r\":\"रिपोर्ट सूची\",\"6IcSvC\":\"रिपोर्ट पोस्ट\",\"mkude1\":\"पुन: पोस्ट\",\"JOV5dR\":\"पोस्ट दोबारा पोस्ट करें या उद्धृत करे\",\"0zb9FX\":\"द्वारा दोबारा पोस्ट किया गया\",\"bqG37Z\":\"अनुरोध बदलें\",\"pJoi/P\":\"Request to limit the visibility of my account\",\"2d9VrZ\":\"पोस्ट करने से पहले वैकल्पिक टेक्स्ट की आवश्यकता है\",\"8XIT+P\":\"इस प्रदाता के लिए आवश्यक\",\"vJgYMA\":\"कोड रीसेट करें\",\"xEL92I\":\"ऑनबोर्डिंग स्टेट को रीसेट करें\",\"RfwZxd\":\"पासवर्ड रीसेट\",\"bee/Fw\":\"प्राथमिकताओं को रीसेट करें\",\"wToeoz\":\"ऑनबोर्डिंग स्टेट को रीसेट करें\",\"nIU7qI\":\"प्राथमिकताओं की स्थिति को रीसेट करें\",\"6gRgw8\":\"फिर से कोशिश करो\",\"hAbYQa\":\"हैंडल बदलना फिर से कोशिश करो\",\"tfDRzk\":\"सेव करो\",\"KV2YQQ\":\"सेव ऑल्ट टेक्स्ट\",\"y3aU20\":\"बदलाव सेव करो\",\"IUwGEM\":\"बदलाव सेव करो\",\"Xs07Tg\":\"बदलाव सेव करो\",\"BckA7m\":\"फोटो बदलाव सेव करो\",\"+K+JDj\":\"सहेजे गए फ़ीड\",\"A1taO8\":\"खोज\",\"BF8cu3\":\"Search for posts and users.\",\"CKROFy\":\"सुरक्षा चरण आवश्यक\",\"cNzyJW\":\"आगे क्या है\",\"L5sM7N\":\"Bluesky Social का चयन करें\",\"o3dwub\":\"मौजूदा खाते से चुनें\",\"GGw2AK\":\"सेवा चुनें\",\"vECNLO\":\"चुनें कि आप अपनी सदस्यता वाली फ़ीड में कौन सी भाषाएँ शामिल करना चाहते हैं। यदि कोई भी चयनित नहीं है, तो सभी भाषाएँ दिखाई जाएंगी।\",\"m5aabx\":\"ऐप में प्रदर्शित होने वाले डिफ़ॉल्ट टेक्स्ट के लिए अपनी ऐप भाषा चुनें\",\"TiiOza\":\"अपने फ़ीड में अनुवाद के लिए अपनी पसंदीदा भाषा चुनें।\",\"vp9yIB\":\"पुष्टिकरण ईमेल भेजें\",\"65dxv8\":\"ईमेल भेजें\",\"i/TzEU\":\"ईमेल भेजें\",\"RoafuO\":\"प्रतिक्रिया भेजें\",\"4cijjm\":\"रिपोर्ट भेजें\",\"V/e7nf\":\"नया पासवर्ड सेट करें\",\"gwsie4\":\"अपने फ़ीड से सभी उद्धरण पदों को छिपाने के लिए इस सेटिंग को \\\"नहीं\\\" में सेट करें। Reposts अभी भी दिखाई देगा।।\",\"IZjC3J\":\"इस सेटिंग को अपने फ़ीड से सभी उत्तरों को छिपाने के लिए \\\"नहीं\\\" पर सेट करें।।\",\"KIgU3l\":\"इस सेटिंग को अपने फ़ीड से सभी पोस्ट छिपाने के लिए \\\"नहीं\\\" करने के लिए सेट करें।।\",\"zaAyrz\":\"इस सेटिंग को \\\"हाँ\\\" में सेट करने के लिए एक थ्रेडेड व्यू में जवाब दिखाने के लिए। यह एक प्रयोगात्मक विशेषता है।।\",\"fQV2eE\":\"इस सेटिंग को अपने निम्नलिखित फ़ीड में अपने सहेजे गए फ़ीड के नमूने दिखाने के लिए \\\"हाँ\\\" पर सेट करें। यह एक प्रयोगात्मक विशेषता है।।\",\"Tz0i8g\":\"सेटिंग्स\",\"HfWHhJ\":\"यौन गतिविधि या कामुक नग्नता।।\",\"Z8lGw6\":\"शेयर\",\"P33tEA\":\"Share feed\",\"uIZ2tg\":\"लिंक शेयर करें\",\"8vETh9\":\"दिखाओ\",\"aWAdCb\":\"दिखाओ\",\"NijgXr\":\"मेरी फीड से पोस्ट दिखाएं\",\"T3Mt8m\":\"उद्धरण पोस्ट दिखाओ\",\"BlW8X/\":\"उत्तर दिखाएँ\",\"X4GwDb\":\"अन्य सभी उत्तरों से पहले उन लोगों के उत्तर दिखाएं जिन्हें आप फ़ॉलो करते हैं।\",\"GiogzH\":\"रीपोस्ट दिखाएँ\",\"fhY/fL\":\"लोग दिखाएँ\",\"5lWFkC\":\"साइन इन करें\",\"n1ekoW\":\"साइन इन करें\",\"N9o7n5\":[[\"0\"],\" के रूप में साइन इन करें\"],\"FT1MVS\":\"... के रूप में साइन इन करें\",\"+UpfFC\":\"साइन इन करें\",\"fcWrnU\":\"साइन आउट\",\"e+RpCP\":\"Sign up\",\"MiE4Vp\":\"Sign up or sign in to join the conversation\",\"zU+Ro7\":\"आपने इस रूप में साइन इन करा है:\",\"6Uau97\":\"स्किप\",\"0o5BFH\":\"उत्तर क्रमबद्ध करें\",\"GH1Rgk\":\"उसी पोस्ट के उत्तरों को इस प्रकार क्रमबद्ध करें:\",\"1DA6ap\":\"स्क्वायर\",\"aKEHLj\":\"स्टेजिंग\",\"tgEXwM\":\"स्थिति पृष्ठ\",\"P5jja7\":\"Storybook\",\"hQRttt\":\"Submit\",\"EDl9kS\":\"सब्सक्राइब\",\"5z3ICN\":\"इस सूची को सब्सक्राइब करें\",\"TVFyMD\":\"अनुशंसित लोग\",\"XYLcNv\":\"सहायता\",\"VjWeLI\":\"खाते बदलें\",\"D+NlUC\":\"प्रणाली\",\"fP8jTZ\":\"सिस्टम लॉग\",\"HF6Iah\":\"लंबा\",\"4Y5H+g\":\"शर्तें\",\"xowcRf\":\"सेवा की शर्तें\",\"p8Iz39\":\"पाठ इनपुट फ़ील्ड\",\"GlPXQJ\":\"अनब्लॉक करने के बाद अकाउंट आपसे इंटरैक्ट कर सकेगा।\",\"o4M2MP\":\"सामुदायिक दिशानिर्देशों को <0/> पर स्थानांतरित कर दिया गया है\",\"U42lKc\":\"कॉपीराइट नीति को <0/> पर स्थानांतरित कर दिया गया है\",\"G4EksE\":\"हो सकता है कि यह पोस्ट हटा दी गई हो।\",\"WNR9db\":\"गोपनीयता नीति को <0/> पर स्थानांतरित किया गया है\",\"LbEbIk\":[\"समर्थन प्रपत्र स्थानांतरित कर दिया गया है. यदि आपको सहायता की आवश्यकता है, तो कृपया<0/> या हमसे संपर्क करने के लिए \",[\"HELP_DESK_URL\"],\" पर जाएं।\"],\"FGbRSr\":\"सेवा की शर्तों को स्थानांतरित कर दिया गया है\",\"yUqcy2\":\"एप्लिकेशन में एक अप्रत्याशित समस्या थी. कृपया हमें बताएं कि क्या आपके साथ ऐसा हुआ है!\",\"jSe8k/\":[\"This \",[\"0\"],\" has been labeled.\"],\"KRYn8w\":[\"यह \",[\"screenDescription\"],\" फ्लैग किया गया है:\"],\"aBX1qv\":\"This content is not viewable without a Bluesky account.\",\"xI4xW5\":\"This feed is currently receiving high traffic and is temporarily unavailable. Please try again later.\",\"lm845B\":\"यह जानकारी अन्य उपयोगकर्ताओं के साथ साझा नहीं की जाती है।।\",\"5Pvw/O\":\"अगर आपको कभी अपना ईमेल बदलने या पासवर्ड रीसेट करने की आवश्यकता है तो यह महत्वपूर्ण है।।\",\"sQQfZ9\":\"यह वह सेवा है जो आपको ऑनलाइन रखता है।।\",\"CvX8qs\":\"यह लिंक आपको निम्नलिखित वेबसाइट पर ले जा रहा है:\",\"WKrUVy\":\"इस पोस्ट को हटा दिया गया है।।\",\"qpCA5s\":\"यह चेतावनी केवल मीडिया संलग्न पोस्ट के लिए उपलब्ध है।\",\"u9ThjD\":\"थ्रेड प्राथमिकता\",\"zmXsk5\":\"थ्रेड मोड\",\"1x30Qt\":\"ड्रॉपडाउन टॉगल करें\",\"KFXQEt\":\"परिवर्तन\",\"pi8x/S\":\"अनुवाद\",\"KDw4GX\":\"फिर से कोशिश करो\",\"RF3/jE\":\"Un-block list\",\"+/SGK9\":\"Un-mute list\",\"nc4Wfd\":\"आपकी सेवा से संपर्क करने में असमर्थ। कृपया अपने इंटरनेट कनेक्शन की जांच करें।।\",\"tuS5Jz\":\"अनब्लॉक\",\"0VrZZv\":\"अनब्लॉक खाता\",\"6pYY4t\":\"पुनः पोस्ट पूर्ववत करें\",\"05f3UA\":\"Unfortunately, you do not meet the requirements to create an account.\",\"wx9wqY\":\"अनम्यूट खाता\",\"s12/Py\":\"थ्रेड को अनम्यूट करें\",\"EvGmWj\":\"Unpin moderation list\",\"vaz2uI\":[\"सूची में \",[\"displayName\"],\" अद्यतन करें\"],\"YXMY4w\":\"उपलब्ध अद्यतन\",\"RXbEvi\":\"अद्यतन..।\",\"Vwkfp4\":\"एक पाठ फ़ाइल अपलोड करने के लिए:\",\"jTdnU6\":\"अपने खाते या पासवर्ड को पूर्ण एक्सेस देने के बिना अन्य ब्लूस्की ग्राहकों को लॉगिन करने के लिए ऐप पासवर्ड का उपयोग करें।।\",\"CH1am9\":\"डिफ़ॉल्ट प्रदाता का उपयोग करें\",\"ZG8UvP\":\"अपने हैंडल के साथ दूसरे ऐप में साइन इन करने के लिए इसका उपयोग करें।\",\"cKXwwI\":\"के द्वारा उपयोग:\",\"t4Yp4Z\":\"यूजर हैंडल\",\"8tsrUV\":\"लोग सूचियाँ\",\"nZx9mr\":\"यूजर नाम या ईमेल पता\",\"Sxm8rQ\":\"यूजर लोग\",\"Hbhyg2\":\"users followed by <0/>\",\"1Z9Mdf\":\"Users followed by <0/>\",\"9k1aoj\":[\"Users in \\\"\",[\"0\"],\"\\\"\"],\"MBOY4U\":\"ईमेल सत्यापित करें\",\"Ejyv0o\":\"मेरी ईमेल सत्यापित करें\",\"9czCrB\":\"मेरी ईमेल सत्यापित करें\",\"ibSVGR\":\"नया ईमेल सत्यापित करें\",\"nHsQde\":\"डीबग प्रविष्टि देखें\",\"47jzzd\":\"अवतार देखें\",\"wK4H1r\":\"साइट पर जाएं\",\"qjBGxf\":\"हम आपके हमारी सेवा में शामिल होने को लेकर बहुत उत्साहित हैं!\",\"1xpRAp\":\"We're sorry, but this content is not viewable without a Bluesky account.\",\"2iYPLH\":\"We're sorry, but this feed is currently receiving high traffic and is temporarily unavailable. Please try again later.\",\"WBQOQ0\":\"We're sorry, but your search could not be completed. Please try again in a few minutes.\",\"/mVVX2\":\"हम क्षमा चाहते हैं! हमें वह पेज नहीं मिल रहा जिसे आप ढूंढ रहे थे।\",\"meB+tZ\":\"<0>Bluesky में आपका स्वागत है\",\"Mj7rl/\":[\"इस \",[\"collectionName\"],\" के साथ क्या मुद्दा है?\"],\"3qn29J\":\"इस पोस्ट में किस भाषा का उपयोग किया जाता है?\",\"uawiGa\":\"कौन से भाषाएं आपको अपने एल्गोरिदमिक फ़ीड में देखना पसंद करती हैं?\",\"yvDWMs\":\"Who can reply\",\"GKc8LT\":\"Who can reply?\",\"I5S9ZE\":\"चौड़ा\",\"y02THm\":\"पोस्ट लिखो\",\"6ckZRB\":\"अपना जवाब दें\",\"l75CjT\":\"हाँ\",\"STPj0e\":\"आप किसी भी समय होस्टिंग प्रदाताओं को बदल सकते हैं।।\",\"67nRLM\":\"अब आप अपने नए पासवर्ड के साथ साइन इन कर सकते हैं।।\",\"lIcbCU\":\"आपके पास अभी तक कोई आमंत्रण कोड नहीं है! जब आप कुछ अधिक समय के लिए Bluesky पर रहेंगे तो हम आपको कुछ भेजेंगे।\",\"aFZZYi\":\"आपके पास कोई पिन किया हुआ फ़ीड नहीं है.\",\"kX/cKs\":\"You don't have any saved feeds!\",\"nbz3Iq\":\"आपके पास कोई सहेजी गई फ़ीड नहीं है.\",\"RkXibf\":\"आपने लेखक को अवरुद्ध किया है या आपने लेखक द्वारा अवरुद्ध किया है।।\",\"CbrOgr\":\"You have no feeds.\",\"tCLJ9E\":\"आपके पास कोई सूची नहीं है।।\",\"soH9qC\":\"आपने अभी तक कोई भी अकाउंट ब्लॉक नहीं किया है. किसी खाते को ब्लॉक करने के लिए, उनकी प्रोफ़ाइल पर जाएं और उनके खाते के मेनू से \\\"खाता ब्लॉक करें\\\" चुनें।\",\"NDgp3i\":\"आपने अभी तक कोई ऐप पासवर्ड नहीं बनाया है। आप नीचे बटन दबाकर एक बना सकते हैं।।\",\"grqdXb\":\"आपने अभी तक कोई खाता म्यूट नहीं किया है. किसी खाते को म्यूट करने के लिए, उनकी प्रोफ़ाइल पर जाएं और उनके खाते के मेनू से \\\"खाता म्यूट करें\\\" चुनें।\",\"RrDyEb\":\"आपको \\\"reset code\\\" के साथ एक ईमेल प्राप्त होगा। उस कोड को यहाँ दर्ज करें, फिर अपना नया पासवर्ड दर्ज करें।।\",\"gdRnT7\":\"आपका खाता\",\"k7hmsH\":\"जन्म तिथि\",\"tBpzKB\":\"Your email appears to be invalid.\",\"OubkcP\":\"आपका ईमेल बचाया गया है! हम जल्द ही संपर्क में रहेंगे।।\",\"z2L+/9\":\"आपका ईमेल अद्यतन किया गया है लेकिन सत्यापित नहीं किया गया है। अगले चरण के रूप में, कृपया अपना नया ईमेल सत्यापित करें।।\",\"XZlIVw\":\"आपका ईमेल अभी तक सत्यापित नहीं हुआ है। यह एक महत्वपूर्ण सुरक्षा कदम है जिसे हम अनुशंसा करते हैं।।\",\"qv9f4I\":\"आपका पूरा हैंडल होगा\",\"lvcqqG\":\"आपका होस्टिंग प्रदाता\",\"fbFyAZ\":\"Your invite codes are hidden when logged in using an App Password\",\"Oqt/PG\":\"आपकी पोस्ट, पसंद और ब्लॉक सार्वजनिक हैं। म्यूट निजी हैं।।\",\"okRPtW\":\"आपकी प्रोफ़ाइल\",\"rsWkoR\":\"Your profile and account will not be visible to anyone visiting the Bluesky app without an account, or to account holders who are not logged in. Enabling this will not make your profile private.\",\"jjscPy\":\"Your profile and content will not be visible to anyone visiting the Bluesky app without an account. Enabling this will not make your profile private.\",\"ogY7EU\":\"Your profile and posts will not be visible to people visiting the Bluesky app or website without having an account and being logged in.\",\"MvWO9d\":\"आपका यूजर हैंडल\"}")}; \ No newline at end of file diff --git a/src/locale/locales/ja/messages.js b/src/locale/locales/ja/messages.js new file mode 100644 index 0000000000..ccfd315f3b --- /dev/null +++ b/src/locale/locales/ja/messages.js @@ -0,0 +1 @@ +/*eslint-disable*/module.exports={messages:JSON.parse("{\"ebOBhv\":[[\"0\",\"plural\",{\"one\":[\"#\",\" invite code available\"],\"other\":[\"#\",\" invite codes available\"]}]],\"J/hVSQ\":[[\"0\"]],\"hZQerY\":[[\"0\"],\" \",[\"purposeLabel\"],\" リスト\"],\"zgN03j\":[[\"invitesAvailable\",\"plural\",{\"one\":[\"Invite codes: \",\"#\",\" available\"],\"other\":[\"Invite codes: \",\"#\",\" available\"]}]],\"OyEWua\":[[\"invitesAvailable\"],\" invite code available\"],\"eFIdHP\":[[\"invitesAvailable\"],\" invite codes available\"],\"wapGcj\":[[\"message\"]],\"umrH9L\":\"<0/> members\",\"gMjqbV\":\"<1>推奨<2>フィード<0>を選択\",\"F657la\":\"<1>推奨<2>ユーザー<0>をフォロー\",\"XCTqGE\":\"新しいバージョンのアプリが利用可能です。アプリを継続して使用するにはアップデートしてください。\",\"AnNF5e\":\"アクセシビリティ\",\"AeXO77\":\"アカウント\",\"4WY4MD\":\"アカウントオプション\",\"m16xKo\":\"追加\",\"fBBX+K\":\"コンテンツ警告を追加\",\"JU3hs2\":\"リストにユーザーを追加\",\"MPPZ54\":\"アカウントを追加\",\"LkA8jz\":\"ALTテキストを追加\",\"Z8idyM\":\"詳細を追加\",\"AoXl11\":\"レポートに詳細を追加\",\"iE6B/9\":\"リンクカードを追加\",\"EXHdP1\":\"リンクカードの追加:\",\"x6laaL\":\"次のDNSレコードをドメインに追加してください:\",\"UmzMP4\":\"リストに追加\",\"hCrQ0L\":\"マイフィードに追加\",\"GluCXm\":\"リストに追加\",\"jRrQFe\":\"返信がフィードに表示されるために必要な「いいね」の数を調整します。\",\"qLa52r\":\"成人向けコンテンツ\",\"sxkWRg\":\"アドバンス\",\"u2HO/d\":\"ALT\",\"u/DP73\":\"ALTテキスト\",\"0QlT7/\":\"ALTテキストは、視覚障害者や低視力者のために画像を説明し、すべての人に文脈を与えるのに役立ちます。\",\"woXbjq\":[\"Eメールが\",[\"0\"],\"に送信されました。以下に入力できる確認コードが含まれています。\"],\"Fon2dK\":[\"以前のアドレス\",[\"0\"],\"にEメールが送信されました。以下に入力できる確認コードが含まれています。\"],\"HZFm5R\":\"および\",\"fdjKGe\":\"アプリケーション言語\",\"SMmUnj\":\"アプリパスワード\",\"8q4WlH\":\"アプリパスワード\",\"e6un1h\":\"Appeal Decision\",\"c0PCYD\":\"Appeal this decision\",\"oifO1p\":\"Appeal this decision.\",\"aAIQg2\":\"外観\",\"SSDZ+T\":[\"本当にアプリパスワード「\",[\"name\"],\"」を削除しますか?\"],\"0BIeIs\":\"本当にこの下書きを破棄しますか?\",\"6foA8n\":\"本当ですか?\",\"/mSd6b\":\"本当ですか?これは元に戻せません。\",\"EbvWd3\":\"芸術的または非エロティックなヌード。\",\"iH8pgl\":\"戻る\",\"ehOkF+\":\"基本\",\"+gCI2a\":\"誕生日\",\"pieVBA\":\"誕生日:\",\"m1dqxu\":\"アカウントのブロック\",\"ffIfdM\":\"アカウントのブロック\",\"hIysMc\":\"Block list\",\"fdYcMy\":\"これらのアカウントをブロックしますか?\",\"KWykPE\":\"ブロックされたブロック\",\"JuqQpF\":\"ブロックされたアカウント\",\"HG4qt4\":\"ブロックされたアカウントは、スレッド内で返信したり、ユーザーに言及したり、その他の方法でユーザーとやり取りすることはできません。\",\"8LNSUt\":\"ブロックされたアカウントは、スレッド内で返信したり、ユーザーに言及したり、その他の方法でユーザーとやり取りすることはできません。あなたは相手のコンテンツを見ることができず、相手はあなたのコンテンツを見ることができなくなります。\",\"HFCE4A\":\"投稿をブロックしました。\",\"zl+QbX\":\"ブロックは公開されます。ブロックされたアカウントは、スレッド内で返信したり、ユーザーに言及したり、その他の方法でユーザーとやり取りすることはできません。\",\"7A9u1j\":\"Bluesky\",\"ZHmKSm\":\"Blueskyは柔軟です。\",\"odLrdl\":\"Blueskyは開いています。\",\"/LsWK4\":\"Blueskyはオープンです。\",\"C50OGr\":\"Blueskyはより健全なコミュニティを構築するために招待状を使用します。招待状をお持ちでない方の場合、waitlistに申し込めば招待状をお送りします。\",\"u9cCQU\":\"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.\",\"klVoaP\":\"Bluesky.Social\",\"qxBitM\":[\"ビルドバージョン \",[\"0\"],\" \",[\"1\"]],\"rT2cV+\":\"カメラ\",\"JGGrPC\":\"文字、数字、スペース、ハイフン、およびアンダースコアのみを含めることができます。長さは4文字以上32文字以下である必要があります。\",\"dEgA5A\":\"キャンセル\",\"aMH9rr\":\"アカウントの削除をキャンセル\",\"kc3E4R\":\"画像のALTテキストの追加をキャンセル\",\"wg4LHQ\":\"ハンドルの変更をキャンセル\",\"hFL1Li\":\"画像の切り抜きをキャンセル\",\"tijH8t\":\"プロフィールの編集をキャンセル\",\"Qe4C/d\":\"引用投稿をキャンセル\",\"5TviPn\":\"検索をキャンセル\",\"nss3UV\":\"Waitlistの登録をキャンセル\",\"o+XJ9D\":\"変更\",\"pQco5R\":\"ハンドルを変更\",\"Q5e1U/\":\"ハンドルを変更\",\"a3NAfL\":\"Eメールの変更\",\"4vatyk\":\"Eメールを変更\",\"Yn3C90\":\"推奨フィードを確認してください。「+」をタップすればフィードに追加されます。\",\"ioZXIH\":\"推奨ユーザーを確認してください。フォローする事であなたに合ったユーザーが見つかるかもしれません。\",\"/+X+/K\":\"Eメールの受信トレイを確認して、以下に入力するコードが記載されたメールが届いていないか確認してください:\",\"Rt502e\":\"サービスを選択\",\"/L45sc\":\"カスタムフィードを使用して経験を強化するアルゴリズムを選択します。\",\"Wk8hkn\":\"パスワードを選択\",\"Us7A1O\":\"レガシーストレージデータをすべてクリア\",\"X3zEXo\":\"すべてのレガシーストレージデータをクリア(この後再起動)\",\"zxFM2c\":\"すべてのストレージデータをクリア\",\"r+lhUL\":\"すべてのストレージデータをクリア(この後再起動)\",\"QbvBNV\":\"検索クエリをクリア\",\"flH7u/\":\"アラートを閉じる\",\"hYmnbk\":\"一番下の引き出しを閉じる\",\"47L1V1\":\"画像を閉じる\",\"l49ujN\":\"画像ビューアを閉じる\",\"UryHFO\":\"ナビゲーションフッターを閉じる\",\"KHzDTk\":\"コミュニティガイドライン\",\"o8UUti\":\"返信を作成\",\"7VpPHA\":\"確認\",\"q8upsf\":\"変更を確認\",\"8pNKIr\":\"コンテンツ言語の設定を確認\",\"tGg8Kt\":\"アカウントの削除を確認\",\"ioZOzk\":\"確認コード\",\"J28zul\":\"接続中...\",\"l879p1\":\"コンテンツフィルタリング\",\"m8j6up\":\"コンテンツフィルタリング\",\"/PlAsF\":\"コンテンツ言語\",\"cogwXi\":\"コンテンツ警告\",\"FG7AQv\":\"コンテンツ警告\",\"xGVfLh\":\"続行\",\"6V3Ea3\":\"コピー済み\",\"he3ygx\":\"コピー\",\"7LTXf4\":\"Copy link to list\",\"dWsPi5\":\"Copy link to post\",\"jw+abr\":\"Copy link to profile\",\"iQgJaz\":\"投稿テキストをコピー\",\"u40k/o\":\"著作権ポリシー\",\"7wWvgo\":\"フィードのロードに失敗\",\"8NNr/O\":\"リストのロードに失敗\",\"mpt9T+\":\"新しいアカウントを作成\",\"IS0nrP\":\"アカウントを作成\",\"6HbhpU\":\"新しいアカウントを作成\",\"MXSt4t\":[\"作成済み \",[\"0\"]],\"GAD3Dx\":\"カスタムドメイン\",\"ZQKLI1\":\"危険地帯\",\"ZDGm40\":\"アカウントを削除\",\"vzX5FB\":\"アカウントを削除\",\"gUEtxf\":\"アプリパスワードを削除\",\"84uE/A\":\"リストを削除\",\"ktknoE\":\"マイアカウントを削除\",\"szz0+N\":\"マイアカウントを削除…\",\"04G5Az\":\"投稿を削除\",\"FbPNuJ\":\"この投稿を削除しますか?\",\"u+1OHY\":\"投稿を削除しました。\",\"Nu4oKW\":\"説明\",\"dacKHE\":\"開発者サーバー\",\"2ygkE8\":\"開発者ツール\",\"bzSI52\":\"破棄\",\"BryYJR\":\"ドラフトを破棄\",\"9Y7FMD\":\"Discourage apps from showing my account to logged-out users\",\"pbLwal\":\"新しいフィードを検出\",\"pfa8F0\":\"表示名\",\"0gS7M5\":\"表示名\",\"iZ5pMB\":\"ドメインを確認しました!\",\"DPfwMq\":\"完了\",\"zT97vP\":[\"完了\",[\"extraText\"]],\"4uwlSD\":\"それぞれのコードは一度ずつ動作します。定期的により多くの招待コードを受け取ります。\",\"XQFMOm\":\"画像を編集\",\"S7M0uU\":\"リストの詳細を編集\",\"cLmurE\":\"マイフィードを編集\",\"bRZ5XW\":\"マイプロフィールを編集\",\"9OpVZg\":\"プロフィールを編集\",\"QJQd1J\":\"プロフィールを編集\",\"Jn7kox\":\"保存済みフィードを編集\",\"O3oNi5\":\"Eメール\",\"ATGYL1\":\"Eメールアドレス\",\"pJJ0Vp\":\"Eメール更新\",\"9Qs99X\":\"Eメール:\",\"96mted\":\"この設定を有効にすると、フォローしているユーザー間の応答だけが表示されます。\",\"9xK+YC\":\"End of feed\",\"YbIxza\":\"プロバイダーのアドレスを入力してください:\",\"BfIgP6\":\"使用するドメインを入力\",\"cHrOqs\":\"アカウントの作成に使用したEメールを入力します。新しいパスワードを設定できるように、「リセットコード」をお送りします。\",\"xRPn3U\":\"Eメールアドレスを入力\",\"+inPGm\":\"以下に新しいメールアドレスを入力してください。\",\"T0KLp4\":\"ユーザー名とパスワードを入力\",\"4BITzH\":\"エラー:\",\"wlzBtv\":\"Everybody\",\"0PkE20\":\"ALTテキストを展開\",\"/5K/KL\":\"推奨フィードのロードに失敗\",\"4yCy8i\":\"フィードはオフライン\",\"N0CqyO\":\"フィード設定\",\"YirHq7\":\"フィードバック\",\"2DoBvq\":\"フィード\",\"I3iUBQ\":\"フィードはコンテンツを整理する為にユーザーによって作成されます。興味具かいフィードをいくつか選択してください。\",\"2+6lmO\":\"フィードはユーザーがプログラミングの専門知識を持って構築するカスタムアルゴリズムです。詳細については、<0/>を参照してください。\",\"Qzj1WT\":\"似通ったアカウントを検索中...\",\"QKSrQV\":\"ホーム画面に表示されるコンテンツを微調整します。\",\"r+KeyR\":\"ディスカッションスレッドを微調整します。\",\"MKEPCY\":\"フォロー\",\"Wezu5M\":\"いくつかのユーザーをフォローして開始します。興味を持っている人に基づいて、より多くのユーザーをお勧めできます。\",\"jdbMSV\":\"Followed users\",\"YY2BTA\":\"フォローされたユーザーのみ\",\"x5LEuB\":\"フォロワー\",\"NIjL2Y\":\"フォロー中\",\"y6sq5j\":\"フォロー中\",\"p3UO/y\":\"あなたをフォロー\",\"5RhDkD\":\"セキュリティ上の理由から、Eメールアドレスに確認コードを送信する必要があります。\",\"NJPhAO\":\"セキュリティ上の理由から、これを再度表示することはできません。このパスワードを紛失した場合は、新しいパスワードを生成する必要があります。\",\"5bDfuq\":\"失念\",\"hEPLrs\":\"パスワードを失念\",\"dn8X5t\":\"パスワードを失念\",\"U+kFad\":\"ギャラリー\",\"c3b0B0\":\"はじめに\",\"CKyk7Q\":\"戻る\",\"sr0UJD\":\"戻る\",\"Rtp0y7\":\"次へ\",\"Nf7oXL\":\"ハンドル\",\"c3XJ18\":\"ヘルプ\",\"uX/4+/\":\"アプリパスワードをお知らせします。\",\"vLyv1R\":\"非表示\",\"qdOx2q\":\"ユーザーリストを非表示にする\",\"FynkM2\":\"Hmm, some kind of issue occurred when contacting the feed server. Please let the feed owner know about this issue.\",\"WTcLyw\":\"Hmm, the feed server appears to be misconfigured. Please let the feed owner know about this issue.\",\"/8MHCt\":\"Hmm, the feed server appears to be offline. Please let the feed owner know about this issue.\",\"3zJH1g\":\"Hmm, the feed server gave a bad response. Please let the feed owner know about this issue.\",\"wkCNhr\":\"Hmm, we're having trouble finding this feed. It may have been deleted.\",\"i0qMbr\":\"ホーム\",\"sXZ8IU\":\"ホームフィード設定\",\"yt7fhu\":\"ホスティングプロバイダー\",\"s2xA6t\":\"ホスティングプロバイダーアドレス\",\"o+axy6\":\"コードを持っている\",\"wey2os\":\"自分のドメインを持っている\",\"WlEcKr\":\"選択されていない場合は、すべての年齢に適しています。\",\"VCk0rR\":\"画像のALTテキスト\",\"STGpNQ\":\"イメージオプション\",\"dSKHAa\":\"無効なユーザー名またはパスワード\",\"MFKlMB\":\"招待\",\"F5MZVk\":\"友人を招待\",\"6KlkHI\":\"招待コード\",\"MYTV5o\":\"招待コードが確認できません。正しく入力されている事を確認し、もう一度実行してください。\",\"UY2916\":[\"Invite codes: \",[\"invitesAvailable\"],\" available\"],\"F75w8j\":\"待機リストに参加\",\"6iVTdm\":\"待機リストに参加します。\",\"SNzppu\":\"待機リストに参加\",\"Dcq5kL\":\"言語選択\",\"pVhZHk\":\"言語設定\",\"GAmD3h\":\"言語\",\"NgeSlx\":\"詳細\",\"rj0Lke\":\"この警告の詳細\",\"lvYkpV\":\"Learn more about what is public on Bluesky.\",\"kq2ga7\":\"どの言語も表示するには、すべてのチェックを外したままにします。\",\"QfDITI\":\"Blueskyから離れる\",\"Esfg1M\":\"パスワードをリセットしましょう!\",\"exYcTF\":\"ライブラリー\",\"BvSY1i\":\"このフィードをいいね\",\"8/ALSr\":\"いいねした人:\",\"zZOZj7\":\"Likes\",\"AUSVsF\":\"Limit the visibility of my account to logged-out users\",\"FuZWua\":\"リストアバター\",\"8mjA4F\":\"リスト名\",\"h16FyT\":\"リスト\",\"ujW4FW\":\"より多くの投稿をロード\",\"7EHsGr\":\"新しい通知をロード\",\"VkLESX\":\"新しい投稿をロード\",\"Z3FXyt\":\"ロード中...\",\"jl0AFf\":\"ローカル開発者サーバー\",\"5Aq6mk\":\"Logged-out users\",\"w2yNjr\":\"Logged-out visibility\",\"cR9UpQ\":\"リストにないアカウントにログイン\",\"kkGiug\":\"Looks like this feed is only available to users with a Bluesky account. Please sign up or sign in to view this feed!\",\"2U/gDT\":\"意図する場所である事を確認してください!\",\"xYilR2\":\"Media\",\"S9V0C/\":\"mentioned users\",\"31/84x\":\"Mentioned users\",\"zucql+\":\"メニュー\",\"kTQnAw\":\"Message from server\",\"DzmsLV\":\"モデレート\",\"NTIbv4\":\"モデレートリスト\",\"3j2OjF\":\"Moderation Lists\",\"FIJUJb\":\"その他のフィード\",\"3Siwmw\":\"その他のオプション\",\"RA1KUZ\":\"アカウントをミュート\",\"du0opt\":\"アカウントをミュート\",\"25PHAB\":\"Mute list\",\"izOxJM\":\"これらのアカウントをミュートしますか?\",\"jq7SjD\":\"スレッドをミュート\",\"s22grX\":\"ミュート済みアカウント\",\"qUa+lV\":\"ミュート済みアカウント\",\"gA0D9A\":\"ミュート済みのアカウントは、フィードと通知からの投稿が削除されます。ミュート設定は知られることはありません。\",\"1QJzM7\":\"ミュートはプライベートです。ミュート済みアカウントはユーザーと相互作用することができますが、そのアカウントの投稿や通知を受信することはできません。\",\"Mysqyf\":\"誕生日\",\"6MBNS/\":\"マイフィード\",\"hKtWk2\":\"マイプロフィール\",\"Ha6iBv\":\"保存済みフィード\",\"6YtxFj\":\"名前\",\"8yolS6\":\"決してフォロワーやデータへのアクセスを失わないでください。\",\"isRobC\":\"新規\",\"2B7HLH\":\"新しい投稿\",\"FGrimz\":\"新しい投稿\",\"hXzOVo\":\"次へ\",\"EatZYJ\":\"次の画像\",\"1UzENP\":\"なし\",\"flmDTf\":\"説明なし\",\"zfN9gJ\":\"結果なし\",\"fOlAiK\":[\"「\\\\\",[\"query\"],\"」の検索結果がない\"],\"SVF205\":[\"\\\\\",[\"query\"],\"の検索結果がない\"],\"xpF9po\":\"Nobody\",\"iyUCYw\":\"該当なし。\",\"ACqM3c\":\"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.\",\"+lYa0i\":\"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.\",\"iDNBZe\":\"通知\",\"5GGAqz\":\"ちょっと!\",\"UaXeX3\":\"OK\",\"Cqo2D+\":\"1つ以上の画像にALTテキストがありません。\",\"Kq2/SU\":[\"Only \",[\"0\"],\" can reply.\"],\"M/Q2aG\":\"ナビゲーションを開く\",\"M5PuNq\":\"構成可能な言語設定を開く\",\"S67TOE\":\"Opens list of invite codes\",\"eSqpax\":\"カスタムドメインを使用するためのモーダルを開く\",\"vYwHHI\":\"モデレート設定を開く\",\"0tHyB7\":\"保存されたすべてのフィードで画面を開く\",\"nmRoY/\":\"アプリのパスワード設定ページを開く\",\"6e9Apv\":\"ホームフィード設定を開きます\",\"O87Dr/\":\"ストーリーブックのページを開く\",\"G+PVmg\":\"システムログのページを開く\",\"Jqb7sy\":\"スレッド設定を開きます\",\"b22AVl\":\"その他のアカウント\",\"n+HLOP\":\"その他のサービス\",\"1PKxQ7\":\"その他...\",\"8F1i42\":\"ページが見つからない\",\"8ZsakT\":\"パスワード\",\"ogtYkT\":\"パスワードが更新された\",\"DKeVgZ\":\"パスワードが更新されました!\",\"VeZE5Q\":\"写真は成人向けです。\",\"zgoxy5\":\"ピン接続フィード\",\"Aw5fOC\":\"ハンドルをお選びください。\",\"5vI4sE\":\"パスワードを選択してください。\",\"Apyknf\":\"変更する前にメールを確認してください。これは、Eメールアップデートツールが追加されている間の一時的な要件であり、まもなく削除されます。\",\"9qpQ5O\":\"このアプリパスワードに固有の名前を入力するか、ランダムに生成された名前を使用してください。\",\"hV+cYN\":\"Eメールを入力してください。\",\"QJr5Xp\":\"パスワードも入力してください:\",\"d7tryi\":\"Please tell us why you think this decision was incorrect.\",\"y28hnO\":\"投稿\",\"h5RcXU\":\"投稿非表示\",\"r5zLS0\":\"ポスト言語\",\"AzCucI\":\"投稿言語\",\"tJFPmV\":\"投稿が見つからない\",\"+owNNn\":\"Posts\",\"0+DQbr\":\"誤解を招く可能性のあるリンク\",\"MHk+7g\":\"前の画像\",\"HeBcM5\":\"第一言語\",\"x8iR7V\":\"フォローの優先順位付け\",\"rjGI/Q\":\"プライバシー\",\"LcET2C\":\"プライバシーポリシー\",\"k1ifdL\":\"処理中...\",\"vERlcd\":\"プロフィール\",\"MrgqOW\":\"Eメールを確認してアカウントを保護します。\",\"9nSV9I\":\"Public, shareable lists of users to mute or block in bulk.\",\"p1UmBX\":\"フィードを駆動できるパブリックで共有可能なリスト。\",\"8HFFRQ\":\"引用投稿\",\"+KrAHa\":\"引用投稿\",\"WlWsdE\":\"比率\",\"QNzcT3\":\"推奨フィード\",\"41UoJb\":\"推奨ユーザー\",\"t/YqKh\":\"削除\",\"p/cRzf\":[\"マイフィードから\",[\"0\"],\"を削除しますか?\"],\"1O32oy\":\"アカウントを削除\",\"W44VX5\":\"フィードを削除\",\"Yy3FzB\":\"マイフィードから削除\",\"5ywtDz\":\"イメージを削除\",\"Dw/XUh\":\"イメージプレビューを削除\",\"3fdNAy\":\"Remove this feed from my feeds?\",\"TbDEfs\":\"保存したフィードからこのフィードを削除しますか?\",\"Obm5+c\":\"リストから削除された\",\"N8UzTV\":\"Replies\",\"oQPadq\":\"Replies to this thread are disabled\",\"Veu9gK\":\"返信フィルター\",\"lQWbAr\":[\"レポート \\\\\",[\"collectionName\"]],\"bDHSjj\":\"レポートアカウント\",\"NKmI9f\":\"レポートフィード\",\"6iwm2r\":\"レポートリスト\",\"6IcSvC\":\"レポート投稿\",\"mkude1\":\"再投稿\",\"JOV5dR\":\"再投稿または引用投稿\",\"0zb9FX\":\"再投稿者\",\"bqG37Z\":\"変更を要求\",\"8XIT+P\":\"このプロバイダーに必要\",\"vJgYMA\":\"コードをリセット\",\"xEL92I\":\"オンボード状態をリセット\",\"RfwZxd\":\"パスワードをリセット\",\"bee/Fw\":\"設定をリセット\",\"wToeoz\":\"オンボード状態をリセット\",\"nIU7qI\":\"設定状態をリセット\",\"6gRgw8\":\"再試行\",\"tfDRzk\":\"保存\",\"KV2YQQ\":\"ALTテキストを保存\",\"IUwGEM\":\"変更を保存\",\"Xs07Tg\":\"ハンドルの変更を保存\",\"BckA7m\":\"画像の切り抜きを保存\",\"+K+JDj\":\"保存済みフィード\",\"A1taO8\":\"検索\",\"BF8cu3\":\"投稿とユーザーを検索します。\",\"CKROFy\":\"必要なセキュリティ手順\",\"cNzyJW\":\"次を見る\",\"L5sM7N\":\"Bluesky Socialを選択\",\"o3dwub\":\"既存のアカウントから選択\",\"GGw2AK\":\"サービスを選択\",\"vECNLO\":\"登録済みフィードに含める言語を選択します。選択されていない場合は、すべての言語が表示されます。\",\"m5aabx\":\"アプリに表示するデフォルトのテキストのアプリ言語を選択する\",\"TiiOza\":\"フィード内の翻訳に使用する言語を選択します。\",\"vp9yIB\":\"確認Eメールを送信\",\"65dxv8\":\"Eメールを送信\",\"i/TzEU\":\"Eメールを送信\",\"RoafuO\":\"フィードバックを送信\",\"4cijjm\":\"レポートを送信\",\"V/e7nf\":\"新しいパスワードを設定\",\"gwsie4\":\"フィードから全ての引用投稿を非表示にするには、この設定を「いいえ」にします。再投稿は引き続き表示されます。\",\"IZjC3J\":\"フィードから全ての返信を非表示にするには、この設定を「いいえ」にします。\",\"KIgU3l\":\"フィードから全ての再投稿を非表示にするには、この設定を「いいえ」にします。\",\"zaAyrz\":\"スレッド表示で返信を表示するには、この設定を「はい」にします。これは実験的な機能です。\",\"fQV2eE\":\"保存したフィードのサンプルを次のフィードに表示するには、この設定を「はい」にします。これは実験的な機能です。\",\"Tz0i8g\":\"設定\",\"HfWHhJ\":\"性行為またはエロティックなヌード。\",\"Z8lGw6\":\"共有\",\"P33tEA\":\"フィードを共有\",\"8vETh9\":\"表示\",\"aWAdCb\":\"とにかく表示\",\"NijgXr\":\"マイフィードからの投稿を表示\",\"T3Mt8m\":\"引用投稿を表示\",\"BlW8X/\":\"返信を表示\",\"X4GwDb\":\"他のすべての返信の前に、フォローしている人からの返信を表示します。\",\"GiogzH\":\"再投稿を表示\",\"fhY/fL\":\"ユーザーを表示\",\"5lWFkC\":\"サインイン\",\"n1ekoW\":\"サインイン\",\"N9o7n5\":[[\"0\"],\"としてサインイン\"],\"FT1MVS\":\"...としてサインイン\",\"+UpfFC\":\"サインイン\",\"fcWrnU\":\"サインアウト\",\"e+RpCP\":\"サインアップ\",\"MiE4Vp\":\"登録またはログインして会話に参加する\",\"zU+Ro7\":\"サインイン済み\",\"6Uau97\":\"スキップ\",\"0o5BFH\":\"返信を並び替える\",\"GH1Rgk\":\"次の方法で同じ投稿への返信を並び替えます。\",\"1DA6ap\":\"正方形\",\"aKEHLj\":\"ステージング\",\"tgEXwM\":\"ステータスページ\",\"P5jja7\":\"ストーリーブック\",\"hQRttt\":\"Submit\",\"EDl9kS\":\"登録\",\"5z3ICN\":\"このリストに登録\",\"TVFyMD\":\"推奨されるフォロー\",\"XYLcNv\":\"サポート\",\"VjWeLI\":\"アカウントを切り替える\",\"fP8jTZ\":\"システムログ\",\"HF6Iah\":\"トール\",\"4Y5H+g\":\"条件\",\"xowcRf\":\"利用規約\",\"p8Iz39\":\"テキスト入力フィールド\",\"GlPXQJ\":\"このアカウントは、ブロック解除後にお客様とやり取りすることができます。\",\"o4M2MP\":\"コミュニティ ガイドラインが<0/>に移動された\",\"U42lKc\":\"著作権ポリシーが<0/>に移動された\",\"G4EksE\":\"投稿が削除された可能性があります。\",\"WNR9db\":\"プライバシーポリシーが<0/>に移動された\",\"LbEbIk\":[\"サポートフォームが移動しました。サポートが必要な場合は、<0/>または\\\\\",[\"HELP_DESK_URL\"],\"にアクセスしてご連絡ください。\"],\"FGbRSr\":\"サービス規約が移動された\",\"yUqcy2\":\"アプリケーションに予期しない問題が発生しました。このようなことがありましたらお知らせください!\",\"jSe8k/\":[\"This \",[\"0\"],\" has been labeled.\"],\"KRYn8w\":[\"この\\\\\",[\"screenDescription\"],\"にはフラグが設定されています。\"],\"aBX1qv\":\"This content is not viewable without a Bluesky account.\",\"xI4xW5\":\"This feed is currently receiving high traffic and is temporarily unavailable. Please try again later.\",\"lm845B\":\"この情報は他のユーザーと共有されません。\",\"5Pvw/O\":\"これは、Eメールの変更やパスワードのリセットが必要な場合に重要です。\",\"sQQfZ9\":\"これはオンラインを維持するためのサービスです。\",\"CvX8qs\":\"このリンクは次のウェブサイトへリンクしています:\",\"WKrUVy\":\"この投稿は削除されました。\",\"qpCA5s\":\"この警告は、メディアが接続されている投稿にのみ使用できます。\",\"u9ThjD\":\"スレッドの設定\",\"zmXsk5\":\"スレッドモード\",\"1x30Qt\":\"トグルドロップダウン\",\"KFXQEt\":\"変換\",\"pi8x/S\":\"翻訳\",\"KDw4GX\":\"再試行\",\"RF3/jE\":\"Un-block list\",\"+/SGK9\":\"Un-mute list\",\"nc4Wfd\":\"サービスに接続できません。インターネット接続を確認してください。\",\"tuS5Jz\":\"ブロック解除\",\"0VrZZv\":\"アカウントのブロック解除\",\"6pYY4t\":\"再投稿を元に戻す\",\"05f3UA\":\"残念ながら、アカウントを作成するための要件を満たしていません。\",\"wx9wqY\":\"アカウントのミュート解除\",\"s12/Py\":\"スレッドのミュート解除\",\"EvGmWj\":\"Unpin moderation list\",\"vaz2uI\":[\"リストの\\\\\",[\"displayName\"],\"を更新\"],\"YXMY4w\":\"更新可能\",\"RXbEvi\":\"更新中…\",\"Vwkfp4\":\"テキストファイルのアップロード先:\",\"jTdnU6\":\"他のBlueskyクライアントにアカウントやパスワードにフルアクセスする権限を与えずに、アプリパスワードを使ってログインします。\",\"CH1am9\":\"デフォルトプロバイダーを使用\",\"ZG8UvP\":\"これとハンドルを使って他のアプリにサインインします。\",\"cKXwwI\":\"使用者:\",\"t4Yp4Z\":\"ユーザーハンドル\",\"8tsrUV\":\"ユーザーリスト\",\"nZx9mr\":\"ユーザー名またはEメールアドレス\",\"Sxm8rQ\":\"ユーザー\",\"Hbhyg2\":\"users followed by <0/>\",\"9k1aoj\":[\"Users in \\\"\",[\"0\"],\"\\\"\"],\"MBOY4U\":\"Eメールを確認\",\"Ejyv0o\":\"Eメールを確認\",\"9czCrB\":\"Eメールを確認\",\"ibSVGR\":\"新しいEメールを確認\",\"nHsQde\":\"欠陥事項を表示\",\"47jzzd\":\"アバターを表示\",\"wK4H1r\":\"サイトへアクセス\",\"qjBGxf\":\"あなたが参加してくれることをとても楽しみにしています!\",\"WBQOQ0\":\"申し訳ありませんが、検索を完了できませんでした。数分後に再試行してください。\",\"/mVVX2\":\"申し訳ありません! お探しのページが見つかりません。\",\"meB+tZ\":\"<0>Blueskyへようこそ\",\"Mj7rl/\":[\"この\\\\\",[\"collectionName\"],\"の問題は何ですか?\"],\"3qn29J\":\"この投稿ではどの言語が使われていますか?\",\"uawiGa\":\"アルゴリズムフィードに表示する言語を選択しますか?\",\"yvDWMs\":\"Who can reply\",\"I5S9ZE\":\"ワイド\",\"y02THm\":\"投稿を書く\",\"6ckZRB\":\"返信を書く\",\"l75CjT\":\"はい\",\"STPj0e\":\"ホスティングプロバイダはいつでも変更できます。\",\"67nRLM\":\"新しいパスワードでサインインできるようになりました。\",\"lIcbCU\":\"まだ招待コードがありません!Blueskyをもうしばらく利用したらお送りします。\",\"aFZZYi\":\"ピンで固定されたフィードがありません。\",\"kX/cKs\":\"保存されたフィードがありません!\",\"nbz3Iq\":\"保存されたフィードがありません。\",\"RkXibf\":\"著者をブロックしたか、または著者によってブロックされました。\",\"CbrOgr\":\"You have no feeds.\",\"tCLJ9E\":\"リストがありません。\",\"soH9qC\":\"ブロックしているアカウントはまだありません。アカウントをブロックするには、ユーザーのプロフィールに移動し、アカウントメニューから「アカウントをブロック」を選択します。\",\"NDgp3i\":\"アプリパスワードはまだ作成されていません。 下のボタンを押すと作成できます。\",\"grqdXb\":\"ミュートしているアカウントはまだありません。アカウントをミュートするには、プロフィールに移動し、アカウントメニューから「アカウントをミュート」を選択します。\",\"RrDyEb\":\"「リセットコード」が記載されたEメールが届きます。ここにコードを入力し、新しいパスワードを入力します。\",\"gdRnT7\":\"アカウント\",\"k7hmsH\":\"生年月日\",\"tBpzKB\":\"Eメールが無効なようです。\",\"OubkcP\":\"Eメールが保存されました!すぐにご連絡いたします。\",\"z2L+/9\":\"Eメールは更新されましたが、確認されていません。次のステップとして、新しいEメールを確認してください。\",\"XZlIVw\":\"Eメールはまだ確認されていません。これは、当社が推奨する重要なセキュリティステップです。\",\"qv9f4I\":\"フルハンドルは\",\"lvcqqG\":\"ホスティングプロバイダー\",\"fbFyAZ\":\"Your invite codes are hidden when logged in using an App Password\",\"Oqt/PG\":\"投稿、いいね、ブロックは公開されます。ミュートはプライベートです。\",\"okRPtW\":\"プロフィール\",\"ogY7EU\":\"Your profile and posts will not be visible to people visiting the Bluesky app or website without having an account and being logged in.\",\"MvWO9d\":\"ユーザーハンドル\"}")}; \ No newline at end of file diff --git a/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx b/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx index d5bb38fb2e..27aa804d35 100644 --- a/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx +++ b/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx @@ -6,22 +6,28 @@ import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {AppBskyEmbedExternal} from '@atproto/api' import {toNiceDomain} from 'lib/strings/url-helpers' +import {parseEmbedPlayerFromUrl} from 'lib/strings/embed-player' +import {ExternalPlayer} from 'view/com/util/post-embeds/ExternalPlayerEmbed' export const ExternalLinkEmbed = ({ link, - imageChild, }: { link: AppBskyEmbedExternal.ViewExternal - imageChild?: React.ReactNode }) => { const pal = usePalette('default') const {isMobile} = useWebMediaQueries() + + const embedPlayerParams = React.useMemo( + () => parseEmbedPlayerFromUrl(link.uri), + [link.uri], + ) + return ( - {link.thumb ? ( + {link.thumb && !embedPlayerParams ? ( - {imageChild} ) : undefined} + {embedPlayerParams && ( + + )} void +}) { + // If the player is active and not loading, we don't want to show the overlay. + if (isPlayerActive && !isLoading) return null + + return ( + + + {!isPlayerActive ? ( + + ) : ( + + )} + + + ) +} + +// This renders the webview/youtube player as a separate layer +function Player({ + height, + params, + onLoad, + isPlayerActive, +}: { + isPlayerActive: boolean + params: EmbedPlayerParams + height: number + onLoad: () => void +}) { + // ensures we only load what's requested + const onShouldStartLoadWithRequest = React.useCallback( + (event: ShouldStartLoadRequest) => event.url === params.playerUri, + [params.playerUri], + ) + + // Don't show the player until it is active + if (!isPlayerActive) return null + + return ( + + + {isNative && params.type === 'youtube_video' ? ( + + ) : ( + + + + )} + + + ) +} + +// This renders the player area and handles the logic for when to show the player and when to show the overlay +export function ExternalPlayer({ + link, + params, +}: { + link: AppBskyEmbedExternal.ViewExternal + params: EmbedPlayerParams +}) { + const navigation = useNavigation() + + const [isPlayerActive, setPlayerActive] = React.useState(false) + const [isLoading, setIsLoading] = React.useState(true) + const [dim, setDim] = React.useState({ + width: 0, + height: 0, + }) + + const viewRef = React.useRef(null) + + // watch for leaving the viewport due to scrolling + React.useEffect(() => { + // Interval for scrolling works in most cases, However, for twitch embeds, if we navigate away from the screen the webview will + // continue playing. We need to watch for the blur event + const unsubscribe = navigation.addListener('blur', () => { + setPlayerActive(false) + }) + + const interval = setInterval(() => { + viewRef.current?.measure((x, y, w, h, pageX, pageY) => { + const window = Dimensions.get('window') + const top = pageY + const bot = pageY + h + const isVisible = isNative + ? top >= 0 && bot <= window.height + : !(top >= window.height || bot <= 0) + if (!isVisible) { + setPlayerActive(false) + } + }) + }, 1e3) + return () => { + unsubscribe() + clearInterval(interval) + } + }, [viewRef, navigation]) + + // calculate height for the player and the screen size + const height = React.useMemo( + () => + getPlayerHeight({ + type: params.type, + width: dim.width, + hasThumb: !!link.thumb, + }), + [params.type, dim.width, link.thumb], + ) + + const onLoad = React.useCallback(() => { + setIsLoading(false) + }, []) + + const onPlayPress = React.useCallback((event: GestureResponderEvent) => { + // Prevent this from propagating upward on web + event.preventDefault() + + setPlayerActive(true) + }, []) + + // measure the layout to set sizing + const onLayout = React.useCallback( + (event: {nativeEvent: {layout: {width: any; height: any}}}) => { + setDim({ + width: event.nativeEvent.layout.width, + height: event.nativeEvent.layout.height, + }) + }, + [], + ) + + return ( + + {link.thumb && (!isPlayerActive || isLoading) && ( + + )} + + + + + ) +} + +const styles = StyleSheet.create({ + topRadius: { + borderTopLeftRadius: 6, + borderTopRightRadius: 6, + }, + layer: { + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + }, + overlayContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: 'rgba(0,0,0,0.5)', + }, + overlayLayer: { + zIndex: 2, + }, + playerLayer: { + zIndex: 3, + }, + webview: { + backgroundColor: 'transparent', + }, +}) diff --git a/src/view/com/util/post-embeds/YoutubeEmbed.tsx b/src/view/com/util/post-embeds/YoutubeEmbed.tsx deleted file mode 100644 index 2f2da5662a..0000000000 --- a/src/view/com/util/post-embeds/YoutubeEmbed.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import React from 'react' -import {StyleProp, StyleSheet, View, ViewStyle} from 'react-native' -import {usePalette} from 'lib/hooks/usePalette' -import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' -import {ExternalLinkEmbed} from './ExternalLinkEmbed' -import {AppBskyEmbedExternal} from '@atproto/api' -import {Link} from '../Link' - -export const YoutubeEmbed = ({ - link, - style, -}: { - link: AppBskyEmbedExternal.ViewExternal - style?: StyleProp -}) => { - const pal = usePalette('default') - - const imageChild = ( - - - - ) - - return ( - - - - ) -} - -const styles = StyleSheet.create({ - extOuter: { - borderWidth: 1, - borderRadius: 8, - }, - playButton: { - position: 'absolute', - alignSelf: 'center', - alignItems: 'center', - top: '44%', - justifyContent: 'center', - backgroundColor: 'black', - padding: 10, - borderRadius: 50, - opacity: 0.8, - }, - webView: { - alignItems: 'center', - alignContent: 'center', - justifyContent: 'center', - }, -}) diff --git a/src/view/com/util/post-embeds/index.tsx b/src/view/com/util/post-embeds/index.tsx index 2814cad878..c94ce9684d 100644 --- a/src/view/com/util/post-embeds/index.tsx +++ b/src/view/com/util/post-embeds/index.tsx @@ -23,9 +23,7 @@ import {ImageLayoutGrid} from '../images/ImageLayoutGrid' import {useLightboxControls, ImagesLightbox} from '#/state/lightbox' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' -import {YoutubeEmbed} from './YoutubeEmbed' import {ExternalLinkEmbed} from './ExternalLinkEmbed' -import {getYoutubeVideoId} from 'lib/strings/url-helpers' import {MaybeQuoteEmbed} from './QuoteEmbed' import {AutoSizedImage} from '../images/AutoSizedImage' import {ListEmbed} from './ListEmbed' @@ -168,19 +166,13 @@ export function PostEmbeds({ // = if (AppBskyEmbedExternal.isView(embed)) { const link = embed.external - const youtubeVideoId = getYoutubeVideoId(link.uri) - - if (youtubeVideoId) { - return - } return ( - - - + + + + + ) } diff --git a/yarn.lock b/yarn.lock index 8866537e7b..a16a73c7bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10433,16 +10433,16 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -12501,7 +12501,7 @@ interpret@^3.1.1: resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== -invariant@*, invariant@^2.2.4: +invariant@*, invariant@2.2.4, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -17330,6 +17330,13 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +qs@^6.5.1: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + query-string@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" @@ -17680,6 +17687,13 @@ react-native-web-linear-gradient@^1.1.2: resolved "https://registry.yarnpkg.com/react-native-web-linear-gradient/-/react-native-web-linear-gradient-1.1.2.tgz#33f85f7085a0bb5ffa5106faf02ed105b92a9ed7" integrity sha512-SmUnpwT49CEe78pXvIvYf72Es8Pv+ZYKCnEOgb2zAKpEUDMo0+xElfRJhwt5nfI8krJ5WbFPKnoDgD0uUjAN1A== +react-native-web-webview@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/react-native-web-webview/-/react-native-web-webview-1.0.2.tgz#c215efa70c17589f2c8d640b1f1dc669b18c6e02" + integrity sha512-oNAYNuqUqeqTuAAdIejzDqvUtYA+k5lrvhUYmASdUznZNmyIaoQFA6OKoA4K9F3wdMvark42vUXkUWIp875ewg== + dependencies: + qs "^6.5.1" + react-native-web@~0.19.6: version "0.19.8" resolved "https://registry.yarnpkg.com/react-native-web/-/react-native-web-0.19.8.tgz#46127f8b310148fde11e4fef67fe625603599d47" @@ -17694,6 +17708,21 @@ react-native-web@~0.19.6: postcss-value-parser "^4.2.0" styleq "^0.1.3" +react-native-webview@^13.6.2: + version "13.6.2" + resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.6.2.tgz#0a9b18793e915add5b5dbdbf32509d7751b49167" + integrity sha512-QzhQ5JCU+Nf2W285DtvCZOVQy/MkJXMwNDYPZvOWQbAOgxJMSSO+BtqXTMA1UPugDsko6PxJ0TxSlUwIwJijDg== + dependencies: + escape-string-regexp "2.0.0" + invariant "2.2.4" + +react-native-youtube-iframe@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-native-youtube-iframe/-/react-native-youtube-iframe-2.3.0.tgz#40ca8e55db929b91bfa8e8d30e411658cbc304c5" + integrity sha512-M+z63xwXVtS4dX3k8PbtHUUcWN+gRZt6J1EtPE7Y60BMOB979KjpkdrHqeR96or9pNR2W8K5tQhIkMXW2jwo7Q== + dependencies: + events "^3.2.0" + react-native@0.72.5: version "0.72.5" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.72.5.tgz#2c343fa6f3ead362cf07376634a33a4078864357" From 987c543727dd4d816987148ec3ccdb4337d601ac Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 21 Dec 2023 16:43:57 -0600 Subject: [PATCH 4/7] Increase log dump to 500, dump everything in there (#2268) --- src/logger/index.ts | 12 +++++++----- src/logger/logDump.ts | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/logger/index.ts b/src/logger/index.ts index dd0380f6ed..d6d8d9fc1d 100644 --- a/src/logger/index.ts +++ b/src/logger/index.ts @@ -287,15 +287,11 @@ export class Logger { metadata: Metadata = {}, ) { if (!this.enabled) return - if (!enabledLogLevels[this.level].includes(level)) return const timestamp = Date.now() const meta = metadata || {} - for (const transport of this.transports) { - transport(level, message, meta, timestamp) - } - + // send every log to syslog add({ id: nanoid(), timestamp, @@ -303,6 +299,12 @@ export class Logger { message, metadata: meta, }) + + if (!enabledLogLevels[this.level].includes(level)) return + + for (const transport of this.transports) { + transport(level, message, meta, timestamp) + } } } diff --git a/src/logger/logDump.ts b/src/logger/logDump.ts index ec64bf4bd2..563b12aa46 100644 --- a/src/logger/logDump.ts +++ b/src/logger/logDump.ts @@ -4,7 +4,7 @@ let entries: ConsoleTransportEntry[] = [] export function add(entry: ConsoleTransportEntry) { entries.unshift(entry) - entries = entries.slice(0, 50) + entries = entries.slice(0, 500) } export function getEntries() { From bc31da47fdcb4c1704c96b0083f8e5429475da4e Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 21 Dec 2023 22:56:45 +0000 Subject: [PATCH 5/7] Consolidate List props a bit (#2216) --- src/view/com/feeds/ProfileFeedgens.tsx | 23 ++----- src/view/com/lists/ListMembers.tsx | 17 +---- src/view/com/lists/MyLists.tsx | 70 +++++++++++++-------- src/view/com/lists/ProfileLists.tsx | 23 ++----- src/view/com/notifications/Feed.tsx | 14 +---- src/view/com/post-thread/PostLikedBy.tsx | 14 +---- src/view/com/post-thread/PostRepostedBy.tsx | 14 +---- src/view/com/post-thread/PostThread.tsx | 11 +--- src/view/com/posts/Feed.tsx | 17 +---- src/view/com/profile/ProfileFollowers.tsx | 14 +---- src/view/com/profile/ProfileFollows.tsx | 14 +---- src/view/com/util/List.tsx | 45 ++++++++++++- src/view/screens/Feeds.tsx | 12 +--- src/view/screens/Search/Search.tsx | 12 +--- 14 files changed, 123 insertions(+), 177 deletions(-) diff --git a/src/view/com/feeds/ProfileFeedgens.tsx b/src/view/com/feeds/ProfileFeedgens.tsx index ff65055011..8665fbfacf 100644 --- a/src/view/com/feeds/ProfileFeedgens.tsx +++ b/src/view/com/feeds/ProfileFeedgens.tsx @@ -1,12 +1,5 @@ import React from 'react' -import { - Dimensions, - RefreshControl, - StyleProp, - StyleSheet, - View, - ViewStyle, -} from 'react-native' +import {Dimensions, StyleProp, StyleSheet, View, ViewStyle} from 'react-native' import {useQueryClient} from '@tanstack/react-query' import {List, ListRef} from '../util/List' import {FeedSourceCardLoaded} from './FeedSourceCard' @@ -180,22 +173,14 @@ export const ProfileFeedgens = React.forwardRef< data={items} keyExtractor={(item: any) => item._reactKey || item.uri} renderItem={renderItemInner} - refreshControl={ - - } + refreshing={isPTRing} + onRefresh={onRefresh} + headerOffset={headerOffset} contentContainerStyle={{ minHeight: Dimensions.get('window').height * 1.5, }} - style={{paddingTop: headerOffset}} indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'} removeClippedSubviews={true} - contentOffset={{x: 0, y: headerOffset * -1}} // @ts-ignore our .web version only -prf desktopFixedHeight onEndReached={onEndReached} diff --git a/src/view/com/lists/ListMembers.tsx b/src/view/com/lists/ListMembers.tsx index a31ca47936..2aef7d766e 100644 --- a/src/view/com/lists/ListMembers.tsx +++ b/src/view/com/lists/ListMembers.tsx @@ -2,7 +2,6 @@ import React from 'react' import { ActivityIndicator, Dimensions, - RefreshControl, StyleProp, View, ViewStyle, @@ -15,7 +14,6 @@ import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' import {ProfileCard} from '../profile/ProfileCard' import {Button} from '../util/forms/Button' import {useAnalytics} from 'lib/analytics/analytics' -import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {useListMembersQuery} from '#/state/queries/list-members' import {logger} from '#/logger' @@ -51,7 +49,6 @@ export function ListMembers({ headerOffset?: number desktopFixedHeightOffset?: number }) { - const pal = usePalette('default') const {track} = useAnalytics() const [isRefreshing, setIsRefreshing] = React.useState(false) const {isMobile} = useWebMediaQueries() @@ -215,24 +212,16 @@ export function ListMembers({ renderItem={renderItem} ListHeaderComponent={renderHeader} ListFooterComponent={Footer} - refreshControl={ - - } + refreshing={isRefreshing} + onRefresh={onRefresh} + headerOffset={headerOffset} contentContainerStyle={{ minHeight: Dimensions.get('window').height * 1.5, }} - style={{paddingTop: headerOffset}} onScrolledDownChange={onScrolledDownChange} onEndReached={onEndReached} onEndReachedThreshold={0.6} removeClippedSubviews={true} - contentOffset={{x: 0, y: headerOffset * -1}} // @ts-ignore our .web version only -prf desktopFixedHeight={desktopFixedHeightOffset || true} /> diff --git a/src/view/com/lists/MyLists.tsx b/src/view/com/lists/MyLists.tsx index 586ad234e9..a2a6b06511 100644 --- a/src/view/com/lists/MyLists.tsx +++ b/src/view/com/lists/MyLists.tsx @@ -119,31 +119,51 @@ export function MyLists({ [error, onRefresh, renderItem, pal], ) - const FlatListCom = inline ? RNFlatList : List - return ( - - {items.length > 0 && ( - (item.uri ? item.uri : item._reactKey)} - renderItem={renderItemInner} - refreshControl={ - - } - contentContainerStyle={[s.contentContainer]} - removeClippedSubviews={true} - // @ts-ignore our .web version only -prf - desktopFixedHeight - /> - )} - - ) + if (inline) { + return ( + + {items.length > 0 && ( + (item.uri ? item.uri : item._reactKey)} + renderItem={renderItemInner} + refreshControl={ + + } + contentContainerStyle={[s.contentContainer]} + removeClippedSubviews={true} + // @ts-ignore our .web version only -prf + desktopFixedHeight + /> + )} + + ) + } else { + return ( + + {items.length > 0 && ( + (item.uri ? item.uri : item._reactKey)} + renderItem={renderItemInner} + refreshing={isPTRing} + onRefresh={onRefresh} + contentContainerStyle={[s.contentContainer]} + removeClippedSubviews={true} + // @ts-ignore our .web version only -prf + desktopFixedHeight + /> + )} + + ) + } } const styles = StyleSheet.create({ diff --git a/src/view/com/lists/ProfileLists.tsx b/src/view/com/lists/ProfileLists.tsx index e3d9bd0b43..db981717f1 100644 --- a/src/view/com/lists/ProfileLists.tsx +++ b/src/view/com/lists/ProfileLists.tsx @@ -1,12 +1,5 @@ import React from 'react' -import { - Dimensions, - RefreshControl, - StyleProp, - StyleSheet, - View, - ViewStyle, -} from 'react-native' +import {Dimensions, StyleProp, StyleSheet, View, ViewStyle} from 'react-native' import {useQueryClient} from '@tanstack/react-query' import {List, ListRef} from '../util/List' import {ListCard} from './ListCard' @@ -182,22 +175,14 @@ export const ProfileLists = React.forwardRef( data={items} keyExtractor={(item: any) => item._reactKey} renderItem={renderItemInner} - refreshControl={ - - } + refreshing={isPTRing} + onRefresh={onRefresh} + headerOffset={headerOffset} contentContainerStyle={{ minHeight: Dimensions.get('window').height * 1.5, }} - style={{paddingTop: headerOffset}} indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'} removeClippedSubviews={true} - contentOffset={{x: 0, y: headerOffset * -1}} // @ts-ignore our .web version only -prf desktopFixedHeight onEndReached={onEndReached} diff --git a/src/view/com/notifications/Feed.tsx b/src/view/com/notifications/Feed.tsx index 52d534c4fd..a99fe2c1dd 100644 --- a/src/view/com/notifications/Feed.tsx +++ b/src/view/com/notifications/Feed.tsx @@ -1,13 +1,12 @@ import React from 'react' import {CenteredView} from '../util/Views' -import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' +import {ActivityIndicator, 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 {s} from 'lib/styles' -import {usePalette} from 'lib/hooks/usePalette' import {useNotificationFeedQuery} from '#/state/queries/notifications/feed' import {useUnreadNotificationsApi} from '#/state/queries/notifications/unread' import {logger} from '#/logger' @@ -30,7 +29,6 @@ export function Feed({ onScrolledDownChange: (isScrolledDown: boolean) => void ListHeaderComponent?: () => JSX.Element }) { - const pal = usePalette('default') const [isPTRing, setIsPTRing] = React.useState(false) const moderationOpts = useModerationOpts() @@ -152,14 +150,8 @@ export function Feed({ renderItem={renderItem} ListHeaderComponent={ListHeaderComponent} ListFooterComponent={FeedFooter} - refreshControl={ - - } + refreshing={isPTRing} + onRefresh={onRefresh} onEndReached={onEndReached} onEndReachedThreshold={0.6} onScrolledDownChange={onScrolledDownChange} diff --git a/src/view/com/post-thread/PostLikedBy.tsx b/src/view/com/post-thread/PostLikedBy.tsx index 245ba59e8c..6e013f6115 100644 --- a/src/view/com/post-thread/PostLikedBy.tsx +++ b/src/view/com/post-thread/PostLikedBy.tsx @@ -1,18 +1,16 @@ import React, {useCallback, useMemo, useState} from 'react' -import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' +import {ActivityIndicator, StyleSheet, View} from 'react-native' import {AppBskyFeedGetLikes as GetLikes} from '@atproto/api' 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' import {logger} from '#/logger' import {useResolveUriQuery} from '#/state/queries/resolve-uri' import {usePostLikedByQuery} from '#/state/queries/post-liked-by' import {cleanError} from '#/lib/strings/errors' export function PostLikedBy({uri}: {uri: string}) { - const pal = usePalette('default') const [isPTRing, setIsPTRing] = useState(false) const { data: resolvedUri, @@ -88,14 +86,8 @@ export function PostLikedBy({uri}: {uri: string}) { item.actor.did} - refreshControl={ - - } + refreshing={isPTRing} + onRefresh={onRefresh} onEndReached={onEndReached} renderItem={renderItem} initialNumToRender={15} diff --git a/src/view/com/post-thread/PostRepostedBy.tsx b/src/view/com/post-thread/PostRepostedBy.tsx index 5cc0063885..a2d3be5583 100644 --- a/src/view/com/post-thread/PostRepostedBy.tsx +++ b/src/view/com/post-thread/PostRepostedBy.tsx @@ -1,18 +1,16 @@ import React, {useMemo, useCallback, useState} from 'react' -import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' +import {ActivityIndicator, StyleSheet, View} from 'react-native' import {AppBskyActorDefs as ActorDefs} from '@atproto/api' 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' import {logger} from '#/logger' import {useResolveUriQuery} from '#/state/queries/resolve-uri' import {usePostRepostedByQuery} from '#/state/queries/post-reposted-by' import {cleanError} from '#/lib/strings/errors' export function PostRepostedBy({uri}: {uri: string}) { - const pal = usePalette('default') const [isPTRing, setIsPTRing] = useState(false) const { data: resolvedUri, @@ -89,14 +87,8 @@ export function PostRepostedBy({uri}: {uri: string}) { item.did} - refreshControl={ - - } + refreshing={isPTRing} + onRefresh={onRefresh} onEndReached={onEndReached} renderItem={renderItem} initialNumToRender={15} diff --git a/src/view/com/post-thread/PostThread.tsx b/src/view/com/post-thread/PostThread.tsx index 9175508847..6cd1f35519 100644 --- a/src/view/com/post-thread/PostThread.tsx +++ b/src/view/com/post-thread/PostThread.tsx @@ -2,7 +2,6 @@ import React, {useEffect, useRef} from 'react' import { ActivityIndicator, Pressable, - RefreshControl, StyleSheet, TouchableOpacity, View, @@ -349,14 +348,8 @@ function PostThreadLoaded({ } keyExtractor={item => item._reactKey} renderItem={renderItem} - refreshControl={ - - } + refreshing={isPTRing} + onRefresh={onPTR} onContentSizeChange={onContentSizeChange} style={s.hContentRegion} // @ts-ignore our .web version only -prf diff --git a/src/view/com/posts/Feed.tsx b/src/view/com/posts/Feed.tsx index 8d5c11bdad..3d38fbbc50 100644 --- a/src/view/com/posts/Feed.tsx +++ b/src/view/com/posts/Feed.tsx @@ -3,7 +3,6 @@ import { ActivityIndicator, AppState, Dimensions, - RefreshControl, StyleProp, StyleSheet, View, @@ -16,7 +15,6 @@ import {FeedErrorMessage} from './FeedErrorMessage' import {FeedSlice} from './FeedSlice' import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' import {useAnalytics} from 'lib/analytics/analytics' -import {usePalette} from 'lib/hooks/usePalette' import {useTheme} from 'lib/ThemeContext' import {logger} from '#/logger' import { @@ -74,7 +72,6 @@ let Feed = ({ ListHeaderComponent?: () => JSX.Element extraData?: any }): React.ReactNode => { - const pal = usePalette('default') const theme = useTheme() const {track} = useAnalytics() const queryClient = useQueryClient() @@ -294,25 +291,17 @@ let Feed = ({ renderItem={renderItem} ListFooterComponent={FeedFooter} ListHeaderComponent={ListHeaderComponent} - refreshControl={ - - } + refreshing={isPTRing} + onRefresh={onRefresh} + headerOffset={headerOffset} contentContainerStyle={{ minHeight: Dimensions.get('window').height * 1.5, }} - style={{paddingTop: headerOffset}} onScrolledDownChange={onScrolledDownChange} indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'} onEndReached={onEndReached} onEndReachedThreshold={2} // number of posts left to trigger load more removeClippedSubviews={true} - contentOffset={{x: 0, y: headerOffset * -1}} extraData={extraData} // @ts-ignore our .web version only -prf desktopFixedHeight={ diff --git a/src/view/com/profile/ProfileFollowers.tsx b/src/view/com/profile/ProfileFollowers.tsx index 077dabe53a..fd8dee173e 100644 --- a/src/view/com/profile/ProfileFollowers.tsx +++ b/src/view/com/profile/ProfileFollowers.tsx @@ -1,18 +1,16 @@ import React from 'react' -import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' +import {ActivityIndicator, StyleSheet, View} from 'react-native' import {AppBskyActorDefs as ActorDefs} from '@atproto/api' 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' import {useProfileFollowersQuery} from '#/state/queries/profile-followers' import {useResolveDidQuery} from '#/state/queries/resolve-uri' import {logger} from '#/logger' import {cleanError} from '#/lib/strings/errors' export function ProfileFollowers({name}: {name: string}) { - const pal = usePalette('default') const [isPTRing, setIsPTRing] = React.useState(false) const { data: resolvedDid, @@ -90,14 +88,8 @@ export function ProfileFollowers({name}: {name: string}) { item.did} - refreshControl={ - - } + refreshing={isPTRing} + onRefresh={onRefresh} onEndReached={onEndReached} renderItem={renderItem} initialNumToRender={15} diff --git a/src/view/com/profile/ProfileFollows.tsx b/src/view/com/profile/ProfileFollows.tsx index 5265ee07ea..091922dd90 100644 --- a/src/view/com/profile/ProfileFollows.tsx +++ b/src/view/com/profile/ProfileFollows.tsx @@ -1,18 +1,16 @@ import React from 'react' -import {ActivityIndicator, RefreshControl, StyleSheet, View} from 'react-native' +import {ActivityIndicator, StyleSheet, View} from 'react-native' import {AppBskyActorDefs as ActorDefs} from '@atproto/api' 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' import {useProfileFollowsQuery} from '#/state/queries/profile-follows' import {useResolveDidQuery} from '#/state/queries/resolve-uri' import {logger} from '#/logger' import {cleanError} from '#/lib/strings/errors' export function ProfileFollows({name}: {name: string}) { - const pal = usePalette('default') const [isPTRing, setIsPTRing] = React.useState(false) const { data: resolvedDid, @@ -90,14 +88,8 @@ export function ProfileFollows({name}: {name: string}) { item.did} - refreshControl={ - - } + refreshing={isPTRing} + onRefresh={onRefresh} onEndReached={onEndReached} renderItem={renderItem} initialNumToRender={15} diff --git a/src/view/com/util/List.tsx b/src/view/com/util/List.tsx index 2acc3f4b30..9abd7d35a6 100644 --- a/src/view/com/util/List.tsx +++ b/src/view/com/util/List.tsx @@ -1,27 +1,42 @@ import React, {memo, startTransition} from 'react' -import {FlatListProps} from 'react-native' +import {FlatListProps, RefreshControl} from 'react-native' import {FlatList_INTERNAL} from './Views' +import {addStyle} from 'lib/styles' import {useScrollHandlers} from '#/lib/ScrollContext' import {runOnJS, useSharedValue} from 'react-native-reanimated' import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' +import {usePalette} from '#/lib/hooks/usePalette' export type ListMethods = FlatList_INTERNAL export type ListProps = Omit< FlatListProps, - 'onScroll' // Use ScrollContext instead. + | 'onScroll' // Use ScrollContext instead. + | 'refreshControl' // Pass refreshing and/or onRefresh instead. + | 'contentOffset' // Pass headerOffset instead. > & { onScrolledDownChange?: (isScrolledDown: boolean) => void + headerOffset?: number + refreshing?: boolean + onRefresh?: () => void } export type ListRef = React.MutableRefObject const SCROLLED_DOWN_LIMIT = 200 function ListImpl( - {onScrolledDownChange, ...props}: ListProps, + { + onScrolledDownChange, + refreshing, + onRefresh, + headerOffset, + style, + ...props + }: ListProps, ref: React.Ref, ) { const isScrolledDown = useSharedValue(false) const contextScrollHandlers = useScrollHandlers() + const pal = usePalette('default') function handleScrolledDownChange(didScrollDown: boolean) { startTransition(() => { @@ -49,12 +64,36 @@ function ListImpl( }, }) + let refreshControl + if (refreshing !== undefined || onRefresh !== undefined) { + refreshControl = ( + + ) + } + + let contentOffset + if (headerOffset != null) { + style = addStyle(style, { + paddingTop: headerOffset, + }) + contentOffset = {x: 0, y: headerOffset * -1} + } + return ( ) diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx index 1c8bdf9f0c..20cdf815ae 100644 --- a/src/view/screens/Feeds.tsx +++ b/src/view/screens/Feeds.tsx @@ -1,5 +1,5 @@ import React from 'react' -import {ActivityIndicator, StyleSheet, View, RefreshControl} from 'react-native' +import {ActivityIndicator, StyleSheet, View} from 'react-native' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {FontAwesomeIconStyle} from '@fortawesome/react-native-fontawesome' import {ViewHeader} from 'view/com/util/ViewHeader' @@ -487,14 +487,8 @@ export function FeedsScreen(_props: Props) { keyExtractor={item => item.key} contentContainerStyle={styles.contentContainer} renderItem={renderItem} - refreshControl={ - - } + refreshing={isPTR} + onRefresh={isUserSearching ? undefined : onPullToRefresh} initialNumToRender={10} onEndReached={onEndReached} // @ts-ignore our .web version only -prf diff --git a/src/view/screens/Search/Search.tsx b/src/view/screens/Search/Search.tsx index efd8507a7e..60fd216749 100644 --- a/src/view/screens/Search/Search.tsx +++ b/src/view/screens/Search/Search.tsx @@ -3,7 +3,6 @@ import { View, StyleSheet, ActivityIndicator, - RefreshControl, TextInput, Pressable, Platform, @@ -185,7 +184,6 @@ type SearchResultSlice = function SearchScreenPostResults({query}: {query: string}) { const {_} = useLingui() - const pal = usePalette('default') const [isPTR, setIsPTR] = React.useState(false) const { isFetched, @@ -254,14 +252,8 @@ function SearchScreenPostResults({query}: {query: string}) { } }} keyExtractor={item => item.key} - refreshControl={ - - } + refreshing={isPTR} + onRefresh={onPullToRefresh} onEndReached={onEndReached} // @ts-ignore web only -prf desktopFixedHeight From 64dc8ff34245f602fbf2c207dac7c5865bef541b Mon Sep 17 00:00:00 2001 From: Bryan Lumbantobing <46083126+bryanltobing@users.noreply.github.com> Date: Fri, 22 Dec 2023 06:58:42 +0800 Subject: [PATCH 6/7] Update localization.md (#2263) --- docs/localization.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/localization.md b/docs/localization.md index b3dce7b418..0de2447952 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -32,7 +32,7 @@ import { Text } from "react-native"; const text = "Hello World"; {text} ``` -In this case, you cannot use the `useLingui()` hook: +In this case, you can use the `useLingui()` hook: ```jsx import { msg } from "@lingui/macro"; import { useLingui } from "@lingui/react"; @@ -116,4 +116,4 @@ export function Welcome() { ### 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 +If you would like to translate the Bluesky app into your language, please open a PR or issue on this repo. From a5c151c04177e539543b6ad3e9c4504efc722468 Mon Sep 17 00:00:00 2001 From: bnewbold Date: Fri, 22 Dec 2023 17:07:25 +0100 Subject: [PATCH 7/7] bskyweb: iterate on RSS format, based on feedback (#2269) Thanks to Dave Winer (@scripting)! --- bskyweb/cmd/bskyweb/rss.go | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/bskyweb/cmd/bskyweb/rss.go b/bskyweb/cmd/bskyweb/rss.go index f7caf8fe75..cf7b24346b 100644 --- a/bskyweb/cmd/bskyweb/rss.go +++ b/bskyweb/cmd/bskyweb/rss.go @@ -1,8 +1,10 @@ package main import ( + "encoding/xml" "fmt" "net/http" + "time" appbsky "github.com/bluesky-social/indigo/api/bsky" "github.com/bluesky-social/indigo/atproto/syntax" @@ -10,6 +12,12 @@ import ( "github.com/labstack/echo/v4" ) +type ItemGUID struct { + XMLName xml.Name `xml:"guid"` + Value string `xml:",chardata"` + IsPerma bool `xml:"isPermalink,attr"` +} + // We don't actually populate the title for "posts". // Some background: https://book.micro.blog/rss-for-microblogs/ type Item struct { @@ -17,8 +25,7 @@ type Item struct { Link string `xml:"link,omitempty"` Description string `xml:"description,omitempty"` PubDate string `xml:"pubDate,omitempty"` - Author string `xml:"author,omitempty"` - GUID string `xml:"guid,omitempty"` + GUID ItemGUID } type rss struct { @@ -71,12 +78,19 @@ func (srv *Server) WebProfileRSS(c echo.Context) error { if rec.Reply != nil { continue } + pubDate := "" + createdAt, err := syntax.ParseDatetimeLenient(rec.CreatedAt) + if nil == err { + pubDate = createdAt.Time().Format(time.RFC822Z) + } posts = append(posts, Item{ Link: fmt.Sprintf("https://bsky.app/profile/%s/post/%s", pv.Handle, aturi.RecordKey().String()), Description: rec.Text, - PubDate: rec.CreatedAt, - Author: "@" + pv.Handle, - GUID: aturi.String(), + PubDate: pubDate, + GUID: ItemGUID{ + Value: aturi.String(), + IsPerma: false, + }, }) }