From 34817628e12d9bce2ba4136e192e3163d7aa0eee Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Thu, 4 Jan 2024 17:33:57 -0800 Subject: [PATCH 1/9] E2E runner fixes (#2428) * Fix mock-server run script * Bump detox * Replace fetch with node-native api --- __e2e__/util.ts | 27 ++++++++++++++++++--- package.json | 4 ++-- tsconfig.e2e.json | 46 +++++++++++++++++++++++++++++++++++ yarn.lock | 61 +++++++++++++++++++++++++++++++++++++++++------ 4 files changed, 126 insertions(+), 12 deletions(-) create mode 100644 tsconfig.e2e.json diff --git a/__e2e__/util.ts b/__e2e__/util.ts index f6f3b1b806..c5668d042e 100644 --- a/__e2e__/util.ts +++ b/__e2e__/util.ts @@ -1,5 +1,6 @@ import {resolveConfig} from 'detox/internals' import {execSync} from 'child_process' +import http from 'http' const platform = device.getPlatform() @@ -105,9 +106,29 @@ async function openAppForDebugBuild(platform: string, opts: any) { } export async function createServer(path = '') { - const res = await fetch(`http://localhost:1986/${path}`, {method: 'POST'}) - const resBody = await res.text() - return resBody + return new Promise(function (resolve, reject) { + var req = http.request( + { + method: 'POST', + host: 'localhost', + port: 1986, + path: `/${path}`, + }, + function (res) { + const body: Buffer[] = [] + res.on('data', chunk => body.push(chunk)) + res.on('end', function () { + try { + resolve(Buffer.concat(body).toString()) + } catch (e) { + reject(e) + } + }) + }, + ) + req.on('error', reject) + req.end() + }) } const getDeepLinkUrl = (url: string) => diff --git a/package.json b/package.json index c8052e0410..e29b4ff1ff 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "test-coverage": "NODE_ENV=test jest --coverage", "lint": "eslint ./src --ext .js,.jsx,.ts,.tsx", "typecheck": "tsc --project ./tsconfig.check.json", - "e2e:mock-server": "./jest/dev-infra/with-test-redis-and-db.sh ts-node __e2e__/mock-server.ts", + "e2e:mock-server": "./jest/dev-infra/with-test-redis-and-db.sh ts-node --project tsconfig.e2e.json __e2e__/mock-server.ts", "e2e:metro": "NODE_ENV=test RN_SRC_EXT=e2e.ts,e2e.tsx expo run:ios", "e2e:build": "NODE_ENV=test detox build -c ios.sim.debug", "e2e:run": "NODE_ENV=test detox test --configuration ios.sim.debug --take-screenshots all", @@ -215,7 +215,7 @@ "babel-plugin-module-resolver": "^5.0.0", "babel-plugin-react-native-web": "^0.18.12", "babel-preset-expo": "^10.0.0", - "detox": "^20.13.0", + "detox": "^20.14.8", "eslint": "^8.19.0", "eslint-plugin-detox": "^1.0.0", "eslint-plugin-ft-flow": "^2.0.3", diff --git a/tsconfig.e2e.json b/tsconfig.e2e.json new file mode 100644 index 0000000000..f61dffbab8 --- /dev/null +++ b/tsconfig.e2e.json @@ -0,0 +1,46 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "commonjs", + "types": ["react-native", "jest"], + "lib": [ + "es2019", + "es2020.bigint", + "es2020.date", + "es2020.number", + "es2020.promise", + "es2020.string", + "es2020.symbol.wellknown", + "es2021.promise", + "es2021.string", + "es2021.weakref", + "es2022.array", + "es2022.object", + "es2022.string" + ], + "allowJs": true, + "jsx": "react-native", + "noEmit": true, + "isolatedModules": true, + "strict": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": false, + "esModuleInterop": true, + "paths": { + "#/*": ["./src/*"], + "lib/*": ["./src/lib/*"], + "platform/*": ["./src/platform/*"], + "state/*": ["./src/state/*"], + "view/*": ["./src/view/*"], + "crypto": ["./src/platform/crypto.ts"] + } + }, + "exclude": [ + "node_modules", + "babel.config.js", + "metro.config.js", + "jest.config.js" + ] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 2f81b2fbfe..d724c7821c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3335,6 +3335,11 @@ resolved "https://registry.yarnpkg.com/@fastify/deepmerge/-/deepmerge-1.3.0.tgz#8116858108f0c7d9fd460d05a7d637a13fe3239a" integrity sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A== +"@flatten-js/interval-tree@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@flatten-js/interval-tree/-/interval-tree-1.1.2.tgz#fcc891da48bc230392884be01c26fe8c625702e8" + integrity sha512-OwLoV9E/XM6b7bes2rSFnGNjyRy7vcoIHFTnmBR2WAaZTf0Fe4EX4GdA65vU1KgFAasti7iRSg2dZfYd1Zt00Q== + "@floating-ui/core@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.4.1.tgz#0d633f4b76052668afb932492ac452f7ebe97f17" @@ -8986,6 +8991,16 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== +bunyamin@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/bunyamin/-/bunyamin-1.5.1.tgz#14df1b2f0b82d781d8f8d81eb2e83542353ac8d7" + integrity sha512-VgWWb3G3HwajZF8fFM8TJjkWOqeDBZgzWBeQb7EhKQTQd33Zri0nghLeg4r86kQqqNlo/p9Jjgwh/O7Q6XpZIg== + dependencies: + "@flatten-js/interval-tree" "^1.1.2" + multi-sort-stream "^1.0.4" + stream-json "^1.7.5" + trace-event-lib "^1.3.1" + bunyan-debug-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bunyan-debug-stream/-/bunyan-debug-stream-3.1.0.tgz#78309c67ad85cfb8f011155334152c49209dcda8" @@ -9003,6 +9018,18 @@ bunyan@^1.8.12: mv "~2" safe-json-stringify "~1" +bunyan@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-2.0.5.tgz#9dd056755220dddd8b5bb9cf76f3d0d766e96e71" + integrity sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA== + dependencies: + exeunt "1.1.0" + optionalDependencies: + dtrace-provider "~0.8" + moment "^2.19.3" + mv "~2" + safe-json-stringify "~1" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -10304,10 +10331,10 @@ detect-port-alt@^1.1.6: address "^1.0.1" debug "^2.6.0" -detox@^20.13.0: - version "20.13.0" - resolved "https://registry.yarnpkg.com/detox/-/detox-20.13.0.tgz#923111638dfdb16089eea4f07bf4f0b56468d097" - integrity sha512-p9MUcoHWFTqSDaoaN+/hnJYdzNYqdelUr/sxzy3zLoS/qehnVJv2yG9pYqz/+gKpJaMIpw2+TVw9imdAx5JpaA== +detox@^20.14.8: + version "20.14.8" + resolved "https://registry.yarnpkg.com/detox/-/detox-20.14.8.tgz#0a550cf677fc98a68d56d162e1c5caad317de9ca" + integrity sha512-3E/0/7Cb7x+wcBsZpCxD8FykZUsFnfVT00d6PWH940boc0Mo1Kzabh+I151X/On4qZMqVdUzgwmap/z8g/kmaw== dependencies: ajv "^8.6.3" bunyan "^1.8.12" @@ -10321,6 +10348,7 @@ detox@^20.13.0: funpermaproxy "^1.1.0" glob "^8.0.3" ini "^1.3.4" + jest-environment-emit "^1.0.5" json-cycle "^1.3.0" lodash "^4.17.11" multi-sort-stream "^1.0.3" @@ -11339,6 +11367,11 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +exeunt@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/exeunt/-/exeunt-1.1.0.tgz#af72db6f94b3cb75e921aee375d513049843d284" + integrity sha512-dd++Yn/0Fp+gtJ04YHov7MeAii+LFivJc6KqnJNfplzLVUkUDrfKoQDTLlCgzcW15vY5hKlHasWeIsQJ8agHsw== + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -13772,6 +13805,20 @@ jest-each@^29.7.0: jest-util "^29.7.0" pretty-format "^29.7.0" +jest-environment-emit@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/jest-environment-emit/-/jest-environment-emit-1.0.5.tgz#e6f33451f98b88ccd48e9e1188bb535880f03c1b" + integrity sha512-OsQ08AhYxkkyDBTIow+9ogNmJheQIGWQKp0Nku+1ToLWjAj2Pd6LmypN8HgUIqYHs4HFcqkQ25kaf1qExmoZpg== + dependencies: + bunyamin "^1.5.0" + bunyan "^2.0.5" + bunyan-debug-stream "^3.1.0" + funpermaproxy "^1.1.0" + lodash.merge "^4.6.2" + node-ipc "9.2.1" + strip-ansi "^6.0.0" + tslib "^2.5.3" + jest-environment-jsdom@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" @@ -15868,7 +15915,7 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multi-sort-stream@^1.0.3: +multi-sort-stream@^1.0.3, multi-sort-stream@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/multi-sort-stream/-/multi-sort-stream-1.0.4.tgz#e4348edc9edc36e16333e531a90c0f166235cc99" integrity sha512-hAZ8JOEQFbgdLe8HWZbb7gdZg0/yAIHF00Qfo3kd0rXFv96nXe+/bPTrKHZ2QMHugGX4FiAyET1Lt+jiB+7Qlg== @@ -19619,7 +19666,7 @@ stream-chain@^2.2.5: resolved "https://registry.yarnpkg.com/stream-chain/-/stream-chain-2.2.5.tgz#b30967e8f14ee033c5b9a19bbe8a2cba90ba0d09" integrity sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA== -stream-json@^1.7.4: +stream-json@^1.7.4, stream-json@^1.7.5: version "1.8.0" resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.8.0.tgz#53f486b2e3b4496c506131f8d7260ba42def151c" integrity sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw== @@ -20393,7 +20440,7 @@ tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.5.3: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== From 8a4a8af61c47ba315bcf39d6170825e316bfd241 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Thu, 4 Jan 2024 17:34:10 -0800 Subject: [PATCH 2/9] New user home feed fixes (#2421) * Readd discover to default feeds for new users * Fallback just to discover in home when mergefeed is disabled * Always provide a cursor with mergefeed (no 'end of feed' condition) --- src/lib/api/feed/merge.ts | 2 +- src/lib/constants.ts | 4 ++-- src/view/screens/Home.tsx | 5 ++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/lib/api/feed/merge.ts b/src/lib/api/feed/merge.ts index a4391afb25..2314e2b954 100644 --- a/src/lib/api/feed/merge.ts +++ b/src/lib/api/feed/merge.ts @@ -98,7 +98,7 @@ export class MergeFeedAPI implements FeedAPI { } return { - cursor: posts.length ? String(this.itemCursor) : undefined, + cursor: String(this.itemCursor), feed: posts, } } diff --git a/src/lib/constants.ts b/src/lib/constants.ts index e566d40d55..aec8338d03 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -117,8 +117,8 @@ export async function DEFAULT_FEEDS( } else { // production return { - pinned: [], - saved: [], + pinned: [PROD_DEFAULT_FEED('whats-hot')], + saved: [PROD_DEFAULT_FEED('whats-hot')], } } } diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index b8033f0b45..0e20a9cf77 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -19,6 +19,7 @@ import {useSession} from '#/state/session' import {loadString, saveString} from '#/lib/storage' import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' import {clamp} from '#/lib/numbers' +import {PROD_DEFAULT_FEED} from '#/lib/constants' type Props = NativeStackScreenProps export function HomeScreen(props: Props) { @@ -109,7 +110,9 @@ function HomeScreenReady({ const homeFeedParams = React.useMemo(() => { return { mergeFeedEnabled: Boolean(preferences.feedViewPrefs.lab_mergeFeedEnabled), - mergeFeedSources: preferences.feeds.saved, + mergeFeedSources: preferences.feedViewPrefs.lab_mergeFeedEnabled + ? preferences.feeds.saved + : [PROD_DEFAULT_FEED('whats-hot')], } }, [preferences]) From db62f272412df2c34e1a57200291b53fa1cd07aa Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Thu, 4 Jan 2024 17:36:27 -0800 Subject: [PATCH 3/9] Reduce web requests (#2420) * Stop auto-refetching app passwords and invites on an interval * Don't poll for posts or notifs if the app/tab isnt focused --- src/state/queries/app-passwords.ts | 1 - src/state/queries/invites.ts | 1 - src/state/queries/notifications/unread.tsx | 4 ++++ src/state/queries/post-feed.ts | 4 ++++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/state/queries/app-passwords.ts b/src/state/queries/app-passwords.ts index 4b9e09a8d6..014244f01c 100644 --- a/src/state/queries/app-passwords.ts +++ b/src/state/queries/app-passwords.ts @@ -9,7 +9,6 @@ export const RQKEY = () => ['app-passwords'] export function useAppPasswordsQuery() { return useQuery({ staleTime: STALE.MINUTES.FIVE, - refetchInterval: STALE.MINUTES.ONE, queryKey: RQKEY(), queryFn: async () => { const res = await getAgent().com.atproto.server.listAppPasswords({}) diff --git a/src/state/queries/invites.ts b/src/state/queries/invites.ts index bfea402e1a..9ae9c707f4 100644 --- a/src/state/queries/invites.ts +++ b/src/state/queries/invites.ts @@ -16,7 +16,6 @@ export type InviteCodesQueryResponse = Exclude< export function useInviteCodesQuery() { return useQuery({ staleTime: STALE.MINUTES.FIVE, - refetchInterval: STALE.MINUTES.FIVE, queryKey: ['inviteCodes'], queryFn: async () => { const res = await getAgent() diff --git a/src/state/queries/notifications/unread.tsx b/src/state/queries/notifications/unread.tsx index abaabbf0e7..d604e8fe0d 100644 --- a/src/state/queries/notifications/unread.tsx +++ b/src/state/queries/notifications/unread.tsx @@ -15,6 +15,7 @@ import {useMutedThreads} from '#/state/muted-threads' import {RQKEY as RQKEY_NOTIFS} from './feed' import {logger} from '#/logger' import {truncateAndInvalidate} from '../util' +import {AppState} from 'react-native' const UPDATE_INTERVAL = 30 * 1e3 // 30sec @@ -97,6 +98,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) { async checkUnread({invalidate}: {invalidate?: boolean} = {}) { try { if (!getAgent().session) return + if (AppState.currentState !== 'active') { + return + } // count const page = await fetchPage({ diff --git a/src/state/queries/post-feed.ts b/src/state/queries/post-feed.ts index 0e943622a4..dbb729133d 100644 --- a/src/state/queries/post-feed.ts +++ b/src/state/queries/post-feed.ts @@ -1,4 +1,5 @@ import React, {useCallback, useEffect, useRef} from 'react' +import {AppState} from 'react-native' import {AppBskyFeedDefs, AppBskyFeedPost, PostModeration} from '@atproto/api' import { useInfiniteQuery, @@ -312,6 +313,9 @@ export async function pollLatest(page: FeedPage | undefined) { if (!page) { return false } + if (AppState.currentState !== 'active') { + return + } logger.debug('usePostFeedQuery: pollLatest') const post = await page.api.peekLatest() From 0dae24e78ffe0b2d69349a03f669949e4d5afc21 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Thu, 4 Jan 2024 17:37:36 -0800 Subject: [PATCH 4/9] Additional embed sources and external-media consent controls (#2424) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add apple music embed * add vimeo embed * add logic for tenor and giphy embeds * keep it simple, use playerUri for images too * add gif embed player * lint, fix tests * remove links that can't produce a thumb * Revert "remove links that can't produce a thumb" This reverts commit 985b92b4e622db936bb0c79fdf324099b9c8fcd8. * Revert "Revert "remove links that can't produce a thumb"" This reverts commit 4895ded8b5120c4fc52b43ae85c9a01ea0b1a733. * Revert "Revert "Revert "remove links that can't produce a thumb""" This reverts commit 36d04b517ba5139e1639f2eda28d7f9aaa2dbfb6. * properly obtain giphy metadata regardless of used url * test fixes * adjust gif player * add all twitch embed types * support m.youtube links * few logic adjustments * adjust spotify player height * prefetch gif before showing * use memory-disk cache policy on gifs * use `disk` cachePolicy on ios - can't start/stop animation * support pause/play on web * onLoad fix * remove extra pressable, add accessibility, fix scale issues * improve size of embed * add settings * fix(?) settings * add source to embed player params * update tests * better naming and settings options * consent modal * fix test id * why is webstorm adding .tsx * web modal * simplify types * adjust snap points * remove unnecessary yt embed library. just use the webview always * remove now useless WebGifStill 😭 * more type cleanup * more type cleanup * combine parse and prefs check in one memo * improve dimensions of youtube shorts * oops didn't commit the test 🫥 * add shorts as separate embed type * fix up schema * shorts modal * hide gif details * support localized spotify embeds * more cleanup * improve look and accessibility of gif embeds * Update routing for the external embeds settings page * Update and simplify the external embed preferences screen * Update copy in embedconsent modal and add 'allow all' button --------- Co-authored-by: Hailey --- __tests__/lib/string.test.ts | 286 +++++++++++++-- bskyweb/cmd/bskyweb/server.go | 1 + package.json | 1 - src/Navigation.tsx | 9 + src/lib/analytics/types.ts | 1 + src/lib/link-meta/link-meta.ts | 8 + src/lib/routes/types.ts | 1 + src/lib/strings/embed-player.ts | 342 +++++++++++++++--- src/routes.ts | 1 + src/state/modals/index.tsx | 8 + src/state/persisted/legacy.ts | 1 + src/state/persisted/schema.ts | 16 + .../preferences/external-embeds-prefs.tsx | 54 +++ src/state/preferences/index.tsx | 9 +- src/view/com/modals/EmbedConsent.tsx | 153 ++++++++ src/view/com/modals/Modal.tsx | 4 + src/view/com/modals/Modal.web.tsx | 3 + .../com/util/post-embeds/ExternalGifEmbed.tsx | 170 +++++++++ .../util/post-embeds/ExternalLinkEmbed.tsx | 33 +- .../util/post-embeds/ExternalPlayerEmbed.tsx | 84 +++-- src/view/icons/index.tsx | 6 +- .../screens/PreferencesExternalEmbeds.tsx | 138 +++++++ src/view/screens/Settings.tsx | 33 ++ yarn.lock | 7 - 24 files changed, 1239 insertions(+), 130 deletions(-) create mode 100644 src/state/preferences/external-embeds-prefs.tsx create mode 100644 src/view/com/modals/EmbedConsent.tsx create mode 100644 src/view/com/util/post-embeds/ExternalGifEmbed.tsx create mode 100644 src/view/screens/PreferencesExternalEmbeds.tsx diff --git a/__tests__/lib/string.test.ts b/__tests__/lib/string.test.ts index 99b0d25373..89df7a6bd1 100644 --- a/__tests__/lib/string.test.ts +++ b/__tests__/lib/string.test.ts @@ -394,6 +394,7 @@ describe('parseEmbedPlayerFromUrl', () => { 'https://youtube.com/watch?v=videoId', 'https://youtube.com/watch?v=videoId&feature=share', 'https://youtube.com/shorts/videoId', + 'https://m.youtube.com/watch?v=videoId', 'https://youtube.com/shorts/', 'https://youtube.com/', @@ -401,113 +402,346 @@ describe('parseEmbedPlayerFromUrl', () => { 'https://twitch.tv/channelName', 'https://www.twitch.tv/channelName', + 'https://m.twitch.tv/channelName', + + 'https://twitch.tv/channelName/clip/clipId', + 'https://twitch.tv/videos/videoId', 'https://open.spotify.com/playlist/playlistId', 'https://open.spotify.com/playlist/playlistId?param=value', + 'https://open.spotify.com/locale/playlist/playlistId', 'https://open.spotify.com/track/songId', 'https://open.spotify.com/track/songId?param=value', + 'https://open.spotify.com/locale/track/songId', 'https://open.spotify.com/album/albumId', 'https://open.spotify.com/album/albumId?param=value', + 'https://open.spotify.com/locale/album/albumId', 'https://soundcloud.com/user/track', 'https://soundcloud.com/user/sets/set', 'https://soundcloud.com/user/', + + 'https://music.apple.com/us/playlist/playlistName/playlistId', + 'https://music.apple.com/us/album/albumName/albumId', + 'https://music.apple.com/us/album/albumName/albumId?i=songId', + + 'https://vimeo.com/videoId', + 'https://vimeo.com/videoId?autoplay=0', + + 'https://giphy.com/gifs/some-random-gif-name-gifId', + 'https://giphy.com/gif/some-random-gif-name-gifId', + 'https://giphy.com/gifs/', + + 'https://media.giphy.com/media/gifId/giphy.webp', + 'https://media0.giphy.com/media/gifId/giphy.webp', + 'https://media1.giphy.com/media/gifId/giphy.gif', + 'https://media2.giphy.com/media/gifId/giphy.webp', + 'https://media3.giphy.com/media/gifId/giphy.mp4', + 'https://media4.giphy.com/media/gifId/giphy.webp', + 'https://media5.giphy.com/media/gifId/giphy.mp4', + 'https://media0.giphy.com/media/gifId/giphy.mp3', + 'https://media1.google.com/media/gifId/giphy.webp', + + 'https://media.giphy.com/media/trackingId/gifId/giphy.webp', + + 'https://i.giphy.com/media/gifId/giphy.webp', + 'https://i.giphy.com/media/gifId/giphy.webp', + 'https://i.giphy.com/gifId.gif', + 'https://i.giphy.com/gifId.gif', + + 'https://tenor.com/view/gifId', + 'https://tenor.com/notView/gifId', + 'https://tenor.com/view', + 'https://tenor.com/view/gifId.gif', ] const outputs = [ { type: 'youtube_video', - videoId: 'videoId', - playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + source: 'youtube', + playerUri: + 'https://www.youtube.com/embed/videoId?autoplay=1&playsinline=1', }, { type: 'youtube_video', - videoId: 'videoId', - playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + source: 'youtube', + playerUri: + 'https://www.youtube.com/embed/videoId?autoplay=1&playsinline=1', }, { type: 'youtube_video', - videoId: 'videoId', - playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + source: 'youtube', + playerUri: + 'https://www.youtube.com/embed/videoId?autoplay=1&playsinline=1', }, { type: 'youtube_video', - videoId: 'videoId', - playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + source: 'youtube', + playerUri: + 'https://www.youtube.com/embed/videoId?autoplay=1&playsinline=1', }, { type: 'youtube_video', - videoId: 'videoId', - playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + source: 'youtube', + playerUri: + 'https://www.youtube.com/embed/videoId?autoplay=1&playsinline=1', + }, + { + type: 'youtube_short', + source: 'youtubeShorts', + hideDetails: true, + playerUri: + 'https://www.youtube.com/embed/videoId?autoplay=1&playsinline=1', }, { type: 'youtube_video', - videoId: 'videoId', - playerUri: 'https://www.youtube.com/embed/videoId?autoplay=1', + source: 'youtube', + playerUri: + 'https://www.youtube.com/embed/videoId?autoplay=1&playsinline=1', }, + undefined, undefined, undefined, { - type: 'twitch_live', - channelId: 'channelName', + type: 'twitch_video', + source: 'twitch', playerUri: `https://player.twitch.tv/?volume=0.5&!muted&autoplay&channel=channelName&parent=localhost`, }, { - type: 'twitch_live', - channelId: 'channelName', + type: 'twitch_video', + source: 'twitch', playerUri: `https://player.twitch.tv/?volume=0.5&!muted&autoplay&channel=channelName&parent=localhost`, }, + { + type: 'twitch_video', + source: 'twitch', + playerUri: `https://player.twitch.tv/?volume=0.5&!muted&autoplay&channel=channelName&parent=localhost`, + }, + { + type: 'twitch_video', + source: 'twitch', + playerUri: `https://clips.twitch.tv/embed?volume=0.5&autoplay=true&clip=clipId&parent=localhost`, + }, + { + type: 'twitch_video', + source: 'twitch', + playerUri: `https://player.twitch.tv/?volume=0.5&!muted&autoplay&video=videoId&parent=localhost`, + }, { type: 'spotify_playlist', - playlistId: 'playlistId', + source: 'spotify', playerUri: `https://open.spotify.com/embed/playlist/playlistId`, }, { type: 'spotify_playlist', - playlistId: 'playlistId', + source: 'spotify', + playerUri: `https://open.spotify.com/embed/playlist/playlistId`, + }, + { + type: 'spotify_playlist', + source: 'spotify', playerUri: `https://open.spotify.com/embed/playlist/playlistId`, }, { type: 'spotify_song', - songId: 'songId', + source: 'spotify', + playerUri: `https://open.spotify.com/embed/track/songId`, + }, + { + type: 'spotify_song', + source: 'spotify', playerUri: `https://open.spotify.com/embed/track/songId`, }, { type: 'spotify_song', - songId: 'songId', + source: 'spotify', playerUri: `https://open.spotify.com/embed/track/songId`, }, { type: 'spotify_album', - albumId: 'albumId', + source: 'spotify', + playerUri: `https://open.spotify.com/embed/album/albumId`, + }, + { + type: 'spotify_album', + source: 'spotify', playerUri: `https://open.spotify.com/embed/album/albumId`, }, { type: 'spotify_album', - albumId: 'albumId', + source: 'spotify', playerUri: `https://open.spotify.com/embed/album/albumId`, }, { type: 'soundcloud_track', - user: 'user', - track: 'track', + source: 'soundcloud', 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', + source: 'soundcloud', playerUri: `https://w.soundcloud.com/player/?url=https://soundcloud.com/user/sets/set&auto_play=true&visual=false&hide_related=true`, }, undefined, + + { + type: 'apple_music_playlist', + source: 'appleMusic', + playerUri: + 'https://embed.music.apple.com/us/playlist/playlistName/playlistId', + }, + { + type: 'apple_music_album', + source: 'appleMusic', + playerUri: 'https://embed.music.apple.com/us/album/albumName/albumId', + }, + { + type: 'apple_music_song', + source: 'appleMusic', + playerUri: + 'https://embed.music.apple.com/us/album/albumName/albumId?i=songId', + }, + + { + type: 'vimeo_video', + source: 'vimeo', + playerUri: 'https://player.vimeo.com/video/videoId?autoplay=1', + }, + { + type: 'vimeo_video', + source: 'vimeo', + playerUri: 'https://player.vimeo.com/video/videoId?autoplay=1', + }, + + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + undefined, + undefined, + + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + undefined, + undefined, + undefined, + + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: 'https://giphy.com/gifs/gifId', + playerUri: 'https://i.giphy.com/media/gifId/giphy.webp', + }, + + { + type: 'tenor_gif', + source: 'tenor', + isGif: true, + hideDetails: true, + playerUri: 'https://tenor.com/view/gifId.gif', + }, + undefined, + undefined, + { + type: 'tenor_gif', + source: 'tenor', + isGif: true, + hideDetails: true, + playerUri: 'https://tenor.com/view/gifId.gif', + }, ] it('correctly grabs the correct id from uri', () => { diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go index 7a3b8bf16a..94bba231a6 100644 --- a/bskyweb/cmd/bskyweb/server.go +++ b/bskyweb/cmd/bskyweb/server.go @@ -193,6 +193,7 @@ func serve(cctx *cli.Context) error { e.GET("/settings/home-feed", server.WebGeneric) e.GET("/settings/saved-feeds", server.WebGeneric) e.GET("/settings/threads", server.WebGeneric) + e.GET("/settings/external-embeds", server.WebGeneric) e.GET("/sys/debug", server.WebGeneric) e.GET("/sys/log", server.WebGeneric) e.GET("/support", server.WebGeneric) diff --git a/package.json b/package.json index e29b4ff1ff..68dc2e0dcb 100644 --- a/package.json +++ b/package.json @@ -166,7 +166,6 @@ "react-native-web-linear-gradient": "^1.1.2", "react-native-web-webview": "^1.0.2", "react-native-webview": "^13.6.3", - "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/Navigation.tsx b/src/Navigation.tsx index 27174a31f0..7bb1aa0ade 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -74,6 +74,7 @@ import {ModerationBlockedAccounts} from 'view/screens/ModerationBlockedAccounts' import {SavedFeeds} from 'view/screens/SavedFeeds' import {PreferencesHomeFeed} from 'view/screens/PreferencesHomeFeed' import {PreferencesThreads} from 'view/screens/PreferencesThreads' +import {PreferencesExternalEmbeds} from '#/view/screens/PreferencesExternalEmbeds' import {createNativeStackNavigatorWithAuth} from './view/shell/createNativeStackNavigatorWithAuth' const navigationRef = createNavigationContainerRef() @@ -243,6 +244,14 @@ function commonScreens(Stack: typeof HomeTab, unreadCountLabel?: string) { getComponent={() => PreferencesThreads} options={{title: title('Threads Preferences'), requireAuth: true}} /> + PreferencesExternalEmbeds} + options={{ + title: title('External Media Preferences'), + requireAuth: true, + }} + /> ) } diff --git a/src/lib/analytics/types.ts b/src/lib/analytics/types.ts index 5a24c360af..c84f7979a4 100644 --- a/src/lib/analytics/types.ts +++ b/src/lib/analytics/types.ts @@ -147,6 +147,7 @@ interface ScreenPropertiesMap { Settings: {} AppPasswords: {} Moderation: {} + PreferencesExternalEmbeds: {} BlockedAccounts: {} MutedAccounts: {} SavedFeeds: {} diff --git a/src/lib/link-meta/link-meta.ts b/src/lib/link-meta/link-meta.ts index c17dee51fa..c7c8d4130a 100644 --- a/src/lib/link-meta/link-meta.ts +++ b/src/lib/link-meta/link-meta.ts @@ -2,6 +2,7 @@ import {BskyAgent} from '@atproto/api' import {isBskyAppUrl} from '../strings/url-helpers' import {extractBskyMeta} from './bsky' import {LINK_META_PROXY} from 'lib/constants' +import {getGiphyMetaUri} from 'lib/strings/embed-player' export enum LikelyType { HTML, @@ -34,6 +35,13 @@ export async function getLinkMeta( let urlp try { urlp = new URL(url) + + // Get Giphy meta uri if this is any form of giphy link + const giphyMetaUri = getGiphyMetaUri(urlp) + if (giphyMetaUri) { + url = giphyMetaUri + urlp = new URL(url) + } } catch (e) { return { error: 'Invalid URL', diff --git a/src/lib/routes/types.ts b/src/lib/routes/types.ts index c157c0ab34..90ae758304 100644 --- a/src/lib/routes/types.ts +++ b/src/lib/routes/types.ts @@ -32,6 +32,7 @@ export type CommonNavigatorParams = { SavedFeeds: undefined PreferencesHomeFeed: undefined PreferencesThreads: undefined + PreferencesExternalEmbeds: undefined } export type BottomTabNavigatorParams = CommonNavigatorParams & { diff --git a/src/lib/strings/embed-player.ts b/src/lib/strings/embed-player.ts index ec996dfa53..b27fd9e789 100644 --- a/src/lib/strings/embed-player.ts +++ b/src/lib/strings/embed-player.ts @@ -1,17 +1,59 @@ -import {Platform} from 'react-native' - -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} +import {Dimensions, Platform} from 'react-native' +const {height: SCREEN_HEIGHT} = Dimensions.get('window') + +export const embedPlayerSources = [ + 'youtube', + 'youtubeShorts', + 'twitch', + 'spotify', + 'soundcloud', + 'appleMusic', + 'vimeo', + 'giphy', + 'tenor', +] as const + +export type EmbedPlayerSource = (typeof embedPlayerSources)[number] + +export type EmbedPlayerType = + | 'youtube_video' + | 'youtube_short' + | 'twitch_video' + | 'spotify_album' + | 'spotify_playlist' + | 'spotify_song' + | 'soundcloud_track' + | 'soundcloud_set' + | 'apple_music_playlist' + | 'apple_music_album' + | 'apple_music_song' + | 'vimeo_video' + | 'giphy_gif' + | 'tenor_gif' + +export const externalEmbedLabels: Record = { + youtube: 'YouTube', + youtubeShorts: 'YouTube Shorts', + vimeo: 'Vimeo', + twitch: 'Twitch', + giphy: 'GIPHY', + tenor: 'Tenor', + spotify: 'Spotify', + appleMusic: 'Apple Music', + soundcloud: 'SoundCloud', +} + +export interface EmbedPlayerParams { + type: EmbedPlayerType + playerUri: string + isGif?: boolean + source: EmbedPlayerSource + metaUri?: string + hideDetails?: boolean +} + +const giphyRegex = /media(?:[0-4]\.giphy\.com|\.giphy\.com)/i +const gifFilenameRegex = /^(\S+)\.(webp|gif|mp4)$/i export function parseEmbedPlayerFromUrl( url: string, @@ -29,63 +71,88 @@ export function parseEmbedPlayerFromUrl( if (videoId) { return { type: 'youtube_video', - videoId, - playerUri: `https://www.youtube.com/embed/${videoId}?autoplay=1`, + source: 'youtube', + playerUri: `https://www.youtube.com/embed/${videoId}?autoplay=1&playsinline=1`, } } } - if (urlp.hostname === 'www.youtube.com' || urlp.hostname === 'youtube.com') { + if ( + urlp.hostname === 'www.youtube.com' || + urlp.hostname === 'youtube.com' || + urlp.hostname === 'm.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`, + type: page === 'shorts' ? 'youtube_short' : 'youtube_video', + source: page === 'shorts' ? 'youtubeShorts' : 'youtube', + hideDetails: page === 'shorts' ? true : undefined, + playerUri: `https://www.youtube.com/embed/${videoId}?autoplay=1&playsinline=1`, } } } // twitch - if (urlp.hostname === 'twitch.tv' || urlp.hostname === 'www.twitch.tv') { + if ( + urlp.hostname === 'twitch.tv' || + urlp.hostname === 'www.twitch.tv' || + urlp.hostname === 'm.twitch.tv' + ) { const parent = Platform.OS === 'web' ? window.location.hostname : 'localhost' - const parts = urlp.pathname.split('/') - if (parts.length === 2 && parts[1]) { + const [_, channelOrVideo, clipOrId, id] = urlp.pathname.split('/') + + if (channelOrVideo === 'videos') { + return { + type: 'twitch_video', + source: 'twitch', + playerUri: `https://player.twitch.tv/?volume=0.5&!muted&autoplay&video=${clipOrId}&parent=${parent}`, + } + } else if (clipOrId === 'clip') { return { - type: 'twitch_live', - channelId: parts[1], - playerUri: `https://player.twitch.tv/?volume=0.5&!muted&autoplay&channel=${parts[1]}&parent=${parent}`, + type: 'twitch_video', + source: 'twitch', + playerUri: `https://clips.twitch.tv/embed?volume=0.5&autoplay=true&clip=${id}&parent=${parent}`, + } + } else if (channelOrVideo) { + return { + type: 'twitch_video', + source: 'twitch', + playerUri: `https://player.twitch.tv/?volume=0.5&!muted&autoplay&channel=${channelOrVideo}&parent=${parent}`, } } } // spotify if (urlp.hostname === 'open.spotify.com') { - const [_, type, id] = urlp.pathname.split('/') - if (type && id) { - if (type === 'playlist') { + const [_, typeOrLocale, idOrType, id] = urlp.pathname.split('/') + + if (idOrType) { + if (typeOrLocale === 'playlist' || idOrType === 'playlist') { return { type: 'spotify_playlist', - playlistId: id, - playerUri: `https://open.spotify.com/embed/playlist/${id}`, + source: 'spotify', + playerUri: `https://open.spotify.com/embed/playlist/${ + id ?? idOrType + }`, } } - if (type === 'album') { + if (typeOrLocale === 'album' || idOrType === 'album') { return { type: 'spotify_album', - albumId: id, - playerUri: `https://open.spotify.com/embed/album/${id}`, + source: 'spotify', + playerUri: `https://open.spotify.com/embed/album/${id ?? idOrType}`, } } - if (type === 'track') { + if (typeOrLocale === 'track' || idOrType === 'track') { return { type: 'spotify_song', - songId: id, - playerUri: `https://open.spotify.com/embed/track/${id}`, + source: 'spotify', + playerUri: `https://open.spotify.com/embed/track/${id ?? idOrType}`, } } } @@ -102,20 +169,170 @@ export function parseEmbedPlayerFromUrl( if (trackOrSets === 'sets' && set) { return { type: 'soundcloud_set', - user, - set: set, + source: 'soundcloud', playerUri: `https://w.soundcloud.com/player/?url=${url}&auto_play=true&visual=false&hide_related=true`, } } return { type: 'soundcloud_track', - user, - track: trackOrSets, + source: 'soundcloud', playerUri: `https://w.soundcloud.com/player/?url=${url}&auto_play=true&visual=false&hide_related=true`, } } } + + if ( + urlp.hostname === 'music.apple.com' || + urlp.hostname === 'music.apple.com' + ) { + // This should always have: locale, type (playlist or album), name, and id. We won't use spread since we want + // to check if the length is correct + const pathParams = urlp.pathname.split('/') + const type = pathParams[2] + const songId = urlp.searchParams.get('i') + + if (pathParams.length === 5 && (type === 'playlist' || type === 'album')) { + // We want to append the songId to the end of the url if it exists + const embedUri = `https://embed.music.apple.com${urlp.pathname}${ + urlp.search ? '?i=' + songId : '' + }` + + if (type === 'playlist') { + return { + type: 'apple_music_playlist', + source: 'appleMusic', + playerUri: embedUri, + } + } else if (type === 'album') { + if (songId) { + return { + type: 'apple_music_song', + source: 'appleMusic', + playerUri: embedUri, + } + } else { + return { + type: 'apple_music_album', + source: 'appleMusic', + playerUri: embedUri, + } + } + } + } + } + + if (urlp.hostname === 'vimeo.com' || urlp.hostname === 'www.vimeo.com') { + const [_, videoId] = urlp.pathname.split('/') + if (videoId) { + return { + type: 'vimeo_video', + source: 'vimeo', + playerUri: `https://player.vimeo.com/video/${videoId}?autoplay=1`, + } + } + } + + if (urlp.hostname === 'giphy.com' || urlp.hostname === 'www.giphy.com') { + const [_, gifs, nameAndId] = urlp.pathname.split('/') + + /* + * nameAndId is a string that consists of the name (dash separated) and the id of the gif (the last part of the name) + * We want to get the id of the gif, then direct to media.giphy.com/media/{id}/giphy.webp so we can + * use it in an component + */ + + if (gifs === 'gifs' && nameAndId) { + const gifId = nameAndId.split('-').pop() + + if (gifId) { + return { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: `https://giphy.com/gifs/${gifId}`, + playerUri: `https://i.giphy.com/media/${gifId}/giphy.webp`, + } + } + } + } + + // There are five possible hostnames that also can be giphy urls: media.giphy.com and media0-4.giphy.com + // These can include (presumably) a tracking id in the path name, so we have to check for that as well + if (giphyRegex.test(urlp.hostname)) { + // We can link directly to the gif, if its a proper link + const [_, media, trackingOrId, idOrFilename, filename] = + urlp.pathname.split('/') + + if (media === 'media') { + if (idOrFilename && gifFilenameRegex.test(idOrFilename)) { + return { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: `https://giphy.com/gifs/${trackingOrId}`, + playerUri: `https://i.giphy.com/media/${trackingOrId}/giphy.webp`, + } + } else if (filename && gifFilenameRegex.test(filename)) { + return { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: `https://giphy.com/gifs/${idOrFilename}`, + playerUri: `https://i.giphy.com/media/${idOrFilename}/giphy.webp`, + } + } + } + } + + // Finally, we should see if it is a link to i.giphy.com. These links don't necessarily end in .gif but can also + // be .webp + if (urlp.hostname === 'i.giphy.com' || urlp.hostname === 'www.i.giphy.com') { + const [_, mediaOrFilename, filename] = urlp.pathname.split('/') + + if (mediaOrFilename === 'media' && filename) { + const gifId = filename.split('.')[0] + return { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: `https://giphy.com/gifs/${gifId}`, + playerUri: `https://i.giphy.com/media/${gifId}/giphy.webp`, + } + } else if (mediaOrFilename) { + const gifId = mediaOrFilename.split('.')[0] + return { + type: 'giphy_gif', + source: 'giphy', + isGif: true, + hideDetails: true, + metaUri: `https://giphy.com/gifs/${gifId}`, + playerUri: `https://i.giphy.com/media/${ + mediaOrFilename.split('.')[0] + }/giphy.webp`, + } + } + } + + if (urlp.hostname === 'tenor.com' || urlp.hostname === 'www.tenor.com') { + const [_, path, filename] = urlp.pathname.split('/') + + if (path === 'view' && filename) { + const includesExt = filename.split('.').pop() === 'gif' + + return { + type: 'tenor_gif', + source: 'tenor', + isGif: true, + hideDetails: true, + playerUri: `${url}${!includesExt ? '.gif' : ''}`, + } + } + } } export function getPlayerHeight({ @@ -131,22 +348,53 @@ export function getPlayerHeight({ switch (type) { case 'youtube_video': - case 'twitch_live': + case 'twitch_video': + case 'vimeo_video': return (width / 16) * 9 + case 'youtube_short': + if (SCREEN_HEIGHT < 600) { + return ((width / 9) * 16) / 1.75 + } else { + return ((width / 9) * 16) / 1.5 + } case 'spotify_album': - return 380 + case 'apple_music_album': + case 'apple_music_playlist': case 'spotify_playlist': - return 360 + case 'soundcloud_set': + return 380 case 'spotify_song': if (width <= 300) { - return 180 + return 155 } return 232 case 'soundcloud_track': return 165 - case 'soundcloud_set': - return 360 + case 'apple_music_song': + return 150 default: return width } } + +export function getGifDims( + originalHeight: number, + originalWidth: number, + viewWidth: number, +) { + const scaledHeight = (originalHeight / originalWidth) * viewWidth + + return { + height: scaledHeight > 250 ? 250 : scaledHeight, + width: (250 / scaledHeight) * viewWidth, + } +} + +export function getGiphyMetaUri(url: URL) { + if (giphyRegex.test(url.hostname) || url.hostname === 'i.giphy.com') { + const params = parseEmbedPlayerFromUrl(url.toString()) + if (params && params.type === 'giphy_gif') { + return params.metaUri + } + } +} diff --git a/src/routes.ts b/src/routes.ts index bb2421987a..e58fddd429 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -26,6 +26,7 @@ export const router = new Router({ AppPasswords: '/settings/app-passwords', PreferencesHomeFeed: '/settings/home-feed', PreferencesThreads: '/settings/threads', + PreferencesExternalEmbeds: '/settings/external-embeds', SavedFeeds: '/settings/saved-feeds', Support: '/support', PrivacyPolicy: '/support/privacy', diff --git a/src/state/modals/index.tsx b/src/state/modals/index.tsx index 81a220d1b3..8c32c472a6 100644 --- a/src/state/modals/index.tsx +++ b/src/state/modals/index.tsx @@ -6,6 +6,7 @@ import {Image as RNImage} from 'react-native-image-crop-picker' import {ImageModel} from '#/state/models/media/image' import {GalleryModel} from '#/state/models/media/gallery' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' +import {EmbedPlayerSource} from '#/lib/strings/embed-player.ts' import {ThreadgateSetting} from '../queries/threadgate' export interface ConfirmModal { @@ -180,6 +181,12 @@ export interface LinkWarningModal { href: string } +export interface EmbedConsentModal { + name: 'embed-consent' + source: EmbedPlayerSource + onAccept: () => void +} + export type Modal = // Account | AddAppPasswordModal @@ -223,6 +230,7 @@ export type Modal = // Generic | ConfirmModal | LinkWarningModal + | EmbedConsentModal const ModalContext = React.createContext<{ isModalActive: boolean diff --git a/src/state/persisted/legacy.ts b/src/state/persisted/legacy.ts index cdb542f5ac..334ef1d92a 100644 --- a/src/state/persisted/legacy.ts +++ b/src/state/persisted/legacy.ts @@ -109,6 +109,7 @@ export function transform(legacy: Partial): Schema { step: legacy.onboarding?.step || defaults.onboarding.step, }, hiddenPosts: defaults.hiddenPosts, + externalEmbeds: defaults.externalEmbeds, } } diff --git a/src/state/persisted/schema.ts b/src/state/persisted/schema.ts index 27b1f26bdd..6a26cedae5 100644 --- a/src/state/persisted/schema.ts +++ b/src/state/persisted/schema.ts @@ -1,6 +1,8 @@ import {z} from 'zod' import {deviceLocales} from '#/platform/detection' +const externalEmbedOptions = ['show', 'hide'] as const + // only data needed for rendering account page const accountSchema = z.object({ service: z.string(), @@ -30,6 +32,19 @@ export const schema = z.object({ appLanguage: z.string(), }), requireAltTextEnabled: z.boolean(), // should move to server + externalEmbeds: z + .object({ + giphy: z.enum(externalEmbedOptions).optional(), + tenor: z.enum(externalEmbedOptions).optional(), + youtube: z.enum(externalEmbedOptions).optional(), + youtubeShorts: z.enum(externalEmbedOptions).optional(), + twitch: z.enum(externalEmbedOptions).optional(), + vimeo: z.enum(externalEmbedOptions).optional(), + spotify: z.enum(externalEmbedOptions).optional(), + appleMusic: z.enum(externalEmbedOptions).optional(), + soundcloud: z.enum(externalEmbedOptions).optional(), + }) + .optional(), mutedThreads: z.array(z.string()), // should move to server invites: z.object({ copiedInvites: z.array(z.string()), @@ -60,6 +75,7 @@ export const defaults: Schema = { appLanguage: deviceLocales[0] || 'en', }, requireAltTextEnabled: false, + externalEmbeds: {}, mutedThreads: [], invites: { copiedInvites: [], diff --git a/src/state/preferences/external-embeds-prefs.tsx b/src/state/preferences/external-embeds-prefs.tsx new file mode 100644 index 0000000000..0f6385fe8e --- /dev/null +++ b/src/state/preferences/external-embeds-prefs.tsx @@ -0,0 +1,54 @@ +import React from 'react' +import * as persisted from '#/state/persisted' +import {EmbedPlayerSource} from 'lib/strings/embed-player' + +type StateContext = persisted.Schema['externalEmbeds'] +type SetContext = (source: EmbedPlayerSource, value: 'show' | 'hide') => void + +const stateContext = React.createContext( + persisted.defaults.externalEmbeds, +) +const setContext = React.createContext({} as SetContext) + +export function Provider({children}: React.PropsWithChildren<{}>) { + const [state, setState] = React.useState(persisted.get('externalEmbeds')) + + const setStateWrapped = React.useCallback( + (source: EmbedPlayerSource, value: 'show' | 'hide') => { + setState(prev => { + persisted.write('externalEmbeds', { + ...prev, + [source]: value, + }) + + return { + ...prev, + [source]: value, + } + }) + }, + [setState], + ) + + React.useEffect(() => { + return persisted.onUpdate(() => { + setState(persisted.get('externalEmbeds')) + }) + }, [setStateWrapped]) + + return ( + + + {children} + + + ) +} + +export function useExternalEmbedsPrefs() { + return React.useContext(stateContext) +} + +export function useSetExternalEmbedPref() { + return React.useContext(setContext) +} diff --git a/src/state/preferences/index.tsx b/src/state/preferences/index.tsx index 5ec659031e..cc2d9244c3 100644 --- a/src/state/preferences/index.tsx +++ b/src/state/preferences/index.tsx @@ -2,19 +2,26 @@ import React from 'react' import {Provider as LanguagesProvider} from './languages' import {Provider as AltTextRequiredProvider} from '../preferences/alt-text-required' import {Provider as HiddenPostsProvider} from '../preferences/hidden-posts' +import {Provider as ExternalEmbedsProvider} from './external-embeds-prefs' export {useLanguagePrefs, useLanguagePrefsApi} from './languages' export { useRequireAltTextEnabled, useSetRequireAltTextEnabled, } from './alt-text-required' +export { + useExternalEmbedsPrefs, + useSetExternalEmbedPref, +} from './external-embeds-prefs' export * from './hidden-posts' export function Provider({children}: React.PropsWithChildren<{}>) { return ( - {children} + + {children} + ) diff --git a/src/view/com/modals/EmbedConsent.tsx b/src/view/com/modals/EmbedConsent.tsx new file mode 100644 index 0000000000..04104c52e1 --- /dev/null +++ b/src/view/com/modals/EmbedConsent.tsx @@ -0,0 +1,153 @@ +import React from 'react' +import {StyleSheet, TouchableOpacity, View} from 'react-native' +import LinearGradient from 'react-native-linear-gradient' +import {s, colors, gradients} from 'lib/styles' +import {Text} from '../util/text/Text' +import {ScrollView} from './util' +import {usePalette} from 'lib/hooks/usePalette' +import { + EmbedPlayerSource, + embedPlayerSources, + externalEmbedLabels, +} from '#/lib/strings/embed-player' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' +import {useModalControls} from '#/state/modals' +import {useSetExternalEmbedPref} from '#/state/preferences/external-embeds-prefs' +import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' + +export const snapPoints = [450] + +export function Component({ + onAccept, + source, +}: { + onAccept: () => void + source: EmbedPlayerSource +}) { + const pal = usePalette('default') + const {closeModal} = useModalControls() + const {_} = useLingui() + const setExternalEmbedPref = useSetExternalEmbedPref() + const {isMobile} = useWebMediaQueries() + + const onShowAllPress = React.useCallback(() => { + for (const key of embedPlayerSources) { + setExternalEmbedPref(key, 'show') + } + onAccept() + closeModal() + }, [closeModal, onAccept, setExternalEmbedPref]) + + const onShowPress = React.useCallback(() => { + setExternalEmbedPref(source, 'show') + onAccept() + closeModal() + }, [closeModal, onAccept, setExternalEmbedPref, source]) + + const onHidePress = React.useCallback(() => { + setExternalEmbedPref(source, 'hide') + closeModal() + }, [closeModal, setExternalEmbedPref, source]) + + return ( + + + External Media + + + + + This content is hosted by {externalEmbedLabels[source]}. Do you want + to enable external media? + + + + + + External media may allow websites to collect information about you and + your device. No information is sent or requested until you press the + "play" button. + + + + + + + Enable External Media + + + + + + + + Enable {externalEmbedLabels[source]} only + + + + + + + + No thanks + + + + + ) +} + +const styles = StyleSheet.create({ + title: { + textAlign: 'center', + fontWeight: 'bold', + fontSize: 24, + marginBottom: 12, + }, + btn: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + width: '100%', + borderRadius: 32, + padding: 14, + backgroundColor: colors.gray1, + }, +}) diff --git a/src/view/com/modals/Modal.tsx b/src/view/com/modals/Modal.tsx index 2aac20dacc..f9d211d07c 100644 --- a/src/view/com/modals/Modal.tsx +++ b/src/view/com/modals/Modal.tsx @@ -38,6 +38,7 @@ import * as VerifyEmailModal from './VerifyEmail' import * as ChangeEmailModal from './ChangeEmail' import * as SwitchAccountModal from './SwitchAccount' import * as LinkWarningModal from './LinkWarning' +import * as EmbedConsentModal from './EmbedConsent' const DEFAULT_SNAPPOINTS = ['90%'] const HANDLE_HEIGHT = 24 @@ -176,6 +177,9 @@ export function ModalsContainer() { } else if (activeModal?.name === 'link-warning') { snapPoints = LinkWarningModal.snapPoints element = + } else if (activeModal?.name === 'embed-consent') { + snapPoints = EmbedConsentModal.snapPoints + element = } else { return null } diff --git a/src/view/com/modals/Modal.web.tsx b/src/view/com/modals/Modal.web.tsx index 12138f54d4..c43a8a6ce9 100644 --- a/src/view/com/modals/Modal.web.tsx +++ b/src/view/com/modals/Modal.web.tsx @@ -34,6 +34,7 @@ import * as BirthDateSettingsModal from './BirthDateSettings' import * as VerifyEmailModal from './VerifyEmail' import * as ChangeEmailModal from './ChangeEmail' import * as LinkWarningModal from './LinkWarning' +import * as EmbedConsentModal from './EmbedConsent' export function ModalsContainer() { const {isModalActive, activeModals} = useModals() @@ -129,6 +130,8 @@ function Modal({modal}: {modal: ModalIface}) { element = } else if (modal.name === 'link-warning') { element = + } else if (modal.name === 'embed-consent') { + element = } else { return null } diff --git a/src/view/com/util/post-embeds/ExternalGifEmbed.tsx b/src/view/com/util/post-embeds/ExternalGifEmbed.tsx new file mode 100644 index 0000000000..f06c8b794d --- /dev/null +++ b/src/view/com/util/post-embeds/ExternalGifEmbed.tsx @@ -0,0 +1,170 @@ +import {EmbedPlayerParams, getGifDims} from 'lib/strings/embed-player' +import React from 'react' +import {Image, ImageLoadEventData} from 'expo-image' +import { + ActivityIndicator, + GestureResponderEvent, + LayoutChangeEvent, + Pressable, + StyleSheet, + View, +} from 'react-native' +import {isIOS, isNative, isWeb} from '#/platform/detection' +import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' +import {useExternalEmbedsPrefs} from 'state/preferences' +import {useModalControls} from 'state/modals' +import {useLingui} from '@lingui/react' +import {msg} from '@lingui/macro' +import {AppBskyEmbedExternal} from '@atproto/api' + +export function ExternalGifEmbed({ + link, + params, +}: { + link: AppBskyEmbedExternal.ViewExternal + params: EmbedPlayerParams +}) { + const externalEmbedsPrefs = useExternalEmbedsPrefs() + const {openModal} = useModalControls() + const {_} = useLingui() + + const thumbHasLoaded = React.useRef(false) + const viewWidth = React.useRef(0) + + // Tracking if the placer has been activated + const [isPlayerActive, setIsPlayerActive] = React.useState(false) + // Tracking whether the gif has been loaded yet + const [isPrefetched, setIsPrefetched] = React.useState(false) + // Tracking whether the image is animating + const [isAnimating, setIsAnimating] = React.useState(true) + const [imageDims, setImageDims] = React.useState({height: 100, width: 1}) + + // Used for controlling animation + const imageRef = React.useRef(null) + + const load = React.useCallback(() => { + setIsPlayerActive(true) + Image.prefetch(params.playerUri).then(() => { + // Replace the image once it's fetched + setIsPrefetched(true) + }) + }, [params.playerUri]) + + const onPlayPress = React.useCallback( + (event: GestureResponderEvent) => { + // Don't propagate on web + event.preventDefault() + + // Show consent if this is the first load + if (externalEmbedsPrefs?.[params.source] === undefined) { + openModal({ + name: 'embed-consent', + source: params.source, + onAccept: load, + }) + return + } + // If the player isn't active, we want to activate it and prefetch the gif + if (!isPlayerActive) { + load() + return + } + // Control animation on native + setIsAnimating(prev => { + if (prev) { + if (isNative) { + imageRef.current?.stopAnimating() + } + return false + } else { + if (isNative) { + imageRef.current?.startAnimating() + } + return true + } + }) + }, + [externalEmbedsPrefs, isPlayerActive, load, openModal, params.source], + ) + + const onLoad = React.useCallback((e: ImageLoadEventData) => { + if (thumbHasLoaded.current) return + setImageDims(getGifDims(e.source.height, e.source.width, viewWidth.current)) + thumbHasLoaded.current = true + }, []) + + const onLayout = React.useCallback((e: LayoutChangeEvent) => { + viewWidth.current = e.nativeEvent.layout.width + }, []) + + return ( + + {(!isPrefetched || !isAnimating) && ( // If we have not loaded or are not animating, show the overlay + + + {!isAnimating || !isPlayerActive ? ( // Play button when not animating or not active + + ) : ( + // Activity indicator while gif loads + + )} + + + )} + + + ) +} + +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, + }, + gifContainer: { + width: '100%', + overflow: 'hidden', + }, +}) diff --git a/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx b/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx index 1523dcf530..af62aa2b33 100644 --- a/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx +++ b/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx @@ -8,6 +8,8 @@ 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' +import {ExternalGifEmbed} from 'view/com/util/post-embeds/ExternalGifEmbed' +import {useExternalEmbedsPrefs} from 'state/preferences' export const ExternalLinkEmbed = ({ link, @@ -16,11 +18,15 @@ export const ExternalLinkEmbed = ({ }) => { const pal = usePalette('default') const {isMobile} = useWebMediaQueries() + const externalEmbedPrefs = useExternalEmbedsPrefs() - const embedPlayerParams = React.useMemo( - () => parseEmbedPlayerFromUrl(link.uri), - [link.uri], - ) + const embedPlayerParams = React.useMemo(() => { + const params = parseEmbedPlayerFromUrl(link.uri) + + if (params && externalEmbedPrefs?.[params.source] !== 'hide') { + return params + } + }, [link.uri, externalEmbedPrefs]) return ( @@ -40,9 +46,12 @@ export const ExternalLinkEmbed = ({ /> ) : undefined} - {embedPlayerParams && ( - - )} + {(embedPlayerParams?.isGif && ( + + )) || + (embedPlayerParams && ( + + ))} {toNiceDomain(link.uri)} - - {link.title || link.uri} - - {link.description ? ( + {!embedPlayerParams?.isGif && ( + + {link.title || link.uri} + + )} + {link.description && !embedPlayerParams?.hideDetails ? ( void }) { + const {_} = useLingui() + // If the player is active and not loading, we don't want to show the overlay. if (isPlayerActive && !isLoading) return null @@ -46,8 +51,8 @@ function PlaceholderOverlay({ {!isPlayerActive ? ( @@ -84,31 +89,21 @@ function Player({ return ( - {isNative && params.type === 'youtube_video' ? ( - + - ) : ( - - - - )} + ) @@ -125,6 +120,8 @@ export function ExternalPlayer({ const navigation = useNavigation() const insets = useSafeAreaInsets() const windowDims = useWindowDimensions() + const externalEmbedsPrefs = useExternalEmbedsPrefs() + const {openModal} = useModalControls() const [isPlayerActive, setPlayerActive] = React.useState(false) const [isLoading, setIsLoading] = React.useState(true) @@ -194,12 +191,26 @@ export function ExternalPlayer({ setIsLoading(false) }, []) - const onPlayPress = React.useCallback((event: GestureResponderEvent) => { - // Prevent this from propagating upward on web - event.preventDefault() + const onPlayPress = React.useCallback( + (event: GestureResponderEvent) => { + // Prevent this from propagating upward on web + event.preventDefault() - setPlayerActive(true) - }, []) + if (externalEmbedsPrefs?.[params.source] === undefined) { + openModal({ + name: 'embed-consent', + source: params.source, + onAccept: () => { + setPlayerActive(true) + }, + }) + return + } + + setPlayerActive(true) + }, + [externalEmbedsPrefs, openModal, params.source], + ) // measure the layout to set sizing const onLayout = React.useCallback( @@ -231,7 +242,6 @@ export function ExternalPlayer({ accessibilityIgnoresInvertColors /> )} - +export function PreferencesExternalEmbeds({}: Props) { + const pal = usePalette('default') + const setMinimalShellMode = useSetMinimalShellMode() + const {screen} = useAnalytics() + const {isMobile} = useWebMediaQueries() + + useFocusEffect( + React.useCallback(() => { + screen('PreferencesExternalEmbeds') + setMinimalShellMode(false) + }, [screen, setMinimalShellMode]), + ) + + return ( + + + + + External Media Preferences + + + Customize media from external sites. + + + + + + + + + External media may allow websites to collect information about + you and your device. No information is sent or requested until + you press the "play" button. + + + + + + Enable media players for + + {Object.entries(externalEmbedLabels).map(([key, label]) => ( + + ))} + + + ) +} + +function PrefSelector({ + source, + label, +}: { + source: EmbedPlayerSource + label: string +}) { + const pal = usePalette('default') + const setExternalEmbedPref = useSetExternalEmbedPref() + const sources = useExternalEmbedsPrefs() + + return ( + + + + setExternalEmbedPref( + source, + sources?.[source] === 'show' ? 'hide' : 'show', + ) + } + /> + + + ) +} + +const styles = StyleSheet.create({ + heading: { + paddingHorizontal: 18, + paddingTop: 14, + paddingBottom: 14, + }, + spacer: { + height: 8, + }, + infoCard: { + paddingHorizontal: 20, + paddingVertical: 14, + }, + toggleCard: { + paddingVertical: 8, + paddingHorizontal: 6, + marginBottom: 1, + }, +}) diff --git a/src/view/screens/Settings.tsx b/src/view/screens/Settings.tsx index 5b381a1388..fedd348e2a 100644 --- a/src/view/screens/Settings.tsx +++ b/src/view/screens/Settings.tsx @@ -563,6 +563,39 @@ export function SettingsScreen({}: Props) { Moderation + + + + + Privacy + + + navigation.navigate('PreferencesExternalEmbeds') + } + accessibilityRole="button" + accessibilityHint="" + accessibilityLabel={_(msg`Opens external embeds settings`)}> + + + + + External Media Preferences + + + diff --git a/yarn.lock b/yarn.lock index d724c7821c..0546ca5d1a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18304,13 +18304,6 @@ react-native-webview@^13.6.3: 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.73.1: version "0.73.1" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.73.1.tgz#5eafaa7e54feeab8b55e8b8e4efc4d21052a4fff" From 6e8650e2ebbb3d9dbe5e1d625ec1ee706284b124 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Thu, 4 Jan 2024 17:40:28 -0800 Subject: [PATCH 5/9] 1.63 --- app.config.js | 4 +- package.json | 2 +- src/locale/locales/de/messages.po | 119 +++++++++++++++++++------- src/locale/locales/en/messages.po | 119 +++++++++++++++++++------- src/locale/locales/es/messages.po | 119 +++++++++++++++++++------- src/locale/locales/fr/messages.po | 119 +++++++++++++++++++------- src/locale/locales/hi/messages.po | 119 +++++++++++++++++++------- src/locale/locales/ja/messages.po | 119 +++++++++++++++++++------- src/locale/locales/ko/messages.po | 119 +++++++++++++++++++------- src/locale/locales/pt-BR/messages.po | 119 +++++++++++++++++++------- src/locale/locales/uk/messages.po | 120 ++++++++++++++++++++------- 11 files changed, 813 insertions(+), 265 deletions(-) diff --git a/app.config.js b/app.config.js index 312b9ea201..37e583e4f0 100644 --- a/app.config.js +++ b/app.config.js @@ -9,12 +9,12 @@ module.exports = function () { /** * iOS build number. Must be incremented for each TestFlight version. */ - const IOS_BUILD_NUMBER = '2' + const IOS_BUILD_NUMBER = '1' /** * Android build number. Must be incremented for each release. */ - const ANDROID_VERSION_CODE = 53 + const ANDROID_VERSION_CODE = 54 /** * Uses built-in Expo env vars diff --git a/package.json b/package.json index 68dc2e0dcb..e7194bc9cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bsky.app", - "version": "1.62.0", + "version": "1.63.0", "private": true, "engines": { "node": ">=18" diff --git a/src/locale/locales/de/messages.po b/src/locale/locales/de/messages.po index 35305b55a7..4926b30ae0 100644 --- a/src/locale/locales/de/messages.po +++ b/src/locale/locales/de/messages.po @@ -144,7 +144,7 @@ msgstr "Passen Sie die Anzahl der Likes an, die eine Antwort haben muss, um in I msgid "Adult Content" msgstr "Inhalt für Erwachsene" -#: src/view/screens/Settings.tsx:569 +#: src/view/screens/Settings.tsx:602 msgid "Advanced" msgstr "Fortgeschrittene" @@ -177,7 +177,7 @@ msgstr "und" msgid "App Language" msgstr "App Sprache" -#: src/view/screens/Settings.tsx:589 +#: src/view/screens/Settings.tsx:622 msgid "App passwords" msgstr "App-Passwörter" @@ -328,7 +328,7 @@ msgstr "Bluesky wird dein Profil und deine Beiträge nicht für abgemeldete Benu msgid "Bluesky.Social" msgstr "Bluesky.Social" -#: src/view/screens/Settings.tsx:718 +#: src/view/screens/Settings.tsx:751 msgid "Build version {0} {1}" msgstr "Version bauen {0} {1}" @@ -403,8 +403,8 @@ msgstr "Anmeldung zur Warteliste abbrechen" msgid "Change" msgstr "Ändern" -#: src/view/screens/Settings.tsx:601 -#: src/view/screens/Settings.tsx:610 +#: src/view/screens/Settings.tsx:634 +#: src/view/screens/Settings.tsx:643 msgid "Change handle" msgstr "Änderungsgriff andern" @@ -448,19 +448,19 @@ msgstr "Wählen Sie die Algorithmen, die Ihr Erlebnis mit benutzerdefinierten Fe msgid "Choose your password" msgstr "Wählen Sie Ihr Passwort" -#: src/view/screens/Settings.tsx:694 +#: src/view/screens/Settings.tsx:727 msgid "Clear all legacy storage data" msgstr "Alle alten Speicherdaten löschen" -#: src/view/screens/Settings.tsx:696 +#: src/view/screens/Settings.tsx:729 msgid "Clear all legacy storage data (restart after this)" msgstr "Alle alten Speicherdaten löschen (danach neu starten)" -#: src/view/screens/Settings.tsx:706 +#: src/view/screens/Settings.tsx:739 msgid "Clear all storage data" msgstr "Alle alten Speicherdaten löschen" -#: src/view/screens/Settings.tsx:708 +#: src/view/screens/Settings.tsx:741 msgid "Clear all storage data (restart after this)" msgstr "Alle alten Speicherdaten löschen (danach neu starten)" @@ -616,11 +616,15 @@ msgstr "Erstellt {0}" msgid "Custom domain" msgstr "Benutzerdefinierter Bereich" -#: src/view/screens/Settings.tsx:615 +#: src/view/screens/PreferencesExternalEmbeds.tsx:55 +msgid "Customize media from external sites." +msgstr "" + +#: src/view/screens/Settings.tsx:648 msgid "Danger Zone" msgstr "Gefahrenzone" -#: src/view/screens/Settings.tsx:622 +#: src/view/screens/Settings.tsx:655 msgid "Delete account" msgstr "Konto löschen" @@ -642,7 +646,7 @@ msgstr "Liste löschen" msgid "Delete my account" msgstr "Mein Konto löschen" -#: src/view/screens/Settings.tsx:632 +#: src/view/screens/Settings.tsx:665 msgid "Delete my account…" msgstr "Mein Konto löschen..." @@ -669,7 +673,7 @@ msgstr "Beschreibung" msgid "Dev Server" msgstr "Entwicklungs-Server" -#: src/view/screens/Settings.tsx:637 +#: src/view/screens/Settings.tsx:670 msgid "Developer Tools" msgstr "Werkzeuge für Entwickler" @@ -778,6 +782,14 @@ msgstr "Email aktualiziert" msgid "Email:" msgstr "E-Mail:" +#: src/view/com/modals/EmbedConsent.tsx:113 +msgid "Enable {0} only" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:97 +msgid "Enable External Media" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:144 msgid "Enable this setting to only see replies between people you follow." msgstr "Aktivieren Sie diese Einstellung, um nur Antworten zwischen Personen zu sehen, denen Sie folgen." @@ -822,6 +834,20 @@ msgstr "Alle" msgid "Expand alt text" msgstr "Alt-Text erweitern" +#: src/view/com/modals/EmbedConsent.tsx:64 +msgid "External Media" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:75 +#: src/view/screens/PreferencesExternalEmbeds.tsx:66 +msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." +msgstr "" + +#: src/view/screens/PreferencesExternalEmbeds.tsx:52 +#: src/view/screens/Settings.tsx:595 +msgid "External Media Preferences" +msgstr "" + #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109 #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141 msgid "Failed to load recommended feeds" @@ -1318,6 +1344,11 @@ msgstr "Meine gespeicherte Feeds " msgid "Name" msgstr "Namen" +#: src/view/com/modals/EmbedConsent.tsx:107 +#: src/view/com/modals/EmbedConsent.tsx:123 +msgid "Never load embeds from {0}" +msgstr "" + #: src/view/com/auth/onboarding/WelcomeMobile.tsx:72 msgid "Never lose access to your followers and data." msgstr "Verlieren Sie nie den Zugriff auf Ihre Follower und Daten." @@ -1389,6 +1420,10 @@ msgstr "Keine Ergebnisse gefunden für \"{query}\"" msgid "No results found for {query}" msgstr "Keine Ergebnisse gefunden für {query}" +#: src/view/com/modals/EmbedConsent.tsx:129 +msgid "No thanks" +msgstr "" + #: src/view/com/modals/Threadgate.tsx:82 msgid "Nobody" msgstr "Niemand" @@ -1443,6 +1478,10 @@ msgstr "Offene Navigation" msgid "Opens configurable language settings" msgstr "Öffnet die konfigurierbaren Spracheinstellungen" +#: src/view/screens/Settings.tsx:587 +msgid "Opens external embeds settings" +msgstr "" + #: src/view/shell/desktop/RightNav.tsx:156 #: src/view/shell/Drawer.tsx:641 msgid "Opens list of invite codes" @@ -1460,7 +1499,7 @@ msgstr "Öffnet die Moderationseinstellungen" msgid "Opens screen with all saved feeds" msgstr "Öffnet den Bildschirm mit allen gespeicherten Feeds" -#: src/view/screens/Settings.tsx:581 +#: src/view/screens/Settings.tsx:614 msgid "Opens the app password settings page" msgstr "Öffnet die Einstellungsseite für das App-Passwort" @@ -1468,11 +1507,11 @@ msgstr "Öffnet die Einstellungsseite für das App-Passwort" msgid "Opens the home feed preferences" msgstr "Öffnet die Homefeed-Einstellungen" -#: src/view/screens/Settings.tsx:664 +#: src/view/screens/Settings.tsx:697 msgid "Opens the storybook page" msgstr "Öffnet die Märchenbuchseite" -#: src/view/screens/Settings.tsx:644 +#: src/view/screens/Settings.tsx:677 msgid "Opens the system log page" msgstr "Öffnet die Systemprotokollseite" @@ -1525,6 +1564,19 @@ msgstr "Bilder, die für Erwachsene gedacht sind." msgid "Pinned Feeds" msgstr "Angepinnte Feeds" +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:111 +msgid "Play {0}" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:54 +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:55 +msgid "Play Video" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:110 +msgid "Plays the GIF" +msgstr "" + #: src/view/com/auth/create/state.ts:116 msgid "Please choose your handle." msgstr "Bitte wählen Sie Ihren Handgriff." @@ -1605,12 +1657,13 @@ msgstr "Primäre Sprache" msgid "Prioritize Your Follows" msgstr "Priorisieren Sie Ihre Anhängerschaft" +#: src/view/screens/Settings.tsx:570 #: src/view/shell/desktop/RightNav.tsx:84 msgid "Privacy" msgstr "Privatsphäre" #: src/view/screens/PrivacyPolicy.tsx:29 -#: src/view/screens/Settings.tsx:750 +#: src/view/screens/Settings.tsx:783 #: src/view/shell/Drawer.tsx:262 msgid "Privacy Policy" msgstr "Datenschutzbestimmungen" @@ -1627,7 +1680,7 @@ msgstr "Verarbeitung..." msgid "Profile" msgstr "Profile" -#: src/view/screens/Settings.tsx:808 +#: src/view/screens/Settings.tsx:841 msgid "Protect your account by verifying your email." msgstr "Schützen Sie Ihr Konto, indem Sie Ihre E-Mail verifizieren." @@ -1774,7 +1827,7 @@ msgstr "Für diesen Anbieter erforderlich" msgid "Reset code" msgstr "Code zurücksetzen" -#: src/view/screens/Settings.tsx:686 +#: src/view/screens/Settings.tsx:719 msgid "Reset onboarding state" msgstr "Onboarding-Status zurücksetzen" @@ -1782,15 +1835,15 @@ msgstr "Onboarding-Status zurücksetzen" msgid "Reset password" msgstr "Passwort zurücksetzen" -#: src/view/screens/Settings.tsx:676 +#: src/view/screens/Settings.tsx:709 msgid "Reset preferences state" msgstr "Einstellungen zurücksetzen" -#: src/view/screens/Settings.tsx:684 +#: src/view/screens/Settings.tsx:717 msgid "Resets the onboarding state" msgstr "Onboarding-Status zurücksetzen" -#: src/view/screens/Settings.tsx:674 +#: src/view/screens/Settings.tsx:707 msgid "Resets the preferences state" msgstr "Setzt den Zustand der Einstellungen zurück" @@ -1957,6 +2010,10 @@ msgstr "Zeigen" msgid "Show anyway" msgstr "Trotzdem anzeigen" +#: src/view/com/modals/EmbedConsent.tsx:87 +msgid "Show embeds from {0}" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:255 msgid "Show Posts from My Feeds" msgstr "Beiträge von My Feeds anzeigen" @@ -2064,11 +2121,11 @@ msgstr "Platz" msgid "Staging" msgstr "Aufführung" -#: src/view/screens/Settings.tsx:730 +#: src/view/screens/Settings.tsx:763 msgid "Status page" msgstr "Status-Seite" -#: src/view/screens/Settings.tsx:666 +#: src/view/screens/Settings.tsx:699 msgid "Storybook" msgstr "Märchenbuch" @@ -2097,7 +2154,7 @@ msgstr "Unterstützung" msgid "Switch Account" msgstr "Konto wechseln" -#: src/view/screens/Settings.tsx:646 +#: src/view/screens/Settings.tsx:679 msgid "System log" msgstr "System-Protokoll" @@ -2109,7 +2166,7 @@ msgstr "Groß" msgid "Terms" msgstr "Bedingungen" -#: src/view/screens/Settings.tsx:744 +#: src/view/screens/Settings.tsx:777 #: src/view/screens/TermsOfService.tsx:29 #: src/view/shell/Drawer.tsx:256 msgid "Terms of Service" @@ -2164,6 +2221,10 @@ msgstr "Diese {screenDescription} wurde markiert:" msgid "This account has requested that users sign in to view their profile." msgstr "Dieses Konto hat die Benutzer aufgefordert, sich anzumelden, um ihr Profil zu sehen." +#: src/view/com/modals/EmbedConsent.tsx:68 +msgid "This content is hosted by {0}. Do you want to enable external media?" +msgstr "" + #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." msgstr "Dieser Inhalt kann ohne Bluesky-Konto nicht angezeigt werden." @@ -2328,15 +2389,15 @@ msgstr "Benutzer gefolgt von <0/>" msgid "Users in \"{0}\"" msgstr "Benutzer in \"{0}\"" -#: src/view/screens/Settings.tsx:769 +#: src/view/screens/Settings.tsx:802 msgid "Verify email" msgstr "E-Mail überprüfen" -#: src/view/screens/Settings.tsx:794 +#: src/view/screens/Settings.tsx:827 msgid "Verify my email" msgstr "E-Mail überprüfen" -#: src/view/screens/Settings.tsx:803 +#: src/view/screens/Settings.tsx:836 msgid "Verify My Email" msgstr "E-Mail überprüfen" diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 4cb4554ac7..3e2b776fae 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -164,7 +164,7 @@ msgstr "" msgid "Adult Content" msgstr "" -#: src/view/screens/Settings.tsx:569 +#: src/view/screens/Settings.tsx:602 msgid "Advanced" msgstr "" @@ -197,7 +197,7 @@ msgstr "" msgid "App Language" msgstr "" -#: src/view/screens/Settings.tsx:589 +#: src/view/screens/Settings.tsx:622 msgid "App passwords" msgstr "" @@ -356,7 +356,7 @@ msgstr "" msgid "Bluesky.Social" msgstr "" -#: src/view/screens/Settings.tsx:718 +#: src/view/screens/Settings.tsx:751 msgid "Build version {0} {1}" msgstr "" @@ -431,8 +431,8 @@ msgstr "" msgid "Change" msgstr "" -#: src/view/screens/Settings.tsx:601 -#: src/view/screens/Settings.tsx:610 +#: src/view/screens/Settings.tsx:634 +#: src/view/screens/Settings.tsx:643 msgid "Change handle" msgstr "" @@ -480,19 +480,19 @@ msgstr "" msgid "Choose your password" msgstr "" -#: src/view/screens/Settings.tsx:694 +#: src/view/screens/Settings.tsx:727 msgid "Clear all legacy storage data" msgstr "" -#: src/view/screens/Settings.tsx:696 +#: src/view/screens/Settings.tsx:729 msgid "Clear all legacy storage data (restart after this)" msgstr "" -#: src/view/screens/Settings.tsx:706 +#: src/view/screens/Settings.tsx:739 msgid "Clear all storage data" msgstr "" -#: src/view/screens/Settings.tsx:708 +#: src/view/screens/Settings.tsx:741 msgid "Clear all storage data (restart after this)" msgstr "" @@ -648,7 +648,11 @@ msgstr "" msgid "Custom domain" msgstr "" -#: src/view/screens/Settings.tsx:615 +#: src/view/screens/PreferencesExternalEmbeds.tsx:55 +msgid "Customize media from external sites." +msgstr "" + +#: src/view/screens/Settings.tsx:648 msgid "Danger Zone" msgstr "" @@ -656,7 +660,7 @@ msgstr "" #~ msgid "Dark" #~ msgstr "" -#: src/view/screens/Settings.tsx:622 +#: src/view/screens/Settings.tsx:655 msgid "Delete account" msgstr "" @@ -678,7 +682,7 @@ msgstr "" msgid "Delete my account" msgstr "" -#: src/view/screens/Settings.tsx:632 +#: src/view/screens/Settings.tsx:665 msgid "Delete my account…" msgstr "" @@ -705,7 +709,7 @@ msgstr "" msgid "Dev Server" msgstr "" -#: src/view/screens/Settings.tsx:637 +#: src/view/screens/Settings.tsx:670 msgid "Developer Tools" msgstr "" @@ -814,6 +818,14 @@ msgstr "" msgid "Email:" msgstr "" +#: src/view/com/modals/EmbedConsent.tsx:113 +msgid "Enable {0} only" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:97 +msgid "Enable External Media" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:144 msgid "Enable this setting to only see replies between people you follow." msgstr "" @@ -858,6 +870,20 @@ msgstr "" msgid "Expand alt text" msgstr "" +#: src/view/com/modals/EmbedConsent.tsx:64 +msgid "External Media" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:75 +#: src/view/screens/PreferencesExternalEmbeds.tsx:66 +msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." +msgstr "" + +#: src/view/screens/PreferencesExternalEmbeds.tsx:52 +#: src/view/screens/Settings.tsx:595 +msgid "External Media Preferences" +msgstr "" + #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109 #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141 msgid "Failed to load recommended feeds" @@ -1395,6 +1421,11 @@ msgstr "" msgid "Name" msgstr "" +#: src/view/com/modals/EmbedConsent.tsx:107 +#: src/view/com/modals/EmbedConsent.tsx:123 +msgid "Never load embeds from {0}" +msgstr "" + #: src/view/com/auth/onboarding/WelcomeMobile.tsx:72 msgid "Never lose access to your followers and data." msgstr "" @@ -1471,6 +1502,10 @@ msgstr "" msgid "No results found for {query}" msgstr "" +#: src/view/com/modals/EmbedConsent.tsx:129 +msgid "No thanks" +msgstr "" + #: src/view/com/modals/Threadgate.tsx:82 msgid "Nobody" msgstr "" @@ -1537,6 +1572,10 @@ msgstr "" msgid "Opens configurable language settings" msgstr "" +#: src/view/screens/Settings.tsx:587 +msgid "Opens external embeds settings" +msgstr "" + #: src/view/shell/desktop/RightNav.tsx:156 #: src/view/shell/Drawer.tsx:641 msgid "Opens list of invite codes" @@ -1554,7 +1593,7 @@ msgstr "" msgid "Opens screen with all saved feeds" msgstr "" -#: src/view/screens/Settings.tsx:581 +#: src/view/screens/Settings.tsx:614 msgid "Opens the app password settings page" msgstr "" @@ -1562,11 +1601,11 @@ msgstr "" msgid "Opens the home feed preferences" msgstr "" -#: src/view/screens/Settings.tsx:664 +#: src/view/screens/Settings.tsx:697 msgid "Opens the storybook page" msgstr "" -#: src/view/screens/Settings.tsx:644 +#: src/view/screens/Settings.tsx:677 msgid "Opens the system log page" msgstr "" @@ -1619,6 +1658,19 @@ msgstr "" msgid "Pinned Feeds" msgstr "" +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:111 +msgid "Play {0}" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:54 +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:55 +msgid "Play Video" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:110 +msgid "Plays the GIF" +msgstr "" + #: src/view/com/auth/create/state.ts:116 msgid "Please choose your handle." msgstr "" @@ -1699,12 +1751,13 @@ msgstr "" msgid "Prioritize Your Follows" msgstr "" +#: src/view/screens/Settings.tsx:570 #: src/view/shell/desktop/RightNav.tsx:84 msgid "Privacy" msgstr "" #: src/view/screens/PrivacyPolicy.tsx:29 -#: src/view/screens/Settings.tsx:750 +#: src/view/screens/Settings.tsx:783 #: src/view/shell/Drawer.tsx:262 msgid "Privacy Policy" msgstr "" @@ -1721,7 +1774,7 @@ msgstr "" msgid "Profile" msgstr "" -#: src/view/screens/Settings.tsx:808 +#: src/view/screens/Settings.tsx:841 msgid "Protect your account by verifying your email." msgstr "" @@ -1877,7 +1930,7 @@ msgstr "" msgid "Reset code" msgstr "" -#: src/view/screens/Settings.tsx:686 +#: src/view/screens/Settings.tsx:719 msgid "Reset onboarding state" msgstr "" @@ -1885,15 +1938,15 @@ msgstr "" msgid "Reset password" msgstr "" -#: src/view/screens/Settings.tsx:676 +#: src/view/screens/Settings.tsx:709 msgid "Reset preferences state" msgstr "" -#: src/view/screens/Settings.tsx:684 +#: src/view/screens/Settings.tsx:717 msgid "Resets the onboarding state" msgstr "" -#: src/view/screens/Settings.tsx:674 +#: src/view/screens/Settings.tsx:707 msgid "Resets the preferences state" msgstr "" @@ -2076,6 +2129,10 @@ msgstr "" msgid "Show anyway" msgstr "" +#: src/view/com/modals/EmbedConsent.tsx:87 +msgid "Show embeds from {0}" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:255 msgid "Show Posts from My Feeds" msgstr "" @@ -2183,11 +2240,11 @@ msgstr "" msgid "Staging" msgstr "" -#: src/view/screens/Settings.tsx:730 +#: src/view/screens/Settings.tsx:763 msgid "Status page" msgstr "" -#: src/view/screens/Settings.tsx:666 +#: src/view/screens/Settings.tsx:699 msgid "Storybook" msgstr "" @@ -2220,7 +2277,7 @@ msgstr "" #~ msgid "System" #~ msgstr "" -#: src/view/screens/Settings.tsx:646 +#: src/view/screens/Settings.tsx:679 msgid "System log" msgstr "" @@ -2232,7 +2289,7 @@ msgstr "" msgid "Terms" msgstr "" -#: src/view/screens/Settings.tsx:744 +#: src/view/screens/Settings.tsx:777 #: src/view/screens/TermsOfService.tsx:29 #: src/view/shell/Drawer.tsx:256 msgid "Terms of Service" @@ -2287,6 +2344,10 @@ msgstr "" msgid "This account has requested that users sign in to view their profile." msgstr "" +#: src/view/com/modals/EmbedConsent.tsx:68 +msgid "This content is hosted by {0}. Do you want to enable external media?" +msgstr "" + #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." msgstr "" @@ -2455,15 +2516,15 @@ msgstr "" msgid "Users in \"{0}\"" msgstr "" -#: src/view/screens/Settings.tsx:769 +#: src/view/screens/Settings.tsx:802 msgid "Verify email" msgstr "" -#: src/view/screens/Settings.tsx:794 +#: src/view/screens/Settings.tsx:827 msgid "Verify my email" msgstr "" -#: src/view/screens/Settings.tsx:803 +#: src/view/screens/Settings.tsx:836 msgid "Verify My Email" msgstr "" diff --git a/src/locale/locales/es/messages.po b/src/locale/locales/es/messages.po index 9cea00365c..5ecee6966f 100644 --- a/src/locale/locales/es/messages.po +++ b/src/locale/locales/es/messages.po @@ -144,7 +144,7 @@ msgstr "Ajusta el número de Me gusta que debe tener una respuesta para que se m msgid "Adult Content" msgstr "Contenido para adultos" -#: src/view/screens/Settings.tsx:569 +#: src/view/screens/Settings.tsx:602 msgid "Advanced" msgstr "Avanzado" @@ -177,7 +177,7 @@ msgstr "y" msgid "App Language" msgstr "Lenguaje de app" -#: src/view/screens/Settings.tsx:589 +#: src/view/screens/Settings.tsx:622 msgid "App passwords" msgstr "Contraseñas de la app" @@ -324,7 +324,7 @@ msgstr "Bluesky no mostrará tu perfil ni tus publicaciones a los usuarios que h msgid "Bluesky.Social" msgstr "Bluesky.Social" -#: src/view/screens/Settings.tsx:718 +#: src/view/screens/Settings.tsx:751 msgid "Build version {0} {1}" msgstr "Versión {0} {1}" @@ -399,8 +399,8 @@ msgstr "Cancelar la inscripción en la lista de espera" msgid "Change" msgstr "Cambiar" -#: src/view/screens/Settings.tsx:601 -#: src/view/screens/Settings.tsx:610 +#: src/view/screens/Settings.tsx:634 +#: src/view/screens/Settings.tsx:643 msgid "Change handle" msgstr "Cambiar el identificador" @@ -444,19 +444,19 @@ msgstr "Elige los algoritmos que potencian tu experiencia con publicaciones pers msgid "Choose your password" msgstr "Elige tu contraseña" -#: src/view/screens/Settings.tsx:694 +#: src/view/screens/Settings.tsx:727 msgid "Clear all legacy storage data" msgstr "Borrar todos los datos de almacenamiento heredados" -#: src/view/screens/Settings.tsx:696 +#: src/view/screens/Settings.tsx:729 msgid "Clear all legacy storage data (restart after this)" msgstr "Borrar todos los datos de almacenamiento heredados (reiniciar después de esto)" -#: src/view/screens/Settings.tsx:706 +#: src/view/screens/Settings.tsx:739 msgid "Clear all storage data" msgstr "Borrar todos los datos de almacenamiento" -#: src/view/screens/Settings.tsx:708 +#: src/view/screens/Settings.tsx:741 msgid "Clear all storage data (restart after this)" msgstr "Borrar todos los datos de almacenamiento (reiniciar después de esto)" @@ -612,11 +612,15 @@ msgstr "Creado {0}" msgid "Custom domain" msgstr "Dominio personalizado" -#: src/view/screens/Settings.tsx:615 +#: src/view/screens/PreferencesExternalEmbeds.tsx:55 +msgid "Customize media from external sites." +msgstr "" + +#: src/view/screens/Settings.tsx:648 msgid "Danger Zone" msgstr "Zona de peligro" -#: src/view/screens/Settings.tsx:622 +#: src/view/screens/Settings.tsx:655 msgid "Delete account" msgstr "Borrar la cuenta" @@ -638,7 +642,7 @@ msgstr "Borrar la lista" msgid "Delete my account" msgstr "Borrar mi cuenta" -#: src/view/screens/Settings.tsx:632 +#: src/view/screens/Settings.tsx:665 msgid "Delete my account…" msgstr "Borrar mi cuenta..." @@ -665,7 +669,7 @@ msgstr "Descripción" msgid "Dev Server" msgstr "Servidor de desarrollo" -#: src/view/screens/Settings.tsx:637 +#: src/view/screens/Settings.tsx:670 msgid "Developer Tools" msgstr "Herramientas de desarrollador" @@ -774,6 +778,14 @@ msgstr "Correo electrónico actualizado" msgid "Email:" msgstr "Correo electrónico:" +#: src/view/com/modals/EmbedConsent.tsx:113 +msgid "Enable {0} only" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:97 +msgid "Enable External Media" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:144 msgid "Enable this setting to only see replies between people you follow." msgstr "Activa esta opción para ver sólo las respuestas de las personas a las que sigues." @@ -818,6 +830,20 @@ msgstr "Todos" msgid "Expand alt text" msgstr "Expandir el texto alt" +#: src/view/com/modals/EmbedConsent.tsx:64 +msgid "External Media" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:75 +#: src/view/screens/PreferencesExternalEmbeds.tsx:66 +msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." +msgstr "" + +#: src/view/screens/PreferencesExternalEmbeds.tsx:52 +#: src/view/screens/Settings.tsx:595 +msgid "External Media Preferences" +msgstr "" + #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109 #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141 msgid "Failed to load recommended feeds" @@ -1310,6 +1336,11 @@ msgstr "Mis canales de noticias guardados" msgid "Name" msgstr "Nombre" +#: src/view/com/modals/EmbedConsent.tsx:107 +#: src/view/com/modals/EmbedConsent.tsx:123 +msgid "Never load embeds from {0}" +msgstr "" + #: src/view/com/auth/onboarding/WelcomeMobile.tsx:72 msgid "Never lose access to your followers and data." msgstr "No pierdas nunca el acceso a tus seguidores y datos." @@ -1381,6 +1412,10 @@ msgstr "No se han encontrado resultados para \"{query}\"" msgid "No results found for {query}" msgstr "No se han encontrado resultados para {query}" +#: src/view/com/modals/EmbedConsent.tsx:129 +msgid "No thanks" +msgstr "" + #: src/view/com/modals/Threadgate.tsx:82 msgid "Nobody" msgstr "Nadie" @@ -1435,6 +1470,10 @@ msgstr "Abrir navegación" msgid "Opens configurable language settings" msgstr "Abrir la configuración del idioma que se puede ajustar" +#: src/view/screens/Settings.tsx:587 +msgid "Opens external embeds settings" +msgstr "" + #: src/view/shell/desktop/RightNav.tsx:156 #: src/view/shell/Drawer.tsx:641 msgid "Opens list of invite codes" @@ -1452,7 +1491,7 @@ msgstr "Abre la configuración de moderación" msgid "Opens screen with all saved feeds" msgstr "Abre la pantalla con todas las noticias guardadas" -#: src/view/screens/Settings.tsx:581 +#: src/view/screens/Settings.tsx:614 msgid "Opens the app password settings page" msgstr "Abre la página de configuración de la contraseña de la app" @@ -1460,11 +1499,11 @@ msgstr "Abre la página de configuración de la contraseña de la app" msgid "Opens the home feed preferences" msgstr "Abre las preferencias de noticias de la página inicial" -#: src/view/screens/Settings.tsx:664 +#: src/view/screens/Settings.tsx:697 msgid "Opens the storybook page" msgstr "Abre la página del libro de cuentos" -#: src/view/screens/Settings.tsx:644 +#: src/view/screens/Settings.tsx:677 msgid "Opens the system log page" msgstr "Abre la página de la bitácora del sistema" @@ -1517,6 +1556,19 @@ msgstr "Imágenes destinadas a adultos." msgid "Pinned Feeds" msgstr "Canales de noticias anclados" +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:111 +msgid "Play {0}" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:54 +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:55 +msgid "Play Video" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:110 +msgid "Plays the GIF" +msgstr "" + #: src/view/com/auth/create/state.ts:116 msgid "Please choose your handle." msgstr "Por favor, elige tu identificador." @@ -1592,12 +1644,13 @@ msgstr "Lenguajes primarios" msgid "Prioritize Your Follows" msgstr "Priorizar los usuarios a los que sigue" +#: src/view/screens/Settings.tsx:570 #: src/view/shell/desktop/RightNav.tsx:84 msgid "Privacy" msgstr "Privacidad" #: src/view/screens/PrivacyPolicy.tsx:29 -#: src/view/screens/Settings.tsx:750 +#: src/view/screens/Settings.tsx:783 #: src/view/shell/Drawer.tsx:262 msgid "Privacy Policy" msgstr "Política de privacidad" @@ -1614,7 +1667,7 @@ msgstr "Procesando..." msgid "Profile" msgstr "Perfil" -#: src/view/screens/Settings.tsx:808 +#: src/view/screens/Settings.tsx:841 msgid "Protect your account by verifying your email." msgstr "Protege tu cuenta verificando tu correo electrónico." @@ -1761,7 +1814,7 @@ msgstr "Requerido para este proveedor" msgid "Reset code" msgstr "Restablecer el código" -#: src/view/screens/Settings.tsx:686 +#: src/view/screens/Settings.tsx:719 msgid "Reset onboarding state" msgstr "Restablecer el estado de incorporación" @@ -1769,15 +1822,15 @@ msgstr "Restablecer el estado de incorporación" msgid "Reset password" msgstr "Restablecer la contraseña" -#: src/view/screens/Settings.tsx:676 +#: src/view/screens/Settings.tsx:709 msgid "Reset preferences state" msgstr "Restablecer el estado de preferencias" -#: src/view/screens/Settings.tsx:684 +#: src/view/screens/Settings.tsx:717 msgid "Resets the onboarding state" msgstr "Restablece el estado de incorporación" -#: src/view/screens/Settings.tsx:674 +#: src/view/screens/Settings.tsx:707 msgid "Resets the preferences state" msgstr "Restablecer el estado de preferencias" @@ -1944,6 +1997,10 @@ msgstr "Mostrar" msgid "Show anyway" msgstr "Mostrar de todas maneras" +#: src/view/com/modals/EmbedConsent.tsx:87 +msgid "Show embeds from {0}" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:255 msgid "Show Posts from My Feeds" msgstr "Mostrar publicaciones de mis noticias" @@ -2051,11 +2108,11 @@ msgstr "Cuadrado" msgid "Staging" msgstr "Puesta en escena" -#: src/view/screens/Settings.tsx:730 +#: src/view/screens/Settings.tsx:763 msgid "Status page" msgstr "Página de estado" -#: src/view/screens/Settings.tsx:666 +#: src/view/screens/Settings.tsx:699 msgid "Storybook" msgstr "Libro de cuentos" @@ -2084,7 +2141,7 @@ msgstr "Soporte" msgid "Switch Account" msgstr "Cambiar a otra cuenta" -#: src/view/screens/Settings.tsx:646 +#: src/view/screens/Settings.tsx:679 msgid "System log" msgstr "Bitácora del sistema" @@ -2096,7 +2153,7 @@ msgstr "Alto" msgid "Terms" msgstr "Condiciones" -#: src/view/screens/Settings.tsx:744 +#: src/view/screens/Settings.tsx:777 #: src/view/screens/TermsOfService.tsx:29 #: src/view/shell/Drawer.tsx:256 msgid "Terms of Service" @@ -2147,6 +2204,10 @@ msgstr "Esta {screenDescription} ha sido marcada:" msgid "This account has requested that users sign in to view their profile." msgstr "Esta cuenta ha solicitado que los usuarios inicien sesión para ver su perfil." +#: src/view/com/modals/EmbedConsent.tsx:68 +msgid "This content is hosted by {0}. Do you want to enable external media?" +msgstr "" + #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." msgstr "Este contenido no se puede ver sin una cuenta Bluesky." @@ -2311,15 +2372,15 @@ msgstr "usuarios seguidos por <0/>" msgid "Users in \"{0}\"" msgstr "Usuarios en «{0}»" -#: src/view/screens/Settings.tsx:769 +#: src/view/screens/Settings.tsx:802 msgid "Verify email" msgstr "Verificar el correo electrónico" -#: src/view/screens/Settings.tsx:794 +#: src/view/screens/Settings.tsx:827 msgid "Verify my email" msgstr "Verificar mi correo electrónico" -#: src/view/screens/Settings.tsx:803 +#: src/view/screens/Settings.tsx:836 msgid "Verify My Email" msgstr "Verificar mi correo electrónico" diff --git a/src/locale/locales/fr/messages.po b/src/locale/locales/fr/messages.po index c4f30087fc..21e8904a65 100644 --- a/src/locale/locales/fr/messages.po +++ b/src/locale/locales/fr/messages.po @@ -144,7 +144,7 @@ msgstr "Définissez le nombre de likes qu’une réponse doit avoir pour être a msgid "Adult Content" msgstr "Contenu pour adultes" -#: src/view/screens/Settings.tsx:569 +#: src/view/screens/Settings.tsx:602 msgid "Advanced" msgstr "Avancé" @@ -177,7 +177,7 @@ msgstr "et" msgid "App Language" msgstr "Langue de l’application" -#: src/view/screens/Settings.tsx:589 +#: src/view/screens/Settings.tsx:622 msgid "App passwords" msgstr "Mots de passe d’application" @@ -327,7 +327,7 @@ msgstr "Bluesky n’affichera pas votre profil et vos messages à des utilisateu msgid "Bluesky.Social" msgstr "Bluesky.Social" -#: src/view/screens/Settings.tsx:718 +#: src/view/screens/Settings.tsx:751 msgid "Build version {0} {1}" msgstr "Version Build {0} {1}" @@ -402,8 +402,8 @@ msgstr "Annuler l’inscription sur la liste d’attente" msgid "Change" msgstr "Changer" -#: src/view/screens/Settings.tsx:601 -#: src/view/screens/Settings.tsx:610 +#: src/view/screens/Settings.tsx:634 +#: src/view/screens/Settings.tsx:643 msgid "Change handle" msgstr "Changer le pseudo" @@ -447,19 +447,19 @@ msgstr "Choisissez les algorithmes qui alimentent votre expérience avec des fil msgid "Choose your password" msgstr "Choisissez votre mot de passe" -#: src/view/screens/Settings.tsx:694 +#: src/view/screens/Settings.tsx:727 msgid "Clear all legacy storage data" msgstr "Effacer toutes les données de stockage existantes" -#: src/view/screens/Settings.tsx:696 +#: src/view/screens/Settings.tsx:729 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 +#: src/view/screens/Settings.tsx:739 msgid "Clear all storage data" msgstr "Effacer toutes les données de stockage" -#: src/view/screens/Settings.tsx:708 +#: src/view/screens/Settings.tsx:741 msgid "Clear all storage data (restart after this)" msgstr "Effacer toutes les données de stockage (redémarrer ensuite)" @@ -615,11 +615,15 @@ msgstr "{0} créé" msgid "Custom domain" msgstr "Domaine personnalisé" -#: src/view/screens/Settings.tsx:615 +#: src/view/screens/PreferencesExternalEmbeds.tsx:55 +msgid "Customize media from external sites." +msgstr "" + +#: src/view/screens/Settings.tsx:648 msgid "Danger Zone" msgstr "Zone de danger" -#: src/view/screens/Settings.tsx:622 +#: src/view/screens/Settings.tsx:655 msgid "Delete account" msgstr "Supprimer le compte" @@ -641,7 +645,7 @@ msgstr "Supprimer la liste" msgid "Delete my account" msgstr "Supprimer mon compte" -#: src/view/screens/Settings.tsx:632 +#: src/view/screens/Settings.tsx:665 msgid "Delete my account…" msgstr "Supprimer mon compte…" @@ -668,7 +672,7 @@ msgstr "Description" msgid "Dev Server" msgstr "Serveur de dév" -#: src/view/screens/Settings.tsx:637 +#: src/view/screens/Settings.tsx:670 msgid "Developer Tools" msgstr "Outils de dév" @@ -777,6 +781,14 @@ msgstr "E-mail mis à jour" msgid "Email:" msgstr "E-mail :" +#: src/view/com/modals/EmbedConsent.tsx:113 +msgid "Enable {0} only" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:97 +msgid "Enable External Media" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:144 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." @@ -821,6 +833,20 @@ msgstr "Tout le monde" msgid "Expand alt text" msgstr "Développer le texte alt" +#: src/view/com/modals/EmbedConsent.tsx:64 +msgid "External Media" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:75 +#: src/view/screens/PreferencesExternalEmbeds.tsx:66 +msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." +msgstr "" + +#: src/view/screens/PreferencesExternalEmbeds.tsx:52 +#: src/view/screens/Settings.tsx:595 +msgid "External Media Preferences" +msgstr "" + #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109 #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141 msgid "Failed to load recommended feeds" @@ -1313,6 +1339,11 @@ msgstr "Mes fils d’actu enregistrés" msgid "Name" msgstr "Nom" +#: src/view/com/modals/EmbedConsent.tsx:107 +#: src/view/com/modals/EmbedConsent.tsx:123 +msgid "Never load embeds from {0}" +msgstr "" + #: 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." @@ -1384,6 +1415,10 @@ msgstr "Aucun résultat trouvé pour « {query} »" msgid "No results found for {query}" msgstr "Aucun résultat trouvé pour {query}" +#: src/view/com/modals/EmbedConsent.tsx:129 +msgid "No thanks" +msgstr "" + #: src/view/com/modals/Threadgate.tsx:82 msgid "Nobody" msgstr "Personne" @@ -1438,6 +1473,10 @@ msgstr "Navigation ouverte" msgid "Opens configurable language settings" msgstr "Ouvre les paramètres linguistiques configurables" +#: src/view/screens/Settings.tsx:587 +msgid "Opens external embeds settings" +msgstr "" + #: src/view/shell/desktop/RightNav.tsx:156 #: src/view/shell/Drawer.tsx:641 msgid "Opens list of invite codes" @@ -1455,7 +1494,7 @@ msgstr "Ouvre les paramètres de modération" 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 +#: src/view/screens/Settings.tsx:614 msgid "Opens the app password settings page" msgstr "Ouvre la page de configuration du mot de passe" @@ -1463,11 +1502,11 @@ msgstr "Ouvre la page de configuration du mot de passe" msgid "Opens the home feed preferences" msgstr "Ouvre les préférences du fil d’accueil" -#: src/view/screens/Settings.tsx:664 +#: src/view/screens/Settings.tsx:697 msgid "Opens the storybook page" msgstr "Ouvre la page de l’historique" -#: src/view/screens/Settings.tsx:644 +#: src/view/screens/Settings.tsx:677 msgid "Opens the system log page" msgstr "Ouvre la page du journal système" @@ -1520,6 +1559,19 @@ msgstr "Images destinées aux adultes." msgid "Pinned Feeds" msgstr "Fils épinglés" +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:111 +msgid "Play {0}" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:54 +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:55 +msgid "Play Video" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:110 +msgid "Plays the GIF" +msgstr "" + #: src/view/com/auth/create/state.ts:116 msgid "Please choose your handle." msgstr "Veuillez choisir votre pseudo." @@ -1598,12 +1650,13 @@ msgstr "Langue principale" msgid "Prioritize Your Follows" msgstr "Définissez des priorités de vos suivis" +#: src/view/screens/Settings.tsx:570 #: src/view/shell/desktop/RightNav.tsx:84 msgid "Privacy" msgstr "Vie privée" #: src/view/screens/PrivacyPolicy.tsx:29 -#: src/view/screens/Settings.tsx:750 +#: src/view/screens/Settings.tsx:783 #: src/view/shell/Drawer.tsx:262 msgid "Privacy Policy" msgstr "Charte de confidentialité" @@ -1620,7 +1673,7 @@ msgstr "Traitement…" msgid "Profile" msgstr "Profil" -#: src/view/screens/Settings.tsx:808 +#: src/view/screens/Settings.tsx:841 msgid "Protect your account by verifying your email." msgstr "Protégez votre compte en vérifiant votre e-mail." @@ -1767,7 +1820,7 @@ msgstr "Obligatoire pour ce fournisseur" msgid "Reset code" msgstr "Réinitialiser le code" -#: src/view/screens/Settings.tsx:686 +#: src/view/screens/Settings.tsx:719 msgid "Reset onboarding state" msgstr "Réinitialisation de l’état d’accueil" @@ -1775,15 +1828,15 @@ msgstr "Réinitialisation de l’état d’accueil" msgid "Reset password" msgstr "Réinitialiser mot de passe" -#: src/view/screens/Settings.tsx:676 +#: src/view/screens/Settings.tsx:709 msgid "Reset preferences state" msgstr "Réinitialiser l’état des préférences" -#: src/view/screens/Settings.tsx:684 +#: src/view/screens/Settings.tsx:717 msgid "Resets the onboarding state" msgstr "Réinitialise l’état d’accueil" -#: src/view/screens/Settings.tsx:674 +#: src/view/screens/Settings.tsx:707 msgid "Resets the preferences state" msgstr "Réinitialise l’état des préférences" @@ -1950,6 +2003,10 @@ msgstr "Afficher" msgid "Show anyway" msgstr "Afficher quand même" +#: src/view/com/modals/EmbedConsent.tsx:87 +msgid "Show embeds from {0}" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:255 msgid "Show Posts from My Feeds" msgstr "Afficher les posts de mes fils d’actu" @@ -2057,11 +2114,11 @@ msgstr "Carré" msgid "Staging" msgstr "Mise en scène" -#: src/view/screens/Settings.tsx:730 +#: src/view/screens/Settings.tsx:763 msgid "Status page" msgstr "Page de statut" -#: src/view/screens/Settings.tsx:666 +#: src/view/screens/Settings.tsx:699 msgid "Storybook" msgstr "Historique" @@ -2090,7 +2147,7 @@ msgstr "Soutien" msgid "Switch Account" msgstr "Changer de compte" -#: src/view/screens/Settings.tsx:646 +#: src/view/screens/Settings.tsx:679 msgid "System log" msgstr "Journal système" @@ -2102,7 +2159,7 @@ msgstr "Grand" msgid "Terms" msgstr "Conditions générales" -#: src/view/screens/Settings.tsx:744 +#: src/view/screens/Settings.tsx:777 #: src/view/screens/TermsOfService.tsx:29 #: src/view/shell/Drawer.tsx:256 msgid "Terms of Service" @@ -2156,6 +2213,10 @@ msgstr "Ce {screenDescription} a été signalé :" 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/modals/EmbedConsent.tsx:68 +msgid "This content is hosted by {0}. Do you want to enable external media?" +msgstr "" + #: 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." @@ -2320,15 +2381,15 @@ msgstr "utilisateurs suivis par <0/>" msgid "Users in \"{0}\"" msgstr "Utilisateurs dans « {0} »" -#: src/view/screens/Settings.tsx:769 +#: src/view/screens/Settings.tsx:802 msgid "Verify email" msgstr "Confirmer l’e-mail" -#: src/view/screens/Settings.tsx:794 +#: src/view/screens/Settings.tsx:827 msgid "Verify my email" msgstr "Confirmer mon e-mail" -#: src/view/screens/Settings.tsx:803 +#: src/view/screens/Settings.tsx:836 msgid "Verify My Email" msgstr "Confirmer mon e-mail" diff --git a/src/locale/locales/hi/messages.po b/src/locale/locales/hi/messages.po index 2f2244d52e..793175dea6 100644 --- a/src/locale/locales/hi/messages.po +++ b/src/locale/locales/hi/messages.po @@ -164,7 +164,7 @@ msgstr "पसंद की संख्या को समायोजित msgid "Adult Content" msgstr "वयस्क सामग्री" -#: src/view/screens/Settings.tsx:569 +#: src/view/screens/Settings.tsx:602 msgid "Advanced" msgstr "विकसित" @@ -197,7 +197,7 @@ msgstr "और" msgid "App Language" msgstr "ऐप भाषा" -#: src/view/screens/Settings.tsx:589 +#: src/view/screens/Settings.tsx:622 msgid "App passwords" msgstr "ऐप पासवर्ड" @@ -356,7 +356,7 @@ msgstr "" msgid "Bluesky.Social" msgstr "Bluesky.Social" -#: src/view/screens/Settings.tsx:718 +#: src/view/screens/Settings.tsx:751 msgid "Build version {0} {1}" msgstr "Build version {0} {1}" @@ -431,8 +431,8 @@ msgstr "प्रतीक्षा सूची पंजीकरण मत msgid "Change" msgstr "परिवर्तन" -#: src/view/screens/Settings.tsx:601 -#: src/view/screens/Settings.tsx:610 +#: src/view/screens/Settings.tsx:634 +#: src/view/screens/Settings.tsx:643 msgid "Change handle" msgstr "हैंडल बदलें" @@ -476,19 +476,19 @@ msgstr "उन एल्गोरिदम का चयन करें जो msgid "Choose your password" msgstr "अपना पासवर्ड चुनें" -#: src/view/screens/Settings.tsx:694 +#: src/view/screens/Settings.tsx:727 msgid "Clear all legacy storage data" msgstr "" -#: src/view/screens/Settings.tsx:696 +#: src/view/screens/Settings.tsx:729 msgid "Clear all legacy storage data (restart after this)" msgstr "" -#: src/view/screens/Settings.tsx:706 +#: src/view/screens/Settings.tsx:739 msgid "Clear all storage data" msgstr "" -#: src/view/screens/Settings.tsx:708 +#: src/view/screens/Settings.tsx:741 msgid "Clear all storage data (restart after this)" msgstr "" @@ -644,7 +644,11 @@ msgstr "बनाया गया {0}" msgid "Custom domain" msgstr "कस्टम डोमेन" -#: src/view/screens/Settings.tsx:615 +#: src/view/screens/PreferencesExternalEmbeds.tsx:55 +msgid "Customize media from external sites." +msgstr "" + +#: src/view/screens/Settings.tsx:648 msgid "Danger Zone" msgstr "खतरा क्षेत्र" @@ -652,7 +656,7 @@ msgstr "खतरा क्षेत्र" #~ msgid "Dark" #~ msgstr "डार्क मोड" -#: src/view/screens/Settings.tsx:622 +#: src/view/screens/Settings.tsx:655 msgid "Delete account" msgstr "खाता हटाएं" @@ -674,7 +678,7 @@ msgstr "सूची हटाएँ" msgid "Delete my account" msgstr "मेरा खाता हटाएं" -#: src/view/screens/Settings.tsx:632 +#: src/view/screens/Settings.tsx:665 msgid "Delete my account…" msgstr "मेरा खाता हटाएं…" @@ -701,7 +705,7 @@ msgstr "विवरण" msgid "Dev Server" msgstr "देव सर्वर" -#: src/view/screens/Settings.tsx:637 +#: src/view/screens/Settings.tsx:670 msgid "Developer Tools" msgstr "डेवलपर उपकरण" @@ -810,6 +814,14 @@ msgstr "ईमेल अपडेट किया गया" msgid "Email:" msgstr "ईमेल:" +#: src/view/com/modals/EmbedConsent.tsx:113 +msgid "Enable {0} only" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:97 +msgid "Enable External Media" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:144 msgid "Enable this setting to only see replies between people you follow." msgstr "इस सेटिंग को केवल उन लोगों के बीच जवाब देखने में सक्षम करें जिन्हें आप फॉलो करते हैं।।" @@ -854,6 +866,20 @@ msgstr "" msgid "Expand alt text" msgstr "ऑल्ट टेक्स्ट" +#: src/view/com/modals/EmbedConsent.tsx:64 +msgid "External Media" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:75 +#: src/view/screens/PreferencesExternalEmbeds.tsx:66 +msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." +msgstr "" + +#: src/view/screens/PreferencesExternalEmbeds.tsx:52 +#: src/view/screens/Settings.tsx:595 +msgid "External Media Preferences" +msgstr "" + #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109 #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141 msgid "Failed to load recommended feeds" @@ -1387,6 +1413,11 @@ msgstr "मेरी फ़ीड" msgid "Name" msgstr "नाम" +#: src/view/com/modals/EmbedConsent.tsx:107 +#: src/view/com/modals/EmbedConsent.tsx:123 +msgid "Never load embeds from {0}" +msgstr "" + #: src/view/com/auth/onboarding/WelcomeMobile.tsx:72 msgid "Never lose access to your followers and data." msgstr "अपने फ़ॉलोअर्स और डेटा तक पहुंच कभी न खोएं।" @@ -1463,6 +1494,10 @@ msgstr "\"{query}\" के लिए कोई परिणाम नहीं msgid "No results found for {query}" msgstr "" +#: src/view/com/modals/EmbedConsent.tsx:129 +msgid "No thanks" +msgstr "" + #: src/view/com/modals/Threadgate.tsx:82 msgid "Nobody" msgstr "" @@ -1529,6 +1564,10 @@ msgstr "ओपन नेविगेशन" msgid "Opens configurable language settings" msgstr "भाषा सेटिंग्स खोलें" +#: src/view/screens/Settings.tsx:587 +msgid "Opens external embeds settings" +msgstr "" + #: src/view/shell/desktop/RightNav.tsx:156 #: src/view/shell/Drawer.tsx:641 msgid "Opens list of invite codes" @@ -1546,7 +1585,7 @@ msgstr "मॉडरेशन सेटिंग्स खोलें" msgid "Opens screen with all saved feeds" msgstr "सभी बचाया फ़ीड के साथ स्क्रीन खोलें" -#: src/view/screens/Settings.tsx:581 +#: src/view/screens/Settings.tsx:614 msgid "Opens the app password settings page" msgstr "ऐप पासवर्ड सेटिंग पेज खोलें" @@ -1554,11 +1593,11 @@ msgstr "ऐप पासवर्ड सेटिंग पेज खोले msgid "Opens the home feed preferences" msgstr "होम फीड वरीयताओं को खोलता है" -#: src/view/screens/Settings.tsx:664 +#: src/view/screens/Settings.tsx:697 msgid "Opens the storybook page" msgstr "स्टोरीबुक पेज खोलें" -#: src/view/screens/Settings.tsx:644 +#: src/view/screens/Settings.tsx:677 msgid "Opens the system log page" msgstr "सिस्टम लॉग पेज खोलें" @@ -1611,6 +1650,19 @@ msgstr "चित्र वयस्कों के लिए थे।।" msgid "Pinned Feeds" msgstr "पिन किया गया फ़ीड" +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:111 +msgid "Play {0}" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:54 +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:55 +msgid "Play Video" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:110 +msgid "Plays the GIF" +msgstr "" + #: src/view/com/auth/create/state.ts:116 msgid "Please choose your handle." msgstr "" @@ -1691,12 +1743,13 @@ msgstr "प्राथमिक भाषा" msgid "Prioritize Your Follows" msgstr "अपने फ़ॉलोअर्स को प्राथमिकता दें" +#: src/view/screens/Settings.tsx:570 #: src/view/shell/desktop/RightNav.tsx:84 msgid "Privacy" msgstr "गोपनीयता" #: src/view/screens/PrivacyPolicy.tsx:29 -#: src/view/screens/Settings.tsx:750 +#: src/view/screens/Settings.tsx:783 #: src/view/shell/Drawer.tsx:262 msgid "Privacy Policy" msgstr "गोपनीयता नीति" @@ -1713,7 +1766,7 @@ msgstr "प्रसंस्करण..." msgid "Profile" msgstr "प्रोफ़ाइल" -#: src/view/screens/Settings.tsx:808 +#: src/view/screens/Settings.tsx:841 msgid "Protect your account by verifying your email." msgstr "अपने ईमेल को सत्यापित करके अपने खाते को सुरक्षित रखें।।" @@ -1869,7 +1922,7 @@ msgstr "इस प्रदाता के लिए आवश्यक" msgid "Reset code" msgstr "कोड रीसेट करें" -#: src/view/screens/Settings.tsx:686 +#: src/view/screens/Settings.tsx:719 msgid "Reset onboarding state" msgstr "ऑनबोर्डिंग स्टेट को रीसेट करें" @@ -1877,15 +1930,15 @@ msgstr "ऑनबोर्डिंग स्टेट को रीसेट msgid "Reset password" msgstr "पासवर्ड रीसेट" -#: src/view/screens/Settings.tsx:676 +#: src/view/screens/Settings.tsx:709 msgid "Reset preferences state" msgstr "प्राथमिकताओं को रीसेट करें" -#: src/view/screens/Settings.tsx:684 +#: src/view/screens/Settings.tsx:717 msgid "Resets the onboarding state" msgstr "ऑनबोर्डिंग स्टेट को रीसेट करें" -#: src/view/screens/Settings.tsx:674 +#: src/view/screens/Settings.tsx:707 msgid "Resets the preferences state" msgstr "प्राथमिकताओं की स्थिति को रीसेट करें" @@ -2068,6 +2121,10 @@ msgstr "दिखाओ" msgid "Show anyway" msgstr "दिखाओ" +#: src/view/com/modals/EmbedConsent.tsx:87 +msgid "Show embeds from {0}" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:255 msgid "Show Posts from My Feeds" msgstr "मेरी फीड से पोस्ट दिखाएं" @@ -2175,11 +2232,11 @@ msgstr "स्क्वायर" msgid "Staging" msgstr "स्टेजिंग" -#: src/view/screens/Settings.tsx:730 +#: src/view/screens/Settings.tsx:763 msgid "Status page" msgstr "स्थिति पृष्ठ" -#: src/view/screens/Settings.tsx:666 +#: src/view/screens/Settings.tsx:699 msgid "Storybook" msgstr "Storybook" @@ -2212,7 +2269,7 @@ msgstr "खाते बदलें" #~ msgid "System" #~ msgstr "प्रणाली" -#: src/view/screens/Settings.tsx:646 +#: src/view/screens/Settings.tsx:679 msgid "System log" msgstr "सिस्टम लॉग" @@ -2224,7 +2281,7 @@ msgstr "लंबा" msgid "Terms" msgstr "शर्तें" -#: src/view/screens/Settings.tsx:744 +#: src/view/screens/Settings.tsx:777 #: src/view/screens/TermsOfService.tsx:29 #: src/view/shell/Drawer.tsx:256 msgid "Terms of Service" @@ -2279,6 +2336,10 @@ msgstr "यह {screenDescription} फ्लैग किया गया है msgid "This account has requested that users sign in to view their profile." msgstr "" +#: src/view/com/modals/EmbedConsent.tsx:68 +msgid "This content is hosted by {0}. Do you want to enable external media?" +msgstr "" + #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." msgstr "" @@ -2447,15 +2508,15 @@ msgstr "" msgid "Users in \"{0}\"" msgstr "" -#: src/view/screens/Settings.tsx:769 +#: src/view/screens/Settings.tsx:802 msgid "Verify email" msgstr "ईमेल सत्यापित करें" -#: src/view/screens/Settings.tsx:794 +#: src/view/screens/Settings.tsx:827 msgid "Verify my email" msgstr "मेरी ईमेल सत्यापित करें" -#: src/view/screens/Settings.tsx:803 +#: src/view/screens/Settings.tsx:836 msgid "Verify My Email" msgstr "मेरी ईमेल सत्यापित करें" diff --git a/src/locale/locales/ja/messages.po b/src/locale/locales/ja/messages.po index 5b9f58061e..3a9743e1a5 100644 --- a/src/locale/locales/ja/messages.po +++ b/src/locale/locales/ja/messages.po @@ -144,7 +144,7 @@ msgstr "返信がフィードに表示されるために必要な「いいね」 msgid "Adult Content" msgstr "成人向けコンテンツ" -#: src/view/screens/Settings.tsx:569 +#: src/view/screens/Settings.tsx:602 msgid "Advanced" msgstr "高度な設定" @@ -177,7 +177,7 @@ msgstr "および" msgid "App Language" msgstr "アプリの言語" -#: src/view/screens/Settings.tsx:589 +#: src/view/screens/Settings.tsx:622 msgid "App passwords" msgstr "アプリパスワード" @@ -328,7 +328,7 @@ msgstr "Blueskyはログアウトしたユーザーにあなたのプロフィ msgid "Bluesky.Social" msgstr "Bluesky.Social" -#: src/view/screens/Settings.tsx:718 +#: src/view/screens/Settings.tsx:751 msgid "Build version {0} {1}" msgstr "ビルドバージョン {0} {1}" @@ -403,8 +403,8 @@ msgstr "Waitlistの登録をキャンセル" msgid "Change" msgstr "変更" -#: src/view/screens/Settings.tsx:601 -#: src/view/screens/Settings.tsx:610 +#: src/view/screens/Settings.tsx:634 +#: src/view/screens/Settings.tsx:643 msgid "Change handle" msgstr "ハンドルを変更" @@ -448,19 +448,19 @@ msgstr "カスタムフィードを使用してあなたの体験を強化する msgid "Choose your password" msgstr "パスワードを選択" -#: src/view/screens/Settings.tsx:694 +#: src/view/screens/Settings.tsx:727 msgid "Clear all legacy storage data" msgstr "レガシーストレージデータをすべてクリア" -#: src/view/screens/Settings.tsx:696 +#: src/view/screens/Settings.tsx:729 msgid "Clear all legacy storage data (restart after this)" msgstr "すべてのレガシーストレージデータをクリア(この後再起動します)" -#: src/view/screens/Settings.tsx:706 +#: src/view/screens/Settings.tsx:739 msgid "Clear all storage data" msgstr "すべてのストレージデータをクリア" -#: src/view/screens/Settings.tsx:708 +#: src/view/screens/Settings.tsx:741 msgid "Clear all storage data (restart after this)" msgstr "すべてのストレージデータをクリア(この後再起動します)" @@ -616,11 +616,15 @@ msgstr "作成済み {0}" msgid "Custom domain" msgstr "カスタムドメイン" -#: src/view/screens/Settings.tsx:615 +#: src/view/screens/PreferencesExternalEmbeds.tsx:55 +msgid "Customize media from external sites." +msgstr "" + +#: src/view/screens/Settings.tsx:648 msgid "Danger Zone" msgstr "危険地帯" -#: src/view/screens/Settings.tsx:622 +#: src/view/screens/Settings.tsx:655 msgid "Delete account" msgstr "アカウントを削除" @@ -642,7 +646,7 @@ msgstr "リストを削除" msgid "Delete my account" msgstr "マイアカウントを削除" -#: src/view/screens/Settings.tsx:632 +#: src/view/screens/Settings.tsx:665 msgid "Delete my account…" msgstr "マイアカウントを削除…" @@ -669,7 +673,7 @@ msgstr "説明" msgid "Dev Server" msgstr "開発者サーバー" -#: src/view/screens/Settings.tsx:637 +#: src/view/screens/Settings.tsx:670 msgid "Developer Tools" msgstr "開発者ツール" @@ -778,6 +782,14 @@ msgstr "メールアドレスを更新" msgid "Email:" msgstr "メールアドレス:" +#: src/view/com/modals/EmbedConsent.tsx:113 +msgid "Enable {0} only" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:97 +msgid "Enable External Media" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:144 msgid "Enable this setting to only see replies between people you follow." msgstr "この設定を有効にすると、自分がフォローしているユーザーからの返信だけが表示されます。" @@ -822,6 +834,20 @@ msgstr "全員" msgid "Expand alt text" msgstr "ALTテキストを展開" +#: src/view/com/modals/EmbedConsent.tsx:64 +msgid "External Media" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:75 +#: src/view/screens/PreferencesExternalEmbeds.tsx:66 +msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." +msgstr "" + +#: src/view/screens/PreferencesExternalEmbeds.tsx:52 +#: src/view/screens/Settings.tsx:595 +msgid "External Media Preferences" +msgstr "" + #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109 #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141 msgid "Failed to load recommended feeds" @@ -1326,6 +1352,11 @@ msgstr "保存されたフィード" msgid "Name" msgstr "名前" +#: src/view/com/modals/EmbedConsent.tsx:107 +#: src/view/com/modals/EmbedConsent.tsx:123 +msgid "Never load embeds from {0}" +msgstr "" + #: src/view/com/auth/onboarding/WelcomeMobile.tsx:72 msgid "Never lose access to your followers and data." msgstr "フォロワーやデータへのアクセスを失うことはありません。" @@ -1397,6 +1428,10 @@ msgstr "「{query}」の検索結果はありません" msgid "No results found for {query}" msgstr "「{query}」の検索結果はありません" +#: src/view/com/modals/EmbedConsent.tsx:129 +msgid "No thanks" +msgstr "" + #: src/view/com/modals/Threadgate.tsx:82 msgid "Nobody" msgstr "返信不可" @@ -1455,6 +1490,10 @@ msgstr "ナビゲーションを開く" msgid "Opens configurable language settings" msgstr "構成可能な言語設定を開く" +#: src/view/screens/Settings.tsx:587 +msgid "Opens external embeds settings" +msgstr "" + #: src/view/shell/desktop/RightNav.tsx:156 #: src/view/shell/Drawer.tsx:641 msgid "Opens list of invite codes" @@ -1472,7 +1511,7 @@ msgstr "モデレーションの設定を開く" msgid "Opens screen with all saved feeds" msgstr "保存されたすべてのフィードで画面を開く" -#: src/view/screens/Settings.tsx:581 +#: src/view/screens/Settings.tsx:614 msgid "Opens the app password settings page" msgstr "アプリパスワード設定ページを開く" @@ -1480,11 +1519,11 @@ msgstr "アプリパスワード設定ページを開く" msgid "Opens the home feed preferences" msgstr "ホームフィードの設定を開く" -#: src/view/screens/Settings.tsx:664 +#: src/view/screens/Settings.tsx:697 msgid "Opens the storybook page" msgstr "ストーリーブックのページを開く" -#: src/view/screens/Settings.tsx:644 +#: src/view/screens/Settings.tsx:677 msgid "Opens the system log page" msgstr "システムログのページを開く" @@ -1537,6 +1576,19 @@ msgstr "成人向けの写真です。" msgid "Pinned Feeds" msgstr "ピン留めされたフィード" +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:111 +msgid "Play {0}" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:54 +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:55 +msgid "Play Video" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:110 +msgid "Plays the GIF" +msgstr "" + #: src/view/com/auth/create/state.ts:116 msgid "Please choose your handle." msgstr "ハンドルをお選びください。" @@ -1617,12 +1669,13 @@ msgstr "第一言語" msgid "Prioritize Your Follows" msgstr "あなたのフォローを優先" +#: src/view/screens/Settings.tsx:570 #: src/view/shell/desktop/RightNav.tsx:84 msgid "Privacy" msgstr "プライバシー" #: src/view/screens/PrivacyPolicy.tsx:29 -#: src/view/screens/Settings.tsx:750 +#: src/view/screens/Settings.tsx:783 #: src/view/shell/Drawer.tsx:262 msgid "Privacy Policy" msgstr "プライバシーポリシー" @@ -1639,7 +1692,7 @@ msgstr "処理中..." msgid "Profile" msgstr "プロフィール" -#: src/view/screens/Settings.tsx:808 +#: src/view/screens/Settings.tsx:841 msgid "Protect your account by verifying your email." msgstr "メールアドレスを確認してアカウントを保護します。" @@ -1786,7 +1839,7 @@ msgstr "このプロバイダーに必要" msgid "Reset code" msgstr "コードをリセット" -#: src/view/screens/Settings.tsx:686 +#: src/view/screens/Settings.tsx:719 msgid "Reset onboarding state" msgstr "オンボーディングの状態をリセット" @@ -1794,15 +1847,15 @@ msgstr "オンボーディングの状態をリセット" msgid "Reset password" msgstr "パスワードをリセット" -#: src/view/screens/Settings.tsx:676 +#: src/view/screens/Settings.tsx:709 msgid "Reset preferences state" msgstr "設定をリセット" -#: src/view/screens/Settings.tsx:684 +#: src/view/screens/Settings.tsx:717 msgid "Resets the onboarding state" msgstr "オンボーディングの状態をリセット" -#: src/view/screens/Settings.tsx:674 +#: src/view/screens/Settings.tsx:707 msgid "Resets the preferences state" msgstr "設定の状態をリセット" @@ -1973,6 +2026,10 @@ msgstr "表示" msgid "Show anyway" msgstr "とにかく表示" +#: src/view/com/modals/EmbedConsent.tsx:87 +msgid "Show embeds from {0}" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:255 msgid "Show Posts from My Feeds" msgstr "マイフィードからの投稿を表示" @@ -2080,11 +2137,11 @@ msgstr "正方形" msgid "Staging" msgstr "ステージング" -#: src/view/screens/Settings.tsx:730 +#: src/view/screens/Settings.tsx:763 msgid "Status page" msgstr "ステータスページ" -#: src/view/screens/Settings.tsx:666 +#: src/view/screens/Settings.tsx:699 msgid "Storybook" msgstr "ストーリーブック" @@ -2113,7 +2170,7 @@ msgstr "サポート" msgid "Switch Account" msgstr "アカウントを切り替える" -#: src/view/screens/Settings.tsx:646 +#: src/view/screens/Settings.tsx:679 msgid "System log" msgstr "システムログ" @@ -2125,7 +2182,7 @@ msgstr "トール" msgid "Terms" msgstr "条件" -#: src/view/screens/Settings.tsx:744 +#: src/view/screens/Settings.tsx:777 #: src/view/screens/TermsOfService.tsx:29 #: src/view/shell/Drawer.tsx:256 msgid "Terms of Service" @@ -2180,6 +2237,10 @@ msgstr "この{screenDescription}にはフラグが設定されています:" msgid "This account has requested that users sign in to view their profile." msgstr "このアカウントを閲覧するためにはサインインが必要です。" +#: src/view/com/modals/EmbedConsent.tsx:68 +msgid "This content is hosted by {0}. Do you want to enable external media?" +msgstr "" + #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." msgstr "このコンテンツはBlueskyのアカウントがないと閲覧できません。" @@ -2344,15 +2405,15 @@ msgstr "<0/>にフォローされているユーザー" msgid "Users in \"{0}\"" msgstr "{0}のユーザー" -#: src/view/screens/Settings.tsx:769 +#: src/view/screens/Settings.tsx:802 msgid "Verify email" msgstr "メールアドレスを確認" -#: src/view/screens/Settings.tsx:794 +#: src/view/screens/Settings.tsx:827 msgid "Verify my email" msgstr "メールアドレスを確認" -#: src/view/screens/Settings.tsx:803 +#: src/view/screens/Settings.tsx:836 msgid "Verify My Email" msgstr "メールアドレスを確認" diff --git a/src/locale/locales/ko/messages.po b/src/locale/locales/ko/messages.po index 1245f3653f..b92049a949 100644 --- a/src/locale/locales/ko/messages.po +++ b/src/locale/locales/ko/messages.po @@ -236,7 +236,7 @@ msgstr "성인 콘텐츠" #~ msgid "Adult content can only be enabled via the Web at <0/>." #~ msgstr "성인 콘텐츠는 <0/>에서 웹을 통해서만 활성화할 수 있습니다." -#: src/view/screens/Settings.tsx:569 +#: src/view/screens/Settings.tsx:602 msgid "Advanced" msgstr "고급" @@ -292,7 +292,7 @@ msgstr "앱 언어" #~ msgid "App Password names must be at least 4 characters long." #~ msgstr "앱 비밀번호 이름은 4자 이상이어야 합니다." -#: src/view/screens/Settings.tsx:589 +#: src/view/screens/Settings.tsx:622 msgid "App passwords" msgstr "앱 비밀번호" @@ -451,7 +451,7 @@ msgstr "Bluesky는 로그아웃한 사용자에게 내 프로필과 게시물을 msgid "Bluesky.Social" msgstr "Bluesky.Social" -#: src/view/screens/Settings.tsx:718 +#: src/view/screens/Settings.tsx:751 msgid "Build version {0} {1}" msgstr "빌드 버전 {0} {1}" @@ -530,8 +530,8 @@ msgstr "대기자 명단 등록 취소" msgid "Change" msgstr "변경" -#: src/view/screens/Settings.tsx:601 -#: src/view/screens/Settings.tsx:610 +#: src/view/screens/Settings.tsx:634 +#: src/view/screens/Settings.tsx:643 msgid "Change handle" msgstr "핸들 변경" @@ -579,19 +579,19 @@ msgstr "맞춤 피드를 통해 사용자 경험을 강화하는 알고리즘을 msgid "Choose your password" msgstr "비밀번호를 입력하세요" -#: src/view/screens/Settings.tsx:694 +#: src/view/screens/Settings.tsx:727 msgid "Clear all legacy storage data" msgstr "모든 레거시 스토리지 데이터 지우기" -#: src/view/screens/Settings.tsx:696 +#: src/view/screens/Settings.tsx:729 msgid "Clear all legacy storage data (restart after this)" msgstr "모든 레거시 스토리지 데이터 지우기 (이후 다시 시작)" -#: src/view/screens/Settings.tsx:706 +#: src/view/screens/Settings.tsx:739 msgid "Clear all storage data" msgstr "모든 스토리지 데이터 지우기" -#: src/view/screens/Settings.tsx:708 +#: src/view/screens/Settings.tsx:741 msgid "Clear all storage data (restart after this)" msgstr "모든 스토리지 데이터 지우기 (이후 다시 시작)" @@ -763,7 +763,11 @@ msgstr "{0} 생성됨" msgid "Custom domain" msgstr "사용자 지정 도메인" -#: src/view/screens/Settings.tsx:615 +#: src/view/screens/PreferencesExternalEmbeds.tsx:55 +msgid "Customize media from external sites." +msgstr "" + +#: src/view/screens/Settings.tsx:648 msgid "Danger Zone" msgstr "위험 구역" @@ -775,7 +779,7 @@ msgstr "위험 구역" #~ msgid "default" #~ msgstr "기본" -#: src/view/screens/Settings.tsx:622 +#: src/view/screens/Settings.tsx:655 msgid "Delete account" msgstr "계정 삭제" @@ -797,7 +801,7 @@ msgstr "리스트 삭제" msgid "Delete my account" msgstr "내 계정 삭제" -#: src/view/screens/Settings.tsx:632 +#: src/view/screens/Settings.tsx:665 msgid "Delete my account…" msgstr "내 계정 삭제…" @@ -824,7 +828,7 @@ msgstr "설명" msgid "Dev Server" msgstr "개발 서버" -#: src/view/screens/Settings.tsx:637 +#: src/view/screens/Settings.tsx:670 msgid "Developer Tools" msgstr "개발자 도구" @@ -966,10 +970,18 @@ msgstr "이메일 변경됨" msgid "Email:" msgstr "이메일:" +#: src/view/com/modals/EmbedConsent.tsx:113 +msgid "Enable {0} only" +msgstr "" + #: src/view/com/modals/ContentFilteringSettings.tsx:158 #~ msgid "Enable Adult Content" #~ msgstr "성인 콘텐츠 활성화" +#: src/view/com/modals/EmbedConsent.tsx:97 +msgid "Enable External Media" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:144 msgid "Enable this setting to only see replies between people you follow." msgstr "내가 팔로우하는 사람들 간의 답글만 표시합니다." @@ -1022,6 +1034,20 @@ msgstr "대체 텍스트 확장" #~ msgid "Explicit Sexual Images" #~ msgstr "노골적인 성적 이미지" +#: src/view/com/modals/EmbedConsent.tsx:64 +msgid "External Media" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:75 +#: src/view/screens/PreferencesExternalEmbeds.tsx:66 +msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." +msgstr "" + +#: src/view/screens/PreferencesExternalEmbeds.tsx:52 +#: src/view/screens/Settings.tsx:595 +msgid "External Media Preferences" +msgstr "" + #: src/view/com/modals/AddAppPasswords.tsx:114 #: src/view/com/modals/AddAppPasswords.tsx:118 #~ msgid "Failed to create app password." @@ -1656,6 +1682,11 @@ msgstr "내 저장된 피드" msgid "Name" msgstr "이름" +#: src/view/com/modals/EmbedConsent.tsx:107 +#: src/view/com/modals/EmbedConsent.tsx:123 +msgid "Never load embeds from {0}" +msgstr "" + #: src/view/com/auth/onboarding/WelcomeMobile.tsx:72 msgid "Never lose access to your followers and data." msgstr "팔로워와 데이터에 대한 접근 권한을 잃지 않습니다." @@ -1744,6 +1775,10 @@ msgstr "\"{query}\"에 대한 결과를 찾을 수 없습니다." msgid "No results found for {query}" msgstr "{query}에 대한 결과를 찾을 수 없습니다." +#: src/view/com/modals/EmbedConsent.tsx:129 +msgid "No thanks" +msgstr "" + #: src/view/com/modals/Threadgate.tsx:82 msgid "Nobody" msgstr "없음" @@ -1818,6 +1853,10 @@ msgstr "내비게이션을 엽니다" msgid "Opens configurable language settings" msgstr "구성 가능한 언어 설정을 엽니다" +#: src/view/screens/Settings.tsx:587 +msgid "Opens external embeds settings" +msgstr "" + #: src/view/shell/desktop/RightNav.tsx:156 #: src/view/shell/Drawer.tsx:641 msgid "Opens list of invite codes" @@ -1835,7 +1874,7 @@ msgstr "검토 설정을 엽니다" msgid "Opens screen with all saved feeds" msgstr "모든 저장된 피드 화면을 엽니다" -#: src/view/screens/Settings.tsx:581 +#: src/view/screens/Settings.tsx:614 msgid "Opens the app password settings page" msgstr "비밀번호 설정 페이지를 엽니다" @@ -1843,11 +1882,11 @@ msgstr "비밀번호 설정 페이지를 엽니다" msgid "Opens the home feed preferences" msgstr "홈 피드 설정을 엽니다" -#: src/view/screens/Settings.tsx:664 +#: src/view/screens/Settings.tsx:697 msgid "Opens the storybook page" msgstr "스토리북 페이지를 엽니다" -#: src/view/screens/Settings.tsx:644 +#: src/view/screens/Settings.tsx:677 msgid "Opens the system log page" msgstr "시스템 로그 페이지를 엽니다" @@ -1921,6 +1960,19 @@ msgstr "성인용 사진." msgid "Pinned Feeds" msgstr "고정된 피드" +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:111 +msgid "Play {0}" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:54 +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:55 +msgid "Play Video" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:110 +msgid "Plays the GIF" +msgstr "" + #: src/view/com/auth/create/state.ts:116 msgid "Please choose your handle." msgstr "핸들을 입력하세요." @@ -2018,12 +2070,13 @@ msgstr "주 언어" msgid "Prioritize Your Follows" msgstr "내 팔로우 우선시키기" +#: src/view/screens/Settings.tsx:570 #: src/view/shell/desktop/RightNav.tsx:84 msgid "Privacy" msgstr "개인정보" #: src/view/screens/PrivacyPolicy.tsx:29 -#: src/view/screens/Settings.tsx:750 +#: src/view/screens/Settings.tsx:783 #: src/view/shell/Drawer.tsx:262 msgid "Privacy Policy" msgstr "개인정보 처리방침" @@ -2044,7 +2097,7 @@ msgstr "프로필" #~ msgid "Profile updated" #~ msgstr "프로필 업데이트됨" -#: src/view/screens/Settings.tsx:808 +#: src/view/screens/Settings.tsx:841 msgid "Protect your account by verifying your email." msgstr "이메일을 인증하여 계정을 보호하세요." @@ -2229,7 +2282,7 @@ msgstr "이 제공자에서 필수" msgid "Reset code" msgstr "코드 재설정" -#: src/view/screens/Settings.tsx:686 +#: src/view/screens/Settings.tsx:719 msgid "Reset onboarding state" msgstr "온보딩 상태 재설정" @@ -2237,15 +2290,15 @@ msgstr "온보딩 상태 재설정" msgid "Reset password" msgstr "비밀번호 재설정" -#: src/view/screens/Settings.tsx:676 +#: src/view/screens/Settings.tsx:709 msgid "Reset preferences state" msgstr "설정 상태 재설정" -#: src/view/screens/Settings.tsx:684 +#: src/view/screens/Settings.tsx:717 msgid "Resets the onboarding state" msgstr "온보딩 상태 재설정" -#: src/view/screens/Settings.tsx:674 +#: src/view/screens/Settings.tsx:707 msgid "Resets the preferences state" msgstr "설정 상태 재설정" @@ -2444,6 +2497,10 @@ msgstr "표시" msgid "Show anyway" msgstr "무시하고 표시" +#: src/view/com/modals/EmbedConsent.tsx:87 +msgid "Show embeds from {0}" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:255 msgid "Show Posts from My Feeds" msgstr "내 피드에서 게시물 표시" @@ -2572,7 +2629,7 @@ msgstr "정사각형" msgid "Staging" msgstr "스테이징" -#: src/view/screens/Settings.tsx:730 +#: src/view/screens/Settings.tsx:763 msgid "Status page" msgstr "상태 페이지" @@ -2588,7 +2645,7 @@ msgstr "상태 페이지" #~ msgid "Storage cleared, you need to restart the app now." #~ msgstr "스토리지가 지워졌으며 지금 앱을 다시 시작해야 합니다." -#: src/view/screens/Settings.tsx:666 +#: src/view/screens/Settings.tsx:699 msgid "Storybook" msgstr "스토리북" @@ -2625,7 +2682,7 @@ msgstr "계정 전환" #~ msgid "System" #~ msgstr "시스템" -#: src/view/screens/Settings.tsx:646 +#: src/view/screens/Settings.tsx:679 msgid "System log" msgstr "시스템 로그" @@ -2637,7 +2694,7 @@ msgstr "세로" msgid "Terms" msgstr "이용약관" -#: src/view/screens/Settings.tsx:744 +#: src/view/screens/Settings.tsx:777 #: src/view/screens/TermsOfService.tsx:29 #: src/view/shell/Drawer.tsx:256 msgid "Terms of Service" @@ -2752,6 +2809,10 @@ msgstr "이 {screenDescription}에 플래그가 지정되었습니다:" msgid "This account has requested that users sign in to view their profile." msgstr "이 계정의 프로필을 보려면 로그인해야 합니다." +#: src/view/com/modals/EmbedConsent.tsx:68 +msgid "This content is hosted by {0}. Do you want to enable external media?" +msgstr "" + #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." msgstr "이 콘텐츠는 Bluesky 계정이 없으면 볼 수 없습니다." @@ -2981,15 +3042,15 @@ msgstr "\"{0}\"에 있는 사용자" #~ msgid "Verify {0}" #~ msgstr "{0} 확인" -#: src/view/screens/Settings.tsx:769 +#: src/view/screens/Settings.tsx:802 msgid "Verify email" msgstr "이메일 확인" -#: src/view/screens/Settings.tsx:794 +#: src/view/screens/Settings.tsx:827 msgid "Verify my email" msgstr "내 이메일 확인" -#: src/view/screens/Settings.tsx:803 +#: src/view/screens/Settings.tsx:836 msgid "Verify My Email" msgstr "내 이메일 확인" diff --git a/src/locale/locales/pt-BR/messages.po b/src/locale/locales/pt-BR/messages.po index a66df1f934..1b5c8f2c0a 100644 --- a/src/locale/locales/pt-BR/messages.po +++ b/src/locale/locales/pt-BR/messages.po @@ -164,7 +164,7 @@ msgstr "Ajuste o número de curtidas que uma resposta deve ser mostrada no seu f msgid "Adult Content" msgstr "Conteúdo Adulto" -#: src/view/screens/Settings.tsx:569 +#: src/view/screens/Settings.tsx:602 msgid "Advanced" msgstr "Avançado" @@ -197,7 +197,7 @@ msgstr "e" msgid "App Language" msgstr "Idioma do aplicativo" -#: src/view/screens/Settings.tsx:589 +#: src/view/screens/Settings.tsx:622 msgid "App passwords" msgstr "Senhas de aplicativos" @@ -356,7 +356,7 @@ msgstr "O Bluesky não mostrará seu perfil e publicações para usuários desco msgid "Bluesky.Social" msgstr "Bluesky.Social" -#: src/view/screens/Settings.tsx:718 +#: src/view/screens/Settings.tsx:751 msgid "Build version {0} {1}" msgstr "Versão da compilação {0} {1}" @@ -431,8 +431,8 @@ msgstr "Cancelar inscrição na lista de espera" msgid "Change" msgstr "Alterar" -#: src/view/screens/Settings.tsx:601 -#: src/view/screens/Settings.tsx:610 +#: src/view/screens/Settings.tsx:634 +#: src/view/screens/Settings.tsx:643 msgid "Change handle" msgstr "Alterar Identificador" @@ -480,19 +480,19 @@ msgstr "Escolha os algoritmos que alimentam a sua experiência com feeds persona msgid "Choose your password" msgstr "Escolha sua senha" -#: src/view/screens/Settings.tsx:694 +#: src/view/screens/Settings.tsx:727 msgid "Clear all legacy storage data" msgstr "Limpar todos os dados de armazenamento legados" -#: src/view/screens/Settings.tsx:696 +#: src/view/screens/Settings.tsx:729 msgid "Clear all legacy storage data (restart after this)" msgstr "Limpar todos os dados de armazenamento legados (reinicie após isso)" -#: src/view/screens/Settings.tsx:706 +#: src/view/screens/Settings.tsx:739 msgid "Clear all storage data" msgstr "Limpar todos os dados de armazenamento" -#: src/view/screens/Settings.tsx:708 +#: src/view/screens/Settings.tsx:741 msgid "Clear all storage data (restart after this)" msgstr "Limpar todos os dados de armazenamento (reiniciar após isso)" @@ -648,7 +648,11 @@ msgstr "Criado {0}" msgid "Custom domain" msgstr "Domínio personalizado" -#: src/view/screens/Settings.tsx:615 +#: src/view/screens/PreferencesExternalEmbeds.tsx:55 +msgid "Customize media from external sites." +msgstr "" + +#: src/view/screens/Settings.tsx:648 msgid "Danger Zone" msgstr "Zona de Perigo" @@ -656,7 +660,7 @@ msgstr "Zona de Perigo" #~ msgid "Dark" #~ msgstr "" -#: src/view/screens/Settings.tsx:622 +#: src/view/screens/Settings.tsx:655 msgid "Delete account" msgstr "Excluir a conta" @@ -678,7 +682,7 @@ msgstr "Excluir Lista" msgid "Delete my account" msgstr "Excluir minha conta" -#: src/view/screens/Settings.tsx:632 +#: src/view/screens/Settings.tsx:665 msgid "Delete my account…" msgstr "Excluir minha conta…" @@ -705,7 +709,7 @@ msgstr "Descrição" msgid "Dev Server" msgstr "Servidor de Desenvolvimento" -#: src/view/screens/Settings.tsx:637 +#: src/view/screens/Settings.tsx:670 msgid "Developer Tools" msgstr "Ferramentas do Desenvolvedor" @@ -814,6 +818,14 @@ msgstr "Email Atualizado" msgid "Email:" msgstr "Email:" +#: src/view/com/modals/EmbedConsent.tsx:113 +msgid "Enable {0} only" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:97 +msgid "Enable External Media" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:144 msgid "Enable this setting to only see replies between people you follow." msgstr "Ative esta configuração para ver apenas as respostas entre as pessoas que você segue." @@ -858,6 +870,20 @@ msgstr "Todos" msgid "Expand alt text" msgstr "Expandir texto alternativo" +#: src/view/com/modals/EmbedConsent.tsx:64 +msgid "External Media" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:75 +#: src/view/screens/PreferencesExternalEmbeds.tsx:66 +msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." +msgstr "" + +#: src/view/screens/PreferencesExternalEmbeds.tsx:52 +#: src/view/screens/Settings.tsx:595 +msgid "External Media Preferences" +msgstr "" + #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109 #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141 msgid "Failed to load recommended feeds" @@ -1395,6 +1421,11 @@ msgstr "Meus Feeds Salvos" msgid "Name" msgstr "Nome" +#: src/view/com/modals/EmbedConsent.tsx:107 +#: src/view/com/modals/EmbedConsent.tsx:123 +msgid "Never load embeds from {0}" +msgstr "" + #: src/view/com/auth/onboarding/WelcomeMobile.tsx:72 msgid "Never lose access to your followers and data." msgstr "Nunca perca o acesso aos seus seguidores e dados." @@ -1471,6 +1502,10 @@ msgstr "Nenhum resultado encontrado para \"{query}\"" msgid "No results found for {query}" msgstr "Nenhum resultado encontrado para {query}" +#: src/view/com/modals/EmbedConsent.tsx:129 +msgid "No thanks" +msgstr "" + #: src/view/com/modals/Threadgate.tsx:82 msgid "Nobody" msgstr "Ninguém" @@ -1537,6 +1572,10 @@ msgstr "Abrir navegação" msgid "Opens configurable language settings" msgstr "Abre definições de idioma configuráveis" +#: src/view/screens/Settings.tsx:587 +msgid "Opens external embeds settings" +msgstr "" + #: src/view/shell/desktop/RightNav.tsx:156 #: src/view/shell/Drawer.tsx:641 msgid "Opens list of invite codes" @@ -1554,7 +1593,7 @@ msgstr "Abre configurações de moderação" msgid "Opens screen with all saved feeds" msgstr "Abre a tela com todos os feeds salvos" -#: src/view/screens/Settings.tsx:581 +#: src/view/screens/Settings.tsx:614 msgid "Opens the app password settings page" msgstr "Abre a página de configurações de senha do aplicativo" @@ -1562,11 +1601,11 @@ msgstr "Abre a página de configurações de senha do aplicativo" msgid "Opens the home feed preferences" msgstr "Abre as preferências do feed inicial" -#: src/view/screens/Settings.tsx:664 +#: src/view/screens/Settings.tsx:697 msgid "Opens the storybook page" msgstr "Abre a página do storybook" -#: src/view/screens/Settings.tsx:644 +#: src/view/screens/Settings.tsx:677 msgid "Opens the system log page" msgstr "Abre a página de log do sistema" @@ -1619,6 +1658,19 @@ msgstr "Imagens destinadas a adultos." msgid "Pinned Feeds" msgstr "Feeds Fixados" +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:111 +msgid "Play {0}" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:54 +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:55 +msgid "Play Video" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:110 +msgid "Plays the GIF" +msgstr "" + #: src/view/com/auth/create/state.ts:116 msgid "Please choose your handle." msgstr "Por favor, escolha o seu identificador." @@ -1699,12 +1751,13 @@ msgstr "Idioma Principal" msgid "Prioritize Your Follows" msgstr "Priorizar seus Seguidores" +#: src/view/screens/Settings.tsx:570 #: src/view/shell/desktop/RightNav.tsx:84 msgid "Privacy" msgstr "Privacidade" #: src/view/screens/PrivacyPolicy.tsx:29 -#: src/view/screens/Settings.tsx:750 +#: src/view/screens/Settings.tsx:783 #: src/view/shell/Drawer.tsx:262 msgid "Privacy Policy" msgstr "Política de Privacidade" @@ -1721,7 +1774,7 @@ msgstr "Processando..." msgid "Profile" msgstr "Perfil" -#: src/view/screens/Settings.tsx:808 +#: src/view/screens/Settings.tsx:841 msgid "Protect your account by verifying your email." msgstr "Proteja a sua conta verificando o seu email." @@ -1877,7 +1930,7 @@ msgstr "Obrigatório para este provedor" msgid "Reset code" msgstr "Código de redefinição" -#: src/view/screens/Settings.tsx:686 +#: src/view/screens/Settings.tsx:719 msgid "Reset onboarding state" msgstr "Redefinir estado de integração" @@ -1885,15 +1938,15 @@ msgstr "Redefinir estado de integração" msgid "Reset password" msgstr "Redefinir senha" -#: src/view/screens/Settings.tsx:676 +#: src/view/screens/Settings.tsx:709 msgid "Reset preferences state" msgstr "Redefinir estado das preferências" -#: src/view/screens/Settings.tsx:684 +#: src/view/screens/Settings.tsx:717 msgid "Resets the onboarding state" msgstr "Redefine o estado de integração" -#: src/view/screens/Settings.tsx:674 +#: src/view/screens/Settings.tsx:707 msgid "Resets the preferences state" msgstr "Redefine o estado das preferências" @@ -2076,6 +2129,10 @@ msgstr "Mostrar" msgid "Show anyway" msgstr "Mostrar mesmo assim" +#: src/view/com/modals/EmbedConsent.tsx:87 +msgid "Show embeds from {0}" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:255 msgid "Show Posts from My Feeds" msgstr "Mostrar Posts dos meus Feeds" @@ -2183,11 +2240,11 @@ msgstr "Quadrado" msgid "Staging" msgstr "Encenação" -#: src/view/screens/Settings.tsx:730 +#: src/view/screens/Settings.tsx:763 msgid "Status page" msgstr "Página de status" -#: src/view/screens/Settings.tsx:666 +#: src/view/screens/Settings.tsx:699 msgid "Storybook" msgstr "Storybook" @@ -2220,7 +2277,7 @@ msgstr "Alterar Conta" #~ msgid "System" #~ msgstr "" -#: src/view/screens/Settings.tsx:646 +#: src/view/screens/Settings.tsx:679 msgid "System log" msgstr "Log do sistema" @@ -2232,7 +2289,7 @@ msgstr "Alto" msgid "Terms" msgstr "Termos" -#: src/view/screens/Settings.tsx:744 +#: src/view/screens/Settings.tsx:777 #: src/view/screens/TermsOfService.tsx:29 #: src/view/shell/Drawer.tsx:256 msgid "Terms of Service" @@ -2287,6 +2344,10 @@ msgstr "Este {screenDescription} foi sinalizado:" msgid "This account has requested that users sign in to view their profile." msgstr "Esta conta solicitou que os usuários fizessem login para visualizar seus perfis." +#: src/view/com/modals/EmbedConsent.tsx:68 +msgid "This content is hosted by {0}. Do you want to enable external media?" +msgstr "" + #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." msgstr "Este conteúdo não está visível sem uma conta Bluesky." @@ -2455,15 +2516,15 @@ msgstr "usuários seguidos por <0/>" msgid "Users in \"{0}\"" msgstr "Usuários em \"{0}\"" -#: src/view/screens/Settings.tsx:769 +#: src/view/screens/Settings.tsx:802 msgid "Verify email" msgstr "Verificar email" -#: src/view/screens/Settings.tsx:794 +#: src/view/screens/Settings.tsx:827 msgid "Verify my email" msgstr "Verificar meu email" -#: src/view/screens/Settings.tsx:803 +#: src/view/screens/Settings.tsx:836 msgid "Verify My Email" msgstr "Verificar Meu Email" diff --git a/src/locale/locales/uk/messages.po b/src/locale/locales/uk/messages.po index 72395a1def..32cf0fea82 100644 --- a/src/locale/locales/uk/messages.po +++ b/src/locale/locales/uk/messages.po @@ -169,7 +169,7 @@ msgstr "Налаштуйте мінімальну кількість вподо msgid "Adult Content" msgstr "Вміст для дорослих" -#: src/view/screens/Settings.tsx:569 +#: src/view/screens/Settings.tsx:602 msgid "Advanced" msgstr "Розширені" @@ -202,7 +202,7 @@ msgstr "та" msgid "App Language" msgstr "Мова застосунку" -#: src/view/screens/Settings.tsx:589 +#: src/view/screens/Settings.tsx:622 msgid "App passwords" msgstr "Паролі для застосунків" @@ -361,7 +361,7 @@ msgstr "Bluesky не буде показувати ваш профіль і по msgid "Bluesky.Social" msgstr "Bluesky.Social" -#: src/view/screens/Settings.tsx:718 +#: src/view/screens/Settings.tsx:751 msgid "Build version {0} {1}" msgstr "Версія {0} {1}" @@ -436,8 +436,8 @@ msgstr "Скасувати запис у чергу очікування" msgid "Change" msgstr "Змінити" -#: src/view/screens/Settings.tsx:601 -#: src/view/screens/Settings.tsx:610 +#: src/view/screens/Settings.tsx:634 +#: src/view/screens/Settings.tsx:643 msgid "Change handle" msgstr "Змінити псевдонім" @@ -485,19 +485,19 @@ msgstr "Автори стрічок можуть обирати будь-які msgid "Choose your password" msgstr "Вкажіть пароль" -#: src/view/screens/Settings.tsx:694 +#: src/view/screens/Settings.tsx:727 msgid "Clear all legacy storage data" msgstr "" -#: src/view/screens/Settings.tsx:696 +#: src/view/screens/Settings.tsx:729 msgid "Clear all legacy storage data (restart after this)" msgstr "" -#: src/view/screens/Settings.tsx:706 +#: src/view/screens/Settings.tsx:739 msgid "Clear all storage data" msgstr "" -#: src/view/screens/Settings.tsx:708 +#: src/view/screens/Settings.tsx:741 msgid "Clear all storage data (restart after this)" msgstr "" @@ -653,7 +653,11 @@ msgstr "Створено: {0}" msgid "Custom domain" msgstr "Власний домен" -#: src/view/screens/Settings.tsx:615 +#: src/view/screens/PreferencesExternalEmbeds.tsx:55 +msgid "Customize media from external sites." +msgstr "" + +#: src/view/screens/Settings.tsx:648 msgid "Danger Zone" msgstr "Небезпечна зона" @@ -661,7 +665,7 @@ msgstr "Небезпечна зона" #~ msgid "Dark" #~ msgstr "" -#: src/view/screens/Settings.tsx:622 +#: src/view/screens/Settings.tsx:655 msgid "Delete account" msgstr "Видалити обліковий запис" @@ -683,7 +687,7 @@ msgstr "Видалити список" msgid "Delete my account" msgstr "Видалити мій обліковий запис" -#: src/view/screens/Settings.tsx:632 +#: src/view/screens/Settings.tsx:665 msgid "Delete my account…" msgstr "Видалити мій обліковий запис…" @@ -710,7 +714,7 @@ msgstr "Опис" msgid "Dev Server" msgstr "" -#: src/view/screens/Settings.tsx:637 +#: src/view/screens/Settings.tsx:670 msgid "Developer Tools" msgstr "Інструменти розробника" @@ -819,6 +823,14 @@ msgstr "Email оновлено" msgid "Email:" msgstr "Email:" +#: src/view/com/modals/EmbedConsent.tsx:113 +msgid "Enable {0} only" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:97 +msgid "Enable External Media" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:144 msgid "Enable this setting to only see replies between people you follow." msgstr "Увімкніть цей параметр, щоб бачити відповіді тільки між людьми, на яких ви підписані." @@ -863,6 +875,20 @@ msgstr "Усі" msgid "Expand alt text" msgstr "Розгорнути альтернативний текст" +#: src/view/com/modals/EmbedConsent.tsx:64 +msgid "External Media" +msgstr "" + +#: src/view/com/modals/EmbedConsent.tsx:75 +#: src/view/screens/PreferencesExternalEmbeds.tsx:66 +msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." +msgstr "" + +#: src/view/screens/PreferencesExternalEmbeds.tsx:52 +#: src/view/screens/Settings.tsx:595 +msgid "External Media Preferences" +msgstr "" + #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109 #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141 msgid "Failed to load recommended feeds" @@ -1400,6 +1426,11 @@ msgstr "Мої збережені стрічки" msgid "Name" msgstr "Ім'я" +#: src/view/com/modals/EmbedConsent.tsx:107 +#: src/view/com/modals/EmbedConsent.tsx:123 +msgid "Never load embeds from {0}" +msgstr "" + #: src/view/com/auth/onboarding/WelcomeMobile.tsx:72 msgid "Never lose access to your followers and data." msgstr "Ніколи не втрачайте доступ до ваших даних та підписників." @@ -1476,6 +1507,10 @@ msgstr "Нічого не знайдено за запитом «{query}»" msgid "No results found for {query}" msgstr "Нічого не знайдено за запитом «{query}»" +#: src/view/com/modals/EmbedConsent.tsx:129 +msgid "No thanks" +msgstr "" + #: src/view/com/modals/Threadgate.tsx:82 msgid "Nobody" msgstr "Ніхто" @@ -1542,6 +1577,10 @@ msgstr "Відкрити навігацію" msgid "Opens configurable language settings" msgstr "Відкриває налаштування мов" +#: src/view/screens/Settings.tsx:587 +msgid "Opens external embeds settings" +msgstr "" + #: src/view/shell/desktop/RightNav.tsx:156 #: src/view/shell/Drawer.tsx:641 msgid "Opens list of invite codes" @@ -1559,7 +1598,7 @@ msgstr "Відкриває налаштування модерації" msgid "Opens screen with all saved feeds" msgstr "Відкриває сторінку з усіма збереженими стрічками" -#: src/view/screens/Settings.tsx:581 +#: src/view/screens/Settings.tsx:614 msgid "Opens the app password settings page" msgstr "Відкриває налаштування паролів для застосунків" @@ -1567,11 +1606,11 @@ msgstr "Відкриває налаштування паролів для зас msgid "Opens the home feed preferences" msgstr "Відкриває налаштування домашньої стрічки" -#: src/view/screens/Settings.tsx:664 +#: src/view/screens/Settings.tsx:697 msgid "Opens the storybook page" msgstr "" -#: src/view/screens/Settings.tsx:644 +#: src/view/screens/Settings.tsx:677 msgid "Opens the system log page" msgstr "Відкриває системний журнал" @@ -1624,6 +1663,19 @@ msgstr "Зображення призначені для дорослих." msgid "Pinned Feeds" msgstr "Закріплені стрічки" +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:111 +msgid "Play {0}" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:54 +#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:55 +msgid "Play Video" +msgstr "" + +#: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:110 +msgid "Plays the GIF" +msgstr "" + #: src/view/com/auth/create/state.ts:116 msgid "Please choose your handle." msgstr "Будь ласка, виберіть псевдонім." @@ -1704,12 +1756,13 @@ msgstr "Основна мова" msgid "Prioritize Your Follows" msgstr "Пріоритезувати ваші підписки" +#: src/view/screens/Settings.tsx:570 #: src/view/shell/desktop/RightNav.tsx:84 msgid "Privacy" msgstr "Конфіденційність" #: src/view/screens/PrivacyPolicy.tsx:29 -#: src/view/screens/Settings.tsx:750 +#: src/view/screens/Settings.tsx:783 #: src/view/shell/Drawer.tsx:262 msgid "Privacy Policy" msgstr "Політика конфіденційності" @@ -1726,7 +1779,7 @@ msgstr "Обробка..." msgid "Profile" msgstr "Профіль" -#: src/view/screens/Settings.tsx:808 +#: src/view/screens/Settings.tsx:841 msgid "Protect your account by verifying your email." msgstr "Захистіть свій обліковий запис, підтвердивши свою електронну пошту." @@ -1882,7 +1935,7 @@ msgstr "Вимагається цим хостинг-провайдером" msgid "Reset code" msgstr "Код підтвердження" -#: src/view/screens/Settings.tsx:686 +#: src/view/screens/Settings.tsx:719 msgid "Reset onboarding state" msgstr "" @@ -1890,15 +1943,15 @@ msgstr "" msgid "Reset password" msgstr "Скинути пароль" -#: src/view/screens/Settings.tsx:676 +#: src/view/screens/Settings.tsx:709 msgid "Reset preferences state" msgstr "" -#: src/view/screens/Settings.tsx:684 +#: src/view/screens/Settings.tsx:717 msgid "Resets the onboarding state" msgstr "" -#: src/view/screens/Settings.tsx:674 +#: src/view/screens/Settings.tsx:707 msgid "Resets the preferences state" msgstr "" @@ -2081,6 +2134,10 @@ msgstr "Показати" msgid "Show anyway" msgstr "Всеодно показати" +#: src/view/com/modals/EmbedConsent.tsx:87 +msgid "Show embeds from {0}" +msgstr "" + #: src/view/screens/PreferencesHomeFeed.tsx:255 msgid "Show Posts from My Feeds" msgstr "Показувати пости зі збережених стрічок" @@ -2188,11 +2245,11 @@ msgstr "Квадратне" msgid "Staging" msgstr "" -#: src/view/screens/Settings.tsx:730 +#: src/view/screens/Settings.tsx:763 msgid "Status page" msgstr "Сторінка стану" -#: src/view/screens/Settings.tsx:666 +#: src/view/screens/Settings.tsx:699 msgid "Storybook" msgstr "" @@ -2225,7 +2282,7 @@ msgstr "Перемикнути обліковий запис" #~ msgid "System" #~ msgstr "" -#: src/view/screens/Settings.tsx:646 +#: src/view/screens/Settings.tsx:679 msgid "System log" msgstr "Системний журнал" @@ -2237,7 +2294,7 @@ msgstr "Високе" msgid "Terms" msgstr "Умови" -#: src/view/screens/Settings.tsx:744 +#: src/view/screens/Settings.tsx:777 #: src/view/screens/TermsOfService.tsx:29 #: src/view/shell/Drawer.tsx:256 msgid "Terms of Service" @@ -2292,6 +2349,10 @@ msgstr "Цей {screenDescription} був позначений:" msgid "This account has requested that users sign in to view their profile." msgstr "Цей користувач вказав, що не хоче, аби його профіль бачили відвідувачі без облікового запису." +#: src/view/com/modals/EmbedConsent.tsx:68 +msgid "This content is hosted by {0}. Do you want to enable external media?" +msgstr "" + #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." msgstr "Цей вміст не доступний для перегляду без облікового запису Bluesky." @@ -2460,15 +2521,15 @@ msgstr "користувачі на яких підписані <0/>" msgid "Users in \"{0}\"" msgstr "Користувачі в \"{0}\"" -#: src/view/screens/Settings.tsx:769 +#: src/view/screens/Settings.tsx:802 msgid "Verify email" msgstr "Підтвердити електронну адресу" -#: src/view/screens/Settings.tsx:794 +#: src/view/screens/Settings.tsx:827 msgid "Verify my email" msgstr "Підтвердити мою електронну адресу" -#: src/view/screens/Settings.tsx:803 +#: src/view/screens/Settings.tsx:836 msgid "Verify My Email" msgstr "Підтвердити мою електронну адресу" @@ -2675,4 +2736,3 @@ msgstr "Ваш профіль" #: src/view/com/auth/create/Step3.tsx:28 msgid "Your user handle" msgstr "Ваш псевдонім" - From 98885656a306b0928d65453a716751e7518f57cb Mon Sep 17 00:00:00 2001 From: Noritada Kobayashi Date: Fri, 5 Jan 2024 20:50:54 +0900 Subject: [PATCH 6/9] Update Japanese localization (addition + language code correction) (#2423) --- src/locale/locales/ja/messages.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/locale/locales/ja/messages.po b/src/locale/locales/ja/messages.po index 3a9743e1a5..9620c035a1 100644 --- a/src/locale/locales/ja/messages.po +++ b/src/locale/locales/ja/messages.po @@ -5,7 +5,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: @lingui/cli\n" -"Language: jp\n" +"Language: ja\n" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "PO-Revision-Date: \n" @@ -1293,7 +1293,7 @@ msgstr "その他のオプション" #: src/view/screens/PreferencesThreads.tsx:82 msgid "Most-liked replies first" -msgstr "" +msgstr "いいねの数が多い順に返信を表示" #: src/view/com/profile/ProfileHeader.tsx:370 msgid "Mute Account" @@ -1382,7 +1382,7 @@ msgstr "新しい投稿" #: src/view/screens/PreferencesThreads.tsx:79 msgid "Newest replies first" -msgstr "" +msgstr "新しい順に返信を表示" #: src/view/com/auth/create/CreateAccount.tsx:154 #: src/view/com/auth/login/ForgotPasswordForm.tsx:174 @@ -1467,7 +1467,7 @@ msgstr "OK" #: src/view/screens/PreferencesThreads.tsx:78 msgid "Oldest replies first" -msgstr "" +msgstr "古い順に返信を表示" #: src/view/com/composer/Composer.tsx:363 msgid "One or more images is missing alt text." @@ -1480,7 +1480,7 @@ msgstr "{0}のみ返信可能" #: src/view/com/composer/Composer.tsx:468 #: src/view/com/composer/Composer.tsx:469 msgid "Open emoji picker" -msgstr "" +msgstr "絵文字を入力" #: src/view/com/pager/FeedsTabBarMobile.tsx:76 msgid "Open navigation" @@ -1715,7 +1715,7 @@ msgstr "引用" #: src/view/screens/PreferencesThreads.tsx:86 msgid "Random (aka \"Poster's Roulette\")" -msgstr "" +msgstr "ランダムな順番で表示(別名「投稿者のルーレット」)" #: src/view/com/modals/EditImage.tsx:236 msgid "Ratios" @@ -1829,7 +1829,7 @@ msgstr "変更を要求" #: src/view/screens/Settings.tsx:422 msgid "Require alt text before posting" -msgstr "" +msgstr "画像投稿時にALTテキストを必須とする" #: src/view/com/auth/create/Step2.tsx:68 msgid "Required for this provider" From bc067295b861763ca9f7844b19913ea298ac4330 Mon Sep 17 00:00:00 2001 From: Max Ignatenko Date: Fri, 5 Jan 2024 11:52:04 +0000 Subject: [PATCH 7/9] New translations messages.po (Ukrainian) (#2422) --- src/locale/locales/uk/messages.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/locale/locales/uk/messages.po b/src/locale/locales/uk/messages.po index 32cf0fea82..365cca389f 100644 --- a/src/locale/locales/uk/messages.po +++ b/src/locale/locales/uk/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: uk\n" "Project-Id-Version: bsky-app-ua\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-01-03 20:21\n" +"PO-Revision-Date: 2024-01-04 14:24\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" @@ -1363,7 +1363,7 @@ msgstr "Додаткові опції" #: src/view/screens/PreferencesThreads.tsx:82 msgid "Most-liked replies first" -msgstr "" +msgstr "Кількістю вподобань" #: src/view/com/profile/ProfileHeader.tsx:370 msgid "Mute Account" @@ -1456,7 +1456,7 @@ msgstr "Новий пост" #: src/view/screens/PreferencesThreads.tsx:79 msgid "Newest replies first" -msgstr "" +msgstr "Спочатку найновіші" #: src/view/com/auth/create/CreateAccount.tsx:154 #: src/view/com/auth/login/ForgotPasswordForm.tsx:174 @@ -1554,7 +1554,7 @@ msgstr "Добре" #: src/view/screens/PreferencesThreads.tsx:78 msgid "Oldest replies first" -msgstr "" +msgstr "Спочатку найдавніші" #: src/view/com/composer/Composer.tsx:363 msgid "One or more images is missing alt text." @@ -1567,7 +1567,7 @@ msgstr "Тільки {0} можуть відповідати." #: src/view/com/composer/Composer.tsx:468 #: src/view/com/composer/Composer.tsx:469 msgid "Open emoji picker" -msgstr "" +msgstr "Емодзі" #: src/view/com/pager/FeedsTabBarMobile.tsx:76 msgid "Open navigation" @@ -1802,7 +1802,7 @@ msgstr "Цитувати пост" #: src/view/screens/PreferencesThreads.tsx:86 msgid "Random (aka \"Poster's Roulette\")" -msgstr "" +msgstr "У випадковому порядку" #: src/view/com/modals/EditImage.tsx:236 msgid "Ratios" @@ -1925,7 +1925,7 @@ msgstr "Змінити" #: src/view/screens/Settings.tsx:422 msgid "Require alt text before posting" -msgstr "" +msgstr "Вимагати додавання альтернативного тексту перед тим як постити зображення" #: src/view/com/auth/create/Step2.tsx:68 msgid "Required for this provider" From f65bbe36f5580b847e17758f1cf818a414b6a46a Mon Sep 17 00:00:00 2001 From: Maison da Silva Date: Fri, 5 Jan 2024 15:03:12 -0300 Subject: [PATCH 8/9] =?UTF-8?q?Update=20for=20Version=201.63=20Portugu?= =?UTF-8?q?=C3=AAs=20(BR)=20(#2435)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update for Version 1.63 * Update Date --- src/locale/locales/pt-BR/messages.po | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/locale/locales/pt-BR/messages.po b/src/locale/locales/pt-BR/messages.po index 1b5c8f2c0a..45daf1a9f5 100644 --- a/src/locale/locales/pt-BR/messages.po +++ b/src/locale/locales/pt-BR/messages.po @@ -8,7 +8,7 @@ msgstr "" "Language: pt-BR\n" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-12-31 00:34\n" +"PO-Revision-Date: 2024-01-05 17:00\n" "Last-Translator: Maison da Silva\n" "Language-Team: maisondasilva\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -650,7 +650,7 @@ msgstr "Domínio personalizado" #: src/view/screens/PreferencesExternalEmbeds.tsx:55 msgid "Customize media from external sites." -msgstr "" +msgstr "Personalize a mídia de sites externos." #: src/view/screens/Settings.tsx:648 msgid "Danger Zone" @@ -820,11 +820,11 @@ msgstr "Email:" #: src/view/com/modals/EmbedConsent.tsx:113 msgid "Enable {0} only" -msgstr "" +msgstr "Ativar {0} somente" #: src/view/com/modals/EmbedConsent.tsx:97 msgid "Enable External Media" -msgstr "" +msgstr "Ativar Mídia Externa" #: src/view/screens/PreferencesHomeFeed.tsx:144 msgid "Enable this setting to only see replies between people you follow." @@ -872,17 +872,17 @@ msgstr "Expandir texto alternativo" #: src/view/com/modals/EmbedConsent.tsx:64 msgid "External Media" -msgstr "" +msgstr "Mídia Externa" #: src/view/com/modals/EmbedConsent.tsx:75 #: src/view/screens/PreferencesExternalEmbeds.tsx:66 msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." -msgstr "" +msgstr "A mídia externa pode permitir que os sites coletem informações sobre você e seu dispositivo. Nenhuma informação é enviada ou solicitada até que você pressione o botão \"play\"." #: src/view/screens/PreferencesExternalEmbeds.tsx:52 #: src/view/screens/Settings.tsx:595 msgid "External Media Preferences" -msgstr "" +msgstr "Preferências de Mídia Externa" #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:109 #: src/view/com/auth/onboarding/RecommendedFeeds.tsx:141 @@ -1424,7 +1424,7 @@ msgstr "Nome" #: src/view/com/modals/EmbedConsent.tsx:107 #: src/view/com/modals/EmbedConsent.tsx:123 msgid "Never load embeds from {0}" -msgstr "" +msgstr "Nunca carregue incorporações de {0}" #: src/view/com/auth/onboarding/WelcomeMobile.tsx:72 msgid "Never lose access to your followers and data." @@ -1504,7 +1504,7 @@ msgstr "Nenhum resultado encontrado para {query}" #: src/view/com/modals/EmbedConsent.tsx:129 msgid "No thanks" -msgstr "" +msgstr "Não, obrigado" #: src/view/com/modals/Threadgate.tsx:82 msgid "Nobody" @@ -1574,7 +1574,7 @@ msgstr "Abre definições de idioma configuráveis" #: src/view/screens/Settings.tsx:587 msgid "Opens external embeds settings" -msgstr "" +msgstr "Abre as configurações de incorporações externas" #: src/view/shell/desktop/RightNav.tsx:156 #: src/view/shell/Drawer.tsx:641 @@ -1660,16 +1660,16 @@ msgstr "Feeds Fixados" #: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:111 msgid "Play {0}" -msgstr "" +msgstr "Reproduzir {0}" #: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:54 #: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:55 msgid "Play Video" -msgstr "" +msgstr "Reproduzir Vídeo" #: src/view/com/util/post-embeds/ExternalGifEmbed.tsx:110 msgid "Plays the GIF" -msgstr "" +msgstr "Reproduz o GIF" #: src/view/com/auth/create/state.ts:116 msgid "Please choose your handle." @@ -2131,7 +2131,7 @@ msgstr "Mostrar mesmo assim" #: src/view/com/modals/EmbedConsent.tsx:87 msgid "Show embeds from {0}" -msgstr "" +msgstr "Mostrar incorporações de {0}" #: src/view/screens/PreferencesHomeFeed.tsx:255 msgid "Show Posts from My Feeds" @@ -2346,7 +2346,7 @@ msgstr "Esta conta solicitou que os usuários fizessem login para visualizar seu #: src/view/com/modals/EmbedConsent.tsx:68 msgid "This content is hosted by {0}. Do you want to enable external media?" -msgstr "" +msgstr "Este conteúdo é hospedado por {0}. Deseja ativar a mídia externa?" #: src/view/com/posts/FeedErrorMessage.tsx:107 msgid "This content is not viewable without a Bluesky account." From 56021ccda55e0b30738d4689d3eaa52e8f0c3e96 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 5 Jan 2024 13:53:59 -0600 Subject: [PATCH 9/9] Use android mode, fix fallback (#2437) --- src/Splash.tsx | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/Splash.tsx b/src/Splash.tsx index 0ddb0520d3..4b480b7a4b 100644 --- a/src/Splash.tsx +++ b/src/Splash.tsx @@ -140,20 +140,13 @@ export function Splash(props: React.PropsWithChildren) { {platformApiLevel && platformApiLevel <= 25 ? ( // Use a simple fade on older versions of android (work around a bug) <> - {!isAnimationComplete && ( - - )} {props.children} ) : (