diff --git a/bskyembed/package.json b/bskyembed/package.json
index cb9a4621..72d2b6df 100644
--- a/bskyembed/package.json
+++ b/bskyembed/package.json
@@ -22,7 +22,7 @@
"eslint-plugin-simple-import-sort": "^12.0.0",
"postcss": "^8.4.38",
"tailwindcss": "^3.4.3",
- "typescript": "^4.0.5",
+ "typescript": "^5.5.4",
"vite": "^5.2.8",
"vite-tsconfig-paths": "^4.3.2"
}
diff --git a/bskyembed/src/components/post.tsx b/bskyembed/src/components/post.tsx
index 1d1e8f4d..4db5eeb4 100644
--- a/bskyembed/src/components/post.tsx
+++ b/bskyembed/src/components/post.tsx
@@ -11,7 +11,7 @@ import likeIcon from '../../assets/heart2_filled_stroke2_corner0_rounded.svg'
import logo from '../../assets/logo.svg'
import repostIcon from '../../assets/repost_stroke2_corner2_rounded.svg'
import {CONTENT_LABELS} from '../labels'
-import {getRkey, niceDate} from '../utils'
+import {getRkey, niceDate, prettyNumber} from '../utils'
import {Container} from './container'
import {Embed} from './embed'
import {Link} from './link'
@@ -78,7 +78,7 @@ export function Post({thread}: Props) {
- {post.likeCount}
+ {prettyNumber(post.likeCount)}
)}
@@ -86,7 +86,7 @@ export function Post({thread}: Props) {
- {post.repostCount}
+ {prettyNumber(post.repostCount)}
)}
@@ -97,7 +97,7 @@ export function Post({thread}: Props) {
{post.replyCount
- ? `Read ${post.replyCount} ${
+ ? `Read ${prettyNumber(post.replyCount)} ${
post.replyCount > 1 ? 'replies' : 'reply'
} on Bluesky`
: `View on Bluesky`}
diff --git a/bskyembed/src/utils.ts b/bskyembed/src/utils.ts
index 1f6fd506..cfa4a525 100644
--- a/bskyembed/src/utils.ts
+++ b/bskyembed/src/utils.ts
@@ -16,3 +16,13 @@ export function getRkey({uri}: {uri: string}): string {
const at = new AtUri(uri)
return at.rkey
}
+
+const formatter = new Intl.NumberFormat('en-US', {
+ notation: 'compact',
+ maximumFractionDigits: 1,
+ roundingMode: 'trunc',
+})
+
+export function prettyNumber(number: number) {
+ return formatter.format(number)
+}
diff --git a/bskyembed/tsconfig.json b/bskyembed/tsconfig.json
index 44c516ed..b3b6055c 100644
--- a/bskyembed/tsconfig.json
+++ b/bskyembed/tsconfig.json
@@ -20,5 +20,5 @@
"jsxFragmentFactory": "Fragment",
"downlevelIteration": true
},
- "include": ["src"]
+ "include": ["src", "vite.config.ts"]
}
diff --git a/bskyembed/tsconfig.snippet.json b/bskyembed/tsconfig.snippet.json
index a6b6071d..fee21964 100644
--- a/bskyembed/tsconfig.snippet.json
+++ b/bskyembed/tsconfig.snippet.json
@@ -6,5 +6,5 @@
"strict": true,
"outDir": "dist"
},
- "include": ["snippet"],
+ "include": ["snippet"]
}
diff --git a/bskyembed/yarn.lock b/bskyembed/yarn.lock
index ca52dc07..3c5ef5ae 100644
--- a/bskyembed/yarn.lock
+++ b/bskyembed/yarn.lock
@@ -4024,10 +4024,10 @@ typed-array-length@^1.0.6:
is-typed-array "^1.1.13"
possible-typed-array-names "^1.0.0"
-typescript@^4.0.5:
- version "4.9.5"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
- integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
+typescript@^5.5.4:
+ version "5.5.4"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba"
+ integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
uint8arrays@3.0.0:
version "3.0.0"
diff --git a/scripts/post-web-build.js b/scripts/post-web-build.js
index 5db37885..baaa7cb8 100644
--- a/scripts/post-web-build.js
+++ b/scripts/post-web-build.js
@@ -2,7 +2,6 @@ const path = require('path')
const fs = require('fs')
const projectRoot = path.join(__dirname, '..')
-const webBuildJs = path.join(projectRoot, 'web-build', 'static', 'js')
const templateFile = path.join(
projectRoot,
'bskyweb',
@@ -10,18 +9,18 @@ const templateFile = path.join(
'scripts.html',
)
-const jsFiles = fs.readdirSync(webBuildJs).filter(name => name.endsWith('.js'))
-jsFiles.sort((a, b) => {
- // make sure main is written last
- if (a.startsWith('main')) return 1
- if (b.startsWith('main')) return -1
- return a.localeCompare(b)
-})
+const {entrypoints} = require(path.join(
+ projectRoot,
+ 'web-build/asset-manifest.json',
+))
-console.log(`Found ${jsFiles.length} js files in web-build`)
+console.log(`Found ${entrypoints.length} entrypoints`)
console.log(`Writing ${templateFile}`)
-const outputFile = jsFiles
- .map(name => ``)
+const outputFile = entrypoints
+ .map(name => {
+ const file = path.basename(name)
+ return ``
+ })
.join('\n')
fs.writeFileSync(templateFile, outputFile)
diff --git a/src/lib/constants.ts b/src/lib/constants.ts
index ccd5f2de..29357940 100644
--- a/src/lib/constants.ts
+++ b/src/lib/constants.ts
@@ -3,9 +3,9 @@ import {AppBskyActorDefs} from '@atproto/api'
export const LOCAL_DEV_SERVICE =
Platform.OS === 'android' ? 'http://10.0.2.2:2583' : 'http://localhost:2583'
-export const STAGING_SERVICE = 'https://staging.bsky.dev'
-export const BSKY_SERVICE = 'https://bsky.social'
-export const PUBLIC_BSKY_SERVICE = 'https://public.api.bsky.app'
+export const STAGING_SERVICE = 'https://zio.blue
+export const BSKY_SERVICE = 'https://zio.blue'
+export const PUBLIC_BSKY_SERVICE = 'https://zio.blue'
export const DEFAULT_SERVICE = BSKY_SERVICE
const HELP_DESK_LANG = 'en-us'
export const HELP_DESK_URL = `https://blueskyweb.zendesk.com/hc/${HELP_DESK_LANG}`
diff --git a/src/lib/custom-animations/CountWheel.tsx b/src/lib/custom-animations/CountWheel.tsx
new file mode 100644
index 00000000..1a867671
--- /dev/null
+++ b/src/lib/custom-animations/CountWheel.tsx
@@ -0,0 +1,177 @@
+import React from 'react'
+import {View} from 'react-native'
+import Animated, {
+ Easing,
+ LayoutAnimationConfig,
+ useReducedMotion,
+ withTiming,
+} from 'react-native-reanimated'
+import {i18n} from '@lingui/core'
+
+import {decideShouldRoll} from 'lib/custom-animations/util'
+import {s} from 'lib/styles'
+import {formatCount} from 'view/com/util/numeric/format'
+import {Text} from 'view/com/util/text/Text'
+import {atoms as a, useTheme} from '#/alf'
+
+const animationConfig = {
+ duration: 400,
+ easing: Easing.out(Easing.cubic),
+}
+
+function EnteringUp() {
+ 'worklet'
+ const animations = {
+ opacity: withTiming(1, animationConfig),
+ transform: [{translateY: withTiming(0, animationConfig)}],
+ }
+ const initialValues = {
+ opacity: 0,
+ transform: [{translateY: 18}],
+ }
+ return {
+ animations,
+ initialValues,
+ }
+}
+
+function EnteringDown() {
+ 'worklet'
+ const animations = {
+ opacity: withTiming(1, animationConfig),
+ transform: [{translateY: withTiming(0, animationConfig)}],
+ }
+ const initialValues = {
+ opacity: 0,
+ transform: [{translateY: -18}],
+ }
+ return {
+ animations,
+ initialValues,
+ }
+}
+
+function ExitingUp() {
+ 'worklet'
+ const animations = {
+ opacity: withTiming(0, animationConfig),
+ transform: [
+ {
+ translateY: withTiming(-18, animationConfig),
+ },
+ ],
+ }
+ const initialValues = {
+ opacity: 1,
+ transform: [{translateY: 0}],
+ }
+ return {
+ animations,
+ initialValues,
+ }
+}
+
+function ExitingDown() {
+ 'worklet'
+ const animations = {
+ opacity: withTiming(0, animationConfig),
+ transform: [{translateY: withTiming(18, animationConfig)}],
+ }
+ const initialValues = {
+ opacity: 1,
+ transform: [{translateY: 0}],
+ }
+ return {
+ animations,
+ initialValues,
+ }
+}
+
+export function CountWheel({
+ likeCount,
+ big,
+ isLiked,
+}: {
+ likeCount: number
+ big?: boolean
+ isLiked: boolean
+}) {
+ const t = useTheme()
+ const shouldAnimate = !useReducedMotion()
+ const shouldRoll = decideShouldRoll(isLiked, likeCount)
+
+ // Incrementing the key will cause the `Animated.View` to re-render, with the newly selected entering/exiting
+ // animation
+ // The initial entering/exiting animations will get skipped, since these will happen on screen mounts and would
+ // be unnecessary
+ const [key, setKey] = React.useState(0)
+ const [prevCount, setPrevCount] = React.useState(likeCount)
+ const prevIsLiked = React.useRef(isLiked)
+ const formattedCount = formatCount(i18n, likeCount)
+ const formattedPrevCount = formatCount(i18n, prevCount)
+
+ React.useEffect(() => {
+ if (isLiked === prevIsLiked.current) {
+ return
+ }
+
+ const newPrevCount = isLiked ? likeCount - 1 : likeCount + 1
+ setKey(prev => prev + 1)
+ setPrevCount(newPrevCount)
+ prevIsLiked.current = isLiked
+ }, [isLiked, likeCount])
+
+ const enteringAnimation =
+ shouldAnimate && shouldRoll
+ ? isLiked
+ ? EnteringUp
+ : EnteringDown
+ : undefined
+ const exitingAnimation =
+ shouldAnimate && shouldRoll
+ ? isLiked
+ ? ExitingUp
+ : ExitingDown
+ : undefined
+
+ return (
+
+ {likeCount > 0 ? (
+
+
+
+ {formattedCount}
+
+
+ {shouldAnimate && (likeCount > 1 || !isLiked) ? (
+
+
+ {formattedPrevCount}
+
+
+ ) : null}
+
+ ) : null}
+
+ )
+}
diff --git a/src/lib/custom-animations/CountWheel.web.tsx b/src/lib/custom-animations/CountWheel.web.tsx
new file mode 100644
index 00000000..594117bf
--- /dev/null
+++ b/src/lib/custom-animations/CountWheel.web.tsx
@@ -0,0 +1,120 @@
+import React from 'react'
+import {View} from 'react-native'
+import {useReducedMotion} from 'react-native-reanimated'
+import {i18n} from '@lingui/core'
+
+import {decideShouldRoll} from 'lib/custom-animations/util'
+import {s} from 'lib/styles'
+import {formatCount} from 'view/com/util/numeric/format'
+import {Text} from 'view/com/util/text/Text'
+import {atoms as a, useTheme} from '#/alf'
+
+const animationConfig = {
+ duration: 400,
+ easing: 'cubic-bezier(0.4, 0, 0.2, 1)',
+ fill: 'forwards' as FillMode,
+}
+
+const enteringUpKeyframe = [
+ {opacity: 0, transform: 'translateY(18px)'},
+ {opacity: 1, transform: 'translateY(0)'},
+]
+
+const enteringDownKeyframe = [
+ {opacity: 0, transform: 'translateY(-18px)'},
+ {opacity: 1, transform: 'translateY(0)'},
+]
+
+const exitingUpKeyframe = [
+ {opacity: 1, transform: 'translateY(0)'},
+ {opacity: 0, transform: 'translateY(-18px)'},
+]
+
+const exitingDownKeyframe = [
+ {opacity: 1, transform: 'translateY(0)'},
+ {opacity: 0, transform: 'translateY(18px)'},
+]
+
+export function CountWheel({
+ likeCount,
+ big,
+ isLiked,
+}: {
+ likeCount: number
+ big?: boolean
+ isLiked: boolean
+}) {
+ const t = useTheme()
+ const shouldAnimate = !useReducedMotion()
+ const shouldRoll = decideShouldRoll(isLiked, likeCount)
+
+ const countView = React.useRef(null)
+ const prevCountView = React.useRef(null)
+
+ const [prevCount, setPrevCount] = React.useState(likeCount)
+ const prevIsLiked = React.useRef(isLiked)
+ const formattedCount = formatCount(i18n, likeCount)
+ const formattedPrevCount = formatCount(i18n, prevCount)
+
+ React.useEffect(() => {
+ if (isLiked === prevIsLiked.current) {
+ return
+ }
+
+ const newPrevCount = isLiked ? likeCount - 1 : likeCount + 1
+ if (shouldAnimate && shouldRoll) {
+ countView.current?.animate?.(
+ isLiked ? enteringUpKeyframe : enteringDownKeyframe,
+ animationConfig,
+ )
+ prevCountView.current?.animate?.(
+ isLiked ? exitingUpKeyframe : exitingDownKeyframe,
+ animationConfig,
+ )
+ setPrevCount(newPrevCount)
+ }
+ prevIsLiked.current = isLiked
+ }, [isLiked, likeCount, shouldAnimate, shouldRoll])
+
+ if (likeCount < 1) {
+ return null
+ }
+
+ return (
+
+
+
+ {formattedCount}
+
+
+ {shouldAnimate && (likeCount > 1 || !isLiked) ? (
+
+
+ {formattedPrevCount}
+
+
+ ) : null}
+
+ )
+}
diff --git a/src/lib/custom-animations/LikeIcon.tsx b/src/lib/custom-animations/LikeIcon.tsx
new file mode 100644
index 00000000..f5802ecc
--- /dev/null
+++ b/src/lib/custom-animations/LikeIcon.tsx
@@ -0,0 +1,135 @@
+import React from 'react'
+import {View} from 'react-native'
+import Animated, {
+ Keyframe,
+ LayoutAnimationConfig,
+ useReducedMotion,
+} from 'react-native-reanimated'
+
+import {s} from 'lib/styles'
+import {useTheme} from '#/alf'
+import {
+ Heart2_Filled_Stroke2_Corner0_Rounded as HeartIconFilled,
+ Heart2_Stroke2_Corner0_Rounded as HeartIconOutline,
+} from '#/components/icons/Heart2'
+
+const keyframe = new Keyframe({
+ 0: {
+ transform: [{scale: 1}],
+ },
+ 10: {
+ transform: [{scale: 0.7}],
+ },
+ 40: {
+ transform: [{scale: 1.2}],
+ },
+ 100: {
+ transform: [{scale: 1}],
+ },
+})
+
+const circle1Keyframe = new Keyframe({
+ 0: {
+ opacity: 0,
+ transform: [{scale: 0}],
+ },
+ 10: {
+ opacity: 0.4,
+ },
+ 40: {
+ transform: [{scale: 1.5}],
+ },
+ 95: {
+ opacity: 0.4,
+ },
+ 100: {
+ opacity: 0,
+ transform: [{scale: 1.5}],
+ },
+})
+
+const circle2Keyframe = new Keyframe({
+ 0: {
+ opacity: 0,
+ transform: [{scale: 0}],
+ },
+ 10: {
+ opacity: 1,
+ },
+ 40: {
+ transform: [{scale: 0}],
+ },
+ 95: {
+ opacity: 1,
+ },
+ 100: {
+ opacity: 0,
+ transform: [{scale: 1.5}],
+ },
+})
+
+export function AnimatedLikeIcon({
+ isLiked,
+ big,
+}: {
+ isLiked: boolean
+ big?: boolean
+}) {
+ const t = useTheme()
+ const size = big ? 22 : 18
+ const shouldAnimate = !useReducedMotion()
+
+ return (
+
+
+ {isLiked ? (
+
+
+
+ ) : (
+
+ )}
+ {isLiked ? (
+ <>
+
+
+ >
+ ) : null}
+
+
+ )
+}
diff --git a/src/lib/custom-animations/LikeIcon.web.tsx b/src/lib/custom-animations/LikeIcon.web.tsx
new file mode 100644
index 00000000..6dc94c29
--- /dev/null
+++ b/src/lib/custom-animations/LikeIcon.web.tsx
@@ -0,0 +1,117 @@
+import React from 'react'
+import {View} from 'react-native'
+import {useReducedMotion} from 'react-native-reanimated'
+
+import {s} from 'lib/styles'
+import {useTheme} from '#/alf'
+import {
+ Heart2_Filled_Stroke2_Corner0_Rounded as HeartIconFilled,
+ Heart2_Stroke2_Corner0_Rounded as HeartIconOutline,
+} from '#/components/icons/Heart2'
+
+const animationConfig = {
+ duration: 400,
+ easing: 'cubic-bezier(0.4, 0, 0.2, 1)',
+ fill: 'forwards' as FillMode,
+}
+
+const keyframe = [
+ {transform: 'scale(1)'},
+ {transform: 'scale(0.7)'},
+ {transform: 'scale(1.2)'},
+ {transform: 'scale(1)'},
+]
+
+const circle1Keyframe = [
+ {opacity: 0, transform: 'scale(0)'},
+ {opacity: 0.4},
+ {transform: 'scale(1.5)'},
+ {opacity: 0.4},
+ {opacity: 0, transform: 'scale(1.5)'},
+]
+
+const circle2Keyframe = [
+ {opacity: 0, transform: 'scale(0)'},
+ {opacity: 1},
+ {transform: 'scale(0)'},
+ {opacity: 1},
+ {opacity: 0, transform: 'scale(1.5)'},
+]
+
+export function AnimatedLikeIcon({
+ isLiked,
+ big,
+}: {
+ isLiked: boolean
+ big?: boolean
+}) {
+ const t = useTheme()
+ const size = big ? 22 : 18
+ const shouldAnimate = !useReducedMotion()
+ const prevIsLiked = React.useRef(isLiked)
+
+ const likeIconRef = React.useRef(null)
+ const circle1Ref = React.useRef(null)
+ const circle2Ref = React.useRef(null)
+
+ React.useEffect(() => {
+ if (prevIsLiked.current === isLiked) {
+ return
+ }
+
+ if (shouldAnimate && isLiked) {
+ likeIconRef.current?.animate?.(keyframe, animationConfig)
+ circle1Ref.current?.animate?.(circle1Keyframe, animationConfig)
+ circle2Ref.current?.animate?.(circle2Keyframe, animationConfig)
+ }
+ prevIsLiked.current = isLiked
+ }, [shouldAnimate, isLiked])
+
+ return (
+
+ {isLiked ? (
+ // @ts-expect-error is div
+
+
+
+ ) : (
+
+ )}
+
+
+
+ )
+}
diff --git a/src/lib/custom-animations/util.ts b/src/lib/custom-animations/util.ts
new file mode 100644
index 00000000..0aebab57
--- /dev/null
+++ b/src/lib/custom-animations/util.ts
@@ -0,0 +1,21 @@
+// It should roll when:
+// - We're going from 1 to 0 (roll backwards)
+// - The count is anywhere between 1 and 999
+// - The count is going up and is a multiple of 100
+// - The count is going down and is 1 less than a multiple of 100
+export function decideShouldRoll(isSet: boolean, count: number) {
+ let shouldRoll = false
+ if (!isSet && count === 0) {
+ shouldRoll = true
+ } else if (count > 0 && count < 1000) {
+ shouldRoll = true
+ } else if (count > 0) {
+ const mod = count % 100
+ if (isSet && mod === 0) {
+ shouldRoll = true
+ } else if (!isSet && mod === 99) {
+ shouldRoll = true
+ }
+ }
+ return shouldRoll
+}
diff --git a/src/lib/media/video/compress.ts b/src/lib/media/video/compress.ts
index 709f2a77..79c58f5d 100644
--- a/src/lib/media/video/compress.ts
+++ b/src/lib/media/video/compress.ts
@@ -29,5 +29,6 @@ export async function compressVideo(
)
const info = await getVideoMetaData(compressed)
- return {uri: compressed, size: info.size}
+
+ return {uri: compressed, size: info.size, mimeType: `video/${info.extension}`}
}
diff --git a/src/lib/media/video/compress.web.ts b/src/lib/media/video/compress.web.ts
index c0870253..c071b33a 100644
--- a/src/lib/media/video/compress.web.ts
+++ b/src/lib/media/video/compress.web.ts
@@ -23,6 +23,7 @@ export async function compressVideo(
size: blob.size,
uri,
bytes: await blob.arrayBuffer(),
+ mimeType,
}
}
diff --git a/src/lib/media/video/errors.ts b/src/lib/media/video/errors.ts
index 701a7e23..a06a239e 100644
--- a/src/lib/media/video/errors.ts
+++ b/src/lib/media/video/errors.ts
@@ -4,3 +4,10 @@ export class VideoTooLargeError extends Error {
this.name = 'VideoTooLargeError'
}
}
+
+export class ServerError extends Error {
+ constructor(message: string) {
+ super(message)
+ this.name = 'ServerError'
+ }
+}
diff --git a/src/lib/media/video/types.ts b/src/lib/media/video/types.ts
index ba007005..ae873d75 100644
--- a/src/lib/media/video/types.ts
+++ b/src/lib/media/video/types.ts
@@ -1,5 +1,6 @@
export type CompressedVideo = {
uri: string
+ mimeType: string
size: number
// web only, can fall back to uri if missing
bytes?: ArrayBuffer
diff --git a/src/locale/locales/pt-BR/messages.po b/src/locale/locales/pt-BR/messages.po
index 39cb9bd9..aa6258cf 100644
--- a/src/locale/locales/pt-BR/messages.po
+++ b/src/locale/locales/pt-BR/messages.po
@@ -9,13 +9,13 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-05-13 11:41\n"
-"Last-Translator: gildaswise\n"
-"Language-Team: maisondasilva, MightyLoggor, gildaswise, gleydson, faeriarum\n"
+"Last-Translator: fabiohcnobre\n"
+"Language-Team: maisondasilva, MightyLoggor, gildaswise, gleydson, faeriarum, fabiohcnobre\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/screens/Messages/List/ChatListItem.tsx:120
msgid "(contains embedded content)"
-msgstr ""
+msgstr "(contém conteúdo incorporado)"
#: src/view/com/modals/VerifyEmail.tsx:150
msgid "(no email)"
@@ -117,11 +117,11 @@ msgstr "{0} pessoas já usaram este pacote inicial!"
#: src/view/com/util/UserAvatar.tsx:419
msgid "{0}'s avatar"
-msgstr ""
+msgstr "Avatar de {0}"
#: src/screens/StarterPack/Wizard/StepDetails.tsx:68
msgid "{0}'s favorite feeds and people - join me!"
-msgstr "Os feeds e pessoas favoritos de {0} - junte-se a mim!"
+msgstr "Os feeds e pessoas favoritas de {0} - junte-se a mim!"
#: src/screens/StarterPack/Wizard/StepDetails.tsx:47
msgid "{0}'s starter pack"
@@ -170,7 +170,7 @@ msgstr "{following} seguindo"
#: src/components/dms/dialogs/SearchablePeopleList.tsx:405
msgid "{handle} can't be messaged"
-msgstr ""
+msgstr "{handle} não pode receber mensagens"
#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:286
#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:299
@@ -238,7 +238,7 @@ msgstr "<0>{0}0> está incluído no seu kit inicial"
#: src/components/WhoCanReply.tsx:274
msgid "<0>{0}0> members"
-msgstr ""
+msgstr "<0>{0}0> membros"
#: src/components/ProfileHoverCard/index.web.tsx:437
#~ msgid "<0>{followers} 0><1>{pluralizedFollowers}1>"
@@ -275,7 +275,7 @@ msgstr "⚠Usuário Inválido"
#: src/components/dialogs/MutedWords.tsx:193
msgid "24 hours"
-msgstr ""
+msgstr "24 horas"
#: src/screens/Login/LoginForm.tsx:266
msgid "2FA Confirmation"
@@ -283,15 +283,15 @@ msgstr "Confirmação do 2FA"
#: src/components/dialogs/MutedWords.tsx:232
msgid "30 days"
-msgstr ""
+msgstr "30 dias"
#: src/components/dialogs/MutedWords.tsx:217
msgid "7 days"
-msgstr ""
+msgstr "7 dias"
#: src/tours/Tooltip.tsx:70
msgid "A help tooltip"
-msgstr ""
+msgstr "Uma sugestão de ajuda"
#: src/view/com/util/ViewHeader.tsx:92
#: src/view/screens/Search/Search.tsx:684
@@ -435,7 +435,7 @@ msgstr "Adicionar palavras/tags silenciadas"
#: src/screens/StarterPack/Wizard/index.tsx:197
#~ msgid "Add people to your starter pack that you think others will enjoy following"
-#~ msgstr ""
+#~ msgstr "Adicione pessoas ao seu kit inicial que você acha que outros gostarão de seguir"
#: src/screens/Home/NoFeedsPinned.tsx:99
msgid "Add recommended feeds"
@@ -455,7 +455,7 @@ msgstr "Adicione o seguinte registro DNS ao seu domínio:"
#: src/components/FeedCard.tsx:293
msgid "Add this feed to your feeds"
-msgstr ""
+msgstr "Adicione este feed aos seus feeds"
#: src/view/com/profile/ProfileMenu.tsx:267
#: src/view/com/profile/ProfileMenu.tsx:270
@@ -491,7 +491,7 @@ msgstr "Conteúdo Adulto"
#: src/screens/Moderation/index.tsx:365
msgid "Adult content can only be enabled via the Web at <0>bsky.app0>."
-msgstr ""
+msgstr "Conteúdo adulto só pode ser habilitado pela web em <0>bsky.app0>."
#: src/components/moderation/LabelPreference.tsx:242
msgid "Adult content is disabled."
@@ -504,7 +504,7 @@ msgstr "Avançado"
#: src/state/shell/progress-guide.tsx:171
msgid "Algorithm training complete!"
-msgstr ""
+msgstr "Treinamento de algoritmo concluído!"
#: src/screens/StarterPack/StarterPackScreen.tsx:370
msgid "All accounts have been followed!"
@@ -517,25 +517,25 @@ msgstr "Todos os feeds que você salvou, em um único lugar."
#: src/view/com/modals/AddAppPasswords.tsx:188
#: src/view/com/modals/AddAppPasswords.tsx:195
msgid "Allow access to your direct messages"
-msgstr ""
+msgstr "Permitir acesso às suas mensagens diretas"
#: src/screens/Messages/Settings.tsx:61
#: src/screens/Messages/Settings.tsx:64
#~ msgid "Allow messages from"
-#~ msgstr ""
+#~ msgstr "Permitir mensagens de"
#: src/screens/Messages/Settings.tsx:62
#: src/screens/Messages/Settings.tsx:65
msgid "Allow new messages from"
-msgstr ""
+msgstr "Permitir novas mensagens de"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:359
msgid "Allow replies from:"
-msgstr ""
+msgstr "Permitir respostas de:"
#: src/view/screens/AppPasswords.tsx:271
msgid "Allows access to direct messages"
-msgstr ""
+msgstr "Permite acesso a mensagens diretas"
#: src/screens/Login/ForgotPasswordForm.tsx:178
#: src/view/com/modals/ChangePassword.tsx:171
@@ -577,7 +577,7 @@ msgstr "Um email foi enviado para seu email anterior, {0}. Ele inclui um código
#: src/components/dialogs/GifSelect.tsx:254
msgid "An error has occurred"
-msgstr ""
+msgstr "Ocorreu um erro"
#: src/components/dialogs/GifSelect.tsx:252
#~ msgid "An error occured"
@@ -585,25 +585,25 @@ msgstr ""
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx:314
msgid "An error occurred"
-msgstr ""
+msgstr "Ocorreu um erro"
#: src/components/StarterPack/ProfileStarterPacks.tsx:315
msgid "An error occurred while generating your starter pack. Want to try again?"
-msgstr ""
+msgstr "Ocorreu um erro ao gerar seu kit inicial. Quer tentar novamente?"
#: src/view/com/util/post-embeds/VideoEmbed.tsx:69
#: src/view/com/util/post-embeds/VideoEmbed.web.tsx:150
msgid "An error occurred while loading the video. Please try again later."
-msgstr ""
+msgstr "Ocorreu um erro ao carregar o vídeo. Tente novamente mais tarde."
#: src/components/StarterPack/ShareDialog.tsx:79
#~ msgid "An error occurred while saving the image."
-#~ msgstr ""
+#~ msgstr "Ocorreu um erro ao salvar a imagem."
#: src/components/StarterPack/QrCodeDialog.tsx:71
#: src/components/StarterPack/ShareDialog.tsx:79
msgid "An error occurred while saving the QR code!"
-msgstr ""
+msgstr "Ocorreu um erro ao salvar o QR code!"
#: src/components/dms/MessageMenu.tsx:134
#~ msgid "An error occurred while trying to delete the message. Please try again."
@@ -616,7 +616,7 @@ msgstr "Ocorreu um erro ao tentar seguir todos"
#: src/state/queries/video/video.ts:112
msgid "An error occurred while uploading the video."
-msgstr ""
+msgstr "Ocorreu um erro ao enviar o vídeo."
#: src/lib/moderation/useReportOptions.ts:28
msgid "An issue not included in these options"
@@ -624,11 +624,11 @@ msgstr "Outro problema"
#: src/components/dms/dialogs/NewChatDialog.tsx:36
msgid "An issue occurred starting the chat"
-msgstr ""
+msgstr "Ocorreu um problema ao iniciar o chat"
#: src/components/dms/dialogs/ShareViaChatDialog.tsx:49
msgid "An issue occurred while trying to open the chat"
-msgstr ""
+msgstr "Ocorreu um problema ao tentar abrir o chat"
#: src/components/hooks/useFollowMethods.ts:35
#: src/components/hooks/useFollowMethods.ts:50
@@ -646,7 +646,7 @@ msgstr "ocorreu um erro desconhecido"
#: src/components/moderation/ModerationDetailsDialog.tsx:151
#: src/components/moderation/ModerationDetailsDialog.tsx:147
msgid "an unknown labeler"
-msgstr ""
+msgstr "um rotulador desconhecido"
#: src/components/WhoCanReply.tsx:295
#: src/view/com/notifications/FeedItem.tsx:235
@@ -669,7 +669,7 @@ msgstr "Comportamento anti-social"
#: src/view/com/composer/threadgate/ThreadgateBtn.tsx:54
msgid "Anybody can interact"
-msgstr ""
+msgstr "Qualquer pessoa pode interagir"
#: src/view/screens/LanguageSettings.tsx:96
msgid "App Language"
@@ -720,7 +720,7 @@ msgstr "Contestação enviada."
#: src/screens/Messages/Conversation/ChatDisabled.tsx:99
#: src/screens/Messages/Conversation/ChatDisabled.tsx:101
msgid "Appeal this decision"
-msgstr ""
+msgstr "Recorrer desta decisão"
#: src/screens/Settings/AppearanceSettings.tsx:69
#: src/view/screens/Settings/index.tsx:484
@@ -729,11 +729,11 @@ msgstr "Aparência"
#: src/view/screens/Settings/index.tsx:475
msgid "Appearance settings"
-msgstr ""
+msgstr "Configurações de aparência"
#: src/Navigation.tsx:326
msgid "Appearance Settings"
-msgstr ""
+msgstr "Configurações de aparência"
#: src/screens/Feeds/NoSavedFeedsOfAnyType.tsx:47
#: src/screens/Home/NoFeedsPinned.tsx:93
@@ -742,7 +742,7 @@ msgstr "Utilizar feeds recomendados"
#: src/screens/StarterPack/StarterPackScreen.tsx:610
#~ msgid "Are you sure you want delete this starter pack?"
-#~ msgstr ""
+#~ msgstr "Tem certeza de que deseja excluir este pacote inicial?"
#: src/view/screens/AppPasswords.tsx:282
msgid "Are you sure you want to delete the app password \"{name}\"?"
@@ -754,7 +754,7 @@ msgstr "Tem certeza de que deseja excluir a senha do aplicativo \"{name}\"?"
#: src/components/dms/MessageMenu.tsx:149
msgid "Are you sure you want to delete this message? The message will be deleted for you, but not for the other participant."
-msgstr ""
+msgstr "Tem certeza de que deseja excluir esta mensagem? A mensagem será excluída para você, mas não para o outro participante."
#: src/screens/StarterPack/StarterPackScreen.tsx:621
msgid "Are you sure you want to delete this starter pack?"
@@ -766,7 +766,7 @@ msgstr "Tem certeza de que deseja excluir este kit inicial?"
#: src/components/dms/LeaveConvoPrompt.tsx:48
msgid "Are you sure you want to leave this conversation? Your messages will be deleted for you, but not for the other participant."
-msgstr ""
+msgstr "Tem certeza de que deseja sair desta conversa? Suas mensagens serão excluídas para você, mas não para os outros participantes."
#: src/view/com/feeds/FeedSourceCard.tsx:313
msgid "Are you sure you want to remove {0} from your feeds?"
@@ -774,7 +774,7 @@ msgstr "Tem certeza que deseja remover {0} dos seus feeds?"
#: src/components/FeedCard.tsx:310
msgid "Are you sure you want to remove this from your feeds?"
-msgstr ""
+msgstr "Tem certeza que deseja remover isto de seus feeds?"
#: src/view/com/composer/Composer.tsx:772
msgid "Are you sure you'd like to discard this draft?"
@@ -920,7 +920,7 @@ msgstr "Bluesky é uma rede aberta que permite a escolha do seu provedor de hosp
#: src/components/ProgressGuide/List.tsx:55
msgid "Bluesky is better with friends!"
-msgstr ""
+msgstr "Bluesky é melhor com amigos!"
#: src/view/com/auth/onboarding/WelcomeDesktop.tsx:80
#: src/view/com/auth/onboarding/WelcomeMobile.tsx:82
@@ -960,23 +960,23 @@ msgstr "Livros"
#: src/components/FeedInterstitials.tsx:300
msgid "Browse more accounts on the Explore page"
-msgstr ""
+msgstr "Navegue por mais contas na página Explorar"
#: src/components/FeedInterstitials.tsx:433
msgid "Browse more feeds on the Explore page"
-msgstr ""
+msgstr "Navegue por mais feeds na página Explorar"
#: src/components/FeedInterstitials.tsx:282
#: src/components/FeedInterstitials.tsx:285
#: src/components/FeedInterstitials.tsx:415
#: src/components/FeedInterstitials.tsx:418
msgid "Browse more suggestions"
-msgstr ""
+msgstr "Veja mais sugestões"
#: src/components/FeedInterstitials.tsx:308
#: src/components/FeedInterstitials.tsx:442
msgid "Browse more suggestions on the Explore page"
-msgstr ""
+msgstr "Navegue por mais sugestões na página Explorar"
#: src/screens/Home/NoFeedsPinned.tsx:103
#: src/screens/Home/NoFeedsPinned.tsx:109
@@ -1080,7 +1080,7 @@ msgstr "Cancelar citação"
#: src/screens/Deactivated.tsx:155
msgid "Cancel reactivation and log out"
-msgstr ""
+msgstr "Cancelar reativação e sair"
#: src/view/com/modals/ListAddRemoveUsers.tsx:88
msgid "Cancel search"
@@ -1150,7 +1150,7 @@ msgstr "Configurações do Chat"
#: src/screens/Messages/Settings.tsx:59
#: src/view/screens/Settings/index.tsx:613
msgid "Chat Settings"
-msgstr ""
+msgstr "Configurações do Chat"
#: src/components/dms/ConvoMenu.tsx:84
msgid "Chat unmuted"
@@ -1187,7 +1187,7 @@ msgstr "Verifique em sua caixa de entrada um e-mail com o código de confirmaç
#: src/screens/Onboarding/StepInterests/index.tsx:191
msgid "Choose 3 or more:"
-msgstr ""
+msgstr "Escolha 3 ou mais:"
#: src/screens/Onboarding/StepInterests/index.tsx:326
msgid "Choose at least {0} more"
@@ -1225,7 +1225,7 @@ msgstr "Selecionar esta cor como seu avatar"
#: src/components/dialogs/ThreadgateEditor.tsx:91
#: src/components/dialogs/ThreadgateEditor.tsx:95
#~ msgid "Choose who can reply"
-#~ msgstr ""
+#~ msgstr "Escolha quem pode responder"
#: src/screens/Onboarding/StepAlgoFeeds/index.tsx:104
#~ msgid "Choose your main feeds"
@@ -1270,11 +1270,11 @@ msgstr "clique aqui"
#: src/view/com/modals/DeleteAccount.tsx:208
msgid "Click here for more information on deactivating your account"
-msgstr ""
+msgstr "Clique aqui para obter mais informações sobre como desativar sua conta"
#: src/view/com/modals/DeleteAccount.tsx:216
msgid "Click here for more information."
-msgstr ""
+msgstr "Clique aqui para mais informações."
#: src/screens/Feeds/NoFollowingFeed.tsx:46
#~ msgid "Click here to add one."
@@ -1290,15 +1290,15 @@ msgstr "Clique aqui para abrir o menu da tag {tag}"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:303
msgid "Click to disable quote posts of this post."
-msgstr ""
+msgstr "Clique para desabilitar as citações desta publicação."
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:304
msgid "Click to enable quote posts of this post."
-msgstr ""
+msgstr "Clique para habilitar citações desta publicação."
#: src/components/dms/MessageItem.tsx:231
msgid "Click to retry failed message"
-msgstr ""
+msgstr "Clique para tentar novamente a mensagem que falhou"
#: src/screens/Onboarding/index.tsx:32
msgid "Climate"
@@ -1353,7 +1353,7 @@ msgstr "Fechar visualizador de imagens"
#: src/components/dms/MessagesNUX.tsx:162
msgid "Close modal"
-msgstr ""
+msgstr "Fechar janela"
#: src/view/shell/index.web.tsx:61
msgid "Close navigation footer"
@@ -1382,7 +1382,7 @@ msgstr "Fechar o visualizador de banner"
#: src/view/com/notifications/FeedItem.tsx:269
msgid "Collapse list of users"
-msgstr ""
+msgstr "Recolher lista de usuários"
#: src/view/com/notifications/FeedItem.tsx:470
msgid "Collapses list of users for a given notification"
@@ -1421,7 +1421,7 @@ msgstr "Escrever resposta"
#: src/view/com/composer/videos/VideoTranscodeProgress.tsx:51
msgid "Compressing..."
-msgstr ""
+msgstr "Comprimindo..."
#: src/screens/Onboarding/StepModeration/ModerationOption.tsx:81
#~ msgid "Configure content filtering setting for category: {0}"
@@ -1533,7 +1533,7 @@ msgstr "Continuar como {0} (já conectado)"
#: src/view/com/post-thread/PostThreadLoadMore.tsx:52
msgid "Continue thread..."
-msgstr ""
+msgstr "Continuar o tópico..."
#: src/screens/Onboarding/StepInterests/index.tsx:275
#: src/screens/Onboarding/StepProfile/index.tsx:266
@@ -1551,7 +1551,7 @@ msgstr "Continuar para o próximo passo"
#: src/screens/Messages/List/ChatListItem.tsx:154
msgid "Conversation deleted"
-msgstr ""
+msgstr "Conversa apagada"
#: src/screens/Onboarding/index.tsx:41
msgid "Cooking"
@@ -1635,7 +1635,7 @@ msgstr "Política de Direitos Autorais"
#: src/view/com/composer/videos/state.ts:31
#~ msgid "Could not compress video"
-#~ msgstr ""
+#~ msgstr "Não foi possível compactar o vídeo"
#: src/components/dms/LeaveConvoPrompt.tsx:39
msgid "Could not leave chat"
@@ -1676,7 +1676,7 @@ msgstr "Criar uma nova conta do Bluesky"
#: src/components/StarterPack/QrCodeDialog.tsx:154
msgid "Create a QR code for a starter pack"
-msgstr ""
+msgstr "Crie o QR code para um kit inicial"
#: src/components/StarterPack/ProfileStarterPacks.tsx:165
#: src/components/StarterPack/ProfileStarterPacks.tsx:259
@@ -1716,7 +1716,7 @@ msgstr "Criar uma nova conta"
#: src/components/StarterPack/ShareDialog.tsx:158
#~ msgid "Create QR code"
-#~ msgstr ""
+#~ msgstr "Criar QR code"
#: src/components/ReportDialog/SelectReportOptionView.tsx:101
msgid "Create report for {0}"
@@ -1755,7 +1755,7 @@ msgstr "Configurar mídia de sites externos."
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:288
msgid "Customize who can interact with this post."
-msgstr ""
+msgstr "Personalize quem pode interagir com esta postagem."
#: src/screens/Settings/AppearanceSettings.tsx:95
#: src/screens/Settings/AppearanceSettings.tsx:97
@@ -1772,7 +1772,7 @@ msgstr "Modo escuro"
#: src/screens/Settings/AppearanceSettings.tsx:109
#: src/screens/Settings/AppearanceSettings.tsx:114
msgid "Dark theme"
-msgstr ""
+msgstr "Tema escuro"
#: src/view/screens/Settings/index.tsx:473
#~ msgid "Dark Theme"
@@ -1785,11 +1785,11 @@ msgstr "Data de nascimento"
#: src/screens/Settings/components/DeactivateAccountDialog.tsx:73
#: src/view/screens/Settings/index.tsx:772
msgid "Deactivate account"
-msgstr ""
+msgstr "Desativar conta"
#: src/view/screens/Settings/index.tsx:784
msgid "Deactivate my account"
-msgstr ""
+msgstr "Desativar minha conta"
#: src/view/screens/Settings/index.tsx:839
msgid "Debug Moderation"
@@ -1832,7 +1832,7 @@ msgstr "Excluir senha de aplicativo?"
#: src/view/screens/Settings/index.tsx:856
#: src/view/screens/Settings/index.tsx:859
msgid "Delete chat declaration record"
-msgstr ""
+msgstr "Excluir registro da declaração de chat"
#: src/components/dms/MessageMenu.tsx:124
msgid "Delete for me"
@@ -1890,7 +1890,7 @@ msgstr "Post excluído."
#: src/view/screens/Settings/index.tsx:857
msgid "Deletes the chat declaration record"
-msgstr ""
+msgstr "Exclui o registro de declaração de chat"
#: src/view/com/modals/CreateOrEditList.tsx:289
#: src/view/com/modals/CreateOrEditList.tsx:310
@@ -1906,15 +1906,15 @@ msgstr "Texto alternativo"
#: src/view/com/util/forms/PostDropdownBtn.tsx:544
#: src/view/com/util/forms/PostDropdownBtn.tsx:554
msgid "Detach quote"
-msgstr ""
+msgstr "Desanexar citação"
#: src/view/com/util/forms/PostDropdownBtn.tsx:687
msgid "Detach quote post?"
-msgstr ""
+msgstr "Desanexar postagem de citação?"
#: src/components/WhoCanReply.tsx:175
msgid "Dialog: adjust who can interact with this post"
-msgstr ""
+msgstr "Diálogo: ajuste quem pode interagir com esta postagem"
#: src/view/com/composer/Composer.tsx:327
msgid "Did you want to say anything?"
@@ -1927,7 +1927,7 @@ msgstr "Menos escuro"
#: src/components/dms/MessagesNUX.tsx:88
msgid "Direct messages are here!"
-msgstr ""
+msgstr "As mensagens diretas estão aqui!"
#: src/view/screens/AccessibilitySettings.tsx:111
msgid "Disable autoplay for GIFs"
@@ -1947,7 +1947,7 @@ msgstr "Desabilitar feedback tátil"
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx:242
msgid "Disable subtitles"
-msgstr ""
+msgstr "Desativar legendas"
#: src/view/screens/Settings/index.tsx:697
#~ msgid "Disable vibrations"
@@ -1977,7 +1977,7 @@ msgstr "Desencorajar aplicativos a mostrar minha conta para usuários desautenti
#: src/tours/HomeTour.tsx:70
msgid "Discover learns which posts you like as you browse."
-msgstr ""
+msgstr "Descubra quais postagens você gosta enquanto navega."
#: src/view/com/posts/FollowingEmptyState.tsx:70
#: src/view/com/posts/FollowingEndOfFeed.tsx:71
@@ -1986,7 +1986,7 @@ msgstr "Descubra novos feeds"
#: src/view/screens/Search/Explore.tsx:389
msgid "Discover new feeds"
-msgstr ""
+msgstr "Descubra novos feeds"
#: src/view/screens/Feeds.tsx:756
msgid "Discover New Feeds"
@@ -1994,19 +1994,19 @@ msgstr "Descubra Novos Feeds"
#: src/view/com/profile/ProfileHeaderSuggestedFollows.tsx:108
msgid "Dismiss"
-msgstr ""
+msgstr "Ocultar"
#: src/view/com/composer/Composer.tsx:612
msgid "Dismiss error"
-msgstr ""
+msgstr "Ocultar erro"
#: src/components/ProgressGuide/List.tsx:40
msgid "Dismiss getting started guide"
-msgstr ""
+msgstr "Ignorar guia de primeiros passos"
#: src/view/screens/AccessibilitySettings.tsx:99
msgid "Display larger alt text badges"
-msgstr ""
+msgstr "Exibir emblemas de texto alternativo maiores"
#: src/view/com/modals/EditProfile.tsx:193
msgid "Display name"
@@ -2022,7 +2022,7 @@ msgstr "Painel DNS"
#: src/components/dialogs/MutedWords.tsx:302
msgid "Do not apply this mute word to users you follow"
-msgstr ""
+msgstr "Não aplique esta palavra ocultada aos usuários que você segue"
#: src/lib/moderation/useGlobalLabelStrings.ts:39
msgid "Does not include nudity."
@@ -2089,7 +2089,7 @@ msgstr "Solte para adicionar imagens"
#: src/components/dialogs/MutedWords.tsx:153
msgid "Duration:"
-msgstr ""
+msgstr "Duração:"
#: src/view/com/modals/ChangeHandle.tsx:252
msgid "e.g. alice"
@@ -2161,7 +2161,7 @@ msgstr "Editar imagem"
#: src/view/com/util/forms/PostDropdownBtn.tsx:590
#: src/view/com/util/forms/PostDropdownBtn.tsx:603
msgid "Edit interaction settings"
-msgstr ""
+msgstr "Editar configurações de interação"
#: src/view/screens/ProfileList.tsx:515
msgid "Edit list details"
@@ -2189,7 +2189,7 @@ msgstr "Editar Pessoas"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:66
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:204
msgid "Edit post interaction settings"
-msgstr ""
+msgstr "Editar configurações de interação de postagem"
#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:184
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:179
@@ -2216,7 +2216,7 @@ msgstr "Editar lista de usuários"
#: src/components/WhoCanReply.tsx:87
msgid "Edit who can reply"
-msgstr ""
+msgstr "Editar quem pode responder"
#: src/view/com/modals/EditProfile.tsx:194
msgid "Edit your display name"
@@ -2237,7 +2237,7 @@ msgstr "Educação"
#: src/components/dialogs/ThreadgateEditor.tsx:98
#~ msgid "Either choose \"Everybody\" or \"Nobody\""
-#~ msgstr ""
+#~ msgstr "Escolha entre \"Todos\" ou \"Ninguém\""
#: src/screens/Signup/StepInfo/index.tsx:143
#: src/view/com/modals/ChangeEmail.tsx:136
@@ -2312,11 +2312,11 @@ msgstr "Habilitar mídia para"
#: src/view/screens/NotificationsSettings.tsx:65
#: src/view/screens/NotificationsSettings.tsx:68
msgid "Enable priority notifications"
-msgstr ""
+msgstr "Habilitar notificações prioritárias"
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx:242
msgid "Enable subtitles"
-msgstr ""
+msgstr "Habilitar legendas"
#: src/view/screens/PreferencesFollowingFeed.tsx:145
#~ msgid "Enable this setting to only see replies between people you follow."
@@ -2338,11 +2338,11 @@ msgstr "Fim do feed"
#: src/components/Lists.tsx:52
#~ msgid "End of list"
-#~ msgstr ""
+#~ msgstr "Fim da lista"
#: src/tours/Tooltip.tsx:159
msgid "End of onboarding tour window. Do not move forward. Instead, go backward for more options, or press to skip."
-msgstr ""
+msgstr "Fim da integração da sua janela. Não avance. Em vez disso, volte para mais opções ou pressione para pular."
#: src/view/com/modals/AddAppPasswords.tsx:161
msgid "Enter a name for this App Password"
@@ -2413,18 +2413,18 @@ msgstr "Todos"
#: src/components/WhoCanReply.tsx:67
msgid "Everybody can reply"
-msgstr ""
+msgstr "Todos podem responder"
#: src/components/WhoCanReply.tsx:213
msgid "Everybody can reply to this post."
-msgstr ""
+msgstr "Todos podem responder esta postagem."
#: src/components/dms/MessagesNUX.tsx:131
#: src/components/dms/MessagesNUX.tsx:134
#: src/screens/Messages/Settings.tsx:75
#: src/screens/Messages/Settings.tsx:78
msgid "Everyone"
-msgstr ""
+msgstr "Todos"
#: src/lib/moderation/useReportOptions.ts:68
msgid "Excessive mentions or replies"
@@ -2436,11 +2436,11 @@ msgstr "Mensagens excessivas ou indesejadas"
#: src/components/dialogs/MutedWords.tsx:311
msgid "Exclude users you follow"
-msgstr ""
+msgstr "Excluir usuário que você segue"
#: src/components/dialogs/MutedWords.tsx:514
msgid "Excludes users you follow"
-msgstr ""
+msgstr "Excluir usuário que você segue"
#: src/view/com/modals/DeleteAccount.tsx:293
msgid "Exits account deletion process"
@@ -2468,7 +2468,7 @@ msgstr "Expandir texto alternativo"
#: src/view/com/notifications/FeedItem.tsx:270
msgid "Expand list of users"
-msgstr ""
+msgstr "Expandir lista de usuário"
#: src/view/com/composer/ComposerReplyTo.tsx:82
#: src/view/com/composer/ComposerReplyTo.tsx:85
@@ -2477,15 +2477,15 @@ msgstr "Mostrar ou esconder o post a que você está respondendo"
#: src/view/screens/NotificationsSettings.tsx:83
msgid "Experimental: When this preference is enabled, you'll only receive reply and quote notifications from users you follow. We'll continue to add more controls here over time."
-msgstr ""
+msgstr "Experimental: Quando essa preferência estiver habilitada, você receberá apenas notificações de resposta e citação de usuários que você segue. Continuaremos adicionando mais controles aqui ao longo do tempo"
#: src/components/dialogs/MutedWords.tsx:500
msgid "Expired"
-msgstr ""
+msgstr "Expirado "
#: src/components/dialogs/MutedWords.tsx:502
msgid "Expires {0}"
-msgstr ""
+msgstr "Expirada {0}"
#: src/lib/moderation/useGlobalLabelStrings.ts:47
msgid "Explicit or potentially disturbing media."
@@ -2532,7 +2532,7 @@ msgstr "Não foi possível criar senha de aplicativo."
#: src/screens/StarterPack/Wizard/index.tsx:229
#: src/screens/StarterPack/Wizard/index.tsx:237
msgid "Failed to create starter pack"
-msgstr ""
+msgstr "Falha ao criar o pacote inicial"
#: src/view/com/modals/CreateOrEditList.tsx:194
msgid "Failed to create the list. Check your internet connection and try again."
@@ -2548,12 +2548,12 @@ msgstr "Não foi possível excluir o post, por favor tente novamente."
#: src/screens/StarterPack/StarterPackScreen.tsx:686
msgid "Failed to delete starter pack"
-msgstr ""
+msgstr "Falha ao excluir o pacote inicial"
#: src/view/screens/Search/Explore.tsx:427
#: src/view/screens/Search/Explore.tsx:455
msgid "Failed to load feeds preferences"
-msgstr ""
+msgstr "Falha ao carregar preferências de feeds"
#: src/components/dialogs/GifSelect.ios.tsx:196
#: src/components/dialogs/GifSelect.tsx:212
@@ -2562,7 +2562,7 @@ msgstr "Não foi possível carregar os GIFs"
#: src/screens/Messages/Conversation/MessageListError.tsx:23
msgid "Failed to load past messages"
-msgstr ""
+msgstr "Não foi possível carregar mensagens antigas."
#: src/screens/Messages/Conversation/MessageListError.tsx:28
#~ msgid "Failed to load past messages."
@@ -2576,11 +2576,11 @@ msgstr ""
#: src/view/screens/Search/Explore.tsx:420
#: src/view/screens/Search/Explore.tsx:448
msgid "Failed to load suggested feeds"
-msgstr ""
+msgstr "Falha ao carregar feeds sugeridos"
#: src/view/screens/Search/Explore.tsx:378
msgid "Failed to load suggested follows"
-msgstr ""
+msgstr "Falha ao carregar sugestões a seguir"
#: src/view/com/lightbox/Lightbox.tsx:90
msgid "Failed to save image: {0}"
@@ -2588,11 +2588,11 @@ msgstr "Não foi possível salvar a imagem: {0}"
#: src/state/queries/notifications/settings.ts:39
msgid "Failed to save notification preferences, please try again"
-msgstr ""
+msgstr "Falha ao salvar as preferências de notificação, tente novamente"
#: src/components/dms/MessageItem.tsx:224
msgid "Failed to send"
-msgstr ""
+msgstr "Falha ao enviar"
#: src/screens/Messages/Conversation/MessageListError.tsx:29
#~ msgid "Failed to send message(s)."
@@ -2601,20 +2601,20 @@ msgstr ""
#: src/components/moderation/LabelsOnMeDialog.tsx:234
#: src/screens/Messages/Conversation/ChatDisabled.tsx:87
msgid "Failed to submit appeal, please try again."
-msgstr ""
+msgstr "Falha ao enviar o recurso, tente novamente."
#: src/view/com/util/forms/PostDropdownBtn.tsx:223
msgid "Failed to toggle thread mute, please try again"
-msgstr ""
+msgstr "Falha ao alternar o silenciamento do tópico, tente novamente"
#: src/components/FeedCard.tsx:273
msgid "Failed to update feeds"
-msgstr ""
+msgstr "Falha ao atualizar os feeds""
#: src/components/dms/MessagesNUX.tsx:60
#: src/screens/Messages/Settings.tsx:35
msgid "Failed to update settings"
-msgstr ""
+msgstr "Falha ao atualizar as configurações"
#: src/Navigation.tsx:226
msgid "Feed"
@@ -2631,7 +2631,7 @@ msgstr "Feed por {0}"
#: src/components/StarterPack/Wizard/WizardListCard.tsx:55
msgid "Feed toggle"
-msgstr ""
+msgstr "Alternar Feed"
#: src/view/shell/desktop/RightNav.tsx:70
#: src/view/shell/Drawer.tsx:346
@@ -2664,7 +2664,7 @@ msgstr "Os feeds são algoritmos personalizados que os usuários com um pouco de
#: src/components/FeedCard.tsx:270
msgid "Feeds updated!"
-msgstr ""
+msgstr "Feeds atualizados!"
#: src/view/com/modals/ChangeHandle.tsx:475
msgid "File Contents"
@@ -2690,7 +2690,7 @@ msgstr "Encontre contas para seguir"
#: src/tours/HomeTour.tsx:88
msgid "Find more feeds and accounts to follow in the Explore page."
-msgstr ""
+msgstr "Encontre mais feeds e contas para seguir na página Explorar."
#: src/view/screens/Search/Search.tsx:439
msgid "Find posts and users on Bluesky"
@@ -2722,7 +2722,7 @@ msgstr "Finalizar"
#: src/tours/Tooltip.tsx:149
msgid "Finish tour and begin using the application"
-msgstr ""
+msgstr "Conclua o tour e comece a usar o aplicativo"
#: src/screens/Onboarding/index.tsx:35
msgid "Fitness"
@@ -2762,11 +2762,11 @@ msgstr "Seguir {0}"
#: src/view/com/posts/AviFollowButton.tsx:69
msgid "Follow {name}"
-msgstr ""
+msgstr "Seguir {name}"
#: src/components/ProgressGuide/List.tsx:54
msgid "Follow 7 accounts"
-msgstr ""
+msgstr "Siga 7 contas"
#: src/view/com/profile/ProfileMenu.tsx:246
#: src/view/com/profile/ProfileMenu.tsx:257
@@ -2788,7 +2788,7 @@ msgstr "Seguir De Volta"
#: src/view/screens/Search/Explore.tsx:334
msgid "Follow more accounts to get connected to your interests and build your network."
-msgstr ""
+msgstr "Siga mais contas para se conectar aos seus interesses e construir sua rede."
#: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:182
#~ msgid "Follow selected accounts and continue to the next step"
@@ -2800,7 +2800,7 @@ msgstr ""
#: src/components/KnownFollowers.tsx:169
#~ msgid "Followed by"
-#~ msgstr ""
+#~ msgstr "Seguido por"
#: src/view/com/profile/ProfileCard.tsx:190
#~ msgid "Followed by {0}"
@@ -2808,19 +2808,19 @@ msgstr ""
#: src/components/KnownFollowers.tsx:231
msgid "Followed by <0>{0}0>"
-msgstr ""
+msgstr "Seguido por <0>{0}0>"
#: src/components/KnownFollowers.tsx:217
msgid "Followed by <0>{0}0> and {1, plural, one {# other} other {# others}}"
-msgstr ""
+msgstr "Seguido por <0>{0}0> e {1, plural, one {# other} other {# others}}"
#: src/components/KnownFollowers.tsx:204
msgid "Followed by <0>{0}0> and <1>{1}1>"
-msgstr ""
+msgstr "Seguido por <0>{0}0> e <1>{1}1>"
#: src/components/KnownFollowers.tsx:186
msgid "Followed by <0>{0}0>, <1>{1}1>, and {2, plural, one {# other} other {# others}}"
-msgstr ""
+msgstr "Seguido por <0>{0}0>, <1>{1}1>, e {2, plural, one {# other} other {# others}}"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:403
msgid "Followed users"
@@ -2836,7 +2836,7 @@ msgstr "seguiu você"
#: src/view/com/notifications/FeedItem.tsx:209
msgid "followed you back"
-msgstr ""
+msgstr "seguiu você de volta"
#: src/view/com/profile/ProfileFollowers.tsx:104
#: src/view/screens/ProfileFollowers.tsx:25
@@ -2845,12 +2845,12 @@ msgstr "Seguidores"
#: src/Navigation.tsx:187
msgid "Followers of @{0} that you know"
-msgstr ""
+msgstr "Seguidores de @{0} que você conhece"
#: src/screens/Profile/KnownFollowers.tsx:108
#: src/screens/Profile/KnownFollowers.tsx:118
msgid "Followers you know"
-msgstr ""
+msgstr "Seguidores que você conhece"
#. User is following this account, click to unfollow
#: src/components/ProfileCard.tsx:345
@@ -2872,7 +2872,7 @@ msgstr "Seguindo {0}"
#: src/view/com/posts/AviFollowButton.tsx:51
msgid "Following {name}"
-msgstr ""
+msgstr "Seguindo {name}"
#: src/view/screens/Settings/index.tsx:539
msgid "Following feed preferences"
@@ -2886,7 +2886,7 @@ msgstr "Configurações do feed principal"
#: src/tours/HomeTour.tsx:59
msgid "Following shows the latest posts from people you follow."
-msgstr ""
+msgstr "Seguir mostra as postagens mais recentes das pessoas que você segue."
#: src/screens/Profile/Header/Handle.tsx:31
msgid "Follows you"
@@ -2911,7 +2911,7 @@ msgstr "Por motivos de segurança, você não poderá ver esta senha novamente.
#: src/components/dialogs/MutedWords.tsx:178
msgid "Forever"
-msgstr ""
+msgstr "Para sempre"
#: src/screens/Login/index.tsx:129
#: src/screens/Login/index.tsx:144
@@ -2949,11 +2949,11 @@ msgstr "Gere um kit inicial"
#: src/view/shell/Drawer.tsx:350
msgid "Get help"
-msgstr ""
+msgstr "Obter ajuda"
#: src/components/dms/MessagesNUX.tsx:168
msgid "Get started"
-msgstr ""
+msgstr "Começar"
#: src/view/com/modals/VerifyEmail.tsx:197
#: src/view/com/modals/VerifyEmail.tsx:199
@@ -2962,7 +2962,7 @@ msgstr "Vamos começar"
#: src/components/ProgressGuide/List.tsx:33
msgid "Getting started"
-msgstr ""
+msgstr "Começando"
#: src/view/com/util/images/ImageHorzList.tsx:35
msgid "GIF"
@@ -3000,7 +3000,7 @@ msgstr "Voltar"
#: src/screens/StarterPack/StarterPackLandingScreen.tsx:189
#~ msgid "Go back to previous screen"
-#~ msgstr ""
+#~ msgstr "Voltar para a tela anterior"
#: src/components/dms/ReportDialog.tsx:154
#: src/components/ReportDialog/SelectReportOptionView.tsx:80
@@ -3013,7 +3013,7 @@ msgstr "Voltar para o passo anterior"
#: src/screens/StarterPack/Wizard/index.tsx:299
msgid "Go back to the previous step"
-msgstr ""
+msgstr "Voltar para a etapa anterior"
#: src/view/screens/NotFound.tsx:55
msgid "Go home"
@@ -3030,7 +3030,7 @@ msgstr "Voltar para a tela inicial"
#: src/screens/Messages/List/ChatListItem.tsx:211
msgid "Go to conversation with {0}"
-msgstr ""
+msgstr "Ir para a conversa com {0}"
#: src/screens/Login/ForgotPasswordForm.tsx:172
#: src/view/com/modals/ChangePassword.tsx:168
@@ -3043,7 +3043,7 @@ msgstr "Ir para este perfil"
#: src/tours/Tooltip.tsx:138
msgid "Go to the next step of the tour"
-msgstr ""
+msgstr "Vá para a próxima etapa do tour"
#: src/components/dms/ConvoMenu.tsx:164
msgid "Go to user's profile"
@@ -3055,7 +3055,7 @@ msgstr "Conteúdo Gráfico"
#: src/state/shell/progress-guide.tsx:161
msgid "Half way there!"
-msgstr ""
+msgstr "Metade do caminho!"
#: src/view/com/modals/ChangeHandle.tsx:260
msgid "Handle"
@@ -3108,7 +3108,7 @@ msgstr "Aqui está a sua senha de aplicativo."
#: src/components/ListCard.tsx:128
msgid "Hidden list"
-msgstr ""
+msgstr "Lista oculta"
#: src/components/moderation/ContentHider.tsx:116
#: src/components/moderation/LabelPreference.tsx:134
@@ -3134,17 +3134,17 @@ msgstr "Esconder"
#: src/view/com/util/forms/PostDropdownBtn.tsx:501
#: src/view/com/util/forms/PostDropdownBtn.tsx:507
msgid "Hide post for me"
-msgstr ""
+msgstr "Ocultar postagem para mim"
#: src/view/com/util/forms/PostDropdownBtn.tsx:518
#: src/view/com/util/forms/PostDropdownBtn.tsx:528
msgid "Hide reply for everyone"
-msgstr ""
+msgstr "Ocultar resposta para todos"
#: src/view/com/util/forms/PostDropdownBtn.tsx:500
#: src/view/com/util/forms/PostDropdownBtn.tsx:506
msgid "Hide reply for me"
-msgstr ""
+msgstr "Ocultar resposta para mim"
#: src/components/moderation/ContentHider.tsx:68
#: src/components/moderation/PostHider.tsx:79
@@ -3158,7 +3158,7 @@ msgstr "Ocultar este post?"
#: src/view/com/util/forms/PostDropdownBtn.tsx:635
#: src/view/com/util/forms/PostDropdownBtn.tsx:697
msgid "Hide this reply?"
-msgstr ""
+msgstr "Ocultar esta resposta?"
#: src/view/com/notifications/FeedItem.tsx:468
msgid "Hide user list"
@@ -3261,7 +3261,7 @@ msgstr "Se você quiser alterar sua senha, enviaremos um código que para verifi
#: src/screens/Settings/components/DeactivateAccountDialog.tsx:92
msgid "If you're trying to change your handle or email, do so before you deactivate."
-msgstr ""
+msgstr "Se você estiver tentando alterar seu endereço ou e-mail, faça isso antes de desativar."
#: src/lib/moderation/useReportOptions.ts:38
msgid "Illegal and Urgent"
@@ -3277,7 +3277,7 @@ msgstr "Texto alternativo da imagem"
#: src/components/StarterPack/ShareDialog.tsx:76
msgid "Image saved to your camera roll!"
-msgstr ""
+msgstr "Imagem salva no rolo da câmera!"
#: src/lib/moderation/useReportOptions.ts:49
msgid "Impersonation or false claims about identity or affiliation"
@@ -3285,7 +3285,7 @@ msgstr "Falsificação de identidade ou alegações falsas sobre identidade ou f
#: src/lib/moderation/useReportOptions.ts:86
msgid "Inappropriate messages or explicit links"
-msgstr ""
+msgstr "Mensagens inapropriadas ou links explícitos"
#: src/screens/Login/SetNewPasswordForm.tsx:127
msgid "Input code sent to your email for password reset"
@@ -3333,11 +3333,11 @@ msgstr "Insira o usuário"
#: src/view/com/composer/threadgate/ThreadgateBtn.tsx:55
msgid "Interaction limited"
-msgstr ""
+msgstr "Interação limitada"
#: src/components/dms/MessagesNUX.tsx:82
msgid "Introducing Direct Messages"
-msgstr ""
+msgstr "Apresentando Mensagens Diretas"
#: src/screens/Login/LoginForm.tsx:140
#: src/view/screens/Settings/DisableEmail2FADialog.tsx:70
@@ -3472,7 +3472,7 @@ msgstr "Saiba Mais"
#: src/view/com/auth/SplashScreen.web.tsx:152
msgid "Learn more about Bluesky"
-msgstr ""
+msgstr "Saiba mais sobre Bluesky"
#: src/components/moderation/ContentHider.tsx:66
#: src/components/moderation/ContentHider.tsx:131
@@ -3500,7 +3500,7 @@ msgstr "Sair"
#: src/components/dms/MessagesListBlockedFooter.tsx:66
#: src/components/dms/MessagesListBlockedFooter.tsx:73
msgid "Leave chat"
-msgstr ""
+msgstr "Sair do chat"
#: src/components/dms/ConvoMenu.tsx:138
#: src/components/dms/ConvoMenu.tsx:141
@@ -3551,12 +3551,12 @@ msgstr "Claro"
#: src/components/ProgressGuide/List.tsx:48
msgid "Like 10 posts"
-msgstr ""
+msgstr "Curtir 10 postagens"
#: src/state/shell/progress-guide.tsx:157
#: src/state/shell/progress-guide.tsx:162
msgid "Like 10 posts to train the Discover feed"
-msgstr ""
+msgstr "Curtir 10 posts para treinar o feed de Descobertas"
#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:267
#: src/view/screens/ProfileFeed.tsx:575
@@ -3629,11 +3629,11 @@ msgstr "Lista excluída"
#: src/screens/List/ListHiddenScreen.tsx:126
msgid "List has been hidden"
-msgstr ""
+msgstr "Lista foi ocultada"
#: src/view/screens/ProfileList.tsx:159
msgid "List Hidden"
-msgstr ""
+msgstr "Lista Oculta"
#: src/view/screens/ProfileList.tsx:386
msgid "List muted"
@@ -3662,19 +3662,19 @@ msgstr "Listas"
#: src/components/dms/BlockedByListDialog.tsx:39
msgid "Lists blocking this user:"
-msgstr ""
+msgstr "Listas bloqueando este usuário:"
#: src/view/screens/Search/Explore.tsx:131
msgid "Load more"
-msgstr ""
+msgstr "Carregar mais"
#: src/view/screens/Search/Explore.tsx:219
msgid "Load more suggested feeds"
-msgstr ""
+msgstr "Carregar mais sugestões de feeds"
#: src/view/screens/Search/Explore.tsx:217
msgid "Load more suggested follows"
-msgstr ""
+msgstr "Carregar mais sugestões de seguidores"
#: src/view/screens/Notifications.tsx:219
msgid "Load new notifications"
@@ -3698,7 +3698,7 @@ msgstr "Registros"
#: src/screens/Deactivated.tsx:214
#: src/screens/Deactivated.tsx:220
msgid "Log in or sign up"
-msgstr ""
+msgstr "Entre ou registre-se"
#: src/screens/SignupQueued.tsx:155
#: src/screens/SignupQueued.tsx:158
@@ -3737,7 +3737,7 @@ msgstr "Parece que você desafixou todos os seus feeds, mas não esquenta, dá u
#: src/screens/Feeds/NoFollowingFeed.tsx:37
msgid "Looks like you're missing a following feed. <0>Click here to add one.0>"
-msgstr ""
+msgstr "Parece que está faltando um feed a seguir. <0>Clique aqui para adicionar um.0>"
#: src/components/StarterPack/ProfileStarterPacks.tsx:254
msgid "Make one for me"
@@ -3776,7 +3776,7 @@ msgstr "Menu"
#: src/components/dms/MessageProfileButton.tsx:67
msgid "Message {0}"
-msgstr ""
+msgstr "Mensagem {0}"
#: src/components/dms/MessageMenu.tsx:72
#: src/screens/Messages/List/ChatListItem.tsx:155
@@ -3817,7 +3817,7 @@ msgstr "Conta Enganosa"
#: src/screens/Settings/AppearanceSettings.tsx:78
msgid "Mode"
-msgstr ""
+msgstr "Modo"
#: src/Navigation.tsx:135
#: src/screens/Moderation/index.tsx:105
@@ -3862,7 +3862,7 @@ msgstr "Listas de Moderação"
#: src/components/moderation/LabelPreference.tsx:247
msgid "moderation settings"
-msgstr ""
+msgstr "configurações de Moderação"
#: src/view/screens/Settings/index.tsx:521
msgid "Moderation settings"
@@ -3899,11 +3899,11 @@ msgstr "Respostas mais curtidas primeiro"
#: src/screens/Onboarding/state.ts:90
msgid "Movies"
-msgstr ""
+msgstr "Filmes"
#: src/screens/Onboarding/state.ts:91
msgid "Music"
-msgstr ""
+msgstr "Música"
#: src/components/TagMenu/index.tsx:263
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx:254
@@ -3931,7 +3931,7 @@ msgstr "Silenciar posts com {displayTag}"
#: src/components/dms/ConvoMenu.tsx:172
#: src/components/dms/ConvoMenu.tsx:178
msgid "Mute conversation"
-msgstr ""
+msgstr "Silenciar conversa"
#: src/components/dialogs/MutedWords.tsx:148
#~ msgid "Mute in tags only"
@@ -3943,7 +3943,7 @@ msgstr ""
#: src/components/dialogs/MutedWords.tsx:253
msgid "Mute in:"
-msgstr ""
+msgstr "Silenciar em:"
#: src/view/screens/ProfileList.tsx:734
msgid "Mute list"
@@ -3960,15 +3960,15 @@ msgstr "Silenciar estas contas?"
#: src/components/dialogs/MutedWords.tsx:185
msgid "Mute this word for 24 hours"
-msgstr ""
+msgstr "Silencie esta palavra por 24 horas"
#: src/components/dialogs/MutedWords.tsx:224
msgid "Mute this word for 30 days"
-msgstr ""
+msgstr "Silencie esta palavra por 30 dias"
#: src/components/dialogs/MutedWords.tsx:209
msgid "Mute this word for 7 days"
-msgstr ""
+msgstr "Silencie esta palavra por 7 dias"
#: src/components/dialogs/MutedWords.tsx:258
msgid "Mute this word in post text and tags"
@@ -3980,7 +3980,7 @@ msgstr "Silenciar esta palavra apenas nas tags de um post"
#: src/components/dialogs/MutedWords.tsx:170
msgid "Mute this word until you unmute it"
-msgstr ""
+msgstr "Oculte esta palavra até que você a reative"
#: src/view/com/util/forms/PostDropdownBtn.tsx:465
#: src/view/com/util/forms/PostDropdownBtn.tsx:471
@@ -4065,11 +4065,11 @@ msgstr "Natureza"
#: src/components/StarterPack/StarterPackCard.tsx:121
msgid "Navigate to {0}"
-msgstr ""
+msgstr "Navegar para {0}"
#: src/view/com/util/post-embeds/ExternalLinkEmbed.tsx:73
msgid "Navigate to starter pack"
-msgstr ""
+msgstr "Navegue até o pacote inicial"
#: src/screens/Login/ForgotPasswordForm.tsx:173
#: src/screens/Login/LoginForm.tsx:332
@@ -4115,7 +4115,7 @@ msgstr "Novo chat"
#: src/components/dms/NewMessagesPill.tsx:92
msgid "New messages"
-msgstr ""
+msgstr "Novas mensagens"
#: src/view/com/modals/CreateOrEditList.tsx:241
msgid "New Moderation List"
@@ -4151,7 +4151,7 @@ msgstr "Novo Post"
#: src/components/NewskieDialog.tsx:83
msgid "New user info dialog"
-msgstr ""
+msgstr "Novo diálogo de informações do usuário"
#: src/view/com/modals/CreateOrEditList.tsx:236
msgid "New User List"
@@ -4234,7 +4234,7 @@ msgstr "Nenhuma mensagem ainda"
#: src/screens/Messages/List/index.tsx:274
msgid "No more conversations to show"
-msgstr ""
+msgstr "Não há mais conversas para mostrar"
#: src/view/com/notifications/Feed.tsx:121
msgid "No notifications yet!"
@@ -4245,15 +4245,15 @@ msgstr "Nenhuma notificação!"
#: src/screens/Messages/Settings.tsx:93
#: src/screens/Messages/Settings.tsx:96
msgid "No one"
-msgstr ""
+msgstr "Ninguém"
#: src/components/WhoCanReply.tsx:237
msgid "No one but the author can quote this post."
-msgstr ""
+msgstr "Ninguém além do autor pode citar esta postagem."
#: src/screens/Profile/Sections/Feed.tsx:59
msgid "No posts yet."
-msgstr ""
+msgstr "Nenhuma postagem ainda."
#: src/view/com/composer/text-input/mobile/Autocomplete.tsx:101
#: src/view/com/composer/text-input/web/Autocomplete.tsx:195
@@ -4262,7 +4262,7 @@ msgstr "Nenhum resultado"
#: src/components/dms/dialogs/SearchablePeopleList.tsx:202
msgid "No results"
-msgstr ""
+msgstr "Nenhum resultados"
#: src/components/Lists.tsx:215
msgid "No results found"
@@ -4299,7 +4299,7 @@ msgstr "Ninguém"
#: src/view/com/composer/threadgate/ThreadgateBtn.tsx:46
#~ msgid "Nobody can reply"
-#~ msgstr ""
+#~ msgstr "Ninguém pode responder"
#: src/components/LikedByList.tsx:79
#: src/components/LikesDialog.tsx:99
@@ -4340,28 +4340,28 @@ msgstr "Nota: o Bluesky é uma rede aberta e pública. Esta configuração limit
#: src/screens/Messages/List/index.tsx:215
msgid "Nothing here"
-msgstr ""
+msgstr "Não há nada aqui"
#: src/view/screens/NotificationsSettings.tsx:54
msgid "Notification filters"
-msgstr ""
+msgstr "Filtros de notificação"
#: src/Navigation.tsx:348
#: src/view/screens/Notifications.tsx:119
msgid "Notification settings"
-msgstr ""
+msgstr "Configurações de notificação"
#: src/view/screens/NotificationsSettings.tsx:39
msgid "Notification Settings"
-msgstr ""
+msgstr "Configurações de notificação"
#: src/screens/Messages/Settings.tsx:124
msgid "Notification sounds"
-msgstr ""
+msgstr "Sons de notificação"
#: src/screens/Messages/Settings.tsx:121
msgid "Notification Sounds"
-msgstr ""
+msgstr "Sons de Notificação"
#: src/Navigation.tsx:559
#: src/view/screens/Notifications.tsx:145
@@ -4376,7 +4376,7 @@ msgstr "Notificações"
#: src/lib/hooks/useTimeAgo.ts:51
msgid "now"
-msgstr ""
+msgstr "agora"
#: src/components/dms/MessageItem.tsx:169
msgid "Now"
@@ -4434,7 +4434,7 @@ msgstr "Resetar tutoriais"
#: src/tours/Tooltip.tsx:118
msgid "Onboarding tour step {0}: {1}"
-msgstr ""
+msgstr "Etapa do tour de integração {0}: {1}"
#: src/view/com/composer/Composer.tsx:589
msgid "One or more images is missing alt text."
@@ -4446,7 +4446,7 @@ msgstr "Apenas imagens .jpg ou .png são permitidas"
#: src/components/WhoCanReply.tsx:245
#~ msgid "Only {0} can reply"
-#~ msgstr ""
+#~ msgstr "Apenas {0} pode responder"
#: src/components/WhoCanReply.tsx:217
msgid "Only {0} can reply."
@@ -4475,7 +4475,7 @@ msgstr "Abrir"
#: src/view/com/posts/AviFollowButton.tsx:87
msgid "Open {name} profile shortcut menu"
-msgstr ""
+msgstr "Abra o menu de atalho perfil de {name}"
#: src/screens/Onboarding/StepProfile/index.tsx:277
msgid "Open avatar creator"
@@ -4484,7 +4484,7 @@ msgstr "Abrir criador de avatar"
#: src/screens/Messages/List/ChatListItem.tsx:219
#: src/screens/Messages/List/ChatListItem.tsx:220
msgid "Open conversation options"
-msgstr ""
+msgstr "Abrir opções de conversa"
#: src/view/com/composer/Composer.tsx:754
#: src/view/com/composer/Composer.tsx:755
@@ -4501,7 +4501,7 @@ msgstr "Abrir links no navegador interno"
#: src/components/dms/ActionsWrapper.tsx:87
msgid "Open message options"
-msgstr ""
+msgstr "Abrir opções de mensagem"
#: src/screens/Moderation/index.tsx:230
msgid "Open muted words and tags settings"
@@ -4534,7 +4534,7 @@ msgstr "Abre {numItems} opções"
#: src/view/com/composer/threadgate/ThreadgateBtn.tsx:68
msgid "Opens a dialog to choose who can reply to this thread"
-msgstr ""
+msgstr "Abre uma caixa de diálogo para escolher quem pode responder a este tópico"
#: src/view/screens/Settings/index.tsx:455
msgid "Opens accessibility settings"
@@ -4550,7 +4550,7 @@ msgstr "Abre detalhes adicionais para um registro de depuração"
#: src/view/screens/Settings/index.tsx:476
msgid "Opens appearance settings"
-msgstr ""
+msgstr "Abre as configurações de aparência"
#: src/view/com/composer/photos/OpenCameraBtn.tsx:74
msgid "Opens camera on device"
@@ -4558,7 +4558,7 @@ msgstr "Abre a câmera do dispositivo"
#: src/view/screens/Settings/index.tsx:605
msgid "Opens chat settings"
-msgstr ""
+msgstr "Abre as configurações de chat"
#: src/view/com/post-thread/PostThreadComposePrompt.tsx:30
msgid "Opens composer"
@@ -4596,7 +4596,7 @@ msgstr "Abre a lista de códigos de convite"
#: src/view/screens/Settings/index.tsx:774
msgid "Opens modal for account deactivation confirmation"
-msgstr ""
+msgstr "Abre janela para confirmação da desativação da conta"
#: src/view/screens/Settings/index.tsx:796
msgid "Opens modal for account deletion confirmation. Requires email code"
@@ -4671,11 +4671,11 @@ msgstr "Abre as preferências de threads"
#: src/view/com/notifications/FeedItem.tsx:555
#: src/view/com/util/UserAvatar.tsx:420
msgid "Opens this profile"
-msgstr ""
+msgstr "Abre este perfil"
#: src/view/com/composer/videos/SelectVideoBtn.tsx:54
msgid "Opens video picker"
-msgstr ""
+msgstr "Abre seletor de vídeos"
#: src/view/com/util/forms/DropdownButton.tsx:293
msgid "Option {0} of {numItems}"
@@ -4688,7 +4688,7 @@ msgstr "Se quiser adicionar mais informações, digite abaixo:"
#: src/components/dialogs/MutedWords.tsx:299
msgid "Options:"
-msgstr ""
+msgstr "Opções:"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:388
msgid "Or combine these options:"
@@ -4696,11 +4696,11 @@ msgstr "Ou combine estas opções:"
#: src/screens/Deactivated.tsx:211
msgid "Or, continue with another account."
-msgstr ""
+msgstr "Ou continue com outra conta."
#: src/screens/Deactivated.tsx:194
msgid "Or, log into one of your other accounts."
-msgstr ""
+msgstr "Ou faça login em uma de suas outras contas."
#: src/lib/moderation/useReportOptions.ts:27
msgid "Other"
@@ -4712,7 +4712,7 @@ msgstr "Outra conta"
#: src/view/screens/Settings/index.tsx:379
msgid "Other accounts"
-msgstr ""
+msgstr "Outras contas"
#: src/view/com/composer/select-language/SelectLangBtn.tsx:92
msgid "Other..."
@@ -4720,7 +4720,7 @@ msgstr "Outro..."
#: src/screens/Messages/Conversation/ChatDisabled.tsx:28
msgid "Our moderators have reviewed reports and decided to disable your access to chats on Bluesky."
-msgstr ""
+msgstr "Nossos moderadores analisaram os relatórios e decidiram desabilitar seu acesso aos chats no Bluesky."
#: src/components/Lists.tsx:216
#: src/view/screens/NotFound.tsx:45
@@ -4757,7 +4757,7 @@ msgstr "Pausar"
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx:203
msgid "Pause video"
-msgstr ""
+msgstr "Pausar vídeo"
#: src/screens/StarterPack/StarterPackScreen.tsx:171
#: src/view/screens/Search/Search.tsx:369
@@ -4782,7 +4782,7 @@ msgstr "A permissão de galeria foi recusada. Por favor, habilite-a nas configur
#: src/components/StarterPack/Wizard/WizardListCard.tsx:55
msgid "Person toggle"
-msgstr ""
+msgstr "Alternar pessoa"
#: src/screens/Onboarding/index.tsx:28
#: src/screens/Onboarding/state.ts:94
@@ -4791,7 +4791,7 @@ msgstr "Pets"
#: src/screens/Onboarding/state.ts:95
msgid "Photography"
-msgstr ""
+msgstr "Fotografia"
#: src/view/com/modals/SelfLabel.tsx:122
msgid "Pictures meant for adults."
@@ -4812,7 +4812,7 @@ msgstr "Feeds Fixados"
#: src/view/screens/ProfileList.tsx:345
msgid "Pinned to your feeds"
-msgstr ""
+msgstr "Fixado em seus feeds"
#: src/view/com/util/post-embeds/GifEmbed.tsx:44
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx:226
@@ -4826,7 +4826,7 @@ msgstr "Reproduzir {0}"
#: src/screens/Messages/Settings.tsx:97
#: src/screens/Messages/Settings.tsx:104
#~ msgid "Play notification sounds"
-#~ msgstr ""
+#~ msgstr "Reproduzir sons de notificação"
#: src/view/com/util/post-embeds/GifEmbed.tsx:43
msgid "Play or pause the GIF"
@@ -4835,7 +4835,7 @@ msgstr "Tocar ou pausar o GIF"
#: src/view/com/util/post-embeds/VideoEmbed.tsx:52
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx:204
msgid "Play video"
-msgstr ""
+msgstr "Reproduzir vídeo"
#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:57
#: src/view/com/util/post-embeds/ExternalPlayerEmbed.tsx:58
@@ -4882,7 +4882,7 @@ msgstr "Por favor, digite o seu e-mail."
#: src/screens/Signup/StepInfo/index.tsx:63
msgid "Please enter your invite code."
-msgstr ""
+msgstr "Por favor, insira seu código de convite."
#: src/view/com/modals/DeleteAccount.tsx:253
msgid "Please enter your password as well:"
@@ -4894,7 +4894,7 @@ msgstr "Por favor, explique por que você acha que este rótulo foi aplicado inc
#: src/screens/Messages/Conversation/ChatDisabled.tsx:110
msgid "Please explain why you think your chats were incorrectly disabled"
-msgstr ""
+msgstr "Por favor, explique por que você acha que seus chats foram desativados incorretamente"
#: src/lib/hooks/useAccountSwitcher.ts:48
#: src/lib/hooks/useAccountSwitcher.ts:58
@@ -4960,7 +4960,7 @@ msgstr "Post Escondido por Você"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:283
msgid "Post interaction settings"
-msgstr ""
+msgstr "Configurações de interação de postagem"
#: src/view/com/composer/select-language/SelectLangBtn.tsx:88
msgid "Post language"
@@ -4990,7 +4990,7 @@ msgstr "Posts"
#: src/components/dialogs/MutedWords.tsx:115
msgid "Posts can be muted based on their text, their tags, or both. We recommend avoiding common words that appear in many posts, since it can result in no posts being shown."
-msgstr ""
+msgstr "As postagens podem ser silenciadas com base em seu texto, suas tags ou ambos. Recomendamos evitar palavras comuns que aparecem em muitas postagens, pois isso pode resultar em nenhuma postagem sendo exibida."
#: src/view/com/posts/FeedErrorMessage.tsx:68
msgid "Posts hidden"
@@ -5002,11 +5002,11 @@ msgstr "Link Potencialmente Enganoso"
#: src/state/queries/notifications/settings.ts:44
msgid "Preference saved"
-msgstr ""
+msgstr "Preferência salva"
#: src/screens/Messages/Conversation/MessageListError.tsx:19
msgid "Press to attempt reconnection"
-msgstr ""
+msgstr "Pressione para tentar reconectar"
#: src/components/forms/HostingProvider.tsx:46
msgid "Press to change hosting provider"
@@ -5026,7 +5026,7 @@ msgstr "Tentar novamente"
#: src/components/KnownFollowers.tsx:124
msgid "Press to view followers of this account that you also follow"
-msgstr ""
+msgstr "Pressione para ver os seguidores desta conta que você também segue"
#: src/view/com/lightbox/Lightbox.web.tsx:150
msgid "Previous image"
@@ -5042,7 +5042,7 @@ msgstr "Priorizar seus Seguidores"
#: src/view/screens/NotificationsSettings.tsx:57
msgid "Priority notifications"
-msgstr ""
+msgstr "Notificações prioritárias"
#: src/view/screens/Settings/index.tsx:620
#: src/view/shell/desktop/RightNav.tsx:81
@@ -5059,7 +5059,7 @@ msgstr "Política de Privacidade"
#: src/components/dms/MessagesNUX.tsx:91
msgid "Privately chat with other users."
-msgstr ""
+msgstr "Converse em particular com outros usuários."
#: src/screens/Login/ForgotPasswordForm.tsx:156
msgid "Processing..."
@@ -5108,19 +5108,19 @@ msgstr "Publicar resposta"
#: src/components/StarterPack/QrCodeDialog.tsx:128
msgid "QR code copied to your clipboard!"
-msgstr ""
+msgstr "QR code copiado para sua área de transferência!"
#: src/components/StarterPack/QrCodeDialog.tsx:106
msgid "QR code has been downloaded!"
-msgstr ""
+msgstr "QR code foi baixado!"
#: src/components/StarterPack/QrCodeDialog.tsx:107
msgid "QR code saved to your camera roll!"
-msgstr ""
+msgstr "QR code salvo no rolo da sua câmera!"
#: src/tours/Tooltip.tsx:111
msgid "Quick tip"
-msgstr ""
+msgstr "Dica rápida"
#: src/view/com/util/post-ctrls/RepostButton.tsx:122
#: src/view/com/util/post-ctrls/RepostButton.tsx:149
@@ -5141,11 +5141,11 @@ msgstr "Citar post"
#: src/view/com/util/forms/PostDropdownBtn.tsx:302
msgid "Quote post was re-attached"
-msgstr ""
+msgstr "A postagem de citação foi anexada novamente"
#: src/view/com/util/forms/PostDropdownBtn.tsx:301
msgid "Quote post was successfully detached"
-msgstr ""
+msgstr "A postagem de citação foi desanexada com sucesso"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:313
#: src/view/com/util/post-ctrls/RepostButton.tsx:121
@@ -5153,24 +5153,24 @@ msgstr ""
#: src/view/com/util/post-ctrls/RepostButton.web.tsx:84
#: src/view/com/util/post-ctrls/RepostButton.web.tsx:91
msgid "Quote posts disabled"
-msgstr ""
+msgstr "Postagens de citações desabilitadas"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:311
msgid "Quote posts enabled"
-msgstr ""
+msgstr "Postagens de citações habilitadas"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:295
msgid "Quote settings"
-msgstr ""
+msgstr "Configurações de citações"
#: src/screens/Post/PostQuotes.tsx:29
#: src/view/com/post-thread/PostQuotes.tsx:122
msgid "Quotes"
-msgstr ""
+msgstr "Citações"
#: src/view/com/post-thread/PostThreadItem.tsx:230
msgid "Quotes of this post"
-msgstr ""
+msgstr "Citações desta postagem"
#: src/view/screens/PreferencesThreads.tsx:80
msgid "Random (aka \"Poster's Roulette\")"
@@ -5183,27 +5183,27 @@ msgstr "Índices"
#: src/view/com/util/forms/PostDropdownBtn.tsx:543
#: src/view/com/util/forms/PostDropdownBtn.tsx:553
msgid "Re-attach quote"
-msgstr ""
+msgstr "Reanexar citação"
#: src/screens/Deactivated.tsx:144
msgid "Reactivate your account"
-msgstr ""
+msgstr "Reative sua conta"
#: src/view/com/auth/SplashScreen.web.tsx:157
msgid "Read the Bluesky blog"
-msgstr ""
+msgstr "Leia o blog Bluesky"
#: src/screens/Signup/StepInfo/Policies.tsx:59
msgid "Read the Bluesky Privacy Policy"
-msgstr ""
+msgstr "Leia a Política de Privacidade do Bluesky"
#: src/screens/Signup/StepInfo/Policies.tsx:49
msgid "Read the Bluesky Terms of Service"
-msgstr ""
+msgstr "Leia os Termos de Serviço do Bluesky"
#: src/components/dms/ReportDialog.tsx:174
msgid "Reason:"
-msgstr ""
+msgstr "Motivo:"
#: src/components/dms/MessageReportDialog.tsx:149
#~ msgid "Reason: {0}"
@@ -5223,15 +5223,15 @@ msgstr "Buscas Recentes"
#: src/screens/Messages/Conversation/MessageListError.tsx:20
msgid "Reconnect"
-msgstr ""
+msgstr "Reconectar"
#: src/view/screens/Notifications.tsx:146
msgid "Refresh notifications"
-msgstr ""
+msgstr "Atualizar notificações"
#: src/screens/Messages/List/index.tsx:200
msgid "Reload conversations"
-msgstr ""
+msgstr "Recarregar conversas"
#: src/components/dialogs/MutedWords.tsx:438
#: src/components/FeedCard.tsx:313
@@ -5248,7 +5248,7 @@ msgstr "Remover"
#: src/components/StarterPack/Wizard/WizardListCard.tsx:58
msgid "Remove {displayName} from starter pack"
-msgstr ""
+msgstr "Remover {displayName} do pacote inicial"
#: src/view/com/util/AccountDropdownBtn.tsx:26
msgid "Remove account"
@@ -5264,7 +5264,7 @@ msgstr "Remover banner"
#: src/screens/Messages/Conversation/MessageInputEmbed.tsx:218
msgid "Remove embed"
-msgstr ""
+msgstr "Remover incorporação"
#: src/view/com/posts/FeedErrorMessage.tsx:169
#: src/view/com/posts/FeedShutdownMsg.tsx:116
@@ -5291,11 +5291,11 @@ msgstr "Remover dos meus feeds?"
#: src/view/com/util/AccountDropdownBtn.tsx:53
msgid "Remove from quick access?"
-msgstr ""
+msgstr "Remover do acesso rápido?"
#: src/screens/List/ListHiddenScreen.tsx:156
msgid "Remove from saved feeds"
-msgstr ""
+msgstr "Remover dos feeds salvos"
#: src/view/com/composer/photos/Gallery.tsx:174
msgid "Remove image"
@@ -5311,11 +5311,11 @@ msgstr "Remover palavra silenciada da lista"
#: src/view/screens/Search/Search.tsx:969
msgid "Remove profile"
-msgstr ""
+msgstr "Remover perfil"
#: src/view/screens/Search/Search.tsx:971
msgid "Remove profile from search history"
-msgstr ""
+msgstr "Remover perfil do histórico de pesquisa"
#: src/view/com/util/post-embeds/QuoteEmbed.tsx:255
msgid "Remove quote"
@@ -5332,11 +5332,11 @@ msgstr "Remover este feed dos feeds salvos"
#: src/view/com/util/post-embeds/QuoteEmbed.tsx:100
msgid "Removed by author"
-msgstr ""
+msgstr "Removido pelo autor"
#: src/view/com/util/post-embeds/QuoteEmbed.tsx:98
msgid "Removed by you"
-msgstr ""
+msgstr Removido por você"
#: src/view/com/modals/ListAddRemoveUsers.tsx:200
#: src/view/com/modals/UserAddRemoveLists.tsx:164
@@ -5350,7 +5350,7 @@ msgstr "Removido dos meus feeds"
#: src/screens/List/ListHiddenScreen.tsx:94
#: src/screens/List/ListHiddenScreen.tsx:160
msgid "Removed from saved feeds"
-msgstr ""
+msgstr "Removido dos feeds salvos"
#: src/view/com/posts/FeedShutdownMsg.tsx:44
#: src/view/screens/ProfileFeed.tsx:192
@@ -5368,7 +5368,7 @@ msgstr "Remove o post citado"
#: src/view/com/composer/ExternalEmbedRemoveBtn.tsx:29
msgid "Removes the image preview"
-msgstr ""
+msgstr "Remove a pré-visualização da imagem"
#: src/view/com/posts/FeedShutdownMsg.tsx:129
#: src/view/com/posts/FeedShutdownMsg.tsx:133
@@ -5381,15 +5381,15 @@ msgstr "Respostas"
#: src/components/WhoCanReply.tsx:69
msgid "Replies disabled"
-msgstr ""
+msgstr "Respostas desabilitadas"
#: src/view/com/threadgate/WhoCanReply.tsx:123
#~ msgid "Replies on this thread are disabled"
-#~ msgstr ""
+#~ msgstr "As respostas neste tópico estão desabilitadas"
#: src/components/WhoCanReply.tsx:215
msgid "Replies to this post are disabled."
-msgstr ""
+msgstr "Respostas para esta postagem estão desativadas."
#: src/components/WhoCanReply.tsx:243
#~ msgid "Replies to this thread are disabled"
@@ -5407,20 +5407,20 @@ msgstr "Responder"
#: src/components/moderation/ModerationDetailsDialog.tsx:115
#: src/lib/moderation/useModerationCauseDescription.ts:123
msgid "Reply Hidden by Thread Author"
-msgstr ""
+msgstr "Resposta Oculta pelo Autor da Thread"
#: src/components/moderation/ModerationDetailsDialog.tsx:114
#: src/lib/moderation/useModerationCauseDescription.ts:122
msgid "Reply Hidden by You"
-msgstr ""
+msgstr "Responder Oculto por Você"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:355
msgid "Reply settings"
-msgstr ""
+msgstr "Configurações de resposta"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:340
msgid "Reply settings are chosen by the author of the thread"
-msgstr ""
+msgstr "Configurações de resposta são escolhidas pelo autor da thread"
#: src/view/com/post/Post.tsx:177
#: src/view/com/posts/FeedItem.tsx:285
@@ -5437,26 +5437,26 @@ msgstr "Responder <0><1/>0>"
#: src/view/com/posts/FeedItem.tsx:513
msgctxt "description"
msgid "Reply to a blocked post"
-msgstr ""
+msgstr "Responder a uma postagem bloqueada"
#: src/view/com/posts/FeedItem.tsx:515
msgctxt "description"
msgid "Reply to a post"
-msgstr ""
+msgstr "Responder a uma postagem"
#: src/view/com/post/Post.tsx:194
#: src/view/com/posts/FeedItem.tsx:519
msgctxt "description"
msgid "Reply to you"
-msgstr ""
+msgstr "Responder para você"
#: src/view/com/util/forms/PostDropdownBtn.tsx:332
msgid "Reply visibility updated"
-msgstr ""
+msgstr "Visibilidade da resposta atualizada"
#: src/view/com/util/forms/PostDropdownBtn.tsx:331
msgid "Reply was successfully hidden"
-msgstr ""
+msgstr "Resposta foi ocultada com sucesso"
#: src/components/dms/MessageMenu.tsx:132
#: src/components/dms/MessagesListBlockedFooter.tsx:77
@@ -5576,7 +5576,7 @@ msgstr "Repostado por <0><1/>0>"
#: src/view/com/posts/FeedItem.tsx:292
#: src/view/com/posts/FeedItem.tsx:311
msgid "Reposted by you"
-msgstr ""
+msgstr "repostou para você"
#: src/view/com/notifications/FeedItem.tsx:184
msgid "reposted your post"
@@ -5726,7 +5726,7 @@ msgstr "Salvar usuário"
#: src/components/StarterPack/ShareDialog.tsx:151
#: src/components/StarterPack/ShareDialog.tsx:158
msgid "Save image"
-msgstr ""
+msgstr "Salvar imagem"
#: src/view/com/modals/crop-image/CropImage.web.tsx:169
msgid "Save image crop"
@@ -5734,7 +5734,7 @@ msgstr "Salvar corte de imagem"
#: src/components/StarterPack/QrCodeDialog.tsx:181
msgid "Save QR code"
-msgstr ""
+msgstr "Salvar QR code"
#: src/view/screens/ProfileFeed.tsx:334
#: src/view/screens/ProfileFeed.tsx:340
@@ -5775,7 +5775,7 @@ msgstr "Salva o corte da imagem"
#: src/view/com/notifications/FeedItem.tsx:416
#: src/view/com/notifications/FeedItem.tsx:441
msgid "Say hello!"
-msgstr ""
+msgstr "Diga olá!"
#: src/screens/Onboarding/index.tsx:33
#: src/screens/Onboarding/state.ts:97
@@ -5866,7 +5866,7 @@ msgstr "Ver posts com <0>{displayTag}0> deste usuário"
#: src/view/com/auth/SplashScreen.web.tsx:162
msgid "See jobs at Bluesky"
-msgstr ""
+msgstr "Veja empregos na Bluesky"
#: src/view/com/notifications/FeedItem.tsx:411
#: src/view/com/util/UserAvatar.tsx:402
@@ -5915,7 +5915,7 @@ msgstr "Selecionar GIF \"{0}\""
#: src/components/dialogs/MutedWords.tsx:142
msgid "Select how long to mute this word for."
-msgstr ""
+msgstr "Selecione por quanto tempo essa palavra deve ser silenciada."
#: src/view/screens/LanguageSettings.tsx:303
msgid "Select languages"
@@ -5951,11 +5951,11 @@ msgstr "Selecione o serviço que hospeda seus dados."
#: src/view/com/composer/videos/SelectVideoBtn.tsx:53
msgid "Select video"
-msgstr ""
+msgstr "Selecione o vídeo"
#: src/components/dialogs/MutedWords.tsx:242
msgid "Select what content this mute word should apply to."
-msgstr ""
+msgstr "Selecione a qual conteúdo esta palavra silenciada deve ser aplicada."
#: src/screens/Onboarding/StepModeration/index.tsx:63
#~ msgid "Select what you want to see (or not see), and we’ll handle the rest."
@@ -5991,7 +5991,7 @@ msgstr "Selecione seu idioma preferido para as traduções no seu feed."
#: src/components/dms/ChatEmptyPill.tsx:38
msgid "Send a neat website!"
-msgstr ""
+msgstr "Envie um site bacana!"
#: src/view/com/modals/VerifyEmail.tsx:210
#: src/view/com/modals/VerifyEmail.tsx:212
@@ -6018,7 +6018,7 @@ msgstr "Enviar mensagem"
#: src/components/dms/dialogs/ShareViaChatDialog.tsx:64
msgid "Send post to..."
-msgstr ""
+msgstr "Enviar postagem para..."
#: src/components/dms/ReportDialog.tsx:234
#: src/components/dms/ReportDialog.tsx:237
@@ -6039,7 +6039,7 @@ msgstr "Enviar e-mail de verificação"
#: src/view/com/util/forms/PostDropdownBtn.tsx:399
#: src/view/com/util/forms/PostDropdownBtn.tsx:402
msgid "Send via direct message"
-msgstr ""
+msgstr "Enviar por mensagem direta"
#: src/view/com/modals/DeleteAccount.tsx:151
msgid "Sends email with confirmation code for account deletion"
@@ -6156,11 +6156,11 @@ msgstr "Compartilhar"
#: src/components/dms/ChatEmptyPill.tsx:37
msgid "Share a cool story!"
-msgstr ""
+msgstr "Compartilhe uma história legal!"
#: src/components/dms/ChatEmptyPill.tsx:36
msgid "Share a fun fact!"
-msgstr ""
+msgstr "Compartilhe um fato divertido!"
#: src/view/com/profile/ProfileMenu.tsx:377
#: src/view/com/util/forms/PostDropdownBtn.tsx:659
@@ -6186,7 +6186,7 @@ msgstr "Compartilhar Link"
#: src/components/StarterPack/ShareDialog.tsx:88
msgid "Share link dialog"
-msgstr ""
+msgstr "Compartilhar Link de diálogo"
#: src/components/StarterPack/ShareDialog.tsx:135
#: src/components/StarterPack/ShareDialog.tsx:146
@@ -6207,7 +6207,7 @@ msgstr "Compartilhe este kit inicial e ajude as pessoas a se juntarem à sua com
#: src/Navigation.tsx:251
msgid "Shared Preferences Tester"
-msgstr ""
+msgstr "Compartilhe Preferências de Testador"
#: src/view/com/modals/LinkWarning.tsx:92
msgid "Shares the linked website"
@@ -6249,7 +6249,7 @@ msgstr "Mostrar usuários parecidos com {0}"
#: src/view/com/post-thread/PostThreadShowHiddenReplies.tsx:23
msgid "Show hidden replies"
-msgstr ""
+msgstr "Mostrar respostas ocultas"
#: src/view/com/util/forms/PostDropdownBtn.tsx:449
#: src/view/com/util/forms/PostDropdownBtn.tsx:451
@@ -6258,7 +6258,7 @@ msgstr "Mostrar menos disso"
#: src/screens/List/ListHiddenScreen.tsx:172
msgid "Show list anyway"
-msgstr ""
+msgstr "Mostrar lista de qualquer maneira"
#: src/view/com/post-thread/PostThreadItem.tsx:584
#: src/view/com/post/Post.tsx:234
@@ -6273,7 +6273,7 @@ msgstr "Mostrar mais disso"
#: src/view/com/post-thread/PostThreadShowHiddenReplies.tsx:23
msgid "Show muted replies"
-msgstr ""
+msgstr "Mostrar respostas silenciadas"
#: src/view/screens/PreferencesFollowingFeed.tsx:154
msgid "Show Posts from My Feeds"
@@ -6318,7 +6318,7 @@ msgstr "Mostrar as respostas de pessoas que você segue antes de todas as outras
#: src/view/com/util/forms/PostDropdownBtn.tsx:517
#: src/view/com/util/forms/PostDropdownBtn.tsx:527
msgid "Show reply for everyone"
-msgstr ""
+msgstr "Mostrar resposta para todos"
#: src/view/screens/PreferencesFollowingFeed.tsx:84
msgid "Show Reposts"
@@ -6393,7 +6393,7 @@ msgstr "Sair"
#: src/view/screens/Settings/index.tsx:420
#: src/view/screens/Settings/index.tsx:430
msgid "Sign out of all accounts"
-msgstr ""
+msgstr "Sair de todas as contas"
#: src/view/shell/bottom-bar/BottomBar.tsx:305
#: src/view/shell/bottom-bar/BottomBar.tsx:306
@@ -6436,7 +6436,7 @@ msgstr "Inscreva-se sem um kit inicial"
#: src/view/com/profile/ProfileHeaderSuggestedFollows.tsx:102
msgid "Similar accounts"
-msgstr ""
+msgstr "Contas semelhantes"
#: src/screens/Onboarding/StepInterests/index.tsx:265
#: src/screens/StarterPack/Wizard/index.tsx:191
@@ -6454,11 +6454,11 @@ msgstr "Desenvolvimento de software"
#: src/components/FeedInterstitials.tsx:397
msgid "Some other feeds you might like"
-msgstr ""
+msgstr "Alguns outros feeds que você pode gostar"
#: src/components/WhoCanReply.tsx:70
msgid "Some people can reply"
-msgstr ""
+msgstr "Algumas pessoas podem responder"
#: src/screens/StarterPack/Wizard/index.tsx:203
#~ msgid "Some subtitle"
@@ -6471,7 +6471,7 @@ msgstr "Algo deu errado"
#: src/screens/Deactivated.tsx:94
#: src/screens/Settings/components/DeactivateAccountDialog.tsx:59
msgid "Something went wrong, please try again"
-msgstr ""
+msgstr "Algo deu errado, tente novamente"
#: src/components/ReportDialog/index.tsx:59
#: src/screens/Moderation/index.tsx:115
@@ -6482,7 +6482,7 @@ msgstr "Algo deu errado. Por favor, tente novamente."
#: src/components/Lists.tsx:200
#: src/view/screens/NotificationsSettings.tsx:46
msgid "Something went wrong!"
-msgstr ""
+msgstr "Algo deu errado!"
#: src/App.native.tsx:102
#: src/App.web.tsx:83
@@ -6507,7 +6507,7 @@ msgstr "Classificar respostas de um post por:"
#: src/components/moderation/LabelsOnMeDialog.tsx:171
msgid "Source: <0>{sourceName}0>"
-msgstr ""
+msgstr "Fonte: <0>{sourceName}0>"
#: src/lib/moderation/useReportOptions.ts:67
#: src/lib/moderation/useReportOptions.ts:80
@@ -6533,15 +6533,15 @@ msgstr "Começar um novo chat"
#: src/components/dms/dialogs/SearchablePeopleList.tsx:371
msgid "Start chat with {displayName}"
-msgstr ""
+msgstr "Comece a conversar com {displayName}"
#: src/components/dms/MessagesNUX.tsx:161
msgid "Start chatting"
-msgstr ""
+msgstr "Comece a conversar"
#: src/tours/Tooltip.tsx:99
msgid "Start of onboarding tour window. Do not move backward. Instead, go forward for more options, or press to skip."
-msgstr ""
+msgstr "Início da integração da sua janela. Não retroceda. Em vez disso, avance para mais opções ou pressione para pular."
#: src/lib/generate-starterpack.ts:68
#: src/Navigation.tsx:358
@@ -6625,7 +6625,7 @@ msgstr "Inscreva-se nesta lista"
#: src/view/screens/Search/Explore.tsx:332
msgid "Suggested accounts"
-msgstr ""
+msgstr "Contas sugeridas"
#: src/view/screens/Search/Search.tsx:425
#~ msgid "Suggested Follows"
@@ -6652,7 +6652,7 @@ msgstr "Alterar Conta"
#: src/tours/HomeTour.tsx:48
msgid "Switch between feeds to control your experience."
-msgstr ""
+msgstr "Alterne entre feeds para controlar sua experiência."
#: src/view/screens/Settings/index.tsx:126
msgid "Switch to {0}"
@@ -6681,7 +6681,7 @@ msgstr "Menu da tag: {displayTag}"
#: src/components/dialogs/MutedWords.tsx:282
msgid "Tags only"
-msgstr ""
+msgstr "Apenas Tags"
#: src/view/com/modals/crop-image/CropImage.web.tsx:135
msgid "Tall"
@@ -6689,15 +6689,15 @@ msgstr "Alto"
#: src/components/ProgressGuide/Toast.tsx:150
msgid "Tap to dismiss"
-msgstr ""
+msgstr "Toque para dispensar"
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerNative.tsx:181
msgid "Tap to enter full screen"
-msgstr ""
+msgstr "Toque para entrar em tela cheia"
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerNative.tsx:202
msgid "Tap to toggle sound"
-msgstr ""
+msgstr "Toque para alternar o som"
#: src/view/com/util/images/AutoSizedImage.tsx:70
msgid "Tap to view fully"
@@ -6705,11 +6705,11 @@ msgstr "Toque para ver tudo"
#: src/state/shell/progress-guide.tsx:166
msgid "Task complete - 10 likes!"
-msgstr ""
+msgstr "Tarefa concluída - 10 curtidas!"
#: src/components/ProgressGuide/List.tsx:49
msgid "Teach our algorithm what you like"
-msgstr ""
+msgstr "Ensine ao nosso algoritmo o que você curte"
#: src/screens/Onboarding/index.tsx:36
#: src/screens/Onboarding/state.ts:99
@@ -6718,7 +6718,7 @@ msgstr "Tecnologia"
#: src/components/dms/ChatEmptyPill.tsx:35
msgid "Tell a joke!"
-msgstr ""
+msgstr "Conte uma piada!"
#: src/screens/StarterPack/Wizard/StepDetails.tsx:63
msgid "Tell us a little more"
@@ -6749,7 +6749,7 @@ msgstr "Termos utilizados violam as diretrizes da comunidade"
#: src/components/dialogs/MutedWords.tsx:266
msgid "Text & tags"
-msgstr ""
+msgstr "Texto e tags"
#: src/components/moderation/LabelsOnMeDialog.tsx:266
#: src/screens/Messages/Conversation/ChatDisabled.tsx:108
@@ -6780,7 +6780,7 @@ msgstr "Esse kit inicial não pôde ser encontrado."
#: src/view/com/post-thread/PostQuotes.tsx:129
msgid "That's all, folks!"
-msgstr ""
+msgstr "É isso, pessoal!"
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:310
#: src/view/com/profile/ProfileMenu.tsx:353
@@ -6794,11 +6794,11 @@ msgstr "A conta poderá interagir com você após o desbloqueio."
#: src/components/moderation/ModerationDetailsDialog.tsx:118
#: src/lib/moderation/useModerationCauseDescription.ts:126
msgid "The author of this thread has hidden this reply."
-msgstr ""
+msgstr "O autor deste tópico ocultou esta resposta."
#: src/screens/Moderation/index.tsx:368
msgid "The Bluesky web application"
-msgstr ""
+msgstr "A aplicação web Bluesky"
#: src/view/screens/CommunityGuidelines.tsx:36
msgid "The Community Guidelines have been moved to <0/>"
@@ -6810,12 +6810,12 @@ msgstr "A Política de Direitos Autorais foi movida para <0/>"
#: src/view/com/posts/FeedShutdownMsg.tsx:102
msgid "The Discover feed"
-msgstr ""
+msgstr "O feed Discover"
#: src/state/shell/progress-guide.tsx:167
#: src/state/shell/progress-guide.tsx:172
msgid "The Discover feed now knows what you like"
-msgstr ""
+msgstr "O feed Discover agora sabe o que você curte"
#: src/screens/StarterPack/StarterPackLandingScreen.tsx:327
msgid "The experience is better in the app. Download Bluesky now and we'll pick back up where you left off."
@@ -6848,7 +6848,7 @@ msgstr "A Política de Privacidade foi movida para <0/>"
#: src/state/queries/video/video.ts:129
msgid "The selected video is larger than 100MB."
-msgstr ""
+msgstr "Vídeo selecionado é maior que 100 MB."
#: src/screens/StarterPack/StarterPackScreen.tsx:713
msgid "The starter pack that you are trying to view is invalid. You may delete this starter pack instead."
@@ -6868,7 +6868,7 @@ msgstr "Os Termos de Serviço foram movidos para"
#: src/screens/Settings/components/DeactivateAccountDialog.tsx:86
msgid "There is no time limit for account deactivation, come back any time."
-msgstr ""
+msgstr "Não há limite de tempo para desativação da conta, volte quando quiser."
#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:117
#: src/view/screens/ProfileFeed.tsx:545
@@ -6987,7 +6987,7 @@ msgstr "Esta conta solicitou que os usuários fizessem login para visualizar seu
#: src/components/dms/BlockedByListDialog.tsx:34
msgid "This account is blocked by one or more of your moderation lists. To unblock, please visit the lists directly and remove this user."
-msgstr ""
+msgstr "This account is blocked by one or more of your moderation lists. To unblock, please visit the lists directly and remove this user."
#: src/components/moderation/LabelsOnMeDialog.tsx:260
#~ msgid "This appeal will be sent to <0>{0}0>."
@@ -6995,15 +6995,15 @@ msgstr ""
#: src/components/moderation/LabelsOnMeDialog.tsx:250
msgid "This appeal will be sent to <0>{sourceName}0>."
-msgstr ""
+msgstr "Este apelo será enviado para <0>{sourceName}0>."
#: src/screens/Messages/Conversation/ChatDisabled.tsx:104
msgid "This appeal will be sent to Bluesky's moderation service."
-msgstr ""
+msgstr "Este apelo será enviado ao serviço de moderação da Bluesky."
#: src/screens/Messages/Conversation/MessageListError.tsx:18
msgid "This chat was disconnected"
-msgstr ""
+msgstr "Este chat foi desconectado"
#: src/screens/Messages/Conversation/MessageListError.tsx:26
#~ msgid "This chat was disconnected due to a network error."
@@ -7032,7 +7032,7 @@ msgstr "Este conteúdo não é visível sem uma conta do Bluesky."
#: src/screens/Messages/List/ChatListItem.tsx:213
msgid "This conversation is with a deleted or a deactivated account. Press for options."
-msgstr ""
+msgstr "Esta conversa é com uma conta excluída ou desativada. Pressione para opções."
#: src/view/screens/Settings/ExportCarDialog.tsx:93
msgid "This feature is in beta. You can read more about repository exports in <0>this blogpost0>."
@@ -7056,7 +7056,7 @@ msgstr "Este feed está vazio! Talvez você precise seguir mais usuários ou con
#: src/view/screens/ProfileFeed.tsx:474
#: src/view/screens/ProfileList.tsx:785
msgid "This feed is empty."
-msgstr ""
+msgstr "Este feed está vazio."
#: src/view/com/posts/FeedShutdownMsg.tsx:99
msgid "This feed is no longer online. We are showing <0>Discover0> instead."
@@ -7088,7 +7088,7 @@ msgstr "Este rótulo foi aplicado pelo autor."
#: src/components/moderation/LabelsOnMeDialog.tsx:169
msgid "This label was applied by you."
-msgstr ""
+msgstr "Esta etiqueta foi aplicada por você."
#: src/screens/Profile/Sections/Labels.tsx:188
msgid "This labeler hasn't declared what labels it publishes, and may not be active."
@@ -7100,7 +7100,7 @@ msgstr "Este link está levando você ao seguinte site:"
#: src/screens/List/ListHiddenScreen.tsx:136
msgid "This list - created by <0>{0}0> - contains possible violations of Bluesky's community guidelines in its name or description."
-msgstr ""
+msgstr "Esta lista - criada por <0>{0}0> - contém possíveis violações das diretrizes da comunidade Bluesky em seu nome ou descrição."
#: src/view/screens/ProfileList.tsx:963
msgid "This list is empty!"
@@ -7125,7 +7125,7 @@ msgstr "Este post só pode ser visto por usuários autenticados e não aparecer
#: src/view/com/util/forms/PostDropdownBtn.tsx:637
msgid "This post will be hidden from feeds and threads. This cannot be undone."
-msgstr ""
+msgstr "Este post será ocultado de feeds e threads. Isso não pode ser desfeito."
#: src/view/com/util/forms/PostDropdownBtn.tsx:443
#~ msgid "This post will be hidden from feeds."
@@ -7133,7 +7133,7 @@ msgstr ""
#: src/view/com/composer/useExternalLinkFetch.ts:67
msgid "This post's author has disabled quote posts."
-msgstr ""
+msgstr "O autor desta postagem desabilitou as postagens de citação."
#: src/view/com/profile/ProfileMenu.tsx:374
msgid "This profile is only visible to logged-in users. It won't be visible to people who aren't logged in."
@@ -7141,7 +7141,7 @@ msgstr "Este post só pode ser visto por usuários autenticados e não aparecer
#: src/view/com/util/forms/PostDropdownBtn.tsx:699
msgid "This reply will be sorted into a hidden section at the bottom of your thread and will mute notifications for subsequent replies - both for yourself and others."
-msgstr ""
+msgstr "Esta resposta será classificada em uma seção oculta na parte inferior do seu tópico e silenciará as notificações para respostas subsequentes, tanto para você quanto para outras pessoas."
#: src/screens/Signup/StepInfo/Policies.tsx:37
msgid "This service has not provided terms of service or a privacy policy."
@@ -7157,7 +7157,7 @@ msgstr "Este usuário não é seguido por ninguém ainda."
#: src/components/dms/MessagesListBlockedFooter.tsx:60
msgid "This user has blocked you"
-msgstr ""
+msgstr "Este usuário bloqueou você"
#: src/components/moderation/ModerationDetailsDialog.tsx:78
#: src/lib/moderation/useModerationCauseDescription.ts:73
@@ -7178,7 +7178,7 @@ msgstr "Este usuário está incluído na lista <0>{0}0>, que você silenciou."
#: src/components/NewskieDialog.tsx:65
msgid "This user is new here. Press for more info about when they joined."
-msgstr ""
+msgstr "Este usuário é novo aqui. Pressione para mais informações sobre quando ele entrou."
#: src/view/com/profile/ProfileFollows.tsx:87
msgid "This user isn't following anyone."
@@ -7190,7 +7190,7 @@ msgstr "Este usuário não segue ninguém ainda."
#: src/components/dialogs/MutedWords.tsx:435
msgid "This will delete \"{0}\" from your muted words. You can always add it back later."
-msgstr ""
+msgstr "Isso excluirá \"{0}\" das suas palavras silenciadas. Você sempre pode adicioná-lo novamente mais tarde."
#: src/components/dialogs/MutedWords.tsx:283
#~ msgid "This will delete {0} from your muted words. You can always add it back later."
@@ -7198,11 +7198,11 @@ msgstr ""
#: src/view/com/util/AccountDropdownBtn.tsx:55
msgid "This will remove @{0} from the quick access list."
-msgstr ""
+msgstr "Isso removerá @{0} da lista de acesso rápido."
#: src/view/com/util/forms/PostDropdownBtn.tsx:689
msgid "This will remove your post from this quote post for all users, and replace it with a placeholder."
-msgstr ""
+msgstr "Isso removerá sua postagem desta postagem de citação para todos os usuários e a substituirá por um espaço reservado."
#: src/view/screens/Settings/index.tsx:560
msgid "Thread preferences"
@@ -7215,7 +7215,7 @@ msgstr "Preferências das Threads"
#: src/components/WhoCanReply.tsx:109
#~ msgid "Thread settings updated"
-#~ msgstr ""
+#~ msgstr "Configurações de Thread atualizadas"
#: src/view/screens/PreferencesThreads.tsx:113
msgid "Threaded Mode"
@@ -7274,7 +7274,7 @@ msgstr "Tentar novamente"
#: src/screens/Onboarding/state.ts:100
msgid "TV"
-msgstr ""
+msgstr "TV"
#: src/view/screens/Settings/index.tsx:711
msgid "Two-factor authentication"
@@ -7328,7 +7328,7 @@ msgstr "Desbloquear"
#: src/components/dms/ConvoMenu.tsx:188
#: src/components/dms/ConvoMenu.tsx:192
msgid "Unblock account"
-msgstr ""
+msgstr "Desbloquear Conta"
#: src/view/com/profile/ProfileMenu.tsx:303
#: src/view/com/profile/ProfileMenu.tsx:309
@@ -7394,7 +7394,7 @@ msgstr "Dessilenciar posts com {displayTag}"
#: src/components/dms/ConvoMenu.tsx:176
msgid "Unmute conversation"
-msgstr ""
+msgstr "Desmutar conversa"
#: src/components/dms/ConvoMenu.tsx:140
#~ msgid "Unmute notifications"
@@ -7407,11 +7407,11 @@ msgstr "Dessilenciar thread"
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx:201
msgid "Unmute video"
-msgstr ""
+msgstr "Desmutar vídeo"
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerNative.tsx:201
msgid "Unmuted"
-msgstr ""
+msgstr "Desmutar"
#: src/view/screens/ProfileFeed.tsx:292
#: src/view/screens/ProfileList.tsx:673
@@ -7428,7 +7428,7 @@ msgstr "Desafixar lista de moderação"
#: src/view/screens/ProfileList.tsx:346
msgid "Unpinned from your feeds"
-msgstr ""
+msgstr "Desfixado dos seus feeds"
#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:228
msgid "Unsubscribe"
@@ -7437,7 +7437,7 @@ msgstr "Desinscrever-se"
#: src/screens/List/ListHiddenScreen.tsx:184
#: src/screens/List/ListHiddenScreen.tsx:194
msgid "Unsubscribe from list"
-msgstr ""
+msgstr "Cancelar assinatura da lista"
#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:196
msgid "Unsubscribe from this labeler"
@@ -7445,7 +7445,7 @@ msgstr "Desinscrever-se deste rotulador"
#: src/screens/List/ListHiddenScreen.tsx:86
msgid "Unsubscribed from list"
-msgstr ""
+msgstr "Cancelada inscrição na lista"
#: src/lib/moderation/useReportOptions.ts:85
#~ msgid "Unwanted sexual content"
@@ -7466,11 +7466,11 @@ msgstr "Alterar para {handle}"
#: src/view/com/util/forms/PostDropdownBtn.tsx:305
msgid "Updating quote attachment failed"
-msgstr ""
+msgstr "Falha na atualização do anexo de cotação"
#: src/view/com/util/forms/PostDropdownBtn.tsx:335
msgid "Updating reply visibility failed"
-msgstr ""
+msgstr "Falha na atualização da visibilidade da resposta"
#: src/screens/Login/SetNewPasswordForm.tsx:186
msgid "Updating..."
@@ -7556,7 +7556,7 @@ msgstr "Usuário Bloqueado por \"{0}\""
#: src/components/dms/BlockedByListDialog.tsx:27
msgid "User blocked by list"
-msgstr ""
+msgstr "Usuário Bloqueado Por Lista"
#: src/components/moderation/ModerationDetailsDialog.tsx:56
msgid "User Blocked by List"
@@ -7609,14 +7609,14 @@ msgstr "Usuários"
#: src/components/WhoCanReply.tsx:258
msgid "users followed by <0>@{0}0>"
-msgstr ""
+msgstr "usuários seguidos por <0>@{0}0>"
#: src/components/dms/MessagesNUX.tsx:140
#: src/components/dms/MessagesNUX.tsx:143
#: src/screens/Messages/Settings.tsx:84
#: src/screens/Messages/Settings.tsx:87
msgid "Users I follow"
-msgstr ""
+msgstr "Usuários que eu sigo"
#: src/components/dialogs/PostInteractionSettingsDialog.tsx:416
msgid "Users in \"{0}\""
@@ -7673,7 +7673,7 @@ msgstr "Versão {appVersion} {bundleInfo}"
#: src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerNative.tsx:180
msgid "Video"
-msgstr ""
+msgstr "Vídeo"
#: src/screens/Onboarding/index.tsx:39
#: src/screens/Onboarding/state.ts:88
@@ -7682,7 +7682,7 @@ msgstr "Games"
#: src/view/com/composer/videos/state.ts:27
#~ msgid "Videos cannot be larger than 100MB"
-#~ msgstr ""
+#~ msgstr "Vídeos não podem ter mais de 100 MB"
#: src/screens/Profile/Header/Shell.tsx:113
msgid "View {0}'s avatar"
@@ -7691,19 +7691,19 @@ msgstr "Ver o avatar de {0}"
#: src/components/ProfileCard.tsx:110
#: src/view/com/notifications/FeedItem.tsx:277
msgid "View {0}'s profile"
-msgstr ""
+msgstr "Ver perfil de {0}"
#: src/components/dms/MessagesListHeader.tsx:160
msgid "View {displayName}'s profile"
-msgstr ""
+msgstr "Ver perfil de {displayName}"
#: src/components/ProfileHoverCard/index.web.tsx:430
msgid "View blocked user's profile"
-msgstr ""
+msgstr "Ver perfil do usuário bloqueado"
#: src/view/screens/Settings/ExportCarDialog.tsx:97
msgid "View blogpost for more details"
-msgstr ""
+msgstr "Veja o blogpost para mais detalhes"
#: src/view/screens/Log.tsx:56
msgid "View debug entry"
@@ -7747,20 +7747,20 @@ msgstr "Ver usuários que curtiram este feed"
#: src/screens/Moderation/index.tsx:274
msgid "View your blocked accounts"
-msgstr ""
+msgstr "Veja suas contas bloqueadas"
#: src/view/com/home/HomeHeaderLayout.web.tsx:79
#: src/view/com/home/HomeHeaderLayoutMobile.tsx:86
msgid "View your feeds and explore more"
-msgstr ""
+msgstr "Veja seus feeds e explore mais"
#: src/screens/Moderation/index.tsx:244
msgid "View your moderation lists"
-msgstr ""
+msgstr "Veja suas listas de moderação"
#: src/screens/Moderation/index.tsx:259
msgid "View your muted accounts"
-msgstr ""
+msgstr "Veja suas contas silenciadas"
#: src/view/com/modals/LinkWarning.tsx:89
#: src/view/com/modals/LinkWarning.tsx:95
@@ -7831,7 +7831,7 @@ msgstr "Usaremos isto para customizar a sua experiência."
#: src/components/dms/dialogs/SearchablePeopleList.tsx:90
msgid "We're having network issues, try again"
-msgstr ""
+msgstr "Estamos com problemas de rede, tente novamente"
#: src/screens/Signup/index.tsx:100
msgid "We're so excited to have you join us!"
@@ -7851,7 +7851,7 @@ msgstr "Lamentamos, mas sua busca não pôde ser concluída. Por favor, tente no
#: src/view/com/composer/Composer.tsx:380
msgid "We're sorry! The post you are replying to has been deleted."
-msgstr ""
+msgstr "Sentimos muito! A postagem que você está respondendo foi excluída."
#: src/components/Lists.tsx:220
#: src/view/screens/NotFound.tsx:48
@@ -7864,11 +7864,11 @@ msgstr "Sentimos muito! Não conseguimos encontrar a página que você estava pr
#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:333
msgid "We're sorry! You can only subscribe to twenty labelers, and you've reached your limit of twenty."
-msgstr ""
+msgstr "Sentimos muito! Você só pode assinar vinte rotuladores, e você atingiu seu limite de vinte."
#: src/screens/Deactivated.tsx:128
msgid "Welcome back!"
-msgstr ""
+msgstr "Bem vindo de volta!"
#: src/view/com/auth/onboarding/WelcomeMobile.tsx:48
#~ msgid "Welcome to <0>Bluesky0>"
@@ -7876,7 +7876,7 @@ msgstr ""
#: src/components/NewskieDialog.tsx:103
msgid "Welcome, friend!"
-msgstr ""
+msgstr "Bem-vindo, amigo!"
#: src/screens/Onboarding/StepInterests/index.tsx:155
msgid "What are your interests?"
@@ -7902,12 +7902,12 @@ msgstr "Quais idiomas você gostaria de ver nos seus feeds?"
#: src/components/WhoCanReply.tsx:179
msgid "Who can interact with this post?"
-msgstr ""
+msgstr "Quem pode interagir com esta postagem?"
#: src/components/dms/MessagesNUX.tsx:110
#: src/components/dms/MessagesNUX.tsx:124
msgid "Who can message you?"
-msgstr ""
+msgstr "Quem pode enviar mensagens para você?"
#: src/components/WhoCanReply.tsx:87
msgid "Who can reply"
@@ -7915,11 +7915,11 @@ msgstr "Quem pode responder"
#: src/components/WhoCanReply.tsx:212
#~ msgid "Who can reply dialog"
-#~ msgstr ""
+#~ msgstr "Quem pode responder ao diálogo"
#: src/components/WhoCanReply.tsx:216
#~ msgid "Who can reply?"
-#~ msgstr ""
+#~ msgstr "Quem pode responder?"
#: src/screens/Home/NoFeedsPinned.tsx:79
#: src/screens/Messages/List/index.tsx:185
@@ -7948,7 +7948,7 @@ msgstr "Por que este post deve ser analisado?"
#: src/components/ReportDialog/SelectReportOptionView.tsx:60
msgid "Why should this starter pack be reviewed?"
-msgstr ""
+msgstr "Por que este pacote inicial deve ser analisado?"
#: src/components/ReportDialog/SelectReportOptionView.tsx:48
msgid "Why should this user be reviewed?"
@@ -7990,7 +7990,7 @@ msgstr "Sim"
#: src/screens/Settings/components/DeactivateAccountDialog.tsx:106
#: src/screens/Settings/components/DeactivateAccountDialog.tsx:108
msgid "Yes, deactivate"
-msgstr ""
+msgstr "Sim, desativar"
#: src/screens/StarterPack/StarterPackScreen.tsx:649
msgid "Yes, delete this starter pack"
@@ -7998,15 +7998,15 @@ msgstr "Sim, exclua este kit inicial"
#: src/view/com/util/forms/PostDropdownBtn.tsx:692
msgid "Yes, detach"
-msgstr ""
+msgstr "Sim, desvincule"
#: src/view/com/util/forms/PostDropdownBtn.tsx:702
msgid "Yes, hide"
-msgstr ""
+msgstr "Sim, ocultar"
#: src/screens/Deactivated.tsx:150
msgid "Yes, reactivate my account"
-msgstr ""
+msgstr "Sim, reative minha conta"
#: src/components/dms/MessageItem.tsx:182
msgid "Yesterday, {time}"
@@ -8015,11 +8015,11 @@ msgstr "Ontem, {time}"
#: src/components/StarterPack/StarterPackCard.tsx:76
#: src/screens/List/ListHiddenScreen.tsx:140
msgid "you"
-msgstr ""
+msgstr "você"
#: src/components/NewskieDialog.tsx:43
msgid "You"
-msgstr ""
+msgstr "Você"
#: src/screens/SignupQueued.tsx:136
msgid "You are in line."
@@ -8036,7 +8036,7 @@ msgstr "Você também pode descobrir novos feeds para seguir."
#: src/view/com/modals/DeleteAccount.tsx:202
msgid "You can also temporarily deactivate your account instead, and reactivate it at any time."
-msgstr ""
+msgstr "Você também pode desativar temporariamente sua conta e reativá-la a qualquer momento."
#: src/screens/Onboarding/StepFollowingFeed.tsx:143
#~ msgid "You can change these settings later."
@@ -8044,11 +8044,11 @@ msgstr ""
#: src/components/dms/MessagesNUX.tsx:119
msgid "You can change this at any time."
-msgstr ""
+msgstr "Você pode alterar isso a qualquer momento."
#: src/screens/Messages/Settings.tsx:111
msgid "You can continue ongoing conversations regardless of which setting you choose."
-msgstr ""
+msgstr "Você pode continuar conversas em andamento, independentemente da configuração que escolher."
#: src/screens/Login/index.tsx:158
#: src/screens/Login/PasswordUpdatedForm.tsx:33
@@ -8057,7 +8057,7 @@ msgstr "Agora você pode entrar com a sua nova senha."
#: src/screens/Deactivated.tsx:136
msgid "You can reactivate your account to continue logging in. Your profile and posts will be visible to other users."
-msgstr ""
+msgstr "Você pode reativar sua conta para continuar fazendo login. Seu perfil e suas postagens ficarão visíveis para outros usuários."
#: src/view/com/profile/ProfileFollowers.tsx:86
msgid "You do not have any followers."
@@ -8065,7 +8065,7 @@ msgstr "Ninguém segue você ainda."
#: src/screens/Profile/KnownFollowers.tsx:99
msgid "You don't follow any users who follow @{name}."
-msgstr ""
+msgstr "Você não segue nenhum usuário que segue @{name}."
#: src/view/com/modals/InviteCodes.tsx:67
msgid "You don't have any invite codes yet! We'll send you some when you've been on Bluesky for a little longer."
@@ -8089,7 +8089,7 @@ msgstr "Você bloqueou esta conta ou foi bloqueado por ela."
#: src/components/dms/MessagesListBlockedFooter.tsx:58
msgid "You have blocked this user"
-msgstr ""
+msgstr "Você bloqueou este usuário"
#: src/components/moderation/ModerationDetailsDialog.tsx:72
#: src/lib/moderation/useModerationCauseDescription.ts:55
@@ -8123,7 +8123,7 @@ msgstr "Você silenciou este usuário."
#: src/screens/Messages/List/index.tsx:225
msgid "You have no conversations yet. Start one!"
-msgstr ""
+msgstr "Você ainda não tem conversas. Comece uma!"
#: src/view/com/feeds/ProfileFeedgens.tsx:138
msgid "You have no feeds."
@@ -8152,7 +8152,7 @@ msgstr "Você ainda não silenciou nenhuma conta. Para silenciar uma conta, aces
#: src/components/Lists.tsx:52
msgid "You have reached the end"
-msgstr ""
+msgstr "Você chegou ao fim"
#: src/components/StarterPack/ProfileStarterPacks.tsx:235
msgid "You haven't created a starter pack yet!"
@@ -8165,7 +8165,7 @@ msgstr "Você não silenciou nenhuma palavra ou tag ainda"
#: src/components/moderation/ModerationDetailsDialog.tsx:117
#: src/lib/moderation/useModerationCauseDescription.ts:125
msgid "You hid this reply."
-msgstr ""
+msgstr "Você ocultou esta resposta."
#: src/components/moderation/LabelsOnMeDialog.tsx:86
msgid "You may appeal non-self labels if you feel they were placed in error."
@@ -8185,11 +8185,11 @@ msgstr "Você pode adicionar no máximo 3 feeds"
#: src/screens/StarterPack/Wizard/State.tsx:95
#~ msgid "You may only add up to 50 feeds"
-#~ msgstr ""
+#~ msgstr "Você só pode adicionar até 50 feeds"
#: src/screens/StarterPack/Wizard/State.tsx:78
#~ msgid "You may only add up to 50 profiles"
-#~ msgstr ""
+#~ msgstr "Você só pode adicionar até 50 perfis"
#: src/screens/Signup/StepInfo/Policies.tsx:85
msgid "You must be 13 years of age or older to sign up."
@@ -8205,7 +8205,7 @@ msgstr "Você deve estar seguindo pelo menos sete outras pessoas para gerar um k
#: src/components/StarterPack/QrCodeDialog.tsx:60
msgid "You must grant access to your photo library to save a QR code"
-msgstr "Você deve conceder acesso à sua biblioteca de fotos para salvar um código QR."
+msgstr "Você deve conceder acesso à sua biblioteca de fotos para salvar o QR code."
#: src/components/StarterPack/ShareDialog.tsx:68
msgid "You must grant access to your photo library to save the image."
@@ -8217,7 +8217,7 @@ msgstr "Você deve selecionar no mínimo um rotulador"
#: src/screens/Deactivated.tsx:131
msgid "You previously deactivated @{0}."
-msgstr ""
+msgstr "Você desativou @{0} anteriormente."
#: src/view/com/util/forms/PostDropdownBtn.tsx:216
msgid "You will no longer receive notifications for this thread"
@@ -8237,19 +8237,19 @@ msgstr "Você: {0}"
#: src/screens/Messages/List/ChatListItem.tsx:143
msgid "You: {defaultEmbeddedContentMessage}"
-msgstr ""
+msgstr "Você: {defaultEmbeddedContentMessage}"
#: src/screens/Messages/List/ChatListItem.tsx:136
msgid "You: {short}"
-msgstr ""
+msgstr "Você: {short}"
#: src/screens/Signup/index.tsx:113
msgid "You'll follow the suggested users and feeds once you finish creating your account!"
-msgstr ""
+msgstr "Você seguirá os usuários e feeds sugeridos depois de terminar de criar sua conta!"
#: src/screens/Signup/index.tsx:118
msgid "You'll follow the suggested users once you finish creating your account!"
-msgstr ""
+msgstr "Você seguirá os usuários sugeridos depois de terminar de criar sua conta!"
#: src/screens/StarterPack/StarterPackLandingScreen.tsx:239
msgid "You'll follow these people and {0} others"
@@ -8276,7 +8276,7 @@ msgstr "Você está na fila"
#: src/screens/Deactivated.tsx:89
#: src/screens/Settings/components/DeactivateAccountDialog.tsx:54
msgid "You're logged in with an App Password. Please log in with your main password to continue deactivating your account."
-msgstr ""
+msgstr "Você está logado com uma senha de aplicativo. Por favor, faça login com sua senha principal para continuar desativando sua conta."
#: src/screens/Onboarding/StepFinished.tsx:239
msgid "You're ready to go!"
@@ -8309,11 +8309,11 @@ msgstr "Sua data de nascimento"
#: src/view/com/util/post-embeds/VideoEmbed.web.tsx:145
msgid "Your browser does not support the video format. Please try a different browser."
-msgstr ""
+msgstr "Seu navegador não suporta o formato de vídeo. Por favor, tente um navegador diferente."
#: src/screens/Messages/Conversation/ChatDisabled.tsx:25
msgid "Your chats have been disabled"
-msgstr ""
+msgstr "Seus chats foram desativados"
#: src/view/com/modals/InAppBrowserConsent.tsx:47
msgid "Your choice will be saved, but can be changed later in settings."
@@ -8340,7 +8340,7 @@ msgstr "Seu e-mail ainda não foi verificado. Esta é uma etapa importante de se
#: src/state/shell/progress-guide.tsx:156
msgid "Your first like!"
-msgstr ""
+msgstr "Sua primeira curtida!"
#: src/view/com/posts/FollowingEmptyState.tsx:43
msgid "Your following feed is empty! Follow more users to see what's happening."
@@ -8376,7 +8376,7 @@ msgstr "Seu perfil"
#: src/screens/Settings/components/DeactivateAccountDialog.tsx:75
msgid "Your profile, posts, feeds, and lists will no longer be visible to other Bluesky users. You can reactivate your account at any time by logging in."
-msgstr ""
+msgstr "Seu perfil, postagens, feeds e listas não serão mais visíveis para outros usuários do Bluesky. Você pode reativar sua conta a qualquer momento fazendo login."
#: src/view/com/composer/Composer.tsx:425
msgid "Your reply has been published"
diff --git a/src/state/queries/video/util.ts b/src/state/queries/video/util.ts
index db58b60c..898f1736 100644
--- a/src/state/queries/video/util.ts
+++ b/src/state/queries/video/util.ts
@@ -24,3 +24,16 @@ export function useVideoAgent() {
})
}, [])
}
+
+export function mimeToExt(mimeType: string) {
+ switch (mimeType) {
+ case 'video/mp4':
+ return 'mp4'
+ case 'video/webm':
+ return 'webm'
+ case 'video/mpeg':
+ return 'mpeg'
+ default:
+ throw new Error(`Unsupported mime type: ${mimeType}`)
+ }
+}
diff --git a/src/state/queries/video/video-upload.ts b/src/state/queries/video/video-upload.ts
index 6fdd9d5b..23e04316 100644
--- a/src/state/queries/video/video-upload.ts
+++ b/src/state/queries/video/video-upload.ts
@@ -1,11 +1,14 @@
import {createUploadTask, FileSystemUploadType} from 'expo-file-system'
import {AppBskyVideoDefs} from '@atproto/api'
+import {msg} from '@lingui/macro'
+import {useLingui} from '@lingui/react'
import {useMutation} from '@tanstack/react-query'
import {nanoid} from 'nanoid/non-secure'
import {cancelable} from '#/lib/async/cancelable'
+import {ServerError} from '#/lib/media/video/errors'
import {CompressedVideo} from '#/lib/media/video/types'
-import {createVideoEndpointUrl} from '#/state/queries/video/util'
+import {createVideoEndpointUrl, mimeToExt} from '#/state/queries/video/util'
import {useAgent, useSession} from '#/state/session'
import {getServiceAuthAudFromUrl} from 'lib/strings/url-helpers'
@@ -22,13 +25,14 @@ export const useUploadVideoMutation = ({
}) => {
const {currentAccount} = useSession()
const agent = useAgent()
+ const {_} = useLingui()
return useMutation({
mutationKey: ['video', 'upload'],
mutationFn: cancelable(async (video: CompressedVideo) => {
const uri = createVideoEndpointUrl('/xrpc/app.bsky.video.uploadVideo', {
did: currentAccount!.did,
- name: `${nanoid(12)}.mp4`,
+ name: `${nanoid(12)}.${mimeToExt(video.mimeType)}`,
})
const serviceAuthAud = getServiceAuthAudFromUrl(agent.dispatchUrl)
@@ -50,7 +54,7 @@ export const useUploadVideoMutation = ({
video.uri,
{
headers: {
- 'content-type': 'video/mp4',
+ 'content-type': video.mimeType,
Authorization: `Bearer ${serviceAuth.token}`,
},
httpMethod: 'POST',
@@ -65,6 +69,13 @@ export const useUploadVideoMutation = ({
}
const responseBody = JSON.parse(res.body) as AppBskyVideoDefs.JobStatus
+
+ if (!responseBody.jobId) {
+ throw new ServerError(
+ responseBody.error || _(msg`Failed to upload video`),
+ )
+ }
+
return responseBody
}, signal),
onError,
diff --git a/src/state/queries/video/video-upload.web.ts b/src/state/queries/video/video-upload.web.ts
index c3ad3926..40f58645 100644
--- a/src/state/queries/video/video-upload.web.ts
+++ b/src/state/queries/video/video-upload.web.ts
@@ -1,10 +1,13 @@
import {AppBskyVideoDefs} from '@atproto/api'
+import {msg} from '@lingui/macro'
+import {useLingui} from '@lingui/react'
import {useMutation} from '@tanstack/react-query'
import {nanoid} from 'nanoid/non-secure'
import {cancelable} from '#/lib/async/cancelable'
+import {ServerError} from '#/lib/media/video/errors'
import {CompressedVideo} from '#/lib/media/video/types'
-import {createVideoEndpointUrl} from '#/state/queries/video/util'
+import {createVideoEndpointUrl, mimeToExt} from '#/state/queries/video/util'
import {useAgent, useSession} from '#/state/session'
import {getServiceAuthAudFromUrl} from 'lib/strings/url-helpers'
@@ -21,13 +24,14 @@ export const useUploadVideoMutation = ({
}) => {
const {currentAccount} = useSession()
const agent = useAgent()
+ const {_} = useLingui()
return useMutation({
mutationKey: ['video', 'upload'],
mutationFn: cancelable(async (video: CompressedVideo) => {
const uri = createVideoEndpointUrl('/xrpc/app.bsky.video.uploadVideo', {
did: currentAccount!.did,
- name: `${nanoid(12)}.mp4`, // @TODO: make sure it's always mp4'
+ name: `${nanoid(12)}.${mimeToExt(video.mimeType)}`,
})
const serviceAuthAud = getServiceAuthAudFromUrl(agent.dispatchUrl)
@@ -63,23 +67,24 @@ export const useUploadVideoMutation = ({
xhr.responseText,
) as AppBskyVideoDefs.JobStatus
resolve(uploadRes)
- onSuccess(uploadRes)
} else {
- reject()
- onError(new Error('Failed to upload video'))
+ reject(new ServerError(_(msg`Failed to upload video`)))
}
}
xhr.onerror = () => {
- reject()
- onError(new Error('Failed to upload video'))
+ reject(new ServerError(_(msg`Failed to upload video`)))
}
xhr.open('POST', uri)
- xhr.setRequestHeader('Content-Type', 'video/mp4')
+ xhr.setRequestHeader('Content-Type', video.mimeType)
xhr.setRequestHeader('Authorization', `Bearer ${serviceAuth.token}`)
xhr.send(bytes)
},
)
+ if (!res.jobId) {
+ throw new ServerError(res.error || _(msg`Failed to upload video`))
+ }
+
return res
}, signal),
onError,
diff --git a/src/state/queries/video/video.ts b/src/state/queries/video/video.ts
index 3c5094c7..87f31564 100644
--- a/src/state/queries/video/video.ts
+++ b/src/state/queries/video/video.ts
@@ -6,7 +6,8 @@ import {useLingui} from '@lingui/react'
import {QueryClient, useQuery, useQueryClient} from '@tanstack/react-query'
import {logger} from '#/logger'
-import {VideoTooLargeError} from 'lib/media/video/errors'
+import {isWeb} from '#/platform/detection'
+import {ServerError, VideoTooLargeError} from 'lib/media/video/errors'
import {CompressedVideo} from 'lib/media/video/types'
import {useCompressVideoMutation} from 'state/queries/video/compress-video'
import {useVideoAgent} from 'state/queries/video/util'
@@ -58,7 +59,12 @@ function reducer(queryClient: QueryClient) {
abortController: new AbortController(),
}
} else if (action.type === 'SetAsset') {
- updatedState = {...state, asset: action.asset}
+ updatedState = {
+ ...state,
+ asset: action.asset,
+ status: 'compressing',
+ error: undefined,
+ }
} else if (action.type === 'SetDimensions') {
updatedState = {
...state,
@@ -67,11 +73,11 @@ function reducer(queryClient: QueryClient) {
: undefined,
}
} else if (action.type === 'SetVideo') {
- updatedState = {...state, video: action.video}
+ updatedState = {...state, video: action.video, status: 'uploading'}
} else if (action.type === 'SetJobStatus') {
updatedState = {...state, jobStatus: action.jobStatus}
} else if (action.type === 'SetBlobRef') {
- updatedState = {...state, blobRef: action.blobRef}
+ updatedState = {...state, blobRef: action.blobRef, status: 'done'}
}
return updatedState
}
@@ -108,10 +114,6 @@ export function useUploadVideo({
type: 'SetBlobRef',
blobRef,
})
- dispatch({
- type: 'SetStatus',
- status: 'idle',
- })
onSuccess()
},
})
@@ -125,10 +127,17 @@ export function useUploadVideo({
setJobId(response.jobId)
},
onError: e => {
- dispatch({
- type: 'SetError',
- error: _(msg`An error occurred while uploading the video.`),
- })
+ if (e instanceof ServerError) {
+ dispatch({
+ type: 'SetError',
+ error: e.message,
+ })
+ } else {
+ dispatch({
+ type: 'SetError',
+ error: _(msg`An error occurred while uploading the video.`),
+ })
+ }
logger.error('Error uploading video', {safeMessage: e})
},
setProgress: p => {
@@ -141,6 +150,13 @@ export function useUploadVideo({
onProgress: p => {
dispatch({type: 'SetProgress', progress: p})
},
+ onSuccess: (video: CompressedVideo) => {
+ dispatch({
+ type: 'SetVideo',
+ video,
+ })
+ onVideoCompressed(video)
+ },
onError: e => {
if (e instanceof VideoTooLargeError) {
dispatch({
@@ -150,36 +166,28 @@ export function useUploadVideo({
} else {
dispatch({
type: 'SetError',
- // @TODO better error message from server, left untranslated on purpose
- error: 'An error occurred while compressing the video.',
+ error: _(msg`An error occurred while compressing the video.`),
})
logger.error('Error compressing video', {safeMessage: e})
}
},
- onSuccess: (video: CompressedVideo) => {
- dispatch({
- type: 'SetVideo',
- video,
- })
- dispatch({
- type: 'SetStatus',
- status: 'uploading',
- })
- onVideoCompressed(video)
- },
signal: state.abortController.signal,
})
const selectVideo = (asset: ImagePickerAsset) => {
- dispatch({
- type: 'SetAsset',
- asset,
- })
- dispatch({
- type: 'SetStatus',
- status: 'compressing',
- })
- onSelectVideo(asset)
+ switch (getMimeType(asset)) {
+ case 'video/mp4':
+ case 'video/mpeg':
+ case 'video/webm':
+ dispatch({
+ type: 'SetAsset',
+ asset,
+ })
+ onSelectVideo(asset)
+ break
+ default:
+ throw new Error(_(msg`Unsupported video type: ${getMimeType(asset)}`))
+ }
}
const clearVideo = () => {
@@ -241,6 +249,21 @@ const useUploadStatusQuery = ({
isError,
setJobId: (_jobId: string) => {
setJobId(_jobId)
+ setEnabled(true)
},
}
}
+
+function getMimeType(asset: ImagePickerAsset) {
+ if (isWeb) {
+ const [mimeType] = asset.uri.slice('data:'.length).split(';base64,')
+ if (!mimeType) {
+ throw new Error('Could not determine mime type')
+ }
+ return mimeType
+ }
+ if (!asset.mimeType) {
+ throw new Error('Could not determine mime type')
+ }
+ return asset.mimeType
+}
diff --git a/src/view/com/auth/server-input/index.tsx b/src/view/com/auth/server-input/index.tsx
index 0d64650d..22201bb1 100644
--- a/src/view/com/auth/server-input/index.tsx
+++ b/src/view/com/auth/server-input/index.tsx
@@ -86,9 +86,9 @@ export function ServerInputDialog({
label="Preferences"
values={fixedOption}
onChange={setFixedOption}>
-
+
- {_(msg`Bluesky`)}
+ {_(msg`Zio`)}
- Bluesky is an open network where you can choose your hosting
- provider. Custom hosting is now available in beta for
- developers.
+ A small
+
+
+ PDS instance
+
+
+ ran by
+
+
+ Zio
+
+
diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx
index 8a8fa66b..e42e23ba 100644
--- a/src/view/com/composer/Composer.tsx
+++ b/src/view/com/composer/Composer.tsx
@@ -181,6 +181,7 @@ export const ComposePost = observer(function ComposePost({
clearVideo,
state: videoUploadState,
updateVideoDimensions,
+ dispatch: videoUploadDispatch,
} = useUploadVideo({
setStatus: setProcessingState,
onSuccess: () => {
@@ -313,8 +314,8 @@ export const ComposePost = observer(function ComposePost({
if (
!finishedUploading &&
- videoUploadState.status !== 'idle' &&
- videoUploadState.asset
+ videoUploadState.asset &&
+ videoUploadState.status !== 'done'
) {
setPublishOnUpload(true)
return
@@ -607,7 +608,7 @@ export const ComposePost = observer(function ComposePost({
)}
- {error !== '' && (
+ {(error !== '' || videoUploadState.error) && (
- {error}
+ {error || videoUploadState.error}
@@ -755,7 +759,8 @@ export const ComposePost = observer(function ComposePost({
t.atoms.border_contrast_medium,
styles.bottomBar,
]}>
- {videoUploadState.status !== 'idle' ? (
+ {videoUploadState.status !== 'idle' &&
+ videoUploadState.status !== 'done' ? (
) : (
@@ -764,6 +769,7 @@ export const ComposePost = observer(function ComposePost({
)}
@@ -1032,15 +1038,33 @@ function ToolbarWrapper({
function VideoUploadToolbar({state}: {state: VideoUploadState}) {
const t = useTheme()
+ const {_} = useLingui()
+ let text = ''
+
+ switch (state.status) {
+ case 'compressing':
+ text = _('Compressing video...')
+ break
+ case 'uploading':
+ text = _('Uploading video...')
+ break
+ case 'processing':
+ text = _('Processing video...')
+ break
+ case 'done':
+ text = _('Video uploaded')
+ break
+ }
+
+ // we could use state.jobStatus?.progress but 99% of the time it jumps from 0 to 100
const progress =
state.status === 'compressing' || state.status === 'uploading'
? state.progress
- : state.jobStatus?.progress ?? 100
+ : 100
return (
-
+
- {state.status}
+ {text}
)
}
diff --git a/src/view/com/composer/videos/SelectVideoBtn.tsx b/src/view/com/composer/videos/SelectVideoBtn.tsx
index 9c528a92..d8accd06 100644
--- a/src/view/com/composer/videos/SelectVideoBtn.tsx
+++ b/src/view/com/composer/videos/SelectVideoBtn.tsx
@@ -19,9 +19,10 @@ const VIDEO_MAX_DURATION = 90
type Props = {
onSelectVideo: (video: ImagePickerAsset) => void
disabled?: boolean
+ setError: (error: string) => void
}
-export function SelectVideoBtn({onSelectVideo, disabled}: Props) {
+export function SelectVideoBtn({onSelectVideo, disabled, setError}: Props) {
const {_} = useLingui()
const t = useTheme()
const {requestVideoAccessIfNeeded} = useVideoLibraryPermission()
@@ -41,9 +42,17 @@ export function SelectVideoBtn({onSelectVideo, disabled}: Props) {
UIImagePickerPreferredAssetRepresentationMode.Current,
})
if (response.assets && response.assets.length > 0) {
- onSelectVideo(response.assets[0])
+ try {
+ onSelectVideo(response.assets[0])
+ } catch (err) {
+ if (err instanceof Error) {
+ setError(err.message)
+ } else {
+ setError(_(msg`An error occurred while selecting the video`))
+ }
+ }
}
- }, [onSelectVideo, requestVideoAccessIfNeeded])
+ }, [onSelectVideo, requestVideoAccessIfNeeded, setError, _])
return (
<>
diff --git a/src/view/com/composer/videos/VideoPreview.tsx b/src/view/com/composer/videos/VideoPreview.tsx
index 3a823b7e..199a1fff 100644
--- a/src/view/com/composer/videos/VideoPreview.tsx
+++ b/src/view/com/composer/videos/VideoPreview.tsx
@@ -43,7 +43,7 @@ export function VideoPreview({
a.overflow_hidden,
a.border,
t.atoms.border_contrast_low,
- {backgroundColor: t.palette.black},
+ {backgroundColor: 'black'},
]}>
void
clear: () => void
}) {
- const t = useTheme()
const ref = useRef(null)
useEffect(() => {
@@ -54,13 +53,13 @@ export function VideoPreview({
a.rounded_sm,
{aspectRatio},
a.overflow_hidden,
- {backgroundColor: t.palette.black},
+ {backgroundColor: 'black'},
]}>
@@ -450,194 +401,3 @@ let PostCtrls = ({
}
PostCtrls = memo(PostCtrls)
export {PostCtrls}
-
-function AnimatedLikeIcon({
- big,
- likeIconAnimValue,
- likeTextAnimValue,
- defaultCtrlColor,
- isLiked,
- likeCount,
-}: {
- big: boolean
- likeIconAnimValue: SharedValue
- likeTextAnimValue: SharedValue
- defaultCtrlColor: StyleProp
- isLiked: boolean
- likeCount: number
-}) {
- const t = useTheme()
- const {i18n} = useLingui()
- const likeStyle = useAnimatedStyle(() => ({
- transform: [
- {
- scale: interpolate(
- likeIconAnimValue.value,
- [0, 0.1, 0.4, 1],
- [1, 0.7, 1.2, 1],
- 'clamp',
- ),
- },
- ],
- }))
- const circle1Style = useAnimatedStyle(() => ({
- opacity: interpolate(
- likeIconAnimValue.value,
- [0, 0.1, 0.95, 1],
- [0, 0.4, 0.4, 0],
- 'clamp',
- ),
- transform: [
- {
- scale: interpolate(
- likeIconAnimValue.value,
- [0, 0.4, 1],
- [0, 1.5, 1.5],
- 'clamp',
- ),
- },
- ],
- }))
- const circle2Style = useAnimatedStyle(() => ({
- opacity: interpolate(
- likeIconAnimValue.value,
- [0, 0.1, 0.95, 1],
- [0, 1, 1, 0],
- 'clamp',
- ),
- transform: [
- {
- scale: interpolate(
- likeIconAnimValue.value,
- [0, 0.4, 1],
- [0, 0, 1.5],
- 'clamp',
- ),
- },
- ],
- }))
- const countStyle = useAnimatedStyle(() => ({
- transform: [
- {
- translateY: interpolate(
- likeTextAnimValue.value,
- [0, 1],
- [0, big ? -22 : -18],
- 'clamp',
- ),
- },
- ],
- }))
-
- const prevFormattedCount = formatCount(
- i18n,
- isLiked ? likeCount - 1 : likeCount,
- )
- const nextFormattedCount = formatCount(
- i18n,
- isLiked ? likeCount : likeCount + 1,
- )
- const shouldRollLike =
- prevFormattedCount !== nextFormattedCount && prevFormattedCount !== '0'
-
- return (
- <>
-
-
-
-
- {isLiked ? (
-
- ) : (
-
- )}
-
-
-
-
- {likeCount > 0 ? formatCount(i18n, likeCount) : ''}
-
-
-
- {prevFormattedCount}
-
-
- {nextFormattedCount}
-
-
-
- >
- )
-}
diff --git a/src/view/com/util/post-embeds/VideoEmbed.tsx b/src/view/com/util/post-embeds/VideoEmbed.tsx
index 682e1966..55ac1882 100644
--- a/src/view/com/util/post-embeds/VideoEmbed.tsx
+++ b/src/view/com/util/post-embeds/VideoEmbed.tsx
@@ -50,7 +50,7 @@ export function VideoEmbed({embed}: {embed: AppBskyEmbedVideo.View}) {
a.rounded_sm,
a.overflow_hidden,
{aspectRatio},
- {backgroundColor: t.palette.black},
+ {backgroundColor: 'black'},
a.my_xs,
]}>
diff --git a/src/view/com/util/post-embeds/VideoEmbed.web.tsx b/src/view/com/util/post-embeds/VideoEmbed.web.tsx
index 10b4f38d..0001a7af 100644
--- a/src/view/com/util/post-embeds/VideoEmbed.web.tsx
+++ b/src/view/com/util/post-embeds/VideoEmbed.web.tsx
@@ -9,13 +9,12 @@ import {
HLSUnsupportedError,
VideoEmbedInnerWeb,
} from '#/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerWeb'
-import {atoms as a, useTheme} from '#/alf'
+import {atoms as a} from '#/alf'
import {ErrorBoundary} from '../ErrorBoundary'
import {useActiveVideoWeb} from './ActiveVideoWebContext'
import * as VideoFallback from './VideoEmbedInner/VideoFallback'
export function VideoEmbed({embed}: {embed: AppBskyEmbedVideo.View}) {
- const t = useTheme()
const ref = useRef(null)
const gate = useGate()
const {active, setActive, sendPosition, currentActiveView} =
@@ -64,7 +63,7 @@ export function VideoEmbed({embed}: {embed: AppBskyEmbedVideo.View}) {
style={[
a.w_full,
{aspectRatio},
- {backgroundColor: t.palette.black},
+ {backgroundColor: 'black'},
a.relative,
a.rounded_sm,
a.my_xs,
diff --git a/src/view/com/util/post-embeds/VideoEmbedInner/TimeIndicator.tsx b/src/view/com/util/post-embeds/VideoEmbedInner/TimeIndicator.tsx
index 4d07ee78..6636883f 100644
--- a/src/view/com/util/post-embeds/VideoEmbedInner/TimeIndicator.tsx
+++ b/src/view/com/util/post-embeds/VideoEmbedInner/TimeIndicator.tsx
@@ -29,9 +29,9 @@ export function TimeIndicator({time}: {time: number}) {
paddingHorizontal: 6,
paddingVertical: 3,
position: 'absolute',
- left: 5,
- bottom: 5,
- minHeight: 20,
+ left: 6,
+ bottom: 6,
+ minHeight: 21,
justifyContent: 'center',
},
]}>
diff --git a/src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerNative.tsx b/src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerNative.tsx
index f5ee139e..59f9d9f9 100644
--- a/src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerNative.tsx
+++ b/src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerNative.tsx
@@ -167,17 +167,20 @@ function VideoControls({
/>
+ style={[
+ a.absolute,
+ a.rounded_full,
+ a.justify_center,
+ {
+ backgroundColor: 'rgba(0, 0, 0, 0.5)',
+ paddingHorizontal: 4,
+ paddingVertical: 4,
+ bottom: 6,
+ right: 6,
+ minHeight: 21,
+ minWidth: 21,
+ },
+ ]}>
{isMuted ? (
-
+
) : (
-
+
)}
diff --git a/src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx b/src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx
index f2f2f719..d9b99ef3 100644
--- a/src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx
+++ b/src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx
@@ -78,8 +78,8 @@ export function Controls({
const setSubtitlesEnabled = useSetSubtitlesEnabled()
const {
state: hovered,
- onIn: onMouseEnter,
- onOut: onMouseLeave,
+ onIn: onHover,
+ onOut: onEndHover,
} = useInteractionState()
const [isFullscreen, toggleFullscreen] = useFullscreen(fullscreenRef)
const {state: hasFocus, onIn: onFocus, onOut: onBlur} = useInteractionState()
@@ -220,6 +220,25 @@ export function Controls({
onSeek(clamp(currentTime + 5, 0, duration))
}, [onSeek, videoRef])
+ const [showCursor, setShowCursor] = useState(true)
+ const cursorTimeoutRef = useRef>()
+ const onPointerMoveEmptySpace = useCallback(() => {
+ setShowCursor(true)
+ if (cursorTimeoutRef.current) {
+ clearTimeout(cursorTimeoutRef.current)
+ }
+ cursorTimeoutRef.current = setTimeout(() => {
+ setShowCursor(false)
+ onEndHover()
+ }, 2000)
+ }, [onEndHover])
+ const onPointerLeaveEmptySpace = useCallback(() => {
+ setShowCursor(false)
+ if (cursorTimeoutRef.current) {
+ clearTimeout(cursorTimeoutRef.current)
+ }
+ }, [])
+
const showControls =
(focused && !playing) || (interactingViaKeypress ? hasFocus : hovered)
@@ -236,13 +255,17 @@ export function Controls({
evt.stopPropagation()
setInteractingViaKeypress(false)
}}
- onMouseEnter={onMouseEnter}
- onMouseLeave={onMouseLeave}
+ onPointerEnter={onHover}
+ onPointerMove={onHover}
+ onPointerLeave={onEndHover}
onFocus={onFocus}
onBlur={onBlur}
onKeyDown={onKeyDown}>
- {active && !showControls && !focused && (
+ {!showControls && !focused && duration > 0 && (
)}
{
- isSeekingRef.current = false
- onSeekEnd()
- setScrubberActive(false)
- },
- {signal},
- )
-
return () => {
document.body.classList.remove('force-no-clicks')
- abortController.abort()
}
}
}, [scrubberActive, onSeekEnd])
@@ -534,9 +544,8 @@ function Scrubber({
+ onPointerEnter={onStartHover}
+ onPointerLeave={onEndHover}>
+ onPointerUp={onPointerUp}
+ onPointerCancel={onPointerUp}>