Merge pull request #1009 from cheeaun/main

Update from main
This commit is contained in:
Chee Aun 2025-01-26 21:04:10 +08:00 committed by GitHub
commit 24f03f5130
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
26 changed files with 1126 additions and 1054 deletions

View file

@ -1,9 +1,13 @@
name: Pull Request to `main` from `production`
name: Pull Request into `production` from `main`
on:
push:
branches:
- main
pull_request:
types: [closed]
branches:
- main
jobs:
auto-pull-request:

View file

@ -97,7 +97,7 @@ Everything is designed and engineered following my taste and vision. This is a p
## Development
Prerequisites: Node.js 18+
Prerequisites: Node.js 20+
- `npm install` - Install dependencies
- `npm run dev` - Start development server and `messages:extract` (`clean` + ``watch`) in parallel
@ -233,6 +233,11 @@ Available variables:
- `PHANPY_DEFAULT_LANG` (optional):
- Default language is English (`en`) if not specified.
- Fallback language after multiple detection methods (`lang` query parameter, `lang` key in `localStorage` and `navigator.language`)
- `PHANPY_REFERRER_POLICY` (optional, default: `origin`):
- Referrer policy for the site. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy).
- This is applied with the `<meta>` tag on the client-side.
- The policy can also be set with `Referrer-Policy` header configured on the server-side (not this variable).
- Note that since Phanpy uses hash-based URLs, the referrer does not include the hash part.
- `PHANPY_LINGVA_INSTANCES` (optional, space-separated list, default: `lingva.phanpy.social [...hard-coded list of fallback instances]`):
- Specify a space-separated list of instances. First will be used as default before falling back to the subsequent instances. If there's only 1 instance, means no fallback.
- May specify a self-hosted Lingva instance, powered by either [lingva-translate](https://github.com/thedaviddelta/lingva-translate) or [lingva-api](https://github.com/cheeaun/lingva-api)
@ -313,6 +318,7 @@ Costs involved in running and developing this web app:
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/12618120/medium/ccb11bd042bbf4c7189033f7af2dbd32_default.png" alt="" width="16" height="16" /> drydenwu (Chinese Traditional)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/13557465/medium/8feebf3677fa80c01e8c54c4fbe097e0_default.png" alt="" width="16" height="16" /> elissarc (French)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16528627/medium/9036f6eced0257f4e1ea4c5bd499de2d_default.png" alt="" width="16" height="16" /> ElPamplina (Spanish)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/15592209/medium/28f10212dce24e74c25e27ea6d0e9126.png" alt="" width="16" height="16" /> filipesmedeiros (Portuguese)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/14277386/medium/29b30d2c73a214000e3941c9978f49e4_default.png" alt="" width="16" height="16" /> Fitik (Esperanto, Hebrew)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/14444512/medium/99d0e7a3076deccbdfe0aa0b0612308c.jpeg" alt="" width="16" height="16" /> Freeesia (Japanese)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/medium/7a0122f352a94d95be10780bb83f63ef.jpg" alt="" width="16" height="16" /> ghose (Galician)
@ -328,6 +334,7 @@ Costs involved in running and developing this web app:
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16640089/medium/4b7d8d275d7a7bff564adde51e09b473_default.png" alt="" width="16" height="16" /> LukeHong (Chinese Traditional)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/12822971/medium/4ecbe6d1248536084902925beb0b63e4.png" alt="" width="16" height="16" /> Mannivu (Italian)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16537713/medium/825f0bf1a14fc545a76891a52839d86e_default.png" alt="" width="16" height="16" /> marcin.kozinski (Polish)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16812323/medium/72bffbdf4a331845f23400eafa0b3d48.jpeg" alt="" width="16" height="16" /> martinmodrak (Czech)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/13521465/medium/76cb9aa6b753ce900a70478bff7fcea0.png" alt="" width="16" height="16" /> mkljczkk (Polish)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/12882812/medium/77744d8db46e9a3e09030e1a02b7a572.jpeg" alt="" width="16" height="16" /> mojosoeun (Korean)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/13613969/medium/c7834ddc0ada84a79671697a944bb274.png" alt="" width="16" height="16" /> moreal (Korean)
@ -348,9 +355,11 @@ Costs involved in running and developing this web app:
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/14565190/medium/79100599131b7776e9803e4b696915a3_default.png" alt="" width="16" height="16" /> Sky_NiniKo (French)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/13143526/medium/30871da23d51d7e41bb02f3c92d7f104.png" alt="" width="16" height="16" /> Steffo99 (Italian)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16532441/medium/1a47e8d80c95636e02d2260f6e233ca5.png" alt="" width="16" height="16" /> Su5hicz (Czech)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/12579488/medium/699394d1acfe986a31532007534c7656.jpg" alt="" width="16" height="16" /> svetlemodry (Czech)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16530049/medium/683f3581620c6b4a5c753b416ed695a7.jpeg" alt="" width="16" height="16" /> tferrermo (Spanish)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/15752199/medium/7e9efd828c4691368d063b19d19eb894.png" alt="" width="16" height="16" /> tkbremnes (Norwegian Bokmal)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16527851/medium/649e5a9a8a8cc61ced670d89e9cca082.png" alt="" width="16" height="16" /> tux93 (German)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16791511/medium/321c72613cd27efc3005e7c3bf383578.jpeg" alt="" width="16" height="16" /> uzaylul (Turkish)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/14427566/medium/ab733b5044c21867fc5a9d1b22cd2c03.png" alt="" width="16" height="16" /> Vac31. (Lithuanian)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16026914/medium/e3ca187f354a298ef0c9d02a0ed17be7.jpg" alt="" width="16" height="16" /> valtlai (Finnish)
- <img src="https://crowdin-static.downloads.crowdin.com/avatar/16608515/medium/85506c21dce8df07843ca11908ee3951.jpeg" alt="" width="16" height="16" /> vasiriri (Polish)

607
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -16,8 +16,8 @@
"readme:i18n-volunteers": "node scripts/update-i18n-volunteers-readme.js"
},
"dependencies": {
"@formatjs/intl-localematcher": "~0.5.9",
"@formatjs/intl-segmenter": "~11.7.7",
"@formatjs/intl-localematcher": "~0.5.10",
"@formatjs/intl-segmenter": "~11.7.8",
"@formkit/auto-animate": "~0.8.2",
"@github/text-expander-element": "~2.8.0",
"@iconify-icons/mingcute": "~1.2.9",
@ -25,11 +25,11 @@
"@lingui/detect-locale": "~5.1.2",
"@lingui/macro": "~5.1.2",
"@lingui/react": "~5.1.2",
"@szhsin/react-menu": "~4.2.3",
"@szhsin/react-menu": "~4.3.0",
"chroma-js": "~3.1.2",
"compare-versions": "~6.1.1",
"fast-blurhash": "~1.1.4",
"fast-equals": "~5.0.1",
"fast-equals": "~5.2.2",
"fuse.js": "~7.0.0",
"html-prettify": "~1.0.7",
"idb-keyval": "~6.2.1",
@ -37,14 +37,14 @@
"js-cookie": "~3.0.5",
"just-debounce-it": "~3.2.0",
"lz-string": "~1.5.0",
"masto": "~6.10.1",
"masto": "~6.10.3",
"moize": "~6.1.6",
"p-retry": "~6.2.1",
"p-throttle": "~7.0.0",
"preact": "~10.25.3",
"preact": "~10.25.4",
"punycode": "~2.3.1",
"react-hotkeys-hook": "~4.6.1",
"react-intersection-observer": "~9.14.0",
"react-intersection-observer": "~9.15.1",
"react-quick-pinch-zoom": "~5.1.0",
"react-router-dom": "6.6.2",
"string-length": "6.0.0",
@ -58,18 +58,18 @@
"valtio": "2.1.2"
},
"devDependencies": {
"@ianvs/prettier-plugin-sort-imports": "~4.4.0",
"@ianvs/prettier-plugin-sort-imports": "~4.4.1",
"@lingui/cli": "~5.1.2",
"@lingui/vite-plugin": "~5.1.2",
"@preact/preset-vite": "~2.9.3",
"@preact/preset-vite": "~2.10.0",
"babel-plugin-macros": "~3.1.0",
"postcss": "~8.4.49",
"postcss": "~8.5.1",
"postcss-dark-theme-class": "~1.3.0",
"postcss-preset-env": "~10.1.2",
"postcss-preset-env": "~10.1.3",
"prettier": "3.4.2",
"sonda": "~0.6.2",
"sonda": "~0.7.1",
"twitter-text": "~3.1.0",
"vite": "~6.0.5",
"vite": "~6.0.11",
"vite-plugin-generate-file": "~0.2.0",
"vite-plugin-html-config": "~2.0.2",
"vite-plugin-pwa": "~0.21.1",

View file

@ -459,7 +459,9 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) {
transparent var(--curves-radius)
);
background-size: var(--curves-radius);
background-position: top var(--backward), bottom var(--forward);
background-position:
top var(--backward),
bottom var(--forward);
}
}
.timeline.contextual > li {
@ -519,7 +521,8 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) {
}
.timeline.contextual .replies[data-scroll-left]:not([data-scroll-left='0']) {
background-color: var(--bg-color);
box-shadow: inset 0 -3px var(--comment-line-color),
box-shadow:
inset 0 -3px var(--comment-line-color),
inset 0 3px var(--comment-line-color);
overscroll-behavior-x: contain;
/* touch-action: pan-x; */
@ -1655,7 +1658,8 @@ body:has(.media-modal-container + .status-deck) .media-post-link {
background-color: var(--button-bg-blur-color);
/* backdrop-filter: blur(16px); */
z-index: 10;
box-shadow: 0 3px 8px -1px var(--drop-shadow-color),
box-shadow:
0 3px 8px -1px var(--drop-shadow-color),
0 10px 36px -4px var(--button-bg-blur-color);
transition: all 0.3s ease-in-out;
}
@ -1815,7 +1819,8 @@ body:has(.media-modal-container + .status-deck) .media-post-link {
box-shadow: none;
}
100% {
box-shadow: 0 0 0 1px var(--outline-color),
box-shadow:
0 0 0 1px var(--outline-color),
0 8px 16px -8px var(--drop-shadow-color);
}
}
@ -1944,7 +1949,8 @@ body > .szh-menu-container {
background-color: var(--bg-color);
border: 1px solid var(--outline-stronger-color);
border-radius: 8px;
box-shadow: 0 3px 8px var(--drop-shadow-color),
box-shadow:
0 3px 8px var(--drop-shadow-color),
0 6px 32px -6px var(--drop-shadow-color);
text-align: start;
/* animation: appear-smooth 0.15s ease-in-out; */
@ -1978,8 +1984,10 @@ body > .szh-menu-container {
}
.szh-menu.menu-emphasized {
border-color: var(--outline-hover-color);
box-shadow: 0 3px 16px -3px var(--drop-shadow-color),
0 3px 32px var(--drop-shadow-color), 0 3px 48px var(--drop-shadow-color);
box-shadow:
0 3px 16px -3px var(--drop-shadow-color),
0 3px 32px var(--drop-shadow-color),
0 3px 48px var(--drop-shadow-color);
background-color: var(--bg-color);
animation-duration: 0.3s;
animation-timing-function: ease-in-out;
@ -1987,7 +1995,7 @@ body > .szh-menu-container {
min-width: min(12em, 90vw);
}
.szh-menu .footer {
margin: 8px 0 -8px;
margin: 8px 0 -4px;
padding: 8px 16px;
color: var(--text-insignificant-color);
font-size: 90%;
@ -2262,7 +2270,9 @@ body > .szh-menu-container {
background-color: var(--bg-blur-color);
backdrop-filter: blur(8px) saturate(3);
border: var(--hairline-width) solid var(--bg-color);
text-shadow: 0 var(--hairline-width) var(--bg-color), 0 0 8px var(--bg-color);
text-shadow:
0 var(--hairline-width) var(--bg-color),
0 0 8px var(--bg-color);
}
.glass-menu .szh-menu__item--hover {
/* background-color: var(--button-bg-blur-color); */
@ -2363,14 +2373,16 @@ body > .szh-menu-container {
text-shadow: 0 1px var(--bg-color);
background-color: var(--bg-color);
border: 2px solid var(--link-faded-color);
box-shadow: 0 3px 16px var(--drop-shadow-color),
box-shadow:
0 3px 16px var(--drop-shadow-color),
0 6px 16px -3px var(--drop-shadow-color);
}
:is(.shiny-pill, :root .toastify.shiny-pill):hover:not(:active) {
color: var(--text-color);
border-color: var(--link-color);
filter: none !important;
box-shadow: 0 3px 16px var(--drop-shadow-color),
box-shadow:
0 3px 16px var(--drop-shadow-color),
0 6px 16px -3px var(--drop-shadow-color),
0 6px 16px var(--drop-shadow-color);
}
@ -2386,7 +2398,8 @@ body > .szh-menu-container {
text-shadow: 0 calc(var(--hairline-width) * -1) var(--drop-shadow-color);
background-color: var(--button-bg-color);
background-image: none;
box-shadow: 0 3px 8px -1px var(--drop-shadow-color),
box-shadow:
0 3px 8px -1px var(--drop-shadow-color),
0 10px 36px -4px var(--button-bg-blur-color);
text-align: center;
width: fit-content;
@ -2551,10 +2564,14 @@ ul.link-list li a .icon {
filter: none !important;
}
.nav-menu-button .avatar {
box-shadow: 0 0 0 2px var(--bg-color), 0 0 0 4px var(--link-light-color) !important;
box-shadow:
0 0 0 2px var(--bg-color),
0 0 0 4px var(--link-light-color) !important;
}
.nav-menu-button:is(:hover, :focus, .active) .avatar {
box-shadow: 0 0 0 2px var(--bg-color), 0 0 0 4px var(--link-color) !important;
box-shadow:
0 0 0 2px var(--bg-color),
0 0 0 4px var(--link-color) !important;
}
.nav-menu-button.with-avatar .icon {
position: absolute;
@ -2598,10 +2615,14 @@ ul.link-list li a .icon {
overscroll-behavior: auto;
flex-basis: min(100vw, var(--column-size));
flex-shrink: 0;
box-shadow: -1px 0 var(--bg-color), -2px 0 var(--drop-shadow-color),
box-shadow:
-1px 0 var(--bg-color),
-2px 0 var(--drop-shadow-color),
-3px 0 var(--bg-color);
&:dir(rtl) {
box-shadow: 1px 0 var(--bg-color), 2px 0 var(--drop-shadow-color),
box-shadow:
1px 0 var(--bg-color),
2px 0 var(--drop-shadow-color),
3px 0 var(--bg-color);
}
}

View file

@ -378,15 +378,17 @@ function AccountInfo({
<p>
<Trans>Unable to load account.</Trans>
</p>
<p>
<a
href={isString ? account : url}
target="_blank"
rel="noopener noreferrer"
>
<Trans>Go to account page</Trans> <Icon icon="external" />
</a>
</p>
{isString ? (
<p>
<code class="insignificant">{account}</code>
</p>
) : (
<p>
<a href={url} target="_blank" rel="noopener">
<Trans>Go to account page</Trans> <Icon icon="external" />
</a>
</p>
)}
</div>
)}
{uiState === 'loading' ? (

View file

@ -13,12 +13,7 @@ function EmbedModal({ html, url, width, height, onClose = () => {} }) {
<Icon icon="x" alt={t`Close`} />
</button>
{url && (
<a
href={url}
target="_blank"
rel="noopener noreferrer"
class="button plain"
>
<a href={url} target="_blank" rel="noopener" class="button plain">
<span>
<Trans>Open in new window</Trans>
</span>{' '}

View file

@ -26,8 +26,10 @@ export default memo(function KeyboardShortcutsHelp() {
},
{
ignoreEventWhen: (e) => {
const hasModal = !!document.querySelector('#modal-container > *');
return hasModal;
const isCatchUpPage = /\/catchup/i.test(location.hash);
return isCatchUpPage;
// const hasModal = !!document.querySelector('#modal-container > *');
// return hasModal;
},
},
);

View file

@ -510,7 +510,7 @@ function Notification({
<a
href={`https://${instance}/severed_relationships`}
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
<Trans>
Learn more <Icon icon="external" size="s" />
@ -526,7 +526,7 @@ function Notification({
<a
href={`/disputes/strikes/${moderation_warning.id}`}
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
<Trans>
Learn more <Icon icon="external" size="s" />
@ -550,7 +550,7 @@ function Notification({
<a
key={account.id}
href={account.url}
rel="noopener noreferrer"
rel="noopener"
class="account-avatar-stack"
onClick={(e) => {
e.preventDefault();
@ -654,7 +654,7 @@ function Notification({
<a
key={account.id}
href={account.url}
rel="noopener noreferrer"
rel="noopener"
class="account-avatar-stack"
onClick={(e) => {
e.preventDefault();

View file

@ -918,6 +918,25 @@ function Status({
const actionsRef = useRef();
const isPublic = ['public', 'unlisted'].includes(visibility);
const isPinnable = ['public', 'unlisted', 'private'].includes(visibility);
const menuFooter =
mediaNoDesc && !reblogged ? (
<div class="footer">
<Icon icon="alert" />
<Trans>Some media have no descriptions.</Trans>
</div>
) : (
statusMonthsAgo >= 3 && (
<div class="footer">
<Icon icon="info" />
<span>
<Trans>
Old post (<strong>{rtf.format(-statusMonthsAgo, 'month')}</strong>
)
</Trans>
</span>
</div>
)
);
const StatusMenuItems = (
<>
{!isSizeLarge && sameInstance && (
@ -954,29 +973,7 @@ function Status({
</span>
</MenuItem>
}
menuFooter={
mediaNoDesc && !reblogged ? (
<div class="footer">
<Icon icon="alert" />
<Trans>Some media have no descriptions.</Trans>
</div>
) : (
statusMonthsAgo >= 3 && (
<div class="footer">
<Icon icon="info" />
<span>
<Trans>
Old post (
<strong>
{rtf.format(-statusMonthsAgo, 'month')}
</strong>
)
</Trans>
</span>
</div>
)
)
}
menuFooter={menuFooter}
disabled={!canBoost}
onClick={async () => {
try {
@ -2282,7 +2279,7 @@ function Status({
alt={visibilityText[visibility]}
/> */}
<span>{_(visibilityText[visibility])}</span> &bull;{' '}
<a href={url} target="_blank" rel="noopener noreferrer">
<a href={url} target="_blank" rel="noopener">
{
// within a day
new Date().getTime() - createdAtDate.getTime() <
@ -2429,15 +2426,7 @@ function Status({
</span>
</MenuItem>
}
menuFooter={
mediaNoDesc &&
!reblogged && (
<div class="footer">
<Icon icon="alert" />
<Trans>Some media have no descriptions.</Trans>
</div>
)
}
menuFooter={menuFooter}
>
<StatusButton
checked={reblogged}
@ -2820,7 +2809,7 @@ function Card({ card, selfReferential, selfAuthor, instance }) {
<a
href={cardStatusURL || url}
target={cardStatusURL ? null : '_blank'}
rel="nofollow noopener noreferrer"
rel="nofollow noopener"
class={`card link ${isPost ? 'card-post' : ''} ${
blurhashImage ? '' : size
}`}
@ -2883,7 +2872,7 @@ function Card({ card, selfReferential, selfAuthor, instance }) {
<a
href={url}
target="_blank"
rel="nofollow noopener noreferrer"
rel="nofollow noopener"
class="card photo"
onClick={handleClick}
>
@ -2930,7 +2919,7 @@ function Card({ card, selfReferential, selfAuthor, instance }) {
<a
href={cardStatusURL || url}
target={cardStatusURL ? null : '_blank'}
rel="nofollow noopener noreferrer"
rel="nofollow noopener"
class={`card link ${isPost ? 'card-post' : ''} no-image`}
lang={language}
dir="auto"

View file

@ -149,7 +149,7 @@ function Timeline({
const activeItemRect = activeItem?.getBoundingClientRect();
const allItems = Array.from(
scrollableRef.current.querySelectorAll(itemsSelector),
);
).filter((item) => !!item.offsetHeight);
if (
activeItem &&
activeItemRect.top < scrollableRef.current.clientHeight &&
@ -188,7 +188,7 @@ function Timeline({
const activeItemRect = activeItem?.getBoundingClientRect();
const allItems = Array.from(
scrollableRef.current.querySelectorAll(itemsSelector),
);
).filter((item) => !!item.offsetHeight);
if (
activeItem &&
activeItemRect.top < scrollableRef.current.clientHeight &&

View file

@ -15,7 +15,7 @@
"code": "cs-CZ",
"nativeName": "čeština",
"name": "Czech",
"completion": 74
"completion": 84
},
{
"code": "de-DE",

7
src/locales/ca-ES.po generated
View file

@ -8,7 +8,7 @@ msgstr ""
"Language: ca\n"
"Project-Id-Version: phanpy\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-27 18:00\n"
"PO-Revision-Date: 2025-01-14 18:50\n"
"Last-Translator: \n"
"Language-Team: Catalan\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -76,7 +76,7 @@ msgstr "Verificat"
#: src/components/account-block.jsx:223
#: src/components/account-info.jsx:782
msgid "Joined <0>{0}</0>"
msgstr "S'hi va unir <0>{0}</0>"
msgstr "S'hi va unir el <0>{0}</0>"
#: src/components/account-info.jsx:58
msgid "Forever"
@ -1410,6 +1410,7 @@ msgid "Accounts…"
msgstr "Comptes…"
#: src/components/nav-menu.jsx:315
#: src/pages/login.jsx:27
#: src/pages/login.jsx:190
#: src/pages/status.jsx:837
#: src/pages/welcome.jsx:65
@ -2708,7 +2709,7 @@ msgstr "Grups"
#: src/pages/catchup.jsx:596
msgid "Showing {selectedFilterCategory, select, all {all posts} original {original posts} replies {replies} boosts {boosts} followedTags {followed tags} groups {groups} filtered {filtered posts}}, {sortBy, select, createdAt {{sortOrder, select, asc {oldest} desc {latest}}} reblogsCount {{sortOrder, select, asc {fewest boosts} desc {most boosts}}} favouritesCount {{sortOrder, select, asc {fewest likes} desc {most likes}}} repliesCount {{sortOrder, select, asc {fewest replies} desc {most replies}}} density {{sortOrder, select, asc {least dense} desc {most dense}}}} first{groupBy, select, account {, grouped by authors} other {}}"
msgstr "Es mostren {selectedFilterCategory, select, all {totes les publicacions} original {publicacions originals} replies {respostes} boosts {impulsos} followedTags {etiquetes seguides} groups {grups} filtered {publicacions filtrades}}, {sortBy, select, createdAt {{sortOrder, select, asc {més antic} desc {més recent}}} reblogsCount {{sortOrder, select, asc {amb menys impulsos} desc {amb més impulsos}}} favouritesCount {{sortOrder, select, asc {amb menys favorits} desc {amb més favorits}}} repliesCount {{sortOrder, select, asc {amb menys respostes} desc {amb més respostes}}} density {{sortOrder, select, asc {amb menys densitat} desc {amb més densitat}}}} primer{groupBy, select, account {, agrupat per autors} other {}}"
msgstr "Es mostren {selectedFilterCategory, select, all {totes les publicacions} original {publicacions originals} replies {respostes} boosts {impulsos} followedTags {etiquetes seguides} groups {grups} filtered {publicacions filtrades}}, {sortBy, select, createdAt {{sortOrder, select, asc {més antiga} desc {més recent}}} reblogsCount {{sortOrder, select, asc {amb menys impulsos} desc {amb més impulsos}}} favouritesCount {{sortOrder, select, asc {amb menys favorits} desc {amb més favorits}}} repliesCount {{sortOrder, select, asc {amb menys respostes} desc {amb més respostes}}} density {{sortOrder, select, asc {amb menys densitat} desc {amb més densitat}}}} primer{groupBy, select, account {, agrupat per autors} other {}}"
#: src/pages/catchup.jsx:882
#: src/pages/catchup.jsx:906

284
src/locales/cs-CZ.po generated
View file

@ -8,7 +8,7 @@ msgstr ""
"Language: cs\n"
"Project-Id-Version: phanpy\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-21 12:46\n"
"PO-Revision-Date: 2025-01-06 21:33\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
@ -113,7 +113,7 @@ msgstr "Příspěvky"
#: src/components/account-info.jsx:429
#: src/components/account-info.jsx:1120
#: src/components/compose.jsx:2592
#: src/components/compose.jsx:2624
#: src/components/media-alt-modal.jsx:46
#: src/components/media-modal.jsx:358
#: src/components/status.jsx:1737
@ -241,7 +241,7 @@ msgstr "Blokováno"
#: src/components/account-info.jsx:1096
msgid "Private note"
msgstr ""
msgstr "Soukromá poznámka"
#: src/components/account-info.jsx:1153
msgid "Mention <0>@{username}</0>"
@ -253,43 +253,43 @@ msgstr "Přeložit bio"
#: src/components/account-info.jsx:1176
msgid "Edit private note"
msgstr ""
msgstr "Upravit soukromou poznámku"
#: src/components/account-info.jsx:1176
msgid "Add private note"
msgstr ""
msgstr "Přidat soukromou poznámku"
#: src/components/account-info.jsx:1196
msgid "Notifications enabled for @{username}'s posts."
msgstr ""
msgstr "Upozornění pro příspěvky od @{username} povolena."
#: src/components/account-info.jsx:1197
msgid " Notifications disabled for @{username}'s posts."
msgstr ""
msgstr " Upozornění pro příspěvky od @{username} zakázána."
#: src/components/account-info.jsx:1209
msgid "Disable notifications"
msgstr ""
msgstr "Vypnout upozornění"
#: src/components/account-info.jsx:1210
msgid "Enable notifications"
msgstr ""
msgstr "Zapnout upozornění"
#: src/components/account-info.jsx:1227
msgid "Boosts from @{username} enabled."
msgstr ""
msgstr "Boosty od @{username} povoleny."
#: src/components/account-info.jsx:1228
msgid "Boosts from @{username} disabled."
msgstr ""
msgstr "Boosty od @{username} zakázány."
#: src/components/account-info.jsx:1239
msgid "Disable boosts"
msgstr ""
msgstr "Zakázat boosty"
#: src/components/account-info.jsx:1239
msgid "Enable boosts"
msgstr ""
msgstr "Povolit boosty"
#: src/components/account-info.jsx:1255
#: src/components/account-info.jsx:1265
@ -327,7 +327,7 @@ msgstr "Sdílet…"
#: src/components/account-info.jsx:1354
msgid "Unmuted @{username}"
msgstr ""
msgstr "Zrušeno ztlumení @{username}"
#: src/components/account-info.jsx:1366
msgid "Unmute <0>@{username}</0>"
@ -340,11 +340,11 @@ msgstr "Ztišit <0>@{username}</0>…"
#. placeholder {0}: typeof MUTE_DURATIONS_LABELS[duration] === 'function' ? MUTE_DURATIONS_LABELS[duration]() : _(MUTE_DURATIONS_LABELS[duration])
#: src/components/account-info.jsx:1414
msgid "Muted @{username} for {0}"
msgstr ""
msgstr "Ztlumený @{username} na {0}"
#: src/components/account-info.jsx:1426
msgid "Unable to mute @{username}"
msgstr ""
msgstr "Nelze ztlumit @{username}"
#: src/components/account-info.jsx:1447
msgid "Remove <0>@{username}</0> from followers?"
@ -352,7 +352,7 @@ msgstr "Odstranit <0>@{username}</0> ze sledujících?"
#: src/components/account-info.jsx:1467
msgid "@{username} removed from followers"
msgstr ""
msgstr "@{username} odebrán/a ze sledujících"
#: src/components/account-info.jsx:1479
msgid "Remove follower…"
@ -364,19 +364,19 @@ msgstr "Blokovat <0>@{username}</0>?"
#: src/components/account-info.jsx:1514
msgid "Unblocked @{username}"
msgstr ""
msgstr "Odblokován @{username}"
#: src/components/account-info.jsx:1522
msgid "Blocked @{username}"
msgstr ""
msgstr "Zablokován @{username}"
#: src/components/account-info.jsx:1530
msgid "Unable to unblock @{username}"
msgstr ""
msgstr "Nelze odblokovat uživatele @{username}"
#: src/components/account-info.jsx:1532
msgid "Unable to block @{username}"
msgstr ""
msgstr "Nelze zablokovat uživatele @{username}"
#: src/components/account-info.jsx:1542
msgid "Unblock <0>@{username}</0>"
@ -397,12 +397,12 @@ msgstr "Upravit profil"
#: src/components/account-info.jsx:1624
msgid "Withdraw follow request?"
msgstr ""
msgstr "Zrušit žádost o sledování?"
#. placeholder {1}: info.acct || info.username
#: src/components/account-info.jsx:1625
msgid "Unfollow @{1}?"
msgstr ""
msgstr "Přestat sledovat @{1}?"
#: src/components/account-info.jsx:1676
msgid "Unfollow…"
@ -424,10 +424,10 @@ msgstr "Sledovat"
#: src/components/account-info.jsx:2098
#: src/components/account-sheet.jsx:38
#: src/components/compose.jsx:859
#: src/components/compose.jsx:2548
#: src/components/compose.jsx:3022
#: src/components/compose.jsx:3231
#: src/components/compose.jsx:3461
#: src/components/compose.jsx:2580
#: src/components/compose.jsx:3054
#: src/components/compose.jsx:3263
#: src/components/compose.jsx:3493
#: src/components/drafts.jsx:59
#: src/components/embed-modal.jsx:13
#: src/components/generic-accounts.jsx:143
@ -459,11 +459,11 @@ msgstr "Přeložit bio"
#: src/components/account-info.jsx:1908
msgid "Unable to remove from list."
msgstr ""
msgstr "Nelze odstranit ze seznamu."
#: src/components/account-info.jsx:1909
msgid "Unable to add to list."
msgstr ""
msgstr "Nelze přidat do seznamu."
#: src/components/account-info.jsx:1928
#: src/pages/lists.jsx:105
@ -487,7 +487,7 @@ msgstr "Soukromá poznámka o <0> @{0}</0>"
#: src/components/account-info.jsx:2032
msgid "Unable to update private note."
msgstr ""
msgstr "Nelze aktualizovat soukromou poznámku."
#: src/components/account-info.jsx:2055
#: src/components/account-info.jsx:2226
@ -500,7 +500,7 @@ msgstr "Uložit a zavřít"
#: src/components/account-info.jsx:2154
msgid "Unable to update profile."
msgstr ""
msgstr "Nelze aktualizovat profil."
#: src/components/account-info.jsx:2161
#: src/components/list-add-edit.jsx:105
@ -566,7 +566,7 @@ msgstr "Vytvořit"
#: src/components/compose.jsx:206
msgid "Add media"
msgstr ""
msgstr "Přidat média"
#: src/components/compose.jsx:207
msgid "Add custom emoji"
@ -574,7 +574,7 @@ msgstr "Přidat vlastní emoji"
#: src/components/compose.jsx:208
msgid "Add GIF"
msgstr ""
msgstr "Přidat GIF"
#: src/components/compose.jsx:209
msgid "Add poll"
@ -711,7 +711,7 @@ msgid "Mark media as sensitive"
msgstr "Označit média jako citlivá"
#: src/components/compose.jsx:1381
#: src/components/compose.jsx:3080
#: src/components/compose.jsx:3112
#: src/components/shortcuts-settings.jsx:715
#: src/pages/list.jsx:362
msgid "Add"
@ -743,31 +743,31 @@ msgstr "Stahování GIFu…"
msgid "Failed to download GIF"
msgstr "Nepodařilo se stáhnout GIF"
#: src/components/compose.jsx:1879
#: src/components/compose.jsx:1956
#: src/components/compose.jsx:1884
#: src/components/compose.jsx:1961
#: src/components/nav-menu.jsx:239
msgid "More…"
msgstr "Více…"
#: src/components/compose.jsx:2361
#: src/components/compose.jsx:2393
msgid "Uploaded"
msgstr "Odesláno"
#: src/components/compose.jsx:2374
#: src/components/compose.jsx:2406
msgid "Image description"
msgstr "Popis obrázku"
#: src/components/compose.jsx:2375
#: src/components/compose.jsx:2407
msgid "Video description"
msgstr "Popis videa"
#: src/components/compose.jsx:2376
#: src/components/compose.jsx:2408
msgid "Audio description"
msgstr "Popis audia"
#. placeholder {0}: prettyBytes( imageSize, )
#. placeholder {1}: prettyBytes(imageSizeLimit)
#: src/components/compose.jsx:2412
#: src/components/compose.jsx:2444
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower."
msgstr "Velikost souboru je příliš velká. Při nahrávání mohou vzniknout problémy. Zkuste zmenšit velikost souboru z {0} na {1} nebo nižší."
@ -775,163 +775,163 @@ msgstr "Velikost souboru je příliš velká. Při nahrávání mohou vzniknout
#. placeholder {3}: i18n.number(height)
#. placeholder {4}: i18n.number(newWidth)
#. placeholder {5}: i18n.number( newHeight, )
#: src/components/compose.jsx:2424
#: src/components/compose.jsx:2456
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {2}×{3}px to {4}×{5}px."
msgstr ""
msgstr "Rozlišení je příliš velké. Při nahrávání mohou vzniknout problémy. Zkuste zmenšit rozlišení z {2}×{3}px na {4}×{5}px."
#. placeholder {6}: prettyBytes( videoSize, )
#. placeholder {7}: prettyBytes(videoSizeLimit)
#: src/components/compose.jsx:2432
#: src/components/compose.jsx:2464
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {6} to {7} or lower."
msgstr ""
msgstr "Velikost souboru je příliš velká. Při nahrávání mohou vzniknout problémy. Zkuste zmenšit velikost souboru z {6} na {7} nebo nižší."
#. placeholder {8}: i18n.number( width, )
#. placeholder {9}: i18n.number(height)
#. placeholder {10}: i18n.number(newWidth)
#. placeholder {11}: i18n.number( newHeight, )
#: src/components/compose.jsx:2444
#: src/components/compose.jsx:2476
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {8}×{9}px to {10}×{11}px."
msgstr ""
msgstr "Rozměr je příliš velký. Při nahrávání mohou vzniknout problémy. Zkuste zmenšit velikost z {8}×{9}px na {10}×{11}px."
#: src/components/compose.jsx:2452
#: src/components/compose.jsx:2484
msgid "Frame rate too high. Uploading might encounter issues."
msgstr "Snímková frekvence je příliš vysoká. Při nahrávání mohou vzniknout problémy."
#: src/components/compose.jsx:2512
#: src/components/compose.jsx:2762
#: src/components/compose.jsx:2544
#: src/components/compose.jsx:2794
#: src/components/shortcuts-settings.jsx:726
#: src/pages/catchup.jsx:1074
#: src/pages/filters.jsx:412
msgid "Remove"
msgstr "Odstranit"
#: src/components/compose.jsx:2529
#: src/components/compose.jsx:2561
#: src/compose.jsx:84
msgid "Error"
msgstr "Chyba"
#: src/components/compose.jsx:2554
#: src/components/compose.jsx:2586
msgid "Edit image description"
msgstr "Upravit popis obrázku"
#: src/components/compose.jsx:2555
#: src/components/compose.jsx:2587
msgid "Edit video description"
msgstr "Upravit popis videa"
#: src/components/compose.jsx:2556
#: src/components/compose.jsx:2588
msgid "Edit audio description"
msgstr "Upravit popis audia"
#: src/components/compose.jsx:2601
#: src/components/compose.jsx:2650
#: src/components/compose.jsx:2633
#: src/components/compose.jsx:2682
msgid "Generating description. Please wait…"
msgstr "Generování popisu. Počkejte prosím…"
#. placeholder {12}: e.message
#: src/components/compose.jsx:2621
#: src/components/compose.jsx:2653
msgid "Failed to generate description: {12}"
msgstr ""
msgstr "Nepodařilo se vytvořit popisek: {12}"
#: src/components/compose.jsx:2622
#: src/components/compose.jsx:2654
msgid "Failed to generate description"
msgstr "Nepodařilo se vytvořit popis"
#: src/components/compose.jsx:2634
#: src/components/compose.jsx:2640
#: src/components/compose.jsx:2686
#: src/components/compose.jsx:2666
#: src/components/compose.jsx:2672
#: src/components/compose.jsx:2718
msgid "Generate description…"
msgstr "Vytvořit popis…"
#. placeholder {13}: e?.message ? `: ${e.message}` : ''
#: src/components/compose.jsx:2673
#: src/components/compose.jsx:2705
msgid "Failed to generate description{13}"
msgstr ""
msgstr "Nepodařilo se vytvořit popisek{13}"
#. placeholder {0}: localeCode2Text(lang)
#: src/components/compose.jsx:2688
#: src/components/compose.jsx:2720
msgid "({0}) <0>— experimental</0>"
msgstr "({0}) <0> experimentální</0>"
#: src/components/compose.jsx:2707
#: src/components/compose.jsx:2739
msgid "Done"
msgstr "Hotovo"
#. placeholder {0}: i + 1
#: src/components/compose.jsx:2743
#: src/components/compose.jsx:2775
msgid "Choice {0}"
msgstr ""
msgstr "Volba {0}"
#: src/components/compose.jsx:2790
#: src/components/compose.jsx:2822
msgid "Multiple choices"
msgstr "Více možností"
#: src/components/compose.jsx:2793
#: src/components/compose.jsx:2825
msgid "Duration"
msgstr "Trvání"
#: src/components/compose.jsx:2824
#: src/components/compose.jsx:2856
msgid "Remove poll"
msgstr "Odstranit anketu"
#: src/components/compose.jsx:3039
#: src/components/compose.jsx:3071
msgid "Search accounts"
msgstr ""
msgstr "Hledat účty"
#: src/components/compose.jsx:3093
#: src/components/compose.jsx:3125
#: src/components/generic-accounts.jsx:228
msgid "Error loading accounts"
msgstr "Chyba při načítání účtů"
#: src/components/compose.jsx:3237
#: src/components/compose.jsx:3269
msgid "Custom emojis"
msgstr "Vlastní emoji"
#: src/components/compose.jsx:3257
#: src/components/compose.jsx:3289
msgid "Search emoji"
msgstr ""
msgstr "Hledat emoji"
#: src/components/compose.jsx:3288
#: src/components/compose.jsx:3320
msgid "Error loading custom emojis"
msgstr "Chyba při načítání vlastních emoji"
#: src/components/compose.jsx:3299
#: src/components/compose.jsx:3331
msgid "Recently used"
msgstr ""
msgstr "Nedávno použité"
#: src/components/compose.jsx:3300
#: src/components/compose.jsx:3332
msgid "Others"
msgstr ""
msgstr "Ostatní"
#. placeholder {0}: i18n.number(emojis.length - max)
#: src/components/compose.jsx:3338
#: src/components/compose.jsx:3370
msgid "{0} more…"
msgstr "{0} další…"
#: src/components/compose.jsx:3476
#: src/components/compose.jsx:3508
msgid "Search GIFs"
msgstr ""
msgstr "Hledat GIFy"
#: src/components/compose.jsx:3491
#: src/components/compose.jsx:3523
msgid "Powered by GIPHY"
msgstr ""
msgstr "Běží na GIPHY"
#: src/components/compose.jsx:3499
#: src/components/compose.jsx:3531
msgid "Type to search GIFs"
msgstr "Zadejte pro vyhledávání GIFů"
#: src/components/compose.jsx:3597
#: src/components/compose.jsx:3629
#: src/components/media-modal.jsx:462
#: src/components/timeline.jsx:893
msgid "Previous"
msgstr "Zpět"
#: src/components/compose.jsx:3615
#: src/components/compose.jsx:3647
#: src/components/media-modal.jsx:481
#: src/components/timeline.jsx:910
msgid "Next"
msgstr "Další"
#: src/components/compose.jsx:3632
#: src/components/compose.jsx:3664
msgid "Error loading GIFs"
msgstr "Chyba při načítání GIFů"
@ -1109,11 +1109,11 @@ msgstr "<0>1</0> do <1>9</1>"
#: src/components/keyboard-shortcuts-help.jsx:118
msgid "Focus next column in multi-column mode"
msgstr ""
msgstr "Zaměřit se na další sloupec v režimu více sloupců"
#: src/components/keyboard-shortcuts-help.jsx:122
msgid "Focus previous column in multi-column mode"
msgstr ""
msgstr "Zaměřit se na předchozí sloupec v režimu více sloupců"
#: src/components/keyboard-shortcuts-help.jsx:126
msgid "Compose new post"
@ -1534,7 +1534,7 @@ msgstr "Upozornění na moderování"
#: src/components/notification.jsx:265
msgid "Your {year} #Wrapstodon is here!"
msgstr ""
msgstr "Tvůj {year} #Wrapstodon je tady!"
#: src/components/notification.jsx:271
msgid "An admin from <0>{from}</0> has suspended <1>{targetName}</1>, which means you can no longer receive updates from them or interact with them."
@ -1605,7 +1605,7 @@ msgstr "Další informace <0/>"
#: src/components/notification.jsx:540
msgid "View #Wrapstodon"
msgstr ""
msgstr "Zobrazit #Wrapstodon"
#: src/components/notification.jsx:770
#: src/components/status.jsx:267
@ -2124,17 +2124,17 @@ msgstr "Nelíbí se @{0}"
#. placeholder {1}: username || acct
#: src/components/status.jsx:791
msgid "Liked @{1}'s post"
msgstr ""
msgstr "Líbí se příspěvek od @{1}"
#. placeholder {2}: username || acct
#: src/components/status.jsx:830
msgid "Unbookmarked @{2}'s post"
msgstr ""
msgstr "Odebrali jste záložku z příspěvku od @{2}"
#. placeholder {3}: username || acct
#: src/components/status.jsx:831
msgid "Bookmarked @{3}'s post"
msgstr ""
msgstr "Přidali jste příspěvek od @{3} do záložek"
#: src/components/status.jsx:937
#: src/components/status.jsx:999
@ -2161,12 +2161,12 @@ msgstr "Starý příspěvek (<0>{0}</0>)"
#. placeholder {4}: username || acct
#: src/components/status.jsx:987
msgid "Unboosted @{4}'s post"
msgstr ""
msgstr "Zrušili jste boostnutí příspěvku od @{4}"
#. placeholder {5}: username || acct
#: src/components/status.jsx:988
msgid "Boosted @{5}'s post"
msgstr ""
msgstr "Boostnuli jste příspěvek od @{5}"
#: src/components/status.jsx:1000
msgid "Boost…"
@ -2276,12 +2276,12 @@ msgstr "Nahlásit příspěvek…"
#. placeholder {6}: username || acct
#: src/components/status.jsx:1442
msgid "Unboosted @{6}'s post"
msgstr ""
msgstr "Zrušili jste boostnutí příspěvku od @{6}"
#. placeholder {7}: username || acct
#: src/components/status.jsx:1443
msgid "Boosted @{7}'s post"
msgstr ""
msgstr "Boostnuli jste příspěvek od @{7}"
#: src/components/status.jsx:1728
#: src/components/status.jsx:1764
@ -2343,7 +2343,7 @@ msgstr "Komentáře"
#. More from [Author]
#: src/components/status.jsx:2696
msgid "More from <0/>"
msgstr ""
msgstr "Více od <0/>"
#: src/components/status.jsx:2998
msgid "Edit History"
@ -2436,7 +2436,7 @@ msgstr "Zkuste to znovu"
#. placeholder {0}: fItems.length
#: src/components/timeline.jsx:591
msgid "{0, plural, one {# Boost} other {# Boosts}}"
msgstr ""
msgstr "{0, plural, one {# Boostnutí} other {# Boostnutí}}"
#: src/components/timeline.jsx:596
msgid "Pinned posts"
@ -2610,7 +2610,7 @@ msgstr "Přepněte na tento účet"
#: src/pages/accounts.jsx:133
msgid "Switch in new tab/window"
msgstr ""
msgstr "Přepnout v novém panelu/okně"
#: src/pages/accounts.jsx:147
msgid "View profile…"
@ -2904,7 +2904,7 @@ msgstr "Filtrováno: {0}"
#: src/pages/favourites.jsx:26
msgid "No likes yet. Go like something!"
msgstr ""
msgstr "Neudělili jste žádné \"líbí se mi\". Označte něco, co se vám líbí!"
#: src/pages/favourites.jsx:27
msgid "Unable to load likes."
@ -3007,7 +3007,7 @@ msgstr "Vypršení platnosti"
#: src/pages/filters.jsx:526
msgid "Filtered post will be…"
msgstr ""
msgstr "Filtrovaný příspěvek bude…"
#: src/pages/filters.jsx:536
msgid "minimized"
@ -3031,11 +3031,11 @@ msgstr "Vypršelo"
#: src/pages/filters.jsx:611
msgid "Expiring <0/>"
msgstr ""
msgstr "Vyprší <0/>"
#: src/pages/filters.jsx:615
msgid "Never expires"
msgstr ""
msgstr "Nikdy nevyprší"
#. placeholder {0}: followedHashtags.length
#: src/pages/followed-hashtags.jsx:71
@ -3061,19 +3061,19 @@ msgstr "Nelze načíst příspěvky."
#: src/pages/hashtag.jsx:56
msgid "{hashtagTitle} (Media only) on {instance}"
msgstr ""
msgstr "{hashtagTitle} (pouze média) na {instance}"
#: src/pages/hashtag.jsx:57
msgid "{hashtagTitle} on {instance}"
msgstr ""
msgstr "{hashtagTitle} na {instance}"
#: src/pages/hashtag.jsx:59
msgid "{hashtagTitle} (Media only)"
msgstr ""
msgstr "{hashtagTitle} (pouze média)"
#: src/pages/hashtag.jsx:60
msgid "{hashtagTitle}"
msgstr ""
msgstr "{hashtagTitle}"
#: src/pages/hashtag.jsx:182
msgid "No one has posted anything with this tag yet."
@ -3085,7 +3085,7 @@ msgstr "Nepodařilo se načíst příspěvky s tímto štítkem"
#: src/pages/hashtag.jsx:209
msgid "Unfollow #{hashtag}?"
msgstr ""
msgstr "Přestat sledovat #{hashtag}?"
#: src/pages/hashtag.jsx:224
msgid "Unfollowed #{hashtag}"
@ -3093,28 +3093,28 @@ msgstr "#{hashtag} již není sledován"
#: src/pages/hashtag.jsx:239
msgid "Followed #{hashtag}"
msgstr ""
msgstr "Sledován #{hashtag}"
#: src/pages/hashtag.jsx:255
msgid "Following…"
msgstr ""
msgstr "Sleduji…"
#: src/pages/hashtag.jsx:283
msgid "Unfeatured on profile"
msgstr ""
msgstr "Odebráno z profilu"
#: src/pages/hashtag.jsx:297
msgid "Unable to unfeature on profile"
msgstr ""
msgstr "Nepodařilo se odebrat z profilu"
#: src/pages/hashtag.jsx:306
#: src/pages/hashtag.jsx:322
msgid "Featured on profile"
msgstr ""
msgstr "Zmíněno v profilu"
#: src/pages/hashtag.jsx:329
msgid "Feature on profile"
msgstr ""
msgstr "Zmínit v profilu"
#: src/pages/hashtag.jsx:394
msgid "{TOTAL_TAGS_LIMIT, plural, other {Max # tags}}"
@ -3134,7 +3134,7 @@ msgstr ""
#: src/pages/hashtag.jsx:472
msgid "This shortcut already exists"
msgstr ""
msgstr "Tato zkratka již existuje"
#: src/pages/hashtag.jsx:475
msgid "Hashtag shortcut added"
@ -3170,37 +3170,37 @@ msgstr "Přejít na moji instanci (<0>{currentInstance}</0>)"
#: src/pages/home.jsx:210
msgid "Unable to fetch notifications."
msgstr ""
msgstr "Nelze načíst oznámení."
#: src/pages/home.jsx:230
msgid "<0>New</0> <1>Follow Requests</1>"
msgstr ""
msgstr "<0>Nové</0> <1>Žádosti o sledování</1>"
#: src/pages/home.jsx:236
msgid "See all"
msgstr ""
msgstr "Zobrazit vše"
#: src/pages/http-route.jsx:68
msgid "Resolving…"
msgstr ""
msgstr "Připojování…"
#: src/pages/http-route.jsx:79
msgid "Unable to resolve URL"
msgstr ""
msgstr "Nelze najít URL adresu"
#: src/pages/list.jsx:108
msgid "Nothing yet."
msgstr ""
msgstr "Zatím nic."
#: src/pages/list.jsx:177
#: src/pages/list.jsx:281
msgid "Manage members"
msgstr ""
msgstr "Spravovat členy"
#. placeholder {0}: account.username
#: src/pages/list.jsx:316
msgid "Remove <0>@{0}</0> from list?"
msgstr ""
msgstr "Odstranit <0>@{0}</0> ze seznamu?"
#: src/pages/list.jsx:362
msgid "Remove…"
@ -3213,12 +3213,12 @@ msgstr ""
#: src/pages/lists.jsx:109
msgid "No lists yet."
msgstr ""
msgstr "Nemáte žádné seznamy."
#: src/pages/login.jsx:110
#: src/pages/login.jsx:123
msgid "Failed to register application"
msgstr ""
msgstr "Nepodařilo se zaregistrovat aplikaci"
#: src/pages/login.jsx:209
msgid "instance domain"
@ -3226,7 +3226,7 @@ msgstr ""
#: src/pages/login.jsx:233
msgid "e.g. “mastodon.social”"
msgstr ""
msgstr "např. “mastodon.social”"
#: src/pages/login.jsx:244
msgid "Failed to log in. Please try again or try another instance."
@ -3238,7 +3238,7 @@ msgstr ""
#: src/pages/login.jsx:257
msgid "Continue"
msgstr ""
msgstr "Pokračovat"
#: src/pages/login.jsx:265
msgid "Don't have an account? Create one!"
@ -3319,7 +3319,7 @@ msgstr "Dnes"
#: src/pages/notifications.jsx:796
msgid "You're all caught up."
msgstr ""
msgstr "Přečetli jste všechny komentáře."
#: src/pages/notifications.jsx:819
msgid "Yesterday"
@ -3483,11 +3483,11 @@ msgstr "Vzhled"
#: src/pages/settings.jsx:168
msgid "Light"
msgstr ""
msgstr "Světlý"
#: src/pages/settings.jsx:179
msgid "Dark"
msgstr ""
msgstr "Tmavý"
#: src/pages/settings.jsx:192
msgid "Auto"
@ -3518,12 +3518,12 @@ msgstr ""
#: src/pages/settings.jsx:273
msgid "Default visibility"
msgstr ""
msgstr "Výchozí viditelnost"
#: src/pages/settings.jsx:274
#: src/pages/settings.jsx:320
msgid "Synced"
msgstr ""
msgstr "Synchronizováno"
#: src/pages/settings.jsx:299
msgid "Failed to update posting privacy"
@ -3551,7 +3551,7 @@ msgstr ""
#: src/pages/settings.jsx:389
msgid "Translate to "
msgstr ""
msgstr "Přeložit do "
#: src/pages/settings.jsx:400
msgid "System language ({systemTargetLanguageText})"
@ -3839,15 +3839,15 @@ msgstr ""
#: src/pages/welcome.jsx:65
msgid "Log in with Mastodon"
msgstr ""
msgstr "Přihlásit účtem Mastodon"
#: src/pages/welcome.jsx:71
msgid "Sign up"
msgstr ""
msgstr "Vytvořit účet"
#: src/pages/welcome.jsx:78
msgid "Connect your existing Mastodon/Fediverse account.<0/>Your credentials are not stored on this server."
msgstr ""
msgstr "Připojte svůj existující Mastodon/Fediverse účet.<0/>Vaše přihlašovací údaje nejsou uloženy na tomto serveru."
#: src/pages/welcome.jsx:95
msgid "<0>Built</0> by <1>@cheeaun</1>. <2>Privacy Policy</2>."

606
src/locales/en.po generated

File diff suppressed because it is too large Load diff

109
src/locales/eu-ES.po generated
View file

@ -8,7 +8,7 @@ msgstr ""
"Language: eu\n"
"Project-Id-Version: phanpy\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-21 14:14\n"
"PO-Revision-Date: 2025-01-22 09:57\n"
"Last-Translator: \n"
"Language-Team: Basque\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -113,7 +113,7 @@ msgstr "bidalketa"
#: src/components/account-info.jsx:429
#: src/components/account-info.jsx:1120
#: src/components/compose.jsx:2592
#: src/components/compose.jsx:2624
#: src/components/media-alt-modal.jsx:46
#: src/components/media-modal.jsx:358
#: src/components/status.jsx:1737
@ -424,10 +424,10 @@ msgstr "Jarraitu"
#: src/components/account-info.jsx:2098
#: src/components/account-sheet.jsx:38
#: src/components/compose.jsx:859
#: src/components/compose.jsx:2548
#: src/components/compose.jsx:3022
#: src/components/compose.jsx:3231
#: src/components/compose.jsx:3461
#: src/components/compose.jsx:2580
#: src/components/compose.jsx:3054
#: src/components/compose.jsx:3263
#: src/components/compose.jsx:3493
#: src/components/drafts.jsx:59
#: src/components/embed-modal.jsx:13
#: src/components/generic-accounts.jsx:143
@ -711,7 +711,7 @@ msgid "Mark media as sensitive"
msgstr "Markatu multimedia hunkigarri gisa"
#: src/components/compose.jsx:1381
#: src/components/compose.jsx:3080
#: src/components/compose.jsx:3112
#: src/components/shortcuts-settings.jsx:715
#: src/pages/list.jsx:362
msgid "Add"
@ -743,31 +743,31 @@ msgstr "GIFa deskargatzen…"
msgid "Failed to download GIF"
msgstr "Ezin da GIFa deskargatu"
#: src/components/compose.jsx:1879
#: src/components/compose.jsx:1956
#: src/components/compose.jsx:1884
#: src/components/compose.jsx:1961
#: src/components/nav-menu.jsx:239
msgid "More…"
msgstr "Gehiago…"
#: src/components/compose.jsx:2361
#: src/components/compose.jsx:2393
msgid "Uploaded"
msgstr "Igota"
#: src/components/compose.jsx:2374
#: src/components/compose.jsx:2406
msgid "Image description"
msgstr "Irudiaren deskribapena"
#: src/components/compose.jsx:2375
#: src/components/compose.jsx:2407
msgid "Video description"
msgstr "Bideoaren deskribapena"
#: src/components/compose.jsx:2376
#: src/components/compose.jsx:2408
msgid "Audio description"
msgstr "Audioaren deskribapena"
#. placeholder {0}: prettyBytes( imageSize, )
#. placeholder {1}: prettyBytes(imageSizeLimit)
#: src/components/compose.jsx:2412
#: src/components/compose.jsx:2444
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower."
msgstr "Fitxategia handiegia da. Igoerak arazoak izan ditzake. Saiatu tamaina {0}tik {1} edo gutxiagora murrizten."
@ -775,13 +775,13 @@ msgstr "Fitxategia handiegia da. Igoerak arazoak izan ditzake. Saiatu tamaina {0
#. placeholder {3}: i18n.number(height)
#. placeholder {4}: i18n.number(newWidth)
#. placeholder {5}: i18n.number( newHeight, )
#: src/components/compose.jsx:2424
#: src/components/compose.jsx:2456
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {2}×{3}px to {4}×{5}px."
msgstr "Neurria handiegia da. Igoerak arazoak izan ditzake. Saiatu neurria {2}×{3}px-etik {4}×{5}px edo gutxiagora murrizten."
#. placeholder {6}: prettyBytes( videoSize, )
#. placeholder {7}: prettyBytes(videoSizeLimit)
#: src/components/compose.jsx:2432
#: src/components/compose.jsx:2464
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {6} to {7} or lower."
msgstr "Fitxategia handiegia da. Igoerak arazoak izan ditzake. Saiatu tamaina {6}tik {7} edo gutxiagora murrizten."
@ -789,149 +789,149 @@ msgstr "Fitxategia handiegia da. Igoerak arazoak izan ditzake. Saiatu tamaina {6
#. placeholder {9}: i18n.number(height)
#. placeholder {10}: i18n.number(newWidth)
#. placeholder {11}: i18n.number( newHeight, )
#: src/components/compose.jsx:2444
#: src/components/compose.jsx:2476
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {8}×{9}px to {10}×{11}px."
msgstr "Neurria handiegia da. Igoerak arazoak izan ditzake. Saiatu neurria {8}×{9}px-etik {10}×{11}px edo gutxiagora murrizten."
#: src/components/compose.jsx:2452
#: src/components/compose.jsx:2484
msgid "Frame rate too high. Uploading might encounter issues."
msgstr "Fotograma-tasa (frame rate) altuegia da. Igoerak arazoak izan ditzake."
#: src/components/compose.jsx:2512
#: src/components/compose.jsx:2762
#: src/components/compose.jsx:2544
#: src/components/compose.jsx:2794
#: src/components/shortcuts-settings.jsx:726
#: src/pages/catchup.jsx:1074
#: src/pages/filters.jsx:412
msgid "Remove"
msgstr "Kendu"
#: src/components/compose.jsx:2529
#: src/components/compose.jsx:2561
#: src/compose.jsx:84
msgid "Error"
msgstr "Errorea"
#: src/components/compose.jsx:2554
#: src/components/compose.jsx:2586
msgid "Edit image description"
msgstr "Editatu irudiaren deskribapena"
#: src/components/compose.jsx:2555
#: src/components/compose.jsx:2587
msgid "Edit video description"
msgstr "Editatu bideoaren deskribapena"
#: src/components/compose.jsx:2556
#: src/components/compose.jsx:2588
msgid "Edit audio description"
msgstr "Editatu audioaren deskribapena"
#: src/components/compose.jsx:2601
#: src/components/compose.jsx:2650
#: src/components/compose.jsx:2633
#: src/components/compose.jsx:2682
msgid "Generating description. Please wait…"
msgstr "Deskribapena sortzen. Itxaron…"
#. placeholder {12}: e.message
#: src/components/compose.jsx:2621
#: src/components/compose.jsx:2653
msgid "Failed to generate description: {12}"
msgstr "Ezin da deskribapena sortu: {12}"
#: src/components/compose.jsx:2622
#: src/components/compose.jsx:2654
msgid "Failed to generate description"
msgstr "Ezin da deskribapena sortu"
#: src/components/compose.jsx:2634
#: src/components/compose.jsx:2640
#: src/components/compose.jsx:2686
#: src/components/compose.jsx:2666
#: src/components/compose.jsx:2672
#: src/components/compose.jsx:2718
msgid "Generate description…"
msgstr "Sortu deskribapena…"
#. placeholder {13}: e?.message ? `: ${e.message}` : ''
#: src/components/compose.jsx:2673
#: src/components/compose.jsx:2705
msgid "Failed to generate description{13}"
msgstr "Ezin izan da deskribapena sortu{13}"
#. placeholder {0}: localeCode2Text(lang)
#: src/components/compose.jsx:2688
#: src/components/compose.jsx:2720
msgid "({0}) <0>— experimental</0>"
msgstr "({0}) <0>— esperimentala</0>"
#: src/components/compose.jsx:2707
#: src/components/compose.jsx:2739
msgid "Done"
msgstr "Eginda"
#. placeholder {0}: i + 1
#: src/components/compose.jsx:2743
#: src/components/compose.jsx:2775
msgid "Choice {0}"
msgstr "{0}. aukera"
#: src/components/compose.jsx:2790
#: src/components/compose.jsx:2822
msgid "Multiple choices"
msgstr "Hainbat aukera"
#: src/components/compose.jsx:2793
#: src/components/compose.jsx:2825
msgid "Duration"
msgstr "Iraupena"
#: src/components/compose.jsx:2824
#: src/components/compose.jsx:2856
msgid "Remove poll"
msgstr "Kendu bozketa"
#: src/components/compose.jsx:3039
#: src/components/compose.jsx:3071
msgid "Search accounts"
msgstr "Bilatu kontuak"
#: src/components/compose.jsx:3093
#: src/components/compose.jsx:3125
#: src/components/generic-accounts.jsx:228
msgid "Error loading accounts"
msgstr "Errorea kontuak kargatzean"
#: src/components/compose.jsx:3237
#: src/components/compose.jsx:3269
msgid "Custom emojis"
msgstr "Instantziako emojiak"
#: src/components/compose.jsx:3257
#: src/components/compose.jsx:3289
msgid "Search emoji"
msgstr "Bilatu emojia"
#: src/components/compose.jsx:3288
#: src/components/compose.jsx:3320
msgid "Error loading custom emojis"
msgstr "Errorea emoji pertsonalizatua kargatzean"
#: src/components/compose.jsx:3299
#: src/components/compose.jsx:3331
msgid "Recently used"
msgstr "Oraintsu erabilita"
#: src/components/compose.jsx:3300
#: src/components/compose.jsx:3332
msgid "Others"
msgstr "Besteak"
#. placeholder {0}: i18n.number(emojis.length - max)
#: src/components/compose.jsx:3338
#: src/components/compose.jsx:3370
msgid "{0} more…"
msgstr "{0} gehiago…"
#: src/components/compose.jsx:3476
#: src/components/compose.jsx:3508
msgid "Search GIFs"
msgstr "Bilatu GIFak"
#: src/components/compose.jsx:3491
#: src/components/compose.jsx:3523
msgid "Powered by GIPHY"
msgstr "GIPHYri esker"
#: src/components/compose.jsx:3499
#: src/components/compose.jsx:3531
msgid "Type to search GIFs"
msgstr "Idatzi GIFak bilatzeko"
#: src/components/compose.jsx:3597
#: src/components/compose.jsx:3629
#: src/components/media-modal.jsx:462
#: src/components/timeline.jsx:893
msgid "Previous"
msgstr "Aurrekoa"
#: src/components/compose.jsx:3615
#: src/components/compose.jsx:3647
#: src/components/media-modal.jsx:481
#: src/components/timeline.jsx:910
msgid "Next"
msgstr "Hurrengoa"
#: src/components/compose.jsx:3632
#: src/components/compose.jsx:3664
msgid "Error loading GIFs"
msgstr "Errorea GIFak kargatzean"
@ -1410,6 +1410,7 @@ msgid "Accounts…"
msgstr "Kontuak…"
#: src/components/nav-menu.jsx:315
#: src/pages/login.jsx:27
#: src/pages/login.jsx:190
#: src/pages/status.jsx:837
#: src/pages/welcome.jsx:65
@ -1656,7 +1657,7 @@ msgstr "{votersCount, plural, one {hautesle <0>{0}</0>} other {<1>{1}</1> hautes
#: src/components/poll.jsx:268
msgid "Ended <0/>"
msgstr "<0/>(e)an amaitu zen"
msgstr "<0/> amaitu da"
#: src/components/poll.jsx:272
msgid "Ended"
@ -1664,7 +1665,7 @@ msgstr "Amaitu da"
#: src/components/poll.jsx:275
msgid "Ending <0/>"
msgstr "<0/>(e)an amaituko da"
msgstr "<0/> amaituko da"
#: src/components/poll.jsx:279
msgid "Ending"

109
src/locales/pt-BR.po generated
View file

@ -8,7 +8,7 @@ msgstr ""
"Language: pt\n"
"Project-Id-Version: phanpy\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-22 00:30\n"
"PO-Revision-Date: 2025-01-15 16:00\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -76,7 +76,7 @@ msgstr "Verificado"
#: src/components/account-block.jsx:223
#: src/components/account-info.jsx:782
msgid "Joined <0>{0}</0>"
msgstr "Se juntou em <0>{0}</0>"
msgstr "Juntou-se em <0>{0}</0>"
#: src/components/account-info.jsx:58
msgid "Forever"
@ -113,7 +113,7 @@ msgstr "Publicações"
#: src/components/account-info.jsx:429
#: src/components/account-info.jsx:1120
#: src/components/compose.jsx:2592
#: src/components/compose.jsx:2624
#: src/components/media-alt-modal.jsx:46
#: src/components/media-modal.jsx:358
#: src/components/status.jsx:1737
@ -169,7 +169,7 @@ msgstr "Em memória"
#: src/components/account-info.jsx:711
#: src/components/account-info.jsx:752
msgid "This user has chosen to not make this information available."
msgstr "Esse usuário decidiu não fazer esta informação visível."
msgstr "O usuário deixou privado esta informação."
#. placeholder {0}: ( postingStats.originals / postingStats.total ).toLocaleString(i18n.locale || undefined, { style: 'percent', })
#. placeholder {1}: ( postingStats.replies / postingStats.total ).toLocaleString(i18n.locale || undefined, { style: 'percent', })
@ -424,10 +424,10 @@ msgstr "Seguir"
#: src/components/account-info.jsx:2098
#: src/components/account-sheet.jsx:38
#: src/components/compose.jsx:859
#: src/components/compose.jsx:2548
#: src/components/compose.jsx:3022
#: src/components/compose.jsx:3231
#: src/components/compose.jsx:3461
#: src/components/compose.jsx:2580
#: src/components/compose.jsx:3054
#: src/components/compose.jsx:3263
#: src/components/compose.jsx:3493
#: src/components/drafts.jsx:59
#: src/components/embed-modal.jsx:13
#: src/components/generic-accounts.jsx:143
@ -711,7 +711,7 @@ msgid "Mark media as sensitive"
msgstr "Marcar mídia como sensível"
#: src/components/compose.jsx:1381
#: src/components/compose.jsx:3080
#: src/components/compose.jsx:3112
#: src/components/shortcuts-settings.jsx:715
#: src/pages/list.jsx:362
msgid "Add"
@ -743,31 +743,31 @@ msgstr "Baixando GIF…"
msgid "Failed to download GIF"
msgstr "Houve um erro ao baixar GIF"
#: src/components/compose.jsx:1879
#: src/components/compose.jsx:1956
#: src/components/compose.jsx:1884
#: src/components/compose.jsx:1961
#: src/components/nav-menu.jsx:239
msgid "More…"
msgstr "Mais…"
#: src/components/compose.jsx:2361
#: src/components/compose.jsx:2393
msgid "Uploaded"
msgstr "Enviado"
#: src/components/compose.jsx:2374
#: src/components/compose.jsx:2406
msgid "Image description"
msgstr "Descrição da imagem"
#: src/components/compose.jsx:2375
#: src/components/compose.jsx:2407
msgid "Video description"
msgstr "Descrição do vídeo"
#: src/components/compose.jsx:2376
#: src/components/compose.jsx:2408
msgid "Audio description"
msgstr "Descrição do áudio"
#. placeholder {0}: prettyBytes( imageSize, )
#. placeholder {1}: prettyBytes(imageSizeLimit)
#: src/components/compose.jsx:2412
#: src/components/compose.jsx:2444
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower."
msgstr "O arquivo é muito grande. Enviá-lo pode enfrentar problemas. Reduza o tamanho do arquivo de {0} a {1} ou menor."
@ -775,13 +775,13 @@ msgstr "O arquivo é muito grande. Enviá-lo pode enfrentar problemas. Reduza o
#. placeholder {3}: i18n.number(height)
#. placeholder {4}: i18n.number(newWidth)
#. placeholder {5}: i18n.number( newHeight, )
#: src/components/compose.jsx:2424
#: src/components/compose.jsx:2456
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {2}×{3}px to {4}×{5}px."
msgstr "A dimensão é muito grande. Enviá-lo pode enfrentar problemas. Reduza a dimensão de {2}×{3}px a {4}×{5}px."
#. placeholder {6}: prettyBytes( videoSize, )
#. placeholder {7}: prettyBytes(videoSizeLimit)
#: src/components/compose.jsx:2432
#: src/components/compose.jsx:2464
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {6} to {7} or lower."
msgstr "O arquivo é muito grande. Enviá-lo pode enfrentar problemas. Reduza o tamanho do arquivo de {6} a {7} ou menor."
@ -789,149 +789,149 @@ msgstr "O arquivo é muito grande. Enviá-lo pode enfrentar problemas. Reduza o
#. placeholder {9}: i18n.number(height)
#. placeholder {10}: i18n.number(newWidth)
#. placeholder {11}: i18n.number( newHeight, )
#: src/components/compose.jsx:2444
#: src/components/compose.jsx:2476
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {8}×{9}px to {10}×{11}px."
msgstr "A dimensão é muito grande. Enviá-lo pode enfrentar problemas. Reduza a dimensão de {8}×{9}px a {10}×{11}px."
#: src/components/compose.jsx:2452
#: src/components/compose.jsx:2484
msgid "Frame rate too high. Uploading might encounter issues."
msgstr "A taxa de quadros está muito alta. Enviá-lo pode enfrentar problemas."
#: src/components/compose.jsx:2512
#: src/components/compose.jsx:2762
#: src/components/compose.jsx:2544
#: src/components/compose.jsx:2794
#: src/components/shortcuts-settings.jsx:726
#: src/pages/catchup.jsx:1074
#: src/pages/filters.jsx:412
msgid "Remove"
msgstr "Excluir"
#: src/components/compose.jsx:2529
#: src/components/compose.jsx:2561
#: src/compose.jsx:84
msgid "Error"
msgstr "Erro"
#: src/components/compose.jsx:2554
#: src/components/compose.jsx:2586
msgid "Edit image description"
msgstr "Editar descrição da imagem"
#: src/components/compose.jsx:2555
#: src/components/compose.jsx:2587
msgid "Edit video description"
msgstr "Editar descrição do vídeo"
#: src/components/compose.jsx:2556
#: src/components/compose.jsx:2588
msgid "Edit audio description"
msgstr "Editar descrição do áudio"
#: src/components/compose.jsx:2601
#: src/components/compose.jsx:2650
#: src/components/compose.jsx:2633
#: src/components/compose.jsx:2682
msgid "Generating description. Please wait…"
msgstr "Gerando descrição. Por favor, espere…"
#. placeholder {12}: e.message
#: src/components/compose.jsx:2621
#: src/components/compose.jsx:2653
msgid "Failed to generate description: {12}"
msgstr "Falhou ao gerar descrição: {12}"
#: src/components/compose.jsx:2622
#: src/components/compose.jsx:2654
msgid "Failed to generate description"
msgstr "Houve um erro ao gerar descrição"
#: src/components/compose.jsx:2634
#: src/components/compose.jsx:2640
#: src/components/compose.jsx:2686
#: src/components/compose.jsx:2666
#: src/components/compose.jsx:2672
#: src/components/compose.jsx:2718
msgid "Generate description…"
msgstr "Gerar descrição…"
#. placeholder {13}: e?.message ? `: ${e.message}` : ''
#: src/components/compose.jsx:2673
#: src/components/compose.jsx:2705
msgid "Failed to generate description{13}"
msgstr "Falhou ao gerar descrição{13}"
#. placeholder {0}: localeCode2Text(lang)
#: src/components/compose.jsx:2688
#: src/components/compose.jsx:2720
msgid "({0}) <0>— experimental</0>"
msgstr "({0}) <0>— experimental</0>"
#: src/components/compose.jsx:2707
#: src/components/compose.jsx:2739
msgid "Done"
msgstr "Concluído"
#. placeholder {0}: i + 1
#: src/components/compose.jsx:2743
#: src/components/compose.jsx:2775
msgid "Choice {0}"
msgstr "Escolha {0}"
#: src/components/compose.jsx:2790
#: src/components/compose.jsx:2822
msgid "Multiple choices"
msgstr "Várias escolhas"
#: src/components/compose.jsx:2793
#: src/components/compose.jsx:2825
msgid "Duration"
msgstr "Duração"
#: src/components/compose.jsx:2824
#: src/components/compose.jsx:2856
msgid "Remove poll"
msgstr "Excluir enquete"
#: src/components/compose.jsx:3039
#: src/components/compose.jsx:3071
msgid "Search accounts"
msgstr "Procurar contas"
#: src/components/compose.jsx:3093
#: src/components/compose.jsx:3125
#: src/components/generic-accounts.jsx:228
msgid "Error loading accounts"
msgstr "Erro ao carregar contas"
#: src/components/compose.jsx:3237
#: src/components/compose.jsx:3269
msgid "Custom emojis"
msgstr "Emojis personalizados"
#: src/components/compose.jsx:3257
#: src/components/compose.jsx:3289
msgid "Search emoji"
msgstr "Procurar emoji"
#: src/components/compose.jsx:3288
#: src/components/compose.jsx:3320
msgid "Error loading custom emojis"
msgstr "Erro ao carregar emojis personalizados"
#: src/components/compose.jsx:3299
#: src/components/compose.jsx:3331
msgid "Recently used"
msgstr "Usado recentemente"
#: src/components/compose.jsx:3300
#: src/components/compose.jsx:3332
msgid "Others"
msgstr "Outros"
#. placeholder {0}: i18n.number(emojis.length - max)
#: src/components/compose.jsx:3338
#: src/components/compose.jsx:3370
msgid "{0} more…"
msgstr "{0} mais…"
#: src/components/compose.jsx:3476
#: src/components/compose.jsx:3508
msgid "Search GIFs"
msgstr "Procurar GIFs"
#: src/components/compose.jsx:3491
#: src/components/compose.jsx:3523
msgid "Powered by GIPHY"
msgstr "Desenvolvido por GIPHY"
#: src/components/compose.jsx:3499
#: src/components/compose.jsx:3531
msgid "Type to search GIFs"
msgstr "Escreva para pesquisar GIFs"
#: src/components/compose.jsx:3597
#: src/components/compose.jsx:3629
#: src/components/media-modal.jsx:462
#: src/components/timeline.jsx:893
msgid "Previous"
msgstr "Anterior"
#: src/components/compose.jsx:3615
#: src/components/compose.jsx:3647
#: src/components/media-modal.jsx:481
#: src/components/timeline.jsx:910
msgid "Next"
msgstr "Seguinte"
#: src/components/compose.jsx:3632
#: src/components/compose.jsx:3664
msgid "Error loading GIFs"
msgstr "Erro ao carregar GIFs"
@ -1410,6 +1410,7 @@ msgid "Accounts…"
msgstr "Contas…"
#: src/components/nav-menu.jsx:315
#: src/pages/login.jsx:27
#: src/pages/login.jsx:190
#: src/pages/status.jsx:837
#: src/pages/welcome.jsx:65

191
src/locales/pt-PT.po generated
View file

@ -8,7 +8,7 @@ msgstr ""
"Language: pt\n"
"Project-Id-Version: phanpy\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-22 00:30\n"
"PO-Revision-Date: 2025-01-15 16:00\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@ -25,7 +25,7 @@ msgstr "Bloqueado"
#. placeholder {0}: shortenNumber(statusesCount)
#: src/components/account-block.jsx:142
msgid "Posts: {0}"
msgstr "Publicações: {0}"
msgstr "Postagens: {0}"
#. placeholder {0}: niceDateTime(lastStatusAt, { hideTime: true, })
#: src/components/account-block.jsx:147
@ -76,7 +76,7 @@ msgstr "Verificado"
#: src/components/account-block.jsx:223
#: src/components/account-info.jsx:782
msgid "Joined <0>{0}</0>"
msgstr "Se juntou em <0>{0}</0>"
msgstr "Juntou-se em <0>{0}</0>"
#: src/components/account-info.jsx:58
msgid "Forever"
@ -109,11 +109,11 @@ msgstr "A seguir"
#: src/pages/search.jsx:328
#: src/pages/search.jsx:475
msgid "Posts"
msgstr "Publicações"
msgstr "Postagens"
#: src/components/account-info.jsx:429
#: src/components/account-info.jsx:1120
#: src/components/compose.jsx:2592
#: src/components/compose.jsx:2624
#: src/components/media-alt-modal.jsx:46
#: src/components/media-modal.jsx:358
#: src/components/status.jsx:1737
@ -133,7 +133,7 @@ msgstr "Mais"
#: src/components/account-info.jsx:441
msgid "<0>{displayName}</0> has indicated that their new account is now:"
msgstr "<0>{displayName}</0> indicou que a nova conta é:"
msgstr "A nova conta de <0>{displayName}</0> é:"
#: src/components/account-info.jsx:586
#: src/components/account-info.jsx:1278
@ -169,14 +169,14 @@ msgstr "Em memória"
#: src/components/account-info.jsx:711
#: src/components/account-info.jsx:752
msgid "This user has chosen to not make this information available."
msgstr "Este utilizador decidiu não fazer esta informação visível."
msgstr "O utilizador deixou privado esta informação."
#. placeholder {0}: ( postingStats.originals / postingStats.total ).toLocaleString(i18n.locale || undefined, { style: 'percent', })
#. placeholder {1}: ( postingStats.replies / postingStats.total ).toLocaleString(i18n.locale || undefined, { style: 'percent', })
#. placeholder {2}: ( postingStats.boosts / postingStats.total ).toLocaleString(i18n.locale || undefined, { style: 'percent', })
#: src/components/account-info.jsx:807
msgid "{0} original posts, {1} replies, {2} boosts"
msgstr "{0} publicações originais, {1} respostas, {2} impulsos"
msgstr "{0} postagens originais, {1} respostas, {2} impulsos"
#. placeholder {0}: postingStats.total
#. placeholder {1}: postingStats.daysSinceLastPost
@ -187,13 +187,13 @@ msgstr "{0} publicações originais, {1} respostas, {2} impulsos"
#. placeholder {6}: postingStats.daysSinceLastPost
#: src/components/account-info.jsx:823
msgid "{0, plural, one {{1, plural, one {Last 1 post in the past 1 day} other {Last 1 post in the past {2} days}}} other {{3, plural, one {Last {4} posts in the past 1 day} other {Last {5} posts in the past {6} days}}}}"
msgstr "{0, plural, one {{1, plural, one {Última publicação no último dia} other {Última publicação nos últimos {2} dias}}} other {{3, plural, one {Últimas {4} publicações no último dia} other {Últimas {5} publicações nos últimos {6} dias}}}}"
msgstr "{0, plural, one {{1, plural, one {Última postagem no último dia} other {Última postagem nos últimos {2} dias}}} other {{3, plural, one {Últimas {4} postagens no último dia} other {Últimas {5} postagens nos últimos {6} dias}}}}"
#. placeholder {0}: postingStats.total
#. placeholder {1}: postingStats.total
#: src/components/account-info.jsx:836
msgid "{0, plural, one {Last 1 post in the past year(s)} other {Last {1} posts in the past year(s)}}"
msgstr "{0, plural, one {Última publicação no(s) ano(s) passado(s)} other {Últimas {1} publicações no(s) ano(s) passado(s)}}"
msgstr "{0, plural, one {Última postagem no(s) ano(s) passado(s)} other {Últimas {1} postagens no(s) ano(s) passado(s)}}"
#: src/components/account-info.jsx:860
#: src/pages/catchup.jsx:70
@ -220,7 +220,7 @@ msgstr "Impulsos"
#: src/components/account-info.jsx:874
msgid "Post stats unavailable."
msgstr "As estatísticas estão indisponíveis."
msgstr "Estatísticas da publicação indisponíveis."
#: src/components/account-info.jsx:905
msgid "View post stats"
@ -261,11 +261,11 @@ msgstr "Adicionar nota privada"
#: src/components/account-info.jsx:1196
msgid "Notifications enabled for @{username}'s posts."
msgstr "Notificações ativadas para as publicações de @{username}."
msgstr "Habilitado as notificações para postagens de @{username}."
#: src/components/account-info.jsx:1197
msgid " Notifications disabled for @{username}'s posts."
msgstr " Notificações desativadas para as publicações de @{username}."
msgstr " Desabilitado as notificações de postagens de @{username}."
#: src/components/account-info.jsx:1209
msgid "Disable notifications"
@ -397,7 +397,7 @@ msgstr "Editar perfil"
#: src/components/account-info.jsx:1624
msgid "Withdraw follow request?"
msgstr "Eliminar pedido de seguimento?"
msgstr "Eliminar pedido de seguir?"
#. placeholder {1}: info.acct || info.username
#: src/components/account-info.jsx:1625
@ -424,10 +424,10 @@ msgstr "Seguir"
#: src/components/account-info.jsx:2098
#: src/components/account-sheet.jsx:38
#: src/components/compose.jsx:859
#: src/components/compose.jsx:2548
#: src/components/compose.jsx:3022
#: src/components/compose.jsx:3231
#: src/components/compose.jsx:3461
#: src/components/compose.jsx:2580
#: src/components/compose.jsx:3054
#: src/components/compose.jsx:3263
#: src/components/compose.jsx:3493
#: src/components/drafts.jsx:59
#: src/components/embed-modal.jsx:13
#: src/components/generic-accounts.jsx:143
@ -566,7 +566,7 @@ msgstr "Escrever"
#: src/components/compose.jsx:206
msgid "Add media"
msgstr "Adicionar media"
msgstr "Adicionar multimédia"
#: src/components/compose.jsx:207
msgid "Add custom emoji"
@ -596,7 +596,7 @@ msgstr "{0, plural, one {O ficheiro {1} não é suportado.} other {Os ficheiros
#: src/components/compose.jsx:1674
#: src/components/compose.jsx:1760
msgid "{maxMediaAttachments, plural, one {You can only attach up to 1 file.} other {You can only attach up to # files.}}"
msgstr "{maxMediaAttachments, plural,one {Tu podes anexar até 1 ficheiro.} other {Tu podes anexar até # ficheiros.}}"
msgstr "{maxMediaAttachments, plural,one {Só pode anexar até 1 ficheiro.} other {Só pode anexar até # ficheiros.}}"
#: src/components/compose.jsx:840
msgid "Pop out"
@ -647,7 +647,7 @@ msgstr "Algumas escolhas da enquete estão vazias"
#: src/components/compose.jsx:1034
msgid "Some media have no descriptions. Continue?"
msgstr "Algumas das medias não têm descrição. Prosseguir?"
msgstr "Algumas multimédias não possuem descrições. Prosseguir?"
#: src/components/compose.jsx:1086
msgid "Attachment #{i} failed"
@ -661,7 +661,7 @@ msgstr "Alerta de conteúdo"
#: src/components/compose.jsx:1196
msgid "Content warning or sensitive media"
msgstr "Alerta de conteúdo ou media sensível"
msgstr "Alerta de conteúdo ou multimédia sensível"
#: src/components/compose.jsx:1232
#: src/components/status.jsx:93
@ -704,14 +704,14 @@ msgstr "Editar publicação"
#: src/components/compose.jsx:1259
msgid "What are you doing?"
msgstr "O que tu fazes?"
msgstr "O que faz?"
#: src/components/compose.jsx:1337
msgid "Mark media as sensitive"
msgstr "Marcar media como sensível"
msgstr "Marcar multimédia como sensível"
#: src/components/compose.jsx:1381
#: src/components/compose.jsx:3080
#: src/components/compose.jsx:3112
#: src/components/shortcuts-settings.jsx:715
#: src/pages/list.jsx:362
msgid "Add"
@ -743,31 +743,31 @@ msgstr "A transferir GIF…"
msgid "Failed to download GIF"
msgstr "Falhou ao transferir GIF"
#: src/components/compose.jsx:1879
#: src/components/compose.jsx:1956
#: src/components/compose.jsx:1884
#: src/components/compose.jsx:1961
#: src/components/nav-menu.jsx:239
msgid "More…"
msgstr "Mais…"
#: src/components/compose.jsx:2361
#: src/components/compose.jsx:2393
msgid "Uploaded"
msgstr "Enviado"
#: src/components/compose.jsx:2374
#: src/components/compose.jsx:2406
msgid "Image description"
msgstr "Descrição da imagem"
#: src/components/compose.jsx:2375
#: src/components/compose.jsx:2407
msgid "Video description"
msgstr "Descrição do vídeo"
#: src/components/compose.jsx:2376
#: src/components/compose.jsx:2408
msgid "Audio description"
msgstr "Descrição do áudio"
#. placeholder {0}: prettyBytes( imageSize, )
#. placeholder {1}: prettyBytes(imageSizeLimit)
#: src/components/compose.jsx:2412
#: src/components/compose.jsx:2444
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower."
msgstr "O ficheiro é muito grande. Ao enviar pode enfrentar problemas. Tenta reduzir o tamanho de {0} a {1} ou mais baixo."
@ -775,13 +775,13 @@ msgstr "O ficheiro é muito grande. Ao enviar pode enfrentar problemas. Tenta re
#. placeholder {3}: i18n.number(height)
#. placeholder {4}: i18n.number(newWidth)
#. placeholder {5}: i18n.number( newHeight, )
#: src/components/compose.jsx:2424
#: src/components/compose.jsx:2456
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {2}×{3}px to {4}×{5}px."
msgstr "A dimensão é muito grande. Ao enviar pode enfrentar problemas. Tenta reduzir a dimensão de {2}×{3}px para {4}×{5}px."
#. placeholder {6}: prettyBytes( videoSize, )
#. placeholder {7}: prettyBytes(videoSizeLimit)
#: src/components/compose.jsx:2432
#: src/components/compose.jsx:2464
msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {6} to {7} or lower."
msgstr "O ficheiro é muito grande. Ao enviar pode enfrentar problemas. Tenta reduzir o tamanho de {6} a {7} ou mais baixo."
@ -789,149 +789,149 @@ msgstr "O ficheiro é muito grande. Ao enviar pode enfrentar problemas. Tenta re
#. placeholder {9}: i18n.number(height)
#. placeholder {10}: i18n.number(newWidth)
#. placeholder {11}: i18n.number( newHeight, )
#: src/components/compose.jsx:2444
#: src/components/compose.jsx:2476
msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {8}×{9}px to {10}×{11}px."
msgstr "A dimensão é muito grande. Ao enviar pode enfrentar problemas. Tenta reduzir a dimensão de {8}×{9}px para {10}×{11}px."
#: src/components/compose.jsx:2452
#: src/components/compose.jsx:2484
msgid "Frame rate too high. Uploading might encounter issues."
msgstr "A taxa de quadros está muito alta. Ao enviar pode enfrentar problemas."
#: src/components/compose.jsx:2512
#: src/components/compose.jsx:2762
#: src/components/compose.jsx:2544
#: src/components/compose.jsx:2794
#: src/components/shortcuts-settings.jsx:726
#: src/pages/catchup.jsx:1074
#: src/pages/filters.jsx:412
msgid "Remove"
msgstr "Eliminar"
#: src/components/compose.jsx:2529
#: src/components/compose.jsx:2561
#: src/compose.jsx:84
msgid "Error"
msgstr "Erro"
#: src/components/compose.jsx:2554
#: src/components/compose.jsx:2586
msgid "Edit image description"
msgstr "Editar descrição da imagem"
#: src/components/compose.jsx:2555
#: src/components/compose.jsx:2587
msgid "Edit video description"
msgstr "Editar descrição do vídeo"
#: src/components/compose.jsx:2556
#: src/components/compose.jsx:2588
msgid "Edit audio description"
msgstr "Editar descrição do áudio"
#: src/components/compose.jsx:2601
#: src/components/compose.jsx:2650
#: src/components/compose.jsx:2633
#: src/components/compose.jsx:2682
msgid "Generating description. Please wait…"
msgstr "A gerar descrição. Por favor, espere…"
#. placeholder {12}: e.message
#: src/components/compose.jsx:2621
#: src/components/compose.jsx:2653
msgid "Failed to generate description: {12}"
msgstr "Falhou ao gerar descrição: {12}"
#: src/components/compose.jsx:2622
#: src/components/compose.jsx:2654
msgid "Failed to generate description"
msgstr "Falhou ao gerar descrição"
#: src/components/compose.jsx:2634
#: src/components/compose.jsx:2640
#: src/components/compose.jsx:2686
#: src/components/compose.jsx:2666
#: src/components/compose.jsx:2672
#: src/components/compose.jsx:2718
msgid "Generate description…"
msgstr "Gerar descrição…"
#. placeholder {13}: e?.message ? `: ${e.message}` : ''
#: src/components/compose.jsx:2673
#: src/components/compose.jsx:2705
msgid "Failed to generate description{13}"
msgstr "Falhou ao gerar descrição{13}"
#. placeholder {0}: localeCode2Text(lang)
#: src/components/compose.jsx:2688
#: src/components/compose.jsx:2720
msgid "({0}) <0>— experimental</0>"
msgstr "({0}) <0>— experimental</0>"
#: src/components/compose.jsx:2707
#: src/components/compose.jsx:2739
msgid "Done"
msgstr "Concluído"
#. placeholder {0}: i + 1
#: src/components/compose.jsx:2743
#: src/components/compose.jsx:2775
msgid "Choice {0}"
msgstr "Escolha {0}"
#: src/components/compose.jsx:2790
#: src/components/compose.jsx:2822
msgid "Multiple choices"
msgstr "Várias escolhas"
#: src/components/compose.jsx:2793
#: src/components/compose.jsx:2825
msgid "Duration"
msgstr "Duração"
#: src/components/compose.jsx:2824
#: src/components/compose.jsx:2856
msgid "Remove poll"
msgstr "Eliminar enquete"
#: src/components/compose.jsx:3039
#: src/components/compose.jsx:3071
msgid "Search accounts"
msgstr "Buscar contas"
#: src/components/compose.jsx:3093
#: src/components/compose.jsx:3125
#: src/components/generic-accounts.jsx:228
msgid "Error loading accounts"
msgstr "Erro ao carregar contas"
#: src/components/compose.jsx:3237
#: src/components/compose.jsx:3269
msgid "Custom emojis"
msgstr "Emojis personalizados"
#: src/components/compose.jsx:3257
#: src/components/compose.jsx:3289
msgid "Search emoji"
msgstr "Buscar emoji"
#: src/components/compose.jsx:3288
#: src/components/compose.jsx:3320
msgid "Error loading custom emojis"
msgstr "Erro ao carregar emojis personalizados"
#: src/components/compose.jsx:3299
#: src/components/compose.jsx:3331
msgid "Recently used"
msgstr "Usado recentemente"
#: src/components/compose.jsx:3300
#: src/components/compose.jsx:3332
msgid "Others"
msgstr "Outros"
#. placeholder {0}: i18n.number(emojis.length - max)
#: src/components/compose.jsx:3338
#: src/components/compose.jsx:3370
msgid "{0} more…"
msgstr "{0} mais…"
#: src/components/compose.jsx:3476
#: src/components/compose.jsx:3508
msgid "Search GIFs"
msgstr "Buscar GIFs"
#: src/components/compose.jsx:3491
#: src/components/compose.jsx:3523
msgid "Powered by GIPHY"
msgstr "Desenvolvido por GIPHY"
#: src/components/compose.jsx:3499
#: src/components/compose.jsx:3531
msgid "Type to search GIFs"
msgstr "Digite para buscar GIFs"
#: src/components/compose.jsx:3597
#: src/components/compose.jsx:3629
#: src/components/media-modal.jsx:462
#: src/components/timeline.jsx:893
msgid "Previous"
msgstr "Anterior"
#: src/components/compose.jsx:3615
#: src/components/compose.jsx:3647
#: src/components/media-modal.jsx:481
#: src/components/timeline.jsx:910
msgid "Next"
msgstr "Seguinte"
#: src/components/compose.jsx:3632
#: src/components/compose.jsx:3664
msgid "Error loading GIFs"
msgstr "Erro ao carregar GIFs"
@ -987,7 +987,7 @@ msgstr "Enquete"
#: src/components/drafts.jsx:250
#: src/pages/account-statuses.jsx:364
msgid "Media"
msgstr "Media"
msgstr "Multimédia"
#: src/components/embed-modal.jsx:23
msgid "Open in new window"
@ -1076,7 +1076,7 @@ msgstr "<0>Shift</0> + <1>k</1>"
#: src/components/keyboard-shortcuts-help.jsx:80
msgid "Load new posts"
msgstr "Carregar novas publicações"
msgstr "Ver novas postagens"
#: src/components/keyboard-shortcuts-help.jsx:84
#: src/pages/catchup.jsx:1676
@ -1214,7 +1214,7 @@ msgstr "Não mostrar respostas"
#: src/components/list-add-edit.jsx:144
msgid "Hide posts on this list from Home/Following"
msgstr "Ocultar publicações nesta lista da página inicial/A seguir"
msgstr "Ocultar postagens nesta lista da página inicial/A seguir"
#: src/components/list-add-edit.jsx:150
#: src/pages/filters.jsx:554
@ -1232,7 +1232,7 @@ msgstr "Impossível eliminar lista."
#: src/components/media-alt-modal.jsx:39
#: src/components/media.jsx:51
msgid "Media description"
msgstr "Descrição da media"
msgstr "Descrição da multimédia"
#: src/components/media-alt-modal.jsx:58
#: src/components/status.jsx:1066
@ -1249,15 +1249,15 @@ msgstr "Falar"
#: src/components/media-modal.jsx:369
msgid "Open original media in new window"
msgstr "Abrir media original em nova janela"
msgstr "Abrir multimédia original em nova janela"
#: src/components/media-modal.jsx:373
msgid "Open original media"
msgstr "Abrir media original"
msgstr "Abrir multimédia original"
#: src/components/media-modal.jsx:389
msgid "Attempting to describe image. Please wait…"
msgstr "A tentar descrever imagem. Por favor, espere…"
msgstr "A descrever imagem. Por favor, espere…"
#: src/components/media-modal.jsx:404
msgid "Failed to describe image"
@ -1273,7 +1273,7 @@ msgstr "Ver publicação"
#: src/components/media-post.jsx:128
msgid "Sensitive media"
msgstr "Media sensível"
msgstr "Multimédia sensível"
#: src/components/media-post.jsx:133
msgid "Filtered: {filterTitleStr}"
@ -1410,6 +1410,7 @@ msgid "Accounts…"
msgstr "Contas…"
#: src/components/nav-menu.jsx:315
#: src/pages/login.jsx:27
#: src/pages/login.jsx:190
#: src/pages/status.jsx:837
#: src/pages/welcome.jsx:65
@ -1477,7 +1478,7 @@ msgstr "{account} fez uma publicação."
#. placeholder {1}: shortenNumber(count)
#: src/components/notification.jsx:86
msgid "{count, plural, =1 {{postsCount, plural, =1 {{postType, select, reply {{account} boosted your reply.} other {{account} boosted your post.}}} other {{account} boosted {postsCount} of your posts.}}} other {{postType, select, reply {<0><1>{0}</1> people</0> boosted your reply.} other {<2><3>{1}</3> people</2> boosted your post.}}}}"
msgstr "{count, plural, =1 {{postsCount, plural, =1 {{postType, select, reply {{account} impulsionou a sua resposta.} other {{account} impulsionou a sua publicação.}}} other {{account} impulsionou {postsCount} das suas publicações.}}} other {{postType, select, reply {<0><1>{0}</1> pessoa(s)</0> impulsionou a sua resposta.} other {<2><3>{1}</3> pessoa(s)</2> impulsionou a sua publicação.}}}}"
msgstr "{count, plural, =1 {{postsCount, plural, =1 {{postType, select, reply {{account} impulsionou a sua resposta.} other {{account} impulsionou a sua postagem.}}} other {{account} impulsionou {postsCount} das suas postagens.}}} other {{postType, select, reply {<0><1>{0}</1> pessoa(s)</0> impulsionou a sua resposta.} other {<2><3>{1}</3> pessoa(s)</2> impulsionou a sua postagem.}}}}"
#. placeholder {0}: shortenNumber(count)
#: src/components/notification.jsx:129
@ -1492,7 +1493,7 @@ msgstr "{account} pediu para seguir-te."
#. placeholder {1}: shortenNumber(count)
#: src/components/notification.jsx:152
msgid "{count, plural, =1 {{postsCount, plural, =1 {{postType, select, reply {{account} liked your reply.} other {{account} liked your post.}}} other {{account} liked {postsCount} of your posts.}}} other {{postType, select, reply {<0><1>{0}</1> people</0> liked your reply.} other {<2><3>{1}</3> people</2> liked your post.}}}}"
msgstr "{count, plural, =1 {{postsCount, plural, =1 {{postType, select, reply {{account} gostou da sua resposta.} other {{account} gostou de sua publicação.}}} other {{account} gostou de {postsCount} de suas publicações.}}} other {{postType, select, reply {<0><1>{0}</1> pessoa(s)</0> gostou da sua resposta.} other {<2><3>{1}</3> pessoa(s)</2> gostou da sua publicação.}}}}"
msgstr "{count, plural, =1 {{postsCount, plural, =1 {{postType, select, reply {{account} gostou da sua resposta.} other {{account} gostou da sua postagem.}}} other {{account} gostou de {postsCount} das suas postagens.}}} other {{postType, select, reply {<0><1>{0}</1> pessoa(s)</0> gostou da sua resposta.} other {<2><3>{1}</3> pessoa(s)</2> gostou da sua postagens.}}}}"
#: src/components/notification.jsx:194
msgid "A poll you have voted in or created has ended."
@ -1514,7 +1515,7 @@ msgstr "Uma publicação que interagiste foi editada."
#. placeholder {1}: shortenNumber(count)
#: src/components/notification.jsx:205
msgid "{count, plural, =1 {{postsCount, plural, =1 {{postType, select, reply {{account} boosted & liked your reply.} other {{account} boosted & liked your post.}}} other {{account} boosted & liked {postsCount} of your posts.}}} other {{postType, select, reply {<0><1>{0}</1> people</0> boosted & liked your reply.} other {<2><3>{1}</3> people</2> boosted & liked your post.}}}}"
msgstr "{count, plural, =1 {{postsCount, plural, =1 {{postType, select, reply {{account} impulsionou e gostou da sua resposta.} other {{account} impulsionou e gostou da sua publicação.}}} other {{account} impulsionou e gostou de {postsCount} de suas publicações.}}} other {{postType, select, reply {<0><1>{0}</1> pessoa(s)</0> impulsionou e gostou da sua resposta.} other {<2><3>{1}</3> pessoa(s)</2> impulsionou e gostou da sua publicação.}}}}"
msgstr "{count, plural, =1 {{postsCount, plural, =1 {{postType, select, reply {{account} impulsionou e gostou da sua resposta.} other {{account} impulsionou e gostou da sua postagem.}}} other {{account} impulsionou e gostou de {postsCount} das suas postagens.}}} other {{postType, select, reply {<0><1>{0}</1> pessoa(s)</0> impulsionou e gostou da sua resposta.} other {<2><3>{1}</3> pessoa(s)</2> impulsionou e gostou da sua postagem.}}}}"
#: src/components/notification.jsx:247
msgid "{account} signed up."
@ -1559,15 +1560,15 @@ msgstr "A sua conta foi desativada."
#: src/components/notification.jsx:293
msgid "Some of your posts have been marked as sensitive."
msgstr "Algumas das suas publicações foram marcadas como sensível."
msgstr "Algumas das suas postagens foram marcados como sensíveis."
#: src/components/notification.jsx:294
msgid "Some of your posts have been deleted."
msgstr "Algumas publicações suas foram eliminadas."
msgstr "Algumas das suas postagens foram eliminadas."
#: src/components/notification.jsx:295
msgid "Your posts will be marked as sensitive from now on."
msgstr "Agora as suas publicações serão marcadas como sensíveis."
msgstr "Agora as suas postagens serão marcadas como sensíveis."
#: src/components/notification.jsx:296
msgid "Your account has been limited."
@ -1799,7 +1800,7 @@ msgstr "Enviar relato <0>+ Bloquear perfil</0>"
#: src/components/search-form.jsx:203
msgid "{query} <0> accounts, hashtags & posts</0>"
msgstr "{query} <0> contas, hashtags e publicações</0>"
msgstr "{query} <0> contas, hashtags e postagens</0>"
#: src/components/search-form.jsx:216
msgid "Posts with <0>{query}</0>"
@ -1870,7 +1871,7 @@ msgstr "ex.: PixelArt (Máx. 5, espaço separado)"
#: src/components/shortcuts-settings.jsx:117
#: src/pages/hashtag.jsx:356
msgid "Media only"
msgstr "Apenas media"
msgstr "Somente multimédia"
#: src/components/shortcuts-settings.jsx:235
#: src/components/shortcuts.jsx:192
@ -2152,7 +2153,7 @@ msgstr "Citar"
#: src/components/status.jsx:961
#: src/components/status.jsx:2437
msgid "Some media have no descriptions."
msgstr "Algumas das medias não têm descrição."
msgstr "Algumas multimédias não possuem descrições."
#. placeholder {0}: rtf.format(-statusMonthsAgo, 'month')
#: src/components/status.jsx:968
@ -2331,7 +2332,7 @@ msgstr "Mostrar conteúdo"
#: src/components/status.jsx:2173
msgid "Show media"
msgstr "Mostrar media"
msgstr "Mostrar multimédia"
#: src/components/status.jsx:2310
msgid "Edited"
@ -2373,7 +2374,7 @@ msgstr "Impossível copiar código HTML"
#: src/components/status.jsx:3275
msgid "Media attachments:"
msgstr "Anexos de media:"
msgstr "Anexos de multimédia:"
#: src/components/status.jsx:3297
msgid "Account Emojis:"
@ -2402,7 +2403,7 @@ msgstr "Votações não são interativas, ela vira uma lista com contador de vot
#: src/components/status.jsx:3402
msgid "Media attachments can be images, videos, audios or any file types."
msgstr "Anexos de media pode ser imagens, vídeos, áudios, e qualquer tipo de ficheiro."
msgstr "Anexos de multimédia pode ser imagens, vídeos, áudios, e qualquer tipo de ficheiro."
#: src/components/status.jsx:3408
msgid "Post could be edited or deleted later."
@ -2525,7 +2526,7 @@ msgstr "{accountDisplay} (#{tagged})"
#: src/pages/account-statuses.jsx:245
msgid "{accountDisplay} (Media)"
msgstr "{accountDisplay} (Media)"
msgstr "{accountDisplay} (Multimédia)"
#: src/pages/account-statuses.jsx:251
msgid "{accountDisplay} ({monthYear})"
@ -2557,7 +2558,7 @@ msgstr "- Impulsos"
#: src/pages/account-statuses.jsx:359
msgid "Showing posts with media"
msgstr "A exibir publicações com media"
msgstr "A exibir publicações com multimédia"
#. placeholder {0}: tag.name
#: src/pages/account-statuses.jsx:376
@ -3062,7 +3063,7 @@ msgstr "Impossível carregar publicações."
#: src/pages/hashtag.jsx:56
msgid "{hashtagTitle} (Media only) on {instance}"
msgstr "{hashtagTitle} (Apenas media) em {instance}"
msgstr "{hashtagTitle} (Somente multimédia) em {instance}"
#: src/pages/hashtag.jsx:57
msgid "{hashtagTitle} on {instance}"
@ -3070,7 +3071,7 @@ msgstr "{hashtagTitle} em {instance}"
#: src/pages/hashtag.jsx:59
msgid "{hashtagTitle} (Media only)"
msgstr "{hashtagTitle} (Apenas media)"
msgstr "{hashtagTitle} (Somente multimédia)"
#: src/pages/hashtag.jsx:60
msgid "{hashtagTitle}"
@ -3573,7 +3574,7 @@ msgstr "Tradução automática"
#: src/pages/settings.jsx:518
msgid "Automatically show translation for posts in timeline. Only works for <0>short</0> posts without content warning, media and poll."
msgstr "Automaticamente exibe tradução para publicações na linha de tempo. Só funciona para publicações <0>curtas</0> sem aviso de conteúdo, media ou enquete."
msgstr "Automaticamente exibe tradução para publicações na linha de tempo. Só funciona para publicações <0>curtas</0> sem aviso de conteúdo, multimédia ou enquete."
#: src/pages/settings.jsx:538
msgid "GIF Picker for composer"

View file

@ -1192,7 +1192,7 @@ function Catchup() {
key={url}
href={url}
target="_blank"
rel="noopener noreferrer"
rel="noopener"
class="link-block"
style={
accentColor

View file

@ -68,7 +68,7 @@ export default function HttpRoute() {
<Trans>Resolving</Trans>
</h2>
<p>
<a href={url} target="_blank" rel="noopener noreferrer">
<a href={url} target="_blank" rel="noopener">
{url}
</a>
</p>
@ -79,7 +79,7 @@ export default function HttpRoute() {
<Trans>Unable to resolve URL</Trans>
</h2>
<p>
<a href={url} target="_blank" rel="noopener noreferrer">
<a href={url} target="_blank" rel="noopener">
{url}
</a>
</p>

View file

@ -24,7 +24,7 @@ const { PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE } = import.meta.env;
function Login() {
const { t } = useLingui();
useTitle('Log in');
useTitle(t`Log in`, '/login');
const instanceURLRef = useRef();
const cachedInstanceURL = store.local.get('instanceURL');
const [uiState, setUIState] = useState('default');

View file

@ -250,7 +250,7 @@ function Settings({ onClose }) {
<a
href="https://crowdin.com/project/phanpy"
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
<Trans>Volunteer translations</Trans>
</a>
@ -324,7 +324,7 @@ function Settings({ onClose }) {
<a
href={`https://${instance}/`}
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
Go to your instance ({instance}) for more settings.
</a>
@ -483,7 +483,7 @@ function Settings({ onClose }) {
<a
href="https://github.com/cheeaun/lingva-api"
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
Lingva API
</a>{' '}
@ -491,7 +491,7 @@ function Settings({ onClose }) {
<a
href="https://github.com/thedaviddelta/lingva-translate"
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
Lingva Translate
</a>
@ -545,7 +545,7 @@ function Settings({ onClose }) {
<a
href="https://developers.giphy.com/"
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
GIPHY
</a>
@ -585,7 +585,7 @@ function Settings({ onClose }) {
<a
href="https://github.com/cheeaun/img-alt-api"
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
img-alt-api
</a>
@ -728,7 +728,7 @@ function Settings({ onClose }) {
<a
href="https://hachyderm.io/@phanpy"
// target="_blank"
rel="noopener noreferrer"
rel="noopener"
onClick={(e) => {
e.preventDefault();
states.showAccount = 'phanpy@hachyderm.io';
@ -741,7 +741,7 @@ function Settings({ onClose }) {
<a
href="https://github.com/cheeaun/phanpy"
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
Built
</a>{' '}
@ -749,7 +749,7 @@ function Settings({ onClose }) {
<a
href="https://mastodon.social/@cheeaun"
// target="_blank"
rel="noopener noreferrer"
rel="noopener"
onClick={(e) => {
e.preventDefault();
states.showAccount = 'cheeaun@mastodon.social';
@ -764,7 +764,7 @@ function Settings({ onClose }) {
<a
href="https://github.com/sponsors/cheeaun"
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
<Trans>Sponsor</Trans>
</a>{' '}
@ -772,7 +772,7 @@ function Settings({ onClose }) {
<a
href="https://www.buymeacoffee.com/cheeaun"
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
<Trans>Donate</Trans>
</a>{' '}
@ -780,16 +780,12 @@ function Settings({ onClose }) {
<a
href="https://patreon.com/cheeaun"
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
Patreon
</a>{' '}
&middot;{' '}
<a
href={PRIVACY_POLICY_URL}
target="_blank"
rel="noopener noreferrer"
>
<a href={PRIVACY_POLICY_URL} target="_blank" rel="noopener">
<Trans>Privacy Policy</Trans>
</a>
</p>
@ -832,7 +828,7 @@ function Settings({ onClose }) {
<a
href={`https://github.com/cheeaun/phanpy/commit/${__COMMIT_HASH__}`}
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
<RelativeTime datetime={new Date(__BUILD_TIME__)} />
</a>
@ -984,10 +980,10 @@ function PushNotificationsSection({ onClose }) {
const policyEl = elements.namedItem('policy');
if (policyEl) policyEl.value = policy;
// alerts is {}, iterate it
Object.keys(alerts).forEach((alert) => {
Object.entries(alerts).forEach(([alert, value]) => {
const el = elements.namedItem(alert);
if (el?.type === 'checkbox') {
el.checked = true;
el.checked = !!value;
}
});
}

View file

@ -274,7 +274,7 @@ function Trending({ columnMode, ...props }) {
ref={currentLink === url ? currentLinkRef : null}
href={url}
target="_blank"
rel="noopener noreferrer"
rel="noopener"
class={`link-block ${
hasCurrentLink
? currentLink === url
@ -353,7 +353,7 @@ function Trending({ columnMode, ...props }) {
<a
href={authorUrl}
target="_blank"
rel="noopener noreferrer"
rel="noopener"
>
{authorName}
</a>

View file

@ -218,7 +218,7 @@ function _enhanceContent(content, opts = {}) {
if (TWITTER_MENTION_REGEX.test(html)) {
html = html.replaceAll(
TWITTER_MENTION_CAPTURE_REGEX,
'<a href="https://twitter.com/$2" rel="nofollow noopener noreferrer" target="_blank">$1</a>',
'<a href="https://twitter.com/$2" rel="nofollow noopener" target="_blank">$1</a>',
);
}
fauxDiv.innerHTML = html;

View file

@ -8,6 +8,7 @@ export default function isMastodonLinkMaybe(url) {
/^\/(notice|objects)\/[a-z0-9-]+$/i.test(pathname) || // Pleroma
/^\/@[^/]+\/post\/[a-z0-9\-_]+$/i.test(pathname) || // Threads
/^\/@[^/]+\/[a-z0-9]+[a-z0-9\-]+[a-z0-9]+$/i.test(pathname) || // Hollo
/^\/ap\/note\/[a-z0-9\-_]+$/i.test(pathname) || // BotKit, Fedify
(hostname === 'fed.brid.gy' && pathname.startsWith('/r/http')) || // Bridgy Fed
/#\/[^\/]+\.[^\/]+\/s\/.+/i.test(hash) // Phanpy 🫣
);

View file

@ -4,7 +4,7 @@ import { resolve } from 'path';
import { lingui } from '@lingui/vite-plugin';
import preact from '@preact/preset-vite';
import { SondaRollupPlugin } from 'sonda';
import Sonda from 'sonda/vite';
import { uid } from 'uid/single';
import { defineConfig, loadEnv, splitVendorChunkPlugin } from 'vite';
import generateFile from 'vite-plugin-generate-file';
@ -21,6 +21,7 @@ const {
PHANPY_WEBSITE: WEBSITE,
PHANPY_CLIENT_NAME: CLIENT_NAME,
PHANPY_APP_ERROR_LOGGING: ERROR_LOGGING,
PHANPY_REFERRER_POLICY: REFERRER_POLICY,
} = loadEnv('production', process.cwd(), allowedEnvPrefixes);
const now = new Date();
@ -86,6 +87,13 @@ export default defineConfig({
includes: ['log', 'debug', 'info', 'warn', 'error'],
}),
htmlPlugin({
metas: [
// Learn more: https://web.dev/articles/referrer-best-practices
{
name: 'referrer',
content: REFERRER_POLICY || 'origin',
},
],
headScripts: ERROR_LOGGING ? [rollbarCode] : [],
links: [
...ALL_LOCALES.map((lang) => ({
@ -150,7 +158,7 @@ export default defineConfig({
type: 'module',
},
}),
SondaRollupPlugin({
Sonda({
detailed: true,
brotli: true,
}),